## Summary - add asynchronous PostgreSQL parity to research commands and engine execution paths - persist Roadmap, Compound Engineering sessions, and WhatsApp state in PostgreSQL - harden cancellation, concurrency, reconnect, replay-claim, and detached-promise behavior - bundle the PostgreSQL-backed integration implementations in the published CLI This is PR 2 of 2 and is intentionally stacked on #2088. It contains 44 changed files; merge #2088 first, then retarget this PR to `main` if GitHub does not do so automatically. ## Verification - `pnpm check:changesets --strict` - `pnpm lint` - `pnpm test:gate`: 463 tests passed - Compound Engineering plugin: 299 tests passed - Roadmap plugin: 144 tests passed - WhatsApp plugin: 27 tests passed - research CLI: 18 tests passed - `pnpm verify:fast`: all scoped typechecks, builds, CLI build, and boot smoke passed ## Post-Deploy Monitoring & Validation - deploy only after #2088 and verify schema migration `0002` is present - monitor research cancellation, automation claims, agent execution, plugin schema initialization, and unhandled rejections - validate Roadmap ownership, Compound Engineering session recovery, and WhatsApp reconnect/replay deduplication - compare per-project plugin and workflow counts after cutover - restore the pre-deploy backup for data rollback; avoid an in-place schema downgrade
39 lines
2.0 KiB
TypeScript
39 lines
2.0 KiB
TypeScript
import type { Settings } from "@fusion/core";
|
|
import { isResearchExperimentalEnabled } from "@fusion/core";
|
|
import type { PluginRunner } from "./plugin-runner.js";
|
|
import type { ToolDefinition } from "@earendil-works/pi-coding-agent";
|
|
|
|
export function isResearchToolSurfaceEnabled(settings: Partial<Settings> | undefined): boolean {
|
|
return isResearchExperimentalEnabled(settings);
|
|
}
|
|
|
|
export function getResearchToolSurfaceStatus(settings: Partial<Settings> | undefined): {
|
|
enabled: boolean;
|
|
reason: "experimental-disabled" | "enabled";
|
|
} {
|
|
const enabled = isResearchToolSurfaceEnabled(settings);
|
|
return {
|
|
enabled,
|
|
reason: enabled ? "enabled" : "experimental-disabled",
|
|
};
|
|
}
|
|
|
|
const TRIAGE_RESEARCH_GUIDANCE = `## Research tools
|
|
When spec work needs missing domain context, you may use research tools (\`fn_research_run\`, \`fn_research_list\`, \`fn_research_get\`, \`fn_research_cancel\`, \`fn_research_retry\`). Keep research bounded to the task at hand, prefer concise queries, and write durable findings into task documents when useful.
|
|
If research is unavailable or unconfigured, continue planning with repository context and clearly note assumptions.`;
|
|
|
|
const EXECUTOR_RESEARCH_GUIDANCE = `## Research tools
|
|
When implementation needs external context, you may use research tools (
|
|
\`fn_research_run\`, \`fn_research_list\`, \`fn_research_get\`, \`fn_research_cancel\`, \`fn_research_retry\`) to run bounded research.
|
|
Keep runs focused and short, and persist durable conclusions into task documents (for example key="research").
|
|
If research is disabled or providers are not configured, use the actionable tool response and continue with available local context.`;
|
|
|
|
export function getResearchGuidanceForSurface(surface: "triage" | "executor"): string {
|
|
return surface === "triage" ? TRIAGE_RESEARCH_GUIDANCE : EXECUTOR_RESEARCH_GUIDANCE;
|
|
}
|
|
|
|
export function getEnabledPluginTools(pluginRunner: PluginRunner | undefined): ToolDefinition[] {
|
|
if (!pluginRunner) return [];
|
|
return pluginRunner.getPluginTools();
|
|
}
|