agent-nuvira 3.3.13 → 3.3.14

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 (387) hide show
  1. package/README.md +67 -1
  2. package/dist/agents/agents/planner.d.ts.map +1 -1
  3. package/dist/agents/agents/planner.js +9 -0
  4. package/dist/agents/agents/planner.js.map +1 -1
  5. package/dist/agents/orchestrator.d.ts +31 -0
  6. package/dist/agents/orchestrator.d.ts.map +1 -1
  7. package/dist/agents/orchestrator.js +74 -126
  8. package/dist/agents/orchestrator.js.map +1 -1
  9. package/dist/cli/chat.d.ts +89 -0
  10. package/dist/cli/chat.d.ts.map +1 -1
  11. package/dist/cli/chat.js +765 -33
  12. package/dist/cli/chat.js.map +1 -1
  13. package/dist/cli/cli-program.d.ts.map +1 -1
  14. package/dist/cli/cli-program.js +12 -0
  15. package/dist/cli/cli-program.js.map +1 -1
  16. package/dist/cli/config.d.ts +12 -0
  17. package/dist/cli/config.d.ts.map +1 -1
  18. package/dist/cli/config.js +86 -0
  19. package/dist/cli/config.js.map +1 -1
  20. package/dist/cli/decisions.d.ts +28 -0
  21. package/dist/cli/decisions.d.ts.map +1 -0
  22. package/dist/cli/decisions.js +140 -0
  23. package/dist/cli/decisions.js.map +1 -0
  24. package/dist/cli/doctor.d.ts +6 -0
  25. package/dist/cli/doctor.d.ts.map +1 -1
  26. package/dist/cli/doctor.js +46 -0
  27. package/dist/cli/doctor.js.map +1 -1
  28. package/dist/cli/failover-runner.d.ts.map +1 -1
  29. package/dist/cli/failover-runner.js +19 -1
  30. package/dist/cli/failover-runner.js.map +1 -1
  31. package/dist/cli/feedback.d.ts.map +1 -1
  32. package/dist/cli/feedback.js +5 -1
  33. package/dist/cli/feedback.js.map +1 -1
  34. package/dist/cli/hooks.d.ts +30 -0
  35. package/dist/cli/hooks.d.ts.map +1 -0
  36. package/dist/cli/hooks.js +224 -0
  37. package/dist/cli/hooks.js.map +1 -0
  38. package/dist/cli/knowledge.d.ts +9 -1
  39. package/dist/cli/knowledge.d.ts.map +1 -1
  40. package/dist/cli/knowledge.js +93 -2
  41. package/dist/cli/knowledge.js.map +1 -1
  42. package/dist/cli/loop-executor.d.ts.map +1 -1
  43. package/dist/cli/loop-executor.js +47 -12
  44. package/dist/cli/loop-executor.js.map +1 -1
  45. package/dist/cli/model.d.ts +20 -0
  46. package/dist/cli/model.d.ts.map +1 -1
  47. package/dist/cli/model.js +294 -14
  48. package/dist/cli/model.js.map +1 -1
  49. package/dist/cli/rate.d.ts +78 -0
  50. package/dist/cli/rate.d.ts.map +1 -0
  51. package/dist/cli/rate.js +294 -0
  52. package/dist/cli/rate.js.map +1 -0
  53. package/dist/config/process-env.d.ts.map +1 -1
  54. package/dist/config/process-env.js +10 -0
  55. package/dist/config/process-env.js.map +1 -1
  56. package/dist/enterprise/vault.d.ts.map +1 -1
  57. package/dist/enterprise/vault.js +5 -21
  58. package/dist/enterprise/vault.js.map +1 -1
  59. package/dist/gateway/hook-contract.d.ts +33 -0
  60. package/dist/gateway/hook-contract.d.ts.map +1 -1
  61. package/dist/gateway/hook-contract.js +97 -0
  62. package/dist/gateway/hook-contract.js.map +1 -1
  63. package/dist/inference/gemini-adapter.d.ts.map +1 -1
  64. package/dist/inference/gemini-adapter.js +4 -0
  65. package/dist/inference/gemini-adapter.js.map +1 -1
  66. package/dist/inference/interface.d.ts +37 -0
  67. package/dist/inference/interface.d.ts.map +1 -1
  68. package/dist/inference/native-tools.d.ts +16 -1
  69. package/dist/inference/native-tools.d.ts.map +1 -1
  70. package/dist/inference/native-tools.js +34 -10
  71. package/dist/inference/native-tools.js.map +1 -1
  72. package/dist/inference/route-resolver.d.ts +30 -0
  73. package/dist/inference/route-resolver.d.ts.map +1 -1
  74. package/dist/inference/route-resolver.js +158 -1
  75. package/dist/inference/route-resolver.js.map +1 -1
  76. package/dist/inference/tools.d.ts +16 -1
  77. package/dist/inference/tools.d.ts.map +1 -1
  78. package/dist/inference/tools.js +51 -18
  79. package/dist/inference/tools.js.map +1 -1
  80. package/dist/learning/acceptance-model.d.ts +247 -0
  81. package/dist/learning/acceptance-model.d.ts.map +1 -0
  82. package/dist/learning/acceptance-model.js +708 -0
  83. package/dist/learning/acceptance-model.js.map +1 -0
  84. package/dist/learning/auto-router.d.ts +68 -24
  85. package/dist/learning/auto-router.d.ts.map +1 -1
  86. package/dist/learning/auto-router.js +301 -96
  87. package/dist/learning/auto-router.js.map +1 -1
  88. package/dist/learning/autonomy-policy.d.ts +12 -16
  89. package/dist/learning/autonomy-policy.d.ts.map +1 -1
  90. package/dist/learning/autonomy-policy.js +50 -48
  91. package/dist/learning/autonomy-policy.js.map +1 -1
  92. package/dist/learning/behavioural-labels.d.ts +86 -0
  93. package/dist/learning/behavioural-labels.d.ts.map +1 -0
  94. package/dist/learning/behavioural-labels.js +166 -0
  95. package/dist/learning/behavioural-labels.js.map +1 -0
  96. package/dist/learning/capability-evidence.d.ts +167 -0
  97. package/dist/learning/capability-evidence.d.ts.map +1 -0
  98. package/dist/learning/capability-evidence.js +210 -0
  99. package/dist/learning/capability-evidence.js.map +1 -0
  100. package/dist/learning/capability-readiness.d.ts +64 -0
  101. package/dist/learning/capability-readiness.d.ts.map +1 -0
  102. package/dist/learning/capability-readiness.js +74 -0
  103. package/dist/learning/capability-readiness.js.map +1 -0
  104. package/dist/learning/capability-types.d.ts +169 -0
  105. package/dist/learning/capability-types.d.ts.map +1 -0
  106. package/dist/learning/capability-types.js +20 -0
  107. package/dist/learning/capability-types.js.map +1 -0
  108. package/dist/learning/catalog-feed.d.ts +89 -0
  109. package/dist/learning/catalog-feed.d.ts.map +1 -0
  110. package/dist/learning/catalog-feed.js +211 -0
  111. package/dist/learning/catalog-feed.js.map +1 -0
  112. package/dist/learning/cli-intent-effects.d.ts +60 -0
  113. package/dist/learning/cli-intent-effects.d.ts.map +1 -0
  114. package/dist/learning/cli-intent-effects.js +153 -0
  115. package/dist/learning/cli-intent-effects.js.map +1 -0
  116. package/dist/learning/command-adaptation.d.ts +41 -0
  117. package/dist/learning/command-adaptation.d.ts.map +1 -0
  118. package/dist/learning/command-adaptation.js +122 -0
  119. package/dist/learning/command-adaptation.js.map +1 -0
  120. package/dist/learning/consent-picture.d.ts +42 -0
  121. package/dist/learning/consent-picture.d.ts.map +1 -0
  122. package/dist/learning/consent-picture.js +53 -0
  123. package/dist/learning/consent-picture.js.map +1 -0
  124. package/dist/learning/context-budget.d.ts +37 -6
  125. package/dist/learning/context-budget.d.ts.map +1 -1
  126. package/dist/learning/context-budget.js +38 -9
  127. package/dist/learning/context-budget.js.map +1 -1
  128. package/dist/learning/decision-log.d.ts +114 -0
  129. package/dist/learning/decision-log.d.ts.map +1 -0
  130. package/dist/learning/decision-log.js +296 -0
  131. package/dist/learning/decision-log.js.map +1 -0
  132. package/dist/learning/deliverable-class.d.ts.map +1 -1
  133. package/dist/learning/deliverable-class.js +19 -0
  134. package/dist/learning/deliverable-class.js.map +1 -1
  135. package/dist/learning/deliverable-corpus.d.ts +117 -0
  136. package/dist/learning/deliverable-corpus.d.ts.map +1 -0
  137. package/dist/learning/deliverable-corpus.js +176 -0
  138. package/dist/learning/deliverable-corpus.js.map +1 -0
  139. package/dist/learning/error-repair.d.ts +22 -1
  140. package/dist/learning/error-repair.d.ts.map +1 -1
  141. package/dist/learning/error-repair.js +37 -0
  142. package/dist/learning/error-repair.js.map +1 -1
  143. package/dist/learning/exhaustion-report.d.ts +136 -0
  144. package/dist/learning/exhaustion-report.d.ts.map +1 -0
  145. package/dist/learning/exhaustion-report.js +239 -0
  146. package/dist/learning/exhaustion-report.js.map +1 -0
  147. package/dist/learning/failure-bookkeeping.d.ts +16 -0
  148. package/dist/learning/failure-bookkeeping.d.ts.map +1 -1
  149. package/dist/learning/failure-bookkeeping.js +51 -5
  150. package/dist/learning/failure-bookkeeping.js.map +1 -1
  151. package/dist/learning/gate-friction.d.ts +39 -0
  152. package/dist/learning/gate-friction.d.ts.map +1 -0
  153. package/dist/learning/gate-friction.js +91 -0
  154. package/dist/learning/gate-friction.js.map +1 -0
  155. package/dist/learning/harness-narration.d.ts +34 -0
  156. package/dist/learning/harness-narration.d.ts.map +1 -0
  157. package/dist/learning/harness-narration.js +58 -0
  158. package/dist/learning/harness-narration.js.map +1 -0
  159. package/dist/learning/hub-skill-catalog.d.ts.map +1 -1
  160. package/dist/learning/hub-skill-catalog.js +1 -2
  161. package/dist/learning/hub-skill-catalog.js.map +1 -1
  162. package/dist/learning/hybrid-router.d.ts +65 -0
  163. package/dist/learning/hybrid-router.d.ts.map +1 -1
  164. package/dist/learning/hybrid-router.js +186 -0
  165. package/dist/learning/hybrid-router.js.map +1 -1
  166. package/dist/learning/knowledge-base.d.ts +229 -3
  167. package/dist/learning/knowledge-base.d.ts.map +1 -1
  168. package/dist/learning/knowledge-base.js +593 -24
  169. package/dist/learning/knowledge-base.js.map +1 -1
  170. package/dist/learning/knowledge-eval.d.ts +171 -0
  171. package/dist/learning/knowledge-eval.d.ts.map +1 -0
  172. package/dist/learning/knowledge-eval.js +196 -0
  173. package/dist/learning/knowledge-eval.js.map +1 -0
  174. package/dist/learning/knowledge-turn.d.ts +92 -0
  175. package/dist/learning/knowledge-turn.d.ts.map +1 -0
  176. package/dist/learning/knowledge-turn.js +190 -0
  177. package/dist/learning/knowledge-turn.js.map +1 -0
  178. package/dist/learning/learned-commands.d.ts +64 -0
  179. package/dist/learning/learned-commands.d.ts.map +1 -0
  180. package/dist/learning/learned-commands.js +108 -0
  181. package/dist/learning/learned-commands.js.map +1 -0
  182. package/dist/learning/lexical-search.d.ts +50 -0
  183. package/dist/learning/lexical-search.d.ts.map +1 -0
  184. package/dist/learning/lexical-search.js +111 -0
  185. package/dist/learning/lexical-search.js.map +1 -0
  186. package/dist/learning/machine-facts.d.ts +71 -0
  187. package/dist/learning/machine-facts.d.ts.map +1 -0
  188. package/dist/learning/machine-facts.js +164 -0
  189. package/dist/learning/machine-facts.js.map +1 -0
  190. package/dist/learning/markdown-outline.d.ts +73 -0
  191. package/dist/learning/markdown-outline.d.ts.map +1 -0
  192. package/dist/learning/markdown-outline.js +136 -0
  193. package/dist/learning/markdown-outline.js.map +1 -0
  194. package/dist/learning/model-first-router.d.ts +33 -1
  195. package/dist/learning/model-first-router.d.ts.map +1 -1
  196. package/dist/learning/model-first-router.js +123 -9
  197. package/dist/learning/model-first-router.js.map +1 -1
  198. package/dist/learning/model-identity.d.ts +80 -0
  199. package/dist/learning/model-identity.d.ts.map +1 -0
  200. package/dist/learning/model-identity.js +115 -0
  201. package/dist/learning/model-identity.js.map +1 -0
  202. package/dist/learning/model-registry.d.ts +141 -2
  203. package/dist/learning/model-registry.d.ts.map +1 -1
  204. package/dist/learning/model-registry.js +324 -38
  205. package/dist/learning/model-registry.js.map +1 -1
  206. package/dist/learning/model-scoring.d.ts.map +1 -1
  207. package/dist/learning/model-scoring.js +8 -1
  208. package/dist/learning/model-scoring.js.map +1 -1
  209. package/dist/learning/model-selection.d.ts.map +1 -1
  210. package/dist/learning/model-selection.js +41 -0
  211. package/dist/learning/model-selection.js.map +1 -1
  212. package/dist/learning/outcome-observation.d.ts +49 -0
  213. package/dist/learning/outcome-observation.d.ts.map +1 -0
  214. package/dist/learning/outcome-observation.js +95 -0
  215. package/dist/learning/outcome-observation.js.map +1 -0
  216. package/dist/learning/pair-entitlement.d.ts +184 -0
  217. package/dist/learning/pair-entitlement.d.ts.map +1 -0
  218. package/dist/learning/pair-entitlement.js +214 -0
  219. package/dist/learning/pair-entitlement.js.map +1 -0
  220. package/dist/learning/provider-fallback.d.ts +23 -1
  221. package/dist/learning/provider-fallback.d.ts.map +1 -1
  222. package/dist/learning/provider-fallback.js +24 -0
  223. package/dist/learning/provider-fallback.js.map +1 -1
  224. package/dist/learning/reasoning-trace.d.ts +65 -1
  225. package/dist/learning/reasoning-trace.d.ts.map +1 -1
  226. package/dist/learning/reasoning-trace.js +123 -1
  227. package/dist/learning/reasoning-trace.js.map +1 -1
  228. package/dist/learning/requirement-probe.d.ts +55 -0
  229. package/dist/learning/requirement-probe.d.ts.map +1 -0
  230. package/dist/learning/requirement-probe.js +77 -0
  231. package/dist/learning/requirement-probe.js.map +1 -0
  232. package/dist/learning/resilient-call.d.ts +20 -1
  233. package/dist/learning/resilient-call.d.ts.map +1 -1
  234. package/dist/learning/resilient-call.js +42 -4
  235. package/dist/learning/resilient-call.js.map +1 -1
  236. package/dist/learning/response-usability.d.ts +85 -0
  237. package/dist/learning/response-usability.d.ts.map +1 -0
  238. package/dist/learning/response-usability.js +135 -0
  239. package/dist/learning/response-usability.js.map +1 -0
  240. package/dist/learning/router-bandit.d.ts +132 -0
  241. package/dist/learning/router-bandit.d.ts.map +1 -1
  242. package/dist/learning/router-bandit.js +253 -0
  243. package/dist/learning/router-bandit.js.map +1 -1
  244. package/dist/learning/routing-history.d.ts +41 -2
  245. package/dist/learning/routing-history.d.ts.map +1 -1
  246. package/dist/learning/routing-history.js.map +1 -1
  247. package/dist/learning/run-trace.d.ts +21 -0
  248. package/dist/learning/run-trace.d.ts.map +1 -1
  249. package/dist/learning/run-trace.js +38 -0
  250. package/dist/learning/run-trace.js.map +1 -1
  251. package/dist/learning/session-grant.d.ts +75 -0
  252. package/dist/learning/session-grant.d.ts.map +1 -0
  253. package/dist/learning/session-grant.js +112 -0
  254. package/dist/learning/session-grant.js.map +1 -0
  255. package/dist/learning/task-model-continuity.d.ts +73 -0
  256. package/dist/learning/task-model-continuity.d.ts.map +1 -0
  257. package/dist/learning/task-model-continuity.js +87 -0
  258. package/dist/learning/task-model-continuity.js.map +1 -0
  259. package/dist/learning/turn-feedback.d.ts +93 -0
  260. package/dist/learning/turn-feedback.d.ts.map +1 -0
  261. package/dist/learning/turn-feedback.js +127 -0
  262. package/dist/learning/turn-feedback.js.map +1 -0
  263. package/dist/learning/turn-report.d.ts +104 -2
  264. package/dist/learning/turn-report.d.ts.map +1 -1
  265. package/dist/learning/turn-report.js +161 -6
  266. package/dist/learning/turn-report.js.map +1 -1
  267. package/dist/learning/verdict-routing.d.ts +51 -0
  268. package/dist/learning/verdict-routing.d.ts.map +1 -0
  269. package/dist/learning/verdict-routing.js +122 -0
  270. package/dist/learning/verdict-routing.js.map +1 -0
  271. package/dist/mcp/client.d.ts.map +1 -1
  272. package/dist/mcp/client.js +5 -0
  273. package/dist/mcp/client.js.map +1 -1
  274. package/dist/mcp/manager.d.ts +10 -0
  275. package/dist/mcp/manager.d.ts.map +1 -1
  276. package/dist/mcp/manager.js +20 -0
  277. package/dist/mcp/manager.js.map +1 -1
  278. package/dist/mcp/mcp-discovery.d.ts +34 -0
  279. package/dist/mcp/mcp-discovery.d.ts.map +1 -0
  280. package/dist/mcp/mcp-discovery.js +71 -0
  281. package/dist/mcp/mcp-discovery.js.map +1 -0
  282. package/dist/mcp/mcp-schema-cache.d.ts +17 -0
  283. package/dist/mcp/mcp-schema-cache.d.ts.map +1 -1
  284. package/dist/mcp/mcp-schema-cache.js +47 -3
  285. package/dist/mcp/mcp-schema-cache.js.map +1 -1
  286. package/dist/mcp/types.d.ts +28 -0
  287. package/dist/mcp/types.d.ts.map +1 -1
  288. package/dist/mcp/types.js.map +1 -1
  289. package/dist/tools/ask-user.d.ts.map +1 -1
  290. package/dist/tools/ask-user.js +4 -0
  291. package/dist/tools/ask-user.js.map +1 -1
  292. package/dist/tools/capability-registry.d.ts +150 -0
  293. package/dist/tools/capability-registry.d.ts.map +1 -0
  294. package/dist/tools/capability-registry.js +400 -0
  295. package/dist/tools/capability-registry.js.map +1 -0
  296. package/dist/tools/child-agent-runtime.d.ts.map +1 -1
  297. package/dist/tools/child-agent-runtime.js +19 -5
  298. package/dist/tools/child-agent-runtime.js.map +1 -1
  299. package/dist/tools/coding-tools.d.ts +17 -5
  300. package/dist/tools/coding-tools.d.ts.map +1 -1
  301. package/dist/tools/coding-tools.js +80 -11
  302. package/dist/tools/coding-tools.js.map +1 -1
  303. package/dist/tools/command-memo.d.ts +116 -0
  304. package/dist/tools/command-memo.d.ts.map +1 -0
  305. package/dist/tools/command-memo.js +202 -0
  306. package/dist/tools/command-memo.js.map +1 -0
  307. package/dist/tools/git-tool.d.ts.map +1 -1
  308. package/dist/tools/git-tool.js +13 -3
  309. package/dist/tools/git-tool.js.map +1 -1
  310. package/dist/tools/harness-directive.d.ts +42 -0
  311. package/dist/tools/harness-directive.d.ts.map +1 -0
  312. package/dist/tools/harness-directive.js +45 -0
  313. package/dist/tools/harness-directive.js.map +1 -0
  314. package/dist/tools/loop-skill-hint.d.ts +74 -174
  315. package/dist/tools/loop-skill-hint.d.ts.map +1 -1
  316. package/dist/tools/loop-skill-hint.js +110 -536
  317. package/dist/tools/loop-skill-hint.js.map +1 -1
  318. package/dist/tools/mcp-client-tool.d.ts +2 -0
  319. package/dist/tools/mcp-client-tool.d.ts.map +1 -1
  320. package/dist/tools/mcp-client-tool.js +3 -0
  321. package/dist/tools/mcp-client-tool.js.map +1 -1
  322. package/dist/tools/modality/shared.d.ts +1 -4
  323. package/dist/tools/modality/shared.d.ts.map +1 -1
  324. package/dist/tools/modality/shared.js +7 -22
  325. package/dist/tools/modality/shared.js.map +1 -1
  326. package/dist/tools/plan-store.d.ts +20 -2
  327. package/dist/tools/plan-store.d.ts.map +1 -1
  328. package/dist/tools/plan-store.js +51 -7
  329. package/dist/tools/plan-store.js.map +1 -1
  330. package/dist/tools/registry.d.ts +76 -3
  331. package/dist/tools/registry.d.ts.map +1 -1
  332. package/dist/tools/registry.js +486 -26
  333. package/dist/tools/registry.js.map +1 -1
  334. package/dist/tools/remediation-ladder.d.ts.map +1 -1
  335. package/dist/tools/remediation-ladder.js +8 -0
  336. package/dist/tools/remediation-ladder.js.map +1 -1
  337. package/dist/tools/run-cli.d.ts.map +1 -1
  338. package/dist/tools/run-cli.js +29 -4
  339. package/dist/tools/run-cli.js.map +1 -1
  340. package/dist/tools/run-terminal.d.ts +11 -0
  341. package/dist/tools/run-terminal.d.ts.map +1 -1
  342. package/dist/tools/run-terminal.js +265 -10
  343. package/dist/tools/run-terminal.js.map +1 -1
  344. package/dist/tools/tool-loop.d.ts +321 -13
  345. package/dist/tools/tool-loop.d.ts.map +1 -1
  346. package/dist/tools/tool-loop.js +867 -66
  347. package/dist/tools/tool-loop.js.map +1 -1
  348. package/dist/utils/atomic-store.d.ts +53 -0
  349. package/dist/utils/atomic-store.d.ts.map +1 -0
  350. package/dist/utils/atomic-store.js +178 -0
  351. package/dist/utils/atomic-store.js.map +1 -0
  352. package/dist/utils/binary-probe.d.ts +25 -0
  353. package/dist/utils/binary-probe.d.ts.map +1 -0
  354. package/dist/utils/binary-probe.js +48 -0
  355. package/dist/utils/binary-probe.js.map +1 -0
  356. package/dist/utils/workspace-path.d.ts +50 -0
  357. package/dist/utils/workspace-path.d.ts.map +1 -0
  358. package/dist/utils/workspace-path.js +86 -0
  359. package/dist/utils/workspace-path.js.map +1 -0
  360. package/dist/web-dashboard/chat-console.d.ts +24 -0
  361. package/dist/web-dashboard/chat-console.d.ts.map +1 -1
  362. package/dist/web-dashboard/chat-console.js +38 -0
  363. package/dist/web-dashboard/chat-console.js.map +1 -1
  364. package/dist/web-dashboard/project-context.d.ts +27 -2
  365. package/dist/web-dashboard/project-context.d.ts.map +1 -1
  366. package/dist/web-dashboard/project-context.js +32 -2
  367. package/dist/web-dashboard/project-context.js.map +1 -1
  368. package/dist/web-dashboard/server.d.ts +11 -0
  369. package/dist/web-dashboard/server.d.ts.map +1 -1
  370. package/dist/web-dashboard/server.js +362 -11
  371. package/dist/web-dashboard/server.js.map +1 -1
  372. package/dist/web-dashboard/src/types.d.ts +170 -1
  373. package/dist/web-dashboard/src/types.d.ts.map +1 -1
  374. package/dist/web-dashboard/workspace-guard.d.ts +11 -2
  375. package/dist/web-dashboard/workspace-guard.d.ts.map +1 -1
  376. package/dist/web-dashboard/workspace-guard.js +24 -12
  377. package/dist/web-dashboard/workspace-guard.js.map +1 -1
  378. package/dist/web-dashboard/workspace-resolution.d.ts +87 -0
  379. package/dist/web-dashboard/workspace-resolution.d.ts.map +1 -0
  380. package/dist/web-dashboard/workspace-resolution.js +105 -0
  381. package/dist/web-dashboard/workspace-resolution.js.map +1 -0
  382. package/package.json +1 -1
  383. package/src/web-dashboard/public/assets/index-zjbdJnO-.js +210 -0
  384. package/src/web-dashboard/public/assets/index-zjbdJnO-.js.map +1 -0
  385. package/src/web-dashboard/public/index.html +1 -1
  386. package/src/web-dashboard/public/assets/index-DhiuR4S2.js +0 -210
  387. package/src/web-dashboard/public/assets/index-DhiuR4S2.js.map +0 -1
@@ -0,0 +1,239 @@
1
+ /**
2
+ * The honest EXHAUSTION REPORT (fix_model_routing P4, invariants 2, 4 and 7).
3
+ *
4
+ * WHY THIS EXISTS. When every reachable model has been tried and the task is
5
+ * still not delivered, the old answer was a one-line apology plus — worse — a
6
+ * question: *"Want me to retry? Reply yes."* That makes the USER the retry
7
+ * button, which is the single clearest way to fail them: a competent operator
8
+ * does not walk back to the requester to ask permission to try the next worker,
9
+ * and they certainly do not do it after the requester already asked once. The
10
+ * user's own words: *"if user need to say retry that we are failing."*
11
+ *
12
+ * So the report's job is to say, in plain language and with NO follow-up
13
+ * question:
14
+ *
15
+ * 1. what was tried, per model, and why each one did not answer;
16
+ * 2. which targets are exhausted vs. DEAD vs. merely COOLING DOWN, and the
17
+ * WALL-CLOCK TIME each cooling one frees up (a wait length is unactionable;
18
+ * "free at 18:42" is something a person can plan around);
19
+ * 3. what the system itself is doing about it (routing to an untried model,
20
+ * or waiting for a window) — stated as the system's job, not the user's;
21
+ * 4. the concrete levers only the user can pull: recharge/replace a rejected
22
+ * credential, knowingly accept a weaker model, or narrow the ask.
23
+ *
24
+ * DETERMINISTIC AND LLM-FREE on purpose. A failure explanation that is itself
25
+ * generated can hallucinate a reason or a time, and this text is the only thing
26
+ * the user has left to trust. Every line here comes from measured state: the
27
+ * failover walk's own attempt log, the routing exclusion ledger, and the pool
28
+ * count — the SAME sources enforcement reads, so the report can never disagree
29
+ * with what routing actually did.
30
+ *
31
+ * It DELIBERATELY does not duplicate `renderModelBreadthReport`'s job of
32
+ * explaining a failure to a caller that still has a retry mechanism available;
33
+ * it is the terminal, "there is nothing left" message, and its distinguishing
34
+ * features are the absolute clocks, the named levers and the refusal to ask the
35
+ * user to trigger anything.
36
+ */
37
+ /** `18:42` in the operator's own clock. Deterministic given a timestamp. */
38
+ export function formatClockTime(ts) {
39
+ const d = new Date(ts);
40
+ const hh = String(d.getHours()).padStart(2, '0');
41
+ const mm = String(d.getMinutes()).padStart(2, '0');
42
+ return `${hh}:${mm}`;
43
+ }
44
+ /** `2m`, `55m`, `3h` — a wait a person can read. */
45
+ export function formatWaitShort(ms) {
46
+ if (ms < 60_000)
47
+ return `${Math.max(1, Math.round(ms / 1000))}s`;
48
+ if (ms < 3_600_000)
49
+ return `${Math.round(ms / 60_000)}m`;
50
+ return `${Math.round(ms / 3_600_000)}h`;
51
+ }
52
+ /**
53
+ * A phrase for a failure kind, in the vocabulary the user can act on.
54
+ *
55
+ * Exported so a caller RECORDING an attempt (chat's own walk) writes the same
56
+ * words the report will print — the alternative is a raw provider message
57
+ * reaching the user, which is how a JSON quota dump once got delivered verbatim
58
+ * as an answer.
59
+ */
60
+ export function describeFailureKind(kind) {
61
+ switch (kind) {
62
+ case 'empty-response':
63
+ return 'answered with nothing (no text, no tool call)';
64
+ case 'rate-limit':
65
+ return 'out of quota for now';
66
+ case 'auth':
67
+ return 'rejected its credential';
68
+ case 'timeout':
69
+ return 'timed out';
70
+ case 'network':
71
+ return 'unreachable (network)';
72
+ case 'model-not-found':
73
+ return 'model not found on that provider';
74
+ case 'context-window':
75
+ return 'the prompt was too large for its window';
76
+ case 'server':
77
+ return 'provider-side error';
78
+ case 'skipped':
79
+ return 'was not tried';
80
+ default:
81
+ return kind && kind !== 'unknown' ? kind : 'failed';
82
+ }
83
+ }
84
+ /**
85
+ * Build the report. Pure: same inputs, same text — no clock reads, no network,
86
+ * no model call (pass `now` explicitly; absent means "measured here").
87
+ */
88
+ export function buildExhaustionReport(input) {
89
+ const now = input.now ?? Date.now();
90
+ const attempts = input.attempts ?? [];
91
+ const exclusions = input.exclusions ?? [];
92
+ const triedAttempts = attempts.filter((a) => !a.skipped);
93
+ const skippedAttempts = attempts.filter((a) => a.skipped);
94
+ const isRuling = (e) => e.source === 'registry' && !!e.model;
95
+ const retired = exclusions.filter(isRuling).map((e) => `${e.provider}/${e.model}`);
96
+ const cooling = exclusions.filter((e) => !isRuling(e));
97
+ const tried = triedAttempts.map((a) => {
98
+ const reason = a.reason?.trim() ? a.reason : describeFailureKind(a.kind);
99
+ return `${a.provider}/${a.model} — ${reason}`;
100
+ });
101
+ const unavailable = [];
102
+ for (const e of cooling) {
103
+ const target = e.model ? `${e.provider}/${e.model}` : e.provider;
104
+ const freeAt = e.expiresAt && e.expiresAt > now ? e.expiresAt : undefined;
105
+ unavailable.push({
106
+ target,
107
+ reason: describeFailureKind(e.kind),
108
+ ...(freeAt ? { freeAt } : {}),
109
+ });
110
+ }
111
+ // Every exclusion that will heal is a legitimate wait option; take the soonest.
112
+ const nextFreeAt = unavailable.reduce((acc, u) => (u.freeAt === undefined ? acc : acc === undefined || u.freeAt < acc ? u.freeAt : acc), undefined);
113
+ const poolMeasured = typeof input.poolSize === 'number';
114
+ const poolSize = input.poolSize ?? 0;
115
+ const poolProviders = input.poolProviders ?? 0;
116
+ // A routing gap: the pool was measured, models were reached, and eligible
117
+ // models remained untouched. Presenting that as an outage is the dishonesty
118
+ // the user called out when a healthy pool sat unused behind "no model
119
+ // available".
120
+ const routingGap = poolMeasured && triedAttempts.length > 0 && poolSize > triedAttempts.length;
121
+ const emptyPool = poolMeasured && poolSize === 0;
122
+ const parts = [];
123
+ const attemptCount = triedAttempts.length;
124
+ parts.push(input.task
125
+ ? `I couldn't finish: ${input.task.slice(0, 120)}`
126
+ : "I couldn't finish this one.");
127
+ const cause = input.cause?.trim();
128
+ if (cause)
129
+ parts.push(`Reason: ${cause}`);
130
+ if (attemptCount > 0) {
131
+ parts.push('');
132
+ parts.push(`Tried ${attemptCount} model${attemptCount === 1 ? '' : 's'}, and every one of them was unable to do it:`);
133
+ for (const line of tried.slice(0, 8))
134
+ parts.push(` • ${line}`);
135
+ if (tried.length > 8)
136
+ parts.push(` • …and ${tried.length - 8} more`);
137
+ }
138
+ else if (skippedAttempts.length > 0) {
139
+ parts.push('');
140
+ parts.push(`No model could even be called: ${skippedAttempts.length} candidate${skippedAttempts.length === 1 ? ' was' : 's were'} ruled out before a request went out.`);
141
+ }
142
+ if (unavailable.length > 0) {
143
+ parts.push('');
144
+ parts.push('Unavailable right now, and when each comes back:');
145
+ for (const u of unavailable.slice(0, 8)) {
146
+ const when = u.freeAt ? `free at ${formatClockTime(u.freeAt)} (about ${formatWaitShort(u.freeAt - now)})` : 'no reset window — this one needs a fix, not patience';
147
+ parts.push(` • ${u.target} — ${u.reason}; ${when}`);
148
+ }
149
+ }
150
+ if (retired.length > 0) {
151
+ parts.push('');
152
+ parts.push('Ruled out (that model does not exist on that provider):');
153
+ for (const r of retired.slice(0, 4))
154
+ parts.push(` • ${r}`);
155
+ }
156
+ let poolClaim;
157
+ if (poolMeasured && !emptyPool) {
158
+ poolClaim = `${poolSize} model${poolSize === 1 ? '' : 's'} across ${poolProviders} provider${poolProviders === 1 ? '' : 's'} were eligible at the time.`;
159
+ parts.push('');
160
+ parts.push(poolClaim);
161
+ }
162
+ // ── What the SYSTEM is doing (never a question to the user) ──────────────
163
+ parts.push('');
164
+ if (routingGap) {
165
+ parts.push(`This was a routing gap, not a shortage: only ${attemptCount} of ${poolSize} eligible models were actually tried. The next attempt routes to an untried model automatically — you do not need to trigger anything.`);
166
+ }
167
+ else if (emptyPool) {
168
+ parts.push('No model was eligible at all — the pool is empty (no usable credential, or every model is ruled out).');
169
+ }
170
+ else if (attemptCount === 0) {
171
+ parts.push('The model layer failed before it could try anything, which is a transport problem rather than a missing model.');
172
+ }
173
+ // ── The levers only the user can pull ────────────────────────────────────
174
+ const options = [];
175
+ const needsKey = exclusions.filter((e) => e.kind === 'auth');
176
+ if (needsKey.length > 0) {
177
+ options.push({
178
+ code: 'recharge',
179
+ text: `Recharge or replace the credential for ${[...new Set(needsKey.map((e) => e.provider))].join(', ')} — it was rejected, so no amount of waiting fixes it.`,
180
+ });
181
+ }
182
+ const quotaBound = exclusions.filter((e) => e.kind === 'rate-limit');
183
+ if (quotaBound.length > 0) {
184
+ options.push({
185
+ code: 'recharge',
186
+ text: `Raise the quota / add a key for ${[...new Set(quotaBound.map((e) => e.provider))].join(', ')} if you need this done sooner than their reset window.`,
187
+ });
188
+ }
189
+ if (nextFreeAt !== undefined) {
190
+ options.push({
191
+ code: 'wait',
192
+ text: `Wait — a capable model frees up at ${formatClockTime(nextFreeAt)}, about ${formatWaitShort(nextFreeAt - now)} from now. Ask again after that and it will be used automatically.`,
193
+ });
194
+ }
195
+ options.push({
196
+ code: 'weaker-model',
197
+ text: 'Allow a weaker or cheaper model for this task and accept that its answer may need more checking.',
198
+ });
199
+ options.push({
200
+ code: 'narrow',
201
+ text: 'Narrow the ask — one file, one change, or one question at a time — so a smaller (or cheaper) model can finish it.',
202
+ });
203
+ if (options.length > 0) {
204
+ parts.push('');
205
+ parts.push('Things that would unblock it:');
206
+ for (const o of options)
207
+ parts.push(` • ${o.text}`);
208
+ }
209
+ return {
210
+ headline: parts[0],
211
+ tried,
212
+ unavailable,
213
+ retired,
214
+ ...(poolClaim ? { poolClaim } : {}),
215
+ routingGap,
216
+ ...(nextFreeAt !== undefined ? { nextFreeAt } : {}),
217
+ options,
218
+ text: parts.join('\n'),
219
+ };
220
+ }
221
+ /**
222
+ * The report, or `undefined` when there is genuinely nothing concrete to say.
223
+ *
224
+ * Silent-when-empty is deliberate: a caller that already has an actionable line
225
+ * ("the provider rejected the key") must keep it rather than trade it for an
226
+ * empty report. "Concrete" means exactly one thing — a model was reached, or
227
+ * something was ruled out. A report with neither is not evidence of exhaustion.
228
+ */
229
+ export function renderExhaustionReport(input) {
230
+ const attempts = input.attempts ?? [];
231
+ const exclusions = input.exclusions ?? [];
232
+ // A measured pool size is NOT evidence: a governance refusal, a bad pin or a
233
+ // caller bug all fail with a perfectly healthy pool and no attempt at all, and
234
+ // dressing those up as exhaustion would be a new lie in place of the old one.
235
+ if (attempts.length === 0 && exclusions.length === 0)
236
+ return undefined;
237
+ return buildExhaustionReport(input).text;
238
+ }
239
+ //# sourceMappingURL=exhaustion-report.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"exhaustion-report.js","sourceRoot":"","sources":["../../src/learning/exhaustion-report.ts"],"names":[],"mappings":"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"}
@@ -67,6 +67,22 @@ export declare function isModelSessionExcluded(session: FailureSessionState, pro
67
67
  * session-level exclusion and the breaker's scoring cooldown expire together.
68
68
  */
69
69
  export declare const RATE_LIMIT_EXCLUSION_MS: number;
70
+ /**
71
+ * How long a provider × model pair is excluded after it resolved with NOTHING
72
+ * usable — an HTTP 200 carrying neither answer text nor a tool call (see
73
+ * `response-usability.ts`).
74
+ *
75
+ * MODEL-scoped on purpose, and never escalated to the provider: the transport
76
+ * worked and the provider answered, so its OTHER models are very often
77
+ * perfectly healthy — the live case was one local model returning nothing on
78
+ * five consecutive steps while Gemini sat configured and unused. Two minutes is
79
+ * long enough to cover a turn plus its retries, short enough that a genuinely
80
+ * transient empty self-heals with no user action.
81
+ *
82
+ * The failover walk (`resilient-call.ts`) uses this same constant for its own
83
+ * pair exclusion, so the session and cross-pipeline windows cannot drift.
84
+ */
85
+ export declare const EMPTY_RESPONSE_SESSION_EXCLUSION_MS: number;
70
86
  export declare const RAPID_FAILURE_WINDOW_MS: number;
71
87
  export declare const RAPID_FAILURE_THRESHOLD = 3;
72
88
  export declare const RAPID_FAILURE_COOLDOWN_MS: number;
@@ -1 +1 @@
1
- {"version":3,"file":"failure-bookkeeping.d.ts","sourceRoot":"","sources":["../../src/learning/failure-bookkeeping.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;GAkBG;AAEH,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC;AAsC1D,MAAM,WAAW,mBAAmB;IAClC;;;;;OAKG;IACH,sBAAsB,EAAE,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAC5C;;;OAGG;IACH,+BAA+B,EAAE,GAAG,CAAC,MAAM,CAAC,CAAC;IAC7C;;;;;;;;;OASG;IACH,mBAAmB,CAAC,EAAE,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAC1C;;;;;OAKG;IACH,aAAa,CAAC,EAAE,GAAG,CAAC,MAAM,EAAE,MAAM,EAAE,CAAC,CAAC;CACvC;AAED;gFACgF;AAChF,eAAO,MAAM,qCAAqC,IAAI,CAAC;AAEvD,2DAA2D;AAC3D,wBAAgB,iBAAiB,CAAC,YAAY,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,MAAM,CAE7E;AAED;;;;GAIG;AACH,wBAAgB,sBAAsB,CACpC,OAAO,EAAE,mBAAmB,EAC5B,YAAY,EAAE,MAAM,EACpB,KAAK,EAAE,MAAM,GAAG,SAAS,EACzB,GAAG,GAAE,MAAmB,GACvB,OAAO,CAIT;AAID;;;;GAIG;AACH,eAAO,MAAM,uBAAuB,QAAgB,CAAC;AAarD,eAAO,MAAM,uBAAuB,QAAY,CAAC;AAEjD,eAAO,MAAM,uBAAuB,IAAI,CAAC;AAEzC,eAAO,MAAM,yBAAyB,QAAY,CAAC;AAEnD;;;;;GAKG;AACH,wBAAgB,kBAAkB,CAChC,OAAO,EAAE,mBAAmB,EAC5B,YAAY,EAAE,MAAM,EACpB,GAAG,GAAE,MAAmB,GACvB,OAAO,CAMT;AAED,0EAA0E;AAC1E,wBAAgB,sBAAsB,CACpC,OAAO,EAAE,mBAAmB,EAC5B,YAAY,EAAE,MAAM,EACpB,GAAG,GAAE,MAAmB,GACvB,OAAO,CAIT;AAED;;;;;GAKG;AACH,eAAO,MAAM,8BAA8B,QAAY,CAAC;AAIxD;;;;;;;;;;;;;;;;GAgBG;AACH,wBAAgB,mBAAmB,CACjC,OAAO,EAAE,mBAAmB,EAC5B,YAAY,EAAE,MAAM,EACpB,GAAG,EAAE,OAAO,EACZ,aAAa,EAAE,aAAa,EAC5B,OAAO,CAAC,EAAE;IAAE,KAAK,CAAC,EAAE,MAAM,CAAC;IAAC,MAAM,CAAC,EAAE,MAAM,CAAC;IAAC,MAAM,CAAC,EAAE,MAAM,CAAA;CAAE,GAC7D,IAAI,CA2KN"}
1
+ {"version":3,"file":"failure-bookkeeping.d.ts","sourceRoot":"","sources":["../../src/learning/failure-bookkeeping.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;GAkBG;AAEH,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC;AAsC1D,MAAM,WAAW,mBAAmB;IAClC;;;;;OAKG;IACH,sBAAsB,EAAE,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAC5C;;;OAGG;IACH,+BAA+B,EAAE,GAAG,CAAC,MAAM,CAAC,CAAC;IAC7C;;;;;;;;;OASG;IACH,mBAAmB,CAAC,EAAE,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAC1C;;;;;OAKG;IACH,aAAa,CAAC,EAAE,GAAG,CAAC,MAAM,EAAE,MAAM,EAAE,CAAC,CAAC;CACvC;AAED;gFACgF;AAChF,eAAO,MAAM,qCAAqC,IAAI,CAAC;AAEvD,2DAA2D;AAC3D,wBAAgB,iBAAiB,CAAC,YAAY,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,MAAM,CAE7E;AAED;;;;GAIG;AACH,wBAAgB,sBAAsB,CACpC,OAAO,EAAE,mBAAmB,EAC5B,YAAY,EAAE,MAAM,EACpB,KAAK,EAAE,MAAM,GAAG,SAAS,EACzB,GAAG,GAAE,MAAmB,GACvB,OAAO,CAIT;AAID;;;;GAIG;AACH,eAAO,MAAM,uBAAuB,QAAgB,CAAC;AAErD;;;;;;;;;;;;;;GAcG;AACH,eAAO,MAAM,mCAAmC,QAAgB,CAAC;AAajE,eAAO,MAAM,uBAAuB,QAAY,CAAC;AAEjD,eAAO,MAAM,uBAAuB,IAAI,CAAC;AAEzC,eAAO,MAAM,yBAAyB,QAAY,CAAC;AAEnD;;;;;GAKG;AACH,wBAAgB,kBAAkB,CAChC,OAAO,EAAE,mBAAmB,EAC5B,YAAY,EAAE,MAAM,EACpB,GAAG,GAAE,MAAmB,GACvB,OAAO,CAMT;AAED,0EAA0E;AAC1E,wBAAgB,sBAAsB,CACpC,OAAO,EAAE,mBAAmB,EAC5B,YAAY,EAAE,MAAM,EACpB,GAAG,GAAE,MAAmB,GACvB,OAAO,CAIT;AAED;;;;;GAKG;AACH,eAAO,MAAM,8BAA8B,QAAY,CAAC;AAIxD;;;;;;;;;;;;;;;;GAgBG;AACH,wBAAgB,mBAAmB,CACjC,OAAO,EAAE,mBAAmB,EAC5B,YAAY,EAAE,MAAM,EACpB,GAAG,EAAE,OAAO,EACZ,aAAa,EAAE,aAAa,EAC5B,OAAO,CAAC,EAAE;IAAE,KAAK,CAAC,EAAE,MAAM,CAAC;IAAC,MAAM,CAAC,EAAE,MAAM,CAAC;IAAC,MAAM,CAAC,EAAE,MAAM,CAAA;CAAE,GAC7D,IAAI,CA0MN"}
@@ -65,6 +65,22 @@ export function isModelSessionExcluded(session, providerType, model, now = Date.
65
65
  * session-level exclusion and the breaker's scoring cooldown expire together.
66
66
  */
67
67
  export const RATE_LIMIT_EXCLUSION_MS = 2 * 60 * 1000;
68
+ /**
69
+ * How long a provider × model pair is excluded after it resolved with NOTHING
70
+ * usable — an HTTP 200 carrying neither answer text nor a tool call (see
71
+ * `response-usability.ts`).
72
+ *
73
+ * MODEL-scoped on purpose, and never escalated to the provider: the transport
74
+ * worked and the provider answered, so its OTHER models are very often
75
+ * perfectly healthy — the live case was one local model returning nothing on
76
+ * five consecutive steps while Gemini sat configured and unused. Two minutes is
77
+ * long enough to cover a turn plus its retries, short enough that a genuinely
78
+ * transient empty self-heals with no user action.
79
+ *
80
+ * The failover walk (`resilient-call.ts`) uses this same constant for its own
81
+ * pair exclusion, so the session and cross-pipeline windows cannot drift.
82
+ */
83
+ export const EMPTY_RESPONSE_SESSION_EXCLUSION_MS = 2 * 60 * 1000;
68
84
  // ─── T4 — RPM/TPM rapid-failure breaker ─────────────────────────────────────
69
85
  //
70
86
  // Free tiers meter requests/tokens PER MINUTE, but a 429 with no reset hint
@@ -265,6 +281,25 @@ export function recordActionFailure(session, providerType, err, configManager, o
265
281
  // other keys of the same provider stay usable).
266
282
  parkAccountForKey(providerType, options?.apiKey, now + parkMs, failureKind);
267
283
  }
284
+ else if (failureKind === 'empty-response') {
285
+ // ── An empty completion is a MODEL failure, not a provider outage ──────
286
+ // The provider answered (HTTP 200, a real response body) and simply carried
287
+ // no text and no tool call. So the pair is what must rest — exclude it and
288
+ // leave its SIBLINGS routable, or one dead model would take a healthy
289
+ // provider's whole model list out of the running. No quota park: nothing was
290
+ // rate-limited, and the registry already parks this exact pair for
291
+ // `EMPTY_RESPONSE_PARK_MS` (see `model-registry.recordCall`).
292
+ const failingModel = options?.model;
293
+ if (session.sessionFailedModels && failingModel && failingModel !== 'default') {
294
+ session.sessionFailedModels.set(modelExclusionKey(providerType, failingModel), now + EMPTY_RESPONSE_SESSION_EXCLUSION_MS);
295
+ }
296
+ else {
297
+ // No model attribution available — the provider is the only thing we can
298
+ // hold back, so fall back to the transient provider exclusion.
299
+ session.sessionFailedProviders.set(providerType, now + TRANSIENT_FAILURE_EXCLUSION_MS);
300
+ session.sessionTransientFailedProviders.add(providerType);
301
+ }
302
+ }
268
303
  else {
269
304
  // Server / network / timeout / unknown — transient but definitive enough
270
305
  // that the next message shouldn't re-pick this provider. Short cooldown,
@@ -290,11 +325,22 @@ export function recordActionFailure(session, providerType, err, configManager, o
290
325
  // ── 6. Shared circuit breaker ─────────────────────────────────────────
291
326
  // Repeated failures open the breaker so the auto router deprioritizes the
292
327
  // provider by scoring even for transient errors.
293
- try {
294
- getProviderFallback(configManager).recordFailure(providerType);
295
- }
296
- catch {
297
- // Best-effort — circuit-breaker bookkeeping must not crash a call.
328
+ //
329
+ // EXCEPT for an empty-response: the breaker is PROVIDER-scoped, and an empty
330
+ // completion is a MODEL property — the provider answered, on time, with a
331
+ // well-formed HTTP 200. Tripping its breaker would deprioritize every healthy
332
+ // sibling on that provider because one model returned nothing, which is the
333
+ // same corruption the harness-fault guard at the top of this function exists
334
+ // to prevent. The pair is already parked in the registry (see
335
+ // `model-registry.recordCall`), so the model rests without the provider paying
336
+ // for it.
337
+ if (failureKind !== 'empty-response') {
338
+ try {
339
+ getProviderFallback(configManager).recordFailure(providerType);
340
+ }
341
+ catch {
342
+ // Best-effort — circuit-breaker bookkeeping must not crash a call.
343
+ }
298
344
  }
299
345
  }
300
346
  //# sourceMappingURL=failure-bookkeeping.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"failure-bookkeeping.js","sourceRoot":"","sources":["../../src/learning/failure-bookkeeping.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"failure-bookkeeping.js","sourceRoot":"","sources":["../../src/learning/failure-bookkeeping.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;GAkBG;AAGH,OAAO,EAAE,cAAc,EAAE,eAAe,EAAE,MAAM,mBAAmB,CAAC;AACpE,OAAO,EAAE,aAAa,EAAE,MAAM,kBAAkB,CAAC;AACjD,OAAO,EACL,qBAAqB,EACrB,mBAAmB,EACnB,mBAAmB,EACnB,cAAc,EACd,sBAAsB,EACtB,qBAAqB,GAEtB,MAAM,wBAAwB,CAAC;AAEhC,+EAA+E;AAE/E;;;GAGG;AACH;;;;GAIG;AACH,SAAS,iBAAiB,CACxB,YAAoB,EACpB,MAA0B,EAC1B,KAAa,EACb,MAAc;IAEd,IAAI,CAAC,MAAM;QAAE,OAAO;IACpB,IAAI,CAAC;QACH,cAAc,EAAE,CAAC,WAAW,CAAC,YAAY,EAAE,eAAe,CAAC,MAAM,CAAC,EAAE,KAAK,EAAE,MAAM,CAAC,CAAC;IACrF,CAAC;IAAC,MAAM,CAAC;QACP,2DAA2D;IAC7D,CAAC;AACH,CAAC;AAmCD;gFACgF;AAChF,MAAM,CAAC,MAAM,qCAAqC,GAAG,CAAC,CAAC;AAEvD,2DAA2D;AAC3D,MAAM,UAAU,iBAAiB,CAAC,YAAoB,EAAE,KAAa;IACnE,OAAO,GAAG,YAAY,IAAI,KAAK,EAAE,CAAC;AACpC,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,sBAAsB,CACpC,OAA4B,EAC5B,YAAoB,EACpB,KAAyB,EACzB,MAAc,IAAI,CAAC,GAAG,EAAE;IAExB,IAAI,CAAC,KAAK,IAAI,CAAC,OAAO,CAAC,mBAAmB;QAAE,OAAO,KAAK,CAAC;IACzD,MAAM,SAAS,GAAG,OAAO,CAAC,mBAAmB,CAAC,GAAG,CAAC,iBAAiB,CAAC,YAAY,EAAE,KAAK,CAAC,CAAC,CAAC;IAC1F,OAAO,SAAS,KAAK,SAAS,IAAI,SAAS,GAAG,GAAG,CAAC;AACpD,CAAC;AAED,+EAA+E;AAE/E;;;;GAIG;AACH,MAAM,CAAC,MAAM,uBAAuB,GAAG,CAAC,GAAG,EAAE,GAAG,IAAI,CAAC;AAErD;;;;;;;;;;;;;;GAcG;AACH,MAAM,CAAC,MAAM,mCAAmC,GAAG,CAAC,GAAG,EAAE,GAAG,IAAI,CAAC;AAEjE,+EAA+E;AAC/E,EAAE;AACF,4EAA4E;AAC5E,+EAA+E;AAC/E,6EAA6E;AAC7E,4EAA4E;AAC5E,+EAA+E;AAC/E,0EAA0E;AAC1E,gFAAgF;AAChF,gDAAgD;AAEhD,MAAM,CAAC,MAAM,uBAAuB,GAAG,EAAE,GAAG,IAAI,CAAC;AAEjD,MAAM,CAAC,MAAM,uBAAuB,GAAG,CAAC,CAAC;AAEzC,MAAM,CAAC,MAAM,yBAAyB,GAAG,EAAE,GAAG,IAAI,CAAC;AAEnD;;;;;GAKG;AACH,MAAM,UAAU,kBAAkB,CAChC,OAA4B,EAC5B,YAAoB,EACpB,MAAc,IAAI,CAAC,GAAG,EAAE;IAExB,MAAM,GAAG,GAAG,CAAC,OAAO,CAAC,aAAa,KAAK,IAAI,GAAG,EAAoB,CAAC,CAAC;IACpE,MAAM,KAAK,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,YAAY,CAAC,IAAI,EAAE,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,GAAG,GAAG,CAAC,GAAG,uBAAuB,CAAC,CAAC;IAC7F,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;IAChB,GAAG,CAAC,GAAG,CAAC,YAAY,EAAE,KAAK,CAAC,CAAC;IAC7B,OAAO,KAAK,CAAC,MAAM,IAAI,uBAAuB,CAAC;AACjD,CAAC;AAED,0EAA0E;AAC1E,MAAM,UAAU,sBAAsB,CACpC,OAA4B,EAC5B,YAAoB,EACpB,MAAc,IAAI,CAAC,GAAG,EAAE;IAExB,MAAM,KAAK,GAAG,OAAO,CAAC,aAAa,EAAE,GAAG,CAAC,YAAY,CAAC,CAAC;IACvD,IAAI,CAAC,KAAK;QAAE,OAAO,KAAK,CAAC;IACzB,OAAO,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,GAAG,GAAG,CAAC,GAAG,uBAAuB,CAAC,CAAC,MAAM,IAAI,uBAAuB,CAAC;AAClG,CAAC;AAED;;;;;GAKG;AACH,MAAM,CAAC,MAAM,8BAA8B,GAAG,EAAE,GAAG,IAAI,CAAC;AAExD,+EAA+E;AAE/E;;;;;;;;;;;;;;;;GAgBG;AACH,MAAM,UAAU,mBAAmB,CACjC,OAA4B,EAC5B,YAAoB,EACpB,GAAY,EACZ,aAA4B,EAC5B,OAA8D;IAE9D,MAAM,WAAW,GAAG,qBAAqB,CAAC,GAAG,CAAC,CAAC;IAC/C,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;IAEvB,0EAA0E;IAC1E,sEAAsE;IACtE,8EAA8E;IAC9E,+EAA+E;IAC/E,8EAA8E;IAC9E,4EAA4E;IAC5E,8EAA8E;IAC9E,2EAA2E;IAC3E,gDAAgD;IAChD,EAAE;IACF,6EAA6E;IAC7E,2EAA2E;IAC3E,+EAA+E;IAC/E,+EAA+E;IAC/E,qEAAqE;IACrE,IAAI,cAAc,CAAC,GAAG,CAAC,EAAE,CAAC;QACxB,IAAI,CAAC;YACH,cAAc,EAAE,CAAC,WAAW,CAAC,UAAU,EAAE,YAAY,EAAE,gCAAgC,CAAC,CAAC;QAC3F,CAAC;QAAC,MAAM,CAAC;YACP,yDAAyD;QAC3D,CAAC;QACD,OAAO;IACT,CAAC;IAED,yEAAyE;IACzE,IAAI,WAAW,KAAK,MAAM,EAAE,CAAC;QAC3B,8DAA8D;QAC9D,OAAO,CAAC,sBAAsB,CAAC,GAAG,CAAC,YAAY,EAAE,MAAM,CAAC,gBAAgB,CAAC,CAAC;QAC1E,wEAAwE;QACxE,2EAA2E;QAC3E,iBAAiB,CAAC,YAAY,EAAE,OAAO,EAAE,MAAM,EAAE,MAAM,CAAC,gBAAgB,EAAE,WAAW,CAAC,CAAC;QACvF,wEAAwE;QACxE,2EAA2E;QAC3E,wEAAwE;QACxE,mEAAmE;QACnE,IAAI,CAAC;YACH,aAAa,EAAE,CAAC,iBAAiB,CAAC,YAAY,EAAE,aAAa,EAAE,OAAO,EAAE,MAAM,CAAC,CAAC;QAClF,CAAC;QAAC,MAAM,CAAC;YACP,qDAAqD;QACvD,CAAC;IACH,CAAC;SAAM,IAAI,WAAW,KAAK,YAAY,EAAE,CAAC;QACxC,qEAAqE;QACrE,+DAA+D;QAC/D,EAAE;QACF,2EAA2E;QAC3E,4EAA4E;QAC5E,6EAA6E;QAC7E,oEAAoE;QACpE,0EAA0E;QAC1E,2EAA2E;QAC3E,2BAA2B;QAC3B,MAAM,YAAY,GAAG,OAAO,EAAE,KAAK,CAAC;QACpC,MAAM,WAAW,GAAG,CAAC,CAAC,OAAO,CAAC,mBAAmB,IAAI,CAAC,CAAC,YAAY,IAAI,YAAY,KAAK,SAAS,CAAC;QAClG,IAAI,WAAW,EAAE,CAAC;YAChB,OAAO,CAAC,mBAAoB,CAAC,GAAG,CAC9B,iBAAiB,CAAC,YAAY,EAAE,YAAa,CAAC,EAC9C,GAAG,GAAG,uBAAuB,CAC9B,CAAC;QACJ,CAAC;aAAM,CAAC;YACN,OAAO,CAAC,sBAAsB,CAAC,GAAG,CAAC,YAAY,EAAE,GAAG,GAAG,uBAAuB,CAAC,CAAC;QAClF,CAAC;QACD,uEAAuE;QACvE,sEAAsE;QACtE,uEAAuE;QACvE,sEAAsE;QACtE,oEAAoE;QACpE,yEAAyE;QACzE,sEAAsE;QACtE,uEAAuE;QACvE,wCAAwC;QACxC,IAAI,QAAgB,CAAC;QACrB,IAAI,iBAAiB,GAAG,KAAK,CAAC;QAC9B,IAAI,CAAC;YACH,MAAM,KAAK,GAAG,aAAa,CAAC,MAAM,EAAE,CAAC,OAAO,EAAE,KAAK,EAAE,CAAC,YAAY,CAAC,CAAC;YACpE,IAAI,KAAK,EAAE,QAAQ,IAAI,IAAI,EAAE,CAAC;gBAC5B,QAAQ,GAAG,KAAK,CAAC,QAAQ,CAAC;gBAC1B,iBAAiB,GAAG,IAAI,CAAC;YAC3B,CAAC;iBAAM,CAAC;gBACN,QAAQ,GAAG,EAAE,GAAG,IAAI,CAAC,CAAC,uCAAuC;YAC/D,CAAC;QACH,CAAC;QAAC,MAAM,CAAC;YACP,QAAQ,GAAG,EAAE,GAAG,IAAI,CAAC;QACvB,CAAC;QACD,+DAA+D;QAC/D,sEAAsE;QACtE,uEAAuE;QACvE,wEAAwE;QACxE,yEAAyE;QACzE,uEAAuE;QACvE,iEAAiE;QACjE,MAAM,MAAM,GAAG,mBAAmB,CAAC,GAAG,CAAC,CAAC;QACxC,+DAA+D;QAC/D,sEAAsE;QACtE,0EAA0E;QAC1E,iFAAiF;QACjF,4EAA4E;QAC5E,IAAI,MAAM,GACR,MAAM,KAAK,IAAI;YACb,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,MAAM,EAAE,sBAAsB,CAAC,CAAC,mDAAmD;YAC9F,CAAC,CAAC,iBAAiB,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,sBAAsB,CAAC;QAC5D,2EAA2E;QAC3E,6EAA6E;QAC7E,yEAAyE;QACzE,8EAA8E;QAC9E,6CAA6C;QAC7C,IAAI,kBAAkB,CAAC,OAAO,EAAE,YAAY,EAAE,GAAG,CAAC,EAAE,CAAC;YACnD,MAAM,GAAG,IAAI,CAAC,GAAG,CAAC,MAAM,EAAE,yBAAyB,CAAC,CAAC;QACvD,CAAC;QACD,yEAAyE;QACzE,sEAAsE;QACtE,2EAA2E;QAC3E,4EAA4E;QAC5E,iDAAiD;QACjD,IAAI,CAAC;YACH,MAAM,MAAM,GAAG,cAAc,EAAE,CAAC;YAChC,IAAI,YAAY,IAAI,YAAY,KAAK,SAAS,EAAE,CAAC;gBAC/C,MAAM,CAAC,SAAS,CAAC,YAAY,EAAE,YAAY,EAAE,GAAG,GAAG,MAAM,EAAE,WAAW,CAAC,CAAC;gBACxE,wEAAwE;gBACxE,qEAAqE;gBACrE,wEAAwE;gBACxE,uEAAuE;gBACvE,IAAI,MAAM,CAAC,mBAAmB,CAAC,YAAY,CAAC,IAAI,qCAAqC,EAAE,CAAC;oBACtF,MAAM,CAAC,YAAY,CAAC,YAAY,EAAE,GAAG,GAAG,MAAM,EAAE,GAAG,WAAW,yBAAyB,CAAC,CAAC;oBACzF,+DAA+D;oBAC/D,OAAO,CAAC,sBAAsB,CAAC,GAAG,CAAC,YAAY,EAAE,GAAG,GAAG,uBAAuB,CAAC,CAAC;gBAClF,CAAC;YACH,CAAC;iBAAM,CAAC;gBACN,MAAM,CAAC,YAAY,CAAC,YAAY,EAAE,GAAG,GAAG,MAAM,EAAE,WAAW,CAAC,CAAC;YAC/D,CAAC;QACH,CAAC;QAAC,MAAM,CAAC;YACP,0DAA0D;QAC5D,CAAC;QACD,mEAAmE;QACnE,gDAAgD;QAChD,iBAAiB,CAAC,YAAY,EAAE,OAAO,EAAE,MAAM,EAAE,GAAG,GAAG,MAAM,EAAE,WAAW,CAAC,CAAC;IAC9E,CAAC;SAAM,IAAI,WAAW,KAAK,gBAAgB,EAAE,CAAC;QAC5C,0EAA0E;QAC1E,4EAA4E;QAC5E,2EAA2E;QAC3E,sEAAsE;QACtE,6EAA6E;QAC7E,mEAAmE;QACnE,8DAA8D;QAC9D,MAAM,YAAY,GAAG,OAAO,EAAE,KAAK,CAAC;QACpC,IAAI,OAAO,CAAC,mBAAmB,IAAI,YAAY,IAAI,YAAY,KAAK,SAAS,EAAE,CAAC;YAC9E,OAAO,CAAC,mBAAmB,CAAC,GAAG,CAC7B,iBAAiB,CAAC,YAAY,EAAE,YAAY,CAAC,EAC7C,GAAG,GAAG,mCAAmC,CAC1C,CAAC;QACJ,CAAC;aAAM,CAAC;YACN,yEAAyE;YACzE,+DAA+D;YAC/D,OAAO,CAAC,sBAAsB,CAAC,GAAG,CAAC,YAAY,EAAE,GAAG,GAAG,8BAA8B,CAAC,CAAC;YACvF,OAAO,CAAC,+BAA+B,CAAC,GAAG,CAAC,YAAY,CAAC,CAAC;QAC5D,CAAC;IACH,CAAC;SAAM,CAAC;QACN,yEAAyE;QACzE,yEAAyE;QACzE,qEAAqE;QACrE,iEAAiE;QACjE,OAAO,CAAC,sBAAsB,CAAC,GAAG,CAAC,YAAY,EAAE,GAAG,GAAG,8BAA8B,CAAC,CAAC;QACvF,OAAO,CAAC,+BAA+B,CAAC,GAAG,CAAC,YAAY,CAAC,CAAC;IAC5D,CAAC;IAED,yEAAyE;IACzE,0EAA0E;IAC1E,0EAA0E;IAC1E,2EAA2E;IAC3E,kEAAkE;IAClE,iEAAiE;IACjE,qBAAqB,CAAC,YAAY,EAAE,OAAO,EAAE,KAAK,EAAE,GAAG,EAAE,WAAW,EAAE,OAAO,EAAE,MAAM,CAAC,CAAC;IAEvF,yEAAyE;IACzE,IAAI,CAAC;QACH,cAAc,EAAE,CAAC,WAAW,CAAC,UAAU,EAAE,YAAY,EAAE,WAAW,CAAC,CAAC;IACtE,CAAC;IAAC,MAAM,CAAC;QACP,4DAA4D;IAC9D,CAAC;IAED,yEAAyE;IACzE,0EAA0E;IAC1E,iDAAiD;IACjD,EAAE;IACF,6EAA6E;IAC7E,0EAA0E;IAC1E,8EAA8E;IAC9E,4EAA4E;IAC5E,6EAA6E;IAC7E,8DAA8D;IAC9D,+EAA+E;IAC/E,UAAU;IACV,IAAI,WAAW,KAAK,gBAAgB,EAAE,CAAC;QACrC,IAAI,CAAC;YACH,mBAAmB,CAAC,aAAa,CAAC,CAAC,aAAa,CAAC,YAAY,CAAC,CAAC;QACjE,CAAC;QAAC,MAAM,CAAC;YACP,mEAAmE;QACrE,CAAC;IACH,CAAC;AACH,CAAC"}
@@ -0,0 +1,39 @@
1
+ /**
2
+ * Gate friction — how much the harness speaks to the model in a turn, summarized
3
+ * from reasoning traces so the dashboard can show the number.
4
+ *
5
+ * Counts every `gate` event (a bounded nudge: plan / verification / deliverable /
6
+ * permission / repeat / action / promise / self-review / diagnosis /
7
+ * malformed-call / prerequisite) and every `refusal` event (a tool declined a
8
+ * call). The per-turn distribution is the number Bundle 37b ("deliver gate text
9
+ * as an acted-on instruction") exists to reduce. This module is the READ side of
10
+ * `scripts/measure-gate-friction.mjs`, so the dashboard and the CLI report the
11
+ * same figure from the same rule.
12
+ *
13
+ * It also counts narration (Bundle 39): a turn whose final answer reuses the
14
+ * harness's own distinctive vocabulary — see `harness-narration.ts`.
15
+ */
16
+ export interface GateFrictionSummary {
17
+ traces: number;
18
+ /** Total gate + refusal events across all traces. */
19
+ events: number;
20
+ perTurn: {
21
+ mean: number;
22
+ median: number;
23
+ p90: number;
24
+ max: number;
25
+ turnsWithAny: number;
26
+ };
27
+ /** Per-gate counts, highest first. */
28
+ byGate: Array<{
29
+ key: string;
30
+ count: number;
31
+ }>;
32
+ /** Turns whose answer narrated the harness (Bundle 39). */
33
+ narration: {
34
+ turns: number;
35
+ echoedMarker: number;
36
+ };
37
+ }
38
+ export declare function summarizeGateFriction(raw: unknown): GateFrictionSummary;
39
+ //# sourceMappingURL=gate-friction.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"gate-friction.d.ts","sourceRoot":"","sources":["../../src/learning/gate-friction.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AAIH,MAAM,WAAW,mBAAmB;IAClC,MAAM,EAAE,MAAM,CAAC;IACf,qDAAqD;IACrD,MAAM,EAAE,MAAM,CAAC;IACf,OAAO,EAAE;QACP,IAAI,EAAE,MAAM,CAAC;QACb,MAAM,EAAE,MAAM,CAAC;QACf,GAAG,EAAE,MAAM,CAAC;QACZ,GAAG,EAAE,MAAM,CAAC;QACZ,YAAY,EAAE,MAAM,CAAC;KACtB,CAAC;IACF,sCAAsC;IACtC,MAAM,EAAE,KAAK,CAAC;QAAE,GAAG,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;IAC9C,2DAA2D;IAC3D,SAAS,EAAE;QAAE,KAAK,EAAE,MAAM,CAAC;QAAC,YAAY,EAAE,MAAM,CAAA;KAAE,CAAC;CACpD;AAyBD,wBAAgB,qBAAqB,CAAC,GAAG,EAAE,OAAO,GAAG,mBAAmB,CAqDvE"}
@@ -0,0 +1,91 @@
1
+ /**
2
+ * Gate friction — how much the harness speaks to the model in a turn, summarized
3
+ * from reasoning traces so the dashboard can show the number.
4
+ *
5
+ * Counts every `gate` event (a bounded nudge: plan / verification / deliverable /
6
+ * permission / repeat / action / promise / self-review / diagnosis /
7
+ * malformed-call / prerequisite) and every `refusal` event (a tool declined a
8
+ * call). The per-turn distribution is the number Bundle 37b ("deliver gate text
9
+ * as an acted-on instruction") exists to reduce. This module is the READ side of
10
+ * `scripts/measure-gate-friction.mjs`, so the dashboard and the CLI report the
11
+ * same figure from the same rule.
12
+ *
13
+ * It also counts narration (Bundle 39): a turn whose final answer reuses the
14
+ * harness's own distinctive vocabulary — see `harness-narration.ts`.
15
+ */
16
+ import { detectHarnessNarration } from './harness-narration.js';
17
+ function normalize(raw) {
18
+ const list = Array.isArray(raw)
19
+ ? raw
20
+ : raw && typeof raw === 'object' && Array.isArray(raw.traces)
21
+ ? raw.traces
22
+ : [];
23
+ return list.filter((t) => Boolean(t) && typeof t === 'object');
24
+ }
25
+ function finalText(trace) {
26
+ const steps = trace.steps ?? [];
27
+ for (let i = steps.length - 1; i >= 0; i--) {
28
+ const t = steps[i]?.responsePreview;
29
+ if (t && String(t).trim())
30
+ return String(t);
31
+ }
32
+ return '';
33
+ }
34
+ export function summarizeGateFriction(raw) {
35
+ const traces = normalize(raw);
36
+ const byKey = new Map();
37
+ const perTurn = [];
38
+ let narrated = 0;
39
+ let echoed = 0;
40
+ for (const trace of traces) {
41
+ let total = 0;
42
+ const harnessTexts = [];
43
+ for (const e of trace.events ?? []) {
44
+ if (!e)
45
+ continue;
46
+ if (e.kind === 'gate') {
47
+ const key = `gate:${e.gate || 'unknown'}`;
48
+ byKey.set(key, (byKey.get(key) ?? 0) + 1);
49
+ total += 1;
50
+ if (e.summary)
51
+ harnessTexts.push(e.summary);
52
+ }
53
+ else if (e.kind === 'refusal') {
54
+ const key = `refusal:${e.gate || e.tool || 'unknown'}`;
55
+ byKey.set(key, (byKey.get(key) ?? 0) + 1);
56
+ total += 1;
57
+ if (e.summary)
58
+ harnessTexts.push(e.summary);
59
+ if (e.result)
60
+ harnessTexts.push(e.result);
61
+ }
62
+ }
63
+ perTurn.push(total);
64
+ if (harnessTexts.length > 0) {
65
+ const text = finalText(trace);
66
+ if (text.includes('[harness]'))
67
+ echoed += 1;
68
+ if (detectHarnessNarration(text, harnessTexts).narrated)
69
+ narrated += 1;
70
+ }
71
+ }
72
+ const sorted = [...perTurn].sort((a, b) => a - b);
73
+ const sum = sorted.reduce((n, v) => n + v, 0);
74
+ const at = (p) => (sorted.length ? sorted[Math.min(sorted.length - 1, Math.floor(p * sorted.length))] : 0);
75
+ return {
76
+ traces: traces.length,
77
+ events: sum,
78
+ perTurn: {
79
+ mean: sorted.length ? Math.round((sum / sorted.length) * 100) / 100 : 0,
80
+ median: at(0.5),
81
+ p90: at(0.9),
82
+ max: sorted.length ? sorted[sorted.length - 1] : 0,
83
+ turnsWithAny: perTurn.filter((n) => n > 0).length,
84
+ },
85
+ byGate: [...byKey.entries()]
86
+ .map(([key, count]) => ({ key, count }))
87
+ .sort((a, b) => b.count - a.count),
88
+ narration: { turns: narrated, echoedMarker: echoed },
89
+ };
90
+ }
91
+ //# sourceMappingURL=gate-friction.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"gate-friction.js","sourceRoot":"","sources":["../../src/learning/gate-friction.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,34 @@
1
+ /**
2
+ * Harness-narration detection — did the model NARRATE the harness back at the
3
+ * user instead of acting on it?
4
+ *
5
+ * WHY THIS EXISTS. Bundle 37b made every gate nudge a marked `[harness]`
6
+ * `system` directive so the model would act on it rather than answer it. That
7
+ * change is only worth having if it is VERIFIABLE on live traces: some turns
8
+ * would still produce prose ABOUT the harness (`"the command guard misfired on a
9
+ * read-only check, so verification was…"`) instead of quietly continuing.
10
+ *
11
+ * HOW IT DETECTS, WITHOUT A PHRASE LIST. It does not look for words like
12
+ * "guard" or "misfire" — that would be a hand-written list of user phrasings,
13
+ * which this codebase forbids. Instead it takes the harness's OWN text (the
14
+ * refusals and gate summaries the trace recorded for that turn) and asks whether
15
+ * the model's answer reuses a DISTINCTIVE token from it: a hyphenated compound
16
+ * (`state-changing`, `read-only`) or a long word (≥10 chars). Those are the
17
+ * tokens that carry the harness's specific vocabulary; a shared one means the
18
+ * model is quoting the loop's language rather than talking about the task.
19
+ *
20
+ * The vocabulary is DERIVED at runtime from the harness's own strings, so it
21
+ * tracks whatever the harness actually says — it can never drift from a list.
22
+ *
23
+ * It is a REPORTER, not a gate: it never changes what the turn does. It exists so
24
+ * "the model stopped narrating the harness" is a measurement (see
25
+ * `scripts/detect-harness-narration.mjs`).
26
+ */
27
+ export interface NarrationVerdict {
28
+ narrated: boolean;
29
+ /** The distinctive tokens the answer shares with the harness text. */
30
+ matches: string[];
31
+ }
32
+ /** The pure check. `harnessTexts` are the harness's own strings for this turn. */
33
+ export declare function detectHarnessNarration(finalText: string, harnessTexts: Array<string | undefined | null>): NarrationVerdict;
34
+ //# sourceMappingURL=harness-narration.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"harness-narration.d.ts","sourceRoot":"","sources":["../../src/learning/harness-narration.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;GAyBG;AAEH,MAAM,WAAW,gBAAgB;IAC/B,QAAQ,EAAE,OAAO,CAAC;IAClB,sEAAsE;IACtE,OAAO,EAAE,MAAM,EAAE,CAAC;CACnB;AAiBD,kFAAkF;AAClF,wBAAgB,sBAAsB,CACpC,SAAS,EAAE,MAAM,EACjB,YAAY,EAAE,KAAK,CAAC,MAAM,GAAG,SAAS,GAAG,IAAI,CAAC,GAC7C,gBAAgB,CASlB"}
@@ -0,0 +1,58 @@
1
+ /**
2
+ * Harness-narration detection — did the model NARRATE the harness back at the
3
+ * user instead of acting on it?
4
+ *
5
+ * WHY THIS EXISTS. Bundle 37b made every gate nudge a marked `[harness]`
6
+ * `system` directive so the model would act on it rather than answer it. That
7
+ * change is only worth having if it is VERIFIABLE on live traces: some turns
8
+ * would still produce prose ABOUT the harness (`"the command guard misfired on a
9
+ * read-only check, so verification was…"`) instead of quietly continuing.
10
+ *
11
+ * HOW IT DETECTS, WITHOUT A PHRASE LIST. It does not look for words like
12
+ * "guard" or "misfire" — that would be a hand-written list of user phrasings,
13
+ * which this codebase forbids. Instead it takes the harness's OWN text (the
14
+ * refusals and gate summaries the trace recorded for that turn) and asks whether
15
+ * the model's answer reuses a DISTINCTIVE token from it: a hyphenated compound
16
+ * (`state-changing`, `read-only`) or a long word (≥10 chars). Those are the
17
+ * tokens that carry the harness's specific vocabulary; a shared one means the
18
+ * model is quoting the loop's language rather than talking about the task.
19
+ *
20
+ * The vocabulary is DERIVED at runtime from the harness's own strings, so it
21
+ * tracks whatever the harness actually says — it can never drift from a list.
22
+ *
23
+ * It is a REPORTER, not a gate: it never changes what the turn does. It exists so
24
+ * "the model stopped narrating the harness" is a measurement (see
25
+ * `scripts/detect-harness-narration.mjs`).
26
+ */
27
+ /**
28
+ * Tokens specific enough to signal the harness's vocabulary: hyphenated
29
+ * compounds, or long words. Deliberately NOT common prose (which is why a short
30
+ * word can never match).
31
+ */
32
+ function distinctiveTokens(text) {
33
+ const out = new Set();
34
+ for (const raw of String(text ?? '').toLowerCase().split(/[^a-z0-9-]+/)) {
35
+ const t = raw.replace(/^-+|-+$/g, '');
36
+ if (!t)
37
+ continue;
38
+ if (t.length >= 10 || (t.includes('-') && t.length >= 6))
39
+ out.add(t);
40
+ }
41
+ return out;
42
+ }
43
+ /** The pure check. `harnessTexts` are the harness's own strings for this turn. */
44
+ export function detectHarnessNarration(finalText, harnessTexts) {
45
+ const said = distinctiveTokens(finalText);
46
+ if (said.size === 0)
47
+ return { narrated: false, matches: [] };
48
+ const matches = new Set();
49
+ for (const h of harnessTexts) {
50
+ if (!h)
51
+ continue;
52
+ for (const t of distinctiveTokens(h))
53
+ if (said.has(t))
54
+ matches.add(t);
55
+ }
56
+ return { narrated: matches.size > 0, matches: [...matches].sort() };
57
+ }
58
+ //# sourceMappingURL=harness-narration.js.map