@code-yeongyu/senpi 2026.7.29-6 → 2026.7.30

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 (74) hide show
  1. package/CHANGELOG.md +29 -0
  2. package/dist/bun-global-launcher.d.ts +7 -0
  3. package/dist/bun-global-launcher.d.ts.map +1 -0
  4. package/dist/bun-global-launcher.js +21 -0
  5. package/dist/bun-global-launcher.js.map +1 -0
  6. package/dist/config.d.ts.map +1 -1
  7. package/dist/config.js +18 -6
  8. package/dist/config.js.map +1 -1
  9. package/dist/core/agent-session.d.ts +3 -0
  10. package/dist/core/agent-session.d.ts.map +1 -1
  11. package/dist/core/agent-session.js +31 -0
  12. package/dist/core/agent-session.js.map +1 -1
  13. package/dist/core/extensions/builtin/btw/index.d.ts.map +1 -1
  14. package/dist/core/extensions/builtin/btw/index.js +1 -0
  15. package/dist/core/extensions/builtin/btw/index.js.map +1 -1
  16. package/dist/core/extensions/builtin/claude-agent-sdk/auth-lane.d.ts.map +1 -1
  17. package/dist/core/extensions/builtin/claude-agent-sdk/auth-lane.js +10 -1
  18. package/dist/core/extensions/builtin/claude-agent-sdk/auth-lane.js.map +1 -1
  19. package/dist/core/extensions/builtin/claude-agent-sdk/errors.d.ts.map +1 -1
  20. package/dist/core/extensions/builtin/claude-agent-sdk/errors.js +14 -0
  21. package/dist/core/extensions/builtin/claude-agent-sdk/errors.js.map +1 -1
  22. package/dist/core/extensions/builtin/claude-agent-sdk/options.d.ts.map +1 -1
  23. package/dist/core/extensions/builtin/claude-agent-sdk/options.js +2 -1
  24. package/dist/core/extensions/builtin/claude-agent-sdk/options.js.map +1 -1
  25. package/dist/core/extensions/builtin/claude-agent-sdk/tools.d.ts +3 -0
  26. package/dist/core/extensions/builtin/claude-agent-sdk/tools.d.ts.map +1 -1
  27. package/dist/core/extensions/builtin/claude-agent-sdk/tools.js +19 -0
  28. package/dist/core/extensions/builtin/claude-agent-sdk/tools.js.map +1 -1
  29. package/dist/core/extensions/builtin/config-reload/watch-engine.d.ts +1 -2
  30. package/dist/core/extensions/builtin/config-reload/watch-engine.d.ts.map +1 -1
  31. package/dist/core/extensions/builtin/config-reload/watch-engine.js +1 -8
  32. package/dist/core/extensions/builtin/config-reload/watch-engine.js.map +1 -1
  33. package/dist/core/extensions/builtin/config-reload/watch-event-source.d.ts +15 -0
  34. package/dist/core/extensions/builtin/config-reload/watch-event-source.d.ts.map +1 -0
  35. package/dist/core/extensions/builtin/config-reload/watch-event-source.js +114 -0
  36. package/dist/core/extensions/builtin/config-reload/watch-event-source.js.map +1 -0
  37. package/dist/core/extensions/builtin/goal/prompt.d.ts.map +1 -1
  38. package/dist/core/extensions/builtin/goal/prompt.js +2 -1
  39. package/dist/core/extensions/builtin/goal/prompt.js.map +1 -1
  40. package/dist/core/extensions/builtin/goal/tool-registration.js +1 -1
  41. package/dist/core/extensions/builtin/goal/tool-registration.js.map +1 -1
  42. package/dist/core/extensions/builtin/rules/rules/project-root.d.ts.map +1 -1
  43. package/dist/core/extensions/builtin/rules/rules/project-root.js +8 -1
  44. package/dist/core/extensions/builtin/rules/rules/project-root.js.map +1 -1
  45. package/dist/core/extensions/builtin/service-tier.d.ts.map +1 -1
  46. package/dist/core/extensions/builtin/service-tier.js +20 -1
  47. package/dist/core/extensions/builtin/service-tier.js.map +1 -1
  48. package/dist/core/extensions/builtin/todotools/normalize.d.ts.map +1 -1
  49. package/dist/core/extensions/builtin/todotools/normalize.js +14 -3
  50. package/dist/core/extensions/builtin/todotools/normalize.js.map +1 -1
  51. package/dist/core/resolve-config-value.d.ts.map +1 -1
  52. package/dist/core/resolve-config-value.js +23 -1
  53. package/dist/core/resolve-config-value.js.map +1 -1
  54. package/dist/core/session-log.d.ts +12 -0
  55. package/dist/core/session-log.d.ts.map +1 -0
  56. package/dist/core/session-log.js +101 -0
  57. package/dist/core/session-log.js.map +1 -0
  58. package/dist/modes/interactive/compaction-queue-transfer.d.ts +6 -0
  59. package/dist/modes/interactive/compaction-queue-transfer.d.ts.map +1 -1
  60. package/dist/modes/interactive/compaction-queue-transfer.js +1 -1
  61. package/dist/modes/interactive/compaction-queue-transfer.js.map +1 -1
  62. package/dist/modes/interactive/interactive-mode.d.ts +2 -0
  63. package/dist/modes/interactive/interactive-mode.d.ts.map +1 -1
  64. package/dist/modes/interactive/interactive-mode.js +24 -7
  65. package/dist/modes/interactive/interactive-mode.js.map +1 -1
  66. package/node_modules/@code-yeongyu/senpi-codemode/CHANGELOG.md +12 -0
  67. package/node_modules/@code-yeongyu/senpi-codemode/package.json +3 -3
  68. package/node_modules/@earendil-works/pi-agent-core/package.json +2 -2
  69. package/node_modules/@earendil-works/pi-ai/dist/providers/data/.manifest.json +1 -1
  70. package/node_modules/@earendil-works/pi-ai/dist/providers/data/openrouter.json +1 -1
  71. package/node_modules/@earendil-works/pi-ai/package.json +1 -1
  72. package/node_modules/@earendil-works/pi-pty/package.json +1 -1
  73. package/node_modules/@earendil-works/pi-tui/package.json +1 -1
  74. package/package.json +6 -6
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../../src/core/extensions/builtin/btw/index.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,YAAY,EAAoB,MAAM,gBAAgB,CAAC;AAcrE,MAAM,CAAC,OAAO,UAAU,YAAY,CAAC,EAAE,EAAE,YAAY,QAmHpD"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../../src/core/extensions/builtin/btw/index.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,YAAY,EAAoB,MAAM,gBAAgB,CAAC;AAcrE,MAAM,CAAC,OAAO,UAAU,YAAY,CAAC,EAAE,EAAE,YAAY,QAqHpD"}
@@ -81,6 +81,7 @@ export default function btwExtension(pi) {
81
81
  auth: { apiKey: auth.apiKey, headers: auth.headers, extraBody: auth.extraBody },
82
82
  sessionId,
83
83
  thinkingLevel: thinkingLevel === "off" ? undefined : thinkingLevel,
84
+ streamFn: (streamModel, streamContext, options) => ctx.modelRegistry.modelRuntime.streamSimple(streamModel, streamContext, options),
84
85
  }, context, {
85
86
  signal: controller.signal,
86
87
  onTextDelta: (delta) => {
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../../src/core/extensions/builtin/btw/index.ts"],"names":[],"mappings":"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","sourcesContent":["import { convertToLlm, filterContextExcludedMessages } from \"../../../messages.ts\";\nimport { buildSessionContext } from \"../../../session-manager.ts\";\nimport type { ExtensionAPI, ExtensionContext } from \"../../types.ts\";\nimport { BtwPanel } from \"./panel.ts\";\nimport { buildSideQueryContext, runSideQuery } from \"./side-query.ts\";\n\nconst WIDGET_KEY = \"btw\";\nconst ESCAPE = \"\u001b\";\n\ninterface ActiveBtw {\n\tcontroller: AbortController;\n\tpanel: BtwPanel | undefined;\n\tunsubscribeEscape: (() => void) | undefined;\n\tsettled: boolean;\n}\n\nexport default function btwExtension(pi: ExtensionAPI) {\n\tlet active: ActiveBtw | undefined;\n\n\tfunction dismiss(ctx: ExtensionContext, options: { abort: boolean }): void {\n\t\tconst current = active;\n\t\tif (!current) return;\n\t\tactive = undefined;\n\t\tif (options.abort) current.controller.abort();\n\t\tcurrent.unsubscribeEscape?.();\n\t\tif (current.panel) ctx.ui.setWidget(WIDGET_KEY, undefined);\n\t}\n\n\tpi.on(\"session_before_switch\", (_event, ctx) => {\n\t\tdismiss(ctx, { abort: true });\n\t});\n\n\tpi.on(\"session_before_fork\", (_event, ctx) => {\n\t\tdismiss(ctx, { abort: true });\n\t});\n\n\tpi.on(\"session_shutdown\", (_event, ctx) => {\n\t\tdismiss(ctx, { abort: true });\n\t});\n\n\tpi.on(\"input\", (_event, ctx) => {\n\t\tif (active?.settled) dismiss(ctx, { abort: false });\n\t});\n\n\tpi.registerCommand(\"btw\", {\n\t\tdescription: \"Ask a side question in parallel without touching the main session\",\n\t\targumentHint: \"<question>\",\n\t\thandler: async (args, ctx) => {\n\t\t\tconst question = args.trim();\n\t\t\tif (!question) {\n\t\t\t\tctx.ui.notify(\"Usage: /btw <question>\", \"warning\");\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tconst model = ctx.model;\n\t\t\tif (!model) {\n\t\t\t\tctx.ui.notify(\"No active model available for /btw.\", \"error\");\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tconst snapshot = buildSessionContext(ctx.sessionManager.getEntries(), ctx.sessionManager.getLeafId());\n\t\t\tconst history = convertToLlm(filterContextExcludedMessages(snapshot.messages));\n\t\t\tconst systemPrompt = ctx.getSystemPrompt();\n\t\t\tconst thinkingLevel = pi.getThinkingLevel();\n\t\t\tconst sessionId = ctx.sessionManager.getSessionId();\n\t\t\tconst context = buildSideQueryContext({ systemPrompt, history, question });\n\n\t\t\tdismiss(ctx, { abort: true });\n\t\t\tconst controller = new AbortController();\n\t\t\tconst entry: ActiveBtw = { controller, panel: undefined, unsubscribeEscape: undefined, settled: false };\n\t\t\tactive = entry;\n\n\t\t\tif (ctx.mode === \"tui\" && ctx.hasUI) {\n\t\t\t\tctx.ui.setWidget(WIDGET_KEY, (tui, theme) => {\n\t\t\t\t\tconst panel = new BtwPanel(question, tui, theme);\n\t\t\t\t\tentry.panel = panel;\n\t\t\t\t\treturn panel.component;\n\t\t\t\t});\n\t\t\t\tentry.unsubscribeEscape = ctx.ui.onTerminalInput((data) => {\n\t\t\t\t\tif (active !== entry || data !== ESCAPE) return undefined;\n\t\t\t\t\tdismiss(ctx, { abort: true });\n\t\t\t\t\treturn undefined;\n\t\t\t\t});\n\t\t\t}\n\n\t\t\tconst auth = await ctx.modelRegistry.getApiKeyAndHeaders(model);\n\t\t\tif (!auth.ok) {\n\t\t\t\tif (active !== entry) return;\n\t\t\t\tdismiss(ctx, { abort: false });\n\t\t\t\tctx.ui.notify(`/btw: ${auth.error}`, \"error\");\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\ttry {\n\t\t\t\tconst { replyText } = await runSideQuery(\n\t\t\t\t\t{\n\t\t\t\t\t\tmodel,\n\t\t\t\t\t\tauth: { apiKey: auth.apiKey, headers: auth.headers, extraBody: auth.extraBody },\n\t\t\t\t\t\tsessionId,\n\t\t\t\t\t\tthinkingLevel: thinkingLevel === \"off\" ? undefined : thinkingLevel,\n\t\t\t\t\t},\n\t\t\t\t\tcontext,\n\t\t\t\t\t{\n\t\t\t\t\t\tsignal: controller.signal,\n\t\t\t\t\t\tonTextDelta: (delta) => {\n\t\t\t\t\t\t\tif (active === entry) entry.panel?.appendText(delta);\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t);\n\t\t\t\tif (active !== entry) return;\n\t\t\t\tentry.settled = true;\n\t\t\t\tif (entry.panel) {\n\t\t\t\t\tentry.panel.markDone();\n\t\t\t\t} else {\n\t\t\t\t\tctx.ui.notify(replyText, \"info\");\n\t\t\t\t}\n\t\t\t} catch (error) {\n\t\t\t\tif (active !== entry) return;\n\t\t\t\tentry.settled = true;\n\t\t\t\tconst message = error instanceof Error ? error.message : String(error);\n\t\t\t\tif (controller.signal.aborted) {\n\t\t\t\t\tentry.panel?.markAborted();\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t\tif (entry.panel) {\n\t\t\t\t\tentry.panel.markError(message);\n\t\t\t\t} else {\n\t\t\t\t\tctx.ui.notify(`/btw failed: ${message}`, \"error\");\n\t\t\t\t}\n\t\t\t}\n\t\t},\n\t});\n}\n"]}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../../src/core/extensions/builtin/btw/index.ts"],"names":[],"mappings":"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","sourcesContent":["import { convertToLlm, filterContextExcludedMessages } from \"../../../messages.ts\";\nimport { buildSessionContext } from \"../../../session-manager.ts\";\nimport type { ExtensionAPI, ExtensionContext } from \"../../types.ts\";\nimport { BtwPanel } from \"./panel.ts\";\nimport { buildSideQueryContext, runSideQuery } from \"./side-query.ts\";\n\nconst WIDGET_KEY = \"btw\";\nconst ESCAPE = \"\u001b\";\n\ninterface ActiveBtw {\n\tcontroller: AbortController;\n\tpanel: BtwPanel | undefined;\n\tunsubscribeEscape: (() => void) | undefined;\n\tsettled: boolean;\n}\n\nexport default function btwExtension(pi: ExtensionAPI) {\n\tlet active: ActiveBtw | undefined;\n\n\tfunction dismiss(ctx: ExtensionContext, options: { abort: boolean }): void {\n\t\tconst current = active;\n\t\tif (!current) return;\n\t\tactive = undefined;\n\t\tif (options.abort) current.controller.abort();\n\t\tcurrent.unsubscribeEscape?.();\n\t\tif (current.panel) ctx.ui.setWidget(WIDGET_KEY, undefined);\n\t}\n\n\tpi.on(\"session_before_switch\", (_event, ctx) => {\n\t\tdismiss(ctx, { abort: true });\n\t});\n\n\tpi.on(\"session_before_fork\", (_event, ctx) => {\n\t\tdismiss(ctx, { abort: true });\n\t});\n\n\tpi.on(\"session_shutdown\", (_event, ctx) => {\n\t\tdismiss(ctx, { abort: true });\n\t});\n\n\tpi.on(\"input\", (_event, ctx) => {\n\t\tif (active?.settled) dismiss(ctx, { abort: false });\n\t});\n\n\tpi.registerCommand(\"btw\", {\n\t\tdescription: \"Ask a side question in parallel without touching the main session\",\n\t\targumentHint: \"<question>\",\n\t\thandler: async (args, ctx) => {\n\t\t\tconst question = args.trim();\n\t\t\tif (!question) {\n\t\t\t\tctx.ui.notify(\"Usage: /btw <question>\", \"warning\");\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tconst model = ctx.model;\n\t\t\tif (!model) {\n\t\t\t\tctx.ui.notify(\"No active model available for /btw.\", \"error\");\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tconst snapshot = buildSessionContext(ctx.sessionManager.getEntries(), ctx.sessionManager.getLeafId());\n\t\t\tconst history = convertToLlm(filterContextExcludedMessages(snapshot.messages));\n\t\t\tconst systemPrompt = ctx.getSystemPrompt();\n\t\t\tconst thinkingLevel = pi.getThinkingLevel();\n\t\t\tconst sessionId = ctx.sessionManager.getSessionId();\n\t\t\tconst context = buildSideQueryContext({ systemPrompt, history, question });\n\n\t\t\tdismiss(ctx, { abort: true });\n\t\t\tconst controller = new AbortController();\n\t\t\tconst entry: ActiveBtw = { controller, panel: undefined, unsubscribeEscape: undefined, settled: false };\n\t\t\tactive = entry;\n\n\t\t\tif (ctx.mode === \"tui\" && ctx.hasUI) {\n\t\t\t\tctx.ui.setWidget(WIDGET_KEY, (tui, theme) => {\n\t\t\t\t\tconst panel = new BtwPanel(question, tui, theme);\n\t\t\t\t\tentry.panel = panel;\n\t\t\t\t\treturn panel.component;\n\t\t\t\t});\n\t\t\t\tentry.unsubscribeEscape = ctx.ui.onTerminalInput((data) => {\n\t\t\t\t\tif (active !== entry || data !== ESCAPE) return undefined;\n\t\t\t\t\tdismiss(ctx, { abort: true });\n\t\t\t\t\treturn undefined;\n\t\t\t\t});\n\t\t\t}\n\n\t\t\tconst auth = await ctx.modelRegistry.getApiKeyAndHeaders(model);\n\t\t\tif (!auth.ok) {\n\t\t\t\tif (active !== entry) return;\n\t\t\t\tdismiss(ctx, { abort: false });\n\t\t\t\tctx.ui.notify(`/btw: ${auth.error}`, \"error\");\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\ttry {\n\t\t\t\tconst { replyText } = await runSideQuery(\n\t\t\t\t\t{\n\t\t\t\t\t\tmodel,\n\t\t\t\t\t\tauth: { apiKey: auth.apiKey, headers: auth.headers, extraBody: auth.extraBody },\n\t\t\t\t\t\tsessionId,\n\t\t\t\t\t\tthinkingLevel: thinkingLevel === \"off\" ? undefined : thinkingLevel,\n\t\t\t\t\t\tstreamFn: (streamModel, streamContext, options) =>\n\t\t\t\t\t\t\tctx.modelRegistry.modelRuntime.streamSimple(streamModel, streamContext, options),\n\t\t\t\t\t},\n\t\t\t\t\tcontext,\n\t\t\t\t\t{\n\t\t\t\t\t\tsignal: controller.signal,\n\t\t\t\t\t\tonTextDelta: (delta) => {\n\t\t\t\t\t\t\tif (active === entry) entry.panel?.appendText(delta);\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t);\n\t\t\t\tif (active !== entry) return;\n\t\t\t\tentry.settled = true;\n\t\t\t\tif (entry.panel) {\n\t\t\t\t\tentry.panel.markDone();\n\t\t\t\t} else {\n\t\t\t\t\tctx.ui.notify(replyText, \"info\");\n\t\t\t\t}\n\t\t\t} catch (error) {\n\t\t\t\tif (active !== entry) return;\n\t\t\t\tentry.settled = true;\n\t\t\t\tconst message = error instanceof Error ? error.message : String(error);\n\t\t\t\tif (controller.signal.aborted) {\n\t\t\t\t\tentry.panel?.markAborted();\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t\tif (entry.panel) {\n\t\t\t\t\tentry.panel.markError(message);\n\t\t\t\t} else {\n\t\t\t\t\tctx.ui.notify(`/btw failed: ${message}`, \"error\");\n\t\t\t\t}\n\t\t\t}\n\t\t},\n\t});\n}\n"]}
@@ -1 +1 @@
1
- {"version":3,"file":"auth-lane.d.ts","sourceRoot":"","sources":["../../../../../src/core/extensions/builtin/claude-agent-sdk/auth-lane.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,uBAAuB,CAAC;AAM7D,OAAO,EAQN,KAAK,aAAa,EAClB,MAAM,eAAe,CAAC;AAIvB,OAAO,KAAK,EAAE,OAAO,EAAE,UAAU,EAAE,QAAQ,EAAE,MAAM,mBAAmB,CAAC;AACvE,OAAO,KAAK,EAAE,8BAA8B,EAAE,4BAA4B,EAAE,MAAM,eAAe,CAAC;AAElG,OAAO,EAAE,4BAA4B,EAAE,MAAM,yBAAyB,CAAC;AAYvE,KAAK,gBAAgB,GAAG;IACvB,WAAW,EAAE,MAAM,eAAe,CAAC;IACnC,GAAG,EAAE,MAAM,MAAM,CAAC,UAAU,CAAC;IAC7B,WAAW,EAAE,MAAM,MAAM,CAAC;IAC1B,GAAG,EAAE,MAAM,MAAM,CAAC;IAClB,SAAS,EAAE,aAAa,CAAC;CACzB,CAAC;AAiBF,wBAAgB,wBAAwB,CAAC,QAAQ,EAAE,OAAO,CAAC,gBAAgB,CAAC,GAAG,IAAI,CAElF;AAED,wBAAgB,qBAAqB,IAAI,IAAI,CAE5C;AAED,MAAM,MAAM,uBAAuB,GAAG;IACrC,MAAM,EAAE,UAAU,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC;IAC1C,KAAK,EAAE,QAAQ,CAAC;IAChB,YAAY,EAAE,CAAC,IAAI,EAAE,4BAA4B,KAAK,OAAO,CAAC;IAC9D,gBAAgB,EAAE,8BAA8B,CAAC;IACjD,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,0FAA0F;IAC1F,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,OAAO,CAAC,EAAE,CAAC,KAAK,EAAE,UAAU,CAAC,QAAQ,CAAC,KAAK,IAAI,CAAC;CAChD,CAAC;AA8HF,2GAA2G;AAC3G,wBAAuB,iBAAiB,CAAC,KAAK,EAAE,uBAAuB,GAAG,cAAc,CAAC,UAAU,CAAC,CAyCnG"}
1
+ {"version":3,"file":"auth-lane.d.ts","sourceRoot":"","sources":["../../../../../src/core/extensions/builtin/claude-agent-sdk/auth-lane.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,uBAAuB,CAAC;AAM7D,OAAO,EAQN,KAAK,aAAa,EAClB,MAAM,eAAe,CAAC;AAIvB,OAAO,KAAK,EAAE,OAAO,EAAE,UAAU,EAAE,QAAQ,EAAE,MAAM,mBAAmB,CAAC;AACvE,OAAO,KAAK,EAAE,8BAA8B,EAAE,4BAA4B,EAAE,MAAM,eAAe,CAAC;AAElG,OAAO,EAAE,4BAA4B,EAAE,MAAM,yBAAyB,CAAC;AAYvE,KAAK,gBAAgB,GAAG;IACvB,WAAW,EAAE,MAAM,eAAe,CAAC;IACnC,GAAG,EAAE,MAAM,MAAM,CAAC,UAAU,CAAC;IAC7B,WAAW,EAAE,MAAM,MAAM,CAAC;IAC1B,GAAG,EAAE,MAAM,MAAM,CAAC;IAClB,SAAS,EAAE,aAAa,CAAC;CACzB,CAAC;AAiBF,wBAAgB,wBAAwB,CAAC,QAAQ,EAAE,OAAO,CAAC,gBAAgB,CAAC,GAAG,IAAI,CAElF;AAED,wBAAgB,qBAAqB,IAAI,IAAI,CAE5C;AAED,MAAM,MAAM,uBAAuB,GAAG;IACrC,MAAM,EAAE,UAAU,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC;IAC1C,KAAK,EAAE,QAAQ,CAAC;IAChB,YAAY,EAAE,CAAC,IAAI,EAAE,4BAA4B,KAAK,OAAO,CAAC;IAC9D,gBAAgB,EAAE,8BAA8B,CAAC;IACjD,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,0FAA0F;IAC1F,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,OAAO,CAAC,EAAE,CAAC,KAAK,EAAE,UAAU,CAAC,QAAQ,CAAC,KAAK,IAAI,CAAC;CAChD,CAAC;AAuIF,2GAA2G;AAC3G,wBAAuB,iBAAiB,CAAC,KAAK,EAAE,uBAAuB,GAAG,cAAc,CAAC,UAAU,CAAC,CAyCnG"}
@@ -111,7 +111,16 @@ function sdkFailure(message) {
111
111
  return message.error;
112
112
  if (message.type === "result" && message.subtype !== "success") {
113
113
  const errors = "errors" in message && Array.isArray(message.errors) ? message.errors : [];
114
- return new Error(errors.length > 0 ? String(errors[0]) : `Claude Code ${message.subtype}`);
114
+ if (errors.length > 0)
115
+ return new Error(String(errors[0]));
116
+ // `subtype` alone is too coarse to classify: a subscription limit and an
117
+ // ordinary tool failure both arrive as "error_during_execution". The SDK
118
+ // carries the real cause in `terminal_reason` (e.g. "blocking_limit"), so
119
+ // append it — otherwise classifySdkError() scores every result error as
120
+ // non-retryable "other", the exhausted account is never blocked, and a
121
+ // multi-account pool never rotates past it.
122
+ const reason = "terminal_reason" in message && typeof message.terminal_reason === "string" ? message.terminal_reason : "";
123
+ return new Error(reason ? `Claude Code ${message.subtype}: ${reason}` : `Claude Code ${message.subtype}`);
115
124
  }
116
125
  return undefined;
117
126
  }
@@ -1 +1 @@
1
- {"version":3,"file":"auth-lane.js","sourceRoot":"","sources":["../../../../../src/core/extensions/builtin/claude-agent-sdk/auth-lane.ts"],"names":[],"mappings":"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","sourcesContent":["import { chmodSync, mkdirSync, writeFileSync } from \"node:fs\";\nimport { join } from \"node:path\";\nimport type { CredentialStore } from \"@earendil-works/pi-ai\";\nimport { loadAnthropicOAuth } from \"@earendil-works/pi-ai/oauth\";\nimport { getAgentDir } from \"../../../../config.ts\";\nimport { AuthStorage } from \"../../../auth-storage.ts\";\nimport { emitProviderAccountFailover, emitProviderAccountsChanged } from \"./account-events.ts\";\nimport { CLAUDE_AGENT_SDK_PROVIDER_ID } from \"./account-management.ts\";\nimport {\n\ttype AccountSlot,\n\tassertValidAccountName,\n\ttype ClaudeAgentSdkCredential,\n\temptyCredential,\n\tenvSlotToken,\n\tlistAccounts,\n\trefreshSlot,\n\ttype SlotRefresher,\n} from \"./accounts.ts\";\nimport { selectAccount } from \"./affinity.ts\";\nimport { classifySdkError } from \"./errors.ts\";\nimport { runFailover } from \"./failover.ts\";\nimport type { Options, SDKMessage, SdkQuery } from \"./sdk-boundary.ts\";\nimport type { ClaudeAgentSdkProviderSettings, ClaudeAgentSdkTokenInjection } from \"./settings.ts\";\n\nexport { CLAUDE_AGENT_SDK_PROVIDER_ID } from \"./account-management.ts\";\n\nconst EXPIRING_WITHIN_MS = 5 * 60_000;\nconst CLI_OAUTH_SCOPES = [\n\t\"org:create_api_key\",\n\t\"user:profile\",\n\t\"user:inference\",\n\t\"user:sessions:claude_code\",\n\t\"user:mcp_servers\",\n\t\"user:file_upload\",\n] as const;\n\ntype AuthLaneBoundary = {\n\tcreateStore: () => CredentialStore;\n\tenv: () => NodeJS.ProcessEnv;\n\tgetAgentDir: () => string;\n\tnow: () => number;\n\trefresher: SlotRefresher;\n};\n\nasync function refreshWithAnthropicOAuth(refresh: string) {\n\tconst oauth = await loadAnthropicOAuth();\n\tconst credential = await oauth.refresh({ type: \"oauth\", access: \"\", refresh, expires: 0 });\n\treturn { access: credential.access, refresh: credential.refresh, expires: credential.expires };\n}\n\nconst defaultBoundary: AuthLaneBoundary = {\n\tcreateStore: () => AuthStorage.create(),\n\tenv: () => process.env,\n\tgetAgentDir,\n\tnow: () => Date.now(),\n\trefresher: refreshWithAnthropicOAuth,\n};\nlet activeBoundary = defaultBoundary;\n\nexport function overrideAuthLaneBoundary(override: Partial<AuthLaneBoundary>): void {\n\tactiveBoundary = { ...activeBoundary, ...override };\n}\n\nexport function resetAuthLaneBoundary(): void {\n\tactiveBoundary = defaultBoundary;\n}\n\nexport type AuthenticatedQueryInput = {\n\tprompt: Parameters<SdkQuery>[0][\"prompt\"];\n\tquery: SdkQuery;\n\tbuildOptions: (lane: ClaudeAgentSdkTokenInjection) => Options;\n\tproviderSettings: ClaudeAgentSdkProviderSettings;\n\tsessionId?: string;\n\t/** Request-scoped CLI pin; takes precedence over persistent settings and account pins. */\n\tpinnedAccount?: string;\n\tonQuery?: (query: ReturnType<SdkQuery>) => void;\n};\n\ntype ManagedPool = {\n\taccounts: AccountSlot[];\n\tlane: Exclude<ClaudeAgentSdkTokenInjection, \"ambient\">;\n\tpinnedAccount?: string;\n\tstore: CredentialStore;\n};\n\nfunction managedEnvironment(parent: NodeJS.ProcessEnv): Record<string, string | undefined> {\n\tconst {\n\t\tANTHROPIC_API_KEY: _apiKey,\n\t\tANTHROPIC_AUTH_TOKEN: _authToken,\n\t\tANTHROPIC_BASE_URL: _gateway,\n\t\tANTHROPIC_CUSTOM_HEADERS: _customHeaders,\n\t\tCLAUDE_CODE_OAUTH_TOKEN: _oauthToken,\n\t\tCLAUDE_CODE_USE_BEDROCK: _bedrock,\n\t\tCLAUDE_CODE_USE_FOUNDRY: _foundry,\n\t\tCLAUDE_CODE_USE_GATEWAY: _gatewayMode,\n\t\tCLAUDE_CODE_USE_VERTEX: _vertex,\n\t\t...environment\n\t} = parent;\n\tfor (const name of Object.keys(environment)) {\n\t\tif (/^CLAUDE_CODE_OAUTH_TOKEN_\\d+$/.test(name)) delete environment[name];\n\t}\n\treturn environment;\n}\n\nfunction configDirectory(slot: AccountSlot): string {\n\tassertValidAccountName(slot.name);\n\treturn join(activeBoundary.getAgentDir(), \"claude-agent-sdk-accounts\", slot.name);\n}\n\nfunction writeConfigCredentials(directory: string, slot: AccountSlot, access: string): void {\n\tmkdirSync(directory, { recursive: true, mode: 0o700 });\n\tchmodSync(directory, 0o700);\n\twriteFileSync(\n\t\tjoin(directory, \".credentials.json\"),\n\t\tJSON.stringify({\n\t\t\tclaudeAiOauth: {\n\t\t\t\taccessToken: access,\n\t\t\t\trefreshToken: slot.refresh,\n\t\t\t\texpiresAt: slot.expires,\n\t\t\t\tscopes: CLI_OAUTH_SCOPES,\n\t\t\t},\n\t\t}),\n\t\t{ encoding: \"utf8\", mode: 0o600 },\n\t);\n}\n\nasync function managedPool(settings: ClaudeAgentSdkProviderSettings): Promise<ManagedPool | undefined> {\n\tconst lane = settings.tokenInjection ?? \"ambient\";\n\tif (lane === \"ambient\") return undefined;\n\tconst store = activeBoundary.createStore();\n\tlet credential = await store.read(CLAUDE_AGENT_SDK_PROVIDER_ID);\n\tconst environment = activeBoundary.env();\n\tlet accounts = listAccounts(\n\t\t(credential as ClaudeAgentSdkCredential | undefined) ?? emptyCredential(),\n\t\t(name) => environment[name],\n\t);\n\tif (!credential && accounts.length > 0) {\n\t\tcredential = await store.modify(CLAUDE_AGENT_SDK_PROVIDER_ID, async () => emptyCredential());\n\t\taccounts = listAccounts(\n\t\t\t(credential as ClaudeAgentSdkCredential) ?? emptyCredential(),\n\t\t\t(name) => environment[name],\n\t\t);\n\t}\n\tif (accounts.length === 0) return undefined;\n\tconst stored = credential?.type === \"oauth\" ? (credential as ClaudeAgentSdkCredential) : undefined;\n\treturn { accounts, lane, pinnedAccount: settings.pinnedAccount ?? stored?.pinned, store };\n}\n\nasync function prepareSlot(pool: ManagedPool, selected: AccountSlot): Promise<Record<string, string | undefined>> {\n\tconst environment = activeBoundary.env();\n\tconst slot = selected;\n\tif (slot.source !== \"env\" && activeBoundary.now() >= slot.expires - EXPIRING_WITHIN_MS) {\n\t\ttry {\n\t\t\tconst refreshed = await refreshSlot(\n\t\t\t\tpool.store,\n\t\t\t\tCLAUDE_AGENT_SDK_PROVIDER_ID,\n\t\t\t\tslot.name,\n\t\t\t\tactiveBoundary.refresher,\n\t\t\t\t(expires) => activeBoundary.now() >= expires - EXPIRING_WITHIN_MS,\n\t\t\t);\n\t\t\tconst credential = refreshed?.type === \"oauth\" ? (refreshed as ClaudeAgentSdkCredential) : undefined;\n\t\t\tconst updated = listAccounts(credential ?? emptyCredential(), (name) => environment[name]).find(\n\t\t\t\t(candidate) => candidate.name === slot.name,\n\t\t\t);\n\t\t\tif (!updated) throw new Error(\"selected account disappeared during refresh\");\n\t\t\tObject.assign(slot, updated);\n\t\t} catch (error) {\n\t\t\tconst detail = error instanceof Error ? error.message : String(error);\n\t\t\tthrow new Error(`authentication_failed: ${detail}`);\n\t\t}\n\t}\n\tconst access = slot.source === \"env\" ? envSlotToken((name) => environment[name], slot.name) : slot.access;\n\tif (!access) throw new Error(\"authentication_failed: selected OAuth token is unavailable\");\n\tconst childEnvironment = managedEnvironment(environment);\n\tif (pool.lane === \"oauth-slots\") return { ...childEnvironment, CLAUDE_CODE_OAUTH_TOKEN: access };\n\tconst directory = configDirectory(slot);\n\twriteConfigCredentials(directory, slot, access);\n\treturn { ...childEnvironment, CLAUDE_CONFIG_DIR: directory };\n}\n\nfunction sdkFailure(message: SDKMessage): unknown | undefined {\n\tif (message.type === \"assistant\" && message.error) return message.error;\n\tif (message.type === \"result\" && message.subtype !== \"success\") {\n\t\tconst errors = \"errors\" in message && Array.isArray(message.errors) ? (message.errors as unknown[]) : [];\n\t\treturn new Error(errors.length > 0 ? String(errors[0]) : `Claude Code ${message.subtype}`);\n\t}\n\treturn undefined;\n}\n\nfunction visibleSdkMessage(message: SDKMessage): boolean {\n\tif (message.type !== \"stream_event\") return false;\n\treturn /^(?:content_block_start|content_block_delta|content_block_stop)$/.test(message.event.type);\n}\n\nasync function* messagesFrom(query: ReturnType<SdkQuery>): AsyncGenerator<SDKMessage> {\n\ttry {\n\t\tfor await (const message of query) yield message;\n\t} finally {\n\t\tquery.close();\n\t}\n}\n\n/** Resolves managed OAuth immediately before each subprocess spawn and retries only pre-delta failures. */\nexport async function* queryWithAuthLane(input: AuthenticatedQueryInput): AsyncGenerator<SDKMessage> {\n\tconst pool = await managedPool(input.providerSettings);\n\tif (!pool) {\n\t\tconst query = input.query({ prompt: input.prompt, options: input.buildOptions(\"ambient\") });\n\t\tinput.onQuery?.(query);\n\t\tyield* messagesFrom(query);\n\t\treturn;\n\t}\n\tyield* runFailover({\n\t\taccounts: pool.accounts,\n\t\tselectFn: (accounts) =>\n\t\t\tselectAccount(accounts, {\n\t\t\t\tsessionId: input.sessionId,\n\t\t\t\tpinnedAccount: input.pinnedAccount ?? pool.pinnedAccount,\n\t\t\t\tnow: activeBoundary.now(),\n\t\t\t}),\n\t\trunAttempt: async (slot) => {\n\t\t\tconst options = input.buildOptions(pool.lane);\n\t\t\toptions.env = await prepareSlot(pool, slot);\n\t\t\tconst query = input.query({ prompt: input.prompt, options });\n\t\t\tinput.onQuery?.(query);\n\t\t\treturn messagesFrom(query);\n\t\t},\n\t\tclassify: classifySdkError,\n\t\tstore: pool.store,\n\t\tproviderId: CLAUDE_AGENT_SDK_PROVIDER_ID,\n\t\tnow: activeBoundary.now,\n\t\terrorFromEvent: sdkFailure,\n\t\tisVisibleDelta: visibleSdkMessage,\n\t\tonFailover: ({ account, nextAccount, classification }) => {\n\t\t\temitProviderAccountsChanged(CLAUDE_AGENT_SDK_PROVIDER_ID);\n\t\t\tif (nextAccount) {\n\t\t\t\temitProviderAccountFailover(\n\t\t\t\t\tCLAUDE_AGENT_SDK_PROVIDER_ID,\n\t\t\t\t\taccount.name,\n\t\t\t\t\tnextAccount.name,\n\t\t\t\t\tclassification.kind,\n\t\t\t\t);\n\t\t\t}\n\t\t},\n\t});\n}\n"]}
1
+ {"version":3,"file":"auth-lane.js","sourceRoot":"","sources":["../../../../../src/core/extensions/builtin/claude-agent-sdk/auth-lane.ts"],"names":[],"mappings":"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","sourcesContent":["import { chmodSync, mkdirSync, writeFileSync } from \"node:fs\";\nimport { join } from \"node:path\";\nimport type { CredentialStore } from \"@earendil-works/pi-ai\";\nimport { loadAnthropicOAuth } from \"@earendil-works/pi-ai/oauth\";\nimport { getAgentDir } from \"../../../../config.ts\";\nimport { AuthStorage } from \"../../../auth-storage.ts\";\nimport { emitProviderAccountFailover, emitProviderAccountsChanged } from \"./account-events.ts\";\nimport { CLAUDE_AGENT_SDK_PROVIDER_ID } from \"./account-management.ts\";\nimport {\n\ttype AccountSlot,\n\tassertValidAccountName,\n\ttype ClaudeAgentSdkCredential,\n\temptyCredential,\n\tenvSlotToken,\n\tlistAccounts,\n\trefreshSlot,\n\ttype SlotRefresher,\n} from \"./accounts.ts\";\nimport { selectAccount } from \"./affinity.ts\";\nimport { classifySdkError } from \"./errors.ts\";\nimport { runFailover } from \"./failover.ts\";\nimport type { Options, SDKMessage, SdkQuery } from \"./sdk-boundary.ts\";\nimport type { ClaudeAgentSdkProviderSettings, ClaudeAgentSdkTokenInjection } from \"./settings.ts\";\n\nexport { CLAUDE_AGENT_SDK_PROVIDER_ID } from \"./account-management.ts\";\n\nconst EXPIRING_WITHIN_MS = 5 * 60_000;\nconst CLI_OAUTH_SCOPES = [\n\t\"org:create_api_key\",\n\t\"user:profile\",\n\t\"user:inference\",\n\t\"user:sessions:claude_code\",\n\t\"user:mcp_servers\",\n\t\"user:file_upload\",\n] as const;\n\ntype AuthLaneBoundary = {\n\tcreateStore: () => CredentialStore;\n\tenv: () => NodeJS.ProcessEnv;\n\tgetAgentDir: () => string;\n\tnow: () => number;\n\trefresher: SlotRefresher;\n};\n\nasync function refreshWithAnthropicOAuth(refresh: string) {\n\tconst oauth = await loadAnthropicOAuth();\n\tconst credential = await oauth.refresh({ type: \"oauth\", access: \"\", refresh, expires: 0 });\n\treturn { access: credential.access, refresh: credential.refresh, expires: credential.expires };\n}\n\nconst defaultBoundary: AuthLaneBoundary = {\n\tcreateStore: () => AuthStorage.create(),\n\tenv: () => process.env,\n\tgetAgentDir,\n\tnow: () => Date.now(),\n\trefresher: refreshWithAnthropicOAuth,\n};\nlet activeBoundary = defaultBoundary;\n\nexport function overrideAuthLaneBoundary(override: Partial<AuthLaneBoundary>): void {\n\tactiveBoundary = { ...activeBoundary, ...override };\n}\n\nexport function resetAuthLaneBoundary(): void {\n\tactiveBoundary = defaultBoundary;\n}\n\nexport type AuthenticatedQueryInput = {\n\tprompt: Parameters<SdkQuery>[0][\"prompt\"];\n\tquery: SdkQuery;\n\tbuildOptions: (lane: ClaudeAgentSdkTokenInjection) => Options;\n\tproviderSettings: ClaudeAgentSdkProviderSettings;\n\tsessionId?: string;\n\t/** Request-scoped CLI pin; takes precedence over persistent settings and account pins. */\n\tpinnedAccount?: string;\n\tonQuery?: (query: ReturnType<SdkQuery>) => void;\n};\n\ntype ManagedPool = {\n\taccounts: AccountSlot[];\n\tlane: Exclude<ClaudeAgentSdkTokenInjection, \"ambient\">;\n\tpinnedAccount?: string;\n\tstore: CredentialStore;\n};\n\nfunction managedEnvironment(parent: NodeJS.ProcessEnv): Record<string, string | undefined> {\n\tconst {\n\t\tANTHROPIC_API_KEY: _apiKey,\n\t\tANTHROPIC_AUTH_TOKEN: _authToken,\n\t\tANTHROPIC_BASE_URL: _gateway,\n\t\tANTHROPIC_CUSTOM_HEADERS: _customHeaders,\n\t\tCLAUDE_CODE_OAUTH_TOKEN: _oauthToken,\n\t\tCLAUDE_CODE_USE_BEDROCK: _bedrock,\n\t\tCLAUDE_CODE_USE_FOUNDRY: _foundry,\n\t\tCLAUDE_CODE_USE_GATEWAY: _gatewayMode,\n\t\tCLAUDE_CODE_USE_VERTEX: _vertex,\n\t\t...environment\n\t} = parent;\n\tfor (const name of Object.keys(environment)) {\n\t\tif (/^CLAUDE_CODE_OAUTH_TOKEN_\\d+$/.test(name)) delete environment[name];\n\t}\n\treturn environment;\n}\n\nfunction configDirectory(slot: AccountSlot): string {\n\tassertValidAccountName(slot.name);\n\treturn join(activeBoundary.getAgentDir(), \"claude-agent-sdk-accounts\", slot.name);\n}\n\nfunction writeConfigCredentials(directory: string, slot: AccountSlot, access: string): void {\n\tmkdirSync(directory, { recursive: true, mode: 0o700 });\n\tchmodSync(directory, 0o700);\n\twriteFileSync(\n\t\tjoin(directory, \".credentials.json\"),\n\t\tJSON.stringify({\n\t\t\tclaudeAiOauth: {\n\t\t\t\taccessToken: access,\n\t\t\t\trefreshToken: slot.refresh,\n\t\t\t\texpiresAt: slot.expires,\n\t\t\t\tscopes: CLI_OAUTH_SCOPES,\n\t\t\t},\n\t\t}),\n\t\t{ encoding: \"utf8\", mode: 0o600 },\n\t);\n}\n\nasync function managedPool(settings: ClaudeAgentSdkProviderSettings): Promise<ManagedPool | undefined> {\n\tconst lane = settings.tokenInjection ?? \"ambient\";\n\tif (lane === \"ambient\") return undefined;\n\tconst store = activeBoundary.createStore();\n\tlet credential = await store.read(CLAUDE_AGENT_SDK_PROVIDER_ID);\n\tconst environment = activeBoundary.env();\n\tlet accounts = listAccounts(\n\t\t(credential as ClaudeAgentSdkCredential | undefined) ?? emptyCredential(),\n\t\t(name) => environment[name],\n\t);\n\tif (!credential && accounts.length > 0) {\n\t\tcredential = await store.modify(CLAUDE_AGENT_SDK_PROVIDER_ID, async () => emptyCredential());\n\t\taccounts = listAccounts(\n\t\t\t(credential as ClaudeAgentSdkCredential) ?? emptyCredential(),\n\t\t\t(name) => environment[name],\n\t\t);\n\t}\n\tif (accounts.length === 0) return undefined;\n\tconst stored = credential?.type === \"oauth\" ? (credential as ClaudeAgentSdkCredential) : undefined;\n\treturn { accounts, lane, pinnedAccount: settings.pinnedAccount ?? stored?.pinned, store };\n}\n\nasync function prepareSlot(pool: ManagedPool, selected: AccountSlot): Promise<Record<string, string | undefined>> {\n\tconst environment = activeBoundary.env();\n\tconst slot = selected;\n\tif (slot.source !== \"env\" && activeBoundary.now() >= slot.expires - EXPIRING_WITHIN_MS) {\n\t\ttry {\n\t\t\tconst refreshed = await refreshSlot(\n\t\t\t\tpool.store,\n\t\t\t\tCLAUDE_AGENT_SDK_PROVIDER_ID,\n\t\t\t\tslot.name,\n\t\t\t\tactiveBoundary.refresher,\n\t\t\t\t(expires) => activeBoundary.now() >= expires - EXPIRING_WITHIN_MS,\n\t\t\t);\n\t\t\tconst credential = refreshed?.type === \"oauth\" ? (refreshed as ClaudeAgentSdkCredential) : undefined;\n\t\t\tconst updated = listAccounts(credential ?? emptyCredential(), (name) => environment[name]).find(\n\t\t\t\t(candidate) => candidate.name === slot.name,\n\t\t\t);\n\t\t\tif (!updated) throw new Error(\"selected account disappeared during refresh\");\n\t\t\tObject.assign(slot, updated);\n\t\t} catch (error) {\n\t\t\tconst detail = error instanceof Error ? error.message : String(error);\n\t\t\tthrow new Error(`authentication_failed: ${detail}`);\n\t\t}\n\t}\n\tconst access = slot.source === \"env\" ? envSlotToken((name) => environment[name], slot.name) : slot.access;\n\tif (!access) throw new Error(\"authentication_failed: selected OAuth token is unavailable\");\n\tconst childEnvironment = managedEnvironment(environment);\n\tif (pool.lane === \"oauth-slots\") return { ...childEnvironment, CLAUDE_CODE_OAUTH_TOKEN: access };\n\tconst directory = configDirectory(slot);\n\twriteConfigCredentials(directory, slot, access);\n\treturn { ...childEnvironment, CLAUDE_CONFIG_DIR: directory };\n}\n\nfunction sdkFailure(message: SDKMessage): unknown | undefined {\n\tif (message.type === \"assistant\" && message.error) return message.error;\n\tif (message.type === \"result\" && message.subtype !== \"success\") {\n\t\tconst errors = \"errors\" in message && Array.isArray(message.errors) ? (message.errors as unknown[]) : [];\n\t\tif (errors.length > 0) return new Error(String(errors[0]));\n\t\t// `subtype` alone is too coarse to classify: a subscription limit and an\n\t\t// ordinary tool failure both arrive as \"error_during_execution\". The SDK\n\t\t// carries the real cause in `terminal_reason` (e.g. \"blocking_limit\"), so\n\t\t// append it — otherwise classifySdkError() scores every result error as\n\t\t// non-retryable \"other\", the exhausted account is never blocked, and a\n\t\t// multi-account pool never rotates past it.\n\t\tconst reason =\n\t\t\t\"terminal_reason\" in message && typeof message.terminal_reason === \"string\" ? message.terminal_reason : \"\";\n\t\treturn new Error(reason ? `Claude Code ${message.subtype}: ${reason}` : `Claude Code ${message.subtype}`);\n\t}\n\treturn undefined;\n}\n\nfunction visibleSdkMessage(message: SDKMessage): boolean {\n\tif (message.type !== \"stream_event\") return false;\n\treturn /^(?:content_block_start|content_block_delta|content_block_stop)$/.test(message.event.type);\n}\n\nasync function* messagesFrom(query: ReturnType<SdkQuery>): AsyncGenerator<SDKMessage> {\n\ttry {\n\t\tfor await (const message of query) yield message;\n\t} finally {\n\t\tquery.close();\n\t}\n}\n\n/** Resolves managed OAuth immediately before each subprocess spawn and retries only pre-delta failures. */\nexport async function* queryWithAuthLane(input: AuthenticatedQueryInput): AsyncGenerator<SDKMessage> {\n\tconst pool = await managedPool(input.providerSettings);\n\tif (!pool) {\n\t\tconst query = input.query({ prompt: input.prompt, options: input.buildOptions(\"ambient\") });\n\t\tinput.onQuery?.(query);\n\t\tyield* messagesFrom(query);\n\t\treturn;\n\t}\n\tyield* runFailover({\n\t\taccounts: pool.accounts,\n\t\tselectFn: (accounts) =>\n\t\t\tselectAccount(accounts, {\n\t\t\t\tsessionId: input.sessionId,\n\t\t\t\tpinnedAccount: input.pinnedAccount ?? pool.pinnedAccount,\n\t\t\t\tnow: activeBoundary.now(),\n\t\t\t}),\n\t\trunAttempt: async (slot) => {\n\t\t\tconst options = input.buildOptions(pool.lane);\n\t\t\toptions.env = await prepareSlot(pool, slot);\n\t\t\tconst query = input.query({ prompt: input.prompt, options });\n\t\t\tinput.onQuery?.(query);\n\t\t\treturn messagesFrom(query);\n\t\t},\n\t\tclassify: classifySdkError,\n\t\tstore: pool.store,\n\t\tproviderId: CLAUDE_AGENT_SDK_PROVIDER_ID,\n\t\tnow: activeBoundary.now,\n\t\terrorFromEvent: sdkFailure,\n\t\tisVisibleDelta: visibleSdkMessage,\n\t\tonFailover: ({ account, nextAccount, classification }) => {\n\t\t\temitProviderAccountsChanged(CLAUDE_AGENT_SDK_PROVIDER_ID);\n\t\t\tif (nextAccount) {\n\t\t\t\temitProviderAccountFailover(\n\t\t\t\t\tCLAUDE_AGENT_SDK_PROVIDER_ID,\n\t\t\t\t\taccount.name,\n\t\t\t\t\tnextAccount.name,\n\t\t\t\t\tclassification.kind,\n\t\t\t\t);\n\t\t\t}\n\t\t},\n\t});\n}\n"]}
@@ -1 +1 @@
1
- {"version":3,"file":"errors.d.ts","sourceRoot":"","sources":["../../../../../src/core/extensions/builtin/claude-agent-sdk/errors.ts"],"names":[],"mappings":"AAEA,MAAM,MAAM,YAAY,GAAG,YAAY,GAAG,YAAY,GAAG,YAAY,GAAG,SAAS,GAAG,iBAAiB,GAAG,OAAO,CAAC;AAEhH,MAAM,MAAM,sBAAsB,GAAG;IACpC,IAAI,EAAE,YAAY,CAAC;IACnB,SAAS,EAAE,OAAO,CAAC;CACnB,CAAC;AAgCF,0FAA0F;AAC1F,wBAAgB,gBAAgB,CAAC,KAAK,EAAE,OAAO,GAAG,sBAAsB,CAUvE"}
1
+ {"version":3,"file":"errors.d.ts","sourceRoot":"","sources":["../../../../../src/core/extensions/builtin/claude-agent-sdk/errors.ts"],"names":[],"mappings":"AAEA,MAAM,MAAM,YAAY,GAAG,YAAY,GAAG,YAAY,GAAG,YAAY,GAAG,SAAS,GAAG,iBAAiB,GAAG,OAAO,CAAC;AAEhH,MAAM,MAAM,sBAAsB,GAAG;IACpC,IAAI,EAAE,YAAY,CAAC;IACnB,SAAS,EAAE,OAAO,CAAC;CACnB,CAAC;AAgCF,0FAA0F;AAC1F,wBAAgB,gBAAgB,CAAC,KAAK,EAAE,OAAO,GAAG,sBAAsB,CAwBvE"}
@@ -39,6 +39,20 @@ export function classifySdkError(error) {
39
39
  if (/\b(?:http\s*)?429\b|too many requests|rate[ _-]?limit/.test(text)) {
40
40
  return { kind: "rate_limit", retryable: true };
41
41
  }
42
+ // Claude Code signals subscription exhaustion two ways, neither of which
43
+ // carries an SDK error code or HTTP status:
44
+ // - `terminal_reason: "blocking_limit"` / `"rapid_refill_breaker"` on a
45
+ // result message (surfaced by auth-lane's sdkFailure)
46
+ // - prose in `errors[0]`, e.g. "You've hit your weekly limit · resets 5am
47
+ // (Asia/Seoul)" and the 5-hour/daily equivalents
48
+ // Without these branches both classify as non-retryable "other", so the
49
+ // exhausted account is never blocked and a pool never rotates past it.
50
+ if (/\bblocking_limit\b|\brapid_refill_breaker\b/.test(text)) {
51
+ return { kind: "rate_limit", retryable: true };
52
+ }
53
+ if (/\b(?:hit|reached|exceeded)\b[^.]*\blimit\b|\b(?:weekly|daily|hourly|usage)\s+limit\b/.test(text)) {
54
+ return { kind: "rate_limit", retryable: true };
55
+ }
42
56
  if (/\b(?:http\s*)?529\b|overloaded/.test(text))
43
57
  return { kind: "overloaded", retryable: true };
44
58
  return OTHER_ERROR;
@@ -1 +1 @@
1
- {"version":3,"file":"errors.js","sourceRoot":"","sources":["../../../../../src/core/extensions/builtin/claude-agent-sdk/errors.ts"],"names":[],"mappings":"AASA,MAAM,yBAAyB,GAAsE;IACpG,qBAAqB,EAAE,EAAE,IAAI,EAAE,YAAY,EAAE,SAAS,EAAE,IAAI,EAAE;IAC9D,qBAAqB,EAAE,EAAE,IAAI,EAAE,iBAAiB,EAAE,SAAS,EAAE,IAAI,EAAE;IACnE,aAAa,EAAE,EAAE,IAAI,EAAE,SAAS,EAAE,SAAS,EAAE,IAAI,EAAE;IACnD,UAAU,EAAE,EAAE,IAAI,EAAE,YAAY,EAAE,SAAS,EAAE,IAAI,EAAE;IACnD,UAAU,EAAE,EAAE,IAAI,EAAE,YAAY,EAAE,SAAS,EAAE,IAAI,EAAE;IACnD,eAAe,EAAE,EAAE,IAAI,EAAE,OAAO,EAAE,SAAS,EAAE,KAAK,EAAE;IACpD,YAAY,EAAE,EAAE,IAAI,EAAE,OAAO,EAAE,SAAS,EAAE,IAAI,EAAE;CAChD,CAAC;AAEF,MAAM,WAAW,GAA2B,EAAE,IAAI,EAAE,OAAO,EAAE,SAAS,EAAE,KAAK,EAAE,CAAC;AAEhF,SAAS,MAAM,CAAC,KAAc;IAC7B,OAAO,KAAK,KAAK,IAAI,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC;QAC1E,CAAC,CAAE,KAAiC;QACpC,CAAC,CAAC,SAAS,CAAC;AACd,CAAC;AAED,SAAS,SAAS,CAAC,KAAc;IAChC,IAAI,OAAO,KAAK,KAAK,QAAQ;QAAE,OAAO,KAAK,CAAC;IAC5C,IAAI,KAAK,YAAY,KAAK;QAAE,OAAO,KAAK,CAAC,OAAO,CAAC;IACjD,MAAM,KAAK,GAAG,MAAM,CAAC,KAAK,CAAC,CAAC;IAC5B,IAAI,CAAC,KAAK;QAAE,OAAO,MAAM,CAAC,KAAK,CAAC,CAAC;IACjC,MAAM,OAAO,GAAG,KAAK,CAAC,OAAO,CAAC;IAC9B,IAAI,OAAO,OAAO,KAAK,QAAQ;QAAE,OAAO,OAAO,CAAC;IAChD,MAAM,IAAI,GAAG,KAAK,CAAC,KAAK,CAAC;IACzB,IAAI,OAAO,IAAI,KAAK,QAAQ;QAAE,OAAO,IAAI,CAAC;IAC1C,OAAO,MAAM,CAAC,KAAK,CAAC,CAAC;AACtB,CAAC;AAED,0FAA0F;AAC1F,MAAM,UAAU,gBAAgB,CAAC,KAAc;IAC9C,MAAM,IAAI,GAAG,SAAS,CAAC,KAAK,CAAC,CAAC,WAAW,EAAE,CAAC;IAC5C,KAAK,MAAM,CAAC,IAAI,EAAE,cAAc,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,yBAAyB,CAAC,EAAE,CAAC;QAChF,IAAI,IAAI,MAAM,CAAC,MAAM,IAAI,KAAK,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC;YAAE,OAAO,cAAc,CAAC;IACnE,CAAC;IACD,IAAI,uDAAuD,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC;QACxE,OAAO,EAAE,IAAI,EAAE,YAAY,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC;IAChD,CAAC;IACD,IAAI,gCAAgC,CAAC,IAAI,CAAC,IAAI,CAAC;QAAE,OAAO,EAAE,IAAI,EAAE,YAAY,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC;IAChG,OAAO,WAAW,CAAC;AACpB,CAAC","sourcesContent":["import type { SDKAssistantMessageError } from \"@anthropic-ai/claude-agent-sdk\";\n\nexport type SdkErrorKind = \"rate_limit\" | \"overloaded\" | \"auth_error\" | \"billing\" | \"org_not_allowed\" | \"other\";\n\nexport type SdkErrorClassification = {\n\tkind: SdkErrorKind;\n\tretryable: boolean;\n};\n\nconst SDK_ERROR_CLASSIFICATIONS: Partial<Record<SDKAssistantMessageError, SdkErrorClassification>> = {\n\tauthentication_failed: { kind: \"auth_error\", retryable: true },\n\toauth_org_not_allowed: { kind: \"org_not_allowed\", retryable: true },\n\tbilling_error: { kind: \"billing\", retryable: true },\n\trate_limit: { kind: \"rate_limit\", retryable: true },\n\toverloaded: { kind: \"overloaded\", retryable: true },\n\tinvalid_request: { kind: \"other\", retryable: false },\n\tserver_error: { kind: \"other\", retryable: true },\n};\n\nconst OTHER_ERROR: SdkErrorClassification = { kind: \"other\", retryable: false };\n\nfunction record(value: unknown): Record<string, unknown> | undefined {\n\treturn value !== null && typeof value === \"object\" && !Array.isArray(value)\n\t\t? (value as Record<string, unknown>)\n\t\t: undefined;\n}\n\nfunction errorText(error: unknown): string {\n\tif (typeof error === \"string\") return error;\n\tif (error instanceof Error) return error.message;\n\tconst value = record(error);\n\tif (!value) return String(error);\n\tconst message = value.message;\n\tif (typeof message === \"string\") return message;\n\tconst code = value.error;\n\tif (typeof code === \"string\") return code;\n\treturn String(error);\n}\n\n/** Classifies Claude Agent SDK error codes and HTTP-shaped fallback text in one place. */\nexport function classifySdkError(error: unknown): SdkErrorClassification {\n\tconst text = errorText(error).toLowerCase();\n\tfor (const [code, classification] of Object.entries(SDK_ERROR_CLASSIFICATIONS)) {\n\t\tif (new RegExp(`\\\\b${code}\\\\b`).test(text)) return classification;\n\t}\n\tif (/\\b(?:http\\s*)?429\\b|too many requests|rate[ _-]?limit/.test(text)) {\n\t\treturn { kind: \"rate_limit\", retryable: true };\n\t}\n\tif (/\\b(?:http\\s*)?529\\b|overloaded/.test(text)) return { kind: \"overloaded\", retryable: true };\n\treturn OTHER_ERROR;\n}\n"]}
1
+ {"version":3,"file":"errors.js","sourceRoot":"","sources":["../../../../../src/core/extensions/builtin/claude-agent-sdk/errors.ts"],"names":[],"mappings":"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","sourcesContent":["import type { SDKAssistantMessageError } from \"@anthropic-ai/claude-agent-sdk\";\n\nexport type SdkErrorKind = \"rate_limit\" | \"overloaded\" | \"auth_error\" | \"billing\" | \"org_not_allowed\" | \"other\";\n\nexport type SdkErrorClassification = {\n\tkind: SdkErrorKind;\n\tretryable: boolean;\n};\n\nconst SDK_ERROR_CLASSIFICATIONS: Partial<Record<SDKAssistantMessageError, SdkErrorClassification>> = {\n\tauthentication_failed: { kind: \"auth_error\", retryable: true },\n\toauth_org_not_allowed: { kind: \"org_not_allowed\", retryable: true },\n\tbilling_error: { kind: \"billing\", retryable: true },\n\trate_limit: { kind: \"rate_limit\", retryable: true },\n\toverloaded: { kind: \"overloaded\", retryable: true },\n\tinvalid_request: { kind: \"other\", retryable: false },\n\tserver_error: { kind: \"other\", retryable: true },\n};\n\nconst OTHER_ERROR: SdkErrorClassification = { kind: \"other\", retryable: false };\n\nfunction record(value: unknown): Record<string, unknown> | undefined {\n\treturn value !== null && typeof value === \"object\" && !Array.isArray(value)\n\t\t? (value as Record<string, unknown>)\n\t\t: undefined;\n}\n\nfunction errorText(error: unknown): string {\n\tif (typeof error === \"string\") return error;\n\tif (error instanceof Error) return error.message;\n\tconst value = record(error);\n\tif (!value) return String(error);\n\tconst message = value.message;\n\tif (typeof message === \"string\") return message;\n\tconst code = value.error;\n\tif (typeof code === \"string\") return code;\n\treturn String(error);\n}\n\n/** Classifies Claude Agent SDK error codes and HTTP-shaped fallback text in one place. */\nexport function classifySdkError(error: unknown): SdkErrorClassification {\n\tconst text = errorText(error).toLowerCase();\n\tfor (const [code, classification] of Object.entries(SDK_ERROR_CLASSIFICATIONS)) {\n\t\tif (new RegExp(`\\\\b${code}\\\\b`).test(text)) return classification;\n\t}\n\tif (/\\b(?:http\\s*)?429\\b|too many requests|rate[ _-]?limit/.test(text)) {\n\t\treturn { kind: \"rate_limit\", retryable: true };\n\t}\n\t// Claude Code signals subscription exhaustion two ways, neither of which\n\t// carries an SDK error code or HTTP status:\n\t// - `terminal_reason: \"blocking_limit\"` / `\"rapid_refill_breaker\"` on a\n\t// result message (surfaced by auth-lane's sdkFailure)\n\t// - prose in `errors[0]`, e.g. \"You've hit your weekly limit · resets 5am\n\t// (Asia/Seoul)\" and the 5-hour/daily equivalents\n\t// Without these branches both classify as non-retryable \"other\", so the\n\t// exhausted account is never blocked and a pool never rotates past it.\n\tif (/\\bblocking_limit\\b|\\brapid_refill_breaker\\b/.test(text)) {\n\t\treturn { kind: \"rate_limit\", retryable: true };\n\t}\n\tif (/\\b(?:hit|reached|exceeded)\\b[^.]*\\blimit\\b|\\b(?:weekly|daily|hourly|usage)\\s+limit\\b/.test(text)) {\n\t\treturn { kind: \"rate_limit\", retryable: true };\n\t}\n\tif (/\\b(?:http\\s*)?529\\b|overloaded/.test(text)) return { kind: \"overloaded\", retryable: true };\n\treturn OTHER_ERROR;\n}\n"]}
@@ -1 +1 @@
1
- {"version":3,"file":"options.d.ts","sourceRoot":"","sources":["../../../../../src/core/extensions/builtin/claude-agent-sdk/options.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,GAAG,EAAE,OAAO,EAAE,KAAK,EAAE,mBAAmB,EAAkC,MAAM,uBAAuB,CAAC;AAEtH,OAAO,KAAK,EAAe,OAAO,EAAiC,MAAM,mBAAmB,CAAC;AAC7F,OAAO,EACN,KAAK,8BAA8B,EACnC,KAAK,4BAA4B,EAEjC,MAAM,eAAe,CAAC;AAGvB,MAAM,MAAM,sBAAsB,GAAG,4BAA4B,CAAC;AAElE,MAAM,WAAW,+BAA+B;IAC/C,QAAQ,CAAC,KAAK,EAAE,KAAK,CAAC,GAAG,CAAC,CAAC;IAC3B,QAAQ,CAAC,OAAO,EAAE,OAAO,CAAC;IAC1B,QAAQ,CAAC,aAAa,CAAC,EAAE,mBAAmB,CAAC;IAC7C,QAAQ,CAAC,GAAG,CAAC,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,gBAAgB,CAAC,EAAE,8BAA8B,CAAC;IAC3D,QAAQ,CAAC,QAAQ,CAAC,EAAE,sBAAsB,CAAC;IAC3C,QAAQ,CAAC,KAAK,CAAC,EAAE,SAAS,MAAM,EAAE,CAAC;IACnC,QAAQ,CAAC,0BAA0B,CAAC,EAAE,MAAM,CAAC;CAC7C;AAkJD,wBAAgB,+BAA+B,CAAC,KAAK,EAAE,+BAA+B,GAAG,OAAO,CAgC/F"}
1
+ {"version":3,"file":"options.d.ts","sourceRoot":"","sources":["../../../../../src/core/extensions/builtin/claude-agent-sdk/options.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,GAAG,EAAE,OAAO,EAAE,KAAK,EAAE,mBAAmB,EAAkC,MAAM,uBAAuB,CAAC;AAEtH,OAAO,KAAK,EAAe,OAAO,EAAiC,MAAM,mBAAmB,CAAC;AAC7F,OAAO,EACN,KAAK,8BAA8B,EACnC,KAAK,4BAA4B,EAEjC,MAAM,eAAe,CAAC;AAGvB,MAAM,MAAM,sBAAsB,GAAG,4BAA4B,CAAC;AAElE,MAAM,WAAW,+BAA+B;IAC/C,QAAQ,CAAC,KAAK,EAAE,KAAK,CAAC,GAAG,CAAC,CAAC;IAC3B,QAAQ,CAAC,OAAO,EAAE,OAAO,CAAC;IAC1B,QAAQ,CAAC,aAAa,CAAC,EAAE,mBAAmB,CAAC;IAC7C,QAAQ,CAAC,GAAG,CAAC,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,gBAAgB,CAAC,EAAE,8BAA8B,CAAC;IAC3D,QAAQ,CAAC,QAAQ,CAAC,EAAE,sBAAsB,CAAC;IAC3C,QAAQ,CAAC,KAAK,CAAC,EAAE,SAAS,MAAM,EAAE,CAAC;IACnC,QAAQ,CAAC,0BAA0B,CAAC,EAAE,MAAM,CAAC;CAC7C;AAkJD,wBAAgB,+BAA+B,CAAC,KAAK,EAAE,+BAA+B,GAAG,OAAO,CAiC/F"}
@@ -2,7 +2,7 @@ import { existsSync, readFileSync } from "node:fs";
2
2
  import { dirname, join, relative, resolve } from "node:path";
3
3
  import { CONFIG_DIR_NAME, getAgentDir } from "../../../../config.js";
4
4
  import { loadClaudeAgentSdkProviderSettingsFromDisk, } from "./settings.js";
5
- import { BUILTIN_SDK_TOOLS, canUseTool } from "./tools.js";
5
+ import { BUILTIN_SDK_TOOLS, canUseTool, HOST_TOOL_DENIAL_HOOKS } from "./tools.js";
6
6
  const ADAPTIVE_THINKING_MODEL_MARKERS = [
7
7
  "opus-4-6",
8
8
  "opus-4.6",
@@ -152,6 +152,7 @@ export function buildClaudeAgentSdkQueryOptions(input) {
152
152
  permissionMode: "dontAsk",
153
153
  includePartialMessages: true,
154
154
  canUseTool,
155
+ hooks: HOST_TOOL_DENIAL_HOOKS,
155
156
  systemPrompt: { type: "preset", preset: "claude_code", append: append.join("\n\n") || undefined },
156
157
  settingSources: resolveSettingSources(providerSettings, appendSystemPrompt, authLane),
157
158
  };
@@ -1 +1 @@
1
- {"version":3,"file":"options.js","sourceRoot":"","sources":["../../../../../src/core/extensions/builtin/claude-agent-sdk/options.ts"],"names":[],"mappings":"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","sourcesContent":["import { existsSync, readFileSync } from \"node:fs\";\nimport { dirname, join, relative, resolve } from \"node:path\";\nimport type { Api, Context, Model, SimpleStreamOptions, ThinkingBudgets, ThinkingLevel } from \"@earendil-works/pi-ai\";\nimport { CONFIG_DIR_NAME, getAgentDir } from \"../../../../config.ts\";\nimport type { EffortLevel, Options, SettingSource, ThinkingConfig } from \"./sdk-boundary.ts\";\nimport {\n\ttype ClaudeAgentSdkProviderSettings,\n\ttype ClaudeAgentSdkTokenInjection,\n\tloadClaudeAgentSdkProviderSettingsFromDisk,\n} from \"./settings.ts\";\nimport { BUILTIN_SDK_TOOLS, canUseTool } from \"./tools.ts\";\n\nexport type ClaudeAgentSdkAuthLane = ClaudeAgentSdkTokenInjection;\n\nexport interface ClaudeAgentSdkQueryOptionsInput {\n\treadonly model: Model<Api>;\n\treadonly context: Context;\n\treadonly streamOptions?: SimpleStreamOptions;\n\treadonly cwd?: string;\n\treadonly providerSettings?: ClaudeAgentSdkProviderSettings;\n\treadonly authLane?: ClaudeAgentSdkAuthLane;\n\treadonly tools?: readonly string[];\n\treadonly pathToClaudeCodeExecutable?: string;\n}\n\nconst ADAPTIVE_THINKING_MODEL_MARKERS = [\n\t\"opus-4-6\",\n\t\"opus-4.6\",\n\t\"opus-4-7\",\n\t\"opus-4.7\",\n\t\"opus-4-8\",\n\t\"opus-4.8\",\n\t\"opus-5\",\n\t\"sonnet-4-6\",\n\t\"sonnet-4.6\",\n\t\"sonnet-5\",\n\t\"fable-5\",\n\t\"mythos-5\",\n] as const;\n\nconst NATIVE_XHIGH_EFFORT_MODEL_MARKERS = [\n\t\"opus-4-7\",\n\t\"opus-4-8\",\n\t\"opus-5\",\n\t\"sonnet-5\",\n\t\"fable-5\",\n\t\"mythos-5\",\n] as const;\n\nconst DEFAULT_THINKING_BUDGETS: Required<ThinkingBudgets> = {\n\tminimal: 2048,\n\tlow: 8192,\n\tmedium: 16384,\n\thigh: 31999,\n\tmax: 63999,\n};\n\nfunction includesModelMarker(model: Model<Api>, markers: readonly string[]): boolean {\n\tconst id = model.id.toLowerCase();\n\treturn markers.some((marker) => id.includes(marker));\n}\n\nfunction forcedAdaptiveThinking(model: Model<Api>): boolean | undefined {\n\tconst compat = model.compat;\n\tif (!compat || !(\"forceAdaptiveThinking\" in compat)) return undefined;\n\treturn typeof compat.forceAdaptiveThinking === \"boolean\" ? compat.forceAdaptiveThinking : undefined;\n}\n\nfunction supportsAdaptiveThinking(model: Model<Api>): boolean {\n\treturn forcedAdaptiveThinking(model) ?? includesModelMarker(model, ADAPTIVE_THINKING_MODEL_MARKERS);\n}\n\nfunction supportsNativeXhighEffort(model: Model<Api>): boolean {\n\treturn includesModelMarker(model, NATIVE_XHIGH_EFFORT_MODEL_MARKERS);\n}\n\nfunction isEffortLevel(value: string): value is EffortLevel {\n\treturn value === \"low\" || value === \"medium\" || value === \"high\" || value === \"xhigh\" || value === \"max\";\n}\n\nfunction mapThinkingLevelToEffort(model: Model<Api>, level: ThinkingLevel): EffortLevel {\n\tconst mapped = model.thinkingLevelMap?.[level];\n\tif (typeof mapped === \"string\" && isEffortLevel(mapped)) return mapped;\n\tswitch (level) {\n\t\tcase \"minimal\":\n\t\tcase \"low\":\n\t\t\treturn \"low\";\n\t\tcase \"medium\":\n\t\t\treturn \"medium\";\n\t\tcase \"high\":\n\t\t\treturn \"high\";\n\t\tcase \"xhigh\":\n\t\t\treturn supportsNativeXhighEffort(model) ? \"xhigh\" : \"max\";\n\t\tcase \"max\":\n\t\t\treturn \"max\";\n\t}\n}\n\nfunction mapThinkingTokens(reasoning: ThinkingLevel, thinkingBudgets: ThinkingBudgets | undefined): number {\n\tconst budgetLevel = reasoning === \"xhigh\" ? \"high\" : reasoning;\n\tconst customBudget = thinkingBudgets?.[budgetLevel];\n\treturn typeof customBudget === \"number\" && Number.isFinite(customBudget) && customBudget > 0\n\t\t? customBudget\n\t\t: DEFAULT_THINKING_BUDGETS[budgetLevel];\n}\n\nfunction findAgentsMdInParents(cwd: string): string | undefined {\n\tlet current = resolve(cwd);\n\twhile (true) {\n\t\tconst candidate = join(current, \"AGENTS.md\");\n\t\tif (existsSync(candidate)) return candidate;\n\t\tconst parent = dirname(current);\n\t\tif (parent === current) return undefined;\n\t\tcurrent = parent;\n\t}\n}\n\nfunction sanitizeAgentsContent(content: string): string {\n\tconst configDirectory = CONFIG_DIR_NAME.replace(/^\\./, \"\");\n\tconst escapedConfigDirectory = configDirectory.replace(/[.*+?^${}()|[\\]\\\\]/g, \"\\\\$&\");\n\treturn content\n\t\t.replace(new RegExp(`~/${escapedConfigDirectory}\\\\b`, \"gi\"), \"~/.claude\")\n\t\t.replace(new RegExp(`(^|[\\\\s'\"\\`])\\\\.${escapedConfigDirectory}/`, \"g\"), \"$1.claude/\")\n\t\t.replace(new RegExp(`\\\\b${escapedConfigDirectory}\\\\b`, \"gi\"), \"environment\");\n}\n\nfunction extractAgentsAppend(cwd: string): string | undefined {\n\tconst agentsPath = findAgentsMdInParents(cwd) ?? join(getAgentDir(), \"AGENTS.md\");\n\tif (!existsSync(agentsPath)) return undefined;\n\ttry {\n\t\tconst content = sanitizeAgentsContent(readFileSync(agentsPath, \"utf-8\").trim());\n\t\treturn content.length > 0 ? `# CLAUDE.md\\n\\n${content}` : undefined;\n\t} catch {\n\t\treturn undefined;\n\t}\n}\n\nfunction rewriteSkillsLocations(skillsBlock: string, cwd: string): string {\n\tconst globalSkillsRoot = join(getAgentDir(), \"skills\");\n\tconst projectSkillsRoot = join(cwd, CONFIG_DIR_NAME, \"skills\");\n\treturn skillsBlock.replace(/<location>([^<]+)<\\/location>/g, (_match, location: string) => {\n\t\tif (location.startsWith(globalSkillsRoot)) {\n\t\t\treturn `<location>~/.claude/skills/${relative(globalSkillsRoot, location).replace(/^\\.+/, \"\")}</location>`;\n\t\t}\n\t\tif (location.startsWith(projectSkillsRoot)) {\n\t\t\treturn `<location>.claude/skills/${relative(projectSkillsRoot, location).replace(/^\\.+/, \"\")}</location>`;\n\t\t}\n\t\treturn `<location>${location}</location>`;\n\t});\n}\n\nfunction extractSkillsAppend(systemPrompt: string | undefined, cwd: string): string | undefined {\n\tif (!systemPrompt) return undefined;\n\tconst marker = \"The following skills provide specialized instructions for specific tasks.\";\n\tconst start = systemPrompt.indexOf(marker);\n\tconst end = start === -1 ? -1 : systemPrompt.indexOf(\"</available_skills>\", start);\n\tif (end === -1) return undefined;\n\treturn rewriteSkillsLocations(systemPrompt.slice(start, end + \"</available_skills>\".length).trim(), cwd);\n}\n\nfunction resolveSettingSources(\n\tproviderSettings: ClaudeAgentSdkProviderSettings,\n\tappendSystemPrompt: boolean,\n\tauthLane: ClaudeAgentSdkAuthLane,\n): SettingSource[] {\n\tif (authLane !== \"ambient\") return [];\n\treturn providerSettings.settingSources ?? (appendSystemPrompt ? [] : [\"user\", \"project\"]);\n}\n\nexport function buildClaudeAgentSdkQueryOptions(input: ClaudeAgentSdkQueryOptionsInput): Options {\n\tconst cwd = input.cwd ?? process.cwd();\n\tconst providerSettings = input.providerSettings ?? loadClaudeAgentSdkProviderSettingsFromDisk(cwd);\n\tconst appendSystemPrompt = providerSettings.appendSystemPrompt !== false;\n\tconst authLane = input.authLane ?? providerSettings.tokenInjection ?? \"oauth-slots\";\n\tconst append = appendSystemPrompt\n\t\t? [extractAgentsAppend(cwd), extractSkillsAppend(input.context.systemPrompt, cwd)].filter(\n\t\t\t\t(part): part is string => part !== undefined,\n\t\t\t)\n\t\t: [];\n\tconst strictMcpConfig = providerSettings.strictMcpConfig ?? !appendSystemPrompt;\n\tconst queryOptions: Options = {\n\t\tcwd,\n\t\tmodel: input.model.id,\n\t\ttools: input.tools ? [...input.tools] : [...BUILTIN_SDK_TOOLS],\n\t\tpermissionMode: \"dontAsk\",\n\t\tincludePartialMessages: true,\n\t\tcanUseTool,\n\t\tsystemPrompt: { type: \"preset\", preset: \"claude_code\", append: append.join(\"\\n\\n\") || undefined },\n\t\tsettingSources: resolveSettingSources(providerSettings, appendSystemPrompt, authLane),\n\t};\n\tif (input.pathToClaudeCodeExecutable) queryOptions.pathToClaudeCodeExecutable = input.pathToClaudeCodeExecutable;\n\tif (strictMcpConfig) queryOptions.extraArgs = { \"strict-mcp-config\": null };\n\n\tconst reasoning = input.streamOptions?.reasoning;\n\tif (reasoning && supportsAdaptiveThinking(input.model)) {\n\t\tqueryOptions.thinking = { type: \"adaptive\", display: \"summarized\" } satisfies ThinkingConfig;\n\t\tqueryOptions.effort = mapThinkingLevelToEffort(input.model, reasoning);\n\t} else if (reasoning) {\n\t\tqueryOptions.maxThinkingTokens = mapThinkingTokens(reasoning, input.streamOptions?.thinkingBudgets);\n\t}\n\treturn queryOptions;\n}\n"]}
1
+ {"version":3,"file":"options.js","sourceRoot":"","sources":["../../../../../src/core/extensions/builtin/claude-agent-sdk/options.ts"],"names":[],"mappings":"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","sourcesContent":["import { existsSync, readFileSync } from \"node:fs\";\nimport { dirname, join, relative, resolve } from \"node:path\";\nimport type { Api, Context, Model, SimpleStreamOptions, ThinkingBudgets, ThinkingLevel } from \"@earendil-works/pi-ai\";\nimport { CONFIG_DIR_NAME, getAgentDir } from \"../../../../config.ts\";\nimport type { EffortLevel, Options, SettingSource, ThinkingConfig } from \"./sdk-boundary.ts\";\nimport {\n\ttype ClaudeAgentSdkProviderSettings,\n\ttype ClaudeAgentSdkTokenInjection,\n\tloadClaudeAgentSdkProviderSettingsFromDisk,\n} from \"./settings.ts\";\nimport { BUILTIN_SDK_TOOLS, canUseTool, HOST_TOOL_DENIAL_HOOKS } from \"./tools.ts\";\n\nexport type ClaudeAgentSdkAuthLane = ClaudeAgentSdkTokenInjection;\n\nexport interface ClaudeAgentSdkQueryOptionsInput {\n\treadonly model: Model<Api>;\n\treadonly context: Context;\n\treadonly streamOptions?: SimpleStreamOptions;\n\treadonly cwd?: string;\n\treadonly providerSettings?: ClaudeAgentSdkProviderSettings;\n\treadonly authLane?: ClaudeAgentSdkAuthLane;\n\treadonly tools?: readonly string[];\n\treadonly pathToClaudeCodeExecutable?: string;\n}\n\nconst ADAPTIVE_THINKING_MODEL_MARKERS = [\n\t\"opus-4-6\",\n\t\"opus-4.6\",\n\t\"opus-4-7\",\n\t\"opus-4.7\",\n\t\"opus-4-8\",\n\t\"opus-4.8\",\n\t\"opus-5\",\n\t\"sonnet-4-6\",\n\t\"sonnet-4.6\",\n\t\"sonnet-5\",\n\t\"fable-5\",\n\t\"mythos-5\",\n] as const;\n\nconst NATIVE_XHIGH_EFFORT_MODEL_MARKERS = [\n\t\"opus-4-7\",\n\t\"opus-4-8\",\n\t\"opus-5\",\n\t\"sonnet-5\",\n\t\"fable-5\",\n\t\"mythos-5\",\n] as const;\n\nconst DEFAULT_THINKING_BUDGETS: Required<ThinkingBudgets> = {\n\tminimal: 2048,\n\tlow: 8192,\n\tmedium: 16384,\n\thigh: 31999,\n\tmax: 63999,\n};\n\nfunction includesModelMarker(model: Model<Api>, markers: readonly string[]): boolean {\n\tconst id = model.id.toLowerCase();\n\treturn markers.some((marker) => id.includes(marker));\n}\n\nfunction forcedAdaptiveThinking(model: Model<Api>): boolean | undefined {\n\tconst compat = model.compat;\n\tif (!compat || !(\"forceAdaptiveThinking\" in compat)) return undefined;\n\treturn typeof compat.forceAdaptiveThinking === \"boolean\" ? compat.forceAdaptiveThinking : undefined;\n}\n\nfunction supportsAdaptiveThinking(model: Model<Api>): boolean {\n\treturn forcedAdaptiveThinking(model) ?? includesModelMarker(model, ADAPTIVE_THINKING_MODEL_MARKERS);\n}\n\nfunction supportsNativeXhighEffort(model: Model<Api>): boolean {\n\treturn includesModelMarker(model, NATIVE_XHIGH_EFFORT_MODEL_MARKERS);\n}\n\nfunction isEffortLevel(value: string): value is EffortLevel {\n\treturn value === \"low\" || value === \"medium\" || value === \"high\" || value === \"xhigh\" || value === \"max\";\n}\n\nfunction mapThinkingLevelToEffort(model: Model<Api>, level: ThinkingLevel): EffortLevel {\n\tconst mapped = model.thinkingLevelMap?.[level];\n\tif (typeof mapped === \"string\" && isEffortLevel(mapped)) return mapped;\n\tswitch (level) {\n\t\tcase \"minimal\":\n\t\tcase \"low\":\n\t\t\treturn \"low\";\n\t\tcase \"medium\":\n\t\t\treturn \"medium\";\n\t\tcase \"high\":\n\t\t\treturn \"high\";\n\t\tcase \"xhigh\":\n\t\t\treturn supportsNativeXhighEffort(model) ? \"xhigh\" : \"max\";\n\t\tcase \"max\":\n\t\t\treturn \"max\";\n\t}\n}\n\nfunction mapThinkingTokens(reasoning: ThinkingLevel, thinkingBudgets: ThinkingBudgets | undefined): number {\n\tconst budgetLevel = reasoning === \"xhigh\" ? \"high\" : reasoning;\n\tconst customBudget = thinkingBudgets?.[budgetLevel];\n\treturn typeof customBudget === \"number\" && Number.isFinite(customBudget) && customBudget > 0\n\t\t? customBudget\n\t\t: DEFAULT_THINKING_BUDGETS[budgetLevel];\n}\n\nfunction findAgentsMdInParents(cwd: string): string | undefined {\n\tlet current = resolve(cwd);\n\twhile (true) {\n\t\tconst candidate = join(current, \"AGENTS.md\");\n\t\tif (existsSync(candidate)) return candidate;\n\t\tconst parent = dirname(current);\n\t\tif (parent === current) return undefined;\n\t\tcurrent = parent;\n\t}\n}\n\nfunction sanitizeAgentsContent(content: string): string {\n\tconst configDirectory = CONFIG_DIR_NAME.replace(/^\\./, \"\");\n\tconst escapedConfigDirectory = configDirectory.replace(/[.*+?^${}()|[\\]\\\\]/g, \"\\\\$&\");\n\treturn content\n\t\t.replace(new RegExp(`~/${escapedConfigDirectory}\\\\b`, \"gi\"), \"~/.claude\")\n\t\t.replace(new RegExp(`(^|[\\\\s'\"\\`])\\\\.${escapedConfigDirectory}/`, \"g\"), \"$1.claude/\")\n\t\t.replace(new RegExp(`\\\\b${escapedConfigDirectory}\\\\b`, \"gi\"), \"environment\");\n}\n\nfunction extractAgentsAppend(cwd: string): string | undefined {\n\tconst agentsPath = findAgentsMdInParents(cwd) ?? join(getAgentDir(), \"AGENTS.md\");\n\tif (!existsSync(agentsPath)) return undefined;\n\ttry {\n\t\tconst content = sanitizeAgentsContent(readFileSync(agentsPath, \"utf-8\").trim());\n\t\treturn content.length > 0 ? `# CLAUDE.md\\n\\n${content}` : undefined;\n\t} catch {\n\t\treturn undefined;\n\t}\n}\n\nfunction rewriteSkillsLocations(skillsBlock: string, cwd: string): string {\n\tconst globalSkillsRoot = join(getAgentDir(), \"skills\");\n\tconst projectSkillsRoot = join(cwd, CONFIG_DIR_NAME, \"skills\");\n\treturn skillsBlock.replace(/<location>([^<]+)<\\/location>/g, (_match, location: string) => {\n\t\tif (location.startsWith(globalSkillsRoot)) {\n\t\t\treturn `<location>~/.claude/skills/${relative(globalSkillsRoot, location).replace(/^\\.+/, \"\")}</location>`;\n\t\t}\n\t\tif (location.startsWith(projectSkillsRoot)) {\n\t\t\treturn `<location>.claude/skills/${relative(projectSkillsRoot, location).replace(/^\\.+/, \"\")}</location>`;\n\t\t}\n\t\treturn `<location>${location}</location>`;\n\t});\n}\n\nfunction extractSkillsAppend(systemPrompt: string | undefined, cwd: string): string | undefined {\n\tif (!systemPrompt) return undefined;\n\tconst marker = \"The following skills provide specialized instructions for specific tasks.\";\n\tconst start = systemPrompt.indexOf(marker);\n\tconst end = start === -1 ? -1 : systemPrompt.indexOf(\"</available_skills>\", start);\n\tif (end === -1) return undefined;\n\treturn rewriteSkillsLocations(systemPrompt.slice(start, end + \"</available_skills>\".length).trim(), cwd);\n}\n\nfunction resolveSettingSources(\n\tproviderSettings: ClaudeAgentSdkProviderSettings,\n\tappendSystemPrompt: boolean,\n\tauthLane: ClaudeAgentSdkAuthLane,\n): SettingSource[] {\n\tif (authLane !== \"ambient\") return [];\n\treturn providerSettings.settingSources ?? (appendSystemPrompt ? [] : [\"user\", \"project\"]);\n}\n\nexport function buildClaudeAgentSdkQueryOptions(input: ClaudeAgentSdkQueryOptionsInput): Options {\n\tconst cwd = input.cwd ?? process.cwd();\n\tconst providerSettings = input.providerSettings ?? loadClaudeAgentSdkProviderSettingsFromDisk(cwd);\n\tconst appendSystemPrompt = providerSettings.appendSystemPrompt !== false;\n\tconst authLane = input.authLane ?? providerSettings.tokenInjection ?? \"oauth-slots\";\n\tconst append = appendSystemPrompt\n\t\t? [extractAgentsAppend(cwd), extractSkillsAppend(input.context.systemPrompt, cwd)].filter(\n\t\t\t\t(part): part is string => part !== undefined,\n\t\t\t)\n\t\t: [];\n\tconst strictMcpConfig = providerSettings.strictMcpConfig ?? !appendSystemPrompt;\n\tconst queryOptions: Options = {\n\t\tcwd,\n\t\tmodel: input.model.id,\n\t\ttools: input.tools ? [...input.tools] : [...BUILTIN_SDK_TOOLS],\n\t\tpermissionMode: \"dontAsk\",\n\t\tincludePartialMessages: true,\n\t\tcanUseTool,\n\t\thooks: HOST_TOOL_DENIAL_HOOKS,\n\t\tsystemPrompt: { type: \"preset\", preset: \"claude_code\", append: append.join(\"\\n\\n\") || undefined },\n\t\tsettingSources: resolveSettingSources(providerSettings, appendSystemPrompt, authLane),\n\t};\n\tif (input.pathToClaudeCodeExecutable) queryOptions.pathToClaudeCodeExecutable = input.pathToClaudeCodeExecutable;\n\tif (strictMcpConfig) queryOptions.extraArgs = { \"strict-mcp-config\": null };\n\n\tconst reasoning = input.streamOptions?.reasoning;\n\tif (reasoning && supportsAdaptiveThinking(input.model)) {\n\t\tqueryOptions.thinking = { type: \"adaptive\", display: \"summarized\" } satisfies ThinkingConfig;\n\t\tqueryOptions.effort = mapThinkingLevelToEffort(input.model, reasoning);\n\t} else if (reasoning) {\n\t\tqueryOptions.maxThinkingTokens = mapThinkingTokens(reasoning, input.streamOptions?.thinkingBudgets);\n\t}\n\treturn queryOptions;\n}\n"]}
@@ -4,8 +4,11 @@ export declare const SDK_TO_PI_TOOL_NAME: Readonly<Record<string, string>>;
4
4
  export declare const PI_TO_SDK_TOOL_NAME: Readonly<Record<string, string>>;
5
5
  export declare const BUILTIN_SDK_TOOLS: readonly ["Read", "Write", "Edit", "Bash", "Grep", "Glob"];
6
6
  export declare const TOOL_EXECUTION_DENIED_MESSAGE = "Tool execution is unavailable in this environment.";
7
+ export declare const HOST_TOOL_EXECUTION_DENIED_MESSAGE = "This tool call is captured and executed by the host. Do not retry with other tools; end the turn.";
7
8
  export declare const CUSTOM_TOOLS_MCP_SERVER_NAME = "custom-tools";
8
9
  export declare const CUSTOM_TOOLS_MCP_PREFIX = "mcp__custom-tools__";
10
+ export declare const HOST_CAPTURED_SDK_TOOL_MATCHER = "Bash|Write|Edit|Read|Grep|Glob|mcp__custom-tools__.*";
11
+ export declare const HOST_TOOL_DENIAL_HOOKS: NonNullable<Options["hooks"]>;
9
12
  export type ResolvedSdkTools = {
10
13
  sdkTools: string[];
11
14
  customTools: Tool[];
@@ -1 +1 @@
1
- {"version":3,"file":"tools.d.ts","sourceRoot":"","sources":["../../../../../src/core/extensions/builtin/claude-agent-sdk/tools.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,uBAAuB,CAAC;AAC3D,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,mBAAmB,CAAC;AAEjD,eAAO,MAAM,mBAAmB,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAOhE,CAAC;AAEF,eAAO,MAAM,mBAAmB,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAQhE,CAAC;AAEF,eAAO,MAAM,iBAAiB,YAAI,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,CAAU,CAAC;AAC5F,eAAO,MAAM,6BAA6B,uDAAuD,CAAC;AAClG,eAAO,MAAM,4BAA4B,iBAAiB,CAAC;AAC3D,eAAO,MAAM,uBAAuB,wBAA2C,CAAC;AAEhF,MAAM,MAAM,gBAAgB,GAAG;IAC9B,QAAQ,EAAE,MAAM,EAAE,CAAC;IACnB,WAAW,EAAE,IAAI,EAAE,CAAC;IACpB,mBAAmB,EAAE,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACzC,kBAAkB,EAAE,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;CACxC,CAAC;AAUF,wBAAgB,kBAAkB,CAAC,IAAI,EAAE,MAAM,EAAE,mBAAmB,CAAC,EAAE,WAAW,CAAC,MAAM,EAAE,MAAM,CAAC,GAAG,MAAM,CAQ1G;AAED,wBAAgB,kBAAkB,CAAC,IAAI,EAAE,MAAM,EAAE,kBAAkB,CAAC,EAAE,WAAW,CAAC,MAAM,EAAE,MAAM,CAAC,GAAG,MAAM,CAQzG;AAED,qFAAqF;AACrF,wBAAgB,WAAW,CAC1B,QAAQ,EAAE,MAAM,EAChB,IAAI,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,GAAG,SAAS,GACjD,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAuCzB;AAED,wBAAgB,eAAe,CAAC,OAAO,EAAE,OAAO,GAAG,gBAAgB,CA6BlE;AAED,eAAO,MAAM,UAAU,EAAE,WAAW,CAAC,OAAO,CAAC,YAAY,CAAC,CAGxD,CAAC"}
1
+ {"version":3,"file":"tools.d.ts","sourceRoot":"","sources":["../../../../../src/core/extensions/builtin/claude-agent-sdk/tools.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,uBAAuB,CAAC;AAC3D,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,mBAAmB,CAAC;AAEjD,eAAO,MAAM,mBAAmB,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAOhE,CAAC;AAEF,eAAO,MAAM,mBAAmB,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAQhE,CAAC;AAEF,eAAO,MAAM,iBAAiB,YAAI,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,CAAU,CAAC;AAC5F,eAAO,MAAM,6BAA6B,uDAAuD,CAAC;AAClG,eAAO,MAAM,kCAAkC,sGACqD,CAAC;AACrG,eAAO,MAAM,4BAA4B,iBAAiB,CAAC;AAC3D,eAAO,MAAM,uBAAuB,wBAA2C,CAAC;AAChF,eAAO,MAAM,8BAA8B,yDAAyD,CAAC;AACrG,eAAO,MAAM,sBAAsB,EAAE,WAAW,CAAC,OAAO,CAAC,OAAO,CAAC,CAgBhE,CAAC;AAEF,MAAM,MAAM,gBAAgB,GAAG;IAC9B,QAAQ,EAAE,MAAM,EAAE,CAAC;IACnB,WAAW,EAAE,IAAI,EAAE,CAAC;IACpB,mBAAmB,EAAE,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACzC,kBAAkB,EAAE,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;CACxC,CAAC;AAUF,wBAAgB,kBAAkB,CAAC,IAAI,EAAE,MAAM,EAAE,mBAAmB,CAAC,EAAE,WAAW,CAAC,MAAM,EAAE,MAAM,CAAC,GAAG,MAAM,CAQ1G;AAED,wBAAgB,kBAAkB,CAAC,IAAI,EAAE,MAAM,EAAE,kBAAkB,CAAC,EAAE,WAAW,CAAC,MAAM,EAAE,MAAM,CAAC,GAAG,MAAM,CAQzG;AAED,qFAAqF;AACrF,wBAAgB,WAAW,CAC1B,QAAQ,EAAE,MAAM,EAChB,IAAI,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,GAAG,SAAS,GACjD,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAuCzB;AAED,wBAAgB,eAAe,CAAC,OAAO,EAAE,OAAO,GAAG,gBAAgB,CA6BlE;AAED,eAAO,MAAM,UAAU,EAAE,WAAW,CAAC,OAAO,CAAC,YAAY,CAAC,CAGxD,CAAC"}
@@ -17,8 +17,27 @@ export const PI_TO_SDK_TOOL_NAME = {
17
17
  };
18
18
  export const BUILTIN_SDK_TOOLS = ["Read", "Write", "Edit", "Bash", "Grep", "Glob"];
19
19
  export const TOOL_EXECUTION_DENIED_MESSAGE = "Tool execution is unavailable in this environment.";
20
+ export const HOST_TOOL_EXECUTION_DENIED_MESSAGE = "This tool call is captured and executed by the host. Do not retry with other tools; end the turn.";
20
21
  export const CUSTOM_TOOLS_MCP_SERVER_NAME = "custom-tools";
21
22
  export const CUSTOM_TOOLS_MCP_PREFIX = `mcp__${CUSTOM_TOOLS_MCP_SERVER_NAME}__`;
23
+ export const HOST_CAPTURED_SDK_TOOL_MATCHER = "Bash|Write|Edit|Read|Grep|Glob|mcp__custom-tools__.*";
24
+ export const HOST_TOOL_DENIAL_HOOKS = {
25
+ PreToolUse: [
26
+ {
27
+ matcher: HOST_CAPTURED_SDK_TOOL_MATCHER,
28
+ hooks: [
29
+ async () => ({
30
+ continue: false,
31
+ hookSpecificOutput: {
32
+ hookEventName: "PreToolUse",
33
+ permissionDecision: "deny",
34
+ permissionDecisionReason: HOST_TOOL_EXECUTION_DENIED_MESSAGE,
35
+ },
36
+ }),
37
+ ],
38
+ },
39
+ ],
40
+ };
22
41
  function pascalCase(value) {
23
42
  return value
24
43
  .split(/[^a-zA-Z0-9]+/)
@@ -1 +1 @@
1
- {"version":3,"file":"tools.js","sourceRoot":"","sources":["../../../../../src/core/extensions/builtin/claude-agent-sdk/tools.ts"],"names":[],"mappings":"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","sourcesContent":["import type { Context, Tool } from \"@earendil-works/pi-ai\";\nimport type { Options } from \"./sdk-boundary.ts\";\n\nexport const SDK_TO_PI_TOOL_NAME: Readonly<Record<string, string>> = {\n\tread: \"read\",\n\twrite: \"write\",\n\tedit: \"edit\",\n\tbash: \"bash\",\n\tgrep: \"grep\",\n\tglob: \"find\",\n};\n\nexport const PI_TO_SDK_TOOL_NAME: Readonly<Record<string, string>> = {\n\tread: \"Read\",\n\twrite: \"Write\",\n\tedit: \"Edit\",\n\tbash: \"Bash\",\n\tgrep: \"Grep\",\n\tfind: \"Glob\",\n\tglob: \"Glob\",\n};\n\nexport const BUILTIN_SDK_TOOLS = [\"Read\", \"Write\", \"Edit\", \"Bash\", \"Grep\", \"Glob\"] as const;\nexport const TOOL_EXECUTION_DENIED_MESSAGE = \"Tool execution is unavailable in this environment.\";\nexport const CUSTOM_TOOLS_MCP_SERVER_NAME = \"custom-tools\";\nexport const CUSTOM_TOOLS_MCP_PREFIX = `mcp__${CUSTOM_TOOLS_MCP_SERVER_NAME}__`;\n\nexport type ResolvedSdkTools = {\n\tsdkTools: string[];\n\tcustomTools: Tool[];\n\tcustomToolNameToSdk: Map<string, string>;\n\tcustomToolNameToPi: Map<string, string>;\n};\n\nfunction pascalCase(value: string): string {\n\treturn value\n\t\t.split(/[^a-zA-Z0-9]+/)\n\t\t.filter(Boolean)\n\t\t.map((part) => `${part[0]?.toUpperCase() ?? \"\"}${part.slice(1)}`)\n\t\t.join(\"\");\n}\n\nexport function mapPiToolNameToSdk(name: string, customToolNameToSdk?: ReadonlyMap<string, string>): string {\n\tconst normalized = name.toLowerCase();\n\treturn (\n\t\tcustomToolNameToSdk?.get(name) ??\n\t\tcustomToolNameToSdk?.get(normalized) ??\n\t\tPI_TO_SDK_TOOL_NAME[normalized] ??\n\t\tpascalCase(name)\n\t);\n}\n\nexport function mapSdkToolNameToPi(name: string, customToolNameToPi?: ReadonlyMap<string, string>): string {\n\tconst normalized = name.toLowerCase();\n\treturn (\n\t\tSDK_TO_PI_TOOL_NAME[normalized] ??\n\t\tcustomToolNameToPi?.get(name) ??\n\t\tcustomToolNameToPi?.get(normalized) ??\n\t\t(normalized.startsWith(CUSTOM_TOOLS_MCP_PREFIX) ? name.slice(CUSTOM_TOOLS_MCP_PREFIX.length) : name)\n\t);\n}\n\n/** Translate Claude Code's built-in-tool inputs into senpi's active tool schemas. */\nexport function mapToolArgs(\n\ttoolName: string,\n\targs: Readonly<Record<string, unknown>> | undefined,\n): Record<string, unknown> {\n\tconst input = args ?? {};\n\tswitch (toolName.toLowerCase()) {\n\t\tcase \"read\":\n\t\t\treturn { path: input.file_path ?? input.path, offset: input.offset, limit: input.limit };\n\t\tcase \"write\":\n\t\t\treturn { path: input.file_path ?? input.path, content: input.content };\n\t\tcase \"edit\":\n\t\t\treturn {\n\t\t\t\tpath: input.file_path ?? input.path,\n\t\t\t\tedits: Array.isArray(input.edits)\n\t\t\t\t\t? input.edits\n\t\t\t\t\t: [\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\toldText: input.old_string ?? input.oldText ?? input.old_text,\n\t\t\t\t\t\t\t\tnewText: input.new_string ?? input.newText ?? input.new_text,\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t],\n\t\t\t};\n\t\tcase \"bash\":\n\t\t\treturn {\n\t\t\t\tcommand: input.command,\n\t\t\t\ttimeout: typeof input.timeout === \"number\" ? input.timeout / 1_000 : input.timeout,\n\t\t\t};\n\t\tcase \"grep\":\n\t\t\treturn {\n\t\t\t\tpattern: input.pattern,\n\t\t\t\tpath: input.path,\n\t\t\t\tglob: input.glob,\n\t\t\t\tignoreCase: input[\"-i\"] ?? input.ignoreCase,\n\t\t\t\tcontext: input.context ?? input[\"-C\"],\n\t\t\t\tlimit: input.head_limit ?? input.limit,\n\t\t\t};\n\t\tcase \"glob\":\n\t\tcase \"find\":\n\t\t\treturn { pattern: input.pattern, path: input.path, limit: input.limit };\n\t\tdefault:\n\t\t\treturn { ...input };\n\t}\n}\n\nexport function resolveSdkTools(context: Context): ResolvedSdkTools {\n\tif (!context.tools) {\n\t\treturn {\n\t\t\tsdkTools: [...BUILTIN_SDK_TOOLS],\n\t\t\tcustomTools: [],\n\t\t\tcustomToolNameToSdk: new Map(),\n\t\t\tcustomToolNameToPi: new Map(),\n\t\t};\n\t}\n\n\tconst sdkTools = new Set<string>();\n\tconst customTools: Tool[] = [];\n\tconst customToolNameToSdk = new Map<string, string>();\n\tconst customToolNameToPi = new Map<string, string>();\n\tfor (const tool of context.tools) {\n\t\tconst normalized = tool.name.toLowerCase();\n\t\tconst sdkName = PI_TO_SDK_TOOL_NAME[normalized];\n\t\tif (sdkName) {\n\t\t\tsdkTools.add(sdkName);\n\t\t\tcontinue;\n\t\t}\n\t\tconst customSdkName = `${CUSTOM_TOOLS_MCP_PREFIX}${tool.name}`;\n\t\tcustomTools.push(tool);\n\t\tcustomToolNameToSdk.set(tool.name, customSdkName);\n\t\tcustomToolNameToSdk.set(normalized, customSdkName);\n\t\tcustomToolNameToPi.set(customSdkName, tool.name);\n\t\tcustomToolNameToPi.set(customSdkName.toLowerCase(), tool.name);\n\t}\n\treturn { sdkTools: [...sdkTools], customTools, customToolNameToSdk, customToolNameToPi };\n}\n\nexport const canUseTool: NonNullable<Options[\"canUseTool\"]> = async () => ({\n\tbehavior: \"deny\",\n\tmessage: TOOL_EXECUTION_DENIED_MESSAGE,\n});\n"]}
1
+ {"version":3,"file":"tools.js","sourceRoot":"","sources":["../../../../../src/core/extensions/builtin/claude-agent-sdk/tools.ts"],"names":[],"mappings":"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","sourcesContent":["import type { Context, Tool } from \"@earendil-works/pi-ai\";\nimport type { Options } from \"./sdk-boundary.ts\";\n\nexport const SDK_TO_PI_TOOL_NAME: Readonly<Record<string, string>> = {\n\tread: \"read\",\n\twrite: \"write\",\n\tedit: \"edit\",\n\tbash: \"bash\",\n\tgrep: \"grep\",\n\tglob: \"find\",\n};\n\nexport const PI_TO_SDK_TOOL_NAME: Readonly<Record<string, string>> = {\n\tread: \"Read\",\n\twrite: \"Write\",\n\tedit: \"Edit\",\n\tbash: \"Bash\",\n\tgrep: \"Grep\",\n\tfind: \"Glob\",\n\tglob: \"Glob\",\n};\n\nexport const BUILTIN_SDK_TOOLS = [\"Read\", \"Write\", \"Edit\", \"Bash\", \"Grep\", \"Glob\"] as const;\nexport const TOOL_EXECUTION_DENIED_MESSAGE = \"Tool execution is unavailable in this environment.\";\nexport const HOST_TOOL_EXECUTION_DENIED_MESSAGE =\n\t\"This tool call is captured and executed by the host. Do not retry with other tools; end the turn.\";\nexport const CUSTOM_TOOLS_MCP_SERVER_NAME = \"custom-tools\";\nexport const CUSTOM_TOOLS_MCP_PREFIX = `mcp__${CUSTOM_TOOLS_MCP_SERVER_NAME}__`;\nexport const HOST_CAPTURED_SDK_TOOL_MATCHER = \"Bash|Write|Edit|Read|Grep|Glob|mcp__custom-tools__.*\";\nexport const HOST_TOOL_DENIAL_HOOKS: NonNullable<Options[\"hooks\"]> = {\n\tPreToolUse: [\n\t\t{\n\t\t\tmatcher: HOST_CAPTURED_SDK_TOOL_MATCHER,\n\t\t\thooks: [\n\t\t\t\tasync () => ({\n\t\t\t\t\tcontinue: false,\n\t\t\t\t\thookSpecificOutput: {\n\t\t\t\t\t\thookEventName: \"PreToolUse\",\n\t\t\t\t\t\tpermissionDecision: \"deny\",\n\t\t\t\t\t\tpermissionDecisionReason: HOST_TOOL_EXECUTION_DENIED_MESSAGE,\n\t\t\t\t\t},\n\t\t\t\t}),\n\t\t\t],\n\t\t},\n\t],\n};\n\nexport type ResolvedSdkTools = {\n\tsdkTools: string[];\n\tcustomTools: Tool[];\n\tcustomToolNameToSdk: Map<string, string>;\n\tcustomToolNameToPi: Map<string, string>;\n};\n\nfunction pascalCase(value: string): string {\n\treturn value\n\t\t.split(/[^a-zA-Z0-9]+/)\n\t\t.filter(Boolean)\n\t\t.map((part) => `${part[0]?.toUpperCase() ?? \"\"}${part.slice(1)}`)\n\t\t.join(\"\");\n}\n\nexport function mapPiToolNameToSdk(name: string, customToolNameToSdk?: ReadonlyMap<string, string>): string {\n\tconst normalized = name.toLowerCase();\n\treturn (\n\t\tcustomToolNameToSdk?.get(name) ??\n\t\tcustomToolNameToSdk?.get(normalized) ??\n\t\tPI_TO_SDK_TOOL_NAME[normalized] ??\n\t\tpascalCase(name)\n\t);\n}\n\nexport function mapSdkToolNameToPi(name: string, customToolNameToPi?: ReadonlyMap<string, string>): string {\n\tconst normalized = name.toLowerCase();\n\treturn (\n\t\tSDK_TO_PI_TOOL_NAME[normalized] ??\n\t\tcustomToolNameToPi?.get(name) ??\n\t\tcustomToolNameToPi?.get(normalized) ??\n\t\t(normalized.startsWith(CUSTOM_TOOLS_MCP_PREFIX) ? name.slice(CUSTOM_TOOLS_MCP_PREFIX.length) : name)\n\t);\n}\n\n/** Translate Claude Code's built-in-tool inputs into senpi's active tool schemas. */\nexport function mapToolArgs(\n\ttoolName: string,\n\targs: Readonly<Record<string, unknown>> | undefined,\n): Record<string, unknown> {\n\tconst input = args ?? {};\n\tswitch (toolName.toLowerCase()) {\n\t\tcase \"read\":\n\t\t\treturn { path: input.file_path ?? input.path, offset: input.offset, limit: input.limit };\n\t\tcase \"write\":\n\t\t\treturn { path: input.file_path ?? input.path, content: input.content };\n\t\tcase \"edit\":\n\t\t\treturn {\n\t\t\t\tpath: input.file_path ?? input.path,\n\t\t\t\tedits: Array.isArray(input.edits)\n\t\t\t\t\t? input.edits\n\t\t\t\t\t: [\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\toldText: input.old_string ?? input.oldText ?? input.old_text,\n\t\t\t\t\t\t\t\tnewText: input.new_string ?? input.newText ?? input.new_text,\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t],\n\t\t\t};\n\t\tcase \"bash\":\n\t\t\treturn {\n\t\t\t\tcommand: input.command,\n\t\t\t\ttimeout: typeof input.timeout === \"number\" ? input.timeout / 1_000 : input.timeout,\n\t\t\t};\n\t\tcase \"grep\":\n\t\t\treturn {\n\t\t\t\tpattern: input.pattern,\n\t\t\t\tpath: input.path,\n\t\t\t\tglob: input.glob,\n\t\t\t\tignoreCase: input[\"-i\"] ?? input.ignoreCase,\n\t\t\t\tcontext: input.context ?? input[\"-C\"],\n\t\t\t\tlimit: input.head_limit ?? input.limit,\n\t\t\t};\n\t\tcase \"glob\":\n\t\tcase \"find\":\n\t\t\treturn { pattern: input.pattern, path: input.path, limit: input.limit };\n\t\tdefault:\n\t\t\treturn { ...input };\n\t}\n}\n\nexport function resolveSdkTools(context: Context): ResolvedSdkTools {\n\tif (!context.tools) {\n\t\treturn {\n\t\t\tsdkTools: [...BUILTIN_SDK_TOOLS],\n\t\t\tcustomTools: [],\n\t\t\tcustomToolNameToSdk: new Map(),\n\t\t\tcustomToolNameToPi: new Map(),\n\t\t};\n\t}\n\n\tconst sdkTools = new Set<string>();\n\tconst customTools: Tool[] = [];\n\tconst customToolNameToSdk = new Map<string, string>();\n\tconst customToolNameToPi = new Map<string, string>();\n\tfor (const tool of context.tools) {\n\t\tconst normalized = tool.name.toLowerCase();\n\t\tconst sdkName = PI_TO_SDK_TOOL_NAME[normalized];\n\t\tif (sdkName) {\n\t\t\tsdkTools.add(sdkName);\n\t\t\tcontinue;\n\t\t}\n\t\tconst customSdkName = `${CUSTOM_TOOLS_MCP_PREFIX}${tool.name}`;\n\t\tcustomTools.push(tool);\n\t\tcustomToolNameToSdk.set(tool.name, customSdkName);\n\t\tcustomToolNameToSdk.set(normalized, customSdkName);\n\t\tcustomToolNameToPi.set(customSdkName, tool.name);\n\t\tcustomToolNameToPi.set(customSdkName.toLowerCase(), tool.name);\n\t}\n\treturn { sdkTools: [...sdkTools], customTools, customToolNameToSdk, customToolNameToPi };\n}\n\nexport const canUseTool: NonNullable<Options[\"canUseTool\"]> = async () => ({\n\tbehavior: \"deny\",\n\tmessage: TOOL_EXECUTION_DENIED_MESSAGE,\n});\n"]}
@@ -1,3 +1,4 @@
1
+ export { createFsWatchEventSource } from "./watch-event-source.ts";
1
2
  export type WatchTarget = {
2
3
  readonly id: string;
3
4
  readonly kind: "dir" | "dir-recursive";
@@ -38,6 +39,4 @@ export declare class ConfigReloadWatchEngine {
38
39
  close(): void;
39
40
  getBaselineSnapshot(): ReadonlyMap<string, string>;
40
41
  }
41
- /** Production event source. Tests inject a deterministic source instead. */
42
- export declare function createFsWatchEventSource(onError?: (error: unknown, path: string) => void): WatchEventSource;
43
42
  //# sourceMappingURL=watch-engine.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"watch-engine.d.ts","sourceRoot":"","sources":["../../../../../src/core/extensions/builtin/config-reload/watch-engine.ts"],"names":[],"mappings":"AAKA,MAAM,MAAM,WAAW,GAAG;IACzB,QAAQ,CAAC,EAAE,EAAE,MAAM,CAAC;IACpB,QAAQ,CAAC,IAAI,EAAE,KAAK,GAAG,eAAe,CAAC;IACvC,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,SAAS,CAAC,EAAE,SAAS,MAAM,EAAE,CAAC;IACvC,QAAQ,CAAC,MAAM,CAAC,EAAE,CAAC,OAAO,EAAE,MAAM,KAAK,OAAO,CAAC;CAC/C,CAAC;AAEF,MAAM,MAAM,kBAAkB,GAAG,CAAC,SAAS,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,IAAI,KAAK,IAAI,CAAC;AAEtF,MAAM,MAAM,gBAAgB,GAAG,CAC9B,IAAI,EAAE,MAAM,EACZ,QAAQ,EAAE,kBAAkB,EAC5B,OAAO,CAAC,EAAE;IAAE,QAAQ,CAAC,SAAS,EAAE,OAAO,CAAA;CAAE,KACrC,MAAM,IAAI,CAAC;AAEhB,MAAM,MAAM,UAAU,GAAG;IACxB,UAAU,CAAC,QAAQ,EAAE,MAAM,IAAI,EAAE,OAAO,EAAE,MAAM,GAAG,UAAU,CAAC,OAAO,UAAU,CAAC,CAAC;IACjF,YAAY,CAAC,KAAK,EAAE,UAAU,CAAC,OAAO,UAAU,CAAC,GAAG,IAAI,CAAC;CACzD,CAAC;AAEF,MAAM,MAAM,UAAU,GAAG;IACxB,QAAQ,CAAC,YAAY,EAAE,SAAS,MAAM,EAAE,CAAC;IACzC,QAAQ,CAAC,OAAO,EAAE,SAAS,MAAM,EAAE,CAAC;IACpC,QAAQ,CAAC,OAAO,EAAE,SAAS,MAAM,EAAE,CAAC;CACpC,CAAC;AAEF,MAAM,MAAM,8BAA8B,GAAG;IAC5C,QAAQ,CAAC,OAAO,EAAE,SAAS,WAAW,EAAE,CAAC;IACzC,QAAQ,CAAC,SAAS,EAAE,gBAAgB,CAAC;IACrC,QAAQ,CAAC,YAAY,EAAE,CAAC,MAAM,EAAE,UAAU,KAAK,IAAI,CAAC;IACpD,QAAQ,CAAC,OAAO,CAAC,EAAE,CAAC,KAAK,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,KAAK,IAAI,CAAC;IAC1D,QAAQ,CAAC,UAAU,CAAC,EAAE,MAAM,CAAC;IAC7B,QAAQ,CAAC,KAAK,CAAC,EAAE,UAAU,CAAC;IAC5B,+DAA+D;IAC/D,QAAQ,CAAC,QAAQ,CAAC,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,MAAM,CAAC;CAC7C,CAAC;AAqBF;;;GAGG;AACH,qBAAa,uBAAuB;;IAanC,YAAY,OAAO,EAAE,8BAA8B,EAgClD;IAED,KAAK,IAAI,IAAI,CAgBZ;IAED,mBAAmB,IAAI,WAAW,CAAC,MAAM,EAAE,MAAM,CAAC,CAQjD;CAkOD;AAED,4EAA4E;AAC5E,wBAAgB,wBAAwB,CAAC,OAAO,GAAE,CAAC,KAAK,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,KAAK,IAAe,GAAG,gBAAgB,CAUrH"}
1
+ {"version":3,"file":"watch-engine.d.ts","sourceRoot":"","sources":["../../../../../src/core/extensions/builtin/config-reload/watch-engine.ts"],"names":[],"mappings":"AAIA,OAAO,EAAE,wBAAwB,EAAE,MAAM,yBAAyB,CAAC;AAEnE,MAAM,MAAM,WAAW,GAAG;IACzB,QAAQ,CAAC,EAAE,EAAE,MAAM,CAAC;IACpB,QAAQ,CAAC,IAAI,EAAE,KAAK,GAAG,eAAe,CAAC;IACvC,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,SAAS,CAAC,EAAE,SAAS,MAAM,EAAE,CAAC;IACvC,QAAQ,CAAC,MAAM,CAAC,EAAE,CAAC,OAAO,EAAE,MAAM,KAAK,OAAO,CAAC;CAC/C,CAAC;AAEF,MAAM,MAAM,kBAAkB,GAAG,CAAC,SAAS,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,IAAI,KAAK,IAAI,CAAC;AAEtF,MAAM,MAAM,gBAAgB,GAAG,CAC9B,IAAI,EAAE,MAAM,EACZ,QAAQ,EAAE,kBAAkB,EAC5B,OAAO,CAAC,EAAE;IAAE,QAAQ,CAAC,SAAS,EAAE,OAAO,CAAA;CAAE,KACrC,MAAM,IAAI,CAAC;AAEhB,MAAM,MAAM,UAAU,GAAG;IACxB,UAAU,CAAC,QAAQ,EAAE,MAAM,IAAI,EAAE,OAAO,EAAE,MAAM,GAAG,UAAU,CAAC,OAAO,UAAU,CAAC,CAAC;IACjF,YAAY,CAAC,KAAK,EAAE,UAAU,CAAC,OAAO,UAAU,CAAC,GAAG,IAAI,CAAC;CACzD,CAAC;AAEF,MAAM,MAAM,UAAU,GAAG;IACxB,QAAQ,CAAC,YAAY,EAAE,SAAS,MAAM,EAAE,CAAC;IACzC,QAAQ,CAAC,OAAO,EAAE,SAAS,MAAM,EAAE,CAAC;IACpC,QAAQ,CAAC,OAAO,EAAE,SAAS,MAAM,EAAE,CAAC;CACpC,CAAC;AAEF,MAAM,MAAM,8BAA8B,GAAG;IAC5C,QAAQ,CAAC,OAAO,EAAE,SAAS,WAAW,EAAE,CAAC;IACzC,QAAQ,CAAC,SAAS,EAAE,gBAAgB,CAAC;IACrC,QAAQ,CAAC,YAAY,EAAE,CAAC,MAAM,EAAE,UAAU,KAAK,IAAI,CAAC;IACpD,QAAQ,CAAC,OAAO,CAAC,EAAE,CAAC,KAAK,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,KAAK,IAAI,CAAC;IAC1D,QAAQ,CAAC,UAAU,CAAC,EAAE,MAAM,CAAC;IAC7B,QAAQ,CAAC,KAAK,CAAC,EAAE,UAAU,CAAC;IAC5B,+DAA+D;IAC/D,QAAQ,CAAC,QAAQ,CAAC,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,MAAM,CAAC;CAC7C,CAAC;AAqBF;;;GAGG;AACH,qBAAa,uBAAuB;;IAanC,YAAY,OAAO,EAAE,8BAA8B,EAgClD;IAED,KAAK,IAAI,IAAI,CAgBZ;IAED,mBAAmB,IAAI,WAAW,CAAC,MAAM,EAAE,MAAM,CAAC,CAQjD;CAkOD"}
@@ -1,7 +1,7 @@
1
1
  import { createHash } from "node:crypto";
2
2
  import { lstatSync, readdirSync, readFileSync } from "node:fs";
3
3
  import { basename, isAbsolute, join, normalize, resolve, sep } from "node:path";
4
- import { watchWithErrorHandler } from "../../../../utils/fs-watch.js";
4
+ export { createFsWatchEventSource } from "./watch-event-source.js";
5
5
  const DEFAULT_DEBOUNCE_MS = 200;
6
6
  const DEFAULT_CLOCK = {
7
7
  setTimeout: (callback, delayMs) => setTimeout(callback, delayMs),
@@ -272,13 +272,6 @@ export class ConfigReloadWatchEngine {
272
272
  }
273
273
  }
274
274
  }
275
- /** Production event source. Tests inject a deterministic source instead. */
276
- export function createFsWatchEventSource(onError = () => { }) {
277
- return (path, listener, options) => {
278
- const watcher = watchWithErrorHandler(path, listener, () => onError(new Error(`fs.watch failed for ${path}`), path), { recursive: options?.recursive ?? false });
279
- return () => watcher?.close();
280
- };
281
- }
282
275
  function hashFile(path) {
283
276
  return createHash("sha256").update(readFileSync(path)).digest("hex");
284
277
  }