kanban 0.1.13 → 0.1.15
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +40 -22
- package/dist/cli.js +26 -41
- package/dist/cli.js.map +1 -1
- package/dist/commands/hooks.d.ts +1 -0
- package/dist/commands/hooks.d.ts.map +1 -1
- package/dist/commands/hooks.js +15 -11
- package/dist/commands/hooks.js.map +1 -1
- package/dist/server/browser.d.ts +8 -1
- package/dist/server/browser.d.ts.map +1 -1
- package/dist/server/browser.js +50 -11
- package/dist/server/browser.js.map +1 -1
- package/dist/server/directory-picker.d.ts +10 -0
- package/dist/server/directory-picker.d.ts.map +1 -0
- package/dist/server/directory-picker.js +114 -0
- package/dist/server/directory-picker.js.map +1 -0
- package/dist/server/process-termination.d.ts +12 -0
- package/dist/server/process-termination.d.ts.map +1 -0
- package/dist/server/process-termination.js +21 -0
- package/dist/server/process-termination.js.map +1 -0
- package/dist/terminal/agent-session-adapters.d.ts.map +1 -1
- package/dist/terminal/agent-session-adapters.js +31 -32
- package/dist/terminal/agent-session-adapters.js.map +1 -1
- package/dist/terminal/opencode-paths.d.ts +10 -0
- package/dist/terminal/opencode-paths.d.ts.map +1 -0
- package/dist/terminal/opencode-paths.js +62 -0
- package/dist/terminal/opencode-paths.js.map +1 -0
- package/dist/terminal/task-start-setup-detection.d.ts.map +1 -1
- package/dist/terminal/task-start-setup-detection.js +2 -10
- package/dist/terminal/task-start-setup-detection.js.map +1 -1
- package/dist/web-ui/assets/{index-CY5RDApA.js → index-2qSmw1LR.js} +5787 -5756
- package/dist/web-ui/index.html +1 -1
- package/dist/workspace/task-worktree.d.ts +8 -0
- package/dist/workspace/task-worktree.d.ts.map +1 -1
- package/dist/workspace/task-worktree.js +15 -1
- package/dist/workspace/task-worktree.js.map +1 -1
- package/package.json +3 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"hooks.js","sourceRoot":"","sources":["../../src/commands/hooks.ts"],"names":[],"mappings":"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","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;\nconst MAX_FINAL_MESSAGE_LENGTH = 600;\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}\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 = truncateText(normalizeWhitespace(finalMessage), MAX_FINAL_MESSAGE_LENGTH);\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)}` : \"Waiting for review\";\n\t}\n\tif (normalizedHookEvent === \"taskcomplete\") {\n\t\treturn finalMessage ? `Final: ${truncateText(finalMessage, 140)}` : \"Waiting for review\";\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 \"Waiting for review\";\n\t}\n\n\tif (event === \"to_review\") {\n\t\treturn \"Waiting for review\";\n\t}\n\tif (event === \"to_in_progress\") {\n\t\treturn \"Agent active\";\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 transcriptPath = payload ? readStringField(payload, \"transcript_path\") : null;\n\tlet inferredSource: string | null = null;\n\tif (transcriptPath?.includes(\"/.claude/\")) {\n\t\tinferredSource = \"claude\";\n\t} else if (transcriptPath?.includes(\"/.factory/\")) {\n\t\tinferredSource = \"droid\";\n\t} else if (payload && readStringField(payload, \"type\") === \"agent-turn-complete\") {\n\t\tinferredSource = \"codex\";\n\t}\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 ? truncateText(normalizeWhitespace(finalMessage), MAX_FINAL_MESSAGE_LENGTH) : 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 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\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)}` : \"Waiting for review\",\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: CodexWatcherState = {\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};\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\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 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\tconst child = spawn(wrapperArgs.realBinary, [\"-c\", notifyConfig, ...wrapperArgs.agentArgs], {\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"]}
|
|
1
|
+
{"version":3,"file":"hooks.js","sourceRoot":"","sources":["../../src/commands/hooks.ts"],"names":[],"mappings":"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","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;\nconst MAX_FINAL_MESSAGE_LENGTH = 600;\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}\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 = truncateText(normalizeWhitespace(finalMessage), MAX_FINAL_MESSAGE_LENGTH);\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)}` : \"Waiting for review\";\n\t}\n\tif (normalizedHookEvent === \"taskcomplete\") {\n\t\treturn finalMessage ? `Final: ${truncateText(finalMessage, 140)}` : \"Waiting for review\";\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 \"Waiting for review\";\n\t}\n\n\tif (event === \"to_review\") {\n\t\treturn \"Waiting for review\";\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 ? truncateText(normalizeWhitespace(finalMessage), MAX_FINAL_MESSAGE_LENGTH) : 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 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\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)}` : \"Waiting for review\",\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: CodexWatcherState = {\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};\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\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 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\tconst child = spawn(wrapperArgs.realBinary, [\"-c\", notifyConfig, ...wrapperArgs.agentArgs], {\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"]}
|
package/dist/server/browser.d.ts
CHANGED
|
@@ -1,2 +1,9 @@
|
|
|
1
|
-
|
|
1
|
+
import { spawn } from "node:child_process";
|
|
2
|
+
type BrowserOpenDeps = {
|
|
3
|
+
platform: NodeJS.Platform;
|
|
4
|
+
spawnProcess: typeof spawn;
|
|
5
|
+
warn: (message: string) => void;
|
|
6
|
+
};
|
|
7
|
+
export declare function openInBrowser(url: string, deps?: Partial<BrowserOpenDeps>): void;
|
|
8
|
+
export {};
|
|
2
9
|
//# sourceMappingURL=browser.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"browser.d.ts","sourceRoot":"","sources":["../../src/server/browser.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"browser.d.ts","sourceRoot":"","sources":["../../src/server/browser.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,MAAM,oBAAoB,CAAC;AAE3C,KAAK,eAAe,GAAG;IACtB,QAAQ,EAAE,MAAM,CAAC,QAAQ,CAAC;IAC1B,YAAY,EAAE,OAAO,KAAK,CAAC;IAC3B,IAAI,EAAE,CAAC,OAAO,EAAE,MAAM,KAAK,IAAI,CAAC;CAChC,CAAC;AAuBF,wBAAgB,aAAa,CAAC,GAAG,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,OAAO,CAAC,eAAe,CAAC,GAAG,IAAI,CAyChF"}
|
package/dist/server/browser.js
CHANGED
|
@@ -1,16 +1,55 @@
|
|
|
1
1
|
import { spawn } from "node:child_process";
|
|
2
|
-
|
|
3
|
-
if (
|
|
4
|
-
|
|
5
|
-
child.unref();
|
|
6
|
-
return;
|
|
2
|
+
function getOpenCommandCandidates(platform, url) {
|
|
3
|
+
if (platform === "darwin") {
|
|
4
|
+
return [{ command: "open", args: [url] }];
|
|
7
5
|
}
|
|
8
|
-
if (
|
|
9
|
-
|
|
10
|
-
child.unref();
|
|
11
|
-
return;
|
|
6
|
+
if (platform === "win32") {
|
|
7
|
+
return [{ command: "cmd", args: ["/c", "start", "", url] }];
|
|
12
8
|
}
|
|
13
|
-
|
|
14
|
-
|
|
9
|
+
return [
|
|
10
|
+
{ command: "xdg-open", args: [url] },
|
|
11
|
+
{ command: "gio", args: ["open", url] },
|
|
12
|
+
{ command: "sensible-browser", args: [url] },
|
|
13
|
+
];
|
|
14
|
+
}
|
|
15
|
+
function formatBrowserOpenError(error) {
|
|
16
|
+
if (error instanceof Error) {
|
|
17
|
+
return error.message;
|
|
18
|
+
}
|
|
19
|
+
return String(error);
|
|
20
|
+
}
|
|
21
|
+
export function openInBrowser(url, deps) {
|
|
22
|
+
const platform = deps?.platform ?? process.platform;
|
|
23
|
+
const spawnProcess = deps?.spawnProcess ?? spawn;
|
|
24
|
+
const warn = deps?.warn ?? (() => { });
|
|
25
|
+
const candidates = getOpenCommandCandidates(platform, url);
|
|
26
|
+
const launchCandidate = (index) => {
|
|
27
|
+
if (index >= candidates.length) {
|
|
28
|
+
warn(`Could not open browser automatically. Open this URL manually: ${url}`);
|
|
29
|
+
return;
|
|
30
|
+
}
|
|
31
|
+
const candidate = candidates[index];
|
|
32
|
+
try {
|
|
33
|
+
const child = spawnProcess(candidate.command, candidate.args, { detached: true, stdio: "ignore" });
|
|
34
|
+
child.once("error", (error) => {
|
|
35
|
+
const code = typeof error === "object" && error && "code" in error ? String(error.code) : null;
|
|
36
|
+
if (code === "ENOENT") {
|
|
37
|
+
launchCandidate(index + 1);
|
|
38
|
+
return;
|
|
39
|
+
}
|
|
40
|
+
warn(`Could not open browser automatically via ${candidate.command}: ${formatBrowserOpenError(error)}. Open this URL manually: ${url}`);
|
|
41
|
+
});
|
|
42
|
+
child.unref();
|
|
43
|
+
}
|
|
44
|
+
catch (error) {
|
|
45
|
+
const code = typeof error === "object" && error && "code" in error ? String(error.code) : null;
|
|
46
|
+
if (code === "ENOENT") {
|
|
47
|
+
launchCandidate(index + 1);
|
|
48
|
+
return;
|
|
49
|
+
}
|
|
50
|
+
warn(`Could not open browser automatically via ${candidate.command}: ${formatBrowserOpenError(error)}. Open this URL manually: ${url}`);
|
|
51
|
+
}
|
|
52
|
+
};
|
|
53
|
+
launchCandidate(0);
|
|
15
54
|
}
|
|
16
55
|
//# sourceMappingURL=browser.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"browser.js","sourceRoot":"","sources":["../../src/server/browser.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,MAAM,oBAAoB,CAAC;
|
|
1
|
+
{"version":3,"file":"browser.js","sourceRoot":"","sources":["../../src/server/browser.ts"],"names":[],"mappings":"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","sourcesContent":["import { spawn } from \"node:child_process\";\n\ntype BrowserOpenDeps = {\n\tplatform: NodeJS.Platform;\n\tspawnProcess: typeof spawn;\n\twarn: (message: string) => void;\n};\n\nfunction getOpenCommandCandidates(platform: NodeJS.Platform, url: string): Array<{ command: string; args: string[] }> {\n\tif (platform === \"darwin\") {\n\t\treturn [{ command: \"open\", args: [url] }];\n\t}\n\tif (platform === \"win32\") {\n\t\treturn [{ command: \"cmd\", args: [\"/c\", \"start\", \"\", url] }];\n\t}\n\treturn [\n\t\t{ command: \"xdg-open\", args: [url] },\n\t\t{ command: \"gio\", args: [\"open\", url] },\n\t\t{ command: \"sensible-browser\", args: [url] },\n\t];\n}\n\nfunction formatBrowserOpenError(error: unknown): string {\n\tif (error instanceof Error) {\n\t\treturn error.message;\n\t}\n\treturn String(error);\n}\n\nexport function openInBrowser(url: string, deps?: Partial<BrowserOpenDeps>): void {\n\tconst platform = deps?.platform ?? process.platform;\n\tconst spawnProcess = deps?.spawnProcess ?? spawn;\n\tconst warn = deps?.warn ?? (() => {});\n\n\tconst candidates = getOpenCommandCandidates(platform, url);\n\n\tconst launchCandidate = (index: number): void => {\n\t\tif (index >= candidates.length) {\n\t\t\twarn(`Could not open browser automatically. Open this URL manually: ${url}`);\n\t\t\treturn;\n\t\t}\n\n\t\tconst candidate = candidates[index];\n\n\t\ttry {\n\t\t\tconst child = spawnProcess(candidate.command, candidate.args, { detached: true, stdio: \"ignore\" });\n\t\t\tchild.once(\"error\", (error) => {\n\t\t\t\tconst code = typeof error === \"object\" && error && \"code\" in error ? String(error.code) : null;\n\t\t\t\tif (code === \"ENOENT\") {\n\t\t\t\t\tlaunchCandidate(index + 1);\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t\twarn(\n\t\t\t\t\t`Could not open browser automatically via ${candidate.command}: ${formatBrowserOpenError(error)}. Open this URL manually: ${url}`,\n\t\t\t\t);\n\t\t\t});\n\t\t\tchild.unref();\n\t\t} catch (error) {\n\t\t\tconst code = typeof error === \"object\" && error && \"code\" in error ? String(error.code) : null;\n\t\t\tif (code === \"ENOENT\") {\n\t\t\t\tlaunchCandidate(index + 1);\n\t\t\t\treturn;\n\t\t\t}\n\t\t\twarn(\n\t\t\t\t`Could not open browser automatically via ${candidate.command}: ${formatBrowserOpenError(error)}. Open this URL manually: ${url}`,\n\t\t\t);\n\t\t}\n\t};\n\n\tlaunchCandidate(0);\n}\n"]}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import { spawnSync } from "node:child_process";
|
|
2
|
+
type RunCommand = (command: string, args: string[]) => ReturnType<typeof spawnSync>;
|
|
3
|
+
interface PickDirectoryPathFromSystemDialogOptions {
|
|
4
|
+
platform?: NodeJS.Platform;
|
|
5
|
+
cwd?: string;
|
|
6
|
+
runCommand?: RunCommand;
|
|
7
|
+
}
|
|
8
|
+
export declare function pickDirectoryPathFromSystemDialog(options?: PickDirectoryPathFromSystemDialogOptions): string | null;
|
|
9
|
+
export {};
|
|
10
|
+
//# sourceMappingURL=directory-picker.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"directory-picker.d.ts","sourceRoot":"","sources":["../../src/server/directory-picker.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,oBAAoB,CAAC;AAY/C,KAAK,UAAU,GAAG,CAAC,OAAO,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,KAAK,UAAU,CAAC,OAAO,SAAS,CAAC,CAAC;AAEpF,UAAU,wCAAwC;IACjD,QAAQ,CAAC,EAAE,MAAM,CAAC,QAAQ,CAAC;IAC3B,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,UAAU,CAAC,EAAE,UAAU,CAAC;CACxB;AA8DD,wBAAgB,iCAAiC,CAAC,OAAO,GAAE,wCAA6C,GAAG,MAAM,GAAG,IAAI,CA2EvH"}
|
|
@@ -0,0 +1,114 @@
|
|
|
1
|
+
import { spawnSync } from "node:child_process";
|
|
2
|
+
const WINDOWS_DIRECTORY_PICKER_SCRIPT = [
|
|
3
|
+
"$ErrorActionPreference = 'Stop'",
|
|
4
|
+
"Add-Type -AssemblyName System.Windows.Forms",
|
|
5
|
+
"$dialog = New-Object System.Windows.Forms.FolderBrowserDialog",
|
|
6
|
+
"$dialog.Description = 'Select a project folder'",
|
|
7
|
+
"$dialog.ShowNewFolderButton = $false",
|
|
8
|
+
"if ($dialog.ShowDialog() -eq [System.Windows.Forms.DialogResult]::OK) { [Console]::Out.Write($dialog.SelectedPath) }",
|
|
9
|
+
].join("; ");
|
|
10
|
+
function parseChildProcessErrorCode(error) {
|
|
11
|
+
if (!error || typeof error !== "object" || !("code" in error)) {
|
|
12
|
+
return null;
|
|
13
|
+
}
|
|
14
|
+
const code = error.code;
|
|
15
|
+
return typeof code === "string" ? code : null;
|
|
16
|
+
}
|
|
17
|
+
function defaultRunCommand(command, args) {
|
|
18
|
+
return spawnSync(command, args, {
|
|
19
|
+
encoding: "utf8",
|
|
20
|
+
stdio: ["ignore", "pipe", "pipe"],
|
|
21
|
+
});
|
|
22
|
+
}
|
|
23
|
+
function runDirectoryPickerCommand(candidate, runCommand) {
|
|
24
|
+
const result = runCommand(candidate.command, candidate.args);
|
|
25
|
+
const errorCode = parseChildProcessErrorCode(result.error);
|
|
26
|
+
if (errorCode === "ENOENT") {
|
|
27
|
+
return { kind: "unavailable" };
|
|
28
|
+
}
|
|
29
|
+
if (result.error) {
|
|
30
|
+
const message = result.error.message || String(result.error);
|
|
31
|
+
throw new Error(`Could not open directory picker via ${candidate.command}: ${message}`);
|
|
32
|
+
}
|
|
33
|
+
if (result.signal) {
|
|
34
|
+
throw new Error(`Directory picker command ${candidate.command} terminated by signal: ${result.signal}`);
|
|
35
|
+
}
|
|
36
|
+
if (result.status !== 0) {
|
|
37
|
+
const stderr = typeof result.stderr === "string" ? result.stderr.trim() : "";
|
|
38
|
+
if (stderr) {
|
|
39
|
+
throw new Error(`Could not open directory picker via ${candidate.command}: ${stderr}`);
|
|
40
|
+
}
|
|
41
|
+
return { kind: "cancelled" };
|
|
42
|
+
}
|
|
43
|
+
const selectedPath = typeof result.stdout === "string" ? result.stdout.trim() : "";
|
|
44
|
+
if (!selectedPath) {
|
|
45
|
+
return { kind: "cancelled" };
|
|
46
|
+
}
|
|
47
|
+
return { kind: "selected", path: selectedPath };
|
|
48
|
+
}
|
|
49
|
+
export function pickDirectoryPathFromSystemDialog(options = {}) {
|
|
50
|
+
const platform = options.platform ?? process.platform;
|
|
51
|
+
const cwd = options.cwd ?? process.cwd();
|
|
52
|
+
const runCommand = options.runCommand ?? defaultRunCommand;
|
|
53
|
+
if (platform === "darwin") {
|
|
54
|
+
const result = runDirectoryPickerCommand({
|
|
55
|
+
command: "osascript",
|
|
56
|
+
args: ["-e", 'POSIX path of (choose folder with prompt "Select a project folder")'],
|
|
57
|
+
}, runCommand);
|
|
58
|
+
if (result.kind === "selected") {
|
|
59
|
+
return result.path;
|
|
60
|
+
}
|
|
61
|
+
if (result.kind === "cancelled") {
|
|
62
|
+
return null;
|
|
63
|
+
}
|
|
64
|
+
throw new Error('Could not open directory picker. Command "osascript" is not available.');
|
|
65
|
+
}
|
|
66
|
+
if (platform === "linux") {
|
|
67
|
+
const candidates = [
|
|
68
|
+
{
|
|
69
|
+
command: "zenity",
|
|
70
|
+
args: ["--file-selection", "--directory", "--title=Select project folder"],
|
|
71
|
+
},
|
|
72
|
+
{
|
|
73
|
+
command: "kdialog",
|
|
74
|
+
args: ["--getexistingdirectory", cwd, "Select project folder"],
|
|
75
|
+
},
|
|
76
|
+
];
|
|
77
|
+
for (const candidate of candidates) {
|
|
78
|
+
const result = runDirectoryPickerCommand(candidate, runCommand);
|
|
79
|
+
if (result.kind === "unavailable") {
|
|
80
|
+
continue;
|
|
81
|
+
}
|
|
82
|
+
if (result.kind === "selected") {
|
|
83
|
+
return result.path;
|
|
84
|
+
}
|
|
85
|
+
return null;
|
|
86
|
+
}
|
|
87
|
+
throw new Error('Could not open directory picker. Install "zenity" or "kdialog" and try again.');
|
|
88
|
+
}
|
|
89
|
+
if (platform === "win32") {
|
|
90
|
+
const candidates = [
|
|
91
|
+
{
|
|
92
|
+
command: "powershell",
|
|
93
|
+
args: ["-NoProfile", "-STA", "-Command", WINDOWS_DIRECTORY_PICKER_SCRIPT],
|
|
94
|
+
},
|
|
95
|
+
{
|
|
96
|
+
command: "pwsh",
|
|
97
|
+
args: ["-NoProfile", "-STA", "-Command", WINDOWS_DIRECTORY_PICKER_SCRIPT],
|
|
98
|
+
},
|
|
99
|
+
];
|
|
100
|
+
for (const candidate of candidates) {
|
|
101
|
+
const result = runDirectoryPickerCommand(candidate, runCommand);
|
|
102
|
+
if (result.kind === "unavailable") {
|
|
103
|
+
continue;
|
|
104
|
+
}
|
|
105
|
+
if (result.kind === "selected") {
|
|
106
|
+
return result.path;
|
|
107
|
+
}
|
|
108
|
+
return null;
|
|
109
|
+
}
|
|
110
|
+
throw new Error('Could not open directory picker. Install PowerShell ("powershell" or "pwsh") and try again.');
|
|
111
|
+
}
|
|
112
|
+
return null;
|
|
113
|
+
}
|
|
114
|
+
//# sourceMappingURL=directory-picker.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"directory-picker.js","sourceRoot":"","sources":["../../src/server/directory-picker.ts"],"names":[],"mappings":"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","sourcesContent":["import { spawnSync } from \"node:child_process\";\n\ninterface DirectoryPickerCommandCandidate {\n\tcommand: string;\n\targs: string[];\n}\n\ntype DirectoryPickerCommandResult =\n\t| { kind: \"selected\"; path: string }\n\t| { kind: \"cancelled\" }\n\t| { kind: \"unavailable\" };\n\ntype RunCommand = (command: string, args: string[]) => ReturnType<typeof spawnSync>;\n\ninterface PickDirectoryPathFromSystemDialogOptions {\n\tplatform?: NodeJS.Platform;\n\tcwd?: string;\n\trunCommand?: RunCommand;\n}\n\nconst WINDOWS_DIRECTORY_PICKER_SCRIPT = [\n\t\"$ErrorActionPreference = 'Stop'\",\n\t\"Add-Type -AssemblyName System.Windows.Forms\",\n\t\"$dialog = New-Object System.Windows.Forms.FolderBrowserDialog\",\n\t\"$dialog.Description = 'Select a project folder'\",\n\t\"$dialog.ShowNewFolderButton = $false\",\n\t\"if ($dialog.ShowDialog() -eq [System.Windows.Forms.DialogResult]::OK) { [Console]::Out.Write($dialog.SelectedPath) }\",\n].join(\"; \");\n\nfunction parseChildProcessErrorCode(error: unknown): string | null {\n\tif (!error || typeof error !== \"object\" || !(\"code\" in error)) {\n\t\treturn null;\n\t}\n\tconst code = (error as NodeJS.ErrnoException).code;\n\treturn typeof code === \"string\" ? code : null;\n}\n\nfunction defaultRunCommand(command: string, args: string[]): ReturnType<typeof spawnSync> {\n\treturn spawnSync(command, args, {\n\t\tencoding: \"utf8\",\n\t\tstdio: [\"ignore\", \"pipe\", \"pipe\"],\n\t});\n}\n\nfunction runDirectoryPickerCommand(\n\tcandidate: DirectoryPickerCommandCandidate,\n\trunCommand: RunCommand,\n): DirectoryPickerCommandResult {\n\tconst result = runCommand(candidate.command, candidate.args);\n\n\tconst errorCode = parseChildProcessErrorCode(result.error);\n\tif (errorCode === \"ENOENT\") {\n\t\treturn { kind: \"unavailable\" };\n\t}\n\n\tif (result.error) {\n\t\tconst message = result.error.message || String(result.error);\n\t\tthrow new Error(`Could not open directory picker via ${candidate.command}: ${message}`);\n\t}\n\n\tif (result.signal) {\n\t\tthrow new Error(`Directory picker command ${candidate.command} terminated by signal: ${result.signal}`);\n\t}\n\n\tif (result.status !== 0) {\n\t\tconst stderr = typeof result.stderr === \"string\" ? result.stderr.trim() : \"\";\n\t\tif (stderr) {\n\t\t\tthrow new Error(`Could not open directory picker via ${candidate.command}: ${stderr}`);\n\t\t}\n\t\treturn { kind: \"cancelled\" };\n\t}\n\n\tconst selectedPath = typeof result.stdout === \"string\" ? result.stdout.trim() : \"\";\n\tif (!selectedPath) {\n\t\treturn { kind: \"cancelled\" };\n\t}\n\n\treturn { kind: \"selected\", path: selectedPath };\n}\n\nexport function pickDirectoryPathFromSystemDialog(options: PickDirectoryPathFromSystemDialogOptions = {}): string | null {\n\tconst platform = options.platform ?? process.platform;\n\tconst cwd = options.cwd ?? process.cwd();\n\tconst runCommand = options.runCommand ?? defaultRunCommand;\n\n\tif (platform === \"darwin\") {\n\t\tconst result = runDirectoryPickerCommand(\n\t\t\t{\n\t\t\t\tcommand: \"osascript\",\n\t\t\t\targs: [\"-e\", 'POSIX path of (choose folder with prompt \"Select a project folder\")'],\n\t\t\t},\n\t\t\trunCommand,\n\t\t);\n\t\tif (result.kind === \"selected\") {\n\t\t\treturn result.path;\n\t\t}\n\t\tif (result.kind === \"cancelled\") {\n\t\t\treturn null;\n\t\t}\n\t\tthrow new Error('Could not open directory picker. Command \"osascript\" is not available.');\n\t}\n\n\tif (platform === \"linux\") {\n\t\tconst candidates: DirectoryPickerCommandCandidate[] = [\n\t\t\t{\n\t\t\t\tcommand: \"zenity\",\n\t\t\t\targs: [\"--file-selection\", \"--directory\", \"--title=Select project folder\"],\n\t\t\t},\n\t\t\t{\n\t\t\t\tcommand: \"kdialog\",\n\t\t\t\targs: [\"--getexistingdirectory\", cwd, \"Select project folder\"],\n\t\t\t},\n\t\t];\n\n\t\tfor (const candidate of candidates) {\n\t\t\tconst result = runDirectoryPickerCommand(candidate, runCommand);\n\t\t\tif (result.kind === \"unavailable\") {\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t\tif (result.kind === \"selected\") {\n\t\t\t\treturn result.path;\n\t\t\t}\n\t\t\treturn null;\n\t\t}\n\n\t\tthrow new Error('Could not open directory picker. Install \"zenity\" or \"kdialog\" and try again.');\n\t}\n\n\tif (platform === \"win32\") {\n\t\tconst candidates: DirectoryPickerCommandCandidate[] = [\n\t\t\t{\n\t\t\t\tcommand: \"powershell\",\n\t\t\t\targs: [\"-NoProfile\", \"-STA\", \"-Command\", WINDOWS_DIRECTORY_PICKER_SCRIPT],\n\t\t\t},\n\t\t\t{\n\t\t\t\tcommand: \"pwsh\",\n\t\t\t\targs: [\"-NoProfile\", \"-STA\", \"-Command\", WINDOWS_DIRECTORY_PICKER_SCRIPT],\n\t\t\t},\n\t\t];\n\n\t\tfor (const candidate of candidates) {\n\t\t\tconst result = runDirectoryPickerCommand(candidate, runCommand);\n\t\t\tif (result.kind === \"unavailable\") {\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t\tif (result.kind === \"selected\") {\n\t\t\t\treturn result.path;\n\t\t\t}\n\t\t\treturn null;\n\t\t}\n\n\t\tthrow new Error('Could not open directory picker. Install PowerShell (\"powershell\" or \"pwsh\") and try again.');\n\t}\n\n\treturn null;\n}\n"]}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
interface TimeoutTerminatedChildProcess {
|
|
2
|
+
pid?: number;
|
|
3
|
+
kill: (signal?: NodeJS.Signals | number) => boolean;
|
|
4
|
+
}
|
|
5
|
+
type KillProcessTree = (pid: number, signal?: string, callback?: (error?: Error) => void) => void;
|
|
6
|
+
interface TerminateProcessForTimeoutOptions {
|
|
7
|
+
platform?: NodeJS.Platform;
|
|
8
|
+
killProcessTree?: KillProcessTree;
|
|
9
|
+
}
|
|
10
|
+
export declare function terminateProcessForTimeout(child: TimeoutTerminatedChildProcess, options?: TerminateProcessForTimeoutOptions): void;
|
|
11
|
+
export {};
|
|
12
|
+
//# sourceMappingURL=process-termination.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"process-termination.d.ts","sourceRoot":"","sources":["../../src/server/process-termination.ts"],"names":[],"mappings":"AAEA,UAAU,6BAA6B;IACtC,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,CAAC,MAAM,CAAC,EAAE,MAAM,CAAC,OAAO,GAAG,MAAM,KAAK,OAAO,CAAC;CACpD;AAED,KAAK,eAAe,GAAG,CAAC,GAAG,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,MAAM,EAAE,QAAQ,CAAC,EAAE,CAAC,KAAK,CAAC,EAAE,KAAK,KAAK,IAAI,KAAK,IAAI,CAAC;AAElG,UAAU,iCAAiC;IAC1C,QAAQ,CAAC,EAAE,MAAM,CAAC,QAAQ,CAAC;IAC3B,eAAe,CAAC,EAAE,eAAe,CAAC;CAClC;AAED,wBAAgB,0BAA0B,CACzC,KAAK,EAAE,6BAA6B,EACpC,OAAO,GAAE,iCAAsC,GAC7C,IAAI,CAkBN"}
|