newcraw 1.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (188) hide show
  1. package/LICENSE +201 -0
  2. package/README.md +692 -0
  3. package/README.zh-CN.md +338 -0
  4. package/cli-acp.js +82 -0
  5. package/cli.js +105 -0
  6. package/dist/REPL-74GZVSMY.js +42 -0
  7. package/dist/REPL-74GZVSMY.js.map +7 -0
  8. package/dist/acp-A55ZRIPP.js +1357 -0
  9. package/dist/acp-A55ZRIPP.js.map +7 -0
  10. package/dist/agentsValidate-XWFIEHJ2.js +373 -0
  11. package/dist/agentsValidate-XWFIEHJ2.js.map +7 -0
  12. package/dist/ask-4ACYU23S.js +126 -0
  13. package/dist/ask-4ACYU23S.js.map +7 -0
  14. package/dist/autoUpdater-O2WHHSGP.js +17 -0
  15. package/dist/autoUpdater-O2WHHSGP.js.map +7 -0
  16. package/dist/chunk-2UO3BFZH.js +16 -0
  17. package/dist/chunk-2UO3BFZH.js.map +7 -0
  18. package/dist/chunk-3C73U2IU.js +2970 -0
  19. package/dist/chunk-3C73U2IU.js.map +7 -0
  20. package/dist/chunk-3U5X4VWP.js +2613 -0
  21. package/dist/chunk-3U5X4VWP.js.map +7 -0
  22. package/dist/chunk-755HIAI3.js +95 -0
  23. package/dist/chunk-755HIAI3.js.map +7 -0
  24. package/dist/chunk-7ZFLZNOW.js +21 -0
  25. package/dist/chunk-7ZFLZNOW.js.map +7 -0
  26. package/dist/chunk-A44DGORI.js +49 -0
  27. package/dist/chunk-A44DGORI.js.map +7 -0
  28. package/dist/chunk-AXWJI6N5.js +11 -0
  29. package/dist/chunk-AXWJI6N5.js.map +7 -0
  30. package/dist/chunk-B26ZUMJI.js +515 -0
  31. package/dist/chunk-B26ZUMJI.js.map +7 -0
  32. package/dist/chunk-BHNQGSLO.js +96 -0
  33. package/dist/chunk-BHNQGSLO.js.map +7 -0
  34. package/dist/chunk-BUI6KGVA.js +164 -0
  35. package/dist/chunk-BUI6KGVA.js.map +7 -0
  36. package/dist/chunk-DY5D4SS7.js +936 -0
  37. package/dist/chunk-DY5D4SS7.js.map +7 -0
  38. package/dist/chunk-EENI5HG7.js +498 -0
  39. package/dist/chunk-EENI5HG7.js.map +7 -0
  40. package/dist/chunk-EXPWPWA4.js +654 -0
  41. package/dist/chunk-EXPWPWA4.js.map +7 -0
  42. package/dist/chunk-FHOCKJOW.js +766 -0
  43. package/dist/chunk-FHOCKJOW.js.map +7 -0
  44. package/dist/chunk-GPKVTIYJ.js +191 -0
  45. package/dist/chunk-GPKVTIYJ.js.map +7 -0
  46. package/dist/chunk-H5BCUDEN.js +794 -0
  47. package/dist/chunk-H5BCUDEN.js.map +7 -0
  48. package/dist/chunk-INJSFEKL.js +47 -0
  49. package/dist/chunk-INJSFEKL.js.map +7 -0
  50. package/dist/chunk-JX5ZQYTQ.js +12 -0
  51. package/dist/chunk-JX5ZQYTQ.js.map +7 -0
  52. package/dist/chunk-KQSHIOZK.js +24 -0
  53. package/dist/chunk-KQSHIOZK.js.map +7 -0
  54. package/dist/chunk-L6WKZEK4.js +1609 -0
  55. package/dist/chunk-L6WKZEK4.js.map +7 -0
  56. package/dist/chunk-LC4CL3YJ.js +124 -0
  57. package/dist/chunk-LC4CL3YJ.js.map +7 -0
  58. package/dist/chunk-MXSB7IOZ.js +1097 -0
  59. package/dist/chunk-MXSB7IOZ.js.map +7 -0
  60. package/dist/chunk-N5OHRWG2.js +249 -0
  61. package/dist/chunk-N5OHRWG2.js.map +7 -0
  62. package/dist/chunk-NQE3GGE3.js +19 -0
  63. package/dist/chunk-NQE3GGE3.js.map +7 -0
  64. package/dist/chunk-QF6YDTME.js +139 -0
  65. package/dist/chunk-QF6YDTME.js.map +7 -0
  66. package/dist/chunk-QTX7AJFQ.js +240 -0
  67. package/dist/chunk-QTX7AJFQ.js.map +7 -0
  68. package/dist/chunk-S3ZAJPYZ.js +515 -0
  69. package/dist/chunk-S3ZAJPYZ.js.map +7 -0
  70. package/dist/chunk-S5Y5IF2H.js +735 -0
  71. package/dist/chunk-S5Y5IF2H.js.map +7 -0
  72. package/dist/chunk-SBE6Y327.js +836 -0
  73. package/dist/chunk-SBE6Y327.js.map +7 -0
  74. package/dist/chunk-T25Z3JMG.js +17 -0
  75. package/dist/chunk-T25Z3JMG.js.map +7 -0
  76. package/dist/chunk-T6VKT5FR.js +196 -0
  77. package/dist/chunk-T6VKT5FR.js.map +7 -0
  78. package/dist/chunk-TSGGSPYD.js +151 -0
  79. package/dist/chunk-TSGGSPYD.js.map +7 -0
  80. package/dist/chunk-TY3CCSAT.js +24 -0
  81. package/dist/chunk-TY3CCSAT.js.map +7 -0
  82. package/dist/chunk-U224EQOS.js +34 -0
  83. package/dist/chunk-U224EQOS.js.map +7 -0
  84. package/dist/chunk-U7S4MEYP.js +95 -0
  85. package/dist/chunk-U7S4MEYP.js.map +7 -0
  86. package/dist/chunk-ULVAAZ2U.js +30517 -0
  87. package/dist/chunk-ULVAAZ2U.js.map +7 -0
  88. package/dist/chunk-WWLFALT7.js +128 -0
  89. package/dist/chunk-WWLFALT7.js.map +7 -0
  90. package/dist/chunk-XJQATPV7.js +23 -0
  91. package/dist/chunk-XJQATPV7.js.map +7 -0
  92. package/dist/chunk-XMGUQHMF.js +72 -0
  93. package/dist/chunk-XMGUQHMF.js.map +7 -0
  94. package/dist/chunk-XOMW5QTV.js +472 -0
  95. package/dist/chunk-XOMW5QTV.js.map +7 -0
  96. package/dist/chunk-Y7VZUSIM.js +1256 -0
  97. package/dist/chunk-Y7VZUSIM.js.map +7 -0
  98. package/dist/chunk-YVNBXMIP.js +511 -0
  99. package/dist/chunk-YVNBXMIP.js.map +7 -0
  100. package/dist/chunk-YYPJWXSA.js +145 -0
  101. package/dist/chunk-YYPJWXSA.js.map +7 -0
  102. package/dist/cli-BW34VKCN.js +3917 -0
  103. package/dist/cli-BW34VKCN.js.map +7 -0
  104. package/dist/commands-4CNZZBTE.js +46 -0
  105. package/dist/commands-4CNZZBTE.js.map +7 -0
  106. package/dist/config-XKRCXCSS.js +81 -0
  107. package/dist/config-XKRCXCSS.js.map +7 -0
  108. package/dist/context-T5CR3RP6.js +30 -0
  109. package/dist/context-T5CR3RP6.js.map +7 -0
  110. package/dist/costTracker-2G3ZI2JF.js +19 -0
  111. package/dist/costTracker-2G3ZI2JF.js.map +7 -0
  112. package/dist/customCommands-OCUMXZDN.js +25 -0
  113. package/dist/customCommands-OCUMXZDN.js.map +7 -0
  114. package/dist/env-DYDNFB4D.js +22 -0
  115. package/dist/env-DYDNFB4D.js.map +7 -0
  116. package/dist/index.js +34 -0
  117. package/dist/index.js.map +7 -0
  118. package/dist/kodeAgentSessionId-KTGFX2BE.js +13 -0
  119. package/dist/kodeAgentSessionId-KTGFX2BE.js.map +7 -0
  120. package/dist/kodeAgentSessionLoad-ZKR2VGHO.js +18 -0
  121. package/dist/kodeAgentSessionLoad-ZKR2VGHO.js.map +7 -0
  122. package/dist/kodeAgentSessionResume-NFZCTIBZ.js +16 -0
  123. package/dist/kodeAgentSessionResume-NFZCTIBZ.js.map +7 -0
  124. package/dist/kodeAgentStreamJson-VIXFTYL5.js +13 -0
  125. package/dist/kodeAgentStreamJson-VIXFTYL5.js.map +7 -0
  126. package/dist/kodeAgentStreamJsonSession-6CKTK6AF.js +131 -0
  127. package/dist/kodeAgentStreamJsonSession-6CKTK6AF.js.map +7 -0
  128. package/dist/kodeAgentStructuredStdio-SI5C7AAD.js +10 -0
  129. package/dist/kodeAgentStructuredStdio-SI5C7AAD.js.map +7 -0
  130. package/dist/kodeHooks-5RXJRDCY.js +36 -0
  131. package/dist/kodeHooks-5RXJRDCY.js.map +7 -0
  132. package/dist/llm-QJA3QMXR.js +3118 -0
  133. package/dist/llm-QJA3QMXR.js.map +7 -0
  134. package/dist/llmLazy-VCEV22DK.js +15 -0
  135. package/dist/llmLazy-VCEV22DK.js.map +7 -0
  136. package/dist/loader-CKNYMPCZ.js +28 -0
  137. package/dist/loader-CKNYMPCZ.js.map +7 -0
  138. package/dist/mcp-2SZTOKZX.js +49 -0
  139. package/dist/mcp-2SZTOKZX.js.map +7 -0
  140. package/dist/mentionProcessor-O7NWOH6S.js +211 -0
  141. package/dist/mentionProcessor-O7NWOH6S.js.map +7 -0
  142. package/dist/messages-PRKIHXMK.js +65 -0
  143. package/dist/messages-PRKIHXMK.js.map +7 -0
  144. package/dist/model-WG6RA25G.js +30 -0
  145. package/dist/model-WG6RA25G.js.map +7 -0
  146. package/dist/openai-VQLYFQ6B.js +29 -0
  147. package/dist/openai-VQLYFQ6B.js.map +7 -0
  148. package/dist/outputStyles-VQ57E3B6.js +28 -0
  149. package/dist/outputStyles-VQ57E3B6.js.map +7 -0
  150. package/dist/package.json +4 -0
  151. package/dist/pluginRuntime-NWOLU73K.js +218 -0
  152. package/dist/pluginRuntime-NWOLU73K.js.map +7 -0
  153. package/dist/pluginValidation-R7B6QQ6T.js +17 -0
  154. package/dist/pluginValidation-R7B6QQ6T.js.map +7 -0
  155. package/dist/prompts-W4V4Y67M.js +48 -0
  156. package/dist/prompts-W4V4Y67M.js.map +7 -0
  157. package/dist/query-GFFKKURO.js +50 -0
  158. package/dist/query-GFFKKURO.js.map +7 -0
  159. package/dist/responsesStreaming-2AIT6GHG.js +10 -0
  160. package/dist/responsesStreaming-2AIT6GHG.js.map +7 -0
  161. package/dist/ripgrep-SVBVC46X.js +17 -0
  162. package/dist/ripgrep-SVBVC46X.js.map +7 -0
  163. package/dist/skillMarketplace-5Z7Y6FTD.js +37 -0
  164. package/dist/skillMarketplace-5Z7Y6FTD.js.map +7 -0
  165. package/dist/state-X3R7BV7A.js +16 -0
  166. package/dist/state-X3R7BV7A.js.map +7 -0
  167. package/dist/theme-4VA64EWF.js +14 -0
  168. package/dist/theme-4VA64EWF.js.map +7 -0
  169. package/dist/toolPermissionContext-I3IXPVED.js +17 -0
  170. package/dist/toolPermissionContext-I3IXPVED.js.map +7 -0
  171. package/dist/toolPermissionSettings-35DJQEKG.js +18 -0
  172. package/dist/toolPermissionSettings-35DJQEKG.js.map +7 -0
  173. package/dist/tools-USOBTPOI.js +47 -0
  174. package/dist/tools-USOBTPOI.js.map +7 -0
  175. package/dist/userInput-NID2UYXG.js +312 -0
  176. package/dist/userInput-NID2UYXG.js.map +7 -0
  177. package/dist/uuid-VA3KVASX.js +9 -0
  178. package/dist/uuid-VA3KVASX.js.map +7 -0
  179. package/dist/yoga.wasm +0 -0
  180. package/package.json +135 -0
  181. package/scripts/binary-utils.cjs +61 -0
  182. package/scripts/cli-acp-wrapper.cjs +82 -0
  183. package/scripts/cli-wrapper.cjs +105 -0
  184. package/scripts/postinstall.js +144 -0
  185. package/web/dist/assets/index-COAJqX1Z.css +1 -0
  186. package/web/dist/assets/index-CzS_4LmC.js +179 -0
  187. package/web/dist/index.html +14 -0
  188. 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'\r\nimport { existsSync, readFileSync, statSync } from 'fs'\r\nimport { mkdirSync, mkdtempSync, rmSync, writeFileSync } from 'fs'\r\nimport { tmpdir } from 'os'\r\nimport { join } from 'path'\r\nimport { minimatch } from 'minimatch'\r\nimport { logError } from '@utils/log'\r\nimport { getCwd } from '@utils/state'\r\nimport { getKodeAgentSessionId } from '@utils/protocol/kodeAgentSessionId'\r\nimport { getSessionPlugins } from '@utils/session/sessionPlugins'\r\nimport { loadSettingsWithLegacyFallback } from '@utils/config/settingsFiles'\r\n\r\ntype HookEventName =\r\n | 'PreToolUse'\r\n | 'PostToolUse'\r\n | 'Stop'\r\n | 'SubagentStop'\r\n | 'UserPromptSubmit'\r\n | 'SessionStart'\r\n | 'SessionEnd'\r\n\r\ntype CommandHook = {\r\n type: 'command'\r\n command: string\r\n timeout?: number\r\n pluginRoot?: string\r\n}\r\n\r\ntype PromptHook = {\r\n type: 'prompt'\r\n prompt: string\r\n timeout?: number\r\n pluginRoot?: string\r\n}\r\n\r\ntype Hook = CommandHook | PromptHook\r\n\r\ntype HookMatcher = {\r\n matcher: string\r\n hooks: Hook[]\r\n}\r\n\r\ntype HookFileEnvelope = {\r\n description?: unknown\r\n hooks?: unknown\r\n [key: string]: unknown\r\n}\r\n\r\ntype HooksSettings = Partial<Record<HookEventName, HookMatcher[]>> & {\r\n [key: string]: unknown\r\n}\r\n\r\ntype SettingsFileWithHooks = {\r\n hooks?: HooksSettings\r\n [key: string]: unknown\r\n}\r\n\r\nexport type PreToolUseHookOutcome =\r\n | {\r\n kind: 'allow'\r\n warnings: string[]\r\n permissionDecision?: 'allow' | 'ask'\r\n updatedInput?: Record<string, unknown>\r\n systemMessages?: string[]\r\n additionalContexts?: string[]\r\n }\r\n | {\r\n kind: 'block'\r\n message: string\r\n systemMessages?: string[]\r\n additionalContexts?: string[]\r\n }\r\n\r\ntype CachedHooks = {\r\n mtimeMs: number\r\n byEvent: Partial<Record<HookEventName, HookMatcher[]>>\r\n}\r\n\r\nconst cache = new Map<string, CachedHooks>()\r\nconst pluginHooksCache = new Map<string, CachedHooks>()\r\nconst sessionStartCache = new Map<string, { additionalContext: string }>()\r\n\r\ntype HookRuntimeState = {\r\n transcriptPath?: string\r\n queuedSystemMessages: string[]\r\n queuedAdditionalContexts: string[]\r\n}\r\n\r\nconst HOOK_RUNTIME_STATE_KEY = '__kodeHookRuntimeState'\r\n\r\nfunction getHookRuntimeState(toolUseContext: any): HookRuntimeState {\r\n const existing = toolUseContext?.[HOOK_RUNTIME_STATE_KEY]\r\n if (\r\n existing &&\r\n typeof existing === 'object' &&\r\n Array.isArray((existing as any).queuedSystemMessages) &&\r\n Array.isArray((existing as any).queuedAdditionalContexts)\r\n ) {\r\n return existing as HookRuntimeState\r\n }\r\n const created: HookRuntimeState = {\r\n transcriptPath: undefined,\r\n queuedSystemMessages: [],\r\n queuedAdditionalContexts: [],\r\n }\r\n if (toolUseContext && typeof toolUseContext === 'object') {\r\n ;(toolUseContext as any)[HOOK_RUNTIME_STATE_KEY] = created\r\n }\r\n return created\r\n}\r\n\r\nexport function updateHookTranscriptForMessages(\r\n toolUseContext: any,\r\n messages: any[],\r\n): void {\r\n const state = getHookRuntimeState(toolUseContext)\r\n const sessionId = getKodeAgentSessionId()\r\n\r\n const dir = join(tmpdir(), 'newcraw-hooks-transcripts')\r\n try {\r\n mkdirSync(dir, { recursive: true })\r\n } catch {}\r\n\r\n if (!state.transcriptPath) {\r\n state.transcriptPath = join(dir, `${sessionId}.transcript.txt`)\r\n }\r\n\r\n const lines: string[] = []\r\n for (const msg of Array.isArray(messages) ? messages : []) {\r\n if (!msg || typeof msg !== 'object') continue\r\n if (msg.type !== 'user' && msg.type !== 'assistant') continue\r\n\r\n if (msg.type === 'user') {\r\n const content = (msg as any)?.message?.content\r\n if (typeof content === 'string') {\r\n lines.push(`user: ${content}`)\r\n continue\r\n }\r\n if (Array.isArray(content)) {\r\n const parts: string[] = []\r\n for (const block of content) {\r\n if (!block || typeof block !== 'object') continue\r\n if (block.type === 'text') parts.push(String(block.text ?? ''))\r\n if (block.type === 'tool_result')\r\n parts.push(`[tool_result] ${String(block.content ?? '')}`)\r\n }\r\n lines.push(`user: ${parts.join('')}`)\r\n }\r\n continue\r\n }\r\n\r\n const content = (msg as any)?.message?.content\r\n if (typeof content === 'string') {\r\n lines.push(`assistant: ${content}`)\r\n continue\r\n }\r\n if (!Array.isArray(content)) continue\r\n\r\n const parts: string[] = []\r\n for (const block of content) {\r\n if (!block || typeof block !== 'object') continue\r\n if (block.type === 'text') parts.push(String(block.text ?? ''))\r\n if (block.type === 'tool_use' || block.type === 'server_tool_use') {\r\n parts.push(\r\n `[tool_use:${String(block.name ?? '')}] ${hookValueForPrompt(block.input)}`,\r\n )\r\n }\r\n if (block.type === 'mcp_tool_use') {\r\n parts.push(\r\n `[mcp_tool_use:${String(block.name ?? '')}] ${hookValueForPrompt(block.input)}`,\r\n )\r\n }\r\n }\r\n lines.push(`assistant: ${parts.join('')}`)\r\n }\r\n\r\n try {\r\n writeFileSync(state.transcriptPath, lines.join('\\n') + '\\n', 'utf8')\r\n } catch {}\r\n}\r\n\r\nexport function drainHookSystemPromptAdditions(toolUseContext: any): string[] {\r\n const state = getHookRuntimeState(toolUseContext)\r\n const systemMessages = state.queuedSystemMessages.splice(\r\n 0,\r\n state.queuedSystemMessages.length,\r\n )\r\n const contexts = state.queuedAdditionalContexts.splice(\r\n 0,\r\n state.queuedAdditionalContexts.length,\r\n )\r\n\r\n const additions: string[] = []\r\n if (systemMessages.length > 0) {\r\n additions.push(\r\n ['\\n# Hook system messages', ...systemMessages.map(m => m.trim())]\r\n .filter(Boolean)\r\n .join('\\n\\n'),\r\n )\r\n }\r\n if (contexts.length > 0) {\r\n additions.push(\r\n ['\\n# Hook additional context', ...contexts.map(m => m.trim())]\r\n .filter(Boolean)\r\n .join('\\n\\n'),\r\n )\r\n }\r\n return additions\r\n}\r\n\r\nexport function getHookTranscriptPath(toolUseContext: any): string | undefined {\r\n return getHookRuntimeState(toolUseContext).transcriptPath\r\n}\r\n\r\nexport function queueHookSystemMessages(\r\n toolUseContext: any,\r\n messages: string[],\r\n): void {\r\n const state = getHookRuntimeState(toolUseContext)\r\n for (const msg of messages) {\r\n const trimmed = String(msg ?? '').trim()\r\n if (trimmed) state.queuedSystemMessages.push(trimmed)\r\n }\r\n}\r\n\r\nexport function queueHookAdditionalContexts(\r\n toolUseContext: any,\r\n contexts: string[],\r\n): void {\r\n const state = getHookRuntimeState(toolUseContext)\r\n for (const ctx of contexts) {\r\n const trimmed = String(ctx ?? '').trim()\r\n if (trimmed) state.queuedAdditionalContexts.push(trimmed)\r\n }\r\n}\r\n\r\nfunction isCommandHook(value: unknown): value is CommandHook {\r\n return (\r\n value !== null &&\r\n typeof value === 'object' &&\r\n (value as any).type === 'command' &&\r\n typeof (value as any).command === 'string' &&\r\n Boolean((value as any).command.trim())\r\n )\r\n}\r\n\r\nfunction isPromptHook(value: unknown): value is PromptHook {\r\n return (\r\n value !== null &&\r\n typeof value === 'object' &&\r\n (value as any).type === 'prompt' &&\r\n typeof (value as any).prompt === 'string' &&\r\n Boolean((value as any).prompt.trim())\r\n )\r\n}\r\n\r\nfunction isHook(value: unknown): value is Hook {\r\n return isCommandHook(value) || isPromptHook(value)\r\n}\r\n\r\nfunction parseHookMatchers(value: unknown): HookMatcher[] {\r\n if (!Array.isArray(value)) return []\r\n\r\n const out: HookMatcher[] = []\r\n for (const item of value) {\r\n if (!item || typeof item !== 'object') continue\r\n const matcher =\r\n typeof (item as any).matcher === 'string'\r\n ? (item as any).matcher.trim()\r\n : ''\r\n const effectiveMatcher = matcher || '*'\r\n const hooksRaw = (item as any).hooks\r\n const hooks = Array.isArray(hooksRaw) ? hooksRaw.filter(isHook) : []\r\n if (hooks.length === 0) continue\r\n out.push({ matcher: effectiveMatcher, hooks })\r\n }\r\n return out\r\n}\r\n\r\nfunction parseHooksByEvent(\r\n rawHooks: unknown,\r\n): Partial<Record<HookEventName, HookMatcher[]>> {\r\n if (!rawHooks || typeof rawHooks !== 'object') return {}\r\n const hooks: any = rawHooks\r\n return {\r\n PreToolUse: parseHookMatchers(hooks.PreToolUse),\r\n PostToolUse: parseHookMatchers(hooks.PostToolUse),\r\n Stop: parseHookMatchers(hooks.Stop),\r\n SubagentStop: parseHookMatchers(hooks.SubagentStop),\r\n UserPromptSubmit: parseHookMatchers(hooks.UserPromptSubmit),\r\n SessionStart: parseHookMatchers(hooks.SessionStart),\r\n SessionEnd: parseHookMatchers(hooks.SessionEnd),\r\n }\r\n}\r\n\r\nfunction loadInlinePluginHooksByEvent(plugin: {\r\n manifestPath: string\r\n manifest: unknown\r\n}): Partial<Record<HookEventName, HookMatcher[]>> | null {\r\n const manifestHooks = (plugin.manifest as any)?.hooks\r\n if (\r\n !manifestHooks ||\r\n typeof manifestHooks !== 'object' ||\r\n Array.isArray(manifestHooks)\r\n )\r\n return null\r\n\r\n const hookObj =\r\n (manifestHooks as any).hooks &&\r\n typeof (manifestHooks as any).hooks === 'object' &&\r\n !Array.isArray((manifestHooks as any).hooks)\r\n ? (manifestHooks as any).hooks\r\n : manifestHooks\r\n\r\n const cacheKey = `${plugin.manifestPath}#inlineHooks`\r\n try {\r\n const stat = statSync(plugin.manifestPath)\r\n const cached = pluginHooksCache.get(cacheKey)\r\n if (cached && cached.mtimeMs === stat.mtimeMs) return cached.byEvent\r\n\r\n const byEvent = parseHooksByEvent(hookObj)\r\n pluginHooksCache.set(cacheKey, { mtimeMs: stat.mtimeMs, byEvent })\r\n return byEvent\r\n } catch (err) {\r\n logError(err)\r\n pluginHooksCache.delete(cacheKey)\r\n return null\r\n }\r\n}\r\n\r\nfunction loadPreToolUseMatchers(projectDir: string): HookMatcher[] {\r\n const loaded = loadSettingsWithLegacyFallback({\r\n destination: 'projectSettings',\r\n projectDir,\r\n migrateToPrimary: true,\r\n })\r\n const settingsPath = loaded.usedPath\r\n if (!settingsPath) return []\r\n try {\r\n const stat = statSync(settingsPath)\r\n const cached = cache.get(settingsPath)\r\n if (cached && cached.mtimeMs === stat.mtimeMs)\r\n return cached.byEvent.PreToolUse ?? []\r\n\r\n const parsed = loaded.settings as SettingsFileWithHooks | null\r\n const byEvent = parseHooksByEvent(parsed?.hooks)\r\n cache.set(settingsPath, { mtimeMs: stat.mtimeMs, byEvent })\r\n return byEvent.PreToolUse ?? []\r\n } catch {\r\n cache.delete(settingsPath)\r\n return []\r\n }\r\n}\r\n\r\nfunction loadSettingsMatchers(\r\n projectDir: string,\r\n event: HookEventName,\r\n): HookMatcher[] {\r\n const loaded = loadSettingsWithLegacyFallback({\r\n destination: 'projectSettings',\r\n projectDir,\r\n migrateToPrimary: true,\r\n })\r\n const settingsPath = loaded.usedPath\r\n if (!settingsPath) return []\r\n try {\r\n const stat = statSync(settingsPath)\r\n const cached = cache.get(settingsPath)\r\n if (cached && cached.mtimeMs === stat.mtimeMs)\r\n return cached.byEvent[event] ?? []\r\n\r\n const parsed = loaded.settings as SettingsFileWithHooks | null\r\n const byEvent = parseHooksByEvent(parsed?.hooks)\r\n cache.set(settingsPath, { mtimeMs: stat.mtimeMs, byEvent })\r\n return byEvent[event] ?? []\r\n } catch {\r\n cache.delete(settingsPath)\r\n return []\r\n }\r\n}\r\n\r\nfunction matcherMatchesTool(matcher: string, toolName: string): boolean {\r\n if (!matcher) return false\r\n if (matcher === '*' || matcher === 'all') return true\r\n if (matcher === toolName) return true\r\n try {\r\n if (minimatch(toolName, matcher, { dot: true, nocase: false })) return true\r\n } catch {\r\n }\r\n try {\r\n if (new RegExp(matcher).test(toolName)) return true\r\n } catch {\r\n }\r\n return false\r\n}\r\n\r\nfunction buildShellCommand(command: string): string[] {\r\n if (process.platform === 'win32') {\r\n return ['cmd.exe', '/d', '/s', '/c', command]\r\n }\r\n return ['/bin/sh', '-c', command]\r\n}\r\n\r\nasync function runCommandHook(args: {\r\n command: string\r\n stdinJson: unknown\r\n cwd: string\r\n env?: Record<string, string>\r\n signal?: AbortSignal\r\n}): Promise<{ exitCode: number; stdout: string; stderr: string }> {\r\n const cmd = buildShellCommand(args.command)\r\n const proc = spawn(cmd[0], cmd.slice(1), {\r\n cwd: args.cwd,\r\n env: { ...(process.env as any), ...(args.env ?? {}) },\r\n stdio: ['pipe', 'pipe', 'pipe'],\r\n windowsHide: true,\r\n })\r\n\r\n let wasAborted = false\r\n const onAbort = () => {\r\n wasAborted = true\r\n try {\r\n proc.kill()\r\n } catch {}\r\n }\r\n if (args.signal) {\r\n if (args.signal.aborted) onAbort()\r\n args.signal.addEventListener('abort', onAbort, { once: true })\r\n }\r\n\r\n try {\r\n const input = JSON.stringify(args.stdinJson)\r\n try {\r\n proc.stdin?.write(input)\r\n proc.stdin?.end()\r\n } catch {}\r\n\r\n let stdout = ''\r\n let stderr = ''\r\n\r\n const collect = (\r\n stream: NodeJS.ReadableStream | null,\r\n append: (chunk: string) => void,\r\n ): { done: Promise<void>; cleanup: () => void } => {\r\n if (!stream) {\r\n return { done: Promise.resolve(), cleanup: () => {} }\r\n }\r\n try {\r\n ;(stream as any).setEncoding?.('utf8')\r\n } catch {}\r\n\r\n let resolveDone: (() => void) | null = null\r\n const done = new Promise<void>(resolve => {\r\n resolveDone = resolve\r\n })\r\n\r\n const finish = () => {\r\n cleanup()\r\n if (!resolveDone) return\r\n resolveDone()\r\n resolveDone = null\r\n }\r\n\r\n const onData = (chunk: unknown) => {\r\n append(\r\n typeof chunk === 'string'\r\n ? chunk\r\n : Buffer.isBuffer(chunk)\r\n ? chunk.toString('utf8')\r\n : String(chunk),\r\n )\r\n }\r\n\r\n const onError = () => finish()\r\n\r\n const cleanup = () => {\r\n stream.off('data', onData)\r\n stream.off('end', finish)\r\n stream.off('close', finish)\r\n stream.off('error', onError)\r\n }\r\n\r\n stream.on('data', onData)\r\n stream.once('end', finish)\r\n stream.once('close', finish)\r\n stream.once('error', onError)\r\n\r\n return { done, cleanup }\r\n }\r\n\r\n const stdoutCollector = collect(proc.stdout, chunk => {\r\n stdout += chunk\r\n })\r\n const stderrCollector = collect(proc.stderr, chunk => {\r\n stderr += chunk\r\n })\r\n\r\n const exitCode = await new Promise<number>(resolve => {\r\n proc.once('exit', (code, signal) => {\r\n if (typeof code === 'number') return resolve(code)\r\n if (signal) return resolve(143)\r\n return resolve(0)\r\n })\r\n proc.once('error', () => resolve(1))\r\n })\r\n\r\n await Promise.race([\r\n Promise.allSettled([stdoutCollector.done, stderrCollector.done]),\r\n new Promise(resolve => setTimeout(resolve, 250)),\r\n ])\r\n stdoutCollector.cleanup()\r\n stderrCollector.cleanup()\r\n\r\n return {\r\n exitCode: wasAborted && exitCode === 0 ? 143 : exitCode,\r\n stdout,\r\n stderr,\r\n }\r\n } finally {\r\n if (args.signal) {\r\n try {\r\n args.signal.removeEventListener('abort', onAbort)\r\n } catch {}\r\n }\r\n }\r\n}\r\n\r\nfunction mergeAbortSignals(signals: Array<AbortSignal | undefined>): {\r\n signal: AbortSignal\r\n cleanup: () => void\r\n} {\r\n const controller = new AbortController()\r\n const onAbort = () => controller.abort()\r\n\r\n const cleanups: Array<() => void> = []\r\n for (const signal of signals) {\r\n if (!signal) continue\r\n if (signal.aborted) {\r\n controller.abort()\r\n continue\r\n }\r\n signal.addEventListener('abort', onAbort, { once: true })\r\n cleanups.push(() => {\r\n try {\r\n signal.removeEventListener('abort', onAbort)\r\n } catch {}\r\n })\r\n }\r\n\r\n return {\r\n signal: controller.signal,\r\n cleanup: () => cleanups.forEach(fn => fn()),\r\n }\r\n}\r\n\r\nfunction withHookTimeout(args: {\r\n timeoutSeconds?: number\r\n parentSignal?: AbortSignal\r\n fallbackTimeoutMs: number\r\n}): { signal: AbortSignal; cleanup: () => void } {\r\n const timeoutMs =\r\n typeof args.timeoutSeconds === 'number' &&\r\n Number.isFinite(args.timeoutSeconds)\r\n ? Math.max(0, Math.floor(args.timeoutSeconds * 1000))\r\n : args.fallbackTimeoutMs\r\n\r\n const timeoutSignal =\r\n typeof AbortSignal !== 'undefined' &&\r\n typeof (AbortSignal as any).timeout === 'function'\r\n ? (AbortSignal as any).timeout(timeoutMs)\r\n : (() => {\r\n const controller = new AbortController()\r\n const timer = setTimeout(() => controller.abort(), timeoutMs)\r\n const signal = controller.signal\r\n ;(signal as any).__cleanup = () => clearTimeout(timer)\r\n return signal\r\n })()\r\n\r\n const merged = mergeAbortSignals([args.parentSignal, timeoutSignal])\r\n const timeoutCleanup =\r\n typeof (timeoutSignal as any).__cleanup === 'function'\r\n ? (timeoutSignal as any).__cleanup\r\n : () => {}\r\n\r\n return {\r\n signal: merged.signal,\r\n cleanup: () => {\r\n merged.cleanup()\r\n timeoutCleanup()\r\n },\r\n }\r\n}\r\n\r\nfunction coerceHookMessage(stdout: string, stderr: string): string {\r\n const s = (stderr || '').trim()\r\n if (s) return s\r\n const o = (stdout || '').trim()\r\n if (o) return o\r\n return 'Hook blocked the tool call.'\r\n}\r\n\r\nfunction coerceHookPermissionMode(mode: unknown): 'ask' | 'allow' {\r\n if (mode === 'acceptEdits' || mode === 'bypassPermissions') return 'allow'\r\n return 'ask'\r\n}\r\n\r\nfunction extractFirstJsonObject(text: string): string | null {\r\n let start = -1\r\n let depth = 0\r\n let inString = false\r\n let escaped = false\r\n\r\n for (let i = 0; i < text.length; i++) {\r\n const ch = text[i]\r\n\r\n if (start === -1) {\r\n if (ch === '{') {\r\n start = i\r\n depth = 1\r\n }\r\n continue\r\n }\r\n\r\n if (inString) {\r\n if (escaped) {\r\n escaped = false\r\n continue\r\n }\r\n if (ch === '\\\\') {\r\n escaped = true\r\n continue\r\n }\r\n if (ch === '\"') {\r\n inString = false\r\n }\r\n continue\r\n }\r\n\r\n if (ch === '\"') {\r\n inString = true\r\n continue\r\n }\r\n\r\n if (ch === '{') {\r\n depth++\r\n continue\r\n }\r\n if (ch === '}') {\r\n depth--\r\n if (depth === 0) return text.slice(start, i + 1)\r\n }\r\n }\r\n\r\n return null\r\n}\r\n\r\nfunction parseSessionStartAdditionalContext(stdout: string): string | null {\r\n const trimmed = String(stdout ?? '').trim()\r\n if (!trimmed) return null\r\n\r\n const jsonStr = extractFirstJsonObject(trimmed) ?? trimmed\r\n try {\r\n const parsed = JSON.parse(jsonStr)\r\n const additional =\r\n parsed &&\r\n typeof parsed === 'object' &&\r\n (parsed as any).hookSpecificOutput &&\r\n typeof (parsed as any).hookSpecificOutput.additionalContext === 'string'\r\n ? String((parsed as any).hookSpecificOutput.additionalContext)\r\n : null\r\n return additional && additional.trim() ? additional : null\r\n } catch {\r\n return null\r\n }\r\n}\r\n\r\nfunction tryParseHookJson(stdout: string): any | null {\r\n const trimmed = String(stdout ?? '').trim()\r\n if (!trimmed) return null\r\n const jsonStr = extractFirstJsonObject(trimmed) ?? trimmed\r\n try {\r\n const parsed = JSON.parse(jsonStr)\r\n return parsed && typeof parsed === 'object' ? parsed : null\r\n } catch {\r\n return null\r\n }\r\n}\r\n\r\nfunction normalizePermissionDecision(\r\n value: unknown,\r\n): 'allow' | 'deny' | 'ask' | 'passthrough' | null {\r\n if (typeof value !== 'string') return null\r\n const normalized = value.trim().toLowerCase()\r\n if (normalized === 'allow' || normalized === 'approve') return 'allow'\r\n if (normalized === 'deny' || normalized === 'block') return 'deny'\r\n if (normalized === 'ask') return 'ask'\r\n if (normalized === 'passthrough' || normalized === 'continue')\r\n return 'passthrough'\r\n return null\r\n}\r\n\r\nfunction normalizeStopDecision(value: unknown): 'approve' | 'block' | null {\r\n if (typeof value !== 'string') return null\r\n const normalized = value.trim().toLowerCase()\r\n if (normalized === 'approve' || normalized === 'allow') return 'approve'\r\n if (normalized === 'block' || normalized === 'deny') return 'block'\r\n return null\r\n}\r\n\r\nfunction hookValueForPrompt(value: unknown): string {\r\n if (value === null || value === undefined) return ''\r\n if (typeof value === 'string') return value\r\n try {\r\n return JSON.stringify(value, null, 2)\r\n } catch {\r\n return String(value)\r\n }\r\n}\r\n\r\nfunction interpolatePromptHookTemplate(\r\n template: string,\r\n hookInput: Record<string, unknown>,\r\n): string {\r\n return String(template ?? '')\r\n .replaceAll('$TOOL_INPUT', hookValueForPrompt(hookInput.tool_input))\r\n .replaceAll('$TOOL_RESULT', hookValueForPrompt(hookInput.tool_result))\r\n .replaceAll('$TOOL_RESPONSE', hookValueForPrompt(hookInput.tool_response))\r\n .replaceAll('$USER_PROMPT', hookValueForPrompt(hookInput.user_prompt))\r\n .replaceAll('$PROMPT', hookValueForPrompt(hookInput.prompt))\r\n .replaceAll('$REASON', hookValueForPrompt(hookInput.reason))\r\n}\r\n\r\nfunction extractAssistantText(message: any): string {\r\n const content = (message as any)?.message?.content\r\n if (typeof content === 'string') return content\r\n if (!Array.isArray(content)) return ''\r\n return content\r\n .filter((b: any) => b && typeof b === 'object' && b.type === 'text')\r\n .map((b: any) => String(b.text ?? ''))\r\n .join('')\r\n}\r\n\r\nasync function runPromptHook(args: {\r\n hook: PromptHook\r\n hookEvent: HookEventName\r\n hookInput: Record<string, unknown>\r\n safeMode: boolean\r\n parentSignal?: AbortSignal\r\n fallbackTimeoutMs: number\r\n}): Promise<{ exitCode: number; stdout: string; stderr: string }> {\r\n const { signal, cleanup } = withHookTimeout({\r\n timeoutSeconds: args.hook.timeout,\r\n parentSignal: args.parentSignal,\r\n fallbackTimeoutMs: args.fallbackTimeoutMs,\r\n })\r\n\r\n try {\r\n const { queryQuick } = await import('@services/llmLazy')\r\n\r\n const systemPrompt = [\r\n 'You are executing a NewCraw prompt hook.',\r\n 'Return a single JSON object only (no markdown, no prose).',\r\n `hook_event_name: ${args.hookEvent}`,\r\n 'Valid fields include:',\r\n '- systemMessage: string',\r\n '- decision: \\\"approve\\\" | \\\"block\\\" (Stop/SubagentStop only)',\r\n '- reason: string (Stop/SubagentStop only)',\r\n '- hookSpecificOutput.permissionDecision: \\\"allow\\\" | \\\"deny\\\" | \\\"ask\\\" | \\\"passthrough\\\" (PreToolUse only)',\r\n '- hookSpecificOutput.updatedInput: object (PreToolUse only)',\r\n '- hookSpecificOutput.additionalContext: string (SessionStart/any)',\r\n ]\r\n\r\n const promptText = interpolatePromptHookTemplate(\r\n args.hook.prompt,\r\n args.hookInput,\r\n )\r\n const userPrompt = `${promptText}\\n\\n# Hook input JSON\\n${hookValueForPrompt(args.hookInput)}`\r\n\r\n const response = await queryQuick({\r\n systemPrompt,\r\n userPrompt,\r\n signal,\r\n })\r\n\r\n return { exitCode: 0, stdout: extractAssistantText(response), stderr: '' }\r\n } catch (err) {\r\n return {\r\n exitCode: 1,\r\n stdout: '',\r\n stderr: err instanceof Error ? err.message : String(err),\r\n }\r\n } finally {\r\n cleanup()\r\n }\r\n}\r\n\r\nfunction applyEnvFileToProcessEnv(envFilePath: string): void {\r\n let raw: string\r\n try {\r\n raw = readFileSync(envFilePath, 'utf8')\r\n } catch {\r\n return\r\n }\r\n\r\n const lines = raw.split(/\\r?\\n/)\r\n for (const line of lines) {\r\n const trimmed = line.trim()\r\n if (!trimmed || trimmed.startsWith('#')) continue\r\n\r\n const withoutExport = trimmed.startsWith('export ')\r\n ? trimmed.slice('export '.length).trim()\r\n : trimmed\r\n\r\n const eq = withoutExport.indexOf('=')\r\n if (eq <= 0) continue\r\n\r\n const key = withoutExport.slice(0, eq).trim()\r\n let value = withoutExport.slice(eq + 1).trim()\r\n if (!key) continue\r\n\r\n if (\r\n (value.startsWith('\"') && value.endsWith('\"')) ||\r\n (value.startsWith(\"'\") && value.endsWith(\"'\"))\r\n ) {\r\n value = value.slice(1, -1)\r\n }\r\n\r\n process.env[key] = value\r\n }\r\n}\r\n\r\nfunction loadPluginPreToolUseMatchers(projectDir: string): HookMatcher[] {\r\n const plugins = getSessionPlugins()\r\n if (plugins.length === 0) return []\r\n\r\n const out: HookMatcher[] = []\r\n for (const plugin of plugins) {\r\n for (const hookPath of plugin.hooksFiles ?? []) {\r\n try {\r\n const stat = statSync(hookPath)\r\n const cached = pluginHooksCache.get(hookPath)\r\n if (cached && cached.mtimeMs === stat.mtimeMs) {\r\n out.push(\r\n ...(cached.byEvent.PreToolUse ?? []).map(m => ({\r\n matcher: m.matcher,\r\n hooks: m.hooks.map(h => ({ ...h, pluginRoot: plugin.rootDir })),\r\n })),\r\n )\r\n continue\r\n }\r\n\r\n const raw = readFileSync(hookPath, 'utf8')\r\n const parsed = JSON.parse(raw) as HookFileEnvelope\r\n const hookObj =\r\n parsed && typeof parsed === 'object' && parsed.hooks\r\n ? parsed.hooks\r\n : parsed\r\n const byEvent = parseHooksByEvent(hookObj)\r\n pluginHooksCache.set(hookPath, { mtimeMs: stat.mtimeMs, byEvent })\r\n out.push(\r\n ...(byEvent.PreToolUse ?? []).map(m => ({\r\n matcher: m.matcher,\r\n hooks: m.hooks.map(h => ({ ...h, pluginRoot: plugin.rootDir })),\r\n })),\r\n )\r\n } catch (err) {\r\n logError(err)\r\n continue\r\n }\r\n }\r\n\r\n const inlineByEvent = loadInlinePluginHooksByEvent(plugin)\r\n if (inlineByEvent?.PreToolUse) {\r\n out.push(\r\n ...inlineByEvent.PreToolUse.map(m => ({\r\n matcher: m.matcher,\r\n hooks: m.hooks.map(h => ({ ...h, pluginRoot: plugin.rootDir })),\r\n })),\r\n )\r\n }\r\n }\r\n\r\n return out\r\n}\r\n\r\nfunction loadPluginMatchers(\r\n projectDir: string,\r\n event: HookEventName,\r\n): HookMatcher[] {\r\n const plugins = getSessionPlugins()\r\n if (plugins.length === 0) return []\r\n\r\n const out: HookMatcher[] = []\r\n for (const plugin of plugins) {\r\n for (const hookPath of plugin.hooksFiles ?? []) {\r\n try {\r\n const stat = statSync(hookPath)\r\n const cached = pluginHooksCache.get(hookPath)\r\n if (cached && cached.mtimeMs === stat.mtimeMs) {\r\n out.push(\r\n ...(cached.byEvent[event] ?? []).map(m => ({\r\n matcher: m.matcher,\r\n hooks: m.hooks.map(h => ({ ...h, pluginRoot: plugin.rootDir })),\r\n })),\r\n )\r\n continue\r\n }\r\n\r\n const raw = readFileSync(hookPath, 'utf8')\r\n const parsed = JSON.parse(raw) as HookFileEnvelope\r\n const hookObj =\r\n parsed && typeof parsed === 'object' && parsed.hooks\r\n ? parsed.hooks\r\n : parsed\r\n const byEvent = parseHooksByEvent(hookObj)\r\n pluginHooksCache.set(hookPath, { mtimeMs: stat.mtimeMs, byEvent })\r\n out.push(\r\n ...(byEvent[event] ?? []).map(m => ({\r\n matcher: m.matcher,\r\n hooks: m.hooks.map(h => ({ ...h, pluginRoot: plugin.rootDir })),\r\n })),\r\n )\r\n } catch (err) {\r\n logError(err)\r\n continue\r\n }\r\n }\r\n\r\n const inlineByEvent = loadInlinePluginHooksByEvent(plugin)\r\n if (inlineByEvent?.[event]) {\r\n out.push(\r\n ...(inlineByEvent[event] ?? []).map(m => ({\r\n matcher: m.matcher,\r\n hooks: m.hooks.map(h => ({ ...h, pluginRoot: plugin.rootDir })),\r\n })),\r\n )\r\n }\r\n }\r\n return out\r\n}\r\n\r\nfunction parseSessionStartHooks(value: unknown): CommandHook[] {\r\n if (!Array.isArray(value)) return []\r\n const out: CommandHook[] = []\r\n for (const item of value) {\r\n if (!item || typeof item !== 'object') continue\r\n const hooksRaw = (item as any).hooks\r\n const hooks = Array.isArray(hooksRaw) ? hooksRaw.filter(isCommandHook) : []\r\n out.push(...hooks)\r\n }\r\n return out\r\n}\r\n\r\nexport async function getSessionStartAdditionalContext(args?: {\r\n permissionMode?: unknown\r\n cwd?: string\r\n signal?: AbortSignal\r\n}): Promise<string> {\r\n const sessionId = getKodeAgentSessionId()\r\n const cached = sessionStartCache.get(sessionId)\r\n if (cached) return cached.additionalContext\r\n\r\n const projectDir = args?.cwd ?? getCwd()\r\n const plugins = getSessionPlugins()\r\n if (plugins.length === 0) {\r\n sessionStartCache.set(sessionId, { additionalContext: '' })\r\n return ''\r\n }\r\n\r\n const envFileDir = mkdtempSync(join(tmpdir(), 'newcraw-env-'))\r\n const envFilePath = join(envFileDir, `${sessionId}.env`)\r\n try {\r\n writeFileSync(envFilePath, '', 'utf8')\r\n } catch {\r\n }\r\n\r\n const additionalContexts: string[] = []\r\n\r\n try {\r\n for (const plugin of plugins) {\r\n for (const hookPath of plugin.hooksFiles ?? []) {\r\n let hookObj: any\r\n try {\r\n const raw = readFileSync(hookPath, 'utf8')\r\n const parsed = JSON.parse(raw) as HookFileEnvelope\r\n hookObj =\r\n parsed && typeof parsed === 'object' && parsed.hooks\r\n ? parsed.hooks\r\n : parsed\r\n } catch {\r\n continue\r\n }\r\n\r\n const hooks = parseSessionStartHooks(hookObj?.SessionStart).map(h => ({\r\n ...h,\r\n pluginRoot: plugin.rootDir,\r\n }))\r\n if (hooks.length === 0) continue\r\n\r\n for (const hook of hooks) {\r\n const payload = {\r\n session_id: sessionId,\r\n cwd: projectDir,\r\n hook_event_name: 'SessionStart',\r\n permission_mode: coerceHookPermissionMode(args?.permissionMode),\r\n }\r\n\r\n const result = await runCommandHook({\r\n command: hook.command,\r\n stdinJson: payload,\r\n cwd: projectDir,\r\n env: {\r\n CLAUDE_PROJECT_DIR: projectDir,\r\n ...(hook.pluginRoot\r\n ? { CLAUDE_PLUGIN_ROOT: hook.pluginRoot }\r\n : {}),\r\n CLAUDE_ENV_FILE: envFilePath,\r\n },\r\n signal: args?.signal,\r\n })\r\n\r\n if (result.exitCode !== 0) continue\r\n const injected = parseSessionStartAdditionalContext(result.stdout)\r\n if (injected) additionalContexts.push(injected)\r\n }\r\n }\r\n\r\n const inlineHooks = (plugin.manifest as any)?.hooks\r\n if (\r\n inlineHooks &&\r\n typeof inlineHooks === 'object' &&\r\n !Array.isArray(inlineHooks)\r\n ) {\r\n const hookObj =\r\n (inlineHooks as any).hooks &&\r\n typeof (inlineHooks as any).hooks === 'object' &&\r\n !Array.isArray((inlineHooks as any).hooks)\r\n ? (inlineHooks as any).hooks\r\n : inlineHooks\r\n\r\n const hooks = parseSessionStartHooks(\r\n (hookObj as any)?.SessionStart,\r\n ).map(h => ({\r\n ...h,\r\n pluginRoot: plugin.rootDir,\r\n }))\r\n if (hooks.length > 0) {\r\n for (const hook of hooks) {\r\n const payload = {\r\n session_id: sessionId,\r\n cwd: projectDir,\r\n hook_event_name: 'SessionStart',\r\n permission_mode: coerceHookPermissionMode(args?.permissionMode),\r\n }\r\n\r\n const result = await runCommandHook({\r\n command: hook.command,\r\n stdinJson: payload,\r\n cwd: projectDir,\r\n env: {\r\n CLAUDE_PROJECT_DIR: projectDir,\r\n ...(hook.pluginRoot\r\n ? { CLAUDE_PLUGIN_ROOT: hook.pluginRoot }\r\n : {}),\r\n CLAUDE_ENV_FILE: envFilePath,\r\n },\r\n signal: args?.signal,\r\n })\r\n\r\n if (result.exitCode !== 0) continue\r\n const injected = parseSessionStartAdditionalContext(result.stdout)\r\n if (injected) additionalContexts.push(injected)\r\n }\r\n }\r\n }\r\n }\r\n } finally {\r\n applyEnvFileToProcessEnv(envFilePath)\r\n try {\r\n rmSync(envFileDir, { recursive: true, force: true })\r\n } catch {}\r\n }\r\n\r\n const additionalContext = additionalContexts.filter(Boolean).join('\\n\\n')\r\n sessionStartCache.set(sessionId, { additionalContext })\r\n return additionalContext\r\n}\r\n\r\nexport async function runPreToolUseHooks(args: {\r\n toolName: string\r\n toolInput: Record<string, unknown>\r\n toolUseId: string\r\n permissionMode?: unknown\r\n cwd?: string\r\n transcriptPath?: string\r\n safeMode?: boolean\r\n signal?: AbortSignal\r\n}): Promise<PreToolUseHookOutcome> {\r\n const projectDir = args.cwd ?? getCwd()\r\n const matchers = [\r\n ...loadSettingsMatchers(projectDir, 'PreToolUse'),\r\n ...loadPluginMatchers(projectDir, 'PreToolUse'),\r\n ]\r\n if (matchers.length === 0) return { kind: 'allow', warnings: [] }\r\n\r\n const applicable = matchers.filter(m =>\r\n matcherMatchesTool(m.matcher, args.toolName),\r\n )\r\n if (applicable.length === 0) return { kind: 'allow', warnings: [] }\r\n\r\n const hookInput: Record<string, unknown> = {\r\n session_id: getKodeAgentSessionId(),\r\n transcript_path: args.transcriptPath,\r\n cwd: projectDir,\r\n hook_event_name: 'PreToolUse',\r\n permission_mode: coerceHookPermissionMode(args.permissionMode),\r\n tool_name: args.toolName,\r\n tool_input: args.toolInput,\r\n tool_use_id: args.toolUseId,\r\n }\r\n\r\n const warnings: string[] = []\r\n const systemMessages: string[] = []\r\n const additionalContexts: string[] = []\r\n\r\n let mergedUpdatedInput: Record<string, unknown> | undefined\r\n let permissionDecision: 'allow' | 'ask' | null = null\r\n\r\n const executions: Array<\r\n Promise<{\r\n hook: Hook\r\n result: { exitCode: number; stdout: string; stderr: string }\r\n }>\r\n > = []\r\n\r\n for (const entry of applicable) {\r\n for (const hook of entry.hooks) {\r\n if (hook.type === 'prompt') {\r\n executions.push(\r\n runPromptHook({\r\n hook,\r\n hookEvent: 'PreToolUse',\r\n hookInput,\r\n safeMode: args.safeMode ?? false,\r\n parentSignal: args.signal,\r\n fallbackTimeoutMs: 30_000,\r\n }).then(result => ({ hook, result })),\r\n )\r\n continue\r\n }\r\n\r\n const { signal, cleanup } = withHookTimeout({\r\n timeoutSeconds: hook.timeout,\r\n parentSignal: args.signal,\r\n fallbackTimeoutMs: 60_000,\r\n })\r\n executions.push(\r\n runCommandHook({\r\n command: hook.command,\r\n stdinJson: hookInput,\r\n cwd: projectDir,\r\n env: {\r\n CLAUDE_PROJECT_DIR: projectDir,\r\n ...(hook.pluginRoot ? { CLAUDE_PLUGIN_ROOT: hook.pluginRoot } : {}),\r\n },\r\n signal,\r\n })\r\n .then(result => ({ hook, result }))\r\n .finally(cleanup),\r\n )\r\n }\r\n }\r\n\r\n const settled = await Promise.allSettled(executions)\r\n for (const item of settled) {\r\n if (item.status === 'rejected') {\r\n logError(item.reason)\r\n warnings.push(`Hook failed to run: ${String(item.reason ?? '')}`)\r\n continue\r\n }\r\n\r\n const { hook, result } = item.value\r\n\r\n if (result.exitCode === 2) {\r\n return {\r\n kind: 'block',\r\n message: coerceHookMessage(result.stdout, result.stderr),\r\n }\r\n }\r\n\r\n if (result.exitCode !== 0) {\r\n warnings.push(coerceHookMessage(result.stdout, result.stderr))\r\n continue\r\n }\r\n\r\n const json = tryParseHookJson(result.stdout)\r\n if (!json) continue\r\n\r\n if (typeof json.systemMessage === 'string' && json.systemMessage.trim()) {\r\n systemMessages.push(json.systemMessage.trim())\r\n }\r\n\r\n const additional =\r\n json.hookSpecificOutput &&\r\n typeof json.hookSpecificOutput === 'object' &&\r\n typeof json.hookSpecificOutput.additionalContext === 'string'\r\n ? String(json.hookSpecificOutput.additionalContext)\r\n : null\r\n if (additional && additional.trim()) {\r\n additionalContexts.push(additional.trim())\r\n }\r\n\r\n const decision = normalizePermissionDecision(\r\n json.hookSpecificOutput?.permissionDecision,\r\n )\r\n if (decision === 'deny') {\r\n const msg =\r\n systemMessages.length > 0\r\n ? systemMessages.join('\\n\\n')\r\n : coerceHookMessage(result.stdout, result.stderr)\r\n return {\r\n kind: 'block',\r\n message: msg,\r\n systemMessages,\r\n additionalContexts,\r\n }\r\n }\r\n\r\n if (decision === 'ask') {\r\n permissionDecision = 'ask'\r\n } else if (decision === 'allow') {\r\n if (!permissionDecision) permissionDecision = 'allow'\r\n }\r\n\r\n const updated =\r\n json.hookSpecificOutput &&\r\n typeof json.hookSpecificOutput === 'object' &&\r\n json.hookSpecificOutput.updatedInput &&\r\n typeof json.hookSpecificOutput.updatedInput === 'object'\r\n ? (json.hookSpecificOutput.updatedInput as Record<string, unknown>)\r\n : null\r\n if (updated) {\r\n mergedUpdatedInput = { ...(mergedUpdatedInput ?? {}), ...updated }\r\n }\r\n }\r\n\r\n return {\r\n kind: 'allow',\r\n warnings,\r\n permissionDecision:\r\n permissionDecision === 'allow'\r\n ? 'allow'\r\n : permissionDecision === 'ask'\r\n ? 'ask'\r\n : undefined,\r\n updatedInput:\r\n permissionDecision === 'allow' ? mergedUpdatedInput : undefined,\r\n systemMessages,\r\n additionalContexts,\r\n }\r\n}\r\n\r\nexport async function runPostToolUseHooks(args: {\r\n toolName: string\r\n toolInput: Record<string, unknown>\r\n toolResult: unknown\r\n toolUseId: string\r\n permissionMode?: unknown\r\n cwd?: string\r\n transcriptPath?: string\r\n safeMode?: boolean\r\n signal?: AbortSignal\r\n}): Promise<{\r\n warnings: string[]\r\n systemMessages: string[]\r\n additionalContexts: string[]\r\n}> {\r\n const projectDir = args.cwd ?? getCwd()\r\n const matchers = [\r\n ...loadSettingsMatchers(projectDir, 'PostToolUse'),\r\n ...loadPluginMatchers(projectDir, 'PostToolUse'),\r\n ]\r\n if (matchers.length === 0) {\r\n return { warnings: [], systemMessages: [], additionalContexts: [] }\r\n }\r\n\r\n const applicable = matchers.filter(m =>\r\n matcherMatchesTool(m.matcher, args.toolName),\r\n )\r\n if (applicable.length === 0) {\r\n return { warnings: [], systemMessages: [], additionalContexts: [] }\r\n }\r\n\r\n const hookInput: Record<string, unknown> = {\r\n session_id: getKodeAgentSessionId(),\r\n transcript_path: args.transcriptPath,\r\n cwd: projectDir,\r\n hook_event_name: 'PostToolUse',\r\n permission_mode: coerceHookPermissionMode(args.permissionMode),\r\n tool_name: args.toolName,\r\n tool_input: args.toolInput,\r\n tool_result: args.toolResult,\r\n tool_response: args.toolResult,\r\n tool_use_id: args.toolUseId,\r\n }\r\n\r\n const warnings: string[] = []\r\n const systemMessages: string[] = []\r\n const additionalContexts: string[] = []\r\n\r\n const executions: Array<\r\n Promise<{\r\n hook: Hook\r\n result: { exitCode: number; stdout: string; stderr: string }\r\n }>\r\n > = []\r\n\r\n for (const entry of applicable) {\r\n for (const hook of entry.hooks) {\r\n if (hook.type === 'prompt') {\r\n executions.push(\r\n runPromptHook({\r\n hook,\r\n hookEvent: 'PostToolUse',\r\n hookInput,\r\n safeMode: args.safeMode ?? false,\r\n parentSignal: args.signal,\r\n fallbackTimeoutMs: 30_000,\r\n }).then(result => ({ hook, result })),\r\n )\r\n continue\r\n }\r\n\r\n const { signal, cleanup } = withHookTimeout({\r\n timeoutSeconds: hook.timeout,\r\n parentSignal: args.signal,\r\n fallbackTimeoutMs: 60_000,\r\n })\r\n executions.push(\r\n runCommandHook({\r\n command: hook.command,\r\n stdinJson: hookInput,\r\n cwd: projectDir,\r\n env: {\r\n CLAUDE_PROJECT_DIR: projectDir,\r\n ...(hook.pluginRoot ? { CLAUDE_PLUGIN_ROOT: hook.pluginRoot } : {}),\r\n },\r\n signal,\r\n })\r\n .then(result => ({ hook, result }))\r\n .finally(cleanup),\r\n )\r\n }\r\n }\r\n\r\n const settled = await Promise.allSettled(executions)\r\n for (const item of settled) {\r\n if (item.status === 'rejected') {\r\n logError(item.reason)\r\n warnings.push(`Hook failed to run: ${String(item.reason ?? '')}`)\r\n continue\r\n }\r\n\r\n const { result } = item.value\r\n if (result.exitCode !== 0) {\r\n warnings.push(coerceHookMessage(result.stdout, result.stderr))\r\n continue\r\n }\r\n\r\n const json = tryParseHookJson(result.stdout)\r\n if (!json) continue\r\n\r\n if (typeof json.systemMessage === 'string' && json.systemMessage.trim()) {\r\n systemMessages.push(json.systemMessage.trim())\r\n }\r\n\r\n const additional =\r\n json.hookSpecificOutput &&\r\n typeof json.hookSpecificOutput === 'object' &&\r\n typeof json.hookSpecificOutput.additionalContext === 'string'\r\n ? String(json.hookSpecificOutput.additionalContext)\r\n : null\r\n if (additional && additional.trim()) {\r\n additionalContexts.push(additional.trim())\r\n }\r\n }\r\n\r\n return { warnings, systemMessages, additionalContexts }\r\n}\r\n\r\nexport type StopHookOutcome =\r\n | {\r\n decision: 'approve'\r\n warnings: string[]\r\n systemMessages: string[]\r\n additionalContexts: string[]\r\n }\r\n | {\r\n decision: 'block'\r\n message: string\r\n warnings: string[]\r\n systemMessages: string[]\r\n additionalContexts: string[]\r\n }\r\n\r\nexport async function runStopHooks(args: {\r\n hookEvent: 'Stop' | 'SubagentStop'\r\n reason?: string\r\n agentId?: string\r\n permissionMode?: unknown\r\n cwd?: string\r\n transcriptPath?: string\r\n safeMode?: boolean\r\n stopHookActive?: boolean\r\n signal?: AbortSignal\r\n}): Promise<StopHookOutcome> {\r\n const projectDir = args.cwd ?? getCwd()\r\n const matchers = [\r\n ...loadSettingsMatchers(projectDir, args.hookEvent),\r\n ...loadPluginMatchers(projectDir, args.hookEvent),\r\n ]\r\n if (matchers.length === 0) {\r\n return {\r\n decision: 'approve',\r\n warnings: [],\r\n systemMessages: [],\r\n additionalContexts: [],\r\n }\r\n }\r\n\r\n const applicable = matchers.filter(m => matcherMatchesTool(m.matcher, '*'))\r\n if (applicable.length === 0) {\r\n return {\r\n decision: 'approve',\r\n warnings: [],\r\n systemMessages: [],\r\n additionalContexts: [],\r\n }\r\n }\r\n\r\n const hookInput: Record<string, unknown> = {\r\n session_id: getKodeAgentSessionId(),\r\n transcript_path: args.transcriptPath,\r\n cwd: projectDir,\r\n hook_event_name: args.hookEvent,\r\n permission_mode: coerceHookPermissionMode(args.permissionMode),\r\n reason: args.reason,\r\n stop_hook_active: args.stopHookActive === true,\r\n ...(args.hookEvent === 'SubagentStop'\r\n ? { agent_id: args.agentId, agent_transcript_path: args.transcriptPath }\r\n : {}),\r\n }\r\n\r\n const warnings: string[] = []\r\n const systemMessages: string[] = []\r\n const additionalContexts: string[] = []\r\n\r\n const executions: Array<\r\n Promise<{\r\n hook: Hook\r\n result: { exitCode: number; stdout: string; stderr: string }\r\n }>\r\n > = []\r\n\r\n for (const entry of applicable) {\r\n for (const hook of entry.hooks) {\r\n if (hook.type === 'prompt') {\r\n executions.push(\r\n runPromptHook({\r\n hook,\r\n hookEvent: args.hookEvent,\r\n hookInput,\r\n safeMode: args.safeMode ?? false,\r\n parentSignal: args.signal,\r\n fallbackTimeoutMs: 30_000,\r\n }).then(result => ({ hook, result })),\r\n )\r\n continue\r\n }\r\n\r\n const { signal, cleanup } = withHookTimeout({\r\n timeoutSeconds: hook.timeout,\r\n parentSignal: args.signal,\r\n fallbackTimeoutMs: 60_000,\r\n })\r\n executions.push(\r\n runCommandHook({\r\n command: hook.command,\r\n stdinJson: hookInput,\r\n cwd: projectDir,\r\n env: {\r\n CLAUDE_PROJECT_DIR: projectDir,\r\n ...(hook.pluginRoot ? { CLAUDE_PLUGIN_ROOT: hook.pluginRoot } : {}),\r\n },\r\n signal,\r\n })\r\n .then(result => ({ hook, result }))\r\n .finally(cleanup),\r\n )\r\n }\r\n }\r\n\r\n const settled = await Promise.allSettled(executions)\r\n for (const item of settled) {\r\n if (item.status === 'rejected') {\r\n logError(item.reason)\r\n warnings.push(`Hook failed to run: ${String(item.reason ?? '')}`)\r\n continue\r\n }\r\n\r\n const { result } = item.value\r\n\r\n if (result.exitCode === 2) {\r\n return {\r\n decision: 'block',\r\n message: coerceHookMessage(result.stdout, result.stderr),\r\n warnings,\r\n systemMessages,\r\n additionalContexts,\r\n }\r\n }\r\n\r\n if (result.exitCode !== 0) {\r\n warnings.push(coerceHookMessage(result.stdout, result.stderr))\r\n continue\r\n }\r\n\r\n const json = tryParseHookJson(result.stdout)\r\n if (!json) continue\r\n\r\n if (typeof json.systemMessage === 'string' && json.systemMessage.trim()) {\r\n systemMessages.push(json.systemMessage.trim())\r\n }\r\n\r\n const additional =\r\n json.hookSpecificOutput &&\r\n typeof json.hookSpecificOutput === 'object' &&\r\n typeof json.hookSpecificOutput.additionalContext === 'string'\r\n ? String(json.hookSpecificOutput.additionalContext)\r\n : null\r\n if (additional && additional.trim()) {\r\n additionalContexts.push(additional.trim())\r\n }\r\n\r\n const stopDecision = normalizeStopDecision(json.decision)\r\n if (stopDecision === 'block') {\r\n const reason =\r\n typeof json.reason === 'string' && json.reason.trim()\r\n ? json.reason.trim()\r\n : null\r\n const msg =\r\n reason ||\r\n (systemMessages.length > 0\r\n ? systemMessages.join('\\n\\n')\r\n : coerceHookMessage(result.stdout, result.stderr))\r\n return {\r\n decision: 'block',\r\n message: msg,\r\n warnings,\r\n systemMessages,\r\n additionalContexts,\r\n }\r\n }\r\n }\r\n\r\n return { decision: 'approve', warnings, systemMessages, additionalContexts }\r\n}\r\n\r\nexport type UserPromptHookOutcome =\r\n | {\r\n decision: 'allow'\r\n warnings: string[]\r\n systemMessages: string[]\r\n additionalContexts: string[]\r\n }\r\n | {\r\n decision: 'block'\r\n message: string\r\n warnings: string[]\r\n systemMessages: string[]\r\n additionalContexts: string[]\r\n }\r\n\r\nexport async function runUserPromptSubmitHooks(args: {\r\n prompt: string\r\n permissionMode?: unknown\r\n cwd?: string\r\n transcriptPath?: string\r\n safeMode?: boolean\r\n signal?: AbortSignal\r\n}): Promise<UserPromptHookOutcome> {\r\n const projectDir = args.cwd ?? getCwd()\r\n const matchers = [\r\n ...loadSettingsMatchers(projectDir, 'UserPromptSubmit'),\r\n ...loadPluginMatchers(projectDir, 'UserPromptSubmit'),\r\n ]\r\n if (matchers.length === 0) {\r\n return {\r\n decision: 'allow',\r\n warnings: [],\r\n systemMessages: [],\r\n additionalContexts: [],\r\n }\r\n }\r\n\r\n const applicable = matchers.filter(m => matcherMatchesTool(m.matcher, '*'))\r\n if (applicable.length === 0) {\r\n return {\r\n decision: 'allow',\r\n warnings: [],\r\n systemMessages: [],\r\n additionalContexts: [],\r\n }\r\n }\r\n\r\n const hookInput: Record<string, unknown> = {\r\n session_id: getKodeAgentSessionId(),\r\n transcript_path: args.transcriptPath,\r\n cwd: projectDir,\r\n hook_event_name: 'UserPromptSubmit',\r\n permission_mode: coerceHookPermissionMode(args.permissionMode),\r\n user_prompt: args.prompt,\r\n prompt: args.prompt,\r\n }\r\n\r\n const warnings: string[] = []\r\n const systemMessages: string[] = []\r\n const additionalContexts: string[] = []\r\n\r\n const executions: Array<\r\n Promise<{\r\n hook: Hook\r\n result: { exitCode: number; stdout: string; stderr: string }\r\n }>\r\n > = []\r\n\r\n for (const entry of applicable) {\r\n for (const hook of entry.hooks) {\r\n if (hook.type === 'prompt') {\r\n executions.push(\r\n runPromptHook({\r\n hook,\r\n hookEvent: 'UserPromptSubmit',\r\n hookInput,\r\n safeMode: args.safeMode ?? false,\r\n parentSignal: args.signal,\r\n fallbackTimeoutMs: 30_000,\r\n }).then(result => ({ hook, result })),\r\n )\r\n continue\r\n }\r\n\r\n const { signal, cleanup } = withHookTimeout({\r\n timeoutSeconds: hook.timeout,\r\n parentSignal: args.signal,\r\n fallbackTimeoutMs: 60_000,\r\n })\r\n executions.push(\r\n runCommandHook({\r\n command: hook.command,\r\n stdinJson: hookInput,\r\n cwd: projectDir,\r\n env: {\r\n CLAUDE_PROJECT_DIR: projectDir,\r\n ...(hook.pluginRoot ? { CLAUDE_PLUGIN_ROOT: hook.pluginRoot } : {}),\r\n },\r\n signal,\r\n })\r\n .then(result => ({ hook, result }))\r\n .finally(cleanup),\r\n )\r\n }\r\n }\r\n\r\n const settled = await Promise.allSettled(executions)\r\n for (const item of settled) {\r\n if (item.status === 'rejected') {\r\n logError(item.reason)\r\n warnings.push(`Hook failed to run: ${String(item.reason ?? '')}`)\r\n continue\r\n }\r\n\r\n const { result } = item.value\r\n\r\n if (result.exitCode === 2) {\r\n return {\r\n decision: 'block',\r\n message: coerceHookMessage(result.stdout, result.stderr),\r\n warnings,\r\n systemMessages,\r\n additionalContexts,\r\n }\r\n }\r\n\r\n if (result.exitCode !== 0) {\r\n warnings.push(coerceHookMessage(result.stdout, result.stderr))\r\n continue\r\n }\r\n\r\n const json = tryParseHookJson(result.stdout)\r\n if (!json) continue\r\n\r\n if (typeof json.systemMessage === 'string' && json.systemMessage.trim()) {\r\n systemMessages.push(json.systemMessage.trim())\r\n }\r\n\r\n const additional =\r\n json.hookSpecificOutput &&\r\n typeof json.hookSpecificOutput === 'object' &&\r\n typeof json.hookSpecificOutput.additionalContext === 'string'\r\n ? String(json.hookSpecificOutput.additionalContext)\r\n : null\r\n if (additional && additional.trim()) {\r\n additionalContexts.push(additional.trim())\r\n }\r\n\r\n const stopDecision = normalizeStopDecision(json.decision)\r\n if (stopDecision === 'block') {\r\n const reason =\r\n typeof json.reason === 'string' && json.reason.trim()\r\n ? json.reason.trim()\r\n : null\r\n const msg =\r\n reason ||\r\n (systemMessages.length > 0\r\n ? systemMessages.join('\\n\\n')\r\n : coerceHookMessage(result.stdout, result.stderr))\r\n return {\r\n decision: 'block',\r\n message: msg,\r\n warnings,\r\n systemMessages,\r\n additionalContexts,\r\n }\r\n }\r\n }\r\n\r\n return { decision: 'allow', warnings, systemMessages, additionalContexts }\r\n}\r\n\r\nexport async function runSessionEndHooks(args: {\r\n reason: string\r\n permissionMode?: unknown\r\n cwd?: string\r\n transcriptPath?: string\r\n safeMode?: boolean\r\n signal?: AbortSignal\r\n}): Promise<{ warnings: string[]; systemMessages: string[] }> {\r\n const projectDir = args.cwd ?? getCwd()\r\n const matchers = [\r\n ...loadSettingsMatchers(projectDir, 'SessionEnd'),\r\n ...loadPluginMatchers(projectDir, 'SessionEnd'),\r\n ]\r\n if (matchers.length === 0) return { warnings: [], systemMessages: [] }\r\n\r\n const applicable = matchers.filter(m => matcherMatchesTool(m.matcher, '*'))\r\n if (applicable.length === 0) return { warnings: [], systemMessages: [] }\r\n\r\n const hookInput: Record<string, unknown> = {\r\n session_id: getKodeAgentSessionId(),\r\n transcript_path: args.transcriptPath,\r\n cwd: projectDir,\r\n hook_event_name: 'SessionEnd',\r\n permission_mode: coerceHookPermissionMode(args.permissionMode),\r\n reason: args.reason,\r\n }\r\n\r\n const warnings: string[] = []\r\n const systemMessages: string[] = []\r\n\r\n const executions: Array<\r\n Promise<{\r\n hook: Hook\r\n result: { exitCode: number; stdout: string; stderr: string }\r\n }>\r\n > = []\r\n\r\n for (const entry of applicable) {\r\n for (const hook of entry.hooks) {\r\n if (hook.type === 'prompt') {\r\n executions.push(\r\n runPromptHook({\r\n hook,\r\n hookEvent: 'SessionEnd',\r\n hookInput,\r\n safeMode: args.safeMode ?? false,\r\n parentSignal: args.signal,\r\n fallbackTimeoutMs: 30_000,\r\n }).then(result => ({ hook, result })),\r\n )\r\n continue\r\n }\r\n\r\n const { signal, cleanup } = withHookTimeout({\r\n timeoutSeconds: hook.timeout,\r\n parentSignal: args.signal,\r\n fallbackTimeoutMs: 60_000,\r\n })\r\n executions.push(\r\n runCommandHook({\r\n command: hook.command,\r\n stdinJson: hookInput,\r\n cwd: projectDir,\r\n env: {\r\n CLAUDE_PROJECT_DIR: projectDir,\r\n ...(hook.pluginRoot ? { CLAUDE_PLUGIN_ROOT: hook.pluginRoot } : {}),\r\n },\r\n signal,\r\n })\r\n .then(result => ({ hook, result }))\r\n .finally(cleanup),\r\n )\r\n }\r\n }\r\n\r\n const settled = await Promise.allSettled(executions)\r\n for (const item of settled) {\r\n if (item.status === 'rejected') {\r\n logError(item.reason)\r\n warnings.push(`Hook failed to run: ${String(item.reason ?? '')}`)\r\n continue\r\n }\r\n\r\n const { result } = item.value\r\n if (result.exitCode !== 0) {\r\n warnings.push(coerceHookMessage(result.stdout, result.stderr))\r\n continue\r\n }\r\n\r\n const json = tryParseHookJson(result.stdout)\r\n if (!json) continue\r\n if (typeof json.systemMessage === 'string' && json.systemMessage.trim()) {\r\n systemMessages.push(json.systemMessage.trim())\r\n }\r\n }\r\n\r\n return { warnings, systemMessages }\r\n}\r\n\r\nexport function __resetKodeHooksCacheForTests(): void {\r\n cache.clear()\r\n pluginHooksCache.clear()\r\n sessionStartCache.clear()\r\n}\r\n"],
5
+ "mappings": "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",
6
+ "names": ["content", "parts"]
7
+ }