open-multi-agent-kit 0.98.3 → 0.98.5

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 (468) hide show
  1. package/CHANGELOG.md +44 -0
  2. package/README.md +12 -2
  3. package/dist/cli/args.d.ts +1 -0
  4. package/dist/cli/args.d.ts.map +1 -1
  5. package/dist/cli/args.js +14 -0
  6. package/dist/cli/args.js.map +1 -1
  7. package/dist/cli/help.d.ts.map +1 -1
  8. package/dist/cli/help.js +3 -0
  9. package/dist/cli/help.js.map +1 -1
  10. package/dist/cli/mcp-attach.d.ts +3 -3
  11. package/dist/cli/mcp-attach.d.ts.map +1 -1
  12. package/dist/cli/mcp-attach.js +5 -4
  13. package/dist/cli/mcp-attach.js.map +1 -1
  14. package/dist/cli/model-contract.d.ts +5 -0
  15. package/dist/cli/model-contract.d.ts.map +1 -0
  16. package/dist/cli/model-contract.js +45 -0
  17. package/dist/cli/model-contract.js.map +1 -0
  18. package/dist/commands/adaptorch-doctor-cli.d.ts.map +1 -1
  19. package/dist/commands/adaptorch-doctor-cli.js +32 -10
  20. package/dist/commands/adaptorch-doctor-cli.js.map +1 -1
  21. package/dist/commands/init-cli.d.ts +12 -0
  22. package/dist/commands/init-cli.d.ts.map +1 -0
  23. package/dist/commands/init-cli.js +76 -0
  24. package/dist/commands/init-cli.js.map +1 -0
  25. package/dist/commands/provider-sync-cli.d.ts +27 -0
  26. package/dist/commands/provider-sync-cli.d.ts.map +1 -0
  27. package/dist/commands/provider-sync-cli.js +177 -0
  28. package/dist/commands/provider-sync-cli.js.map +1 -0
  29. package/dist/commands/run-command.d.ts +9 -0
  30. package/dist/commands/run-command.d.ts.map +1 -0
  31. package/dist/commands/run-command.js +34 -0
  32. package/dist/commands/run-command.js.map +1 -0
  33. package/dist/commands/verified-run-cli.d.ts +6 -0
  34. package/dist/commands/verified-run-cli.d.ts.map +1 -0
  35. package/dist/commands/verified-run-cli.js +190 -0
  36. package/dist/commands/verified-run-cli.js.map +1 -0
  37. package/dist/core/active-skill-state.d.ts +7 -0
  38. package/dist/core/active-skill-state.d.ts.map +1 -0
  39. package/dist/core/active-skill-state.js +25 -0
  40. package/dist/core/active-skill-state.js.map +1 -0
  41. package/dist/core/agent-session-services.d.ts +10 -1
  42. package/dist/core/agent-session-services.d.ts.map +1 -1
  43. package/dist/core/agent-session-services.js +43 -0
  44. package/dist/core/agent-session-services.js.map +1 -1
  45. package/dist/core/agent-session.d.ts +7 -9
  46. package/dist/core/agent-session.d.ts.map +1 -1
  47. package/dist/core/agent-session.js +91 -126
  48. package/dist/core/agent-session.js.map +1 -1
  49. package/dist/core/codex-chatgpt-web-bridge.d.ts +99 -0
  50. package/dist/core/codex-chatgpt-web-bridge.d.ts.map +1 -0
  51. package/dist/core/codex-chatgpt-web-bridge.js +192 -0
  52. package/dist/core/codex-chatgpt-web-bridge.js.map +1 -0
  53. package/dist/core/codex-chatgpt-web-sync.d.ts +50 -0
  54. package/dist/core/codex-chatgpt-web-sync.d.ts.map +1 -0
  55. package/dist/core/codex-chatgpt-web-sync.js +119 -0
  56. package/dist/core/codex-chatgpt-web-sync.js.map +1 -0
  57. package/dist/core/compaction/compaction-headroom.d.ts +30 -0
  58. package/dist/core/compaction/compaction-headroom.d.ts.map +1 -0
  59. package/dist/core/compaction/compaction-headroom.js +48 -0
  60. package/dist/core/compaction/compaction-headroom.js.map +1 -0
  61. package/dist/core/compaction/compaction.d.ts +2 -29
  62. package/dist/core/compaction/compaction.d.ts.map +1 -1
  63. package/dist/core/compaction/compaction.js +19 -47
  64. package/dist/core/compaction/compaction.js.map +1 -1
  65. package/dist/core/compaction/overflow-retry-guard.d.ts +20 -0
  66. package/dist/core/compaction/overflow-retry-guard.d.ts.map +1 -0
  67. package/dist/core/compaction/overflow-retry-guard.js +38 -0
  68. package/dist/core/compaction/overflow-retry-guard.js.map +1 -0
  69. package/dist/core/context-budget-headroom-types.d.ts.map +1 -1
  70. package/dist/core/context-budget-headroom-types.js +1 -1
  71. package/dist/core/context-budget-headroom-types.js.map +1 -1
  72. package/dist/core/context-budget-token-counter-types.d.ts +27 -0
  73. package/dist/core/context-budget-token-counter-types.d.ts.map +1 -0
  74. package/dist/core/context-budget-token-counter-types.js +2 -0
  75. package/dist/core/context-budget-token-counter-types.js.map +1 -0
  76. package/dist/core/context-budget-token-counter.d.ts +2 -26
  77. package/dist/core/context-budget-token-counter.d.ts.map +1 -1
  78. package/dist/core/context-budget-token-counter.js +2 -0
  79. package/dist/core/context-budget-token-counter.js.map +1 -1
  80. package/dist/core/context-budget-v2-scoring.d.ts.map +1 -1
  81. package/dist/core/context-budget-v2-scoring.js +14 -10
  82. package/dist/core/context-budget-v2-scoring.js.map +1 -1
  83. package/dist/core/domain-router.d.ts.map +1 -1
  84. package/dist/core/domain-router.js +1 -1
  85. package/dist/core/domain-router.js.map +1 -1
  86. package/dist/core/grok-harness-dispatch.d.ts +4 -0
  87. package/dist/core/grok-harness-dispatch.d.ts.map +1 -1
  88. package/dist/core/grok-harness-dispatch.js +20 -3
  89. package/dist/core/grok-harness-dispatch.js.map +1 -1
  90. package/dist/core/grok-harness.d.ts +15 -9
  91. package/dist/core/grok-harness.d.ts.map +1 -1
  92. package/dist/core/grok-harness.js +34 -8
  93. package/dist/core/grok-harness.js.map +1 -1
  94. package/dist/core/mcp/tools.d.ts +2 -2
  95. package/dist/core/mcp/tools.d.ts.map +1 -1
  96. package/dist/core/mcp/tools.js +29 -3
  97. package/dist/core/mcp/tools.js.map +1 -1
  98. package/dist/core/model-registry-schema.d.ts +1081 -0
  99. package/dist/core/model-registry-schema.d.ts.map +1 -0
  100. package/dist/core/model-registry-schema.js +148 -0
  101. package/dist/core/model-registry-schema.js.map +1 -0
  102. package/dist/core/model-registry.d.ts.map +1 -1
  103. package/dist/core/model-registry.js +1 -146
  104. package/dist/core/model-registry.js.map +1 -1
  105. package/dist/core/model-resolver.d.ts +2 -1
  106. package/dist/core/model-resolver.d.ts.map +1 -1
  107. package/dist/core/model-resolver.js +2 -1
  108. package/dist/core/model-resolver.js.map +1 -1
  109. package/dist/core/prompt-preset.d.ts +1 -1
  110. package/dist/core/prompt-preset.d.ts.map +1 -1
  111. package/dist/core/prompt-preset.js +16 -1
  112. package/dist/core/prompt-preset.js.map +1 -1
  113. package/dist/core/prompt-settlement.d.ts +4 -3
  114. package/dist/core/prompt-settlement.d.ts.map +1 -1
  115. package/dist/core/prompt-settlement.js.map +1 -1
  116. package/dist/core/provider-display-names.d.ts.map +1 -1
  117. package/dist/core/provider-display-names.js +1 -0
  118. package/dist/core/provider-display-names.js.map +1 -1
  119. package/dist/core/provider-resilience.d.ts +8 -0
  120. package/dist/core/provider-resilience.d.ts.map +1 -1
  121. package/dist/core/provider-resilience.js +20 -3
  122. package/dist/core/provider-resilience.js.map +1 -1
  123. package/dist/core/provider-usage-types.d.ts +42 -0
  124. package/dist/core/provider-usage-types.d.ts.map +1 -0
  125. package/dist/core/provider-usage-types.js +2 -0
  126. package/dist/core/provider-usage-types.js.map +1 -0
  127. package/dist/core/provider-usage.d.ts +2 -31
  128. package/dist/core/provider-usage.d.ts.map +1 -1
  129. package/dist/core/provider-usage.js +4 -0
  130. package/dist/core/provider-usage.js.map +1 -1
  131. package/dist/core/redaction.d.ts.map +1 -1
  132. package/dist/core/redaction.js +18 -2
  133. package/dist/core/redaction.js.map +1 -1
  134. package/dist/core/run-budget-policy.d.ts +18 -0
  135. package/dist/core/run-budget-policy.d.ts.map +1 -0
  136. package/dist/core/run-budget-policy.js +52 -0
  137. package/dist/core/run-budget-policy.js.map +1 -0
  138. package/dist/core/run-budget.d.ts +33 -0
  139. package/dist/core/run-budget.d.ts.map +1 -0
  140. package/dist/core/run-budget.js +89 -0
  141. package/dist/core/run-budget.js.map +1 -0
  142. package/dist/core/run-execution-api.d.ts +15 -0
  143. package/dist/core/run-execution-api.d.ts.map +1 -0
  144. package/dist/core/run-execution-api.js +7 -0
  145. package/dist/core/run-execution-api.js.map +1 -0
  146. package/dist/core/run-journal.d.ts.map +1 -1
  147. package/dist/core/run-journal.js +30 -208
  148. package/dist/core/run-journal.js.map +1 -1
  149. package/dist/core/sandbox/policy-merge.d.ts +6 -0
  150. package/dist/core/sandbox/policy-merge.d.ts.map +1 -0
  151. package/dist/core/sandbox/policy-merge.js +74 -0
  152. package/dist/core/sandbox/policy-merge.js.map +1 -0
  153. package/dist/core/sandbox/policy-paths.d.ts +4 -0
  154. package/dist/core/sandbox/policy-paths.d.ts.map +1 -0
  155. package/dist/core/sandbox/policy-paths.js +21 -0
  156. package/dist/core/sandbox/policy-paths.js.map +1 -0
  157. package/dist/core/sandbox/policy-types.d.ts +75 -0
  158. package/dist/core/sandbox/policy-types.d.ts.map +1 -0
  159. package/dist/core/sandbox/policy-types.js +2 -0
  160. package/dist/core/sandbox/policy-types.js.map +1 -0
  161. package/dist/core/sandbox/policy.d.ts +3 -77
  162. package/dist/core/sandbox/policy.d.ts.map +1 -1
  163. package/dist/core/sandbox/policy.js +3 -98
  164. package/dist/core/sandbox/policy.js.map +1 -1
  165. package/dist/core/sdk-provider-stream.d.ts +14 -0
  166. package/dist/core/sdk-provider-stream.d.ts.map +1 -0
  167. package/dist/core/sdk-provider-stream.js +38 -0
  168. package/dist/core/sdk-provider-stream.js.map +1 -0
  169. package/dist/core/sdk.d.ts +5 -1
  170. package/dist/core/sdk.d.ts.map +1 -1
  171. package/dist/core/sdk.js +17 -33
  172. package/dist/core/sdk.js.map +1 -1
  173. package/dist/core/session-bash-service.d.ts +2 -2
  174. package/dist/core/session-bash-service.d.ts.map +1 -1
  175. package/dist/core/session-bash-service.js +21 -9
  176. package/dist/core/session-bash-service.js.map +1 -1
  177. package/dist/core/session-failure-cause.d.ts.map +1 -1
  178. package/dist/core/session-failure-cause.js +15 -3
  179. package/dist/core/session-failure-cause.js.map +1 -1
  180. package/dist/core/session-prompt-lifecycle.d.ts +25 -0
  181. package/dist/core/session-prompt-lifecycle.d.ts.map +1 -0
  182. package/dist/core/session-prompt-lifecycle.js +87 -0
  183. package/dist/core/session-prompt-lifecycle.js.map +1 -0
  184. package/dist/core/session-run-budget.d.ts +28 -0
  185. package/dist/core/session-run-budget.d.ts.map +1 -0
  186. package/dist/core/session-run-budget.js +127 -0
  187. package/dist/core/session-run-budget.js.map +1 -0
  188. package/dist/core/session-run-termination.d.ts +18 -0
  189. package/dist/core/session-run-termination.d.ts.map +1 -0
  190. package/dist/core/session-run-termination.js +72 -0
  191. package/dist/core/session-run-termination.js.map +1 -0
  192. package/dist/core/session-termination-types.d.ts +97 -0
  193. package/dist/core/session-termination-types.d.ts.map +1 -0
  194. package/dist/core/session-termination-types.js +26 -0
  195. package/dist/core/session-termination-types.js.map +1 -0
  196. package/dist/core/session-termination.d.ts +3 -97
  197. package/dist/core/session-termination.d.ts.map +1 -1
  198. package/dist/core/session-termination.js +25 -29
  199. package/dist/core/session-termination.js.map +1 -1
  200. package/dist/core/skill-selector.d.ts +40 -0
  201. package/dist/core/skill-selector.d.ts.map +1 -0
  202. package/dist/core/skill-selector.js +102 -0
  203. package/dist/core/skill-selector.js.map +1 -0
  204. package/dist/core/slash-commands.d.ts.map +1 -1
  205. package/dist/core/slash-commands.js +1 -0
  206. package/dist/core/slash-commands.js.map +1 -1
  207. package/dist/core/subagent-lane-launcher.d.ts +3 -2
  208. package/dist/core/subagent-lane-launcher.d.ts.map +1 -1
  209. package/dist/core/subagent-lane-launcher.js +24 -13
  210. package/dist/core/subagent-lane-launcher.js.map +1 -1
  211. package/dist/core/tools/render-utils.d.ts.map +1 -1
  212. package/dist/core/tools/render-utils.js +2 -4
  213. package/dist/core/tools/render-utils.js.map +1 -1
  214. package/dist/core/turn-metrics-record.d.ts +55 -0
  215. package/dist/core/turn-metrics-record.d.ts.map +1 -0
  216. package/dist/core/turn-metrics-record.js +149 -0
  217. package/dist/core/turn-metrics-record.js.map +1 -0
  218. package/dist/core/turn-metrics.d.ts +4 -56
  219. package/dist/core/turn-metrics.d.ts.map +1 -1
  220. package/dist/core/turn-metrics.js +12 -60
  221. package/dist/core/turn-metrics.js.map +1 -1
  222. package/dist/core/verified-run/broker.d.ts +26 -0
  223. package/dist/core/verified-run/broker.d.ts.map +1 -0
  224. package/dist/core/verified-run/broker.js +210 -0
  225. package/dist/core/verified-run/broker.js.map +1 -0
  226. package/dist/core/verified-run/candidate.d.ts +24 -0
  227. package/dist/core/verified-run/candidate.d.ts.map +1 -0
  228. package/dist/core/verified-run/candidate.js +167 -0
  229. package/dist/core/verified-run/candidate.js.map +1 -0
  230. package/dist/core/verified-run/check-receipt.d.ts +18 -0
  231. package/dist/core/verified-run/check-receipt.d.ts.map +1 -0
  232. package/dist/core/verified-run/check-receipt.js +92 -0
  233. package/dist/core/verified-run/check-receipt.js.map +1 -0
  234. package/dist/core/verified-run/coordinator.d.ts +39 -0
  235. package/dist/core/verified-run/coordinator.d.ts.map +1 -0
  236. package/dist/core/verified-run/coordinator.js +190 -0
  237. package/dist/core/verified-run/coordinator.js.map +1 -0
  238. package/dist/core/verified-run/dag-candidates.d.ts +8 -0
  239. package/dist/core/verified-run/dag-candidates.d.ts.map +1 -0
  240. package/dist/core/verified-run/dag-candidates.js +65 -0
  241. package/dist/core/verified-run/dag-candidates.js.map +1 -0
  242. package/dist/core/verified-run/dag-phase.d.ts +7 -0
  243. package/dist/core/verified-run/dag-phase.d.ts.map +1 -0
  244. package/dist/core/verified-run/dag-phase.js +92 -0
  245. package/dist/core/verified-run/dag-phase.js.map +1 -0
  246. package/dist/core/verified-run/dag-projection.d.ts +7 -0
  247. package/dist/core/verified-run/dag-projection.d.ts.map +1 -0
  248. package/dist/core/verified-run/dag-projection.js +90 -0
  249. package/dist/core/verified-run/dag-projection.js.map +1 -0
  250. package/dist/core/verified-run/dag-recovery.d.ts +13 -0
  251. package/dist/core/verified-run/dag-recovery.d.ts.map +1 -0
  252. package/dist/core/verified-run/dag-recovery.js +98 -0
  253. package/dist/core/verified-run/dag-recovery.js.map +1 -0
  254. package/dist/core/verified-run/dag-retry-projection.d.ts +9 -0
  255. package/dist/core/verified-run/dag-retry-projection.d.ts.map +1 -0
  256. package/dist/core/verified-run/dag-retry-projection.js +43 -0
  257. package/dist/core/verified-run/dag-retry-projection.js.map +1 -0
  258. package/dist/core/verified-run/dag-types.d.ts +47 -0
  259. package/dist/core/verified-run/dag-types.d.ts.map +1 -0
  260. package/dist/core/verified-run/dag-types.js +2 -0
  261. package/dist/core/verified-run/dag-types.js.map +1 -0
  262. package/dist/core/verified-run/event-parser.d.ts +3 -0
  263. package/dist/core/verified-run/event-parser.d.ts.map +1 -0
  264. package/dist/core/verified-run/event-parser.js +153 -0
  265. package/dist/core/verified-run/event-parser.js.map +1 -0
  266. package/dist/core/verified-run/events.d.ts +4 -0
  267. package/dist/core/verified-run/events.d.ts.map +1 -0
  268. package/dist/core/verified-run/events.js +3 -0
  269. package/dist/core/verified-run/events.js.map +1 -0
  270. package/dist/core/verified-run/evidence-binding.d.ts +18 -0
  271. package/dist/core/verified-run/evidence-binding.d.ts.map +1 -0
  272. package/dist/core/verified-run/evidence-binding.js +81 -0
  273. package/dist/core/verified-run/evidence-binding.js.map +1 -0
  274. package/dist/core/verified-run/evidence.d.ts +27 -0
  275. package/dist/core/verified-run/evidence.d.ts.map +1 -0
  276. package/dist/core/verified-run/evidence.js +100 -0
  277. package/dist/core/verified-run/evidence.js.map +1 -0
  278. package/dist/core/verified-run/journal.d.ts +32 -0
  279. package/dist/core/verified-run/journal.d.ts.map +1 -0
  280. package/dist/core/verified-run/journal.js +103 -0
  281. package/dist/core/verified-run/journal.js.map +1 -0
  282. package/dist/core/verified-run/namespace-identity.d.ts +11 -0
  283. package/dist/core/verified-run/namespace-identity.d.ts.map +1 -0
  284. package/dist/core/verified-run/namespace-identity.js +77 -0
  285. package/dist/core/verified-run/namespace-identity.js.map +1 -0
  286. package/dist/core/verified-run/owned-execution.d.ts +21 -0
  287. package/dist/core/verified-run/owned-execution.d.ts.map +1 -0
  288. package/dist/core/verified-run/owned-execution.js +43 -0
  289. package/dist/core/verified-run/owned-execution.js.map +1 -0
  290. package/dist/core/verified-run/phase-context.d.ts +9 -0
  291. package/dist/core/verified-run/phase-context.d.ts.map +1 -0
  292. package/dist/core/verified-run/phase-context.js +2 -0
  293. package/dist/core/verified-run/phase-context.js.map +1 -0
  294. package/dist/core/verified-run/process-gate.d.ts +5 -0
  295. package/dist/core/verified-run/process-gate.d.ts.map +1 -0
  296. package/dist/core/verified-run/process-gate.js +31 -0
  297. package/dist/core/verified-run/process-gate.js.map +1 -0
  298. package/dist/core/verified-run/projection.d.ts +4 -0
  299. package/dist/core/verified-run/projection.d.ts.map +1 -0
  300. package/dist/core/verified-run/projection.js +219 -0
  301. package/dist/core/verified-run/projection.js.map +1 -0
  302. package/dist/core/verified-run/recovery-clock.d.ts +19 -0
  303. package/dist/core/verified-run/recovery-clock.d.ts.map +1 -0
  304. package/dist/core/verified-run/recovery-clock.js +69 -0
  305. package/dist/core/verified-run/recovery-clock.js.map +1 -0
  306. package/dist/core/verified-run/recovery-command.d.ts +11 -0
  307. package/dist/core/verified-run/recovery-command.d.ts.map +1 -0
  308. package/dist/core/verified-run/recovery-command.js +73 -0
  309. package/dist/core/verified-run/recovery-command.js.map +1 -0
  310. package/dist/core/verified-run/recovery-projection.d.ts +12 -0
  311. package/dist/core/verified-run/recovery-projection.d.ts.map +1 -0
  312. package/dist/core/verified-run/recovery-projection.js +88 -0
  313. package/dist/core/verified-run/recovery-projection.js.map +1 -0
  314. package/dist/core/verified-run/recovery.d.ts +12 -0
  315. package/dist/core/verified-run/recovery.d.ts.map +1 -0
  316. package/dist/core/verified-run/recovery.js +115 -0
  317. package/dist/core/verified-run/recovery.js.map +1 -0
  318. package/dist/core/verified-run/run-types.d.ts +103 -0
  319. package/dist/core/verified-run/run-types.d.ts.map +1 -0
  320. package/dist/core/verified-run/run-types.js +2 -0
  321. package/dist/core/verified-run/run-types.js.map +1 -0
  322. package/dist/core/verified-run/scripted-writer.d.ts +15 -0
  323. package/dist/core/verified-run/scripted-writer.d.ts.map +1 -0
  324. package/dist/core/verified-run/scripted-writer.js +94 -0
  325. package/dist/core/verified-run/scripted-writer.js.map +1 -0
  326. package/dist/core/verified-run/session-port.d.ts +27 -0
  327. package/dist/core/verified-run/session-port.d.ts.map +1 -0
  328. package/dist/core/verified-run/session-port.js +2 -0
  329. package/dist/core/verified-run/session-port.js.map +1 -0
  330. package/dist/core/verified-run/storage.d.ts +15 -0
  331. package/dist/core/verified-run/storage.d.ts.map +1 -0
  332. package/dist/core/verified-run/storage.js +96 -0
  333. package/dist/core/verified-run/storage.js.map +1 -0
  334. package/dist/core/verified-run/verification-phase.d.ts +5 -0
  335. package/dist/core/verified-run/verification-phase.d.ts.map +1 -0
  336. package/dist/core/verified-run/verification-phase.js +56 -0
  337. package/dist/core/verified-run/verification-phase.js.map +1 -0
  338. package/dist/core/verified-run/work-recovery.d.ts +8 -0
  339. package/dist/core/verified-run/work-recovery.d.ts.map +1 -0
  340. package/dist/core/verified-run/work-recovery.js +44 -0
  341. package/dist/core/verified-run/work-recovery.js.map +1 -0
  342. package/dist/core/verified-run/writer-completion.d.ts +4 -0
  343. package/dist/core/verified-run/writer-completion.d.ts.map +1 -0
  344. package/dist/core/verified-run/writer-completion.js +27 -0
  345. package/dist/core/verified-run/writer-completion.js.map +1 -0
  346. package/dist/core/verified-run/writer-phase.d.ts +8 -0
  347. package/dist/core/verified-run/writer-phase.d.ts.map +1 -0
  348. package/dist/core/verified-run/writer-phase.js +76 -0
  349. package/dist/core/verified-run/writer-phase.js.map +1 -0
  350. package/dist/core/verified-run/writer-projection.d.ts +11 -0
  351. package/dist/core/verified-run/writer-projection.d.ts.map +1 -0
  352. package/dist/core/verified-run/writer-projection.js +70 -0
  353. package/dist/core/verified-run/writer-projection.js.map +1 -0
  354. package/dist/core/verified-run/writer-recovery.d.ts +16 -0
  355. package/dist/core/verified-run/writer-recovery.d.ts.map +1 -0
  356. package/dist/core/verified-run/writer-recovery.js +107 -0
  357. package/dist/core/verified-run/writer-recovery.js.map +1 -0
  358. package/dist/core/workload-permit-pool.d.ts +1 -3
  359. package/dist/core/workload-permit-pool.d.ts.map +1 -1
  360. package/dist/core/workload-permit-pool.js +11 -11
  361. package/dist/core/workload-permit-pool.js.map +1 -1
  362. package/dist/guardrails/evidence-system.d.ts +1 -1
  363. package/dist/guardrails/evidence-system.d.ts.map +1 -1
  364. package/dist/guardrails/evidence-system.js +18 -29
  365. package/dist/guardrails/evidence-system.js.map +1 -1
  366. package/dist/guardrails/merge-gate-result.d.ts +4 -0
  367. package/dist/guardrails/merge-gate-result.d.ts.map +1 -0
  368. package/dist/guardrails/merge-gate-result.js +32 -0
  369. package/dist/guardrails/merge-gate-result.js.map +1 -0
  370. package/dist/index.d.ts +3 -2
  371. package/dist/index.d.ts.map +1 -1
  372. package/dist/index.js +2 -2
  373. package/dist/index.js.map +1 -1
  374. package/dist/main.d.ts.map +1 -1
  375. package/dist/main.js +17 -23
  376. package/dist/main.js.map +1 -1
  377. package/dist/modes/interactive/components/session-failure.d.ts +13 -0
  378. package/dist/modes/interactive/components/session-failure.d.ts.map +1 -0
  379. package/dist/modes/interactive/components/session-failure.js +81 -0
  380. package/dist/modes/interactive/components/session-failure.js.map +1 -0
  381. package/dist/modes/interactive/interactive-login-options.d.ts +27 -0
  382. package/dist/modes/interactive/interactive-login-options.d.ts.map +1 -0
  383. package/dist/modes/interactive/interactive-login-options.js +54 -0
  384. package/dist/modes/interactive/interactive-login-options.js.map +1 -0
  385. package/dist/modes/interactive/interactive-mode.d.ts +8 -4
  386. package/dist/modes/interactive/interactive-mode.d.ts.map +1 -1
  387. package/dist/modes/interactive/interactive-mode.js +183 -171
  388. package/dist/modes/interactive/interactive-mode.js.map +1 -1
  389. package/dist/modes/interactive/interactive-resume-command.d.ts +3 -0
  390. package/dist/modes/interactive/interactive-resume-command.d.ts.map +1 -0
  391. package/dist/modes/interactive/interactive-resume-command.js +24 -0
  392. package/dist/modes/interactive/interactive-resume-command.js.map +1 -0
  393. package/dist/modes/interactive/interactive-tool-result.d.ts +32 -0
  394. package/dist/modes/interactive/interactive-tool-result.d.ts.map +1 -0
  395. package/dist/modes/interactive/interactive-tool-result.js +59 -0
  396. package/dist/modes/interactive/interactive-tool-result.js.map +1 -0
  397. package/dist/modes/interactive/tui-diagnostics.d.ts +36 -0
  398. package/dist/modes/interactive/tui-diagnostics.d.ts.map +1 -0
  399. package/dist/modes/interactive/tui-diagnostics.js +105 -0
  400. package/dist/modes/interactive/tui-diagnostics.js.map +1 -0
  401. package/dist/modes/interactive/tui-runtime-info.d.ts +20 -0
  402. package/dist/modes/interactive/tui-runtime-info.d.ts.map +1 -0
  403. package/dist/modes/interactive/tui-runtime-info.js +76 -0
  404. package/dist/modes/interactive/tui-runtime-info.js.map +1 -0
  405. package/dist/modes/print-mode.d.ts.map +1 -1
  406. package/dist/modes/print-mode.js +22 -0
  407. package/dist/modes/print-mode.js.map +1 -1
  408. package/dist/utils/clipboard-image.d.ts.map +1 -1
  409. package/dist/utils/clipboard-image.js +10 -60
  410. package/dist/utils/clipboard-image.js.map +1 -1
  411. package/dist/utils/terminal-links.d.ts +13 -0
  412. package/dist/utils/terminal-links.d.ts.map +1 -0
  413. package/dist/utils/terminal-links.js +68 -0
  414. package/dist/utils/terminal-links.js.map +1 -0
  415. package/dist/utils/windows-clipboard-image.d.ts +16 -0
  416. package/dist/utils/windows-clipboard-image.d.ts.map +1 -0
  417. package/dist/utils/windows-clipboard-image.js +87 -0
  418. package/dist/utils/windows-clipboard-image.js.map +1 -0
  419. package/docs/adaptorch-onboarding.md +80 -0
  420. package/docs/containerization.md +12 -0
  421. package/docs/context-files.md +97 -0
  422. package/docs/correctness-wall.md +8 -0
  423. package/docs/custom-provider.md +35 -0
  424. package/docs/development.md +28 -3
  425. package/docs/environment-variables.md +2 -0
  426. package/docs/grok-harness.md +4 -0
  427. package/docs/harness-boundaries.md +154 -0
  428. package/docs/harness-improvements.md +90 -0
  429. package/docs/json.md +19 -0
  430. package/docs/keybindings.md +2 -2
  431. package/docs/mcp.md +22 -2
  432. package/docs/metrics.md +66 -16
  433. package/docs/model-catalog-refresh.md +190 -0
  434. package/docs/model-contract.md +168 -0
  435. package/docs/models.md +21 -4
  436. package/docs/provider-resilience.md +5 -3
  437. package/docs/providers.md +68 -1
  438. package/docs/quickstart.md +4 -0
  439. package/docs/release-audit-0.98.4.md +112 -0
  440. package/docs/release-audit-0.98.5.md +84 -0
  441. package/docs/review-bundle-followup.md +195 -0
  442. package/docs/run-protocol.md +33 -1
  443. package/docs/runtime-algorithms.md +45 -0
  444. package/docs/sdk.md +204 -2
  445. package/docs/sessions.md +1 -1
  446. package/docs/settings.md +17 -1
  447. package/docs/skills.md +2 -0
  448. package/docs/tb21-audit.md +131 -0
  449. package/docs/terminal-setup.md +20 -0
  450. package/docs/usage.md +77 -1
  451. package/docs/verified-run-testing.md +417 -0
  452. package/docs/verified-run.md +388 -0
  453. package/docs/windows.md +48 -0
  454. package/examples/README.md +4 -0
  455. package/examples/context/AGENTS.md +64 -0
  456. package/examples/context/CLAUDE.md +17 -0
  457. package/examples/context/INTERNET.md +42 -0
  458. package/examples/extensions/custom-provider-anthropic/package-lock.json +2 -2
  459. package/examples/extensions/custom-provider-anthropic/package.json +1 -1
  460. package/examples/extensions/custom-provider-gitlab-duo/package.json +1 -1
  461. package/examples/extensions/gondolin/package-lock.json +2 -2
  462. package/examples/extensions/gondolin/package.json +1 -1
  463. package/examples/extensions/sandbox/package-lock.json +2 -2
  464. package/examples/extensions/sandbox/package.json +1 -1
  465. package/examples/extensions/with-deps/package-lock.json +2 -2
  466. package/examples/extensions/with-deps/package.json +1 -1
  467. package/npm-shrinkwrap.json +18 -18
  468. package/package.json +6 -6
@@ -1 +1 @@
1
- {"version":3,"file":"session-termination.js","sourceRoot":"","sources":["../../src/core/session-termination.ts"],"names":[],"mappings":"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","sourcesContent":["export const SESSION_TERMINATION_SCHEMA_VERSION = 1 as const;\nexport const MAX_SESSION_TERMINATION_MESSAGE_LENGTH = 512;\n\n/**\n * Canonical list of termination kinds. The run-journal validator derives its\n * runtime bounds from this tuple so a newly added kind can never crash\n * journaling with \"termination kind is out of bounds\" again.\n */\nexport const SESSION_TERMINATION_KIND_VALUES = [\n\t\"completed\",\n\t\"user_abort\",\n\t\"provider_abort\",\n\t\"provider_auth\",\n\t\"provider_rate_limit\",\n\t\"provider_network\",\n\t\"provider_protocol\",\n\t\"provider_refusal\",\n\t\"context_overflow\",\n\t\"transcript_invalid\",\n\t\"tool_timeout\",\n\t\"tool_fatal\",\n\t\"compaction\",\n\t\"persistence\",\n\t\"process_signal\",\n\t\"process_crash\",\n\t\"configuration\",\n\t\"internal_error\",\n\t\"resource_pressure\",\n] as const;\n\nexport type SessionTerminationKind = (typeof SESSION_TERMINATION_KIND_VALUES)[number];\n\nexport type SessionTerminationPhase =\n\t| \"completed\"\n\t| \"control\"\n\t| \"preflight\"\n\t| \"provider\"\n\t| \"tool\"\n\t| \"compaction\"\n\t| \"persistence\"\n\t| \"process\"\n\t| \"resume\";\n\nexport type SessionTerminationSource = \"observed\" | \"inferred_on_resume\";\nexport type SessionSideEffects = \"none\" | \"possible\" | \"confirmed\";\nexport type SessionProcessSignal = \"SIGINT\" | \"SIGTERM\" | \"SIGHUP\" | \"SIGQUIT\";\n\nexport type ProviderTerminationCauseCode =\n\t| \"abort\"\n\t| \"auth\"\n\t| \"rate_limit\"\n\t| \"network\"\n\t| \"protocol\"\n\t| \"refusal\"\n\t| \"context_overflow\";\nexport type ToolTerminationCauseCode = \"timeout\" | \"fatal\";\n/** §15.4 resource-aware runtime roadmap: host-pressure termination causes. */\nexport type ResourceTerminationCauseCode = \"memory\" | \"disk\" | \"cpu\" | \"heap\" | \"probe_unavailable\" | \"queue_overflow\";\nexport type CompactionTerminationCauseCode = \"aborted\" | \"failed\" | \"stale\" | \"quota_exhausted\";\nexport type PersistenceTerminationCauseCode =\n\t| \"read_failed\"\n\t| \"append_failed\"\n\t| \"replace_failed\"\n\t| \"fsync_failed\"\n\t| \"lock_failed\";\nexport type TranscriptTerminationCauseCode =\n\t| \"missing_result\"\n\t| \"duplicate_result\"\n\t| \"orphan_result\"\n\t| \"duplicate_call_id\"\n\t| \"interleaved_non_result\"\n\t| \"invalid_jsonl\"\n\t| \"invalid_tree\"\n\t| \"unsupported_version\"\n\t| \"trailing_fragment\";\nexport type SessionTerminationCauseCode =\n\t| \"session.completed\"\n\t| \"session.user_abort\"\n\t| `provider.${ProviderTerminationCauseCode}`\n\t| `tool.${ToolTerminationCauseCode}`\n\t| `compaction.${CompactionTerminationCauseCode}`\n\t| `persistence.${PersistenceTerminationCauseCode}`\n\t| \"process.signal\"\n\t| \"process.crash\"\n\t| `transcript.${TranscriptTerminationCauseCode}`\n\t| \"configuration.invalid\"\n\t| \"internal.unclassified\"\n\t| `resource.${ResourceTerminationCauseCode}`;\n\nexport type SessionTerminationCause =\n\t| { readonly area: \"completed\" }\n\t| { readonly area: \"user\"; readonly code: \"abort\" }\n\t| { readonly area: \"provider\"; readonly code: ProviderTerminationCauseCode }\n\t| { readonly area: \"tool\"; readonly code: ToolTerminationCauseCode }\n\t| { readonly area: \"compaction\"; readonly code: CompactionTerminationCauseCode }\n\t| { readonly area: \"persistence\"; readonly code: PersistenceTerminationCauseCode }\n\t| { readonly area: \"process\"; readonly code: \"signal\"; readonly signal: SessionProcessSignal }\n\t| { readonly area: \"process\"; readonly code: \"crash\" }\n\t| { readonly area: \"transcript\"; readonly code: TranscriptTerminationCauseCode }\n\t| { readonly area: \"configuration\"; readonly code: \"invalid\" }\n\t| { readonly area: \"internal\"; readonly code: \"unclassified\" }\n\t| { readonly area: \"resource\"; readonly code: ResourceTerminationCauseCode };\n\nexport interface ClassifySessionTerminationInput {\n\treadonly sessionId: string;\n\treadonly runId: string;\n\t/** Deterministic caller-provided ISO-8601 timestamp. */\n\treadonly timestamp: string;\n\treadonly source: SessionTerminationSource;\n\t/** Caller-supplied, pre-redacted diagnostic text. */\n\treadonly message: string;\n\treadonly cause: SessionTerminationCause;\n\treadonly sideEffects: SessionSideEffects;\n\treadonly retryAfterMs?: number;\n\treadonly provider?: string;\n\treadonly model?: string;\n\treadonly toolCallId?: string;\n\treadonly toolName?: string;\n}\n\nexport interface SessionTermination {\n\treadonly schemaVersion: typeof SESSION_TERMINATION_SCHEMA_VERSION;\n\treadonly sessionId: string;\n\treadonly runId: string;\n\treadonly kind: SessionTerminationKind;\n\treadonly phase: SessionTerminationPhase;\n\treadonly source: SessionTerminationSource;\n\treadonly message: string;\n\treadonly causeCode: SessionTerminationCauseCode;\n\t/** Stable operator guidance suitable for print, JSON, RPC, and TUI surfaces. */\n\treadonly nextAction: string;\n\treadonly retryable: boolean;\n\treadonly safeToAutoRetry: boolean;\n\treadonly sideEffects: SessionSideEffects;\n\treadonly timestamp: string;\n\treadonly retryAfterMs?: number;\n\treadonly provider?: string;\n\treadonly model?: string;\n\treadonly toolCallId?: string;\n\treadonly toolName?: string;\n\treadonly processSignal?: SessionProcessSignal;\n\treadonly transcriptIssue?: TranscriptTerminationCauseCode;\n}\n\nexport class SessionTerminationError extends Error {\n\treadonly termination: SessionTermination;\n\n\tconstructor(message: string, termination: SessionTermination) {\n\t\tsuper(message);\n\t\tthis.name = \"SessionTerminationError\";\n\t\tthis.termination = termination;\n\t}\n}\n\ninterface Classification {\n\treadonly kind: SessionTerminationKind;\n\treadonly phase: SessionTerminationPhase;\n\treadonly causeCode: SessionTerminationCauseCode;\n\treadonly retryable: boolean;\n\treadonly processSignal?: SessionProcessSignal;\n\treadonly transcriptIssue?: TranscriptTerminationCauseCode;\n}\n\nconst CREDENTIAL_SHAPES = [\n\t/-----BEGIN [A-Z ]*PRIVATE KEY-----/i,\n\t/\\b(?:sk-[A-Za-z0-9_-]{16,}|github_pat_[A-Za-z0-9_]{16,}|gh[pousr]_[A-Za-z0-9]{16,}|xox[baprs]-[A-Za-z0-9-]{16,}|AKIA[A-Z0-9]{16})\\b/,\n\t/\\bBearer\\s+[A-Za-z0-9._~+/-]{8,}={0,2}\\b/i,\n\t/\\beyJ[A-Za-z0-9_-]{8,}\\.[A-Za-z0-9_-]{8,}\\.[A-Za-z0-9_-]{8,}\\b/,\n\t/(?:^|[^A-Za-z0-9])(?:[A-Za-z0-9]+[_-])*(?:authorization|api[-_ ]?key|access[-_ ]?token|token|password|secret(?:[-_ ]?key)?|private[-_ ]?key|cookie)[\"']?\\s*[:=]/i,\n] as const;\n\nconst TOP_LEVEL_KEYS = new Set([\n\t\"sessionId\",\n\t\"runId\",\n\t\"timestamp\",\n\t\"source\",\n\t\"message\",\n\t\"cause\",\n\t\"sideEffects\",\n\t\"retryAfterMs\",\n\t\"provider\",\n\t\"model\",\n\t\"toolCallId\",\n\t\"toolName\",\n]);\nconst PROVIDER_CAUSE_CODES = new Set<ProviderTerminationCauseCode>([\n\t\"abort\",\n\t\"auth\",\n\t\"rate_limit\",\n\t\"network\",\n\t\"protocol\",\n\t\"refusal\",\n\t\"context_overflow\",\n]);\nconst TOOL_CAUSE_CODES = new Set<ToolTerminationCauseCode>([\"timeout\", \"fatal\"]);\nconst RESOURCE_CAUSE_CODES = new Set<ResourceTerminationCauseCode>([\n\t\"memory\",\n\t\"disk\",\n\t\"cpu\",\n\t\"heap\",\n\t\"probe_unavailable\",\n\t\"queue_overflow\",\n]);\nconst COMPACTION_CAUSE_CODES = new Set<CompactionTerminationCauseCode>([\n\t\"aborted\",\n\t\"failed\",\n\t\"stale\",\n\t\"quota_exhausted\",\n]);\nconst PERSISTENCE_CAUSE_CODES = new Set<PersistenceTerminationCauseCode>([\n\t\"read_failed\",\n\t\"append_failed\",\n\t\"replace_failed\",\n\t\"fsync_failed\",\n\t\"lock_failed\",\n]);\nconst TRANSCRIPT_CAUSE_CODES = new Set<TranscriptTerminationCauseCode>([\n\t\"missing_result\",\n\t\"duplicate_result\",\n\t\"orphan_result\",\n\t\"duplicate_call_id\",\n\t\"interleaved_non_result\",\n\t\"invalid_jsonl\",\n\t\"invalid_tree\",\n\t\"unsupported_version\",\n\t\"trailing_fragment\",\n]);\nconst PROCESS_SIGNALS = new Set<SessionProcessSignal>([\"SIGINT\", \"SIGTERM\", \"SIGHUP\", \"SIGQUIT\"]);\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n\treturn typeof value === \"object\" && value !== null && !Array.isArray(value);\n}\n\nfunction hasOnlyKeys(value: Record<string, unknown>, keys: readonly string[]): boolean {\n\tconst allowed = new Set(keys);\n\treturn Object.keys(value).every((key) => allowed.has(key));\n}\n\nfunction assertCause(cause: unknown): asserts cause is SessionTerminationCause {\n\tif (!isRecord(cause) || typeof cause.area !== \"string\") {\n\t\tthrow new TypeError(\"cause must be a bounded structured termination cause\");\n\t}\n\tconst code = cause.code;\n\tlet valid = false;\n\tswitch (cause.area) {\n\t\tcase \"completed\":\n\t\t\tvalid = hasOnlyKeys(cause, [\"area\"]);\n\t\t\tbreak;\n\t\tcase \"user\":\n\t\t\tvalid = code === \"abort\" && hasOnlyKeys(cause, [\"area\", \"code\"]);\n\t\t\tbreak;\n\t\tcase \"provider\":\n\t\t\tvalid =\n\t\t\t\ttypeof code === \"string\" &&\n\t\t\t\tPROVIDER_CAUSE_CODES.has(code as ProviderTerminationCauseCode) &&\n\t\t\t\thasOnlyKeys(cause, [\"area\", \"code\"]);\n\t\t\tbreak;\n\t\tcase \"tool\":\n\t\t\tvalid =\n\t\t\t\ttypeof code === \"string\" &&\n\t\t\t\tTOOL_CAUSE_CODES.has(code as ToolTerminationCauseCode) &&\n\t\t\t\thasOnlyKeys(cause, [\"area\", \"code\"]);\n\t\t\tbreak;\n\t\tcase \"compaction\":\n\t\t\tvalid =\n\t\t\t\ttypeof code === \"string\" &&\n\t\t\t\tCOMPACTION_CAUSE_CODES.has(code as CompactionTerminationCauseCode) &&\n\t\t\t\thasOnlyKeys(cause, [\"area\", \"code\"]);\n\t\t\tbreak;\n\t\tcase \"persistence\":\n\t\t\tvalid =\n\t\t\t\ttypeof code === \"string\" &&\n\t\t\t\tPERSISTENCE_CAUSE_CODES.has(code as PersistenceTerminationCauseCode) &&\n\t\t\t\thasOnlyKeys(cause, [\"area\", \"code\"]);\n\t\t\tbreak;\n\t\tcase \"process\":\n\t\t\tvalid =\n\t\t\t\t(code === \"crash\" && hasOnlyKeys(cause, [\"area\", \"code\"])) ||\n\t\t\t\t(code === \"signal\" &&\n\t\t\t\t\ttypeof cause.signal === \"string\" &&\n\t\t\t\t\tPROCESS_SIGNALS.has(cause.signal as SessionProcessSignal) &&\n\t\t\t\t\thasOnlyKeys(cause, [\"area\", \"code\", \"signal\"]));\n\t\t\tbreak;\n\t\tcase \"transcript\":\n\t\t\tvalid =\n\t\t\t\ttypeof code === \"string\" &&\n\t\t\t\tTRANSCRIPT_CAUSE_CODES.has(code as TranscriptTerminationCauseCode) &&\n\t\t\t\thasOnlyKeys(cause, [\"area\", \"code\"]);\n\t\t\tbreak;\n\t\tcase \"configuration\":\n\t\t\tvalid = code === \"invalid\" && hasOnlyKeys(cause, [\"area\", \"code\"]);\n\t\t\tbreak;\n\t\tcase \"internal\":\n\t\t\tvalid = code === \"unclassified\" && hasOnlyKeys(cause, [\"area\", \"code\"]);\n\t\t\tbreak;\n\t\tcase \"resource\":\n\t\t\tvalid =\n\t\t\t\ttypeof code === \"string\" &&\n\t\t\t\tRESOURCE_CAUSE_CODES.has(code as ResourceTerminationCauseCode) &&\n\t\t\t\thasOnlyKeys(cause, [\"area\", \"code\"]);\n\t\t\tbreak;\n\t}\n\tif (!valid) throw new TypeError(\"cause must be a bounded structured termination cause\");\n}\n\nfunction assertClassifierInput(input: unknown): asserts input is ClassifySessionTerminationInput {\n\tif (!isRecord(input) || Object.keys(input).some((key) => !TOP_LEVEL_KEYS.has(key))) {\n\t\tthrow new TypeError(\"input must contain only bounded structured termination fields\");\n\t}\n\tif (\n\t\ttypeof input.sessionId !== \"string\" ||\n\t\ttypeof input.runId !== \"string\" ||\n\t\ttypeof input.timestamp !== \"string\" ||\n\t\ttypeof input.message !== \"string\" ||\n\t\t(input.source !== \"observed\" && input.source !== \"inferred_on_resume\") ||\n\t\t(input.sideEffects !== \"none\" && input.sideEffects !== \"possible\" && input.sideEffects !== \"confirmed\") ||\n\t\t(input.retryAfterMs !== undefined && typeof input.retryAfterMs !== \"number\") ||\n\t\t(input.provider !== undefined && typeof input.provider !== \"string\") ||\n\t\t(input.model !== undefined && typeof input.model !== \"string\") ||\n\t\t(input.toolCallId !== undefined && typeof input.toolCallId !== \"string\") ||\n\t\t(input.toolName !== undefined && typeof input.toolName !== \"string\")\n\t) {\n\t\tthrow new TypeError(\"input must contain only bounded structured termination fields\");\n\t}\n\tassertCause(input.cause);\n}\n\nfunction assertIdentifier(value: string, name: string, maxLength: number): void {\n\tif (value.length === 0 || value.length > maxLength || /[\\u0000-\\u001f\\u007f]/.test(value)) {\n\t\tthrow new TypeError(`${name} must be non-empty bounded text without C0 or DEL control characters`);\n\t}\n}\n\n/** Validate text at the termination trust boundary without attempting redaction. */\nexport function assertPreRedactedTerminationMessage(message: string): void {\n\tif (message.length === 0 || message.length > MAX_SESSION_TERMINATION_MESSAGE_LENGTH) {\n\t\tthrow new TypeError(\n\t\t\t`message must contain 1-${MAX_SESSION_TERMINATION_MESSAGE_LENGTH} characters of pre-redacted text`,\n\t\t);\n\t}\n\tif (message.includes(\"\\0\")) {\n\t\tthrow new TypeError(\"message must not contain NUL\");\n\t}\n\tif (CREDENTIAL_SHAPES.some((pattern) => pattern.test(message))) {\n\t\tthrow new TypeError(\"message contains a credential-shaped literal; redact it before classification\");\n\t}\n}\n\nfunction assertTimestamp(timestamp: string): void {\n\tconst parsed = new Date(timestamp);\n\tif (!Number.isFinite(parsed.getTime()) || parsed.toISOString() !== timestamp) {\n\t\tthrow new TypeError(\"timestamp must be a canonical ISO-8601 UTC instant\");\n\t}\n}\n\nfunction classifyProvider(code: ProviderTerminationCauseCode): Classification {\n\tswitch (code) {\n\t\tcase \"abort\":\n\t\t\treturn {\n\t\t\t\tkind: \"provider_abort\",\n\t\t\t\tphase: \"provider\",\n\t\t\t\tcauseCode: \"provider.abort\",\n\t\t\t\tretryable: true,\n\t\t\t};\n\t\tcase \"auth\":\n\t\t\treturn {\n\t\t\t\tkind: \"provider_auth\",\n\t\t\t\tphase: \"provider\",\n\t\t\t\tcauseCode: \"provider.auth\",\n\t\t\t\tretryable: false,\n\t\t\t};\n\t\tcase \"rate_limit\":\n\t\t\treturn {\n\t\t\t\tkind: \"provider_rate_limit\",\n\t\t\t\tphase: \"provider\",\n\t\t\t\tcauseCode: \"provider.rate_limit\",\n\t\t\t\tretryable: true,\n\t\t\t};\n\t\tcase \"network\":\n\t\t\treturn {\n\t\t\t\tkind: \"provider_network\",\n\t\t\t\tphase: \"provider\",\n\t\t\t\tcauseCode: \"provider.network\",\n\t\t\t\tretryable: true,\n\t\t\t};\n\t\tcase \"protocol\":\n\t\t\t// Many \"protocol\" stops are sticky transcript shape bugs (orphan tool_call_id)\n\t\t\t// that succeed after transform-messages sanitizes and the turn is retried.\n\t\t\t// Mark retryable so auto-retry can heal; safeToAutoRetry stays false (needs sanitize path).\n\t\t\treturn {\n\t\t\t\tkind: \"provider_protocol\",\n\t\t\t\tphase: \"provider\",\n\t\t\t\tcauseCode: \"provider.protocol\",\n\t\t\t\tretryable: true,\n\t\t\t};\n\t\tcase \"context_overflow\":\n\t\t\treturn {\n\t\t\t\tkind: \"context_overflow\",\n\t\t\t\tphase: \"provider\",\n\t\t\t\tcauseCode: \"provider.context_overflow\",\n\t\t\t\tretryable: true,\n\t\t\t};\n\t\tcase \"refusal\":\n\t\t\treturn {\n\t\t\t\tkind: \"provider_refusal\",\n\t\t\t\tphase: \"provider\",\n\t\t\t\tcauseCode: \"provider.refusal\",\n\t\t\t\tretryable: true,\n\t\t\t};\n\t}\n}\n\nfunction classifyCause(cause: SessionTerminationCause, source: SessionTerminationSource): Classification {\n\tswitch (cause.area) {\n\t\tcase \"completed\":\n\t\t\treturn {\n\t\t\t\tkind: \"completed\",\n\t\t\t\tphase: \"completed\",\n\t\t\t\tcauseCode: \"session.completed\",\n\t\t\t\tretryable: false,\n\t\t\t};\n\t\tcase \"user\":\n\t\t\treturn {\n\t\t\t\tkind: \"user_abort\",\n\t\t\t\tphase: \"control\",\n\t\t\t\tcauseCode: \"session.user_abort\",\n\t\t\t\tretryable: false,\n\t\t\t};\n\t\tcase \"provider\":\n\t\t\treturn classifyProvider(cause.code);\n\t\tcase \"tool\":\n\t\t\treturn cause.code === \"timeout\"\n\t\t\t\t? { kind: \"tool_timeout\", phase: \"tool\", causeCode: \"tool.timeout\", retryable: true }\n\t\t\t\t: { kind: \"tool_fatal\", phase: \"tool\", causeCode: \"tool.fatal\", retryable: false };\n\t\tcase \"compaction\":\n\t\t\treturn {\n\t\t\t\tkind: \"compaction\",\n\t\t\t\tphase: \"compaction\",\n\t\t\t\tcauseCode: `compaction.${cause.code}`,\n\t\t\t\t// Quota exhaustion does not heal by retrying: same-model retries\n\t\t\t\t// keep failing until the provider cycle resets or the model changes.\n\t\t\t\tretryable: cause.code !== \"quota_exhausted\",\n\t\t\t};\n\t\tcase \"persistence\":\n\t\t\treturn {\n\t\t\t\tkind: \"persistence\",\n\t\t\t\tphase: \"persistence\",\n\t\t\t\tcauseCode: `persistence.${cause.code}`,\n\t\t\t\tretryable: true,\n\t\t\t};\n\t\tcase \"process\":\n\t\t\tif (cause.code === \"signal\") {\n\t\t\t\treturn {\n\t\t\t\t\tkind: \"process_signal\",\n\t\t\t\t\tphase: \"process\",\n\t\t\t\t\tcauseCode: \"process.signal\",\n\t\t\t\t\tretryable: false,\n\t\t\t\t\tprocessSignal: cause.signal,\n\t\t\t\t};\n\t\t\t}\n\t\t\treturn {\n\t\t\t\tkind: \"process_crash\",\n\t\t\t\tphase: \"resume\",\n\t\t\t\tcauseCode: \"process.crash\",\n\t\t\t\tretryable: true,\n\t\t\t};\n\t\tcase \"transcript\":\n\t\t\treturn {\n\t\t\t\tkind: \"transcript_invalid\",\n\t\t\t\tphase: source === \"inferred_on_resume\" ? \"resume\" : \"preflight\",\n\t\t\t\tcauseCode: `transcript.${cause.code}`,\n\t\t\t\tretryable: false,\n\t\t\t\ttranscriptIssue: cause.code,\n\t\t\t};\n\t\tcase \"configuration\":\n\t\t\treturn {\n\t\t\t\tkind: \"configuration\",\n\t\t\t\tphase: \"preflight\",\n\t\t\t\tcauseCode: \"configuration.invalid\",\n\t\t\t\tretryable: false,\n\t\t\t};\n\t\tcase \"internal\":\n\t\t\treturn {\n\t\t\t\tkind: \"internal_error\",\n\t\t\t\tphase: \"preflight\",\n\t\t\t\tcauseCode: \"internal.unclassified\",\n\t\t\t\tretryable: false,\n\t\t\t};\n\t\tcase \"resource\":\n\t\t\t// §15.4: every resource cause is retryable; queue overflow surfaces at\n\t\t\t// the tool boundary, everything else at preflight admission.\n\t\t\treturn {\n\t\t\t\tkind: \"resource_pressure\",\n\t\t\t\tphase: cause.code === \"queue_overflow\" ? \"tool\" : \"preflight\",\n\t\t\t\tcauseCode: `resource.${cause.code}`,\n\t\t\t\tretryable: true,\n\t\t\t};\n\t}\n}\n\nfunction isSafeToAutoRetry(classification: Classification, input: ClassifySessionTerminationInput): boolean {\n\t// provider_refusal: Fable/Claude often false-positive on benign turns. Safe to auto-retry once\n\t// when no tool side effects occurred (same class of recovery as rate_limit/network).\n\treturn (\n\t\tclassification.retryable &&\n\t\tinput.source === \"observed\" &&\n\t\tinput.sideEffects === \"none\" &&\n\t\t(classification.kind === \"provider_rate_limit\" ||\n\t\t\tclassification.kind === \"provider_network\" ||\n\t\t\tclassification.kind === \"provider_refusal\" ||\n\t\t\t// §15.4 mapping: only cpu pressure is safe to auto-retry (with delay).\n\t\t\tclassification.causeCode === \"resource.cpu\")\n\t);\n}\n\nfunction nextActionFor(classification: Classification, input: ClassifySessionTerminationInput): string {\n\tswitch (classification.kind) {\n\t\tcase \"completed\":\n\t\t\treturn \"No recovery action is required; continue with the next prompt.\";\n\t\tcase \"user_abort\":\n\t\t\treturn \"Review possible partial side effects, then retry only if intended.\";\n\t\tcase \"resource_pressure\":\n\t\t\treturn \"Host resources are constrained; reduce load or wait for recovery, then retry.\";\n\t\tcase \"provider_abort\":\n\t\t\treturn \"Confirm provider availability, then retry the request.\";\n\t\tcase \"provider_auth\":\n\t\t\t// A credential-less install resolves a placeholder model whose provider is\n\t\t\t// literally \"unknown\"; never echo that back as a login target.\n\t\t\treturn `Run /login${input.provider && input.provider !== \"unknown\" ? ` ${input.provider}` : \"\"} in an interactive session, or set the provider's API key environment variable, then retry.`;\n\t\tcase \"provider_rate_limit\":\n\t\t\treturn \"Wait for the provider retry window or choose another model, then retry.\";\n\t\tcase \"provider_network\":\n\t\t\treturn \"Check network and provider connectivity, then retry.\";\n\t\tcase \"provider_protocol\":\n\t\t\treturn \"Often an orphan tool_call_id / sticky transcript after a dropped error turn — auto-retry after sanitize, or /new session if it persists.\";\n\t\tcase \"provider_refusal\":\n\t\t\treturn \"Model declined this turn (content/safety stop). Usually a false positive on Fable/Claude — auto-retry once, or switch model (k3/qwen3.8-max/grok-4.5/deepseek) / rephrase as a pure coding task.\";\n\t\tcase \"context_overflow\":\n\t\t\treturn \"Compact or reduce context, or switch to a larger-context model.\";\n\t\tcase \"tool_timeout\":\n\t\t\treturn \"Inspect possible tool side effects and increase the tool timeout only if safe.\";\n\t\tcase \"tool_fatal\":\n\t\t\treturn \"Inspect the failed tool result and repair its configuration before retrying.\";\n\t\tcase \"compaction\":\n\t\t\tswitch (classification.causeCode) {\n\t\t\t\tcase \"compaction.aborted\":\n\t\t\t\t\treturn \"Retry /compact if cancellation was unintended; avoid Escape while compaction is running.\";\n\t\t\t\tcase \"compaction.stale\":\n\t\t\t\t\treturn \"Retry /compact after pending session changes settle.\";\n\t\t\t\tcase \"compaction.quota_exhausted\":\n\t\t\t\t\treturn \"The summarization model's quota is exhausted — retrying cannot help yet. Switch model (/model), set compaction.model in settings, or wait for the quota reset, then retry /compact. OMK already tried the failover chain automatically.\";\n\t\t\t\tdefault:\n\t\t\t\t\treturn \"Resolve the reported compaction error, then retry /compact.\";\n\t\t\t}\n\t\tcase \"persistence\":\n\t\t\treturn `Run omk session doctor --session ${input.sessionId} before resuming.`;\n\t\tcase \"process_signal\":\n\t\t\treturn \"Review possible partial side effects before resuming the session.\";\n\t\tcase \"process_crash\":\n\t\t\treturn `Run omk session doctor --session ${input.sessionId} and review partial side effects.`;\n\t\tcase \"transcript_invalid\":\n\t\t\treturn `Run omk session doctor --session ${input.sessionId}; do not resume until integrity passes.`;\n\t\tcase \"configuration\":\n\t\t\treturn \"Correct the provider, model, tool, or session configuration and retry.\";\n\t\tcase \"internal_error\":\n\t\t\treturn `Inspect run ${input.runId} diagnostics and the run journal before retrying.`;\n\t}\n}\n\n/** Concise actionable rendering shared by non-JSON and TUI surfaces. */\nexport function formatSessionTermination(termination: SessionTermination): string {\n\tconst route =\n\t\ttermination.provider || termination.model\n\t\t\t? `${termination.provider ?? \"unknown\"}/${termination.model ?? \"unknown\"}`\n\t\t\t: \"n/a\";\n\treturn [\n\t\t`kind=${termination.kind}`,\n\t\t`provider/model=${route}`,\n\t\t`retryable=${termination.retryable}`,\n\t\t`cause=${termination.causeCode}`,\n\t\t`message=${termination.message}`,\n\t\t`run=${termination.runId}`,\n\t\t`next=${termination.nextAction}`,\n\t].join(\" \");\n}\n\n/**\n * Classify a bounded, structured termination cause. This intentionally accepts\n * no raw Error value, stack, provider body, or arbitrary cause code.\n */\nexport function classifySessionTermination(input: ClassifySessionTerminationInput): SessionTermination {\n\tassertClassifierInput(input);\n\tassertIdentifier(input.sessionId, \"sessionId\", 128);\n\tassertIdentifier(input.runId, \"runId\", 128);\n\tassertTimestamp(input.timestamp);\n\tassertPreRedactedTerminationMessage(input.message);\n\tif (input.provider !== undefined) assertIdentifier(input.provider, \"provider\", 128);\n\tif (input.model !== undefined) assertIdentifier(input.model, \"model\", 256);\n\tif (input.toolCallId !== undefined) assertIdentifier(input.toolCallId, \"toolCallId\", 512);\n\tif (input.toolName !== undefined) assertIdentifier(input.toolName, \"toolName\", 128);\n\tif (input.retryAfterMs !== undefined && (!Number.isSafeInteger(input.retryAfterMs) || input.retryAfterMs < 0)) {\n\t\tthrow new TypeError(\"retryAfterMs must be a non-negative safe integer\");\n\t}\n\tif (input.cause.area === \"process\" && input.cause.code === \"crash\" && input.source !== \"inferred_on_resume\") {\n\t\tthrow new TypeError(\"process crashes may only be classified as inferred_on_resume\");\n\t}\n\tif (input.cause.area === \"process\" && input.cause.code === \"signal\" && input.source !== \"observed\") {\n\t\tthrow new TypeError(\"process signals must be observed\");\n\t}\n\n\tconst classification = classifyCause(input.cause, input.source);\n\treturn Object.freeze({\n\t\tschemaVersion: SESSION_TERMINATION_SCHEMA_VERSION,\n\t\tsessionId: input.sessionId,\n\t\trunId: input.runId,\n\t\tkind: classification.kind,\n\t\tphase: classification.phase,\n\t\tsource: input.source,\n\t\tmessage: input.message,\n\t\tcauseCode: classification.causeCode,\n\t\tnextAction: nextActionFor(classification, input),\n\t\tretryable: classification.retryable,\n\t\tsafeToAutoRetry: isSafeToAutoRetry(classification, input),\n\t\tsideEffects: input.sideEffects,\n\t\ttimestamp: input.timestamp,\n\t\t...(input.retryAfterMs === undefined ? {} : { retryAfterMs: input.retryAfterMs }),\n\t\t...(input.provider === undefined ? {} : { provider: input.provider }),\n\t\t...(input.model === undefined ? {} : { model: input.model }),\n\t\t...(input.toolCallId === undefined ? {} : { toolCallId: input.toolCallId }),\n\t\t...(input.toolName === undefined ? {} : { toolName: input.toolName }),\n\t\t...(classification.processSignal === undefined ? {} : { processSignal: classification.processSignal }),\n\t\t...(classification.transcriptIssue === undefined ? {} : { transcriptIssue: classification.transcriptIssue }),\n\t});\n}\n"]}
1
+ {"version":3,"file":"session-termination.js","sourceRoot":"","sources":["../../src/core/session-termination.ts"],"names":[],"mappings":"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","sourcesContent":["import { RUN_BUDGET_STOP_CODES } from \"./run-budget-policy.ts\";\nimport {\n\ttype ClassifySessionTerminationInput,\n\ttype CompactionTerminationCauseCode,\n\tMAX_SESSION_TERMINATION_MESSAGE_LENGTH,\n\ttype PersistenceTerminationCauseCode,\n\ttype ProviderTerminationCauseCode,\n\ttype ResourceTerminationCauseCode,\n\tSESSION_TERMINATION_SCHEMA_VERSION,\n\ttype SessionProcessSignal,\n\ttype SessionTermination,\n\ttype SessionTerminationCause,\n\ttype SessionTerminationCauseCode,\n\ttype SessionTerminationKind,\n\ttype SessionTerminationPhase,\n\ttype SessionTerminationSource,\n\ttype ToolTerminationCauseCode,\n\ttype TranscriptTerminationCauseCode,\n} from \"./session-termination-types.ts\";\n\nexport * from \"./session-termination-types.ts\";\n\nexport class SessionTerminationError extends Error {\n\treadonly termination: SessionTermination;\n\n\tconstructor(message: string, termination: SessionTermination) {\n\t\tsuper(message);\n\t\tthis.name = \"SessionTerminationError\";\n\t\tthis.termination = termination;\n\t}\n}\n\ninterface Classification {\n\treadonly kind: SessionTerminationKind;\n\treadonly phase: SessionTerminationPhase;\n\treadonly causeCode: SessionTerminationCauseCode;\n\treadonly retryable: boolean;\n\treadonly processSignal?: SessionProcessSignal;\n\treadonly transcriptIssue?: TranscriptTerminationCauseCode;\n}\n\nconst CREDENTIAL_SHAPES = [\n\t/-----BEGIN [A-Z ]*PRIVATE KEY-----/i,\n\t/\\b(?:sk-[A-Za-z0-9_-]{16,}|github_pat_[A-Za-z0-9_]{16,}|gh[pousr]_[A-Za-z0-9]{16,}|xox[baprs]-[A-Za-z0-9-]{16,}|AKIA[A-Z0-9]{16})\\b/,\n\t/\\bBearer\\s+[A-Za-z0-9._~+/-]{8,}={0,2}\\b/i,\n\t/\\beyJ[A-Za-z0-9_-]{8,}\\.[A-Za-z0-9_-]{8,}\\.[A-Za-z0-9_-]{8,}\\b/,\n\t/(?:^|[^A-Za-z0-9])(?:[A-Za-z0-9]+[_-])*(?:authorization|api[-_ ]?key|access[-_ ]?token|token|password|secret(?:[-_ ]?key)?|private[-_ ]?key|cookie)[\"']?\\s*[:=]/i,\n] as const;\n\nconst TOP_LEVEL_KEYS = new Set([\n\t\"sessionId\",\n\t\"runId\",\n\t\"timestamp\",\n\t\"source\",\n\t\"message\",\n\t\"cause\",\n\t\"sideEffects\",\n\t\"retryAfterMs\",\n\t\"provider\",\n\t\"model\",\n\t\"toolCallId\",\n\t\"toolName\",\n]);\nconst PROVIDER_CAUSE_CODES = new Set<ProviderTerminationCauseCode>([\n\t\"abort\",\n\t\"auth\",\n\t\"rate_limit\",\n\t\"network\",\n\t\"protocol\",\n\t\"refusal\",\n\t\"context_overflow\",\n]);\nconst TOOL_CAUSE_CODES = new Set<ToolTerminationCauseCode>([\"timeout\", \"fatal\"]);\nconst RESOURCE_CAUSE_CODES = new Set<ResourceTerminationCauseCode>([\n\t\"memory\",\n\t\"disk\",\n\t\"cpu\",\n\t\"heap\",\n\t\"probe_unavailable\",\n\t\"queue_overflow\",\n]);\nconst COMPACTION_CAUSE_CODES = new Set<CompactionTerminationCauseCode>([\n\t\"aborted\",\n\t\"failed\",\n\t\"stale\",\n\t\"quota_exhausted\",\n]);\nconst PERSISTENCE_CAUSE_CODES = new Set<PersistenceTerminationCauseCode>([\n\t\"read_failed\",\n\t\"append_failed\",\n\t\"replace_failed\",\n\t\"fsync_failed\",\n\t\"lock_failed\",\n]);\nconst TRANSCRIPT_CAUSE_CODES = new Set<TranscriptTerminationCauseCode>([\n\t\"missing_result\",\n\t\"duplicate_result\",\n\t\"orphan_result\",\n\t\"duplicate_call_id\",\n\t\"interleaved_non_result\",\n\t\"invalid_jsonl\",\n\t\"invalid_tree\",\n\t\"unsupported_version\",\n\t\"trailing_fragment\",\n]);\nconst PROCESS_SIGNALS = new Set<SessionProcessSignal>([\"SIGINT\", \"SIGTERM\", \"SIGHUP\", \"SIGQUIT\"]);\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n\treturn typeof value === \"object\" && value !== null && !Array.isArray(value);\n}\n\nfunction hasOnlyKeys(value: Record<string, unknown>, keys: readonly string[]): boolean {\n\tconst allowed = new Set(keys);\n\treturn Object.keys(value).every((key) => allowed.has(key));\n}\n\nfunction assertCause(cause: unknown): asserts cause is SessionTerminationCause {\n\tif (!isRecord(cause) || typeof cause.area !== \"string\") {\n\t\tthrow new TypeError(\"cause must be a bounded structured termination cause\");\n\t}\n\tconst code = cause.code;\n\tlet valid = false;\n\tswitch (cause.area) {\n\t\tcase \"completed\":\n\t\t\tvalid = hasOnlyKeys(cause, [\"area\"]);\n\t\t\tbreak;\n\t\tcase \"user\":\n\t\t\tvalid = code === \"abort\" && hasOnlyKeys(cause, [\"area\", \"code\"]);\n\t\t\tbreak;\n\t\tcase \"provider\":\n\t\t\tvalid =\n\t\t\t\ttypeof code === \"string\" &&\n\t\t\t\tPROVIDER_CAUSE_CODES.has(code as ProviderTerminationCauseCode) &&\n\t\t\t\thasOnlyKeys(cause, [\"area\", \"code\"]);\n\t\t\tbreak;\n\t\tcase \"tool\":\n\t\t\tvalid =\n\t\t\t\ttypeof code === \"string\" &&\n\t\t\t\tTOOL_CAUSE_CODES.has(code as ToolTerminationCauseCode) &&\n\t\t\t\thasOnlyKeys(cause, [\"area\", \"code\"]);\n\t\t\tbreak;\n\t\tcase \"compaction\":\n\t\t\tvalid =\n\t\t\t\ttypeof code === \"string\" &&\n\t\t\t\tCOMPACTION_CAUSE_CODES.has(code as CompactionTerminationCauseCode) &&\n\t\t\t\thasOnlyKeys(cause, [\"area\", \"code\"]);\n\t\t\tbreak;\n\t\tcase \"persistence\":\n\t\t\tvalid =\n\t\t\t\ttypeof code === \"string\" &&\n\t\t\t\tPERSISTENCE_CAUSE_CODES.has(code as PersistenceTerminationCauseCode) &&\n\t\t\t\thasOnlyKeys(cause, [\"area\", \"code\"]);\n\t\t\tbreak;\n\t\tcase \"process\":\n\t\t\tvalid =\n\t\t\t\t(code === \"crash\" && hasOnlyKeys(cause, [\"area\", \"code\"])) ||\n\t\t\t\t(code === \"signal\" &&\n\t\t\t\t\ttypeof cause.signal === \"string\" &&\n\t\t\t\t\tPROCESS_SIGNALS.has(cause.signal as SessionProcessSignal) &&\n\t\t\t\t\thasOnlyKeys(cause, [\"area\", \"code\", \"signal\"]));\n\t\t\tbreak;\n\t\tcase \"transcript\":\n\t\t\tvalid =\n\t\t\t\ttypeof code === \"string\" &&\n\t\t\t\tTRANSCRIPT_CAUSE_CODES.has(code as TranscriptTerminationCauseCode) &&\n\t\t\t\thasOnlyKeys(cause, [\"area\", \"code\"]);\n\t\t\tbreak;\n\t\tcase \"configuration\":\n\t\t\tvalid = code === \"invalid\" && hasOnlyKeys(cause, [\"area\", \"code\"]);\n\t\t\tbreak;\n\t\tcase \"internal\":\n\t\t\tvalid = code === \"unclassified\" && hasOnlyKeys(cause, [\"area\", \"code\"]);\n\t\t\tbreak;\n\t\tcase \"budget\":\n\t\t\tvalid = RUN_BUDGET_STOP_CODES.some((allowed) => allowed === code) && hasOnlyKeys(cause, [\"area\", \"code\"]);\n\t\t\tbreak;\n\t\tcase \"resource\":\n\t\t\tvalid =\n\t\t\t\ttypeof code === \"string\" &&\n\t\t\t\tRESOURCE_CAUSE_CODES.has(code as ResourceTerminationCauseCode) &&\n\t\t\t\thasOnlyKeys(cause, [\"area\", \"code\"]);\n\t\t\tbreak;\n\t}\n\tif (!valid) throw new TypeError(\"cause must be a bounded structured termination cause\");\n}\n\nexport function parseSessionTerminationCauseCode(code: string, signal?: SessionProcessSignal): SessionTerminationCause {\n\tif (code === \"session.completed\") return { area: \"completed\" };\n\tif (code === \"session.user_abort\") return { area: \"user\", code: \"abort\" };\n\tconst dot = code.indexOf(\".\");\n\tconst cause = {\n\t\tarea: code.slice(0, dot),\n\t\tcode: code.slice(dot + 1),\n\t\t...(code === \"process.signal\" ? { signal } : {}),\n\t};\n\tassertCause(cause);\n\treturn cause;\n}\n\nfunction assertClassifierInput(input: unknown): asserts input is ClassifySessionTerminationInput {\n\tif (!isRecord(input) || Object.keys(input).some((key) => !TOP_LEVEL_KEYS.has(key))) {\n\t\tthrow new TypeError(\"input must contain only bounded structured termination fields\");\n\t}\n\tif (\n\t\ttypeof input.sessionId !== \"string\" ||\n\t\ttypeof input.runId !== \"string\" ||\n\t\ttypeof input.timestamp !== \"string\" ||\n\t\ttypeof input.message !== \"string\" ||\n\t\t(input.source !== \"observed\" && input.source !== \"inferred_on_resume\") ||\n\t\t(input.sideEffects !== \"none\" && input.sideEffects !== \"possible\" && input.sideEffects !== \"confirmed\") ||\n\t\t(input.retryAfterMs !== undefined && typeof input.retryAfterMs !== \"number\") ||\n\t\t(input.provider !== undefined && typeof input.provider !== \"string\") ||\n\t\t(input.model !== undefined && typeof input.model !== \"string\") ||\n\t\t(input.toolCallId !== undefined && typeof input.toolCallId !== \"string\") ||\n\t\t(input.toolName !== undefined && typeof input.toolName !== \"string\")\n\t) {\n\t\tthrow new TypeError(\"input must contain only bounded structured termination fields\");\n\t}\n\tassertCause(input.cause);\n}\n\nfunction assertIdentifier(value: string, name: string, maxLength: number): void {\n\tif (value.length === 0 || value.length > maxLength || /[\\u0000-\\u001f\\u007f]/.test(value)) {\n\t\tthrow new TypeError(`${name} must be non-empty bounded text without C0 or DEL control characters`);\n\t}\n}\n\n/** Validate text at the termination trust boundary without attempting redaction. */\nexport function assertPreRedactedTerminationMessage(message: string): void {\n\tif (message.length === 0 || message.length > MAX_SESSION_TERMINATION_MESSAGE_LENGTH) {\n\t\tthrow new TypeError(\n\t\t\t`message must contain 1-${MAX_SESSION_TERMINATION_MESSAGE_LENGTH} characters of pre-redacted text`,\n\t\t);\n\t}\n\tif (message.includes(\"\\0\")) {\n\t\tthrow new TypeError(\"message must not contain NUL\");\n\t}\n\tif (CREDENTIAL_SHAPES.some((pattern) => pattern.test(message))) {\n\t\tthrow new TypeError(\"message contains a credential-shaped literal; redact it before classification\");\n\t}\n}\n\nfunction assertTimestamp(timestamp: string): void {\n\tconst parsed = new Date(timestamp);\n\tif (!Number.isFinite(parsed.getTime()) || parsed.toISOString() !== timestamp) {\n\t\tthrow new TypeError(\"timestamp must be a canonical ISO-8601 UTC instant\");\n\t}\n}\n\nfunction classifyProvider(code: ProviderTerminationCauseCode): Classification {\n\tswitch (code) {\n\t\tcase \"abort\":\n\t\t\treturn {\n\t\t\t\tkind: \"provider_abort\",\n\t\t\t\tphase: \"provider\",\n\t\t\t\tcauseCode: \"provider.abort\",\n\t\t\t\tretryable: true,\n\t\t\t};\n\t\tcase \"auth\":\n\t\t\treturn {\n\t\t\t\tkind: \"provider_auth\",\n\t\t\t\tphase: \"provider\",\n\t\t\t\tcauseCode: \"provider.auth\",\n\t\t\t\tretryable: false,\n\t\t\t};\n\t\tcase \"rate_limit\":\n\t\t\treturn {\n\t\t\t\tkind: \"provider_rate_limit\",\n\t\t\t\tphase: \"provider\",\n\t\t\t\tcauseCode: \"provider.rate_limit\",\n\t\t\t\tretryable: true,\n\t\t\t};\n\t\tcase \"network\":\n\t\t\treturn {\n\t\t\t\tkind: \"provider_network\",\n\t\t\t\tphase: \"provider\",\n\t\t\t\tcauseCode: \"provider.network\",\n\t\t\t\tretryable: true,\n\t\t\t};\n\t\tcase \"protocol\":\n\t\t\t// Many \"protocol\" stops are sticky transcript shape bugs (orphan tool_call_id)\n\t\t\t// that succeed after transform-messages sanitizes and the turn is retried.\n\t\t\t// Mark retryable so auto-retry can heal; safeToAutoRetry stays false (needs sanitize path).\n\t\t\treturn {\n\t\t\t\tkind: \"provider_protocol\",\n\t\t\t\tphase: \"provider\",\n\t\t\t\tcauseCode: \"provider.protocol\",\n\t\t\t\tretryable: true,\n\t\t\t};\n\t\tcase \"context_overflow\":\n\t\t\treturn {\n\t\t\t\tkind: \"context_overflow\",\n\t\t\t\tphase: \"provider\",\n\t\t\t\tcauseCode: \"provider.context_overflow\",\n\t\t\t\tretryable: true,\n\t\t\t};\n\t\tcase \"refusal\":\n\t\t\treturn {\n\t\t\t\tkind: \"provider_refusal\",\n\t\t\t\tphase: \"provider\",\n\t\t\t\tcauseCode: \"provider.refusal\",\n\t\t\t\tretryable: true,\n\t\t\t};\n\t}\n}\n\nfunction classifyCause(cause: SessionTerminationCause, source: SessionTerminationSource): Classification {\n\tswitch (cause.area) {\n\t\tcase \"completed\":\n\t\t\treturn {\n\t\t\t\tkind: \"completed\",\n\t\t\t\tphase: \"completed\",\n\t\t\t\tcauseCode: \"session.completed\",\n\t\t\t\tretryable: false,\n\t\t\t};\n\t\tcase \"user\":\n\t\t\treturn {\n\t\t\t\tkind: \"user_abort\",\n\t\t\t\tphase: \"control\",\n\t\t\t\tcauseCode: \"session.user_abort\",\n\t\t\t\tretryable: false,\n\t\t\t};\n\t\tcase \"provider\":\n\t\t\treturn classifyProvider(cause.code);\n\t\tcase \"tool\":\n\t\t\treturn cause.code === \"timeout\"\n\t\t\t\t? { kind: \"tool_timeout\", phase: \"tool\", causeCode: \"tool.timeout\", retryable: true }\n\t\t\t\t: { kind: \"tool_fatal\", phase: \"tool\", causeCode: \"tool.fatal\", retryable: false };\n\t\tcase \"compaction\":\n\t\t\treturn {\n\t\t\t\tkind: \"compaction\",\n\t\t\t\tphase: \"compaction\",\n\t\t\t\tcauseCode: `compaction.${cause.code}`,\n\t\t\t\t// Quota exhaustion does not heal by retrying: same-model retries\n\t\t\t\t// keep failing until the provider cycle resets or the model changes.\n\t\t\t\tretryable: cause.code !== \"quota_exhausted\",\n\t\t\t};\n\t\tcase \"persistence\":\n\t\t\treturn {\n\t\t\t\tkind: \"persistence\",\n\t\t\t\tphase: \"persistence\",\n\t\t\t\tcauseCode: `persistence.${cause.code}`,\n\t\t\t\tretryable: true,\n\t\t\t};\n\t\tcase \"process\":\n\t\t\tif (cause.code === \"signal\") {\n\t\t\t\treturn {\n\t\t\t\t\tkind: \"process_signal\",\n\t\t\t\t\tphase: \"process\",\n\t\t\t\t\tcauseCode: \"process.signal\",\n\t\t\t\t\tretryable: false,\n\t\t\t\t\tprocessSignal: cause.signal,\n\t\t\t\t};\n\t\t\t}\n\t\t\treturn {\n\t\t\t\tkind: \"process_crash\",\n\t\t\t\tphase: \"resume\",\n\t\t\t\tcauseCode: \"process.crash\",\n\t\t\t\tretryable: true,\n\t\t\t};\n\t\tcase \"transcript\":\n\t\t\treturn {\n\t\t\t\tkind: \"transcript_invalid\",\n\t\t\t\tphase: source === \"inferred_on_resume\" ? \"resume\" : \"preflight\",\n\t\t\t\tcauseCode: `transcript.${cause.code}`,\n\t\t\t\tretryable: false,\n\t\t\t\ttranscriptIssue: cause.code,\n\t\t\t};\n\t\tcase \"configuration\":\n\t\t\treturn {\n\t\t\t\tkind: \"configuration\",\n\t\t\t\tphase: \"preflight\",\n\t\t\t\tcauseCode: \"configuration.invalid\",\n\t\t\t\tretryable: false,\n\t\t\t};\n\t\tcase \"internal\":\n\t\t\treturn {\n\t\t\t\tkind: \"internal_error\",\n\t\t\t\tphase: \"preflight\",\n\t\t\t\tcauseCode: \"internal.unclassified\",\n\t\t\t\tretryable: false,\n\t\t\t};\n\t\tcase \"budget\":\n\t\t\treturn { kind: \"budget_exhausted\", phase: \"control\", causeCode: `budget.${cause.code}`, retryable: false };\n\t\tcase \"resource\":\n\t\t\t// §15.4: every resource cause is retryable; queue overflow surfaces at\n\t\t\t// the tool boundary, everything else at preflight admission.\n\t\t\treturn {\n\t\t\t\tkind: \"resource_pressure\",\n\t\t\t\tphase: cause.code === \"queue_overflow\" ? \"tool\" : \"preflight\",\n\t\t\t\tcauseCode: `resource.${cause.code}`,\n\t\t\t\tretryable: true,\n\t\t\t};\n\t}\n}\n\nfunction isSafeToAutoRetry(classification: Classification, input: ClassifySessionTerminationInput): boolean {\n\t// provider_refusal: Fable/Claude often false-positive on benign turns. Safe to auto-retry once\n\t// when no tool side effects occurred (same class of recovery as rate_limit/network).\n\treturn (\n\t\tclassification.retryable &&\n\t\tinput.source === \"observed\" &&\n\t\tinput.sideEffects === \"none\" &&\n\t\t(classification.kind === \"provider_rate_limit\" ||\n\t\t\tclassification.kind === \"provider_network\" ||\n\t\t\tclassification.kind === \"provider_refusal\" ||\n\t\t\t// §15.4 mapping: only cpu pressure is safe to auto-retry (with delay).\n\t\t\tclassification.causeCode === \"resource.cpu\")\n\t);\n}\n\nfunction nextActionFor(classification: Classification, input: ClassifySessionTerminationInput): string {\n\tswitch (classification.kind) {\n\t\tcase \"completed\":\n\t\t\treturn \"No recovery action is required; continue with the next prompt.\";\n\t\tcase \"user_abort\":\n\t\t\treturn \"Review possible partial side effects, then retry only if intended.\";\n\t\tcase \"budget_exhausted\":\n\t\t\treturn \"Review partial work and remaining requests; start a new run only with an explicitly approved budget.\";\n\t\tcase \"resource_pressure\":\n\t\t\treturn \"Host resources are constrained; reduce load or wait for recovery, then retry.\";\n\t\tcase \"provider_abort\":\n\t\t\treturn \"Confirm provider availability, then retry the request.\";\n\t\tcase \"provider_auth\":\n\t\t\t// A credential-less install resolves a placeholder model whose provider is\n\t\t\t// literally \"unknown\"; never echo that back as a login target.\n\t\t\treturn `Run /login${input.provider && input.provider !== \"unknown\" ? ` ${input.provider}` : \"\"} in an interactive session, or set the provider's API key environment variable, then retry.`;\n\t\tcase \"provider_rate_limit\":\n\t\t\treturn \"Wait for the provider retry window or choose another model, then retry.\";\n\t\tcase \"provider_network\":\n\t\t\treturn \"Check network and provider connectivity, then retry.\";\n\t\tcase \"provider_protocol\":\n\t\t\treturn \"Often an orphan tool_call_id / sticky transcript after a dropped error turn — auto-retry after sanitize, or /new session if it persists.\";\n\t\tcase \"provider_refusal\":\n\t\t\treturn \"Model declined this turn (content/safety stop). Usually a false positive on Fable/Claude — auto-retry once, or switch model (k3/qwen3.8-max/grok-4.5/deepseek) / rephrase as a pure coding task.\";\n\t\tcase \"context_overflow\":\n\t\t\treturn \"Compact or reduce context, or switch to a larger-context model.\";\n\t\tcase \"tool_timeout\":\n\t\t\treturn \"Inspect possible tool side effects and increase the tool timeout only if safe.\";\n\t\tcase \"tool_fatal\":\n\t\t\treturn \"Inspect the failed tool result and repair its configuration before retrying.\";\n\t\tcase \"compaction\":\n\t\t\tswitch (classification.causeCode) {\n\t\t\t\tcase \"compaction.aborted\":\n\t\t\t\t\treturn \"Retry /compact if cancellation was unintended; avoid Escape while compaction is running.\";\n\t\t\t\tcase \"compaction.stale\":\n\t\t\t\t\treturn \"Retry /compact after pending session changes settle.\";\n\t\t\t\tcase \"compaction.quota_exhausted\":\n\t\t\t\t\treturn \"The summarization model's quota is exhausted — retrying cannot help yet. Switch model (/model), set compaction.model in settings, or wait for the quota reset, then retry /compact. OMK already tried the failover chain automatically.\";\n\t\t\t\tdefault:\n\t\t\t\t\treturn \"Resolve the reported compaction error, then retry /compact.\";\n\t\t\t}\n\t\tcase \"persistence\":\n\t\t\treturn `Run omk session doctor --session ${input.sessionId} before resuming.`;\n\t\tcase \"process_signal\":\n\t\t\treturn \"Review possible partial side effects before resuming the session.\";\n\t\tcase \"process_crash\":\n\t\t\treturn `Run omk session doctor --session ${input.sessionId} and review partial side effects.`;\n\t\tcase \"transcript_invalid\":\n\t\t\treturn `Run omk session doctor --session ${input.sessionId}; do not resume until integrity passes.`;\n\t\tcase \"configuration\":\n\t\t\treturn \"This model or client is not valid for the current login. Switch with /model or fix provider/client settings; /new session will not grant access.\";\n\t\tcase \"internal_error\":\n\t\t\treturn `Inspect run ${input.runId} diagnostics and the run journal before retrying.`;\n\t}\n}\n\n/** Concise actionable rendering shared by non-JSON and TUI surfaces. */\nexport function formatSessionTermination(termination: SessionTermination): string {\n\tconst route =\n\t\ttermination.provider || termination.model\n\t\t\t? `${termination.provider ?? \"unknown\"}/${termination.model ?? \"unknown\"}`\n\t\t\t: \"n/a\";\n\treturn [\n\t\t`kind=${termination.kind}`,\n\t\t`provider/model=${route}`,\n\t\t`retryable=${termination.retryable}`,\n\t\t`cause=${termination.causeCode}`,\n\t\t`message=${termination.message}`,\n\t\t`run=${termination.runId}`,\n\t\t`next=${termination.nextAction}`,\n\t].join(\" \");\n}\n\n/**\n * Classify a bounded, structured termination cause. This intentionally accepts\n * no raw Error value, stack, provider body, or arbitrary cause code.\n */\nexport function classifySessionTermination(input: ClassifySessionTerminationInput): SessionTermination {\n\tassertClassifierInput(input);\n\tassertIdentifier(input.sessionId, \"sessionId\", 128);\n\tassertIdentifier(input.runId, \"runId\", 128);\n\tassertTimestamp(input.timestamp);\n\tassertPreRedactedTerminationMessage(input.message);\n\tif (input.provider !== undefined) assertIdentifier(input.provider, \"provider\", 128);\n\tif (input.model !== undefined) assertIdentifier(input.model, \"model\", 256);\n\tif (input.toolCallId !== undefined) assertIdentifier(input.toolCallId, \"toolCallId\", 512);\n\tif (input.toolName !== undefined) assertIdentifier(input.toolName, \"toolName\", 128);\n\tif (input.retryAfterMs !== undefined && (!Number.isSafeInteger(input.retryAfterMs) || input.retryAfterMs < 0)) {\n\t\tthrow new TypeError(\"retryAfterMs must be a non-negative safe integer\");\n\t}\n\tif (input.cause.area === \"process\" && input.cause.code === \"crash\" && input.source !== \"inferred_on_resume\") {\n\t\tthrow new TypeError(\"process crashes may only be classified as inferred_on_resume\");\n\t}\n\tif (input.cause.area === \"process\" && input.cause.code === \"signal\" && input.source !== \"observed\") {\n\t\tthrow new TypeError(\"process signals must be observed\");\n\t}\n\n\tconst classification = classifyCause(input.cause, input.source);\n\treturn Object.freeze({\n\t\tschemaVersion: SESSION_TERMINATION_SCHEMA_VERSION,\n\t\tsessionId: input.sessionId,\n\t\trunId: input.runId,\n\t\tkind: classification.kind,\n\t\tphase: classification.phase,\n\t\tsource: input.source,\n\t\tmessage: input.message,\n\t\tcauseCode: classification.causeCode,\n\t\tnextAction: nextActionFor(classification, input),\n\t\tretryable: classification.retryable,\n\t\tsafeToAutoRetry: isSafeToAutoRetry(classification, input),\n\t\tsideEffects: input.sideEffects,\n\t\ttimestamp: input.timestamp,\n\t\t...(input.retryAfterMs === undefined ? {} : { retryAfterMs: input.retryAfterMs }),\n\t\t...(input.provider === undefined ? {} : { provider: input.provider }),\n\t\t...(input.model === undefined ? {} : { model: input.model }),\n\t\t...(input.toolCallId === undefined ? {} : { toolCallId: input.toolCallId }),\n\t\t...(input.toolName === undefined ? {} : { toolName: input.toolName }),\n\t\t...(classification.processSignal === undefined ? {} : { processSignal: classification.processSignal }),\n\t\t...(classification.transcriptIssue === undefined ? {} : { transcriptIssue: classification.transcriptIssue }),\n\t});\n}\n"]}
@@ -0,0 +1,40 @@
1
+ /** Documented lane grant cap: load at most 2–3 skills. */
2
+ export declare const MAX_SELECTED_SKILLS = 3;
3
+ /** Coverage at/above which a skill is a confident match. */
4
+ export declare const SKILL_STRONG_THRESHOLD = 0.7;
5
+ /**
6
+ * Minimum score to grant a skill. Neutral (no-query) relevance is 0.3, so the
7
+ * weak floor sits above that and ignores idle overlap.
8
+ */
9
+ export declare const SKILL_WEAK_THRESHOLD = 0.35;
10
+ /** If the runner-up is within this margin of a tentative leader, flag ambiguous. */
11
+ export declare const SKILL_AMBIGUITY_MARGIN = 0.08;
12
+ type SkillConfidence = "confident" | "tentative" | "fallback";
13
+ export interface SkillCandidate {
14
+ readonly name: string;
15
+ readonly description: string;
16
+ }
17
+ interface SkillScore {
18
+ readonly name: string;
19
+ readonly score: number;
20
+ }
21
+ interface SelectedSkill extends SkillScore {
22
+ readonly description: string;
23
+ }
24
+ export interface SelectSkillsInput {
25
+ readonly task: string;
26
+ readonly skills: readonly SkillCandidate[];
27
+ readonly max?: number;
28
+ /** Path segments become independent, camelCase-aware skill-name signals. */
29
+ readonly paths?: readonly string[];
30
+ }
31
+ export interface SkillSelectionResult {
32
+ readonly selected: readonly SelectedSkill[];
33
+ readonly scores: readonly SkillScore[];
34
+ readonly confidence: SkillConfidence;
35
+ readonly ambiguous: boolean;
36
+ readonly reason: string;
37
+ }
38
+ export declare function selectSkills(input: SelectSkillsInput): SkillSelectionResult;
39
+ export {};
40
+ //# sourceMappingURL=skill-selector.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"skill-selector.d.ts","sourceRoot":"","sources":["../../src/core/skill-selector.ts"],"names":[],"mappings":"AAYA,4DAA0D;AAC1D,eAAO,MAAM,mBAAmB,IAAI,CAAC;AACrC,4DAA4D;AAC5D,eAAO,MAAM,sBAAsB,MAAM,CAAC;AAC1C;;;GAGG;AACH,eAAO,MAAM,oBAAoB,OAAO,CAAC;AACzC,oFAAoF;AACpF,eAAO,MAAM,sBAAsB,OAAO,CAAC;AAE3C,KAAK,eAAe,GAAG,WAAW,GAAG,WAAW,GAAG,UAAU,CAAC;AAE9D,MAAM,WAAW,cAAc;IAC9B,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC;CAC7B;AAED,UAAU,UAAU;IACnB,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;CACvB;AAED,UAAU,aAAc,SAAQ,UAAU;IACzC,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC;CAC7B;AAED,MAAM,WAAW,iBAAiB;IACjC,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,MAAM,EAAE,SAAS,cAAc,EAAE,CAAC;IAC3C,QAAQ,CAAC,GAAG,CAAC,EAAE,MAAM,CAAC;IACtB,4EAA4E;IAC5E,QAAQ,CAAC,KAAK,CAAC,EAAE,SAAS,MAAM,EAAE,CAAC;CACnC;AAED,MAAM,WAAW,oBAAoB;IACpC,QAAQ,CAAC,QAAQ,EAAE,SAAS,aAAa,EAAE,CAAC;IAC5C,QAAQ,CAAC,MAAM,EAAE,SAAS,UAAU,EAAE,CAAC;IACvC,QAAQ,CAAC,UAAU,EAAE,eAAe,CAAC;IACrC,QAAQ,CAAC,SAAS,EAAE,OAAO,CAAC;IAC5B,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;CACxB;AAED,wBAAgB,YAAY,CAAC,KAAK,EAAE,iBAAiB,GAAG,oBAAoB,CAgD3E","sourcesContent":["/**\n * Query-aware skill grant selection.\n *\n * Scores candidates with {@link scoreSkillRelevance}, then applies the same\n * ranking/confidence shape as domain routing: weak/strong thresholds, a 2–3\n * skill cap, input-order ties, and an ambiguity flag when a tentative leader\n * is within the documented margin of the runner-up.\n *\n * I/O-free. Callers still decide whether to mark the result active.\n */\nimport { scoreSkillRelevance } from \"./context-budget-relevance.ts\";\n\n/** Documented lane grant cap: load at most 2–3 skills. */\nexport const MAX_SELECTED_SKILLS = 3;\n/** Coverage at/above which a skill is a confident match. */\nexport const SKILL_STRONG_THRESHOLD = 0.7;\n/**\n * Minimum score to grant a skill. Neutral (no-query) relevance is 0.3, so the\n * weak floor sits above that and ignores idle overlap.\n */\nexport const SKILL_WEAK_THRESHOLD = 0.35;\n/** If the runner-up is within this margin of a tentative leader, flag ambiguous. */\nexport const SKILL_AMBIGUITY_MARGIN = 0.08;\n\ntype SkillConfidence = \"confident\" | \"tentative\" | \"fallback\";\n\nexport interface SkillCandidate {\n\treadonly name: string;\n\treadonly description: string;\n}\n\ninterface SkillScore {\n\treadonly name: string;\n\treadonly score: number;\n}\n\ninterface SelectedSkill extends SkillScore {\n\treadonly description: string;\n}\n\nexport interface SelectSkillsInput {\n\treadonly task: string;\n\treadonly skills: readonly SkillCandidate[];\n\treadonly max?: number;\n\t/** Path segments become independent, camelCase-aware skill-name signals. */\n\treadonly paths?: readonly string[];\n}\n\nexport interface SkillSelectionResult {\n\treadonly selected: readonly SelectedSkill[];\n\treadonly scores: readonly SkillScore[];\n\treadonly confidence: SkillConfidence;\n\treadonly ambiguous: boolean;\n\treadonly reason: string;\n}\n\nexport function selectSkills(input: SelectSkillsInput): SkillSelectionResult {\n\tconst task = input.task.trim();\n\tconst pathTokens = pathHintTokens(input.paths);\n\tconst max = resolveMax(input.max);\n\tconst skills = uniqueSkills(input.skills);\n\tif ((task === \"\" && pathTokens.length === 0) || skills.length === 0) {\n\t\treturn fallback([], \"no skill signals detected\");\n\t}\n\n\tconst ranked = skills\n\t\t.map((skill, index) => {\n\t\t\tlet score = task === \"\" ? 0 : scoreSkillRelevance(skill, task);\n\t\t\tconst pathIdentity = { name: skill.name, description: \"\" };\n\t\t\tfor (const token of pathTokens) {\n\t\t\t\tscore = Math.max(score, scoreSkillRelevance(pathIdentity, token));\n\t\t\t}\n\t\t\treturn { skill, index, score };\n\t\t})\n\t\t.sort((left, right) => {\n\t\t\tif (right.score !== left.score) return right.score - left.score;\n\t\t\treturn left.index - right.index;\n\t\t});\n\n\tconst scores: SkillScore[] = ranked.map((entry) => ({ name: entry.skill.name, score: entry.score }));\n\tconst aboveWeak = ranked.filter((entry) => entry.score >= SKILL_WEAK_THRESHOLD);\n\tif (aboveWeak.length === 0) {\n\t\treturn fallback(scores, \"no skill signals detected\");\n\t}\n\n\tconst leader = aboveWeak[0];\n\tif (!leader) {\n\t\treturn fallback(scores, \"no skill signals detected\");\n\t}\n\tconst selected = aboveWeak.slice(0, Math.max(0, max)).map((entry) => ({\n\t\tname: entry.skill.name,\n\t\tdescription: entry.skill.description,\n\t\tscore: entry.score,\n\t}));\n\tconst runner = aboveWeak[1];\n\tconst confidence: SkillConfidence = leader.score >= SKILL_STRONG_THRESHOLD ? \"confident\" : \"tentative\";\n\tconst ambiguous =\n\t\tconfidence === \"tentative\" && runner !== undefined && leader.score - runner.score <= SKILL_AMBIGUITY_MARGIN;\n\tconst reason =\n\t\tambiguous && runner\n\t\t\t? `ambiguous: ${leader.skill.name}(${formatScore(leader.score)}) vs ${runner.skill.name}(${formatScore(runner.score)})`\n\t\t\t: `${leader.skill.name} selected (${formatScore(leader.score)})`;\n\n\treturn { selected, scores, confidence, ambiguous, reason };\n}\n\nfunction fallback(scores: readonly SkillScore[], reason: string): SkillSelectionResult {\n\treturn { selected: [], scores, confidence: \"fallback\", ambiguous: false, reason };\n}\n\nfunction formatScore(score: number): string {\n\treturn score.toFixed(2);\n}\n\nfunction resolveMax(max: number | undefined): number {\n\tif (max === undefined || !Number.isFinite(max) || max < 0) return MAX_SELECTED_SKILLS;\n\treturn Math.min(Math.floor(max), MAX_SELECTED_SKILLS);\n}\n\nfunction uniqueSkills(skills: readonly SkillCandidate[]): SkillCandidate[] {\n\tconst seen = new Set<string>();\n\tconst unique: SkillCandidate[] = [];\n\tfor (const skill of skills) {\n\t\tif (seen.has(skill.name)) continue;\n\t\tseen.add(skill.name);\n\t\tunique.push(skill);\n\t}\n\treturn unique;\n}\n\nfunction pathHintTokens(paths: readonly string[] | undefined): string[] {\n\tif (!paths || paths.length === 0) return [];\n\tconst tokens = new Set<string>();\n\tfor (const path of paths) {\n\t\tconst splitCase = path.replace(/([A-Z]+)([A-Z][a-z])/g, \"$1 $2\").replace(/([a-z0-9])([A-Z])/g, \"$1 $2\");\n\t\tfor (const raw of splitCase.toLowerCase().split(/[/\\\\._\\s-]+/)) {\n\t\t\tif (raw.length > 0) tokens.add(raw);\n\t\t}\n\t}\n\treturn [...tokens];\n}\n"]}
@@ -0,0 +1,102 @@
1
+ /**
2
+ * Query-aware skill grant selection.
3
+ *
4
+ * Scores candidates with {@link scoreSkillRelevance}, then applies the same
5
+ * ranking/confidence shape as domain routing: weak/strong thresholds, a 2–3
6
+ * skill cap, input-order ties, and an ambiguity flag when a tentative leader
7
+ * is within the documented margin of the runner-up.
8
+ *
9
+ * I/O-free. Callers still decide whether to mark the result active.
10
+ */
11
+ import { scoreSkillRelevance } from "./context-budget-relevance.js";
12
+ /** Documented lane grant cap: load at most 2–3 skills. */
13
+ export const MAX_SELECTED_SKILLS = 3;
14
+ /** Coverage at/above which a skill is a confident match. */
15
+ export const SKILL_STRONG_THRESHOLD = 0.7;
16
+ /**
17
+ * Minimum score to grant a skill. Neutral (no-query) relevance is 0.3, so the
18
+ * weak floor sits above that and ignores idle overlap.
19
+ */
20
+ export const SKILL_WEAK_THRESHOLD = 0.35;
21
+ /** If the runner-up is within this margin of a tentative leader, flag ambiguous. */
22
+ export const SKILL_AMBIGUITY_MARGIN = 0.08;
23
+ export function selectSkills(input) {
24
+ const task = input.task.trim();
25
+ const pathTokens = pathHintTokens(input.paths);
26
+ const max = resolveMax(input.max);
27
+ const skills = uniqueSkills(input.skills);
28
+ if ((task === "" && pathTokens.length === 0) || skills.length === 0) {
29
+ return fallback([], "no skill signals detected");
30
+ }
31
+ const ranked = skills
32
+ .map((skill, index) => {
33
+ let score = task === "" ? 0 : scoreSkillRelevance(skill, task);
34
+ const pathIdentity = { name: skill.name, description: "" };
35
+ for (const token of pathTokens) {
36
+ score = Math.max(score, scoreSkillRelevance(pathIdentity, token));
37
+ }
38
+ return { skill, index, score };
39
+ })
40
+ .sort((left, right) => {
41
+ if (right.score !== left.score)
42
+ return right.score - left.score;
43
+ return left.index - right.index;
44
+ });
45
+ const scores = ranked.map((entry) => ({ name: entry.skill.name, score: entry.score }));
46
+ const aboveWeak = ranked.filter((entry) => entry.score >= SKILL_WEAK_THRESHOLD);
47
+ if (aboveWeak.length === 0) {
48
+ return fallback(scores, "no skill signals detected");
49
+ }
50
+ const leader = aboveWeak[0];
51
+ if (!leader) {
52
+ return fallback(scores, "no skill signals detected");
53
+ }
54
+ const selected = aboveWeak.slice(0, Math.max(0, max)).map((entry) => ({
55
+ name: entry.skill.name,
56
+ description: entry.skill.description,
57
+ score: entry.score,
58
+ }));
59
+ const runner = aboveWeak[1];
60
+ const confidence = leader.score >= SKILL_STRONG_THRESHOLD ? "confident" : "tentative";
61
+ const ambiguous = confidence === "tentative" && runner !== undefined && leader.score - runner.score <= SKILL_AMBIGUITY_MARGIN;
62
+ const reason = ambiguous && runner
63
+ ? `ambiguous: ${leader.skill.name}(${formatScore(leader.score)}) vs ${runner.skill.name}(${formatScore(runner.score)})`
64
+ : `${leader.skill.name} selected (${formatScore(leader.score)})`;
65
+ return { selected, scores, confidence, ambiguous, reason };
66
+ }
67
+ function fallback(scores, reason) {
68
+ return { selected: [], scores, confidence: "fallback", ambiguous: false, reason };
69
+ }
70
+ function formatScore(score) {
71
+ return score.toFixed(2);
72
+ }
73
+ function resolveMax(max) {
74
+ if (max === undefined || !Number.isFinite(max) || max < 0)
75
+ return MAX_SELECTED_SKILLS;
76
+ return Math.min(Math.floor(max), MAX_SELECTED_SKILLS);
77
+ }
78
+ function uniqueSkills(skills) {
79
+ const seen = new Set();
80
+ const unique = [];
81
+ for (const skill of skills) {
82
+ if (seen.has(skill.name))
83
+ continue;
84
+ seen.add(skill.name);
85
+ unique.push(skill);
86
+ }
87
+ return unique;
88
+ }
89
+ function pathHintTokens(paths) {
90
+ if (!paths || paths.length === 0)
91
+ return [];
92
+ const tokens = new Set();
93
+ for (const path of paths) {
94
+ const splitCase = path.replace(/([A-Z]+)([A-Z][a-z])/g, "$1 $2").replace(/([a-z0-9])([A-Z])/g, "$1 $2");
95
+ for (const raw of splitCase.toLowerCase().split(/[/\\._\s-]+/)) {
96
+ if (raw.length > 0)
97
+ tokens.add(raw);
98
+ }
99
+ }
100
+ return [...tokens];
101
+ }
102
+ //# sourceMappingURL=skill-selector.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"skill-selector.js","sourceRoot":"","sources":["../../src/core/skill-selector.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * Query-aware skill grant selection.\n *\n * Scores candidates with {@link scoreSkillRelevance}, then applies the same\n * ranking/confidence shape as domain routing: weak/strong thresholds, a 2–3\n * skill cap, input-order ties, and an ambiguity flag when a tentative leader\n * is within the documented margin of the runner-up.\n *\n * I/O-free. Callers still decide whether to mark the result active.\n */\nimport { scoreSkillRelevance } from \"./context-budget-relevance.ts\";\n\n/** Documented lane grant cap: load at most 2–3 skills. */\nexport const MAX_SELECTED_SKILLS = 3;\n/** Coverage at/above which a skill is a confident match. */\nexport const SKILL_STRONG_THRESHOLD = 0.7;\n/**\n * Minimum score to grant a skill. Neutral (no-query) relevance is 0.3, so the\n * weak floor sits above that and ignores idle overlap.\n */\nexport const SKILL_WEAK_THRESHOLD = 0.35;\n/** If the runner-up is within this margin of a tentative leader, flag ambiguous. */\nexport const SKILL_AMBIGUITY_MARGIN = 0.08;\n\ntype SkillConfidence = \"confident\" | \"tentative\" | \"fallback\";\n\nexport interface SkillCandidate {\n\treadonly name: string;\n\treadonly description: string;\n}\n\ninterface SkillScore {\n\treadonly name: string;\n\treadonly score: number;\n}\n\ninterface SelectedSkill extends SkillScore {\n\treadonly description: string;\n}\n\nexport interface SelectSkillsInput {\n\treadonly task: string;\n\treadonly skills: readonly SkillCandidate[];\n\treadonly max?: number;\n\t/** Path segments become independent, camelCase-aware skill-name signals. */\n\treadonly paths?: readonly string[];\n}\n\nexport interface SkillSelectionResult {\n\treadonly selected: readonly SelectedSkill[];\n\treadonly scores: readonly SkillScore[];\n\treadonly confidence: SkillConfidence;\n\treadonly ambiguous: boolean;\n\treadonly reason: string;\n}\n\nexport function selectSkills(input: SelectSkillsInput): SkillSelectionResult {\n\tconst task = input.task.trim();\n\tconst pathTokens = pathHintTokens(input.paths);\n\tconst max = resolveMax(input.max);\n\tconst skills = uniqueSkills(input.skills);\n\tif ((task === \"\" && pathTokens.length === 0) || skills.length === 0) {\n\t\treturn fallback([], \"no skill signals detected\");\n\t}\n\n\tconst ranked = skills\n\t\t.map((skill, index) => {\n\t\t\tlet score = task === \"\" ? 0 : scoreSkillRelevance(skill, task);\n\t\t\tconst pathIdentity = { name: skill.name, description: \"\" };\n\t\t\tfor (const token of pathTokens) {\n\t\t\t\tscore = Math.max(score, scoreSkillRelevance(pathIdentity, token));\n\t\t\t}\n\t\t\treturn { skill, index, score };\n\t\t})\n\t\t.sort((left, right) => {\n\t\t\tif (right.score !== left.score) return right.score - left.score;\n\t\t\treturn left.index - right.index;\n\t\t});\n\n\tconst scores: SkillScore[] = ranked.map((entry) => ({ name: entry.skill.name, score: entry.score }));\n\tconst aboveWeak = ranked.filter((entry) => entry.score >= SKILL_WEAK_THRESHOLD);\n\tif (aboveWeak.length === 0) {\n\t\treturn fallback(scores, \"no skill signals detected\");\n\t}\n\n\tconst leader = aboveWeak[0];\n\tif (!leader) {\n\t\treturn fallback(scores, \"no skill signals detected\");\n\t}\n\tconst selected = aboveWeak.slice(0, Math.max(0, max)).map((entry) => ({\n\t\tname: entry.skill.name,\n\t\tdescription: entry.skill.description,\n\t\tscore: entry.score,\n\t}));\n\tconst runner = aboveWeak[1];\n\tconst confidence: SkillConfidence = leader.score >= SKILL_STRONG_THRESHOLD ? \"confident\" : \"tentative\";\n\tconst ambiguous =\n\t\tconfidence === \"tentative\" && runner !== undefined && leader.score - runner.score <= SKILL_AMBIGUITY_MARGIN;\n\tconst reason =\n\t\tambiguous && runner\n\t\t\t? `ambiguous: ${leader.skill.name}(${formatScore(leader.score)}) vs ${runner.skill.name}(${formatScore(runner.score)})`\n\t\t\t: `${leader.skill.name} selected (${formatScore(leader.score)})`;\n\n\treturn { selected, scores, confidence, ambiguous, reason };\n}\n\nfunction fallback(scores: readonly SkillScore[], reason: string): SkillSelectionResult {\n\treturn { selected: [], scores, confidence: \"fallback\", ambiguous: false, reason };\n}\n\nfunction formatScore(score: number): string {\n\treturn score.toFixed(2);\n}\n\nfunction resolveMax(max: number | undefined): number {\n\tif (max === undefined || !Number.isFinite(max) || max < 0) return MAX_SELECTED_SKILLS;\n\treturn Math.min(Math.floor(max), MAX_SELECTED_SKILLS);\n}\n\nfunction uniqueSkills(skills: readonly SkillCandidate[]): SkillCandidate[] {\n\tconst seen = new Set<string>();\n\tconst unique: SkillCandidate[] = [];\n\tfor (const skill of skills) {\n\t\tif (seen.has(skill.name)) continue;\n\t\tseen.add(skill.name);\n\t\tunique.push(skill);\n\t}\n\treturn unique;\n}\n\nfunction pathHintTokens(paths: readonly string[] | undefined): string[] {\n\tif (!paths || paths.length === 0) return [];\n\tconst tokens = new Set<string>();\n\tfor (const path of paths) {\n\t\tconst splitCase = path.replace(/([A-Z]+)([A-Z][a-z])/g, \"$1 $2\").replace(/([a-z0-9])([A-Z])/g, \"$1 $2\");\n\t\tfor (const raw of splitCase.toLowerCase().split(/[/\\\\._\\s-]+/)) {\n\t\t\tif (raw.length > 0) tokens.add(raw);\n\t\t}\n\t}\n\treturn [...tokens];\n}\n"]}
@@ -1 +1 @@
1
- {"version":3,"file":"slash-commands.d.ts","sourceRoot":"","sources":["../../src/core/slash-commands.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;AAEnD,MAAM,MAAM,kBAAkB,GAAG,WAAW,GAAG,QAAQ,GAAG,OAAO,CAAC;AAElE,MAAM,WAAW,gBAAgB;IAChC,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,MAAM,EAAE,kBAAkB,CAAC;IAC3B,UAAU,EAAE,UAAU,CAAC;CACvB;AAED,MAAM,WAAW,mBAAmB;IACnC,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,EAAE,MAAM,CAAC;CACpB;AAED,eAAO,MAAM,sBAAsB,EAAE,aAAa,CAAC,mBAAmB,CA4BrE,CAAC","sourcesContent":["import { APP_NAME } from \"../config.ts\";\nimport type { SourceInfo } from \"./source-info.ts\";\n\nexport type SlashCommandSource = \"extension\" | \"prompt\" | \"skill\";\n\nexport interface SlashCommandInfo {\n\tname: string;\n\tdescription?: string;\n\tsource: SlashCommandSource;\n\tsourceInfo: SourceInfo;\n}\n\nexport interface BuiltinSlashCommand {\n\tname: string;\n\tdescription: string;\n}\n\nexport const BUILTIN_SLASH_COMMANDS: ReadonlyArray<BuiltinSlashCommand> = [\n\t{ name: \"settings\", description: \"Open settings menu\" },\n\t{\n\t\tname: \"think\",\n\t\tdescription: \"Select thinking level (auto routes per task through v4)\",\n\t},\n\t{ name: \"model\", description: \"Select model (opens selector UI, then thinking selector)\" },\n\t{ name: \"scoped-models\", description: \"Enable/disable models for Ctrl+P cycling\" },\n\t{ name: \"export\", description: \"Export session (HTML default, or specify path: .html/.jsonl)\" },\n\t{ name: \"import\", description: \"Import and resume a session from a JSONL file\" },\n\t{ name: \"share\", description: \"Share session as a secret GitHub gist\" },\n\t{ name: \"copy\", description: \"Copy last agent message to clipboard\" },\n\t{ name: \"name\", description: \"Set session display name\" },\n\t{ name: \"session\", description: \"Show session info and stats\" },\n\t{ name: \"resource\", description: \"Show resource pressure and effective concurrency (probe|policy)\" },\n\t{ name: \"changelog\", description: \"Show changelog entries\" },\n\t{ name: \"star\", description: \"Open the OMK GitHub repository\" },\n\t{ name: \"hotkeys\", description: \"Show all keyboard shortcuts\" },\n\t{ name: \"fork\", description: \"Create a new fork from a previous user message\" },\n\t{ name: \"clone\", description: \"Duplicate the current session at the current position\" },\n\t{ name: \"tree\", description: \"Navigate session tree (switch branches)\" },\n\t{ name: \"login\", description: \"Configure provider authentication\" },\n\t{ name: \"logout\", description: \"Remove provider authentication\" },\n\t{ name: \"new\", description: \"Start a new session\" },\n\t{ name: \"compact\", description: \"Manually compact the session context\" },\n\t{ name: \"resume\", description: \"Resume a different session\" },\n\t{ name: \"reload\", description: \"Reload keybindings, extensions, skills, prompts, and themes\" },\n\t{ name: \"quit\", description: `Quit ${APP_NAME}` },\n];\n"]}
1
+ {"version":3,"file":"slash-commands.d.ts","sourceRoot":"","sources":["../../src/core/slash-commands.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;AAEnD,MAAM,MAAM,kBAAkB,GAAG,WAAW,GAAG,QAAQ,GAAG,OAAO,CAAC;AAElE,MAAM,WAAW,gBAAgB;IAChC,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,MAAM,EAAE,kBAAkB,CAAC;IAC3B,UAAU,EAAE,UAAU,CAAC;CACvB;AAED,MAAM,WAAW,mBAAmB;IACnC,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,EAAE,MAAM,CAAC;CACpB;AAED,eAAO,MAAM,sBAAsB,EAAE,aAAa,CAAC,mBAAmB,CA6BrE,CAAC","sourcesContent":["import { APP_NAME } from \"../config.ts\";\nimport type { SourceInfo } from \"./source-info.ts\";\n\nexport type SlashCommandSource = \"extension\" | \"prompt\" | \"skill\";\n\nexport interface SlashCommandInfo {\n\tname: string;\n\tdescription?: string;\n\tsource: SlashCommandSource;\n\tsourceInfo: SourceInfo;\n}\n\nexport interface BuiltinSlashCommand {\n\tname: string;\n\tdescription: string;\n}\n\nexport const BUILTIN_SLASH_COMMANDS: ReadonlyArray<BuiltinSlashCommand> = [\n\t{ name: \"settings\", description: \"Open settings menu\" },\n\t{\n\t\tname: \"think\",\n\t\tdescription: \"Select thinking level (auto routes per task through v4)\",\n\t},\n\t{ name: \"model\", description: \"Select model (opens selector UI, then thinking selector)\" },\n\t{ name: \"scoped-models\", description: \"Enable/disable models for Ctrl+P cycling\" },\n\t{ name: \"export\", description: \"Export session (HTML default, or specify path: .html/.jsonl)\" },\n\t{ name: \"import\", description: \"Import and resume a session from a JSONL file\" },\n\t{ name: \"share\", description: \"Share session as a secret GitHub gist\" },\n\t{ name: \"copy\", description: \"Copy last agent message to clipboard\" },\n\t{ name: \"name\", description: \"Set session display name\" },\n\t{ name: \"session\", description: \"Show session info and stats\" },\n\t{ name: \"resource\", description: \"Show resource pressure and effective concurrency (probe|policy)\" },\n\t{ name: \"debug\", description: \"Preview local runtime diagnostics; save a metadata-only report with /debug save\" },\n\t{ name: \"changelog\", description: \"Show changelog entries\" },\n\t{ name: \"star\", description: \"Open the OMK GitHub repository\" },\n\t{ name: \"hotkeys\", description: \"Show all keyboard shortcuts\" },\n\t{ name: \"fork\", description: \"Create a new fork from a previous user message\" },\n\t{ name: \"clone\", description: \"Duplicate the current session at the current position\" },\n\t{ name: \"tree\", description: \"Navigate session tree (switch branches)\" },\n\t{ name: \"login\", description: \"Configure provider authentication\" },\n\t{ name: \"logout\", description: \"Remove provider authentication\" },\n\t{ name: \"new\", description: \"Start a new session\" },\n\t{ name: \"compact\", description: \"Manually compact the session context\" },\n\t{ name: \"resume\", description: \"Resume a different session\" },\n\t{ name: \"reload\", description: \"Reload keybindings, extensions, skills, prompts, and themes\" },\n\t{ name: \"quit\", description: `Quit ${APP_NAME}` },\n];\n"]}
@@ -14,6 +14,7 @@ export const BUILTIN_SLASH_COMMANDS = [
14
14
  { name: "name", description: "Set session display name" },
15
15
  { name: "session", description: "Show session info and stats" },
16
16
  { name: "resource", description: "Show resource pressure and effective concurrency (probe|policy)" },
17
+ { name: "debug", description: "Preview local runtime diagnostics; save a metadata-only report with /debug save" },
17
18
  { name: "changelog", description: "Show changelog entries" },
18
19
  { name: "star", description: "Open the OMK GitHub repository" },
19
20
  { name: "hotkeys", description: "Show all keyboard shortcuts" },
@@ -1 +1 @@
1
- {"version":3,"file":"slash-commands.js","sourceRoot":"","sources":["../../src/core/slash-commands.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,cAAc,CAAC;AAiBxC,MAAM,CAAC,MAAM,sBAAsB,GAAuC;IACzE,EAAE,IAAI,EAAE,UAAU,EAAE,WAAW,EAAE,oBAAoB,EAAE;IACvD;QACC,IAAI,EAAE,OAAO;QACb,WAAW,EAAE,yDAAyD;KACtE;IACD,EAAE,IAAI,EAAE,OAAO,EAAE,WAAW,EAAE,0DAA0D,EAAE;IAC1F,EAAE,IAAI,EAAE,eAAe,EAAE,WAAW,EAAE,0CAA0C,EAAE;IAClF,EAAE,IAAI,EAAE,QAAQ,EAAE,WAAW,EAAE,8DAA8D,EAAE;IAC/F,EAAE,IAAI,EAAE,QAAQ,EAAE,WAAW,EAAE,+CAA+C,EAAE;IAChF,EAAE,IAAI,EAAE,OAAO,EAAE,WAAW,EAAE,uCAAuC,EAAE;IACvE,EAAE,IAAI,EAAE,MAAM,EAAE,WAAW,EAAE,sCAAsC,EAAE;IACrE,EAAE,IAAI,EAAE,MAAM,EAAE,WAAW,EAAE,0BAA0B,EAAE;IACzD,EAAE,IAAI,EAAE,SAAS,EAAE,WAAW,EAAE,6BAA6B,EAAE;IAC/D,EAAE,IAAI,EAAE,UAAU,EAAE,WAAW,EAAE,iEAAiE,EAAE;IACpG,EAAE,IAAI,EAAE,WAAW,EAAE,WAAW,EAAE,wBAAwB,EAAE;IAC5D,EAAE,IAAI,EAAE,MAAM,EAAE,WAAW,EAAE,gCAAgC,EAAE;IAC/D,EAAE,IAAI,EAAE,SAAS,EAAE,WAAW,EAAE,6BAA6B,EAAE;IAC/D,EAAE,IAAI,EAAE,MAAM,EAAE,WAAW,EAAE,gDAAgD,EAAE;IAC/E,EAAE,IAAI,EAAE,OAAO,EAAE,WAAW,EAAE,uDAAuD,EAAE;IACvF,EAAE,IAAI,EAAE,MAAM,EAAE,WAAW,EAAE,yCAAyC,EAAE;IACxE,EAAE,IAAI,EAAE,OAAO,EAAE,WAAW,EAAE,mCAAmC,EAAE;IACnE,EAAE,IAAI,EAAE,QAAQ,EAAE,WAAW,EAAE,gCAAgC,EAAE;IACjE,EAAE,IAAI,EAAE,KAAK,EAAE,WAAW,EAAE,qBAAqB,EAAE;IACnD,EAAE,IAAI,EAAE,SAAS,EAAE,WAAW,EAAE,sCAAsC,EAAE;IACxE,EAAE,IAAI,EAAE,QAAQ,EAAE,WAAW,EAAE,4BAA4B,EAAE;IAC7D,EAAE,IAAI,EAAE,QAAQ,EAAE,WAAW,EAAE,6DAA6D,EAAE;IAC9F,EAAE,IAAI,EAAE,MAAM,EAAE,WAAW,EAAE,QAAQ,QAAQ,EAAE,EAAE;CACjD,CAAC","sourcesContent":["import { APP_NAME } from \"../config.ts\";\nimport type { SourceInfo } from \"./source-info.ts\";\n\nexport type SlashCommandSource = \"extension\" | \"prompt\" | \"skill\";\n\nexport interface SlashCommandInfo {\n\tname: string;\n\tdescription?: string;\n\tsource: SlashCommandSource;\n\tsourceInfo: SourceInfo;\n}\n\nexport interface BuiltinSlashCommand {\n\tname: string;\n\tdescription: string;\n}\n\nexport const BUILTIN_SLASH_COMMANDS: ReadonlyArray<BuiltinSlashCommand> = [\n\t{ name: \"settings\", description: \"Open settings menu\" },\n\t{\n\t\tname: \"think\",\n\t\tdescription: \"Select thinking level (auto routes per task through v4)\",\n\t},\n\t{ name: \"model\", description: \"Select model (opens selector UI, then thinking selector)\" },\n\t{ name: \"scoped-models\", description: \"Enable/disable models for Ctrl+P cycling\" },\n\t{ name: \"export\", description: \"Export session (HTML default, or specify path: .html/.jsonl)\" },\n\t{ name: \"import\", description: \"Import and resume a session from a JSONL file\" },\n\t{ name: \"share\", description: \"Share session as a secret GitHub gist\" },\n\t{ name: \"copy\", description: \"Copy last agent message to clipboard\" },\n\t{ name: \"name\", description: \"Set session display name\" },\n\t{ name: \"session\", description: \"Show session info and stats\" },\n\t{ name: \"resource\", description: \"Show resource pressure and effective concurrency (probe|policy)\" },\n\t{ name: \"changelog\", description: \"Show changelog entries\" },\n\t{ name: \"star\", description: \"Open the OMK GitHub repository\" },\n\t{ name: \"hotkeys\", description: \"Show all keyboard shortcuts\" },\n\t{ name: \"fork\", description: \"Create a new fork from a previous user message\" },\n\t{ name: \"clone\", description: \"Duplicate the current session at the current position\" },\n\t{ name: \"tree\", description: \"Navigate session tree (switch branches)\" },\n\t{ name: \"login\", description: \"Configure provider authentication\" },\n\t{ name: \"logout\", description: \"Remove provider authentication\" },\n\t{ name: \"new\", description: \"Start a new session\" },\n\t{ name: \"compact\", description: \"Manually compact the session context\" },\n\t{ name: \"resume\", description: \"Resume a different session\" },\n\t{ name: \"reload\", description: \"Reload keybindings, extensions, skills, prompts, and themes\" },\n\t{ name: \"quit\", description: `Quit ${APP_NAME}` },\n];\n"]}
1
+ {"version":3,"file":"slash-commands.js","sourceRoot":"","sources":["../../src/core/slash-commands.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,cAAc,CAAC;AAiBxC,MAAM,CAAC,MAAM,sBAAsB,GAAuC;IACzE,EAAE,IAAI,EAAE,UAAU,EAAE,WAAW,EAAE,oBAAoB,EAAE;IACvD;QACC,IAAI,EAAE,OAAO;QACb,WAAW,EAAE,yDAAyD;KACtE;IACD,EAAE,IAAI,EAAE,OAAO,EAAE,WAAW,EAAE,0DAA0D,EAAE;IAC1F,EAAE,IAAI,EAAE,eAAe,EAAE,WAAW,EAAE,0CAA0C,EAAE;IAClF,EAAE,IAAI,EAAE,QAAQ,EAAE,WAAW,EAAE,8DAA8D,EAAE;IAC/F,EAAE,IAAI,EAAE,QAAQ,EAAE,WAAW,EAAE,+CAA+C,EAAE;IAChF,EAAE,IAAI,EAAE,OAAO,EAAE,WAAW,EAAE,uCAAuC,EAAE;IACvE,EAAE,IAAI,EAAE,MAAM,EAAE,WAAW,EAAE,sCAAsC,EAAE;IACrE,EAAE,IAAI,EAAE,MAAM,EAAE,WAAW,EAAE,0BAA0B,EAAE;IACzD,EAAE,IAAI,EAAE,SAAS,EAAE,WAAW,EAAE,6BAA6B,EAAE;IAC/D,EAAE,IAAI,EAAE,UAAU,EAAE,WAAW,EAAE,iEAAiE,EAAE;IACpG,EAAE,IAAI,EAAE,OAAO,EAAE,WAAW,EAAE,iFAAiF,EAAE;IACjH,EAAE,IAAI,EAAE,WAAW,EAAE,WAAW,EAAE,wBAAwB,EAAE;IAC5D,EAAE,IAAI,EAAE,MAAM,EAAE,WAAW,EAAE,gCAAgC,EAAE;IAC/D,EAAE,IAAI,EAAE,SAAS,EAAE,WAAW,EAAE,6BAA6B,EAAE;IAC/D,EAAE,IAAI,EAAE,MAAM,EAAE,WAAW,EAAE,gDAAgD,EAAE;IAC/E,EAAE,IAAI,EAAE,OAAO,EAAE,WAAW,EAAE,uDAAuD,EAAE;IACvF,EAAE,IAAI,EAAE,MAAM,EAAE,WAAW,EAAE,yCAAyC,EAAE;IACxE,EAAE,IAAI,EAAE,OAAO,EAAE,WAAW,EAAE,mCAAmC,EAAE;IACnE,EAAE,IAAI,EAAE,QAAQ,EAAE,WAAW,EAAE,gCAAgC,EAAE;IACjE,EAAE,IAAI,EAAE,KAAK,EAAE,WAAW,EAAE,qBAAqB,EAAE;IACnD,EAAE,IAAI,EAAE,SAAS,EAAE,WAAW,EAAE,sCAAsC,EAAE;IACxE,EAAE,IAAI,EAAE,QAAQ,EAAE,WAAW,EAAE,4BAA4B,EAAE;IAC7D,EAAE,IAAI,EAAE,QAAQ,EAAE,WAAW,EAAE,6DAA6D,EAAE;IAC9F,EAAE,IAAI,EAAE,MAAM,EAAE,WAAW,EAAE,QAAQ,QAAQ,EAAE,EAAE;CACjD,CAAC","sourcesContent":["import { APP_NAME } from \"../config.ts\";\nimport type { SourceInfo } from \"./source-info.ts\";\n\nexport type SlashCommandSource = \"extension\" | \"prompt\" | \"skill\";\n\nexport interface SlashCommandInfo {\n\tname: string;\n\tdescription?: string;\n\tsource: SlashCommandSource;\n\tsourceInfo: SourceInfo;\n}\n\nexport interface BuiltinSlashCommand {\n\tname: string;\n\tdescription: string;\n}\n\nexport const BUILTIN_SLASH_COMMANDS: ReadonlyArray<BuiltinSlashCommand> = [\n\t{ name: \"settings\", description: \"Open settings menu\" },\n\t{\n\t\tname: \"think\",\n\t\tdescription: \"Select thinking level (auto routes per task through v4)\",\n\t},\n\t{ name: \"model\", description: \"Select model (opens selector UI, then thinking selector)\" },\n\t{ name: \"scoped-models\", description: \"Enable/disable models for Ctrl+P cycling\" },\n\t{ name: \"export\", description: \"Export session (HTML default, or specify path: .html/.jsonl)\" },\n\t{ name: \"import\", description: \"Import and resume a session from a JSONL file\" },\n\t{ name: \"share\", description: \"Share session as a secret GitHub gist\" },\n\t{ name: \"copy\", description: \"Copy last agent message to clipboard\" },\n\t{ name: \"name\", description: \"Set session display name\" },\n\t{ name: \"session\", description: \"Show session info and stats\" },\n\t{ name: \"resource\", description: \"Show resource pressure and effective concurrency (probe|policy)\" },\n\t{ name: \"debug\", description: \"Preview local runtime diagnostics; save a metadata-only report with /debug save\" },\n\t{ name: \"changelog\", description: \"Show changelog entries\" },\n\t{ name: \"star\", description: \"Open the OMK GitHub repository\" },\n\t{ name: \"hotkeys\", description: \"Show all keyboard shortcuts\" },\n\t{ name: \"fork\", description: \"Create a new fork from a previous user message\" },\n\t{ name: \"clone\", description: \"Duplicate the current session at the current position\" },\n\t{ name: \"tree\", description: \"Navigate session tree (switch branches)\" },\n\t{ name: \"login\", description: \"Configure provider authentication\" },\n\t{ name: \"logout\", description: \"Remove provider authentication\" },\n\t{ name: \"new\", description: \"Start a new session\" },\n\t{ name: \"compact\", description: \"Manually compact the session context\" },\n\t{ name: \"resume\", description: \"Resume a different session\" },\n\t{ name: \"reload\", description: \"Reload keybindings, extensions, skills, prompts, and themes\" },\n\t{ name: \"quit\", description: `Quit ${APP_NAME}` },\n];\n"]}
@@ -24,18 +24,19 @@ export interface EffectiveLaneWidthInput {
24
24
  /** Widest conflict-free batch; the plan's batching already serializes writers. */
25
25
  readonly pathConflictFreeWidth: number;
26
26
  }
27
- /** §14.2: `min(plan, configured, admission, availableHeavyPermits, conflictFree)`, floor 1. */
27
+ /** Zero authority defers execution; configured zero retains its legacy unlimited meaning. */
28
28
  export declare function computeEffectiveLaneWidth(input: EffectiveLaneWidthInput): number;
29
29
  /** Read-only budget handed to every child (§14.1). Nothing here can raise a cap. */
30
30
  export interface SubagentLaneContext {
31
31
  readonly laneId: string;
32
32
  readonly promptRunId: string;
33
+ readonly signal?: AbortSignal;
33
34
  readonly decision: ResourceAdmissionDecision;
34
35
  readonly effectiveLaneWidth: number;
35
36
  }
36
37
  export interface LaneOutcome {
37
38
  readonly laneId: string;
38
- readonly status: "completed" | "failed" | "skipped-abort" | "permit-rejected";
39
+ readonly status: "completed" | "failed" | "cancelled" | "skipped-abort" | "permit-rejected" | "admission-deferred";
39
40
  readonly diagnostic?: string;
40
41
  }
41
42
  export interface LaunchSubagentLanesInput {
@@ -1 +1 @@
1
- {"version":3,"file":"subagent-lane-launcher.d.ts","sourceRoot":"","sources":["../../src/core/subagent-lane-launcher.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,yBAAyB,EAAE,MAAM,yBAAyB,CAAC;AACzE,OAAO,KAAK,EAAE,yBAAyB,EAAE,MAAM,6BAA6B,CAAC;AAC7E,OAAO,EAAuB,KAAK,kBAAkB,EAAE,MAAM,2BAA2B,CAAC;AAEzF;;;;;;;;;;;;;;GAcG;AAEH,MAAM,WAAW,uBAAuB;IACvC,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;IAC3B,QAAQ,CAAC,0BAA0B,CAAC,EAAE,MAAM,CAAC;IAC7C,QAAQ,CAAC,yBAAyB,EAAE,MAAM,CAAC;IAC3C,QAAQ,CAAC,qBAAqB,EAAE,MAAM,CAAC;IACvC,kFAAkF;IAClF,QAAQ,CAAC,qBAAqB,EAAE,MAAM,CAAC;CACvC;AAED,gGAA+F;AAC/F,wBAAgB,yBAAyB,CAAC,KAAK,EAAE,uBAAuB,GAAG,MAAM,CAahF;AAED,qFAAoF;AACpF,MAAM,WAAW,mBAAmB;IACnC,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC;IAC7B,QAAQ,CAAC,QAAQ,EAAE,yBAAyB,CAAC;IAC7C,QAAQ,CAAC,kBAAkB,EAAE,MAAM,CAAC;CACpC;AAED,MAAM,WAAW,WAAW;IAC3B,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,MAAM,EAAE,WAAW,GAAG,QAAQ,GAAG,eAAe,GAAG,iBAAiB,CAAC;IAC9E,QAAQ,CAAC,UAAU,CAAC,EAAE,MAAM,CAAC;CAC7B;AAED,MAAM,WAAW,wBAAwB;IACxC,QAAQ,CAAC,IAAI,EAAE,yBAAyB,CAAC;IACzC,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC;IAC7B,QAAQ,CAAC,QAAQ,EAAE,yBAAyB,CAAC;IAC7C,QAAQ,CAAC,UAAU,EAAE,kBAAkB,CAAC;IACxC,QAAQ,CAAC,0BAA0B,CAAC,EAAE,MAAM,CAAC;IAC7C,QAAQ,CAAC,MAAM,CAAC,EAAE,WAAW,CAAC;IAC9B,2EAA0E;IAC1E,QAAQ,CAAC,YAAY,CAAC,EAAE,WAAW,CAAC,MAAM,CAAC,CAAC;IAC5C,8EAA8E;IAC9E,QAAQ,CAAC,UAAU,EAAE,CAAC,OAAO,EAAE,mBAAmB,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;IACrE,QAAQ,CAAC,mBAAmB,CAAC,EAAE,MAAM,CAAC;CACtC;AAED,MAAM,WAAW,yBAAyB;IACzC,QAAQ,CAAC,QAAQ,EAAE,SAAS,WAAW,EAAE,CAAC;IAC1C,QAAQ,CAAC,kBAAkB,EAAE,MAAM,CAAC;IACpC,QAAQ,CAAC,sBAAsB,EAAE,MAAM,CAAC;CACxC;AAED;;;GAGG;AACH,wBAAsB,mBAAmB,CAAC,KAAK,EAAE,wBAAwB,GAAG,OAAO,CAAC,yBAAyB,CAAC,CAsD7G","sourcesContent":["import type { ResourceAdmissionDecision } from \"./resource-admission.ts\";\nimport type { SubagentOrchestrationPlan } from \"./subagent-orchestration.ts\";\nimport { WorkloadPermitError, type WorkloadPermitPool } from \"./workload-permit-pool.ts\";\n\n/**\n * Subagent lane launch authority (OMK v0.97.x roadmap §14, M6/PR10).\n *\n * Turns `buildSubagentOrchestrationPlan()` output into enforced execution:\n * the §14.2 effective width is a hard cap on concurrently active children,\n * batches run in order (writer serialization / path conflicts are encoded in\n * the plan's batches, which supplies the `pathConflictFreeWidth` term), and\n * heavy lanes draw permits from the PARENT's shared pool (§14.1 — a child\n * never constructs its own pool here; it receives this launcher's budget).\n *\n * §14.3 guarantees: child failure releases its permit (leak 0), parent\n * abort aborts queued permit waits and never launches unstarted lanes, and\n * the child context carries the parent decision with a width the child\n * cannot raise (§14.4: no API exists to widen — the context is read-only).\n */\n\nexport interface EffectiveLaneWidthInput {\n\treadonly planWidth: number;\n\treadonly configuredMaxParallelLanes?: number;\n\treadonly admissionMaxParallelLanes: number;\n\treadonly availableHeavyPermits: number;\n\t/** Widest conflict-free batch; the plan's batching already serializes writers. */\n\treadonly pathConflictFreeWidth: number;\n}\n\n/** §14.2: `min(plan, configured, admission, availableHeavyPermits, conflictFree)`, floor 1. */\nexport function computeEffectiveLaneWidth(input: EffectiveLaneWidthInput): number {\n\tconst configured =\n\t\tinput.configuredMaxParallelLanes !== undefined && input.configuredMaxParallelLanes > 0\n\t\t\t? input.configuredMaxParallelLanes\n\t\t\t: Number.POSITIVE_INFINITY;\n\tconst width = Math.min(\n\t\tinput.planWidth,\n\t\tconfigured,\n\t\tinput.admissionMaxParallelLanes,\n\t\tMath.max(1, input.availableHeavyPermits),\n\t\tinput.pathConflictFreeWidth,\n\t);\n\treturn Math.max(1, Math.floor(width));\n}\n\n/** Read-only budget handed to every child (§14.1). Nothing here can raise a cap. */\nexport interface SubagentLaneContext {\n\treadonly laneId: string;\n\treadonly promptRunId: string;\n\treadonly decision: ResourceAdmissionDecision;\n\treadonly effectiveLaneWidth: number;\n}\n\nexport interface LaneOutcome {\n\treadonly laneId: string;\n\treadonly status: \"completed\" | \"failed\" | \"skipped-abort\" | \"permit-rejected\";\n\treadonly diagnostic?: string;\n}\n\nexport interface LaunchSubagentLanesInput {\n\treadonly plan: SubagentOrchestrationPlan;\n\treadonly promptRunId: string;\n\treadonly decision: ResourceAdmissionDecision;\n\treadonly permitPool: WorkloadPermitPool;\n\treadonly configuredMaxParallelLanes?: number;\n\treadonly signal?: AbortSignal;\n\t/** Lane ids that run heavy work and must hold a shared permit (§14.3). */\n\treadonly heavyLaneIds?: ReadonlySet<string>;\n\t/** The actual child launcher (process spawn, SDK session, or test double). */\n\treadonly launchLane: (context: SubagentLaneContext) => Promise<void>;\n\treadonly permitWaitTimeoutMs?: number;\n}\n\nexport interface LaunchSubagentLanesResult {\n\treadonly outcomes: readonly LaneOutcome[];\n\treadonly effectiveLaneWidth: number;\n\treadonly maxObservedConcurrency: number;\n}\n\n/**\n * Execute a plan's batches with the §14.2 width as launcher authority.\n * Never throws for lane failures; the caller reads per-lane outcomes.\n */\nexport async function launchSubagentLanes(input: LaunchSubagentLanesInput): Promise<LaunchSubagentLanesResult> {\n\tconst poolSnapshot = input.permitPool.snapshot();\n\tconst effectiveLaneWidth = computeEffectiveLaneWidth({\n\t\tplanWidth: Math.max(1, input.plan.route.width),\n\t\tconfiguredMaxParallelLanes: input.configuredMaxParallelLanes,\n\t\tadmissionMaxParallelLanes: input.decision.maxParallelLanes,\n\t\tavailableHeavyPermits: Math.max(0, poolSnapshot.capacity - poolSnapshot.activeWeight),\n\t\tpathConflictFreeWidth: Math.max(1, ...input.plan.batches.map((batch) => batch.laneIds.length)),\n\t});\n\n\tconst outcomes: LaneOutcome[] = [];\n\tlet active = 0;\n\tlet maxObservedConcurrency = 0;\n\n\tfor (const batch of input.plan.batches) {\n\t\tif (input.signal?.aborted) {\n\t\t\t// Parent abort: unstarted lanes are never launched (§14.3).\n\t\t\tfor (const laneId of batch.laneIds) {\n\t\t\t\toutcomes.push({ laneId, status: \"skipped-abort\" });\n\t\t\t}\n\t\t\tcontinue;\n\t\t}\n\t\t// Batches execute sequentially (dependency + writer serialization);\n\t\t// inside one batch, the effective width bounds the running children.\n\t\tlet cursor = 0;\n\t\tconst runners: Promise<void>[] = [];\n\t\tconst runNext = async (): Promise<void> => {\n\t\t\twhile (cursor < batch.laneIds.length) {\n\t\t\t\tconst laneId = batch.laneIds[cursor];\n\t\t\t\tcursor += 1;\n\t\t\t\tif (input.signal?.aborted) {\n\t\t\t\t\toutcomes.push({ laneId, status: \"skipped-abort\" });\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\t\t\t\toutcomes.push(\n\t\t\t\t\tawait runLane(input, laneId, effectiveLaneWidth, {\n\t\t\t\t\t\tenter: () => {\n\t\t\t\t\t\t\tactive += 1;\n\t\t\t\t\t\t\tmaxObservedConcurrency = Math.max(maxObservedConcurrency, active);\n\t\t\t\t\t\t},\n\t\t\t\t\t\texit: () => {\n\t\t\t\t\t\t\tactive -= 1;\n\t\t\t\t\t\t},\n\t\t\t\t\t}),\n\t\t\t\t);\n\t\t\t}\n\t\t};\n\t\tconst workers = Math.min(effectiveLaneWidth, batch.laneIds.length);\n\t\tfor (let i = 0; i < workers; i++) {\n\t\t\trunners.push(runNext());\n\t\t}\n\t\tawait Promise.all(runners);\n\t}\n\treturn { outcomes, effectiveLaneWidth, maxObservedConcurrency };\n}\n\nasync function runLane(\n\tinput: LaunchSubagentLanesInput,\n\tlaneId: string,\n\teffectiveLaneWidth: number,\n\tgauge: { readonly enter: () => void; readonly exit: () => void },\n): Promise<LaneOutcome> {\n\tlet releasePermit: (() => void) | undefined;\n\tif (input.heavyLaneIds?.has(laneId)) {\n\t\ttry {\n\t\t\tconst permit = await input.permitPool.acquire({\n\t\t\t\trequestId: `lane-${laneId}`,\n\t\t\t\tpromptRunId: input.promptRunId,\n\t\t\t\tworkloadClass: \"heavy\",\n\t\t\t\tweight: 1,\n\t\t\t\tsignal: input.signal,\n\t\t\t\ttimeoutMs: input.permitWaitTimeoutMs ?? 60_000,\n\t\t\t});\n\t\t\treleasePermit = () => permit.release();\n\t\t} catch (error) {\n\t\t\tconst code = error instanceof WorkloadPermitError ? error.code : \"unknown\";\n\t\t\treturn {\n\t\t\t\tlaneId,\n\t\t\t\tstatus: code === \"aborted\" ? \"skipped-abort\" : \"permit-rejected\",\n\t\t\t\tdiagnostic: `permit.${code}`,\n\t\t\t};\n\t\t}\n\t}\n\tgauge.enter();\n\ttry {\n\t\tawait input.launchLane({\n\t\t\tlaneId,\n\t\t\tpromptRunId: input.promptRunId,\n\t\t\tdecision: input.decision,\n\t\t\teffectiveLaneWidth,\n\t\t});\n\t\treturn { laneId, status: \"completed\" };\n\t} catch (error) {\n\t\t// §14.3: a failing child must not leak its permit; release below.\n\t\treturn { laneId, status: \"failed\", diagnostic: String(error).slice(0, 200) };\n\t} finally {\n\t\tgauge.exit();\n\t\treleasePermit?.();\n\t}\n}\n"]}
1
+ {"version":3,"file":"subagent-lane-launcher.d.ts","sourceRoot":"","sources":["../../src/core/subagent-lane-launcher.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,yBAAyB,EAAE,MAAM,yBAAyB,CAAC;AACzE,OAAO,KAAK,EAAE,yBAAyB,EAAE,MAAM,6BAA6B,CAAC;AAC7E,OAAO,EAAuB,KAAK,kBAAkB,EAAE,MAAM,2BAA2B,CAAC;AAEzF;;;;;;;;;;;;;;GAcG;AAEH,MAAM,WAAW,uBAAuB;IACvC,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;IAC3B,QAAQ,CAAC,0BAA0B,CAAC,EAAE,MAAM,CAAC;IAC7C,QAAQ,CAAC,yBAAyB,EAAE,MAAM,CAAC;IAC3C,QAAQ,CAAC,qBAAqB,EAAE,MAAM,CAAC;IACvC,kFAAkF;IAClF,QAAQ,CAAC,qBAAqB,EAAE,MAAM,CAAC;CACvC;AAED,6FAA6F;AAC7F,wBAAgB,yBAAyB,CAAC,KAAK,EAAE,uBAAuB,GAAG,MAAM,CAahF;AAED,qFAAoF;AACpF,MAAM,WAAW,mBAAmB;IACnC,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC;IAC7B,QAAQ,CAAC,MAAM,CAAC,EAAE,WAAW,CAAC;IAC9B,QAAQ,CAAC,QAAQ,EAAE,yBAAyB,CAAC;IAC7C,QAAQ,CAAC,kBAAkB,EAAE,MAAM,CAAC;CACpC;AAED,MAAM,WAAW,WAAW;IAC3B,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,MAAM,EAAE,WAAW,GAAG,QAAQ,GAAG,WAAW,GAAG,eAAe,GAAG,iBAAiB,GAAG,oBAAoB,CAAC;IACnH,QAAQ,CAAC,UAAU,CAAC,EAAE,MAAM,CAAC;CAC7B;AAED,MAAM,WAAW,wBAAwB;IACxC,QAAQ,CAAC,IAAI,EAAE,yBAAyB,CAAC;IACzC,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC;IAC7B,QAAQ,CAAC,QAAQ,EAAE,yBAAyB,CAAC;IAC7C,QAAQ,CAAC,UAAU,EAAE,kBAAkB,CAAC;IACxC,QAAQ,CAAC,0BAA0B,CAAC,EAAE,MAAM,CAAC;IAC7C,QAAQ,CAAC,MAAM,CAAC,EAAE,WAAW,CAAC;IAC9B,2EAA0E;IAC1E,QAAQ,CAAC,YAAY,CAAC,EAAE,WAAW,CAAC,MAAM,CAAC,CAAC;IAC5C,8EAA8E;IAC9E,QAAQ,CAAC,UAAU,EAAE,CAAC,OAAO,EAAE,mBAAmB,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;IACrE,QAAQ,CAAC,mBAAmB,CAAC,EAAE,MAAM,CAAC;CACtC;AAED,MAAM,WAAW,yBAAyB;IACzC,QAAQ,CAAC,QAAQ,EAAE,SAAS,WAAW,EAAE,CAAC;IAC1C,QAAQ,CAAC,kBAAkB,EAAE,MAAM,CAAC;IACpC,QAAQ,CAAC,sBAAsB,EAAE,MAAM,CAAC;CACxC;AAED;;;GAGG;AACH,wBAAsB,mBAAmB,CAAC,KAAK,EAAE,wBAAwB,GAAG,OAAO,CAAC,yBAAyB,CAAC,CAwD7G","sourcesContent":["import type { ResourceAdmissionDecision } from \"./resource-admission.ts\";\nimport type { SubagentOrchestrationPlan } from \"./subagent-orchestration.ts\";\nimport { WorkloadPermitError, type WorkloadPermitPool } from \"./workload-permit-pool.ts\";\n\n/**\n * Subagent lane launch authority (OMK v0.97.x roadmap §14, M6/PR10).\n *\n * Turns `buildSubagentOrchestrationPlan()` output into enforced execution:\n * the §14.2 effective width is a hard cap on concurrently active children,\n * batches run in order (writer serialization / path conflicts are encoded in\n * the plan's batches, which supplies the `pathConflictFreeWidth` term), and\n * heavy lanes draw permits from the PARENT's shared pool (§14.1 — a child\n * never constructs its own pool here; it receives this launcher's budget).\n *\n * §14.3 guarantees: child failure releases its permit (leak 0), parent\n * abort aborts queued permit waits and never launches unstarted lanes, and\n * the child context carries the parent decision with a width the child\n * cannot raise (§14.4: no API exists to widen — the context is read-only).\n */\n\nexport interface EffectiveLaneWidthInput {\n\treadonly planWidth: number;\n\treadonly configuredMaxParallelLanes?: number;\n\treadonly admissionMaxParallelLanes: number;\n\treadonly availableHeavyPermits: number;\n\t/** Widest conflict-free batch; the plan's batching already serializes writers. */\n\treadonly pathConflictFreeWidth: number;\n}\n\n/** Zero authority defers execution; configured zero retains its legacy unlimited meaning. */\nexport function computeEffectiveLaneWidth(input: EffectiveLaneWidthInput): number {\n\tconst configured =\n\t\tinput.configuredMaxParallelLanes !== undefined && input.configuredMaxParallelLanes > 0\n\t\t\t? input.configuredMaxParallelLanes\n\t\t\t: Number.POSITIVE_INFINITY;\n\tconst width = Math.min(\n\t\tinput.planWidth,\n\t\tconfigured,\n\t\tinput.admissionMaxParallelLanes,\n\t\tinput.availableHeavyPermits,\n\t\tinput.pathConflictFreeWidth,\n\t);\n\treturn Number.isFinite(width) ? Math.max(0, Math.floor(width)) : 0;\n}\n\n/** Read-only budget handed to every child (§14.1). Nothing here can raise a cap. */\nexport interface SubagentLaneContext {\n\treadonly laneId: string;\n\treadonly promptRunId: string;\n\treadonly signal?: AbortSignal;\n\treadonly decision: ResourceAdmissionDecision;\n\treadonly effectiveLaneWidth: number;\n}\n\nexport interface LaneOutcome {\n\treadonly laneId: string;\n\treadonly status: \"completed\" | \"failed\" | \"cancelled\" | \"skipped-abort\" | \"permit-rejected\" | \"admission-deferred\";\n\treadonly diagnostic?: string;\n}\n\nexport interface LaunchSubagentLanesInput {\n\treadonly plan: SubagentOrchestrationPlan;\n\treadonly promptRunId: string;\n\treadonly decision: ResourceAdmissionDecision;\n\treadonly permitPool: WorkloadPermitPool;\n\treadonly configuredMaxParallelLanes?: number;\n\treadonly signal?: AbortSignal;\n\t/** Lane ids that run heavy work and must hold a shared permit (§14.3). */\n\treadonly heavyLaneIds?: ReadonlySet<string>;\n\t/** The actual child launcher (process spawn, SDK session, or test double). */\n\treadonly launchLane: (context: SubagentLaneContext) => Promise<void>;\n\treadonly permitWaitTimeoutMs?: number;\n}\n\nexport interface LaunchSubagentLanesResult {\n\treadonly outcomes: readonly LaneOutcome[];\n\treadonly effectiveLaneWidth: number;\n\treadonly maxObservedConcurrency: number;\n}\n\n/**\n * Execute a plan's batches with the §14.2 width as launcher authority.\n * Never throws for lane failures; the caller reads per-lane outcomes.\n */\nexport async function launchSubagentLanes(input: LaunchSubagentLanesInput): Promise<LaunchSubagentLanesResult> {\n\tconst poolSnapshot = input.permitPool.snapshot();\n\tconst effectiveLaneWidth = computeEffectiveLaneWidth({\n\t\tplanWidth: input.plan.route.width,\n\t\tconfiguredMaxParallelLanes: input.configuredMaxParallelLanes,\n\t\tadmissionMaxParallelLanes: input.decision.maxParallelLanes,\n\t\tavailableHeavyPermits: Math.min(\n\t\t\tMath.max(0, poolSnapshot.capacity - poolSnapshot.activeWeight),\n\t\t\tinput.heavyLaneIds?.size ? input.decision.maxHeavyProcesses : Number.POSITIVE_INFINITY,\n\t\t),\n\t\tpathConflictFreeWidth: Math.max(0, ...input.plan.batches.map((batch) => batch.laneIds.length)),\n\t});\n\n\tconst outcomes: LaneOutcome[] = [];\n\tlet active = 0;\n\tlet maxObservedConcurrency = 0;\n\n\tfor (const batch of input.plan.batches) {\n\t\tif (input.signal?.aborted || effectiveLaneWidth === 0) {\n\t\t\tfor (const laneId of batch.laneIds) {\n\t\t\t\toutcomes.push({ laneId, status: input.signal?.aborted ? \"skipped-abort\" : \"admission-deferred\" });\n\t\t\t}\n\t\t\tcontinue;\n\t\t}\n\t\t// Batches execute sequentially (dependency + writer serialization);\n\t\t// inside one batch, the effective width bounds the running children.\n\t\tlet cursor = 0;\n\t\tconst runners: Promise<void>[] = [];\n\t\tconst runNext = async (): Promise<void> => {\n\t\t\twhile (cursor < batch.laneIds.length) {\n\t\t\t\tconst laneId = batch.laneIds[cursor];\n\t\t\t\tcursor += 1;\n\t\t\t\tif (input.signal?.aborted) {\n\t\t\t\t\toutcomes.push({ laneId, status: \"skipped-abort\" });\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\t\t\t\toutcomes.push(\n\t\t\t\t\tawait runLane(input, laneId, effectiveLaneWidth, {\n\t\t\t\t\t\tenter: () => {\n\t\t\t\t\t\t\tactive += 1;\n\t\t\t\t\t\t\tmaxObservedConcurrency = Math.max(maxObservedConcurrency, active);\n\t\t\t\t\t\t},\n\t\t\t\t\t\texit: () => {\n\t\t\t\t\t\t\tactive -= 1;\n\t\t\t\t\t\t},\n\t\t\t\t\t}),\n\t\t\t\t);\n\t\t\t}\n\t\t};\n\t\tconst workers = Math.min(effectiveLaneWidth, batch.laneIds.length);\n\t\tfor (let i = 0; i < workers; i++) {\n\t\t\trunners.push(runNext());\n\t\t}\n\t\tawait Promise.all(runners);\n\t}\n\treturn { outcomes, effectiveLaneWidth, maxObservedConcurrency };\n}\n\nasync function runLane(\n\tinput: LaunchSubagentLanesInput,\n\tlaneId: string,\n\teffectiveLaneWidth: number,\n\tgauge: { readonly enter: () => void; readonly exit: () => void },\n): Promise<LaneOutcome> {\n\tlet releasePermit: (() => void) | undefined;\n\tif (input.heavyLaneIds?.has(laneId)) {\n\t\tif (input.decision.action === \"defer-heavy\" || input.decision.maxHeavyProcesses === 0) {\n\t\t\treturn { laneId, status: \"admission-deferred\" };\n\t\t}\n\t\ttry {\n\t\t\tconst permit = await input.permitPool.acquire({\n\t\t\t\trequestId: `lane-${laneId}`,\n\t\t\t\tpromptRunId: input.promptRunId,\n\t\t\t\tworkloadClass: \"heavy\",\n\t\t\t\tweight: 1,\n\t\t\t\tsignal: input.signal,\n\t\t\t\ttimeoutMs: input.permitWaitTimeoutMs ?? 60_000,\n\t\t\t});\n\t\t\treleasePermit = () => permit.release();\n\t\t} catch (error) {\n\t\t\tconst code = error instanceof WorkloadPermitError ? error.code : \"unknown\";\n\t\t\treturn {\n\t\t\t\tlaneId,\n\t\t\t\tstatus: code === \"aborted\" ? \"skipped-abort\" : \"permit-rejected\",\n\t\t\t\tdiagnostic: `permit.${code}`,\n\t\t\t};\n\t\t}\n\t}\n\tif (input.signal?.aborted) {\n\t\treleasePermit?.();\n\t\treturn { laneId, status: \"skipped-abort\" };\n\t}\n\tgauge.enter();\n\ttry {\n\t\tawait input.launchLane({\n\t\t\tlaneId,\n\t\t\tpromptRunId: input.promptRunId,\n\t\t\tsignal: input.signal,\n\t\t\tdecision: input.decision,\n\t\t\teffectiveLaneWidth,\n\t\t});\n\t\treturn { laneId, status: input.signal?.aborted ? \"cancelled\" : \"completed\" };\n\t} catch {\n\t\t// Child error text is untrusted and may contain credentials.\n\t\treturn {\n\t\t\tlaneId,\n\t\t\tstatus: input.signal?.aborted ? \"cancelled\" : \"failed\",\n\t\t\tdiagnostic: \"lane.execution_failed\",\n\t\t};\n\t} finally {\n\t\tgauge.exit();\n\t\treleasePermit?.();\n\t}\n}\n"]}
@@ -1,11 +1,11 @@
1
1
  import { WorkloadPermitError } from "./workload-permit-pool.js";
2
- /** §14.2: `min(plan, configured, admission, availableHeavyPermits, conflictFree)`, floor 1. */
2
+ /** Zero authority defers execution; configured zero retains its legacy unlimited meaning. */
3
3
  export function computeEffectiveLaneWidth(input) {
4
4
  const configured = input.configuredMaxParallelLanes !== undefined && input.configuredMaxParallelLanes > 0
5
5
  ? input.configuredMaxParallelLanes
6
6
  : Number.POSITIVE_INFINITY;
7
- const width = Math.min(input.planWidth, configured, input.admissionMaxParallelLanes, Math.max(1, input.availableHeavyPermits), input.pathConflictFreeWidth);
8
- return Math.max(1, Math.floor(width));
7
+ const width = Math.min(input.planWidth, configured, input.admissionMaxParallelLanes, input.availableHeavyPermits, input.pathConflictFreeWidth);
8
+ return Number.isFinite(width) ? Math.max(0, Math.floor(width)) : 0;
9
9
  }
10
10
  /**
11
11
  * Execute a plan's batches with the §14.2 width as launcher authority.
@@ -14,20 +14,19 @@ export function computeEffectiveLaneWidth(input) {
14
14
  export async function launchSubagentLanes(input) {
15
15
  const poolSnapshot = input.permitPool.snapshot();
16
16
  const effectiveLaneWidth = computeEffectiveLaneWidth({
17
- planWidth: Math.max(1, input.plan.route.width),
17
+ planWidth: input.plan.route.width,
18
18
  configuredMaxParallelLanes: input.configuredMaxParallelLanes,
19
19
  admissionMaxParallelLanes: input.decision.maxParallelLanes,
20
- availableHeavyPermits: Math.max(0, poolSnapshot.capacity - poolSnapshot.activeWeight),
21
- pathConflictFreeWidth: Math.max(1, ...input.plan.batches.map((batch) => batch.laneIds.length)),
20
+ availableHeavyPermits: Math.min(Math.max(0, poolSnapshot.capacity - poolSnapshot.activeWeight), input.heavyLaneIds?.size ? input.decision.maxHeavyProcesses : Number.POSITIVE_INFINITY),
21
+ pathConflictFreeWidth: Math.max(0, ...input.plan.batches.map((batch) => batch.laneIds.length)),
22
22
  });
23
23
  const outcomes = [];
24
24
  let active = 0;
25
25
  let maxObservedConcurrency = 0;
26
26
  for (const batch of input.plan.batches) {
27
- if (input.signal?.aborted) {
28
- // Parent abort: unstarted lanes are never launched (§14.3).
27
+ if (input.signal?.aborted || effectiveLaneWidth === 0) {
29
28
  for (const laneId of batch.laneIds) {
30
- outcomes.push({ laneId, status: "skipped-abort" });
29
+ outcomes.push({ laneId, status: input.signal?.aborted ? "skipped-abort" : "admission-deferred" });
31
30
  }
32
31
  continue;
33
32
  }
@@ -65,6 +64,9 @@ export async function launchSubagentLanes(input) {
65
64
  async function runLane(input, laneId, effectiveLaneWidth, gauge) {
66
65
  let releasePermit;
67
66
  if (input.heavyLaneIds?.has(laneId)) {
67
+ if (input.decision.action === "defer-heavy" || input.decision.maxHeavyProcesses === 0) {
68
+ return { laneId, status: "admission-deferred" };
69
+ }
68
70
  try {
69
71
  const permit = await input.permitPool.acquire({
70
72
  requestId: `lane-${laneId}`,
@@ -85,19 +87,28 @@ async function runLane(input, laneId, effectiveLaneWidth, gauge) {
85
87
  };
86
88
  }
87
89
  }
90
+ if (input.signal?.aborted) {
91
+ releasePermit?.();
92
+ return { laneId, status: "skipped-abort" };
93
+ }
88
94
  gauge.enter();
89
95
  try {
90
96
  await input.launchLane({
91
97
  laneId,
92
98
  promptRunId: input.promptRunId,
99
+ signal: input.signal,
93
100
  decision: input.decision,
94
101
  effectiveLaneWidth,
95
102
  });
96
- return { laneId, status: "completed" };
103
+ return { laneId, status: input.signal?.aborted ? "cancelled" : "completed" };
97
104
  }
98
- catch (error) {
99
- // §14.3: a failing child must not leak its permit; release below.
100
- return { laneId, status: "failed", diagnostic: String(error).slice(0, 200) };
105
+ catch {
106
+ // Child error text is untrusted and may contain credentials.
107
+ return {
108
+ laneId,
109
+ status: input.signal?.aborted ? "cancelled" : "failed",
110
+ diagnostic: "lane.execution_failed",
111
+ };
101
112
  }
102
113
  finally {
103
114
  gauge.exit();