@wrongstack/core 0.287.0 → 0.291.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (339) hide show
  1. package/dist/agent-status-tracker.d.ts +13 -0
  2. package/dist/agent-status-tracker.d.ts.map +1 -1
  3. package/dist/boot.d.ts.map +1 -1
  4. package/dist/chronicle/context.d.ts +13 -0
  5. package/dist/chronicle/context.d.ts.map +1 -0
  6. package/dist/chronicle/decision-adapter.d.ts +13 -0
  7. package/dist/chronicle/decision-adapter.d.ts.map +1 -0
  8. package/dist/chronicle/domain-adapter.d.ts +13 -0
  9. package/dist/chronicle/domain-adapter.d.ts.map +1 -0
  10. package/dist/chronicle/file-observer.d.ts +20 -0
  11. package/dist/chronicle/file-observer.d.ts.map +1 -0
  12. package/dist/chronicle/health-monitor.d.ts +11 -0
  13. package/dist/chronicle/health-monitor.d.ts.map +1 -0
  14. package/dist/chronicle/identity.d.ts +18 -0
  15. package/dist/chronicle/identity.d.ts.map +1 -0
  16. package/dist/chronicle/index.d.ts +16 -0
  17. package/dist/chronicle/index.d.ts.map +1 -0
  18. package/dist/chronicle/index.js +2555 -0
  19. package/dist/chronicle/index.js.map +7 -0
  20. package/dist/chronicle/journal.d.ts +81 -0
  21. package/dist/chronicle/journal.d.ts.map +1 -0
  22. package/dist/chronicle/process-adapter.d.ts +14 -0
  23. package/dist/chronicle/process-adapter.d.ts.map +1 -0
  24. package/dist/chronicle/prompt-manifest.d.ts +34 -0
  25. package/dist/chronicle/prompt-manifest.d.ts.map +1 -0
  26. package/dist/chronicle/provider-adapter.d.ts +13 -0
  27. package/dist/chronicle/provider-adapter.d.ts.map +1 -0
  28. package/dist/chronicle/query.d.ts +108 -0
  29. package/dist/chronicle/query.d.ts.map +1 -0
  30. package/dist/chronicle/rollup-adapter.d.ts +14 -0
  31. package/dist/chronicle/rollup-adapter.d.ts.map +1 -0
  32. package/dist/chronicle/stream-adapter.d.ts +13 -0
  33. package/dist/chronicle/stream-adapter.d.ts.map +1 -0
  34. package/dist/chronicle/tool-adapter.d.ts +15 -0
  35. package/dist/chronicle/tool-adapter.d.ts.map +1 -0
  36. package/dist/chronicle/types.d.ts +82 -0
  37. package/dist/chronicle/types.d.ts.map +1 -0
  38. package/dist/coordination/agent-monitor.d.ts +40 -0
  39. package/dist/coordination/agent-monitor.d.ts.map +1 -1
  40. package/dist/coordination/agent-subagent-runner.d.ts +7 -1
  41. package/dist/coordination/agent-subagent-runner.d.ts.map +1 -1
  42. package/dist/coordination/agents/phase6-domain.d.ts.map +1 -1
  43. package/dist/coordination/autonomous-coordinator.d.ts +2 -0
  44. package/dist/coordination/autonomous-coordinator.d.ts.map +1 -1
  45. package/dist/coordination/brain-monitor.d.ts +1 -1
  46. package/dist/coordination/brain.d.ts +3 -2
  47. package/dist/coordination/brain.d.ts.map +1 -1
  48. package/dist/coordination/collab-debug.d.ts +0 -9
  49. package/dist/coordination/collab-debug.d.ts.map +1 -1
  50. package/dist/coordination/coordinator/error-classifier.d.ts.map +1 -1
  51. package/dist/coordination/dep-watcher.d.ts +2 -1
  52. package/dist/coordination/dep-watcher.d.ts.map +1 -1
  53. package/dist/coordination/director/director-collab.d.ts +1 -1
  54. package/dist/coordination/director/director-collab.d.ts.map +1 -1
  55. package/dist/coordination/director-tools.d.ts.map +1 -1
  56. package/dist/coordination/director.d.ts +10 -1
  57. package/dist/coordination/director.d.ts.map +1 -1
  58. package/dist/coordination/file-author-tracker.d.ts.map +1 -1
  59. package/dist/coordination/fleet-bus.d.ts.map +1 -1
  60. package/dist/coordination/fleet-event-validation.d.ts +0 -7
  61. package/dist/coordination/fleet-event-validation.d.ts.map +1 -1
  62. package/dist/coordination/fleet-spawn.d.ts.map +1 -1
  63. package/dist/coordination/fleet-supervisor.d.ts +1 -1
  64. package/dist/coordination/fleet-supervisor.d.ts.map +1 -1
  65. package/dist/coordination/fleet.d.ts +0 -44
  66. package/dist/coordination/fleet.d.ts.map +1 -1
  67. package/dist/coordination/global-mailbox.d.ts +7 -1
  68. package/dist/coordination/global-mailbox.d.ts.map +1 -1
  69. package/dist/coordination/index.d.ts +5 -3
  70. package/dist/coordination/index.d.ts.map +1 -1
  71. package/dist/coordination/index.js +2426 -299
  72. package/dist/coordination/index.js.map +4 -4
  73. package/dist/coordination/knowledge-graph.d.ts +2 -1
  74. package/dist/coordination/knowledge-graph.d.ts.map +1 -1
  75. package/dist/coordination/large-answer-store.d.ts +0 -6
  76. package/dist/coordination/large-answer-store.d.ts.map +1 -1
  77. package/dist/coordination/mail-tools.d.ts +2 -2
  78. package/dist/coordination/mail-tools.d.ts.map +1 -1
  79. package/dist/coordination/mailbox-hooks.d.ts +2 -0
  80. package/dist/coordination/mailbox-hooks.d.ts.map +1 -1
  81. package/dist/coordination/mailbox-http-router.d.ts +43 -0
  82. package/dist/coordination/mailbox-http-router.d.ts.map +1 -0
  83. package/dist/coordination/mailbox-message-codec.d.ts +35 -0
  84. package/dist/coordination/mailbox-message-codec.d.ts.map +1 -1
  85. package/dist/coordination/mailbox-tool.d.ts +1 -1
  86. package/dist/coordination/mailbox-tool.d.ts.map +1 -1
  87. package/dist/coordination/mailbox-types.d.ts +170 -10
  88. package/dist/coordination/mailbox-types.d.ts.map +1 -1
  89. package/dist/coordination/mailbox.d.ts +1 -1
  90. package/dist/coordination/mailbox.d.ts.map +1 -1
  91. package/dist/coordination/package-author-tracker.d.ts.map +1 -1
  92. package/dist/coordination/provider-status-tracker.d.ts +236 -0
  93. package/dist/coordination/provider-status-tracker.d.ts.map +1 -0
  94. package/dist/coordination/subagent-budget.d.ts +2 -1
  95. package/dist/coordination/subagent-budget.d.ts.map +1 -1
  96. package/dist/core/agent-loop.d.ts +8 -3
  97. package/dist/core/agent-loop.d.ts.map +1 -1
  98. package/dist/core/agent-response.d.ts +5 -4
  99. package/dist/core/agent-response.d.ts.map +1 -1
  100. package/dist/core/agent-tools.d.ts +1 -1
  101. package/dist/core/agent-tools.d.ts.map +1 -1
  102. package/dist/core/agent.d.ts +4 -2
  103. package/dist/core/agent.d.ts.map +1 -1
  104. package/dist/core/context.d.ts +55 -1
  105. package/dist/core/context.d.ts.map +1 -1
  106. package/dist/core/fallback-model.d.ts +14 -8
  107. package/dist/core/fallback-model.d.ts.map +1 -1
  108. package/dist/core/fallback-profile-manager.d.ts +118 -0
  109. package/dist/core/fallback-profile-manager.d.ts.map +1 -0
  110. package/dist/core/fleet-pulse.d.ts +2 -1
  111. package/dist/core/fleet-pulse.d.ts.map +1 -1
  112. package/dist/core/iteration-limit.d.ts +2 -1
  113. package/dist/core/iteration-limit.d.ts.map +1 -1
  114. package/dist/core/mailbox-loop.d.ts +16 -1
  115. package/dist/core/mailbox-loop.d.ts.map +1 -1
  116. package/dist/core/model-availability-calendar.d.ts +27 -0
  117. package/dist/core/model-availability-calendar.d.ts.map +1 -0
  118. package/dist/core/provider-runner.d.ts.map +1 -1
  119. package/dist/core/system-prompt-builder.d.ts +2 -1
  120. package/dist/core/system-prompt-builder.d.ts.map +1 -1
  121. package/dist/defaults/index.js +1920 -598
  122. package/dist/defaults/index.js.map +4 -4
  123. package/dist/execution/auto-compaction-middleware.d.ts +3 -2
  124. package/dist/execution/auto-compaction-middleware.d.ts.map +1 -1
  125. package/dist/execution/compaction-core.d.ts.map +1 -1
  126. package/dist/execution/council-brain.d.ts +28 -49
  127. package/dist/execution/council-brain.d.ts.map +1 -1
  128. package/dist/execution/council-orchestrator.d.ts +30 -0
  129. package/dist/execution/council-orchestrator.d.ts.map +1 -1
  130. package/dist/execution/enhance-recovery.d.ts +8 -0
  131. package/dist/execution/enhance-recovery.d.ts.map +1 -1
  132. package/dist/execution/error-handler.d.ts +2 -2
  133. package/dist/execution/error-handler.d.ts.map +1 -1
  134. package/dist/execution/eternal-autonomy.d.ts.map +1 -1
  135. package/dist/execution/index.js +2600 -1903
  136. package/dist/execution/index.js.map +4 -4
  137. package/dist/execution/intelligent-compactor.d.ts +0 -16
  138. package/dist/execution/intelligent-compactor.d.ts.map +1 -1
  139. package/dist/execution/model-runtime.d.ts.map +1 -1
  140. package/dist/execution/one-shot-llm.d.ts +9 -1
  141. package/dist/execution/one-shot-llm.d.ts.map +1 -1
  142. package/dist/execution/prompt-enhancer.d.ts +36 -0
  143. package/dist/execution/prompt-enhancer.d.ts.map +1 -1
  144. package/dist/execution/prompt-enhancer.js +158 -10
  145. package/dist/execution/prompt-enhancer.js.map +2 -2
  146. package/dist/execution/retry-policy.d.ts +0 -13
  147. package/dist/execution/retry-policy.d.ts.map +1 -1
  148. package/dist/execution/skill-loader.d.ts.map +1 -1
  149. package/dist/execution/tool-executor.d.ts.map +1 -1
  150. package/dist/goal/checkpoint.d.ts.map +1 -0
  151. package/dist/{autophase/auto-phase-planner.d.ts → goal/goal-planner.d.ts} +8 -8
  152. package/dist/goal/goal-planner.d.ts.map +1 -0
  153. package/dist/{autophase/auto-phase-runner.d.ts → goal/goal-runner.d.ts} +10 -10
  154. package/dist/goal/goal-runner.d.ts.map +1 -0
  155. package/dist/{autophase → goal}/index.d.ts +3 -3
  156. package/dist/goal/index.d.ts.map +1 -0
  157. package/dist/goal/phase-graph-builder.d.ts.map +1 -0
  158. package/dist/{autophase → goal}/phase-orchestrator.d.ts +2 -2
  159. package/dist/goal/phase-orchestrator.d.ts.map +1 -0
  160. package/dist/goal/phase-store.d.ts.map +1 -0
  161. package/dist/{autophase → goal}/types.d.ts +2 -2
  162. package/dist/goal/types.d.ts.map +1 -0
  163. package/dist/hq/auth-store.d.ts.map +1 -1
  164. package/dist/hq/commands.d.ts +2 -1
  165. package/dist/hq/commands.d.ts.map +1 -1
  166. package/dist/hq/exposure.d.ts +66 -0
  167. package/dist/hq/exposure.d.ts.map +1 -0
  168. package/dist/hq/index.d.ts +1 -0
  169. package/dist/hq/index.d.ts.map +1 -1
  170. package/dist/hq/index.js +190 -21
  171. package/dist/hq/index.js.map +4 -4
  172. package/dist/hq/mailbox-mapper.d.ts +13 -1
  173. package/dist/hq/mailbox-mapper.d.ts.map +1 -1
  174. package/dist/hq/protocol/browser.d.ts +9 -1
  175. package/dist/hq/protocol/browser.d.ts.map +1 -1
  176. package/dist/hq/protocol/client.d.ts +2 -2
  177. package/dist/hq/protocol/client.d.ts.map +1 -1
  178. package/dist/hq/protocol/core.d.ts.map +1 -1
  179. package/dist/hq/protocol/mailbox.d.ts +6 -0
  180. package/dist/hq/protocol/mailbox.d.ts.map +1 -1
  181. package/dist/hq/protocol/session.d.ts +4 -0
  182. package/dist/hq/protocol/session.d.ts.map +1 -1
  183. package/dist/hq/publisher.d.ts.map +1 -1
  184. package/dist/index.d.ts +34 -25
  185. package/dist/index.d.ts.map +1 -1
  186. package/dist/index.js +30287 -22214
  187. package/dist/index.js.map +4 -4
  188. package/dist/infrastructure/index.js +60 -5
  189. package/dist/infrastructure/index.js.map +2 -2
  190. package/dist/kernel/events/agent-events.d.ts +33 -1
  191. package/dist/kernel/events/agent-events.d.ts.map +1 -1
  192. package/dist/kernel/events/file-events.d.ts +65 -0
  193. package/dist/kernel/events/file-events.d.ts.map +1 -0
  194. package/dist/kernel/events/memory-events.d.ts +36 -0
  195. package/dist/kernel/events/memory-events.d.ts.map +1 -1
  196. package/dist/kernel/events/network-events.d.ts +60 -0
  197. package/dist/kernel/events/network-events.d.ts.map +1 -0
  198. package/dist/kernel/events/process-events.d.ts +44 -0
  199. package/dist/kernel/events/process-events.d.ts.map +1 -0
  200. package/dist/kernel/events/provider-events.d.ts +89 -0
  201. package/dist/kernel/events/provider-events.d.ts.map +1 -1
  202. package/dist/kernel/events/tool-events.d.ts +10 -0
  203. package/dist/kernel/events/tool-events.d.ts.map +1 -1
  204. package/dist/kernel/events/worktree-events.d.ts +1 -1
  205. package/dist/kernel/events.d.ts +14 -1
  206. package/dist/kernel/events.d.ts.map +1 -1
  207. package/dist/kernel/index.js +2 -1
  208. package/dist/kernel/index.js.map +2 -2
  209. package/dist/kernel/tokens.d.ts +3 -1
  210. package/dist/kernel/tokens.d.ts.map +1 -1
  211. package/dist/mailbox-attach.d.ts.map +1 -1
  212. package/dist/models/index.js.map +2 -2
  213. package/dist/observability/index.d.ts +3 -0
  214. package/dist/observability/index.d.ts.map +1 -1
  215. package/dist/observability/index.js +278 -0
  216. package/dist/observability/index.js.map +4 -4
  217. package/dist/observability/network-telemetry.d.ts +15 -0
  218. package/dist/observability/network-telemetry.d.ts.map +1 -0
  219. package/dist/observability/process-telemetry.d.ts +18 -0
  220. package/dist/observability/process-telemetry.d.ts.map +1 -0
  221. package/dist/observability/redact-command.d.ts +20 -0
  222. package/dist/observability/redact-command.d.ts.map +1 -0
  223. package/dist/plugins/auto-review-plugin.d.ts +56 -3
  224. package/dist/plugins/auto-review-plugin.d.ts.map +1 -1
  225. package/dist/plugins/chimera-plugin.d.ts +164 -5
  226. package/dist/plugins/chimera-plugin.d.ts.map +1 -1
  227. package/dist/plugins/review-context-builder.d.ts +52 -0
  228. package/dist/plugins/review-context-builder.d.ts.map +1 -0
  229. package/dist/security/index.d.ts +1 -0
  230. package/dist/security/index.d.ts.map +1 -1
  231. package/dist/security/index.js +186 -9
  232. package/dist/security/index.js.map +4 -4
  233. package/dist/security/kanban-boundary.d.ts +10 -0
  234. package/dist/security/kanban-boundary.d.ts.map +1 -0
  235. package/dist/security/permission-policy.d.ts +1 -0
  236. package/dist/security/permission-policy.d.ts.map +1 -1
  237. package/dist/session-registry.d.ts +80 -0
  238. package/dist/session-registry.d.ts.map +1 -1
  239. package/dist/skills/index.js.map +2 -2
  240. package/dist/storage/config-loader.d.ts +7 -0
  241. package/dist/storage/config-loader.d.ts.map +1 -1
  242. package/dist/storage/file-session-writer.d.ts +20 -7
  243. package/dist/storage/file-session-writer.d.ts.map +1 -1
  244. package/dist/storage/goal-coordination.d.ts +40 -0
  245. package/dist/storage/goal-coordination.d.ts.map +1 -0
  246. package/dist/storage/goal-store.d.ts +9 -5
  247. package/dist/storage/goal-store.d.ts.map +1 -1
  248. package/dist/storage/index.d.ts +4 -2
  249. package/dist/storage/index.d.ts.map +1 -1
  250. package/dist/storage/index.js +1066 -226
  251. package/dist/storage/index.js.map +4 -4
  252. package/dist/storage/memory-consolidator.d.ts +49 -4
  253. package/dist/storage/memory-consolidator.d.ts.map +1 -1
  254. package/dist/storage/memory-graph-backend.d.ts +11 -0
  255. package/dist/storage/memory-graph-backend.d.ts.map +1 -1
  256. package/dist/storage/provider-config-watcher.d.ts +19 -0
  257. package/dist/storage/provider-config-watcher.d.ts.map +1 -1
  258. package/dist/storage/session-event-bridge.d.ts +2 -2
  259. package/dist/storage/session-event-bridge.d.ts.map +1 -1
  260. package/dist/storage/session-resume-validation.d.ts +10 -0
  261. package/dist/storage/session-resume-validation.d.ts.map +1 -1
  262. package/dist/storage/session-rewind-apply.d.ts +53 -0
  263. package/dist/storage/session-rewind-apply.d.ts.map +1 -0
  264. package/dist/storage/session-rewinder.d.ts.map +1 -1
  265. package/dist/storage/session-store.d.ts.map +1 -1
  266. package/dist/tasking/index.js.map +1 -1
  267. package/dist/tasking/task-store.d.ts +1 -1
  268. package/dist/tools/council-tool.d.ts +3 -0
  269. package/dist/tools/council-tool.d.ts.map +1 -1
  270. package/dist/tools/fallback-manage-tools.d.ts +82 -0
  271. package/dist/tools/fallback-manage-tools.d.ts.map +1 -0
  272. package/dist/tools/index.d.ts +1 -0
  273. package/dist/tools/index.d.ts.map +1 -1
  274. package/dist/tools/index.js +3423 -192
  275. package/dist/tools/index.js.map +4 -4
  276. package/dist/tools/one-shot-llm-tool.d.ts +2 -0
  277. package/dist/tools/one-shot-llm-tool.d.ts.map +1 -1
  278. package/dist/types/config.d.ts +76 -7
  279. package/dist/types/config.d.ts.map +1 -1
  280. package/dist/types/file-event-record.d.ts +68 -0
  281. package/dist/types/file-event-record.d.ts.map +1 -0
  282. package/dist/types/index.d.ts +1 -0
  283. package/dist/types/index.d.ts.map +1 -1
  284. package/dist/types/index.js +13 -8
  285. package/dist/types/index.js.map +3 -3
  286. package/dist/types/memory.d.ts +12 -0
  287. package/dist/types/memory.d.ts.map +1 -1
  288. package/dist/types/multi-agent.d.ts +12 -1
  289. package/dist/types/multi-agent.d.ts.map +1 -1
  290. package/dist/types/one-shot-llm.d.ts +16 -7
  291. package/dist/types/one-shot-llm.d.ts.map +1 -1
  292. package/dist/types/provider.d.ts +1 -1
  293. package/dist/types/provider.d.ts.map +1 -1
  294. package/dist/types/session.d.ts +68 -2
  295. package/dist/types/session.d.ts.map +1 -1
  296. package/dist/types/tool-executor.d.ts +2 -0
  297. package/dist/types/tool-executor.d.ts.map +1 -1
  298. package/dist/types/tool.d.ts +5 -0
  299. package/dist/types/tool.d.ts.map +1 -1
  300. package/dist/utils/atomic-write.d.ts.map +1 -1
  301. package/dist/utils/index.d.ts +10 -10
  302. package/dist/utils/index.d.ts.map +1 -1
  303. package/dist/utils/index.js +497 -254
  304. package/dist/utils/index.js.map +4 -4
  305. package/dist/utils/message-invariants.d.ts +9 -0
  306. package/dist/utils/message-invariants.d.ts.map +1 -1
  307. package/dist/utils/safe-json.d.ts +1 -1
  308. package/dist/utils/safe-json.d.ts.map +1 -1
  309. package/dist/utils/term.d.ts +279 -0
  310. package/dist/utils/term.d.ts.map +1 -1
  311. package/dist/utils/tool-wire-compact.d.ts +9 -0
  312. package/dist/utils/tool-wire-compact.d.ts.map +1 -1
  313. package/dist/utils/wstack-paths.d.ts +12 -2
  314. package/dist/utils/wstack-paths.d.ts.map +1 -1
  315. package/dist/worktree/worktree-manager.d.ts +1 -1
  316. package/dist/worktree/worktree-manager.d.ts.map +1 -1
  317. package/instructions/agents/ios.md +113 -0
  318. package/instructions/agents/search.md +1 -1
  319. package/instructions/llm/chimera-review.md +66 -9
  320. package/instructions/llm/memory-consolidator.md +4 -12
  321. package/instructions/llm/prompt-enhancer.md +3 -1
  322. package/instructions/sections/tool/common-patterns.md +3 -3
  323. package/instructions/system.md +40 -5
  324. package/package.json +7 -3
  325. package/skills/auto-review/SKILL.md +176 -0
  326. package/skills/mnemosyne/SKILL.md +156 -0
  327. package/skills/mnemosyne/instructions/agent-prompt.md +200 -0
  328. package/dist/autophase/auto-phase-planner.d.ts.map +0 -1
  329. package/dist/autophase/auto-phase-runner.d.ts.map +0 -1
  330. package/dist/autophase/checkpoint.d.ts.map +0 -1
  331. package/dist/autophase/index.d.ts.map +0 -1
  332. package/dist/autophase/phase-graph-builder.d.ts.map +0 -1
  333. package/dist/autophase/phase-orchestrator.d.ts.map +0 -1
  334. package/dist/autophase/phase-store.d.ts.map +0 -1
  335. package/dist/autophase/types.d.ts.map +0 -1
  336. /package/dist/{autophase → goal}/checkpoint.d.ts +0 -0
  337. /package/dist/{autophase → goal}/phase-graph-builder.d.ts +0 -0
  338. /package/dist/{autophase → goal}/phase-store.d.ts +0 -0
  339. /package/instructions/{autophase → goal}/phase-planner.md +0 -0
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../src/utils/error.ts", "../../src/types/errors.ts", "../../src/kernel/container.ts", "../../src/kernel/pipeline.ts", "../../src/kernel/events.ts", "../../src/kernel/tokens.ts", "../../src/kernel/run-controller.ts"],
4
- "sourcesContent": ["/**\n * Converts an unknown error value to a human-readable string.\n * Used in 40+ files across the codebase to normalize error messaging.\n */\nexport function toErrorMessage(err: unknown): string {\n return err instanceof Error ? err.message : String(err);\n}\n", "import { toErrorMessage } from '../utils/index.js';\n\n/**\n * WrongStack error hierarchy.\n *\n * Every error thrown by the framework is a `WrongStackError` with a\n * machine-readable `code`, a `subsystem` tag, and a `severity` level.\n * This lets consumers (CLI, TUI, plugins, tests) branch on structured\n * data instead of parsing error messages.\n */\n\n// \u2500\u2500 Error codes \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\n/**\n * Machine-readable error codes as frozen constants.\n *\n * Use `ERROR_CODES.X` instead of raw string literals for:\n * - IDE autocomplete and compile-time validation\n * - Safe refactoring (rename updates all usages)\n * - Plugin extensibility (extend the object to add custom codes)\n *\n * The `ErrorCode` type is derived from this object, so adding a new\n * code here automatically updates the type without extra changes.\n */\nexport const ERROR_CODES = {\n // Provider\n PROVIDER_RATE_LIMITED: 'PROVIDER_RATE_LIMITED',\n PROVIDER_AUTH_FAILED: 'PROVIDER_AUTH_FAILED',\n PROVIDER_OVERLOADED: 'PROVIDER_OVERLOADED',\n PROVIDER_INVALID_REQUEST: 'PROVIDER_INVALID_REQUEST',\n PROVIDER_SERVER_ERROR: 'PROVIDER_SERVER_ERROR',\n PROVIDER_NETWORK_ERROR: 'PROVIDER_NETWORK_ERROR',\n PROVIDER_CONTEXT_OVERFLOW: 'PROVIDER_CONTEXT_OVERFLOW',\n // Tool\n TOOL_NOT_FOUND: 'TOOL_NOT_FOUND',\n TOOL_PERMISSION_DENIED: 'TOOL_PERMISSION_DENIED',\n TOOL_EXECUTION_FAILED: 'TOOL_EXECUTION_FAILED',\n TOOL_TIMEOUT: 'TOOL_TIMEOUT',\n TOOL_INPUT_INVALID: 'TOOL_INPUT_INVALID',\n // Config\n CONFIG_INVALID: 'CONFIG_INVALID',\n CONFIG_NOT_FOUND: 'CONFIG_NOT_FOUND',\n CONFIG_PARSE_FAILED: 'CONFIG_PARSE_FAILED',\n CONFIG_MIGRATION_NEEDED: 'CONFIG_MIGRATION_NEEDED',\n // Plugin\n PLUGIN_LOAD_FAILED: 'PLUGIN_LOAD_FAILED',\n PLUGIN_API_MISMATCH: 'PLUGIN_API_MISMATCH',\n PLUGIN_MISSING_DEPENDENCY: 'PLUGIN_MISSING_DEPENDENCY',\n // Agent\n AGENT_ITERATION_LIMIT: 'AGENT_ITERATION_LIMIT',\n AGENT_CONTEXT_OVERFLOW: 'AGENT_CONTEXT_OVERFLOW',\n AGENT_ABORTED: 'AGENT_ABORTED',\n AGENT_RUN_FAILED: 'AGENT_RUN_FAILED',\n // Session\n SESSION_NOT_FOUND: 'SESSION_NOT_FOUND',\n SESSION_CORRUPTED: 'SESSION_CORRUPTED',\n SESSION_WRITE_FAILED: 'SESSION_WRITE_FAILED',\n // Container / Registry\n CONTAINER_TOKEN_ALREADY_BOUND: 'CONTAINER_TOKEN_ALREADY_BOUND',\n CONTAINER_TOKEN_NOT_BOUND: 'CONTAINER_TOKEN_NOT_BOUND',\n CONTAINER_CIRCULAR_DEPENDENCY: 'CONTAINER_CIRCULAR_DEPENDENCY',\n REGISTRY_DUPLICATE: 'REGISTRY_DUPLICATE',\n REGISTRY_NOT_FOUND: 'REGISTRY_NOT_FOUND',\n REGISTRY_INVALID: 'REGISTRY_INVALID',\n // File system\n FS_READ_FAILED: 'FS_READ_FAILED',\n FS_WRITE_FAILED: 'FS_WRITE_FAILED',\n FS_MKDIR_FAILED: 'FS_MKDIR_FAILED',\n FS_DELETE_FAILED: 'FS_DELETE_FAILED',\n FS_ATOMIC_WRITE_FAILED: 'FS_ATOMIC_WRITE_FAILED',\n // SDD (Spec-Driven Development)\n SDD_VALIDATION_FAILED: 'SDD_VALIDATION_FAILED',\n SDD_PARSE_FAILED: 'SDD_PARSE_FAILED',\n SDD_INVALID_STATE: 'SDD_INVALID_STATE',\n SDD_NOT_READY: 'SDD_NOT_READY',\n // General\n VALIDATION_ERROR: 'VALIDATION_ERROR',\n PARSE_FAILED: 'PARSE_FAILED',\n UNKNOWN: 'UNKNOWN',\n} as const;\n\n/**\n * Union type derived from `ERROR_CODES`. Using `typeof ERROR_CODES[keyof typeof ERROR_CODES]`\n * instead of a string literal union means TypeScript auto-updates the type whenever\n * a new code is added to `ERROR_CODES` \u2014 no need to keep two lists in sync.\n */\nexport type ErrorCode = (typeof ERROR_CODES)[keyof typeof ERROR_CODES];\n\nexport type ErrorSubsystem =\n | 'provider'\n | 'tool'\n | 'config'\n | 'plugin'\n | 'agent'\n | 'session'\n | 'sdd'\n | 'container'\n | 'fs'\n | 'general';\nexport type ErrorSeverity = 'fatal' | 'error' | 'warning';\n\n// \u2500\u2500 Base error class \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\nexport class WrongStackError extends Error {\n readonly code: ErrorCode;\n readonly subsystem: ErrorSubsystem;\n readonly severity: ErrorSeverity;\n readonly recoverable: boolean;\n readonly context?: Record<string, unknown> | undefined;\n\n constructor(opts: {\n message: string;\n code: ErrorCode;\n subsystem: ErrorSubsystem;\n severity?: ErrorSeverity | undefined;\n recoverable?: boolean | undefined;\n context?: Record<string, unknown> | undefined;\n cause?: unknown | undefined;\n }) {\n super(opts.message, { cause: opts.cause });\n this.name = 'WrongStackError';\n this.code = opts.code;\n this.subsystem = opts.subsystem;\n this.severity = opts.severity ?? 'error';\n this.recoverable = opts.recoverable ?? false;\n this.context = opts.context;\n }\n\n /**\n * Render a one-line user-facing description.\n * Subclasses should override for domain-specific formatting.\n */\n describe(): string {\n const ctx = this.context ? ` ${formatContext(this.context)}` : '';\n return `${this.code}: ${this.message}${ctx}`;\n }\n}\n\nfunction formatContext(ctx: Record<string, unknown>): string {\n const parts = Object.entries(ctx)\n .filter(([, v]) => v !== undefined)\n .slice(0, 3)\n .map(([k, v]) => `${k}=${String(v)}`);\n return parts.length > 0 ? `[${parts.join(' ')}]` : '';\n}\n\n// \u2500\u2500 Specific error classes \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\n/**\n * Tool execution errors \u2014 thrown by ToolExecutor and individual tools.\n */\nexport class ToolError extends WrongStackError {\n readonly toolName: string;\n\n constructor(opts: {\n message: string;\n code: Extract<\n ErrorCode,\n | 'TOOL_NOT_FOUND'\n | 'TOOL_PERMISSION_DENIED'\n | 'TOOL_EXECUTION_FAILED'\n | 'TOOL_TIMEOUT'\n | 'TOOL_INPUT_INVALID'\n >;\n toolName: string;\n recoverable?: boolean | undefined;\n context?: Record<string, unknown> | undefined;\n cause?: unknown | undefined;\n }) {\n super({\n message: opts.message,\n code: opts.code,\n subsystem: 'tool',\n recoverable: opts.recoverable,\n context: { tool: opts.toolName, ...opts.context },\n cause: opts.cause,\n });\n this.name = 'ToolError';\n this.toolName = opts.toolName;\n }\n}\n\n/**\n * Config loading / validation errors.\n */\nexport class ConfigError extends WrongStackError {\n constructor(opts: {\n message: string;\n code: Extract<\n ErrorCode,\n 'CONFIG_INVALID' | 'CONFIG_NOT_FOUND' | 'CONFIG_PARSE_FAILED' | 'CONFIG_MIGRATION_NEEDED'\n >;\n context?: Record<string, unknown> | undefined;\n cause?: unknown | undefined;\n }) {\n super({\n message: opts.message,\n code: opts.code,\n subsystem: 'config',\n severity: 'fatal',\n recoverable: false,\n context: opts.context,\n cause: opts.cause,\n });\n this.name = 'ConfigError';\n }\n}\n\n/**\n * Plugin loading / lifecycle errors.\n */\nexport class PluginError extends WrongStackError {\n readonly pluginName: string;\n\n constructor(opts: {\n message: string;\n code: Extract<\n ErrorCode,\n 'PLUGIN_LOAD_FAILED' | 'PLUGIN_API_MISMATCH' | 'PLUGIN_MISSING_DEPENDENCY'\n >;\n pluginName: string;\n context?: Record<string, unknown> | undefined;\n cause?: unknown | undefined;\n }) {\n super({\n message: opts.message,\n code: opts.code,\n subsystem: 'plugin',\n severity: 'error',\n recoverable: opts.code === ERROR_CODES.PLUGIN_MISSING_DEPENDENCY,\n context: { plugin: opts.pluginName, ...opts.context },\n cause: opts.cause,\n });\n this.name = 'PluginError';\n this.pluginName = opts.pluginName;\n }\n}\n\n/**\n * Agent runtime errors \u2014 thrown by Agent.run when a non-WrongStackError\n * escapes the inner loop, so callers always see a structured error.\n */\nexport class AgentError extends WrongStackError {\n constructor(opts: {\n message: string;\n code: Extract<\n ErrorCode,\n 'AGENT_ITERATION_LIMIT' | 'AGENT_CONTEXT_OVERFLOW' | 'AGENT_ABORTED' | 'AGENT_RUN_FAILED'\n >;\n recoverable?: boolean | undefined;\n context?: Record<string, unknown> | undefined;\n cause?: unknown | undefined;\n }) {\n super({\n message: opts.message,\n code: opts.code,\n subsystem: 'agent',\n severity: opts.code === ERROR_CODES.AGENT_ABORTED ? 'warning' : 'error',\n recoverable: opts.recoverable ?? opts.code === ERROR_CODES.AGENT_ITERATION_LIMIT,\n context: opts.context,\n cause: opts.cause,\n });\n this.name = 'AgentError';\n }\n}\n\n/**\n * Wrap an arbitrary thrown value into a `WrongStackError` so the caller\n * always gets a structured error. Pass-throughs WrongStackError instances\n * unchanged; raw `Error`s and primitives get an `AGENT_RUN_FAILED` wrapper\n * with the original preserved as `cause`.\n */\nexport function toWrongStackError(\n err: unknown,\n code: Extract<ErrorCode, 'AGENT_RUN_FAILED' | 'AGENT_ABORTED' | 'UNKNOWN'> = ERROR_CODES.AGENT_RUN_FAILED,\n): WrongStackError {\n if (err instanceof WrongStackError) return err;\n const message = toErrorMessage(err);\n return new AgentError({\n message,\n code: code === 'UNKNOWN' ? ERROR_CODES.AGENT_RUN_FAILED : code,\n cause: err,\n });\n}\n\n/**\n * Session storage errors.\n */\nexport class SessionError extends WrongStackError {\n readonly sessionId?: string | undefined;\n\n constructor(opts: {\n message: string;\n code: Extract<ErrorCode, 'SESSION_NOT_FOUND' | 'SESSION_CORRUPTED' | 'SESSION_WRITE_FAILED'>;\n sessionId?: string | undefined;\n context?: Record<string, unknown> | undefined;\n cause?: unknown | undefined;\n }) {\n super({\n message: opts.message,\n code: opts.code,\n subsystem: 'session',\n severity: opts.code === ERROR_CODES.SESSION_WRITE_FAILED ? 'error' : 'warning',\n recoverable: opts.code !== ERROR_CODES.SESSION_CORRUPTED,\n context: { sessionId: opts.sessionId, ...opts.context },\n cause: opts.cause,\n });\n this.name = 'SessionError';\n this.sessionId = opts.sessionId;\n }\n}\n\n/**\n * SDD (Spec-Driven Development) errors \u2014 spec validation, parsing, and\n * state machine violations in the AISpecBuilder, TaskFlow, and TaskTracker.\n */\nexport class SddError extends WrongStackError {\n constructor(opts: {\n message: string;\n code: Extract<\n ErrorCode,\n 'SDD_VALIDATION_FAILED' | 'SDD_PARSE_FAILED' | 'SDD_INVALID_STATE' | 'SDD_NOT_READY'\n >;\n context?: Record<string, unknown> | undefined;\n cause?: unknown | undefined;\n }) {\n super({\n message: opts.message,\n code: opts.code,\n subsystem: 'sdd',\n severity: opts.code === ERROR_CODES.SDD_PARSE_FAILED ? 'warning' : 'error',\n recoverable: opts.code === ERROR_CODES.SDD_NOT_READY,\n context: opts.context,\n cause: opts.cause,\n });\n this.name = 'SddError';\n }\n}\n\n/**\n * File system operation errors.\n */\nexport class FsError extends WrongStackError {\n readonly path?: string | undefined;\n\n constructor(opts: {\n message: string;\n code: Extract<\n ErrorCode,\n 'FS_READ_FAILED' | 'FS_WRITE_FAILED' | 'FS_MKDIR_FAILED' | 'FS_DELETE_FAILED' | 'FS_ATOMIC_WRITE_FAILED'\n >;\n path?: string | undefined;\n context?: Record<string, unknown> | undefined;\n cause?: unknown | undefined;\n }) {\n super({\n message: opts.message,\n code: opts.code,\n subsystem: 'fs',\n severity: 'error',\n recoverable: opts.code !== ERROR_CODES.FS_READ_FAILED,\n context: { path: opts.path, ...opts.context },\n cause: opts.cause,\n });\n this.name = 'FsError';\n this.path = opts.path;\n }\n}\n\n/**\n * HTTP fetch error \u2014 thrown when a network request returns a non-OK status.\n * Carries the response status so {@link classifyToolError} can branch on it\n * (429 \u2192 transient, 404 \u2192 not_found, 401 \u2192 permission) without duck-typing\n * the error via `'response' in err`.\n *\n * P3 #18 (before-release.md): the previous `'response' in err` check caught\n * any Error with a `response` property, including custom errors, proxy\n * objects, or mocked errors in tests. `instanceof FetchError` is reliable.\n *\n * Tools and providers that make HTTP requests and need the executor to\n * classify their failures should throw `new FetchError({ status, message })`\n * instead of a bare `Error` with an ad-hoc `response` field.\n */\nexport class FetchError extends WrongStackError {\n readonly status: number;\n\n constructor(opts: {\n message: string;\n status: number;\n context?: Record<string, unknown> | undefined;\n cause?: unknown | undefined;\n }) {\n super({\n message: opts.message,\n code: ERROR_CODES.VALIDATION_ERROR,\n subsystem: 'general',\n severity: 'error',\n recoverable: opts.status === 429 || opts.status >= 500,\n context: { status: opts.status, ...opts.context },\n cause: opts.cause,\n });\n this.name = 'FetchError';\n this.status = opts.status;\n }\n}\n\n/**\n * Tool input validation error \u2014 thrown when a tool's input fails a validation\n * check that the JSON Schema cannot express (e.g. `old_string === new_string`\n * in edit, or a cross-field invariant). Use this instead of a bare\n * `throw new Error('...validation...')` so {@link classifyToolError} can\n * match on `instanceof` rather than a locale-dependent message substring.\n *\n * P2 #6 (before-release.md): the previous `err.message.includes('validation')`\n * check misclassified any error whose message happened to contain \"validation\"\n * (e.g. a third-party \"input validation timeout\") as a VALIDATION error.\n *\n * Named `ToolValidationError` (not `ValidationError`) to avoid colliding with\n * the existing `ValidationError` interface exported by json-schema-validate.ts\n * (a validation-result shape, not an Error subclass).\n */\nexport class ToolValidationError extends WrongStackError {\n constructor(opts: {\n message: string;\n /** Field path or tool name that failed validation, for diagnostics. */\n field?: string | undefined;\n context?: Record<string, unknown> | undefined;\n cause?: unknown | undefined;\n }) {\n super({\n message: opts.message,\n code: ERROR_CODES.VALIDATION_ERROR,\n subsystem: 'general',\n severity: 'error',\n recoverable: false,\n context: { field: opts.field, ...opts.context },\n cause: opts.cause,\n });\n this.name = 'ToolValidationError';\n }\n}\n\n/**\n * Response / payload parse error \u2014 thrown when an upstream HTTP response,\n * file, or data structure is well-formed at the transport layer (HTTP 200,\n * valid JSON) but is missing required fields or has an unexpected shape.\n *\n * Distinct from `ConfigError(CONFIG_PARSE_FAILED)` (which is specifically\n * for config-file parsing) and `FetchError` (which covers HTTP non-OK\n * responses). `ParseError` fills the gap: the request succeeded but the\n * response body couldn't be interpreted.\n *\n * Common sites: OAuth token responses missing `access_token`, device-code\n * responses missing `device_code`, registry responses with unexpected\n * schemas.\n */\nexport class ParseError extends WrongStackError {\n readonly source?: string | undefined;\n\n constructor(opts: {\n message: string;\n /**\n * What was being parsed \u2014 e.g. `'oauth-token-response'`,\n * `'device-code-response'`. Lets consumers distinguish parse failures\n * from different upstream APIs without parsing the message.\n */\n source?: string | undefined;\n context?: Record<string, unknown> | undefined;\n cause?: unknown | undefined;\n }) {\n super({\n message: opts.message,\n code: ERROR_CODES.PARSE_FAILED,\n subsystem: 'general',\n severity: 'error',\n recoverable: false,\n context: { source: opts.source, ...opts.context },\n cause: opts.cause,\n });\n this.name = 'ParseError';\n this.source = opts.source;\n }\n}\n\n// \u2500\u2500 Type guards \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\nexport function isWrongStackError(err: unknown): err is WrongStackError {\n return err instanceof WrongStackError;\n}\n\nexport function isToolError(err: unknown): err is ToolError {\n return err instanceof ToolError;\n}\n\nexport function isConfigError(err: unknown): err is ConfigError {\n return err instanceof ConfigError;\n}\n\nexport function isPluginError(err: unknown): err is PluginError {\n return err instanceof PluginError;\n}\n\nexport function isSessionError(err: unknown): err is SessionError {\n return err instanceof SessionError;\n}\n\nexport function isAgentError(err: unknown): err is AgentError {\n return err instanceof AgentError;\n}\n\nexport function isFsError(err: unknown): err is FsError {\n return err instanceof FsError;\n}\n\nexport function isToolValidationError(err: unknown): err is ToolValidationError {\n return err instanceof ToolValidationError;\n}\n\nexport function isFetchError(err: unknown): err is FetchError {\n return err instanceof FetchError;\n}\n\nexport function isParseError(err: unknown): err is ParseError {\n return err instanceof ParseError;\n}\n\nexport function isSddError(err: unknown): err is SddError {\n return err instanceof SddError;\n}\n", "import { WrongStackError, ERROR_CODES } from '../types/errors.js';\n\n/**\n * Container \u2014 dependency injection with explicit bind / override / decorate.\n *\n * Invariants:\n * bind() \u2014 throws if token already bound\n * override() \u2014 throws if nothing to replace\n * decorate() \u2014 stacks; cached value cleared on register\n */\n\nexport type Token<T> = symbol & { readonly __type?: T };\nexport type Factory<T> = (c: Container) => T;\nexport type Decorator<T> = (inner: T, c: Container) => T;\n\ninterface Entry<T = unknown> {\n factory: Factory<T>;\n singleton: boolean;\n decorators: Decorator<T>[];\n cache?: T | undefined;\n /**\n * True once a singleton value has been built and stored in `cache`.\n * Tracked separately from `cache !== undefined` so a singleton factory\n * that legitimately resolves to `undefined` (or any falsy value) is still\n * memoized rather than re-run on every resolve().\n */\n hasCache: boolean;\n owner: string;\n}\n\nexport interface BindOptions {\n singleton?: boolean | undefined;\n owner?: string | undefined;\n}\n\nexport class Container {\n private readonly entries = new Map<symbol, Entry>();\n /**\n * Tokens currently mid-resolve. Tracked so we can detect circular\n * dependencies (A \u2192 B \u2192 A) and throw a structured error instead of\n * overflowing the call stack with \"Maximum call stack size exceeded\".\n *\n * Not a memoization cache \u2014 the per-entry `cache` field is the source\n * of truth for \"have I built this before?\". This set only lives for\n * the duration of a single resolve call.\n */\n private readonly resolving = new Set<symbol>();\n\n bind<T>(token: Token<T>, factory: Factory<T>, opts: BindOptions = {}): void {\n if (this.entries.has(token)) {\n throw new WrongStackError({\n message: `Container: token \"${token.description ?? 'unknown'}\" already bound`,\n code: ERROR_CODES.CONTAINER_TOKEN_ALREADY_BOUND,\n subsystem: 'container',\n context: { token: token.description },\n });\n }\n this.entries.set(token, {\n factory: factory as Factory<unknown>,\n singleton: opts.singleton ?? true,\n decorators: [],\n hasCache: false,\n owner: opts.owner ?? 'core',\n });\n }\n\n override<T>(token: Token<T>, factory: Factory<T>, opts: BindOptions = {}): void {\n const existing = this.entries.get(token);\n if (!existing) {\n throw new WrongStackError({\n message: `Container: cannot override \"${token.description ?? 'unknown'}\" \u2014 not bound`,\n code: ERROR_CODES.CONTAINER_TOKEN_NOT_BOUND,\n subsystem: 'container',\n context: { token: token.description },\n });\n }\n this.entries.set(token, {\n factory: factory as Factory<unknown>,\n singleton: opts.singleton ?? existing.singleton,\n decorators: existing.decorators,\n hasCache: false,\n owner: opts.owner ?? existing.owner,\n });\n }\n\n decorate<T>(token: Token<T>, decorator: Decorator<T>, owner = 'core'): void {\n const existing = this.entries.get(token);\n if (!existing) {\n throw new WrongStackError({\n message: `Container: cannot decorate \"${token.description ?? 'unknown'}\" \u2014 not bound`,\n code: ERROR_CODES.CONTAINER_TOKEN_NOT_BOUND,\n subsystem: 'container',\n context: { token: token.description },\n });\n }\n existing.decorators.push(decorator as Decorator<unknown>);\n existing.cache = undefined;\n existing.hasCache = false;\n existing.owner = `${existing.owner}+${owner}`;\n }\n\n resolve<T>(token: Token<T>): T {\n const entry = this.entries.get(token);\n if (!entry) {\n throw new WrongStackError({\n message: `Container: token \"${token.description ?? 'unknown'}\" not bound`,\n code: ERROR_CODES.CONTAINER_TOKEN_NOT_BOUND,\n subsystem: 'container',\n context: { token: token.description },\n });\n }\n if (entry.singleton && entry.hasCache) {\n return entry.cache as T;\n }\n if (this.resolving.has(token)) {\n const cycle = this.describeCycle(token);\n throw new WrongStackError({\n message: `Container: circular dependency detected \u2014 ${cycle}`,\n code: ERROR_CODES.CONTAINER_CIRCULAR_DEPENDENCY,\n subsystem: 'container',\n context: { token: token.description, cycle },\n });\n }\n this.resolving.add(token);\n try {\n let value: unknown = entry.factory(this);\n for (const d of entry.decorators) {\n value = d(value, this);\n }\n if (entry.singleton) {\n entry.cache = value;\n entry.hasCache = true;\n }\n return value as T;\n } finally {\n this.resolving.delete(token);\n }\n }\n\n /**\n * Build a human-readable description of the dependency cycle that\n * caused the resolution to re-enter. Lists the tokens in the order\n * they were entered, then appends the re-entered token to close the\n * loop. Falls back to a generic message if the resolving set is\n * somehow empty (shouldn't happen, but defensive).\n */\n private describeCycle(reentry: symbol): string {\n const descs: string[] = [];\n const seen = new Set<symbol>();\n for (const t of this.resolving) {\n if (seen.has(t)) continue;\n seen.add(t);\n descs.push(t.description ?? 'unknown');\n }\n descs.push(reentry.description ?? 'unknown');\n return descs.join(' \u2192 ');\n }\n\n has<T>(token: Token<T>): boolean {\n return this.entries.has(token);\n }\n\n /**\n * Resolve a token if it is bound, otherwise return undefined.\n * Unlike `resolve()`, this does not throw if the token is unbound.\n *\n * Single map lookup \u2014 `has()` + `resolve()` would walk the entries\n * map twice. The bound check is folded into the resolve path so a\n * non-existent token can never enter the `resolving` cycle-detection\n * set.\n */\n safeResolve<T>(token: Token<T>): T | undefined {\n if (!this.entries.has(token)) return undefined;\n return this.resolve(token);\n }\n\n ownerOf<T>(token: Token<T>): string | undefined {\n return this.entries.get(token)?.owner;\n }\n\n /**\n * Remove a token's binding (along with any decorators stacked on it).\n * Returns true if the token existed. Use this to withdraw temporary\n * bindings installed by a short-lived run or plugin \u2014 without it, the\n * entry persists in the map forever.\n */\n unbind<T>(token: Token<T>): boolean {\n return this.entries.delete(token);\n }\n\n /**\n * Drop every binding. Intended for tests and short-lived CLI invocations\n * that rebuild the container from scratch. Production code should prefer\n * `unbind` on the specific tokens it owns.\n */\n clear(): void {\n this.entries.clear();\n }\n\n list(): Array<{ token: symbol; owner: string }> {\n return Array.from(this.entries.entries()).map(([token, entry]) => ({\n token,\n owner: entry.owner,\n }));\n }\n\n /**\n * Inspect a binding's full shape, including decorator count and whether\n * a singleton value is cached. Returns null if the token is unbound.\n * Decorator and factory function references are not exposed \u2014 only counts\n * and metadata, to keep internal state hidden.\n */\n inspect<T>(token: Token<T>): {\n owner: string;\n singleton: boolean;\n decoratorCount: number;\n cached: boolean;\n } | null {\n const entry = this.entries.get(token);\n if (!entry) return null;\n return {\n owner: entry.owner,\n singleton: entry.singleton,\n decoratorCount: entry.decorators.length,\n cached: entry.hasCache,\n };\n }\n}\n", "/**\n * Pipeline \u2014 Koa-style middleware chain with named middleware\n * and position-aware insertion. Generic over input type T.\n */\n\nimport { WrongStackError, ERROR_CODES } from '../types/errors.js';\n\nexport type NextFn<T> = (value: T) => Promise<T>;\nexport type MiddlewareHandler<T> = (value: T, next: NextFn<T>) => Promise<T>;\n\n/**\n * Called when a middleware crashes (throws or rejects). Used by the\n * Pipeline's error boundary to log the offender without aborting the run.\n *\n * Return `'rethrow'` to propagate the error (default for core middleware),\n * or `'swallow'` to abort descent into the crashing middleware: its caller's\n * `await next()` resolves with the value that was about to flow into the\n * crashed middleware. The crashed middleware AND every middleware after it in\n * the chain are skipped (they never run); UPSTREAM middleware, already paused\n * at their own `await next()`, resume their post-`next()` work normally. It\n * does NOT continue at the next sibling middleware. Plugin middleware should\n * usually be swallowed so one bad plugin can't kill an agent run.\n */\nexport type PipelineErrorPolicy = 'rethrow' | 'swallow';\n\nexport interface PipelineErrorEvent {\n middleware: string;\n owner?: string | undefined;\n err: unknown;\n}\n\nexport type PipelineErrorHandler = (\n ev: PipelineErrorEvent,\n) => PipelineErrorPolicy | Promise<PipelineErrorPolicy>;\n\nexport interface Middleware<T> {\n name: string;\n handler: MiddlewareHandler<T>;\n owner?: string | undefined;\n}\n\nexport interface PipelineOptions {\n /** When true and the target middleware is not found, operations silently no-op instead of throwing. */\n optional?: boolean | undefined;\n}\n\n/**\n * Read-only view of a pipeline. Returned to consumers (plugins, hooks)\n * so they can inspect but not mutate the chain.\n */\nexport interface ReadonlyPipeline<T> {\n readonly size: number;\n list(): readonly string[];\n run(input: T): Promise<T>;\n}\n\nexport class Pipeline<T> {\n private readonly chain: Middleware<T>[] = [];\n private errorHandler?: PipelineErrorHandler | undefined;\n /**\n * Optional operational logger. When set, the `swallow` error-boundary path\n * emits a structured warning so a swallowed middleware crash is never\n * completely silent (P2 #7, before-release.md). Without a logger, the\n * swallow path still works but the crash is invisible \u2014 host code should\n * always wire one.\n */\n private logger?: { warn: (msg: string, ctx?: unknown) => void | undefined } | undefined;\n\n /**\n * Install an error boundary. When a middleware throws or rejects, the\n * handler is called and decides whether to swallow (continue with the\n * pre-handler value) or rethrow. Without a handler, errors propagate.\n *\n * Wire one per pipeline at boot \u2014 the host CLI typically installs a\n * single boundary that logs to the operational log and emits a\n * `pipeline.error` event for /diag.\n */\n setErrorHandler(handler: PipelineErrorHandler | undefined): this {\n this.errorHandler = handler;\n return this;\n }\n\n /**\n * Set the operational logger used by the swallow error-boundary path.\n * Without this, a swallowed middleware crash is completely silent.\n */\n setLogger(\n logger: { warn: (msg: string, ctx?: unknown) => void | undefined } | undefined,\n ): this {\n this.logger = logger;\n return this;\n }\n\n use(mw: Middleware<T> | Middleware<unknown>): this {\n this.ensureUnique(mw.name);\n this.chain.push(mw as Middleware<T>);\n return this;\n }\n\n prepend(mw: Middleware<T>): this {\n this.ensureUnique(mw.name);\n this.chain.unshift(mw);\n return this;\n }\n\n /**\n * Insert middleware at an explicit index. Out-of-range indices are clamped.\n * Use this when insertBefore/insertAfter are insufficient (e.g. to place\n * a middleware at a known position regardless of named targets).\n */\n insertAt(index: number, mw: Middleware<T>): this {\n this.ensureUnique(mw.name);\n const idx = Math.max(0, Math.min(index, this.chain.length));\n this.chain.splice(idx, 0, mw);\n return this;\n }\n\n /**\n * Insert mw immediately before the first occurrence of target.\n * If called multiple times with the same target, each call inserts\n * before the target's current position \u2014 so after insertBefore('B', X)\n * then insertBefore('B', Y), the order is Y \u2192 X \u2192 B.\n */\n insertBefore(target: string, mw: Middleware<T>, opts?: PipelineOptions): this {\n this.ensureUnique(mw.name);\n const idx = this.indexOf(target, opts?.optional);\n if (idx === -1) return this;\n this.chain.splice(idx, 0, mw);\n return this;\n }\n\n /**\n * Insert mw immediately after the first occurrence of target.\n * If called multiple times with the same target, each call inserts\n * after the target's current position \u2014 so after insertAfter('B', X)\n * then insertAfter('B', Y), the order is B \u2192 X \u2192 Y.\n */\n insertAfter(target: string, mw: Middleware<T>, opts?: PipelineOptions): this {\n this.ensureUnique(mw.name);\n const idx = this.indexOf(target, opts?.optional);\n if (idx === -1) return this;\n this.chain.splice(idx + 1, 0, mw);\n return this;\n }\n\n replace(target: string, mw: Middleware<T>, opts?: PipelineOptions): this {\n if (mw.name !== target) this.ensureUnique(mw.name);\n const idx = this.indexOf(target, opts?.optional);\n if (idx === -1) return this;\n this.chain[idx] = mw;\n return this;\n }\n\n remove(name: string, opts?: PipelineOptions): this {\n const idx = this.indexOf(name, opts?.optional);\n if (idx === -1) return this;\n this.chain.splice(idx, 1);\n return this;\n }\n\n list(): readonly string[] {\n return this.chain.map((m) => m.name);\n }\n\n size(): number {\n return this.chain.length;\n }\n\n /** Return a read-only view suitable for passing to plugins. */\n asReadonly(): ReadonlyPipeline<T> {\n // The returned object's methods close over `this`, so it always sees the\n // live chain. `list()` freezes its result so plugin code can't mutate\n // the chain names; subsequent calls produce fresh frozen snapshots.\n const self = this;\n const view: ReadonlyPipeline<T> = Object.freeze({\n get size(): number {\n return self.chain.length;\n },\n list(): readonly string[] {\n return Object.freeze(self.chain.map((m) => m.name));\n },\n run(input: T): Promise<T> {\n return self.run(input);\n },\n });\n return view;\n }\n\n async run(input: T): Promise<T> {\n let index = -1;\n const chain = this.chain;\n const errorHandler = this.errorHandler;\n\n const dispatch = async (i: number, value: T): Promise<T> => {\n if (i <= index) {\n const offender = chain[index]?.name;\n throw new WrongStackError({\n message: `Pipeline: next() called multiple times in \"${offender}\"`,\n code: ERROR_CODES.VALIDATION_ERROR,\n subsystem: 'container',\n context: { middleware: offender },\n });\n }\n index = i;\n const mw = chain[i];\n if (!mw) return value;\n try {\n return await mw.handler(value, (v) => dispatch(i + 1, v));\n } catch (err) {\n if (!errorHandler) throw err;\n const policy = await errorHandler({ middleware: mw.name, owner: mw.owner, err });\n if (policy === 'rethrow') throw err;\n // Swallow: resolve THIS dispatch with the value that was about to flow\n // into the crashed middleware. Because we return instead of recursing,\n // the crashed middleware and everything downstream of it never run; the\n // upstream caller's `await next()` resolves with `value` and its\n // post-next() logic continues. Net effect: the broken layer and the\n // rest of the chain below it are short-circuited, while already-entered\n // upstream layers unwind normally.\n // P2 #7 (before-release.md): emit a structured warning so a swallowed\n // crash is never completely silent. Plugin authors debugging a\n // short-circuited middleware would otherwise have no signal.\n this.logger?.warn('pipeline.error', {\n middleware: mw.name,\n owner: mw.owner,\n error: err instanceof Error ? err.message : String(err),\n });\n return value;\n }\n };\n\n return dispatch(0, input);\n }\n\n private indexOf(name: string, optional = false): number {\n const idx = this.chain.findIndex((m) => m.name === name);\n if (idx === -1 && !optional) {\n throw new WrongStackError({\n message: `Pipeline: middleware \"${name}\" not found`,\n code: ERROR_CODES.REGISTRY_NOT_FOUND,\n subsystem: 'container',\n context: { middleware: name },\n });\n }\n return idx;\n }\n\n private ensureUnique(name: string): void {\n if (this.chain.some((m) => m.name === name)) {\n throw new WrongStackError({\n message: `Pipeline: middleware \"${name}\" already registered`,\n code: ERROR_CODES.REGISTRY_DUPLICATE,\n subsystem: 'container',\n context: { middleware: name },\n });\n }\n }\n}\n", "/**\n * EventBus \u2014 observe-only typed event bus.\n * Subscribers cannot modify or cancel. Subscriber exceptions are caught.\n */\n\nimport type { AgentEventMap } from './events/agent-events.js';\nimport type { BrainEventMap } from './events/brain-events.js';\nimport type { FleetEventMap } from './events/fleet-events.js';\nimport type { MemoryEventMap } from './events/memory-events.js';\nimport type { ProviderEventMap } from './events/provider-events.js';\nimport type { SddEventMap } from './events/sdd-events.js';\nimport type { SessionEventMap } from './events/session-events.js';\nimport type { ToolEventMap } from './events/tool-events.js';\nimport type { WorktreeEventMap } from './events/worktree-events.js';\n\n/** Distress signals the BrainMonitor watches. See `coordination/brain-monitor.ts`. */\nexport type BrainInterventionKind =\n | 'tool_failure_streak'\n | 'error_storm'\n | 'agent_stall'\n | 'file_churn';\n\n/**\n * Structural shape of a tracked agent as flushed by AgentStatusTracker. Kept\n * structural (not imported from the root `session-registry` module) so the\n * low-level kernel layer takes on no dependency on composition modules. The\n * real `AgentEntry` is assignable to this.\n */\nexport interface TrackedAgentSnapshot {\n id: string;\n name: string;\n startedAt?: string | undefined;\n status: string;\n currentTool?: string | undefined;\n iterations: number;\n toolCalls: number;\n costUsd?: number | undefined;\n tokensIn?: number | undefined;\n tokensOut?: number | undefined;\n ctxPct?: number | undefined;\n model?: string | undefined;\n partialText?: string | undefined;\n lastActivityAt: string;\n}\n\nexport interface EventMap\n extends AgentEventMap,\n BrainEventMap,\n SessionEventMap,\n ProviderEventMap,\n ToolEventMap,\n MemoryEventMap,\n SddEventMap,\n WorktreeEventMap,\n FleetEventMap {}\n\nexport type EventName = keyof EventMap;\nexport type Listener<E extends EventName> = (payload: EventMap[E]) => void;\n\nexport interface EventLogger {\n error(msg: string, ctx?: unknown): void | undefined;\n}\n\nexport class EventBus {\n private readonly listeners = new Map<EventName, Set<Listener<EventName>>>();\n private readonly wildcards: Array<{\n match: (event: string) => boolean;\n fn: (event: string, payload: unknown) => void;\n }> = [];\n private logger?: EventLogger | undefined;\n\n setLogger(logger: EventLogger): void {\n this.logger = logger;\n }\n\n on<E extends EventName>(event: E, fn: Listener<E>): () => void {\n let set = this.listeners.get(event);\n if (!set) {\n set = new Set();\n this.listeners.set(event, set);\n }\n set.add(fn as Listener<EventName>);\n return () => this.off(event, fn);\n }\n\n off<E extends EventName>(event: E, fn: Listener<E>): void {\n const set = this.listeners.get(event);\n if (!set) return;\n set.delete(fn as Listener<EventName>);\n // Prune the now-empty Set so the map doesn't accumulate dead entries that\n // listenerCount() and iteration would otherwise walk. Safe during an\n // in-flight emit() because emit snapshots the Set before iterating, so it\n // never observes the live Set being deleted.\n if (set.size === 0) this.listeners.delete(event);\n }\n\n once<E extends EventName>(event: E, fn: Listener<E>): () => void {\n const wrapper: Listener<E> = (payload) => {\n this.off(event, wrapper as Listener<EventName>);\n (fn as Listener<E>)(payload);\n };\n this.on(event, wrapper as Listener<E>);\n return () => {\n this.off(event, wrapper as Listener<EventName>);\n };\n }\n\n /**\n * Subscribe to all events, regardless of name. Short-hand for\n * `onPattern('*')`. Use for logging, debugging, or forwarding every\n * event to another bus (as FleetBus does).\n *\n * Returns an unsubscribe function.\n */\n onAny(fn: (event: string, payload: unknown) => void): () => void {\n return this.onPattern('*', fn);\n }\n\n /**\n * Subscribe to all events whose name matches a glob-style prefix.\n * `'tool.*'` matches `tool.started`, `tool.executed`, `tool.progress`, etc.\n * `'*'` matches every event.\n *\n * The handler receives `(eventName, payload)` with the event name as a\n * string and the payload as `unknown`. Use for logging, debugging, or\n * metrics collection across a family of events.\n *\n * Returns an unsubscribe function.\n */\n onPattern(pattern: string, fn: (event: string, payload: unknown) => void): () => void {\n const match = makePatternMatcher(pattern);\n const entry = { match, fn };\n this.wildcards.push(entry);\n return () => {\n const idx = this.wildcards.indexOf(entry);\n if (idx >= 0) this.wildcards.splice(idx, 1);\n };\n }\n\n /**\n * Subscribe to all events whose name matches a RegExp.\n * More flexible than `onPattern` \u2014 use when you need regex features\n * (alternation, character classes, capture groups).\n *\n * Returns an unsubscribe function.\n */\n onRegex(regex: RegExp, fn: (event: string, payload: unknown) => void): () => void {\n const entry = { match: (e: string) => regex.test(e), fn };\n this.wildcards.push(entry);\n return () => {\n const idx = this.wildcards.indexOf(entry);\n if (idx >= 0) this.wildcards.splice(idx, 1);\n };\n }\n\n emit<E extends EventName>(event: E, payload: EventMap[E]): void {\n const set = this.listeners.get(event);\n if (set && set.size > 0) {\n // Snapshot the set before iterating so a listener that subscribes or\n // unsubscribes another listener for the same event mid-emit doesn't\n // observe engine-dependent behavior \u2014 ECMA leaves Set mutation during\n // iteration under-specified. This mirrors the wildcard handling below.\n // A listener added during this emit will not fire until the next emit;\n // one removed during this emit may still fire this round (snapshot\n // semantics), which is the standard, portable event-emitter contract.\n const snapshot = [...set];\n for (const fn of snapshot) {\n try {\n (fn as Listener<E>)(payload);\n } catch (err) {\n this.logger?.error(`EventBus listener for \"${event}\" threw`, err);\n }\n }\n }\n // Wildcard listeners \u2014 snapshot the array first so a listener that\n // subscribes another pattern (via onPattern/onRegex) doesn't see\n // inconsistent behavior across JS engines. ECMA leaves mid-iteration\n // array mutation under-specified; this keeps us engine-portable.\n if (this.wildcards.length > 0) {\n const name = event as string;\n const snapshot = this.wildcards.slice();\n for (const { match, fn } of snapshot) {\n if (!match(name)) continue;\n try {\n fn(name, payload);\n } catch (err) {\n this.logger?.error(`EventBus wildcard listener for \"${name}\" threw`, err);\n }\n }\n }\n }\n\n /**\n * Emit a plugin-defined event that is intentionally outside EventMap.\n * Custom events are delivered to wildcard/pattern listeners only; typed\n * listeners remain reserved for core EventMap keys.\n */\n emitCustom(event: string, payload: unknown): void {\n if (this.wildcards.length === 0) return;\n const snapshot = this.wildcards.slice();\n for (const { match, fn } of snapshot) {\n if (!match(event)) continue;\n try {\n fn(event, payload);\n } catch (err) {\n this.logger?.error(`EventBus wildcard listener for \"${event}\" threw`, err);\n }\n }\n }\n\n clear(): void {\n this.listeners.clear();\n this.wildcards.length = 0;\n }\n\n /**\n * V2-D: introspection helper. Pass an `event` to count handlers for a\n * single key, or omit to get the total across every event. Used by the\n * leak-detection smoke test to flag handler accumulation across runs.\n * Does NOT include wildcard listeners.\n */\n listenerCount(event?: EventName): number {\n if (event !== undefined) return this.listeners.get(event)?.size ?? 0;\n let total = 0;\n for (const set of this.listeners.values()) total += set.size;\n return total;\n }\n\n /**\n * Number of wildcard listeners currently registered.\n */\n wildcardCount(): number {\n return this.wildcards.length;\n }\n\n /**\n * True if anything would receive an emit for `event` \u2014 a named listener\n * OR a wildcard/regex pattern that matches the event name. Unlike\n * `listenerCount`, this DOES account for wildcards, so callers that gate\n * behavior on \"is anyone listening?\" (e.g. SubagentBudget deciding whether\n * to negotiate a soft limit vs hard-stop) don't misfire when the only\n * subscriber is a pattern listener like the FleetBus's `onPattern('*')`.\n */\n hasListenerFor(event: string): boolean {\n if ((this.listeners.get(event as EventName)?.size ?? 0) > 0) return true;\n return this.wildcards.some((w) => w.match(event));\n }\n}\n\n// \u2500\u2500 Scoped EventBus \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\n/**\n * A decorator over `EventBus` that records every listener registration\n * (`.on`, `.once`, `.onPattern`, `.onRegex`) so that `teardown()` can\n * remove all of them at once \u2014 preventing the memory leaks that occur\n * when dynamic plugins or long-lived TUI/WebUI interfaces forget to\n * call `.off()` during session termination.\n *\n * Usage:\n * ```ts\n * const bus = new ScopedEventBus();\n * bus.on('tool.executed', handler1); // tracked\n * bus.on('provider.response', handler2); // tracked\n * bus.onPattern('subagent.*', handler3); // tracked\n * // ... later, when the plugin or session is torn down:\n * bus.teardown(); // removes all three listeners\n * ```\n *\n * Also implements `Disposable` (via `[Symbol.dispose]`) for use with\n * the `using` keyword in Node \u2265 22, or can be used manually with\n * `bus.teardown()`.\n */\nexport class ScopedEventBus extends EventBus {\n // Track registrations by a unique counter key so that EventBus.once()'s\n // internal listener-removal doesn't affect our tracking (once removes the\n // fn from EventBus but we still need to call our unsub during teardown).\n private readonly registrations = new Map<number, () => void>();\n private nextKey = 0;\n\n /**\n * Identical to `EventBus.on` but the listener is tracked so that\n * `teardown()` will remove it automatically.\n */\n override on<E extends EventName>(event: E, fn: Listener<E>): () => void {\n const key = this.nextKey++;\n const unsub = super.on(event, fn);\n this.registrations.set(key, unsub);\n return () => {\n this.registrations.delete(key);\n unsub();\n };\n }\n\n /**\n * Identical to `EventBus.once` but the listener is tracked so that\n * `teardown()` will remove it automatically.\n *\n * Uses EventBus's public API directly to avoid triggering our own `on()`\n * override (which would consume a key slot for the wrapper, then orphan\n * our registration entry under a different key).\n *\n * When the wrapper fires, it cleans up BOTH the underlying EventBus\n * listener AND the tracking entry \u2014 so `scopedListenerCount` returns to\n * its pre-`once()` value without requiring the caller to invoke the\n * returned unsubscribe. The returned `unsub` is still safe to call\n * after auto-removal (its delete is a no-op and its off() finds\n * nothing to remove).\n */\n override once<E extends EventName>(event: E, fn: Listener<E>): () => void {\n const key = this.nextKey++;\n const wrapper: Listener<E> = (payload) => {\n // Bypass ScopedEventBus.on() \u2014 go straight to EventBus.off() so we\n // don't recurse and don't consume another key.\n EventBus.prototype.off.call(this, event, wrapper as Listener<EventName>);\n // Drop the tracking entry so scopedListenerCount is honest. Done\n // before calling `fn` so a handler that calls scopedListenerCount\n // mid-fire sees the post-removal state.\n this.registrations.delete(key);\n (fn as Listener<E>)(payload);\n };\n // Use the EventBus prototype directly to register without triggering\n // ScopedEventBus.on() which would consume a second key.\n EventBus.prototype.on.call(this, event, wrapper as Listener<EventName>);\n const unsub = () => {\n this.registrations.delete(key);\n EventBus.prototype.off.call(this, event, wrapper as Listener<EventName>);\n };\n this.registrations.set(key, unsub);\n return unsub;\n }\n\n /**\n * Subscribe to all events. Alias for `onPattern('*')` \u2014 the listener is\n * tracked so that `teardown()` will remove it automatically.\n */\n override onAny(fn: (event: string, payload: unknown) => void): () => void {\n const key = this.nextKey++;\n // Call EventBus.onPattern directly so the wrapper-consumption in\n // ScopedEventBus.on() doesn't re-enter and create a second registration slot.\n const unsub = EventBus.prototype.onPattern.call(this, '*', fn);\n this.registrations.set(key, unsub);\n return () => {\n this.registrations.delete(key);\n unsub();\n };\n }\n\n /**\n * Identical to `EventBus.onPattern` but the listener is tracked so that\n * `teardown()` will remove it automatically.\n */\n override onPattern(pattern: string, fn: (event: string, payload: unknown) => void): () => void {\n const key = this.nextKey++;\n const unsub = super.onPattern(pattern, fn);\n this.registrations.set(key, unsub);\n return () => {\n this.registrations.delete(key);\n unsub();\n };\n }\n\n /**\n * Identical to `EventBus.onRegex` but the listener is tracked so that\n * `teardown()` will remove it automatically.\n */\n override onRegex(regex: RegExp, fn: (event: string, payload: unknown) => void): () => void {\n const key = this.nextKey++;\n const unsub = super.onRegex(regex, fn);\n this.registrations.set(key, unsub);\n return () => {\n this.registrations.delete(key);\n unsub();\n };\n }\n\n /**\n * Remove every listener that was registered through this scoped bus.\n * Idempotent \u2014 calling it multiple times is safe.\n *\n * Also available as `[Symbol.dispose]` for explicit resource management:\n * ```ts\n * using scope = new ScopedEventBus();\n * scope.on('tool.executed', handler);\n * // automatically teardown()'d when scope exits\n * ```\n */\n teardown(): void {\n for (const unsub of this.registrations.values()) {\n try {\n unsub();\n } catch {\n /* ignore \u2014 best effort */\n }\n }\n this.registrations.clear();\n this.clear();\n }\n\n /** Alias for `teardown()` \u2014 enables `using new ScopedEventBus()` in Node \u2265 22. */\n [Symbol.dispose](): void {\n this.teardown();\n }\n\n /** Number of tracked registrations. */\n get scopedListenerCount(): number {\n return this.registrations.size;\n }\n}\n\n/**\n * Reused matcher for the `'*'` wildcard \u2014 equivalent to `() => true`\n * but allocated once at module load rather than on every `onPattern('*')`\n * or `onAny()` call. The wildcard array can grow to hundreds of entries\n * during long-lived sessions, so caching the function avoids GC pressure.\n */\nconst MATCH_ALL: (event: string) => boolean = () => true;\n\n/**\n * Convert a glob-style pattern to a matcher function.\n * Only supports `*` at the end of a prefix \u2014 `'tool.*'` becomes\n * \"starts with tool.\". `'*'` matches everything.\n */\nfunction makePatternMatcher(pattern: string): (event: string) => boolean {\n if (pattern === '*') return MATCH_ALL;\n if (pattern.endsWith('.*')) {\n const prefix = pattern.slice(0, -2);\n return (e: string) => e.startsWith(`${prefix}.`);\n }\n // Exact match fallback\n return (e: string) => e === pattern;\n}\n", "import type { BrainArbiter } from '../coordination/brain.js';\nimport type { HookRegistry } from '../hooks/registry.js';\nimport type { Compactor } from '../types/compactor.js';\nimport type { ConfigLoader, ConfigStore } from '../types/config.js';\nimport type { ErrorHandler } from '../types/error-handler.js';\nimport type { InputReader } from '../types/input-reader.js';\nimport type { Logger } from '../types/logger.js';\nimport type { MemoryStore } from '../types/memory.js';\nimport type { ModeStore } from '../types/mode.js';\nimport type { ModelsRegistry } from '../types/models-registry.js';\nimport type { PathResolver } from '../types/path-resolver.js';\nimport type { PermissionPolicy } from '../types/permission.js';\nimport type { ProviderRunner } from '../types/provider-runner.js';\nimport type { Renderer } from '../types/renderer.js';\nimport type { RetryPolicy } from '../types/retry-policy.js';\nimport type { SecretScrubber } from '../types/secret-scrubber.js';\nimport type { SessionStore } from '../types/session.js';\nimport type { PromptLoader } from '../types/prompt.js';\nimport type { SkillLoader } from '../types/skill.js';\nimport type { SystemPromptBuilder } from '../types/system-prompt.js';\nimport type { TokenCounter } from '../types/token-counter.js';\nimport type { WorktreeManager } from '../worktree/worktree-manager.js';\nimport type { Token } from './container.js';\n\n// Tokens use the GLOBAL symbol registry (`Symbol.for`) rather than unique\n// per-call `Symbol()`s. If `@wrongstack/core` is ever evaluated twice in one\n// process \u2014 e.g. Node loads it under two path casings on a case-insensitive\n// filesystem (`D:\\Codebox\\\u2026` vs `D:\\codebox\\\u2026`), or a bundler inlines a second\n// copy \u2014 `Symbol()` would mint distinct tokens per instance, so a binding made\n// via one copy's `TOKENS.ConfigStore` could never be resolved via the other's,\n// surfacing as `Container: token \"ConfigStore\" not bound`. `Symbol.for(key)`\n// returns the same symbol for the same key across every module instance in the\n// process, making DI resilient to accidental duplication. The key is namespaced\n// to avoid colliding with unrelated global symbols; `.description` (used in\n// container error messages) stays human-readable.\nconst t = <T>(name: string): Token<T> => Symbol.for(`@wrongstack/core/kernel#${name}`) as Token<T>;\n\nexport const TOKENS = {\n Logger: t<Logger>('Logger'),\n TokenCounter: t<TokenCounter>('TokenCounter'),\n SessionStore: t<SessionStore>('SessionStore'),\n MemoryStore: t<MemoryStore>('MemoryStore'),\n PermissionPolicy: t<PermissionPolicy>('PermissionPolicy'),\n Compactor: t<Compactor>('Compactor'),\n PathResolver: t<PathResolver>('PathResolver'),\n ConfigLoader: t<ConfigLoader>('ConfigLoader'),\n ConfigStore: t<ConfigStore>('ConfigStore'),\n Renderer: t<Renderer>('Renderer'),\n InputReader: t<InputReader>('InputReader'),\n ErrorHandler: t<ErrorHandler>('ErrorHandler'),\n RetryPolicy: t<RetryPolicy>('RetryPolicy'),\n SkillLoader: t<SkillLoader>('SkillLoader'),\n PromptLoader: t<PromptLoader>('PromptLoader'),\n SystemPromptBuilder: t<SystemPromptBuilder>('SystemPromptBuilder'),\n SecretScrubber: t<SecretScrubber>('SecretScrubber'),\n ModelsRegistry: t<ModelsRegistry>('ModelsRegistry'),\n ModeStore: t<ModeStore>('ModeStore'),\n /** Replaces the entire provider call layer \u2014 retry, streaming, tracing. */\n ProviderRunner: t<ProviderRunner>('ProviderRunner'),\n /** Optional git-worktree lifecycle manager (per-phase isolation in AutoPhase). */\n WorktreeManager: t<WorktreeManager>('WorktreeManager'),\n /** Optional global Brain arbiter for policy/decision escalation. */\n BrainArbiter: t<BrainArbiter>('BrainArbiter'),\n /** Lifecycle hook registry (shell + in-process hooks). */\n HookRegistry: t<HookRegistry>('HookRegistry'),\n} as const;\n", "import { toErrorMessage } from '../utils/error.js';\n/**\n * RunController centralises abort + cleanup for a single agent run. It\n * wraps a single AbortController and exposes a registry of teardown\n * hooks that fire (LIFO, exactly once) when the run aborts OR ends\n * normally. Anyone holding the controller can:\n *\n * - read `signal` to bail out cooperatively\n * - call `abort(reason?)` to abort the run\n * - call `onAbort(fn)` to register a cleanup hook\n * - call `dispose()` when the run ends normally \u2014 this fires the\n * hooks too, so cleanup runs regardless of outcome\n *\n * Hooks must be idempotent and synchronous-or-quick. Errors thrown\n * inside hooks are caught and surfaced through `errorSink` (or the\n * console as a last resort) so one bad hook can't block the others.\n */\nexport interface RunControllerOptions {\n /** Optional parent signal \u2014 abort propagates from parent \u2192 this. */\n parentSignal?: AbortSignal | undefined;\n /** Receives errors thrown by cleanup hooks. Defaults to console.warn. */\n errorSink?: (err: unknown, where: string) => void;\n}\n\nexport class RunController {\n private readonly ctrl = new AbortController();\n private readonly hooks: Array<() => void | Promise<void>> = [];\n private disposed = false;\n private hooksDrained = false;\n private readonly errorSink: (err: unknown, where: string) => void;\n /**\n * Shared promise for the in-flight `runHooks()` call. Set by the abort\n * signal handler or by `dispose()`, whichever fires first. Both callers\n * await the same promise so abort-triggered async cleanup (session flush,\n * socket close) completes before `dispose()` resolves.\n */\n private _hooksPromise: Promise<void> | null = null;\n\n constructor(opts: RunControllerOptions = {}) {\n this.errorSink =\n opts.errorSink ??\n ((err, where) => {\n console.warn(JSON.stringify({\n level: 'warn',\n event: 'run.cleanup_hook_failed',\n where,\n message: toErrorMessage(err),\n timestamp: new Date().toISOString(),\n }));\n });\n if (opts.parentSignal) {\n const parent = opts.parentSignal;\n if (parent.aborted) {\n this.ctrl.abort(parent.reason);\n // Aborting this signal before attaching the abort listener means\n // the listener (registered below) will not fire \u2014 the WHATWG spec\n // only delivers abort events on the transition from un-aborted to\n // aborted, not for late listeners on already-aborted signals. So\n // drive the hook pipeline directly. We defer with queueMicrotask\n // so any synchronous `onAbort()` calls between `new RunController(\u2026)`\n // returning and the next microtask checkpoint are captured by the\n // hook array before runHooks() snapshots it.\n queueMicrotask(() => {\n void this.runHooks();\n });\n } else {\n const onParentAbort = () => this.ctrl.abort(parent.reason);\n parent.addEventListener('abort', onParentAbort, { once: true });\n // When this run finishes normally, stop listening on the parent.\n this.onAbort(() => parent.removeEventListener('abort', onParentAbort));\n }\n }\n this.ctrl.signal.addEventListener(\n 'abort',\n () => {\n this.ensureHooksRun();\n },\n { once: true },\n );\n }\n\n get signal(): AbortSignal {\n return this.ctrl.signal;\n }\n\n get aborted(): boolean {\n return this.ctrl.signal.aborted;\n }\n\n abort(reason?: unknown): void {\n if (this.ctrl.signal.aborted) return;\n this.ctrl.abort(reason);\n }\n\n /**\n * Register a teardown hook. Returns an unsubscribe function so callers\n * can opt out before the hook fires (e.g. when a tool finishes cleanly\n * before abort happens).\n *\n * If the controller has already drained its hooks (a prior abort() or\n * dispose() ran), the new hook is fired immediately on a best-effort\n * basis \u2014 otherwise a hook registered after teardown would be silently\n * dropped and the resource it cleans up would leak. The returned\n * unsubscribe is a no-op in that case (the hook has already run). Errors\n * from the immediate run are routed through `errorSink` like any other\n * cleanup failure.\n */\n onAbort(fn: () => void | Promise<void>): () => void {\n if (this.hooksDrained) {\n void (async () => {\n try {\n await fn();\n } catch (err) {\n this.errorSink(err, 'RunController.onAbort(post-drain)');\n }\n })();\n return () => {};\n }\n this.hooks.push(fn);\n return () => {\n const idx = this.hooks.indexOf(fn);\n if (idx !== -1) this.hooks.splice(idx, 1);\n };\n }\n\n /**\n * Fire cleanup hooks and tear down listeners \u2014 called when the run\n * ends *normally* so cleanup happens regardless of outcome. Subsequent\n * aborts become no-ops.\n */\n async dispose(): Promise<void> {\n if (this.disposed) return;\n this.disposed = true;\n await this.ensureHooksRun();\n }\n\n /**\n * Start running hooks (or wait for an already-in-flight run) and return\n * a promise that settles when all hooks complete. Both the abort signal\n * handler and `dispose()` call this so they share the same underlying\n * promise \u2014 abort-triggered async cleanup (session flush, socket close)\n * is guaranteed to finish before `dispose()` resolves.\n */\n private ensureHooksRun(): Promise<void> {\n if (!this._hooksPromise) {\n this._hooksPromise = this.runHooks();\n }\n return this._hooksPromise;\n }\n\n private async runHooks(): Promise<void> {\n if (this.hooksDrained) return;\n this.hooksDrained = true;\n // Snapshot + clear so hooks added during cleanup don't re-fire.\n // The contract says hooks are independent and one bad hook must not\n // block the others, so we fire them in parallel rather than awaiting\n // serially. The snapshot's iteration order still determines the START\n // order (LIFO), so synchronous hooks that push to a shared array keep\n // the LIFO observation. Async hooks may complete out of order \u2014 the\n // previous serial behavior is preserved only for synchronous hooks,\n // and no test asserts async completion ordering.\n const snapshot = this.hooks.splice(0, this.hooks.length).reverse();\n if (snapshot.length === 0) return;\n await Promise.allSettled(\n snapshot.map((hook) =>\n Promise.resolve()\n .then(() => hook())\n .catch((err: unknown) => {\n this.errorSink(err, 'RunController.dispose');\n }),\n ),\n );\n }\n}\n"],
5
- "mappings": "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",
4
+ "sourcesContent": ["/**\n * Converts an unknown error value to a human-readable string.\n * Used in 40+ files across the codebase to normalize error messaging.\n */\nexport function toErrorMessage(err: unknown): string {\n return err instanceof Error ? err.message : String(err);\n}\n", "import { toErrorMessage } from '../utils/index.js';\n\n/**\n * WrongStack error hierarchy.\n *\n * Every error thrown by the framework is a `WrongStackError` with a\n * machine-readable `code`, a `subsystem` tag, and a `severity` level.\n * This lets consumers (CLI, TUI, plugins, tests) branch on structured\n * data instead of parsing error messages.\n */\n\n// \u2500\u2500 Error codes \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\n/**\n * Machine-readable error codes as frozen constants.\n *\n * Use `ERROR_CODES.X` instead of raw string literals for:\n * - IDE autocomplete and compile-time validation\n * - Safe refactoring (rename updates all usages)\n * - Plugin extensibility (extend the object to add custom codes)\n *\n * The `ErrorCode` type is derived from this object, so adding a new\n * code here automatically updates the type without extra changes.\n */\nexport const ERROR_CODES = {\n // Provider\n PROVIDER_RATE_LIMITED: 'PROVIDER_RATE_LIMITED',\n PROVIDER_AUTH_FAILED: 'PROVIDER_AUTH_FAILED',\n PROVIDER_OVERLOADED: 'PROVIDER_OVERLOADED',\n PROVIDER_INVALID_REQUEST: 'PROVIDER_INVALID_REQUEST',\n PROVIDER_SERVER_ERROR: 'PROVIDER_SERVER_ERROR',\n PROVIDER_NETWORK_ERROR: 'PROVIDER_NETWORK_ERROR',\n PROVIDER_CONTEXT_OVERFLOW: 'PROVIDER_CONTEXT_OVERFLOW',\n // Tool\n TOOL_NOT_FOUND: 'TOOL_NOT_FOUND',\n TOOL_PERMISSION_DENIED: 'TOOL_PERMISSION_DENIED',\n TOOL_EXECUTION_FAILED: 'TOOL_EXECUTION_FAILED',\n TOOL_TIMEOUT: 'TOOL_TIMEOUT',\n TOOL_INPUT_INVALID: 'TOOL_INPUT_INVALID',\n // Config\n CONFIG_INVALID: 'CONFIG_INVALID',\n CONFIG_NOT_FOUND: 'CONFIG_NOT_FOUND',\n CONFIG_PARSE_FAILED: 'CONFIG_PARSE_FAILED',\n CONFIG_MIGRATION_NEEDED: 'CONFIG_MIGRATION_NEEDED',\n // Plugin\n PLUGIN_LOAD_FAILED: 'PLUGIN_LOAD_FAILED',\n PLUGIN_API_MISMATCH: 'PLUGIN_API_MISMATCH',\n PLUGIN_MISSING_DEPENDENCY: 'PLUGIN_MISSING_DEPENDENCY',\n // Agent\n AGENT_ITERATION_LIMIT: 'AGENT_ITERATION_LIMIT',\n AGENT_CONTEXT_OVERFLOW: 'AGENT_CONTEXT_OVERFLOW',\n AGENT_ABORTED: 'AGENT_ABORTED',\n AGENT_RUN_FAILED: 'AGENT_RUN_FAILED',\n // Session\n SESSION_NOT_FOUND: 'SESSION_NOT_FOUND',\n SESSION_CORRUPTED: 'SESSION_CORRUPTED',\n SESSION_WRITE_FAILED: 'SESSION_WRITE_FAILED',\n // Container / Registry\n CONTAINER_TOKEN_ALREADY_BOUND: 'CONTAINER_TOKEN_ALREADY_BOUND',\n CONTAINER_TOKEN_NOT_BOUND: 'CONTAINER_TOKEN_NOT_BOUND',\n CONTAINER_CIRCULAR_DEPENDENCY: 'CONTAINER_CIRCULAR_DEPENDENCY',\n REGISTRY_DUPLICATE: 'REGISTRY_DUPLICATE',\n REGISTRY_NOT_FOUND: 'REGISTRY_NOT_FOUND',\n REGISTRY_INVALID: 'REGISTRY_INVALID',\n // File system\n FS_READ_FAILED: 'FS_READ_FAILED',\n FS_WRITE_FAILED: 'FS_WRITE_FAILED',\n FS_MKDIR_FAILED: 'FS_MKDIR_FAILED',\n FS_DELETE_FAILED: 'FS_DELETE_FAILED',\n FS_ATOMIC_WRITE_FAILED: 'FS_ATOMIC_WRITE_FAILED',\n // SDD (Spec-Driven Development)\n SDD_VALIDATION_FAILED: 'SDD_VALIDATION_FAILED',\n SDD_PARSE_FAILED: 'SDD_PARSE_FAILED',\n SDD_INVALID_STATE: 'SDD_INVALID_STATE',\n SDD_NOT_READY: 'SDD_NOT_READY',\n // General\n VALIDATION_ERROR: 'VALIDATION_ERROR',\n PARSE_FAILED: 'PARSE_FAILED',\n UNKNOWN: 'UNKNOWN',\n} as const;\n\n/**\n * Union type derived from `ERROR_CODES`. Using `typeof ERROR_CODES[keyof typeof ERROR_CODES]`\n * instead of a string literal union means TypeScript auto-updates the type whenever\n * a new code is added to `ERROR_CODES` \u2014 no need to keep two lists in sync.\n */\nexport type ErrorCode = (typeof ERROR_CODES)[keyof typeof ERROR_CODES];\n\nexport type ErrorSubsystem =\n | 'provider'\n | 'tool'\n | 'config'\n | 'plugin'\n | 'agent'\n | 'session'\n | 'sdd'\n | 'container'\n | 'fs'\n | 'general';\nexport type ErrorSeverity = 'fatal' | 'error' | 'warning';\n\n// \u2500\u2500 Base error class \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\nexport class WrongStackError extends Error {\n readonly code: ErrorCode;\n readonly subsystem: ErrorSubsystem;\n readonly severity: ErrorSeverity;\n readonly recoverable: boolean;\n readonly context?: Record<string, unknown> | undefined;\n\n constructor(opts: {\n message: string;\n code: ErrorCode;\n subsystem: ErrorSubsystem;\n severity?: ErrorSeverity | undefined;\n recoverable?: boolean | undefined;\n context?: Record<string, unknown> | undefined;\n cause?: unknown | undefined;\n }) {\n super(opts.message, { cause: opts.cause });\n this.name = 'WrongStackError';\n this.code = opts.code;\n this.subsystem = opts.subsystem;\n this.severity = opts.severity ?? 'error';\n this.recoverable = opts.recoverable ?? false;\n this.context = opts.context;\n }\n\n /**\n * Render a one-line user-facing description.\n * Subclasses should override for domain-specific formatting.\n */\n describe(): string {\n const ctx = this.context ? ` ${formatContext(this.context)}` : '';\n return `${this.code}: ${this.message}${ctx}`;\n }\n}\n\nfunction formatContext(ctx: Record<string, unknown>): string {\n const parts = Object.entries(ctx)\n .filter(([, v]) => v !== undefined)\n .slice(0, 3)\n .map(([k, v]) => `${k}=${String(v)}`);\n return parts.length > 0 ? `[${parts.join(' ')}]` : '';\n}\n\n// \u2500\u2500 Specific error classes \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\n/**\n * Tool execution errors \u2014 thrown by ToolExecutor and individual tools.\n */\nexport class ToolError extends WrongStackError {\n readonly toolName: string;\n\n constructor(opts: {\n message: string;\n code: Extract<\n ErrorCode,\n | 'TOOL_NOT_FOUND'\n | 'TOOL_PERMISSION_DENIED'\n | 'TOOL_EXECUTION_FAILED'\n | 'TOOL_TIMEOUT'\n | 'TOOL_INPUT_INVALID'\n >;\n toolName: string;\n recoverable?: boolean | undefined;\n context?: Record<string, unknown> | undefined;\n cause?: unknown | undefined;\n }) {\n super({\n message: opts.message,\n code: opts.code,\n subsystem: 'tool',\n recoverable: opts.recoverable,\n context: { tool: opts.toolName, ...opts.context },\n cause: opts.cause,\n });\n this.name = 'ToolError';\n this.toolName = opts.toolName;\n }\n}\n\n/**\n * Config loading / validation errors.\n */\nexport class ConfigError extends WrongStackError {\n constructor(opts: {\n message: string;\n code: Extract<\n ErrorCode,\n 'CONFIG_INVALID' | 'CONFIG_NOT_FOUND' | 'CONFIG_PARSE_FAILED' | 'CONFIG_MIGRATION_NEEDED'\n >;\n context?: Record<string, unknown> | undefined;\n cause?: unknown | undefined;\n }) {\n super({\n message: opts.message,\n code: opts.code,\n subsystem: 'config',\n severity: 'fatal',\n recoverable: false,\n context: opts.context,\n cause: opts.cause,\n });\n this.name = 'ConfigError';\n }\n}\n\n/**\n * Plugin loading / lifecycle errors.\n */\nexport class PluginError extends WrongStackError {\n readonly pluginName: string;\n\n constructor(opts: {\n message: string;\n code: Extract<\n ErrorCode,\n 'PLUGIN_LOAD_FAILED' | 'PLUGIN_API_MISMATCH' | 'PLUGIN_MISSING_DEPENDENCY'\n >;\n pluginName: string;\n context?: Record<string, unknown> | undefined;\n cause?: unknown | undefined;\n }) {\n super({\n message: opts.message,\n code: opts.code,\n subsystem: 'plugin',\n severity: 'error',\n recoverable: opts.code === ERROR_CODES.PLUGIN_MISSING_DEPENDENCY,\n context: { plugin: opts.pluginName, ...opts.context },\n cause: opts.cause,\n });\n this.name = 'PluginError';\n this.pluginName = opts.pluginName;\n }\n}\n\n/**\n * Agent runtime errors \u2014 thrown by Agent.run when a non-WrongStackError\n * escapes the inner loop, so callers always see a structured error.\n */\nexport class AgentError extends WrongStackError {\n constructor(opts: {\n message: string;\n code: Extract<\n ErrorCode,\n 'AGENT_ITERATION_LIMIT' | 'AGENT_CONTEXT_OVERFLOW' | 'AGENT_ABORTED' | 'AGENT_RUN_FAILED'\n >;\n recoverable?: boolean | undefined;\n context?: Record<string, unknown> | undefined;\n cause?: unknown | undefined;\n }) {\n super({\n message: opts.message,\n code: opts.code,\n subsystem: 'agent',\n severity: opts.code === ERROR_CODES.AGENT_ABORTED ? 'warning' : 'error',\n recoverable: opts.recoverable ?? opts.code === ERROR_CODES.AGENT_ITERATION_LIMIT,\n context: opts.context,\n cause: opts.cause,\n });\n this.name = 'AgentError';\n }\n}\n\n/**\n * Wrap an arbitrary thrown value into a `WrongStackError` so the caller\n * always gets a structured error. Pass-throughs WrongStackError instances\n * unchanged; raw `Error`s and primitives get an `AGENT_RUN_FAILED` wrapper\n * with the original preserved as `cause`.\n */\nexport function toWrongStackError(\n err: unknown,\n code: Extract<ErrorCode, 'AGENT_RUN_FAILED' | 'AGENT_ABORTED' | 'UNKNOWN'> = ERROR_CODES.AGENT_RUN_FAILED,\n): WrongStackError {\n if (err instanceof WrongStackError) return err;\n const message = toErrorMessage(err);\n return new AgentError({\n message,\n code: code === 'UNKNOWN' ? ERROR_CODES.AGENT_RUN_FAILED : code,\n cause: err,\n });\n}\n\n/**\n * Session storage errors.\n */\nexport class SessionError extends WrongStackError {\n readonly sessionId?: string | undefined;\n\n constructor(opts: {\n message: string;\n code: Extract<ErrorCode, 'SESSION_NOT_FOUND' | 'SESSION_CORRUPTED' | 'SESSION_WRITE_FAILED'>;\n sessionId?: string | undefined;\n context?: Record<string, unknown> | undefined;\n cause?: unknown | undefined;\n }) {\n super({\n message: opts.message,\n code: opts.code,\n subsystem: 'session',\n severity: opts.code === ERROR_CODES.SESSION_WRITE_FAILED ? 'error' : 'warning',\n recoverable: opts.code !== ERROR_CODES.SESSION_CORRUPTED,\n context: { sessionId: opts.sessionId, ...opts.context },\n cause: opts.cause,\n });\n this.name = 'SessionError';\n this.sessionId = opts.sessionId;\n }\n}\n\n/**\n * SDD (Spec-Driven Development) errors \u2014 spec validation, parsing, and\n * state machine violations in the AISpecBuilder, TaskFlow, and TaskTracker.\n */\nexport class SddError extends WrongStackError {\n constructor(opts: {\n message: string;\n code: Extract<\n ErrorCode,\n 'SDD_VALIDATION_FAILED' | 'SDD_PARSE_FAILED' | 'SDD_INVALID_STATE' | 'SDD_NOT_READY'\n >;\n context?: Record<string, unknown> | undefined;\n cause?: unknown | undefined;\n }) {\n super({\n message: opts.message,\n code: opts.code,\n subsystem: 'sdd',\n severity: opts.code === ERROR_CODES.SDD_PARSE_FAILED ? 'warning' : 'error',\n recoverable: opts.code === ERROR_CODES.SDD_NOT_READY,\n context: opts.context,\n cause: opts.cause,\n });\n this.name = 'SddError';\n }\n}\n\n/**\n * File system operation errors.\n */\nexport class FsError extends WrongStackError {\n readonly path?: string | undefined;\n\n constructor(opts: {\n message: string;\n code: Extract<\n ErrorCode,\n 'FS_READ_FAILED' | 'FS_WRITE_FAILED' | 'FS_MKDIR_FAILED' | 'FS_DELETE_FAILED' | 'FS_ATOMIC_WRITE_FAILED'\n >;\n path?: string | undefined;\n context?: Record<string, unknown> | undefined;\n cause?: unknown | undefined;\n }) {\n super({\n message: opts.message,\n code: opts.code,\n subsystem: 'fs',\n severity: 'error',\n recoverable: opts.code !== ERROR_CODES.FS_READ_FAILED,\n context: { path: opts.path, ...opts.context },\n cause: opts.cause,\n });\n this.name = 'FsError';\n this.path = opts.path;\n }\n}\n\n/**\n * HTTP fetch error \u2014 thrown when a network request returns a non-OK status.\n * Carries the response status so {@link classifyToolError} can branch on it\n * (429 \u2192 transient, 404 \u2192 not_found, 401 \u2192 permission) without duck-typing\n * the error via `'response' in err`.\n *\n * P3 #18 (before-release.md): the previous `'response' in err` check caught\n * any Error with a `response` property, including custom errors, proxy\n * objects, or mocked errors in tests. `instanceof FetchError` is reliable.\n *\n * Tools and providers that make HTTP requests and need the executor to\n * classify their failures should throw `new FetchError({ status, message })`\n * instead of a bare `Error` with an ad-hoc `response` field.\n */\nexport class FetchError extends WrongStackError {\n readonly status: number;\n\n constructor(opts: {\n message: string;\n status: number;\n context?: Record<string, unknown> | undefined;\n cause?: unknown | undefined;\n }) {\n super({\n message: opts.message,\n code: ERROR_CODES.VALIDATION_ERROR,\n subsystem: 'general',\n severity: 'error',\n recoverable: opts.status === 429 || opts.status >= 500,\n context: { status: opts.status, ...opts.context },\n cause: opts.cause,\n });\n this.name = 'FetchError';\n this.status = opts.status;\n }\n}\n\n/**\n * Tool input validation error \u2014 thrown when a tool's input fails a validation\n * check that the JSON Schema cannot express (e.g. `old_string === new_string`\n * in edit, or a cross-field invariant). Use this instead of a bare\n * `throw new Error('...validation...')` so {@link classifyToolError} can\n * match on `instanceof` rather than a locale-dependent message substring.\n *\n * P2 #6 (before-release.md): the previous `err.message.includes('validation')`\n * check misclassified any error whose message happened to contain \"validation\"\n * (e.g. a third-party \"input validation timeout\") as a VALIDATION error.\n *\n * Named `ToolValidationError` (not `ValidationError`) to avoid colliding with\n * the existing `ValidationError` interface exported by json-schema-validate.ts\n * (a validation-result shape, not an Error subclass).\n */\nexport class ToolValidationError extends WrongStackError {\n constructor(opts: {\n message: string;\n /** Field path or tool name that failed validation, for diagnostics. */\n field?: string | undefined;\n context?: Record<string, unknown> | undefined;\n cause?: unknown | undefined;\n }) {\n super({\n message: opts.message,\n code: ERROR_CODES.VALIDATION_ERROR,\n subsystem: 'general',\n severity: 'error',\n recoverable: false,\n context: { field: opts.field, ...opts.context },\n cause: opts.cause,\n });\n this.name = 'ToolValidationError';\n }\n}\n\n/**\n * Response / payload parse error \u2014 thrown when an upstream HTTP response,\n * file, or data structure is well-formed at the transport layer (HTTP 200,\n * valid JSON) but is missing required fields or has an unexpected shape.\n *\n * Distinct from `ConfigError(CONFIG_PARSE_FAILED)` (which is specifically\n * for config-file parsing) and `FetchError` (which covers HTTP non-OK\n * responses). `ParseError` fills the gap: the request succeeded but the\n * response body couldn't be interpreted.\n *\n * Common sites: OAuth token responses missing `access_token`, device-code\n * responses missing `device_code`, registry responses with unexpected\n * schemas.\n */\nexport class ParseError extends WrongStackError {\n readonly source?: string | undefined;\n\n constructor(opts: {\n message: string;\n /**\n * What was being parsed \u2014 e.g. `'oauth-token-response'`,\n * `'device-code-response'`. Lets consumers distinguish parse failures\n * from different upstream APIs without parsing the message.\n */\n source?: string | undefined;\n context?: Record<string, unknown> | undefined;\n cause?: unknown | undefined;\n }) {\n super({\n message: opts.message,\n code: ERROR_CODES.PARSE_FAILED,\n subsystem: 'general',\n severity: 'error',\n recoverable: false,\n context: { source: opts.source, ...opts.context },\n cause: opts.cause,\n });\n this.name = 'ParseError';\n this.source = opts.source;\n }\n}\n\n// \u2500\u2500 Type guards \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\nexport function isWrongStackError(err: unknown): err is WrongStackError {\n return err instanceof WrongStackError;\n}\n\nexport function isToolError(err: unknown): err is ToolError {\n return err instanceof ToolError;\n}\n\nexport function isConfigError(err: unknown): err is ConfigError {\n return err instanceof ConfigError;\n}\n\nexport function isPluginError(err: unknown): err is PluginError {\n return err instanceof PluginError;\n}\n\nexport function isSessionError(err: unknown): err is SessionError {\n return err instanceof SessionError;\n}\n\nexport function isAgentError(err: unknown): err is AgentError {\n return err instanceof AgentError;\n}\n\nexport function isFsError(err: unknown): err is FsError {\n return err instanceof FsError;\n}\n\nexport function isToolValidationError(err: unknown): err is ToolValidationError {\n return err instanceof ToolValidationError;\n}\n\nexport function isFetchError(err: unknown): err is FetchError {\n return err instanceof FetchError;\n}\n\nexport function isParseError(err: unknown): err is ParseError {\n return err instanceof ParseError;\n}\n\nexport function isSddError(err: unknown): err is SddError {\n return err instanceof SddError;\n}\n", "import { WrongStackError, ERROR_CODES } from '../types/errors.js';\n\n/**\n * Container \u2014 dependency injection with explicit bind / override / decorate.\n *\n * Invariants:\n * bind() \u2014 throws if token already bound\n * override() \u2014 throws if nothing to replace\n * decorate() \u2014 stacks; cached value cleared on register\n */\n\nexport type Token<T> = symbol & { readonly __type?: T };\nexport type Factory<T> = (c: Container) => T;\nexport type Decorator<T> = (inner: T, c: Container) => T;\n\ninterface Entry<T = unknown> {\n factory: Factory<T>;\n singleton: boolean;\n decorators: Decorator<T>[];\n cache?: T | undefined;\n /**\n * True once a singleton value has been built and stored in `cache`.\n * Tracked separately from `cache !== undefined` so a singleton factory\n * that legitimately resolves to `undefined` (or any falsy value) is still\n * memoized rather than re-run on every resolve().\n */\n hasCache: boolean;\n owner: string;\n}\n\nexport interface BindOptions {\n singleton?: boolean | undefined;\n owner?: string | undefined;\n}\n\nexport class Container {\n private readonly entries = new Map<symbol, Entry>();\n /**\n * Tokens currently mid-resolve. Tracked so we can detect circular\n * dependencies (A \u2192 B \u2192 A) and throw a structured error instead of\n * overflowing the call stack with \"Maximum call stack size exceeded\".\n *\n * Not a memoization cache \u2014 the per-entry `cache` field is the source\n * of truth for \"have I built this before?\". This set only lives for\n * the duration of a single resolve call.\n */\n private readonly resolving = new Set<symbol>();\n\n bind<T>(token: Token<T>, factory: Factory<T>, opts: BindOptions = {}): void {\n if (this.entries.has(token)) {\n throw new WrongStackError({\n message: `Container: token \"${token.description ?? 'unknown'}\" already bound`,\n code: ERROR_CODES.CONTAINER_TOKEN_ALREADY_BOUND,\n subsystem: 'container',\n context: { token: token.description },\n });\n }\n this.entries.set(token, {\n factory: factory as Factory<unknown>,\n singleton: opts.singleton ?? true,\n decorators: [],\n hasCache: false,\n owner: opts.owner ?? 'core',\n });\n }\n\n override<T>(token: Token<T>, factory: Factory<T>, opts: BindOptions = {}): void {\n const existing = this.entries.get(token);\n if (!existing) {\n throw new WrongStackError({\n message: `Container: cannot override \"${token.description ?? 'unknown'}\" \u2014 not bound`,\n code: ERROR_CODES.CONTAINER_TOKEN_NOT_BOUND,\n subsystem: 'container',\n context: { token: token.description },\n });\n }\n this.entries.set(token, {\n factory: factory as Factory<unknown>,\n singleton: opts.singleton ?? existing.singleton,\n decorators: existing.decorators,\n hasCache: false,\n owner: opts.owner ?? existing.owner,\n });\n }\n\n decorate<T>(token: Token<T>, decorator: Decorator<T>, owner = 'core'): void {\n const existing = this.entries.get(token);\n if (!existing) {\n throw new WrongStackError({\n message: `Container: cannot decorate \"${token.description ?? 'unknown'}\" \u2014 not bound`,\n code: ERROR_CODES.CONTAINER_TOKEN_NOT_BOUND,\n subsystem: 'container',\n context: { token: token.description },\n });\n }\n existing.decorators.push(decorator as Decorator<unknown>);\n existing.cache = undefined;\n existing.hasCache = false;\n existing.owner = `${existing.owner}+${owner}`;\n }\n\n resolve<T>(token: Token<T>): T {\n const entry = this.entries.get(token);\n if (!entry) {\n throw new WrongStackError({\n message: `Container: token \"${token.description ?? 'unknown'}\" not bound`,\n code: ERROR_CODES.CONTAINER_TOKEN_NOT_BOUND,\n subsystem: 'container',\n context: { token: token.description },\n });\n }\n if (entry.singleton && entry.hasCache) {\n return entry.cache as T;\n }\n if (this.resolving.has(token)) {\n const cycle = this.describeCycle(token);\n throw new WrongStackError({\n message: `Container: circular dependency detected \u2014 ${cycle}`,\n code: ERROR_CODES.CONTAINER_CIRCULAR_DEPENDENCY,\n subsystem: 'container',\n context: { token: token.description, cycle },\n });\n }\n this.resolving.add(token);\n try {\n let value: unknown = entry.factory(this);\n for (const d of entry.decorators) {\n value = d(value, this);\n }\n if (entry.singleton) {\n entry.cache = value;\n entry.hasCache = true;\n }\n return value as T;\n } finally {\n this.resolving.delete(token);\n }\n }\n\n /**\n * Build a human-readable description of the dependency cycle that\n * caused the resolution to re-enter. Lists the tokens in the order\n * they were entered, then appends the re-entered token to close the\n * loop. Falls back to a generic message if the resolving set is\n * somehow empty (shouldn't happen, but defensive).\n */\n private describeCycle(reentry: symbol): string {\n const descs: string[] = [];\n const seen = new Set<symbol>();\n for (const t of this.resolving) {\n if (seen.has(t)) continue;\n seen.add(t);\n descs.push(t.description ?? 'unknown');\n }\n descs.push(reentry.description ?? 'unknown');\n return descs.join(' \u2192 ');\n }\n\n has<T>(token: Token<T>): boolean {\n return this.entries.has(token);\n }\n\n /**\n * Resolve a token if it is bound, otherwise return undefined.\n * Unlike `resolve()`, this does not throw if the token is unbound.\n *\n * Single map lookup \u2014 `has()` + `resolve()` would walk the entries\n * map twice. The bound check is folded into the resolve path so a\n * non-existent token can never enter the `resolving` cycle-detection\n * set.\n */\n safeResolve<T>(token: Token<T>): T | undefined {\n if (!this.entries.has(token)) return undefined;\n return this.resolve(token);\n }\n\n ownerOf<T>(token: Token<T>): string | undefined {\n return this.entries.get(token)?.owner;\n }\n\n /**\n * Remove a token's binding (along with any decorators stacked on it).\n * Returns true if the token existed. Use this to withdraw temporary\n * bindings installed by a short-lived run or plugin \u2014 without it, the\n * entry persists in the map forever.\n */\n unbind<T>(token: Token<T>): boolean {\n return this.entries.delete(token);\n }\n\n /**\n * Drop every binding. Intended for tests and short-lived CLI invocations\n * that rebuild the container from scratch. Production code should prefer\n * `unbind` on the specific tokens it owns.\n */\n clear(): void {\n this.entries.clear();\n }\n\n list(): Array<{ token: symbol; owner: string }> {\n return Array.from(this.entries.entries()).map(([token, entry]) => ({\n token,\n owner: entry.owner,\n }));\n }\n\n /**\n * Inspect a binding's full shape, including decorator count and whether\n * a singleton value is cached. Returns null if the token is unbound.\n * Decorator and factory function references are not exposed \u2014 only counts\n * and metadata, to keep internal state hidden.\n */\n inspect<T>(token: Token<T>): {\n owner: string;\n singleton: boolean;\n decoratorCount: number;\n cached: boolean;\n } | null {\n const entry = this.entries.get(token);\n if (!entry) return null;\n return {\n owner: entry.owner,\n singleton: entry.singleton,\n decoratorCount: entry.decorators.length,\n cached: entry.hasCache,\n };\n }\n}\n", "/**\n * Pipeline \u2014 Koa-style middleware chain with named middleware\n * and position-aware insertion. Generic over input type T.\n */\n\nimport { WrongStackError, ERROR_CODES } from '../types/errors.js';\n\nexport type NextFn<T> = (value: T) => Promise<T>;\nexport type MiddlewareHandler<T> = (value: T, next: NextFn<T>) => Promise<T>;\n\n/**\n * Called when a middleware crashes (throws or rejects). Used by the\n * Pipeline's error boundary to log the offender without aborting the run.\n *\n * Return `'rethrow'` to propagate the error (default for core middleware),\n * or `'swallow'` to abort descent into the crashing middleware: its caller's\n * `await next()` resolves with the value that was about to flow into the\n * crashed middleware. The crashed middleware AND every middleware after it in\n * the chain are skipped (they never run); UPSTREAM middleware, already paused\n * at their own `await next()`, resume their post-`next()` work normally. It\n * does NOT continue at the next sibling middleware. Plugin middleware should\n * usually be swallowed so one bad plugin can't kill an agent run.\n */\nexport type PipelineErrorPolicy = 'rethrow' | 'swallow';\n\nexport interface PipelineErrorEvent {\n middleware: string;\n owner?: string | undefined;\n err: unknown;\n}\n\nexport type PipelineErrorHandler = (\n ev: PipelineErrorEvent,\n) => PipelineErrorPolicy | Promise<PipelineErrorPolicy>;\n\nexport interface Middleware<T> {\n name: string;\n handler: MiddlewareHandler<T>;\n owner?: string | undefined;\n}\n\nexport interface PipelineOptions {\n /** When true and the target middleware is not found, operations silently no-op instead of throwing. */\n optional?: boolean | undefined;\n}\n\n/**\n * Read-only view of a pipeline. Returned to consumers (plugins, hooks)\n * so they can inspect but not mutate the chain.\n */\nexport interface ReadonlyPipeline<T> {\n readonly size: number;\n list(): readonly string[];\n run(input: T): Promise<T>;\n}\n\nexport class Pipeline<T> {\n private readonly chain: Middleware<T>[] = [];\n private errorHandler?: PipelineErrorHandler | undefined;\n /**\n * Optional operational logger. When set, the `swallow` error-boundary path\n * emits a structured warning so a swallowed middleware crash is never\n * completely silent (P2 #7, before-release.md). Without a logger, the\n * swallow path still works but the crash is invisible \u2014 host code should\n * always wire one.\n */\n private logger?: { warn: (msg: string, ctx?: unknown) => void | undefined } | undefined;\n\n /**\n * Install an error boundary. When a middleware throws or rejects, the\n * handler is called and decides whether to swallow (continue with the\n * pre-handler value) or rethrow. Without a handler, errors propagate.\n *\n * Wire one per pipeline at boot \u2014 the host CLI typically installs a\n * single boundary that logs to the operational log and emits a\n * `pipeline.error` event for /diag.\n */\n setErrorHandler(handler: PipelineErrorHandler | undefined): this {\n this.errorHandler = handler;\n return this;\n }\n\n /**\n * Set the operational logger used by the swallow error-boundary path.\n * Without this, a swallowed middleware crash is completely silent.\n */\n setLogger(\n logger: { warn: (msg: string, ctx?: unknown) => void | undefined } | undefined,\n ): this {\n this.logger = logger;\n return this;\n }\n\n use(mw: Middleware<T> | Middleware<unknown>): this {\n this.ensureUnique(mw.name);\n this.chain.push(mw as Middleware<T>);\n return this;\n }\n\n prepend(mw: Middleware<T>): this {\n this.ensureUnique(mw.name);\n this.chain.unshift(mw);\n return this;\n }\n\n /**\n * Insert middleware at an explicit index. Out-of-range indices are clamped.\n * Use this when insertBefore/insertAfter are insufficient (e.g. to place\n * a middleware at a known position regardless of named targets).\n */\n insertAt(index: number, mw: Middleware<T>): this {\n this.ensureUnique(mw.name);\n const idx = Math.max(0, Math.min(index, this.chain.length));\n this.chain.splice(idx, 0, mw);\n return this;\n }\n\n /**\n * Insert mw immediately before the first occurrence of target.\n * If called multiple times with the same target, each call inserts\n * before the target's current position \u2014 so after insertBefore('B', X)\n * then insertBefore('B', Y), the order is Y \u2192 X \u2192 B.\n */\n insertBefore(target: string, mw: Middleware<T>, opts?: PipelineOptions): this {\n this.ensureUnique(mw.name);\n const idx = this.indexOf(target, opts?.optional);\n if (idx === -1) return this;\n this.chain.splice(idx, 0, mw);\n return this;\n }\n\n /**\n * Insert mw immediately after the first occurrence of target.\n * If called multiple times with the same target, each call inserts\n * after the target's current position \u2014 so after insertAfter('B', X)\n * then insertAfter('B', Y), the order is B \u2192 X \u2192 Y.\n */\n insertAfter(target: string, mw: Middleware<T>, opts?: PipelineOptions): this {\n this.ensureUnique(mw.name);\n const idx = this.indexOf(target, opts?.optional);\n if (idx === -1) return this;\n this.chain.splice(idx + 1, 0, mw);\n return this;\n }\n\n replace(target: string, mw: Middleware<T>, opts?: PipelineOptions): this {\n if (mw.name !== target) this.ensureUnique(mw.name);\n const idx = this.indexOf(target, opts?.optional);\n if (idx === -1) return this;\n this.chain[idx] = mw;\n return this;\n }\n\n remove(name: string, opts?: PipelineOptions): this {\n const idx = this.indexOf(name, opts?.optional);\n if (idx === -1) return this;\n this.chain.splice(idx, 1);\n return this;\n }\n\n list(): readonly string[] {\n return this.chain.map((m) => m.name);\n }\n\n size(): number {\n return this.chain.length;\n }\n\n /** Return a read-only view suitable for passing to plugins. */\n asReadonly(): ReadonlyPipeline<T> {\n // The returned object's methods close over `this`, so it always sees the\n // live chain. `list()` freezes its result so plugin code can't mutate\n // the chain names; subsequent calls produce fresh frozen snapshots.\n const self = this;\n const view: ReadonlyPipeline<T> = Object.freeze({\n get size(): number {\n return self.chain.length;\n },\n list(): readonly string[] {\n return Object.freeze(self.chain.map((m) => m.name));\n },\n run(input: T): Promise<T> {\n return self.run(input);\n },\n });\n return view;\n }\n\n async run(input: T): Promise<T> {\n let index = -1;\n const chain = this.chain;\n const errorHandler = this.errorHandler;\n\n const dispatch = async (i: number, value: T): Promise<T> => {\n if (i <= index) {\n const offender = chain[index]?.name;\n throw new WrongStackError({\n message: `Pipeline: next() called multiple times in \"${offender}\"`,\n code: ERROR_CODES.VALIDATION_ERROR,\n subsystem: 'container',\n context: { middleware: offender },\n });\n }\n index = i;\n const mw = chain[i];\n if (!mw) return value;\n try {\n return await mw.handler(value, (v) => dispatch(i + 1, v));\n } catch (err) {\n if (!errorHandler) throw err;\n const policy = await errorHandler({ middleware: mw.name, owner: mw.owner, err });\n if (policy === 'rethrow') throw err;\n // Swallow: resolve THIS dispatch with the value that was about to flow\n // into the crashed middleware. Because we return instead of recursing,\n // the crashed middleware and everything downstream of it never run; the\n // upstream caller's `await next()` resolves with `value` and its\n // post-next() logic continues. Net effect: the broken layer and the\n // rest of the chain below it are short-circuited, while already-entered\n // upstream layers unwind normally.\n // P2 #7 (before-release.md): emit a structured warning so a swallowed\n // crash is never completely silent. Plugin authors debugging a\n // short-circuited middleware would otherwise have no signal.\n this.logger?.warn('pipeline.error', {\n middleware: mw.name,\n owner: mw.owner,\n error: err instanceof Error ? err.message : String(err),\n });\n return value;\n }\n };\n\n return dispatch(0, input);\n }\n\n private indexOf(name: string, optional = false): number {\n const idx = this.chain.findIndex((m) => m.name === name);\n if (idx === -1 && !optional) {\n throw new WrongStackError({\n message: `Pipeline: middleware \"${name}\" not found`,\n code: ERROR_CODES.REGISTRY_NOT_FOUND,\n subsystem: 'container',\n context: { middleware: name },\n });\n }\n return idx;\n }\n\n private ensureUnique(name: string): void {\n if (this.chain.some((m) => m.name === name)) {\n throw new WrongStackError({\n message: `Pipeline: middleware \"${name}\" already registered`,\n code: ERROR_CODES.REGISTRY_DUPLICATE,\n subsystem: 'container',\n context: { middleware: name },\n });\n }\n }\n}\n", "/**\n * EventBus \u2014 observe-only typed event bus.\n * Subscribers cannot modify or cancel. Subscriber exceptions are caught.\n */\n\nimport type { AgentEventMap } from './events/agent-events.js';\nimport type { BrainEventMap } from './events/brain-events.js';\nimport type { FileEventMap } from './events/file-events.js';\nimport type { FleetEventMap } from './events/fleet-events.js';\nimport type { MemoryEventMap } from './events/memory-events.js';\nimport type { ProviderEventMap } from './events/provider-events.js';\nimport type { ProcessEventMap } from './events/process-events.js';\nimport type { NetworkEventMap } from './events/network-events.js';\nimport type { SddEventMap } from './events/sdd-events.js';\nimport type { SessionEventMap } from './events/session-events.js';\nimport type { ToolEventMap } from './events/tool-events.js';\nimport type { WorktreeEventMap } from './events/worktree-events.js';\n\n/** Distress signals the BrainMonitor watches. See `coordination/brain-monitor.ts`. */\nexport type BrainInterventionKind =\n | 'tool_failure_streak'\n | 'error_storm'\n | 'agent_stall'\n | 'file_churn';\n\n/**\n * Structural shape of a tracked agent as flushed by AgentStatusTracker. Kept\n * structural (not imported from the root `session-registry` module) so the\n * low-level kernel layer takes on no dependency on composition modules. The\n * real `AgentEntry` is assignable to this.\n */\nexport interface TrackedAgentSnapshot {\n id: string;\n name: string;\n startedAt?: string | undefined;\n status: string;\n currentTool?: string | undefined;\n currentTask?: string | undefined;\n taskId?: string | undefined;\n iterations: number;\n toolCalls: number;\n costUsd?: number | undefined;\n tokensIn?: number | undefined;\n tokensOut?: number | undefined;\n ctxPct?: number | undefined;\n model?: string | undefined;\n partialText?: string | undefined;\n todos?:\n | Array<{\n id: string;\n content: string;\n status: 'pending' | 'in_progress' | 'completed';\n activeForm?: string | undefined;\n }>\n | undefined;\n latestPrompt?: string | undefined;\n latestPromptAt?: number | undefined;\n lastActivityAt: string;\n}\n\nexport interface EventMap\n extends AgentEventMap,\n BrainEventMap,\n SessionEventMap,\n ProviderEventMap,\n ProcessEventMap,\n NetworkEventMap,\n FileEventMap,\n ToolEventMap,\n MemoryEventMap,\n SddEventMap,\n WorktreeEventMap,\n FleetEventMap {}\n\nexport type EventName = keyof EventMap;\nexport type Listener<E extends EventName> = (payload: EventMap[E]) => void;\n\nexport interface EventLogger {\n error(msg: string, ctx?: unknown): void | undefined;\n}\n\nexport class EventBus {\n private readonly listeners = new Map<EventName, Set<Listener<EventName>>>();\n private readonly wildcards: Array<{\n match: (event: string) => boolean;\n fn: (event: string, payload: unknown) => void;\n }> = [];\n private logger?: EventLogger | undefined;\n\n setLogger(logger: EventLogger): void {\n this.logger = logger;\n }\n\n on<E extends EventName>(event: E, fn: Listener<E>): () => void {\n let set = this.listeners.get(event);\n if (!set) {\n set = new Set();\n this.listeners.set(event, set);\n }\n set.add(fn as Listener<EventName>);\n return () => this.off(event, fn);\n }\n\n off<E extends EventName>(event: E, fn: Listener<E>): void {\n const set = this.listeners.get(event);\n if (!set) return;\n set.delete(fn as Listener<EventName>);\n // Prune the now-empty Set so the map doesn't accumulate dead entries that\n // listenerCount() and iteration would otherwise walk. Safe during an\n // in-flight emit() because emit snapshots the Set before iterating, so it\n // never observes the live Set being deleted.\n if (set.size === 0) this.listeners.delete(event);\n }\n\n once<E extends EventName>(event: E, fn: Listener<E>): () => void {\n const wrapper: Listener<E> = (payload) => {\n this.off(event, wrapper as Listener<EventName>);\n (fn as Listener<E>)(payload);\n };\n this.on(event, wrapper as Listener<E>);\n return () => {\n this.off(event, wrapper as Listener<EventName>);\n };\n }\n\n /**\n * Subscribe to all events, regardless of name. Short-hand for\n * `onPattern('*')`. Use for logging, debugging, or forwarding every\n * event to another bus (as FleetBus does).\n *\n * Returns an unsubscribe function.\n */\n onAny(fn: (event: string, payload: unknown) => void): () => void {\n return this.onPattern('*', fn);\n }\n\n /**\n * Subscribe to all events whose name matches a glob-style prefix.\n * `'tool.*'` matches `tool.started`, `tool.executed`, `tool.progress`, etc.\n * `'*'` matches every event.\n *\n * The handler receives `(eventName, payload)` with the event name as a\n * string and the payload as `unknown`. Use for logging, debugging, or\n * metrics collection across a family of events.\n *\n * Returns an unsubscribe function.\n */\n onPattern(pattern: string, fn: (event: string, payload: unknown) => void): () => void {\n const match = makePatternMatcher(pattern);\n const entry = { match, fn };\n this.wildcards.push(entry);\n return () => {\n const idx = this.wildcards.indexOf(entry);\n if (idx >= 0) this.wildcards.splice(idx, 1);\n };\n }\n\n /**\n * Subscribe to all events whose name matches a RegExp.\n * More flexible than `onPattern` \u2014 use when you need regex features\n * (alternation, character classes, capture groups).\n *\n * Returns an unsubscribe function.\n */\n onRegex(regex: RegExp, fn: (event: string, payload: unknown) => void): () => void {\n const entry = { match: (e: string) => regex.test(e), fn };\n this.wildcards.push(entry);\n return () => {\n const idx = this.wildcards.indexOf(entry);\n if (idx >= 0) this.wildcards.splice(idx, 1);\n };\n }\n\n emit<E extends EventName>(event: E, payload: EventMap[E]): void {\n const set = this.listeners.get(event);\n if (set && set.size > 0) {\n // Snapshot the set before iterating so a listener that subscribes or\n // unsubscribes another listener for the same event mid-emit doesn't\n // observe engine-dependent behavior \u2014 ECMA leaves Set mutation during\n // iteration under-specified. This mirrors the wildcard handling below.\n // A listener added during this emit will not fire until the next emit;\n // one removed during this emit may still fire this round (snapshot\n // semantics), which is the standard, portable event-emitter contract.\n const snapshot = [...set];\n for (const fn of snapshot) {\n try {\n (fn as Listener<E>)(payload);\n } catch (err) {\n this.logger?.error(`EventBus listener for \"${event}\" threw`, err);\n }\n }\n }\n // Wildcard listeners \u2014 snapshot the array first so a listener that\n // subscribes another pattern (via onPattern/onRegex) doesn't see\n // inconsistent behavior across JS engines. ECMA leaves mid-iteration\n // array mutation under-specified; this keeps us engine-portable.\n if (this.wildcards.length > 0) {\n const name = event as string;\n const snapshot = this.wildcards.slice();\n for (const { match, fn } of snapshot) {\n if (!match(name)) continue;\n try {\n fn(name, payload);\n } catch (err) {\n this.logger?.error(`EventBus wildcard listener for \"${name}\" threw`, err);\n }\n }\n }\n }\n\n /**\n * Emit a plugin-defined event that is intentionally outside EventMap.\n * Custom events are delivered to wildcard/pattern listeners only; typed\n * listeners remain reserved for core EventMap keys.\n */\n emitCustom(event: string, payload: unknown): void {\n if (this.wildcards.length === 0) return;\n const snapshot = this.wildcards.slice();\n for (const { match, fn } of snapshot) {\n if (!match(event)) continue;\n try {\n fn(event, payload);\n } catch (err) {\n this.logger?.error(`EventBus wildcard listener for \"${event}\" threw`, err);\n }\n }\n }\n\n clear(): void {\n this.listeners.clear();\n this.wildcards.length = 0;\n }\n\n /**\n * V2-D: introspection helper. Pass an `event` to count handlers for a\n * single key, or omit to get the total across every event. Used by the\n * leak-detection smoke test to flag handler accumulation across runs.\n * Does NOT include wildcard listeners.\n */\n listenerCount(event?: EventName): number {\n if (event !== undefined) return this.listeners.get(event)?.size ?? 0;\n let total = 0;\n for (const set of this.listeners.values()) total += set.size;\n return total;\n }\n\n /**\n * Number of wildcard listeners currently registered.\n */\n wildcardCount(): number {\n return this.wildcards.length;\n }\n\n /**\n * True if anything would receive an emit for `event` \u2014 a named listener\n * OR a wildcard/regex pattern that matches the event name. Unlike\n * `listenerCount`, this DOES account for wildcards, so callers that gate\n * behavior on \"is anyone listening?\" (e.g. SubagentBudget deciding whether\n * to negotiate a soft limit vs hard-stop) don't misfire when the only\n * subscriber is a pattern listener like the FleetBus's `onPattern('*')`.\n */\n hasListenerFor(event: string): boolean {\n if ((this.listeners.get(event as EventName)?.size ?? 0) > 0) return true;\n return this.wildcards.some((w) => w.match(event));\n }\n}\n\n// \u2500\u2500 Scoped EventBus \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\n/**\n * A decorator over `EventBus` that records every listener registration\n * (`.on`, `.once`, `.onPattern`, `.onRegex`) so that `teardown()` can\n * remove all of them at once \u2014 preventing the memory leaks that occur\n * when dynamic plugins or long-lived TUI/WebUI interfaces forget to\n * call `.off()` during session termination.\n *\n * Usage:\n * ```ts\n * const bus = new ScopedEventBus();\n * bus.on('tool.executed', handler1); // tracked\n * bus.on('provider.response', handler2); // tracked\n * bus.onPattern('subagent.*', handler3); // tracked\n * // ... later, when the plugin or session is torn down:\n * bus.teardown(); // removes all three listeners\n * ```\n *\n * Also implements `Disposable` (via `[Symbol.dispose]`) for use with\n * the `using` keyword in Node \u2265 22, or can be used manually with\n * `bus.teardown()`.\n */\nexport class ScopedEventBus extends EventBus {\n // Track registrations by a unique counter key so that EventBus.once()'s\n // internal listener-removal doesn't affect our tracking (once removes the\n // fn from EventBus but we still need to call our unsub during teardown).\n private readonly registrations = new Map<number, () => void>();\n private nextKey = 0;\n\n /**\n * Identical to `EventBus.on` but the listener is tracked so that\n * `teardown()` will remove it automatically.\n */\n override on<E extends EventName>(event: E, fn: Listener<E>): () => void {\n const key = this.nextKey++;\n const unsub = super.on(event, fn);\n this.registrations.set(key, unsub);\n return () => {\n this.registrations.delete(key);\n unsub();\n };\n }\n\n /**\n * Identical to `EventBus.once` but the listener is tracked so that\n * `teardown()` will remove it automatically.\n *\n * Uses EventBus's public API directly to avoid triggering our own `on()`\n * override (which would consume a key slot for the wrapper, then orphan\n * our registration entry under a different key).\n *\n * When the wrapper fires, it cleans up BOTH the underlying EventBus\n * listener AND the tracking entry \u2014 so `scopedListenerCount` returns to\n * its pre-`once()` value without requiring the caller to invoke the\n * returned unsubscribe. The returned `unsub` is still safe to call\n * after auto-removal (its delete is a no-op and its off() finds\n * nothing to remove).\n */\n override once<E extends EventName>(event: E, fn: Listener<E>): () => void {\n const key = this.nextKey++;\n const wrapper: Listener<E> = (payload) => {\n // Bypass ScopedEventBus.on() \u2014 go straight to EventBus.off() so we\n // don't recurse and don't consume another key.\n EventBus.prototype.off.call(this, event, wrapper as Listener<EventName>);\n // Drop the tracking entry so scopedListenerCount is honest. Done\n // before calling `fn` so a handler that calls scopedListenerCount\n // mid-fire sees the post-removal state.\n this.registrations.delete(key);\n (fn as Listener<E>)(payload);\n };\n // Use the EventBus prototype directly to register without triggering\n // ScopedEventBus.on() which would consume a second key.\n EventBus.prototype.on.call(this, event, wrapper as Listener<EventName>);\n const unsub = () => {\n this.registrations.delete(key);\n EventBus.prototype.off.call(this, event, wrapper as Listener<EventName>);\n };\n this.registrations.set(key, unsub);\n return unsub;\n }\n\n /**\n * Subscribe to all events. Alias for `onPattern('*')` \u2014 the listener is\n * tracked so that `teardown()` will remove it automatically.\n */\n override onAny(fn: (event: string, payload: unknown) => void): () => void {\n const key = this.nextKey++;\n // Call EventBus.onPattern directly so the wrapper-consumption in\n // ScopedEventBus.on() doesn't re-enter and create a second registration slot.\n const unsub = EventBus.prototype.onPattern.call(this, '*', fn);\n this.registrations.set(key, unsub);\n return () => {\n this.registrations.delete(key);\n unsub();\n };\n }\n\n /**\n * Identical to `EventBus.onPattern` but the listener is tracked so that\n * `teardown()` will remove it automatically.\n */\n override onPattern(pattern: string, fn: (event: string, payload: unknown) => void): () => void {\n const key = this.nextKey++;\n const unsub = super.onPattern(pattern, fn);\n this.registrations.set(key, unsub);\n return () => {\n this.registrations.delete(key);\n unsub();\n };\n }\n\n /**\n * Identical to `EventBus.onRegex` but the listener is tracked so that\n * `teardown()` will remove it automatically.\n */\n override onRegex(regex: RegExp, fn: (event: string, payload: unknown) => void): () => void {\n const key = this.nextKey++;\n const unsub = super.onRegex(regex, fn);\n this.registrations.set(key, unsub);\n return () => {\n this.registrations.delete(key);\n unsub();\n };\n }\n\n /**\n * Remove every listener that was registered through this scoped bus.\n * Idempotent \u2014 calling it multiple times is safe.\n *\n * Also available as `[Symbol.dispose]` for explicit resource management:\n * ```ts\n * using scope = new ScopedEventBus();\n * scope.on('tool.executed', handler);\n * // automatically teardown()'d when scope exits\n * ```\n */\n teardown(): void {\n for (const unsub of this.registrations.values()) {\n try {\n unsub();\n } catch {\n /* ignore \u2014 best effort */\n }\n }\n this.registrations.clear();\n this.clear();\n }\n\n /** Alias for `teardown()` \u2014 enables `using new ScopedEventBus()` in Node \u2265 22. */\n [Symbol.dispose](): void {\n this.teardown();\n }\n\n /** Number of tracked registrations. */\n get scopedListenerCount(): number {\n return this.registrations.size;\n }\n}\n\n/**\n * Reused matcher for the `'*'` wildcard \u2014 equivalent to `() => true`\n * but allocated once at module load rather than on every `onPattern('*')`\n * or `onAny()` call. The wildcard array can grow to hundreds of entries\n * during long-lived sessions, so caching the function avoids GC pressure.\n */\nconst MATCH_ALL: (event: string) => boolean = () => true;\n\n/**\n * Convert a glob-style pattern to a matcher function.\n * Only supports `*` at the end of a prefix \u2014 `'tool.*'` becomes\n * \"starts with tool.\". `'*'` matches everything.\n */\nfunction makePatternMatcher(pattern: string): (event: string) => boolean {\n if (pattern === '*') return MATCH_ALL;\n if (pattern.endsWith('.*')) {\n const prefix = pattern.slice(0, -2);\n return (e: string) => e.startsWith(`${prefix}.`);\n }\n // Exact match fallback\n return (e: string) => e === pattern;\n}\n", "import type { BrainArbiter } from '../coordination/brain.js';\nimport type { FallbackProfileManager } from '../core/fallback-profile-manager.js';\nimport type { HookRegistry } from '../hooks/registry.js';\nimport type { Compactor } from '../types/compactor.js';\nimport type { ConfigLoader, ConfigStore } from '../types/config.js';\nimport type { ErrorHandler } from '../types/error-handler.js';\nimport type { InputReader } from '../types/input-reader.js';\nimport type { Logger } from '../types/logger.js';\nimport type { MemoryStore } from '../types/memory.js';\nimport type { ModeStore } from '../types/mode.js';\nimport type { ModelsRegistry } from '../types/models-registry.js';\nimport type { PathResolver } from '../types/path-resolver.js';\nimport type { PermissionPolicy } from '../types/permission.js';\nimport type { ProviderRunner } from '../types/provider-runner.js';\nimport type { Renderer } from '../types/renderer.js';\nimport type { RetryPolicy } from '../types/retry-policy.js';\nimport type { SecretScrubber } from '../types/secret-scrubber.js';\nimport type { SessionStore } from '../types/session.js';\nimport type { PromptLoader } from '../types/prompt.js';\nimport type { SkillLoader } from '../types/skill.js';\nimport type { SystemPromptBuilder } from '../types/system-prompt.js';\nimport type { TokenCounter } from '../types/token-counter.js';\nimport type { WorktreeManager } from '../worktree/worktree-manager.js';\nimport type { Token } from './container.js';\n\n// Tokens use the GLOBAL symbol registry (`Symbol.for`) rather than unique\n// per-call `Symbol()`s. If `@wrongstack/core` is ever evaluated twice in one\n// process \u2014 e.g. Node loads it under two path casings on a case-insensitive\n// filesystem (`D:\\Codebox\\\u2026` vs `D:\\codebox\\\u2026`), or a bundler inlines a second\n// copy \u2014 `Symbol()` would mint distinct tokens per instance, so a binding made\n// via one copy's `TOKENS.ConfigStore` could never be resolved via the other's,\n// surfacing as `Container: token \"ConfigStore\" not bound`. `Symbol.for(key)`\n// returns the same symbol for the same key across every module instance in the\n// process, making DI resilient to accidental duplication. The key is namespaced\n// to avoid colliding with unrelated global symbols; `.description` (used in\n// container error messages) stays human-readable.\nconst t = <T>(name: string): Token<T> => Symbol.for(`@wrongstack/core/kernel#${name}`) as Token<T>;\n\nexport const TOKENS = {\n Logger: t<Logger>('Logger'),\n TokenCounter: t<TokenCounter>('TokenCounter'),\n SessionStore: t<SessionStore>('SessionStore'),\n MemoryStore: t<MemoryStore>('MemoryStore'),\n PermissionPolicy: t<PermissionPolicy>('PermissionPolicy'),\n Compactor: t<Compactor>('Compactor'),\n PathResolver: t<PathResolver>('PathResolver'),\n ConfigLoader: t<ConfigLoader>('ConfigLoader'),\n ConfigStore: t<ConfigStore>('ConfigStore'),\n FallbackProfileManager: t<FallbackProfileManager>('FallbackProfileManager'),\n Renderer: t<Renderer>('Renderer'),\n InputReader: t<InputReader>('InputReader'),\n ErrorHandler: t<ErrorHandler>('ErrorHandler'),\n RetryPolicy: t<RetryPolicy>('RetryPolicy'),\n SkillLoader: t<SkillLoader>('SkillLoader'),\n PromptLoader: t<PromptLoader>('PromptLoader'),\n SystemPromptBuilder: t<SystemPromptBuilder>('SystemPromptBuilder'),\n SecretScrubber: t<SecretScrubber>('SecretScrubber'),\n ModelsRegistry: t<ModelsRegistry>('ModelsRegistry'),\n ModeStore: t<ModeStore>('ModeStore'),\n /** Replaces the entire provider call layer \u2014 retry, streaming, tracing. */\n ProviderRunner: t<ProviderRunner>('ProviderRunner'),\n /** Optional git-worktree lifecycle manager (per-phase isolation in Goal). */\n WorktreeManager: t<WorktreeManager>('WorktreeManager'),\n /** Optional global Brain arbiter for policy/decision escalation. */\n BrainArbiter: t<BrainArbiter>('BrainArbiter'),\n /** Lifecycle hook registry (shell + in-process hooks). */\n HookRegistry: t<HookRegistry>('HookRegistry'),\n} as const;\n", "import { toErrorMessage } from '../utils/error.js';\n/**\n * RunController centralises abort + cleanup for a single agent run. It\n * wraps a single AbortController and exposes a registry of teardown\n * hooks that fire (LIFO, exactly once) when the run aborts OR ends\n * normally. Anyone holding the controller can:\n *\n * - read `signal` to bail out cooperatively\n * - call `abort(reason?)` to abort the run\n * - call `onAbort(fn)` to register a cleanup hook\n * - call `dispose()` when the run ends normally \u2014 this fires the\n * hooks too, so cleanup runs regardless of outcome\n *\n * Hooks must be idempotent and synchronous-or-quick. Errors thrown\n * inside hooks are caught and surfaced through `errorSink` (or the\n * console as a last resort) so one bad hook can't block the others.\n */\nexport interface RunControllerOptions {\n /** Optional parent signal \u2014 abort propagates from parent \u2192 this. */\n parentSignal?: AbortSignal | undefined;\n /** Receives errors thrown by cleanup hooks. Defaults to console.warn. */\n errorSink?: (err: unknown, where: string) => void;\n}\n\nexport class RunController {\n private readonly ctrl = new AbortController();\n private readonly hooks: Array<() => void | Promise<void>> = [];\n private disposed = false;\n private hooksDrained = false;\n private readonly errorSink: (err: unknown, where: string) => void;\n /**\n * Shared promise for the in-flight `runHooks()` call. Set by the abort\n * signal handler or by `dispose()`, whichever fires first. Both callers\n * await the same promise so abort-triggered async cleanup (session flush,\n * socket close) completes before `dispose()` resolves.\n */\n private _hooksPromise: Promise<void> | null = null;\n\n constructor(opts: RunControllerOptions = {}) {\n this.errorSink =\n opts.errorSink ??\n ((err, where) => {\n console.warn(JSON.stringify({\n level: 'warn',\n event: 'run.cleanup_hook_failed',\n where,\n message: toErrorMessage(err),\n timestamp: new Date().toISOString(),\n }));\n });\n if (opts.parentSignal) {\n const parent = opts.parentSignal;\n if (parent.aborted) {\n this.ctrl.abort(parent.reason);\n // Aborting this signal before attaching the abort listener means\n // the listener (registered below) will not fire \u2014 the WHATWG spec\n // only delivers abort events on the transition from un-aborted to\n // aborted, not for late listeners on already-aborted signals. So\n // drive the hook pipeline directly. We defer with queueMicrotask\n // so any synchronous `onAbort()` calls between `new RunController(\u2026)`\n // returning and the next microtask checkpoint are captured by the\n // hook array before runHooks() snapshots it.\n queueMicrotask(() => {\n void this.runHooks();\n });\n } else {\n const onParentAbort = () => this.ctrl.abort(parent.reason);\n parent.addEventListener('abort', onParentAbort, { once: true });\n // When this run finishes normally, stop listening on the parent.\n this.onAbort(() => parent.removeEventListener('abort', onParentAbort));\n }\n }\n this.ctrl.signal.addEventListener(\n 'abort',\n () => {\n this.ensureHooksRun();\n },\n { once: true },\n );\n }\n\n get signal(): AbortSignal {\n return this.ctrl.signal;\n }\n\n get aborted(): boolean {\n return this.ctrl.signal.aborted;\n }\n\n abort(reason?: unknown): void {\n if (this.ctrl.signal.aborted) return;\n this.ctrl.abort(reason);\n }\n\n /**\n * Register a teardown hook. Returns an unsubscribe function so callers\n * can opt out before the hook fires (e.g. when a tool finishes cleanly\n * before abort happens).\n *\n * If the controller has already drained its hooks (a prior abort() or\n * dispose() ran), the new hook is fired immediately on a best-effort\n * basis \u2014 otherwise a hook registered after teardown would be silently\n * dropped and the resource it cleans up would leak. The returned\n * unsubscribe is a no-op in that case (the hook has already run). Errors\n * from the immediate run are routed through `errorSink` like any other\n * cleanup failure.\n */\n onAbort(fn: () => void | Promise<void>): () => void {\n if (this.hooksDrained) {\n void (async () => {\n try {\n await fn();\n } catch (err) {\n this.errorSink(err, 'RunController.onAbort(post-drain)');\n }\n })();\n return () => {};\n }\n this.hooks.push(fn);\n return () => {\n const idx = this.hooks.indexOf(fn);\n if (idx !== -1) this.hooks.splice(idx, 1);\n };\n }\n\n /**\n * Fire cleanup hooks and tear down listeners \u2014 called when the run\n * ends *normally* so cleanup happens regardless of outcome. Subsequent\n * aborts become no-ops.\n */\n async dispose(): Promise<void> {\n if (this.disposed) return;\n this.disposed = true;\n await this.ensureHooksRun();\n }\n\n /**\n * Start running hooks (or wait for an already-in-flight run) and return\n * a promise that settles when all hooks complete. Both the abort signal\n * handler and `dispose()` call this so they share the same underlying\n * promise \u2014 abort-triggered async cleanup (session flush, socket close)\n * is guaranteed to finish before `dispose()` resolves.\n */\n private ensureHooksRun(): Promise<void> {\n if (!this._hooksPromise) {\n this._hooksPromise = this.runHooks();\n }\n return this._hooksPromise;\n }\n\n private async runHooks(): Promise<void> {\n if (this.hooksDrained) return;\n this.hooksDrained = true;\n // Snapshot + clear so hooks added during cleanup don't re-fire.\n // The contract says hooks are independent and one bad hook must not\n // block the others, so we fire them in parallel rather than awaiting\n // serially. The snapshot's iteration order still determines the START\n // order (LIFO), so synchronous hooks that push to a shared array keep\n // the LIFO observation. Async hooks may complete out of order \u2014 the\n // previous serial behavior is preserved only for synchronous hooks,\n // and no test asserts async completion ordering.\n const snapshot = this.hooks.splice(0, this.hooks.length).reverse();\n if (snapshot.length === 0) return;\n await Promise.allSettled(\n snapshot.map((hook) =>\n Promise.resolve()\n .then(() => hook())\n .catch((err: unknown) => {\n this.errorSink(err, 'RunController.dispose');\n }),\n ),\n );\n }\n}\n"],
5
+ "mappings": "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",
6
6
  "names": ["t"]
7
7
  }
@@ -1,4 +1,5 @@
1
1
  import type { BrainArbiter } from '../coordination/brain.js';
2
+ import type { FallbackProfileManager } from '../core/fallback-profile-manager.js';
2
3
  import type { HookRegistry } from '../hooks/registry.js';
3
4
  import type { Compactor } from '../types/compactor.js';
4
5
  import type { ConfigLoader, ConfigStore } from '../types/config.js';
@@ -31,6 +32,7 @@ export declare const TOKENS: {
31
32
  readonly PathResolver: Token<PathResolver>;
32
33
  readonly ConfigLoader: Token<ConfigLoader>;
33
34
  readonly ConfigStore: Token<ConfigStore>;
35
+ readonly FallbackProfileManager: Token<FallbackProfileManager>;
34
36
  readonly Renderer: Token<Renderer>;
35
37
  readonly InputReader: Token<InputReader>;
36
38
  readonly ErrorHandler: Token<ErrorHandler>;
@@ -43,7 +45,7 @@ export declare const TOKENS: {
43
45
  readonly ModeStore: Token<ModeStore>;
44
46
  /** Replaces the entire provider call layer — retry, streaming, tracing. */
45
47
  readonly ProviderRunner: Token<ProviderRunner>;
46
- /** Optional git-worktree lifecycle manager (per-phase isolation in AutoPhase). */
48
+ /** Optional git-worktree lifecycle manager (per-phase isolation in Goal). */
47
49
  readonly WorktreeManager: Token<WorktreeManager>;
48
50
  /** Optional global Brain arbiter for policy/decision escalation. */
49
51
  readonly BrainArbiter: Token<BrainArbiter>;
@@ -1 +1 @@
1
- {"version":3,"file":"tokens.d.ts","sourceRoot":"","sources":["../../src/kernel/tokens.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,0BAA0B,CAAC;AAC7D,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,sBAAsB,CAAC;AACzD,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,uBAAuB,CAAC;AACvD,OAAO,KAAK,EAAE,YAAY,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AACpE,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,2BAA2B,CAAC;AAC9D,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,0BAA0B,CAAC;AAC5D,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,oBAAoB,CAAC;AACjD,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AACtD,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAC;AAClD,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,6BAA6B,CAAC;AAClE,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,2BAA2B,CAAC;AAC9D,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,wBAAwB,CAAC;AAC/D,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,6BAA6B,CAAC;AAClE,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,sBAAsB,CAAC;AACrD,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,0BAA0B,CAAC;AAC5D,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,6BAA6B,CAAC;AAClE,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAC;AACxD,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AACvD,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AACrD,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,2BAA2B,CAAC;AACrE,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,2BAA2B,CAAC;AAC9D,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,iCAAiC,CAAC;AACvE,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,gBAAgB,CAAC;AAe5C,eAAO,MAAM,MAAM;aACjB,MAAM;aACN,YAAY;aACZ,YAAY;aACZ,WAAW;aACX,gBAAgB;aAChB,SAAS;aACT,YAAY;aACZ,YAAY;aACZ,WAAW;aACX,QAAQ;aACR,WAAW;aACX,YAAY;aACZ,WAAW;aACX,WAAW;aACX,YAAY;aACZ,mBAAmB;aACnB,cAAc;aACd,cAAc;aACd,SAAS;IACT,2EAA2E;aAC3E,cAAc;IACd,kFAAkF;aAClF,eAAe;IACf,oEAAoE;aACpE,YAAY;IACZ,0DAA0D;aAC1D,YAAY;CACJ,CAAC"}
1
+ {"version":3,"file":"tokens.d.ts","sourceRoot":"","sources":["../../src/kernel/tokens.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,0BAA0B,CAAC;AAC7D,OAAO,KAAK,EAAE,sBAAsB,EAAE,MAAM,qCAAqC,CAAC;AAClF,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,sBAAsB,CAAC;AACzD,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,uBAAuB,CAAC;AACvD,OAAO,KAAK,EAAE,YAAY,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AACpE,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,2BAA2B,CAAC;AAC9D,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,0BAA0B,CAAC;AAC5D,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,oBAAoB,CAAC;AACjD,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AACtD,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAC;AAClD,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,6BAA6B,CAAC;AAClE,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,2BAA2B,CAAC;AAC9D,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,wBAAwB,CAAC;AAC/D,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,6BAA6B,CAAC;AAClE,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,sBAAsB,CAAC;AACrD,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,0BAA0B,CAAC;AAC5D,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,6BAA6B,CAAC;AAClE,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAC;AACxD,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AACvD,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AACrD,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,2BAA2B,CAAC;AACrE,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,2BAA2B,CAAC;AAC9D,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,iCAAiC,CAAC;AACvE,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,gBAAgB,CAAC;AAe5C,eAAO,MAAM,MAAM;aACjB,MAAM;aACN,YAAY;aACZ,YAAY;aACZ,WAAW;aACX,gBAAgB;aAChB,SAAS;aACT,YAAY;aACZ,YAAY;aACZ,WAAW;aACX,sBAAsB;aACtB,QAAQ;aACR,WAAW;aACX,YAAY;aACZ,WAAW;aACX,WAAW;aACX,YAAY;aACZ,mBAAmB;aACnB,cAAc;aACd,cAAc;aACd,SAAS;IACT,2EAA2E;aAC3E,cAAc;IACd,6EAA6E;aAC7E,eAAe;IACf,oEAAoE;aACpE,YAAY;IACZ,0DAA0D;aAC1D,YAAY;CACJ,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"mailbox-attach.d.ts","sourceRoot":"","sources":["../src/mailbox-attach.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAYH,OAAO,KAAK,EAAW,cAAc,EAAE,MAAM,iCAAiC,CAAC;AAC/E,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AACrD,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,2BAA2B,CAAC;AAKhE,wBAAgB,oBAAoB,CAClC,CAAC,EAAE,cAAc,EACjB,MAAM,CAAC,EAAE,KAAK,GAAG,OAAO,GACvB,MAAM,OAAO,CAAC,cAAc,EAAE,CAAC,CAYjC;AAkMD;;;;;;GAMG;AACH,wBAAgB,gBAAgB,CAC9B,CAAC,EAAE,cAAc,EACjB,GAAG,CAAC,EAAE,WAAW,CAAC,OAAO,CAAC,GACzB,MAAM,OAAO,CAAC;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAA;CAAE,GAAG,IAAI,CAAC,CAqCtD"}
1
+ {"version":3,"file":"mailbox-attach.d.ts","sourceRoot":"","sources":["../src/mailbox-attach.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAYH,OAAO,KAAK,EAAW,cAAc,EAAE,MAAM,iCAAiC,CAAC;AAE/E,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AACrD,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,2BAA2B,CAAC;AAKhE,wBAAgB,oBAAoB,CAClC,CAAC,EAAE,cAAc,EACjB,MAAM,CAAC,EAAE,KAAK,GAAG,OAAO,GACvB,MAAM,OAAO,CAAC,cAAc,EAAE,CAAC,CAYjC;AAuMD;;;;;;GAMG;AACH,wBAAgB,gBAAgB,CAC9B,CAAC,EAAE,cAAc,EACjB,GAAG,CAAC,EAAE,WAAW,CAAC,OAAO,CAAC,GACzB,MAAM,OAAO,CAAC;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAA;CAAE,GAAG,IAAI,CAAC,CAqCtD"}