kanban 0.1.13 → 0.1.15

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.
Files changed (36) hide show
  1. package/README.md +40 -22
  2. package/dist/cli.js +26 -41
  3. package/dist/cli.js.map +1 -1
  4. package/dist/commands/hooks.d.ts +1 -0
  5. package/dist/commands/hooks.d.ts.map +1 -1
  6. package/dist/commands/hooks.js +15 -11
  7. package/dist/commands/hooks.js.map +1 -1
  8. package/dist/server/browser.d.ts +8 -1
  9. package/dist/server/browser.d.ts.map +1 -1
  10. package/dist/server/browser.js +50 -11
  11. package/dist/server/browser.js.map +1 -1
  12. package/dist/server/directory-picker.d.ts +10 -0
  13. package/dist/server/directory-picker.d.ts.map +1 -0
  14. package/dist/server/directory-picker.js +114 -0
  15. package/dist/server/directory-picker.js.map +1 -0
  16. package/dist/server/process-termination.d.ts +12 -0
  17. package/dist/server/process-termination.d.ts.map +1 -0
  18. package/dist/server/process-termination.js +21 -0
  19. package/dist/server/process-termination.js.map +1 -0
  20. package/dist/terminal/agent-session-adapters.d.ts.map +1 -1
  21. package/dist/terminal/agent-session-adapters.js +31 -32
  22. package/dist/terminal/agent-session-adapters.js.map +1 -1
  23. package/dist/terminal/opencode-paths.d.ts +10 -0
  24. package/dist/terminal/opencode-paths.d.ts.map +1 -0
  25. package/dist/terminal/opencode-paths.js +62 -0
  26. package/dist/terminal/opencode-paths.js.map +1 -0
  27. package/dist/terminal/task-start-setup-detection.d.ts.map +1 -1
  28. package/dist/terminal/task-start-setup-detection.js +2 -10
  29. package/dist/terminal/task-start-setup-detection.js.map +1 -1
  30. package/dist/web-ui/assets/{index-CY5RDApA.js → index-2qSmw1LR.js} +5787 -5756
  31. package/dist/web-ui/index.html +1 -1
  32. package/dist/workspace/task-worktree.d.ts +8 -0
  33. package/dist/workspace/task-worktree.d.ts.map +1 -1
  34. package/dist/workspace/task-worktree.js +15 -1
  35. package/dist/workspace/task-worktree.js.map +1 -1
  36. package/package.json +3 -1
@@ -0,0 +1,21 @@
1
+ import treeKill from "tree-kill";
2
+ export function terminateProcessForTimeout(child, options = {}) {
3
+ const platform = options.platform ?? process.platform;
4
+ if (platform === "win32") {
5
+ child.kill();
6
+ const pid = typeof child.pid === "number" ? child.pid : 0;
7
+ if (pid > 0) {
8
+ try {
9
+ (options.killProcessTree ?? treeKill)(pid, "SIGTERM", () => {
10
+ // Best effort only.
11
+ });
12
+ }
13
+ catch {
14
+ // Best effort only.
15
+ }
16
+ }
17
+ return;
18
+ }
19
+ child.kill("SIGTERM");
20
+ }
21
+ //# sourceMappingURL=process-termination.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"process-termination.js","sourceRoot":"","sources":["../../src/server/process-termination.ts"],"names":[],"mappings":"AAAA,OAAO,QAAQ,MAAM,WAAW,CAAC;AAcjC,MAAM,UAAU,0BAA0B,CACzC,KAAoC,EACpC,UAA6C,EAAE;IAE/C,MAAM,QAAQ,GAAG,OAAO,CAAC,QAAQ,IAAI,OAAO,CAAC,QAAQ,CAAC;IACtD,IAAI,QAAQ,KAAK,OAAO,EAAE,CAAC;QAC1B,KAAK,CAAC,IAAI,EAAE,CAAC;QACb,MAAM,GAAG,GAAG,OAAO,KAAK,CAAC,GAAG,KAAK,QAAQ,CAAC,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;QAC1D,IAAI,GAAG,GAAG,CAAC,EAAE,CAAC;YACb,IAAI,CAAC;gBACJ,CAAC,OAAO,CAAC,eAAe,IAAI,QAAQ,CAAC,CAAC,GAAG,EAAE,SAAS,EAAE,GAAG,EAAE;oBAC1D,oBAAoB;gBACrB,CAAC,CAAC,CAAC;YACJ,CAAC;YAAC,MAAM,CAAC;gBACR,oBAAoB;YACrB,CAAC;QACF,CAAC;QACD,OAAO;IACR,CAAC;IAED,KAAK,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;AACvB,CAAC","sourcesContent":["import treeKill from \"tree-kill\";\n\ninterface TimeoutTerminatedChildProcess {\n\tpid?: number;\n\tkill: (signal?: NodeJS.Signals | number) => boolean;\n}\n\ntype KillProcessTree = (pid: number, signal?: string, callback?: (error?: Error) => void) => void;\n\ninterface TerminateProcessForTimeoutOptions {\n\tplatform?: NodeJS.Platform;\n\tkillProcessTree?: KillProcessTree;\n}\n\nexport function terminateProcessForTimeout(\n\tchild: TimeoutTerminatedChildProcess,\n\toptions: TerminateProcessForTimeoutOptions = {},\n): void {\n\tconst platform = options.platform ?? process.platform;\n\tif (platform === \"win32\") {\n\t\tchild.kill();\n\t\tconst pid = typeof child.pid === \"number\" ? child.pid : 0;\n\t\tif (pid > 0) {\n\t\t\ttry {\n\t\t\t\t(options.killProcessTree ?? treeKill)(pid, \"SIGTERM\", () => {\n\t\t\t\t\t// Best effort only.\n\t\t\t\t});\n\t\t\t} catch {\n\t\t\t\t// Best effort only.\n\t\t\t}\n\t\t}\n\t\treturn;\n\t}\n\n\tchild.kill(\"SIGTERM\");\n}\n"]}
@@ -1 +1 @@
1
- {"version":3,"file":"agent-session-adapters.d.ts","sourceRoot":"","sources":["../../src/terminal/agent-session-adapters.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAE,cAAc,EAAoB,yBAAyB,EAAE,MAAM,yBAAyB,CAAC;AAM3G,OAAO,KAAK,EAAE,sBAAsB,EAAE,MAAM,4BAA4B,CAAC;AAEzE,MAAM,WAAW,uBAAuB;IACvC,MAAM,EAAE,MAAM,CAAC;IACf,OAAO,EAAE,cAAc,CAAC;IACxB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,IAAI,EAAE,MAAM,EAAE,CAAC;IACf,qBAAqB,CAAC,EAAE,OAAO,CAAC;IAChC,GAAG,EAAE,MAAM,CAAC;IACZ,MAAM,EAAE,MAAM,CAAC;IACf,eAAe,CAAC,EAAE,OAAO,CAAC;IAC1B,eAAe,CAAC,EAAE,OAAO,CAAC;IAC1B,GAAG,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,SAAS,CAAC,CAAC;IACzC,WAAW,CAAC,EAAE,MAAM,CAAC;CACrB;AAED,MAAM,MAAM,6BAA6B,GAAG,CAC3C,IAAI,EAAE,MAAM,EACZ,OAAO,EAAE,yBAAyB,KAC9B,sBAAsB,GAAG,IAAI,CAAC;AAEnC,MAAM,MAAM,wCAAwC,GAAG,CAAC,OAAO,EAAE,yBAAyB,KAAK,OAAO,CAAC;AAEvG,MAAM,WAAW,mBAAmB;IACnC,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,IAAI,EAAE,MAAM,EAAE,CAAC;IACf,GAAG,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,SAAS,CAAC,CAAC;IACxC,OAAO,CAAC,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC;IAC9B,sBAAsB,CAAC,EAAE,6BAA6B,CAAC;IACvD,gCAAgC,CAAC,EAAE,wCAAwC,CAAC;CAC5E;AAy9BD,wBAAsB,kBAAkB,CAAC,KAAK,EAAE,uBAAuB,GAAG,OAAO,CAAC,mBAAmB,CAAC,CAErG"}
1
+ {"version":3,"file":"agent-session-adapters.d.ts","sourceRoot":"","sources":["../../src/terminal/agent-session-adapters.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,cAAc,EAAoB,yBAAyB,EAAE,MAAM,yBAAyB,CAAC;AAW3G,OAAO,KAAK,EAAE,sBAAsB,EAAE,MAAM,4BAA4B,CAAC;AAEzE,MAAM,WAAW,uBAAuB;IACvC,MAAM,EAAE,MAAM,CAAC;IACf,OAAO,EAAE,cAAc,CAAC;IACxB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,IAAI,EAAE,MAAM,EAAE,CAAC;IACf,qBAAqB,CAAC,EAAE,OAAO,CAAC;IAChC,GAAG,EAAE,MAAM,CAAC;IACZ,MAAM,EAAE,MAAM,CAAC;IACf,eAAe,CAAC,EAAE,OAAO,CAAC;IAC1B,eAAe,CAAC,EAAE,OAAO,CAAC;IAC1B,GAAG,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,SAAS,CAAC,CAAC;IACzC,WAAW,CAAC,EAAE,MAAM,CAAC;CACrB;AAED,MAAM,MAAM,6BAA6B,GAAG,CAC3C,IAAI,EAAE,MAAM,EACZ,OAAO,EAAE,yBAAyB,KAC9B,sBAAsB,GAAG,IAAI,CAAC;AAEnC,MAAM,MAAM,wCAAwC,GAAG,CAAC,OAAO,EAAE,yBAAyB,KAAK,OAAO,CAAC;AAEvG,MAAM,WAAW,mBAAmB;IACnC,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,IAAI,EAAE,MAAM,EAAE,CAAC;IACf,GAAG,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,SAAS,CAAC,CAAC;IACxC,OAAO,CAAC,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC;IAC9B,sBAAsB,CAAC,EAAE,6BAA6B,CAAC;IACvD,gCAAgC,CAAC,EAAE,wCAAwC,CAAC;CAC5E;AAi9BD,wBAAsB,kBAAkB,CAAC,KAAK,EAAE,uBAAuB,GAAG,OAAO,CAAC,mBAAmB,CAAC,CAErG"}
@@ -1,11 +1,11 @@
1
1
  import { access, chmod, mkdir, readFile, writeFile } from "node:fs/promises";
2
- import { homedir } from "node:os";
3
2
  import { dirname, join } from "node:path";
4
3
  import { pathToFileURL } from "node:url";
5
4
  import { buildKanbanCommandParts } from "../core/kanban-command.js";
6
5
  import { quoteShellArg } from "../core/shell.js";
7
6
  import { getRuntimeHomePath } from "../state/workspace-state.js";
8
7
  import { createHookRuntimeEnv } from "./hook-runtime-context.js";
8
+ import { getOpenCodeAuthPathCandidates, getOpenCodeConfigPathCandidates, getOpenCodeModelStatePathCandidates, } from "./opencode-paths.js";
9
9
  import { stripAnsi } from "./output-utils.js";
10
10
  function escapeForTemplateLiteral(value) {
11
11
  return value.replaceAll("\\", "\\\\").replaceAll("`", "\\`");
@@ -483,16 +483,7 @@ const geminiAdapter = {
483
483
  },
484
484
  };
485
485
  async function resolveOpenCodeBaseConfigPath(explicitPath) {
486
- const candidates = [];
487
- const explicit = explicitPath?.trim();
488
- if (explicit) {
489
- candidates.push(explicit);
490
- }
491
- const processExplicit = process.env.OPENCODE_CONFIG?.trim();
492
- if (processExplicit) {
493
- candidates.push(processExplicit);
494
- }
495
- candidates.push(join(homedir(), ".config", "opencode", "config.json"), join(homedir(), ".config", "opencode", "opencode.jsonc"), join(homedir(), ".config", "opencode", "opencode.json"), join(homedir(), ".opencode", "opencode.jsonc"), join(homedir(), ".opencode", "opencode.json"));
486
+ const candidates = getOpenCodeConfigPathCandidates({ explicitPath });
496
487
  for (const candidate of candidates) {
497
488
  try {
498
489
  await access(candidate);
@@ -640,35 +631,43 @@ async function resolveOpenCodePreferredModelArg(configPath) {
640
631
  // Fall through to state-based fallback.
641
632
  }
642
633
  }
643
- const modelStatePath = join(homedir(), ".local", "state", "opencode", "model.json");
644
- const authPath = join(homedir(), ".local", "share", "opencode", "auth.json");
634
+ const modelStateCandidates = getOpenCodeModelStatePathCandidates();
645
635
  let recentModels = [];
646
- try {
647
- const raw = await readFile(modelStatePath, "utf8");
648
- const parsed = JSON.parse(raw);
649
- if (Array.isArray(parsed.recent)) {
650
- recentModels = parsed.recent;
636
+ for (const modelStatePath of modelStateCandidates) {
637
+ try {
638
+ const raw = await readFile(modelStatePath, "utf8");
639
+ const parsed = JSON.parse(raw);
640
+ if (Array.isArray(parsed.recent)) {
641
+ recentModels = parsed.recent;
642
+ break;
643
+ }
644
+ }
645
+ catch {
646
+ // Keep searching through candidate state paths.
651
647
  }
652
648
  }
653
- catch {
649
+ if (recentModels.length === 0) {
654
650
  return null;
655
651
  }
656
652
  const configuredProviders = new Set();
657
- try {
658
- const raw = await readFile(authPath, "utf8");
659
- const parsed = JSON.parse(raw);
660
- for (const [provider, value] of Object.entries(parsed)) {
661
- if (!value || typeof value !== "object" || Array.isArray(value)) {
662
- continue;
663
- }
664
- const key = value.key;
665
- if (typeof key === "string" && key.trim()) {
666
- configuredProviders.add(provider);
653
+ for (const authPath of getOpenCodeAuthPathCandidates()) {
654
+ try {
655
+ const raw = await readFile(authPath, "utf8");
656
+ const parsed = JSON.parse(raw);
657
+ for (const [provider, value] of Object.entries(parsed)) {
658
+ if (!value || typeof value !== "object" || Array.isArray(value)) {
659
+ continue;
660
+ }
661
+ const key = value.key;
662
+ if (typeof key === "string" && key.trim()) {
663
+ configuredProviders.add(provider);
664
+ }
667
665
  }
666
+ break;
667
+ }
668
+ catch {
669
+ // Keep searching through candidate auth paths.
668
670
  }
669
- }
670
- catch {
671
- // If auth cannot be read, fall back to recent model order.
672
671
  }
673
672
  const candidates = [];
674
673
  for (const entry of recentModels) {
@@ -1 +1 @@
1
- {"version":3,"file":"agent-session-adapters.js","sourceRoot":"","sources":["../../src/terminal/agent-session-adapters.ts"],"names":[],"mappings":"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","sourcesContent":["import { access, chmod, mkdir, readFile, writeFile } from \"node:fs/promises\";\nimport { homedir } from \"node:os\";\nimport { dirname, join } from \"node:path\";\nimport { pathToFileURL } from \"node:url\";\n\nimport type { RuntimeAgentId, RuntimeHookEvent, RuntimeTaskSessionSummary } from \"../core/api-contract.js\";\nimport { buildKanbanCommandParts } from \"../core/kanban-command.js\";\nimport { quoteShellArg } from \"../core/shell.js\";\nimport { getRuntimeHomePath } from \"../state/workspace-state.js\";\nimport { createHookRuntimeEnv } from \"./hook-runtime-context.js\";\nimport { stripAnsi } from \"./output-utils.js\";\nimport type { SessionTransitionEvent } from \"./session-state-machine.js\";\n\nexport interface AgentAdapterLaunchInput {\n\ttaskId: string;\n\tagentId: RuntimeAgentId;\n\tbinary?: string;\n\targs: string[];\n\tautonomousModeEnabled?: boolean;\n\tcwd: string;\n\tprompt: string;\n\tstartInPlanMode?: boolean;\n\tresumeFromTrash?: boolean;\n\tenv?: Record<string, string | undefined>;\n\tworkspaceId?: string;\n}\n\nexport type AgentOutputTransitionDetector = (\n\tdata: string,\n\tsummary: RuntimeTaskSessionSummary,\n) => SessionTransitionEvent | null;\n\nexport type AgentOutputTransitionInspectionPredicate = (summary: RuntimeTaskSessionSummary) => boolean;\n\nexport interface PreparedAgentLaunch {\n\tbinary?: string;\n\targs: string[];\n\tenv: Record<string, string | undefined>;\n\tcleanup?: () => Promise<void>;\n\tdetectOutputTransition?: AgentOutputTransitionDetector;\n\tshouldInspectOutputForTransition?: AgentOutputTransitionInspectionPredicate;\n}\n\ninterface HookContext {\n\ttaskId: string;\n\tworkspaceId: string;\n}\n\ninterface HookCommandMetadata {\n\tsource?: string;\n\tactivityText?: string;\n\thookEventName?: string;\n\tnotificationType?: string;\n}\n\ninterface AgentSessionAdapter {\n\tprepare(input: AgentAdapterLaunchInput): Promise<PreparedAgentLaunch>;\n}\n\nfunction escapeForTemplateLiteral(value: string): string {\n\treturn value.replaceAll(\"\\\\\", \"\\\\\\\\\").replaceAll(\"`\", \"\\\\`\");\n}\n\nfunction powerShellQuote(value: string): string {\n\treturn `\"${value.replaceAll(\"`\", \"``\").replaceAll('\"', '`\"')}\"`;\n}\n\nfunction resolveHookContext(input: AgentAdapterLaunchInput): HookContext | null {\n\tconst workspaceId = input.workspaceId?.trim();\n\tif (!workspaceId) {\n\t\treturn null;\n\t}\n\treturn {\n\t\ttaskId: input.taskId,\n\t\tworkspaceId,\n\t};\n}\n\nfunction buildHookCommand(event: RuntimeHookEvent, metadata?: HookCommandMetadata): string {\n\tconst parts = buildHooksCommandParts([\"ingest\", \"--event\", event]);\n\tif (metadata?.source) {\n\t\tparts.push(\"--source\", metadata.source);\n\t}\n\tif (metadata?.activityText) {\n\t\tparts.push(\"--activity-text\", metadata.activityText);\n\t}\n\tif (metadata?.hookEventName) {\n\t\tparts.push(\"--hook-event-name\", metadata.hookEventName);\n\t}\n\tif (metadata?.notificationType) {\n\t\tparts.push(\"--notification-type\", metadata.notificationType);\n\t}\n\treturn parts.map(quoteShellArg).join(\" \");\n}\n\nfunction buildHooksCommandParts(args: string[]): string[] {\n\treturn buildKanbanCommandParts([\"hooks\", ...args]);\n}\n\nfunction buildHooksCommand(args: string[]): string {\n\treturn buildHooksCommandParts(args).map(quoteShellArg).join(\" \");\n}\n\nfunction hasCliOption(args: string[], optionName: string): boolean {\n\tfor (let i = 0; i < args.length; i += 1) {\n\t\tconst arg = args[i];\n\t\tif (arg === optionName || arg.startsWith(`${optionName}=`)) {\n\t\t\treturn true;\n\t\t}\n\t}\n\treturn false;\n}\n\nfunction getClineHookScriptPath(\n\thooksDir: string,\n\thookName: \"Notification\" | \"TaskComplete\" | \"UserPromptSubmit\" | \"PreToolUse\" | \"PostToolUse\",\n): string {\n\tif (process.platform === \"win32\") {\n\t\treturn join(hooksDir, `${hookName}.ps1`);\n\t}\n\treturn join(hooksDir, hookName);\n}\n\nfunction buildClineHookScriptContent(event: RuntimeHookEvent): string {\n\tconst commandParts = buildHooksCommandParts([\"notify\", \"--event\", event, \"--source\", \"cline\"]);\n\tif (process.platform === \"win32\") {\n\t\tconst command = commandParts.map(powerShellQuote).join(\" \");\n\t\treturn `$inputText = [Console]::In.ReadToEnd()\ntry {\n $inputText | & ${command} | Out-Null\n} catch {\n}\nWrite-Output '{\"cancel\":false}'\nexit 0\n`;\n\t}\n\tconst command = commandParts.map(quoteShellArg).join(\" \");\n\treturn `#!/usr/bin/env bash\nINPUT=\"$(cat || true)\"\nprintf '%s' \"$INPUT\" | ${command} >/dev/null 2>&1 || true\necho '{\"cancel\":false}'\n`;\n}\n\nfunction buildClineNotificationHookScriptContent(): string {\n\tconst commandParts = buildHooksCommandParts([\"notify\", \"--event\", \"to_review\", \"--source\", \"cline\"]);\n\tif (process.platform === \"win32\") {\n\t\tconst command = commandParts.map(powerShellQuote).join(\" \");\n\t\treturn `$inputText = [Console]::In.ReadToEnd()\nif (\n $inputText -match '\"event\"\\\\s*:\\\\s*\"user_attention\"' -and\n $inputText -notmatch '\"source\"\\\\s*:\\\\s*\"completion_result\"'\n) {\n try {\n $inputText | & ${command} | Out-Null\n } catch {\n }\n}\nWrite-Output '{\"cancel\":false}'\nexit 0\n`;\n\t}\n\tconst command = commandParts.map(quoteShellArg).join(\" \");\n\treturn `#!/usr/bin/env bash\nINPUT=\"$(cat || true)\"\nif printf '%s' \"$INPUT\" | grep -Eq '\"event\"[[:space:]]*:[[:space:]]*\"user_attention\"' &&\n ! printf '%s' \"$INPUT\" | grep -Eq '\"source\"[[:space:]]*:[[:space:]]*\"completion_result\"'; then\n printf '%s' \"$INPUT\" | ${command} >/dev/null 2>&1 || true\nfi\necho '{\"cancel\":false}'\n`;\n}\n\nfunction buildOpenCodePluginContent(\n\treviewCommand: string,\n\ttoInProgressCommand: string,\n): string {\n\tconst reviewCmd = escapeForTemplateLiteral(reviewCommand);\n\tconst toInProgressCmd = escapeForTemplateLiteral(toInProgressCommand);\n\treturn `export const KanbanPlugin = async ({ $, client }) => {\n if (globalThis.__kanbanOpencodePluginV2) return {};\n globalThis.__kanbanOpencodePluginV2 = true;\n\n if (!process?.env?.KANBAN_HOOK_TASK_ID) return {};\n\n let currentState = \"idle\";\n let rootSessionID = null;\n const childSessionCache = new Map();\n\n const notifyReview = async () => {\n try {\n await $\\`${reviewCmd}\\`;\n } catch {\n // Best effort: hook errors should never break OpenCode event handling.\n }\n };\n\n const notifyInprogress = async () => {\n try {\n await $\\`${toInProgressCmd}\\`;\n } catch {\n // Best effort: hook errors should never break OpenCode event handling.\n }\n };\n\n const isChildSession = async (sessionID) => {\n if (!sessionID) return true;\n if (!client?.session?.list) return true;\n if (childSessionCache.has(sessionID)) {\n return childSessionCache.get(sessionID);\n }\n try {\n const sessions = await client.session.list();\n const session = sessions.data?.find((candidate) => candidate.id === sessionID);\n const isChild = !!session?.parentID;\n childSessionCache.set(sessionID, isChild);\n return isChild;\n } catch {\n return true;\n }\n };\n\n const handleBusy = async (sessionID) => {\n if (!rootSessionID) {\n rootSessionID = sessionID;\n }\n if (sessionID !== rootSessionID) {\n return;\n }\n if (currentState === \"idle\") {\n currentState = \"busy\";\n await notifyInprogress();\n }\n };\n\n const handleReview = async (sessionID) => {\n if (rootSessionID && sessionID !== rootSessionID) {\n return;\n }\n if (currentState === \"busy\") {\n currentState = \"idle\";\n await notifyReview();\n rootSessionID = null;\n }\n };\n\n return {\n event: async ({ event }) => {\n const sessionID = event.properties?.sessionID;\n if (await isChildSession(sessionID)) {\n return;\n }\n\n if (event.type === \"session.status\") {\n const status = event.properties?.status;\n if (status?.type === \"busy\") {\n await handleBusy(sessionID);\n } else if (status?.type === \"idle\") {\n await handleReview(sessionID);\n }\n }\n\n if (event.type === \"session.busy\") {\n await handleBusy(sessionID);\n }\n if (event.type === \"session.idle\" || event.type === \"session.error\") {\n await handleReview(sessionID);\n }\n },\n \"permission.ask\": async (_permission, output) => {\n if (output?.status === \"ask\") {\n await notifyReview();\n currentState = \"idle\";\n }\n },\n };\n};\n`;\n}\n\nfunction getHookAgentDirectory(agentId: RuntimeAgentId): string {\n\treturn join(getRuntimeHomePath(), \"hooks\", agentId);\n}\n\nasync function readFileIfExists(filePath: string): Promise<string | null> {\n\ttry {\n\t\treturn await readFile(filePath, \"utf8\");\n\t} catch (error) {\n\t\tif (typeof error === \"object\" && error !== null && \"code\" in error && error.code === \"ENOENT\") {\n\t\t\treturn null;\n\t\t}\n\t\tthrow error;\n\t}\n}\n\nasync function ensureTextFile(filePath: string, content: string, executable = false): Promise<void> {\n\tawait mkdir(dirname(filePath), { recursive: true });\n\tconst existing = await readFileIfExists(filePath);\n\tif (existing !== content) {\n\t\tawait writeFile(filePath, content, \"utf8\");\n\t}\n\tif (executable) {\n\t\tawait chmod(filePath, 0o755);\n\t}\n}\n\nfunction withPrompt(args: string[], prompt: string, mode: \"append\" | \"flag\", flag?: string): PreparedAgentLaunch {\n\tconst trimmed = prompt.trim();\n\tif (!trimmed) {\n\t\treturn {\n\t\t\targs,\n\t\t\tenv: {},\n\t\t};\n\t}\n\tif (mode === \"flag\" && flag) {\n\t\targs.push(flag, trimmed);\n\t} else {\n\t\targs.push(trimmed);\n\t}\n\treturn {\n\t\targs,\n\t\tenv: {},\n\t};\n}\n\nconst claudeAdapter: AgentSessionAdapter = {\n\tasync prepare(input) {\n\t\tconst args = [...input.args];\n\t\tconst env: Record<string, string | undefined> = {};\n\t\tif (\n\t\t\tinput.autonomousModeEnabled &&\n\t\t\t!input.startInPlanMode &&\n\t\t\t!hasCliOption(args, \"--dangerously-skip-permissions\")\n\t\t) {\n\t\t\targs.push(\"--dangerously-skip-permissions\");\n\t\t}\n\t\tif (input.resumeFromTrash && !hasCliOption(args, \"--continue\")) {\n\t\t\targs.push(\"--continue\");\n\t\t}\n\t\tif (input.startInPlanMode) {\n\t\t\tconst withoutImmediateBypass = args.filter((arg) => arg !== \"--dangerously-skip-permissions\");\n\t\t\targs.length = 0;\n\t\t\targs.push(...withoutImmediateBypass);\n\t\t\tif (!hasCliOption(args, \"--allow-dangerously-skip-permissions\")) {\n\t\t\t\targs.push(\"--allow-dangerously-skip-permissions\");\n\t\t\t}\n\t\t\targs.push(\"--permission-mode\", \"plan\");\n\t\t}\n\n\t\tconst hooks = resolveHookContext(input);\n\t\tif (hooks) {\n\t\t\tconst settingsPath = join(getHookAgentDirectory(\"claude\"), \"settings.json\");\n\t\t\tconst hooksSettings = {\n\t\t\t\thooks: {\n\t\t\t\t\tStop: [{ hooks: [{ type: \"command\", command: buildHookCommand(\"to_review\", { source: \"claude\" }) }] }],\n\t\t\t\t\tSubagentStop: [\n\t\t\t\t\t\t{ hooks: [{ type: \"command\", command: buildHookCommand(\"activity\", { source: \"claude\" }) }] },\n\t\t\t\t\t],\n\t\t\t\t\tPreToolUse: [\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tmatcher: \"*\",\n\t\t\t\t\t\t\thooks: [{ type: \"command\", command: buildHookCommand(\"activity\", { source: \"claude\" }) }],\n\t\t\t\t\t\t},\n\t\t\t\t\t],\n\t\t\t\t\tPermissionRequest: [\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tmatcher: \"*\",\n\t\t\t\t\t\t\thooks: [{ type: \"command\", command: buildHookCommand(\"to_review\", { source: \"claude\" }) }],\n\t\t\t\t\t\t},\n\t\t\t\t\t],\n\t\t\t\t\tPostToolUse: [\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tmatcher: \"*\",\n\t\t\t\t\t\t\thooks: [{ type: \"command\", command: buildHookCommand(\"to_in_progress\", { source: \"claude\" }) }],\n\t\t\t\t\t\t},\n\t\t\t\t\t],\n\t\t\t\t\tPostToolUseFailure: [\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tmatcher: \"*\",\n\t\t\t\t\t\t\thooks: [{ type: \"command\", command: buildHookCommand(\"to_in_progress\", { source: \"claude\" }) }],\n\t\t\t\t\t\t},\n\t\t\t\t\t],\n\t\t\t\t\tNotification: [\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tmatcher: \"permission_prompt\",\n\t\t\t\t\t\t\thooks: [{ type: \"command\", command: buildHookCommand(\"to_review\", { source: \"claude\" }) }],\n\t\t\t\t\t\t},\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tmatcher: \"*\",\n\t\t\t\t\t\t\thooks: [{ type: \"command\", command: buildHookCommand(\"activity\", { source: \"claude\" }) }],\n\t\t\t\t\t\t},\n\t\t\t\t\t],\n\t\t\t\t\tUserPromptSubmit: [\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\thooks: [\n\t\t\t\t\t\t\t\t{ type: \"command\", command: buildHookCommand(\"to_in_progress\", { source: \"claude\" }) },\n\t\t\t\t\t\t\t],\n\t\t\t\t\t\t},\n\t\t\t\t\t],\n\t\t\t\t},\n\t\t\t};\n\t\t\tawait ensureTextFile(settingsPath, JSON.stringify(hooksSettings, null, 2));\n\t\t\targs.push(\"--settings\", settingsPath);\n\t\t\tObject.assign(\n\t\t\t\tenv,\n\t\t\t\tcreateHookRuntimeEnv({\n\t\t\t\t\ttaskId: hooks.taskId,\n\t\t\t\t\tworkspaceId: hooks.workspaceId,\n\t\t\t\t}),\n\t\t\t);\n\t\t}\n\n\t\tconst withPromptLaunch = withPrompt(args, input.prompt, \"append\");\n\t\treturn {\n\t\t\t...withPromptLaunch,\n\t\t\tenv: {\n\t\t\t\t...withPromptLaunch.env,\n\t\t\t\t...env,\n\t\t\t},\n\t\t};\n\t},\n};\n\nfunction codexPromptDetector(data: string, summary: RuntimeTaskSessionSummary): SessionTransitionEvent | null {\n\tif (summary.state !== \"awaiting_review\") {\n\t\treturn null;\n\t}\n\tif (summary.reviewReason !== \"attention\" && summary.reviewReason !== \"hook\") {\n\t\treturn null;\n\t}\n\tconst stripped = stripAnsi(data);\n\tif (/(?:^|\\n)\\s*›/.test(stripped)) {\n\t\treturn { type: \"agent.prompt-ready\" };\n\t}\n\treturn null;\n}\n\nfunction shouldInspectCodexOutputForTransition(summary: RuntimeTaskSessionSummary): boolean {\n\treturn (\n\t\tsummary.state === \"awaiting_review\" && (summary.reviewReason === \"attention\" || summary.reviewReason === \"hook\")\n\t);\n}\n\nconst codexAdapter: AgentSessionAdapter = {\n\tasync prepare(input) {\n\t\tconst codexArgs = [...input.args];\n\t\tconst env: Record<string, string | undefined> = {};\n\t\tlet binary = input.binary;\n\n\t\tif (input.autonomousModeEnabled && !hasCliOption(codexArgs, \"--dangerously-bypass-approvals-and-sandbox\")) {\n\t\t\tcodexArgs.push(\"--dangerously-bypass-approvals-and-sandbox\");\n\t\t}\n\n\t\tif (input.resumeFromTrash) {\n\t\t\tif (!codexArgs.includes(\"resume\")) {\n\t\t\t\tcodexArgs.push(\"resume\");\n\t\t\t}\n\t\t\tif (!hasCliOption(codexArgs, \"--last\")) {\n\t\t\t\tcodexArgs.push(\"--last\");\n\t\t\t}\n\t\t}\n\n\t\tconst hooks = resolveHookContext(input);\n\t\tif (hooks) {\n\t\t\tObject.assign(\n\t\t\t\tenv,\n\t\t\t\tcreateHookRuntimeEnv({\n\t\t\t\t\ttaskId: hooks.taskId,\n\t\t\t\t\tworkspaceId: hooks.workspaceId,\n\t\t\t\t}),\n\t\t\t);\n\t\t}\n\n\t\tconst trimmed = input.prompt.trim();\n\t\tif (trimmed) {\n\t\t\tconst initialPrompt = input.startInPlanMode ? `/plan\\n${trimmed}` : trimmed;\n\t\t\tcodexArgs.push(initialPrompt);\n\t\t}\n\n\t\tif (hooks) {\n\t\t\tconst wrapperParts = buildHooksCommandParts([\n\t\t\t\t\"codex-wrapper\",\n\t\t\t\t\"--real-binary\",\n\t\t\t\tinput.binary ?? \"codex\",\n\t\t\t\t\"--\",\n\t\t\t\t...codexArgs,\n\t\t\t]);\n\t\t\tbinary = wrapperParts[0];\n\t\t\tconst args = wrapperParts.slice(1);\n\t\t\treturn {\n\t\t\t\tbinary,\n\t\t\t\targs,\n\t\t\t\tenv,\n\t\t\t\tdetectOutputTransition: codexPromptDetector,\n\t\t\t\tshouldInspectOutputForTransition: shouldInspectCodexOutputForTransition,\n\t\t\t};\n\t\t}\n\n\t\treturn {\n\t\t\tbinary,\n\t\t\targs: codexArgs,\n\t\t\tenv,\n\t\t\tdetectOutputTransition: codexPromptDetector,\n\t\t\tshouldInspectOutputForTransition: shouldInspectCodexOutputForTransition,\n\t\t};\n\t},\n};\n\nconst geminiAdapter: AgentSessionAdapter = {\n\tasync prepare(input) {\n\t\tconst args = [...input.args];\n\t\tconst env: Record<string, string | undefined> = {};\n\n\t\tif (input.autonomousModeEnabled && !hasCliOption(args, \"--yolo\")) {\n\t\t\targs.push(\"--yolo\");\n\t\t}\n\n\t\tif (input.resumeFromTrash && !hasCliOption(args, \"--resume\")) {\n\t\t\targs.push(\"--resume\", \"latest\");\n\t\t}\n\n\t\tif (input.startInPlanMode) {\n\t\t\targs.push(\"--approval-mode=plan\");\n\t\t}\n\n\t\tconst hooks = resolveHookContext(input);\n\t\tif (hooks) {\n\t\t\tconst configPath = join(getHookAgentDirectory(\"gemini\"), \"settings.json\");\n\t\t\tconst geminiHookCommand = buildHooksCommand([\"gemini-hook\"]);\n\n\t\t\tconst config = {\n\t\t\t\thooks: {\n\t\t\t\t\tBeforeTool: [\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\thooks: [{ type: \"command\", command: geminiHookCommand }],\n\t\t\t\t\t\t},\n\t\t\t\t\t],\n\t\t\t\t\tAfterTool: [\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\thooks: [{ type: \"command\", command: geminiHookCommand }],\n\t\t\t\t\t\t},\n\t\t\t\t\t],\n\t\t\t\t\tAfterAgent: [\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\thooks: [{ type: \"command\", command: geminiHookCommand }],\n\t\t\t\t\t\t},\n\t\t\t\t\t],\n\t\t\t\t\tBeforeAgent: [\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\thooks: [{ type: \"command\", command: geminiHookCommand }],\n\t\t\t\t\t\t},\n\t\t\t\t\t],\n\t\t\t\t\tNotification: [\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\thooks: [{ type: \"command\", command: geminiHookCommand }],\n\t\t\t\t\t\t},\n\t\t\t\t\t],\n\t\t\t\t},\n\t\t\t};\n\t\t\tawait ensureTextFile(configPath, JSON.stringify(config, null, 2));\n\t\t\tObject.assign(\n\t\t\t\tenv,\n\t\t\t\tcreateHookRuntimeEnv({\n\t\t\t\t\ttaskId: hooks.taskId,\n\t\t\t\t\tworkspaceId: hooks.workspaceId,\n\t\t\t\t}),\n\t\t\t);\n\t\t\tenv.GEMINI_CLI_SYSTEM_SETTINGS_PATH = configPath;\n\t\t}\n\n\t\tconst trimmed = input.prompt.trim();\n\t\tif (trimmed) {\n\t\t\targs.push(\"-i\", trimmed);\n\t\t\treturn {\n\t\t\t\targs,\n\t\t\t\tenv,\n\t\t\t};\n\t\t}\n\n\t\treturn {\n\t\t\targs,\n\t\t\tenv,\n\t\t};\n\t},\n};\n\nasync function resolveOpenCodeBaseConfigPath(explicitPath: string | undefined): Promise<string | null> {\n\tconst candidates: string[] = [];\n\tconst explicit = explicitPath?.trim();\n\tif (explicit) {\n\t\tcandidates.push(explicit);\n\t}\n\tconst processExplicit = process.env.OPENCODE_CONFIG?.trim();\n\tif (processExplicit) {\n\t\tcandidates.push(processExplicit);\n\t}\n\tcandidates.push(\n\t\tjoin(homedir(), \".config\", \"opencode\", \"config.json\"),\n\t\tjoin(homedir(), \".config\", \"opencode\", \"opencode.jsonc\"),\n\t\tjoin(homedir(), \".config\", \"opencode\", \"opencode.json\"),\n\t\tjoin(homedir(), \".opencode\", \"opencode.jsonc\"),\n\t\tjoin(homedir(), \".opencode\", \"opencode.json\"),\n\t);\n\tfor (const candidate of candidates) {\n\t\ttry {\n\t\t\tawait access(candidate);\n\t\t\treturn candidate;\n\t\t} catch {\n\t\t\t// Keep searching.\n\t\t}\n\t}\n\treturn null;\n}\n\nfunction hasOpenCodeModelArg(args: string[]): boolean {\n\tfor (const arg of args) {\n\t\tif (arg === \"--model\" || arg === \"-m\") {\n\t\t\treturn true;\n\t\t}\n\t\tif (arg.startsWith(\"--model=\") || arg.startsWith(\"-m=\")) {\n\t\t\treturn true;\n\t\t}\n\t}\n\treturn false;\n}\n\nfunction hasOpenCodeAgentArg(args: string[]): boolean {\n\tfor (const arg of args) {\n\t\tif (arg === \"--agent\") {\n\t\t\treturn true;\n\t\t}\n\t\tif (arg.startsWith(\"--agent=\")) {\n\t\t\treturn true;\n\t\t}\n\t}\n\treturn false;\n}\n\nfunction normalizeOpenCodeModel(providerId: string, modelId: string): string {\n\tif (modelId.startsWith(`${providerId}/`)) {\n\t\treturn modelId;\n\t}\n\treturn `${providerId}/${modelId}`;\n}\n\nfunction stripJsonComments(input: string): string {\n\tlet output = \"\";\n\tlet inString = false;\n\tlet escaped = false;\n\tlet inLineComment = false;\n\tlet inBlockComment = false;\n\n\tfor (let i = 0; i < input.length; i += 1) {\n\t\tconst current = input[i];\n\t\tconst next = i + 1 < input.length ? input[i + 1] : \"\";\n\n\t\tif (inLineComment) {\n\t\t\tif (current === \"\\n\") {\n\t\t\t\tinLineComment = false;\n\t\t\t\toutput += current;\n\t\t\t}\n\t\t\tcontinue;\n\t\t}\n\t\tif (inBlockComment) {\n\t\t\tif (current === \"*\" && next === \"/\") {\n\t\t\t\tinBlockComment = false;\n\t\t\t\ti += 1;\n\t\t\t}\n\t\t\tcontinue;\n\t\t}\n\t\tif (!inString && current === \"/\" && next === \"/\") {\n\t\t\tinLineComment = true;\n\t\t\ti += 1;\n\t\t\tcontinue;\n\t\t}\n\t\tif (!inString && current === \"/\" && next === \"*\") {\n\t\t\tinBlockComment = true;\n\t\t\ti += 1;\n\t\t\tcontinue;\n\t\t}\n\n\t\toutput += current;\n\t\tif (inString) {\n\t\t\tif (escaped) {\n\t\t\t\tescaped = false;\n\t\t\t} else if (current === \"\\\\\") {\n\t\t\t\tescaped = true;\n\t\t\t} else if (current === '\"') {\n\t\t\t\tinString = false;\n\t\t\t}\n\t\t\tcontinue;\n\t\t}\n\t\tif (current === '\"') {\n\t\t\tinString = true;\n\t\t}\n\t}\n\treturn output;\n}\n\nfunction tryExtractOpenCodeModelFromConfig(rawConfig: string): string | null {\n\tlet parsed: unknown;\n\ttry {\n\t\tparsed = JSON.parse(rawConfig);\n\t} catch {\n\t\ttry {\n\t\t\tparsed = JSON.parse(stripJsonComments(rawConfig));\n\t\t} catch {\n\t\t\treturn null;\n\t\t}\n\t}\n\tif (!parsed || typeof parsed !== \"object\" || Array.isArray(parsed)) {\n\t\treturn null;\n\t}\n\tconst root = parsed as Record<string, unknown>;\n\n\tconst directModel = root.model;\n\tif (typeof directModel === \"string\" && directModel.trim()) {\n\t\treturn directModel.trim();\n\t}\n\n\tconst mode = root.mode;\n\tif (mode && typeof mode === \"object\" && !Array.isArray(mode)) {\n\t\tconst build = (mode as Record<string, unknown>).build;\n\t\tif (build && typeof build === \"object\" && !Array.isArray(build)) {\n\t\t\tconst model = (build as Record<string, unknown>).model;\n\t\t\tif (typeof model === \"string\" && model.trim()) {\n\t\t\t\treturn model.trim();\n\t\t\t}\n\t\t}\n\t}\n\n\tconst agent = root.agent;\n\tif (agent && typeof agent === \"object\" && !Array.isArray(agent)) {\n\t\tconst build = (agent as Record<string, unknown>).build;\n\t\tif (build && typeof build === \"object\" && !Array.isArray(build)) {\n\t\t\tconst model = (build as Record<string, unknown>).model;\n\t\t\tif (typeof model === \"string\" && model.trim()) {\n\t\t\t\treturn model.trim();\n\t\t\t}\n\t\t}\n\t}\n\n\treturn null;\n}\n\nasync function resolveOpenCodePreferredModelArg(configPath: string | null): Promise<string | null> {\n\tif (configPath) {\n\t\ttry {\n\t\t\tconst rawConfig = await readFile(configPath, \"utf8\");\n\t\t\tconst modelFromConfig = tryExtractOpenCodeModelFromConfig(rawConfig);\n\t\t\tif (modelFromConfig) {\n\t\t\t\treturn modelFromConfig;\n\t\t\t}\n\t\t} catch {\n\t\t\t// Fall through to state-based fallback.\n\t\t}\n\t}\n\n\tconst modelStatePath = join(homedir(), \".local\", \"state\", \"opencode\", \"model.json\");\n\tconst authPath = join(homedir(), \".local\", \"share\", \"opencode\", \"auth.json\");\n\n\tlet recentModels: Array<{ providerID?: unknown; modelID?: unknown }> = [];\n\ttry {\n\t\tconst raw = await readFile(modelStatePath, \"utf8\");\n\t\tconst parsed = JSON.parse(raw) as { recent?: Array<{ providerID?: unknown; modelID?: unknown }> };\n\t\tif (Array.isArray(parsed.recent)) {\n\t\t\trecentModels = parsed.recent;\n\t\t}\n\t} catch {\n\t\treturn null;\n\t}\n\n\tconst configuredProviders = new Set<string>();\n\ttry {\n\t\tconst raw = await readFile(authPath, \"utf8\");\n\t\tconst parsed = JSON.parse(raw) as Record<string, unknown>;\n\t\tfor (const [provider, value] of Object.entries(parsed)) {\n\t\t\tif (!value || typeof value !== \"object\" || Array.isArray(value)) {\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t\tconst key = (value as Record<string, unknown>).key;\n\t\t\tif (typeof key === \"string\" && key.trim()) {\n\t\t\t\tconfiguredProviders.add(provider);\n\t\t\t}\n\t\t}\n\t} catch {\n\t\t// If auth cannot be read, fall back to recent model order.\n\t}\n\n\tconst candidates: Array<{ providerId: string; model: string }> = [];\n\tfor (const entry of recentModels) {\n\t\tconst providerId = typeof entry.providerID === \"string\" ? entry.providerID.trim() : \"\";\n\t\tconst modelId = typeof entry.modelID === \"string\" ? entry.modelID.trim() : \"\";\n\t\tif (!providerId || !modelId) {\n\t\t\tcontinue;\n\t\t}\n\t\tcandidates.push({ providerId, model: normalizeOpenCodeModel(providerId, modelId) });\n\t}\n\tif (candidates.length === 0) {\n\t\treturn null;\n\t}\n\n\tconst preferredProviderOrder = [\"openrouter\", \"anthropic\", \"openai\", \"opencode\", \"google\", \"amazon-bedrock\"];\n\tfor (const providerId of preferredProviderOrder) {\n\t\tconst match = candidates.find((candidate) => candidate.providerId === providerId);\n\t\tif (!match) {\n\t\t\tcontinue;\n\t\t}\n\t\tif (configuredProviders.size === 0 || configuredProviders.has(providerId)) {\n\t\t\treturn match.model;\n\t\t}\n\t}\n\n\tconst configuredMatch = candidates.find((candidate) => configuredProviders.has(candidate.providerId));\n\tif (configuredMatch) {\n\t\treturn configuredMatch.model;\n\t}\n\n\treturn candidates[0].model;\n}\n\nconst opencodeAdapter: AgentSessionAdapter = {\n\tasync prepare(input) {\n\t\tconst args = [...input.args];\n\t\tconst env: Record<string, string | undefined> = {};\n\t\tconst baseConfigPath = await resolveOpenCodeBaseConfigPath(input.env?.OPENCODE_CONFIG);\n\t\tif (input.resumeFromTrash && !hasCliOption(args, \"--continue\")) {\n\t\t\targs.push(\"--continue\");\n\t\t}\n\n\t\tif (input.startInPlanMode) {\n\t\t\tenv.OPENCODE_EXPERIMENTAL_PLAN_MODE = \"true\";\n\t\t\tif (!hasOpenCodeAgentArg(args)) {\n\t\t\t\targs.push(\"--agent\", \"plan\");\n\t\t\t}\n\t\t}\n\n\t\tconst hooks = resolveHookContext(input);\n\t\tif (hooks) {\n\t\t\tconst pluginPath = join(getHookAgentDirectory(\"opencode\"), \"kanban.js\");\n\t\t\tconst configPath = join(getHookAgentDirectory(\"opencode\"), \"opencode.json\");\n\n\t\t\tconst pluginContent = buildOpenCodePluginContent(\n\t\t\t\tbuildHookCommand(\"to_review\", { source: \"opencode\", activityText: \"Waiting for review\" }),\n\t\t\t\tbuildHookCommand(\"to_in_progress\", { source: \"opencode\", activityText: \"Agent active\" }),\n\t\t\t);\n\t\t\tawait ensureTextFile(pluginPath, pluginContent);\n\t\t\tconst pluginFileUrl = pathToFileURL(pluginPath).href;\n\t\t\tconst config = {\n\t\t\t\tplugin: [pluginFileUrl],\n\t\t\t};\n\t\t\tawait ensureTextFile(configPath, JSON.stringify(config));\n\t\t\tObject.assign(\n\t\t\t\tenv,\n\t\t\t\tcreateHookRuntimeEnv({\n\t\t\t\t\ttaskId: hooks.taskId,\n\t\t\t\t\tworkspaceId: hooks.workspaceId,\n\t\t\t\t}),\n\t\t\t);\n\t\t\tenv.OPENCODE_CONFIG = configPath;\n\t\t}\n\n\t\t// Workaround: with --prompt, OpenCode can pick an unexpected provider/model.\n\t\t// Explicitly pass the user's preferred model so prompt runs stay on their usual provider.\n\t\tif (!hasOpenCodeModelArg(args)) {\n\t\t\tconst preferredModel = await resolveOpenCodePreferredModelArg(baseConfigPath);\n\t\t\tif (preferredModel) {\n\t\t\t\targs.push(\"--model\", preferredModel);\n\t\t\t}\n\t\t}\n\n\t\tconst trimmed = input.prompt.trim();\n\t\tif (trimmed) {\n\t\t\targs.push(\"--prompt\", trimmed);\n\t\t\treturn {\n\t\t\t\targs,\n\t\t\t\tenv,\n\t\t\t};\n\t\t}\n\n\t\treturn {\n\t\t\targs,\n\t\t\tenv,\n\t\t};\n\t},\n};\n\nconst droidAdapter: AgentSessionAdapter = {\n\tasync prepare(input) {\n\t\tconst args = [...input.args];\n\t\tconst env: Record<string, string | undefined> = {};\n\n\t\tif (input.resumeFromTrash && !hasCliOption(args, \"--resume\") && !hasCliOption(args, \"-r\")) {\n\t\t\targs.push(\"--resume\");\n\t\t}\n\n\t\tconst hooks = resolveHookContext(input);\n\t\tconst shouldWriteSettings = Boolean(hooks) || input.startInPlanMode || input.autonomousModeEnabled !== undefined;\n\t\tif (shouldWriteSettings) {\n\t\t\tconst settingsPath = join(getHookAgentDirectory(\"droid\"), \"settings.json\");\n\t\t\tconst settings: Record<string, unknown> = {\n\t\t\t\tautonomyMode: input.startInPlanMode ? \"spec\" : input.autonomousModeEnabled ? \"auto-high\" : \"normal\",\n\t\t\t};\n\n\t\t\tif (hooks) {\n\t\t\t\tconst droidActiveToolMatcher = \"Read|Grep|Glob|FetchUrl|WebSearch|Execute|Task|Edit|Create\";\n\t\t\t\tconst reviewNotifyCommand = buildHooksCommand([\"notify\", \"--event\", \"to_review\", \"--source\", \"droid\"]);\n\t\t\t\tconst inProgressNotifyCommand = buildHooksCommand([\n\t\t\t\t\t\"notify\",\n\t\t\t\t\t\"--event\",\n\t\t\t\t\t\"to_in_progress\",\n\t\t\t\t\t\"--source\",\n\t\t\t\t\t\"droid\",\n\t\t\t\t]);\n\t\t\t\tconst activityNotifyCommand = buildHooksCommand([\"notify\", \"--event\", \"activity\", \"--source\", \"droid\"]);\n\t\t\t\tsettings.hooks = {\n\t\t\t\t\tStop: [{ hooks: [{ type: \"command\", command: reviewNotifyCommand }] }],\n\t\t\t\t\tNotification: [\n\t\t\t\t\t\t{ hooks: [{ type: \"command\", command: activityNotifyCommand }] },\n\t\t\t\t\t\t{ hooks: [{ type: \"command\", command: reviewNotifyCommand }] },\n\t\t\t\t\t],\n\t\t\t\t\tPreToolUse: [\n\t\t\t\t\t\t{ matcher: \"*\", hooks: [{ type: \"command\", command: activityNotifyCommand }] },\n\t\t\t\t\t\t{ matcher: droidActiveToolMatcher, hooks: [{ type: \"command\", command: inProgressNotifyCommand }] },\n\t\t\t\t\t\t{ matcher: \"AskUser\", hooks: [{ type: \"command\", command: reviewNotifyCommand }] },\n\t\t\t\t\t],\n\t\t\t\t\tPostToolUse: [\n\t\t\t\t\t\t{ matcher: \"*\", hooks: [{ type: \"command\", command: activityNotifyCommand }] },\n\t\t\t\t\t\t{ matcher: \"AskUser\", hooks: [{ type: \"command\", command: inProgressNotifyCommand }] },\n\t\t\t\t\t],\n\t\t\t\t\tPostToolUseFailure: [{ matcher: \"*\", hooks: [{ type: \"command\", command: activityNotifyCommand }] }],\n\t\t\t\t\tUserPromptSubmit: [{ hooks: [{ type: \"command\", command: inProgressNotifyCommand }] }],\n\t\t\t\t};\n\n\t\t\t\tObject.assign(\n\t\t\t\t\tenv,\n\t\t\t\t\tcreateHookRuntimeEnv({\n\t\t\t\t\t\ttaskId: hooks.taskId,\n\t\t\t\t\t\tworkspaceId: hooks.workspaceId,\n\t\t\t\t\t}),\n\t\t\t\t);\n\t\t\t}\n\n\t\t\tawait ensureTextFile(settingsPath, JSON.stringify(settings, null, 2));\n\t\t\tif (!hasCliOption(args, \"--settings\")) {\n\t\t\t\targs.push(\"--settings\", settingsPath);\n\t\t\t}\n\t\t}\n\n\t\tconst withPromptLaunch = withPrompt(args, input.prompt, \"append\");\n\t\treturn {\n\t\t\t...withPromptLaunch,\n\t\t\tenv: {\n\t\t\t\t...withPromptLaunch.env,\n\t\t\t\t...env,\n\t\t\t},\n\t\t};\n\t},\n};\n\nconst clineAdapter: AgentSessionAdapter = {\n\tasync prepare(input) {\n\t\tconst args = [...input.args];\n\t\tconst env: Record<string, string | undefined> = {};\n\n\t\tif (input.autonomousModeEnabled && !hasCliOption(args, \"--auto-approve-all\")) {\n\t\t\targs.push(\"--auto-approve-all\");\n\t\t}\n\n\t\tif (input.resumeFromTrash && !hasCliOption(args, \"--continue\")) {\n\t\t\targs.push(\"--continue\");\n\t\t}\n\n\t\tif (input.startInPlanMode) {\n\t\t\targs.push(\"--plan\");\n\t\t}\n\n\t\tconst hooks = resolveHookContext(input);\n\t\tif (hooks) {\n\t\t\tconst hooksDir = getHookAgentDirectory(\"cline\");\n\t\t\tconst notificationHookPath = getClineHookScriptPath(hooksDir, \"Notification\");\n\t\t\tconst taskCompleteHookPath = getClineHookScriptPath(hooksDir, \"TaskComplete\");\n\t\t\tconst userPromptSubmitHookPath = getClineHookScriptPath(hooksDir, \"UserPromptSubmit\");\n\t\t\tconst preToolUseHookPath = getClineHookScriptPath(hooksDir, \"PreToolUse\");\n\t\t\tconst postToolUseHookPath = getClineHookScriptPath(hooksDir, \"PostToolUse\");\n\t\t\tconst executable = process.platform !== \"win32\";\n\n\t\t\tawait ensureTextFile(notificationHookPath, buildClineNotificationHookScriptContent(), executable);\n\t\t\tawait ensureTextFile(taskCompleteHookPath, buildClineHookScriptContent(\"to_review\"), executable);\n\t\t\tawait ensureTextFile(userPromptSubmitHookPath, buildClineHookScriptContent(\"to_in_progress\"), executable);\n\t\t\tawait ensureTextFile(preToolUseHookPath, buildClineHookScriptContent(\"activity\"), executable);\n\t\t\tawait ensureTextFile(postToolUseHookPath, buildClineHookScriptContent(\"activity\"), executable);\n\n\t\t\tif (!hasCliOption(args, \"--hooks-dir\")) {\n\t\t\t\targs.push(\"--hooks-dir\", hooksDir);\n\t\t\t}\n\n\t\t\tObject.assign(\n\t\t\t\tenv,\n\t\t\t\tcreateHookRuntimeEnv({\n\t\t\t\t\ttaskId: hooks.taskId,\n\t\t\t\t\tworkspaceId: hooks.workspaceId,\n\t\t\t\t}),\n\t\t\t);\n\t\t}\n\n\t\tconst withPromptLaunch = withPrompt(args, input.prompt, \"append\");\n\t\treturn {\n\t\t\t...withPromptLaunch,\n\t\t\tenv: {\n\t\t\t\t...withPromptLaunch.env,\n\t\t\t\t...env,\n\t\t\t},\n\t\t};\n\t},\n};\n\nconst ADAPTERS: Record<RuntimeAgentId, AgentSessionAdapter> = {\n\tclaude: claudeAdapter,\n\tcodex: codexAdapter,\n\tgemini: geminiAdapter,\n\topencode: opencodeAdapter,\n\tdroid: droidAdapter,\n\tcline: clineAdapter,\n};\n\nexport async function prepareAgentLaunch(input: AgentAdapterLaunchInput): Promise<PreparedAgentLaunch> {\n\treturn ADAPTERS[input.agentId].prepare(input);\n}\n"]}
1
+ {"version":3,"file":"agent-session-adapters.js","sourceRoot":"","sources":["../../src/terminal/agent-session-adapters.ts"],"names":[],"mappings":"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","sourcesContent":["import { access, chmod, mkdir, readFile, writeFile } from \"node:fs/promises\";\nimport { dirname, join } from \"node:path\";\nimport { pathToFileURL } from \"node:url\";\n\nimport type { RuntimeAgentId, RuntimeHookEvent, RuntimeTaskSessionSummary } from \"../core/api-contract.js\";\nimport { buildKanbanCommandParts } from \"../core/kanban-command.js\";\nimport { quoteShellArg } from \"../core/shell.js\";\nimport { getRuntimeHomePath } from \"../state/workspace-state.js\";\nimport { createHookRuntimeEnv } from \"./hook-runtime-context.js\";\nimport {\n\tgetOpenCodeAuthPathCandidates,\n\tgetOpenCodeConfigPathCandidates,\n\tgetOpenCodeModelStatePathCandidates,\n} from \"./opencode-paths.js\";\nimport { stripAnsi } from \"./output-utils.js\";\nimport type { SessionTransitionEvent } from \"./session-state-machine.js\";\n\nexport interface AgentAdapterLaunchInput {\n\ttaskId: string;\n\tagentId: RuntimeAgentId;\n\tbinary?: string;\n\targs: string[];\n\tautonomousModeEnabled?: boolean;\n\tcwd: string;\n\tprompt: string;\n\tstartInPlanMode?: boolean;\n\tresumeFromTrash?: boolean;\n\tenv?: Record<string, string | undefined>;\n\tworkspaceId?: string;\n}\n\nexport type AgentOutputTransitionDetector = (\n\tdata: string,\n\tsummary: RuntimeTaskSessionSummary,\n) => SessionTransitionEvent | null;\n\nexport type AgentOutputTransitionInspectionPredicate = (summary: RuntimeTaskSessionSummary) => boolean;\n\nexport interface PreparedAgentLaunch {\n\tbinary?: string;\n\targs: string[];\n\tenv: Record<string, string | undefined>;\n\tcleanup?: () => Promise<void>;\n\tdetectOutputTransition?: AgentOutputTransitionDetector;\n\tshouldInspectOutputForTransition?: AgentOutputTransitionInspectionPredicate;\n}\n\ninterface HookContext {\n\ttaskId: string;\n\tworkspaceId: string;\n}\n\ninterface HookCommandMetadata {\n\tsource?: string;\n\tactivityText?: string;\n\thookEventName?: string;\n\tnotificationType?: string;\n}\n\ninterface AgentSessionAdapter {\n\tprepare(input: AgentAdapterLaunchInput): Promise<PreparedAgentLaunch>;\n}\n\nfunction escapeForTemplateLiteral(value: string): string {\n\treturn value.replaceAll(\"\\\\\", \"\\\\\\\\\").replaceAll(\"`\", \"\\\\`\");\n}\n\nfunction powerShellQuote(value: string): string {\n\treturn `\"${value.replaceAll(\"`\", \"``\").replaceAll('\"', '`\"')}\"`;\n}\n\nfunction resolveHookContext(input: AgentAdapterLaunchInput): HookContext | null {\n\tconst workspaceId = input.workspaceId?.trim();\n\tif (!workspaceId) {\n\t\treturn null;\n\t}\n\treturn {\n\t\ttaskId: input.taskId,\n\t\tworkspaceId,\n\t};\n}\n\nfunction buildHookCommand(event: RuntimeHookEvent, metadata?: HookCommandMetadata): string {\n\tconst parts = buildHooksCommandParts([\"ingest\", \"--event\", event]);\n\tif (metadata?.source) {\n\t\tparts.push(\"--source\", metadata.source);\n\t}\n\tif (metadata?.activityText) {\n\t\tparts.push(\"--activity-text\", metadata.activityText);\n\t}\n\tif (metadata?.hookEventName) {\n\t\tparts.push(\"--hook-event-name\", metadata.hookEventName);\n\t}\n\tif (metadata?.notificationType) {\n\t\tparts.push(\"--notification-type\", metadata.notificationType);\n\t}\n\treturn parts.map(quoteShellArg).join(\" \");\n}\n\nfunction buildHooksCommandParts(args: string[]): string[] {\n\treturn buildKanbanCommandParts([\"hooks\", ...args]);\n}\n\nfunction buildHooksCommand(args: string[]): string {\n\treturn buildHooksCommandParts(args).map(quoteShellArg).join(\" \");\n}\n\nfunction hasCliOption(args: string[], optionName: string): boolean {\n\tfor (let i = 0; i < args.length; i += 1) {\n\t\tconst arg = args[i];\n\t\tif (arg === optionName || arg.startsWith(`${optionName}=`)) {\n\t\t\treturn true;\n\t\t}\n\t}\n\treturn false;\n}\n\nfunction getClineHookScriptPath(\n\thooksDir: string,\n\thookName: \"Notification\" | \"TaskComplete\" | \"UserPromptSubmit\" | \"PreToolUse\" | \"PostToolUse\",\n): string {\n\tif (process.platform === \"win32\") {\n\t\treturn join(hooksDir, `${hookName}.ps1`);\n\t}\n\treturn join(hooksDir, hookName);\n}\n\nfunction buildClineHookScriptContent(event: RuntimeHookEvent): string {\n\tconst commandParts = buildHooksCommandParts([\"notify\", \"--event\", event, \"--source\", \"cline\"]);\n\tif (process.platform === \"win32\") {\n\t\tconst command = commandParts.map(powerShellQuote).join(\" \");\n\t\treturn `$inputText = [Console]::In.ReadToEnd()\ntry {\n $inputText | & ${command} | Out-Null\n} catch {\n}\nWrite-Output '{\"cancel\":false}'\nexit 0\n`;\n\t}\n\tconst command = commandParts.map(quoteShellArg).join(\" \");\n\treturn `#!/usr/bin/env bash\nINPUT=\"$(cat || true)\"\nprintf '%s' \"$INPUT\" | ${command} >/dev/null 2>&1 || true\necho '{\"cancel\":false}'\n`;\n}\n\nfunction buildClineNotificationHookScriptContent(): string {\n\tconst commandParts = buildHooksCommandParts([\"notify\", \"--event\", \"to_review\", \"--source\", \"cline\"]);\n\tif (process.platform === \"win32\") {\n\t\tconst command = commandParts.map(powerShellQuote).join(\" \");\n\t\treturn `$inputText = [Console]::In.ReadToEnd()\nif (\n $inputText -match '\"event\"\\\\s*:\\\\s*\"user_attention\"' -and\n $inputText -notmatch '\"source\"\\\\s*:\\\\s*\"completion_result\"'\n) {\n try {\n $inputText | & ${command} | Out-Null\n } catch {\n }\n}\nWrite-Output '{\"cancel\":false}'\nexit 0\n`;\n\t}\n\tconst command = commandParts.map(quoteShellArg).join(\" \");\n\treturn `#!/usr/bin/env bash\nINPUT=\"$(cat || true)\"\nif printf '%s' \"$INPUT\" | grep -Eq '\"event\"[[:space:]]*:[[:space:]]*\"user_attention\"' &&\n ! printf '%s' \"$INPUT\" | grep -Eq '\"source\"[[:space:]]*:[[:space:]]*\"completion_result\"'; then\n printf '%s' \"$INPUT\" | ${command} >/dev/null 2>&1 || true\nfi\necho '{\"cancel\":false}'\n`;\n}\n\nfunction buildOpenCodePluginContent(\n\treviewCommand: string,\n\ttoInProgressCommand: string,\n): string {\n\tconst reviewCmd = escapeForTemplateLiteral(reviewCommand);\n\tconst toInProgressCmd = escapeForTemplateLiteral(toInProgressCommand);\n\treturn `export const KanbanPlugin = async ({ $, client }) => {\n if (globalThis.__kanbanOpencodePluginV2) return {};\n globalThis.__kanbanOpencodePluginV2 = true;\n\n if (!process?.env?.KANBAN_HOOK_TASK_ID) return {};\n\n let currentState = \"idle\";\n let rootSessionID = null;\n const childSessionCache = new Map();\n\n const notifyReview = async () => {\n try {\n await $\\`${reviewCmd}\\`;\n } catch {\n // Best effort: hook errors should never break OpenCode event handling.\n }\n };\n\n const notifyInprogress = async () => {\n try {\n await $\\`${toInProgressCmd}\\`;\n } catch {\n // Best effort: hook errors should never break OpenCode event handling.\n }\n };\n\n const isChildSession = async (sessionID) => {\n if (!sessionID) return true;\n if (!client?.session?.list) return true;\n if (childSessionCache.has(sessionID)) {\n return childSessionCache.get(sessionID);\n }\n try {\n const sessions = await client.session.list();\n const session = sessions.data?.find((candidate) => candidate.id === sessionID);\n const isChild = !!session?.parentID;\n childSessionCache.set(sessionID, isChild);\n return isChild;\n } catch {\n return true;\n }\n };\n\n const handleBusy = async (sessionID) => {\n if (!rootSessionID) {\n rootSessionID = sessionID;\n }\n if (sessionID !== rootSessionID) {\n return;\n }\n if (currentState === \"idle\") {\n currentState = \"busy\";\n await notifyInprogress();\n }\n };\n\n const handleReview = async (sessionID) => {\n if (rootSessionID && sessionID !== rootSessionID) {\n return;\n }\n if (currentState === \"busy\") {\n currentState = \"idle\";\n await notifyReview();\n rootSessionID = null;\n }\n };\n\n return {\n event: async ({ event }) => {\n const sessionID = event.properties?.sessionID;\n if (await isChildSession(sessionID)) {\n return;\n }\n\n if (event.type === \"session.status\") {\n const status = event.properties?.status;\n if (status?.type === \"busy\") {\n await handleBusy(sessionID);\n } else if (status?.type === \"idle\") {\n await handleReview(sessionID);\n }\n }\n\n if (event.type === \"session.busy\") {\n await handleBusy(sessionID);\n }\n if (event.type === \"session.idle\" || event.type === \"session.error\") {\n await handleReview(sessionID);\n }\n },\n \"permission.ask\": async (_permission, output) => {\n if (output?.status === \"ask\") {\n await notifyReview();\n currentState = \"idle\";\n }\n },\n };\n};\n`;\n}\n\nfunction getHookAgentDirectory(agentId: RuntimeAgentId): string {\n\treturn join(getRuntimeHomePath(), \"hooks\", agentId);\n}\n\nasync function readFileIfExists(filePath: string): Promise<string | null> {\n\ttry {\n\t\treturn await readFile(filePath, \"utf8\");\n\t} catch (error) {\n\t\tif (typeof error === \"object\" && error !== null && \"code\" in error && error.code === \"ENOENT\") {\n\t\t\treturn null;\n\t\t}\n\t\tthrow error;\n\t}\n}\n\nasync function ensureTextFile(filePath: string, content: string, executable = false): Promise<void> {\n\tawait mkdir(dirname(filePath), { recursive: true });\n\tconst existing = await readFileIfExists(filePath);\n\tif (existing !== content) {\n\t\tawait writeFile(filePath, content, \"utf8\");\n\t}\n\tif (executable) {\n\t\tawait chmod(filePath, 0o755);\n\t}\n}\n\nfunction withPrompt(args: string[], prompt: string, mode: \"append\" | \"flag\", flag?: string): PreparedAgentLaunch {\n\tconst trimmed = prompt.trim();\n\tif (!trimmed) {\n\t\treturn {\n\t\t\targs,\n\t\t\tenv: {},\n\t\t};\n\t}\n\tif (mode === \"flag\" && flag) {\n\t\targs.push(flag, trimmed);\n\t} else {\n\t\targs.push(trimmed);\n\t}\n\treturn {\n\t\targs,\n\t\tenv: {},\n\t};\n}\n\nconst claudeAdapter: AgentSessionAdapter = {\n\tasync prepare(input) {\n\t\tconst args = [...input.args];\n\t\tconst env: Record<string, string | undefined> = {};\n\t\tif (\n\t\t\tinput.autonomousModeEnabled &&\n\t\t\t!input.startInPlanMode &&\n\t\t\t!hasCliOption(args, \"--dangerously-skip-permissions\")\n\t\t) {\n\t\t\targs.push(\"--dangerously-skip-permissions\");\n\t\t}\n\t\tif (input.resumeFromTrash && !hasCliOption(args, \"--continue\")) {\n\t\t\targs.push(\"--continue\");\n\t\t}\n\t\tif (input.startInPlanMode) {\n\t\t\tconst withoutImmediateBypass = args.filter((arg) => arg !== \"--dangerously-skip-permissions\");\n\t\t\targs.length = 0;\n\t\t\targs.push(...withoutImmediateBypass);\n\t\t\tif (!hasCliOption(args, \"--allow-dangerously-skip-permissions\")) {\n\t\t\t\targs.push(\"--allow-dangerously-skip-permissions\");\n\t\t\t}\n\t\t\targs.push(\"--permission-mode\", \"plan\");\n\t\t}\n\n\t\tconst hooks = resolveHookContext(input);\n\t\tif (hooks) {\n\t\t\tconst settingsPath = join(getHookAgentDirectory(\"claude\"), \"settings.json\");\n\t\t\tconst hooksSettings = {\n\t\t\t\thooks: {\n\t\t\t\t\tStop: [{ hooks: [{ type: \"command\", command: buildHookCommand(\"to_review\", { source: \"claude\" }) }] }],\n\t\t\t\t\tSubagentStop: [\n\t\t\t\t\t\t{ hooks: [{ type: \"command\", command: buildHookCommand(\"activity\", { source: \"claude\" }) }] },\n\t\t\t\t\t],\n\t\t\t\t\tPreToolUse: [\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tmatcher: \"*\",\n\t\t\t\t\t\t\thooks: [{ type: \"command\", command: buildHookCommand(\"activity\", { source: \"claude\" }) }],\n\t\t\t\t\t\t},\n\t\t\t\t\t],\n\t\t\t\t\tPermissionRequest: [\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tmatcher: \"*\",\n\t\t\t\t\t\t\thooks: [{ type: \"command\", command: buildHookCommand(\"to_review\", { source: \"claude\" }) }],\n\t\t\t\t\t\t},\n\t\t\t\t\t],\n\t\t\t\t\tPostToolUse: [\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tmatcher: \"*\",\n\t\t\t\t\t\t\thooks: [{ type: \"command\", command: buildHookCommand(\"to_in_progress\", { source: \"claude\" }) }],\n\t\t\t\t\t\t},\n\t\t\t\t\t],\n\t\t\t\t\tPostToolUseFailure: [\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tmatcher: \"*\",\n\t\t\t\t\t\t\thooks: [{ type: \"command\", command: buildHookCommand(\"to_in_progress\", { source: \"claude\" }) }],\n\t\t\t\t\t\t},\n\t\t\t\t\t],\n\t\t\t\t\tNotification: [\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tmatcher: \"permission_prompt\",\n\t\t\t\t\t\t\thooks: [{ type: \"command\", command: buildHookCommand(\"to_review\", { source: \"claude\" }) }],\n\t\t\t\t\t\t},\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tmatcher: \"*\",\n\t\t\t\t\t\t\thooks: [{ type: \"command\", command: buildHookCommand(\"activity\", { source: \"claude\" }) }],\n\t\t\t\t\t\t},\n\t\t\t\t\t],\n\t\t\t\t\tUserPromptSubmit: [\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\thooks: [\n\t\t\t\t\t\t\t\t{ type: \"command\", command: buildHookCommand(\"to_in_progress\", { source: \"claude\" }) },\n\t\t\t\t\t\t\t],\n\t\t\t\t\t\t},\n\t\t\t\t\t],\n\t\t\t\t},\n\t\t\t};\n\t\t\tawait ensureTextFile(settingsPath, JSON.stringify(hooksSettings, null, 2));\n\t\t\targs.push(\"--settings\", settingsPath);\n\t\t\tObject.assign(\n\t\t\t\tenv,\n\t\t\t\tcreateHookRuntimeEnv({\n\t\t\t\t\ttaskId: hooks.taskId,\n\t\t\t\t\tworkspaceId: hooks.workspaceId,\n\t\t\t\t}),\n\t\t\t);\n\t\t}\n\n\t\tconst withPromptLaunch = withPrompt(args, input.prompt, \"append\");\n\t\treturn {\n\t\t\t...withPromptLaunch,\n\t\t\tenv: {\n\t\t\t\t...withPromptLaunch.env,\n\t\t\t\t...env,\n\t\t\t},\n\t\t};\n\t},\n};\n\nfunction codexPromptDetector(data: string, summary: RuntimeTaskSessionSummary): SessionTransitionEvent | null {\n\tif (summary.state !== \"awaiting_review\") {\n\t\treturn null;\n\t}\n\tif (summary.reviewReason !== \"attention\" && summary.reviewReason !== \"hook\") {\n\t\treturn null;\n\t}\n\tconst stripped = stripAnsi(data);\n\tif (/(?:^|\\n)\\s*›/.test(stripped)) {\n\t\treturn { type: \"agent.prompt-ready\" };\n\t}\n\treturn null;\n}\n\nfunction shouldInspectCodexOutputForTransition(summary: RuntimeTaskSessionSummary): boolean {\n\treturn (\n\t\tsummary.state === \"awaiting_review\" && (summary.reviewReason === \"attention\" || summary.reviewReason === \"hook\")\n\t);\n}\n\nconst codexAdapter: AgentSessionAdapter = {\n\tasync prepare(input) {\n\t\tconst codexArgs = [...input.args];\n\t\tconst env: Record<string, string | undefined> = {};\n\t\tlet binary = input.binary;\n\n\t\tif (input.autonomousModeEnabled && !hasCliOption(codexArgs, \"--dangerously-bypass-approvals-and-sandbox\")) {\n\t\t\tcodexArgs.push(\"--dangerously-bypass-approvals-and-sandbox\");\n\t\t}\n\n\t\tif (input.resumeFromTrash) {\n\t\t\tif (!codexArgs.includes(\"resume\")) {\n\t\t\t\tcodexArgs.push(\"resume\");\n\t\t\t}\n\t\t\tif (!hasCliOption(codexArgs, \"--last\")) {\n\t\t\t\tcodexArgs.push(\"--last\");\n\t\t\t}\n\t\t}\n\n\t\tconst hooks = resolveHookContext(input);\n\t\tif (hooks) {\n\t\t\tObject.assign(\n\t\t\t\tenv,\n\t\t\t\tcreateHookRuntimeEnv({\n\t\t\t\t\ttaskId: hooks.taskId,\n\t\t\t\t\tworkspaceId: hooks.workspaceId,\n\t\t\t\t}),\n\t\t\t);\n\t\t}\n\n\t\tconst trimmed = input.prompt.trim();\n\t\tif (trimmed) {\n\t\t\tconst initialPrompt = input.startInPlanMode ? `/plan\\n${trimmed}` : trimmed;\n\t\t\tcodexArgs.push(initialPrompt);\n\t\t}\n\n\t\tif (hooks) {\n\t\t\tconst wrapperParts = buildHooksCommandParts([\n\t\t\t\t\"codex-wrapper\",\n\t\t\t\t\"--real-binary\",\n\t\t\t\tinput.binary ?? \"codex\",\n\t\t\t\t\"--\",\n\t\t\t\t...codexArgs,\n\t\t\t]);\n\t\t\tbinary = wrapperParts[0];\n\t\t\tconst args = wrapperParts.slice(1);\n\t\t\treturn {\n\t\t\t\tbinary,\n\t\t\t\targs,\n\t\t\t\tenv,\n\t\t\t\tdetectOutputTransition: codexPromptDetector,\n\t\t\t\tshouldInspectOutputForTransition: shouldInspectCodexOutputForTransition,\n\t\t\t};\n\t\t}\n\n\t\treturn {\n\t\t\tbinary,\n\t\t\targs: codexArgs,\n\t\t\tenv,\n\t\t\tdetectOutputTransition: codexPromptDetector,\n\t\t\tshouldInspectOutputForTransition: shouldInspectCodexOutputForTransition,\n\t\t};\n\t},\n};\n\nconst geminiAdapter: AgentSessionAdapter = {\n\tasync prepare(input) {\n\t\tconst args = [...input.args];\n\t\tconst env: Record<string, string | undefined> = {};\n\n\t\tif (input.autonomousModeEnabled && !hasCliOption(args, \"--yolo\")) {\n\t\t\targs.push(\"--yolo\");\n\t\t}\n\n\t\tif (input.resumeFromTrash && !hasCliOption(args, \"--resume\")) {\n\t\t\targs.push(\"--resume\", \"latest\");\n\t\t}\n\n\t\tif (input.startInPlanMode) {\n\t\t\targs.push(\"--approval-mode=plan\");\n\t\t}\n\n\t\tconst hooks = resolveHookContext(input);\n\t\tif (hooks) {\n\t\t\tconst configPath = join(getHookAgentDirectory(\"gemini\"), \"settings.json\");\n\t\t\tconst geminiHookCommand = buildHooksCommand([\"gemini-hook\"]);\n\n\t\t\tconst config = {\n\t\t\t\thooks: {\n\t\t\t\t\tBeforeTool: [\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\thooks: [{ type: \"command\", command: geminiHookCommand }],\n\t\t\t\t\t\t},\n\t\t\t\t\t],\n\t\t\t\t\tAfterTool: [\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\thooks: [{ type: \"command\", command: geminiHookCommand }],\n\t\t\t\t\t\t},\n\t\t\t\t\t],\n\t\t\t\t\tAfterAgent: [\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\thooks: [{ type: \"command\", command: geminiHookCommand }],\n\t\t\t\t\t\t},\n\t\t\t\t\t],\n\t\t\t\t\tBeforeAgent: [\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\thooks: [{ type: \"command\", command: geminiHookCommand }],\n\t\t\t\t\t\t},\n\t\t\t\t\t],\n\t\t\t\t\tNotification: [\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\thooks: [{ type: \"command\", command: geminiHookCommand }],\n\t\t\t\t\t\t},\n\t\t\t\t\t],\n\t\t\t\t},\n\t\t\t};\n\t\t\tawait ensureTextFile(configPath, JSON.stringify(config, null, 2));\n\t\t\tObject.assign(\n\t\t\t\tenv,\n\t\t\t\tcreateHookRuntimeEnv({\n\t\t\t\t\ttaskId: hooks.taskId,\n\t\t\t\t\tworkspaceId: hooks.workspaceId,\n\t\t\t\t}),\n\t\t\t);\n\t\t\tenv.GEMINI_CLI_SYSTEM_SETTINGS_PATH = configPath;\n\t\t}\n\n\t\tconst trimmed = input.prompt.trim();\n\t\tif (trimmed) {\n\t\t\targs.push(\"-i\", trimmed);\n\t\t\treturn {\n\t\t\t\targs,\n\t\t\t\tenv,\n\t\t\t};\n\t\t}\n\n\t\treturn {\n\t\t\targs,\n\t\t\tenv,\n\t\t};\n\t},\n};\n\nasync function resolveOpenCodeBaseConfigPath(explicitPath: string | undefined): Promise<string | null> {\n\tconst candidates = getOpenCodeConfigPathCandidates({ explicitPath });\n\tfor (const candidate of candidates) {\n\t\ttry {\n\t\t\tawait access(candidate);\n\t\t\treturn candidate;\n\t\t} catch {\n\t\t\t// Keep searching.\n\t\t}\n\t}\n\treturn null;\n}\n\nfunction hasOpenCodeModelArg(args: string[]): boolean {\n\tfor (const arg of args) {\n\t\tif (arg === \"--model\" || arg === \"-m\") {\n\t\t\treturn true;\n\t\t}\n\t\tif (arg.startsWith(\"--model=\") || arg.startsWith(\"-m=\")) {\n\t\t\treturn true;\n\t\t}\n\t}\n\treturn false;\n}\n\nfunction hasOpenCodeAgentArg(args: string[]): boolean {\n\tfor (const arg of args) {\n\t\tif (arg === \"--agent\") {\n\t\t\treturn true;\n\t\t}\n\t\tif (arg.startsWith(\"--agent=\")) {\n\t\t\treturn true;\n\t\t}\n\t}\n\treturn false;\n}\n\nfunction normalizeOpenCodeModel(providerId: string, modelId: string): string {\n\tif (modelId.startsWith(`${providerId}/`)) {\n\t\treturn modelId;\n\t}\n\treturn `${providerId}/${modelId}`;\n}\n\nfunction stripJsonComments(input: string): string {\n\tlet output = \"\";\n\tlet inString = false;\n\tlet escaped = false;\n\tlet inLineComment = false;\n\tlet inBlockComment = false;\n\n\tfor (let i = 0; i < input.length; i += 1) {\n\t\tconst current = input[i];\n\t\tconst next = i + 1 < input.length ? input[i + 1] : \"\";\n\n\t\tif (inLineComment) {\n\t\t\tif (current === \"\\n\") {\n\t\t\t\tinLineComment = false;\n\t\t\t\toutput += current;\n\t\t\t}\n\t\t\tcontinue;\n\t\t}\n\t\tif (inBlockComment) {\n\t\t\tif (current === \"*\" && next === \"/\") {\n\t\t\t\tinBlockComment = false;\n\t\t\t\ti += 1;\n\t\t\t}\n\t\t\tcontinue;\n\t\t}\n\t\tif (!inString && current === \"/\" && next === \"/\") {\n\t\t\tinLineComment = true;\n\t\t\ti += 1;\n\t\t\tcontinue;\n\t\t}\n\t\tif (!inString && current === \"/\" && next === \"*\") {\n\t\t\tinBlockComment = true;\n\t\t\ti += 1;\n\t\t\tcontinue;\n\t\t}\n\n\t\toutput += current;\n\t\tif (inString) {\n\t\t\tif (escaped) {\n\t\t\t\tescaped = false;\n\t\t\t} else if (current === \"\\\\\") {\n\t\t\t\tescaped = true;\n\t\t\t} else if (current === '\"') {\n\t\t\t\tinString = false;\n\t\t\t}\n\t\t\tcontinue;\n\t\t}\n\t\tif (current === '\"') {\n\t\t\tinString = true;\n\t\t}\n\t}\n\treturn output;\n}\n\nfunction tryExtractOpenCodeModelFromConfig(rawConfig: string): string | null {\n\tlet parsed: unknown;\n\ttry {\n\t\tparsed = JSON.parse(rawConfig);\n\t} catch {\n\t\ttry {\n\t\t\tparsed = JSON.parse(stripJsonComments(rawConfig));\n\t\t} catch {\n\t\t\treturn null;\n\t\t}\n\t}\n\tif (!parsed || typeof parsed !== \"object\" || Array.isArray(parsed)) {\n\t\treturn null;\n\t}\n\tconst root = parsed as Record<string, unknown>;\n\n\tconst directModel = root.model;\n\tif (typeof directModel === \"string\" && directModel.trim()) {\n\t\treturn directModel.trim();\n\t}\n\n\tconst mode = root.mode;\n\tif (mode && typeof mode === \"object\" && !Array.isArray(mode)) {\n\t\tconst build = (mode as Record<string, unknown>).build;\n\t\tif (build && typeof build === \"object\" && !Array.isArray(build)) {\n\t\t\tconst model = (build as Record<string, unknown>).model;\n\t\t\tif (typeof model === \"string\" && model.trim()) {\n\t\t\t\treturn model.trim();\n\t\t\t}\n\t\t}\n\t}\n\n\tconst agent = root.agent;\n\tif (agent && typeof agent === \"object\" && !Array.isArray(agent)) {\n\t\tconst build = (agent as Record<string, unknown>).build;\n\t\tif (build && typeof build === \"object\" && !Array.isArray(build)) {\n\t\t\tconst model = (build as Record<string, unknown>).model;\n\t\t\tif (typeof model === \"string\" && model.trim()) {\n\t\t\t\treturn model.trim();\n\t\t\t}\n\t\t}\n\t}\n\n\treturn null;\n}\n\nasync function resolveOpenCodePreferredModelArg(configPath: string | null): Promise<string | null> {\n\tif (configPath) {\n\t\ttry {\n\t\t\tconst rawConfig = await readFile(configPath, \"utf8\");\n\t\t\tconst modelFromConfig = tryExtractOpenCodeModelFromConfig(rawConfig);\n\t\t\tif (modelFromConfig) {\n\t\t\t\treturn modelFromConfig;\n\t\t\t}\n\t\t} catch {\n\t\t\t// Fall through to state-based fallback.\n\t\t}\n\t}\n\n\tconst modelStateCandidates = getOpenCodeModelStatePathCandidates();\n\tlet recentModels: Array<{ providerID?: unknown; modelID?: unknown }> = [];\n\tfor (const modelStatePath of modelStateCandidates) {\n\t\ttry {\n\t\t\tconst raw = await readFile(modelStatePath, \"utf8\");\n\t\t\tconst parsed = JSON.parse(raw) as { recent?: Array<{ providerID?: unknown; modelID?: unknown }> };\n\t\t\tif (Array.isArray(parsed.recent)) {\n\t\t\t\trecentModels = parsed.recent;\n\t\t\t\tbreak;\n\t\t\t}\n\t\t} catch {\n\t\t\t// Keep searching through candidate state paths.\n\t\t}\n\t}\n\tif (recentModels.length === 0) {\n\t\treturn null;\n\t}\n\n\tconst configuredProviders = new Set<string>();\n\tfor (const authPath of getOpenCodeAuthPathCandidates()) {\n\t\ttry {\n\t\t\tconst raw = await readFile(authPath, \"utf8\");\n\t\t\tconst parsed = JSON.parse(raw) as Record<string, unknown>;\n\t\t\tfor (const [provider, value] of Object.entries(parsed)) {\n\t\t\t\tif (!value || typeof value !== \"object\" || Array.isArray(value)) {\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\t\t\t\tconst key = (value as Record<string, unknown>).key;\n\t\t\t\tif (typeof key === \"string\" && key.trim()) {\n\t\t\t\t\tconfiguredProviders.add(provider);\n\t\t\t\t}\n\t\t\t}\n\t\t\tbreak;\n\t\t} catch {\n\t\t\t// Keep searching through candidate auth paths.\n\t\t}\n\t}\n\n\tconst candidates: Array<{ providerId: string; model: string }> = [];\n\tfor (const entry of recentModels) {\n\t\tconst providerId = typeof entry.providerID === \"string\" ? entry.providerID.trim() : \"\";\n\t\tconst modelId = typeof entry.modelID === \"string\" ? entry.modelID.trim() : \"\";\n\t\tif (!providerId || !modelId) {\n\t\t\tcontinue;\n\t\t}\n\t\tcandidates.push({ providerId, model: normalizeOpenCodeModel(providerId, modelId) });\n\t}\n\tif (candidates.length === 0) {\n\t\treturn null;\n\t}\n\n\tconst preferredProviderOrder = [\"openrouter\", \"anthropic\", \"openai\", \"opencode\", \"google\", \"amazon-bedrock\"];\n\tfor (const providerId of preferredProviderOrder) {\n\t\tconst match = candidates.find((candidate) => candidate.providerId === providerId);\n\t\tif (!match) {\n\t\t\tcontinue;\n\t\t}\n\t\tif (configuredProviders.size === 0 || configuredProviders.has(providerId)) {\n\t\t\treturn match.model;\n\t\t}\n\t}\n\n\tconst configuredMatch = candidates.find((candidate) => configuredProviders.has(candidate.providerId));\n\tif (configuredMatch) {\n\t\treturn configuredMatch.model;\n\t}\n\n\treturn candidates[0].model;\n}\n\nconst opencodeAdapter: AgentSessionAdapter = {\n\tasync prepare(input) {\n\t\tconst args = [...input.args];\n\t\tconst env: Record<string, string | undefined> = {};\n\t\tconst baseConfigPath = await resolveOpenCodeBaseConfigPath(input.env?.OPENCODE_CONFIG);\n\t\tif (input.resumeFromTrash && !hasCliOption(args, \"--continue\")) {\n\t\t\targs.push(\"--continue\");\n\t\t}\n\n\t\tif (input.startInPlanMode) {\n\t\t\tenv.OPENCODE_EXPERIMENTAL_PLAN_MODE = \"true\";\n\t\t\tif (!hasOpenCodeAgentArg(args)) {\n\t\t\t\targs.push(\"--agent\", \"plan\");\n\t\t\t}\n\t\t}\n\n\t\tconst hooks = resolveHookContext(input);\n\t\tif (hooks) {\n\t\t\tconst pluginPath = join(getHookAgentDirectory(\"opencode\"), \"kanban.js\");\n\t\t\tconst configPath = join(getHookAgentDirectory(\"opencode\"), \"opencode.json\");\n\n\t\t\tconst pluginContent = buildOpenCodePluginContent(\n\t\t\t\tbuildHookCommand(\"to_review\", { source: \"opencode\", activityText: \"Waiting for review\" }),\n\t\t\t\tbuildHookCommand(\"to_in_progress\", { source: \"opencode\", activityText: \"Agent active\" }),\n\t\t\t);\n\t\t\tawait ensureTextFile(pluginPath, pluginContent);\n\t\t\tconst pluginFileUrl = pathToFileURL(pluginPath).href;\n\t\t\tconst config = {\n\t\t\t\tplugin: [pluginFileUrl],\n\t\t\t};\n\t\t\tawait ensureTextFile(configPath, JSON.stringify(config));\n\t\t\tObject.assign(\n\t\t\t\tenv,\n\t\t\t\tcreateHookRuntimeEnv({\n\t\t\t\t\ttaskId: hooks.taskId,\n\t\t\t\t\tworkspaceId: hooks.workspaceId,\n\t\t\t\t}),\n\t\t\t);\n\t\t\tenv.OPENCODE_CONFIG = configPath;\n\t\t}\n\n\t\t// Workaround: with --prompt, OpenCode can pick an unexpected provider/model.\n\t\t// Explicitly pass the user's preferred model so prompt runs stay on their usual provider.\n\t\tif (!hasOpenCodeModelArg(args)) {\n\t\t\tconst preferredModel = await resolveOpenCodePreferredModelArg(baseConfigPath);\n\t\t\tif (preferredModel) {\n\t\t\t\targs.push(\"--model\", preferredModel);\n\t\t\t}\n\t\t}\n\n\t\tconst trimmed = input.prompt.trim();\n\t\tif (trimmed) {\n\t\t\targs.push(\"--prompt\", trimmed);\n\t\t\treturn {\n\t\t\t\targs,\n\t\t\t\tenv,\n\t\t\t};\n\t\t}\n\n\t\treturn {\n\t\t\targs,\n\t\t\tenv,\n\t\t};\n\t},\n};\n\nconst droidAdapter: AgentSessionAdapter = {\n\tasync prepare(input) {\n\t\tconst args = [...input.args];\n\t\tconst env: Record<string, string | undefined> = {};\n\n\t\tif (input.resumeFromTrash && !hasCliOption(args, \"--resume\") && !hasCliOption(args, \"-r\")) {\n\t\t\targs.push(\"--resume\");\n\t\t}\n\n\t\tconst hooks = resolveHookContext(input);\n\t\tconst shouldWriteSettings = Boolean(hooks) || input.startInPlanMode || input.autonomousModeEnabled !== undefined;\n\t\tif (shouldWriteSettings) {\n\t\t\tconst settingsPath = join(getHookAgentDirectory(\"droid\"), \"settings.json\");\n\t\t\tconst settings: Record<string, unknown> = {\n\t\t\t\tautonomyMode: input.startInPlanMode ? \"spec\" : input.autonomousModeEnabled ? \"auto-high\" : \"normal\",\n\t\t\t};\n\n\t\t\tif (hooks) {\n\t\t\t\tconst droidActiveToolMatcher = \"Read|Grep|Glob|FetchUrl|WebSearch|Execute|Task|Edit|Create\";\n\t\t\t\tconst reviewNotifyCommand = buildHooksCommand([\"notify\", \"--event\", \"to_review\", \"--source\", \"droid\"]);\n\t\t\t\tconst inProgressNotifyCommand = buildHooksCommand([\n\t\t\t\t\t\"notify\",\n\t\t\t\t\t\"--event\",\n\t\t\t\t\t\"to_in_progress\",\n\t\t\t\t\t\"--source\",\n\t\t\t\t\t\"droid\",\n\t\t\t\t]);\n\t\t\t\tconst activityNotifyCommand = buildHooksCommand([\"notify\", \"--event\", \"activity\", \"--source\", \"droid\"]);\n\t\t\t\tsettings.hooks = {\n\t\t\t\t\tStop: [{ hooks: [{ type: \"command\", command: reviewNotifyCommand }] }],\n\t\t\t\t\tNotification: [\n\t\t\t\t\t\t{ hooks: [{ type: \"command\", command: activityNotifyCommand }] },\n\t\t\t\t\t\t{ hooks: [{ type: \"command\", command: reviewNotifyCommand }] },\n\t\t\t\t\t],\n\t\t\t\t\tPreToolUse: [\n\t\t\t\t\t\t{ matcher: \"*\", hooks: [{ type: \"command\", command: activityNotifyCommand }] },\n\t\t\t\t\t\t{ matcher: droidActiveToolMatcher, hooks: [{ type: \"command\", command: inProgressNotifyCommand }] },\n\t\t\t\t\t\t{ matcher: \"AskUser\", hooks: [{ type: \"command\", command: reviewNotifyCommand }] },\n\t\t\t\t\t],\n\t\t\t\t\tPostToolUse: [\n\t\t\t\t\t\t{ matcher: \"*\", hooks: [{ type: \"command\", command: activityNotifyCommand }] },\n\t\t\t\t\t\t{ matcher: \"AskUser\", hooks: [{ type: \"command\", command: inProgressNotifyCommand }] },\n\t\t\t\t\t],\n\t\t\t\t\tPostToolUseFailure: [{ matcher: \"*\", hooks: [{ type: \"command\", command: activityNotifyCommand }] }],\n\t\t\t\t\tUserPromptSubmit: [{ hooks: [{ type: \"command\", command: inProgressNotifyCommand }] }],\n\t\t\t\t};\n\n\t\t\t\tObject.assign(\n\t\t\t\t\tenv,\n\t\t\t\t\tcreateHookRuntimeEnv({\n\t\t\t\t\t\ttaskId: hooks.taskId,\n\t\t\t\t\t\tworkspaceId: hooks.workspaceId,\n\t\t\t\t\t}),\n\t\t\t\t);\n\t\t\t}\n\n\t\t\tawait ensureTextFile(settingsPath, JSON.stringify(settings, null, 2));\n\t\t\tif (!hasCliOption(args, \"--settings\")) {\n\t\t\t\targs.push(\"--settings\", settingsPath);\n\t\t\t}\n\t\t}\n\n\t\tconst withPromptLaunch = withPrompt(args, input.prompt, \"append\");\n\t\treturn {\n\t\t\t...withPromptLaunch,\n\t\t\tenv: {\n\t\t\t\t...withPromptLaunch.env,\n\t\t\t\t...env,\n\t\t\t},\n\t\t};\n\t},\n};\n\nconst clineAdapter: AgentSessionAdapter = {\n\tasync prepare(input) {\n\t\tconst args = [...input.args];\n\t\tconst env: Record<string, string | undefined> = {};\n\n\t\tif (input.autonomousModeEnabled && !hasCliOption(args, \"--auto-approve-all\")) {\n\t\t\targs.push(\"--auto-approve-all\");\n\t\t}\n\n\t\tif (input.resumeFromTrash && !hasCliOption(args, \"--continue\")) {\n\t\t\targs.push(\"--continue\");\n\t\t}\n\n\t\tif (input.startInPlanMode) {\n\t\t\targs.push(\"--plan\");\n\t\t}\n\n\t\tconst hooks = resolveHookContext(input);\n\t\tif (hooks) {\n\t\t\tconst hooksDir = getHookAgentDirectory(\"cline\");\n\t\t\tconst notificationHookPath = getClineHookScriptPath(hooksDir, \"Notification\");\n\t\t\tconst taskCompleteHookPath = getClineHookScriptPath(hooksDir, \"TaskComplete\");\n\t\t\tconst userPromptSubmitHookPath = getClineHookScriptPath(hooksDir, \"UserPromptSubmit\");\n\t\t\tconst preToolUseHookPath = getClineHookScriptPath(hooksDir, \"PreToolUse\");\n\t\t\tconst postToolUseHookPath = getClineHookScriptPath(hooksDir, \"PostToolUse\");\n\t\t\tconst executable = process.platform !== \"win32\";\n\n\t\t\tawait ensureTextFile(notificationHookPath, buildClineNotificationHookScriptContent(), executable);\n\t\t\tawait ensureTextFile(taskCompleteHookPath, buildClineHookScriptContent(\"to_review\"), executable);\n\t\t\tawait ensureTextFile(userPromptSubmitHookPath, buildClineHookScriptContent(\"to_in_progress\"), executable);\n\t\t\tawait ensureTextFile(preToolUseHookPath, buildClineHookScriptContent(\"activity\"), executable);\n\t\t\tawait ensureTextFile(postToolUseHookPath, buildClineHookScriptContent(\"activity\"), executable);\n\n\t\t\tif (!hasCliOption(args, \"--hooks-dir\")) {\n\t\t\t\targs.push(\"--hooks-dir\", hooksDir);\n\t\t\t}\n\n\t\t\tObject.assign(\n\t\t\t\tenv,\n\t\t\t\tcreateHookRuntimeEnv({\n\t\t\t\t\ttaskId: hooks.taskId,\n\t\t\t\t\tworkspaceId: hooks.workspaceId,\n\t\t\t\t}),\n\t\t\t);\n\t\t}\n\n\t\tconst withPromptLaunch = withPrompt(args, input.prompt, \"append\");\n\t\treturn {\n\t\t\t...withPromptLaunch,\n\t\t\tenv: {\n\t\t\t\t...withPromptLaunch.env,\n\t\t\t\t...env,\n\t\t\t},\n\t\t};\n\t},\n};\n\nconst ADAPTERS: Record<RuntimeAgentId, AgentSessionAdapter> = {\n\tclaude: claudeAdapter,\n\tcodex: codexAdapter,\n\tgemini: geminiAdapter,\n\topencode: opencodeAdapter,\n\tdroid: droidAdapter,\n\tcline: clineAdapter,\n};\n\nexport async function prepareAgentLaunch(input: AgentAdapterLaunchInput): Promise<PreparedAgentLaunch> {\n\treturn ADAPTERS[input.agentId].prepare(input);\n}\n"]}
@@ -0,0 +1,10 @@
1
+ interface OpenCodePathCandidatesInput {
2
+ explicitPath?: string | undefined;
3
+ env?: NodeJS.ProcessEnv;
4
+ homePath?: string;
5
+ }
6
+ export declare function getOpenCodeConfigPathCandidates(input?: OpenCodePathCandidatesInput): string[];
7
+ export declare function getOpenCodeModelStatePathCandidates(input?: Omit<OpenCodePathCandidatesInput, "explicitPath">): string[];
8
+ export declare function getOpenCodeAuthPathCandidates(input?: Omit<OpenCodePathCandidatesInput, "explicitPath">): string[];
9
+ export {};
10
+ //# sourceMappingURL=opencode-paths.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"opencode-paths.d.ts","sourceRoot":"","sources":["../../src/terminal/opencode-paths.ts"],"names":[],"mappings":"AAGA,UAAU,2BAA2B;IACpC,YAAY,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IAClC,GAAG,CAAC,EAAE,MAAM,CAAC,UAAU,CAAC;IACxB,QAAQ,CAAC,EAAE,MAAM,CAAC;CAClB;AAwBD,wBAAgB,+BAA+B,CAAC,KAAK,GAAE,2BAAgC,GAAG,MAAM,EAAE,CA+BjG;AAED,wBAAgB,mCAAmC,CAAC,KAAK,GAAE,IAAI,CAAC,2BAA2B,EAAE,cAAc,CAAM,GAAG,MAAM,EAAE,CAU3H;AAED,wBAAgB,6BAA6B,CAAC,KAAK,GAAE,IAAI,CAAC,2BAA2B,EAAE,cAAc,CAAM,GAAG,MAAM,EAAE,CAUrH"}
@@ -0,0 +1,62 @@
1
+ import { homedir } from "node:os";
2
+ import { join } from "node:path";
3
+ function uniquePaths(paths) {
4
+ const seen = new Set();
5
+ const unique = [];
6
+ for (const path of paths) {
7
+ const trimmed = path.trim();
8
+ if (!trimmed || seen.has(trimmed)) {
9
+ continue;
10
+ }
11
+ seen.add(trimmed);
12
+ unique.push(trimmed);
13
+ }
14
+ return unique;
15
+ }
16
+ function appendFromEnv(paths, envValue, ...segments) {
17
+ const root = envValue?.trim();
18
+ if (!root) {
19
+ return;
20
+ }
21
+ paths.push(join(root, ...segments));
22
+ }
23
+ export function getOpenCodeConfigPathCandidates(input = {}) {
24
+ const env = input.env ?? process.env;
25
+ const homePath = input.homePath ?? homedir();
26
+ const candidates = [];
27
+ const explicit = input.explicitPath?.trim();
28
+ if (explicit) {
29
+ candidates.push(explicit);
30
+ }
31
+ const envExplicit = env.OPENCODE_CONFIG?.trim();
32
+ if (envExplicit) {
33
+ candidates.push(envExplicit);
34
+ }
35
+ appendFromEnv(candidates, env.APPDATA, "opencode", "config.json");
36
+ appendFromEnv(candidates, env.APPDATA, "opencode", "opencode.jsonc");
37
+ appendFromEnv(candidates, env.APPDATA, "opencode", "opencode.json");
38
+ appendFromEnv(candidates, env.LOCALAPPDATA, "opencode", "config.json");
39
+ appendFromEnv(candidates, env.LOCALAPPDATA, "opencode", "opencode.jsonc");
40
+ appendFromEnv(candidates, env.LOCALAPPDATA, "opencode", "opencode.json");
41
+ candidates.push(join(homePath, ".config", "opencode", "config.json"), join(homePath, ".config", "opencode", "opencode.jsonc"), join(homePath, ".config", "opencode", "opencode.json"), join(homePath, ".opencode", "opencode.jsonc"), join(homePath, ".opencode", "opencode.json"));
42
+ return uniquePaths(candidates);
43
+ }
44
+ export function getOpenCodeModelStatePathCandidates(input = {}) {
45
+ const env = input.env ?? process.env;
46
+ const homePath = input.homePath ?? homedir();
47
+ const candidates = [];
48
+ appendFromEnv(candidates, env.LOCALAPPDATA, "opencode", "state", "model.json");
49
+ appendFromEnv(candidates, env.APPDATA, "opencode", "state", "model.json");
50
+ candidates.push(join(homePath, ".local", "state", "opencode", "model.json"));
51
+ return uniquePaths(candidates);
52
+ }
53
+ export function getOpenCodeAuthPathCandidates(input = {}) {
54
+ const env = input.env ?? process.env;
55
+ const homePath = input.homePath ?? homedir();
56
+ const candidates = [];
57
+ appendFromEnv(candidates, env.APPDATA, "opencode", "auth.json");
58
+ appendFromEnv(candidates, env.LOCALAPPDATA, "opencode", "auth.json");
59
+ candidates.push(join(homePath, ".local", "share", "opencode", "auth.json"));
60
+ return uniquePaths(candidates);
61
+ }
62
+ //# sourceMappingURL=opencode-paths.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"opencode-paths.js","sourceRoot":"","sources":["../../src/terminal/opencode-paths.ts"],"names":[],"mappings":"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","sourcesContent":["import { homedir } from \"node:os\";\nimport { join } from \"node:path\";\n\ninterface OpenCodePathCandidatesInput {\n\texplicitPath?: string | undefined;\n\tenv?: NodeJS.ProcessEnv;\n\thomePath?: string;\n}\n\nfunction uniquePaths(paths: string[]): string[] {\n\tconst seen = new Set<string>();\n\tconst unique: string[] = [];\n\tfor (const path of paths) {\n\t\tconst trimmed = path.trim();\n\t\tif (!trimmed || seen.has(trimmed)) {\n\t\t\tcontinue;\n\t\t}\n\t\tseen.add(trimmed);\n\t\tunique.push(trimmed);\n\t}\n\treturn unique;\n}\n\nfunction appendFromEnv(paths: string[], envValue: string | undefined, ...segments: string[]): void {\n\tconst root = envValue?.trim();\n\tif (!root) {\n\t\treturn;\n\t}\n\tpaths.push(join(root, ...segments));\n}\n\nexport function getOpenCodeConfigPathCandidates(input: OpenCodePathCandidatesInput = {}): string[] {\n\tconst env = input.env ?? process.env;\n\tconst homePath = input.homePath ?? homedir();\n\tconst candidates: string[] = [];\n\n\tconst explicit = input.explicitPath?.trim();\n\tif (explicit) {\n\t\tcandidates.push(explicit);\n\t}\n\n\tconst envExplicit = env.OPENCODE_CONFIG?.trim();\n\tif (envExplicit) {\n\t\tcandidates.push(envExplicit);\n\t}\n\n\tappendFromEnv(candidates, env.APPDATA, \"opencode\", \"config.json\");\n\tappendFromEnv(candidates, env.APPDATA, \"opencode\", \"opencode.jsonc\");\n\tappendFromEnv(candidates, env.APPDATA, \"opencode\", \"opencode.json\");\n\tappendFromEnv(candidates, env.LOCALAPPDATA, \"opencode\", \"config.json\");\n\tappendFromEnv(candidates, env.LOCALAPPDATA, \"opencode\", \"opencode.jsonc\");\n\tappendFromEnv(candidates, env.LOCALAPPDATA, \"opencode\", \"opencode.json\");\n\n\tcandidates.push(\n\t\tjoin(homePath, \".config\", \"opencode\", \"config.json\"),\n\t\tjoin(homePath, \".config\", \"opencode\", \"opencode.jsonc\"),\n\t\tjoin(homePath, \".config\", \"opencode\", \"opencode.json\"),\n\t\tjoin(homePath, \".opencode\", \"opencode.jsonc\"),\n\t\tjoin(homePath, \".opencode\", \"opencode.json\"),\n\t);\n\n\treturn uniquePaths(candidates);\n}\n\nexport function getOpenCodeModelStatePathCandidates(input: Omit<OpenCodePathCandidatesInput, \"explicitPath\"> = {}): string[] {\n\tconst env = input.env ?? process.env;\n\tconst homePath = input.homePath ?? homedir();\n\tconst candidates: string[] = [];\n\n\tappendFromEnv(candidates, env.LOCALAPPDATA, \"opencode\", \"state\", \"model.json\");\n\tappendFromEnv(candidates, env.APPDATA, \"opencode\", \"state\", \"model.json\");\n\tcandidates.push(join(homePath, \".local\", \"state\", \"opencode\", \"model.json\"));\n\n\treturn uniquePaths(candidates);\n}\n\nexport function getOpenCodeAuthPathCandidates(input: Omit<OpenCodePathCandidatesInput, \"explicitPath\"> = {}): string[] {\n\tconst env = input.env ?? process.env;\n\tconst homePath = input.homePath ?? homedir();\n\tconst candidates: string[] = [];\n\n\tappendFromEnv(candidates, env.APPDATA, \"opencode\", \"auth.json\");\n\tappendFromEnv(candidates, env.LOCALAPPDATA, \"opencode\", \"auth.json\");\n\tcandidates.push(join(homePath, \".local\", \"share\", \"opencode\", \"auth.json\"));\n\n\treturn uniquePaths(candidates);\n}\n"]}
@@ -1 +1 @@
1
- {"version":3,"file":"task-start-setup-detection.d.ts","sourceRoot":"","sources":["../../src/terminal/task-start-setup-detection.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,cAAc,EAAE,iCAAiC,EAAE,MAAM,yBAAyB,CAAC;AAuLjG,wBAAgB,gCAAgC,CAAC,eAAe,EAAE,cAAc,GAAG,iCAAiC,CAKnH"}
1
+ {"version":3,"file":"task-start-setup-detection.d.ts","sourceRoot":"","sources":["../../src/terminal/task-start-setup-detection.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,cAAc,EAAE,iCAAiC,EAAE,MAAM,yBAAyB,CAAC;AAwKjG,wBAAgB,gCAAgC,CAAC,eAAe,EAAE,cAAc,GAAG,iCAAiC,CAKnH"}
@@ -2,6 +2,7 @@ import { existsSync, readFileSync } from "node:fs";
2
2
  import { homedir } from "node:os";
3
3
  import { join } from "node:path";
4
4
  import { isCommandAvailable } from "./command-discovery.js";
5
+ import { getOpenCodeConfigPathCandidates } from "./opencode-paths.js";
5
6
  function isRecord(value) {
6
7
  return typeof value === "object" && value !== null && !Array.isArray(value);
7
8
  }
@@ -126,15 +127,6 @@ function hasClaudeMcpServer(serverName) {
126
127
  }
127
128
  return false;
128
129
  }
129
- function getOpenCodeConfigPaths() {
130
- const paths = [];
131
- const explicitPath = process.env.OPENCODE_CONFIG?.trim();
132
- if (explicitPath) {
133
- paths.push(explicitPath);
134
- }
135
- paths.push(join(homedir(), ".config", "opencode", "config.json"), join(homedir(), ".config", "opencode", "opencode.jsonc"), join(homedir(), ".config", "opencode", "opencode.json"), join(homedir(), ".opencode", "opencode.jsonc"), join(homedir(), ".opencode", "opencode.json"));
136
- return paths;
137
- }
138
130
  function hasAgentMcpServer(agentId, serverName) {
139
131
  switch (agentId) {
140
132
  case "claude":
@@ -148,7 +140,7 @@ function hasAgentMcpServer(agentId, serverName) {
148
140
  case "gemini":
149
141
  return hasJsonObjectKey(readFirstExistingFile([join(homedir(), ".gemini", "settings.json")]), "mcpServers", serverName);
150
142
  case "opencode":
151
- return hasJsonObjectKey(readFirstExistingFile(getOpenCodeConfigPaths()), "mcp", serverName);
143
+ return hasJsonObjectKey(readFirstExistingFile(getOpenCodeConfigPathCandidates()), "mcp", serverName);
152
144
  default:
153
145
  return false;
154
146
  }
@@ -1 +1 @@
1
- {"version":3,"file":"task-start-setup-detection.js","sourceRoot":"","sources":["../../src/terminal/task-start-setup-detection.ts"],"names":[],"mappings":"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","sourcesContent":["import { existsSync, readFileSync } from \"node:fs\";\nimport { homedir } from \"node:os\";\nimport { join } from \"node:path\";\n\nimport type { RuntimeAgentId, RuntimeTaskStartSetupAvailability } from \"../core/api-contract.js\";\nimport { isCommandAvailable } from \"./command-discovery.js\";\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n\treturn typeof value === \"object\" && value !== null && !Array.isArray(value);\n}\n\nfunction stripJsonComments(input: string): string {\n\tlet output = \"\";\n\tlet inString = false;\n\tlet escaped = false;\n\tlet inLineComment = false;\n\tlet inBlockComment = false;\n\n\tfor (let index = 0; index < input.length; index += 1) {\n\t\tconst current = input[index];\n\t\tconst next = index + 1 < input.length ? input[index + 1] : \"\";\n\n\t\tif (inLineComment) {\n\t\t\tif (current === \"\\n\") {\n\t\t\t\tinLineComment = false;\n\t\t\t\toutput += current;\n\t\t\t}\n\t\t\tcontinue;\n\t\t}\n\t\tif (inBlockComment) {\n\t\t\tif (current === \"*\" && next === \"/\") {\n\t\t\t\tinBlockComment = false;\n\t\t\t\tindex += 1;\n\t\t\t}\n\t\t\tcontinue;\n\t\t}\n\t\tif (!inString && current === \"/\" && next === \"/\") {\n\t\t\tinLineComment = true;\n\t\t\tindex += 1;\n\t\t\tcontinue;\n\t\t}\n\t\tif (!inString && current === \"/\" && next === \"*\") {\n\t\t\tinBlockComment = true;\n\t\t\tindex += 1;\n\t\t\tcontinue;\n\t\t}\n\n\t\toutput += current;\n\t\tif (inString) {\n\t\t\tif (escaped) {\n\t\t\t\tescaped = false;\n\t\t\t} else if (current === \"\\\\\") {\n\t\t\t\tescaped = true;\n\t\t\t} else if (current === '\"') {\n\t\t\t\tinString = false;\n\t\t\t}\n\t\t\tcontinue;\n\t\t}\n\t\tif (current === '\"') {\n\t\t\tinString = true;\n\t\t}\n\t}\n\n\treturn output;\n}\n\nfunction readFirstExistingFile(paths: string[]): string | null {\n\tfor (const path of paths) {\n\t\ttry {\n\t\t\tif (existsSync(path)) {\n\t\t\t\treturn readFileSync(path, \"utf8\");\n\t\t\t}\n\t\t} catch {}\n\t}\n\treturn null;\n}\n\nfunction parseJsonLike(raw: string | null): unknown {\n\tif (!raw) {\n\t\treturn null;\n\t}\n\ttry {\n\t\treturn JSON.parse(raw);\n\t} catch {\n\t\ttry {\n\t\t\treturn JSON.parse(stripJsonComments(raw));\n\t\t} catch {\n\t\t\treturn null;\n\t\t}\n\t}\n}\n\nfunction hasJsonObjectKey(raw: string | null, parentKey: string, childKey: string): boolean {\n\tconst parsed = parseJsonLike(raw);\n\tif (!isRecord(parsed)) {\n\t\treturn false;\n\t}\n\tconst parent = parsed[parentKey];\n\treturn isRecord(parent) && Object.hasOwn(parent, childKey);\n}\n\nfunction escapeRegex(value: string): string {\n\treturn value.replace(/[.*+?^${}()|[\\]\\\\]/g, \"\\\\$&\");\n}\n\nfunction hasCodexMcpServer(serverName: string): boolean {\n\tconst raw = readFirstExistingFile([join(homedir(), \".codex\", \"config.toml\")]);\n\tif (!raw) {\n\t\treturn false;\n\t}\n\tconst pattern = new RegExp(`^\\\\[mcp_servers\\\\.${escapeRegex(serverName)}\\\\]\\\\s*$`, \"m\");\n\treturn pattern.test(raw);\n}\n\nfunction hasClaudeMcpServer(serverName: string): boolean {\n\tconst parsed = parseJsonLike(readFirstExistingFile([join(homedir(), \".claude.json\")]));\n\tif (!parsed) {\n\t\treturn false;\n\t}\n\n\tconst stack: unknown[] = [parsed];\n\twhile (stack.length > 0) {\n\t\tconst current = stack.pop();\n\t\tif (Array.isArray(current)) {\n\t\t\tstack.push(...current);\n\t\t\tcontinue;\n\t\t}\n\t\tif (!isRecord(current)) {\n\t\t\tcontinue;\n\t\t}\n\t\tconst mcpServers = current.mcpServers;\n\t\tif (isRecord(mcpServers) && Object.hasOwn(mcpServers, serverName)) {\n\t\t\treturn true;\n\t\t}\n\t\tstack.push(...Object.values(current));\n\t}\n\n\treturn false;\n}\n\nfunction getOpenCodeConfigPaths(): string[] {\n\tconst paths: string[] = [];\n\tconst explicitPath = process.env.OPENCODE_CONFIG?.trim();\n\tif (explicitPath) {\n\t\tpaths.push(explicitPath);\n\t}\n\tpaths.push(\n\t\tjoin(homedir(), \".config\", \"opencode\", \"config.json\"),\n\t\tjoin(homedir(), \".config\", \"opencode\", \"opencode.jsonc\"),\n\t\tjoin(homedir(), \".config\", \"opencode\", \"opencode.json\"),\n\t\tjoin(homedir(), \".opencode\", \"opencode.jsonc\"),\n\t\tjoin(homedir(), \".opencode\", \"opencode.json\"),\n\t);\n\treturn paths;\n}\n\nfunction hasAgentMcpServer(agentId: RuntimeAgentId, serverName: \"linear\"): boolean {\n\tswitch (agentId) {\n\t\tcase \"claude\":\n\t\t\treturn hasClaudeMcpServer(serverName);\n\t\tcase \"cline\":\n\t\t\treturn hasJsonObjectKey(\n\t\t\t\treadFirstExistingFile([join(homedir(), \".cline\", \"data\", \"settings\", \"cline_mcp_settings.json\")]),\n\t\t\t\t\"mcpServers\",\n\t\t\t\tserverName,\n\t\t\t);\n\t\tcase \"codex\":\n\t\t\treturn hasCodexMcpServer(serverName);\n\t\tcase \"droid\":\n\t\t\treturn hasJsonObjectKey(\n\t\t\t\treadFirstExistingFile([join(homedir(), \".factory\", \"mcp.json\")]),\n\t\t\t\t\"mcpServers\",\n\t\t\t\tserverName,\n\t\t\t);\n\t\tcase \"gemini\":\n\t\t\treturn hasJsonObjectKey(\n\t\t\t\treadFirstExistingFile([join(homedir(), \".gemini\", \"settings.json\")]),\n\t\t\t\t\"mcpServers\",\n\t\t\t\tserverName,\n\t\t\t);\n\t\tcase \"opencode\":\n\t\t\treturn hasJsonObjectKey(readFirstExistingFile(getOpenCodeConfigPaths()), \"mcp\", serverName);\n\t\tdefault:\n\t\t\treturn false;\n\t}\n}\n\nexport function detectTaskStartSetupAvailability(selectedAgentId: RuntimeAgentId): RuntimeTaskStartSetupAvailability {\n\treturn {\n\t\tgithubCli: isCommandAvailable(\"gh\"),\n\t\tlinearMcp: hasAgentMcpServer(selectedAgentId, \"linear\"),\n\t};\n}\n"]}
1
+ {"version":3,"file":"task-start-setup-detection.js","sourceRoot":"","sources":["../../src/terminal/task-start-setup-detection.ts"],"names":[],"mappings":"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","sourcesContent":["import { existsSync, readFileSync } from \"node:fs\";\nimport { homedir } from \"node:os\";\nimport { join } from \"node:path\";\n\nimport type { RuntimeAgentId, RuntimeTaskStartSetupAvailability } from \"../core/api-contract.js\";\nimport { isCommandAvailable } from \"./command-discovery.js\";\nimport { getOpenCodeConfigPathCandidates } from \"./opencode-paths.js\";\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n\treturn typeof value === \"object\" && value !== null && !Array.isArray(value);\n}\n\nfunction stripJsonComments(input: string): string {\n\tlet output = \"\";\n\tlet inString = false;\n\tlet escaped = false;\n\tlet inLineComment = false;\n\tlet inBlockComment = false;\n\n\tfor (let index = 0; index < input.length; index += 1) {\n\t\tconst current = input[index];\n\t\tconst next = index + 1 < input.length ? input[index + 1] : \"\";\n\n\t\tif (inLineComment) {\n\t\t\tif (current === \"\\n\") {\n\t\t\t\tinLineComment = false;\n\t\t\t\toutput += current;\n\t\t\t}\n\t\t\tcontinue;\n\t\t}\n\t\tif (inBlockComment) {\n\t\t\tif (current === \"*\" && next === \"/\") {\n\t\t\t\tinBlockComment = false;\n\t\t\t\tindex += 1;\n\t\t\t}\n\t\t\tcontinue;\n\t\t}\n\t\tif (!inString && current === \"/\" && next === \"/\") {\n\t\t\tinLineComment = true;\n\t\t\tindex += 1;\n\t\t\tcontinue;\n\t\t}\n\t\tif (!inString && current === \"/\" && next === \"*\") {\n\t\t\tinBlockComment = true;\n\t\t\tindex += 1;\n\t\t\tcontinue;\n\t\t}\n\n\t\toutput += current;\n\t\tif (inString) {\n\t\t\tif (escaped) {\n\t\t\t\tescaped = false;\n\t\t\t} else if (current === \"\\\\\") {\n\t\t\t\tescaped = true;\n\t\t\t} else if (current === '\"') {\n\t\t\t\tinString = false;\n\t\t\t}\n\t\t\tcontinue;\n\t\t}\n\t\tif (current === '\"') {\n\t\t\tinString = true;\n\t\t}\n\t}\n\n\treturn output;\n}\n\nfunction readFirstExistingFile(paths: string[]): string | null {\n\tfor (const path of paths) {\n\t\ttry {\n\t\t\tif (existsSync(path)) {\n\t\t\t\treturn readFileSync(path, \"utf8\");\n\t\t\t}\n\t\t} catch {}\n\t}\n\treturn null;\n}\n\nfunction parseJsonLike(raw: string | null): unknown {\n\tif (!raw) {\n\t\treturn null;\n\t}\n\ttry {\n\t\treturn JSON.parse(raw);\n\t} catch {\n\t\ttry {\n\t\t\treturn JSON.parse(stripJsonComments(raw));\n\t\t} catch {\n\t\t\treturn null;\n\t\t}\n\t}\n}\n\nfunction hasJsonObjectKey(raw: string | null, parentKey: string, childKey: string): boolean {\n\tconst parsed = parseJsonLike(raw);\n\tif (!isRecord(parsed)) {\n\t\treturn false;\n\t}\n\tconst parent = parsed[parentKey];\n\treturn isRecord(parent) && Object.hasOwn(parent, childKey);\n}\n\nfunction escapeRegex(value: string): string {\n\treturn value.replace(/[.*+?^${}()|[\\]\\\\]/g, \"\\\\$&\");\n}\n\nfunction hasCodexMcpServer(serverName: string): boolean {\n\tconst raw = readFirstExistingFile([join(homedir(), \".codex\", \"config.toml\")]);\n\tif (!raw) {\n\t\treturn false;\n\t}\n\tconst pattern = new RegExp(`^\\\\[mcp_servers\\\\.${escapeRegex(serverName)}\\\\]\\\\s*$`, \"m\");\n\treturn pattern.test(raw);\n}\n\nfunction hasClaudeMcpServer(serverName: string): boolean {\n\tconst parsed = parseJsonLike(readFirstExistingFile([join(homedir(), \".claude.json\")]));\n\tif (!parsed) {\n\t\treturn false;\n\t}\n\n\tconst stack: unknown[] = [parsed];\n\twhile (stack.length > 0) {\n\t\tconst current = stack.pop();\n\t\tif (Array.isArray(current)) {\n\t\t\tstack.push(...current);\n\t\t\tcontinue;\n\t\t}\n\t\tif (!isRecord(current)) {\n\t\t\tcontinue;\n\t\t}\n\t\tconst mcpServers = current.mcpServers;\n\t\tif (isRecord(mcpServers) && Object.hasOwn(mcpServers, serverName)) {\n\t\t\treturn true;\n\t\t}\n\t\tstack.push(...Object.values(current));\n\t}\n\n\treturn false;\n}\n\nfunction hasAgentMcpServer(agentId: RuntimeAgentId, serverName: \"linear\"): boolean {\n\tswitch (agentId) {\n\t\tcase \"claude\":\n\t\t\treturn hasClaudeMcpServer(serverName);\n\t\tcase \"cline\":\n\t\t\treturn hasJsonObjectKey(\n\t\t\t\treadFirstExistingFile([join(homedir(), \".cline\", \"data\", \"settings\", \"cline_mcp_settings.json\")]),\n\t\t\t\t\"mcpServers\",\n\t\t\t\tserverName,\n\t\t\t);\n\t\tcase \"codex\":\n\t\t\treturn hasCodexMcpServer(serverName);\n\t\tcase \"droid\":\n\t\t\treturn hasJsonObjectKey(\n\t\t\t\treadFirstExistingFile([join(homedir(), \".factory\", \"mcp.json\")]),\n\t\t\t\t\"mcpServers\",\n\t\t\t\tserverName,\n\t\t\t);\n\t\tcase \"gemini\":\n\t\t\treturn hasJsonObjectKey(\n\t\t\t\treadFirstExistingFile([join(homedir(), \".gemini\", \"settings.json\")]),\n\t\t\t\t\"mcpServers\",\n\t\t\t\tserverName,\n\t\t\t);\n\t\tcase \"opencode\":\n\t\t\treturn hasJsonObjectKey(readFirstExistingFile(getOpenCodeConfigPathCandidates()), \"mcp\", serverName);\n\t\tdefault:\n\t\t\treturn false;\n\t}\n}\n\nexport function detectTaskStartSetupAvailability(selectedAgentId: RuntimeAgentId): RuntimeTaskStartSetupAvailability {\n\treturn {\n\t\tgithubCli: isCommandAvailable(\"gh\"),\n\t\tlinearMcp: hasAgentMcpServer(selectedAgentId, \"linear\"),\n\t};\n}\n"]}