kanban 0.1.47 → 0.1.49
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/commands/hooks.d.ts +4 -0
- package/dist/commands/hooks.d.ts.map +1 -1
- package/dist/commands/hooks.js +18 -3
- package/dist/commands/hooks.js.map +1 -1
- package/dist/core/windows-cmd-launch.d.ts +5 -0
- package/dist/core/windows-cmd-launch.d.ts.map +1 -0
- package/dist/core/windows-cmd-launch.js +48 -0
- package/dist/core/windows-cmd-launch.js.map +1 -0
- package/dist/prompts/append-system-prompt.d.ts.map +1 -1
- package/dist/prompts/append-system-prompt.js +10 -3
- package/dist/prompts/append-system-prompt.js.map +1 -1
- package/dist/terminal/pty-session.d.ts.map +1 -1
- package/dist/terminal/pty-session.js +4 -41
- package/dist/terminal/pty-session.js.map +1 -1
- package/dist/web-ui/assets/{index-DGw_f0VG.js → index-CZZYlM1g.js} +1942 -1942
- package/dist/web-ui/assets/{index-DGw_f0VG.js.map → index-CZZYlM1g.js.map} +1 -1
- package/dist/web-ui/index.html +1 -1
- package/package.json +4 -4
package/dist/commands/hooks.d.ts
CHANGED
|
@@ -17,6 +17,10 @@ export declare function parseCodexEventLine(line: string, state: CodexWatcherSta
|
|
|
17
17
|
metadata?: Partial<RuntimeTaskHookActivity>;
|
|
18
18
|
} | null;
|
|
19
19
|
export declare function buildCodexWrapperChildArgs(agentArgs: string[], shouldWatchSessionLog: boolean): string[];
|
|
20
|
+
export declare function buildCodexWrapperSpawn(realBinary: string, agentArgs: string[], shouldWatchSessionLog: boolean, platform?: NodeJS.Platform, env?: NodeJS.ProcessEnv): {
|
|
21
|
+
binary: string;
|
|
22
|
+
args: string[];
|
|
23
|
+
};
|
|
20
24
|
export declare function registerHooksCommand(program: Command): void;
|
|
21
25
|
export {};
|
|
22
26
|
//# sourceMappingURL=hooks.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"hooks.d.ts","sourceRoot":"","sources":["../../src/commands/hooks.ts"],"names":[],"mappings":"AAMA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAEzC,OAAO,KAAK,EAAE,gBAAgB,EAAE,uBAAuB,EAAE,MAAM,yBAAyB,CAAC;
|
|
1
|
+
{"version":3,"file":"hooks.d.ts","sourceRoot":"","sources":["../../src/commands/hooks.ts"],"names":[],"mappings":"AAMA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAEzC,OAAO,KAAK,EAAE,gBAAgB,EAAE,uBAAuB,EAAE,MAAM,yBAAyB,CAAC;AAmCzF,UAAU,iBAAiB;IAC1B,UAAU,EAAE,MAAM,CAAC;IACnB,cAAc,EAAE,MAAM,CAAC;IACvB,cAAc,EAAE,MAAM,CAAC;IACvB,uBAAuB,EAAE,MAAM,CAAC;IAChC,mBAAmB,EAAE,MAAM,CAAC;IAC5B,MAAM,EAAE,MAAM,CAAC;IACf,SAAS,EAAE,MAAM,CAAC;IAClB,mBAAmB,EAAE,SAAS,GAAG,MAAM,GAAG,YAAY,CAAC;CACvD;AAuRD,wBAAgB,0BAA0B,CAAC,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,IAAI,GAAG,MAAM,GAAG,IAAI,CAajG;AA8QD,wBAAgB,uBAAuB,IAAI,iBAAiB,CAW3D;AAED,wBAAgB,mBAAmB,CAClC,IAAI,EAAE,MAAM,EACZ,KAAK,EAAE,iBAAiB,GACtB;IAAE,KAAK,EAAE,gBAAgB,CAAC;IAAC,QAAQ,CAAC,EAAE,OAAO,CAAC,uBAAuB,CAAC,CAAA;CAAE,GAAG,IAAI,CA6MjF;AA4ID,wBAAgB,0BAA0B,CAAC,SAAS,EAAE,MAAM,EAAE,EAAE,qBAAqB,EAAE,OAAO,GAAG,MAAM,EAAE,CAiBxG;AAED,wBAAgB,sBAAsB,CACrC,UAAU,EAAE,MAAM,EAClB,SAAS,EAAE,MAAM,EAAE,EACnB,qBAAqB,EAAE,OAAO,EAC9B,QAAQ,GAAE,MAAM,CAAC,QAA2B,EAC5C,GAAG,GAAE,MAAM,CAAC,UAAwB,GAClC;IAAE,MAAM,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,EAAE,CAAA;CAAE,CAYpC;AAwGD,wBAAgB,oBAAoB,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,CA6D3D"}
|
package/dist/commands/hooks.js
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
|
|
2
|
-
!function(){try{var e="undefined"!=typeof window?window:"undefined"!=typeof global?global:"undefined"!=typeof globalThis?globalThis:"undefined"!=typeof self?self:{},n=(new e.Error).stack;n&&(e._sentryDebugIds=e._sentryDebugIds||{},e._sentryDebugIds[n]="
|
|
2
|
+
!function(){try{var e="undefined"!=typeof window?window:"undefined"!=typeof global?global:"undefined"!=typeof globalThis?globalThis:"undefined"!=typeof self?self:{},n=(new e.Error).stack;n&&(e._sentryDebugIds=e._sentryDebugIds||{},e._sentryDebugIds[n]="a2b5534c-7970-5905-8b30-351d0e0310d7")}catch(e){}}();
|
|
3
3
|
import { spawn } from "node:child_process";
|
|
4
4
|
import { access, open, stat } from "node:fs/promises";
|
|
5
5
|
import { tmpdir } from "node:os";
|
|
@@ -7,6 +7,7 @@ import { join } from "node:path";
|
|
|
7
7
|
import { createTRPCProxyClient, httpBatchLink, TRPCClientError } from "@trpc/client";
|
|
8
8
|
import { buildKanbanCommandParts } from "../core/kanban-command.js";
|
|
9
9
|
import { buildKanbanRuntimeUrl } from "../core/runtime-endpoint.js";
|
|
10
|
+
import { buildWindowsCmdArgsArray, resolveWindowsComSpec, shouldUseWindowsCmdLaunch } from "../core/windows-cmd-launch.js";
|
|
10
11
|
import { parseHookRuntimeContextFromEnv } from "../terminal/hook-runtime-context.js";
|
|
11
12
|
const VALID_EVENTS = new Set(["to_review", "to_in_progress", "activity"]);
|
|
12
13
|
const CODEX_LOG_WAIT_ATTEMPTS = 200;
|
|
@@ -837,6 +838,19 @@ export function buildCodexWrapperChildArgs(agentArgs, shouldWatchSessionLog) {
|
|
|
837
838
|
childArgs.unshift("-c");
|
|
838
839
|
return childArgs;
|
|
839
840
|
}
|
|
841
|
+
export function buildCodexWrapperSpawn(realBinary, agentArgs, shouldWatchSessionLog, platform = process.platform, env = process.env) {
|
|
842
|
+
const childArgs = buildCodexWrapperChildArgs(agentArgs, shouldWatchSessionLog);
|
|
843
|
+
if (!shouldUseWindowsCmdLaunch(realBinary, platform, env)) {
|
|
844
|
+
return {
|
|
845
|
+
binary: realBinary,
|
|
846
|
+
args: childArgs,
|
|
847
|
+
};
|
|
848
|
+
}
|
|
849
|
+
return {
|
|
850
|
+
binary: resolveWindowsComSpec(env),
|
|
851
|
+
args: buildWindowsCmdArgsArray(realBinary, childArgs),
|
|
852
|
+
};
|
|
853
|
+
}
|
|
840
854
|
async function runCodexWrapperSubcommand(wrapperArgs) {
|
|
841
855
|
const childEnv = { ...process.env };
|
|
842
856
|
let shuttingDown = false;
|
|
@@ -868,7 +882,8 @@ async function runCodexWrapperSubcommand(wrapperArgs) {
|
|
|
868
882
|
})();
|
|
869
883
|
}
|
|
870
884
|
}
|
|
871
|
-
const
|
|
885
|
+
const childLaunch = buildCodexWrapperSpawn(wrapperArgs.realBinary, wrapperArgs.agentArgs, shouldWatchSessionLog);
|
|
886
|
+
const child = spawn(childLaunch.binary, childLaunch.args, {
|
|
872
887
|
stdio: "inherit",
|
|
873
888
|
env: childEnv,
|
|
874
889
|
});
|
|
@@ -972,4 +987,4 @@ export function registerHooksCommand(program) {
|
|
|
972
987
|
});
|
|
973
988
|
}
|
|
974
989
|
//# sourceMappingURL=hooks.js.map
|
|
975
|
-
//# debugId=
|
|
990
|
+
//# debugId=a2b5534c-7970-5905-8b30-351d0e0310d7
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"hooks.js","sources":["../../src/commands/hooks.ts"],"sourceRoot":"","sourcesContent":["import { spawn } from \"node:child_process\";\nimport type { Stats } from \"node:fs\";\nimport { access, open, stat } from \"node:fs/promises\";\nimport { tmpdir } from \"node:os\";\nimport { join } from \"node:path\";\nimport { createTRPCProxyClient, httpBatchLink, TRPCClientError } from \"@trpc/client\";\nimport type { Command } from \"commander\";\n\nimport type { RuntimeHookEvent, RuntimeTaskHookActivity } from \"../core/api-contract.js\";\nimport { buildKanbanCommandParts } from \"../core/kanban-command.js\";\nimport { buildKanbanRuntimeUrl } from \"../core/runtime-endpoint.js\";\nimport { parseHookRuntimeContextFromEnv } from \"../terminal/hook-runtime-context.js\";\nimport type { RuntimeAppRouter } from \"../trpc/app-router.js\";\n\nconst VALID_EVENTS = new Set<RuntimeHookEvent>([\"to_review\", \"to_in_progress\", \"activity\"]);\nconst CODEX_LOG_WAIT_ATTEMPTS = 200;\nconst CODEX_LOG_WAIT_DELAY_MS = 50;\nconst CODEX_LOG_POLL_INTERVAL_MS = 200;\nconst MAX_ACTIVITY_TEXT_LENGTH = 200;\n\ninterface HooksIngestArgs {\n\tevent: RuntimeHookEvent;\n\ttaskId: string;\n\tworkspaceId: string;\n\tmetadata?: Partial<RuntimeTaskHookActivity>;\n}\n\ninterface HookCommandMetadataOptionValues {\n\tsource?: string;\n\tactivityText?: string;\n\ttoolName?: string;\n\tfinalMessage?: string;\n\thookEventName?: string;\n\tnotificationType?: string;\n\tmetadataBase64?: string;\n}\n\ninterface CodexWrapperArgs {\n\trealBinary: string;\n\tagentArgs: string[];\n}\n\ninterface CodexWatcherState {\n\tlastTurnId: string;\n\tlastApprovalId: string;\n\tlastExecCallId: string;\n\tlastActivityFingerprint: string;\n\tapprovalFallbackSeq: number;\n\toffset: number;\n\tremainder: string;\n\tcurrentSessionScope: \"unknown\" | \"root\" | \"descendant\";\n}\n\ninterface CodexEventPayload {\n\ttype?: unknown;\n\tturn_id?: unknown;\n\tid?: unknown;\n\tapproval_id?: unknown;\n\tcall_id?: unknown;\n\tlast_agent_message?: unknown;\n\tmessage?: unknown;\n\tcommand?: unknown;\n\titem?: unknown;\n}\n\ninterface CodexSessionLogLine {\n\tdir?: unknown;\n\tkind?: unknown;\n\tmsg?: unknown;\n\tpayload?: unknown;\n\tturn_id?: unknown;\n\tid?: unknown;\n\tapproval_id?: unknown;\n\tcall_id?: unknown;\n}\n\nfunction formatError(error: unknown): string {\n\tif (error instanceof TRPCClientError) {\n\t\treturn error.message;\n\t}\n\tif (error instanceof Error) {\n\t\treturn error.message;\n\t}\n\treturn String(error);\n}\n\nasync function withTimeout<T>(promise: Promise<T>, timeoutMs: number, label: string): Promise<T> {\n\tlet timeoutHandle: NodeJS.Timeout | null = null;\n\tconst timeoutPromise = new Promise<never>((_, reject) => {\n\t\ttimeoutHandle = setTimeout(() => {\n\t\t\treject(new Error(`${label} timed out after ${timeoutMs}ms`));\n\t\t}, timeoutMs);\n\t});\n\ttry {\n\t\treturn await Promise.race([promise, timeoutPromise]);\n\t} finally {\n\t\tif (timeoutHandle) {\n\t\t\tclearTimeout(timeoutHandle);\n\t\t}\n\t}\n}\n\nasync function sleep(ms: number): Promise<void> {\n\tawait new Promise((resolve) => {\n\t\tsetTimeout(resolve, ms);\n\t});\n}\n\nfunction parseHookEvent(value: string): RuntimeHookEvent {\n\tif (!VALID_EVENTS.has(value as RuntimeHookEvent)) {\n\t\tthrow new Error(`Invalid event \"${value}\". Must be one of: ${[...VALID_EVENTS].join(\", \")}`);\n\t}\n\treturn value as RuntimeHookEvent;\n}\n\nfunction normalizeWhitespace(value: string): string {\n\treturn value.replace(/\\s+/g, \" \").trim();\n}\n\nfunction truncateText(value: string, maxLength: number): string {\n\tif (value.length <= maxLength) {\n\t\treturn value;\n\t}\n\treturn `${value.slice(0, Math.max(0, maxLength - 1)).trimEnd()}…`;\n}\n\nfunction asRecord(value: unknown): Record<string, unknown> | null {\n\tif (!value || typeof value !== \"object\" || Array.isArray(value)) {\n\t\treturn null;\n\t}\n\treturn value as Record<string, unknown>;\n}\n\nfunction readStringField(record: Record<string, unknown>, key: string): string | null {\n\tconst value = record[key];\n\tif (typeof value !== \"string\") {\n\t\treturn null;\n\t}\n\tconst normalized = normalizeWhitespace(value);\n\treturn normalized.length > 0 ? normalized : null;\n}\n\nfunction readNestedString(record: Record<string, unknown>, path: string[]): string | null {\n\tlet current: unknown = record;\n\tfor (const key of path) {\n\t\tconst candidate = asRecord(current);\n\t\tif (!candidate || !(key in candidate)) {\n\t\t\treturn null;\n\t\t}\n\t\tcurrent = candidate[key];\n\t}\n\tif (typeof current !== \"string\") {\n\t\treturn null;\n\t}\n\tconst normalized = normalizeWhitespace(current);\n\treturn normalized.length > 0 ? normalized : null;\n}\n\nfunction parseJsonObject(value: string): Record<string, unknown> | null {\n\ttry {\n\t\treturn asRecord(JSON.parse(value));\n\t} catch {\n\t\treturn null;\n\t}\n}\n\nfunction parseMetadataFromOptions(options: HookCommandMetadataOptionValues): Partial<RuntimeTaskHookActivity> {\n\tconst metadata: Partial<RuntimeTaskHookActivity> = {};\n\tconst activityText = options.activityText;\n\tconst toolName = options.toolName;\n\tconst finalMessage = options.finalMessage;\n\tconst hookEventName = options.hookEventName;\n\tconst notificationType = options.notificationType;\n\tconst source = options.source;\n\n\tif (activityText) {\n\t\tmetadata.activityText = truncateText(normalizeWhitespace(activityText), MAX_ACTIVITY_TEXT_LENGTH);\n\t}\n\tif (toolName) {\n\t\tmetadata.toolName = truncateText(normalizeWhitespace(toolName), 120);\n\t}\n\tif (finalMessage) {\n\t\tmetadata.finalMessage = normalizeWhitespace(finalMessage);\n\t}\n\tif (hookEventName) {\n\t\tmetadata.hookEventName = truncateText(normalizeWhitespace(hookEventName), 120);\n\t}\n\tif (notificationType) {\n\t\tmetadata.notificationType = truncateText(normalizeWhitespace(notificationType), 120);\n\t}\n\tif (source) {\n\t\tmetadata.source = truncateText(normalizeWhitespace(source), 64);\n\t}\n\n\treturn metadata;\n}\n\nfunction parseMetadataFromBase64(encoded: string | undefined): Record<string, unknown> | null {\n\tif (!encoded) {\n\t\treturn null;\n\t}\n\ttry {\n\t\treturn asRecord(JSON.parse(Buffer.from(encoded, \"base64\").toString(\"utf8\")));\n\t} catch {\n\t\treturn null;\n\t}\n}\n\nfunction extractToolInput(payload: Record<string, unknown>): Record<string, unknown> | null {\n\tconst direct = asRecord(payload.tool_input);\n\tif (direct) {\n\t\treturn direct;\n\t}\n\tconst preTool = asRecord(payload.preToolUse);\n\tconst preParams = preTool ? asRecord(preTool.parameters) : null;\n\tif (preParams) {\n\t\treturn preParams;\n\t}\n\tconst postTool = asRecord(payload.postToolUse);\n\tconst postParams = postTool ? asRecord(postTool.parameters) : null;\n\tif (postParams) {\n\t\treturn postParams;\n\t}\n\tconst output = asRecord(payload.output);\n\tconst outputArgs = output ? asRecord(output.args) : null;\n\treturn outputArgs;\n}\n\nfunction describeToolOperation(toolName: string | null, toolInput: Record<string, unknown> | null): string | null {\n\tif (!toolName || !toolInput) {\n\t\treturn null;\n\t}\n\n\tconst command =\n\t\treadStringField(toolInput, \"command\") ??\n\t\treadStringField(toolInput, \"cmd\") ??\n\t\treadStringField(toolInput, \"query\") ??\n\t\treadStringField(toolInput, \"description\");\n\tif (command) {\n\t\treturn `${toolName}: ${truncateText(command, 120)}`;\n\t}\n\n\tconst filePath =\n\t\treadStringField(toolInput, \"file_path\") ??\n\t\treadStringField(toolInput, \"filePath\") ??\n\t\treadStringField(toolInput, \"path\");\n\tif (filePath) {\n\t\treturn `${toolName}: ${truncateText(filePath, 120)}`;\n\t}\n\n\treturn toolName;\n}\n\nfunction inferActivityText(\n\tevent: RuntimeHookEvent,\n\tpayload: Record<string, unknown> | null,\n\ttoolName: string | null,\n\tfinalMessage: string | null,\n\tnotificationType: string | null,\n): string | null {\n\tconst hookEventName = payload\n\t\t? (readStringField(payload, \"hook_event_name\") ??\n\t\t\treadStringField(payload, \"hookEventName\") ??\n\t\t\treadStringField(payload, \"hookName\"))\n\t\t: null;\n\tconst normalizedHookEvent = hookEventName?.toLowerCase() ?? \"\";\n\tconst codexType = payload ? readStringField(payload, \"type\") : null;\n\tconst normalizedCodexType = codexType?.toLowerCase() ?? \"\";\n\tconst toolInput = payload ? extractToolInput(payload) : null;\n\tconst toolOperation = describeToolOperation(toolName, toolInput);\n\n\tif (normalizedCodexType === \"task_started\") {\n\t\treturn \"Working on task\";\n\t}\n\tif (normalizedCodexType === \"exec_command_begin\") {\n\t\treturn \"Running command\";\n\t}\n\tif (normalizedCodexType.endsWith(\"_approval_request\")) {\n\t\treturn \"Waiting for approval\";\n\t}\n\n\tif (normalizedHookEvent === \"pretooluse\" || normalizedHookEvent === \"beforetool\") {\n\t\treturn toolOperation ? `Using ${toolOperation}` : \"Using tool\";\n\t}\n\tif (normalizedHookEvent === \"posttooluse\" || normalizedHookEvent === \"aftertool\") {\n\t\treturn toolOperation ? `Completed ${toolOperation}` : \"Completed tool\";\n\t}\n\tif (normalizedHookEvent === \"posttoolusefailure\") {\n\t\tconst error = payload ? readStringField(payload, \"error\") : null;\n\t\tif (toolOperation && error) {\n\t\t\treturn `Failed ${toolOperation}: ${truncateText(error, 100)}`;\n\t\t}\n\t\tif (toolOperation) {\n\t\t\treturn `Failed ${toolOperation}`;\n\t\t}\n\t\treturn error ? `Tool failed: ${truncateText(error, 100)}` : \"Tool failed\";\n\t}\n\tif (normalizedHookEvent === \"permissionrequest\") {\n\t\treturn \"Waiting for approval\";\n\t}\n\tif (normalizedHookEvent === \"userpromptsubmit\" || normalizedHookEvent === \"beforeagent\") {\n\t\treturn \"Resumed after user input\";\n\t}\n\tif (\n\t\tnormalizedHookEvent === \"stop\" ||\n\t\tnormalizedHookEvent === \"subagentstop\" ||\n\t\tnormalizedHookEvent === \"afteragent\"\n\t) {\n\t\treturn finalMessage ? `Final: ${truncateText(finalMessage, 140)}` : null;\n\t}\n\tif (normalizedHookEvent === \"taskcomplete\") {\n\t\treturn finalMessage ? `Final: ${truncateText(finalMessage, 140)}` : null;\n\t}\n\n\tif (notificationType === \"permission_prompt\" || notificationType === \"permission.asked\") {\n\t\treturn \"Waiting for approval\";\n\t}\n\tif (notificationType === \"user_attention\") {\n\t\treturn null;\n\t}\n\n\tif (event === \"to_review\") {\n\t\treturn null;\n\t}\n\tif (event === \"to_in_progress\") {\n\t\treturn \"Agent active\";\n\t}\n\treturn null;\n}\n\nexport function inferHookSourceFromPayload(payload: Record<string, unknown> | null): string | null {\n\tconst transcriptPath = payload ? readStringField(payload, \"transcript_path\") : null;\n\tconst normalizedTranscriptPath = transcriptPath?.replaceAll(\"\\\\\", \"/\").toLowerCase() ?? null;\n\tif (normalizedTranscriptPath?.includes(\"/.claude/\")) {\n\t\treturn \"claude\";\n\t}\n\tif (normalizedTranscriptPath?.includes(\"/.factory/\")) {\n\t\treturn \"droid\";\n\t}\n\tif (payload && readStringField(payload, \"type\") === \"agent-turn-complete\") {\n\t\treturn \"codex\";\n\t}\n\treturn null;\n}\n\nfunction normalizeHookMetadata(\n\tevent: RuntimeHookEvent,\n\tpayload: Record<string, unknown> | null,\n\tflagMetadata: Partial<RuntimeTaskHookActivity>,\n): Partial<RuntimeTaskHookActivity> | undefined {\n\tconst hookEventName = payload\n\t\t? (readStringField(payload, \"hook_event_name\") ??\n\t\t\treadStringField(payload, \"hookEventName\") ??\n\t\t\treadStringField(payload, \"hookName\"))\n\t\t: null;\n\tconst toolName = payload\n\t\t? (readStringField(payload, \"tool_name\") ??\n\t\t\treadNestedString(payload, [\"preToolUse\", \"tool\"]) ??\n\t\t\treadNestedString(payload, [\"preToolUse\", \"toolName\"]) ??\n\t\t\treadNestedString(payload, [\"postToolUse\", \"tool\"]) ??\n\t\t\treadNestedString(payload, [\"postToolUse\", \"toolName\"]) ??\n\t\t\treadNestedString(payload, [\"input\", \"tool\"]))\n\t\t: null;\n\tconst notificationType = payload\n\t\t? (readStringField(payload, \"notification_type\") ??\n\t\t\treadNestedString(payload, [\"event\", \"type\"]) ??\n\t\t\treadNestedString(payload, [\"notification\", \"event\"]))\n\t\t: null;\n\tconst finalMessage = payload\n\t\t? (readStringField(payload, \"last_assistant_message\") ??\n\t\t\treadStringField(payload, \"last-assistant-message\") ??\n\t\t\treadNestedString(payload, [\"taskComplete\", \"taskMetadata\", \"result\"]) ??\n\t\t\treadNestedString(payload, [\"taskComplete\", \"result\"]))\n\t\t: null;\n\n\tconst inferredSource = inferHookSourceFromPayload(payload);\n\n\tconst activityText = inferActivityText(event, payload, toolName, finalMessage, notificationType);\n\tconst merged: Partial<RuntimeTaskHookActivity> = {\n\t\tsource: flagMetadata.source ?? inferredSource ?? null,\n\t\thookEventName: flagMetadata.hookEventName ?? hookEventName ?? null,\n\t\ttoolName: flagMetadata.toolName ?? toolName ?? null,\n\t\tnotificationType: flagMetadata.notificationType ?? notificationType ?? null,\n\t\tfinalMessage:\n\t\t\tflagMetadata.finalMessage ??\n\t\t\t(finalMessage ? normalizeWhitespace(finalMessage) : null),\n\t\tactivityText:\n\t\t\tflagMetadata.activityText ??\n\t\t\t(activityText ? truncateText(normalizeWhitespace(activityText), MAX_ACTIVITY_TEXT_LENGTH) : null),\n\t};\n\n\tconst hasValue = Object.values(merged).some((value) => typeof value === \"string\" && value.trim().length > 0);\n\tif (!hasValue) {\n\t\treturn undefined;\n\t}\n\n\tif (typeof merged.source === \"string\") {\n\t\tmerged.source = truncateText(merged.source, 64);\n\t}\n\tif (typeof merged.hookEventName === \"string\") {\n\t\tmerged.hookEventName = truncateText(merged.hookEventName, 120);\n\t}\n\tif (typeof merged.toolName === \"string\") {\n\t\tmerged.toolName = truncateText(merged.toolName, 120);\n\t}\n\tif (typeof merged.notificationType === \"string\") {\n\t\tmerged.notificationType = truncateText(merged.notificationType, 120);\n\t}\n\n\treturn merged;\n}\n\nfunction parseHooksIngestArgs(\n\tevent: RuntimeHookEvent,\n\toptions: HookCommandMetadataOptionValues,\n\tpayloadArg: string | undefined,\n\tstdinPayload: string,\n): HooksIngestArgs {\n\tconst context = parseHookRuntimeContextFromEnv();\n\tconst flagMetadata = parseMetadataFromOptions(options);\n\tconst payloadFromBase64 = parseMetadataFromBase64(options.metadataBase64);\n\tconst payloadFromStdin = parseJsonObject(stdinPayload.trim());\n\tconst payloadFromArg = payloadArg ? parseJsonObject(payloadArg) : null;\n\tconst payload = payloadFromBase64 ?? payloadFromStdin ?? payloadFromArg;\n\tconst metadata = normalizeHookMetadata(event, payload, flagMetadata);\n\treturn {\n\t\tevent,\n\t\ttaskId: context.taskId,\n\t\tworkspaceId: context.workspaceId,\n\t\tmetadata,\n\t};\n}\n\nasync function ingestHookEvent(args: HooksIngestArgs): Promise<void> {\n\tconst trpcClient = createTRPCProxyClient<RuntimeAppRouter>({\n\t\tlinks: [\n\t\t\thttpBatchLink({\n\t\t\t\turl: buildKanbanRuntimeUrl(\"/api/trpc\"),\n\t\t\t\tmaxItems: 1,\n\t\t\t}),\n\t\t],\n\t});\n\tconst ingestResponse = await withTimeout(\n\t\ttrpcClient.hooks.ingest.mutate({\n\t\t\ttaskId: args.taskId,\n\t\t\tworkspaceId: args.workspaceId,\n\t\t\tevent: args.event,\n\t\t\tmetadata: args.metadata,\n\t\t}),\n\t\t3000,\n\t\t\"kanban hooks ingest\",\n\t);\n\tif (ingestResponse.ok === false) {\n\t\tthrow new Error(ingestResponse.error ?? \"Hook ingest failed\");\n\t}\n}\n\nfunction spawnDetachedKanban(args: string[]): void {\n\ttry {\n\t\tconst commandParts = buildKanbanCommandParts(args);\n\t\tconst child = spawn(commandParts[0], commandParts.slice(1), {\n\t\t\tdetached: true,\n\t\t\tstdio: \"ignore\",\n\t\t\tenv: process.env,\n\t\t});\n\t\tchild.unref();\n\t} catch {\n\t\t// Best effort: hook notification failures should never block agents.\n\t}\n}\n\nfunction appendMetadataFlags(args: string[], metadata?: Partial<RuntimeTaskHookActivity>): string[] {\n\tif (!metadata) {\n\t\treturn args;\n\t}\n\tif (metadata.source) {\n\t\targs.push(\"--source\", metadata.source);\n\t}\n\tif (metadata.activityText) {\n\t\targs.push(\"--activity-text\", metadata.activityText);\n\t}\n\tif (metadata.toolName) {\n\t\targs.push(\"--tool-name\", metadata.toolName);\n\t}\n\tif (metadata.finalMessage) {\n\t\targs.push(\"--final-message\", metadata.finalMessage);\n\t}\n\tif (metadata.hookEventName) {\n\t\targs.push(\"--hook-event-name\", metadata.hookEventName);\n\t}\n\tif (metadata.notificationType) {\n\t\targs.push(\"--notification-type\", metadata.notificationType);\n\t}\n\treturn args;\n}\n\nfunction getString(value: unknown): string {\n\treturn typeof value === \"string\" ? value : \"\";\n}\n\nfunction parseCodexSessionLogLine(line: string): CodexSessionLogLine | null {\n\ttry {\n\t\tconst parsed = JSON.parse(line) as CodexSessionLogLine;\n\t\tconst dir = getString(parsed.dir);\n\t\tconst kind = getString(parsed.kind);\n\t\tconst hasStructuredMsg = Boolean(parsed.msg && typeof parsed.msg === \"object\" && !Array.isArray(parsed.msg));\n\t\tconst isCodexEventLine =\n\t\t\t(kind === \"codex_event\" && (dir === \"to_tui\" || dir === \"\")) ||\n\t\t\t(kind === \"\" && hasStructuredMsg) ||\n\t\t\t(dir === \"to_tui\" && hasStructuredMsg);\n\t\tif (!isCodexEventLine) {\n\t\t\treturn null;\n\t\t}\n\t\treturn parsed;\n\t} catch {\n\t\treturn null;\n\t}\n}\n\nfunction parseCodexEventPayload(line: CodexSessionLogLine): CodexEventPayload | null {\n\tconst payload = asRecord(line.payload);\n\tif (payload) {\n\t\tconst payloadMsg = asRecord(payload.msg);\n\t\tif (payloadMsg) {\n\t\t\treturn payloadMsg as CodexEventPayload;\n\t\t}\n\t\tif (typeof payload.type === \"string\") {\n\t\t\treturn payload as CodexEventPayload;\n\t\t}\n\t}\n\n\tif (line.msg && typeof line.msg === \"object\" && !Array.isArray(line.msg)) {\n\t\treturn line.msg as CodexEventPayload;\n\t}\n\tif (typeof line === \"object\" && line !== null && \"type\" in line) {\n\t\treturn line as CodexEventPayload;\n\t}\n\treturn null;\n}\n\nfunction parseJsonString(value: string): Record<string, unknown> | null {\n\ttry {\n\t\tconst parsed = JSON.parse(value) as unknown;\n\t\treturn asRecord(parsed);\n\t} catch {\n\t\treturn null;\n\t}\n}\n\nfunction extractCodexCommandSnippet(message: CodexEventPayload, line: string): string | null {\n\tconst directCommand = pickFirstString([\n\t\textractJsonStringField(line, \"command\"),\n\t\textractJsonStringField(line, \"cmd\"),\n\t\tmessage.command,\n\t]);\n\tif (directCommand) {\n\t\treturn directCommand;\n\t}\n\n\tif (Array.isArray(message.command)) {\n\t\tconst commandText = message.command\n\t\t\t.filter((part): part is string => typeof part === \"string\")\n\t\t\t.join(\" \")\n\t\t\t.trim();\n\t\tif (commandText) {\n\t\t\treturn commandText;\n\t\t}\n\t}\n\n\tconst item = asRecord(message.item);\n\tif (item?.type === \"function_call\") {\n\t\tconst argsRaw = typeof item.arguments === \"string\" ? item.arguments : \"\";\n\t\tconst args = argsRaw ? parseJsonString(argsRaw) : null;\n\t\tconst cmd = args ? readStringField(args, \"cmd\") : null;\n\t\tif (cmd) {\n\t\t\treturn cmd;\n\t\t}\n\t}\n\n\treturn null;\n}\n\nfunction pickFirstString(values: unknown[]): string {\n\tfor (const value of values) {\n\t\tif (typeof value === \"string\" && value.trim()) {\n\t\t\treturn value;\n\t\t}\n\t}\n\treturn \"\";\n}\n\nfunction extractJsonStringField(line: string, field: string): string {\n\tconst pattern = new RegExp(`\"${field}\"\\\\s*:\\\\s*\"([^\"\\\\\\\\]*(?:\\\\\\\\.[^\"\\\\\\\\]*)*)\"`);\n\tconst match = line.match(pattern);\n\tif (!match?.[1]) {\n\t\treturn \"\";\n\t}\n\ttry {\n\t\treturn JSON.parse(`\"${match[1]}\"`) as string;\n\t} catch {\n\t\treturn match[1];\n\t}\n}\n\nfunction isCodexDescendantSession(message: unknown): boolean {\n\tconst messageRecord = asRecord(message);\n\tconst payload = messageRecord ? asRecord(messageRecord.payload) : null;\n\tconst source = payload ? asRecord(payload.source) : null;\n\tconst subagent = source ? asRecord(source.subagent) : null;\n\tconst threadSpawn = subagent ? asRecord(subagent.thread_spawn) : null;\n\treturn threadSpawn !== null;\n}\n\nexport function createCodexWatcherState(): CodexWatcherState {\n\treturn {\n\t\tlastTurnId: \"\",\n\t\tlastApprovalId: \"\",\n\t\tlastExecCallId: \"\",\n\t\tlastActivityFingerprint: \"\",\n\t\tapprovalFallbackSeq: 0,\n\t\toffset: 0,\n\t\tremainder: \"\",\n\t\tcurrentSessionScope: \"unknown\",\n\t};\n}\n\nexport function parseCodexEventLine(\n\tline: string,\n\tstate: CodexWatcherState,\n): { event: RuntimeHookEvent; metadata?: Partial<RuntimeTaskHookActivity> } | null {\n\tconst parsed = parseCodexSessionLogLine(line);\n\tif (!parsed) {\n\t\treturn null;\n\t}\n\tconst message = parseCodexEventPayload(parsed);\n\tif (!message) {\n\t\treturn null;\n\t}\n\tconst type = getString(message?.type);\n\tif (!type) {\n\t\treturn null;\n\t}\n\tconst normalizedType = type.toLowerCase();\n\tif (normalizedType === \"session_meta\") {\n\t\tstate.currentSessionScope = isCodexDescendantSession(message) ? \"descendant\" : \"root\";\n\t\treturn null;\n\t}\n\tif (state.currentSessionScope === \"descendant\") {\n\t\tif (normalizedType === \"task_complete\" || normalizedType === \"turn_aborted\") {\n\t\t\tstate.currentSessionScope = \"unknown\";\n\t\t}\n\t\treturn null;\n\t}\n\tconst command = extractCodexCommandSnippet(message, line);\n\tconst messageText = typeof message.message === \"string\" ? normalizeWhitespace(message.message) : \"\";\n\tconst lastAgentMessage =\n\t\ttypeof message.last_agent_message === \"string\" ? normalizeWhitespace(message.last_agent_message) : \"\";\n\n\tif (normalizedType === \"task_started\" || normalizedType === \"turn_started\" || normalizedType === \"turn_begin\") {\n\t\tconst turnId = pickFirstString([\n\t\t\textractJsonStringField(line, \"turn_id\"),\n\t\t\tmessage?.turn_id,\n\t\t\tparsed.turn_id,\n\t\t\tnormalizedType,\n\t\t]);\n\t\tif (turnId !== state.lastTurnId) {\n\t\t\tstate.lastTurnId = turnId;\n\t\t\treturn {\n\t\t\t\tevent: \"to_in_progress\",\n\t\t\t\tmetadata: {\n\t\t\t\t\tsource: \"codex\",\n\t\t\t\t\tactivityText: command ? `Working on task: ${truncateText(command, 120)}` : \"Working on task\",\n\t\t\t\t\thookEventName: type,\n\t\t\t\t},\n\t\t\t};\n\t\t}\n\t\treturn null;\n\t}\n\n\tif (normalizedType === \"raw_response_item\") {\n\t\tconst item = asRecord(message.item);\n\t\tif (item?.type === \"function_call\") {\n\t\t\tconst callId = readStringField(item, \"call_id\") ?? pickFirstString([message.call_id, parsed.call_id]);\n\t\t\tconst name = readStringField(item, \"name\") ?? \"tool\";\n\t\t\tconst fingerprint = callId || `${name}:${command ?? \"\"}`;\n\t\t\tif (fingerprint === state.lastActivityFingerprint) {\n\t\t\t\treturn null;\n\t\t\t}\n\t\t\tstate.lastActivityFingerprint = fingerprint;\n\t\t\treturn {\n\t\t\t\tevent: \"activity\",\n\t\t\t\tmetadata: {\n\t\t\t\t\tsource: \"codex\",\n\t\t\t\t\thookEventName: type,\n\t\t\t\t\tactivityText: command\n\t\t\t\t\t\t? `Calling ${name}: ${truncateText(command, 120)}`\n\t\t\t\t\t\t: `Calling ${truncateText(name, 48)}`,\n\t\t\t\t},\n\t\t\t};\n\t\t}\n\t\treturn null;\n\t}\n\n\tif (normalizedType === \"agent_message\" && messageText) {\n\t\tconst fingerprint = `${normalizedType}:${truncateText(messageText, 120)}`;\n\t\tif (fingerprint === state.lastActivityFingerprint) {\n\t\t\treturn null;\n\t\t}\n\t\tstate.lastActivityFingerprint = fingerprint;\n\t\treturn {\n\t\t\tevent: \"activity\",\n\t\t\tmetadata: {\n\t\t\t\tsource: \"codex\",\n\t\t\t\thookEventName: type,\n\t\t\t\tactivityText: `Agent: ${truncateText(messageText, 140)}`,\n\t\t\t},\n\t\t};\n\t}\n\n\tif (normalizedType === \"task_complete\") {\n\t\tconst finalText = lastAgentMessage || messageText;\n\t\treturn {\n\t\t\tevent: \"to_review\",\n\t\t\tmetadata: {\n\t\t\t\tsource: \"codex\",\n\t\t\t\thookEventName: type,\n\t\t\t\tactivityText: finalText ? `Final: ${truncateText(finalText, 140)}` : undefined,\n\t\t\t\tfinalMessage: finalText || undefined,\n\t\t\t},\n\t\t};\n\t}\n\n\tif (\n\t\tnormalizedType.endsWith(\"_approval_request\") ||\n\t\tnormalizedType === \"approval_request\" ||\n\t\tnormalizedType === \"permission_request\" ||\n\t\tnormalizedType === \"approval_requested\"\n\t) {\n\t\tlet approvalId = pickFirstString([\n\t\t\textractJsonStringField(line, \"id\"),\n\t\t\textractJsonStringField(line, \"approval_id\"),\n\t\t\textractJsonStringField(line, \"call_id\"),\n\t\t\tmessage?.id,\n\t\t\tmessage?.approval_id,\n\t\t\tmessage?.call_id,\n\t\t\tparsed.id,\n\t\t\tparsed.approval_id,\n\t\t\tparsed.call_id,\n\t\t]);\n\t\tif (!approvalId) {\n\t\t\tstate.approvalFallbackSeq += 1;\n\t\t\tapprovalId = `approval_request_${state.approvalFallbackSeq}`;\n\t\t}\n\t\tif (approvalId !== state.lastApprovalId) {\n\t\t\tstate.lastApprovalId = approvalId;\n\t\t\treturn {\n\t\t\t\tevent: \"to_review\",\n\t\t\t\tmetadata: {\n\t\t\t\t\tsource: \"codex\",\n\t\t\t\t\tactivityText: \"Waiting for approval\",\n\t\t\t\t\thookEventName: type,\n\t\t\t\t},\n\t\t\t};\n\t\t}\n\t\treturn null;\n\t}\n\n\tif (normalizedType === \"exec_command_begin\" || normalizedType === \"exec_command_start\") {\n\t\tconst callId = pickFirstString([extractJsonStringField(line, \"call_id\"), message?.call_id, parsed.call_id]);\n\t\tif (!callId || callId !== state.lastExecCallId) {\n\t\t\tstate.lastExecCallId = callId;\n\t\t\treturn {\n\t\t\t\tevent: \"activity\",\n\t\t\t\tmetadata: {\n\t\t\t\t\tsource: \"codex\",\n\t\t\t\t\tactivityText: command ? `Running command: ${truncateText(command, 120)}` : \"Running command\",\n\t\t\t\t\thookEventName: type,\n\t\t\t\t},\n\t\t\t};\n\t\t}\n\t\treturn null;\n\t}\n\n\tif (normalizedType === \"exec_command_end\") {\n\t\tconst callId = pickFirstString([extractJsonStringField(line, \"call_id\"), message.call_id, parsed.call_id]);\n\t\tconst status = pickFirstString([\n\t\t\textractJsonStringField(line, \"status\"),\n\t\t\t(message as Record<string, unknown>).status,\n\t\t]);\n\t\tconst failed = status.toLowerCase() === \"failed\";\n\t\tconst fingerprint = `${normalizedType}:${callId}:${status}`;\n\t\tif (fingerprint === state.lastActivityFingerprint) {\n\t\t\treturn null;\n\t\t}\n\t\tstate.lastActivityFingerprint = fingerprint;\n\t\treturn {\n\t\t\tevent: \"activity\",\n\t\t\tmetadata: {\n\t\t\t\tsource: \"codex\",\n\t\t\t\thookEventName: type,\n\t\t\t\tactivityText: failed\n\t\t\t\t\t? command\n\t\t\t\t\t\t? `Command failed: ${truncateText(command, 120)}`\n\t\t\t\t\t\t: \"Command failed\"\n\t\t\t\t\t: command\n\t\t\t\t\t\t? `Command finished: ${truncateText(command, 120)}`\n\t\t\t\t\t\t: \"Command finished\",\n\t\t\t},\n\t\t};\n\t}\n\n\tif (normalizedType.includes(\"tool\") || normalizedType.includes(\"exec\") || normalizedType.includes(\"command\")) {\n\t\tconst fingerprint = pickFirstString([\n\t\t\textractJsonStringField(line, \"call_id\"),\n\t\t\textractJsonStringField(line, \"id\"),\n\t\t\ttype,\n\t\t]);\n\t\tif (fingerprint === state.lastActivityFingerprint) {\n\t\t\treturn null;\n\t\t}\n\t\tstate.lastActivityFingerprint = fingerprint;\n\t\treturn {\n\t\t\tevent: \"activity\",\n\t\t\tmetadata: {\n\t\t\t\tsource: \"codex\",\n\t\t\t\tactivityText: command\n\t\t\t\t\t? `Codex ${type}: ${truncateText(command, 120)}`\n\t\t\t\t\t: `Codex activity: ${truncateText(type, 64)}`,\n\t\t\t\thookEventName: type,\n\t\t\t},\n\t\t};\n\t}\n\n\treturn null;\n}\n\nasync function waitForFile(path: string): Promise<boolean> {\n\tfor (let attempt = 0; attempt < CODEX_LOG_WAIT_ATTEMPTS; attempt += 1) {\n\t\ttry {\n\t\t\tawait access(path);\n\t\t\treturn true;\n\t\t} catch {\n\t\t\tawait sleep(CODEX_LOG_WAIT_DELAY_MS);\n\t\t}\n\t}\n\treturn false;\n}\n\nasync function startCodexSessionWatcher(logPath: string): Promise<() => void> {\n\tconst state = createCodexWatcherState();\n\n\tconst poll = async () => {\n\t\tlet fileStat: Stats;\n\t\ttry {\n\t\t\tfileStat = await stat(logPath);\n\t\t} catch {\n\t\t\treturn;\n\t\t}\n\t\tif (fileStat.size < state.offset) {\n\t\t\tstate.offset = 0;\n\t\t\tstate.remainder = \"\";\n\t\t}\n\t\tif (fileStat.size === state.offset) {\n\t\t\treturn;\n\t\t}\n\n\t\tlet handle: Awaited<ReturnType<typeof open>> | null = null;\n\t\ttry {\n\t\t\thandle = await open(logPath, \"r\");\n\t\t\tconst byteLength = fileStat.size - state.offset;\n\t\t\tconst buffer = Buffer.alloc(byteLength);\n\t\t\tawait handle.read(buffer, 0, byteLength, state.offset);\n\t\t\tstate.offset = fileStat.size;\n\t\t\tconst combined = state.remainder + buffer.toString(\"utf8\");\n\t\t\tconst lines = combined.split(/\\r?\\n/);\n\t\t\tstate.remainder = lines.pop() ?? \"\";\n\t\t\tfor (const line of lines) {\n\t\t\t\tconst mapped = parseCodexEventLine(line, state);\n\t\t\t\tif (mapped) {\n\t\t\t\t\tspawnDetachedKanban(appendMetadataFlags([\"hooks\", \"notify\", \"--event\", mapped.event], mapped.metadata));\n\t\t\t\t}\n\t\t\t}\n\t\t} catch {\n\t\t\t// Ignore transient session log read errors.\n\t\t} finally {\n\t\t\tawait handle?.close();\n\t\t}\n\t};\n\n\tconst timer = setInterval(() => {\n\t\tvoid poll();\n\t}, CODEX_LOG_POLL_INTERVAL_MS);\n\tvoid poll();\n\treturn () => {\n\t\tclearInterval(timer);\n\t};\n}\n\nasync function runHooksNotify(\n\tevent: RuntimeHookEvent,\n\toptions: HookCommandMetadataOptionValues,\n\tpayloadArg: string | undefined,\n): Promise<void> {\n\ttry {\n\t\tconst stdinPayload = await readStdinText();\n\t\tconst args = parseHooksIngestArgs(event, options, payloadArg, stdinPayload);\n\t\tawait ingestHookEvent(args);\n\t} catch {\n\t\t// Best effort only.\n\t}\n}\n\nasync function readStdinText(): Promise<string> {\n\tif (process.stdin.isTTY) {\n\t\treturn \"\";\n\t}\n\tconst chunks: string[] = [];\n\tprocess.stdin.setEncoding(\"utf8\");\n\tfor await (const chunk of process.stdin) {\n\t\tchunks.push(chunk);\n\t}\n\treturn chunks.join(\"\");\n}\n\nfunction mapGeminiHookEvent(eventName: string): RuntimeHookEvent | null {\n\tif (eventName === \"AfterAgent\") {\n\t\treturn \"to_review\";\n\t}\n\tif (eventName === \"BeforeAgent\") {\n\t\treturn \"to_in_progress\";\n\t}\n\tif (eventName === \"AfterTool\" || eventName === \"BeforeTool\" || eventName === \"Notification\") {\n\t\treturn \"activity\";\n\t}\n\treturn null;\n}\n\nasync function runGeminiHookSubcommand(): Promise<void> {\n\tlet payload = \"\";\n\ttry {\n\t\tpayload = await readStdinText();\n\t} catch {\n\t\tpayload = \"\";\n\t}\n\n\tlet hookEventName = \"\";\n\tlet payloadRecord: Record<string, unknown> | null = null;\n\ttry {\n\t\tconst parsed = JSON.parse(payload || \"{}\") as { hook_event_name?: unknown };\n\t\tpayloadRecord = asRecord(parsed);\n\t\thookEventName =\n\t\t\ttypeof parsed.hook_event_name === \"string\"\n\t\t\t\t? parsed.hook_event_name\n\t\t\t\t: payloadRecord && typeof payloadRecord.hookEventName === \"string\"\n\t\t\t\t\t? payloadRecord.hookEventName\n\t\t\t\t\t: \"\";\n\t} catch {\n\t\thookEventName = \"\";\n\t\tpayloadRecord = null;\n\t}\n\n\tprocess.stdout.write(\"{}\\n\");\n\n\tconst mappedEvent = mapGeminiHookEvent(hookEventName);\n\tif (!mappedEvent) {\n\t\treturn;\n\t}\n\tconst metadata = normalizeHookMetadata(mappedEvent, payloadRecord, {\n\t\tsource: \"gemini\",\n\t\thookEventName: hookEventName || undefined,\n\t});\n\tspawnDetachedKanban(appendMetadataFlags([\"hooks\", \"notify\", \"--event\", mappedEvent], metadata));\n}\n\nexport function buildCodexWrapperChildArgs(agentArgs: string[], shouldWatchSessionLog: boolean): string[] {\n\tconst childArgs = [...agentArgs];\n\tif (shouldWatchSessionLog) {\n\t\treturn childArgs;\n\t}\n\tconst reviewNotifyCommandParts = buildKanbanCommandParts([\n\t\t\"hooks\",\n\t\t\"notify\",\n\t\t\"--event\",\n\t\t\"to_review\",\n\t\t\"--source\",\n\t\t\"codex\",\n\t]);\n\tconst notifyConfig = `notify=${JSON.stringify(reviewNotifyCommandParts)}`;\n\tchildArgs.unshift(notifyConfig);\n\tchildArgs.unshift(\"-c\");\n\treturn childArgs;\n}\n\nasync function runCodexWrapperSubcommand(wrapperArgs: CodexWrapperArgs): Promise<void> {\n\tconst childEnv: NodeJS.ProcessEnv = { ...process.env };\n\tlet shuttingDown = false;\n\tlet stopWatcher = () => {};\n\n\tlet shouldWatchSessionLog = false;\n\ttry {\n\t\tparseHookRuntimeContextFromEnv(childEnv);\n\t\tshouldWatchSessionLog = true;\n\t} catch {\n\t\tshouldWatchSessionLog = false;\n\t}\n\n\tif (shouldWatchSessionLog) {\n\t\tchildEnv.CODEX_TUI_RECORD_SESSION = \"1\";\n\t\tif (!childEnv.CODEX_TUI_SESSION_LOG_PATH) {\n\t\t\tchildEnv.CODEX_TUI_SESSION_LOG_PATH = join(\n\t\t\t\ttmpdir(),\n\t\t\t\t`kanban-codex-session-${process.pid}_${Date.now()}.jsonl`,\n\t\t\t);\n\t\t}\n\t\tconst sessionLogPath = childEnv.CODEX_TUI_SESSION_LOG_PATH;\n\t\tif (sessionLogPath) {\n\t\t\tvoid (async () => {\n\t\t\t\tconst exists = await waitForFile(sessionLogPath);\n\t\t\t\tif (!exists || shuttingDown) {\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t\tstopWatcher = await startCodexSessionWatcher(sessionLogPath);\n\t\t\t\tif (shuttingDown) {\n\t\t\t\t\tstopWatcher();\n\t\t\t\t}\n\t\t\t})();\n\t\t}\n\t}\n\n\tconst child = spawn(wrapperArgs.realBinary, buildCodexWrapperChildArgs(wrapperArgs.agentArgs, shouldWatchSessionLog), {\n\t\tstdio: \"inherit\",\n\t\tenv: childEnv,\n\t});\n\n\tconst forwardSignal = (signal: NodeJS.Signals) => {\n\t\tif (!child.killed) {\n\t\t\tchild.kill(signal);\n\t\t}\n\t};\n\n\tconst onSigint = () => {\n\t\tforwardSignal(\"SIGINT\");\n\t};\n\tconst onSigterm = () => {\n\t\tforwardSignal(\"SIGTERM\");\n\t};\n\n\tprocess.on(\"SIGINT\", onSigint);\n\tprocess.on(\"SIGTERM\", onSigterm);\n\n\tconst cleanup = () => {\n\t\tshuttingDown = true;\n\t\tstopWatcher();\n\t\tprocess.off(\"SIGINT\", onSigint);\n\t\tprocess.off(\"SIGTERM\", onSigterm);\n\t};\n\n\tawait new Promise<void>((resolve) => {\n\t\tchild.on(\"error\", () => {\n\t\t\tcleanup();\n\t\t\tprocess.exitCode = 1;\n\t\t\tresolve();\n\t\t});\n\t\tchild.on(\"exit\", (code) => {\n\t\t\tcleanup();\n\t\t\tprocess.exitCode = code ?? 1;\n\t\t\tresolve();\n\t\t});\n\t});\n}\n\nasync function runHooksIngest(\n\tevent: RuntimeHookEvent,\n\toptions: HookCommandMetadataOptionValues,\n\tpayloadArg: string | undefined,\n): Promise<void> {\n\tlet args: HooksIngestArgs;\n\ttry {\n\t\tconst stdinPayload = await readStdinText();\n\t\targs = parseHooksIngestArgs(event, options, payloadArg, stdinPayload);\n\t} catch (error) {\n\t\tprocess.stderr.write(`kanban hooks ingest: ${formatError(error)}\\n`);\n\t\tprocess.exitCode = 1;\n\t\treturn;\n\t}\n\n\ttry {\n\t\tawait ingestHookEvent(args);\n\t} catch (error) {\n\t\tprocess.stderr.write(`kanban hooks ingest: ${formatError(error)}\\n`);\n\t\tprocess.exitCode = 1;\n\t}\n}\n\nexport function registerHooksCommand(program: Command): void {\n\tconst hooks = program.command(\"hooks\").description(\"Runtime hook helpers for agent integrations.\");\n\n\thooks\n\t\t.command(\"ingest [payload]\")\n\t\t.description(\"Ingest hook event into Kanban runtime.\")\n\t\t.requiredOption(\"--event <event>\", \"Event: to_review | to_in_progress | activity.\", parseHookEvent)\n\t\t.option(\"--source <source>\", \"Hook source.\")\n\t\t.option(\"--activity-text <text>\", \"Activity summary text.\")\n\t\t.option(\"--tool-name <name>\", \"Tool name.\")\n\t\t.option(\"--final-message <message>\", \"Final message.\")\n\t\t.option(\"--hook-event-name <name>\", \"Original hook event name.\")\n\t\t.option(\"--notification-type <type>\", \"Notification type.\")\n\t\t.option(\"--metadata-base64 <base64>\", \"Base64-encoded JSON metadata payload.\")\n\t\t.action(\n\t\t\tasync (\n\t\t\t\tpayload: string | undefined,\n\t\t\t\toptions: HookCommandMetadataOptionValues & { event: RuntimeHookEvent },\n\t\t\t) => {\n\t\t\t\tawait runHooksIngest(options.event, options, payload);\n\t\t\t},\n\t\t);\n\n\thooks\n\t\t.command(\"notify [payload]\")\n\t\t.description(\"Best-effort hook ingest that never throws.\")\n\t\t.requiredOption(\"--event <event>\", \"Event: to_review | to_in_progress | activity.\", parseHookEvent)\n\t\t.option(\"--source <source>\", \"Hook source.\")\n\t\t.option(\"--activity-text <text>\", \"Activity summary text.\")\n\t\t.option(\"--tool-name <name>\", \"Tool name.\")\n\t\t.option(\"--final-message <message>\", \"Final message.\")\n\t\t.option(\"--hook-event-name <name>\", \"Original hook event name.\")\n\t\t.option(\"--notification-type <type>\", \"Notification type.\")\n\t\t.option(\"--metadata-base64 <base64>\", \"Base64-encoded JSON metadata payload.\")\n\t\t.action(\n\t\t\tasync (\n\t\t\t\tpayload: string | undefined,\n\t\t\t\toptions: HookCommandMetadataOptionValues & { event: RuntimeHookEvent },\n\t\t\t) => {\n\t\t\t\tawait runHooksNotify(options.event, options, payload);\n\t\t\t},\n\t\t);\n\n\thooks\n\t\t.command(\"gemini-hook\")\n\t\t.description(\"Gemini hook entrypoint.\")\n\t\t.action(async () => {\n\t\t\tawait runGeminiHookSubcommand();\n\t\t});\n\n\thooks\n\t\t.command(\"codex-wrapper [agentArgs...]\")\n\t\t.description(\"Codex wrapper that emits Kanban hook notifications.\")\n\t\t.requiredOption(\"--real-binary <path>\", \"Path to the actual codex binary.\")\n\t\t.allowUnknownOption(true)\n\t\t.action(async (agentArgs: string[] | undefined, options: { realBinary: string }) => {\n\t\t\tawait runCodexWrapperSubcommand({\n\t\t\t\trealBinary: options.realBinary,\n\t\t\t\tagentArgs: agentArgs ?? [],\n\t\t\t});\n\t\t});\n}\n"],"names":[],"mappings":"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","debugId":"5d20d363-8ae2-584c-a755-5a55d6d87b1d"}
|
|
1
|
+
{"version":3,"file":"hooks.js","sources":["../../src/commands/hooks.ts"],"sourceRoot":"","sourcesContent":["import { spawn } from \"node:child_process\";\nimport type { Stats } from \"node:fs\";\nimport { access, open, stat } from \"node:fs/promises\";\nimport { tmpdir } from \"node:os\";\nimport { join } from \"node:path\";\nimport { createTRPCProxyClient, httpBatchLink, TRPCClientError } from \"@trpc/client\";\nimport type { Command } from \"commander\";\n\nimport type { RuntimeHookEvent, RuntimeTaskHookActivity } from \"../core/api-contract.js\";\nimport { buildKanbanCommandParts } from \"../core/kanban-command.js\";\nimport { buildKanbanRuntimeUrl } from \"../core/runtime-endpoint.js\";\nimport { buildWindowsCmdArgsArray, resolveWindowsComSpec, shouldUseWindowsCmdLaunch } from \"../core/windows-cmd-launch.js\";\nimport { parseHookRuntimeContextFromEnv } from \"../terminal/hook-runtime-context.js\";\nimport type { RuntimeAppRouter } from \"../trpc/app-router.js\";\n\nconst VALID_EVENTS = new Set<RuntimeHookEvent>([\"to_review\", \"to_in_progress\", \"activity\"]);\nconst CODEX_LOG_WAIT_ATTEMPTS = 200;\nconst CODEX_LOG_WAIT_DELAY_MS = 50;\nconst CODEX_LOG_POLL_INTERVAL_MS = 200;\nconst MAX_ACTIVITY_TEXT_LENGTH = 200;\n\ninterface HooksIngestArgs {\n\tevent: RuntimeHookEvent;\n\ttaskId: string;\n\tworkspaceId: string;\n\tmetadata?: Partial<RuntimeTaskHookActivity>;\n}\n\ninterface HookCommandMetadataOptionValues {\n\tsource?: string;\n\tactivityText?: string;\n\ttoolName?: string;\n\tfinalMessage?: string;\n\thookEventName?: string;\n\tnotificationType?: string;\n\tmetadataBase64?: string;\n}\n\ninterface CodexWrapperArgs {\n\trealBinary: string;\n\tagentArgs: string[];\n}\n\ninterface CodexWatcherState {\n\tlastTurnId: string;\n\tlastApprovalId: string;\n\tlastExecCallId: string;\n\tlastActivityFingerprint: string;\n\tapprovalFallbackSeq: number;\n\toffset: number;\n\tremainder: string;\n\tcurrentSessionScope: \"unknown\" | \"root\" | \"descendant\";\n}\n\ninterface CodexEventPayload {\n\ttype?: unknown;\n\tturn_id?: unknown;\n\tid?: unknown;\n\tapproval_id?: unknown;\n\tcall_id?: unknown;\n\tlast_agent_message?: unknown;\n\tmessage?: unknown;\n\tcommand?: unknown;\n\titem?: unknown;\n}\n\ninterface CodexSessionLogLine {\n\tdir?: unknown;\n\tkind?: unknown;\n\tmsg?: unknown;\n\tpayload?: unknown;\n\tturn_id?: unknown;\n\tid?: unknown;\n\tapproval_id?: unknown;\n\tcall_id?: unknown;\n}\n\nfunction formatError(error: unknown): string {\n\tif (error instanceof TRPCClientError) {\n\t\treturn error.message;\n\t}\n\tif (error instanceof Error) {\n\t\treturn error.message;\n\t}\n\treturn String(error);\n}\n\nasync function withTimeout<T>(promise: Promise<T>, timeoutMs: number, label: string): Promise<T> {\n\tlet timeoutHandle: NodeJS.Timeout | null = null;\n\tconst timeoutPromise = new Promise<never>((_, reject) => {\n\t\ttimeoutHandle = setTimeout(() => {\n\t\t\treject(new Error(`${label} timed out after ${timeoutMs}ms`));\n\t\t}, timeoutMs);\n\t});\n\ttry {\n\t\treturn await Promise.race([promise, timeoutPromise]);\n\t} finally {\n\t\tif (timeoutHandle) {\n\t\t\tclearTimeout(timeoutHandle);\n\t\t}\n\t}\n}\n\nasync function sleep(ms: number): Promise<void> {\n\tawait new Promise((resolve) => {\n\t\tsetTimeout(resolve, ms);\n\t});\n}\n\nfunction parseHookEvent(value: string): RuntimeHookEvent {\n\tif (!VALID_EVENTS.has(value as RuntimeHookEvent)) {\n\t\tthrow new Error(`Invalid event \"${value}\". Must be one of: ${[...VALID_EVENTS].join(\", \")}`);\n\t}\n\treturn value as RuntimeHookEvent;\n}\n\nfunction normalizeWhitespace(value: string): string {\n\treturn value.replace(/\\s+/g, \" \").trim();\n}\n\nfunction truncateText(value: string, maxLength: number): string {\n\tif (value.length <= maxLength) {\n\t\treturn value;\n\t}\n\treturn `${value.slice(0, Math.max(0, maxLength - 1)).trimEnd()}…`;\n}\n\nfunction asRecord(value: unknown): Record<string, unknown> | null {\n\tif (!value || typeof value !== \"object\" || Array.isArray(value)) {\n\t\treturn null;\n\t}\n\treturn value as Record<string, unknown>;\n}\n\nfunction readStringField(record: Record<string, unknown>, key: string): string | null {\n\tconst value = record[key];\n\tif (typeof value !== \"string\") {\n\t\treturn null;\n\t}\n\tconst normalized = normalizeWhitespace(value);\n\treturn normalized.length > 0 ? normalized : null;\n}\n\nfunction readNestedString(record: Record<string, unknown>, path: string[]): string | null {\n\tlet current: unknown = record;\n\tfor (const key of path) {\n\t\tconst candidate = asRecord(current);\n\t\tif (!candidate || !(key in candidate)) {\n\t\t\treturn null;\n\t\t}\n\t\tcurrent = candidate[key];\n\t}\n\tif (typeof current !== \"string\") {\n\t\treturn null;\n\t}\n\tconst normalized = normalizeWhitespace(current);\n\treturn normalized.length > 0 ? normalized : null;\n}\n\nfunction parseJsonObject(value: string): Record<string, unknown> | null {\n\ttry {\n\t\treturn asRecord(JSON.parse(value));\n\t} catch {\n\t\treturn null;\n\t}\n}\n\nfunction parseMetadataFromOptions(options: HookCommandMetadataOptionValues): Partial<RuntimeTaskHookActivity> {\n\tconst metadata: Partial<RuntimeTaskHookActivity> = {};\n\tconst activityText = options.activityText;\n\tconst toolName = options.toolName;\n\tconst finalMessage = options.finalMessage;\n\tconst hookEventName = options.hookEventName;\n\tconst notificationType = options.notificationType;\n\tconst source = options.source;\n\n\tif (activityText) {\n\t\tmetadata.activityText = truncateText(normalizeWhitespace(activityText), MAX_ACTIVITY_TEXT_LENGTH);\n\t}\n\tif (toolName) {\n\t\tmetadata.toolName = truncateText(normalizeWhitespace(toolName), 120);\n\t}\n\tif (finalMessage) {\n\t\tmetadata.finalMessage = normalizeWhitespace(finalMessage);\n\t}\n\tif (hookEventName) {\n\t\tmetadata.hookEventName = truncateText(normalizeWhitespace(hookEventName), 120);\n\t}\n\tif (notificationType) {\n\t\tmetadata.notificationType = truncateText(normalizeWhitespace(notificationType), 120);\n\t}\n\tif (source) {\n\t\tmetadata.source = truncateText(normalizeWhitespace(source), 64);\n\t}\n\n\treturn metadata;\n}\n\nfunction parseMetadataFromBase64(encoded: string | undefined): Record<string, unknown> | null {\n\tif (!encoded) {\n\t\treturn null;\n\t}\n\ttry {\n\t\treturn asRecord(JSON.parse(Buffer.from(encoded, \"base64\").toString(\"utf8\")));\n\t} catch {\n\t\treturn null;\n\t}\n}\n\nfunction extractToolInput(payload: Record<string, unknown>): Record<string, unknown> | null {\n\tconst direct = asRecord(payload.tool_input);\n\tif (direct) {\n\t\treturn direct;\n\t}\n\tconst preTool = asRecord(payload.preToolUse);\n\tconst preParams = preTool ? asRecord(preTool.parameters) : null;\n\tif (preParams) {\n\t\treturn preParams;\n\t}\n\tconst postTool = asRecord(payload.postToolUse);\n\tconst postParams = postTool ? asRecord(postTool.parameters) : null;\n\tif (postParams) {\n\t\treturn postParams;\n\t}\n\tconst output = asRecord(payload.output);\n\tconst outputArgs = output ? asRecord(output.args) : null;\n\treturn outputArgs;\n}\n\nfunction describeToolOperation(toolName: string | null, toolInput: Record<string, unknown> | null): string | null {\n\tif (!toolName || !toolInput) {\n\t\treturn null;\n\t}\n\n\tconst command =\n\t\treadStringField(toolInput, \"command\") ??\n\t\treadStringField(toolInput, \"cmd\") ??\n\t\treadStringField(toolInput, \"query\") ??\n\t\treadStringField(toolInput, \"description\");\n\tif (command) {\n\t\treturn `${toolName}: ${truncateText(command, 120)}`;\n\t}\n\n\tconst filePath =\n\t\treadStringField(toolInput, \"file_path\") ??\n\t\treadStringField(toolInput, \"filePath\") ??\n\t\treadStringField(toolInput, \"path\");\n\tif (filePath) {\n\t\treturn `${toolName}: ${truncateText(filePath, 120)}`;\n\t}\n\n\treturn toolName;\n}\n\nfunction inferActivityText(\n\tevent: RuntimeHookEvent,\n\tpayload: Record<string, unknown> | null,\n\ttoolName: string | null,\n\tfinalMessage: string | null,\n\tnotificationType: string | null,\n): string | null {\n\tconst hookEventName = payload\n\t\t? (readStringField(payload, \"hook_event_name\") ??\n\t\t\treadStringField(payload, \"hookEventName\") ??\n\t\t\treadStringField(payload, \"hookName\"))\n\t\t: null;\n\tconst normalizedHookEvent = hookEventName?.toLowerCase() ?? \"\";\n\tconst codexType = payload ? readStringField(payload, \"type\") : null;\n\tconst normalizedCodexType = codexType?.toLowerCase() ?? \"\";\n\tconst toolInput = payload ? extractToolInput(payload) : null;\n\tconst toolOperation = describeToolOperation(toolName, toolInput);\n\n\tif (normalizedCodexType === \"task_started\") {\n\t\treturn \"Working on task\";\n\t}\n\tif (normalizedCodexType === \"exec_command_begin\") {\n\t\treturn \"Running command\";\n\t}\n\tif (normalizedCodexType.endsWith(\"_approval_request\")) {\n\t\treturn \"Waiting for approval\";\n\t}\n\n\tif (normalizedHookEvent === \"pretooluse\" || normalizedHookEvent === \"beforetool\") {\n\t\treturn toolOperation ? `Using ${toolOperation}` : \"Using tool\";\n\t}\n\tif (normalizedHookEvent === \"posttooluse\" || normalizedHookEvent === \"aftertool\") {\n\t\treturn toolOperation ? `Completed ${toolOperation}` : \"Completed tool\";\n\t}\n\tif (normalizedHookEvent === \"posttoolusefailure\") {\n\t\tconst error = payload ? readStringField(payload, \"error\") : null;\n\t\tif (toolOperation && error) {\n\t\t\treturn `Failed ${toolOperation}: ${truncateText(error, 100)}`;\n\t\t}\n\t\tif (toolOperation) {\n\t\t\treturn `Failed ${toolOperation}`;\n\t\t}\n\t\treturn error ? `Tool failed: ${truncateText(error, 100)}` : \"Tool failed\";\n\t}\n\tif (normalizedHookEvent === \"permissionrequest\") {\n\t\treturn \"Waiting for approval\";\n\t}\n\tif (normalizedHookEvent === \"userpromptsubmit\" || normalizedHookEvent === \"beforeagent\") {\n\t\treturn \"Resumed after user input\";\n\t}\n\tif (\n\t\tnormalizedHookEvent === \"stop\" ||\n\t\tnormalizedHookEvent === \"subagentstop\" ||\n\t\tnormalizedHookEvent === \"afteragent\"\n\t) {\n\t\treturn finalMessage ? `Final: ${truncateText(finalMessage, 140)}` : null;\n\t}\n\tif (normalizedHookEvent === \"taskcomplete\") {\n\t\treturn finalMessage ? `Final: ${truncateText(finalMessage, 140)}` : null;\n\t}\n\n\tif (notificationType === \"permission_prompt\" || notificationType === \"permission.asked\") {\n\t\treturn \"Waiting for approval\";\n\t}\n\tif (notificationType === \"user_attention\") {\n\t\treturn null;\n\t}\n\n\tif (event === \"to_review\") {\n\t\treturn null;\n\t}\n\tif (event === \"to_in_progress\") {\n\t\treturn \"Agent active\";\n\t}\n\treturn null;\n}\n\nexport function inferHookSourceFromPayload(payload: Record<string, unknown> | null): string | null {\n\tconst transcriptPath = payload ? readStringField(payload, \"transcript_path\") : null;\n\tconst normalizedTranscriptPath = transcriptPath?.replaceAll(\"\\\\\", \"/\").toLowerCase() ?? null;\n\tif (normalizedTranscriptPath?.includes(\"/.claude/\")) {\n\t\treturn \"claude\";\n\t}\n\tif (normalizedTranscriptPath?.includes(\"/.factory/\")) {\n\t\treturn \"droid\";\n\t}\n\tif (payload && readStringField(payload, \"type\") === \"agent-turn-complete\") {\n\t\treturn \"codex\";\n\t}\n\treturn null;\n}\n\nfunction normalizeHookMetadata(\n\tevent: RuntimeHookEvent,\n\tpayload: Record<string, unknown> | null,\n\tflagMetadata: Partial<RuntimeTaskHookActivity>,\n): Partial<RuntimeTaskHookActivity> | undefined {\n\tconst hookEventName = payload\n\t\t? (readStringField(payload, \"hook_event_name\") ??\n\t\t\treadStringField(payload, \"hookEventName\") ??\n\t\t\treadStringField(payload, \"hookName\"))\n\t\t: null;\n\tconst toolName = payload\n\t\t? (readStringField(payload, \"tool_name\") ??\n\t\t\treadNestedString(payload, [\"preToolUse\", \"tool\"]) ??\n\t\t\treadNestedString(payload, [\"preToolUse\", \"toolName\"]) ??\n\t\t\treadNestedString(payload, [\"postToolUse\", \"tool\"]) ??\n\t\t\treadNestedString(payload, [\"postToolUse\", \"toolName\"]) ??\n\t\t\treadNestedString(payload, [\"input\", \"tool\"]))\n\t\t: null;\n\tconst notificationType = payload\n\t\t? (readStringField(payload, \"notification_type\") ??\n\t\t\treadNestedString(payload, [\"event\", \"type\"]) ??\n\t\t\treadNestedString(payload, [\"notification\", \"event\"]))\n\t\t: null;\n\tconst finalMessage = payload\n\t\t? (readStringField(payload, \"last_assistant_message\") ??\n\t\t\treadStringField(payload, \"last-assistant-message\") ??\n\t\t\treadNestedString(payload, [\"taskComplete\", \"taskMetadata\", \"result\"]) ??\n\t\t\treadNestedString(payload, [\"taskComplete\", \"result\"]))\n\t\t: null;\n\n\tconst inferredSource = inferHookSourceFromPayload(payload);\n\n\tconst activityText = inferActivityText(event, payload, toolName, finalMessage, notificationType);\n\tconst merged: Partial<RuntimeTaskHookActivity> = {\n\t\tsource: flagMetadata.source ?? inferredSource ?? null,\n\t\thookEventName: flagMetadata.hookEventName ?? hookEventName ?? null,\n\t\ttoolName: flagMetadata.toolName ?? toolName ?? null,\n\t\tnotificationType: flagMetadata.notificationType ?? notificationType ?? null,\n\t\tfinalMessage:\n\t\t\tflagMetadata.finalMessage ??\n\t\t\t(finalMessage ? normalizeWhitespace(finalMessage) : null),\n\t\tactivityText:\n\t\t\tflagMetadata.activityText ??\n\t\t\t(activityText ? truncateText(normalizeWhitespace(activityText), MAX_ACTIVITY_TEXT_LENGTH) : null),\n\t};\n\n\tconst hasValue = Object.values(merged).some((value) => typeof value === \"string\" && value.trim().length > 0);\n\tif (!hasValue) {\n\t\treturn undefined;\n\t}\n\n\tif (typeof merged.source === \"string\") {\n\t\tmerged.source = truncateText(merged.source, 64);\n\t}\n\tif (typeof merged.hookEventName === \"string\") {\n\t\tmerged.hookEventName = truncateText(merged.hookEventName, 120);\n\t}\n\tif (typeof merged.toolName === \"string\") {\n\t\tmerged.toolName = truncateText(merged.toolName, 120);\n\t}\n\tif (typeof merged.notificationType === \"string\") {\n\t\tmerged.notificationType = truncateText(merged.notificationType, 120);\n\t}\n\n\treturn merged;\n}\n\nfunction parseHooksIngestArgs(\n\tevent: RuntimeHookEvent,\n\toptions: HookCommandMetadataOptionValues,\n\tpayloadArg: string | undefined,\n\tstdinPayload: string,\n): HooksIngestArgs {\n\tconst context = parseHookRuntimeContextFromEnv();\n\tconst flagMetadata = parseMetadataFromOptions(options);\n\tconst payloadFromBase64 = parseMetadataFromBase64(options.metadataBase64);\n\tconst payloadFromStdin = parseJsonObject(stdinPayload.trim());\n\tconst payloadFromArg = payloadArg ? parseJsonObject(payloadArg) : null;\n\tconst payload = payloadFromBase64 ?? payloadFromStdin ?? payloadFromArg;\n\tconst metadata = normalizeHookMetadata(event, payload, flagMetadata);\n\treturn {\n\t\tevent,\n\t\ttaskId: context.taskId,\n\t\tworkspaceId: context.workspaceId,\n\t\tmetadata,\n\t};\n}\n\nasync function ingestHookEvent(args: HooksIngestArgs): Promise<void> {\n\tconst trpcClient = createTRPCProxyClient<RuntimeAppRouter>({\n\t\tlinks: [\n\t\t\thttpBatchLink({\n\t\t\t\turl: buildKanbanRuntimeUrl(\"/api/trpc\"),\n\t\t\t\tmaxItems: 1,\n\t\t\t}),\n\t\t],\n\t});\n\tconst ingestResponse = await withTimeout(\n\t\ttrpcClient.hooks.ingest.mutate({\n\t\t\ttaskId: args.taskId,\n\t\t\tworkspaceId: args.workspaceId,\n\t\t\tevent: args.event,\n\t\t\tmetadata: args.metadata,\n\t\t}),\n\t\t3000,\n\t\t\"kanban hooks ingest\",\n\t);\n\tif (ingestResponse.ok === false) {\n\t\tthrow new Error(ingestResponse.error ?? \"Hook ingest failed\");\n\t}\n}\n\nfunction spawnDetachedKanban(args: string[]): void {\n\ttry {\n\t\tconst commandParts = buildKanbanCommandParts(args);\n\t\tconst child = spawn(commandParts[0], commandParts.slice(1), {\n\t\t\tdetached: true,\n\t\t\tstdio: \"ignore\",\n\t\t\tenv: process.env,\n\t\t});\n\t\tchild.unref();\n\t} catch {\n\t\t// Best effort: hook notification failures should never block agents.\n\t}\n}\n\nfunction appendMetadataFlags(args: string[], metadata?: Partial<RuntimeTaskHookActivity>): string[] {\n\tif (!metadata) {\n\t\treturn args;\n\t}\n\tif (metadata.source) {\n\t\targs.push(\"--source\", metadata.source);\n\t}\n\tif (metadata.activityText) {\n\t\targs.push(\"--activity-text\", metadata.activityText);\n\t}\n\tif (metadata.toolName) {\n\t\targs.push(\"--tool-name\", metadata.toolName);\n\t}\n\tif (metadata.finalMessage) {\n\t\targs.push(\"--final-message\", metadata.finalMessage);\n\t}\n\tif (metadata.hookEventName) {\n\t\targs.push(\"--hook-event-name\", metadata.hookEventName);\n\t}\n\tif (metadata.notificationType) {\n\t\targs.push(\"--notification-type\", metadata.notificationType);\n\t}\n\treturn args;\n}\n\nfunction getString(value: unknown): string {\n\treturn typeof value === \"string\" ? value : \"\";\n}\n\nfunction parseCodexSessionLogLine(line: string): CodexSessionLogLine | null {\n\ttry {\n\t\tconst parsed = JSON.parse(line) as CodexSessionLogLine;\n\t\tconst dir = getString(parsed.dir);\n\t\tconst kind = getString(parsed.kind);\n\t\tconst hasStructuredMsg = Boolean(parsed.msg && typeof parsed.msg === \"object\" && !Array.isArray(parsed.msg));\n\t\tconst isCodexEventLine =\n\t\t\t(kind === \"codex_event\" && (dir === \"to_tui\" || dir === \"\")) ||\n\t\t\t(kind === \"\" && hasStructuredMsg) ||\n\t\t\t(dir === \"to_tui\" && hasStructuredMsg);\n\t\tif (!isCodexEventLine) {\n\t\t\treturn null;\n\t\t}\n\t\treturn parsed;\n\t} catch {\n\t\treturn null;\n\t}\n}\n\nfunction parseCodexEventPayload(line: CodexSessionLogLine): CodexEventPayload | null {\n\tconst payload = asRecord(line.payload);\n\tif (payload) {\n\t\tconst payloadMsg = asRecord(payload.msg);\n\t\tif (payloadMsg) {\n\t\t\treturn payloadMsg as CodexEventPayload;\n\t\t}\n\t\tif (typeof payload.type === \"string\") {\n\t\t\treturn payload as CodexEventPayload;\n\t\t}\n\t}\n\n\tif (line.msg && typeof line.msg === \"object\" && !Array.isArray(line.msg)) {\n\t\treturn line.msg as CodexEventPayload;\n\t}\n\tif (typeof line === \"object\" && line !== null && \"type\" in line) {\n\t\treturn line as CodexEventPayload;\n\t}\n\treturn null;\n}\n\nfunction parseJsonString(value: string): Record<string, unknown> | null {\n\ttry {\n\t\tconst parsed = JSON.parse(value) as unknown;\n\t\treturn asRecord(parsed);\n\t} catch {\n\t\treturn null;\n\t}\n}\n\nfunction extractCodexCommandSnippet(message: CodexEventPayload, line: string): string | null {\n\tconst directCommand = pickFirstString([\n\t\textractJsonStringField(line, \"command\"),\n\t\textractJsonStringField(line, \"cmd\"),\n\t\tmessage.command,\n\t]);\n\tif (directCommand) {\n\t\treturn directCommand;\n\t}\n\n\tif (Array.isArray(message.command)) {\n\t\tconst commandText = message.command\n\t\t\t.filter((part): part is string => typeof part === \"string\")\n\t\t\t.join(\" \")\n\t\t\t.trim();\n\t\tif (commandText) {\n\t\t\treturn commandText;\n\t\t}\n\t}\n\n\tconst item = asRecord(message.item);\n\tif (item?.type === \"function_call\") {\n\t\tconst argsRaw = typeof item.arguments === \"string\" ? item.arguments : \"\";\n\t\tconst args = argsRaw ? parseJsonString(argsRaw) : null;\n\t\tconst cmd = args ? readStringField(args, \"cmd\") : null;\n\t\tif (cmd) {\n\t\t\treturn cmd;\n\t\t}\n\t}\n\n\treturn null;\n}\n\nfunction pickFirstString(values: unknown[]): string {\n\tfor (const value of values) {\n\t\tif (typeof value === \"string\" && value.trim()) {\n\t\t\treturn value;\n\t\t}\n\t}\n\treturn \"\";\n}\n\nfunction extractJsonStringField(line: string, field: string): string {\n\tconst pattern = new RegExp(`\"${field}\"\\\\s*:\\\\s*\"([^\"\\\\\\\\]*(?:\\\\\\\\.[^\"\\\\\\\\]*)*)\"`);\n\tconst match = line.match(pattern);\n\tif (!match?.[1]) {\n\t\treturn \"\";\n\t}\n\ttry {\n\t\treturn JSON.parse(`\"${match[1]}\"`) as string;\n\t} catch {\n\t\treturn match[1];\n\t}\n}\n\nfunction isCodexDescendantSession(message: unknown): boolean {\n\tconst messageRecord = asRecord(message);\n\tconst payload = messageRecord ? asRecord(messageRecord.payload) : null;\n\tconst source = payload ? asRecord(payload.source) : null;\n\tconst subagent = source ? asRecord(source.subagent) : null;\n\tconst threadSpawn = subagent ? asRecord(subagent.thread_spawn) : null;\n\treturn threadSpawn !== null;\n}\n\nexport function createCodexWatcherState(): CodexWatcherState {\n\treturn {\n\t\tlastTurnId: \"\",\n\t\tlastApprovalId: \"\",\n\t\tlastExecCallId: \"\",\n\t\tlastActivityFingerprint: \"\",\n\t\tapprovalFallbackSeq: 0,\n\t\toffset: 0,\n\t\tremainder: \"\",\n\t\tcurrentSessionScope: \"unknown\",\n\t};\n}\n\nexport function parseCodexEventLine(\n\tline: string,\n\tstate: CodexWatcherState,\n): { event: RuntimeHookEvent; metadata?: Partial<RuntimeTaskHookActivity> } | null {\n\tconst parsed = parseCodexSessionLogLine(line);\n\tif (!parsed) {\n\t\treturn null;\n\t}\n\tconst message = parseCodexEventPayload(parsed);\n\tif (!message) {\n\t\treturn null;\n\t}\n\tconst type = getString(message?.type);\n\tif (!type) {\n\t\treturn null;\n\t}\n\tconst normalizedType = type.toLowerCase();\n\tif (normalizedType === \"session_meta\") {\n\t\tstate.currentSessionScope = isCodexDescendantSession(message) ? \"descendant\" : \"root\";\n\t\treturn null;\n\t}\n\tif (state.currentSessionScope === \"descendant\") {\n\t\tif (normalizedType === \"task_complete\" || normalizedType === \"turn_aborted\") {\n\t\t\tstate.currentSessionScope = \"unknown\";\n\t\t}\n\t\treturn null;\n\t}\n\tconst command = extractCodexCommandSnippet(message, line);\n\tconst messageText = typeof message.message === \"string\" ? normalizeWhitespace(message.message) : \"\";\n\tconst lastAgentMessage =\n\t\ttypeof message.last_agent_message === \"string\" ? normalizeWhitespace(message.last_agent_message) : \"\";\n\n\tif (normalizedType === \"task_started\" || normalizedType === \"turn_started\" || normalizedType === \"turn_begin\") {\n\t\tconst turnId = pickFirstString([\n\t\t\textractJsonStringField(line, \"turn_id\"),\n\t\t\tmessage?.turn_id,\n\t\t\tparsed.turn_id,\n\t\t\tnormalizedType,\n\t\t]);\n\t\tif (turnId !== state.lastTurnId) {\n\t\t\tstate.lastTurnId = turnId;\n\t\t\treturn {\n\t\t\t\tevent: \"to_in_progress\",\n\t\t\t\tmetadata: {\n\t\t\t\t\tsource: \"codex\",\n\t\t\t\t\tactivityText: command ? `Working on task: ${truncateText(command, 120)}` : \"Working on task\",\n\t\t\t\t\thookEventName: type,\n\t\t\t\t},\n\t\t\t};\n\t\t}\n\t\treturn null;\n\t}\n\n\tif (normalizedType === \"raw_response_item\") {\n\t\tconst item = asRecord(message.item);\n\t\tif (item?.type === \"function_call\") {\n\t\t\tconst callId = readStringField(item, \"call_id\") ?? pickFirstString([message.call_id, parsed.call_id]);\n\t\t\tconst name = readStringField(item, \"name\") ?? \"tool\";\n\t\t\tconst fingerprint = callId || `${name}:${command ?? \"\"}`;\n\t\t\tif (fingerprint === state.lastActivityFingerprint) {\n\t\t\t\treturn null;\n\t\t\t}\n\t\t\tstate.lastActivityFingerprint = fingerprint;\n\t\t\treturn {\n\t\t\t\tevent: \"activity\",\n\t\t\t\tmetadata: {\n\t\t\t\t\tsource: \"codex\",\n\t\t\t\t\thookEventName: type,\n\t\t\t\t\tactivityText: command\n\t\t\t\t\t\t? `Calling ${name}: ${truncateText(command, 120)}`\n\t\t\t\t\t\t: `Calling ${truncateText(name, 48)}`,\n\t\t\t\t},\n\t\t\t};\n\t\t}\n\t\treturn null;\n\t}\n\n\tif (normalizedType === \"agent_message\" && messageText) {\n\t\tconst fingerprint = `${normalizedType}:${truncateText(messageText, 120)}`;\n\t\tif (fingerprint === state.lastActivityFingerprint) {\n\t\t\treturn null;\n\t\t}\n\t\tstate.lastActivityFingerprint = fingerprint;\n\t\treturn {\n\t\t\tevent: \"activity\",\n\t\t\tmetadata: {\n\t\t\t\tsource: \"codex\",\n\t\t\t\thookEventName: type,\n\t\t\t\tactivityText: `Agent: ${truncateText(messageText, 140)}`,\n\t\t\t},\n\t\t};\n\t}\n\n\tif (normalizedType === \"task_complete\") {\n\t\tconst finalText = lastAgentMessage || messageText;\n\t\treturn {\n\t\t\tevent: \"to_review\",\n\t\t\tmetadata: {\n\t\t\t\tsource: \"codex\",\n\t\t\t\thookEventName: type,\n\t\t\t\tactivityText: finalText ? `Final: ${truncateText(finalText, 140)}` : undefined,\n\t\t\t\tfinalMessage: finalText || undefined,\n\t\t\t},\n\t\t};\n\t}\n\n\tif (\n\t\tnormalizedType.endsWith(\"_approval_request\") ||\n\t\tnormalizedType === \"approval_request\" ||\n\t\tnormalizedType === \"permission_request\" ||\n\t\tnormalizedType === \"approval_requested\"\n\t) {\n\t\tlet approvalId = pickFirstString([\n\t\t\textractJsonStringField(line, \"id\"),\n\t\t\textractJsonStringField(line, \"approval_id\"),\n\t\t\textractJsonStringField(line, \"call_id\"),\n\t\t\tmessage?.id,\n\t\t\tmessage?.approval_id,\n\t\t\tmessage?.call_id,\n\t\t\tparsed.id,\n\t\t\tparsed.approval_id,\n\t\t\tparsed.call_id,\n\t\t]);\n\t\tif (!approvalId) {\n\t\t\tstate.approvalFallbackSeq += 1;\n\t\t\tapprovalId = `approval_request_${state.approvalFallbackSeq}`;\n\t\t}\n\t\tif (approvalId !== state.lastApprovalId) {\n\t\t\tstate.lastApprovalId = approvalId;\n\t\t\treturn {\n\t\t\t\tevent: \"to_review\",\n\t\t\t\tmetadata: {\n\t\t\t\t\tsource: \"codex\",\n\t\t\t\t\tactivityText: \"Waiting for approval\",\n\t\t\t\t\thookEventName: type,\n\t\t\t\t},\n\t\t\t};\n\t\t}\n\t\treturn null;\n\t}\n\n\tif (normalizedType === \"exec_command_begin\" || normalizedType === \"exec_command_start\") {\n\t\tconst callId = pickFirstString([extractJsonStringField(line, \"call_id\"), message?.call_id, parsed.call_id]);\n\t\tif (!callId || callId !== state.lastExecCallId) {\n\t\t\tstate.lastExecCallId = callId;\n\t\t\treturn {\n\t\t\t\tevent: \"activity\",\n\t\t\t\tmetadata: {\n\t\t\t\t\tsource: \"codex\",\n\t\t\t\t\tactivityText: command ? `Running command: ${truncateText(command, 120)}` : \"Running command\",\n\t\t\t\t\thookEventName: type,\n\t\t\t\t},\n\t\t\t};\n\t\t}\n\t\treturn null;\n\t}\n\n\tif (normalizedType === \"exec_command_end\") {\n\t\tconst callId = pickFirstString([extractJsonStringField(line, \"call_id\"), message.call_id, parsed.call_id]);\n\t\tconst status = pickFirstString([\n\t\t\textractJsonStringField(line, \"status\"),\n\t\t\t(message as Record<string, unknown>).status,\n\t\t]);\n\t\tconst failed = status.toLowerCase() === \"failed\";\n\t\tconst fingerprint = `${normalizedType}:${callId}:${status}`;\n\t\tif (fingerprint === state.lastActivityFingerprint) {\n\t\t\treturn null;\n\t\t}\n\t\tstate.lastActivityFingerprint = fingerprint;\n\t\treturn {\n\t\t\tevent: \"activity\",\n\t\t\tmetadata: {\n\t\t\t\tsource: \"codex\",\n\t\t\t\thookEventName: type,\n\t\t\t\tactivityText: failed\n\t\t\t\t\t? command\n\t\t\t\t\t\t? `Command failed: ${truncateText(command, 120)}`\n\t\t\t\t\t\t: \"Command failed\"\n\t\t\t\t\t: command\n\t\t\t\t\t\t? `Command finished: ${truncateText(command, 120)}`\n\t\t\t\t\t\t: \"Command finished\",\n\t\t\t},\n\t\t};\n\t}\n\n\tif (normalizedType.includes(\"tool\") || normalizedType.includes(\"exec\") || normalizedType.includes(\"command\")) {\n\t\tconst fingerprint = pickFirstString([\n\t\t\textractJsonStringField(line, \"call_id\"),\n\t\t\textractJsonStringField(line, \"id\"),\n\t\t\ttype,\n\t\t]);\n\t\tif (fingerprint === state.lastActivityFingerprint) {\n\t\t\treturn null;\n\t\t}\n\t\tstate.lastActivityFingerprint = fingerprint;\n\t\treturn {\n\t\t\tevent: \"activity\",\n\t\t\tmetadata: {\n\t\t\t\tsource: \"codex\",\n\t\t\t\tactivityText: command\n\t\t\t\t\t? `Codex ${type}: ${truncateText(command, 120)}`\n\t\t\t\t\t: `Codex activity: ${truncateText(type, 64)}`,\n\t\t\t\thookEventName: type,\n\t\t\t},\n\t\t};\n\t}\n\n\treturn null;\n}\n\nasync function waitForFile(path: string): Promise<boolean> {\n\tfor (let attempt = 0; attempt < CODEX_LOG_WAIT_ATTEMPTS; attempt += 1) {\n\t\ttry {\n\t\t\tawait access(path);\n\t\t\treturn true;\n\t\t} catch {\n\t\t\tawait sleep(CODEX_LOG_WAIT_DELAY_MS);\n\t\t}\n\t}\n\treturn false;\n}\n\nasync function startCodexSessionWatcher(logPath: string): Promise<() => void> {\n\tconst state = createCodexWatcherState();\n\n\tconst poll = async () => {\n\t\tlet fileStat: Stats;\n\t\ttry {\n\t\t\tfileStat = await stat(logPath);\n\t\t} catch {\n\t\t\treturn;\n\t\t}\n\t\tif (fileStat.size < state.offset) {\n\t\t\tstate.offset = 0;\n\t\t\tstate.remainder = \"\";\n\t\t}\n\t\tif (fileStat.size === state.offset) {\n\t\t\treturn;\n\t\t}\n\n\t\tlet handle: Awaited<ReturnType<typeof open>> | null = null;\n\t\ttry {\n\t\t\thandle = await open(logPath, \"r\");\n\t\t\tconst byteLength = fileStat.size - state.offset;\n\t\t\tconst buffer = Buffer.alloc(byteLength);\n\t\t\tawait handle.read(buffer, 0, byteLength, state.offset);\n\t\t\tstate.offset = fileStat.size;\n\t\t\tconst combined = state.remainder + buffer.toString(\"utf8\");\n\t\t\tconst lines = combined.split(/\\r?\\n/);\n\t\t\tstate.remainder = lines.pop() ?? \"\";\n\t\t\tfor (const line of lines) {\n\t\t\t\tconst mapped = parseCodexEventLine(line, state);\n\t\t\t\tif (mapped) {\n\t\t\t\t\tspawnDetachedKanban(appendMetadataFlags([\"hooks\", \"notify\", \"--event\", mapped.event], mapped.metadata));\n\t\t\t\t}\n\t\t\t}\n\t\t} catch {\n\t\t\t// Ignore transient session log read errors.\n\t\t} finally {\n\t\t\tawait handle?.close();\n\t\t}\n\t};\n\n\tconst timer = setInterval(() => {\n\t\tvoid poll();\n\t}, CODEX_LOG_POLL_INTERVAL_MS);\n\tvoid poll();\n\treturn () => {\n\t\tclearInterval(timer);\n\t};\n}\n\nasync function runHooksNotify(\n\tevent: RuntimeHookEvent,\n\toptions: HookCommandMetadataOptionValues,\n\tpayloadArg: string | undefined,\n): Promise<void> {\n\ttry {\n\t\tconst stdinPayload = await readStdinText();\n\t\tconst args = parseHooksIngestArgs(event, options, payloadArg, stdinPayload);\n\t\tawait ingestHookEvent(args);\n\t} catch {\n\t\t// Best effort only.\n\t}\n}\n\nasync function readStdinText(): Promise<string> {\n\tif (process.stdin.isTTY) {\n\t\treturn \"\";\n\t}\n\tconst chunks: string[] = [];\n\tprocess.stdin.setEncoding(\"utf8\");\n\tfor await (const chunk of process.stdin) {\n\t\tchunks.push(chunk);\n\t}\n\treturn chunks.join(\"\");\n}\n\nfunction mapGeminiHookEvent(eventName: string): RuntimeHookEvent | null {\n\tif (eventName === \"AfterAgent\") {\n\t\treturn \"to_review\";\n\t}\n\tif (eventName === \"BeforeAgent\") {\n\t\treturn \"to_in_progress\";\n\t}\n\tif (eventName === \"AfterTool\" || eventName === \"BeforeTool\" || eventName === \"Notification\") {\n\t\treturn \"activity\";\n\t}\n\treturn null;\n}\n\nasync function runGeminiHookSubcommand(): Promise<void> {\n\tlet payload = \"\";\n\ttry {\n\t\tpayload = await readStdinText();\n\t} catch {\n\t\tpayload = \"\";\n\t}\n\n\tlet hookEventName = \"\";\n\tlet payloadRecord: Record<string, unknown> | null = null;\n\ttry {\n\t\tconst parsed = JSON.parse(payload || \"{}\") as { hook_event_name?: unknown };\n\t\tpayloadRecord = asRecord(parsed);\n\t\thookEventName =\n\t\t\ttypeof parsed.hook_event_name === \"string\"\n\t\t\t\t? parsed.hook_event_name\n\t\t\t\t: payloadRecord && typeof payloadRecord.hookEventName === \"string\"\n\t\t\t\t\t? payloadRecord.hookEventName\n\t\t\t\t\t: \"\";\n\t} catch {\n\t\thookEventName = \"\";\n\t\tpayloadRecord = null;\n\t}\n\n\tprocess.stdout.write(\"{}\\n\");\n\n\tconst mappedEvent = mapGeminiHookEvent(hookEventName);\n\tif (!mappedEvent) {\n\t\treturn;\n\t}\n\tconst metadata = normalizeHookMetadata(mappedEvent, payloadRecord, {\n\t\tsource: \"gemini\",\n\t\thookEventName: hookEventName || undefined,\n\t});\n\tspawnDetachedKanban(appendMetadataFlags([\"hooks\", \"notify\", \"--event\", mappedEvent], metadata));\n}\n\nexport function buildCodexWrapperChildArgs(agentArgs: string[], shouldWatchSessionLog: boolean): string[] {\n\tconst childArgs = [...agentArgs];\n\tif (shouldWatchSessionLog) {\n\t\treturn childArgs;\n\t}\n\tconst reviewNotifyCommandParts = buildKanbanCommandParts([\n\t\t\"hooks\",\n\t\t\"notify\",\n\t\t\"--event\",\n\t\t\"to_review\",\n\t\t\"--source\",\n\t\t\"codex\",\n\t]);\n\tconst notifyConfig = `notify=${JSON.stringify(reviewNotifyCommandParts)}`;\n\tchildArgs.unshift(notifyConfig);\n\tchildArgs.unshift(\"-c\");\n\treturn childArgs;\n}\n\nexport function buildCodexWrapperSpawn(\n\trealBinary: string,\n\tagentArgs: string[],\n\tshouldWatchSessionLog: boolean,\n\tplatform: NodeJS.Platform = process.platform,\n\tenv: NodeJS.ProcessEnv = process.env,\n): { binary: string; args: string[] } {\n\tconst childArgs = buildCodexWrapperChildArgs(agentArgs, shouldWatchSessionLog);\n\tif (!shouldUseWindowsCmdLaunch(realBinary, platform, env)) {\n\t\treturn {\n\t\t\tbinary: realBinary,\n\t\t\targs: childArgs,\n\t\t};\n\t}\n\treturn {\n\t\tbinary: resolveWindowsComSpec(env),\n\t\targs: buildWindowsCmdArgsArray(realBinary, childArgs),\n\t};\n}\n\nasync function runCodexWrapperSubcommand(wrapperArgs: CodexWrapperArgs): Promise<void> {\n\tconst childEnv: NodeJS.ProcessEnv = { ...process.env };\n\tlet shuttingDown = false;\n\tlet stopWatcher = () => {};\n\n\tlet shouldWatchSessionLog = false;\n\ttry {\n\t\tparseHookRuntimeContextFromEnv(childEnv);\n\t\tshouldWatchSessionLog = true;\n\t} catch {\n\t\tshouldWatchSessionLog = false;\n\t}\n\n\tif (shouldWatchSessionLog) {\n\t\tchildEnv.CODEX_TUI_RECORD_SESSION = \"1\";\n\t\tif (!childEnv.CODEX_TUI_SESSION_LOG_PATH) {\n\t\t\tchildEnv.CODEX_TUI_SESSION_LOG_PATH = join(\n\t\t\t\ttmpdir(),\n\t\t\t\t`kanban-codex-session-${process.pid}_${Date.now()}.jsonl`,\n\t\t\t);\n\t\t}\n\t\tconst sessionLogPath = childEnv.CODEX_TUI_SESSION_LOG_PATH;\n\t\tif (sessionLogPath) {\n\t\t\tvoid (async () => {\n\t\t\t\tconst exists = await waitForFile(sessionLogPath);\n\t\t\t\tif (!exists || shuttingDown) {\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t\tstopWatcher = await startCodexSessionWatcher(sessionLogPath);\n\t\t\t\tif (shuttingDown) {\n\t\t\t\t\tstopWatcher();\n\t\t\t\t}\n\t\t\t})();\n\t\t}\n\t}\n\n\tconst childLaunch = buildCodexWrapperSpawn(wrapperArgs.realBinary, wrapperArgs.agentArgs, shouldWatchSessionLog);\n\tconst child = spawn(childLaunch.binary, childLaunch.args, {\n\t\tstdio: \"inherit\",\n\t\tenv: childEnv,\n\t});\n\n\tconst forwardSignal = (signal: NodeJS.Signals) => {\n\t\tif (!child.killed) {\n\t\t\tchild.kill(signal);\n\t\t}\n\t};\n\n\tconst onSigint = () => {\n\t\tforwardSignal(\"SIGINT\");\n\t};\n\tconst onSigterm = () => {\n\t\tforwardSignal(\"SIGTERM\");\n\t};\n\n\tprocess.on(\"SIGINT\", onSigint);\n\tprocess.on(\"SIGTERM\", onSigterm);\n\n\tconst cleanup = () => {\n\t\tshuttingDown = true;\n\t\tstopWatcher();\n\t\tprocess.off(\"SIGINT\", onSigint);\n\t\tprocess.off(\"SIGTERM\", onSigterm);\n\t};\n\n\tawait new Promise<void>((resolve) => {\n\t\tchild.on(\"error\", () => {\n\t\t\tcleanup();\n\t\t\tprocess.exitCode = 1;\n\t\t\tresolve();\n\t\t});\n\t\tchild.on(\"exit\", (code) => {\n\t\t\tcleanup();\n\t\t\tprocess.exitCode = code ?? 1;\n\t\t\tresolve();\n\t\t});\n\t});\n}\n\nasync function runHooksIngest(\n\tevent: RuntimeHookEvent,\n\toptions: HookCommandMetadataOptionValues,\n\tpayloadArg: string | undefined,\n): Promise<void> {\n\tlet args: HooksIngestArgs;\n\ttry {\n\t\tconst stdinPayload = await readStdinText();\n\t\targs = parseHooksIngestArgs(event, options, payloadArg, stdinPayload);\n\t} catch (error) {\n\t\tprocess.stderr.write(`kanban hooks ingest: ${formatError(error)}\\n`);\n\t\tprocess.exitCode = 1;\n\t\treturn;\n\t}\n\n\ttry {\n\t\tawait ingestHookEvent(args);\n\t} catch (error) {\n\t\tprocess.stderr.write(`kanban hooks ingest: ${formatError(error)}\\n`);\n\t\tprocess.exitCode = 1;\n\t}\n}\n\nexport function registerHooksCommand(program: Command): void {\n\tconst hooks = program.command(\"hooks\").description(\"Runtime hook helpers for agent integrations.\");\n\n\thooks\n\t\t.command(\"ingest [payload]\")\n\t\t.description(\"Ingest hook event into Kanban runtime.\")\n\t\t.requiredOption(\"--event <event>\", \"Event: to_review | to_in_progress | activity.\", parseHookEvent)\n\t\t.option(\"--source <source>\", \"Hook source.\")\n\t\t.option(\"--activity-text <text>\", \"Activity summary text.\")\n\t\t.option(\"--tool-name <name>\", \"Tool name.\")\n\t\t.option(\"--final-message <message>\", \"Final message.\")\n\t\t.option(\"--hook-event-name <name>\", \"Original hook event name.\")\n\t\t.option(\"--notification-type <type>\", \"Notification type.\")\n\t\t.option(\"--metadata-base64 <base64>\", \"Base64-encoded JSON metadata payload.\")\n\t\t.action(\n\t\t\tasync (\n\t\t\t\tpayload: string | undefined,\n\t\t\t\toptions: HookCommandMetadataOptionValues & { event: RuntimeHookEvent },\n\t\t\t) => {\n\t\t\t\tawait runHooksIngest(options.event, options, payload);\n\t\t\t},\n\t\t);\n\n\thooks\n\t\t.command(\"notify [payload]\")\n\t\t.description(\"Best-effort hook ingest that never throws.\")\n\t\t.requiredOption(\"--event <event>\", \"Event: to_review | to_in_progress | activity.\", parseHookEvent)\n\t\t.option(\"--source <source>\", \"Hook source.\")\n\t\t.option(\"--activity-text <text>\", \"Activity summary text.\")\n\t\t.option(\"--tool-name <name>\", \"Tool name.\")\n\t\t.option(\"--final-message <message>\", \"Final message.\")\n\t\t.option(\"--hook-event-name <name>\", \"Original hook event name.\")\n\t\t.option(\"--notification-type <type>\", \"Notification type.\")\n\t\t.option(\"--metadata-base64 <base64>\", \"Base64-encoded JSON metadata payload.\")\n\t\t.action(\n\t\t\tasync (\n\t\t\t\tpayload: string | undefined,\n\t\t\t\toptions: HookCommandMetadataOptionValues & { event: RuntimeHookEvent },\n\t\t\t) => {\n\t\t\t\tawait runHooksNotify(options.event, options, payload);\n\t\t\t},\n\t\t);\n\n\thooks\n\t\t.command(\"gemini-hook\")\n\t\t.description(\"Gemini hook entrypoint.\")\n\t\t.action(async () => {\n\t\t\tawait runGeminiHookSubcommand();\n\t\t});\n\n\thooks\n\t\t.command(\"codex-wrapper [agentArgs...]\")\n\t\t.description(\"Codex wrapper that emits Kanban hook notifications.\")\n\t\t.requiredOption(\"--real-binary <path>\", \"Path to the actual codex binary.\")\n\t\t.allowUnknownOption(true)\n\t\t.action(async (agentArgs: string[] | undefined, options: { realBinary: string }) => {\n\t\t\tawait runCodexWrapperSubcommand({\n\t\t\t\trealBinary: options.realBinary,\n\t\t\t\tagentArgs: agentArgs ?? [],\n\t\t\t});\n\t\t});\n}\n"],"names":[],"mappings":"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","debugId":"a2b5534c-7970-5905-8b30-351d0e0310d7"}
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
export declare function resolveWindowsComSpec(env?: NodeJS.ProcessEnv): string;
|
|
2
|
+
export declare function buildWindowsCmdArgsCommandLine(binary: string, args: string[]): string;
|
|
3
|
+
export declare function buildWindowsCmdArgsArray(binary: string, args: string[]): string[];
|
|
4
|
+
export declare function shouldUseWindowsCmdLaunch(binary: string, platform?: NodeJS.Platform, env?: NodeJS.ProcessEnv): boolean;
|
|
5
|
+
//# sourceMappingURL=windows-cmd-launch.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"windows-cmd-launch.d.ts","sourceRoot":"","sources":["../../src/core/windows-cmd-launch.ts"],"names":[],"mappings":"AAmBA,wBAAgB,qBAAqB,CAAC,GAAG,GAAE,MAAM,CAAC,UAAwB,GAAG,MAAM,CAGlF;AAED,wBAAgB,8BAA8B,CAAC,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,GAAG,MAAM,CAKrF;AAED,wBAAgB,wBAAwB,CAAC,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,GAAG,MAAM,EAAE,CAKjF;AAED,wBAAgB,yBAAyB,CACxC,MAAM,EAAE,MAAM,EACd,QAAQ,GAAE,MAAM,CAAC,QAA2B,EAC5C,GAAG,GAAE,MAAM,CAAC,UAAwB,GAClC,OAAO,CAYT"}
|
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
|
|
2
|
+
!function(){try{var e="undefined"!=typeof window?window:"undefined"!=typeof global?global:"undefined"!=typeof globalThis?globalThis:"undefined"!=typeof self?self:{},n=(new e.Error).stack;n&&(e._sentryDebugIds=e._sentryDebugIds||{},e._sentryDebugIds[n]="0cc3a5f0-6161-5695-94e9-e7eafed0f92c")}catch(e){}}();
|
|
3
|
+
const WINDOWS_CMD_META_CHARS_REGEXP = /([()\][%!^"`<>&|;, *?])/g;
|
|
4
|
+
function normalizeWindowsCmdArgument(value) {
|
|
5
|
+
return value.replaceAll("\r\n", "\n").replaceAll("\r", "\n").replaceAll("\n", "\\n");
|
|
6
|
+
}
|
|
7
|
+
function escapeWindowsCommand(value) {
|
|
8
|
+
return value.replace(WINDOWS_CMD_META_CHARS_REGEXP, "^$1");
|
|
9
|
+
}
|
|
10
|
+
function escapeWindowsArgument(value) {
|
|
11
|
+
let escaped = normalizeWindowsCmdArgument(`${value}`);
|
|
12
|
+
escaped = escaped.replace(/(?=(\\+?)?)\1"/g, "$1$1\\\"");
|
|
13
|
+
escaped = escaped.replace(/(?=(\\+?)?)\1$/g, "$1$1");
|
|
14
|
+
escaped = `"${escaped}"`;
|
|
15
|
+
escaped = escaped.replace(WINDOWS_CMD_META_CHARS_REGEXP, "^$1");
|
|
16
|
+
return escaped;
|
|
17
|
+
}
|
|
18
|
+
export function resolveWindowsComSpec(env = process.env) {
|
|
19
|
+
const comSpec = env.ComSpec?.trim() || env.COMSPEC?.trim();
|
|
20
|
+
return comSpec || "cmd.exe";
|
|
21
|
+
}
|
|
22
|
+
export function buildWindowsCmdArgsCommandLine(binary, args) {
|
|
23
|
+
const escapedCommand = escapeWindowsCommand(binary);
|
|
24
|
+
const escapedArgs = args.map((part) => escapeWindowsArgument(part));
|
|
25
|
+
const shellCommand = [escapedCommand, ...escapedArgs].join(" ");
|
|
26
|
+
return `/d /s /c "${shellCommand}"`;
|
|
27
|
+
}
|
|
28
|
+
export function buildWindowsCmdArgsArray(binary, args) {
|
|
29
|
+
const escapedCommand = escapeWindowsCommand(binary);
|
|
30
|
+
const escapedArgs = args.map((part) => escapeWindowsArgument(part));
|
|
31
|
+
const shellCommand = [escapedCommand, ...escapedArgs].join(" ");
|
|
32
|
+
return ["/d", "/s", "/c", `"${shellCommand}"`];
|
|
33
|
+
}
|
|
34
|
+
export function shouldUseWindowsCmdLaunch(binary, platform = process.platform, env = process.env) {
|
|
35
|
+
if (platform !== "win32") {
|
|
36
|
+
return false;
|
|
37
|
+
}
|
|
38
|
+
const normalized = binary.trim().toLowerCase();
|
|
39
|
+
if (!normalized) {
|
|
40
|
+
return false;
|
|
41
|
+
}
|
|
42
|
+
if (normalized === "cmd" || normalized === "cmd.exe") {
|
|
43
|
+
return false;
|
|
44
|
+
}
|
|
45
|
+
return normalized !== resolveWindowsComSpec(env).toLowerCase();
|
|
46
|
+
}
|
|
47
|
+
//# sourceMappingURL=windows-cmd-launch.js.map
|
|
48
|
+
//# debugId=0cc3a5f0-6161-5695-94e9-e7eafed0f92c
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"windows-cmd-launch.js","sources":["../../src/core/windows-cmd-launch.ts"],"sourceRoot":"","sourcesContent":["const WINDOWS_CMD_META_CHARS_REGEXP = /([()\\][%!^\"`<>&|;, *?])/g;\n\nfunction normalizeWindowsCmdArgument(value: string): string {\n\treturn value.replaceAll(\"\\r\\n\", \"\\n\").replaceAll(\"\\r\", \"\\n\").replaceAll(\"\\n\", \"\\\\n\");\n}\n\nfunction escapeWindowsCommand(value: string): string {\n\treturn value.replace(WINDOWS_CMD_META_CHARS_REGEXP, \"^$1\");\n}\n\nfunction escapeWindowsArgument(value: string): string {\n\tlet escaped = normalizeWindowsCmdArgument(`${value}`);\n\tescaped = escaped.replace(/(?=(\\\\+?)?)\\1\"/g, \"$1$1\\\\\\\"\");\n\tescaped = escaped.replace(/(?=(\\\\+?)?)\\1$/g, \"$1$1\");\n\tescaped = `\"${escaped}\"`;\n\tescaped = escaped.replace(WINDOWS_CMD_META_CHARS_REGEXP, \"^$1\");\n\treturn escaped;\n}\n\nexport function resolveWindowsComSpec(env: NodeJS.ProcessEnv = process.env): string {\n\tconst comSpec = env.ComSpec?.trim() || env.COMSPEC?.trim();\n\treturn comSpec || \"cmd.exe\";\n}\n\nexport function buildWindowsCmdArgsCommandLine(binary: string, args: string[]): string {\n\tconst escapedCommand = escapeWindowsCommand(binary);\n\tconst escapedArgs = args.map((part) => escapeWindowsArgument(part));\n\tconst shellCommand = [escapedCommand, ...escapedArgs].join(\" \");\n\treturn `/d /s /c \"${shellCommand}\"`;\n}\n\nexport function buildWindowsCmdArgsArray(binary: string, args: string[]): string[] {\n\tconst escapedCommand = escapeWindowsCommand(binary);\n\tconst escapedArgs = args.map((part) => escapeWindowsArgument(part));\n\tconst shellCommand = [escapedCommand, ...escapedArgs].join(\" \");\n\treturn [\"/d\", \"/s\", \"/c\", `\"${shellCommand}\"`];\n}\n\nexport function shouldUseWindowsCmdLaunch(\n\tbinary: string,\n\tplatform: NodeJS.Platform = process.platform,\n\tenv: NodeJS.ProcessEnv = process.env,\n): boolean {\n\tif (platform !== \"win32\") {\n\t\treturn false;\n\t}\n\tconst normalized = binary.trim().toLowerCase();\n\tif (!normalized) {\n\t\treturn false;\n\t}\n\tif (normalized === \"cmd\" || normalized === \"cmd.exe\") {\n\t\treturn false;\n\t}\n\treturn normalized !== resolveWindowsComSpec(env).toLowerCase();\n}\n"],"names":[],"mappings":";;AAAA,MAAM,6BAA6B,GAAG,0BAA0B,CAAC;AAEjE,SAAS,2BAA2B,CAAC,KAAa;IACjD,OAAO,KAAK,CAAC,UAAU,CAAC,MAAM,EAAE,IAAI,CAAC,CAAC,UAAU,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC,UAAU,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC;AACtF,CAAC;AAED,SAAS,oBAAoB,CAAC,KAAa;IAC1C,OAAO,KAAK,CAAC,OAAO,CAAC,6BAA6B,EAAE,KAAK,CAAC,CAAC;AAC5D,CAAC;AAED,SAAS,qBAAqB,CAAC,KAAa;IAC3C,IAAI,OAAO,GAAG,2BAA2B,CAAC,GAAG,KAAK,EAAE,CAAC,CAAC;IACtD,OAAO,GAAG,OAAO,CAAC,OAAO,CAAC,iBAAiB,EAAE,UAAU,CAAC,CAAC;IACzD,OAAO,GAAG,OAAO,CAAC,OAAO,CAAC,iBAAiB,EAAE,MAAM,CAAC,CAAC;IACrD,OAAO,GAAG,IAAI,OAAO,GAAG,CAAC;IACzB,OAAO,GAAG,OAAO,CAAC,OAAO,CAAC,6BAA6B,EAAE,KAAK,CAAC,CAAC;IAChE,OAAO,OAAO,CAAC;AAChB,CAAC;AAED,MAAM,UAAU,qBAAqB,CAAC,MAAyB,OAAO,CAAC,GAAG;IACzE,MAAM,OAAO,GAAG,GAAG,CAAC,OAAO,EAAE,IAAI,EAAE,IAAI,GAAG,CAAC,OAAO,EAAE,IAAI,EAAE,CAAC;IAC3D,OAAO,OAAO,IAAI,SAAS,CAAC;AAC7B,CAAC;AAED,MAAM,UAAU,8BAA8B,CAAC,MAAc,EAAE,IAAc;IAC5E,MAAM,cAAc,GAAG,oBAAoB,CAAC,MAAM,CAAC,CAAC;IACpD,MAAM,WAAW,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,qBAAqB,CAAC,IAAI,CAAC,CAAC,CAAC;IACpE,MAAM,YAAY,GAAG,CAAC,cAAc,EAAE,GAAG,WAAW,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;IAChE,OAAO,aAAa,YAAY,GAAG,CAAC;AACrC,CAAC;AAED,MAAM,UAAU,wBAAwB,CAAC,MAAc,EAAE,IAAc;IACtE,MAAM,cAAc,GAAG,oBAAoB,CAAC,MAAM,CAAC,CAAC;IACpD,MAAM,WAAW,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,qBAAqB,CAAC,IAAI,CAAC,CAAC,CAAC;IACpE,MAAM,YAAY,GAAG,CAAC,cAAc,EAAE,GAAG,WAAW,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;IAChE,OAAO,CAAC,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,YAAY,GAAG,CAAC,CAAC;AAChD,CAAC;AAED,MAAM,UAAU,yBAAyB,CACxC,MAAc,EACd,WAA4B,OAAO,CAAC,QAAQ,EAC5C,MAAyB,OAAO,CAAC,GAAG;IAEpC,IAAI,QAAQ,KAAK,OAAO,EAAE,CAAC;QAC1B,OAAO,KAAK,CAAC;IACd,CAAC;IACD,MAAM,UAAU,GAAG,MAAM,CAAC,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC;IAC/C,IAAI,CAAC,UAAU,EAAE,CAAC;QACjB,OAAO,KAAK,CAAC;IACd,CAAC;IACD,IAAI,UAAU,KAAK,KAAK,IAAI,UAAU,KAAK,SAAS,EAAE,CAAC;QACtD,OAAO,KAAK,CAAC;IACd,CAAC;IACD,OAAO,UAAU,KAAK,qBAAqB,CAAC,GAAG,CAAC,CAAC,WAAW,EAAE,CAAC;AAChE,CAAC","debugId":"0cc3a5f0-6161-5695-94e9-e7eafed0f92c"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"append-system-prompt.d.ts","sourceRoot":"","sources":["../../src/prompts/append-system-prompt.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,yBAAyB,CAAC;AAS9D,MAAM,WAAW,6CAA6C;IAC7D,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,IAAI,CAAC,EAAE,MAAM,EAAE,CAAC;IAChB,QAAQ,CAAC,EAAE,MAAM,EAAE,CAAC;IACpB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,eAAe,CAAC,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,MAAM,CAAC;CAC3C;AAED,MAAM,WAAW,+BAA+B;IAC/C,OAAO,CAAC,EAAE,cAAc,GAAG,IAAI,CAAC;CAChC;AA8CD,wBAAgB,sCAAsC,CACrD,OAAO,GAAE,6CAAkD,GACzD,MAAM,CAiDR;AAED,wBAAgB,wBAAwB,CACvC,aAAa,EAAE,MAAM,EACrB,OAAO,GAAE,+BAAoC,GAC3C,MAAM,
|
|
1
|
+
{"version":3,"file":"append-system-prompt.d.ts","sourceRoot":"","sources":["../../src/prompts/append-system-prompt.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,yBAAyB,CAAC;AAS9D,MAAM,WAAW,6CAA6C;IAC7D,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,IAAI,CAAC,EAAE,MAAM,EAAE,CAAC;IAChB,QAAQ,CAAC,EAAE,MAAM,EAAE,CAAC;IACpB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,eAAe,CAAC,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,MAAM,CAAC;CAC3C;AAED,MAAM,WAAW,+BAA+B;IAC/C,OAAO,CAAC,EAAE,cAAc,GAAG,IAAI,CAAC;CAChC;AA8CD,wBAAgB,sCAAsC,CACrD,OAAO,GAAE,6CAAkD,GACzD,MAAM,CAiDR;AAED,wBAAgB,wBAAwB,CACvC,aAAa,EAAE,MAAM,EACrB,OAAO,GAAE,+BAAoC,GAC3C,MAAM,CA8KR;AAED,wBAAgB,kCAAkC,CACjD,MAAM,EAAE,MAAM,EACd,OAAO,GAAE,6CAAkD,GACzD,MAAM,GAAG,IAAI,CAOf"}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
|
|
2
|
-
!function(){try{var e="undefined"!=typeof window?window:"undefined"!=typeof global?global:"undefined"!=typeof globalThis?globalThis:"undefined"!=typeof self?self:{},n=(new e.Error).stack;n&&(e._sentryDebugIds=e._sentryDebugIds||{},e._sentryDebugIds[n]="
|
|
2
|
+
!function(){try{var e="undefined"!=typeof window?window:"undefined"!=typeof global?global:"undefined"!=typeof globalThis?globalThis:"undefined"!=typeof self?self:{},n=(new e.Error).stack;n&&(e._sentryDebugIds=e._sentryDebugIds||{},e._sentryDebugIds[n]="3ecfa8e3-7bb5-56b6-9619-d61750206e2b")}catch(e){}}();
|
|
3
3
|
import { realpathSync } from "node:fs";
|
|
4
4
|
import packageJson from "../../package.json" with { type: "json" };
|
|
5
5
|
import { resolveKanbanCommandParts } from "../core/kanban-command.js";
|
|
@@ -100,7 +100,13 @@ You are the Kanban sidebar agent for this workspace. Help the user interact with
|
|
|
100
100
|
|
|
101
101
|
Kanban is a CLI tool for orchestrating multiple coding agents working on tasks in parallel on a kanban board. It manages git worktrees automatically so that each task can run a dedicated CLI agent in its own worktree.
|
|
102
102
|
|
|
103
|
-
You
|
|
103
|
+
You are a Kanban board management helper: your job is to create, organize, link, start, and manage tasks using the Kanban CLI.
|
|
104
|
+
|
|
105
|
+
# CRITICAL: You are NOT a coding agent
|
|
106
|
+
|
|
107
|
+
NEVER edit, create, delete, or modify any files in the workspace. NEVER write code, fix bugs, refactor, or do any implementation work yourself. You do not have the role of a coding assistant. Your only job is to manage the Kanban board using the Kanban CLI commands listed below.
|
|
108
|
+
|
|
109
|
+
If the user asks you to write code, fix a bug, implement a feature, refactor, or do any hands-on development work, do NOT attempt it. Instead, help them by creating tasks on the Kanban board so a dedicated coding agent can do that work in its own worktree. Always redirect implementation requests to task creation.
|
|
104
110
|
|
|
105
111
|
- If the user asks to add tasks to kb, ask kb, kanban, or says add tasks without other context, they likely want to add tasks in Kanban. This includes phrases like "create tasks", "make 3 tasks", "add a task", "break down into tasks", "split into tasks", "decompose into tasks", and "turn into tasks".
|
|
106
112
|
- Kanban also supports linking tasks. Linking is useful both for parallelization and for dependencies: when work is easy to decompose into multiple pieces that can be done in parallel, link multiple backlog tasks to the same dependency so they all become ready to start once that dependency finishes; when one piece of work depends on another, use links to represent that follow-on dependency. If both linked tasks are in backlog, Kanban preserves the order you pass to the command: \`--task-id\` waits on \`--linked-task-id\`, and on the board the arrow points into \`--linked-task-id\`. Once only one linked task remains in backlog, Kanban reorients the saved dependency so the backlog task is the waiting dependent task and the other task is the prerequisite. The board arrow points into the prerequisite task so the user can see what must finish first. A link requires at least one backlog task, and when the linked review task is moved to trash, that backlog task becomes ready to start.
|
|
@@ -115,6 +121,7 @@ Use this prefix for every Kanban command in this session:
|
|
|
115
121
|
|
|
116
122
|
# Tool Invocation Notes
|
|
117
123
|
|
|
124
|
+
- NEVER use file-editing tools. You are not a coding agent. If you catch yourself about to edit a file, stop and suggest creating a Kanban task instead.
|
|
118
125
|
- When using the \`run_commands\` tool, always pass \`commands\` as an array, even when running only one command.
|
|
119
126
|
|
|
120
127
|
# GitHub and Linear Guidance
|
|
@@ -268,4 +275,4 @@ export function resolveHomeAgentAppendSystemPrompt(taskId, options = {}) {
|
|
|
268
275
|
});
|
|
269
276
|
}
|
|
270
277
|
//# sourceMappingURL=append-system-prompt.js.map
|
|
271
|
-
//# debugId=
|
|
278
|
+
//# debugId=3ecfa8e3-7bb5-56b6-9619-d61750206e2b
|