@code-yeongyu/senpi 2026.9.3-2 → 2026.9.3-3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (90) hide show
  1. package/CHANGELOG.md +31 -0
  2. package/dist/core/extensions/builtin/claude-sdk-oauth/auth-lane.d.ts.map +1 -1
  3. package/dist/core/extensions/builtin/claude-sdk-oauth/auth-lane.js +6 -1
  4. package/dist/core/extensions/builtin/claude-sdk-oauth/auth-lane.js.map +1 -1
  5. package/dist/core/extensions/builtin/claude-sdk-oauth/errors.d.ts +1 -1
  6. package/dist/core/extensions/builtin/claude-sdk-oauth/errors.d.ts.map +1 -1
  7. package/dist/core/extensions/builtin/claude-sdk-oauth/errors.js +6 -0
  8. package/dist/core/extensions/builtin/claude-sdk-oauth/errors.js.map +1 -1
  9. package/dist/core/extensions/builtin/claude-sdk-oauth/guidance.d.ts.map +1 -1
  10. package/dist/core/extensions/builtin/claude-sdk-oauth/guidance.js +2 -0
  11. package/dist/core/extensions/builtin/claude-sdk-oauth/guidance.js.map +1 -1
  12. package/dist/core/extensions/builtin/claude-sdk-oauth/session-binding.d.ts +2 -2
  13. package/dist/core/extensions/builtin/claude-sdk-oauth/session-binding.d.ts.map +1 -1
  14. package/dist/core/extensions/builtin/claude-sdk-oauth/session-binding.js +30 -24
  15. package/dist/core/extensions/builtin/claude-sdk-oauth/session-binding.js.map +1 -1
  16. package/dist/core/extensions/builtin/claude-sdk-oauth/session-registry-wiring.d.ts.map +1 -1
  17. package/dist/core/extensions/builtin/claude-sdk-oauth/session-registry-wiring.js +31 -13
  18. package/dist/core/extensions/builtin/claude-sdk-oauth/session-registry-wiring.js.map +1 -1
  19. package/dist/core/extensions/builtin/claude-sdk-oauth/session-sync.d.ts.map +1 -1
  20. package/dist/core/extensions/builtin/claude-sdk-oauth/session-sync.js +1 -0
  21. package/dist/core/extensions/builtin/claude-sdk-oauth/session-sync.js.map +1 -1
  22. package/dist/core/extensions/builtin/claude-sdk-oauth/stream-protocol.d.ts +1 -1
  23. package/dist/core/extensions/builtin/claude-sdk-oauth/stream-protocol.d.ts.map +1 -1
  24. package/dist/core/extensions/builtin/claude-sdk-oauth/tools.d.ts +11 -3
  25. package/dist/core/extensions/builtin/claude-sdk-oauth/tools.d.ts.map +1 -1
  26. package/dist/core/extensions/builtin/claude-sdk-oauth/tools.js +12 -3
  27. package/dist/core/extensions/builtin/claude-sdk-oauth/tools.js.map +1 -1
  28. package/dist/core/extensions/builtin/gpt-account.d.ts +3 -0
  29. package/dist/core/extensions/builtin/gpt-account.d.ts.map +1 -0
  30. package/dist/core/extensions/builtin/gpt-account.js +115 -0
  31. package/dist/core/extensions/builtin/gpt-account.js.map +1 -0
  32. package/dist/core/extensions/builtin/index.d.ts.map +1 -1
  33. package/dist/core/extensions/builtin/index.js +2 -0
  34. package/dist/core/extensions/builtin/index.js.map +1 -1
  35. package/dist/modes/print-mode.d.ts.map +1 -1
  36. package/dist/modes/print-mode.js +9 -0
  37. package/dist/modes/print-mode.js.map +1 -1
  38. package/dist/modes/rpc/connection-handler.d.ts +2 -0
  39. package/dist/modes/rpc/connection-handler.d.ts.map +1 -1
  40. package/dist/modes/rpc/connection-handler.js +58 -2
  41. package/dist/modes/rpc/connection-handler.js.map +1 -1
  42. package/dist/modes/rpc/custom-capability.d.ts +5 -0
  43. package/dist/modes/rpc/custom-capability.d.ts.map +1 -1
  44. package/dist/modes/rpc/custom-capability.js +5 -0
  45. package/dist/modes/rpc/custom-capability.js.map +1 -1
  46. package/dist/modes/rpc/media-placeholders.d.ts +49 -0
  47. package/dist/modes/rpc/media-placeholders.d.ts.map +1 -0
  48. package/dist/modes/rpc/media-placeholders.js +151 -0
  49. package/dist/modes/rpc/media-placeholders.js.map +1 -0
  50. package/dist/modes/rpc/multi-session-host.js +3 -0
  51. package/dist/modes/rpc/multi-session-host.js.map +1 -1
  52. package/dist/modes/rpc/rpc-client.d.ts +8 -0
  53. package/dist/modes/rpc/rpc-client.d.ts.map +1 -1
  54. package/dist/modes/rpc/rpc-client.js +11 -0
  55. package/dist/modes/rpc/rpc-client.js.map +1 -1
  56. package/dist/modes/rpc/rpc-types.d.ts +23 -1
  57. package/dist/modes/rpc/rpc-types.d.ts.map +1 -1
  58. package/dist/modes/rpc/rpc-types.js +1 -0
  59. package/dist/modes/rpc/rpc-types.js.map +1 -1
  60. package/dist/modes/rpc/session-command-router.d.ts.map +1 -1
  61. package/dist/modes/rpc/session-command-router.js +2 -1
  62. package/dist/modes/rpc/session-command-router.js.map +1 -1
  63. package/dist/modes/rpc/session-event-fanout.d.ts +13 -2
  64. package/dist/modes/rpc/session-event-fanout.d.ts.map +1 -1
  65. package/dist/modes/rpc/session-event-fanout.js +36 -12
  66. package/dist/modes/rpc/session-event-fanout.js.map +1 -1
  67. package/dist/modes/rpc/session-event-writer.d.ts +3 -1
  68. package/dist/modes/rpc/session-event-writer.d.ts.map +1 -1
  69. package/dist/modes/rpc/session-event-writer.js +23 -13
  70. package/dist/modes/rpc/session-event-writer.js.map +1 -1
  71. package/dist/modes/rpc/socket-event-fanout.d.ts +8 -1
  72. package/dist/modes/rpc/socket-event-fanout.d.ts.map +1 -1
  73. package/dist/modes/rpc/socket-event-fanout.js +32 -9
  74. package/dist/modes/rpc/socket-event-fanout.js.map +1 -1
  75. package/docs/rpc.md +73 -0
  76. package/node_modules/@code-yeongyu/senpi-codemode/CHANGELOG.md +12 -0
  77. package/node_modules/@code-yeongyu/senpi-codemode/package.json +4 -4
  78. package/node_modules/@earendil-works/pi-agent-core/package.json +3 -3
  79. package/node_modules/@earendil-works/pi-ai/dist/auth/pool/slots.d.ts +11 -3
  80. package/node_modules/@earendil-works/pi-ai/dist/auth/pool/slots.d.ts.map +1 -1
  81. package/node_modules/@earendil-works/pi-ai/dist/auth/pool/slots.js +32 -6
  82. package/node_modules/@earendil-works/pi-ai/dist/auth/pool/slots.js.map +1 -1
  83. package/node_modules/@earendil-works/pi-ai/dist/providers/data/.manifest.json +1 -1
  84. package/node_modules/@earendil-works/pi-ai/dist/providers/data/nvidia.json +1 -1
  85. package/node_modules/@earendil-works/pi-ai/dist/providers/data/openrouter.json +1 -1
  86. package/node_modules/@earendil-works/pi-ai/package.json +2 -2
  87. package/node_modules/@earendil-works/pi-pty/package.json +1 -1
  88. package/node_modules/@earendil-works/pi-telemetry/package.json +1 -1
  89. package/node_modules/@earendil-works/pi-tui/package.json +1 -1
  90. package/package.json +7 -7
@@ -1 +1 @@
1
- {"version":3,"file":"session-registry-wiring.js","sourceRoot":"","sources":["../../../../../src/core/extensions/builtin/claude-sdk-oauth/session-registry-wiring.ts"],"names":[],"mappings":"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","sourcesContent":["import type { AssistantMessage } from \"@earendil-works/pi-ai\";\nimport type { ExtensionAPI, ExtensionContext } from \"../../types.ts\";\nimport { CLAUDE_SDK_OAUTH_PROVIDER_ID } from \"./account-management.ts\";\nimport {\n\tBINDING_ENTRY_TYPE,\n\tBINDING_MARKER,\n\ttype BindingInvalidation,\n\tbindingFromStoredBranch,\n\tsentHashesFromBranch,\n\tstoredBindingFromEntry,\n} from \"./session-binding.ts\";\nimport { deleteStoredBinding, readStoredBinding, writeStoredBinding } from \"./session-binding-store.ts\";\nimport {\n\tAssistantCommitBoundary,\n\tassistantContentHash,\n\tisResidentAssistant,\n\tisTerminalFailure,\n} from \"./session-commit-boundary.ts\";\nimport { bindingFromEntry, forgetBinding, rememberBinding } from \"./session-reattach.ts\";\nimport {\n\tcloseSession,\n\tgetSession,\n\trecordBranchInfo,\n\trecordPendingFork,\n\tswitchSessionModel,\n} from \"./session-registry.ts\";\nimport { sentHashesForEntry } from \"./session-sync.ts\";\n\nconst commitBoundary = new AssistantCommitBoundary();\n\nfunction persistBindingInvalidation(pi: Partial<Pick<ExtensionAPI, \"appendEntry\">>, reason: string): void {\n\tpi.appendEntry?.(BINDING_ENTRY_TYPE, { schemaVersion: 1, invalidated: true, reason } satisfies BindingInvalidation);\n}\n\nasync function invalidateBinding(\n\tpi: Partial<Pick<ExtensionAPI, \"appendEntry\">>,\n\tctx: Pick<ExtensionContext, \"sessionManager\">,\n\treason: string,\n): Promise<void> {\n\tconst sessionId = ctx.sessionManager.getSessionId();\n\tforgetBinding(sessionId);\n\tconst sessionFile = ctx.sessionManager.getSessionFile?.();\n\tif (sessionFile) await deleteStoredBinding(sessionFile);\n\tpersistBindingInvalidation(pi, reason);\n}\n\nfunction keepBindingThenClose(sessionId: string, reason: string): void {\n\tconst entry = getSession(sessionId);\n\tif (entry) rememberBinding(bindingFromEntry(entry, sentHashesForEntry(entry) ?? []));\n\tcloseSession(sessionId, reason);\n}\n\nfunction residentEntryFor(sessionId: string, message: AssistantMessage) {\n\tconst entry = getSession(sessionId);\n\tif (!entry || !isResidentAssistant(message, entry.modelId)) return undefined;\n\treturn entry;\n}\n\nexport function registerSessionRegistry(\n\tpi: Pick<ExtensionAPI, \"on\"> & Partial<Pick<ExtensionAPI, \"appendEntry\">>,\n): void {\n\tpi.on(\"session_start\", async (event, ctx) => {\n\t\tif (event.reason === \"reload\") return;\n\t\tconst sessionId = ctx.sessionManager.getSessionId();\n\t\tforgetBinding(sessionId);\n\t\tconst sessionFile = ctx.sessionManager.getSessionFile?.();\n\t\tif (event.reason === \"new\") return;\n\t\tif (event.reason === \"fork\") {\n\t\t\tif (sessionFile) await deleteStoredBinding(sessionFile);\n\t\t\tpersistBindingInvalidation(pi, \"fork\");\n\t\t\treturn;\n\t\t}\n\t\tif (!sessionFile) return;\n\t\tconst stored = await readStoredBinding(sessionFile);\n\t\tif (!stored) return;\n\t\tif (stored.sessionId !== sessionId) {\n\t\t\tawait deleteStoredBinding(sessionFile);\n\t\t\treturn;\n\t\t}\n\t\tconst binding = bindingFromStoredBranch(ctx.sessionManager.getBranch(), stored);\n\t\tif (!binding) {\n\t\t\tawait deleteStoredBinding(sessionFile);\n\t\t\treturn;\n\t\t}\n\t\trememberBinding(binding);\n\t});\n\tpi.on(\"session_compact\", async (event, ctx) => {\n\t\tif (!event.accepted) return;\n\t\trecordPendingFork(ctx.sessionManager.getSessionId(), \"compaction\");\n\t\tawait invalidateBinding(pi, ctx, \"compaction\");\n\t});\n\tpi.on(\"session_tree\", async (event, ctx) => {\n\t\tif (event.oldLeafId === null || event.newLeafId === null) return;\n\t\trecordBranchInfo(ctx.sessionManager.getSessionId(), {\n\t\t\toldLeafId: event.oldLeafId,\n\t\t\tnewLeafId: event.newLeafId,\n\t\t});\n\t\tawait invalidateBinding(pi, ctx, \"tree_changed\");\n\t});\n\tpi.on(\"model_select\", async (event, ctx) => {\n\t\tconst sessionId = ctx.sessionManager.getSessionId();\n\t\tif (event.model?.provider !== CLAUDE_SDK_OAUTH_PROVIDER_ID) {\n\t\t\tcloseSession(sessionId, \"model_selected\");\n\t\t\tawait invalidateBinding(pi, ctx, \"model_selected\");\n\t\t\treturn;\n\t\t}\n\t\tif (!(await switchSessionModel(sessionId, event.model.id))) {\n\t\t\tkeepBindingThenClose(sessionId, \"model_selected\");\n\t\t}\n\t});\n\tpi.on(\"thinking_level_select\", (_event, ctx) => {\n\t\tkeepBindingThenClose(ctx.sessionManager.getSessionId(), \"thinking_level_selected\");\n\t});\n\tpi.on(\"message_update\", (event, ctx) => {\n\t\tif (event.message.role !== \"assistant\") return;\n\t\tconst sessionId = ctx.sessionManager.getSessionId();\n\t\tif (residentEntryFor(sessionId, event.message)) {\n\t\t\tcommitBoundary.captureProviderFinal(sessionId, event.message);\n\t\t}\n\t});\n\tpi.on(\"message_end\", async (event, ctx) => {\n\t\tif (event.message.role !== \"assistant\") return;\n\t\tconst sessionId = ctx.sessionManager.getSessionId();\n\t\tconst entry = getSession(sessionId);\n\t\tif (!entry) return;\n\t\tif (isTerminalFailure(event.message)) {\n\t\t\tcommitBoundary.forget(sessionId);\n\t\t\treturn;\n\t\t}\n\t\tconst outcome = commitBoundary.commit(sessionId, event.message, entry.modelId);\n\t\tif (outcome === \"rewritten\") {\n\t\t\trecordPendingFork(sessionId, \"assistant_rewritten\");\n\t\t\tawait invalidateBinding(pi, ctx, \"assistant_rewritten\");\n\t\t\treturn;\n\t\t}\n\t\t// Only an assistant this provider actually produced may anchor a record.\n\t\tif (outcome !== \"clean\") return;\n\t\tconst sessionFile = ctx.sessionManager.getSessionFile?.();\n\t\tif (!sessionFile || !pi.appendEntry) return;\n\t\tconst hashes = sentHashesFromBranch(ctx.sessionManager.getBranch());\n\t\tif (hashes.length === 0) return;\n\t\tpi.appendEntry(BINDING_ENTRY_TYPE, BINDING_MARKER);\n\t\tconst markerEntryId = ctx.sessionManager.getLeafId();\n\t\tif (!markerEntryId) return;\n\t\tawait writeStoredBinding(\n\t\t\tsessionFile,\n\t\t\tstoredBindingFromEntry(entry, hashes, {\n\t\t\t\tsessionPath: sessionFile,\n\t\t\t\tsessionId,\n\t\t\t\tmarkerEntryId,\n\t\t\t\tassistantContentHash: assistantContentHash(event.message),\n\t\t\t}),\n\t\t);\n\t});\n\tpi.on(\"session_shutdown\", (event, ctx) => {\n\t\tcloseSession(ctx.sessionManager.getSessionId(), event.reason);\n\t});\n\tpi.on(\"session_extensions_removed\", async (_event, ctx) => {\n\t\tcloseSession(ctx.sessionManager.getSessionId(), \"extensions_removed\");\n\t\tawait invalidateBinding(pi, ctx, \"extensions_removed\");\n\t});\n}\n"]}
1
+ {"version":3,"file":"session-registry-wiring.js","sourceRoot":"","sources":["../../../../../src/core/extensions/builtin/claude-sdk-oauth/session-registry-wiring.ts"],"names":[],"mappings":"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","sourcesContent":["import type { AssistantMessage } from \"@earendil-works/pi-ai\";\nimport { convertToLlm } from \"../../../messages.ts\";\nimport type { ExtensionAPI, ExtensionContext } from \"../../types.ts\";\nimport { CLAUDE_SDK_OAUTH_PROVIDER_ID } from \"./account-management.ts\";\nimport {\n\tBINDING_ENTRY_TYPE,\n\tBINDING_MARKER,\n\ttype BindingInvalidation,\n\tbindingFromStoredBranch,\n\tstoredBindingFromBinding,\n\tstoredBindingFromEntry,\n} from \"./session-binding.ts\";\nimport { deleteStoredBinding, readStoredBinding, writeStoredBinding } from \"./session-binding-store.ts\";\nimport {\n\tAssistantCommitBoundary,\n\tassistantContentHash,\n\tisResidentAssistant,\n\tisTerminalFailure,\n} from \"./session-commit-boundary.ts\";\nimport { bindingFromEntry, forgetBinding, getBinding, rememberBinding } from \"./session-reattach.ts\";\nimport {\n\tcloseSession,\n\tgetSession,\n\trecordBranchInfo,\n\trecordPendingFork,\n\tswitchSessionModel,\n} from \"./session-registry.ts\";\nimport { sentHashesForEntry, sentMessageHashes, sentMessages } from \"./session-sync.ts\";\n\nconst commitBoundary = new AssistantCommitBoundary();\n\nfunction persistBindingInvalidation(pi: Partial<Pick<ExtensionAPI, \"appendEntry\">>, reason: string): void {\n\tpi.appendEntry?.(BINDING_ENTRY_TYPE, { schemaVersion: 1, invalidated: true, reason } satisfies BindingInvalidation);\n}\n\nasync function invalidateBinding(\n\tpi: Partial<Pick<ExtensionAPI, \"appendEntry\">>,\n\tctx: Pick<ExtensionContext, \"sessionManager\">,\n\treason: string,\n): Promise<void> {\n\tconst sessionId = ctx.sessionManager.getSessionId();\n\tforgetBinding(sessionId);\n\tconst sessionFile = ctx.sessionManager.getSessionFile?.();\n\tif (sessionFile) await deleteStoredBinding(sessionFile);\n\tpersistBindingInvalidation(pi, reason);\n}\n\nfunction keepBindingThenClose(sessionId: string, reason: string): void {\n\tconst entry = getSession(sessionId);\n\tif (entry) rememberBinding(bindingFromEntry(entry, sentHashesForEntry(entry) ?? []));\n\tcloseSession(sessionId, reason);\n}\n\nfunction residentEntryFor(sessionId: string, message: AssistantMessage) {\n\tconst entry = getSession(sessionId);\n\tif (!entry || !isResidentAssistant(message, entry.modelId)) return undefined;\n\treturn entry;\n}\n\nexport function registerSessionRegistry(\n\tpi: Pick<ExtensionAPI, \"on\"> & Partial<Pick<ExtensionAPI, \"appendEntry\">>,\n): void {\n\tpi.on(\"session_start\", async (event, ctx) => {\n\t\tif (event.reason === \"reload\") return;\n\t\tconst sessionId = ctx.sessionManager.getSessionId();\n\t\tforgetBinding(sessionId);\n\t\tconst sessionFile = ctx.sessionManager.getSessionFile?.();\n\t\tif (event.reason === \"new\") return;\n\t\tif (event.reason === \"fork\") {\n\t\t\tif (sessionFile) await deleteStoredBinding(sessionFile);\n\t\t\tpersistBindingInvalidation(pi, \"fork\");\n\t\t\treturn;\n\t\t}\n\t\tif (!sessionFile) return;\n\t\tconst stored = await readStoredBinding(sessionFile);\n\t\tif (!stored) return;\n\t\tif (stored.sessionId !== sessionId) {\n\t\t\tawait deleteStoredBinding(sessionFile);\n\t\t\treturn;\n\t\t}\n\t\tconst binding = bindingFromStoredBranch(ctx.sessionManager.getBranch(), stored);\n\t\tif (!binding) {\n\t\t\tawait deleteStoredBinding(sessionFile);\n\t\t\treturn;\n\t\t}\n\t\trememberBinding(binding);\n\t});\n\tpi.on(\"session_compact\", async (event, ctx) => {\n\t\tif (!event.accepted) return;\n\t\trecordPendingFork(ctx.sessionManager.getSessionId(), \"compaction\");\n\t\tawait invalidateBinding(pi, ctx, \"compaction\");\n\t});\n\tpi.on(\"session_tree\", async (event, ctx) => {\n\t\tif (event.oldLeafId === null || event.newLeafId === null) return;\n\t\trecordBranchInfo(ctx.sessionManager.getSessionId(), {\n\t\t\toldLeafId: event.oldLeafId,\n\t\t\tnewLeafId: event.newLeafId,\n\t\t});\n\t\tawait invalidateBinding(pi, ctx, \"tree_changed\");\n\t});\n\tpi.on(\"model_select\", async (event, ctx) => {\n\t\tconst sessionId = ctx.sessionManager.getSessionId();\n\t\tif (event.model?.provider !== CLAUDE_SDK_OAUTH_PROVIDER_ID) {\n\t\t\tcloseSession(sessionId, \"model_selected\");\n\t\t\tawait invalidateBinding(pi, ctx, \"model_selected\");\n\t\t\treturn;\n\t\t}\n\t\tif (!(await switchSessionModel(sessionId, event.model.id))) {\n\t\t\tkeepBindingThenClose(sessionId, \"model_selected\");\n\t\t}\n\t});\n\tpi.on(\"thinking_level_select\", (_event, ctx) => {\n\t\tkeepBindingThenClose(ctx.sessionManager.getSessionId(), \"thinking_level_selected\");\n\t});\n\tpi.on(\"message_update\", (event, ctx) => {\n\t\tif (event.message.role !== \"assistant\") return;\n\t\tconst sessionId = ctx.sessionManager.getSessionId();\n\t\tif (residentEntryFor(sessionId, event.message)) {\n\t\t\tcommitBoundary.captureProviderFinal(sessionId, event.message);\n\t\t}\n\t});\n\tpi.on(\"message_end\", async (event, ctx) => {\n\t\tif (event.message.role !== \"assistant\") return;\n\t\tconst sessionId = ctx.sessionManager.getSessionId();\n\t\tconst entry = getSession(sessionId);\n\t\tconst binding = getBinding(sessionId);\n\t\tconst modelId = entry?.modelId ?? binding?.modelId;\n\t\tif (!modelId) return;\n\t\tif (isTerminalFailure(event.message)) {\n\t\t\tcommitBoundary.forget(sessionId);\n\t\t\treturn;\n\t\t}\n\t\tconst outcome = commitBoundary.commit(sessionId, event.message, modelId);\n\t\tif (outcome === \"rewritten\") {\n\t\t\trecordPendingFork(sessionId, \"assistant_rewritten\");\n\t\t\tawait invalidateBinding(pi, ctx, \"assistant_rewritten\");\n\t\t\treturn;\n\t\t}\n\t\t// Only an assistant this provider actually produced may anchor a record.\n\t\tif (outcome !== \"clean\") return;\n\t\tconst sessionFile = ctx.sessionManager.getSessionFile?.();\n\t\tif (!sessionFile || !pi.appendEntry) return;\n\t\tconst context = ctx.sessionManager.buildSessionContext();\n\t\tconst hashes = sentMessageHashes(sentMessages({ ...context, messages: convertToLlm(context.messages) }));\n\t\tconst committedAssistantHash = assistantContentHash(event.message);\n\t\tconst recordFor = (markerEntryId: string) => {\n\t\t\tconst anchor = {\n\t\t\t\tsessionPath: sessionFile,\n\t\t\t\tsessionId,\n\t\t\t\tmarkerEntryId,\n\t\t\t\tassistantContentHash: committedAssistantHash,\n\t\t\t};\n\t\t\treturn entry\n\t\t\t\t? storedBindingFromEntry(entry, hashes, anchor)\n\t\t\t\t: binding\n\t\t\t\t\t? storedBindingFromBinding(binding, hashes, anchor)\n\t\t\t\t\t: undefined;\n\t\t};\n\t\t// Validate before touching the branch: a rejected closed-entry fallback must\n\t\t// not leave a marker-only entry that retires the still-valid older sidecar.\n\t\tif (!recordFor(\"pending\")) return;\n\t\tpi.appendEntry(BINDING_ENTRY_TYPE, BINDING_MARKER);\n\t\tconst markerEntryId = ctx.sessionManager.getLeafId();\n\t\tif (!markerEntryId) return;\n\t\tconst stored = recordFor(markerEntryId);\n\t\tif (!stored) return;\n\t\tawait writeStoredBinding(sessionFile, stored);\n\t});\n\tpi.on(\"session_shutdown\", (event, ctx) => {\n\t\tcloseSession(ctx.sessionManager.getSessionId(), event.reason);\n\t});\n\tpi.on(\"session_extensions_removed\", async (_event, ctx) => {\n\t\tcloseSession(ctx.sessionManager.getSessionId(), \"extensions_removed\");\n\t\tawait invalidateBinding(pi, ctx, \"extensions_removed\");\n\t});\n}\n"]}
@@ -1 +1 @@
1
- {"version":3,"file":"session-sync.d.ts","sourceRoot":"","sources":["../../../../../src/core/extensions/builtin/claude-sdk-oauth/session-sync.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,OAAO,EAAE,OAAO,EAAE,MAAM,uBAAuB,CAAC;AAE9D,OAAO,KAAK,EAAE,sBAAsB,EAAE,MAAM,cAAc,CAAC;AAC3D,OAAO,KAAK,EAAE,iBAAiB,EAAE,OAAO,EAAE,MAAM,mBAAmB,CAAC;AACpE,OAAO,KAAK,EAAE,0BAA0B,EAAE,MAAM,uBAAuB,CAAC;AAGxE,MAAM,MAAM,WAAW,GAAG,OAAO,CAAC,OAAO,EAAE;IAAE,IAAI,EAAE,MAAM,GAAG,YAAY,CAAA;CAAE,CAAC,CAAC;AAE5E,MAAM,MAAM,wBAAwB,GAAG;IACtC,gBAAgB,EAAE,MAAM,CAAC;IACzB,WAAW,EAAE,MAAM,CAAC;CACpB,CAAC;AA4BF,wBAAgB,iBAAiB,CAAC,KAAK,EAAE,OAAO,GAAG,MAAM,CAExD;AAkBD,wBAAgB,YAAY,CAAC,OAAO,EAAE,OAAO,GAAG,WAAW,EAAE,CAE5D;AAED;;;;GAIG;AACH,wBAAgB,oBAAoB,CAAC,OAAO,EAAE;IAAE,IAAI,EAAE,MAAM,CAAA;CAAE,GAAG,OAAO,IAAI,WAAW,CAGtF;AAED;;;GAGG;AACH,wBAAgB,iBAAiB,CAAC,QAAQ,EAAE,SAAS,WAAW,EAAE,GAAG,MAAM,EAAE,CAc5E;AAED,wBAAgB,oBAAoB,CAAC,MAAM,EAAE,SAAS,MAAM,EAAE,EAAE,KAAK,SAAgB,GAAG,MAAM,CAE7F;AAED,kFAAkF;AAElF,wBAAgB,kBAAkB,CAAC,KAAK,EAAE,0BAA0B,GAAG,SAAS,MAAM,EAAE,GAAG,SAAS,CAEnG;AAED,wBAAgB,kBAAkB,CAAC,KAAK,EAAE,0BAA0B,EAAE,MAAM,EAAE,SAAS,MAAM,EAAE,GAAG,IAAI,CAMrG;AAeD,wBAAgB,iBAAiB,CAChC,OAAO,EAAE,OAAO,EAChB,OAAO,EAAE,OAAO,EAChB,QAAQ,EAAE,sBAAsB,EAChC,WAAW,EAAE,MAAM,GACjB,wBAAwB,CA0B1B;AAaD,wBAAgB,sBAAsB,CACrC,QAAQ,EAAE,SAAS,WAAW,EAAE,EAChC,mBAAmB,CAAC,EAAE,WAAW,CAAC,MAAM,EAAE,MAAM,CAAC,GAC/C,iBAAiB,EAAE,CAarB"}
1
+ {"version":3,"file":"session-sync.d.ts","sourceRoot":"","sources":["../../../../../src/core/extensions/builtin/claude-sdk-oauth/session-sync.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,OAAO,EAAE,OAAO,EAAE,MAAM,uBAAuB,CAAC;AAE9D,OAAO,KAAK,EAAE,sBAAsB,EAAE,MAAM,cAAc,CAAC;AAC3D,OAAO,KAAK,EAAE,iBAAiB,EAAE,OAAO,EAAE,MAAM,mBAAmB,CAAC;AACpE,OAAO,KAAK,EAAE,0BAA0B,EAAE,MAAM,uBAAuB,CAAC;AAGxE,MAAM,MAAM,WAAW,GAAG,OAAO,CAAC,OAAO,EAAE;IAAE,IAAI,EAAE,MAAM,GAAG,YAAY,CAAA;CAAE,CAAC,CAAC;AAE5E,MAAM,MAAM,wBAAwB,GAAG;IACtC,gBAAgB,EAAE,MAAM,CAAC;IACzB,WAAW,EAAE,MAAM,CAAC;CACpB,CAAC;AA4BF,wBAAgB,iBAAiB,CAAC,KAAK,EAAE,OAAO,GAAG,MAAM,CAExD;AAkBD,wBAAgB,YAAY,CAAC,OAAO,EAAE,OAAO,GAAG,WAAW,EAAE,CAE5D;AAED;;;;GAIG;AACH,wBAAgB,oBAAoB,CAAC,OAAO,EAAE;IAAE,IAAI,EAAE,MAAM,CAAA;CAAE,GAAG,OAAO,IAAI,WAAW,CAGtF;AAED;;;GAGG;AACH,wBAAgB,iBAAiB,CAAC,QAAQ,EAAE,SAAS,WAAW,EAAE,GAAG,MAAM,EAAE,CAc5E;AAED,wBAAgB,oBAAoB,CAAC,MAAM,EAAE,SAAS,MAAM,EAAE,EAAE,KAAK,SAAgB,GAAG,MAAM,CAE7F;AAED,kFAAkF;AAElF,wBAAgB,kBAAkB,CAAC,KAAK,EAAE,0BAA0B,GAAG,SAAS,MAAM,EAAE,GAAG,SAAS,CAEnG;AAED,wBAAgB,kBAAkB,CAAC,KAAK,EAAE,0BAA0B,EAAE,MAAM,EAAE,SAAS,MAAM,EAAE,GAAG,IAAI,CAMrG;AAeD,wBAAgB,iBAAiB,CAChC,OAAO,EAAE,OAAO,EAChB,OAAO,EAAE,OAAO,EAChB,QAAQ,EAAE,sBAAsB,EAChC,WAAW,EAAE,MAAM,GACjB,wBAAwB,CA2B1B;AAaD,wBAAgB,sBAAsB,CACrC,QAAQ,EAAE,SAAS,WAAW,EAAE,EAChC,mBAAmB,CAAC,EAAE,WAAW,CAAC,MAAM,EAAE,MAAM,CAAC,GAC/C,iBAAiB,EAAE,CAarB"}
@@ -118,6 +118,7 @@ export function configFingerprint(options, context, authLane, accountName) {
118
118
  authLane,
119
119
  accountName,
120
120
  permissionMode: options.permissionMode,
121
+ // Bump HOST_TOOL_POLICY_FINGERPRINT in tools.ts when denial copy or hooks change.
121
122
  hostToolPolicy: HOST_TOOL_POLICY_FINGERPRINT,
122
123
  settingSources: options.settingSources,
123
124
  extraArgs: options.extraArgs,
@@ -1 +1 @@
1
- {"version":3,"file":"session-sync.js","sourceRoot":"","sources":["../../../../../src/core/extensions/builtin/claude-sdk-oauth/session-sync.ts"],"names":[],"mappings":"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","sourcesContent":["import { createHash } from \"node:crypto\";\nimport type { Context, Message } from \"@earendil-works/pi-ai\";\nimport { appendSdkContentBlocks } from \"./content-blocks.ts\";\nimport type { ClaudeSdkOauthAuthLane } from \"./options.ts\";\nimport type { ContentBlockParam, Options } from \"./sdk-boundary.ts\";\nimport type { ClaudeSdkOauthSessionEntry } from \"./session-registry.ts\";\nimport { HOST_TOOL_POLICY_FINGERPRINT, mapPiToolNameToSdk } from \"./tools.ts\";\n\nexport type SentMessage = Extract<Message, { role: \"user\" | \"toolResult\" }>;\n\nexport type SessionConfigFingerprint = {\n\tsystemPromptHash: string;\n\ttoolsetHash: string;\n};\n\nconst sentHashesByEntry = new WeakMap<ClaudeSdkOauthSessionEntry, string[]>();\n\nfunction stableValue(value: unknown, seen = new WeakSet<object>()): unknown {\n\tif (typeof value === \"function\") return `[function:${value.name}:${value.toString()}]`;\n\tif (typeof value === \"bigint\") return value.toString();\n\tif (value === null || typeof value !== \"object\") return value;\n\tif (seen.has(value)) return \"[circular]\";\n\tseen.add(value);\n\tconst normalized = Array.isArray(value)\n\t\t? value.map((item) => stableValue(item, seen))\n\t\t: Object.fromEntries(\n\t\t\t\tObject.entries(value as Record<string, unknown>)\n\t\t\t\t\t.filter(([, item]) => item !== undefined)\n\t\t\t\t\t.sort(([left], [right]) => left.localeCompare(right))\n\t\t\t\t\t.map(([key, item]) => [key, stableValue(item, seen)]),\n\t\t\t);\n\tseen.delete(value);\n\treturn normalized;\n}\n\nfunction digest(value: unknown): string {\n\treturn createHash(\"sha256\")\n\t\t.update(JSON.stringify(stableValue(value)))\n\t\t.digest(\"hex\");\n}\n\nexport function sessionSyncDigest(value: unknown): string {\n\treturn digest(value);\n}\n\n/**\n * A user message with no content blocks carries nothing to transmit and is\n * transient: it is present for a single provider call and gone by the next.\n * Hashing one shifts every later index, so the following turn reports\n * `sent_stream_diverged` and re-sends the whole history even though the\n * conversation never changed. Tool results are never filtered - an empty tool\n * result is a real observation, and its id and name stay hash-significant.\n */\nfunction isContentlessUserMessage(message: SentMessage): boolean {\n\tif (message.role !== \"user\") return false;\n\t// Only a literal zero-block array is content-less. Whitespace-only text and\n\t// explicit empty-text blocks still emit transport blocks, so they must stay\n\t// hash-significant to keep divergence detection fail-closed.\n\treturn Array.isArray(message.content) && message.content.length === 0;\n}\n\nexport function sentMessages(context: Context): SentMessage[] {\n\treturn context.messages.filter(isTransmittedMessage);\n}\n\n/**\n * The one selection rule for \"message the provider was sent\". Branch-derived and\n * context-derived hashes MUST share it: a content-less user message that only one\n * side skips shifts every later index and reports a false divergence.\n */\nexport function isTransmittedMessage(message: { role: string }): message is SentMessage {\n\tif (message.role !== \"user\" && message.role !== \"toolResult\") return false;\n\treturn !isContentlessUserMessage(message as SentMessage);\n}\n\n/**\n * Applies the transmitted-message rule itself, so no caller can produce a hash\n * list that disagrees with another caller's by forgetting the filter.\n */\nexport function sentMessageHashes(messages: readonly SentMessage[]): string[] {\n\tconst hashes = messages.filter(isTransmittedMessage).map((message) =>\n\t\tdigest(\n\t\t\tmessage.role === \"user\"\n\t\t\t\t? { role: message.role, content: message.content }\n\t\t\t\t: {\n\t\t\t\t\t\trole: message.role,\n\t\t\t\t\t\ttoolCallId: message.toolCallId,\n\t\t\t\t\t\ttoolName: message.toolName,\n\t\t\t\t\t\tcontent: message.content,\n\t\t\t\t\t},\n\t\t),\n\t);\n\treturn hashes;\n}\n\nexport function sentHashPrefixDigest(hashes: readonly string[], count = hashes.length): string {\n\treturn digest(hashes.slice(0, count));\n}\n\n/** Pure divergence guard: every non-proven continuation resolves to cold-seed. */\n\nexport function sentHashesForEntry(entry: ClaudeSdkOauthSessionEntry): readonly string[] | undefined {\n\treturn sentHashesByEntry.get(entry);\n}\n\nexport function recordSyncedStream(entry: ClaudeSdkOauthSessionEntry, hashes: readonly string[]): void {\n\tconst copy = [...hashes];\n\tsentHashesByEntry.set(entry, copy);\n\tentry.sentCount = copy.length;\n\tentry.syncedPrefixHash = sentHashPrefixDigest(copy);\n\tentry.branchInfo = null;\n}\n\nconst GENERATED_DATE_LINE = /\\nCurrent date: \\d{4}-\\d{2}-\\d{2}(?=\\nCurrent working directory: [^\\n]*$)/;\n\n/**\n * The generated date line advances at UTC midnight while the conversation is\n * unchanged; hashing it verbatim retires a live session at midnight for no\n * semantic reason. Only that exact terminal line is neutralized - cwd and every\n * other prompt region stay fail-closed.\n */\nfunction fingerprintSystemPrompt(systemPrompt: Options[\"systemPrompt\"]): unknown {\n\tif (typeof systemPrompt !== \"string\") return systemPrompt ?? null;\n\treturn systemPrompt.replace(GENERATED_DATE_LINE, \"\\nCurrent date: <session-date>\");\n}\n\nexport function configFingerprint(\n\toptions: Options,\n\tcontext: Context,\n\tauthLane: ClaudeSdkOauthAuthLane,\n\taccountName: string,\n): SessionConfigFingerprint {\n\treturn {\n\t\tsystemPromptHash: digest(fingerprintSystemPrompt(options.systemPrompt)),\n\t\ttoolsetHash: digest({\n\t\t\ttools: options.tools ?? [],\n\t\t\treasoning: {\n\t\t\t\tthinking: options.thinking,\n\t\t\t\teffort: options.effort,\n\t\t\t\tmaxThinkingTokens: options.maxThinkingTokens,\n\t\t\t},\n\t\t\tcontextTools: (context.tools ?? []).map((tool) => ({\n\t\t\t\tname: tool.name,\n\t\t\t\tdescription: tool.description,\n\t\t\t\tparameters: tool.parameters,\n\t\t\t})),\n\t\t\tcwd: options.cwd,\n\t\t\tauthLane,\n\t\t\taccountName,\n\t\t\tpermissionMode: options.permissionMode,\n\t\t\thostToolPolicy: HOST_TOOL_POLICY_FINGERPRINT,\n\t\t\tsettingSources: options.settingSources,\n\t\t\textraArgs: options.extraArgs,\n\t\t\tpathToClaudeCodeExecutable: options.pathToClaudeCodeExecutable,\n\t\t\tincludePartialMessages: options.includePartialMessages,\n\t\t}),\n\t};\n}\n\nfunction appendContent(blocks: ContentBlockParam[], content: string | readonly unknown[]): void {\n\t// The delta path has always transmitted a whole-content empty string as an\n\t// empty text block; keep that wire shape so resident sessions see the same\n\t// payload as before the shared mapper (prompt-bridge intentionally skips it).\n\tif (content === \"\") {\n\t\tblocks.push({ type: \"text\", text: \"\" });\n\t\treturn;\n\t}\n\tappendSdkContentBlocks(blocks, content);\n}\n\nexport function buildDeltaPromptBlocks(\n\tmessages: readonly SentMessage[],\n\tcustomToolNameToSdk?: ReadonlyMap<string, string>,\n): ContentBlockParam[] {\n\tconst blocks: ContentBlockParam[] = [];\n\tfor (const [index, message] of messages.entries()) {\n\t\tif (index > 0) blocks.push({ type: \"text\", text: \"\\n\\n\" });\n\t\tif (message.role === \"toolResult\") {\n\t\t\tblocks.push({\n\t\t\t\ttype: \"text\",\n\t\t\t\ttext: `Tool result (${mapPiToolNameToSdk(message.toolName, customToolNameToSdk)}, id=${message.toolCallId}):\\n`,\n\t\t\t});\n\t\t}\n\t\tappendContent(blocks, message.content);\n\t}\n\treturn blocks;\n}\n"]}
1
+ {"version":3,"file":"session-sync.js","sourceRoot":"","sources":["../../../../../src/core/extensions/builtin/claude-sdk-oauth/session-sync.ts"],"names":[],"mappings":"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","sourcesContent":["import { createHash } from \"node:crypto\";\nimport type { Context, Message } from \"@earendil-works/pi-ai\";\nimport { appendSdkContentBlocks } from \"./content-blocks.ts\";\nimport type { ClaudeSdkOauthAuthLane } from \"./options.ts\";\nimport type { ContentBlockParam, Options } from \"./sdk-boundary.ts\";\nimport type { ClaudeSdkOauthSessionEntry } from \"./session-registry.ts\";\nimport { HOST_TOOL_POLICY_FINGERPRINT, mapPiToolNameToSdk } from \"./tools.ts\";\n\nexport type SentMessage = Extract<Message, { role: \"user\" | \"toolResult\" }>;\n\nexport type SessionConfigFingerprint = {\n\tsystemPromptHash: string;\n\ttoolsetHash: string;\n};\n\nconst sentHashesByEntry = new WeakMap<ClaudeSdkOauthSessionEntry, string[]>();\n\nfunction stableValue(value: unknown, seen = new WeakSet<object>()): unknown {\n\tif (typeof value === \"function\") return `[function:${value.name}:${value.toString()}]`;\n\tif (typeof value === \"bigint\") return value.toString();\n\tif (value === null || typeof value !== \"object\") return value;\n\tif (seen.has(value)) return \"[circular]\";\n\tseen.add(value);\n\tconst normalized = Array.isArray(value)\n\t\t? value.map((item) => stableValue(item, seen))\n\t\t: Object.fromEntries(\n\t\t\t\tObject.entries(value as Record<string, unknown>)\n\t\t\t\t\t.filter(([, item]) => item !== undefined)\n\t\t\t\t\t.sort(([left], [right]) => left.localeCompare(right))\n\t\t\t\t\t.map(([key, item]) => [key, stableValue(item, seen)]),\n\t\t\t);\n\tseen.delete(value);\n\treturn normalized;\n}\n\nfunction digest(value: unknown): string {\n\treturn createHash(\"sha256\")\n\t\t.update(JSON.stringify(stableValue(value)))\n\t\t.digest(\"hex\");\n}\n\nexport function sessionSyncDigest(value: unknown): string {\n\treturn digest(value);\n}\n\n/**\n * A user message with no content blocks carries nothing to transmit and is\n * transient: it is present for a single provider call and gone by the next.\n * Hashing one shifts every later index, so the following turn reports\n * `sent_stream_diverged` and re-sends the whole history even though the\n * conversation never changed. Tool results are never filtered - an empty tool\n * result is a real observation, and its id and name stay hash-significant.\n */\nfunction isContentlessUserMessage(message: SentMessage): boolean {\n\tif (message.role !== \"user\") return false;\n\t// Only a literal zero-block array is content-less. Whitespace-only text and\n\t// explicit empty-text blocks still emit transport blocks, so they must stay\n\t// hash-significant to keep divergence detection fail-closed.\n\treturn Array.isArray(message.content) && message.content.length === 0;\n}\n\nexport function sentMessages(context: Context): SentMessage[] {\n\treturn context.messages.filter(isTransmittedMessage);\n}\n\n/**\n * The one selection rule for \"message the provider was sent\". Branch-derived and\n * context-derived hashes MUST share it: a content-less user message that only one\n * side skips shifts every later index and reports a false divergence.\n */\nexport function isTransmittedMessage(message: { role: string }): message is SentMessage {\n\tif (message.role !== \"user\" && message.role !== \"toolResult\") return false;\n\treturn !isContentlessUserMessage(message as SentMessage);\n}\n\n/**\n * Applies the transmitted-message rule itself, so no caller can produce a hash\n * list that disagrees with another caller's by forgetting the filter.\n */\nexport function sentMessageHashes(messages: readonly SentMessage[]): string[] {\n\tconst hashes = messages.filter(isTransmittedMessage).map((message) =>\n\t\tdigest(\n\t\t\tmessage.role === \"user\"\n\t\t\t\t? { role: message.role, content: message.content }\n\t\t\t\t: {\n\t\t\t\t\t\trole: message.role,\n\t\t\t\t\t\ttoolCallId: message.toolCallId,\n\t\t\t\t\t\ttoolName: message.toolName,\n\t\t\t\t\t\tcontent: message.content,\n\t\t\t\t\t},\n\t\t),\n\t);\n\treturn hashes;\n}\n\nexport function sentHashPrefixDigest(hashes: readonly string[], count = hashes.length): string {\n\treturn digest(hashes.slice(0, count));\n}\n\n/** Pure divergence guard: every non-proven continuation resolves to cold-seed. */\n\nexport function sentHashesForEntry(entry: ClaudeSdkOauthSessionEntry): readonly string[] | undefined {\n\treturn sentHashesByEntry.get(entry);\n}\n\nexport function recordSyncedStream(entry: ClaudeSdkOauthSessionEntry, hashes: readonly string[]): void {\n\tconst copy = [...hashes];\n\tsentHashesByEntry.set(entry, copy);\n\tentry.sentCount = copy.length;\n\tentry.syncedPrefixHash = sentHashPrefixDigest(copy);\n\tentry.branchInfo = null;\n}\n\nconst GENERATED_DATE_LINE = /\\nCurrent date: \\d{4}-\\d{2}-\\d{2}(?=\\nCurrent working directory: [^\\n]*$)/;\n\n/**\n * The generated date line advances at UTC midnight while the conversation is\n * unchanged; hashing it verbatim retires a live session at midnight for no\n * semantic reason. Only that exact terminal line is neutralized - cwd and every\n * other prompt region stay fail-closed.\n */\nfunction fingerprintSystemPrompt(systemPrompt: Options[\"systemPrompt\"]): unknown {\n\tif (typeof systemPrompt !== \"string\") return systemPrompt ?? null;\n\treturn systemPrompt.replace(GENERATED_DATE_LINE, \"\\nCurrent date: <session-date>\");\n}\n\nexport function configFingerprint(\n\toptions: Options,\n\tcontext: Context,\n\tauthLane: ClaudeSdkOauthAuthLane,\n\taccountName: string,\n): SessionConfigFingerprint {\n\treturn {\n\t\tsystemPromptHash: digest(fingerprintSystemPrompt(options.systemPrompt)),\n\t\ttoolsetHash: digest({\n\t\t\ttools: options.tools ?? [],\n\t\t\treasoning: {\n\t\t\t\tthinking: options.thinking,\n\t\t\t\teffort: options.effort,\n\t\t\t\tmaxThinkingTokens: options.maxThinkingTokens,\n\t\t\t},\n\t\t\tcontextTools: (context.tools ?? []).map((tool) => ({\n\t\t\t\tname: tool.name,\n\t\t\t\tdescription: tool.description,\n\t\t\t\tparameters: tool.parameters,\n\t\t\t})),\n\t\t\tcwd: options.cwd,\n\t\t\tauthLane,\n\t\t\taccountName,\n\t\t\tpermissionMode: options.permissionMode,\n\t\t\t// Bump HOST_TOOL_POLICY_FINGERPRINT in tools.ts when denial copy or hooks change.\n\t\t\thostToolPolicy: HOST_TOOL_POLICY_FINGERPRINT,\n\t\t\tsettingSources: options.settingSources,\n\t\t\textraArgs: options.extraArgs,\n\t\t\tpathToClaudeCodeExecutable: options.pathToClaudeCodeExecutable,\n\t\t\tincludePartialMessages: options.includePartialMessages,\n\t\t}),\n\t};\n}\n\nfunction appendContent(blocks: ContentBlockParam[], content: string | readonly unknown[]): void {\n\t// The delta path has always transmitted a whole-content empty string as an\n\t// empty text block; keep that wire shape so resident sessions see the same\n\t// payload as before the shared mapper (prompt-bridge intentionally skips it).\n\tif (content === \"\") {\n\t\tblocks.push({ type: \"text\", text: \"\" });\n\t\treturn;\n\t}\n\tappendSdkContentBlocks(blocks, content);\n}\n\nexport function buildDeltaPromptBlocks(\n\tmessages: readonly SentMessage[],\n\tcustomToolNameToSdk?: ReadonlyMap<string, string>,\n): ContentBlockParam[] {\n\tconst blocks: ContentBlockParam[] = [];\n\tfor (const [index, message] of messages.entries()) {\n\t\tif (index > 0) blocks.push({ type: \"text\", text: \"\\n\\n\" });\n\t\tif (message.role === \"toolResult\") {\n\t\t\tblocks.push({\n\t\t\t\ttype: \"text\",\n\t\t\t\ttext: `Tool result (${mapPiToolNameToSdk(message.toolName, customToolNameToSdk)}, id=${message.toolCallId}):\\n`,\n\t\t\t});\n\t\t}\n\t\tappendContent(blocks, message.content);\n\t}\n\treturn blocks;\n}\n"]}
@@ -2,7 +2,7 @@ import { type Api, type AssistantMessage, type Model } from "@earendil-works/pi-
2
2
  /** @deprecated Resolve the active Context.tools allowlist through resolveSdkTools(). */
3
3
  export declare const sdkTools: ("Read" | "Grep" | "Glob" | "Bash" | "Write" | "Edit")[];
4
4
  /** @deprecated Use TOOL_EXECUTION_DENIED_MESSAGE from tools.ts. */
5
- export declare const toolExecutionDeniedMessage = "Tool execution is unavailable in this environment.";
5
+ export declare const toolExecutionDeniedMessage: string;
6
6
  export type TextBlock = {
7
7
  type: "text";
8
8
  text: string;
@@ -1 +1 @@
1
- {"version":3,"file":"stream-protocol.d.ts","sourceRoot":"","sources":["../../../../../src/core/extensions/builtin/claude-sdk-oauth/stream-protocol.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,GAAG,EAAE,KAAK,gBAAgB,EAAiB,KAAK,KAAK,EAAE,MAAM,uBAAuB,CAAC;AAGnG,wFAAwF;AACxF,eAAO,MAAM,QAAQ,0DAAyB,CAAC;AAC/C,mEAAmE;AACnE,eAAO,MAAM,0BAA0B,uDAAgC,CAAC;AAExE,MAAM,MAAM,SAAS,GAAG;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAC;IAAC,KAAK,CAAC,EAAE,MAAM,CAAA;CAAE,CAAC;AACvE,MAAM,MAAM,aAAa,GAAG;IAAE,IAAI,EAAE,UAAU,CAAC;IAAC,QAAQ,EAAE,MAAM,CAAC;IAAC,iBAAiB,EAAE,MAAM,CAAC;IAAC,KAAK,CAAC,EAAE,MAAM,CAAA;CAAE,CAAC;AAC9G,MAAM,MAAM,SAAS,GAAG;IACvB,IAAI,EAAE,UAAU,CAAC;IACjB,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;IACb,SAAS,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IACnC,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,KAAK,CAAC,EAAE,MAAM,CAAC;CACf,CAAC;AACF,MAAM,MAAM,WAAW,GAAG,SAAS,GAAG,aAAa,GAAG,SAAS,CAAC;AAEhE,KAAK,QAAQ,GAAG;IACf,YAAY,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAC7B,aAAa,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAC9B,uBAAuB,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IACxC,2BAA2B,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;CAC5C,CAAC;AAEF,wBAAgB,aAAa,CAAC,MAAM,EAAE,MAAM,GAAG,IAAI,GAAG,SAAS,GAAG,MAAM,GAAG,QAAQ,GAAG,SAAS,CAI9F;AAED,wBAAgB,WAAW,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAEhD;AAED,wBAAgB,QAAQ,CAAC,KAAK,EAAE,OAAO,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAIhE;AAED,wBAAgB,gBAAgB,CAAC,IAAI,EAAE,MAAM,EAAE,cAAc,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAE/G;AAED,wBAAgB,WAAW,CAAC,KAAK,EAAE,KAAK,CAAC,GAAG,CAAC,EAAE,MAAM,EAAE,gBAAgB,EAAE,KAAK,EAAE,QAAQ,GAAG,IAAI,CAQ9F;AAED,wBAAgB,WAAW,CAAC,KAAK,EAAE,KAAK,CAAC,GAAG,CAAC,GAAG,gBAAgB,CAkB/D;AAED,wBAAgB,YAAY,CAAC,KAAK,EAAE,OAAO,GAAG,MAAM,CAEnD"}
1
+ {"version":3,"file":"stream-protocol.d.ts","sourceRoot":"","sources":["../../../../../src/core/extensions/builtin/claude-sdk-oauth/stream-protocol.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,GAAG,EAAE,KAAK,gBAAgB,EAAiB,KAAK,KAAK,EAAE,MAAM,uBAAuB,CAAC;AAGnG,wFAAwF;AACxF,eAAO,MAAM,QAAQ,0DAAyB,CAAC;AAC/C,mEAAmE;AACnE,eAAO,MAAM,0BAA0B,QAAgC,CAAC;AAExE,MAAM,MAAM,SAAS,GAAG;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAC;IAAC,KAAK,CAAC,EAAE,MAAM,CAAA;CAAE,CAAC;AACvE,MAAM,MAAM,aAAa,GAAG;IAAE,IAAI,EAAE,UAAU,CAAC;IAAC,QAAQ,EAAE,MAAM,CAAC;IAAC,iBAAiB,EAAE,MAAM,CAAC;IAAC,KAAK,CAAC,EAAE,MAAM,CAAA;CAAE,CAAC;AAC9G,MAAM,MAAM,SAAS,GAAG;IACvB,IAAI,EAAE,UAAU,CAAC;IACjB,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;IACb,SAAS,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IACnC,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,KAAK,CAAC,EAAE,MAAM,CAAC;CACf,CAAC;AACF,MAAM,MAAM,WAAW,GAAG,SAAS,GAAG,aAAa,GAAG,SAAS,CAAC;AAEhE,KAAK,QAAQ,GAAG;IACf,YAAY,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAC7B,aAAa,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAC9B,uBAAuB,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IACxC,2BAA2B,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;CAC5C,CAAC;AAEF,wBAAgB,aAAa,CAAC,MAAM,EAAE,MAAM,GAAG,IAAI,GAAG,SAAS,GAAG,MAAM,GAAG,QAAQ,GAAG,SAAS,CAI9F;AAED,wBAAgB,WAAW,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAEhD;AAED,wBAAgB,QAAQ,CAAC,KAAK,EAAE,OAAO,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAIhE;AAED,wBAAgB,gBAAgB,CAAC,IAAI,EAAE,MAAM,EAAE,cAAc,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAE/G;AAED,wBAAgB,WAAW,CAAC,KAAK,EAAE,KAAK,CAAC,GAAG,CAAC,EAAE,MAAM,EAAE,gBAAgB,EAAE,KAAK,EAAE,QAAQ,GAAG,IAAI,CAQ9F;AAED,wBAAgB,WAAW,CAAC,KAAK,EAAE,KAAK,CAAC,GAAG,CAAC,GAAG,gBAAgB,CAkB/D;AAED,wBAAgB,YAAY,CAAC,KAAK,EAAE,OAAO,GAAG,MAAM,CAEnD"}
@@ -2,10 +2,18 @@ import type { Context, Tool } from "@earendil-works/pi-ai";
2
2
  import type { Options } from "./sdk-boundary.ts";
3
3
  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
- export declare const HOST_TOOL_POLICY_FINGERPRINT = "host-tool-denial-v1";
5
+ /**
6
+ * Versioned host-tool denial policy. `configFingerprint` in session-sync.ts hashes this as
7
+ * `hostToolPolicy` into `toolsetHash`; a mismatch is `options_changed` and retires the live
8
+ * resident query. The same hash is persisted in the restart sidecar, so a bump also makes
9
+ * the first admission after an upgrade cold-seed (`flatten` / `options_changed`) instead of
10
+ * resuming the pre-bump SDK session - once per session, intended. Bump when denial copy or
11
+ * hooks change so wording-only edits cannot keep serving the old reason.
12
+ */
13
+ export declare const HOST_TOOL_POLICY_FINGERPRINT = "host-tool-denial-v2";
6
14
  export declare const BUILTIN_SDK_TOOLS: readonly ["Read", "Write", "Edit", "Bash", "Grep", "Glob"];
7
- export declare const TOOL_EXECUTION_DENIED_MESSAGE = "Tool execution is unavailable in this environment.";
8
- 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.";
15
+ export declare const TOOL_EXECUTION_DENIED_MESSAGE: string;
16
+ export declare const HOST_TOOL_EXECUTION_DENIED_MESSAGE: string;
9
17
  export declare const CUSTOM_TOOLS_MCP_SERVER_NAME = "custom-tools";
10
18
  export declare const CUSTOM_TOOLS_MCP_PREFIX = "mcp__custom-tools__";
11
19
  export declare const HOST_CAPTURED_SDK_TOOL_MATCHER = "Bash|Write|Edit|Read|Grep|Glob|mcp__custom-tools__.*";
@@ -1 +1 @@
1
- {"version":3,"file":"tools.d.ts","sourceRoot":"","sources":["../../../../../src/core/extensions/builtin/claude-sdk-oauth/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,4BAA4B,wBAAwB,CAAC;AAElE,eAAO,MAAM,iBAAiB,4DAA6D,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"}
1
+ {"version":3,"file":"tools.d.ts","sourceRoot":"","sources":["../../../../../src/core/extensions/builtin/claude-sdk-oauth/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;;;;;;;GAOG;AACH,eAAO,MAAM,4BAA4B,wBAAwB,CAAC;AAElE,eAAO,MAAM,iBAAiB,4DAA6D,CAAC;AAC5F,eAAO,MAAM,6BAA6B,QAEY,CAAC;AACvD,eAAO,MAAM,kCAAkC,QAAgC,CAAC;AAChF,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"}
@@ -15,10 +15,19 @@ export const PI_TO_SDK_TOOL_NAME = {
15
15
  find: "Glob",
16
16
  glob: "Glob",
17
17
  };
18
- export const HOST_TOOL_POLICY_FINGERPRINT = "host-tool-denial-v1";
18
+ /**
19
+ * Versioned host-tool denial policy. `configFingerprint` in session-sync.ts hashes this as
20
+ * `hostToolPolicy` into `toolsetHash`; a mismatch is `options_changed` and retires the live
21
+ * resident query. The same hash is persisted in the restart sidecar, so a bump also makes
22
+ * the first admission after an upgrade cold-seed (`flatten` / `options_changed`) instead of
23
+ * resuming the pre-bump SDK session - once per session, intended. Bump when denial copy or
24
+ * hooks change so wording-only edits cannot keep serving the old reason.
25
+ */
26
+ export const HOST_TOOL_POLICY_FINGERPRINT = "host-tool-denial-v2";
19
27
  export const BUILTIN_SDK_TOOLS = ["Read", "Write", "Edit", "Bash", "Grep", "Glob"];
20
- export const TOOL_EXECUTION_DENIED_MESSAGE = "Tool execution is unavailable in this environment.";
21
- 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.";
28
+ export const TOOL_EXECUTION_DENIED_MESSAGE = "Senpi executes this tool on the host and returns its result as the next user message. " +
29
+ "Wait for that result; this denial is not a failure.";
30
+ export const HOST_TOOL_EXECUTION_DENIED_MESSAGE = TOOL_EXECUTION_DENIED_MESSAGE;
22
31
  export const CUSTOM_TOOLS_MCP_SERVER_NAME = "custom-tools";
23
32
  export const CUSTOM_TOOLS_MCP_PREFIX = `mcp__${CUSTOM_TOOLS_MCP_SERVER_NAME}__`;
24
33
  export const HOST_CAPTURED_SDK_TOOL_MATCHER = "Bash|Write|Edit|Read|Grep|Glob|mcp__custom-tools__.*";
@@ -1 +1 @@
1
- {"version":3,"file":"tools.js","sourceRoot":"","sources":["../../../../../src/core/extensions/builtin/claude-sdk-oauth/tools.ts"],"names":[],"mappings":"AAGA,MAAM,CAAC,MAAM,mBAAmB,GAAqC;IACpE,IAAI,EAAE,MAAM;IACZ,KAAK,EAAE,OAAO;IACd,IAAI,EAAE,MAAM;IACZ,IAAI,EAAE,MAAM;IACZ,IAAI,EAAE,MAAM;IACZ,IAAI,EAAE,MAAM;CACZ,CAAC;AAEF,MAAM,CAAC,MAAM,mBAAmB,GAAqC;IACpE,IAAI,EAAE,MAAM;IACZ,KAAK,EAAE,OAAO;IACd,IAAI,EAAE,MAAM;IACZ,IAAI,EAAE,MAAM;IACZ,IAAI,EAAE,MAAM;IACZ,IAAI,EAAE,MAAM;IACZ,IAAI,EAAE,MAAM;CACZ,CAAC;AAEF,MAAM,CAAC,MAAM,4BAA4B,GAAG,qBAAqB,CAAC;AAElE,MAAM,CAAC,MAAM,iBAAiB,GAAG,CAAC,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,CAAU,CAAC;AAC5F,MAAM,CAAC,MAAM,6BAA6B,GAAG,oDAAoD,CAAC;AAClG,MAAM,CAAC,MAAM,kCAAkC,GAC9C,mGAAmG,CAAC;AACrG,MAAM,CAAC,MAAM,4BAA4B,GAAG,cAAc,CAAC;AAC3D,MAAM,CAAC,MAAM,uBAAuB,GAAG,QAAQ,4BAA4B,IAAI,CAAC;AAChF,MAAM,CAAC,MAAM,8BAA8B,GAAG,sDAAsD,CAAC;AACrG,MAAM,CAAC,MAAM,sBAAsB,GAAkC;IACpE,UAAU,EAAE;QACX;YACC,OAAO,EAAE,8BAA8B;YACvC,KAAK,EAAE;gBACN,KAAK,IAAI,EAAE,CAAC,CAAC;oBACZ,QAAQ,EAAE,KAAK;oBACf,kBAAkB,EAAE;wBACnB,aAAa,EAAE,YAAY;wBAC3B,kBAAkB,EAAE,MAAM;wBAC1B,wBAAwB,EAAE,kCAAkC;qBAC5D;iBACD,CAAC;aACF;SACD;KACD;CACD,CAAC;AASF,SAAS,UAAU,CAAC,KAAa;IAChC,OAAO,KAAK;SACV,KAAK,CAAC,eAAe,CAAC;SACtB,MAAM,CAAC,OAAO,CAAC;SACf,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,GAAG,IAAI,CAAC,CAAC,CAAC,EAAE,WAAW,EAAE,IAAI,EAAE,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,CAAC;SAChE,IAAI,CAAC,EAAE,CAAC,CAAC;AACZ,CAAC;AAED,MAAM,UAAU,kBAAkB,CAAC,IAAY,EAAE,mBAAiD;IACjG,MAAM,UAAU,GAAG,IAAI,CAAC,WAAW,EAAE,CAAC;IACtC,OAAO,CACN,mBAAmB,EAAE,GAAG,CAAC,IAAI,CAAC;QAC9B,mBAAmB,EAAE,GAAG,CAAC,UAAU,CAAC;QACpC,mBAAmB,CAAC,UAAU,CAAC;QAC/B,UAAU,CAAC,IAAI,CAAC,CAChB,CAAC;AACH,CAAC;AAED,MAAM,UAAU,kBAAkB,CAAC,IAAY,EAAE,kBAAgD;IAChG,MAAM,UAAU,GAAG,IAAI,CAAC,WAAW,EAAE,CAAC;IACtC,OAAO,CACN,mBAAmB,CAAC,UAAU,CAAC;QAC/B,kBAAkB,EAAE,GAAG,CAAC,IAAI,CAAC;QAC7B,kBAAkB,EAAE,GAAG,CAAC,UAAU,CAAC;QACnC,CAAC,UAAU,CAAC,UAAU,CAAC,uBAAuB,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,uBAAuB,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CACpG,CAAC;AACH,CAAC;AAED,qFAAqF;AACrF,MAAM,UAAU,WAAW,CAC1B,QAAgB,EAChB,IAAmD;IAEnD,MAAM,KAAK,GAAG,IAAI,IAAI,EAAE,CAAC;IACzB,QAAQ,QAAQ,CAAC,WAAW,EAAE,EAAE,CAAC;QAChC,KAAK,MAAM;YACV,OAAO,EAAE,IAAI,EAAE,KAAK,CAAC,SAAS,IAAI,KAAK,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,CAAC,MAAM,EAAE,KAAK,EAAE,KAAK,CAAC,KAAK,EAAE,CAAC;QAC1F,KAAK,OAAO;YACX,OAAO,EAAE,IAAI,EAAE,KAAK,CAAC,SAAS,IAAI,KAAK,CAAC,IAAI,EAAE,OAAO,EAAE,KAAK,CAAC,OAAO,EAAE,CAAC;QACxE,KAAK,MAAM;YACV,OAAO;gBACN,IAAI,EAAE,KAAK,CAAC,SAAS,IAAI,KAAK,CAAC,IAAI;gBACnC,KAAK,EAAE,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC;oBAChC,CAAC,CAAC,KAAK,CAAC,KAAK;oBACb,CAAC,CAAC;wBACA;4BACC,OAAO,EAAE,KAAK,CAAC,UAAU,IAAI,KAAK,CAAC,OAAO,IAAI,KAAK,CAAC,QAAQ;4BAC5D,OAAO,EAAE,KAAK,CAAC,UAAU,IAAI,KAAK,CAAC,OAAO,IAAI,KAAK,CAAC,QAAQ;yBAC5D;qBACD;aACH,CAAC;QACH,KAAK,MAAM;YACV,OAAO;gBACN,OAAO,EAAE,KAAK,CAAC,OAAO;gBACtB,OAAO,EAAE,OAAO,KAAK,CAAC,OAAO,KAAK,QAAQ,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,GAAG,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO;aAClF,CAAC;QACH,KAAK,MAAM;YACV,OAAO;gBACN,OAAO,EAAE,KAAK,CAAC,OAAO;gBACtB,IAAI,EAAE,KAAK,CAAC,IAAI;gBAChB,IAAI,EAAE,KAAK,CAAC,IAAI;gBAChB,UAAU,EAAE,KAAK,CAAC,IAAI,CAAC,IAAI,KAAK,CAAC,UAAU;gBAC3C,OAAO,EAAE,KAAK,CAAC,OAAO,IAAI,KAAK,CAAC,IAAI,CAAC;gBACrC,KAAK,EAAE,KAAK,CAAC,UAAU,IAAI,KAAK,CAAC,KAAK;aACtC,CAAC;QACH,KAAK,MAAM,CAAC;QACZ,KAAK,MAAM;YACV,OAAO,EAAE,OAAO,EAAE,KAAK,CAAC,OAAO,EAAE,IAAI,EAAE,KAAK,CAAC,IAAI,EAAE,KAAK,EAAE,KAAK,CAAC,KAAK,EAAE,CAAC;QACzE;YACC,OAAO,EAAE,GAAG,KAAK,EAAE,CAAC;IACtB,CAAC;AACF,CAAC;AAED,MAAM,UAAU,eAAe,CAAC,OAAgB;IAC/C,IAAI,CAAC,OAAO,CAAC,KAAK,EAAE,CAAC;QACpB,OAAO;YACN,QAAQ,EAAE,CAAC,GAAG,iBAAiB,CAAC;YAChC,WAAW,EAAE,EAAE;YACf,mBAAmB,EAAE,IAAI,GAAG,EAAE;YAC9B,kBAAkB,EAAE,IAAI,GAAG,EAAE;SAC7B,CAAC;IACH,CAAC;IAED,MAAM,QAAQ,GAAG,IAAI,GAAG,EAAU,CAAC;IACnC,MAAM,WAAW,GAAW,EAAE,CAAC;IAC/B,MAAM,mBAAmB,GAAG,IAAI,GAAG,EAAkB,CAAC;IACtD,MAAM,kBAAkB,GAAG,IAAI,GAAG,EAAkB,CAAC;IACrD,KAAK,MAAM,IAAI,IAAI,OAAO,CAAC,KAAK,EAAE,CAAC;QAClC,MAAM,UAAU,GAAG,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,CAAC;QAC3C,MAAM,OAAO,GAAG,mBAAmB,CAAC,UAAU,CAAC,CAAC;QAChD,IAAI,OAAO,EAAE,CAAC;YACb,QAAQ,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;YACtB,SAAS;QACV,CAAC;QACD,MAAM,aAAa,GAAG,GAAG,uBAAuB,GAAG,IAAI,CAAC,IAAI,EAAE,CAAC;QAC/D,WAAW,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QACvB,mBAAmB,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,EAAE,aAAa,CAAC,CAAC;QAClD,mBAAmB,CAAC,GAAG,CAAC,UAAU,EAAE,aAAa,CAAC,CAAC;QACnD,kBAAkB,CAAC,GAAG,CAAC,aAAa,EAAE,IAAI,CAAC,IAAI,CAAC,CAAC;QACjD,kBAAkB,CAAC,GAAG,CAAC,aAAa,CAAC,WAAW,EAAE,EAAE,IAAI,CAAC,IAAI,CAAC,CAAC;IAChE,CAAC;IACD,OAAO,EAAE,QAAQ,EAAE,CAAC,GAAG,QAAQ,CAAC,EAAE,WAAW,EAAE,mBAAmB,EAAE,kBAAkB,EAAE,CAAC;AAC1F,CAAC;AAED,MAAM,CAAC,MAAM,UAAU,GAAuC,KAAK,IAAI,EAAE,CAAC,CAAC;IAC1E,QAAQ,EAAE,MAAM;IAChB,OAAO,EAAE,6BAA6B;CACtC,CAAC,CAAC","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 HOST_TOOL_POLICY_FINGERPRINT = \"host-tool-denial-v1\";\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
+ {"version":3,"file":"tools.js","sourceRoot":"","sources":["../../../../../src/core/extensions/builtin/claude-sdk-oauth/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\n/**\n * Versioned host-tool denial policy. `configFingerprint` in session-sync.ts hashes this as\n * `hostToolPolicy` into `toolsetHash`; a mismatch is `options_changed` and retires the live\n * resident query. The same hash is persisted in the restart sidecar, so a bump also makes\n * the first admission after an upgrade cold-seed (`flatten` / `options_changed`) instead of\n * resuming the pre-bump SDK session - once per session, intended. Bump when denial copy or\n * hooks change so wording-only edits cannot keep serving the old reason.\n */\nexport const HOST_TOOL_POLICY_FINGERPRINT = \"host-tool-denial-v2\";\n\nexport const BUILTIN_SDK_TOOLS = [\"Read\", \"Write\", \"Edit\", \"Bash\", \"Grep\", \"Glob\"] as const;\nexport const TOOL_EXECUTION_DENIED_MESSAGE =\n\t\"Senpi executes this tool on the host and returns its result as the next user message. \" +\n\t\"Wait for that result; this denial is not a failure.\";\nexport const HOST_TOOL_EXECUTION_DENIED_MESSAGE = TOOL_EXECUTION_DENIED_MESSAGE;\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"]}
@@ -0,0 +1,3 @@
1
+ import type { ExtensionAPI } from "../types.ts";
2
+ export default function gptAccountExtension(pi: ExtensionAPI): void;
3
+ //# sourceMappingURL=gpt-account.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"gpt-account.d.ts","sourceRoot":"","sources":["../../../../src/core/extensions/builtin/gpt-account.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAE,YAAY,EAA2B,MAAM,aAAa,CAAC;AAgFzE,MAAM,CAAC,OAAO,UAAU,mBAAmB,CAAC,EAAE,EAAE,YAAY,GAAG,IAAI,CAmClE"}
@@ -0,0 +1,115 @@
1
+ import { getCredentialAccounts, pinCredentialAccount, removeCredentialAccount, } from "../../../core/credential-accounts.js";
2
+ import { emitProviderAccountsChanged } from "./claude-sdk-oauth/account-events.js";
3
+ const OPENAI_CODEX_PROVIDER_ID = "openai-codex";
4
+ const LOGIN_CANCELLED_MESSAGE = "Login cancelled";
5
+ function parseArgs(rawArgs) {
6
+ return rawArgs.trim().split(/\s+/).filter(Boolean);
7
+ }
8
+ function usage(ctx) {
9
+ ctx.ui.notify("Usage: /gpt-account [add | remove <name> | pin <name> | unpin]", "error");
10
+ }
11
+ function authEventMessage(event) {
12
+ if (event === null || typeof event !== "object")
13
+ return "OpenAI Codex OAuth authentication update.";
14
+ const value = event;
15
+ if (value.type === "auth_url" && typeof value.url === "string") {
16
+ return `Open this URL to authorize OpenAI Codex OAuth:\n${value.url}`;
17
+ }
18
+ if (value.type === "device_code" && typeof value.verificationUri === "string") {
19
+ return `Open this URL to authorize OpenAI Codex OAuth:\n${value.verificationUri}`;
20
+ }
21
+ return typeof value.message === "string" ? value.message : "OpenAI Codex OAuth authentication update.";
22
+ }
23
+ async function showAccounts(ctx) {
24
+ const accounts = await getCredentialAccounts(ctx.modelRegistry.authStorage, OPENAI_CODEX_PROVIDER_ID);
25
+ const lines = ["OpenAI Codex OAuth accounts:"];
26
+ if (accounts.length === 0)
27
+ lines.push(" (none)");
28
+ for (const account of accounts) {
29
+ const states = [account.name, account.source, account.blocked ? "blocked" : "available"];
30
+ if (account.pinned)
31
+ states.push("pinned");
32
+ lines.push(` ${states.join(" | ")}`);
33
+ }
34
+ ctx.ui.notify(lines.join("\n"), "info");
35
+ }
36
+ async function addAccount(ctx) {
37
+ if (!ctx.hasUI) {
38
+ ctx.ui.notify("/gpt-account add requires an interactive UI.", "error");
39
+ return;
40
+ }
41
+ try {
42
+ await ctx.modelRegistry.modelRuntime.login(OPENAI_CODEX_PROVIDER_ID, "oauth", {
43
+ signal: ctx.signal,
44
+ prompt: async (prompt) => {
45
+ const answer = await ctx.ui.input(prompt.message);
46
+ if (answer === undefined)
47
+ throw new Error(LOGIN_CANCELLED_MESSAGE);
48
+ return answer;
49
+ },
50
+ notify: (event) => ctx.ui.notify(authEventMessage(event), "info"),
51
+ });
52
+ emitProviderAccountsChanged(OPENAI_CODEX_PROVIDER_ID);
53
+ ctx.ui.notify("OpenAI Codex OAuth account added.", "info");
54
+ }
55
+ catch (error) {
56
+ const message = error instanceof Error ? error.message : String(error);
57
+ if (message === LOGIN_CANCELLED_MESSAGE)
58
+ return;
59
+ ctx.ui.notify(message, "error");
60
+ }
61
+ }
62
+ async function removeAccount(ctx, name) {
63
+ if (!name) {
64
+ usage(ctx);
65
+ return;
66
+ }
67
+ await removeCredentialAccount(ctx.modelRegistry.authStorage, OPENAI_CODEX_PROVIDER_ID, name);
68
+ ctx.ui.notify(`Removed OpenAI Codex OAuth account '${name}'.`, "info");
69
+ }
70
+ async function pinAccount(ctx, name) {
71
+ if (!name) {
72
+ usage(ctx);
73
+ return;
74
+ }
75
+ await pinCredentialAccount(ctx.modelRegistry.authStorage, OPENAI_CODEX_PROVIDER_ID, name);
76
+ ctx.ui.notify(`Pinned OpenAI Codex OAuth account '${name}'.`, "info");
77
+ }
78
+ export default function gptAccountExtension(pi) {
79
+ pi.registerCommand("gpt-account", {
80
+ description: "List and manage OpenAI Codex OAuth accounts.",
81
+ argumentHint: "[add | remove <name> | pin <name> | unpin]",
82
+ handler: async (rawArgs, ctx) => {
83
+ const args = parseArgs(rawArgs);
84
+ const action = args[0] ?? "list";
85
+ try {
86
+ if (action === "list") {
87
+ await showAccounts(ctx);
88
+ return;
89
+ }
90
+ if (action === "add") {
91
+ await addAccount(ctx);
92
+ return;
93
+ }
94
+ if (action === "remove") {
95
+ await removeAccount(ctx, args[1]);
96
+ return;
97
+ }
98
+ if (action === "pin" && args[1] !== "unpin") {
99
+ await pinAccount(ctx, args[1]);
100
+ return;
101
+ }
102
+ if (action === "unpin" || (action === "pin" && args[1] === "unpin")) {
103
+ await pinCredentialAccount(ctx.modelRegistry.authStorage, OPENAI_CODEX_PROVIDER_ID, null);
104
+ ctx.ui.notify("Unpinned OpenAI Codex OAuth account.", "info");
105
+ return;
106
+ }
107
+ usage(ctx);
108
+ }
109
+ catch (error) {
110
+ ctx.ui.notify(error instanceof Error ? error.message : String(error), "error");
111
+ }
112
+ },
113
+ });
114
+ }
115
+ //# sourceMappingURL=gpt-account.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"gpt-account.js","sourceRoot":"","sources":["../../../../src/core/extensions/builtin/gpt-account.ts"],"names":[],"mappings":"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","sourcesContent":["import {\n\tgetCredentialAccounts,\n\tpinCredentialAccount,\n\tremoveCredentialAccount,\n} from \"../../../core/credential-accounts.ts\";\nimport type { ExtensionAPI, ExtensionCommandContext } from \"../types.ts\";\nimport { emitProviderAccountsChanged } from \"./claude-sdk-oauth/account-events.ts\";\n\nconst OPENAI_CODEX_PROVIDER_ID = \"openai-codex\";\nconst LOGIN_CANCELLED_MESSAGE = \"Login cancelled\";\n\nfunction parseArgs(rawArgs: string): string[] {\n\treturn rawArgs.trim().split(/\\s+/).filter(Boolean);\n}\n\nfunction usage(ctx: ExtensionCommandContext): void {\n\tctx.ui.notify(\"Usage: /gpt-account [add | remove <name> | pin <name> | unpin]\", \"error\");\n}\n\nfunction authEventMessage(event: unknown): string {\n\tif (event === null || typeof event !== \"object\") return \"OpenAI Codex OAuth authentication update.\";\n\tconst value = event as Record<string, unknown>;\n\tif (value.type === \"auth_url\" && typeof value.url === \"string\") {\n\t\treturn `Open this URL to authorize OpenAI Codex OAuth:\\n${value.url}`;\n\t}\n\tif (value.type === \"device_code\" && typeof value.verificationUri === \"string\") {\n\t\treturn `Open this URL to authorize OpenAI Codex OAuth:\\n${value.verificationUri}`;\n\t}\n\treturn typeof value.message === \"string\" ? value.message : \"OpenAI Codex OAuth authentication update.\";\n}\n\nasync function showAccounts(ctx: ExtensionCommandContext): Promise<void> {\n\tconst accounts = await getCredentialAccounts(ctx.modelRegistry.authStorage, OPENAI_CODEX_PROVIDER_ID);\n\tconst lines = [\"OpenAI Codex OAuth accounts:\"];\n\tif (accounts.length === 0) lines.push(\" (none)\");\n\tfor (const account of accounts) {\n\t\tconst states = [account.name, account.source, account.blocked ? \"blocked\" : \"available\"];\n\t\tif (account.pinned) states.push(\"pinned\");\n\t\tlines.push(` ${states.join(\" | \")}`);\n\t}\n\tctx.ui.notify(lines.join(\"\\n\"), \"info\");\n}\n\nasync function addAccount(ctx: ExtensionCommandContext): Promise<void> {\n\tif (!ctx.hasUI) {\n\t\tctx.ui.notify(\"/gpt-account add requires an interactive UI.\", \"error\");\n\t\treturn;\n\t}\n\ttry {\n\t\tawait ctx.modelRegistry.modelRuntime.login(OPENAI_CODEX_PROVIDER_ID, \"oauth\", {\n\t\t\tsignal: ctx.signal,\n\t\t\tprompt: async (prompt) => {\n\t\t\t\tconst answer = await ctx.ui.input(prompt.message);\n\t\t\t\tif (answer === undefined) throw new Error(LOGIN_CANCELLED_MESSAGE);\n\t\t\t\treturn answer;\n\t\t\t},\n\t\t\tnotify: (event) => ctx.ui.notify(authEventMessage(event), \"info\"),\n\t\t});\n\t\temitProviderAccountsChanged(OPENAI_CODEX_PROVIDER_ID);\n\t\tctx.ui.notify(\"OpenAI Codex OAuth account added.\", \"info\");\n\t} catch (error) {\n\t\tconst message = error instanceof Error ? error.message : String(error);\n\t\tif (message === LOGIN_CANCELLED_MESSAGE) return;\n\t\tctx.ui.notify(message, \"error\");\n\t}\n}\n\nasync function removeAccount(ctx: ExtensionCommandContext, name: string | undefined): Promise<void> {\n\tif (!name) {\n\t\tusage(ctx);\n\t\treturn;\n\t}\n\tawait removeCredentialAccount(ctx.modelRegistry.authStorage, OPENAI_CODEX_PROVIDER_ID, name);\n\tctx.ui.notify(`Removed OpenAI Codex OAuth account '${name}'.`, \"info\");\n}\n\nasync function pinAccount(ctx: ExtensionCommandContext, name: string | undefined): Promise<void> {\n\tif (!name) {\n\t\tusage(ctx);\n\t\treturn;\n\t}\n\tawait pinCredentialAccount(ctx.modelRegistry.authStorage, OPENAI_CODEX_PROVIDER_ID, name);\n\tctx.ui.notify(`Pinned OpenAI Codex OAuth account '${name}'.`, \"info\");\n}\n\nexport default function gptAccountExtension(pi: ExtensionAPI): void {\n\tpi.registerCommand(\"gpt-account\", {\n\t\tdescription: \"List and manage OpenAI Codex OAuth accounts.\",\n\t\targumentHint: \"[add | remove <name> | pin <name> | unpin]\",\n\t\thandler: async (rawArgs, ctx) => {\n\t\t\tconst args = parseArgs(rawArgs);\n\t\t\tconst action = args[0] ?? \"list\";\n\t\t\ttry {\n\t\t\t\tif (action === \"list\") {\n\t\t\t\t\tawait showAccounts(ctx);\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t\tif (action === \"add\") {\n\t\t\t\t\tawait addAccount(ctx);\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t\tif (action === \"remove\") {\n\t\t\t\t\tawait removeAccount(ctx, args[1]);\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t\tif (action === \"pin\" && args[1] !== \"unpin\") {\n\t\t\t\t\tawait pinAccount(ctx, args[1]);\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t\tif (action === \"unpin\" || (action === \"pin\" && args[1] === \"unpin\")) {\n\t\t\t\t\tawait pinCredentialAccount(ctx.modelRegistry.authStorage, OPENAI_CODEX_PROVIDER_ID, null);\n\t\t\t\t\tctx.ui.notify(\"Unpinned OpenAI Codex OAuth account.\", \"info\");\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t\tusage(ctx);\n\t\t\t} catch (error) {\n\t\t\t\tctx.ui.notify(error instanceof Error ? error.message : String(error), \"error\");\n\t\t\t}\n\t\t},\n\t});\n}\n"]}
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../src/core/extensions/builtin/index.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,aAAa,CAAC;AAWpD,OAAO,aAAa,MAAM,WAAW,CAAC;AACtC,OAAO,cAAc,MAAM,YAAY,CAAC;AAkBxC,OAAO,wBAAwB,MAAM,wBAAwB,CAAC;AAU9D,OAAO,YAAY,MAAM,UAAU,CAAC;AAMpC,MAAM,WAAW,uBAAuB;IACvC,EAAE,EAAE,MAAM,CAAC;IACX,OAAO,EAAE,gBAAgB,CAAC;CAC1B;AAED,eAAO,MAAM,yBAAyB,wDAAyD,CAAC;AAEhG,eAAO,MAAM,+BAA+B;;;;;CAKoC,CAAC;AAEjF,eAAO,MAAM,iBAAiB,EAAE,uBAAuB,EAqDtD,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../src/core/extensions/builtin/index.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,aAAa,CAAC;AAWpD,OAAO,aAAa,MAAM,WAAW,CAAC;AACtC,OAAO,cAAc,MAAM,YAAY,CAAC;AAmBxC,OAAO,wBAAwB,MAAM,wBAAwB,CAAC;AAU9D,OAAO,YAAY,MAAM,UAAU,CAAC;AAMpC,MAAM,WAAW,uBAAuB;IACvC,EAAE,EAAE,MAAM,CAAC;IACX,OAAO,EAAE,gBAAgB,CAAC;CAC1B;AAED,eAAO,MAAM,yBAAyB,wDAAyD,CAAC;AAEhG,eAAO,MAAM,+BAA+B;;;;;CAKoC,CAAC;AAEjF,eAAO,MAAM,iBAAiB,EAAE,uBAAuB,EAsDtD,CAAC"}
@@ -11,6 +11,7 @@ import cursorCliOauthExtension from "./cursor-cli-oauth/index.js";
11
11
  import diffExtension from "./diff.js";
12
12
  import filesExtension from "./files.js";
13
13
  import goalExtension from "./goal/index.js";
14
+ import gptAccountExtension from "./gpt-account.js";
14
15
  import gptApplyPatchExtension from "./gpt-apply-patch/index.js";
15
16
  import helpExtension from "./help/index.js";
16
17
  import historySearchExtension from "./history-search/index.js";
@@ -93,6 +94,7 @@ export const builtinExtensions = [
93
94
  // Provider-neutral account listing; sits before the provider lanes so their
94
95
  // dedicated commands (claude-account, cursor accounts) keep their own names.
95
96
  { id: "account", factory: accountExtension },
97
+ { id: "gpt-account", factory: gptAccountExtension },
96
98
  { id: "claude-sdk-oauth", factory: claudeSdkOauthExtension },
97
99
  // Registers unconditionally and reports executable/auth state through its oauth check, so it stays beside the other provider lane.
98
100
  { id: "cursor-cli-oauth", factory: cursorCliOauthExtension },
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../src/core/extensions/builtin/index.ts"],"names":[],"mappings":"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","sourcesContent":["import type { ExtensionFactory } from \"../types.ts\";\nimport accountExtension from \"./account/index.ts\";\nimport anthropicBashExtension from \"./anthropic-bash/index.ts\";\nimport anthropicWebSearchExtension from \"./anthropic-web-search/index.ts\";\nimport bashTimeoutExtension from \"./bash-timeout/index.ts\";\nimport btwExtension from \"./btw/index.ts\";\nimport cacheKeepAliveExtension from \"./cache-keepalive/index.ts\";\nimport claudeSdkOauthExtension from \"./claude-sdk-oauth/index.ts\";\nimport compactionExtension from \"./compaction/index.ts\";\nimport configReloadExtension from \"./config-reload/index.ts\";\nimport cursorCliOauthExtension from \"./cursor-cli-oauth/index.ts\";\nimport diffExtension from \"./diff.ts\";\nimport filesExtension from \"./files.ts\";\nimport goalExtension from \"./goal/index.ts\";\nimport gptApplyPatchExtension from \"./gpt-apply-patch/index.ts\";\nimport helpExtension from \"./help/index.ts\";\nimport historySearchExtension from \"./history-search/index.ts\";\nimport hooksExtension from \"./hooks/index.ts\";\nimport imageGenExtension from \"./imagegen/index.ts\";\nimport importReproExtension from \"./import-repro.ts\";\nimport lookAtExtension from \"./look-at/index.ts\";\nimport loopExtension from \"./loop/index.ts\";\nimport loopGuardExtension from \"./loop-guard/index.ts\";\nimport mcpExtension from \"./mcp/index.ts\";\nimport modelFallbackExtension from \"./model-fallback/index.ts\";\nimport nestedAgentsMdExtension from \"./nested-agents-md/index.ts\";\nimport openaiImageGenExtension from \"./openai-image-gen/index.ts\";\nimport openaiWebSearchExtension from \"./openai-web-search/index.ts\";\nimport permissionSystemExtension from \"./permission-system/index.ts\";\nimport promptPresetExtension from \"./prompt-preset/index.ts\";\nimport promptUrlWidgetExtension from \"./prompt-url-widget.ts\";\nimport reasoningExtension from \"./reasoning/index.ts\";\nimport recommendedModelsExtension from \"./recommended-models/index.ts\";\nimport redrawsExtension from \"./redraws.ts\";\nimport piRulesExtension from \"./rules/index.ts\";\nimport serviceTierExtension from \"./service-tier.ts\";\nimport terminalExtension from \"./terminal/index.ts\";\nimport todowriteExtension from \"./todotools/index.ts\";\nimport toolPairGuardExtension from \"./tool-pair-guard/index.ts\";\nimport toolSearchExtension from \"./tool-search/index.ts\";\nimport tpsExtension from \"./tps.ts\";\nimport ttsrExtension from \"./ttsr/index.ts\";\nimport videoInExtension from \"./video-in/index.ts\";\nimport webfetchExtension from \"./webfetch/index.ts\";\nimport websearchExtension from \"./websearch/index.ts\";\n\nexport interface BuiltinExtensionFactory {\n\tid: string;\n\tfactory: ExtensionFactory;\n}\n\nexport const globalDefaultExtensionIds = [\"diff\", \"files\", \"prompt-url-widget\", \"tps\"] as const;\n\nexport const globalDefaultExtensionFactories = {\n\tdiff: diffExtension,\n\tfiles: filesExtension,\n\t\"prompt-url-widget\": promptUrlWidgetExtension,\n\ttps: tpsExtension,\n} satisfies Record<(typeof globalDefaultExtensionIds)[number], ExtensionFactory>;\n\nexport const builtinExtensions: BuiltinExtensionFactory[] = [\n\t// Loop guard owns the first veto opportunity so repeated calls never re-run hooks or permission prompts.\n\t{ id: \"loop-guard\", factory: loopGuardExtension },\n\t{ id: \"hooks\", factory: hooksExtension },\n\t{ id: \"permission-system\", factory: permissionSystemExtension },\n\t{ id: \"gpt-apply-patch\", factory: gptApplyPatchExtension },\n\t{ id: \"imagegen\", factory: imageGenExtension },\n\t// Follows imagegen so the native injector's bypass wiring observes the registered client tool.\n\t{ id: \"openai-image-gen\", factory: openaiImageGenExtension },\n\t{ id: \"prompt-preset\", factory: promptPresetExtension },\n\t{ id: \"todowrite\", factory: todowriteExtension },\n\t{ id: \"redraws\", factory: redrawsExtension },\n\t{ id: \"anthropic-web-search\", factory: anthropicWebSearchExtension },\n\t{ id: \"anthropic-bash\", factory: anthropicBashExtension },\n\t{ id: \"openai-web-search\", factory: openaiWebSearchExtension },\n\t{ id: \"service-tier\", factory: serviceTierExtension },\n\t// Sits beside service-tier: both are capability-aware model-control commands that only read\n\t// the active model and notify; neither mutates payloads, so relative order is not load-bearing.\n\t{ id: \"reasoning\", factory: reasoningExtension },\n\t{ id: \"model-fallback\", factory: modelFallbackExtension },\n\t{ id: \"recommended-models\", factory: recommendedModelsExtension },\n\t{ id: \"bash-timeout\", factory: bashTimeoutExtension },\n\t// Terminal follows bash-timeout so its injected default reaches the PTY bash, and follows\n\t// anthropic-bash so mutual-exclusion (companion step-aside) is evaluated after it registers.\n\t{ id: \"terminal\", factory: terminalExtension },\n\t{ id: \"tool-pair-guard\", factory: toolPairGuardExtension },\n\t{ id: \"compaction\", factory: compactionExtension },\n\t{ id: \"history-search\", factory: historySearchExtension },\n\t{ id: \"help\", factory: helpExtension },\n\t{ id: \"import-repro\", factory: importReproExtension },\n\t{ id: \"websearch\", factory: websearchExtension },\n\t{ id: \"webfetch\", factory: webfetchExtension },\n\t{ id: \"video-in\", factory: videoInExtension },\n\t{ id: \"look-at\", factory: lookAtExtension },\n\t{ id: \"nested-agents-md\", factory: nestedAgentsMdExtension },\n\t{ id: \"rules\", factory: piRulesExtension },\n\t{ id: \"goal\", factory: goalExtension },\n\t{ id: \"loop\", factory: loopExtension },\n\t{ id: \"cache-keepalive\", factory: cacheKeepAliveExtension },\n\t{ id: \"ttsr\", factory: ttsrExtension },\n\t{ id: \"btw\", factory: btwExtension },\n\t// Provider-neutral account listing; sits before the provider lanes so their\n\t// dedicated commands (claude-account, cursor accounts) keep their own names.\n\t{ id: \"account\", factory: accountExtension },\n\t{ id: \"claude-sdk-oauth\", factory: claudeSdkOauthExtension },\n\t// Registers unconditionally and reports executable/auth state through its oauth check, so it stays beside the other provider lane.\n\t{ id: \"cursor-cli-oauth\", factory: cursorCliOauthExtension },\n\t// Config reload follows settings-dependent builtins so reloads rebuild their resolved settings before catalog feeders observe them.\n\t{ id: \"config-reload\", factory: configReloadExtension },\n\t// Shared catalog wiring loads before MCP, which feeds its tools into the shared catalog as the final builtin.\n\t{ id: \"tool-search\", factory: toolSearchExtension },\n\t// Keep MCP last so its eventual provider-payload tap observes all co-resident builtin mutations.\n\t{ id: \"mcp\", factory: mcpExtension },\n];\n"]}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../src/core/extensions/builtin/index.ts"],"names":[],"mappings":"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","sourcesContent":["import type { ExtensionFactory } from \"../types.ts\";\nimport accountExtension from \"./account/index.ts\";\nimport anthropicBashExtension from \"./anthropic-bash/index.ts\";\nimport anthropicWebSearchExtension from \"./anthropic-web-search/index.ts\";\nimport bashTimeoutExtension from \"./bash-timeout/index.ts\";\nimport btwExtension from \"./btw/index.ts\";\nimport cacheKeepAliveExtension from \"./cache-keepalive/index.ts\";\nimport claudeSdkOauthExtension from \"./claude-sdk-oauth/index.ts\";\nimport compactionExtension from \"./compaction/index.ts\";\nimport configReloadExtension from \"./config-reload/index.ts\";\nimport cursorCliOauthExtension from \"./cursor-cli-oauth/index.ts\";\nimport diffExtension from \"./diff.ts\";\nimport filesExtension from \"./files.ts\";\nimport goalExtension from \"./goal/index.ts\";\nimport gptAccountExtension from \"./gpt-account.ts\";\nimport gptApplyPatchExtension from \"./gpt-apply-patch/index.ts\";\nimport helpExtension from \"./help/index.ts\";\nimport historySearchExtension from \"./history-search/index.ts\";\nimport hooksExtension from \"./hooks/index.ts\";\nimport imageGenExtension from \"./imagegen/index.ts\";\nimport importReproExtension from \"./import-repro.ts\";\nimport lookAtExtension from \"./look-at/index.ts\";\nimport loopExtension from \"./loop/index.ts\";\nimport loopGuardExtension from \"./loop-guard/index.ts\";\nimport mcpExtension from \"./mcp/index.ts\";\nimport modelFallbackExtension from \"./model-fallback/index.ts\";\nimport nestedAgentsMdExtension from \"./nested-agents-md/index.ts\";\nimport openaiImageGenExtension from \"./openai-image-gen/index.ts\";\nimport openaiWebSearchExtension from \"./openai-web-search/index.ts\";\nimport permissionSystemExtension from \"./permission-system/index.ts\";\nimport promptPresetExtension from \"./prompt-preset/index.ts\";\nimport promptUrlWidgetExtension from \"./prompt-url-widget.ts\";\nimport reasoningExtension from \"./reasoning/index.ts\";\nimport recommendedModelsExtension from \"./recommended-models/index.ts\";\nimport redrawsExtension from \"./redraws.ts\";\nimport piRulesExtension from \"./rules/index.ts\";\nimport serviceTierExtension from \"./service-tier.ts\";\nimport terminalExtension from \"./terminal/index.ts\";\nimport todowriteExtension from \"./todotools/index.ts\";\nimport toolPairGuardExtension from \"./tool-pair-guard/index.ts\";\nimport toolSearchExtension from \"./tool-search/index.ts\";\nimport tpsExtension from \"./tps.ts\";\nimport ttsrExtension from \"./ttsr/index.ts\";\nimport videoInExtension from \"./video-in/index.ts\";\nimport webfetchExtension from \"./webfetch/index.ts\";\nimport websearchExtension from \"./websearch/index.ts\";\n\nexport interface BuiltinExtensionFactory {\n\tid: string;\n\tfactory: ExtensionFactory;\n}\n\nexport const globalDefaultExtensionIds = [\"diff\", \"files\", \"prompt-url-widget\", \"tps\"] as const;\n\nexport const globalDefaultExtensionFactories = {\n\tdiff: diffExtension,\n\tfiles: filesExtension,\n\t\"prompt-url-widget\": promptUrlWidgetExtension,\n\ttps: tpsExtension,\n} satisfies Record<(typeof globalDefaultExtensionIds)[number], ExtensionFactory>;\n\nexport const builtinExtensions: BuiltinExtensionFactory[] = [\n\t// Loop guard owns the first veto opportunity so repeated calls never re-run hooks or permission prompts.\n\t{ id: \"loop-guard\", factory: loopGuardExtension },\n\t{ id: \"hooks\", factory: hooksExtension },\n\t{ id: \"permission-system\", factory: permissionSystemExtension },\n\t{ id: \"gpt-apply-patch\", factory: gptApplyPatchExtension },\n\t{ id: \"imagegen\", factory: imageGenExtension },\n\t// Follows imagegen so the native injector's bypass wiring observes the registered client tool.\n\t{ id: \"openai-image-gen\", factory: openaiImageGenExtension },\n\t{ id: \"prompt-preset\", factory: promptPresetExtension },\n\t{ id: \"todowrite\", factory: todowriteExtension },\n\t{ id: \"redraws\", factory: redrawsExtension },\n\t{ id: \"anthropic-web-search\", factory: anthropicWebSearchExtension },\n\t{ id: \"anthropic-bash\", factory: anthropicBashExtension },\n\t{ id: \"openai-web-search\", factory: openaiWebSearchExtension },\n\t{ id: \"service-tier\", factory: serviceTierExtension },\n\t// Sits beside service-tier: both are capability-aware model-control commands that only read\n\t// the active model and notify; neither mutates payloads, so relative order is not load-bearing.\n\t{ id: \"reasoning\", factory: reasoningExtension },\n\t{ id: \"model-fallback\", factory: modelFallbackExtension },\n\t{ id: \"recommended-models\", factory: recommendedModelsExtension },\n\t{ id: \"bash-timeout\", factory: bashTimeoutExtension },\n\t// Terminal follows bash-timeout so its injected default reaches the PTY bash, and follows\n\t// anthropic-bash so mutual-exclusion (companion step-aside) is evaluated after it registers.\n\t{ id: \"terminal\", factory: terminalExtension },\n\t{ id: \"tool-pair-guard\", factory: toolPairGuardExtension },\n\t{ id: \"compaction\", factory: compactionExtension },\n\t{ id: \"history-search\", factory: historySearchExtension },\n\t{ id: \"help\", factory: helpExtension },\n\t{ id: \"import-repro\", factory: importReproExtension },\n\t{ id: \"websearch\", factory: websearchExtension },\n\t{ id: \"webfetch\", factory: webfetchExtension },\n\t{ id: \"video-in\", factory: videoInExtension },\n\t{ id: \"look-at\", factory: lookAtExtension },\n\t{ id: \"nested-agents-md\", factory: nestedAgentsMdExtension },\n\t{ id: \"rules\", factory: piRulesExtension },\n\t{ id: \"goal\", factory: goalExtension },\n\t{ id: \"loop\", factory: loopExtension },\n\t{ id: \"cache-keepalive\", factory: cacheKeepAliveExtension },\n\t{ id: \"ttsr\", factory: ttsrExtension },\n\t{ id: \"btw\", factory: btwExtension },\n\t// Provider-neutral account listing; sits before the provider lanes so their\n\t// dedicated commands (claude-account, cursor accounts) keep their own names.\n\t{ id: \"account\", factory: accountExtension },\n\t{ id: \"gpt-account\", factory: gptAccountExtension },\n\t{ id: \"claude-sdk-oauth\", factory: claudeSdkOauthExtension },\n\t// Registers unconditionally and reports executable/auth state through its oauth check, so it stays beside the other provider lane.\n\t{ id: \"cursor-cli-oauth\", factory: cursorCliOauthExtension },\n\t// Config reload follows settings-dependent builtins so reloads rebuild their resolved settings before catalog feeders observe them.\n\t{ id: \"config-reload\", factory: configReloadExtension },\n\t// Shared catalog wiring loads before MCP, which feeds its tools into the shared catalog as the final builtin.\n\t{ id: \"tool-search\", factory: toolSearchExtension },\n\t// Keep MCP last so its eventual provider-payload tap observes all co-resident builtin mutations.\n\t{ id: \"mcp\", factory: mcpExtension },\n];\n"]}
@@ -1 +1 @@
1
- {"version":3,"file":"print-mode.d.ts","sourceRoot":"","sources":["../../src/modes/print-mode.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,uBAAuB,CAAC;AAC1D,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,kCAAkC,CAAC;AAM5E;;GAEG;AACH,MAAM,WAAW,gBAAgB;IAChC,yEAAyE;IACzE,IAAI,EAAE,MAAM,GAAG,MAAM,CAAC;IACtB,+DAA+D;IAC/D,QAAQ,CAAC,EAAE,MAAM,EAAE,CAAC;IACpB,wDAAwD;IACxD,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,8CAA8C;IAC9C,aAAa,CAAC,EAAE,YAAY,EAAE,CAAC;CAC/B;AAED;;;GAGG;AACH,wBAAsB,YAAY,CAAC,WAAW,EAAE,mBAAmB,EAAE,OAAO,EAAE,gBAAgB,GAAG,OAAO,CAAC,MAAM,CAAC,CA4I/G"}
1
+ {"version":3,"file":"print-mode.d.ts","sourceRoot":"","sources":["../../src/modes/print-mode.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,uBAAuB,CAAC;AAC1D,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,kCAAkC,CAAC;AAM5E;;GAEG;AACH,MAAM,WAAW,gBAAgB;IAChC,yEAAyE;IACzE,IAAI,EAAE,MAAM,GAAG,MAAM,CAAC;IACtB,+DAA+D;IAC/D,QAAQ,CAAC,EAAE,MAAM,EAAE,CAAC;IACpB,wDAAwD;IACxD,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,8CAA8C;IAC9C,aAAa,CAAC,EAAE,YAAY,EAAE,CAAC;CAC/B;AAED;;;GAGG;AACH,wBAAsB,YAAY,CAAC,WAAW,EAAE,mBAAmB,EAAE,OAAO,EAAE,gBAAgB,GAAG,OAAO,CAAC,MAAM,CAAC,CAmJ/G"}
@@ -83,6 +83,15 @@ export async function runPrintMode(runtimeHost, options) {
83
83
  unsubscribe?.();
84
84
  unsubscribeBackpressure?.();
85
85
  unsubscribe = session.subscribe((event) => {
86
+ if (event.type === "retry_fallback_applied") {
87
+ console.error(`Model fallback: ${event.from} -> ${event.to} (${event.reason})`);
88
+ }
89
+ else if (event.type === "retry_fallback_exhausted") {
90
+ console.error(`Model fallback exhausted: ${event.chainKey} (${event.lastError})`);
91
+ }
92
+ else if (event.type === "retry_fallback_reverted") {
93
+ console.error(`Model fallback reverted: ${event.from} -> ${event.to}`);
94
+ }
86
95
  if (mode === "json") {
87
96
  writeRawStdout(`${JSON.stringify(toJsonEvent(event))}\n`);
88
97
  }
@@ -1 +1 @@
1
- {"version":3,"file":"print-mode.js","sourceRoot":"","sources":["../../src/modes/print-mode.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * Print mode (single-shot): Send prompts, output result, exit.\n *\n * Used for:\n * - `pi -p \"prompt\"` - text output\n * - `senpi --mode json \"prompt\"` - JSON event stream\n */\n\nimport type { ImageContent } from \"@earendil-works/pi-ai\";\nimport type { AgentSessionRuntime } from \"../core/agent-session-runtime.ts\";\nimport { flushRawStdout, waitForRawStdoutBackpressure, writeRawStdout } from \"../core/output-guard.ts\";\nimport { killTrackedDetachedChildren } from \"../utils/shell.ts\";\nimport { toJsonEvent } from \"./json-event.ts\";\nimport { formatProviderNativeBody, formatProviderNativeSummary } from \"./provider-native-rendering.ts\";\n\n/**\n * Options for print mode.\n */\nexport interface PrintModeOptions {\n\t/** Output mode: \"text\" for final response only, \"json\" for all events */\n\tmode: \"text\" | \"json\";\n\t/** Array of additional prompts to send after initialMessage */\n\tmessages?: string[];\n\t/** First message to send (may contain @file content) */\n\tinitialMessage?: string;\n\t/** Images to attach to the initial message */\n\tinitialImages?: ImageContent[];\n}\n\n/**\n * Run in print (single-shot) mode.\n * Sends prompts to the agent and outputs the result.\n */\nexport async function runPrintMode(runtimeHost: AgentSessionRuntime, options: PrintModeOptions): Promise<number> {\n\tconst { mode, messages = [], initialMessage, initialImages } = options;\n\tlet exitCode = 0;\n\tlet session = runtimeHost.session;\n\tlet unsubscribe: (() => void) | undefined;\n\tlet unsubscribeBackpressure: (() => void) | undefined;\n\tlet disposed = false;\n\tconst signalCleanupHandlers: Array<() => void> = [];\n\n\tconst disposeRuntime = async (): Promise<void> => {\n\t\tif (disposed) return;\n\t\tdisposed = true;\n\t\tunsubscribe?.();\n\t\tunsubscribeBackpressure?.();\n\t\tawait runtimeHost.dispose();\n\t};\n\n\tconst registerSignalHandlers = (): void => {\n\t\tconst signals: NodeJS.Signals[] = [\"SIGTERM\"];\n\t\tif (process.platform !== \"win32\") {\n\t\t\tsignals.push(\"SIGHUP\");\n\t\t}\n\n\t\tfor (const signal of signals) {\n\t\t\tconst handler = () => {\n\t\t\t\tkillTrackedDetachedChildren();\n\t\t\t\tvoid disposeRuntime().finally(() => {\n\t\t\t\t\tprocess.exit(signal === \"SIGHUP\" ? 129 : 143);\n\t\t\t\t});\n\t\t\t};\n\t\t\tprocess.on(signal, handler);\n\t\t\tsignalCleanupHandlers.push(() => process.off(signal, handler));\n\t\t}\n\t};\n\n\tregisterSignalHandlers();\n\n\truntimeHost.setRebindSession(async () => {\n\t\tawait rebindSession();\n\t});\n\n\tconst rebindSession = async (): Promise<void> => {\n\t\tsession = runtimeHost.session;\n\t\tawait session.bindExtensions({\n\t\t\tmode: mode === \"json\" ? \"json\" : \"print\",\n\t\t\tcommandContextActions: {\n\t\t\t\twaitForIdle: () => session.waitForIdle(),\n\t\t\t\tnewSession: async (newSessionOptions) => runtimeHost.newSession(newSessionOptions),\n\t\t\t\tfork: async (entryId, forkOptions) => {\n\t\t\t\t\tconst result = await runtimeHost.fork(entryId, forkOptions);\n\t\t\t\t\treturn { cancelled: result.cancelled };\n\t\t\t\t},\n\t\t\t\tnavigateTree: async (targetId, navigateOptions) => {\n\t\t\t\t\tconst result = await session.navigateTree(targetId, {\n\t\t\t\t\t\tsummarize: navigateOptions?.summarize,\n\t\t\t\t\t\tcustomInstructions: navigateOptions?.customInstructions,\n\t\t\t\t\t\treplaceInstructions: navigateOptions?.replaceInstructions,\n\t\t\t\t\t\tlabel: navigateOptions?.label,\n\t\t\t\t\t});\n\t\t\t\t\treturn { cancelled: result.cancelled };\n\t\t\t\t},\n\t\t\t\tswitchSession: async (sessionPath, switchOptions) => {\n\t\t\t\t\treturn runtimeHost.switchSession(sessionPath, switchOptions);\n\t\t\t\t},\n\t\t\t\treload: async () => {\n\t\t\t\t\tawait session.reload();\n\t\t\t\t},\n\t\t\t},\n\t\t\tonError: (err) => {\n\t\t\t\tconsole.error(`Extension error (${err.extensionPath}): ${err.error}`);\n\t\t\t},\n\t\t});\n\n\t\tunsubscribe?.();\n\t\tunsubscribeBackpressure?.();\n\t\tunsubscribe = session.subscribe((event) => {\n\t\t\tif (mode === \"json\") {\n\t\t\t\twriteRawStdout(`${JSON.stringify(toJsonEvent(event))}\\n`);\n\t\t\t}\n\t\t});\n\t\tunsubscribeBackpressure =\n\t\t\tmode === \"json\"\n\t\t\t\t? session.agent.subscribe(async () => {\n\t\t\t\t\t\tawait waitForRawStdoutBackpressure();\n\t\t\t\t\t})\n\t\t\t\t: undefined;\n\t};\n\n\ttry {\n\t\tif (mode === \"json\") {\n\t\t\tconst header = session.sessionManager.getHeader();\n\t\t\tif (header) {\n\t\t\t\twriteRawStdout(`${JSON.stringify(header)}\\n`);\n\t\t\t}\n\t\t}\n\n\t\tawait rebindSession();\n\n\t\tif (initialMessage) {\n\t\t\tawait session.prompt(initialMessage, { images: initialImages, sessionTitlePrompt: false });\n\t\t}\n\n\t\tfor (const message of messages) {\n\t\t\tawait session.prompt(message, { sessionTitlePrompt: false });\n\t\t}\n\n\t\tif (mode === \"text\") {\n\t\t\tconst state = session.state;\n\t\t\tconst lastMessage = state.messages.findLast((message) => message.role === \"assistant\");\n\n\t\t\tif (lastMessage?.role === \"assistant\") {\n\t\t\t\tconst assistantMsg = lastMessage;\n\t\t\t\tif (assistantMsg.stopReason === \"error\" || assistantMsg.stopReason === \"aborted\") {\n\t\t\t\t\tconsole.error(assistantMsg.errorMessage || `Request ${assistantMsg.stopReason}`);\n\t\t\t\t\texitCode = 1;\n\t\t\t\t} else {\n\t\t\t\t\tfor (const content of assistantMsg.content) {\n\t\t\t\t\t\tif (content.type === \"text\") {\n\t\t\t\t\t\t\twriteRawStdout(`${content.text}\\n`);\n\t\t\t\t\t\t} else if (content.type === \"providerNative\") {\n\t\t\t\t\t\t\twriteRawStdout(`${formatProviderNativeSummary(assistantMsg, content, false)}\\n`);\n\t\t\t\t\t\t\twriteRawStdout(`${formatProviderNativeBody(content, false)}\\n`);\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tawait session.waitForSettledSessionWork();\n\t\treturn exitCode;\n\t} catch (error: unknown) {\n\t\tconsole.error(error instanceof Error ? error.message : String(error));\n\t\treturn 1;\n\t} finally {\n\t\tfor (const cleanup of signalCleanupHandlers) {\n\t\t\tcleanup();\n\t\t}\n\t\tawait disposeRuntime();\n\t\tawait flushRawStdout();\n\t}\n}\n"]}
1
+ {"version":3,"file":"print-mode.js","sourceRoot":"","sources":["../../src/modes/print-mode.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * Print mode (single-shot): Send prompts, output result, exit.\n *\n * Used for:\n * - `pi -p \"prompt\"` - text output\n * - `senpi --mode json \"prompt\"` - JSON event stream\n */\n\nimport type { ImageContent } from \"@earendil-works/pi-ai\";\nimport type { AgentSessionRuntime } from \"../core/agent-session-runtime.ts\";\nimport { flushRawStdout, waitForRawStdoutBackpressure, writeRawStdout } from \"../core/output-guard.ts\";\nimport { killTrackedDetachedChildren } from \"../utils/shell.ts\";\nimport { toJsonEvent } from \"./json-event.ts\";\nimport { formatProviderNativeBody, formatProviderNativeSummary } from \"./provider-native-rendering.ts\";\n\n/**\n * Options for print mode.\n */\nexport interface PrintModeOptions {\n\t/** Output mode: \"text\" for final response only, \"json\" for all events */\n\tmode: \"text\" | \"json\";\n\t/** Array of additional prompts to send after initialMessage */\n\tmessages?: string[];\n\t/** First message to send (may contain @file content) */\n\tinitialMessage?: string;\n\t/** Images to attach to the initial message */\n\tinitialImages?: ImageContent[];\n}\n\n/**\n * Run in print (single-shot) mode.\n * Sends prompts to the agent and outputs the result.\n */\nexport async function runPrintMode(runtimeHost: AgentSessionRuntime, options: PrintModeOptions): Promise<number> {\n\tconst { mode, messages = [], initialMessage, initialImages } = options;\n\tlet exitCode = 0;\n\tlet session = runtimeHost.session;\n\tlet unsubscribe: (() => void) | undefined;\n\tlet unsubscribeBackpressure: (() => void) | undefined;\n\tlet disposed = false;\n\tconst signalCleanupHandlers: Array<() => void> = [];\n\n\tconst disposeRuntime = async (): Promise<void> => {\n\t\tif (disposed) return;\n\t\tdisposed = true;\n\t\tunsubscribe?.();\n\t\tunsubscribeBackpressure?.();\n\t\tawait runtimeHost.dispose();\n\t};\n\n\tconst registerSignalHandlers = (): void => {\n\t\tconst signals: NodeJS.Signals[] = [\"SIGTERM\"];\n\t\tif (process.platform !== \"win32\") {\n\t\t\tsignals.push(\"SIGHUP\");\n\t\t}\n\n\t\tfor (const signal of signals) {\n\t\t\tconst handler = () => {\n\t\t\t\tkillTrackedDetachedChildren();\n\t\t\t\tvoid disposeRuntime().finally(() => {\n\t\t\t\t\tprocess.exit(signal === \"SIGHUP\" ? 129 : 143);\n\t\t\t\t});\n\t\t\t};\n\t\t\tprocess.on(signal, handler);\n\t\t\tsignalCleanupHandlers.push(() => process.off(signal, handler));\n\t\t}\n\t};\n\n\tregisterSignalHandlers();\n\n\truntimeHost.setRebindSession(async () => {\n\t\tawait rebindSession();\n\t});\n\n\tconst rebindSession = async (): Promise<void> => {\n\t\tsession = runtimeHost.session;\n\t\tawait session.bindExtensions({\n\t\t\tmode: mode === \"json\" ? \"json\" : \"print\",\n\t\t\tcommandContextActions: {\n\t\t\t\twaitForIdle: () => session.waitForIdle(),\n\t\t\t\tnewSession: async (newSessionOptions) => runtimeHost.newSession(newSessionOptions),\n\t\t\t\tfork: async (entryId, forkOptions) => {\n\t\t\t\t\tconst result = await runtimeHost.fork(entryId, forkOptions);\n\t\t\t\t\treturn { cancelled: result.cancelled };\n\t\t\t\t},\n\t\t\t\tnavigateTree: async (targetId, navigateOptions) => {\n\t\t\t\t\tconst result = await session.navigateTree(targetId, {\n\t\t\t\t\t\tsummarize: navigateOptions?.summarize,\n\t\t\t\t\t\tcustomInstructions: navigateOptions?.customInstructions,\n\t\t\t\t\t\treplaceInstructions: navigateOptions?.replaceInstructions,\n\t\t\t\t\t\tlabel: navigateOptions?.label,\n\t\t\t\t\t});\n\t\t\t\t\treturn { cancelled: result.cancelled };\n\t\t\t\t},\n\t\t\t\tswitchSession: async (sessionPath, switchOptions) => {\n\t\t\t\t\treturn runtimeHost.switchSession(sessionPath, switchOptions);\n\t\t\t\t},\n\t\t\t\treload: async () => {\n\t\t\t\t\tawait session.reload();\n\t\t\t\t},\n\t\t\t},\n\t\t\tonError: (err) => {\n\t\t\t\tconsole.error(`Extension error (${err.extensionPath}): ${err.error}`);\n\t\t\t},\n\t\t});\n\n\t\tunsubscribe?.();\n\t\tunsubscribeBackpressure?.();\n\t\tunsubscribe = session.subscribe((event) => {\n\t\t\tif (event.type === \"retry_fallback_applied\") {\n\t\t\t\tconsole.error(`Model fallback: ${event.from} -> ${event.to} (${event.reason})`);\n\t\t\t} else if (event.type === \"retry_fallback_exhausted\") {\n\t\t\t\tconsole.error(`Model fallback exhausted: ${event.chainKey} (${event.lastError})`);\n\t\t\t} else if (event.type === \"retry_fallback_reverted\") {\n\t\t\t\tconsole.error(`Model fallback reverted: ${event.from} -> ${event.to}`);\n\t\t\t}\n\t\t\tif (mode === \"json\") {\n\t\t\t\twriteRawStdout(`${JSON.stringify(toJsonEvent(event))}\\n`);\n\t\t\t}\n\t\t});\n\t\tunsubscribeBackpressure =\n\t\t\tmode === \"json\"\n\t\t\t\t? session.agent.subscribe(async () => {\n\t\t\t\t\t\tawait waitForRawStdoutBackpressure();\n\t\t\t\t\t})\n\t\t\t\t: undefined;\n\t};\n\n\ttry {\n\t\tif (mode === \"json\") {\n\t\t\tconst header = session.sessionManager.getHeader();\n\t\t\tif (header) {\n\t\t\t\twriteRawStdout(`${JSON.stringify(header)}\\n`);\n\t\t\t}\n\t\t}\n\n\t\tawait rebindSession();\n\n\t\tif (initialMessage) {\n\t\t\tawait session.prompt(initialMessage, { images: initialImages, sessionTitlePrompt: false });\n\t\t}\n\n\t\tfor (const message of messages) {\n\t\t\tawait session.prompt(message, { sessionTitlePrompt: false });\n\t\t}\n\n\t\tif (mode === \"text\") {\n\t\t\tconst state = session.state;\n\t\t\tconst lastMessage = state.messages.findLast((message) => message.role === \"assistant\");\n\n\t\t\tif (lastMessage?.role === \"assistant\") {\n\t\t\t\tconst assistantMsg = lastMessage;\n\t\t\t\tif (assistantMsg.stopReason === \"error\" || assistantMsg.stopReason === \"aborted\") {\n\t\t\t\t\tconsole.error(assistantMsg.errorMessage || `Request ${assistantMsg.stopReason}`);\n\t\t\t\t\texitCode = 1;\n\t\t\t\t} else {\n\t\t\t\t\tfor (const content of assistantMsg.content) {\n\t\t\t\t\t\tif (content.type === \"text\") {\n\t\t\t\t\t\t\twriteRawStdout(`${content.text}\\n`);\n\t\t\t\t\t\t} else if (content.type === \"providerNative\") {\n\t\t\t\t\t\t\twriteRawStdout(`${formatProviderNativeSummary(assistantMsg, content, false)}\\n`);\n\t\t\t\t\t\t\twriteRawStdout(`${formatProviderNativeBody(content, false)}\\n`);\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tawait session.waitForSettledSessionWork();\n\t\treturn exitCode;\n\t} catch (error: unknown) {\n\t\tconsole.error(error instanceof Error ? error.message : String(error));\n\t\treturn 1;\n\t} finally {\n\t\tfor (const cleanup of signalCleanupHandlers) {\n\t\t\tcleanup();\n\t\t}\n\t\tawait disposeRuntime();\n\t\tawait flushRawStdout();\n\t}\n}\n"]}