pybao-cli 1.3.3
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/LICENSE +201 -0
- package/README.md +440 -0
- package/README.zh-CN.md +338 -0
- package/cli-acp.js +82 -0
- package/cli.js +105 -0
- package/dist/REPL-WPV32MTF.js +42 -0
- package/dist/REPL-WPV32MTF.js.map +7 -0
- package/dist/acp-75HO2LBV.js +1357 -0
- package/dist/acp-75HO2LBV.js.map +7 -0
- package/dist/agentsValidate-6Z57ARKC.js +373 -0
- package/dist/agentsValidate-6Z57ARKC.js.map +7 -0
- package/dist/ask-NXXXCGY4.js +125 -0
- package/dist/ask-NXXXCGY4.js.map +7 -0
- package/dist/autoUpdater-PJMGNPUG.js +17 -0
- package/dist/autoUpdater-PJMGNPUG.js.map +7 -0
- package/dist/chunk-27GYWUY2.js +72 -0
- package/dist/chunk-27GYWUY2.js.map +7 -0
- package/dist/chunk-3DFBSQIT.js +23 -0
- package/dist/chunk-3DFBSQIT.js.map +7 -0
- package/dist/chunk-3KNGJX7Q.js +794 -0
- package/dist/chunk-3KNGJX7Q.js.map +7 -0
- package/dist/chunk-3PDD7M4T.js +164 -0
- package/dist/chunk-3PDD7M4T.js.map +7 -0
- package/dist/chunk-3ZNSAB7B.js +515 -0
- package/dist/chunk-3ZNSAB7B.js.map +7 -0
- package/dist/chunk-4SNFQYCY.js +511 -0
- package/dist/chunk-4SNFQYCY.js.map +7 -0
- package/dist/chunk-4XPNRLJG.js +1609 -0
- package/dist/chunk-4XPNRLJG.js.map +7 -0
- package/dist/chunk-5P7HBXTD.js +12 -0
- package/dist/chunk-5P7HBXTD.js.map +7 -0
- package/dist/chunk-6RZIUY5K.js +191 -0
- package/dist/chunk-6RZIUY5K.js.map +7 -0
- package/dist/chunk-6WELHKDA.js +240 -0
- package/dist/chunk-6WELHKDA.js.map +7 -0
- package/dist/chunk-7AAE6EO2.js +145 -0
- package/dist/chunk-7AAE6EO2.js.map +7 -0
- package/dist/chunk-A3BVXXA3.js +47 -0
- package/dist/chunk-A3BVXXA3.js.map +7 -0
- package/dist/chunk-A6PUMROK.js +152 -0
- package/dist/chunk-A6PUMROK.js.map +7 -0
- package/dist/chunk-BH3Y62E3.js +11 -0
- package/dist/chunk-BH3Y62E3.js.map +7 -0
- package/dist/chunk-BJSWTHRM.js +16 -0
- package/dist/chunk-BJSWTHRM.js.map +7 -0
- package/dist/chunk-BQA2EOUU.js +124 -0
- package/dist/chunk-BQA2EOUU.js.map +7 -0
- package/dist/chunk-CZZKRPE2.js +19 -0
- package/dist/chunk-CZZKRPE2.js.map +7 -0
- package/dist/chunk-ERMQRV55.js +24 -0
- package/dist/chunk-ERMQRV55.js.map +7 -0
- package/dist/chunk-HB2P6645.js +34 -0
- package/dist/chunk-HB2P6645.js.map +7 -0
- package/dist/chunk-HIRIJ2LQ.js +1256 -0
- package/dist/chunk-HIRIJ2LQ.js.map +7 -0
- package/dist/chunk-ICTEVBLN.js +735 -0
- package/dist/chunk-ICTEVBLN.js.map +7 -0
- package/dist/chunk-JKGOGSFT.js +128 -0
- package/dist/chunk-JKGOGSFT.js.map +7 -0
- package/dist/chunk-JZDE77EH.js +836 -0
- package/dist/chunk-JZDE77EH.js.map +7 -0
- package/dist/chunk-M624LT6O.js +17 -0
- package/dist/chunk-M624LT6O.js.map +7 -0
- package/dist/chunk-OMELVAJD.js +96 -0
- package/dist/chunk-OMELVAJD.js.map +7 -0
- package/dist/chunk-OUXHGDLH.js +95 -0
- package/dist/chunk-OUXHGDLH.js.map +7 -0
- package/dist/chunk-PCXUZ6AT.js +249 -0
- package/dist/chunk-PCXUZ6AT.js.map +7 -0
- package/dist/chunk-Q24ZGKIE.js +1097 -0
- package/dist/chunk-Q24ZGKIE.js.map +7 -0
- package/dist/chunk-QBHEERCF.js +30254 -0
- package/dist/chunk-QBHEERCF.js.map +7 -0
- package/dist/chunk-QIHB5PYM.js +472 -0
- package/dist/chunk-QIHB5PYM.js.map +7 -0
- package/dist/chunk-RQVLBMP7.js +24 -0
- package/dist/chunk-RQVLBMP7.js.map +7 -0
- package/dist/chunk-SWYJOV5E.js +490 -0
- package/dist/chunk-SWYJOV5E.js.map +7 -0
- package/dist/chunk-T6GVXTNQ.js +21 -0
- package/dist/chunk-T6GVXTNQ.js.map +7 -0
- package/dist/chunk-T7GPUZVK.js +766 -0
- package/dist/chunk-T7GPUZVK.js.map +7 -0
- package/dist/chunk-TXFCNQDE.js +2934 -0
- package/dist/chunk-TXFCNQDE.js.map +7 -0
- package/dist/chunk-UNNVICVU.js +95 -0
- package/dist/chunk-UNNVICVU.js.map +7 -0
- package/dist/chunk-UUNVJZWA.js +515 -0
- package/dist/chunk-UUNVJZWA.js.map +7 -0
- package/dist/chunk-VRGR4ZTQ.js +49 -0
- package/dist/chunk-VRGR4ZTQ.js.map +7 -0
- package/dist/chunk-VTVTEE5N.js +2613 -0
- package/dist/chunk-VTVTEE5N.js.map +7 -0
- package/dist/chunk-WPTPPOYN.js +936 -0
- package/dist/chunk-WPTPPOYN.js.map +7 -0
- package/dist/chunk-XXFY63TM.js +196 -0
- package/dist/chunk-XXFY63TM.js.map +7 -0
- package/dist/chunk-Z3HMXDXP.js +654 -0
- package/dist/chunk-Z3HMXDXP.js.map +7 -0
- package/dist/chunk-ZJGXEWKF.js +138 -0
- package/dist/chunk-ZJGXEWKF.js.map +7 -0
- package/dist/cli-RFYBXM7F.js +3917 -0
- package/dist/cli-RFYBXM7F.js.map +7 -0
- package/dist/commands-YOXMODDO.js +46 -0
- package/dist/commands-YOXMODDO.js.map +7 -0
- package/dist/config-5OPX3H2K.js +81 -0
- package/dist/config-5OPX3H2K.js.map +7 -0
- package/dist/context-THRRBPFP.js +30 -0
- package/dist/context-THRRBPFP.js.map +7 -0
- package/dist/costTracker-ELNBZ2DN.js +19 -0
- package/dist/costTracker-ELNBZ2DN.js.map +7 -0
- package/dist/customCommands-4XOZH44N.js +25 -0
- package/dist/customCommands-4XOZH44N.js.map +7 -0
- package/dist/env-EL4KBHMB.js +22 -0
- package/dist/env-EL4KBHMB.js.map +7 -0
- package/dist/index.js +34 -0
- package/dist/index.js.map +7 -0
- package/dist/kodeAgentSessionId-PROTVRBR.js +13 -0
- package/dist/kodeAgentSessionId-PROTVRBR.js.map +7 -0
- package/dist/kodeAgentSessionLoad-UMPV7MC3.js +18 -0
- package/dist/kodeAgentSessionLoad-UMPV7MC3.js.map +7 -0
- package/dist/kodeAgentSessionResume-YJS4FVQM.js +16 -0
- package/dist/kodeAgentSessionResume-YJS4FVQM.js.map +7 -0
- package/dist/kodeAgentStreamJson-3T26CHCP.js +13 -0
- package/dist/kodeAgentStreamJson-3T26CHCP.js.map +7 -0
- package/dist/kodeAgentStreamJsonSession-BZS2VDCY.js +131 -0
- package/dist/kodeAgentStreamJsonSession-BZS2VDCY.js.map +7 -0
- package/dist/kodeAgentStructuredStdio-TNB6U6SP.js +10 -0
- package/dist/kodeAgentStructuredStdio-TNB6U6SP.js.map +7 -0
- package/dist/kodeHooks-VUAWIY2D.js +36 -0
- package/dist/kodeHooks-VUAWIY2D.js.map +7 -0
- package/dist/llm-A3BCM4Q2.js +3118 -0
- package/dist/llm-A3BCM4Q2.js.map +7 -0
- package/dist/llmLazy-ZJSRLZVD.js +15 -0
- package/dist/llmLazy-ZJSRLZVD.js.map +7 -0
- package/dist/loader-HZQBWO74.js +28 -0
- package/dist/loader-HZQBWO74.js.map +7 -0
- package/dist/mcp-XKOJ55B2.js +49 -0
- package/dist/mcp-XKOJ55B2.js.map +7 -0
- package/dist/mentionProcessor-ANYU5MLF.js +211 -0
- package/dist/mentionProcessor-ANYU5MLF.js.map +7 -0
- package/dist/messages-75DL5XBP.js +63 -0
- package/dist/messages-75DL5XBP.js.map +7 -0
- package/dist/model-OPJGJZRC.js +30 -0
- package/dist/model-OPJGJZRC.js.map +7 -0
- package/dist/openai-DT54BAFP.js +29 -0
- package/dist/openai-DT54BAFP.js.map +7 -0
- package/dist/outputStyles-TPFVI52O.js +28 -0
- package/dist/outputStyles-TPFVI52O.js.map +7 -0
- package/dist/package.json +4 -0
- package/dist/pluginRuntime-W74PYSZ4.js +218 -0
- package/dist/pluginRuntime-W74PYSZ4.js.map +7 -0
- package/dist/pluginValidation-FALYRVI2.js +17 -0
- package/dist/pluginValidation-FALYRVI2.js.map +7 -0
- package/dist/prompts-J4TPRMJ3.js +48 -0
- package/dist/prompts-J4TPRMJ3.js.map +7 -0
- package/dist/query-K3QKBVDN.js +50 -0
- package/dist/query-K3QKBVDN.js.map +7 -0
- package/dist/responsesStreaming-HMB74TRD.js +10 -0
- package/dist/responsesStreaming-HMB74TRD.js.map +7 -0
- package/dist/ripgrep-XJGSUBG7.js +17 -0
- package/dist/ripgrep-XJGSUBG7.js.map +7 -0
- package/dist/skillMarketplace-AUGKNCPW.js +37 -0
- package/dist/skillMarketplace-AUGKNCPW.js.map +7 -0
- package/dist/state-DQYRXKTG.js +16 -0
- package/dist/state-DQYRXKTG.js.map +7 -0
- package/dist/theme-MS5HDUBJ.js +14 -0
- package/dist/theme-MS5HDUBJ.js.map +7 -0
- package/dist/toolPermissionContext-GYD5LYFK.js +17 -0
- package/dist/toolPermissionContext-GYD5LYFK.js.map +7 -0
- package/dist/toolPermissionSettings-4MPZVYDR.js +18 -0
- package/dist/toolPermissionSettings-4MPZVYDR.js.map +7 -0
- package/dist/tools-QW6SIJLJ.js +47 -0
- package/dist/tools-QW6SIJLJ.js.map +7 -0
- package/dist/userInput-F2PGBRFU.js +311 -0
- package/dist/userInput-F2PGBRFU.js.map +7 -0
- package/dist/uuid-GYYCQ6QK.js +9 -0
- package/dist/uuid-GYYCQ6QK.js.map +7 -0
- package/dist/yoga.wasm +0 -0
- package/package.json +136 -0
- package/scripts/binary-utils.cjs +62 -0
- package/scripts/cli-acp-wrapper.cjs +82 -0
- package/scripts/cli-wrapper.cjs +105 -0
- package/scripts/postinstall.js +144 -0
- package/yoga.wasm +0 -0
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../src/utils/session/kodeHooks.ts"],
|
|
4
|
+
"sourcesContent": ["import { spawn } from 'child_process'\nimport { existsSync, readFileSync, statSync } from 'fs'\nimport { mkdirSync, mkdtempSync, rmSync, writeFileSync } from 'fs'\nimport { tmpdir } from 'os'\nimport { join } from 'path'\nimport { minimatch } from 'minimatch'\nimport { logError } from '@utils/log'\nimport { getCwd } from '@utils/state'\nimport { getKodeAgentSessionId } from '@utils/protocol/kodeAgentSessionId'\nimport { getSessionPlugins } from '@utils/session/sessionPlugins'\nimport { loadSettingsWithLegacyFallback } from '@utils/config/settingsFiles'\n\ntype HookEventName =\n | 'PreToolUse'\n | 'PostToolUse'\n | 'Stop'\n | 'SubagentStop'\n | 'UserPromptSubmit'\n | 'SessionStart'\n | 'SessionEnd'\n\ntype CommandHook = {\n type: 'command'\n command: string\n timeout?: number\n pluginRoot?: string\n}\n\ntype PromptHook = {\n type: 'prompt'\n prompt: string\n timeout?: number\n pluginRoot?: string\n}\n\ntype Hook = CommandHook | PromptHook\n\ntype HookMatcher = {\n matcher: string\n hooks: Hook[]\n}\n\ntype HookFileEnvelope = {\n description?: unknown\n hooks?: unknown\n [key: string]: unknown\n}\n\ntype HooksSettings = Partial<Record<HookEventName, HookMatcher[]>> & {\n [key: string]: unknown\n}\n\ntype SettingsFileWithHooks = {\n hooks?: HooksSettings\n [key: string]: unknown\n}\n\nexport type PreToolUseHookOutcome =\n | {\n kind: 'allow'\n warnings: string[]\n permissionDecision?: 'allow' | 'ask'\n updatedInput?: Record<string, unknown>\n systemMessages?: string[]\n additionalContexts?: string[]\n }\n | {\n kind: 'block'\n message: string\n systemMessages?: string[]\n additionalContexts?: string[]\n }\n\ntype CachedHooks = {\n mtimeMs: number\n byEvent: Partial<Record<HookEventName, HookMatcher[]>>\n}\n\nconst cache = new Map<string, CachedHooks>()\nconst pluginHooksCache = new Map<string, CachedHooks>()\nconst sessionStartCache = new Map<string, { additionalContext: string }>()\n\ntype HookRuntimeState = {\n transcriptPath?: string\n queuedSystemMessages: string[]\n queuedAdditionalContexts: string[]\n}\n\nconst HOOK_RUNTIME_STATE_KEY = '__kodeHookRuntimeState'\n\nfunction getHookRuntimeState(toolUseContext: any): HookRuntimeState {\n const existing = toolUseContext?.[HOOK_RUNTIME_STATE_KEY]\n if (\n existing &&\n typeof existing === 'object' &&\n Array.isArray((existing as any).queuedSystemMessages) &&\n Array.isArray((existing as any).queuedAdditionalContexts)\n ) {\n return existing as HookRuntimeState\n }\n const created: HookRuntimeState = {\n transcriptPath: undefined,\n queuedSystemMessages: [],\n queuedAdditionalContexts: [],\n }\n if (toolUseContext && typeof toolUseContext === 'object') {\n ;(toolUseContext as any)[HOOK_RUNTIME_STATE_KEY] = created\n }\n return created\n}\n\nexport function updateHookTranscriptForMessages(\n toolUseContext: any,\n messages: any[],\n): void {\n const state = getHookRuntimeState(toolUseContext)\n const sessionId = getKodeAgentSessionId()\n\n const dir = join(tmpdir(), 'kode-hooks-transcripts')\n try {\n mkdirSync(dir, { recursive: true })\n } catch {}\n\n if (!state.transcriptPath) {\n state.transcriptPath = join(dir, `${sessionId}.transcript.txt`)\n }\n\n const lines: string[] = []\n for (const msg of Array.isArray(messages) ? messages : []) {\n if (!msg || typeof msg !== 'object') continue\n if (msg.type !== 'user' && msg.type !== 'assistant') continue\n\n if (msg.type === 'user') {\n const content = (msg as any)?.message?.content\n if (typeof content === 'string') {\n lines.push(`user: ${content}`)\n continue\n }\n if (Array.isArray(content)) {\n const parts: string[] = []\n for (const block of content) {\n if (!block || typeof block !== 'object') continue\n if (block.type === 'text') parts.push(String(block.text ?? ''))\n if (block.type === 'tool_result')\n parts.push(`[tool_result] ${String(block.content ?? '')}`)\n }\n lines.push(`user: ${parts.join('')}`)\n }\n continue\n }\n\n const content = (msg as any)?.message?.content\n if (typeof content === 'string') {\n lines.push(`assistant: ${content}`)\n continue\n }\n if (!Array.isArray(content)) continue\n\n const parts: string[] = []\n for (const block of content) {\n if (!block || typeof block !== 'object') continue\n if (block.type === 'text') parts.push(String(block.text ?? ''))\n if (block.type === 'tool_use' || block.type === 'server_tool_use') {\n parts.push(\n `[tool_use:${String(block.name ?? '')}] ${hookValueForPrompt(block.input)}`,\n )\n }\n if (block.type === 'mcp_tool_use') {\n parts.push(\n `[mcp_tool_use:${String(block.name ?? '')}] ${hookValueForPrompt(block.input)}`,\n )\n }\n }\n lines.push(`assistant: ${parts.join('')}`)\n }\n\n try {\n writeFileSync(state.transcriptPath, lines.join('\\n') + '\\n', 'utf8')\n } catch {}\n}\n\nexport function drainHookSystemPromptAdditions(toolUseContext: any): string[] {\n const state = getHookRuntimeState(toolUseContext)\n const systemMessages = state.queuedSystemMessages.splice(\n 0,\n state.queuedSystemMessages.length,\n )\n const contexts = state.queuedAdditionalContexts.splice(\n 0,\n state.queuedAdditionalContexts.length,\n )\n\n const additions: string[] = []\n if (systemMessages.length > 0) {\n additions.push(\n ['\\n# Hook system messages', ...systemMessages.map(m => m.trim())]\n .filter(Boolean)\n .join('\\n\\n'),\n )\n }\n if (contexts.length > 0) {\n additions.push(\n ['\\n# Hook additional context', ...contexts.map(m => m.trim())]\n .filter(Boolean)\n .join('\\n\\n'),\n )\n }\n return additions\n}\n\nexport function getHookTranscriptPath(toolUseContext: any): string | undefined {\n return getHookRuntimeState(toolUseContext).transcriptPath\n}\n\nexport function queueHookSystemMessages(\n toolUseContext: any,\n messages: string[],\n): void {\n const state = getHookRuntimeState(toolUseContext)\n for (const msg of messages) {\n const trimmed = String(msg ?? '').trim()\n if (trimmed) state.queuedSystemMessages.push(trimmed)\n }\n}\n\nexport function queueHookAdditionalContexts(\n toolUseContext: any,\n contexts: string[],\n): void {\n const state = getHookRuntimeState(toolUseContext)\n for (const ctx of contexts) {\n const trimmed = String(ctx ?? '').trim()\n if (trimmed) state.queuedAdditionalContexts.push(trimmed)\n }\n}\n\nfunction isCommandHook(value: unknown): value is CommandHook {\n return (\n value !== null &&\n typeof value === 'object' &&\n (value as any).type === 'command' &&\n typeof (value as any).command === 'string' &&\n Boolean((value as any).command.trim())\n )\n}\n\nfunction isPromptHook(value: unknown): value is PromptHook {\n return (\n value !== null &&\n typeof value === 'object' &&\n (value as any).type === 'prompt' &&\n typeof (value as any).prompt === 'string' &&\n Boolean((value as any).prompt.trim())\n )\n}\n\nfunction isHook(value: unknown): value is Hook {\n return isCommandHook(value) || isPromptHook(value)\n}\n\nfunction parseHookMatchers(value: unknown): HookMatcher[] {\n if (!Array.isArray(value)) return []\n\n const out: HookMatcher[] = []\n for (const item of value) {\n if (!item || typeof item !== 'object') continue\n const matcher =\n typeof (item as any).matcher === 'string'\n ? (item as any).matcher.trim()\n : ''\n const effectiveMatcher = matcher || '*'\n const hooksRaw = (item as any).hooks\n const hooks = Array.isArray(hooksRaw) ? hooksRaw.filter(isHook) : []\n if (hooks.length === 0) continue\n out.push({ matcher: effectiveMatcher, hooks })\n }\n return out\n}\n\nfunction parseHooksByEvent(\n rawHooks: unknown,\n): Partial<Record<HookEventName, HookMatcher[]>> {\n if (!rawHooks || typeof rawHooks !== 'object') return {}\n const hooks: any = rawHooks\n return {\n PreToolUse: parseHookMatchers(hooks.PreToolUse),\n PostToolUse: parseHookMatchers(hooks.PostToolUse),\n Stop: parseHookMatchers(hooks.Stop),\n SubagentStop: parseHookMatchers(hooks.SubagentStop),\n UserPromptSubmit: parseHookMatchers(hooks.UserPromptSubmit),\n SessionStart: parseHookMatchers(hooks.SessionStart),\n SessionEnd: parseHookMatchers(hooks.SessionEnd),\n }\n}\n\nfunction loadInlinePluginHooksByEvent(plugin: {\n manifestPath: string\n manifest: unknown\n}): Partial<Record<HookEventName, HookMatcher[]>> | null {\n const manifestHooks = (plugin.manifest as any)?.hooks\n if (\n !manifestHooks ||\n typeof manifestHooks !== 'object' ||\n Array.isArray(manifestHooks)\n )\n return null\n\n const hookObj =\n (manifestHooks as any).hooks &&\n typeof (manifestHooks as any).hooks === 'object' &&\n !Array.isArray((manifestHooks as any).hooks)\n ? (manifestHooks as any).hooks\n : manifestHooks\n\n const cacheKey = `${plugin.manifestPath}#inlineHooks`\n try {\n const stat = statSync(plugin.manifestPath)\n const cached = pluginHooksCache.get(cacheKey)\n if (cached && cached.mtimeMs === stat.mtimeMs) return cached.byEvent\n\n const byEvent = parseHooksByEvent(hookObj)\n pluginHooksCache.set(cacheKey, { mtimeMs: stat.mtimeMs, byEvent })\n return byEvent\n } catch (err) {\n logError(err)\n pluginHooksCache.delete(cacheKey)\n return null\n }\n}\n\nfunction loadPreToolUseMatchers(projectDir: string): HookMatcher[] {\n const loaded = loadSettingsWithLegacyFallback({\n destination: 'projectSettings',\n projectDir,\n migrateToPrimary: true,\n })\n const settingsPath = loaded.usedPath\n if (!settingsPath) return []\n try {\n const stat = statSync(settingsPath)\n const cached = cache.get(settingsPath)\n if (cached && cached.mtimeMs === stat.mtimeMs)\n return cached.byEvent.PreToolUse ?? []\n\n const parsed = loaded.settings as SettingsFileWithHooks | null\n const byEvent = parseHooksByEvent(parsed?.hooks)\n cache.set(settingsPath, { mtimeMs: stat.mtimeMs, byEvent })\n return byEvent.PreToolUse ?? []\n } catch {\n cache.delete(settingsPath)\n return []\n }\n}\n\nfunction loadSettingsMatchers(\n projectDir: string,\n event: HookEventName,\n): HookMatcher[] {\n const loaded = loadSettingsWithLegacyFallback({\n destination: 'projectSettings',\n projectDir,\n migrateToPrimary: true,\n })\n const settingsPath = loaded.usedPath\n if (!settingsPath) return []\n try {\n const stat = statSync(settingsPath)\n const cached = cache.get(settingsPath)\n if (cached && cached.mtimeMs === stat.mtimeMs)\n return cached.byEvent[event] ?? []\n\n const parsed = loaded.settings as SettingsFileWithHooks | null\n const byEvent = parseHooksByEvent(parsed?.hooks)\n cache.set(settingsPath, { mtimeMs: stat.mtimeMs, byEvent })\n return byEvent[event] ?? []\n } catch {\n cache.delete(settingsPath)\n return []\n }\n}\n\nfunction matcherMatchesTool(matcher: string, toolName: string): boolean {\n if (!matcher) return false\n if (matcher === '*' || matcher === 'all') return true\n if (matcher === toolName) return true\n try {\n if (minimatch(toolName, matcher, { dot: true, nocase: false })) return true\n } catch {\n }\n try {\n if (new RegExp(matcher).test(toolName)) return true\n } catch {\n }\n return false\n}\n\nfunction buildShellCommand(command: string): string[] {\n if (process.platform === 'win32') {\n return ['cmd.exe', '/d', '/s', '/c', command]\n }\n return ['/bin/sh', '-c', command]\n}\n\nasync function runCommandHook(args: {\n command: string\n stdinJson: unknown\n cwd: string\n env?: Record<string, string>\n signal?: AbortSignal\n}): Promise<{ exitCode: number; stdout: string; stderr: string }> {\n const cmd = buildShellCommand(args.command)\n const proc = spawn(cmd[0], cmd.slice(1), {\n cwd: args.cwd,\n env: { ...(process.env as any), ...(args.env ?? {}) },\n stdio: ['pipe', 'pipe', 'pipe'],\n windowsHide: true,\n })\n\n let wasAborted = false\n const onAbort = () => {\n wasAborted = true\n try {\n proc.kill()\n } catch {}\n }\n if (args.signal) {\n if (args.signal.aborted) onAbort()\n args.signal.addEventListener('abort', onAbort, { once: true })\n }\n\n try {\n const input = JSON.stringify(args.stdinJson)\n try {\n proc.stdin?.write(input)\n proc.stdin?.end()\n } catch {}\n\n let stdout = ''\n let stderr = ''\n\n const collect = (\n stream: NodeJS.ReadableStream | null,\n append: (chunk: string) => void,\n ): { done: Promise<void>; cleanup: () => void } => {\n if (!stream) {\n return { done: Promise.resolve(), cleanup: () => {} }\n }\n try {\n ;(stream as any).setEncoding?.('utf8')\n } catch {}\n\n let resolveDone: (() => void) | null = null\n const done = new Promise<void>(resolve => {\n resolveDone = resolve\n })\n\n const finish = () => {\n cleanup()\n if (!resolveDone) return\n resolveDone()\n resolveDone = null\n }\n\n const onData = (chunk: unknown) => {\n append(\n typeof chunk === 'string'\n ? chunk\n : Buffer.isBuffer(chunk)\n ? chunk.toString('utf8')\n : String(chunk),\n )\n }\n\n const onError = () => finish()\n\n const cleanup = () => {\n stream.off('data', onData)\n stream.off('end', finish)\n stream.off('close', finish)\n stream.off('error', onError)\n }\n\n stream.on('data', onData)\n stream.once('end', finish)\n stream.once('close', finish)\n stream.once('error', onError)\n\n return { done, cleanup }\n }\n\n const stdoutCollector = collect(proc.stdout, chunk => {\n stdout += chunk\n })\n const stderrCollector = collect(proc.stderr, chunk => {\n stderr += chunk\n })\n\n const exitCode = await new Promise<number>(resolve => {\n proc.once('exit', (code, signal) => {\n if (typeof code === 'number') return resolve(code)\n if (signal) return resolve(143)\n return resolve(0)\n })\n proc.once('error', () => resolve(1))\n })\n\n await Promise.race([\n Promise.allSettled([stdoutCollector.done, stderrCollector.done]),\n new Promise(resolve => setTimeout(resolve, 250)),\n ])\n stdoutCollector.cleanup()\n stderrCollector.cleanup()\n\n return {\n exitCode: wasAborted && exitCode === 0 ? 143 : exitCode,\n stdout,\n stderr,\n }\n } finally {\n if (args.signal) {\n try {\n args.signal.removeEventListener('abort', onAbort)\n } catch {}\n }\n }\n}\n\nfunction mergeAbortSignals(signals: Array<AbortSignal | undefined>): {\n signal: AbortSignal\n cleanup: () => void\n} {\n const controller = new AbortController()\n const onAbort = () => controller.abort()\n\n const cleanups: Array<() => void> = []\n for (const signal of signals) {\n if (!signal) continue\n if (signal.aborted) {\n controller.abort()\n continue\n }\n signal.addEventListener('abort', onAbort, { once: true })\n cleanups.push(() => {\n try {\n signal.removeEventListener('abort', onAbort)\n } catch {}\n })\n }\n\n return {\n signal: controller.signal,\n cleanup: () => cleanups.forEach(fn => fn()),\n }\n}\n\nfunction withHookTimeout(args: {\n timeoutSeconds?: number\n parentSignal?: AbortSignal\n fallbackTimeoutMs: number\n}): { signal: AbortSignal; cleanup: () => void } {\n const timeoutMs =\n typeof args.timeoutSeconds === 'number' &&\n Number.isFinite(args.timeoutSeconds)\n ? Math.max(0, Math.floor(args.timeoutSeconds * 1000))\n : args.fallbackTimeoutMs\n\n const timeoutSignal =\n typeof AbortSignal !== 'undefined' &&\n typeof (AbortSignal as any).timeout === 'function'\n ? (AbortSignal as any).timeout(timeoutMs)\n : (() => {\n const controller = new AbortController()\n const timer = setTimeout(() => controller.abort(), timeoutMs)\n const signal = controller.signal\n ;(signal as any).__cleanup = () => clearTimeout(timer)\n return signal\n })()\n\n const merged = mergeAbortSignals([args.parentSignal, timeoutSignal])\n const timeoutCleanup =\n typeof (timeoutSignal as any).__cleanup === 'function'\n ? (timeoutSignal as any).__cleanup\n : () => {}\n\n return {\n signal: merged.signal,\n cleanup: () => {\n merged.cleanup()\n timeoutCleanup()\n },\n }\n}\n\nfunction coerceHookMessage(stdout: string, stderr: string): string {\n const s = (stderr || '').trim()\n if (s) return s\n const o = (stdout || '').trim()\n if (o) return o\n return 'Hook blocked the tool call.'\n}\n\nfunction coerceHookPermissionMode(mode: unknown): 'ask' | 'allow' {\n if (mode === 'acceptEdits' || mode === 'bypassPermissions') return 'allow'\n return 'ask'\n}\n\nfunction extractFirstJsonObject(text: string): string | null {\n let start = -1\n let depth = 0\n let inString = false\n let escaped = false\n\n for (let i = 0; i < text.length; i++) {\n const ch = text[i]\n\n if (start === -1) {\n if (ch === '{') {\n start = i\n depth = 1\n }\n continue\n }\n\n if (inString) {\n if (escaped) {\n escaped = false\n continue\n }\n if (ch === '\\\\') {\n escaped = true\n continue\n }\n if (ch === '\"') {\n inString = false\n }\n continue\n }\n\n if (ch === '\"') {\n inString = true\n continue\n }\n\n if (ch === '{') {\n depth++\n continue\n }\n if (ch === '}') {\n depth--\n if (depth === 0) return text.slice(start, i + 1)\n }\n }\n\n return null\n}\n\nfunction parseSessionStartAdditionalContext(stdout: string): string | null {\n const trimmed = String(stdout ?? '').trim()\n if (!trimmed) return null\n\n const jsonStr = extractFirstJsonObject(trimmed) ?? trimmed\n try {\n const parsed = JSON.parse(jsonStr)\n const additional =\n parsed &&\n typeof parsed === 'object' &&\n (parsed as any).hookSpecificOutput &&\n typeof (parsed as any).hookSpecificOutput.additionalContext === 'string'\n ? String((parsed as any).hookSpecificOutput.additionalContext)\n : null\n return additional && additional.trim() ? additional : null\n } catch {\n return null\n }\n}\n\nfunction tryParseHookJson(stdout: string): any | null {\n const trimmed = String(stdout ?? '').trim()\n if (!trimmed) return null\n const jsonStr = extractFirstJsonObject(trimmed) ?? trimmed\n try {\n const parsed = JSON.parse(jsonStr)\n return parsed && typeof parsed === 'object' ? parsed : null\n } catch {\n return null\n }\n}\n\nfunction normalizePermissionDecision(\n value: unknown,\n): 'allow' | 'deny' | 'ask' | 'passthrough' | null {\n if (typeof value !== 'string') return null\n const normalized = value.trim().toLowerCase()\n if (normalized === 'allow' || normalized === 'approve') return 'allow'\n if (normalized === 'deny' || normalized === 'block') return 'deny'\n if (normalized === 'ask') return 'ask'\n if (normalized === 'passthrough' || normalized === 'continue')\n return 'passthrough'\n return null\n}\n\nfunction normalizeStopDecision(value: unknown): 'approve' | 'block' | null {\n if (typeof value !== 'string') return null\n const normalized = value.trim().toLowerCase()\n if (normalized === 'approve' || normalized === 'allow') return 'approve'\n if (normalized === 'block' || normalized === 'deny') return 'block'\n return null\n}\n\nfunction hookValueForPrompt(value: unknown): string {\n if (value === null || value === undefined) return ''\n if (typeof value === 'string') return value\n try {\n return JSON.stringify(value, null, 2)\n } catch {\n return String(value)\n }\n}\n\nfunction interpolatePromptHookTemplate(\n template: string,\n hookInput: Record<string, unknown>,\n): string {\n return String(template ?? '')\n .replaceAll('$TOOL_INPUT', hookValueForPrompt(hookInput.tool_input))\n .replaceAll('$TOOL_RESULT', hookValueForPrompt(hookInput.tool_result))\n .replaceAll('$TOOL_RESPONSE', hookValueForPrompt(hookInput.tool_response))\n .replaceAll('$USER_PROMPT', hookValueForPrompt(hookInput.user_prompt))\n .replaceAll('$PROMPT', hookValueForPrompt(hookInput.prompt))\n .replaceAll('$REASON', hookValueForPrompt(hookInput.reason))\n}\n\nfunction extractAssistantText(message: any): string {\n const content = (message as any)?.message?.content\n if (typeof content === 'string') return content\n if (!Array.isArray(content)) return ''\n return content\n .filter((b: any) => b && typeof b === 'object' && b.type === 'text')\n .map((b: any) => String(b.text ?? ''))\n .join('')\n}\n\nasync function runPromptHook(args: {\n hook: PromptHook\n hookEvent: HookEventName\n hookInput: Record<string, unknown>\n safeMode: boolean\n parentSignal?: AbortSignal\n fallbackTimeoutMs: number\n}): Promise<{ exitCode: number; stdout: string; stderr: string }> {\n const { signal, cleanup } = withHookTimeout({\n timeoutSeconds: args.hook.timeout,\n parentSignal: args.parentSignal,\n fallbackTimeoutMs: args.fallbackTimeoutMs,\n })\n\n try {\n const { queryQuick } = await import('@services/llmLazy')\n\n const systemPrompt = [\n 'You are executing a Kode prompt hook.',\n 'Return a single JSON object only (no markdown, no prose).',\n `hook_event_name: ${args.hookEvent}`,\n 'Valid fields include:',\n '- systemMessage: string',\n '- decision: \\\"approve\\\" | \\\"block\\\" (Stop/SubagentStop only)',\n '- reason: string (Stop/SubagentStop only)',\n '- hookSpecificOutput.permissionDecision: \\\"allow\\\" | \\\"deny\\\" | \\\"ask\\\" | \\\"passthrough\\\" (PreToolUse only)',\n '- hookSpecificOutput.updatedInput: object (PreToolUse only)',\n '- hookSpecificOutput.additionalContext: string (SessionStart/any)',\n ]\n\n const promptText = interpolatePromptHookTemplate(\n args.hook.prompt,\n args.hookInput,\n )\n const userPrompt = `${promptText}\\n\\n# Hook input JSON\\n${hookValueForPrompt(args.hookInput)}`\n\n const response = await queryQuick({\n systemPrompt,\n userPrompt,\n signal,\n })\n\n return { exitCode: 0, stdout: extractAssistantText(response), stderr: '' }\n } catch (err) {\n return {\n exitCode: 1,\n stdout: '',\n stderr: err instanceof Error ? err.message : String(err),\n }\n } finally {\n cleanup()\n }\n}\n\nfunction applyEnvFileToProcessEnv(envFilePath: string): void {\n let raw: string\n try {\n raw = readFileSync(envFilePath, 'utf8')\n } catch {\n return\n }\n\n const lines = raw.split(/\\r?\\n/)\n for (const line of lines) {\n const trimmed = line.trim()\n if (!trimmed || trimmed.startsWith('#')) continue\n\n const withoutExport = trimmed.startsWith('export ')\n ? trimmed.slice('export '.length).trim()\n : trimmed\n\n const eq = withoutExport.indexOf('=')\n if (eq <= 0) continue\n\n const key = withoutExport.slice(0, eq).trim()\n let value = withoutExport.slice(eq + 1).trim()\n if (!key) continue\n\n if (\n (value.startsWith('\"') && value.endsWith('\"')) ||\n (value.startsWith(\"'\") && value.endsWith(\"'\"))\n ) {\n value = value.slice(1, -1)\n }\n\n process.env[key] = value\n }\n}\n\nfunction loadPluginPreToolUseMatchers(projectDir: string): HookMatcher[] {\n const plugins = getSessionPlugins()\n if (plugins.length === 0) return []\n\n const out: HookMatcher[] = []\n for (const plugin of plugins) {\n for (const hookPath of plugin.hooksFiles ?? []) {\n try {\n const stat = statSync(hookPath)\n const cached = pluginHooksCache.get(hookPath)\n if (cached && cached.mtimeMs === stat.mtimeMs) {\n out.push(\n ...(cached.byEvent.PreToolUse ?? []).map(m => ({\n matcher: m.matcher,\n hooks: m.hooks.map(h => ({ ...h, pluginRoot: plugin.rootDir })),\n })),\n )\n continue\n }\n\n const raw = readFileSync(hookPath, 'utf8')\n const parsed = JSON.parse(raw) as HookFileEnvelope\n const hookObj =\n parsed && typeof parsed === 'object' && parsed.hooks\n ? parsed.hooks\n : parsed\n const byEvent = parseHooksByEvent(hookObj)\n pluginHooksCache.set(hookPath, { mtimeMs: stat.mtimeMs, byEvent })\n out.push(\n ...(byEvent.PreToolUse ?? []).map(m => ({\n matcher: m.matcher,\n hooks: m.hooks.map(h => ({ ...h, pluginRoot: plugin.rootDir })),\n })),\n )\n } catch (err) {\n logError(err)\n continue\n }\n }\n\n const inlineByEvent = loadInlinePluginHooksByEvent(plugin)\n if (inlineByEvent?.PreToolUse) {\n out.push(\n ...inlineByEvent.PreToolUse.map(m => ({\n matcher: m.matcher,\n hooks: m.hooks.map(h => ({ ...h, pluginRoot: plugin.rootDir })),\n })),\n )\n }\n }\n\n return out\n}\n\nfunction loadPluginMatchers(\n projectDir: string,\n event: HookEventName,\n): HookMatcher[] {\n const plugins = getSessionPlugins()\n if (plugins.length === 0) return []\n\n const out: HookMatcher[] = []\n for (const plugin of plugins) {\n for (const hookPath of plugin.hooksFiles ?? []) {\n try {\n const stat = statSync(hookPath)\n const cached = pluginHooksCache.get(hookPath)\n if (cached && cached.mtimeMs === stat.mtimeMs) {\n out.push(\n ...(cached.byEvent[event] ?? []).map(m => ({\n matcher: m.matcher,\n hooks: m.hooks.map(h => ({ ...h, pluginRoot: plugin.rootDir })),\n })),\n )\n continue\n }\n\n const raw = readFileSync(hookPath, 'utf8')\n const parsed = JSON.parse(raw) as HookFileEnvelope\n const hookObj =\n parsed && typeof parsed === 'object' && parsed.hooks\n ? parsed.hooks\n : parsed\n const byEvent = parseHooksByEvent(hookObj)\n pluginHooksCache.set(hookPath, { mtimeMs: stat.mtimeMs, byEvent })\n out.push(\n ...(byEvent[event] ?? []).map(m => ({\n matcher: m.matcher,\n hooks: m.hooks.map(h => ({ ...h, pluginRoot: plugin.rootDir })),\n })),\n )\n } catch (err) {\n logError(err)\n continue\n }\n }\n\n const inlineByEvent = loadInlinePluginHooksByEvent(plugin)\n if (inlineByEvent?.[event]) {\n out.push(\n ...(inlineByEvent[event] ?? []).map(m => ({\n matcher: m.matcher,\n hooks: m.hooks.map(h => ({ ...h, pluginRoot: plugin.rootDir })),\n })),\n )\n }\n }\n return out\n}\n\nfunction parseSessionStartHooks(value: unknown): CommandHook[] {\n if (!Array.isArray(value)) return []\n const out: CommandHook[] = []\n for (const item of value) {\n if (!item || typeof item !== 'object') continue\n const hooksRaw = (item as any).hooks\n const hooks = Array.isArray(hooksRaw) ? hooksRaw.filter(isCommandHook) : []\n out.push(...hooks)\n }\n return out\n}\n\nexport async function getSessionStartAdditionalContext(args?: {\n permissionMode?: unknown\n cwd?: string\n signal?: AbortSignal\n}): Promise<string> {\n const sessionId = getKodeAgentSessionId()\n const cached = sessionStartCache.get(sessionId)\n if (cached) return cached.additionalContext\n\n const projectDir = args?.cwd ?? getCwd()\n const plugins = getSessionPlugins()\n if (plugins.length === 0) {\n sessionStartCache.set(sessionId, { additionalContext: '' })\n return ''\n }\n\n const envFileDir = mkdtempSync(join(tmpdir(), 'kode-env-'))\n const envFilePath = join(envFileDir, `${sessionId}.env`)\n try {\n writeFileSync(envFilePath, '', 'utf8')\n } catch {\n }\n\n const additionalContexts: string[] = []\n\n try {\n for (const plugin of plugins) {\n for (const hookPath of plugin.hooksFiles ?? []) {\n let hookObj: any\n try {\n const raw = readFileSync(hookPath, 'utf8')\n const parsed = JSON.parse(raw) as HookFileEnvelope\n hookObj =\n parsed && typeof parsed === 'object' && parsed.hooks\n ? parsed.hooks\n : parsed\n } catch {\n continue\n }\n\n const hooks = parseSessionStartHooks(hookObj?.SessionStart).map(h => ({\n ...h,\n pluginRoot: plugin.rootDir,\n }))\n if (hooks.length === 0) continue\n\n for (const hook of hooks) {\n const payload = {\n session_id: sessionId,\n cwd: projectDir,\n hook_event_name: 'SessionStart',\n permission_mode: coerceHookPermissionMode(args?.permissionMode),\n }\n\n const result = await runCommandHook({\n command: hook.command,\n stdinJson: payload,\n cwd: projectDir,\n env: {\n CLAUDE_PROJECT_DIR: projectDir,\n ...(hook.pluginRoot\n ? { CLAUDE_PLUGIN_ROOT: hook.pluginRoot }\n : {}),\n CLAUDE_ENV_FILE: envFilePath,\n },\n signal: args?.signal,\n })\n\n if (result.exitCode !== 0) continue\n const injected = parseSessionStartAdditionalContext(result.stdout)\n if (injected) additionalContexts.push(injected)\n }\n }\n\n const inlineHooks = (plugin.manifest as any)?.hooks\n if (\n inlineHooks &&\n typeof inlineHooks === 'object' &&\n !Array.isArray(inlineHooks)\n ) {\n const hookObj =\n (inlineHooks as any).hooks &&\n typeof (inlineHooks as any).hooks === 'object' &&\n !Array.isArray((inlineHooks as any).hooks)\n ? (inlineHooks as any).hooks\n : inlineHooks\n\n const hooks = parseSessionStartHooks(\n (hookObj as any)?.SessionStart,\n ).map(h => ({\n ...h,\n pluginRoot: plugin.rootDir,\n }))\n if (hooks.length > 0) {\n for (const hook of hooks) {\n const payload = {\n session_id: sessionId,\n cwd: projectDir,\n hook_event_name: 'SessionStart',\n permission_mode: coerceHookPermissionMode(args?.permissionMode),\n }\n\n const result = await runCommandHook({\n command: hook.command,\n stdinJson: payload,\n cwd: projectDir,\n env: {\n CLAUDE_PROJECT_DIR: projectDir,\n ...(hook.pluginRoot\n ? { CLAUDE_PLUGIN_ROOT: hook.pluginRoot }\n : {}),\n CLAUDE_ENV_FILE: envFilePath,\n },\n signal: args?.signal,\n })\n\n if (result.exitCode !== 0) continue\n const injected = parseSessionStartAdditionalContext(result.stdout)\n if (injected) additionalContexts.push(injected)\n }\n }\n }\n }\n } finally {\n applyEnvFileToProcessEnv(envFilePath)\n try {\n rmSync(envFileDir, { recursive: true, force: true })\n } catch {}\n }\n\n const additionalContext = additionalContexts.filter(Boolean).join('\\n\\n')\n sessionStartCache.set(sessionId, { additionalContext })\n return additionalContext\n}\n\nexport async function runPreToolUseHooks(args: {\n toolName: string\n toolInput: Record<string, unknown>\n toolUseId: string\n permissionMode?: unknown\n cwd?: string\n transcriptPath?: string\n safeMode?: boolean\n signal?: AbortSignal\n}): Promise<PreToolUseHookOutcome> {\n const projectDir = args.cwd ?? getCwd()\n const matchers = [\n ...loadSettingsMatchers(projectDir, 'PreToolUse'),\n ...loadPluginMatchers(projectDir, 'PreToolUse'),\n ]\n if (matchers.length === 0) return { kind: 'allow', warnings: [] }\n\n const applicable = matchers.filter(m =>\n matcherMatchesTool(m.matcher, args.toolName),\n )\n if (applicable.length === 0) return { kind: 'allow', warnings: [] }\n\n const hookInput: Record<string, unknown> = {\n session_id: getKodeAgentSessionId(),\n transcript_path: args.transcriptPath,\n cwd: projectDir,\n hook_event_name: 'PreToolUse',\n permission_mode: coerceHookPermissionMode(args.permissionMode),\n tool_name: args.toolName,\n tool_input: args.toolInput,\n tool_use_id: args.toolUseId,\n }\n\n const warnings: string[] = []\n const systemMessages: string[] = []\n const additionalContexts: string[] = []\n\n let mergedUpdatedInput: Record<string, unknown> | undefined\n let permissionDecision: 'allow' | 'ask' | null = null\n\n const executions: Array<\n Promise<{\n hook: Hook\n result: { exitCode: number; stdout: string; stderr: string }\n }>\n > = []\n\n for (const entry of applicable) {\n for (const hook of entry.hooks) {\n if (hook.type === 'prompt') {\n executions.push(\n runPromptHook({\n hook,\n hookEvent: 'PreToolUse',\n hookInput,\n safeMode: args.safeMode ?? false,\n parentSignal: args.signal,\n fallbackTimeoutMs: 30_000,\n }).then(result => ({ hook, result })),\n )\n continue\n }\n\n const { signal, cleanup } = withHookTimeout({\n timeoutSeconds: hook.timeout,\n parentSignal: args.signal,\n fallbackTimeoutMs: 60_000,\n })\n executions.push(\n runCommandHook({\n command: hook.command,\n stdinJson: hookInput,\n cwd: projectDir,\n env: {\n CLAUDE_PROJECT_DIR: projectDir,\n ...(hook.pluginRoot ? { CLAUDE_PLUGIN_ROOT: hook.pluginRoot } : {}),\n },\n signal,\n })\n .then(result => ({ hook, result }))\n .finally(cleanup),\n )\n }\n }\n\n const settled = await Promise.allSettled(executions)\n for (const item of settled) {\n if (item.status === 'rejected') {\n logError(item.reason)\n warnings.push(`Hook failed to run: ${String(item.reason ?? '')}`)\n continue\n }\n\n const { hook, result } = item.value\n\n if (result.exitCode === 2) {\n return {\n kind: 'block',\n message: coerceHookMessage(result.stdout, result.stderr),\n }\n }\n\n if (result.exitCode !== 0) {\n warnings.push(coerceHookMessage(result.stdout, result.stderr))\n continue\n }\n\n const json = tryParseHookJson(result.stdout)\n if (!json) continue\n\n if (typeof json.systemMessage === 'string' && json.systemMessage.trim()) {\n systemMessages.push(json.systemMessage.trim())\n }\n\n const additional =\n json.hookSpecificOutput &&\n typeof json.hookSpecificOutput === 'object' &&\n typeof json.hookSpecificOutput.additionalContext === 'string'\n ? String(json.hookSpecificOutput.additionalContext)\n : null\n if (additional && additional.trim()) {\n additionalContexts.push(additional.trim())\n }\n\n const decision = normalizePermissionDecision(\n json.hookSpecificOutput?.permissionDecision,\n )\n if (decision === 'deny') {\n const msg =\n systemMessages.length > 0\n ? systemMessages.join('\\n\\n')\n : coerceHookMessage(result.stdout, result.stderr)\n return {\n kind: 'block',\n message: msg,\n systemMessages,\n additionalContexts,\n }\n }\n\n if (decision === 'ask') {\n permissionDecision = 'ask'\n } else if (decision === 'allow') {\n if (!permissionDecision) permissionDecision = 'allow'\n }\n\n const updated =\n json.hookSpecificOutput &&\n typeof json.hookSpecificOutput === 'object' &&\n json.hookSpecificOutput.updatedInput &&\n typeof json.hookSpecificOutput.updatedInput === 'object'\n ? (json.hookSpecificOutput.updatedInput as Record<string, unknown>)\n : null\n if (updated) {\n mergedUpdatedInput = { ...(mergedUpdatedInput ?? {}), ...updated }\n }\n }\n\n return {\n kind: 'allow',\n warnings,\n permissionDecision:\n permissionDecision === 'allow'\n ? 'allow'\n : permissionDecision === 'ask'\n ? 'ask'\n : undefined,\n updatedInput:\n permissionDecision === 'allow' ? mergedUpdatedInput : undefined,\n systemMessages,\n additionalContexts,\n }\n}\n\nexport async function runPostToolUseHooks(args: {\n toolName: string\n toolInput: Record<string, unknown>\n toolResult: unknown\n toolUseId: string\n permissionMode?: unknown\n cwd?: string\n transcriptPath?: string\n safeMode?: boolean\n signal?: AbortSignal\n}): Promise<{\n warnings: string[]\n systemMessages: string[]\n additionalContexts: string[]\n}> {\n const projectDir = args.cwd ?? getCwd()\n const matchers = [\n ...loadSettingsMatchers(projectDir, 'PostToolUse'),\n ...loadPluginMatchers(projectDir, 'PostToolUse'),\n ]\n if (matchers.length === 0) {\n return { warnings: [], systemMessages: [], additionalContexts: [] }\n }\n\n const applicable = matchers.filter(m =>\n matcherMatchesTool(m.matcher, args.toolName),\n )\n if (applicable.length === 0) {\n return { warnings: [], systemMessages: [], additionalContexts: [] }\n }\n\n const hookInput: Record<string, unknown> = {\n session_id: getKodeAgentSessionId(),\n transcript_path: args.transcriptPath,\n cwd: projectDir,\n hook_event_name: 'PostToolUse',\n permission_mode: coerceHookPermissionMode(args.permissionMode),\n tool_name: args.toolName,\n tool_input: args.toolInput,\n tool_result: args.toolResult,\n tool_response: args.toolResult,\n tool_use_id: args.toolUseId,\n }\n\n const warnings: string[] = []\n const systemMessages: string[] = []\n const additionalContexts: string[] = []\n\n const executions: Array<\n Promise<{\n hook: Hook\n result: { exitCode: number; stdout: string; stderr: string }\n }>\n > = []\n\n for (const entry of applicable) {\n for (const hook of entry.hooks) {\n if (hook.type === 'prompt') {\n executions.push(\n runPromptHook({\n hook,\n hookEvent: 'PostToolUse',\n hookInput,\n safeMode: args.safeMode ?? false,\n parentSignal: args.signal,\n fallbackTimeoutMs: 30_000,\n }).then(result => ({ hook, result })),\n )\n continue\n }\n\n const { signal, cleanup } = withHookTimeout({\n timeoutSeconds: hook.timeout,\n parentSignal: args.signal,\n fallbackTimeoutMs: 60_000,\n })\n executions.push(\n runCommandHook({\n command: hook.command,\n stdinJson: hookInput,\n cwd: projectDir,\n env: {\n CLAUDE_PROJECT_DIR: projectDir,\n ...(hook.pluginRoot ? { CLAUDE_PLUGIN_ROOT: hook.pluginRoot } : {}),\n },\n signal,\n })\n .then(result => ({ hook, result }))\n .finally(cleanup),\n )\n }\n }\n\n const settled = await Promise.allSettled(executions)\n for (const item of settled) {\n if (item.status === 'rejected') {\n logError(item.reason)\n warnings.push(`Hook failed to run: ${String(item.reason ?? '')}`)\n continue\n }\n\n const { result } = item.value\n if (result.exitCode !== 0) {\n warnings.push(coerceHookMessage(result.stdout, result.stderr))\n continue\n }\n\n const json = tryParseHookJson(result.stdout)\n if (!json) continue\n\n if (typeof json.systemMessage === 'string' && json.systemMessage.trim()) {\n systemMessages.push(json.systemMessage.trim())\n }\n\n const additional =\n json.hookSpecificOutput &&\n typeof json.hookSpecificOutput === 'object' &&\n typeof json.hookSpecificOutput.additionalContext === 'string'\n ? String(json.hookSpecificOutput.additionalContext)\n : null\n if (additional && additional.trim()) {\n additionalContexts.push(additional.trim())\n }\n }\n\n return { warnings, systemMessages, additionalContexts }\n}\n\nexport type StopHookOutcome =\n | {\n decision: 'approve'\n warnings: string[]\n systemMessages: string[]\n additionalContexts: string[]\n }\n | {\n decision: 'block'\n message: string\n warnings: string[]\n systemMessages: string[]\n additionalContexts: string[]\n }\n\nexport async function runStopHooks(args: {\n hookEvent: 'Stop' | 'SubagentStop'\n reason?: string\n agentId?: string\n permissionMode?: unknown\n cwd?: string\n transcriptPath?: string\n safeMode?: boolean\n stopHookActive?: boolean\n signal?: AbortSignal\n}): Promise<StopHookOutcome> {\n const projectDir = args.cwd ?? getCwd()\n const matchers = [\n ...loadSettingsMatchers(projectDir, args.hookEvent),\n ...loadPluginMatchers(projectDir, args.hookEvent),\n ]\n if (matchers.length === 0) {\n return {\n decision: 'approve',\n warnings: [],\n systemMessages: [],\n additionalContexts: [],\n }\n }\n\n const applicable = matchers.filter(m => matcherMatchesTool(m.matcher, '*'))\n if (applicable.length === 0) {\n return {\n decision: 'approve',\n warnings: [],\n systemMessages: [],\n additionalContexts: [],\n }\n }\n\n const hookInput: Record<string, unknown> = {\n session_id: getKodeAgentSessionId(),\n transcript_path: args.transcriptPath,\n cwd: projectDir,\n hook_event_name: args.hookEvent,\n permission_mode: coerceHookPermissionMode(args.permissionMode),\n reason: args.reason,\n stop_hook_active: args.stopHookActive === true,\n ...(args.hookEvent === 'SubagentStop'\n ? { agent_id: args.agentId, agent_transcript_path: args.transcriptPath }\n : {}),\n }\n\n const warnings: string[] = []\n const systemMessages: string[] = []\n const additionalContexts: string[] = []\n\n const executions: Array<\n Promise<{\n hook: Hook\n result: { exitCode: number; stdout: string; stderr: string }\n }>\n > = []\n\n for (const entry of applicable) {\n for (const hook of entry.hooks) {\n if (hook.type === 'prompt') {\n executions.push(\n runPromptHook({\n hook,\n hookEvent: args.hookEvent,\n hookInput,\n safeMode: args.safeMode ?? false,\n parentSignal: args.signal,\n fallbackTimeoutMs: 30_000,\n }).then(result => ({ hook, result })),\n )\n continue\n }\n\n const { signal, cleanup } = withHookTimeout({\n timeoutSeconds: hook.timeout,\n parentSignal: args.signal,\n fallbackTimeoutMs: 60_000,\n })\n executions.push(\n runCommandHook({\n command: hook.command,\n stdinJson: hookInput,\n cwd: projectDir,\n env: {\n CLAUDE_PROJECT_DIR: projectDir,\n ...(hook.pluginRoot ? { CLAUDE_PLUGIN_ROOT: hook.pluginRoot } : {}),\n },\n signal,\n })\n .then(result => ({ hook, result }))\n .finally(cleanup),\n )\n }\n }\n\n const settled = await Promise.allSettled(executions)\n for (const item of settled) {\n if (item.status === 'rejected') {\n logError(item.reason)\n warnings.push(`Hook failed to run: ${String(item.reason ?? '')}`)\n continue\n }\n\n const { result } = item.value\n\n if (result.exitCode === 2) {\n return {\n decision: 'block',\n message: coerceHookMessage(result.stdout, result.stderr),\n warnings,\n systemMessages,\n additionalContexts,\n }\n }\n\n if (result.exitCode !== 0) {\n warnings.push(coerceHookMessage(result.stdout, result.stderr))\n continue\n }\n\n const json = tryParseHookJson(result.stdout)\n if (!json) continue\n\n if (typeof json.systemMessage === 'string' && json.systemMessage.trim()) {\n systemMessages.push(json.systemMessage.trim())\n }\n\n const additional =\n json.hookSpecificOutput &&\n typeof json.hookSpecificOutput === 'object' &&\n typeof json.hookSpecificOutput.additionalContext === 'string'\n ? String(json.hookSpecificOutput.additionalContext)\n : null\n if (additional && additional.trim()) {\n additionalContexts.push(additional.trim())\n }\n\n const stopDecision = normalizeStopDecision(json.decision)\n if (stopDecision === 'block') {\n const reason =\n typeof json.reason === 'string' && json.reason.trim()\n ? json.reason.trim()\n : null\n const msg =\n reason ||\n (systemMessages.length > 0\n ? systemMessages.join('\\n\\n')\n : coerceHookMessage(result.stdout, result.stderr))\n return {\n decision: 'block',\n message: msg,\n warnings,\n systemMessages,\n additionalContexts,\n }\n }\n }\n\n return { decision: 'approve', warnings, systemMessages, additionalContexts }\n}\n\nexport type UserPromptHookOutcome =\n | {\n decision: 'allow'\n warnings: string[]\n systemMessages: string[]\n additionalContexts: string[]\n }\n | {\n decision: 'block'\n message: string\n warnings: string[]\n systemMessages: string[]\n additionalContexts: string[]\n }\n\nexport async function runUserPromptSubmitHooks(args: {\n prompt: string\n permissionMode?: unknown\n cwd?: string\n transcriptPath?: string\n safeMode?: boolean\n signal?: AbortSignal\n}): Promise<UserPromptHookOutcome> {\n const projectDir = args.cwd ?? getCwd()\n const matchers = [\n ...loadSettingsMatchers(projectDir, 'UserPromptSubmit'),\n ...loadPluginMatchers(projectDir, 'UserPromptSubmit'),\n ]\n if (matchers.length === 0) {\n return {\n decision: 'allow',\n warnings: [],\n systemMessages: [],\n additionalContexts: [],\n }\n }\n\n const applicable = matchers.filter(m => matcherMatchesTool(m.matcher, '*'))\n if (applicable.length === 0) {\n return {\n decision: 'allow',\n warnings: [],\n systemMessages: [],\n additionalContexts: [],\n }\n }\n\n const hookInput: Record<string, unknown> = {\n session_id: getKodeAgentSessionId(),\n transcript_path: args.transcriptPath,\n cwd: projectDir,\n hook_event_name: 'UserPromptSubmit',\n permission_mode: coerceHookPermissionMode(args.permissionMode),\n user_prompt: args.prompt,\n prompt: args.prompt,\n }\n\n const warnings: string[] = []\n const systemMessages: string[] = []\n const additionalContexts: string[] = []\n\n const executions: Array<\n Promise<{\n hook: Hook\n result: { exitCode: number; stdout: string; stderr: string }\n }>\n > = []\n\n for (const entry of applicable) {\n for (const hook of entry.hooks) {\n if (hook.type === 'prompt') {\n executions.push(\n runPromptHook({\n hook,\n hookEvent: 'UserPromptSubmit',\n hookInput,\n safeMode: args.safeMode ?? false,\n parentSignal: args.signal,\n fallbackTimeoutMs: 30_000,\n }).then(result => ({ hook, result })),\n )\n continue\n }\n\n const { signal, cleanup } = withHookTimeout({\n timeoutSeconds: hook.timeout,\n parentSignal: args.signal,\n fallbackTimeoutMs: 60_000,\n })\n executions.push(\n runCommandHook({\n command: hook.command,\n stdinJson: hookInput,\n cwd: projectDir,\n env: {\n CLAUDE_PROJECT_DIR: projectDir,\n ...(hook.pluginRoot ? { CLAUDE_PLUGIN_ROOT: hook.pluginRoot } : {}),\n },\n signal,\n })\n .then(result => ({ hook, result }))\n .finally(cleanup),\n )\n }\n }\n\n const settled = await Promise.allSettled(executions)\n for (const item of settled) {\n if (item.status === 'rejected') {\n logError(item.reason)\n warnings.push(`Hook failed to run: ${String(item.reason ?? '')}`)\n continue\n }\n\n const { result } = item.value\n\n if (result.exitCode === 2) {\n return {\n decision: 'block',\n message: coerceHookMessage(result.stdout, result.stderr),\n warnings,\n systemMessages,\n additionalContexts,\n }\n }\n\n if (result.exitCode !== 0) {\n warnings.push(coerceHookMessage(result.stdout, result.stderr))\n continue\n }\n\n const json = tryParseHookJson(result.stdout)\n if (!json) continue\n\n if (typeof json.systemMessage === 'string' && json.systemMessage.trim()) {\n systemMessages.push(json.systemMessage.trim())\n }\n\n const additional =\n json.hookSpecificOutput &&\n typeof json.hookSpecificOutput === 'object' &&\n typeof json.hookSpecificOutput.additionalContext === 'string'\n ? String(json.hookSpecificOutput.additionalContext)\n : null\n if (additional && additional.trim()) {\n additionalContexts.push(additional.trim())\n }\n\n const stopDecision = normalizeStopDecision(json.decision)\n if (stopDecision === 'block') {\n const reason =\n typeof json.reason === 'string' && json.reason.trim()\n ? json.reason.trim()\n : null\n const msg =\n reason ||\n (systemMessages.length > 0\n ? systemMessages.join('\\n\\n')\n : coerceHookMessage(result.stdout, result.stderr))\n return {\n decision: 'block',\n message: msg,\n warnings,\n systemMessages,\n additionalContexts,\n }\n }\n }\n\n return { decision: 'allow', warnings, systemMessages, additionalContexts }\n}\n\nexport async function runSessionEndHooks(args: {\n reason: string\n permissionMode?: unknown\n cwd?: string\n transcriptPath?: string\n safeMode?: boolean\n signal?: AbortSignal\n}): Promise<{ warnings: string[]; systemMessages: string[] }> {\n const projectDir = args.cwd ?? getCwd()\n const matchers = [\n ...loadSettingsMatchers(projectDir, 'SessionEnd'),\n ...loadPluginMatchers(projectDir, 'SessionEnd'),\n ]\n if (matchers.length === 0) return { warnings: [], systemMessages: [] }\n\n const applicable = matchers.filter(m => matcherMatchesTool(m.matcher, '*'))\n if (applicable.length === 0) return { warnings: [], systemMessages: [] }\n\n const hookInput: Record<string, unknown> = {\n session_id: getKodeAgentSessionId(),\n transcript_path: args.transcriptPath,\n cwd: projectDir,\n hook_event_name: 'SessionEnd',\n permission_mode: coerceHookPermissionMode(args.permissionMode),\n reason: args.reason,\n }\n\n const warnings: string[] = []\n const systemMessages: string[] = []\n\n const executions: Array<\n Promise<{\n hook: Hook\n result: { exitCode: number; stdout: string; stderr: string }\n }>\n > = []\n\n for (const entry of applicable) {\n for (const hook of entry.hooks) {\n if (hook.type === 'prompt') {\n executions.push(\n runPromptHook({\n hook,\n hookEvent: 'SessionEnd',\n hookInput,\n safeMode: args.safeMode ?? false,\n parentSignal: args.signal,\n fallbackTimeoutMs: 30_000,\n }).then(result => ({ hook, result })),\n )\n continue\n }\n\n const { signal, cleanup } = withHookTimeout({\n timeoutSeconds: hook.timeout,\n parentSignal: args.signal,\n fallbackTimeoutMs: 60_000,\n })\n executions.push(\n runCommandHook({\n command: hook.command,\n stdinJson: hookInput,\n cwd: projectDir,\n env: {\n CLAUDE_PROJECT_DIR: projectDir,\n ...(hook.pluginRoot ? { CLAUDE_PLUGIN_ROOT: hook.pluginRoot } : {}),\n },\n signal,\n })\n .then(result => ({ hook, result }))\n .finally(cleanup),\n )\n }\n }\n\n const settled = await Promise.allSettled(executions)\n for (const item of settled) {\n if (item.status === 'rejected') {\n logError(item.reason)\n warnings.push(`Hook failed to run: ${String(item.reason ?? '')}`)\n continue\n }\n\n const { result } = item.value\n if (result.exitCode !== 0) {\n warnings.push(coerceHookMessage(result.stdout, result.stderr))\n continue\n }\n\n const json = tryParseHookJson(result.stdout)\n if (!json) continue\n if (typeof json.systemMessage === 'string' && json.systemMessage.trim()) {\n systemMessages.push(json.systemMessage.trim())\n }\n }\n\n return { warnings, systemMessages }\n}\n\nexport function __resetKodeHooksCacheForTests(): void {\n cache.clear()\n pluginHooksCache.clear()\n sessionStartCache.clear()\n}\n"],
|
|
5
|
+
"mappings": "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",
|
|
6
|
+
"names": ["content", "parts"]
|
|
7
|
+
}
|