opencode-plugin-flow 4.1.0 → 4.1.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +8 -2
- package/README.md +37 -6
- package/dist/cli.js +1066 -4
- package/dist/index.js +178 -177
- package/dist/index.js.map +8 -8
- package/package.json +1 -1
package/dist/index.js.map
CHANGED
|
@@ -1,23 +1,23 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
|
-
"sources": ["../src/distribution/sync.ts", "../src/distribution/flow-skill-definitions.ts", "../src/runtime/workspace.ts", "../src/runtime/json/strict-object.ts", "../src/runtime/schema.ts", "../src/
|
|
3
|
+
"sources": ["../src/config-shared.ts", "../src/distribution/sync.ts", "../src/distribution/flow-skill-definitions.ts", "../src/runtime/workspace.ts", "../src/runtime/json/strict-object.ts", "../src/runtime/schema.ts", "../src/adapters/opencode/config.ts", "../src/adapters/opencode/logging.ts", "../src/runtime/api.ts", "../src/runtime/transitions.ts", "../src/runtime/time.ts", "../src/adapters/opencode/sdk.ts", "../src/adapters/opencode/tools.ts", "../src/adapters/opencode/plugin.ts"],
|
|
4
4
|
"sourcesContent": [
|
|
5
|
-
"import
|
|
5
|
+
"import flowReviewReviewRubricDoc from \"../skills/flow-review/references/review-rubric.md\" with {\n\ttype: \"text\",\n};\nimport flowReviewSkillDoc from \"../skills/flow-review/SKILL.md\" with {\n\ttype: \"text\",\n};\n\nexport type FlowPermissionConfig = {\n\tedit?: string;\n\tbash?: string;\n\ttask?: Record<string, string>;\n\t[toolPattern: string]: string | Record<string, string> | undefined;\n};\n\nexport type FlowAgentConfig = {\n\tmode: \"subagent\";\n\tdescription: string;\n\tprompt: string;\n\thidden?: boolean;\n\tpermission?: FlowPermissionConfig;\n};\n\nexport type FlowCommandConfig = {\n\tdescription: string;\n\ttemplate: string;\n\tagent?: string;\n\tsubtask?: boolean;\n};\n\nexport type MutableFlowConfig = {\n\tagent?: Record<string, unknown>;\n\tcommand?: Record<string, unknown>;\n};\n\nconst FLOW_REVIEW_FALLBACK_PROMPT = [\n\t\"Use Flow review mode. Load `flow-review` when the skill registry is current. If Flow setup reports stale skills or the skill loader reports that `flow-review` is unavailable, continue with the bundled review instructions below instead.\",\n\t\"\",\n\t\"## Bundled Flow review fallback\",\n\t\"\",\n\t\"## Bundled flow-review/SKILL.md\",\n\tflowReviewSkillDoc,\n\t\"## Bundled flow-review/references/review-rubric.md\",\n\tflowReviewReviewRubricDoc,\n].join(\"\\n\\n\");\n\nexport const FLOW_CORE_AGENTS = {\n\t\"flow-reviewer\": {\n\t\tmode: \"subagent\",\n\t\thidden: true,\n\t\tdescription: \"Internal read-only reviewer for Flow-guided work.\",\n\t\tprompt: FLOW_REVIEW_FALLBACK_PROMPT,\n\t\tpermission: {\n\t\t\tedit: \"deny\",\n\t\t\tbash: \"deny\",\n\t\t\ttask: { \"*\": \"deny\" },\n\t\t\t\"flow_*\": \"deny\",\n\t\t\tflow_status: \"allow\",\n\t\t},\n\t},\n\t\"flow-evidence-worker\": {\n\t\tmode: \"subagent\",\n\t\thidden: true,\n\t\tdescription:\n\t\t\t\"Internal read-only evidence worker for Flow planning and execution support.\",\n\t\tprompt:\n\t\t\t\"Use Flow evidence mode. Inspect only the assigned slice, do not edit files, do not call state-changing Flow tools, and return coverage, evidence inspected, confidence-tagged findings or facts, gaps, and manager follow-ups.\",\n\t\tpermission: {\n\t\t\tedit: \"deny\",\n\t\t\tbash: \"deny\",\n\t\t\ttask: { \"*\": \"deny\" },\n\t\t\t\"flow_*\": \"deny\",\n\t\t\tflow_status: \"allow\",\n\t\t},\n\t},\n\t\"flow-validation-worker\": {\n\t\tmode: \"subagent\",\n\t\thidden: true,\n\t\tdescription:\n\t\t\t\"Internal validation worker for Flow check selection and command evidence.\",\n\t\tprompt:\n\t\t\t\"Use Flow validation mode. Run only manager-specified commands or propose focused checks, do not edit files, do not call state-changing Flow tools, and report exact command, status, raw outcome summary, coverage, confidence, gaps, and manager follow-ups.\",\n\t\tpermission: {\n\t\t\tedit: \"deny\",\n\t\t\tbash: \"ask\",\n\t\t\ttask: { \"*\": \"deny\" },\n\t\t\t\"flow_*\": \"deny\",\n\t\t\tflow_status: \"allow\",\n\t\t},\n\t},\n\t\"flow-audit-worker\": {\n\t\tmode: \"subagent\",\n\t\thidden: true,\n\t\tdescription:\n\t\t\t\"Internal read-only audit worker for refuted or surviving finding candidates.\",\n\t\tprompt:\n\t\t\t\"Use Flow audit mode. Inspect only the assigned slice, actively refute candidate findings before reporting them, do not edit files, do not call state-changing Flow tools, and return coverage, evidence, guards checked, confidence, gaps, and manager follow-ups.\",\n\t\tpermission: {\n\t\t\tedit: \"deny\",\n\t\t\tbash: \"ask\",\n\t\t\ttask: { \"*\": \"deny\" },\n\t\t\t\"flow_*\": \"deny\",\n\t\t\tflow_status: \"allow\",\n\t\t},\n\t},\n\t\"flow-candidate-worker\": {\n\t\tmode: \"subagent\",\n\t\thidden: true,\n\t\tdescription:\n\t\t\t\"Internal candidate implementation worker for isolated Flow worktrees or exact non-overlapping path ownership.\",\n\t\tprompt:\n\t\t\t\"Use Flow candidate-implementation mode only when the manager assigned an isolated worktree or exact non-overlapping path ownership. Do not edit .flow/**, do not call state-changing Flow tools, do not complete Flow state, and return changed or proposed patch, verification run, coverage, confidence, merge risks, and manager follow-ups.\",\n\t\tpermission: {\n\t\t\tedit: \"ask\",\n\t\t\tbash: \"ask\",\n\t\t\ttask: { \"*\": \"deny\" },\n\t\t\t\"flow_*\": \"deny\",\n\t\t\tflow_status: \"allow\",\n\t\t},\n\t},\n\t\"flow-verifier-worker\": {\n\t\tmode: \"subagent\",\n\t\thidden: true,\n\t\tdescription:\n\t\t\t\"Internal verifier worker for checking Flow worker claims against cited evidence.\",\n\t\tprompt:\n\t\t\t\"Use Flow verifier mode. Verify only the assigned claims against the provided sources, commands, counts, or current docs. Do not generate new scope, do not edit files, do not call state-changing Flow tools, and return supported, partly-supported, unsupported, or source-not-found per claim with evidence, confidence, gaps, and manager follow-ups.\",\n\t\tpermission: {\n\t\t\tedit: \"deny\",\n\t\t\tbash: \"ask\",\n\t\t\ttask: { \"*\": \"deny\" },\n\t\t\t\"flow_*\": \"deny\",\n\t\t\tflow_status: \"allow\",\n\t\t},\n\t},\n} satisfies Record<string, FlowAgentConfig>;\n\nexport const FLOW_CORE_COMMANDS = {\n\t\"flow-auto\": {\n\t\tdescription: \"Drive Flow skills against the minimal runtime ledger\",\n\t\ttemplate:\n\t\t\t\"Load the `flow` skill and drive the Flow loop until completion or a real blocker: $ARGUMENTS\",\n\t},\n\t\"flow-plan\": {\n\t\tdescription: \"Create or approve a Flow plan\",\n\t\ttemplate: \"Load the `flow-plan` skill and plan: $ARGUMENTS\",\n\t},\n\t\"flow-run\": {\n\t\tdescription: \"Run one approved Flow feature\",\n\t\ttemplate:\n\t\t\t\"Load the `flow-run` skill and execute the next approved feature. $ARGUMENTS\",\n\t},\n\t\"flow-review\": {\n\t\tdescription: \"Run a read-only Flow review\",\n\t\tagent: \"flow-reviewer\",\n\t\tsubtask: true,\n\t\ttemplate:\n\t\t\t\"Load `flow-review`; if loading fails because the skill is unavailable, use the bundled review fallback. Review: $ARGUMENTS\",\n\t},\n\t\"flow-status\": {\n\t\tdescription: \"Inspect the active Flow session\",\n\t\ttemplate: \"Call flow_status and report the session state and next action.\",\n\t},\n} satisfies Record<string, FlowCommandConfig>;\n\nexport function createFlowCoreConfigEntries() {\n\treturn {\n\t\tagent: Object.fromEntries(\n\t\t\tObject.entries(FLOW_CORE_AGENTS).map(([name, value]) => {\n\t\t\t\tconst permission = value.permission\n\t\t\t\t\t? {\n\t\t\t\t\t\t\t...value.permission,\n\t\t\t\t\t\t\t...(value.permission.task\n\t\t\t\t\t\t\t\t? { task: { ...value.permission.task } }\n\t\t\t\t\t\t\t\t: {}),\n\t\t\t\t\t\t}\n\t\t\t\t\t: undefined;\n\t\t\t\treturn [\n\t\t\t\t\tname,\n\t\t\t\t\t{\n\t\t\t\t\t\t...value,\n\t\t\t\t\t\t...(permission ? { permission } : {}),\n\t\t\t\t\t},\n\t\t\t\t];\n\t\t\t}),\n\t\t),\n\t\tcommand: Object.fromEntries(\n\t\t\tObject.entries(FLOW_CORE_COMMANDS).map(([name, value]) => [\n\t\t\t\tname,\n\t\t\t\t{ ...value },\n\t\t\t]),\n\t\t),\n\t};\n}\n\nexport function applyFlowConfig(config: MutableFlowConfig): void {\n\tconst entries = createFlowCoreConfigEntries();\n\tconfig.agent = { ...(config.agent ?? {}), ...entries.agent };\n\tconfig.command = { ...(config.command ?? {}), ...entries.command };\n}\n",
|
|
6
|
+
"import { createHash } from \"node:crypto\";\nimport { mkdir, readdir, readFile, rm, writeFile } from \"node:fs/promises\";\nimport { createRequire } from \"node:module\";\nimport { dirname, join, normalize, sep } from \"node:path\";\nimport {\n\tFLOW_SKILL_DEFINITIONS,\n\ttype FlowSkillDefinition,\n} from \"./flow-skill-definitions\";\n\nconst MARKER_FILENAME = \".flow-skill-version\";\n\ntype FlowLog = (level: \"info\" | \"warn\" | \"error\", message: string) => void;\n\nexport type FlowSkillSyncAction =\n\t| \"installed\"\n\t| \"updated\"\n\t| \"updated_with_backup\"\n\t| \"marker_updated\"\n\t| \"unchanged\"\n\t| \"skipped_foreign\";\n\nexport type FlowSkillSyncResult = {\n\tname: string;\n\taction: FlowSkillSyncAction;\n};\n\nexport type FlowSkillSyncHealth = {\n\tstatus: \"ok\" | \"restart_required\" | \"action_required\" | \"error\";\n\tversion: string;\n\troot: string;\n\tcheckedAt: string;\n\texpectedSkills: string[];\n\tresults: FlowSkillSyncResult[];\n\tchangedSkills: string[];\n\tactionRequiredSkills: string[];\n\trestartRequired: boolean;\n\tsummary: string;\n\terror?: string;\n};\n\nexport type FlowSkillSetupStatus = {\n\tstatus: \"restart_required\" | \"action_required\" | \"sync_failed\";\n\tsummary: string;\n\tversion: string;\n\troot: string;\n\tchanged?: string[];\n\tactionRequired?: string[];\n\terror?: string;\n};\n\nexport type FlowSkillDoctorSkill = {\n\tname: string;\n\tpath: string;\n\tstatus: \"ok\" | \"missing\" | \"foreign\" | \"incomplete\" | \"edited\" | \"outdated\";\n\tmarkerVersion: string | null;\n\tmissingFiles: string[];\n\teditedFiles: string[];\n\toutdatedFiles: string[];\n};\n\nexport type FlowSkillDoctorReport = {\n\tstatus: \"ok\" | \"sync_required\" | \"action_required\";\n\tversion: string;\n\troot: string;\n\texpectedSkills: string[];\n\tskills: FlowSkillDoctorSkill[];\n\tsyncRequiredSkills: string[];\n\tactionRequiredSkills: string[];\n\tunmanagedFlowSkills: string[];\n};\n\nlet latestFlowSkillSyncHealth: FlowSkillSyncHealth | null = null;\n\nfunction homeDir(): string {\n\treturn process.env.HOME ?? process.env.USERPROFILE ?? \"\";\n}\n\nexport function resolveFlowSkillsRoot(home = homeDir()): string {\n\treturn join(home, \".config\", \"opencode\", \"skills\");\n}\n\nfunction sha256(value: string): string {\n\treturn createHash(\"sha256\").update(value).digest(\"hex\");\n}\n\nfunction markerFor(definition: FlowSkillDefinition, version: string): string {\n\treturn [\n\t\t`version=${version}`,\n\t\t...definition.files.map(\n\t\t\t(file) => `file=${file.relativePath} sha256=${sha256(file.content)}`,\n\t\t),\n\t\t\"\",\n\t].join(\"\\n\");\n}\n\nasync function optionalRead(path: string): Promise<string | null> {\n\ttry {\n\t\treturn await readFile(path, \"utf8\");\n\t} catch (error) {\n\t\tif ((error as NodeJS.ErrnoException).code === \"ENOENT\") return null;\n\t\tthrow error;\n\t}\n}\n\nfunction parseMarkerFiles(content: string | null): Map<string, string> {\n\tconst files = new Map<string, string>();\n\tif (!content) return files;\n\tfor (const line of content.split(/\\r?\\n/)) {\n\t\tconst match =\n\t\t\t/^file=(.+) sha256=([a-f0-9]{64})$/.exec(line) ??\n\t\t\t/^file=(.+)=sha256:([a-f0-9]{64})$/.exec(line);\n\t\tif (match?.[1] && match[2]) files.set(match[1], match[2]);\n\t\tconst topLevelHash = /^hash=sha256:([a-f0-9]{64})$/.exec(line);\n\t\tif (topLevelHash?.[1] && !files.has(\"SKILL.md\")) {\n\t\t\tfiles.set(\"SKILL.md\", topLevelHash[1]);\n\t\t}\n\t}\n\treturn files;\n}\n\nfunction parseMarkerVersion(content: string | null): string | null {\n\tif (!content) return null;\n\tfor (const line of content.split(/\\r?\\n/)) {\n\t\tconst match = /^version=(.+)$/.exec(line);\n\t\tif (match?.[1]) return match[1];\n\t}\n\treturn null;\n}\n\nfunction resolveSkillFile(folder: string, relativePath: string): string {\n\tconst resolved = normalize(join(folder, ...relativePath.split(\"/\")));\n\tif (resolved !== folder && resolved.startsWith(`${folder}${sep}`)) {\n\t\treturn resolved;\n\t}\n\tthrow new Error(`Unsafe skill file path '${relativePath}'.`);\n}\n\nasync function syncSkill(\n\tdefinition: FlowSkillDefinition,\n\tversion: string,\n\troot: string,\n): Promise<FlowSkillSyncResult> {\n\tconst folder = join(root, definition.name);\n\tconst markerPath = join(folder, MARKER_FILENAME);\n\tconst markerContent = await optionalRead(markerPath);\n\tconst existingMarkerHashes = parseMarkerFiles(markerContent);\n\tconst existingSkill = await optionalRead(join(folder, \"SKILL.md\"));\n\tif (existingSkill !== null && markerContent === null) {\n\t\treturn { name: definition.name, action: \"skipped_foreign\" as const };\n\t}\n\n\tlet changed = false;\n\tlet backedUp = false;\n\tfor (const file of definition.files) {\n\t\tconst path = resolveSkillFile(folder, file.relativePath);\n\t\tconst existing = await optionalRead(path);\n\t\tif (existing === file.content) continue;\n\t\tchanged = true;\n\t\tconst recordedHash = existingMarkerHashes.get(file.relativePath);\n\t\tconst userEdited =\n\t\t\texisting !== null &&\n\t\t\t(recordedHash\n\t\t\t\t? sha256(existing) !== recordedHash\n\t\t\t\t: markerContent !== null);\n\t\tif (userEdited) {\n\t\t\tawait writeFile(`${path}.backup`, existing, \"utf8\");\n\t\t\tbackedUp = true;\n\t\t}\n\t}\n\n\tif (!changed && markerContent === markerFor(definition, version)) {\n\t\treturn { name: definition.name, action: \"unchanged\" };\n\t}\n\n\tif (!changed) {\n\t\tawait writeFile(markerPath, markerFor(definition, version), \"utf8\");\n\t\treturn { name: definition.name, action: \"marker_updated\" };\n\t}\n\n\tconst managedSkillExists = markerContent !== null;\n\tfor (const file of definition.files) {\n\t\tconst path = resolveSkillFile(folder, file.relativePath);\n\t\tawait mkdir(dirname(path), { recursive: true });\n\t\tawait writeFile(path, file.content, \"utf8\");\n\t}\n\tawait writeFile(markerPath, markerFor(definition, version), \"utf8\");\n\treturn {\n\t\tname: definition.name,\n\t\taction: backedUp\n\t\t\t? \"updated_with_backup\"\n\t\t\t: managedSkillExists\n\t\t\t\t? \"updated\"\n\t\t\t\t: \"installed\",\n\t};\n}\n\nfunction expectedSkillNames(): string[] {\n\treturn FLOW_SKILL_DEFINITIONS.map((definition) => definition.name);\n}\n\nfunction createHealth(\n\tversion: string,\n\troot: string,\n\tresults: FlowSkillSyncResult[],\n): FlowSkillSyncHealth {\n\tconst changedSkills = results\n\t\t.filter((result) =>\n\t\t\t[\"installed\", \"updated\", \"updated_with_backup\"].includes(result.action),\n\t\t)\n\t\t.map((result) => result.name);\n\tconst actionRequiredSkills = results\n\t\t.filter((result) => result.action === \"skipped_foreign\")\n\t\t.map((result) => result.name);\n\tconst status =\n\t\tactionRequiredSkills.length > 0\n\t\t\t? \"action_required\"\n\t\t\t: changedSkills.length > 0\n\t\t\t\t? \"restart_required\"\n\t\t\t\t: \"ok\";\n\tconst summary =\n\t\tstatus === \"restart_required\"\n\t\t\t? `Flow installed or updated skills during this startup (${changedSkills.join(\", \")}). Restart OpenCode before loading Flow skills.`\n\t\t\t: status === \"action_required\"\n\t\t\t\t? `Flow found user-owned skill folders for managed skills (${actionRequiredSkills.join(\", \")}). Run ${formatFlowDoctorCommand(version)} for repair guidance.`\n\t\t\t\t: \"Flow skills are synced.\";\n\treturn {\n\t\tstatus,\n\t\tversion,\n\t\troot,\n\t\tcheckedAt: new Date().toISOString(),\n\t\texpectedSkills: expectedSkillNames(),\n\t\tresults,\n\t\tchangedSkills,\n\t\tactionRequiredSkills,\n\t\trestartRequired: status === \"restart_required\",\n\t\tsummary,\n\t};\n}\n\nfunction createErrorHealth(\n\tversion: string,\n\troot: string,\n\terror: unknown,\n): FlowSkillSyncHealth {\n\tconst message = error instanceof Error ? error.message : String(error);\n\treturn {\n\t\tstatus: \"error\",\n\t\tversion,\n\t\troot,\n\t\tcheckedAt: new Date().toISOString(),\n\t\texpectedSkills: expectedSkillNames(),\n\t\tresults: [],\n\t\tchangedSkills: [],\n\t\tactionRequiredSkills: [],\n\t\trestartRequired: false,\n\t\tsummary: `Flow skill sync failed: ${message}`,\n\t\terror: message,\n\t};\n}\n\nexport function getLatestFlowSkillSyncHealth(): FlowSkillSyncHealth | null {\n\treturn latestFlowSkillSyncHealth;\n}\n\nexport function formatFlowDoctorCommand(version: string): string {\n\treturn `npx -y opencode-plugin-flow@${version} doctor`;\n}\n\nexport function getFlowSkillSetupStatus(\n\thealth = latestFlowSkillSyncHealth,\n): FlowSkillSetupStatus | null {\n\tif (!health || health.status === \"ok\") return null;\n\tconst status = health.status === \"error\" ? \"sync_failed\" : health.status;\n\treturn {\n\t\tstatus,\n\t\tsummary: health.summary,\n\t\tversion: health.version,\n\t\troot: health.root,\n\t\t...(health.changedSkills.length > 0\n\t\t\t? { changed: health.changedSkills }\n\t\t\t: {}),\n\t\t...(health.actionRequiredSkills.length > 0\n\t\t\t? { actionRequired: health.actionRequiredSkills }\n\t\t\t: {}),\n\t\t...(health.error ? { error: health.error } : {}),\n\t};\n}\n\nexport function formatFlowSkillSetupWarning(\n\thealth = latestFlowSkillSyncHealth,\n): string | null {\n\tconst setup = getFlowSkillSetupStatus(health);\n\tif (!setup) return null;\n\treturn [\n\t\t\"Flow setup warning:\",\n\t\tsetup.summary,\n\t\t`Skills root: ${setup.root}`,\n\t\t`Use \\`${formatFlowDoctorCommand(setup.version)}\\` for details.`,\n\t].join(\"\\n\");\n}\n\nexport function resolveFlowPluginVersion(): string {\n\tif (process.env.npm_package_version) return process.env.npm_package_version;\n\ttry {\n\t\tconst require = createRequire(import.meta.url);\n\t\tfor (const path of [\"../package.json\", \"../../package.json\"]) {\n\t\t\ttry {\n\t\t\t\tconst manifest = require(path) as { version?: string };\n\t\t\t\tif (manifest.version) return manifest.version;\n\t\t\t} catch {\n\t\t\t\t// Try the next layout: source tree and bundled dist differ.\n\t\t\t}\n\t\t}\n\t} catch {\n\t\t// Fall through to sentinel.\n\t}\n\treturn \"0.0.0\";\n}\n\nexport async function syncFlowSkills(version: string, home = homeDir()) {\n\tconst root = resolveFlowSkillsRoot(home);\n\treturn Promise.all(\n\t\tFLOW_SKILL_DEFINITIONS.map((definition) =>\n\t\t\tsyncSkill(definition, version, root),\n\t\t),\n\t);\n}\n\nexport async function runFlowSkillSync(\n\tversion: string,\n\tlog: FlowLog,\n\thome = homeDir(),\n): Promise<void> {\n\tconst root = resolveFlowSkillsRoot(home);\n\ttry {\n\t\tconst results = await syncFlowSkills(version, home);\n\t\tlatestFlowSkillSyncHealth = createHealth(version, root, results);\n\t\tconst changed = results.filter(\n\t\t\t(result) =>\n\t\t\t\tresult.action === \"installed\" ||\n\t\t\t\tresult.action === \"updated\" ||\n\t\t\t\tresult.action === \"updated_with_backup\",\n\t\t);\n\t\tif (changed.length > 0) {\n\t\t\tlog(\n\t\t\t\t\"info\",\n\t\t\t\t`Flow synced skills (${changed.map((item) => `${item.name}:${item.action}`).join(\", \")}). Restart OpenCode if skills were just installed.`,\n\t\t\t);\n\t\t}\n\t\tif (latestFlowSkillSyncHealth.status === \"action_required\") {\n\t\t\tlog(\"warn\", latestFlowSkillSyncHealth.summary);\n\t\t}\n\t} catch (error) {\n\t\tlatestFlowSkillSyncHealth = createErrorHealth(version, root, error);\n\t\tlog(\"warn\", latestFlowSkillSyncHealth.summary);\n\t}\n}\n\nexport async function inspectFlowSkillInstall(\n\tversion = resolveFlowPluginVersion(),\n\thome = homeDir(),\n): Promise<FlowSkillDoctorReport> {\n\tconst root = resolveFlowSkillsRoot(home);\n\tconst expected = new Set(expectedSkillNames());\n\tconst skills = await Promise.all(\n\t\tFLOW_SKILL_DEFINITIONS.map(async (definition) => {\n\t\t\tconst folder = join(root, definition.name);\n\t\t\tconst markerContent = await optionalRead(join(folder, MARKER_FILENAME));\n\t\t\tconst markerVersion = parseMarkerVersion(markerContent);\n\t\t\tconst markerHashes = parseMarkerFiles(markerContent);\n\t\t\tconst existingSkill = await optionalRead(join(folder, \"SKILL.md\"));\n\t\t\tif (existingSkill === null) {\n\t\t\t\treturn {\n\t\t\t\t\tname: definition.name,\n\t\t\t\t\tpath: folder,\n\t\t\t\t\tstatus: \"missing\" as const,\n\t\t\t\t\tmarkerVersion,\n\t\t\t\t\tmissingFiles: definition.files.map((file) => file.relativePath),\n\t\t\t\t\teditedFiles: [],\n\t\t\t\t\toutdatedFiles: [],\n\t\t\t\t};\n\t\t\t}\n\t\t\tif (markerContent === null) {\n\t\t\t\treturn {\n\t\t\t\t\tname: definition.name,\n\t\t\t\t\tpath: folder,\n\t\t\t\t\tstatus: \"foreign\" as const,\n\t\t\t\t\tmarkerVersion,\n\t\t\t\t\tmissingFiles: [],\n\t\t\t\t\teditedFiles: [],\n\t\t\t\t\toutdatedFiles: [],\n\t\t\t\t};\n\t\t\t}\n\t\t\tconst missingFiles: string[] = [];\n\t\t\tconst editedFiles: string[] = [];\n\t\t\tconst outdatedFiles: string[] = [];\n\t\t\tfor (const file of definition.files) {\n\t\t\t\tconst existing = await optionalRead(\n\t\t\t\t\tresolveSkillFile(folder, file.relativePath),\n\t\t\t\t);\n\t\t\t\tif (existing === null) {\n\t\t\t\t\tmissingFiles.push(file.relativePath);\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\t\t\t\tif (existing === file.content) continue;\n\t\t\t\tconst recordedHash = markerHashes.get(file.relativePath);\n\t\t\t\tif (recordedHash && sha256(existing) !== recordedHash) {\n\t\t\t\t\teditedFiles.push(file.relativePath);\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\t\t\t\toutdatedFiles.push(file.relativePath);\n\t\t\t}\n\t\t\tconst markerDrift = markerContent !== markerFor(definition, version);\n\t\t\tconst status: FlowSkillDoctorSkill[\"status\"] =\n\t\t\t\tmissingFiles.length > 0\n\t\t\t\t\t? \"incomplete\"\n\t\t\t\t\t: editedFiles.length > 0\n\t\t\t\t\t\t? \"edited\"\n\t\t\t\t\t\t: markerDrift || outdatedFiles.length > 0\n\t\t\t\t\t\t\t? \"outdated\"\n\t\t\t\t\t\t\t: \"ok\";\n\t\t\treturn {\n\t\t\t\tname: definition.name,\n\t\t\t\tpath: folder,\n\t\t\t\tstatus,\n\t\t\t\tmarkerVersion,\n\t\t\t\tmissingFiles,\n\t\t\t\teditedFiles,\n\t\t\t\toutdatedFiles,\n\t\t\t};\n\t\t}),\n\t);\n\n\tlet entries: string[] = [];\n\ttry {\n\t\tentries = await readdir(root);\n\t} catch (error) {\n\t\tif ((error as NodeJS.ErrnoException).code !== \"ENOENT\") throw error;\n\t}\n\tconst unmanagedFlowSkills = entries\n\t\t.filter(\n\t\t\t(name) =>\n\t\t\t\t(name === \"flow\" || name.startsWith(\"flow-\")) && !expected.has(name),\n\t\t)\n\t\t.map((name) => join(root, name));\n\n\tconst syncRequiredSkills = skills\n\t\t.filter((skill) =>\n\t\t\t[\"missing\", \"incomplete\", \"outdated\"].includes(skill.status),\n\t\t)\n\t\t.map((skill) => skill.name);\n\tconst actionRequiredSkills = skills\n\t\t.filter((skill) => [\"foreign\", \"edited\"].includes(skill.status))\n\t\t.map((skill) => skill.name);\n\tconst actionRequired = actionRequiredSkills.length > 0;\n\tconst syncRequired = syncRequiredSkills.length > 0;\n\treturn {\n\t\tstatus: actionRequired\n\t\t\t? \"action_required\"\n\t\t\t: syncRequired\n\t\t\t\t? \"sync_required\"\n\t\t\t\t: \"ok\",\n\t\tversion,\n\t\troot,\n\t\texpectedSkills: [...expected],\n\t\tskills,\n\t\tsyncRequiredSkills,\n\t\tactionRequiredSkills,\n\t\tunmanagedFlowSkills,\n\t};\n}\n\nfunction appendSkillList(\n\tlines: string[],\n\tlabel: string,\n\tskills: string[],\n): void {\n\tif (skills.length === 0) return;\n\tlines.push(`- ${label}: ${skills.join(\", \")}`);\n}\n\nexport function formatFlowSkillDoctor(report: FlowSkillDoctorReport): string {\n\tconst lines = [\n\t\t\"Flow doctor\",\n\t\t`- status: ${report.status}`,\n\t\t`- plugin version: ${report.version}`,\n\t\t`- skills root: ${report.root}`,\n\t\t`- expected skills: ${report.expectedSkills.join(\", \")}`,\n\t];\n\tappendSkillList(\n\t\tlines,\n\t\t\"startup sync can install/update\",\n\t\treport.syncRequiredSkills,\n\t);\n\tappendSkillList(lines, \"needs user decision\", report.actionRequiredSkills);\n\tlines.push(\"\", \"Skills:\");\n\tfor (const skill of report.skills) {\n\t\tlines.push(\n\t\t\t`- ${skill.name}: ${skill.status} (${skill.path})${\n\t\t\t\tskill.markerVersion ? ` marker=${skill.markerVersion}` : \"\"\n\t\t\t}`,\n\t\t);\n\t\tif (skill.missingFiles.length > 0) {\n\t\t\tlines.push(` missing: ${skill.missingFiles.join(\", \")}`);\n\t\t}\n\t\tif (skill.editedFiles.length > 0) {\n\t\t\tlines.push(` edited: ${skill.editedFiles.join(\", \")}`);\n\t\t}\n\t\tif (skill.outdatedFiles.length > 0) {\n\t\t\tlines.push(` outdated: ${skill.outdatedFiles.join(\", \")}`);\n\t\t}\n\t}\n\tif (report.unmanagedFlowSkills.length > 0) {\n\t\tlines.push(\"\", \"Unmanaged Flow-like skill folders:\");\n\t\tfor (const path of report.unmanagedFlowSkills) lines.push(`- ${path}`);\n\t}\n\tlines.push(\"\", \"Recommendation:\");\n\tif (report.status === \"ok\") {\n\t\tlines.push(\"- Flow skills are present and current.\");\n\t} else if (report.status === \"sync_required\") {\n\t\tlines.push(\n\t\t\t\"- Start or restart OpenCode with opencode-plugin-flow enabled so startup sync can install or update the listed skills. If Flow then reports restart_required, restart OpenCode once more so the refreshed skill registry is used.\",\n\t\t);\n\t} else {\n\t\tlines.push(\n\t\t\t\"- Resolve user-owned or edited managed skill folders, then restart OpenCode. Move a folder aside to let Flow recreate it, or keep it intentionally as a local override.\",\n\t\t);\n\t}\n\tlines.push(`- Details command: ${formatFlowDoctorCommand(report.version)}`);\n\treturn `${lines.join(\"\\n\")}\\n`;\n}\n\nexport async function uninstallFlowSkills(home = homeDir()) {\n\tconst root = resolveFlowSkillsRoot(home);\n\tconst removed: string[] = [];\n\tconst kept: string[] = [];\n\tlet entries: string[];\n\ttry {\n\t\tentries = await readdir(root);\n\t} catch (error) {\n\t\tif ((error as NodeJS.ErrnoException).code === \"ENOENT\") {\n\t\t\treturn { removed, kept };\n\t\t}\n\t\tthrow error;\n\t}\n\tfor (const name of entries) {\n\t\tif (name !== \"flow\" && !name.startsWith(\"flow-\")) continue;\n\t\tconst folder = join(root, name);\n\t\tconst markerContent = await optionalRead(join(folder, MARKER_FILENAME));\n\t\tif (markerContent === null) {\n\t\t\tkept.push(folder);\n\t\t\tcontinue;\n\t\t}\n\t\tconst hashes = parseMarkerFiles(markerContent);\n\t\tlet userEdited = false;\n\t\tfor (const [relativePath, recordedHash] of hashes) {\n\t\t\tconst content = await optionalRead(\n\t\t\t\tresolveSkillFile(folder, relativePath),\n\t\t\t);\n\t\t\tif (content !== null && sha256(content) !== recordedHash) {\n\t\t\t\tuserEdited = true;\n\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\t\tif (userEdited) {\n\t\t\tkept.push(folder);\n\t\t\tcontinue;\n\t\t}\n\t\tawait rm(folder, { recursive: true, force: true });\n\t\tremoved.push(folder);\n\t}\n\treturn { removed, kept };\n}\n",
|
|
6
7
|
"import flowHandoffFormatDoc from \"../../skills/flow/references/handoff-format.md\" with {\n\ttype: \"text\",\n};\nimport flowParallelOrchestrationDoc from \"../../skills/flow/references/parallel-orchestration.md\" with {\n\ttype: \"text\",\n};\nimport flowRecoveryPlaybookDoc from \"../../skills/flow/references/recovery-playbook.md\" with {\n\ttype: \"text\",\n};\nimport flowVerificationGatesDoc from \"../../skills/flow/references/verification-gates.md\" with {\n\ttype: \"text\",\n};\nimport flowSkillDoc from \"../../skills/flow/SKILL.md\" with { type: \"text\" };\nimport flowDeslopRefactorWorkflowDoc from \"../../skills/flow-deslop/references/refactor-workflow.md\" with {\n\ttype: \"text\",\n};\nimport flowDeslopSmellRubricDoc from \"../../skills/flow-deslop/references/smell-rubric.md\" with {\n\ttype: \"text\",\n};\nimport flowDeslopSkillDoc from \"../../skills/flow-deslop/SKILL.md\" with {\n\ttype: \"text\",\n};\nimport flowPlanParallelDiscoveryDoc from \"../../skills/flow-plan/references/parallel-discovery.md\" with {\n\ttype: \"text\",\n};\nimport flowPlanPlanningExamplesDoc from \"../../skills/flow-plan/references/planning-examples.md\" with {\n\ttype: \"text\",\n};\nimport flowPlanSkillDoc from \"../../skills/flow-plan/SKILL.md\" with {\n\ttype: \"text\",\n};\nimport flowReviewReviewRubricDoc from \"../../skills/flow-review/references/review-rubric.md\" with {\n\ttype: \"text\",\n};\nimport flowReviewSkillDoc from \"../../skills/flow-review/SKILL.md\" with {\n\ttype: \"text\",\n};\nimport flowRunAuditRubricDoc from \"../../skills/flow-run/references/audit-rubric.md\" with {\n\ttype: \"text\",\n};\nimport flowRunValidationRubricDoc from \"../../skills/flow-run/references/validation-rubric.md\" with {\n\ttype: \"text\",\n};\nimport flowRunSkillDoc from \"../../skills/flow-run/SKILL.md\" with {\n\ttype: \"text\",\n};\nimport flowUiQualityUiRubricDoc from \"../../skills/flow-ui-quality/references/ui-rubric.md\" with {\n\ttype: \"text\",\n};\nimport flowUiQualityVisualVerificationDoc from \"../../skills/flow-ui-quality/references/visual-verification.md\" with {\n\ttype: \"text\",\n};\nimport flowUiQualitySkillDoc from \"../../skills/flow-ui-quality/SKILL.md\" with {\n\ttype: \"text\",\n};\n\nexport type FlowSkillFile = {\n\trelativePath: string;\n\tcontent: string;\n};\n\nexport type FlowSkillDefinition = {\n\tname: string;\n\tfiles: FlowSkillFile[];\n};\n\nexport const FLOW_SKILL_DEFINITIONS: readonly FlowSkillDefinition[] = [\n\t{\n\t\tname: \"flow\",\n\t\tfiles: [\n\t\t\t{ relativePath: \"SKILL.md\", content: flowSkillDoc },\n\t\t\t{\n\t\t\t\trelativePath: \"references/recovery-playbook.md\",\n\t\t\t\tcontent: flowRecoveryPlaybookDoc,\n\t\t\t},\n\t\t\t{\n\t\t\t\trelativePath: \"references/parallel-orchestration.md\",\n\t\t\t\tcontent: flowParallelOrchestrationDoc,\n\t\t\t},\n\t\t\t{\n\t\t\t\trelativePath: \"references/handoff-format.md\",\n\t\t\t\tcontent: flowHandoffFormatDoc,\n\t\t\t},\n\t\t\t{\n\t\t\t\trelativePath: \"references/verification-gates.md\",\n\t\t\t\tcontent: flowVerificationGatesDoc,\n\t\t\t},\n\t\t],\n\t},\n\t{\n\t\tname: \"flow-plan\",\n\t\tfiles: [\n\t\t\t{ relativePath: \"SKILL.md\", content: flowPlanSkillDoc },\n\t\t\t{\n\t\t\t\trelativePath: \"references/planning-examples.md\",\n\t\t\t\tcontent: flowPlanPlanningExamplesDoc,\n\t\t\t},\n\t\t\t{\n\t\t\t\trelativePath: \"references/parallel-discovery.md\",\n\t\t\t\tcontent: flowPlanParallelDiscoveryDoc,\n\t\t\t},\n\t\t],\n\t},\n\t{\n\t\tname: \"flow-run\",\n\t\tfiles: [\n\t\t\t{ relativePath: \"SKILL.md\", content: flowRunSkillDoc },\n\t\t\t{\n\t\t\t\trelativePath: \"references/validation-rubric.md\",\n\t\t\t\tcontent: flowRunValidationRubricDoc,\n\t\t\t},\n\t\t\t{\n\t\t\t\trelativePath: \"references/audit-rubric.md\",\n\t\t\t\tcontent: flowRunAuditRubricDoc,\n\t\t\t},\n\t\t],\n\t},\n\t{\n\t\tname: \"flow-review\",\n\t\tfiles: [\n\t\t\t{ relativePath: \"SKILL.md\", content: flowReviewSkillDoc },\n\t\t\t{\n\t\t\t\trelativePath: \"references/review-rubric.md\",\n\t\t\t\tcontent: flowReviewReviewRubricDoc,\n\t\t\t},\n\t\t],\n\t},\n\t{\n\t\tname: \"flow-deslop\",\n\t\tfiles: [\n\t\t\t{ relativePath: \"SKILL.md\", content: flowDeslopSkillDoc },\n\t\t\t{\n\t\t\t\trelativePath: \"references/smell-rubric.md\",\n\t\t\t\tcontent: flowDeslopSmellRubricDoc,\n\t\t\t},\n\t\t\t{\n\t\t\t\trelativePath: \"references/refactor-workflow.md\",\n\t\t\t\tcontent: flowDeslopRefactorWorkflowDoc,\n\t\t\t},\n\t\t],\n\t},\n\t{\n\t\tname: \"flow-ui-quality\",\n\t\tfiles: [\n\t\t\t{ relativePath: \"SKILL.md\", content: flowUiQualitySkillDoc },\n\t\t\t{\n\t\t\t\trelativePath: \"references/ui-rubric.md\",\n\t\t\t\tcontent: flowUiQualityUiRubricDoc,\n\t\t\t},\n\t\t\t{\n\t\t\t\trelativePath: \"references/visual-verification.md\",\n\t\t\t\tcontent: flowUiQualityVisualVerificationDoc,\n\t\t\t},\n\t\t],\n\t},\n];\n",
|
|
7
|
-
"import { randomUUID } from \"node:crypto\";\nimport { mkdir, open, readFile, rename, rm, writeFile } from \"node:fs/promises\";\nimport { homedir } from \"node:os\";\nimport { dirname, isAbsolute, join, parse, resolve } from \"node:path\";\nimport { setTimeout as sleep } from \"node:timers/promises\";\nimport { parseStrictJsonObject } from \"./json/strict-object\";\nimport { type Session, SessionSchema } from \"./schema\";\n\nexport class InvalidFlowWorkspaceRootError extends Error {\n\treadonly code = \"INVALID_FLOW_WORKSPACE_ROOT\";\n\tconstructor(message: string) {\n\t\tsuper(message);\n\t\tthis.name = \"InvalidFlowWorkspaceRootError\";\n\t}\n}\n\nexport function normalizeWorkspaceRoot(\n\trawPath: string | undefined,\n): string | null {\n\tconst value = rawPath?.trim();\n\tif (!value) return null;\n\tconst normalized = resolve(value);\n\treturn parse(normalized).root === normalized ? null : normalized;\n}\n\nexport function assertMutableWorkspaceRoot(rawPath: string): string {\n\tconst root = normalizeWorkspaceRoot(rawPath);\n\tif (!root) {\n\t\tthrow new InvalidFlowWorkspaceRootError(\n\t\t\t\"Flow requires a non-root workspace path.\",\n\t\t);\n\t}\n\tif (root === resolve(process.env.HOME ?? homedir())) {\n\t\tthrow new InvalidFlowWorkspaceRootError(\n\t\t\t\"Flow refuses to use $HOME itself as a mutable workspace root.\",\n\t\t);\n\t}\n\treturn root;\n}\n\nexport function resolveWorkspaceRoot(context: {\n\tworktree?: string;\n\tdirectory?: string;\n}): string {\n\tconst candidate =\n\t\tnormalizeWorkspaceRoot(context.worktree) ??\n\t\tnormalizeWorkspaceRoot(context.directory);\n\tif (!candidate) {\n\t\tthrow new InvalidFlowWorkspaceRootError(\n\t\t\t\"Flow could not resolve a workspace root from tool context.\",\n\t\t);\n\t}\n\treturn assertMutableWorkspaceRoot(candidate);\n}\n\nexport function flowDir(worktree: string): string {\n\treturn join(worktree, \".flow\");\n}\n\nexport function sessionPath(worktree: string): string {\n\treturn join(flowDir(worktree), \"session.json\");\n}\n\nexport function historyDir(worktree: string): string {\n\treturn join(flowDir(worktree), \"history\");\n}\n\nexport function archivedSessionPath(\n\tworktree: string,\n\tsessionId: string,\n): string {\n\tif (!/^[a-zA-Z0-9_-]+$/.test(sessionId)) {\n\t\tthrow new Error(\"Invalid session id.\");\n\t}\n\treturn join(historyDir(worktree), `${sessionId}.json`);\n}\n\nasync function writeFileAtomically(\n\tpath: string,\n\tcontents: string,\n): Promise<void> {\n\tawait mkdir(dirname(path), { recursive: true });\n\tconst tempPath = `${path}.${process.pid}.${randomUUID()}.tmp`;\n\tconst handle = await open(tempPath, \"w\");\n\ttry {\n\t\tawait handle.writeFile(contents, \"utf8\");\n\t\tawait handle.sync();\n\t} catch (error) {\n\t\tawait handle.close();\n\t\tawait rm(tempPath, { force: true });\n\t\tthrow error;\n\t}\n\tawait handle.close();\n\ttry {\n\t\tawait rename(tempPath, path);\n\t} catch (error) {\n\t\tawait rm(tempPath, { force: true });\n\t\tthrow error;\n\t}\n\tconst directory = await open(dirname(path), \"r\");\n\ttry {\n\t\tawait directory.sync();\n\t} finally {\n\t\tawait directory.close();\n\t}\n}\n\nconst inProcessLocks = new Map<string, Promise<void>>();\nconst LOCK_TIMEOUT_MS = 30_000;\nconst LOCK_RETRY_MS = 25;\n\nasync function acquireLock(worktree: string): Promise<() => Promise<void>> {\n\tconst root = flowDir(worktree);\n\tconst lock = join(root, \"session.lock\");\n\tconst startedAt = Date.now();\n\twhile (true) {\n\t\ttry {\n\t\t\tawait mkdir(lock, { recursive: false });\n\t\t\treturn async () => {\n\t\t\t\tawait rm(lock, { recursive: true, force: true });\n\t\t\t};\n\t\t} catch (error) {\n\t\t\tconst code = (error as NodeJS.ErrnoException).code;\n\t\t\tif (code === \"ENOENT\") {\n\t\t\t\tawait mkdir(root, { recursive: true });\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t\tif (code !== \"EEXIST\") throw error;\n\t\t\tif (Date.now() - startedAt > LOCK_TIMEOUT_MS) {\n\t\t\t\tthrow new Error(`Timed out waiting for Flow session lock at ${lock}.`);\n\t\t\t}\n\t\t\tawait sleep(LOCK_RETRY_MS);\n\t\t}\n\t}\n}\n\nexport async function withSessionLock<T>(\n\tworktree: string,\n\ttask: () => Promise<T>,\n): Promise<T> {\n\tconst previous = inProcessLocks.get(worktree) ?? Promise.resolve();\n\tlet releaseQueue = () => {};\n\tconst current = new Promise<void>((resolve) => {\n\t\treleaseQueue = resolve;\n\t});\n\tconst queued = previous.catch(() => undefined).then(() => current);\n\tinProcessLocks.set(worktree, queued);\n\n\tlet releaseFileLock: (() => Promise<void>) | null = null;\n\ttry {\n\t\tawait previous.catch(() => undefined);\n\t\treleaseFileLock = await acquireLock(worktree);\n\t\treturn await task();\n\t} finally {\n\t\ttry {\n\t\t\tawait releaseFileLock?.();\n\t\t} finally {\n\t\t\treleaseQueue();\n\t\t\tif (inProcessLocks.get(worktree) === queued) {\n\t\t\t\tinProcessLocks.delete(worktree);\n\t\t\t}\n\t\t}\n\t}\n}\n\nexport async function loadSession(worktree: string): Promise<Session | null> {\n\tconst root = assertMutableWorkspaceRoot(worktree);\n\tlet raw: string;\n\ttry {\n\t\traw = await readFile(sessionPath(root), \"utf8\");\n\t} catch (error) {\n\t\tif ((error as NodeJS.ErrnoException).code === \"ENOENT\") return null;\n\t\tthrow error;\n\t}\n\tconst parsed = parseStrictJsonObject(raw, \"Flow session file\");\n\tif (!parsed.ok) throw new Error(parsed.error);\n\treturn SessionSchema.parse(parsed.value);\n}\n\nexport async function saveSession(\n\tworktree: string,\n\tsession: Session,\n): Promise<Session> {\n\tconst root = assertMutableWorkspaceRoot(worktree);\n\tconst normalized = SessionSchema.parse(session);\n\tawait writeFileAtomically(\n\t\tsessionPath(root),\n\t\t`${JSON.stringify(normalized, null, 2)}\\n`,\n\t);\n\tawait ensureFlowGitignore(root);\n\treturn normalized;\n}\n\nexport async function archiveAndClearSession(\n\tworktree: string,\n\tsession: Session,\n): Promise<void> {\n\tconst root = assertMutableWorkspaceRoot(worktree);\n\tawait mkdir(historyDir(root), { recursive: true });\n\tawait writeFileAtomically(\n\t\tarchivedSessionPath(root, session.id),\n\t\t`${JSON.stringify(SessionSchema.parse(session), null, 2)}\\n`,\n\t);\n\tawait rm(sessionPath(root), { force: true });\n\tawait ensureFlowGitignore(root);\n}\n\nasync function ensureFlowGitignore(worktree: string): Promise<void> {\n\tconst path = join(flowDir(worktree), \".gitignore\");\n\ttry {\n\t\tconst existing = await readFile(path, \"utf8\");\n\t\tif (existing.
|
|
8
|
+
"import { randomUUID } from \"node:crypto\";\nimport { mkdir, open, readFile, rename, rm, writeFile } from \"node:fs/promises\";\nimport { homedir } from \"node:os\";\nimport { dirname, isAbsolute, join, parse, resolve } from \"node:path\";\nimport { setTimeout as sleep } from \"node:timers/promises\";\nimport { parseStrictJsonObject } from \"./json/strict-object\";\nimport { type Session, SessionSchema } from \"./schema\";\n\nexport class InvalidFlowWorkspaceRootError extends Error {\n\treadonly code = \"INVALID_FLOW_WORKSPACE_ROOT\";\n\tconstructor(message: string) {\n\t\tsuper(message);\n\t\tthis.name = \"InvalidFlowWorkspaceRootError\";\n\t}\n}\n\nexport function normalizeWorkspaceRoot(\n\trawPath: string | undefined,\n): string | null {\n\tconst value = rawPath?.trim();\n\tif (!value) return null;\n\tconst normalized = resolve(value);\n\treturn parse(normalized).root === normalized ? null : normalized;\n}\n\nexport function assertMutableWorkspaceRoot(rawPath: string): string {\n\tconst root = normalizeWorkspaceRoot(rawPath);\n\tif (!root) {\n\t\tthrow new InvalidFlowWorkspaceRootError(\n\t\t\t\"Flow requires a non-root workspace path.\",\n\t\t);\n\t}\n\tif (root === resolve(process.env.HOME ?? homedir())) {\n\t\tthrow new InvalidFlowWorkspaceRootError(\n\t\t\t\"Flow refuses to use $HOME itself as a mutable workspace root.\",\n\t\t);\n\t}\n\treturn root;\n}\n\nexport function resolveWorkspaceRoot(context: {\n\tworktree?: string;\n\tdirectory?: string;\n}): string {\n\tconst candidate =\n\t\tnormalizeWorkspaceRoot(context.worktree) ??\n\t\tnormalizeWorkspaceRoot(context.directory);\n\tif (!candidate) {\n\t\tthrow new InvalidFlowWorkspaceRootError(\n\t\t\t\"Flow could not resolve a workspace root from tool context.\",\n\t\t);\n\t}\n\treturn assertMutableWorkspaceRoot(candidate);\n}\n\nexport function flowDir(worktree: string): string {\n\treturn join(worktree, \".flow\");\n}\n\nexport function sessionPath(worktree: string): string {\n\treturn join(flowDir(worktree), \"session.json\");\n}\n\nexport function historyDir(worktree: string): string {\n\treturn join(flowDir(worktree), \"history\");\n}\n\nexport function archivedSessionPath(\n\tworktree: string,\n\tsessionId: string,\n): string {\n\tif (!/^[a-zA-Z0-9_-]+$/.test(sessionId)) {\n\t\tthrow new Error(\"Invalid session id.\");\n\t}\n\treturn join(historyDir(worktree), `${sessionId}.json`);\n}\n\nasync function writeFileAtomically(\n\tpath: string,\n\tcontents: string,\n): Promise<void> {\n\tawait mkdir(dirname(path), { recursive: true });\n\tconst tempPath = `${path}.${process.pid}.${randomUUID()}.tmp`;\n\tconst handle = await open(tempPath, \"w\");\n\ttry {\n\t\tawait handle.writeFile(contents, \"utf8\");\n\t\tawait handle.sync();\n\t} catch (error) {\n\t\tawait handle.close();\n\t\tawait rm(tempPath, { force: true });\n\t\tthrow error;\n\t}\n\tawait handle.close();\n\ttry {\n\t\tawait rename(tempPath, path);\n\t} catch (error) {\n\t\tawait rm(tempPath, { force: true });\n\t\tthrow error;\n\t}\n\tconst directory = await open(dirname(path), \"r\");\n\ttry {\n\t\tawait directory.sync();\n\t} finally {\n\t\tawait directory.close();\n\t}\n}\n\nconst inProcessLocks = new Map<string, Promise<void>>();\nconst LOCK_TIMEOUT_MS = 30_000;\nconst LOCK_RETRY_MS = 25;\n\nasync function acquireLock(worktree: string): Promise<() => Promise<void>> {\n\tconst root = flowDir(worktree);\n\tconst lock = join(root, \"session.lock\");\n\tconst startedAt = Date.now();\n\twhile (true) {\n\t\ttry {\n\t\t\tawait mkdir(lock, { recursive: false });\n\t\t\treturn async () => {\n\t\t\t\tawait rm(lock, { recursive: true, force: true });\n\t\t\t};\n\t\t} catch (error) {\n\t\t\tconst code = (error as NodeJS.ErrnoException).code;\n\t\t\tif (code === \"ENOENT\") {\n\t\t\t\tawait mkdir(root, { recursive: true });\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t\tif (code !== \"EEXIST\") throw error;\n\t\t\tif (Date.now() - startedAt > LOCK_TIMEOUT_MS) {\n\t\t\t\tthrow new Error(`Timed out waiting for Flow session lock at ${lock}.`);\n\t\t\t}\n\t\t\tawait sleep(LOCK_RETRY_MS);\n\t\t}\n\t}\n}\n\nexport async function withSessionLock<T>(\n\tworktree: string,\n\ttask: () => Promise<T>,\n): Promise<T> {\n\tconst previous = inProcessLocks.get(worktree) ?? Promise.resolve();\n\tlet releaseQueue = () => {};\n\tconst current = new Promise<void>((resolve) => {\n\t\treleaseQueue = resolve;\n\t});\n\tconst queued = previous.catch(() => undefined).then(() => current);\n\tinProcessLocks.set(worktree, queued);\n\n\tlet releaseFileLock: (() => Promise<void>) | null = null;\n\ttry {\n\t\tawait previous.catch(() => undefined);\n\t\treleaseFileLock = await acquireLock(worktree);\n\t\treturn await task();\n\t} finally {\n\t\ttry {\n\t\t\tawait releaseFileLock?.();\n\t\t} finally {\n\t\t\treleaseQueue();\n\t\t\tif (inProcessLocks.get(worktree) === queued) {\n\t\t\t\tinProcessLocks.delete(worktree);\n\t\t\t}\n\t\t}\n\t}\n}\n\nexport async function loadSession(worktree: string): Promise<Session | null> {\n\tconst root = assertMutableWorkspaceRoot(worktree);\n\tlet raw: string;\n\ttry {\n\t\traw = await readFile(sessionPath(root), \"utf8\");\n\t} catch (error) {\n\t\tif ((error as NodeJS.ErrnoException).code === \"ENOENT\") return null;\n\t\tthrow error;\n\t}\n\tconst parsed = parseStrictJsonObject(raw, \"Flow session file\");\n\tif (!parsed.ok) throw new Error(parsed.error);\n\treturn SessionSchema.parse(parsed.value);\n}\n\nexport async function saveSession(\n\tworktree: string,\n\tsession: Session,\n): Promise<Session> {\n\tconst root = assertMutableWorkspaceRoot(worktree);\n\tconst normalized = SessionSchema.parse(session);\n\tawait writeFileAtomically(\n\t\tsessionPath(root),\n\t\t`${JSON.stringify(normalized, null, 2)}\\n`,\n\t);\n\tawait ensureFlowGitignore(root);\n\treturn normalized;\n}\n\nexport async function archiveAndClearSession(\n\tworktree: string,\n\tsession: Session,\n): Promise<void> {\n\tconst root = assertMutableWorkspaceRoot(worktree);\n\tawait mkdir(historyDir(root), { recursive: true });\n\tawait writeFileAtomically(\n\t\tarchivedSessionPath(root, session.id),\n\t\t`${JSON.stringify(SessionSchema.parse(session), null, 2)}\\n`,\n\t);\n\tawait rm(sessionPath(root), { force: true });\n\tawait ensureFlowGitignore(root);\n}\n\nconst FLOW_GITIGNORE_CONTENT = [\n\t\"session.json\",\n\t\"history/\",\n\t\"session.lock/\",\n\t\".gitignore\",\n\t\"\",\n].join(\"\\n\");\n\nasync function ensureFlowGitignore(worktree: string): Promise<void> {\n\tconst path = join(flowDir(worktree), \".gitignore\");\n\ttry {\n\t\tconst existing = await readFile(path, \"utf8\");\n\t\tif (existing.trim() === \"session.lock/\") {\n\t\t\tawait writeFile(path, FLOW_GITIGNORE_CONTENT, \"utf8\");\n\t\t}\n\t} catch (error) {\n\t\tif ((error as NodeJS.ErrnoException).code !== \"ENOENT\") throw error;\n\t\tawait writeFile(path, FLOW_GITIGNORE_CONTENT, \"utf8\");\n\t}\n}\n\nexport function isAbsoluteOrTraversal(value: string): boolean {\n\treturn isAbsolute(value) || value === \"..\" || value.startsWith(\"../\");\n}\n",
|
|
8
9
|
"type StrictJsonObjectParseResult =\n\t| { ok: true; value: Record<string, unknown> }\n\t| { ok: false; error: string };\n\nfunction findDuplicateKey(input: string): string | null {\n\ttype Frame = { isObject: boolean; keys: Set<string>; awaitingKey: boolean };\n\tconst stack: Frame[] = [];\n\tlet index = 0;\n\n\twhile (index < input.length) {\n\t\tconst char = input[index];\n\t\tif (char === \"{\") {\n\t\t\tstack.push({ isObject: true, keys: new Set(), awaitingKey: true });\n\t\t\tindex += 1;\n\t\t\tcontinue;\n\t\t}\n\t\tif (char === \"[\") {\n\t\t\tstack.push({ isObject: false, keys: new Set(), awaitingKey: false });\n\t\t\tindex += 1;\n\t\t\tcontinue;\n\t\t}\n\t\tif (char === \"}\" || char === \"]\") {\n\t\t\tstack.pop();\n\t\t\tindex += 1;\n\t\t\tcontinue;\n\t\t}\n\t\tif (char === \",\") {\n\t\t\tconst top = stack.at(-1);\n\t\t\tif (top?.isObject) top.awaitingKey = true;\n\t\t\tindex += 1;\n\t\t\tcontinue;\n\t\t}\n\t\tif (char === \":\") {\n\t\t\tconst top = stack.at(-1);\n\t\t\tif (top?.isObject) top.awaitingKey = false;\n\t\t\tindex += 1;\n\t\t\tcontinue;\n\t\t}\n\t\tif (char === '\"') {\n\t\t\tlet cursor = index + 1;\n\t\t\twhile (cursor < input.length) {\n\t\t\t\tif (input[cursor] === \"\\\\\") {\n\t\t\t\t\tcursor += 2;\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\t\t\t\tif (input[cursor] === '\"') break;\n\t\t\t\tcursor += 1;\n\t\t\t}\n\t\t\tconst top = stack.at(-1);\n\t\t\tif (top?.isObject && top.awaitingKey) {\n\t\t\t\tconst key = JSON.parse(input.slice(index, cursor + 1)) as string;\n\t\t\t\tif (top.keys.has(key)) return key;\n\t\t\t\ttop.keys.add(key);\n\t\t\t}\n\t\t\tindex = cursor + 1;\n\t\t\tcontinue;\n\t\t}\n\t\tindex += 1;\n\t}\n\treturn null;\n}\n\nexport function parseStrictJsonObject(\n\traw: string,\n\tlabel: string,\n): StrictJsonObjectParseResult {\n\tif (raw.trim().length === 0) {\n\t\treturn { ok: false, error: `${label} is empty.` };\n\t}\n\n\tlet parsed: unknown;\n\ttry {\n\t\tparsed = JSON.parse(raw);\n\t} catch (error) {\n\t\treturn {\n\t\t\tok: false,\n\t\t\terror:\n\t\t\t\terror instanceof Error\n\t\t\t\t\t? `${label} is not valid JSON: ${error.message}`\n\t\t\t\t\t: `${label} is not valid JSON.`,\n\t\t};\n\t}\n\n\tif (parsed === null || typeof parsed !== \"object\" || Array.isArray(parsed)) {\n\t\treturn { ok: false, error: `${label} must be a JSON object.` };\n\t}\n\n\tconst duplicate = findDuplicateKey(raw);\n\tif (duplicate) {\n\t\treturn { ok: false, error: `${label} has duplicate key '${duplicate}'.` };\n\t}\n\n\treturn { ok: true, value: parsed as Record<string, unknown> };\n}\n",
|
|
9
10
|
"import { z } from \"zod\";\n\nexport const FEATURE_ID_PATTERN = /^[a-z0-9]+(?:-[a-z0-9]+)*$/;\nexport const FEATURE_ID_MESSAGE = \"Feature ids must be lowercase kebab-case\";\n\nexport const FeatureStatusSchema = z.enum([\n\t\"pending\",\n\t\"in_progress\",\n\t\"completed\",\n\t\"blocked\",\n]);\n\nexport const SessionStatusSchema = z.enum([\n\t\"planning\",\n\t\"ready\",\n\t\"running\",\n\t\"blocked\",\n\t\"completed\",\n]);\n\nexport const ReviewStatusSchema = z.enum([\"passed\", \"failed\"]);\nexport const ValidationStatusSchema = z.enum([\"passed\", \"failed\"]);\nexport const ValidationScopeSchema = z.enum([\"targeted\", \"broad\"]);\nexport const FinalReviewPolicySchema = z.enum([\"broad\", \"detailed\"]);\n\nexport const ReviewFindingSchema = z\n\t.object({\n\t\tsummary: z.string().min(1),\n\t\tseverity: z.enum([\"blocking\", \"advisory\"]).default(\"blocking\"),\n\t})\n\t.strict();\n\nexport const ReviewSchema = z\n\t.object({\n\t\tstatus: ReviewStatusSchema,\n\t\tsummary: z.string().min(1),\n\t\tblockingFindings: z.array(ReviewFindingSchema).default([]),\n\t})\n\t.strict();\n\nexport const FinalReviewSchema = ReviewSchema.extend({\n\treviewDepth: FinalReviewPolicySchema,\n}).strict();\n\nexport const ValidationRunSchema = z\n\t.object({\n\t\tcommand: z.string().min(1),\n\t\tstatus: ValidationStatusSchema,\n\t\tsummary: z.string().min(1),\n\t})\n\t.strict();\n\nexport const ArtifactSchema = z\n\t.object({\n\t\tpath: z.string().min(1),\n\t})\n\t.strict();\n\nexport const FeatureSchema = z\n\t.object({\n\t\tid: z.string().regex(FEATURE_ID_PATTERN, FEATURE_ID_MESSAGE),\n\t\ttitle: z.string().min(1),\n\t\tsummary: z.string().min(1),\n\t\tstatus: FeatureStatusSchema.default(\"pending\"),\n\t\ttargets: z.array(z.string().min(1)).default([]),\n\t\tvalidation: z.array(z.string().min(1)).default([]),\n\t\tdependsOn: z.array(z.string().regex(FEATURE_ID_PATTERN)).default([]),\n\t})\n\t.strict();\n\nexport const PlanSchema = z\n\t.object({\n\t\tsummary: z.string().min(1),\n\t\toverview: z.string().min(1),\n\t\trequirements: z.array(z.string().min(1)).default([]),\n\t\tdecisions: z.array(z.string().min(1)).default([]),\n\t\tfinalReviewPolicy: FinalReviewPolicySchema.default(\"detailed\"),\n\t\tfeatures: z.array(FeatureSchema).min(1),\n\t})\n\t.strict();\n\nexport const PlanInputSchema = PlanSchema.omit({ features: true }).extend({\n\tfinalReviewPolicy: FinalReviewPolicySchema.optional(),\n\tfeatures: z\n\t\t.array(\n\t\t\tFeatureSchema.omit({ status: true })\n\t\t\t\t.extend({\n\t\t\t\t\tstatus: FeatureStatusSchema.optional(),\n\t\t\t\t\ttargets: z.array(z.string().min(1)).optional(),\n\t\t\t\t\tvalidation: z.array(z.string().min(1)).optional(),\n\t\t\t\t\tdependsOn: z.array(z.string().regex(FEATURE_ID_PATTERN)).optional(),\n\t\t\t\t})\n\t\t\t\t.strict(),\n\t\t)\n\t\t.min(1),\n});\n\nexport const WorkerOutcomeSchema = z\n\t.object({\n\t\tkind: z\n\t\t\t.enum([\"completed\", \"blocked\", \"needs_input\", \"replan_required\"])\n\t\t\t.default(\"completed\"),\n\t\tsummary: z.string().min(1).optional(),\n\t\tresolutionHint: z.string().min(1).optional(),\n\t})\n\t.strict();\n\nexport const NeedsInputOutcomeSchema = z\n\t.object({\n\t\tkind: z\n\t\t\t.enum([\"blocked\", \"needs_input\", \"replan_required\"])\n\t\t\t.default(\"needs_input\"),\n\t\tsummary: z.string().min(1),\n\t\tresolutionHint: z.string().min(1).optional(),\n\t})\n\t.strict();\n\nexport const WorkerResultSchema = z\n\t.discriminatedUnion(\"status\", [\n\t\tz\n\t\t\t.object({\n\t\t\t\tstatus: z.literal(\"ok\"),\n\t\t\t\tfeatureId: z.string().regex(FEATURE_ID_PATTERN, FEATURE_ID_MESSAGE),\n\t\t\t\tsummary: z.string().min(1),\n\t\t\t\tartifactsChanged: z.array(ArtifactSchema).default([]),\n\t\t\t\tvalidationRun: z.array(ValidationRunSchema).default([]),\n\t\t\t\tvalidationScope: ValidationScopeSchema,\n\t\t\t\tfeatureReview: ReviewSchema,\n\t\t\t\tfinalReview: FinalReviewSchema.optional(),\n\t\t\t\toutcome: WorkerOutcomeSchema.optional(),\n\t\t\t})\n\t\t\t.strict(),\n\t\tz\n\t\t\t.object({\n\t\t\t\tstatus: z.literal(\"needs_input\"),\n\t\t\t\tfeatureId: z.string().regex(FEATURE_ID_PATTERN, FEATURE_ID_MESSAGE),\n\t\t\t\tsummary: z.string().min(1),\n\t\t\t\tartifactsChanged: z.array(ArtifactSchema).default([]),\n\t\t\t\tvalidationRun: z.array(ValidationRunSchema).default([]),\n\t\t\t\tvalidationScope: ValidationScopeSchema.optional(),\n\t\t\t\tfeatureReview: ReviewSchema.optional(),\n\t\t\t\tfinalReview: FinalReviewSchema.optional(),\n\t\t\t\toutcome: NeedsInputOutcomeSchema,\n\t\t\t})\n\t\t\t.strict(),\n\t])\n\t.superRefine((value, ctx) => {\n\t\tif (\n\t\t\tvalue.status === \"ok\" &&\n\t\t\tvalue.outcome?.kind &&\n\t\t\tvalue.outcome.kind !== \"completed\"\n\t\t) {\n\t\t\tctx.addIssue({\n\t\t\t\tcode: \"custom\",\n\t\t\t\tpath: [\"outcome\", \"kind\"],\n\t\t\t\tmessage: 'ok worker results must use outcome.kind \"completed\".',\n\t\t\t});\n\t\t}\n\t});\n\nexport const ExecutionHistoryEntrySchema = z\n\t.object({\n\t\tfeatureId: z.string().regex(FEATURE_ID_PATTERN, FEATURE_ID_MESSAGE),\n\t\tstatus: z.enum([\"completed\", \"blocked\", \"needs_input\"]),\n\t\tsummary: z.string().min(1),\n\t\trecordedAt: z.string().min(1),\n\t\tartifactsChanged: z.array(ArtifactSchema).default([]),\n\t\tvalidationRun: z.array(ValidationRunSchema).default([]),\n\t\tvalidationScope: ValidationScopeSchema.optional(),\n\t\tfeatureReview: ReviewSchema.optional(),\n\t\tfinalReview: FinalReviewSchema.optional(),\n\t\toutcome: WorkerOutcomeSchema.optional(),\n\t})\n\t.strict();\n\nexport const SessionSchema = z\n\t.object({\n\t\tversion: z.literal(2),\n\t\tid: z.string().min(1),\n\t\tgoal: z.string().min(1),\n\t\tstatus: SessionStatusSchema,\n\t\tapproval: z.enum([\"pending\", \"approved\"]),\n\t\tplan: PlanSchema.nullable(),\n\t\tactiveFeatureId: z\n\t\t\t.string()\n\t\t\t.regex(FEATURE_ID_PATTERN, FEATURE_ID_MESSAGE)\n\t\t\t.nullable(),\n\t\thistory: z.array(ExecutionHistoryEntrySchema).default([]),\n\t\tclosure: z\n\t\t\t.object({\n\t\t\t\tkind: z.enum([\"completed\", \"deferred\", \"abandoned\"]),\n\t\t\t\tsummary: z.string().min(1),\n\t\t\t\trecordedAt: z.string().min(1),\n\t\t\t})\n\t\t\t.strict()\n\t\t\t.nullable(),\n\t\tlastError: z\n\t\t\t.object({\n\t\t\t\ttool: z.string().min(1),\n\t\t\t\tsummary: z.string().min(1),\n\t\t\t\trecovery: z.string().min(1).optional(),\n\t\t\t\trecordedAt: z.string().min(1),\n\t\t\t})\n\t\t\t.strict()\n\t\t\t.nullable()\n\t\t\t.default(null),\n\t\ttimestamps: z\n\t\t\t.object({\n\t\t\t\tcreatedAt: z.string().min(1),\n\t\t\t\tupdatedAt: z.string().min(1),\n\t\t\t\tcompletedAt: z.string().min(1).nullable(),\n\t\t\t})\n\t\t\t.strict(),\n\t})\n\t.strict();\n\nexport type Artifact = z.infer<typeof ArtifactSchema>;\nexport type ExecutionHistoryEntry = z.infer<typeof ExecutionHistoryEntrySchema>;\nexport type Feature = z.infer<typeof FeatureSchema>;\nexport type FinalReview = z.infer<typeof FinalReviewSchema>;\nexport type Plan = z.infer<typeof PlanSchema>;\nexport type PlanInput = z.input<typeof PlanInputSchema>;\nexport type Review = z.infer<typeof ReviewSchema>;\nexport type Session = z.infer<typeof SessionSchema>;\nexport type ValidationRun = z.infer<typeof ValidationRunSchema>;\nexport type WorkerResult = z.infer<typeof WorkerResultSchema>;\n",
|
|
10
|
-
"export type FlowPermissionConfig = {\n\tedit?: string;\n\tbash?: string;\n\ttask?: Record<string, string>;\n\t[toolPattern: string]: string | Record<string, string> | undefined;\n};\n\nexport type FlowAgentConfig = {\n\tmode: \"subagent\";\n\tdescription: string;\n\tprompt: string;\n\thidden?: boolean;\n\tpermission?: FlowPermissionConfig;\n};\n\nexport type FlowCommandConfig = {\n\tdescription: string;\n\ttemplate: string;\n\tagent?: string;\n\tsubtask?: boolean;\n};\n\nexport type MutableFlowConfig = {\n\tagent?: Record<string, unknown>;\n\tcommand?: Record<string, unknown>;\n};\n\nexport const FLOW_CORE_AGENTS = {\n\t\"flow-reviewer\": {\n\t\tmode: \"subagent\",\n\t\thidden: true,\n\t\tdescription: \"Internal read-only reviewer for Flow-guided work.\",\n\t\tprompt:\n\t\t\t\"Load `flow-review`. Inspect the current work read-only, report coverage, evidence-backed findings, confidence, gaps, and manager follow-ups, and do not mutate Flow state.\",\n\t\tpermission: {\n\t\t\tedit: \"deny\",\n\t\t\tbash: \"deny\",\n\t\t\ttask: { \"*\": \"deny\" },\n\t\t\t\"flow_*\": \"deny\",\n\t\t\tflow_status: \"allow\",\n\t\t},\n\t},\n\t\"flow-evidence-worker\": {\n\t\tmode: \"subagent\",\n\t\thidden: true,\n\t\tdescription:\n\t\t\t\"Internal read-only evidence worker for Flow planning and execution support.\",\n\t\tprompt:\n\t\t\t\"Use Flow evidence mode. Inspect only the assigned slice, do not edit files, do not call state-changing Flow tools, and return coverage, evidence inspected, confidence-tagged findings or facts, gaps, and manager follow-ups.\",\n\t\tpermission: {\n\t\t\tedit: \"deny\",\n\t\t\tbash: \"deny\",\n\t\t\ttask: { \"*\": \"deny\" },\n\t\t\t\"flow_*\": \"deny\",\n\t\t\tflow_status: \"allow\",\n\t\t},\n\t},\n\t\"flow-validation-worker\": {\n\t\tmode: \"subagent\",\n\t\thidden: true,\n\t\tdescription:\n\t\t\t\"Internal validation worker for Flow check selection and command evidence.\",\n\t\tprompt:\n\t\t\t\"Use Flow validation mode. Run only manager-specified commands or propose focused checks, do not edit files, do not call state-changing Flow tools, and report exact command, status, raw outcome summary, coverage, confidence, gaps, and manager follow-ups.\",\n\t\tpermission: {\n\t\t\tedit: \"deny\",\n\t\t\tbash: \"ask\",\n\t\t\ttask: { \"*\": \"deny\" },\n\t\t\t\"flow_*\": \"deny\",\n\t\t\tflow_status: \"allow\",\n\t\t},\n\t},\n\t\"flow-audit-worker\": {\n\t\tmode: \"subagent\",\n\t\thidden: true,\n\t\tdescription:\n\t\t\t\"Internal read-only audit worker for refuted or surviving finding candidates.\",\n\t\tprompt:\n\t\t\t\"Use Flow audit mode. Inspect only the assigned slice, actively refute candidate findings before reporting them, do not edit files, do not call state-changing Flow tools, and return coverage, evidence, guards checked, confidence, gaps, and manager follow-ups.\",\n\t\tpermission: {\n\t\t\tedit: \"deny\",\n\t\t\tbash: \"ask\",\n\t\t\ttask: { \"*\": \"deny\" },\n\t\t\t\"flow_*\": \"deny\",\n\t\t\tflow_status: \"allow\",\n\t\t},\n\t},\n\t\"flow-candidate-worker\": {\n\t\tmode: \"subagent\",\n\t\thidden: true,\n\t\tdescription:\n\t\t\t\"Internal candidate implementation worker for isolated Flow worktrees or exact non-overlapping path ownership.\",\n\t\tprompt:\n\t\t\t\"Use Flow candidate-implementation mode only when the manager assigned an isolated worktree or exact non-overlapping path ownership. Do not edit .flow/**, do not call state-changing Flow tools, do not complete Flow state, and return changed or proposed patch, verification run, coverage, confidence, merge risks, and manager follow-ups.\",\n\t\tpermission: {\n\t\t\tedit: \"ask\",\n\t\t\tbash: \"ask\",\n\t\t\ttask: { \"*\": \"deny\" },\n\t\t\t\"flow_*\": \"deny\",\n\t\t\tflow_status: \"allow\",\n\t\t},\n\t},\n\t\"flow-verifier-worker\": {\n\t\tmode: \"subagent\",\n\t\thidden: true,\n\t\tdescription:\n\t\t\t\"Internal verifier worker for checking Flow worker claims against cited evidence.\",\n\t\tprompt:\n\t\t\t\"Use Flow verifier mode. Verify only the assigned claims against the provided sources, commands, counts, or current docs. Do not generate new scope, do not edit files, do not call state-changing Flow tools, and return supported, partly-supported, unsupported, or source-not-found per claim with evidence, confidence, gaps, and manager follow-ups.\",\n\t\tpermission: {\n\t\t\tedit: \"deny\",\n\t\t\tbash: \"ask\",\n\t\t\ttask: { \"*\": \"deny\" },\n\t\t\t\"flow_*\": \"deny\",\n\t\t\tflow_status: \"allow\",\n\t\t},\n\t},\n} satisfies Record<string, FlowAgentConfig>;\n\nexport const FLOW_CORE_COMMANDS = {\n\t\"flow-auto\": {\n\t\tdescription: \"Drive Flow skills against the minimal runtime ledger\",\n\t\ttemplate:\n\t\t\t\"Load the `flow` skill and drive the Flow loop until completion or a real blocker: $ARGUMENTS\",\n\t},\n\t\"flow-plan\": {\n\t\tdescription: \"Create or approve a Flow plan\",\n\t\ttemplate: \"Load the `flow-plan` skill and plan: $ARGUMENTS\",\n\t},\n\t\"flow-run\": {\n\t\tdescription: \"Run one approved Flow feature\",\n\t\ttemplate:\n\t\t\t\"Load the `flow-run` skill and execute the next approved feature. $ARGUMENTS\",\n\t},\n\t\"flow-review\": {\n\t\tdescription: \"Run a read-only Flow review\",\n\t\tagent: \"flow-reviewer\",\n\t\tsubtask: true,\n\t\ttemplate: \"Load the `flow-review` skill and review: $ARGUMENTS\",\n\t},\n\t\"flow-status\": {\n\t\tdescription: \"Inspect the active Flow session\",\n\t\ttemplate: \"Call flow_status and report the session state and next action.\",\n\t},\n} satisfies Record<string, FlowCommandConfig>;\n\nexport function createFlowCoreConfigEntries() {\n\treturn {\n\t\tagent: Object.fromEntries(\n\t\t\tObject.entries(FLOW_CORE_AGENTS).map(([name, value]) => {\n\t\t\t\tconst permission = value.permission\n\t\t\t\t\t? {\n\t\t\t\t\t\t\t...value.permission,\n\t\t\t\t\t\t\t...(value.permission.task\n\t\t\t\t\t\t\t\t? { task: { ...value.permission.task } }\n\t\t\t\t\t\t\t\t: {}),\n\t\t\t\t\t\t}\n\t\t\t\t\t: undefined;\n\t\t\t\treturn [\n\t\t\t\t\tname,\n\t\t\t\t\t{\n\t\t\t\t\t\t...value,\n\t\t\t\t\t\t...(permission ? { permission } : {}),\n\t\t\t\t\t},\n\t\t\t\t];\n\t\t\t}),\n\t\t),\n\t\tcommand: Object.fromEntries(\n\t\t\tObject.entries(FLOW_CORE_COMMANDS).map(([name, value]) => [\n\t\t\t\tname,\n\t\t\t\t{ ...value },\n\t\t\t]),\n\t\t),\n\t};\n}\n\nexport function applyFlowConfig(config: MutableFlowConfig): void {\n\tconst entries = createFlowCoreConfigEntries();\n\tconfig.agent = { ...(config.agent ?? {}), ...entries.agent };\n\tconfig.command = { ...(config.command ?? {}), ...entries.command };\n}\n",
|
|
11
11
|
"import { applyFlowConfig, type MutableFlowConfig } from \"../../config-shared\";\n\nexport function createConfigHook(_ctx: unknown) {\n\treturn async (config: MutableFlowConfig) => {\n\t\tapplyFlowConfig(config);\n\t};\n}\n",
|
|
12
12
|
"type FlowLogLevel = \"info\" | \"warn\" | \"error\";\n\nexport function createFlowLog(ctx: unknown) {\n\tconst client = (ctx as { client?: { app?: { log?: unknown } } } | null)\n\t\t?.client;\n\tconst log = client?.app?.log;\n\treturn (level: FlowLogLevel, message: string): void => {\n\t\tif (typeof log !== \"function\") return;\n\t\ttry {\n\t\t\tvoid log.call(client?.app, {\n\t\t\t\tbody: { service: \"opencode-plugin-flow\", level, message },\n\t\t\t});\n\t\t} catch {\n\t\t\t// Logging is best-effort and must never break plugin startup.\n\t\t}\n\t};\n}\n",
|
|
13
13
|
"import { z } from \"zod\";\nimport { PlanInputSchema, WorkerResultSchema } from \"./schema\";\nimport {\n\tapplyPlan,\n\tapprovePlan,\n\tcloseSession,\n\tcompleteFeature,\n\tcreateSession,\n\tresetFeature,\n\tstartRun,\n\tsummarizeSession,\n} from \"./transitions\";\nimport {\n\tarchiveAndClearSession,\n\tloadSession,\n\tsaveSession,\n\twithSessionLock,\n} from \"./workspace\";\n\nexport type RuntimeResponse = Record<string, unknown>;\n\nexport const FlowPlanSaveSchema = z\n\t.object({\n\t\tgoal: z.string().trim().min(1).optional(),\n\t\tplan: PlanInputSchema.optional(),\n\t})\n\t.strict();\n\nexport const FlowRunStartSchema = z\n\t.object({\n\t\tfeatureId: z.string().min(1).optional(),\n\t})\n\t.strict();\n\nexport const FlowFeatureResetSchema = z\n\t.object({\n\t\tfeatureId: z.string().min(1),\n\t})\n\t.strict();\n\nexport const FlowSessionCloseSchema = z\n\t.object({\n\t\tkind: z.enum([\"completed\", \"deferred\", \"abandoned\"]),\n\t\tsummary: z.string().trim().min(1).optional(),\n\t})\n\t.strict();\n\nfunction responseFromFailure(result: {\n\tmessage: string;\n\trecovery?: string;\n}): RuntimeResponse {\n\treturn {\n\t\tstatus: \"error\",\n\t\tsummary: result.message,\n\t\t...(result.recovery ? { recovery: result.recovery } : {}),\n\t};\n}\n\nasync function mutate(\n\tworktree: string,\n\ttask: (\n\t\tsession: Awaited<ReturnType<typeof loadSession>>,\n\t) => Promise<RuntimeResponse>,\n): Promise<RuntimeResponse> {\n\treturn withSessionLock(worktree, async () =>\n\t\ttask(await loadSession(worktree)),\n\t);\n}\n\nexport async function flowStatus(worktree: string): Promise<RuntimeResponse> {\n\treturn summarizeSession(await loadSession(worktree));\n}\n\nexport async function flowPlanSave(\n\tworktree: string,\n\tinput: unknown,\n): Promise<RuntimeResponse> {\n\tconst args = FlowPlanSaveSchema.parse(input ?? {});\n\treturn mutate(worktree, async (existing) => {\n\t\tconst goal = args.goal ?? existing?.goal;\n\t\tif (!goal) {\n\t\t\treturn {\n\t\t\t\tstatus: \"missing_goal\",\n\t\t\t\tsummary: \"Provide a goal before saving a Flow plan.\",\n\t\t\t\tnextAction: \"/flow-plan <goal>\",\n\t\t\t};\n\t\t}\n\t\tif (existing?.status === \"completed\") {\n\t\t\tawait archiveAndClearSession(worktree, existing);\n\t\t}\n\t\tconst base =\n\t\t\texisting?.status === \"completed\"\n\t\t\t\t? createSession(goal)\n\t\t\t\t: (existing ?? createSession(goal));\n\t\tif (base.goal !== goal) {\n\t\t\tif (base.approval === \"approved\") {\n\t\t\t\treturn {\n\t\t\t\t\tstatus: \"error\",\n\t\t\t\t\tsummary:\n\t\t\t\t\t\t\"An approved Flow session already exists for a different goal. Close it before starting a new one.\",\n\t\t\t\t};\n\t\t\t}\n\t\t}\n\t\tconst session = base.goal === goal ? base : createSession(goal);\n\t\tconst result = args.plan\n\t\t\t? applyPlan(session, args.plan)\n\t\t\t: { ok: true as const, value: session };\n\t\tif (!result.ok) return responseFromFailure(result);\n\t\tconst saved = await saveSession(worktree, result.value);\n\t\treturn {\n\t\t\t...summarizeSession(saved),\n\t\t\tstatus: \"ok\",\n\t\t\tsummary: args.plan ? \"Flow plan saved.\" : \"Flow session ready.\",\n\t\t};\n\t});\n}\n\nexport async function flowPlanApprove(\n\tworktree: string,\n): Promise<RuntimeResponse> {\n\treturn mutate(worktree, async (session) => {\n\t\tif (!session) {\n\t\t\treturn {\n\t\t\t\tstatus: \"missing_session\",\n\t\t\t\tsummary: \"No active Flow session exists.\",\n\t\t\t\tnextAction: \"/flow-plan <goal>\",\n\t\t\t};\n\t\t}\n\t\tconst result = approvePlan(session);\n\t\tif (!result.ok) return responseFromFailure(result);\n\t\tconst saved = await saveSession(worktree, result.value);\n\t\treturn {\n\t\t\t...summarizeSession(saved),\n\t\t\tstatus: \"ok\",\n\t\t\tsummary: \"Flow plan approved.\",\n\t\t};\n\t});\n}\n\nexport async function flowRunStart(\n\tworktree: string,\n\tinput: unknown,\n): Promise<RuntimeResponse> {\n\tconst args = FlowRunStartSchema.parse(input ?? {});\n\treturn mutate(worktree, async (session) => {\n\t\tif (!session) {\n\t\t\treturn {\n\t\t\t\tstatus: \"missing_session\",\n\t\t\t\tsummary: \"No active Flow session exists.\",\n\t\t\t\tnextAction: \"/flow-plan <goal>\",\n\t\t\t};\n\t\t}\n\t\tconst result = startRun(session, args.featureId);\n\t\tif (!result.ok) return responseFromFailure(result);\n\t\tconst saved = await saveSession(worktree, result.value.session);\n\t\treturn {\n\t\t\t...summarizeSession(saved),\n\t\t\tstatus: \"ok\",\n\t\t\tsummary: `Started feature '${result.value.feature.id}'.`,\n\t\t\tfeature: result.value.feature,\n\t\t};\n\t});\n}\n\nexport async function flowFeatureComplete(\n\tworktree: string,\n\tinput: unknown,\n): Promise<RuntimeResponse> {\n\tconst worker = WorkerResultSchema.parse(input ?? {});\n\treturn mutate(worktree, async (session) => {\n\t\tif (!session) {\n\t\t\treturn {\n\t\t\t\tstatus: \"missing_session\",\n\t\t\t\tsummary: \"No active Flow session exists.\",\n\t\t\t\tnextAction: \"/flow-plan <goal>\",\n\t\t\t};\n\t\t}\n\t\tconst result = completeFeature(session, worker);\n\t\tif (!result.ok) {\n\t\t\tif (result.session) await saveSession(worktree, result.session);\n\t\t\treturn responseFromFailure(result);\n\t\t}\n\t\tconst saved = await saveSession(worktree, result.value);\n\t\treturn {\n\t\t\t...summarizeSession(saved),\n\t\t\tstatus: \"ok\",\n\t\t\tsummary: \"Feature result recorded.\",\n\t\t};\n\t});\n}\n\nexport async function flowFeatureReset(\n\tworktree: string,\n\tinput: unknown,\n): Promise<RuntimeResponse> {\n\tconst args = FlowFeatureResetSchema.parse(input ?? {});\n\treturn mutate(worktree, async (session) => {\n\t\tif (!session) {\n\t\t\treturn {\n\t\t\t\tstatus: \"missing_session\",\n\t\t\t\tsummary: \"No active Flow session exists.\",\n\t\t\t\tnextAction: \"/flow-plan <goal>\",\n\t\t\t};\n\t\t}\n\t\tconst result = resetFeature(session, args.featureId);\n\t\tif (!result.ok) return responseFromFailure(result);\n\t\tconst saved = await saveSession(worktree, result.value);\n\t\treturn {\n\t\t\t...summarizeSession(saved),\n\t\t\tstatus: \"ok\",\n\t\t\tsummary: `Feature '${args.featureId}' reset.`,\n\t\t};\n\t});\n}\n\nexport async function flowSessionClose(\n\tworktree: string,\n\tinput: unknown,\n): Promise<RuntimeResponse> {\n\tconst args = FlowSessionCloseSchema.parse(input ?? {});\n\treturn mutate(worktree, async (session) => {\n\t\tif (!session) {\n\t\t\treturn {\n\t\t\t\tstatus: \"missing_session\",\n\t\t\t\tsummary: \"No active Flow session exists.\",\n\t\t\t\tnextAction: \"/flow-plan <goal>\",\n\t\t\t};\n\t\t}\n\t\tconst result = closeSession(session, args.kind, args.summary);\n\t\tif (!result.ok) return responseFromFailure(result);\n\t\tawait archiveAndClearSession(worktree, result.value);\n\t\treturn {\n\t\t\tstatus: \"ok\",\n\t\t\tsummary: `Flow session closed as ${args.kind}.`,\n\t\t\tarchivedSessionId: result.value.id,\n\t\t\tclosure: result.value.closure,\n\t\t};\n\t});\n}\n",
|
|
14
14
|
"import { randomUUID } from \"node:crypto\";\nimport {\n\ttype ExecutionHistoryEntry,\n\ttype Feature,\n\ttype Plan,\n\ttype PlanInput,\n\tPlanInputSchema,\n\ttype Session,\n\ttype WorkerResult,\n\tWorkerResultSchema,\n} from \"./schema\";\nimport { nowIso } from \"./time\";\n\nexport type TransitionResult<T> =\n\t| { ok: true; value: T }\n\t| { ok: false; message: string; recovery?: string; session?: Session };\n\ntype CompletedWorkerResult = Extract<WorkerResult, { status: \"ok\" }>;\n\nfunction ok<T>(value: T): TransitionResult<T> {\n\treturn { ok: true, value };\n}\n\nfunction fail<T>(\n\tmessage: string,\n\trecovery?: string,\n\tsession?: Session,\n): TransitionResult<T> {\n\treturn {\n\t\tok: false,\n\t\tmessage,\n\t\t...(recovery ? { recovery } : {}),\n\t\t...(session ? { session } : {}),\n\t};\n}\n\nfunction clonePlan(input: PlanInput): Plan {\n\tconst parsed = PlanInputSchema.parse(input);\n\treturn {\n\t\tsummary: parsed.summary,\n\t\toverview: parsed.overview,\n\t\trequirements: parsed.requirements ?? [],\n\t\tdecisions: parsed.decisions ?? [],\n\t\tfinalReviewPolicy: parsed.finalReviewPolicy ?? \"detailed\",\n\t\tfeatures: parsed.features.map((feature) => ({\n\t\t\tid: feature.id,\n\t\t\ttitle: feature.title,\n\t\t\tsummary: feature.summary,\n\t\t\tstatus: \"pending\",\n\t\t\ttargets: feature.targets ?? [],\n\t\t\tvalidation: feature.validation ?? [],\n\t\t\tdependsOn: feature.dependsOn ?? [],\n\t\t})),\n\t};\n}\n\nfunction validatePlan(plan: Plan): string | null {\n\tconst seen = new Set<string>();\n\tfor (const feature of plan.features) {\n\t\tif (seen.has(feature.id)) return `Duplicate feature id '${feature.id}'.`;\n\t\tseen.add(feature.id);\n\t}\n\tfor (const feature of plan.features) {\n\t\tfor (const dependency of feature.dependsOn) {\n\t\t\tif (!seen.has(dependency)) {\n\t\t\t\treturn `Feature '${feature.id}' depends on unknown feature '${dependency}'.`;\n\t\t\t}\n\t\t\tif (dependency === feature.id) {\n\t\t\t\treturn `Feature '${feature.id}' cannot depend on itself.`;\n\t\t\t}\n\t\t}\n\t}\n\n\tconst visiting = new Set<string>();\n\tconst visited = new Set<string>();\n\tconst byId = new Map(plan.features.map((feature) => [feature.id, feature]));\n\tfunction visit(id: string): boolean {\n\t\tif (visited.has(id)) return false;\n\t\tif (visiting.has(id)) return true;\n\t\tvisiting.add(id);\n\t\tfor (const dependency of byId.get(id)?.dependsOn ?? []) {\n\t\t\tif (visit(dependency)) return true;\n\t\t}\n\t\tvisiting.delete(id);\n\t\tvisited.add(id);\n\t\treturn false;\n\t}\n\treturn plan.features.some((feature) => visit(feature.id))\n\t\t? \"Feature dependencies contain a cycle.\"\n\t\t: null;\n}\n\nexport function createSession(goal: string): Session {\n\tconst now = nowIso();\n\treturn {\n\t\tversion: 2,\n\t\tid: randomUUID(),\n\t\tgoal,\n\t\tstatus: \"planning\",\n\t\tapproval: \"pending\",\n\t\tplan: null,\n\t\tactiveFeatureId: null,\n\t\thistory: [],\n\t\tclosure: null,\n\t\tlastError: null,\n\t\ttimestamps: {\n\t\t\tcreatedAt: now,\n\t\t\tupdatedAt: now,\n\t\t\tcompletedAt: null,\n\t\t},\n\t};\n}\n\nfunction touch(session: Session): Session {\n\treturn {\n\t\t...session,\n\t\ttimestamps: { ...session.timestamps, updatedAt: nowIso() },\n\t};\n}\n\nexport function applyPlan(\n\tsession: Session,\n\tplanInput: PlanInput,\n): TransitionResult<Session> {\n\tif (session.approval === \"approved\" || session.status !== \"planning\") {\n\t\treturn fail(\n\t\t\t\"Approved plans cannot be changed. Reset or start a new session.\",\n\t\t);\n\t}\n\tconst plan = clonePlan(planInput);\n\tconst planError = validatePlan(plan);\n\tif (planError) return fail(planError);\n\treturn ok(\n\t\ttouch({\n\t\t\t...session,\n\t\t\tstatus: \"planning\",\n\t\t\tapproval: \"pending\",\n\t\t\tplan,\n\t\t\tactiveFeatureId: null,\n\t\t\thistory: [],\n\t\t\tclosure: null,\n\t\t\tlastError: null,\n\t\t\ttimestamps: { ...session.timestamps, completedAt: null },\n\t\t}),\n\t);\n}\n\nexport function approvePlan(session: Session): TransitionResult<Session> {\n\tif (!session.plan) return fail(\"There is no draft plan to approve.\");\n\tif (session.approval === \"approved\" && session.status === \"ready\") {\n\t\treturn ok(session);\n\t}\n\tif (session.status !== \"planning\") {\n\t\treturn fail(\"Only planning sessions can be approved.\");\n\t}\n\treturn ok(touch({ ...session, approval: \"approved\", status: \"ready\" }));\n}\n\nfunction featureIsRunnable(feature: Feature, completed: Set<string>): boolean {\n\treturn (\n\t\tfeature.status === \"pending\" &&\n\t\tfeature.dependsOn.every((dependency) => completed.has(dependency))\n\t);\n}\n\nfunction nextRunnableFeature(\n\tfeatures: Feature[],\n\trequestedId?: string,\n): TransitionResult<Feature> {\n\tconst completed = new Set(\n\t\tfeatures\n\t\t\t.filter((feature) => feature.status === \"completed\")\n\t\t\t.map((feature) => feature.id),\n\t);\n\tconst byId = new Map(features.map((feature) => [feature.id, feature]));\n\tif (requestedId) {\n\t\tconst feature = byId.get(requestedId);\n\t\tif (!feature) return fail(`Feature '${requestedId}' is not in the plan.`);\n\t\tif (feature.status === \"completed\") {\n\t\t\treturn fail(`Feature '${requestedId}' is already completed.`);\n\t\t}\n\t\tif (feature.status !== \"pending\") {\n\t\t\treturn fail(\n\t\t\t\t`Feature '${requestedId}' is ${feature.status} and must be reset before it can run.`,\n\t\t\t);\n\t\t}\n\t\tif (!featureIsRunnable(feature, completed)) {\n\t\t\treturn fail(`Feature '${requestedId}' has incomplete dependencies.`);\n\t\t}\n\t\treturn ok(feature);\n\t}\n\n\tconst feature = features.find((item) => featureIsRunnable(item, completed));\n\treturn feature ? ok(feature) : fail(\"No runnable feature is available.\");\n}\n\nfunction updateFeature(\n\tfeatures: Feature[],\n\tfeatureId: string,\n\tstatus: Feature[\"status\"],\n): Feature[] {\n\treturn features.map((feature) =>\n\t\tfeature.id === featureId\n\t\t\t? { ...feature, status }\n\t\t\t: feature.status === \"in_progress\" && status === \"in_progress\"\n\t\t\t\t? { ...feature, status: \"pending\" }\n\t\t\t\t: feature,\n\t);\n}\n\nexport function startRun(\n\tsession: Session,\n\tfeatureId?: string,\n): TransitionResult<{ session: Session; feature: Feature }> {\n\tif (session.status === \"completed\") {\n\t\treturn fail(\"This Flow session is already completed.\");\n\t}\n\tif (!session.plan || session.approval !== \"approved\") {\n\t\treturn fail(\"There is no approved plan to run.\");\n\t}\n\tif (session.status === \"blocked\") {\n\t\treturn fail(\n\t\t\t\"Blocked features must be reset before rerun.\",\n\t\t\t\"Call flow_feature_reset for the blocked feature, then start it again.\",\n\t\t);\n\t}\n\tif (session.activeFeatureId) {\n\t\tif (!featureId || featureId === session.activeFeatureId) {\n\t\t\tconst active = session.plan.features.find(\n\t\t\t\t(feature) => feature.id === session.activeFeatureId,\n\t\t\t);\n\t\t\tif (active) return ok({ session, feature: active });\n\t\t}\n\t\treturn fail(`Feature '${session.activeFeatureId}' is already in progress.`);\n\t}\n\n\tconst selected = nextRunnableFeature(session.plan.features, featureId);\n\tif (!selected.ok) return selected;\n\tconst nextPlan = {\n\t\t...session.plan,\n\t\tfeatures: updateFeature(\n\t\t\tsession.plan.features,\n\t\t\tselected.value.id,\n\t\t\t\"in_progress\",\n\t\t),\n\t};\n\tconst next = touch({\n\t\t...session,\n\t\tstatus: \"running\",\n\t\tplan: nextPlan,\n\t\tactiveFeatureId: selected.value.id,\n\t\tlastError: null,\n\t});\n\treturn ok({\n\t\tsession: next,\n\t\tfeature:\n\t\t\tnext.plan?.features.find((feature) => feature.id === selected.value.id) ??\n\t\t\tselected.value,\n\t});\n}\n\nfunction isPassingReview(review: {\n\tstatus: string;\n\tblockingFindings: unknown[];\n}) {\n\treturn review.status === \"passed\" && review.blockingFindings.length === 0;\n}\n\nfunction finalFeature(session: Session, featureId: string): boolean {\n\tif (!session.plan) return false;\n\treturn session.plan.features.every(\n\t\t(feature) => feature.id === featureId || feature.status === \"completed\",\n\t);\n}\n\nfunction completionFailure<T>(\n\tsession: Session,\n\ttool: string,\n\tmessage: string,\n\trecovery: string,\n): TransitionResult<T> {\n\treturn fail<T>(message, recovery, {\n\t\t...session,\n\t\tlastError: { tool, summary: message, recovery, recordedAt: nowIso() },\n\t});\n}\n\nfunction validateCompletion(\n\tsession: Session,\n\tworker: CompletedWorkerResult,\n): TransitionResult<void> {\n\tconst wasFinal = finalFeature(session, worker.featureId);\n\tif (worker.validationRun.length === 0) {\n\t\treturn completionFailure(\n\t\t\tsession,\n\t\t\t\"flow_feature_complete\",\n\t\t\t\"Completion requires recorded validation evidence.\",\n\t\t\t\"Run the targeted or broad validation command and record the result.\",\n\t\t);\n\t}\n\tif (!worker.validationRun.every((item) => item.status === \"passed\")) {\n\t\treturn completionFailure(\n\t\t\tsession,\n\t\t\t\"flow_feature_complete\",\n\t\t\t\"Completion requires all recorded validation to pass.\",\n\t\t\t\"Fix failures, rerun validation, then complete the feature.\",\n\t\t);\n\t}\n\tif (!wasFinal && worker.validationScope !== \"targeted\") {\n\t\treturn completionFailure(\n\t\t\tsession,\n\t\t\t\"flow_feature_complete\",\n\t\t\t\"Non-final feature completion requires targeted validation.\",\n\t\t\t\"Record validationScope: targeted for ordinary feature completion.\",\n\t\t);\n\t}\n\tif (wasFinal && worker.validationScope !== \"broad\") {\n\t\treturn completionFailure(\n\t\t\tsession,\n\t\t\t\"flow_feature_complete\",\n\t\t\t\"Final feature completion requires broad validation.\",\n\t\t\t\"Run the project-level gate and record validationScope: broad.\",\n\t\t);\n\t}\n\tif (!isPassingReview(worker.featureReview)) {\n\t\treturn completionFailure(\n\t\t\tsession,\n\t\t\t\"flow_feature_complete\",\n\t\t\t\"Completion requires a passing featureReview with no blocking findings.\",\n\t\t\t\"Fix or acknowledge the review findings before completing.\",\n\t\t);\n\t}\n\tif (wasFinal) {\n\t\tif (!worker.finalReview) {\n\t\t\treturn completionFailure(\n\t\t\t\tsession,\n\t\t\t\t\"flow_feature_complete\",\n\t\t\t\t\"Final feature completion requires a finalReview.\",\n\t\t\t\t\"Run final review and include the finalReview payload.\",\n\t\t\t);\n\t\t}\n\t\tif (!isPassingReview(worker.finalReview)) {\n\t\t\treturn completionFailure(\n\t\t\t\tsession,\n\t\t\t\t\"flow_feature_complete\",\n\t\t\t\t\"Final completion requires a passing finalReview.\",\n\t\t\t\t\"Resolve final review findings before completing the session.\",\n\t\t\t);\n\t\t}\n\t\tconst policy = session.plan?.finalReviewPolicy ?? \"detailed\";\n\t\tif (worker.finalReview.reviewDepth !== policy) {\n\t\t\treturn completionFailure(\n\t\t\t\tsession,\n\t\t\t\t\"flow_feature_complete\",\n\t\t\t\t`Final review depth must match the plan policy '${policy}'.`,\n\t\t\t\t\"Record a finalReview whose reviewDepth matches the approved plan.\",\n\t\t\t);\n\t\t}\n\t}\n\treturn ok(undefined);\n}\n\nexport function completeFeature(\n\tsession: Session,\n\tinput: unknown,\n): TransitionResult<Session> {\n\tif (\n\t\t!session.plan ||\n\t\tsession.status !== \"running\" ||\n\t\t!session.activeFeatureId\n\t) {\n\t\treturn fail(\"No feature is currently running.\");\n\t}\n\tconst worker = WorkerResultSchema.parse(input);\n\tif (worker.featureId !== session.activeFeatureId) {\n\t\treturn fail(\n\t\t\t`Worker result feature '${worker.featureId}' does not match active feature '${session.activeFeatureId}'.`,\n\t\t);\n\t}\n\n\tif (worker.status === \"needs_input\") {\n\t\tconst entry: ExecutionHistoryEntry = {\n\t\t\tfeatureId: worker.featureId,\n\t\t\tstatus: \"needs_input\",\n\t\t\tsummary: worker.summary,\n\t\t\trecordedAt: nowIso(),\n\t\t\tartifactsChanged: worker.artifactsChanged,\n\t\t\tvalidationRun: worker.validationRun,\n\t\t\tvalidationScope: worker.validationScope,\n\t\t\tfeatureReview: worker.featureReview,\n\t\t\tfinalReview: worker.finalReview,\n\t\t\toutcome: worker.outcome,\n\t\t};\n\t\treturn ok(\n\t\t\ttouch({\n\t\t\t\t...session,\n\t\t\t\tstatus: \"blocked\",\n\t\t\t\tactiveFeatureId: null,\n\t\t\t\tplan: {\n\t\t\t\t\t...session.plan,\n\t\t\t\t\tfeatures: updateFeature(\n\t\t\t\t\t\tsession.plan.features,\n\t\t\t\t\t\tworker.featureId,\n\t\t\t\t\t\t\"blocked\",\n\t\t\t\t\t),\n\t\t\t\t},\n\t\t\t\thistory: [...session.history, entry],\n\t\t\t}),\n\t\t);\n\t}\n\n\tconst validation = validateCompletion(session, worker);\n\tif (!validation.ok) return validation;\n\n\tconst entry: ExecutionHistoryEntry = {\n\t\tfeatureId: worker.featureId,\n\t\tstatus: \"completed\",\n\t\tsummary: worker.summary,\n\t\trecordedAt: nowIso(),\n\t\tartifactsChanged: worker.artifactsChanged,\n\t\tvalidationRun: worker.validationRun,\n\t\tvalidationScope: worker.validationScope,\n\t\tfeatureReview: worker.featureReview,\n\t\tfinalReview: worker.finalReview,\n\t\toutcome: worker.outcome,\n\t};\n\tconst features = updateFeature(\n\t\tsession.plan.features,\n\t\tworker.featureId,\n\t\t\"completed\",\n\t);\n\tconst allComplete = features.every(\n\t\t(feature) => feature.status === \"completed\",\n\t);\n\tconst now = nowIso();\n\treturn ok(\n\t\ttouch({\n\t\t\t...session,\n\t\t\tstatus: allComplete ? \"completed\" : \"ready\",\n\t\t\tactiveFeatureId: null,\n\t\t\tplan: { ...session.plan, features },\n\t\t\thistory: [...session.history, entry],\n\t\t\tclosure: allComplete\n\t\t\t\t? { kind: \"completed\", summary: worker.summary, recordedAt: now }\n\t\t\t\t: null,\n\t\t\tlastError: null,\n\t\t\ttimestamps: {\n\t\t\t\t...session.timestamps,\n\t\t\t\tcompletedAt: allComplete ? now : session.timestamps.completedAt,\n\t\t\t},\n\t\t}),\n\t);\n}\n\nfunction dependentFeatureIds(\n\tfeatures: Feature[],\n\tfeatureId: string,\n): Set<string> {\n\tconst affected = new Set([featureId]);\n\tlet changed = true;\n\twhile (changed) {\n\t\tchanged = false;\n\t\tfor (const feature of features) {\n\t\t\tif (affected.has(feature.id)) continue;\n\t\t\tif (feature.dependsOn.some((dependency) => affected.has(dependency))) {\n\t\t\t\taffected.add(feature.id);\n\t\t\t\tchanged = true;\n\t\t\t}\n\t\t}\n\t}\n\treturn affected;\n}\n\nexport function resetFeature(\n\tsession: Session,\n\tfeatureId: string,\n): TransitionResult<Session> {\n\tif (!session.plan) return fail(\"There is no active plan to reset.\");\n\tif (!session.plan.features.some((feature) => feature.id === featureId)) {\n\t\treturn fail(`Feature '${featureId}' is not in the plan.`);\n\t}\n\tconst affected = dependentFeatureIds(session.plan.features, featureId);\n\tconst activeFeatureId =\n\t\tsession.activeFeatureId && affected.has(session.activeFeatureId)\n\t\t\t? null\n\t\t\t: session.activeFeatureId;\n\tconst nextFeatures = session.plan.features.map((feature) =>\n\t\taffected.has(feature.id)\n\t\t\t? { ...feature, status: \"pending\" as const }\n\t\t\t: feature,\n\t);\n\tconst nextStatus =\n\t\tsession.approval !== \"approved\"\n\t\t\t? \"planning\"\n\t\t\t: activeFeatureId\n\t\t\t\t? \"running\"\n\t\t\t\t: nextFeatures.some((feature) => feature.status === \"blocked\")\n\t\t\t\t\t? \"blocked\"\n\t\t\t\t\t: \"ready\";\n\treturn ok(\n\t\ttouch({\n\t\t\t...session,\n\t\t\tstatus: nextStatus,\n\t\t\tactiveFeatureId,\n\t\t\tplan: {\n\t\t\t\t...session.plan,\n\t\t\t\tfeatures: nextFeatures,\n\t\t\t},\n\t\t\tclosure: null,\n\t\t\tlastError: null,\n\t\t\ttimestamps: { ...session.timestamps, completedAt: null },\n\t\t}),\n\t);\n}\n\nexport function closeSession(\n\tsession: Session,\n\tkind: \"completed\" | \"deferred\" | \"abandoned\",\n\tsummary?: string,\n): TransitionResult<Session> {\n\tif (kind === \"completed\") {\n\t\tif (!session.plan || session.approval !== \"approved\") {\n\t\t\treturn fail(\n\t\t\t\t\"Cannot close a Flow session as completed without an approved plan.\",\n\t\t\t);\n\t\t}\n\t\tconst unfinished = session.plan.features.filter(\n\t\t\t(feature) => feature.status !== \"completed\",\n\t\t);\n\t\tif (unfinished.length > 0) {\n\t\t\treturn fail(\n\t\t\t\t\"Cannot close a Flow session as completed with unfinished features.\",\n\t\t\t\t`Unfinished features: ${unfinished.map((feature) => feature.id).join(\", \")}`,\n\t\t\t);\n\t\t}\n\t\tif (session.status !== \"completed\") {\n\t\t\treturn fail(\n\t\t\t\t\"Cannot close a Flow session as completed before final completion gates pass.\",\n\t\t\t);\n\t\t}\n\t}\n\tconst now = nowIso();\n\treturn ok(\n\t\ttouch({\n\t\t\t...session,\n\t\t\tstatus: kind === \"completed\" ? \"completed\" : session.status,\n\t\t\tactiveFeatureId: null,\n\t\t\tclosure: {\n\t\t\t\tkind,\n\t\t\t\tsummary: summary ?? `Session closed as ${kind}.`,\n\t\t\t\trecordedAt: now,\n\t\t\t},\n\t\t\ttimestamps: {\n\t\t\t\t...session.timestamps,\n\t\t\t\tcompletedAt:\n\t\t\t\t\tkind === \"completed\" ? now : session.timestamps.completedAt,\n\t\t\t},\n\t\t}),\n\t);\n}\n\nexport function summarizeSession(session: Session | null) {\n\tif (!session) {\n\t\treturn {\n\t\t\tstatus: \"missing_session\",\n\t\t\tsummary: \"No active Flow session exists.\",\n\t\t\tnextAction: \"Start with /flow-plan <goal>.\",\n\t\t};\n\t}\n\tconst features = session.plan?.features ?? [];\n\tconst completed = features.filter(\n\t\t(feature) => feature.status === \"completed\",\n\t);\n\tconst latestHistoryEntry = session.history.at(-1) ?? null;\n\tconst blockedEntry = session.status === \"blocked\" ? latestHistoryEntry : null;\n\tconst active = session.activeFeatureId\n\t\t? features.find((feature) => feature.id === session.activeFeatureId)\n\t\t: null;\n\treturn {\n\t\tstatus: session.status,\n\t\tsummary:\n\t\t\tsession.closure?.summary ??\n\t\t\tsession.lastError?.summary ??\n\t\t\tblockedEntry?.summary ??\n\t\t\tsession.plan?.summary ??\n\t\t\t\"Flow session is active.\",\n\t\tnextAction: nextAction(session),\n\t\tsession: {\n\t\t\tid: session.id,\n\t\t\tgoal: session.goal,\n\t\t\tstatus: session.status,\n\t\t\tapproval: session.approval,\n\t\t\tactiveFeature: active ?? null,\n\t\t\tprogress: { completed: completed.length, total: features.length },\n\t\t\tfeatures,\n\t\t\tclosure: session.closure,\n\t\t\tlastError: session.lastError,\n\t\t\tlatestHistoryEntry,\n\t\t\thistoryCount: session.history.length,\n\t\t\ttimestamps: session.timestamps,\n\t\t},\n\t};\n}\n\nfunction nextAction(session: Session): string {\n\tif (!session.plan) return \"Save a plan with flow_plan_save.\";\n\tif (session.approval !== \"approved\") return \"Approve the plan.\";\n\tif (session.status === \"ready\") return \"Start the next feature.\";\n\tif (session.status === \"running\")\n\t\treturn \"Complete or reset the active feature.\";\n\tif (session.status === \"blocked\")\n\t\treturn \"Reset the blocked feature or close the session.\";\n\tif (session.status === \"completed\")\n\t\treturn \"Close/archive the session or start a new goal.\";\n\treturn \"Inspect session state.\";\n}\n",
|
|
15
15
|
"let nowOverride: (() => string) | null = null;\n\nexport function setNowForTests(next: (() => string) | null): void {\n\tnowOverride = next;\n}\n\nexport function nowIso(): string {\n\treturn nowOverride?.() ?? new Date().toISOString();\n}\n",
|
|
16
16
|
"export type { Hooks, Plugin, ToolContext } from \"@opencode-ai/plugin\";\nexport { tool } from \"@opencode-ai/plugin\";\n",
|
|
17
|
-
"import {\n\tflowFeatureComplete,\n\tflowFeatureReset,\n\tflowPlanApprove,\n\tflowPlanSave,\n\tflowRunStart,\n\tflowSessionClose,\n\tflowStatus,\n} from \"../../runtime/api\";\nimport { resolveWorkspaceRoot } from \"../../runtime/workspace\";\nimport { createFlowLog } from \"./logging\";\nimport { type ToolContext, tool } from \"./sdk\";\n\nconst z = tool.schema;\n\nfunction toJson(value: unknown): string {\n\treturn JSON.stringify(value, null, 2);\n}\n\nfunction toolError(error: unknown): string {\n\treturn toJson({\n\t\tstatus: \"error\",\n\t\tsummary: error instanceof Error ? error.message : String(error),\n\t});\n}\n\nasync function execute(\n\tcontext: ToolContext,\n\thandler: (worktree: string) => Promise<Record<string, unknown>>,\n): Promise<string> {\n\ttry {\n\t\treturn toJson(await handler(resolveWorkspaceRoot(context)));\n\t} catch (error) {\n\t\treturn toolError(error);\n\t}\n}\n\nexport function createTools(ctx: unknown) {\n\tcreateFlowLog(ctx)(\"info\", \"Creating minimal Flow v4 tool surface.\");\n\treturn {\n\t\tflow_status: tool({\n\t\t\tdescription: \"Show the active Flow session and next action\",\n\t\t\targs: {},\n\t\t\texecute: (_args, context) => execute(context,
|
|
18
|
-
"import {\n\tresolveFlowPluginVersion,\n\trunFlowSkillSync,\n} from \"../../distribution/sync\";\nimport { loadSession } from \"../../runtime/workspace\";\nimport { createConfigHook } from \"./config\";\nimport { createFlowLog } from \"./logging\";\nimport type { Hooks, Plugin, ToolContext } from \"./sdk\";\nimport { createTools } from \"./tools\";\n\nasync function compactSessionFacts(\n\tcontext: Pick<ToolContext, \"worktree\" | \"directory\">,\n): Promise<string | null> {\n\tconst root = context.worktree ?? context.directory;\n\tif (!root) return null;\n\ttry {\n\t\tconst session = await loadSession(root);\n\t\tif (!session) return null;\n\t\treturn [\n\t\t\t\"Flow session facts:\",\n\t\t\t`- goal: ${session.goal}`,\n\t\t\t`- status: ${session.status}`,\n\t\t\t`- approval: ${session.approval}`,\n\t\t\t`- active feature: ${session.activeFeatureId ?? \"none\"}`,\n\t\t\t`- progress: ${\n\t\t\t\tsession.plan?.features.filter(\n\t\t\t\t\t(feature) => feature.status === \"completed\",\n\t\t\t\t).length ?? 0\n\t\t\t}/${session.plan?.features.length ?? 0}`,\n\t\t\t\"Call flow_status before any Flow action.\",\n\t\t].join(\"\\n\");\n\t} catch {\n\t\treturn null;\n\t}\n}\n\nfunction createSystemTransformHook(\n\tctx: Pick<ToolContext, \"worktree\" | \"directory\">,\n): NonNullable<Hooks[\"experimental.chat.system.transform\"]> {\n\treturn async (_input, output) => {\n\t\tconst facts = await compactSessionFacts(ctx);\n\t\tif (facts) output.system.push(facts);\n\t};\n}\n\nconst FlowPlugin: Plugin = async (ctx) => {\n\tconst log = createFlowLog(ctx);\n\tlog(\"info\", \"Flow v4 plugin initialized.\");\n\tawait runFlowSkillSync(resolveFlowPluginVersion(), log);\n\n\treturn {\n\t\tconfig: createConfigHook(ctx),\n\t\ttool: createTools(ctx),\n\t\t\"experimental.chat.system.transform\": createSystemTransformHook(ctx),\n\t\t\"experimental.session.compacting\": async (_input, output) => {\n\t\t\tconst facts = await compactSessionFacts(ctx);\n\t\t\tif (!facts) return;\n\t\t\toutput.context = [...(output.context ?? []), facts];\n\t\t},\n\t};\n};\n\nexport default FlowPlugin;\n"
|
|
17
|
+
"import { getFlowSkillSetupStatus } from \"../../distribution/sync\";\nimport {\n\tflowFeatureComplete,\n\tflowFeatureReset,\n\tflowPlanApprove,\n\tflowPlanSave,\n\tflowRunStart,\n\tflowSessionClose,\n\tflowStatus,\n} from \"../../runtime/api\";\nimport { resolveWorkspaceRoot } from \"../../runtime/workspace\";\nimport { createFlowLog } from \"./logging\";\nimport { type ToolContext, tool } from \"./sdk\";\n\nconst z = tool.schema;\n\nfunction toJson(value: unknown): string {\n\treturn JSON.stringify(value, null, 2);\n}\n\nfunction toolError(error: unknown): string {\n\treturn toJson({\n\t\tstatus: \"error\",\n\t\tsummary: error instanceof Error ? error.message : String(error),\n\t});\n}\n\nasync function execute(\n\tcontext: ToolContext,\n\thandler: (worktree: string) => Promise<Record<string, unknown>>,\n): Promise<string> {\n\ttry {\n\t\treturn toJson(await handler(resolveWorkspaceRoot(context)));\n\t} catch (error) {\n\t\treturn toolError(error);\n\t}\n}\n\nasync function flowStatusWithSetup(\n\tworktree: string,\n): Promise<Record<string, unknown>> {\n\tconst result = await flowStatus(worktree);\n\tconst setup = getFlowSkillSetupStatus();\n\tif (!setup) return result;\n\treturn {\n\t\t...result,\n\t\tsetup: {\n\t\t\tskills: setup,\n\t\t},\n\t};\n}\n\nexport function createTools(ctx: unknown) {\n\tcreateFlowLog(ctx)(\"info\", \"Creating minimal Flow v4 tool surface.\");\n\treturn {\n\t\tflow_status: tool({\n\t\t\tdescription: \"Show the active Flow session and next action\",\n\t\t\targs: {},\n\t\t\texecute: (_args, context) => execute(context, flowStatusWithSetup),\n\t\t}),\n\t\tflow_plan_save: tool({\n\t\t\tdescription: \"Create or update a draft Flow plan for the active goal\",\n\t\t\targs: {\n\t\t\t\tgoal: z.string().optional(),\n\t\t\t\tplan: z.any().optional(),\n\t\t\t},\n\t\t\texecute: (args, context) =>\n\t\t\t\texecute(context, (worktree) => flowPlanSave(worktree, args)),\n\t\t}),\n\t\tflow_plan_approve: tool({\n\t\t\tdescription: \"Approve the current draft Flow plan\",\n\t\t\targs: {},\n\t\t\texecute: (_args, context) => execute(context, flowPlanApprove),\n\t\t}),\n\t\tflow_run_start: tool({\n\t\t\tdescription: \"Start the next runnable approved Flow feature\",\n\t\t\targs: {\n\t\t\t\tfeatureId: z.string().optional(),\n\t\t\t},\n\t\t\texecute: (args, context) =>\n\t\t\t\texecute(context, (worktree) => flowRunStart(worktree, args)),\n\t\t}),\n\t\tflow_feature_complete: tool({\n\t\t\tdescription:\n\t\t\t\t\"Record a completed or blocked active feature with validation and review evidence\",\n\t\t\targs: {\n\t\t\t\tstatus: z.enum([\"ok\", \"needs_input\"]),\n\t\t\t\tfeatureId: z.string(),\n\t\t\t\tsummary: z.string(),\n\t\t\t\tartifactsChanged: z.array(z.object({ path: z.string() })).optional(),\n\t\t\t\tvalidationRun: z\n\t\t\t\t\t.array(\n\t\t\t\t\t\tz.object({\n\t\t\t\t\t\t\tcommand: z.string(),\n\t\t\t\t\t\t\tstatus: z.enum([\"passed\", \"failed\"]),\n\t\t\t\t\t\t\tsummary: z.string(),\n\t\t\t\t\t\t}),\n\t\t\t\t\t)\n\t\t\t\t\t.optional(),\n\t\t\t\tvalidationScope: z.enum([\"targeted\", \"broad\"]).optional(),\n\t\t\t\tfeatureReview: z.any().optional(),\n\t\t\t\tfinalReview: z.any().optional(),\n\t\t\t\toutcome: z.any().optional(),\n\t\t\t},\n\t\t\texecute: (args, context) =>\n\t\t\t\texecute(context, (worktree) => flowFeatureComplete(worktree, args)),\n\t\t}),\n\t\tflow_feature_reset: tool({\n\t\t\tdescription: \"Reset one feature and its dependents to pending\",\n\t\t\targs: {\n\t\t\t\tfeatureId: z.string(),\n\t\t\t},\n\t\t\texecute: (args, context) =>\n\t\t\t\texecute(context, (worktree) => flowFeatureReset(worktree, args)),\n\t\t}),\n\t\tflow_session_close: tool({\n\t\t\tdescription: \"Close and archive the active Flow session\",\n\t\t\targs: {\n\t\t\t\tkind: z.enum([\"completed\", \"deferred\", \"abandoned\"]),\n\t\t\t\tsummary: z.string().optional(),\n\t\t\t},\n\t\t\texecute: (args, context) =>\n\t\t\t\texecute(context, (worktree) => flowSessionClose(worktree, args)),\n\t\t}),\n\t};\n}\n",
|
|
18
|
+
"import { FLOW_CORE_COMMANDS } from \"../../config-shared\";\nimport {\n\tformatFlowSkillSetupWarning,\n\tresolveFlowPluginVersion,\n\trunFlowSkillSync,\n} from \"../../distribution/sync\";\nimport { loadSession } from \"../../runtime/workspace\";\nimport { createConfigHook } from \"./config\";\nimport { createFlowLog } from \"./logging\";\nimport type { Hooks, Plugin, ToolContext } from \"./sdk\";\nimport { createTools } from \"./tools\";\n\nasync function compactSessionFacts(\n\tcontext: Pick<ToolContext, \"worktree\" | \"directory\">,\n): Promise<string | null> {\n\tconst root = context.worktree ?? context.directory;\n\tif (!root) return null;\n\ttry {\n\t\tconst session = await loadSession(root);\n\t\tif (!session) return null;\n\t\treturn [\n\t\t\t\"Flow session facts:\",\n\t\t\t`- goal: ${session.goal}`,\n\t\t\t`- status: ${session.status}`,\n\t\t\t`- approval: ${session.approval}`,\n\t\t\t`- active feature: ${session.activeFeatureId ?? \"none\"}`,\n\t\t\t`- progress: ${\n\t\t\t\tsession.plan?.features.filter(\n\t\t\t\t\t(feature) => feature.status === \"completed\",\n\t\t\t\t).length ?? 0\n\t\t\t}/${session.plan?.features.length ?? 0}`,\n\t\t\t\"Call flow_status before any Flow action.\",\n\t\t].join(\"\\n\");\n\t} catch {\n\t\treturn null;\n\t}\n}\n\nfunction createSystemTransformHook(\n\tctx: Pick<ToolContext, \"worktree\" | \"directory\">,\n): NonNullable<Hooks[\"experimental.chat.system.transform\"]> {\n\treturn async (_input, output) => {\n\t\tconst setupWarning = formatFlowSkillSetupWarning();\n\t\tif (setupWarning) output.system.push(setupWarning);\n\t\tconst facts = await compactSessionFacts(ctx);\n\t\tif (facts) output.system.push(facts);\n\t};\n}\n\nfunction createCommandPreflightHook(): NonNullable<\n\tHooks[\"command.execute.before\"]\n> {\n\tconst flowCommands = new Set(Object.keys(FLOW_CORE_COMMANDS));\n\treturn async (input, output) => {\n\t\tconst command = input.command.replace(/^\\/+/, \"\");\n\t\tif (!flowCommands.has(command)) return;\n\t\tconst setupWarning = formatFlowSkillSetupWarning();\n\t\tif (!setupWarning) return;\n\t\t(\n\t\t\toutput.parts as unknown as Array<{\n\t\t\t\ttype: \"text\";\n\t\t\t\ttext: string;\n\t\t\t\tsynthetic?: boolean;\n\t\t\t}>\n\t\t).push({\n\t\t\ttype: \"text\",\n\t\t\ttext: setupWarning,\n\t\t\tsynthetic: true,\n\t\t});\n\t};\n}\n\nconst FlowPlugin: Plugin = async (ctx) => {\n\tconst log = createFlowLog(ctx);\n\tlog(\"info\", \"Flow v4 plugin initialized.\");\n\tawait runFlowSkillSync(resolveFlowPluginVersion(), log);\n\n\treturn {\n\t\tconfig: createConfigHook(ctx),\n\t\ttool: createTools(ctx),\n\t\t\"command.execute.before\": createCommandPreflightHook(),\n\t\t\"experimental.chat.system.transform\": createSystemTransformHook(ctx),\n\t\t\"experimental.session.compacting\": async (_input, output) => {\n\t\t\tconst setupWarning = formatFlowSkillSetupWarning();\n\t\t\tif (setupWarning)\n\t\t\t\toutput.context = [...(output.context ?? []), setupWarning];\n\t\t\tconst facts = await compactSessionFacts(ctx);\n\t\t\tif (!facts) return;\n\t\t\toutput.context = [...(output.context ?? []), facts];\n\t\t},\n\t};\n};\n\nexport default FlowPlugin;\n"
|
|
19
19
|
],
|
|
20
|
-
"mappings": "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",
|
|
21
|
-
"debugId": "
|
|
20
|
+
"mappings": "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",
|
|
21
|
+
"debugId": "112D83C8D7323A1964756E2164756E21",
|
|
22
22
|
"names": []
|
|
23
23
|
}
|