kanban 0.1.48 → 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/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-BSAcYL3r.js → index-CZZYlM1g.js} +1942 -1942
- package/dist/web-ui/assets/{index-BSAcYL3r.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":"pty-session.d.ts","sourceRoot":"","sources":["../../src/terminal/pty-session.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"pty-session.d.ts","sourceRoot":"","sources":["../../src/terminal/pty-session.ts"],"names":[],"mappings":"AAUA,MAAM,WAAW,YAAY;IAC5B,QAAQ,EAAE,MAAM,CAAC;IACjB,MAAM,CAAC,EAAE,MAAM,CAAC;CAChB;AAED,MAAM,WAAW,sBAAsB;IACtC,MAAM,EAAE,MAAM,CAAC;IACf,IAAI,CAAC,EAAE,MAAM,EAAE,GAAG,MAAM,CAAC;IACzB,GAAG,EAAE,MAAM,CAAC;IACZ,GAAG,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,SAAS,CAAC,CAAC;IACzC,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,CAAC,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,IAAI,CAAC;IACjC,MAAM,CAAC,EAAE,CAAC,KAAK,EAAE,YAAY,KAAK,IAAI,CAAC;CACvC;AA0CD,qBAAa,UAAU;IASrB,OAAO,CAAC,QAAQ,CAAC,cAAc,CAAC;IAChC,OAAO,CAAC,QAAQ,CAAC,cAAc,CAAC;IATjC,OAAO,CAAC,QAAQ,CAAC,UAAU,CAAW;IACtC,OAAO,CAAC,QAAQ,CAAC,aAAa,CAAgB;IAC9C,OAAO,CAAC,YAAY,CAAK;IACzB,OAAO,CAAC,WAAW,CAAS;IAC5B,OAAO,CAAC,MAAM,CAAS;IAEvB,OAAO;IAyBP,MAAM,CAAC,KAAK,CAAC,EAAE,MAAM,EAAE,IAAS,EAAE,GAAG,EAAE,GAAG,EAAE,IAAI,EAAE,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,EAAE,sBAAsB,GAAG,UAAU;IAqB7G,IAAI,GAAG,IAAI,MAAM,CAEhB;IAED,gBAAgB,IAAI,SAAS,MAAM,EAAE;IAIrC,KAAK,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI;IAWlC,MAAM,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,UAAU,CAAC,EAAE,MAAM,EAAE,WAAW,CAAC,EAAE,MAAM,GAAG,IAAI;IAsBnF,KAAK,IAAI,IAAI;IAIb,MAAM,IAAI,IAAI;IAId,IAAI,CAAC,OAAO,CAAC,EAAE;QAAE,WAAW,CAAC,EAAE,OAAO,CAAA;KAAE,GAAG,IAAI;IAO/C,cAAc,IAAI,OAAO;CAGzB"}
|
|
@@ -1,8 +1,8 @@
|
|
|
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]="40ba9fb0-4b01-514b-89f5-af0720c88f03")}catch(e){}}();
|
|
3
3
|
import * as pty from "node-pty";
|
|
4
|
+
import { buildWindowsCmdArgsCommandLine, resolveWindowsComSpec, shouldUseWindowsCmdLaunch, } from "../core/windows-cmd-launch.js";
|
|
4
5
|
const MAX_HISTORY_BYTES = 1024 * 1024;
|
|
5
|
-
const WINDOWS_CMD_META_CHARS_REGEXP = /([()\][%!^"`<>&|;, *?])/g;
|
|
6
6
|
function normalizeOutputChunk(data) {
|
|
7
7
|
if (typeof data === "string") {
|
|
8
8
|
return Buffer.from(data, "utf8");
|
|
@@ -38,43 +38,6 @@ function terminatePtyProcess(ptyProcess) {
|
|
|
38
38
|
}
|
|
39
39
|
}
|
|
40
40
|
}
|
|
41
|
-
function resolveWindowsComSpec() {
|
|
42
|
-
const comSpec = process.env.ComSpec?.trim() || process.env.COMSPEC?.trim();
|
|
43
|
-
return comSpec || "cmd.exe";
|
|
44
|
-
}
|
|
45
|
-
function escapeWindowsCommand(value) {
|
|
46
|
-
return value.replace(WINDOWS_CMD_META_CHARS_REGEXP, "^$1");
|
|
47
|
-
}
|
|
48
|
-
function normalizeWindowsCmdArgument(value) {
|
|
49
|
-
return value.replaceAll("\r\n", "\n").replaceAll("\r", "\n").replaceAll("\n", "\\n");
|
|
50
|
-
}
|
|
51
|
-
function escapeWindowsArgument(value) {
|
|
52
|
-
let escaped = normalizeWindowsCmdArgument(`${value}`);
|
|
53
|
-
escaped = escaped.replace(/(?=(\\+?)?)\1"/g, "$1$1\\\"");
|
|
54
|
-
escaped = escaped.replace(/(?=(\\+?)?)\1$/g, "$1$1");
|
|
55
|
-
escaped = `"${escaped}"`;
|
|
56
|
-
escaped = escaped.replace(WINDOWS_CMD_META_CHARS_REGEXP, "^$1");
|
|
57
|
-
return escaped;
|
|
58
|
-
}
|
|
59
|
-
function buildWindowsCmdArgsCommandLine(binary, args) {
|
|
60
|
-
const escapedCommand = escapeWindowsCommand(binary);
|
|
61
|
-
const escapedArgs = args.map((part) => escapeWindowsArgument(part));
|
|
62
|
-
const shellCommand = [escapedCommand, ...escapedArgs].join(" ");
|
|
63
|
-
return `/d /s /c "${shellCommand}"`;
|
|
64
|
-
}
|
|
65
|
-
function shouldUseWindowsShellLaunch(binary) {
|
|
66
|
-
if (process.platform !== "win32") {
|
|
67
|
-
return false;
|
|
68
|
-
}
|
|
69
|
-
const normalized = binary.trim().toLowerCase();
|
|
70
|
-
if (!normalized) {
|
|
71
|
-
return false;
|
|
72
|
-
}
|
|
73
|
-
if (normalized === "cmd" || normalized === "cmd.exe") {
|
|
74
|
-
return false;
|
|
75
|
-
}
|
|
76
|
-
return normalized !== resolveWindowsComSpec().toLowerCase();
|
|
77
|
-
}
|
|
78
41
|
export class PtySession {
|
|
79
42
|
onDataCallback;
|
|
80
43
|
onExitCallback;
|
|
@@ -108,7 +71,7 @@ export class PtySession {
|
|
|
108
71
|
static spawn({ binary, args = [], cwd, env, cols, rows, onData, onExit }) {
|
|
109
72
|
const normalizedArgs = typeof args === "string" ? [args] : args;
|
|
110
73
|
const terminalName = env?.TERM?.trim() || process.env.TERM?.trim() || "xterm-256color";
|
|
111
|
-
const useWindowsShellLaunch =
|
|
74
|
+
const useWindowsShellLaunch = shouldUseWindowsCmdLaunch(binary);
|
|
112
75
|
const spawnBinary = useWindowsShellLaunch ? resolveWindowsComSpec() : binary;
|
|
113
76
|
const spawnArgs = useWindowsShellLaunch
|
|
114
77
|
? buildWindowsCmdArgsCommandLine(binary, normalizedArgs)
|
|
@@ -180,4 +143,4 @@ export class PtySession {
|
|
|
180
143
|
}
|
|
181
144
|
}
|
|
182
145
|
//# sourceMappingURL=pty-session.js.map
|
|
183
|
-
//# debugId=
|
|
146
|
+
//# debugId=40ba9fb0-4b01-514b-89f5-af0720c88f03
|