muonroi-cli 1.8.1 → 1.8.3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (971) hide show
  1. package/LICENSE +21 -21
  2. package/README.md +122 -122
  3. package/dist/src/cli/cost-forensics.js +12 -12
  4. package/dist/src/council/prompts.js +20 -20
  5. package/dist/src/generated/version.d.ts +1 -1
  6. package/dist/src/generated/version.js +1 -1
  7. package/dist/src/mcp/oauth-callback.js +2 -2
  8. package/dist/src/mcp/setup-guide-text.d.ts +1 -1
  9. package/dist/src/mcp/setup-guide-text.js +76 -74
  10. package/dist/src/ops/doctor.js +7 -7
  11. package/dist/src/orchestrator/orchestrator.js +22 -13
  12. package/dist/src/orchestrator/prompts.js +159 -159
  13. package/dist/src/pil/layer1-intent.js +37 -37
  14. package/dist/src/pil/layer2_5-ponytail.js +8 -8
  15. package/dist/src/product-loop/done-gate.js +3 -3
  16. package/dist/src/product-loop/loop-driver.js +18 -18
  17. package/dist/src/product-loop/progress-snapshot.js +4 -4
  18. package/dist/src/providers/mcp-vision-bridge.js +48 -48
  19. package/dist/src/reporter/index.js +1 -1
  20. package/dist/src/scaffold/bb-ecosystem-apply.js +47 -47
  21. package/dist/src/scaffold/bb-quality-gate.js +5 -5
  22. package/dist/src/scaffold/continuation-prompt.js +60 -60
  23. package/dist/src/scaffold/init-new.js +453 -453
  24. package/dist/src/self-qa/agentic-loop.js +19 -19
  25. package/dist/src/storage/interaction-log.js +5 -5
  26. package/dist/src/storage/migrations.js +125 -125
  27. package/dist/src/storage/session-experience-store.js +4 -4
  28. package/dist/src/storage/sessions.js +43 -43
  29. package/dist/src/storage/transcript.js +100 -100
  30. package/dist/src/storage/usage.js +14 -14
  31. package/dist/src/storage/workspaces.js +12 -12
  32. package/dist/src/ui/slash/council-inspect.js +4 -4
  33. package/dist/src/utils/clipboard-image.js +23 -23
  34. package/dist/src/utils/install-manager.d.ts +1 -0
  35. package/dist/src/utils/install-manager.js +29 -0
  36. package/dist/src/utils/side-question.js +2 -2
  37. package/dist/src/utils/skills.js +3 -3
  38. package/dist/src/utils/update-checker.js +12 -2
  39. package/package.json +8 -1
  40. package/dist/src/__test-helpers__/catalog-fixtures.d.ts +0 -22
  41. package/dist/src/__test-helpers__/catalog-fixtures.js +0 -55
  42. package/dist/src/__test-stubs__/ee-server.d.ts +0 -27
  43. package/dist/src/__test-stubs__/ee-server.js +0 -138
  44. package/dist/src/__test-stubs__/vitest-setup.d.ts +0 -1
  45. package/dist/src/__test-stubs__/vitest-setup.js +0 -38
  46. package/dist/src/__tests__/council/bubble-layout.test.d.ts +0 -1
  47. package/dist/src/__tests__/council/bubble-layout.test.js +0 -39
  48. package/dist/src/__tests__/council/code-block-truncate.test.d.ts +0 -1
  49. package/dist/src/__tests__/council/code-block-truncate.test.js +0 -45
  50. package/dist/src/__tests__/council/role-palette.test.d.ts +0 -1
  51. package/dist/src/__tests__/council/role-palette.test.js +0 -59
  52. package/dist/src/__tests__/first-run-wizard.test.d.ts +0 -1
  53. package/dist/src/__tests__/first-run-wizard.test.js +0 -9
  54. package/dist/src/agent-harness/__tests__/cli-flags.spec.d.ts +0 -1
  55. package/dist/src/agent-harness/__tests__/cli-flags.spec.js +0 -33
  56. package/dist/src/agent-harness/__tests__/driver.spec.d.ts +0 -1
  57. package/dist/src/agent-harness/__tests__/driver.spec.js +0 -141
  58. package/dist/src/agent-harness/__tests__/idle.spec.d.ts +0 -1
  59. package/dist/src/agent-harness/__tests__/idle.spec.js +0 -84
  60. package/dist/src/agent-harness/__tests__/mock-llm.spec.d.ts +0 -1
  61. package/dist/src/agent-harness/__tests__/mock-llm.spec.js +0 -91
  62. package/dist/src/agent-harness/__tests__/mock-model.spec.d.ts +0 -5
  63. package/dist/src/agent-harness/__tests__/mock-model.spec.js +0 -270
  64. package/dist/src/agent-harness/__tests__/predicate.spec.d.ts +0 -1
  65. package/dist/src/agent-harness/__tests__/predicate.spec.js +0 -27
  66. package/dist/src/agent-harness/__tests__/protocol.spec.d.ts +0 -1
  67. package/dist/src/agent-harness/__tests__/protocol.spec.js +0 -56
  68. package/dist/src/agent-harness/__tests__/schema.spec.d.ts +0 -1
  69. package/dist/src/agent-harness/__tests__/schema.spec.js +0 -76
  70. package/dist/src/agent-harness/__tests__/selector.spec.d.ts +0 -1
  71. package/dist/src/agent-harness/__tests__/selector.spec.js +0 -70
  72. package/dist/src/agent-harness/__tests__/sidechannel.spec.d.ts +0 -1
  73. package/dist/src/agent-harness/__tests__/sidechannel.spec.js +0 -29
  74. package/dist/src/agent-harness/__tests__/spec-helpers.spec.d.ts +0 -1
  75. package/dist/src/agent-harness/__tests__/spec-helpers.spec.js +0 -68
  76. package/dist/src/chat/__tests__/broadcast-bus.test.d.ts +0 -1
  77. package/dist/src/chat/__tests__/broadcast-bus.test.js +0 -81
  78. package/dist/src/chat/__tests__/channel-manager.test.d.ts +0 -1
  79. package/dist/src/chat/__tests__/channel-manager.test.js +0 -133
  80. package/dist/src/chat/__tests__/client.test.d.ts +0 -1
  81. package/dist/src/chat/__tests__/client.test.js +0 -109
  82. package/dist/src/chat/__tests__/discord-integration.test.d.ts +0 -1
  83. package/dist/src/chat/__tests__/discord-integration.test.js +0 -153
  84. package/dist/src/chat/__tests__/intent-prompt.test.d.ts +0 -1
  85. package/dist/src/chat/__tests__/intent-prompt.test.js +0 -80
  86. package/dist/src/chat/__tests__/verdict-resolver.test.d.ts +0 -1
  87. package/dist/src/chat/__tests__/verdict-resolver.test.js +0 -308
  88. package/dist/src/cli/__tests__/bw-vault.test.d.ts +0 -1
  89. package/dist/src/cli/__tests__/bw-vault.test.js +0 -87
  90. package/dist/src/cli/__tests__/keys-bundle.test.d.ts +0 -1
  91. package/dist/src/cli/__tests__/keys-bundle.test.js +0 -40
  92. package/dist/src/cli/__tests__/share-cmd.test.d.ts +0 -1
  93. package/dist/src/cli/__tests__/share-cmd.test.js +0 -175
  94. package/dist/src/cli/config/__tests__/model-picker.test.d.ts +0 -1
  95. package/dist/src/cli/config/__tests__/model-picker.test.js +0 -56
  96. package/dist/src/cli/config/__tests__/provider-fetch.test.d.ts +0 -1
  97. package/dist/src/cli/config/__tests__/provider-fetch.test.js +0 -38
  98. package/dist/src/cli/cost-forensics.test.d.ts +0 -1
  99. package/dist/src/cli/cost-forensics.test.js +0 -223
  100. package/dist/src/cli/experience-report.test.d.ts +0 -5
  101. package/dist/src/cli/experience-report.test.js +0 -63
  102. package/dist/src/cli/keys.test.d.ts +0 -1
  103. package/dist/src/cli/keys.test.js +0 -86
  104. package/dist/src/council/__tests__/abort-threading.test.d.ts +0 -1
  105. package/dist/src/council/__tests__/abort-threading.test.js +0 -193
  106. package/dist/src/council/__tests__/accounting.test.d.ts +0 -1
  107. package/dist/src/council/__tests__/accounting.test.js +0 -66
  108. package/dist/src/council/__tests__/audit-replay.test.d.ts +0 -1
  109. package/dist/src/council/__tests__/audit-replay.test.js +0 -241
  110. package/dist/src/council/__tests__/clarification-prompt.test.d.ts +0 -1
  111. package/dist/src/council/__tests__/clarification-prompt.test.js +0 -71
  112. package/dist/src/council/__tests__/clarifier-max-rounds.test.d.ts +0 -1
  113. package/dist/src/council/__tests__/clarifier-max-rounds.test.js +0 -46
  114. package/dist/src/council/__tests__/clarifier-options.test.d.ts +0 -1
  115. package/dist/src/council/__tests__/clarifier-options.test.js +0 -54
  116. package/dist/src/council/__tests__/clarifier-ready-gate.test.d.ts +0 -1
  117. package/dist/src/council/__tests__/clarifier-ready-gate.test.js +0 -265
  118. package/dist/src/council/__tests__/cost-aware.test.d.ts +0 -1
  119. package/dist/src/council/__tests__/cost-aware.test.js +0 -49
  120. package/dist/src/council/__tests__/council-turn-length-emit.test.d.ts +0 -1
  121. package/dist/src/council/__tests__/council-turn-length-emit.test.js +0 -130
  122. package/dist/src/council/__tests__/debate-planner-structured.test.d.ts +0 -1
  123. package/dist/src/council/__tests__/debate-planner-structured.test.js +0 -209
  124. package/dist/src/council/__tests__/debate-round-budget.test.d.ts +0 -1
  125. package/dist/src/council/__tests__/debate-round-budget.test.js +0 -45
  126. package/dist/src/council/__tests__/decisions-lock.test.d.ts +0 -6
  127. package/dist/src/council/__tests__/decisions-lock.test.js +0 -352
  128. package/dist/src/council/__tests__/evaluator-metrics.test.d.ts +0 -1
  129. package/dist/src/council/__tests__/evaluator-metrics.test.js +0 -463
  130. package/dist/src/council/__tests__/oauth-reachable.test.d.ts +0 -1
  131. package/dist/src/council/__tests__/oauth-reachable.test.js +0 -31
  132. package/dist/src/council/__tests__/parse-outcome-fallback.test.d.ts +0 -1
  133. package/dist/src/council/__tests__/parse-outcome-fallback.test.js +0 -114
  134. package/dist/src/council/__tests__/post-debate-recommendation.test.d.ts +0 -1
  135. package/dist/src/council/__tests__/post-debate-recommendation.test.js +0 -58
  136. package/dist/src/council/__tests__/research-tools.test.d.ts +0 -1
  137. package/dist/src/council/__tests__/research-tools.test.js +0 -214
  138. package/dist/src/council/__tests__/round-tools.test.d.ts +0 -1
  139. package/dist/src/council/__tests__/round-tools.test.js +0 -306
  140. package/dist/src/council/__tests__/tool-trace.test.d.ts +0 -1
  141. package/dist/src/council/__tests__/tool-trace.test.js +0 -131
  142. package/dist/src/council/__tests__/types-contract.test.d.ts +0 -9
  143. package/dist/src/council/__tests__/types-contract.test.js +0 -82
  144. package/dist/src/council/clarifier-question-cap.test.d.ts +0 -12
  145. package/dist/src/council/clarifier-question-cap.test.js +0 -73
  146. package/dist/src/daemon/scheduler.test.d.ts +0 -1
  147. package/dist/src/daemon/scheduler.test.js +0 -103
  148. package/dist/src/ee/__tests__/bb-design.test.d.ts +0 -14
  149. package/dist/src/ee/__tests__/bb-design.test.js +0 -180
  150. package/dist/src/ee/__tests__/ee-onboarding.test.d.ts +0 -1
  151. package/dist/src/ee/__tests__/ee-onboarding.test.js +0 -32
  152. package/dist/src/ee/__tests__/export-transcripts.test.d.ts +0 -11
  153. package/dist/src/ee/__tests__/export-transcripts.test.js +0 -200
  154. package/dist/src/ee/__tests__/pil-context-bridge.test.d.ts +0 -1
  155. package/dist/src/ee/__tests__/pil-context-bridge.test.js +0 -54
  156. package/dist/src/ee/__tests__/pipeline.integration.test.d.ts +0 -14
  157. package/dist/src/ee/__tests__/pipeline.integration.test.js +0 -151
  158. package/dist/src/ee/__tests__/recall-format.test.d.ts +0 -10
  159. package/dist/src/ee/__tests__/recall-format.test.js +0 -57
  160. package/dist/src/ee/__tests__/recall-ledger.test.d.ts +0 -1
  161. package/dist/src/ee/__tests__/recall-ledger.test.js +0 -45
  162. package/dist/src/ee/__tests__/render-sink-wiring.test.d.ts +0 -1
  163. package/dist/src/ee/__tests__/render-sink-wiring.test.js +0 -74
  164. package/dist/src/ee/artifact-cache.test.d.ts +0 -1
  165. package/dist/src/ee/artifact-cache.test.js +0 -69
  166. package/dist/src/ee/auth.test.d.ts +0 -1
  167. package/dist/src/ee/auth.test.js +0 -59
  168. package/dist/src/ee/bridge.test.d.ts +0 -1
  169. package/dist/src/ee/bridge.test.js +0 -230
  170. package/dist/src/ee/client.test.d.ts +0 -1
  171. package/dist/src/ee/client.test.js +0 -181
  172. package/dist/src/ee/extract-session.test.d.ts +0 -1
  173. package/dist/src/ee/extract-session.test.js +0 -192
  174. package/dist/src/ee/intercept.test.d.ts +0 -1
  175. package/dist/src/ee/intercept.test.js +0 -171
  176. package/dist/src/ee/judge.test.d.ts +0 -1
  177. package/dist/src/ee/judge.test.js +0 -190
  178. package/dist/src/ee/mistake-detector.test.d.ts +0 -1
  179. package/dist/src/ee/mistake-detector.test.js +0 -221
  180. package/dist/src/ee/offline-queue.test.d.ts +0 -1
  181. package/dist/src/ee/offline-queue.test.js +0 -246
  182. package/dist/src/ee/phase-outcome.test.d.ts +0 -1
  183. package/dist/src/ee/phase-outcome.test.js +0 -94
  184. package/dist/src/ee/phase-tracker.test.d.ts +0 -1
  185. package/dist/src/ee/phase-tracker.test.js +0 -142
  186. package/dist/src/ee/posttool.test.d.ts +0 -1
  187. package/dist/src/ee/posttool.test.js +0 -70
  188. package/dist/src/ee/prompt-stale.test.d.ts +0 -8
  189. package/dist/src/ee/prompt-stale.test.js +0 -76
  190. package/dist/src/ee/recall-mirror.test.d.ts +0 -1
  191. package/dist/src/ee/recall-mirror.test.js +0 -65
  192. package/dist/src/ee/render.test.d.ts +0 -1
  193. package/dist/src/ee/render.test.js +0 -63
  194. package/dist/src/ee/scope.test.d.ts +0 -1
  195. package/dist/src/ee/scope.test.js +0 -97
  196. package/dist/src/ee/search.test.d.ts +0 -1
  197. package/dist/src/ee/search.test.js +0 -23
  198. package/dist/src/ee/session-trajectory.test.d.ts +0 -1
  199. package/dist/src/ee/session-trajectory.test.js +0 -120
  200. package/dist/src/ee/touch.test.d.ts +0 -1
  201. package/dist/src/ee/touch.test.js +0 -62
  202. package/dist/src/ee/who-am-i.test.d.ts +0 -1
  203. package/dist/src/ee/who-am-i.test.js +0 -101
  204. package/dist/src/flow/__tests__/migration.test.d.ts +0 -1
  205. package/dist/src/flow/__tests__/migration.test.js +0 -105
  206. package/dist/src/flow/__tests__/parser.test.d.ts +0 -1
  207. package/dist/src/flow/__tests__/parser.test.js +0 -68
  208. package/dist/src/flow/__tests__/run-manager-product.test.d.ts +0 -1
  209. package/dist/src/flow/__tests__/run-manager-product.test.js +0 -49
  210. package/dist/src/flow/__tests__/run-manager.test.d.ts +0 -1
  211. package/dist/src/flow/__tests__/run-manager.test.js +0 -83
  212. package/dist/src/flow/__tests__/scaffold-checkpoint.test.d.ts +0 -1
  213. package/dist/src/flow/__tests__/scaffold-checkpoint.test.js +0 -93
  214. package/dist/src/flow/__tests__/scaffold.test.d.ts +0 -1
  215. package/dist/src/flow/__tests__/scaffold.test.js +0 -47
  216. package/dist/src/flow/__tests__/warning-persist.test.d.ts +0 -5
  217. package/dist/src/flow/__tests__/warning-persist.test.js +0 -96
  218. package/dist/src/flow/compaction/__tests__/compress.test.d.ts +0 -1
  219. package/dist/src/flow/compaction/__tests__/compress.test.js +0 -63
  220. package/dist/src/flow/compaction/__tests__/extract.test.d.ts +0 -1
  221. package/dist/src/flow/compaction/__tests__/extract.test.js +0 -66
  222. package/dist/src/flow/compaction/__tests__/preserve.test.d.ts +0 -1
  223. package/dist/src/flow/compaction/__tests__/preserve.test.js +0 -62
  224. package/dist/src/gsd/__tests__/gray-areas.test.d.ts +0 -1
  225. package/dist/src/gsd/__tests__/gray-areas.test.js +0 -29
  226. package/dist/src/gsd/__tests__/types.test.d.ts +0 -1
  227. package/dist/src/gsd/__tests__/types.test.js +0 -78
  228. package/dist/src/headless/__tests__/council-answers.test.d.ts +0 -1
  229. package/dist/src/headless/__tests__/council-answers.test.js +0 -251
  230. package/dist/src/headless/output.test.d.ts +0 -1
  231. package/dist/src/headless/output.test.js +0 -239
  232. package/dist/src/lsp/builtins.test.d.ts +0 -1
  233. package/dist/src/lsp/builtins.test.js +0 -112
  234. package/dist/src/lsp/client-normalize.test.d.ts +0 -12
  235. package/dist/src/lsp/client-normalize.test.js +0 -34
  236. package/dist/src/lsp/manager.test.d.ts +0 -1
  237. package/dist/src/lsp/manager.test.js +0 -194
  238. package/dist/src/lsp/npm-cache.test.d.ts +0 -1
  239. package/dist/src/lsp/npm-cache.test.js +0 -53
  240. package/dist/src/lsp/smoke.test.d.ts +0 -1
  241. package/dist/src/lsp/smoke.test.js +0 -56
  242. package/dist/src/maintain/__tests__/codebase-intel.test.d.ts +0 -5
  243. package/dist/src/maintain/__tests__/codebase-intel.test.js +0 -237
  244. package/dist/src/maintain/__tests__/gh-create-pr.test.d.ts +0 -11
  245. package/dist/src/maintain/__tests__/gh-create-pr.test.js +0 -160
  246. package/dist/src/maintain/__tests__/pr-builder.test.d.ts +0 -10
  247. package/dist/src/maintain/__tests__/pr-builder.test.js +0 -229
  248. package/dist/src/maintain/__tests__/repo-map.test.d.ts +0 -5
  249. package/dist/src/maintain/__tests__/repo-map.test.js +0 -90
  250. package/dist/src/maintain/__tests__/task-runner.test.d.ts +0 -11
  251. package/dist/src/maintain/__tests__/task-runner.test.js +0 -281
  252. package/dist/src/mcp/__tests__/auto-setup.test.d.ts +0 -1
  253. package/dist/src/mcp/__tests__/auto-setup.test.js +0 -155
  254. package/dist/src/mcp/__tests__/cap-tool-result.test.d.ts +0 -1
  255. package/dist/src/mcp/__tests__/cap-tool-result.test.js +0 -58
  256. package/dist/src/mcp/__tests__/client-pool.spec.d.ts +0 -1
  257. package/dist/src/mcp/__tests__/client-pool.spec.js +0 -169
  258. package/dist/src/mcp/__tests__/ee-tools.test.d.ts +0 -1
  259. package/dist/src/mcp/__tests__/ee-tools.test.js +0 -226
  260. package/dist/src/mcp/__tests__/forensics-tools.test.d.ts +0 -1
  261. package/dist/src/mcp/__tests__/forensics-tools.test.js +0 -54
  262. package/dist/src/mcp/__tests__/harness-driver-action-tools.spec.d.ts +0 -1
  263. package/dist/src/mcp/__tests__/harness-driver-action-tools.spec.js +0 -103
  264. package/dist/src/mcp/__tests__/harness-driver-async-tools.spec.d.ts +0 -1
  265. package/dist/src/mcp/__tests__/harness-driver-async-tools.spec.js +0 -112
  266. package/dist/src/mcp/__tests__/harness-driver-read-tools.spec.d.ts +0 -1
  267. package/dist/src/mcp/__tests__/harness-driver-read-tools.spec.js +0 -124
  268. package/dist/src/mcp/__tests__/harness-driver-security.spec.d.ts +0 -1
  269. package/dist/src/mcp/__tests__/harness-driver-security.spec.js +0 -61
  270. package/dist/src/mcp/__tests__/harness-driver.spec.d.ts +0 -1
  271. package/dist/src/mcp/__tests__/harness-driver.spec.js +0 -20
  272. package/dist/src/mcp/__tests__/lazy-schema.spec.d.ts +0 -1
  273. package/dist/src/mcp/__tests__/lazy-schema.spec.js +0 -152
  274. package/dist/src/mcp/__tests__/lsp-tools.test.d.ts +0 -1
  275. package/dist/src/mcp/__tests__/lsp-tools.test.js +0 -56
  276. package/dist/src/mcp/__tests__/mcp-keychain.test.d.ts +0 -1
  277. package/dist/src/mcp/__tests__/mcp-keychain.test.js +0 -40
  278. package/dist/src/mcp/__tests__/parallel-build.spec.d.ts +0 -1
  279. package/dist/src/mcp/__tests__/parallel-build.spec.js +0 -67
  280. package/dist/src/mcp/__tests__/research-onboarding.test.d.ts +0 -1
  281. package/dist/src/mcp/__tests__/research-onboarding.test.js +0 -148
  282. package/dist/src/mcp/__tests__/runtime-hydration.test.d.ts +0 -1
  283. package/dist/src/mcp/__tests__/runtime-hydration.test.js +0 -78
  284. package/dist/src/mcp/__tests__/runtime-output-cap.test.d.ts +0 -1
  285. package/dist/src/mcp/__tests__/runtime-output-cap.test.js +0 -42
  286. package/dist/src/mcp/__tests__/runtime-sanitize.test.d.ts +0 -1
  287. package/dist/src/mcp/__tests__/runtime-sanitize.test.js +0 -40
  288. package/dist/src/mcp/__tests__/self-verify-jobs.test.d.ts +0 -1
  289. package/dist/src/mcp/__tests__/self-verify-jobs.test.js +0 -92
  290. package/dist/src/mcp/__tests__/smart-filter.test.d.ts +0 -1
  291. package/dist/src/mcp/__tests__/smart-filter.test.js +0 -177
  292. package/dist/src/mcp/__tests__/tools-server.smoke.test.d.ts +0 -1
  293. package/dist/src/mcp/__tests__/tools-server.smoke.test.js +0 -42
  294. package/dist/src/mcp/parse-headers.test.d.ts +0 -1
  295. package/dist/src/mcp/parse-headers.test.js +0 -43
  296. package/dist/src/mcp/smoke.test.d.ts +0 -1
  297. package/dist/src/mcp/smoke.test.js +0 -159
  298. package/dist/src/models/__tests__/registry.test.d.ts +0 -1
  299. package/dist/src/models/__tests__/registry.test.js +0 -74
  300. package/dist/src/models/catalog-gemini.test.d.ts +0 -1
  301. package/dist/src/models/catalog-gemini.test.js +0 -48
  302. package/dist/src/models/catalog-url.test.d.ts +0 -1
  303. package/dist/src/models/catalog-url.test.js +0 -26
  304. package/dist/src/models/catalog-validation.test.d.ts +0 -1
  305. package/dist/src/models/catalog-validation.test.js +0 -63
  306. package/dist/src/ops/__tests__/doctor-council-mcp.test.d.ts +0 -1
  307. package/dist/src/ops/__tests__/doctor-council-mcp.test.js +0 -139
  308. package/dist/src/ops/__tests__/doctor-ee-health.test.d.ts +0 -1
  309. package/dist/src/ops/__tests__/doctor-ee-health.test.js +0 -134
  310. package/dist/src/ops/bug-report.test.d.ts +0 -1
  311. package/dist/src/ops/bug-report.test.js +0 -148
  312. package/dist/src/ops/doctor.test.d.ts +0 -1
  313. package/dist/src/ops/doctor.test.js +0 -97
  314. package/dist/src/orchestrator/__tests__/agent-base-url-switch.test.d.ts +0 -1
  315. package/dist/src/orchestrator/__tests__/agent-base-url-switch.test.js +0 -77
  316. package/dist/src/orchestrator/__tests__/auto-commit.test.d.ts +0 -1
  317. package/dist/src/orchestrator/__tests__/auto-commit.test.js +0 -142
  318. package/dist/src/orchestrator/__tests__/batch-turn-runner.test.d.ts +0 -1
  319. package/dist/src/orchestrator/__tests__/batch-turn-runner.test.js +0 -164
  320. package/dist/src/orchestrator/__tests__/council-manager.test.d.ts +0 -1
  321. package/dist/src/orchestrator/__tests__/council-manager.test.js +0 -148
  322. package/dist/src/orchestrator/__tests__/cross-turn-dedup.test.d.ts +0 -1
  323. package/dist/src/orchestrator/__tests__/cross-turn-dedup.test.js +0 -175
  324. package/dist/src/orchestrator/__tests__/current-call-id.test.d.ts +0 -16
  325. package/dist/src/orchestrator/__tests__/current-call-id.test.js +0 -138
  326. package/dist/src/orchestrator/__tests__/delegations.test.d.ts +0 -1
  327. package/dist/src/orchestrator/__tests__/delegations.test.js +0 -96
  328. package/dist/src/orchestrator/__tests__/error-forensics.test.d.ts +0 -1
  329. package/dist/src/orchestrator/__tests__/error-forensics.test.js +0 -93
  330. package/dist/src/orchestrator/__tests__/flow-resume.test.d.ts +0 -5
  331. package/dist/src/orchestrator/__tests__/flow-resume.test.js +0 -61
  332. package/dist/src/orchestrator/__tests__/humanize-api-error.test.d.ts +0 -1
  333. package/dist/src/orchestrator/__tests__/humanize-api-error.test.js +0 -68
  334. package/dist/src/orchestrator/__tests__/mcp-capability-block.test.d.ts +0 -1
  335. package/dist/src/orchestrator/__tests__/mcp-capability-block.test.js +0 -39
  336. package/dist/src/orchestrator/__tests__/message-processor.test.d.ts +0 -1
  337. package/dist/src/orchestrator/__tests__/message-processor.test.js +0 -189
  338. package/dist/src/orchestrator/__tests__/message-write-ahead.test.d.ts +0 -22
  339. package/dist/src/orchestrator/__tests__/message-write-ahead.test.js +0 -149
  340. package/dist/src/orchestrator/__tests__/project-stack.test.d.ts +0 -1
  341. package/dist/src/orchestrator/__tests__/project-stack.test.js +0 -65
  342. package/dist/src/orchestrator/__tests__/prompts.test.d.ts +0 -1
  343. package/dist/src/orchestrator/__tests__/prompts.test.js +0 -88
  344. package/dist/src/orchestrator/__tests__/read-path-budget.test.d.ts +0 -1
  345. package/dist/src/orchestrator/__tests__/read-path-budget.test.js +0 -156
  346. package/dist/src/orchestrator/__tests__/retry-classifier.test.d.ts +0 -1
  347. package/dist/src/orchestrator/__tests__/retry-classifier.test.js +0 -112
  348. package/dist/src/orchestrator/__tests__/retry-stream.test.d.ts +0 -1
  349. package/dist/src/orchestrator/__tests__/retry-stream.test.js +0 -151
  350. package/dist/src/orchestrator/__tests__/route-feedback.test.d.ts +0 -1
  351. package/dist/src/orchestrator/__tests__/route-feedback.test.js +0 -47
  352. package/dist/src/orchestrator/__tests__/stream-runner.test.d.ts +0 -1
  353. package/dist/src/orchestrator/__tests__/stream-runner.test.js +0 -202
  354. package/dist/src/orchestrator/__tests__/sub-agent-model-tier.test.d.ts +0 -1
  355. package/dist/src/orchestrator/__tests__/sub-agent-model-tier.test.js +0 -45
  356. package/dist/src/orchestrator/__tests__/sub-session-delegation.test.d.ts +0 -1
  357. package/dist/src/orchestrator/__tests__/sub-session-delegation.test.js +0 -507
  358. package/dist/src/orchestrator/__tests__/usage-events-shape.test.d.ts +0 -8
  359. package/dist/src/orchestrator/__tests__/usage-events-shape.test.js +0 -58
  360. package/dist/src/orchestrator/__tests__/usage-normalizer-c1.test.d.ts +0 -21
  361. package/dist/src/orchestrator/__tests__/usage-normalizer-c1.test.js +0 -155
  362. package/dist/src/orchestrator/__tests__/usage-shape-threading.test.d.ts +0 -1
  363. package/dist/src/orchestrator/__tests__/usage-shape-threading.test.js +0 -98
  364. package/dist/src/orchestrator/__tests__/write-ahead.test.d.ts +0 -20
  365. package/dist/src/orchestrator/__tests__/write-ahead.test.js +0 -134
  366. package/dist/src/orchestrator/abort.test.d.ts +0 -1
  367. package/dist/src/orchestrator/abort.test.js +0 -34
  368. package/dist/src/orchestrator/agent.test.d.ts +0 -1
  369. package/dist/src/orchestrator/agent.test.js +0 -178
  370. package/dist/src/orchestrator/cleanup.test.d.ts +0 -1
  371. package/dist/src/orchestrator/cleanup.test.js +0 -67
  372. package/dist/src/orchestrator/compaction.test.d.ts +0 -1
  373. package/dist/src/orchestrator/compaction.test.js +0 -187
  374. package/dist/src/orchestrator/delegations.test.d.ts +0 -1
  375. package/dist/src/orchestrator/delegations.test.js +0 -107
  376. package/dist/src/orchestrator/grounding-check.test.d.ts +0 -1
  377. package/dist/src/orchestrator/grounding-check.test.js +0 -94
  378. package/dist/src/orchestrator/interrupted-turn.test.d.ts +0 -1
  379. package/dist/src/orchestrator/interrupted-turn.test.js +0 -34
  380. package/dist/src/orchestrator/message-seq.test.d.ts +0 -1
  381. package/dist/src/orchestrator/message-seq.test.js +0 -24
  382. package/dist/src/orchestrator/pending-calls.test.d.ts +0 -1
  383. package/dist/src/orchestrator/pending-calls.test.js +0 -188
  384. package/dist/src/orchestrator/provider-options-shape.spec.d.ts +0 -1
  385. package/dist/src/orchestrator/provider-options-shape.spec.js +0 -63
  386. package/dist/src/orchestrator/reasoning.test.d.ts +0 -1
  387. package/dist/src/orchestrator/reasoning.test.js +0 -101
  388. package/dist/src/orchestrator/repetition-detector.test.d.ts +0 -1
  389. package/dist/src/orchestrator/repetition-detector.test.js +0 -103
  390. package/dist/src/orchestrator/sandbox.test.d.ts +0 -1
  391. package/dist/src/orchestrator/sandbox.test.js +0 -99
  392. package/dist/src/orchestrator/scope-ceiling.test.d.ts +0 -13
  393. package/dist/src/orchestrator/scope-ceiling.test.js +0 -181
  394. package/dist/src/orchestrator/scope-reminder.test.d.ts +0 -15
  395. package/dist/src/orchestrator/scope-reminder.test.js +0 -225
  396. package/dist/src/orchestrator/session-experience.test.d.ts +0 -6
  397. package/dist/src/orchestrator/session-experience.test.js +0 -72
  398. package/dist/src/orchestrator/stall-rescue.test.d.ts +0 -1
  399. package/dist/src/orchestrator/stall-rescue.test.js +0 -117
  400. package/dist/src/orchestrator/stall-watchdog.test.d.ts +0 -1
  401. package/dist/src/orchestrator/stall-watchdog.test.js +0 -153
  402. package/dist/src/orchestrator/steer-inbox.test.d.ts +0 -1
  403. package/dist/src/orchestrator/steer-inbox.test.js +0 -33
  404. package/dist/src/orchestrator/sub-agent-cap.test.d.ts +0 -1
  405. package/dist/src/orchestrator/sub-agent-cap.test.js +0 -208
  406. package/dist/src/orchestrator/subagent-compactor.spec.d.ts +0 -1
  407. package/dist/src/orchestrator/subagent-compactor.spec.js +0 -636
  408. package/dist/src/orchestrator/text-tool-call-detector.test.d.ts +0 -1
  409. package/dist/src/orchestrator/text-tool-call-detector.test.js +0 -147
  410. package/dist/src/orchestrator/token-counter.test.d.ts +0 -1
  411. package/dist/src/orchestrator/token-counter.test.js +0 -57
  412. package/dist/src/orchestrator/tool-args-hash.test.d.ts +0 -1
  413. package/dist/src/orchestrator/tool-args-hash.test.js +0 -105
  414. package/dist/src/orchestrator/tool-args-repair.test.d.ts +0 -1
  415. package/dist/src/orchestrator/tool-args-repair.test.js +0 -136
  416. package/dist/src/orchestrator/tool-loop-askcard.test.d.ts +0 -1
  417. package/dist/src/orchestrator/tool-loop-askcard.test.js +0 -71
  418. package/dist/src/orchestrator/tool-loop-cap.test.d.ts +0 -1
  419. package/dist/src/orchestrator/tool-loop-cap.test.js +0 -176
  420. package/dist/src/orchestrator/tool-repetition-detector.test.d.ts +0 -1
  421. package/dist/src/orchestrator/tool-repetition-detector.test.js +0 -101
  422. package/dist/src/pil/__tests__/budget.test.d.ts +0 -1
  423. package/dist/src/pil/__tests__/budget.test.js +0 -33
  424. package/dist/src/pil/__tests__/clarity-gate.test.d.ts +0 -1
  425. package/dist/src/pil/__tests__/clarity-gate.test.js +0 -37
  426. package/dist/src/pil/__tests__/config.test.d.ts +0 -1
  427. package/dist/src/pil/__tests__/config.test.js +0 -57
  428. package/dist/src/pil/__tests__/discovery-cache.test.d.ts +0 -1
  429. package/dist/src/pil/__tests__/discovery-cache.test.js +0 -38
  430. package/dist/src/pil/__tests__/discovery-types.test.d.ts +0 -1
  431. package/dist/src/pil/__tests__/discovery-types.test.js +0 -65
  432. package/dist/src/pil/__tests__/discovery.test.d.ts +0 -1
  433. package/dist/src/pil/__tests__/discovery.test.js +0 -178
  434. package/dist/src/pil/__tests__/dual-run.test.d.ts +0 -1
  435. package/dist/src/pil/__tests__/dual-run.test.js +0 -51
  436. package/dist/src/pil/__tests__/layer1-intent-trace.test.d.ts +0 -1
  437. package/dist/src/pil/__tests__/layer1-intent-trace.test.js +0 -138
  438. package/dist/src/pil/__tests__/layer1-intent.test.d.ts +0 -1
  439. package/dist/src/pil/__tests__/layer1-intent.test.js +0 -329
  440. package/dist/src/pil/__tests__/layer15-context-scan.test.d.ts +0 -1
  441. package/dist/src/pil/__tests__/layer15-context-scan.test.js +0 -64
  442. package/dist/src/pil/__tests__/layer16-clarity.test.d.ts +0 -1
  443. package/dist/src/pil/__tests__/layer16-clarity.test.js +0 -72
  444. package/dist/src/pil/__tests__/layer17-feasibility.test.d.ts +0 -1
  445. package/dist/src/pil/__tests__/layer17-feasibility.test.js +0 -36
  446. package/dist/src/pil/__tests__/layer18-acceptance.test.d.ts +0 -1
  447. package/dist/src/pil/__tests__/layer18-acceptance.test.js +0 -18
  448. package/dist/src/pil/__tests__/layer2-personality.test.d.ts +0 -1
  449. package/dist/src/pil/__tests__/layer2-personality.test.js +0 -57
  450. package/dist/src/pil/__tests__/layer2_5-ponytail.test.d.ts +0 -1
  451. package/dist/src/pil/__tests__/layer2_5-ponytail.test.js +0 -53
  452. package/dist/src/pil/__tests__/layer3-ee-injection.test.d.ts +0 -1
  453. package/dist/src/pil/__tests__/layer3-ee-injection.test.js +0 -221
  454. package/dist/src/pil/__tests__/layer3-injected-chunk.test.d.ts +0 -1
  455. package/dist/src/pil/__tests__/layer3-injected-chunk.test.js +0 -134
  456. package/dist/src/pil/__tests__/layer4-gsd.test.d.ts +0 -1
  457. package/dist/src/pil/__tests__/layer4-gsd.test.js +0 -191
  458. package/dist/src/pil/__tests__/layer5-context.test.d.ts +0 -1
  459. package/dist/src/pil/__tests__/layer5-context.test.js +0 -175
  460. package/dist/src/pil/__tests__/layer6-output.test.d.ts +0 -1
  461. package/dist/src/pil/__tests__/layer6-output.test.js +0 -465
  462. package/dist/src/pil/__tests__/llm-classify.test.d.ts +0 -1
  463. package/dist/src/pil/__tests__/llm-classify.test.js +0 -275
  464. package/dist/src/pil/__tests__/native-capabilities-workbook.test.d.ts +0 -1
  465. package/dist/src/pil/__tests__/native-capabilities-workbook.test.js +0 -40
  466. package/dist/src/pil/__tests__/ollama-classify.test.d.ts +0 -1
  467. package/dist/src/pil/__tests__/ollama-classify.test.js +0 -68
  468. package/dist/src/pil/__tests__/orchestrator-integration.test.d.ts +0 -10
  469. package/dist/src/pil/__tests__/orchestrator-integration.test.js +0 -100
  470. package/dist/src/pil/__tests__/pipeline.test.d.ts +0 -1
  471. package/dist/src/pil/__tests__/pipeline.test.js +0 -188
  472. package/dist/src/pil/__tests__/renderer-coverage.test.d.ts +0 -7
  473. package/dist/src/pil/__tests__/renderer-coverage.test.js +0 -42
  474. package/dist/src/pil/__tests__/response-tools.test.d.ts +0 -1
  475. package/dist/src/pil/__tests__/response-tools.test.js +0 -242
  476. package/dist/src/pil/__tests__/schema.test.d.ts +0 -1
  477. package/dist/src/pil/__tests__/schema.test.js +0 -202
  478. package/dist/src/pil/__tests__/scoreComplexity.test.d.ts +0 -1
  479. package/dist/src/pil/__tests__/scoreComplexity.test.js +0 -119
  480. package/dist/src/pil/__tests__/scoreSufficiency.test.d.ts +0 -8
  481. package/dist/src/pil/__tests__/scoreSufficiency.test.js +0 -89
  482. package/dist/src/pil/__tests__/store.test.d.ts +0 -1
  483. package/dist/src/pil/__tests__/store.test.js +0 -44
  484. package/dist/src/pil/__tests__/surface-compaction-artifacts.test.d.ts +0 -1
  485. package/dist/src/pil/__tests__/surface-compaction-artifacts.test.js +0 -112
  486. package/dist/src/pil/__tests__/task-tier-map.test.d.ts +0 -1
  487. package/dist/src/pil/__tests__/task-tier-map.test.js +0 -33
  488. package/dist/src/pil/agent-operating-contract.test.d.ts +0 -1
  489. package/dist/src/pil/agent-operating-contract.test.js +0 -80
  490. package/dist/src/pil/cheap-model-playbook.test.d.ts +0 -1
  491. package/dist/src/pil/cheap-model-playbook.test.js +0 -160
  492. package/dist/src/pil/cheap-model-workbooks.test.d.ts +0 -1
  493. package/dist/src/pil/cheap-model-workbooks.test.js +0 -129
  494. package/dist/src/pil/layer1-intent.test.d.ts +0 -1
  495. package/dist/src/pil/layer1-intent.test.js +0 -764
  496. package/dist/src/pil/layer1_5-complexity-size.test.d.ts +0 -10
  497. package/dist/src/pil/layer1_5-complexity-size.test.js +0 -248
  498. package/dist/src/pil/session-experience-injection.test.d.ts +0 -6
  499. package/dist/src/pil/session-experience-injection.test.js +0 -79
  500. package/dist/src/pil/session-state.test.d.ts +0 -1
  501. package/dist/src/pil/session-state.test.js +0 -73
  502. package/dist/src/playbook/__tests__/directives.test.d.ts +0 -1
  503. package/dist/src/playbook/__tests__/directives.test.js +0 -115
  504. package/dist/src/product-loop/__tests__/artifact-io.test.d.ts +0 -1
  505. package/dist/src/product-loop/__tests__/artifact-io.test.js +0 -83
  506. package/dist/src/product-loop/__tests__/assumption-ledger.test.d.ts +0 -1
  507. package/dist/src/product-loop/__tests__/assumption-ledger.test.js +0 -261
  508. package/dist/src/product-loop/__tests__/backlog-builder.test.d.ts +0 -10
  509. package/dist/src/product-loop/__tests__/backlog-builder.test.js +0 -175
  510. package/dist/src/product-loop/__tests__/backlog-store.test.d.ts +0 -4
  511. package/dist/src/product-loop/__tests__/backlog-store.test.js +0 -96
  512. package/dist/src/product-loop/__tests__/cb2-retry-bonus.test.d.ts +0 -13
  513. package/dist/src/product-loop/__tests__/cb2-retry-bonus.test.js +0 -158
  514. package/dist/src/product-loop/__tests__/circuit-breakers-coverage.test.d.ts +0 -1
  515. package/dist/src/product-loop/__tests__/circuit-breakers-coverage.test.js +0 -67
  516. package/dist/src/product-loop/__tests__/circuit-breakers.test.d.ts +0 -1
  517. package/dist/src/product-loop/__tests__/circuit-breakers.test.js +0 -79
  518. package/dist/src/product-loop/__tests__/complexity-routing.spec.d.ts +0 -11
  519. package/dist/src/product-loop/__tests__/complexity-routing.spec.js +0 -240
  520. package/dist/src/product-loop/__tests__/context-policy.test.d.ts +0 -1
  521. package/dist/src/product-loop/__tests__/context-policy.test.js +0 -266
  522. package/dist/src/product-loop/__tests__/cost-preview.test.d.ts +0 -1
  523. package/dist/src/product-loop/__tests__/cost-preview.test.js +0 -111
  524. package/dist/src/product-loop/__tests__/cost-scoper.test.d.ts +0 -1
  525. package/dist/src/product-loop/__tests__/cost-scoper.test.js +0 -50
  526. package/dist/src/product-loop/__tests__/cross-run-memory.test.d.ts +0 -1
  527. package/dist/src/product-loop/__tests__/cross-run-memory.test.js +0 -168
  528. package/dist/src/product-loop/__tests__/design-output.spec.d.ts +0 -1
  529. package/dist/src/product-loop/__tests__/design-output.spec.js +0 -36
  530. package/dist/src/product-loop/__tests__/discover.test.d.ts +0 -1
  531. package/dist/src/product-loop/__tests__/discover.test.js +0 -83
  532. package/dist/src/product-loop/__tests__/discovery-context-format.test.d.ts +0 -13
  533. package/dist/src/product-loop/__tests__/discovery-context-format.test.js +0 -100
  534. package/dist/src/product-loop/__tests__/discovery-council-runner.test.d.ts +0 -1
  535. package/dist/src/product-loop/__tests__/discovery-council-runner.test.js +0 -13
  536. package/dist/src/product-loop/__tests__/discovery-detection.test.d.ts +0 -1
  537. package/dist/src/product-loop/__tests__/discovery-detection.test.js +0 -151
  538. package/dist/src/product-loop/__tests__/discovery-ecosystem.test.d.ts +0 -8
  539. package/dist/src/product-loop/__tests__/discovery-ecosystem.test.js +0 -209
  540. package/dist/src/product-loop/__tests__/discovery-integration.test.d.ts +0 -1
  541. package/dist/src/product-loop/__tests__/discovery-integration.test.js +0 -126
  542. package/dist/src/product-loop/__tests__/discovery-interview.test.d.ts +0 -1
  543. package/dist/src/product-loop/__tests__/discovery-interview.test.js +0 -394
  544. package/dist/src/product-loop/__tests__/discovery-migrations.test.d.ts +0 -1
  545. package/dist/src/product-loop/__tests__/discovery-migrations.test.js +0 -69
  546. package/dist/src/product-loop/__tests__/discovery-persistence.test.d.ts +0 -1
  547. package/dist/src/product-loop/__tests__/discovery-persistence.test.js +0 -146
  548. package/dist/src/product-loop/__tests__/discovery-prompt-parser.test.d.ts +0 -1
  549. package/dist/src/product-loop/__tests__/discovery-prompt-parser.test.js +0 -65
  550. package/dist/src/product-loop/__tests__/discovery-prompt-specificity.test.d.ts +0 -1
  551. package/dist/src/product-loop/__tests__/discovery-prompt-specificity.test.js +0 -55
  552. package/dist/src/product-loop/__tests__/discovery-recommender-ecosystem.test.d.ts +0 -9
  553. package/dist/src/product-loop/__tests__/discovery-recommender-ecosystem.test.js +0 -178
  554. package/dist/src/product-loop/__tests__/discovery-recommender.test.d.ts +0 -1
  555. package/dist/src/product-loop/__tests__/discovery-recommender.test.js +0 -316
  556. package/dist/src/product-loop/__tests__/discovery-schema.test.d.ts +0 -1
  557. package/dist/src/product-loop/__tests__/discovery-schema.test.js +0 -77
  558. package/dist/src/product-loop/__tests__/done-gate-coverage.test.d.ts +0 -1
  559. package/dist/src/product-loop/__tests__/done-gate-coverage.test.js +0 -135
  560. package/dist/src/product-loop/__tests__/done-gate.test.d.ts +0 -1
  561. package/dist/src/product-loop/__tests__/done-gate.test.js +0 -122
  562. package/dist/src/product-loop/__tests__/ee-extract-wiring.test.d.ts +0 -8
  563. package/dist/src/product-loop/__tests__/ee-extract-wiring.test.js +0 -186
  564. package/dist/src/product-loop/__tests__/extract-to-ee.test.d.ts +0 -1
  565. package/dist/src/product-loop/__tests__/extract-to-ee.test.js +0 -161
  566. package/dist/src/product-loop/__tests__/feedback-routing.test.d.ts +0 -1
  567. package/dist/src/product-loop/__tests__/feedback-routing.test.js +0 -83
  568. package/dist/src/product-loop/__tests__/gather-selectable-alts.test.d.ts +0 -15
  569. package/dist/src/product-loop/__tests__/gather-selectable-alts.test.js +0 -143
  570. package/dist/src/product-loop/__tests__/hot-path.spec.d.ts +0 -11
  571. package/dist/src/product-loop/__tests__/hot-path.spec.js +0 -146
  572. package/dist/src/product-loop/__tests__/integration.test.d.ts +0 -7
  573. package/dist/src/product-loop/__tests__/integration.test.js +0 -301
  574. package/dist/src/product-loop/__tests__/loop-driver-audit.test.d.ts +0 -1
  575. package/dist/src/product-loop/__tests__/loop-driver-audit.test.js +0 -269
  576. package/dist/src/product-loop/__tests__/loop-driver.test.d.ts +0 -1
  577. package/dist/src/product-loop/__tests__/loop-driver.test.js +0 -225
  578. package/dist/src/product-loop/__tests__/maintenance-task-synthesis.test.d.ts +0 -8
  579. package/dist/src/product-loop/__tests__/maintenance-task-synthesis.test.js +0 -67
  580. package/dist/src/product-loop/__tests__/phase-a1-a3-sprint-runner.test.d.ts +0 -13
  581. package/dist/src/product-loop/__tests__/phase-a1-a3-sprint-runner.test.js +0 -268
  582. package/dist/src/product-loop/__tests__/phase-a2-backlog-build.test.d.ts +0 -8
  583. package/dist/src/product-loop/__tests__/phase-a2-backlog-build.test.js +0 -162
  584. package/dist/src/product-loop/__tests__/phase-budget.test.d.ts +0 -1
  585. package/dist/src/product-loop/__tests__/phase-budget.test.js +0 -149
  586. package/dist/src/product-loop/__tests__/phase-orchestrator-integration.test.d.ts +0 -1
  587. package/dist/src/product-loop/__tests__/phase-orchestrator-integration.test.js +0 -138
  588. package/dist/src/product-loop/__tests__/phase-plan.test.d.ts +0 -1
  589. package/dist/src/product-loop/__tests__/phase-plan.test.js +0 -208
  590. package/dist/src/product-loop/__tests__/phase-rituals.test.d.ts +0 -1
  591. package/dist/src/product-loop/__tests__/phase-rituals.test.js +0 -174
  592. package/dist/src/product-loop/__tests__/phase-runner.test.d.ts +0 -1
  593. package/dist/src/product-loop/__tests__/phase-runner.test.js +0 -414
  594. package/dist/src/product-loop/__tests__/phase-tracker-bridge.test.d.ts +0 -1
  595. package/dist/src/product-loop/__tests__/phase-tracker-bridge.test.js +0 -67
  596. package/dist/src/product-loop/__tests__/pick-backend-stack.test.d.ts +0 -11
  597. package/dist/src/product-loop/__tests__/pick-backend-stack.test.js +0 -95
  598. package/dist/src/product-loop/__tests__/product-identity.test.d.ts +0 -1
  599. package/dist/src/product-loop/__tests__/product-identity.test.js +0 -40
  600. package/dist/src/product-loop/__tests__/progress-snapshot.test.d.ts +0 -8
  601. package/dist/src/product-loop/__tests__/progress-snapshot.test.js +0 -152
  602. package/dist/src/product-loop/__tests__/reality-anchor.test.d.ts +0 -1
  603. package/dist/src/product-loop/__tests__/reality-anchor.test.js +0 -49
  604. package/dist/src/product-loop/__tests__/repo-audit.test.d.ts +0 -1
  605. package/dist/src/product-loop/__tests__/repo-audit.test.js +0 -97
  606. package/dist/src/product-loop/__tests__/repo-brief.test.d.ts +0 -9
  607. package/dist/src/product-loop/__tests__/repo-brief.test.js +0 -132
  608. package/dist/src/product-loop/__tests__/role-memory.test.d.ts +0 -1
  609. package/dist/src/product-loop/__tests__/role-memory.test.js +0 -56
  610. package/dist/src/product-loop/__tests__/role-registry.test.d.ts +0 -1
  611. package/dist/src/product-loop/__tests__/role-registry.test.js +0 -222
  612. package/dist/src/product-loop/__tests__/role-routing-ee.test.d.ts +0 -1
  613. package/dist/src/product-loop/__tests__/role-routing-ee.test.js +0 -79
  614. package/dist/src/product-loop/__tests__/route-decision-emit.test.d.ts +0 -10
  615. package/dist/src/product-loop/__tests__/route-decision-emit.test.js +0 -222
  616. package/dist/src/product-loop/__tests__/seed-questions.test.d.ts +0 -1
  617. package/dist/src/product-loop/__tests__/seed-questions.test.js +0 -30
  618. package/dist/src/product-loop/__tests__/ship-polish.test.d.ts +0 -1
  619. package/dist/src/product-loop/__tests__/ship-polish.test.js +0 -96
  620. package/dist/src/product-loop/__tests__/sprint-planner.test.d.ts +0 -6
  621. package/dist/src/product-loop/__tests__/sprint-planner.test.js +0 -140
  622. package/dist/src/product-loop/__tests__/sprint-runner-backlog.test.d.ts +0 -8
  623. package/dist/src/product-loop/__tests__/sprint-runner-backlog.test.js +0 -221
  624. package/dist/src/product-loop/__tests__/sprint-runner-emit.test.d.ts +0 -14
  625. package/dist/src/product-loop/__tests__/sprint-runner-emit.test.js +0 -279
  626. package/dist/src/product-loop/__tests__/sprint-runner-phase-chunks.test.d.ts +0 -14
  627. package/dist/src/product-loop/__tests__/sprint-runner-phase-chunks.test.js +0 -193
  628. package/dist/src/product-loop/__tests__/sprint-runner.test.d.ts +0 -1
  629. package/dist/src/product-loop/__tests__/sprint-runner.test.js +0 -432
  630. package/dist/src/product-loop/__tests__/sprint-self-verify.test.d.ts +0 -8
  631. package/dist/src/product-loop/__tests__/sprint-self-verify.test.js +0 -73
  632. package/dist/src/product-loop/__tests__/sprint-store.test.d.ts +0 -7
  633. package/dist/src/product-loop/__tests__/sprint-store.test.js +0 -84
  634. package/dist/src/product-loop/__tests__/stakeholder-acl.test.d.ts +0 -1
  635. package/dist/src/product-loop/__tests__/stakeholder-acl.test.js +0 -83
  636. package/dist/src/product-loop/__tests__/state-md-ee-injections.test.d.ts +0 -8
  637. package/dist/src/product-loop/__tests__/state-md-ee-injections.test.js +0 -182
  638. package/dist/src/product-loop/__tests__/sufficiency-routing.spec.d.ts +0 -12
  639. package/dist/src/product-loop/__tests__/sufficiency-routing.spec.js +0 -140
  640. package/dist/src/product-loop/__tests__/typed-artifacts.test.d.ts +0 -1
  641. package/dist/src/product-loop/__tests__/typed-artifacts.test.js +0 -222
  642. package/dist/src/product-loop/__tests__/types.test.d.ts +0 -1
  643. package/dist/src/product-loop/__tests__/types.test.js +0 -79
  644. package/dist/src/product-loop/__tests__/verify-failure-threshold.test.d.ts +0 -9
  645. package/dist/src/product-loop/__tests__/verify-failure-threshold.test.js +0 -146
  646. package/dist/src/product-loop/__tests__/verify-failure-tracking.test.d.ts +0 -4
  647. package/dist/src/product-loop/__tests__/verify-failure-tracking.test.js +0 -122
  648. package/dist/src/product-loop/__tests__/verify-result.test.d.ts +0 -1
  649. package/dist/src/product-loop/__tests__/verify-result.test.js +0 -53
  650. package/dist/src/providers/__tests__/adapter-oauth-wiring.test.d.ts +0 -8
  651. package/dist/src/providers/__tests__/adapter-oauth-wiring.test.js +0 -125
  652. package/dist/src/providers/__tests__/capabilities-cosmetic.test.d.ts +0 -1
  653. package/dist/src/providers/__tests__/capabilities-cosmetic.test.js +0 -109
  654. package/dist/src/providers/__tests__/capabilities-flags.test.d.ts +0 -1
  655. package/dist/src/providers/__tests__/capabilities-flags.test.js +0 -145
  656. package/dist/src/providers/__tests__/capabilities-provider-options.test.d.ts +0 -1
  657. package/dist/src/providers/__tests__/capabilities-provider-options.test.js +0 -201
  658. package/dist/src/providers/__tests__/capabilities-sanitize.test.d.ts +0 -1
  659. package/dist/src/providers/__tests__/capabilities-sanitize.test.js +0 -60
  660. package/dist/src/providers/__tests__/capabilities.test.d.ts +0 -1
  661. package/dist/src/providers/__tests__/capabilities.test.js +0 -41
  662. package/dist/src/providers/__tests__/provider-coverage.test.d.ts +0 -1
  663. package/dist/src/providers/__tests__/provider-coverage.test.js +0 -45
  664. package/dist/src/providers/__tests__/reasoning-roundtrip.test.d.ts +0 -1
  665. package/dist/src/providers/__tests__/reasoning-roundtrip.test.js +0 -216
  666. package/dist/src/providers/__tests__/runtime-integration.test.d.ts +0 -1
  667. package/dist/src/providers/__tests__/runtime-integration.test.js +0 -93
  668. package/dist/src/providers/__tests__/runtime.test.d.ts +0 -1
  669. package/dist/src/providers/__tests__/runtime.test.js +0 -80
  670. package/dist/src/providers/__tests__/siliconflow-sse-repair.test.d.ts +0 -1
  671. package/dist/src/providers/__tests__/siliconflow-sse-repair.test.js +0 -267
  672. package/dist/src/providers/__tests__/strategies-registry.test.d.ts +0 -8
  673. package/dist/src/providers/__tests__/strategies-registry.test.js +0 -49
  674. package/dist/src/providers/__tests__/strategies-resolve.test.d.ts +0 -12
  675. package/dist/src/providers/__tests__/strategies-resolve.test.js +0 -128
  676. package/dist/src/providers/__tests__/wire-debug.test.d.ts +0 -1
  677. package/dist/src/providers/__tests__/wire-debug.test.js +0 -39
  678. package/dist/src/providers/adapter.test.d.ts +0 -1
  679. package/dist/src/providers/adapter.test.js +0 -19
  680. package/dist/src/providers/auth/__tests__/browser-flow.test.d.ts +0 -8
  681. package/dist/src/providers/auth/__tests__/browser-flow.test.js +0 -186
  682. package/dist/src/providers/auth/__tests__/device-flow.test.d.ts +0 -6
  683. package/dist/src/providers/auth/__tests__/device-flow.test.js +0 -219
  684. package/dist/src/providers/auth/__tests__/gemini-oauth.test.d.ts +0 -4
  685. package/dist/src/providers/auth/__tests__/gemini-oauth.test.js +0 -306
  686. package/dist/src/providers/auth/__tests__/grok-oauth.test.d.ts +0 -8
  687. package/dist/src/providers/auth/__tests__/grok-oauth.test.js +0 -236
  688. package/dist/src/providers/auth/__tests__/openai-oauth.test.d.ts +0 -7
  689. package/dist/src/providers/auth/__tests__/openai-oauth.test.js +0 -309
  690. package/dist/src/providers/auth/__tests__/token-store.test.d.ts +0 -7
  691. package/dist/src/providers/auth/__tests__/token-store.test.js +0 -125
  692. package/dist/src/providers/errors.test.d.ts +0 -1
  693. package/dist/src/providers/errors.test.js +0 -66
  694. package/dist/src/providers/gemini.test.d.ts +0 -1
  695. package/dist/src/providers/gemini.test.js +0 -37
  696. package/dist/src/providers/keychain.test.d.ts +0 -1
  697. package/dist/src/providers/keychain.test.js +0 -84
  698. package/dist/src/providers/mcp-vision-bridge.test.d.ts +0 -1
  699. package/dist/src/providers/mcp-vision-bridge.test.js +0 -381
  700. package/dist/src/providers/ollama.test.d.ts +0 -1
  701. package/dist/src/providers/ollama.test.js +0 -37
  702. package/dist/src/providers/openai-compatible.test.d.ts +0 -1
  703. package/dist/src/providers/openai-compatible.test.js +0 -53
  704. package/dist/src/providers/openai.test.d.ts +0 -1
  705. package/dist/src/providers/openai.test.js +0 -53
  706. package/dist/src/providers/pricing.test.d.ts +0 -1
  707. package/dist/src/providers/pricing.test.js +0 -81
  708. package/dist/src/providers/prompt-cache-key.spec.d.ts +0 -5
  709. package/dist/src/providers/prompt-cache-key.spec.js +0 -24
  710. package/dist/src/providers/runtime-mock.spec.d.ts +0 -8
  711. package/dist/src/providers/runtime-mock.spec.js +0 -69
  712. package/dist/src/providers/vision-proxy.test.d.ts +0 -1
  713. package/dist/src/providers/vision-proxy.test.js +0 -212
  714. package/dist/src/reporter/__tests__/acl-check.test.d.ts +0 -6
  715. package/dist/src/reporter/__tests__/acl-check.test.js +0 -59
  716. package/dist/src/reporter/__tests__/auto-fire.test.d.ts +0 -10
  717. package/dist/src/reporter/__tests__/auto-fire.test.js +0 -140
  718. package/dist/src/reporter/__tests__/budget.test.d.ts +0 -7
  719. package/dist/src/reporter/__tests__/budget.test.js +0 -60
  720. package/dist/src/reporter/__tests__/handlers.test.d.ts +0 -7
  721. package/dist/src/reporter/__tests__/handlers.test.js +0 -163
  722. package/dist/src/reporter/__tests__/query-router.test.d.ts +0 -6
  723. package/dist/src/reporter/__tests__/query-router.test.js +0 -90
  724. package/dist/src/router/__tests__/step-router.test.d.ts +0 -4
  725. package/dist/src/router/__tests__/step-router.test.js +0 -131
  726. package/dist/src/router/classifier/index.test.d.ts +0 -1
  727. package/dist/src/router/classifier/index.test.js +0 -29
  728. package/dist/src/router/classifier/regex.test.d.ts +0 -1
  729. package/dist/src/router/classifier/regex.test.js +0 -44
  730. package/dist/src/router/classifier/tree-sitter.test.d.ts +0 -1
  731. package/dist/src/router/classifier/tree-sitter.test.js +0 -23
  732. package/dist/src/router/cold.test.d.ts +0 -1
  733. package/dist/src/router/cold.test.js +0 -56
  734. package/dist/src/router/decide.test.d.ts +0 -1
  735. package/dist/src/router/decide.test.js +0 -198
  736. package/dist/src/router/health.test.d.ts +0 -1
  737. package/dist/src/router/health.test.js +0 -52
  738. package/dist/src/router/provider-sentinel.test.d.ts +0 -1
  739. package/dist/src/router/provider-sentinel.test.js +0 -20
  740. package/dist/src/router/role-override.test.d.ts +0 -1
  741. package/dist/src/router/role-override.test.js +0 -26
  742. package/dist/src/router/warm.test.d.ts +0 -1
  743. package/dist/src/router/warm.test.js +0 -202
  744. package/dist/src/scaffold/__tests__/continuation-prompt.test.d.ts +0 -4
  745. package/dist/src/scaffold/__tests__/continuation-prompt.test.js +0 -79
  746. package/dist/src/scaffold/__tests__/continue-as-council.spec.d.ts +0 -10
  747. package/dist/src/scaffold/__tests__/continue-as-council.spec.js +0 -102
  748. package/dist/src/scaffold/__tests__/dotnet-assembly-name.test.d.ts +0 -1
  749. package/dist/src/scaffold/__tests__/dotnet-assembly-name.test.js +0 -27
  750. package/dist/src/scaffold/__tests__/fe-scaffold-contents.test.d.ts +0 -1
  751. package/dist/src/scaffold/__tests__/fe-scaffold-contents.test.js +0 -106
  752. package/dist/src/scaffold/__tests__/init-new.smoke.spec.d.ts +0 -15
  753. package/dist/src/scaffold/__tests__/init-new.smoke.spec.js +0 -81
  754. package/dist/src/scaffold/__tests__/init-new.spec.d.ts +0 -5
  755. package/dist/src/scaffold/__tests__/init-new.spec.js +0 -378
  756. package/dist/src/scaffold/__tests__/install-bb-templates.spec.d.ts +0 -1
  757. package/dist/src/scaffold/__tests__/install-bb-templates.spec.js +0 -77
  758. package/dist/src/scaffold/__tests__/point-to-existing.spec.d.ts +0 -7
  759. package/dist/src/scaffold/__tests__/point-to-existing.spec.js +0 -94
  760. package/dist/src/self-qa/__tests__/agentic-context.test.d.ts +0 -1
  761. package/dist/src/self-qa/__tests__/agentic-context.test.js +0 -98
  762. package/dist/src/self-qa/__tests__/agentic-loop.test.d.ts +0 -1
  763. package/dist/src/self-qa/__tests__/agentic-loop.test.js +0 -62
  764. package/dist/src/self-qa/__tests__/delta-encoder.test.d.ts +0 -1
  765. package/dist/src/self-qa/__tests__/delta-encoder.test.js +0 -97
  766. package/dist/src/self-qa/__tests__/judge.test.d.ts +0 -1
  767. package/dist/src/self-qa/__tests__/judge.test.js +0 -131
  768. package/dist/src/self-qa/__tests__/scenario-planner.test.d.ts +0 -1
  769. package/dist/src/self-qa/__tests__/scenario-planner.test.js +0 -79
  770. package/dist/src/self-qa/__tests__/spec-emitter.test.d.ts +0 -1
  771. package/dist/src/self-qa/__tests__/spec-emitter.test.js +0 -62
  772. package/dist/src/storage/__tests__/hierarchical-session.test.d.ts +0 -1
  773. package/dist/src/storage/__tests__/hierarchical-session.test.js +0 -161
  774. package/dist/src/storage/__tests__/migrations.test.d.ts +0 -12
  775. package/dist/src/storage/__tests__/migrations.test.js +0 -357
  776. package/dist/src/storage/__tests__/sweep-stale-pending.test.d.ts +0 -10
  777. package/dist/src/storage/__tests__/sweep-stale-pending.test.js +0 -97
  778. package/dist/src/storage/__tests__/ui-interaction-log.test.d.ts +0 -7
  779. package/dist/src/storage/__tests__/ui-interaction-log.test.js +0 -127
  780. package/dist/src/storage/atomic-io.test.d.ts +0 -1
  781. package/dist/src/storage/atomic-io.test.js +0 -74
  782. package/dist/src/storage/config.test.d.ts +0 -1
  783. package/dist/src/storage/config.test.js +0 -29
  784. package/dist/src/storage/session-experience-store.test.d.ts +0 -5
  785. package/dist/src/storage/session-experience-store.test.js +0 -86
  786. package/dist/src/storage/tool-results.test.d.ts +0 -1
  787. package/dist/src/storage/tool-results.test.js +0 -48
  788. package/dist/src/storage/transcript-response-entry.test.d.ts +0 -1
  789. package/dist/src/storage/transcript-response-entry.test.js +0 -111
  790. package/dist/src/storage/transcript.test.d.ts +0 -1
  791. package/dist/src/storage/transcript.test.js +0 -22
  792. package/dist/src/storage/usage-cap.test.d.ts +0 -1
  793. package/dist/src/storage/usage-cap.test.js +0 -51
  794. package/dist/src/tools/__tests__/native-tools.test.d.ts +0 -1
  795. package/dist/src/tools/__tests__/native-tools.test.js +0 -59
  796. package/dist/src/tools/__tests__/vision-gate.test.d.ts +0 -1
  797. package/dist/src/tools/__tests__/vision-gate.test.js +0 -56
  798. package/dist/src/tools/bash-output-cache.test.d.ts +0 -1
  799. package/dist/src/tools/bash-output-cache.test.js +0 -89
  800. package/dist/src/tools/bash-output-integration.test.d.ts +0 -10
  801. package/dist/src/tools/bash-output-integration.test.js +0 -30
  802. package/dist/src/tools/bash.test.d.ts +0 -1
  803. package/dist/src/tools/bash.test.js +0 -90
  804. package/dist/src/tools/computer.test.d.ts +0 -1
  805. package/dist/src/tools/computer.test.js +0 -142
  806. package/dist/src/tools/file-tracker.test.d.ts +0 -1
  807. package/dist/src/tools/file-tracker.test.js +0 -77
  808. package/dist/src/tools/file.test.d.ts +0 -1
  809. package/dist/src/tools/file.test.js +0 -106
  810. package/dist/src/tools/git-safety.test.d.ts +0 -1
  811. package/dist/src/tools/git-safety.test.js +0 -155
  812. package/dist/src/tools/registry-bash-empty-command.test.d.ts +0 -13
  813. package/dist/src/tools/registry-bash-empty-command.test.js +0 -57
  814. package/dist/src/tools/registry-bash-footer.test.d.ts +0 -7
  815. package/dist/src/tools/registry-bash-footer.test.js +0 -82
  816. package/dist/src/tools/registry-ee-query.test.d.ts +0 -11
  817. package/dist/src/tools/registry-ee-query.test.js +0 -71
  818. package/dist/src/tools/registry-git-safety.test.d.ts +0 -7
  819. package/dist/src/tools/registry-git-safety.test.js +0 -103
  820. package/dist/src/tools/registry-session-repeat.test.d.ts +0 -12
  821. package/dist/src/tools/registry-session-repeat.test.js +0 -87
  822. package/dist/src/tools/registry.test.d.ts +0 -1
  823. package/dist/src/tools/registry.test.js +0 -34
  824. package/dist/src/tools/schedule.test.d.ts +0 -1
  825. package/dist/src/tools/schedule.test.js +0 -118
  826. package/dist/src/tools/todo-write-snapshot.test.d.ts +0 -1
  827. package/dist/src/tools/todo-write-snapshot.test.js +0 -43
  828. package/dist/src/ui/__tests__/markdown-render.test.d.ts +0 -1
  829. package/dist/src/ui/__tests__/markdown-render.test.js +0 -65
  830. package/dist/src/ui/__tests__/picker-providers.test.d.ts +0 -1
  831. package/dist/src/ui/__tests__/picker-providers.test.js +0 -31
  832. package/dist/src/ui/cards/__tests__/product-status-card.test.d.ts +0 -1
  833. package/dist/src/ui/cards/__tests__/product-status-card.test.js +0 -27
  834. package/dist/src/ui/components/__tests__/council-leader-bubble.test.d.ts +0 -1
  835. package/dist/src/ui/components/__tests__/council-leader-bubble.test.js +0 -14
  836. package/dist/src/ui/components/__tests__/council-message-bubble.test.d.ts +0 -1
  837. package/dist/src/ui/components/__tests__/council-message-bubble.test.js +0 -74
  838. package/dist/src/ui/components/__tests__/council-phase-timeline.test.d.ts +0 -1
  839. package/dist/src/ui/components/__tests__/council-phase-timeline.test.js +0 -51
  840. package/dist/src/ui/components/__tests__/council-placeholder-bubble.test.d.ts +0 -1
  841. package/dist/src/ui/components/__tests__/council-placeholder-bubble.test.js +0 -14
  842. package/dist/src/ui/components/__tests__/council-question-card.test.d.ts +0 -1
  843. package/dist/src/ui/components/__tests__/council-question-card.test.js +0 -121
  844. package/dist/src/ui/components/__tests__/council-synthesis-banner.test.d.ts +0 -1
  845. package/dist/src/ui/components/__tests__/council-synthesis-banner.test.js +0 -11
  846. package/dist/src/ui/components/__tests__/task-list-panel.test.d.ts +0 -1
  847. package/dist/src/ui/components/__tests__/task-list-panel.test.js +0 -31
  848. package/dist/src/ui/components/__tests__/use-pair-quote-buffer.test.d.ts +0 -1
  849. package/dist/src/ui/components/__tests__/use-pair-quote-buffer.test.js +0 -37
  850. package/dist/src/ui/slash/__tests__/clear.test.d.ts +0 -1
  851. package/dist/src/ui/slash/__tests__/clear.test.js +0 -58
  852. package/dist/src/ui/slash/__tests__/compact.test.d.ts +0 -1
  853. package/dist/src/ui/slash/__tests__/compact.test.js +0 -43
  854. package/dist/src/ui/slash/__tests__/cost.test.d.ts +0 -1
  855. package/dist/src/ui/slash/__tests__/cost.test.js +0 -54
  856. package/dist/src/ui/slash/__tests__/discuss.test.d.ts +0 -1
  857. package/dist/src/ui/slash/__tests__/discuss.test.js +0 -83
  858. package/dist/src/ui/slash/__tests__/execute.test.d.ts +0 -1
  859. package/dist/src/ui/slash/__tests__/execute.test.js +0 -71
  860. package/dist/src/ui/slash/__tests__/expand.test.d.ts +0 -1
  861. package/dist/src/ui/slash/__tests__/expand.test.js +0 -67
  862. package/dist/src/ui/slash/__tests__/ideal.test.d.ts +0 -1
  863. package/dist/src/ui/slash/__tests__/ideal.test.js +0 -158
  864. package/dist/src/ui/slash/__tests__/menu-parity.test.d.ts +0 -17
  865. package/dist/src/ui/slash/__tests__/menu-parity.test.js +0 -43
  866. package/dist/src/ui/slash/__tests__/optimize.test.d.ts +0 -1
  867. package/dist/src/ui/slash/__tests__/optimize.test.js +0 -130
  868. package/dist/src/ui/slash/__tests__/pin.test.d.ts +0 -1
  869. package/dist/src/ui/slash/__tests__/pin.test.js +0 -38
  870. package/dist/src/ui/slash/__tests__/plan.test.d.ts +0 -1
  871. package/dist/src/ui/slash/__tests__/plan.test.js +0 -82
  872. package/dist/src/ui/slash/__tests__/ponytail.test.d.ts +0 -1
  873. package/dist/src/ui/slash/__tests__/ponytail.test.js +0 -37
  874. package/dist/src/ui/slash/__tests__/status-render.test.d.ts +0 -7
  875. package/dist/src/ui/slash/__tests__/status-render.test.js +0 -77
  876. package/dist/src/ui/slash/route.test.d.ts +0 -1
  877. package/dist/src/ui/slash/route.test.js +0 -70
  878. package/dist/src/ui/status-bar/index.test.d.ts +0 -1
  879. package/dist/src/ui/status-bar/index.test.js +0 -139
  880. package/dist/src/ui/status-bar/store.test.d.ts +0 -1
  881. package/dist/src/ui/status-bar/store.test.js +0 -116
  882. package/dist/src/ui/status-bar/tier-badge.test.d.ts +0 -1
  883. package/dist/src/ui/status-bar/tier-badge.test.js +0 -34
  884. package/dist/src/ui/status-bar/usd-meter.test.d.ts +0 -1
  885. package/dist/src/ui/status-bar/usd-meter.test.js +0 -32
  886. package/dist/src/ui/utils/__tests__/format.test.d.ts +0 -1
  887. package/dist/src/ui/utils/__tests__/format.test.js +0 -50
  888. package/dist/src/ui/utils/__tests__/tools.test.d.ts +0 -1
  889. package/dist/src/ui/utils/__tests__/tools.test.js +0 -48
  890. package/dist/src/ui/utils/relaunch.test.d.ts +0 -1
  891. package/dist/src/ui/utils/relaunch.test.js +0 -133
  892. package/dist/src/ui/utils/text.test.d.ts +0 -1
  893. package/dist/src/ui/utils/text.test.js +0 -47
  894. package/dist/src/usage/__tests__/product-ledger.test.d.ts +0 -1
  895. package/dist/src/usage/__tests__/product-ledger.test.js +0 -60
  896. package/dist/src/usage/downgrade.test.d.ts +0 -1
  897. package/dist/src/usage/downgrade.test.js +0 -70
  898. package/dist/src/usage/estimator.test.d.ts +0 -1
  899. package/dist/src/usage/estimator.test.js +0 -38
  900. package/dist/src/usage/ledger.test.d.ts +0 -1
  901. package/dist/src/usage/ledger.test.js +0 -171
  902. package/dist/src/usage/midstream.test.d.ts +0 -1
  903. package/dist/src/usage/midstream.test.js +0 -47
  904. package/dist/src/usage/thresholds.test.d.ts +0 -1
  905. package/dist/src/usage/thresholds.test.js +0 -77
  906. package/dist/src/utils/__tests__/auto-council-settings.test.d.ts +0 -1
  907. package/dist/src/utils/__tests__/auto-council-settings.test.js +0 -41
  908. package/dist/src/utils/__tests__/compaction-caps.test.d.ts +0 -21
  909. package/dist/src/utils/__tests__/compaction-caps.test.js +0 -187
  910. package/dist/src/utils/__tests__/ee-logger.test.d.ts +0 -11
  911. package/dist/src/utils/__tests__/ee-logger.test.js +0 -165
  912. package/dist/src/utils/__tests__/file-lock.test.d.ts +0 -1
  913. package/dist/src/utils/__tests__/file-lock.test.js +0 -66
  914. package/dist/src/utils/__tests__/footprint-gitignore.test.d.ts +0 -1
  915. package/dist/src/utils/__tests__/footprint-gitignore.test.js +0 -50
  916. package/dist/src/utils/__tests__/llm-deadline-abort.test.d.ts +0 -1
  917. package/dist/src/utils/__tests__/llm-deadline-abort.test.js +0 -33
  918. package/dist/src/utils/__tests__/llm-deadline.test.d.ts +0 -1
  919. package/dist/src/utils/__tests__/llm-deadline.test.js +0 -68
  920. package/dist/src/utils/__tests__/logger.test.d.ts +0 -1
  921. package/dist/src/utils/__tests__/logger.test.js +0 -115
  922. package/dist/src/utils/__tests__/rate-limit.test.d.ts +0 -1
  923. package/dist/src/utils/__tests__/rate-limit.test.js +0 -38
  924. package/dist/src/utils/__tests__/settings-agent-first.test.d.ts +0 -1
  925. package/dist/src/utils/__tests__/settings-agent-first.test.js +0 -48
  926. package/dist/src/utils/__tests__/settings-disabled-models.test.d.ts +0 -7
  927. package/dist/src/utils/__tests__/settings-disabled-models.test.js +0 -99
  928. package/dist/src/utils/__tests__/settings-web-research.test.d.ts +0 -1
  929. package/dist/src/utils/__tests__/settings-web-research.test.js +0 -46
  930. package/dist/src/utils/__tests__/slugify.test.d.ts +0 -1
  931. package/dist/src/utils/__tests__/slugify.test.js +0 -37
  932. package/dist/src/utils/__tests__/visible-retry.test.d.ts +0 -1
  933. package/dist/src/utils/__tests__/visible-retry.test.js +0 -143
  934. package/dist/src/utils/install-manager.test.d.ts +0 -1
  935. package/dist/src/utils/install-manager.test.js +0 -169
  936. package/dist/src/utils/instructions.test.d.ts +0 -1
  937. package/dist/src/utils/instructions.test.js +0 -93
  938. package/dist/src/utils/open-url.test.d.ts +0 -1
  939. package/dist/src/utils/open-url.test.js +0 -86
  940. package/dist/src/utils/permission-mode.test.d.ts +0 -1
  941. package/dist/src/utils/permission-mode.test.js +0 -188
  942. package/dist/src/utils/redactor.test.d.ts +0 -1
  943. package/dist/src/utils/redactor.test.js +0 -84
  944. package/dist/src/utils/settings.test.d.ts +0 -1
  945. package/dist/src/utils/settings.test.js +0 -212
  946. package/dist/src/utils/shell.test.d.ts +0 -1
  947. package/dist/src/utils/shell.test.js +0 -97
  948. package/dist/src/utils/skills.test.d.ts +0 -1
  949. package/dist/src/utils/skills.test.js +0 -45
  950. package/dist/src/utils/subagent-display.test.d.ts +0 -1
  951. package/dist/src/utils/subagent-display.test.js +0 -21
  952. package/dist/src/utils/subagents-settings.test.d.ts +0 -1
  953. package/dist/src/utils/subagents-settings.test.js +0 -64
  954. package/dist/src/utils/telegram-audio-settings.test.d.ts +0 -1
  955. package/dist/src/utils/telegram-audio-settings.test.js +0 -39
  956. package/dist/src/utils/update-checker.test.d.ts +0 -1
  957. package/dist/src/utils/update-checker.test.js +0 -142
  958. package/dist/src/verify/__tests__/coverage-parsers.test.d.ts +0 -1
  959. package/dist/src/verify/__tests__/coverage-parsers.test.js +0 -69
  960. package/dist/src/verify/__tests__/dotnet-recipe.test.d.ts +0 -10
  961. package/dist/src/verify/__tests__/dotnet-recipe.test.js +0 -70
  962. package/dist/src/verify/checkpoint.test.d.ts +0 -1
  963. package/dist/src/verify/checkpoint.test.js +0 -160
  964. package/dist/src/verify/entrypoint.test.d.ts +0 -1
  965. package/dist/src/verify/entrypoint.test.js +0 -233
  966. package/dist/src/verify/environment.test.d.ts +0 -1
  967. package/dist/src/verify/environment.test.js +0 -94
  968. package/dist/src/verify/orchestrator.test.d.ts +0 -1
  969. package/dist/src/verify/orchestrator.test.js +0 -126
  970. package/dist/src/verify/runtime-prep.test.d.ts +0 -1
  971. package/dist/src/verify/runtime-prep.test.js +0 -38
@@ -1,764 +0,0 @@
1
- import { beforeEach, describe, expect, it, vi } from "vitest";
2
- // Mock dependencies before importing the module under test
3
- vi.mock("../router/classifier/index.js", () => ({
4
- classify: vi.fn(),
5
- }));
6
- vi.mock("../ee/bridge.js", () => ({
7
- classifyViaBrain: vi.fn(),
8
- pilContext: vi.fn(),
9
- }));
10
- vi.mock("./config.js", () => ({
11
- isUnifiedPilEnabled: vi.fn(() => false),
12
- // Default OFF so the existing cascade tests below exercise the regex passes.
13
- // The model-first gate has its own describe block that flips this to true.
14
- isLlmFirstClassifyEnabled: vi.fn(() => false),
15
- // G3 (b1): default OFF so the existing model-first classification tests don't
16
- // trigger the unified brain fetch; the brain-path test flips it true.
17
- isLlmFirstBrainEnabled: vi.fn(() => false),
18
- // Pass-3 unified reads the client-side budget; provided so the whole-module
19
- // mock does not drop the export (the model-first tests never hit it, but the
20
- // cascade tests can).
21
- getUnifiedPilBudgetMs: vi.fn(() => 3500),
22
- }));
23
- import { classifyViaBrain, pilContext } from "../ee/bridge.js";
24
- import { classify } from "../router/classifier/index.js";
25
- import { isLlmFirstBrainEnabled, isLlmFirstClassifyEnabled } from "./config.js";
26
- import { hasActionableToolIntent, isGreenfieldBuildTask, isSocialPleasantry, isStatusCheckQuestion, layer1Intent, } from "./layer1-intent.js";
27
- const mockedClassify = vi.mocked(classify);
28
- const mockedClassifyViaBrain = vi.mocked(classifyViaBrain);
29
- const mockedLlmFirst = vi.mocked(isLlmFirstClassifyEnabled);
30
- const mockedLlmFirstBrain = vi.mocked(isLlmFirstBrainEnabled);
31
- const mockedPilContext = vi.mocked(pilContext);
32
- function makeCtx(raw) {
33
- return {
34
- raw,
35
- enriched: raw,
36
- taskType: null,
37
- domain: null,
38
- confidence: 0,
39
- outputStyle: null,
40
- tokenBudget: 500,
41
- metrics: null,
42
- layers: [],
43
- };
44
- }
45
- beforeEach(() => {
46
- vi.resetAllMocks();
47
- // Default: brain returns null (no classification)
48
- mockedClassifyViaBrain.mockResolvedValue(null);
49
- });
50
- describe("layer1Intent", () => {
51
- it("maps short messages (≤80 chars) to taskType = 'general' via regex:short-message", async () => {
52
- mockedClassify.mockReturnValue({ tier: "hot", reason: "regex:short-message", confidence: 0.3 });
53
- const result = await layer1Intent(makeCtx("hi there"));
54
- expect(result.taskType).toBe("general");
55
- // Hot-path chitchat short-circuit promotes the message to chitchat (≤10
56
- // chars + ≤2 words AND no keyword match). It also bumps confidence to 0.5
57
- // and assigns intentKind="chitchat" so downstream layers can skip MCP.
58
- expect(result.confidence).toBe(0.5);
59
- expect(result.intentKind).toBe("chitchat");
60
- });
61
- it("does NOT trigger chitchat hot-path when classifier is high-confidence", async () => {
62
- mockedClassify.mockReturnValue({ tier: "hot", reason: "regex:short-message", confidence: 0.3 });
63
- // 11 chars, 3 words — fails hot-path constraints, stays plain "general".
64
- const result = await layer1Intent(makeCtx("hi how are"));
65
- expect(result.taskType).toBe("general");
66
- expect(result.intentKind).toBeFalsy();
67
- });
68
- it("returns taskType=null for no-match without keyword or brain hit", async () => {
69
- mockedClassify.mockReturnValue({ tier: "abstain", reason: "regex:no-match", confidence: 0.1 });
70
- mockedClassifyViaBrain.mockResolvedValue(null);
71
- const result = await layer1Intent(makeCtx("lorem ipsum dolor sit amet"));
72
- expect(result.taskType).toBeNull();
73
- });
74
- it("applies keyword fallback (Pass 2) for debug-related messages", async () => {
75
- mockedClassify.mockReturnValue({ tier: "abstain", reason: "regex:no-match", confidence: 0.1 });
76
- const result = await layer1Intent(makeCtx("there is a bug in the login flow"));
77
- expect(result.taskType).toBe("debug");
78
- expect(result.confidence).toBe(0.65);
79
- });
80
- it("rescues VN CI-debug prompts that hit the catch-all regex:edit (conf < 0.7)", async () => {
81
- // Reproduces session 2f8e70c6a169: prompt "ci/cd ... đang bị lỗi ... fix cho tôi"
82
- // hits the v2 catch-all `regex:edit` at 0.55 → would otherwise route as
83
- // taskType=generate and trigger an irrelevant "feature implemented" askcard.
84
- // The catch-all rescue branch in Pass 2 must let the VN debug keyword
85
- // pattern (`\blỗi\b`) override generate → debug before any brain call.
86
- mockedClassify.mockReturnValue({ tier: "hot", reason: "regex:edit", confidence: 0.55 });
87
- const result = await layer1Intent(makeCtx("hiện tại ci/cd của repo này đang bị lỗi gh đã cài sẵn, bạn check và fix cho tôi nhé, mục tiêu là ci/cd xanh"));
88
- expect(result.taskType).toBe("debug");
89
- expect(result.confidence).toBe(0.65);
90
- });
91
- it("does NOT trigger catch-all rescue when regex:edit is high-confidence", async () => {
92
- // Defensive: if someone later raises regex:edit conf ≥ 0.7, Pass 2 must
93
- // NOT silently rewrite the classification.
94
- mockedClassify.mockReturnValue({ tier: "hot", reason: "regex:edit", confidence: 0.8 });
95
- const result = await layer1Intent(makeCtx("fix the bug in login.ts"));
96
- expect(result.taskType).toBe("generate");
97
- expect(result.confidence).toBe(0.8);
98
- });
99
- it("applies keyword fallback (Pass 2) for plan-related messages", async () => {
100
- mockedClassify.mockReturnValue({ tier: "abstain", reason: "regex:no-match", confidence: 0.1 });
101
- const result = await layer1Intent(makeCtx("let's plan the architecture for phase 3"));
102
- expect(result.taskType).toBe("plan");
103
- expect(result.confidence).toBe(0.6);
104
- });
105
- it("invokes brain classification (Pass 3) when taskType is null after Pass 2", async () => {
106
- mockedClassify.mockReturnValue({ tier: "abstain", reason: "regex:no-match", confidence: 0.1 });
107
- mockedClassifyViaBrain.mockResolvedValue("generate, concise");
108
- // No leading creation verb + no artifact noun → misses Pass 0 greenfield-build
109
- // and the Pass 2 keyword rules, so the brain (Pass 3) decides. (A prompt with
110
- // an explicit creation verb like "make me a new service" is now pinned to
111
- // `build` by Pass 0 and never reaches the brain.)
112
- const result = await layer1Intent(makeCtx("work on the onboarding flow"));
113
- expect(mockedClassifyViaBrain).toHaveBeenCalled();
114
- expect(result.taskType).toBe("generate");
115
- expect(result.confidence).toBe(0.55);
116
- expect(result.outputStyle).toBe("concise");
117
- });
118
- it("extracts domain from tree-sitter reason", async () => {
119
- mockedClassify.mockReturnValue({ tier: "hot", reason: "tree-sitter:typescript", confidence: 0.9 });
120
- const result = await layer1Intent(makeCtx("refactor the handler function"));
121
- expect(result.taskType).toBe("refactor");
122
- expect(result.domain).toBe("typescript");
123
- });
124
- // 4P-1 regression: tree-sitter:* reasons indicate code presence ONLY, no
125
- // intent signal. Mapping them to "refactor" caused 4/5 baseline
126
- // misclassifications. They must now map to undefined so Pass 2 keyword
127
- // fallback decides — and the keyword path must still classify real refactor
128
- // prompts correctly.
129
- it("4P-1: tree-sitter:typescript reason alone (no refactor keyword) does NOT classify as refactor", async () => {
130
- mockedClassify.mockReturnValue({ tier: "hot", reason: "tree-sitter:typescript", confidence: 0.9 });
131
- // Prompt contains code-like signals but no refactor/keyword cues.
132
- const result = await layer1Intent(makeCtx("here is some typescript: const x = 1; what does this print?"));
133
- expect(result.taskType).not.toBe("refactor");
134
- });
135
- it("4P-1: tree-sitter:python reason alone (no refactor keyword) does NOT classify as refactor", async () => {
136
- mockedClassify.mockReturnValue({ tier: "hot", reason: "tree-sitter:python", confidence: 0.9 });
137
- const result = await layer1Intent(makeCtx("here is some python code that I want explained"));
138
- expect(result.taskType).not.toBe("refactor");
139
- });
140
- it("4P-1: real refactor keyword prompt + tree-sitter:typescript STILL classifies as refactor via Pass 2", async () => {
141
- mockedClassify.mockReturnValue({ tier: "hot", reason: "tree-sitter:typescript", confidence: 0.9 });
142
- const result = await layer1Intent(makeCtx("rename helper function buildContext to buildContextV2 across the file refactor"));
143
- expect(result.taskType).toBe("refactor");
144
- expect(result.domain).toBe("typescript");
145
- });
146
- // 4P-2: bridge classifier system prompt MUST be neutral. The legacy classifier
147
- // text (sent to classifyViaBrain when local signal is weak) was previously
148
- // biased toward `refactor` because it listed refactor first and treated any
149
- // code touch as restructuring. Phase 4P-2 rewrites the prompt to enumerate
150
- // categories in neutral order, restrict refactor to explicit restructure
151
- // verbs, and prefer the catch-all `general` over guessing.
152
- describe("4P-2: bridge classifier system prompt — neutral guidance", () => {
153
- it("prompt text declares categories in neutral order (analyze, debug, generate, refactor, plan, documentation, general)", async () => {
154
- mockedClassify.mockReturnValue({ tier: "abstain", reason: "regex:no-match", confidence: 0.1 });
155
- mockedClassifyViaBrain.mockResolvedValue("general,balanced");
156
- await layer1Intent(makeCtx("some longer ambiguous prompt that triggers brain"));
157
- const promptArg = mockedClassifyViaBrain.mock.calls[0]?.[0] ?? "";
158
- // Neutral-order requirement: analyze appears before refactor
159
- const idxAnalyze = promptArg.indexOf("analyze");
160
- const idxRefactor = promptArg.indexOf("refactor");
161
- expect(idxAnalyze).toBeGreaterThanOrEqual(0);
162
- expect(idxAnalyze).toBeLessThan(idxRefactor);
163
- });
164
- it("prompt text contains explicit refactor restriction sentence", async () => {
165
- mockedClassify.mockReturnValue({ tier: "abstain", reason: "regex:no-match", confidence: 0.1 });
166
- mockedClassifyViaBrain.mockResolvedValue("general,balanced");
167
- await layer1Intent(makeCtx("some longer ambiguous prompt that triggers brain"));
168
- const promptArg = mockedClassifyViaBrain.mock.calls[0]?.[0] ?? "";
169
- expect(promptArg).toMatch(/Only return refactor when/);
170
- });
171
- it("prompt text instructs preferring 'general' over guessing when ambiguous", async () => {
172
- mockedClassify.mockReturnValue({ tier: "abstain", reason: "regex:no-match", confidence: 0.1 });
173
- mockedClassifyViaBrain.mockResolvedValue("general,balanced");
174
- await layer1Intent(makeCtx("some longer ambiguous prompt that triggers brain"));
175
- const promptArg = mockedClassifyViaBrain.mock.calls[0]?.[0] ?? "";
176
- expect(promptArg).toMatch(/prefer 'general'|when uncertain|when ambiguous/i);
177
- });
178
- it("prompt text clarifies feature-add prompts are 'generate', not refactor", async () => {
179
- mockedClassify.mockReturnValue({ tier: "abstain", reason: "regex:no-match", confidence: 0.1 });
180
- mockedClassifyViaBrain.mockResolvedValue("general,balanced");
181
- await layer1Intent(makeCtx("some longer ambiguous prompt that triggers brain"));
182
- const promptArg = mockedClassifyViaBrain.mock.calls[0]?.[0] ?? "";
183
- expect(promptArg).toMatch(/Feature additions|add flag|generate.*even when they touch/i);
184
- });
185
- });
186
- describe("4P-2: bridge classifier — 5 baseline prompts produce correct labels", () => {
187
- // The bridge classifier mock returns each baseline's expected label as if
188
- // the LLM had read the new neutral prompt. This guards the WIRING
189
- // (mocked brain reply → taskType on ctx) and pins the 5 baseline prompts
190
- // into the regression suite so future prompt changes that break any of
191
- // them fail loudly.
192
- it("baseline 1: 'giải thích đoạn code ở src/index.ts:1403' → analyze", async () => {
193
- mockedClassify.mockReturnValue({ tier: "abstain", reason: "regex:no-match", confidence: 0.1 });
194
- mockedClassifyViaBrain.mockResolvedValue("analyze,balanced");
195
- const result = await layer1Intent(makeCtx("giải thích đoạn code ở src/index.ts:1403"));
196
- expect(result.taskType).toBe("analyze");
197
- });
198
- it("baseline 2: 'đổi default --max-tool-rounds từ 100 → 150 trong src/orchestrator/cli-args.ts' → generate", async () => {
199
- mockedClassify.mockReturnValue({ tier: "abstain", reason: "regex:no-match", confidence: 0.1 });
200
- mockedClassifyViaBrain.mockResolvedValue("generate,concise");
201
- const result = await layer1Intent(makeCtx("đổi default --max-tool-rounds từ 100 → 150 trong src/orchestrator/cli-args.ts"));
202
- expect(result.taskType).toBe("generate");
203
- });
204
- it("baseline 3: 'tìm xem tại sao bash_output_get trả empty khi run_id sai' → debug", async () => {
205
- mockedClassify.mockReturnValue({ tier: "abstain", reason: "regex:no-match", confidence: 0.1 });
206
- mockedClassifyViaBrain.mockResolvedValue("debug,balanced");
207
- const result = await layer1Intent(makeCtx("tìm xem tại sao bash_output_get trả empty khi run_id sai"));
208
- expect(result.taskType).toBe("debug");
209
- });
210
- it("baseline 4: 'thêm flag --budget-tokens N, khi total tokens > N thì halt với reason=budget exhausted' → generate", async () => {
211
- mockedClassify.mockReturnValue({ tier: "abstain", reason: "regex:no-match", confidence: 0.1 });
212
- mockedClassifyViaBrain.mockResolvedValue("generate,concise");
213
- const result = await layer1Intent(makeCtx("thêm flag --budget-tokens N, khi total tokens > N thì halt với reason='budget exhausted'"));
214
- expect(result.taskType).toBe("generate");
215
- });
216
- // Phase 5 BUG-E — "improve test coverage" is a test-generation prompt
217
- // (writing new test cases), not analysis. Pass 0 pins it deterministically
218
- // to `generate` BEFORE Pass 1, so the auto-council gate (which fires on
219
- // analyze + conf≥0.85) never receives a wrong label. See session
220
- // f1a2a2a547db: misclassification routed a 327-line single-file task
221
- // through 13 minutes of council debate before halting on tool-pattern-loop.
222
- it("baseline 5: 'improve test coverage' → generate (Pass 0 test-generation pin)", async () => {
223
- mockedClassify.mockReturnValue({ tier: "abstain", reason: "regex:no-match", confidence: 0.1 });
224
- mockedClassifyViaBrain.mockResolvedValue("general,balanced");
225
- const result = await layer1Intent(makeCtx("improve test coverage"));
226
- expect(result.taskType).toBe("generate");
227
- expect(result._intentTrace?.pass1Reason).toBe("pass0:test-generation");
228
- });
229
- });
230
- describe("Pass 0 — deterministic overrides (BUG-B + BUG-D)", () => {
231
- const continuationCases = [
232
- "tiếp tục",
233
- "tiếp tục nhé",
234
- "tiếp",
235
- "continue",
236
- "go on",
237
- "keep going",
238
- "ok",
239
- "okay",
240
- "được rồi",
241
- "duoc roi",
242
- "yes",
243
- "yeah",
244
- ];
245
- for (const phrase of continuationCases) {
246
- it(`Pass 0 continuation '${phrase}' → general/chitchat, skips classifier`, async () => {
247
- const result = await layer1Intent(makeCtx(phrase));
248
- expect(result.taskType).toBe("general");
249
- expect(result.intentKind).toBe("chitchat");
250
- expect(result.confidence).toBe(0.9);
251
- expect(result.outputStyle).toBe("concise");
252
- expect(mockedClassify).not.toHaveBeenCalled();
253
- expect(mockedClassifyViaBrain).not.toHaveBeenCalled();
254
- const trace = result._intentTrace;
255
- expect(trace?.pass1Reason).toBe("pass0:continuation");
256
- });
257
- }
258
- it("Pass 0 continuation does NOT swallow embedded substrings", async () => {
259
- mockedClassify.mockReturnValue({ tier: "abstain", reason: "regex:no-match", confidence: 0.1 });
260
- const result = await layer1Intent(makeCtx("ok let's refactor this function"));
261
- expect(mockedClassify).toHaveBeenCalled();
262
- expect(result.taskType).not.toBe("general");
263
- });
264
- const performanceCases = [
265
- "optimize startup performance",
266
- "optimise the bundle",
267
- "speed up the build",
268
- "make the tests run faster",
269
- "tối ưu thời gian load",
270
- "tăng tốc quá trình init",
271
- "reduce latency",
272
- "improve throughput",
273
- ];
274
- for (const phrase of performanceCases) {
275
- it(`Pass 0 performance '${phrase}' → refactor/task, skips classifier`, async () => {
276
- const result = await layer1Intent(makeCtx(phrase));
277
- expect(result.taskType).toBe("refactor");
278
- expect(result.intentKind).toBe("task");
279
- expect(result.confidence).toBe(0.85);
280
- expect(mockedClassify).not.toHaveBeenCalled();
281
- expect(mockedClassifyViaBrain).not.toHaveBeenCalled();
282
- const trace = result._intentTrace;
283
- expect(trace?.pass1Reason).toBe("pass0:performance");
284
- });
285
- }
286
- it("Pass 0 performance defers to bridge when prompt asks to ADD new code", async () => {
287
- mockedClassify.mockReturnValue({ tier: "abstain", reason: "regex:no-match", confidence: 0.1 });
288
- mockedClassifyViaBrain.mockResolvedValue("generate,balanced");
289
- // Avoid the word "test" — Pass 2 keyword `analyze` rule fires on "test"
290
- // before the brain is consulted. The point of this test is to verify
291
- // Pass 0's `add` guard defers control back to the cascade, regardless
292
- // of which subsequent pass decides.
293
- const result = await layer1Intent(makeCtx("add a benchmark for the optimize() helper"));
294
- expect(mockedClassify).toHaveBeenCalled();
295
- // Pass 2 keyword "generate" rule matches `\bgenerate|scaffold|bootstrap\b`.
296
- // We just verify Pass 0 did NOT pin refactor.
297
- expect(result.taskType).not.toBe("refactor");
298
- });
299
- it("Pass 0 performance defers to bridge when prompt asks to explain/analyze", async () => {
300
- mockedClassify.mockReturnValue({ tier: "abstain", reason: "regex:no-match", confidence: 0.1 });
301
- mockedClassifyViaBrain.mockResolvedValue("analyze,balanced");
302
- const result = await layer1Intent(makeCtx("explain why optimize() is slow"));
303
- expect(mockedClassify).toHaveBeenCalled();
304
- expect(result.taskType).toBe("analyze");
305
- });
306
- // Greenfield CREATE/BUILD intent → build (live `/ideal` verify regression).
307
- // "build a … microservice …" fell through to the brain → refactor, and
308
- // "build a … validator with vitest tests" was hijacked by the Pass 2
309
- // `analyze` keyword (the word "tests"). The verb "build" is recognized by no
310
- // deterministic pass (Pass 1 create-file regex only fires on the literal
311
- // nouns file/component/module/class/function; Pass 2 generate keyword only
312
- // has generate/scaffold/bootstrap). `build` is now a first-class TaskType
313
- // (greenfield project/feature creation); Pass 0 pins it deterministically
314
- // before the classifier + brain.
315
- const greenfieldCases = [
316
- "build a muonroi-building-block microservice with a fraud-detection rule engine, multi-tenancy, and auth",
317
- "build a Node TypeScript ISO-4217 currency code validator with vitest tests",
318
- "build a small Node TS lib",
319
- "create a REST API in Express",
320
- "make a React dashboard component",
321
- "implement a rate limiter middleware",
322
- "develop a chat application with websockets",
323
- "i want to build a todo app",
324
- ];
325
- for (const phrase of greenfieldCases) {
326
- it(`Pass 0 greenfield '${phrase.slice(0, 36)}…' → build/task, skips classifier`, async () => {
327
- const result = await layer1Intent(makeCtx(phrase));
328
- expect(result.taskType).toBe("build");
329
- expect(result.intentKind).toBe("task");
330
- expect(result.confidence).toBe(0.85);
331
- expect(mockedClassify).not.toHaveBeenCalled();
332
- expect(mockedClassifyViaBrain).not.toHaveBeenCalled();
333
- expect(result._intentTrace?.pass1Reason).toBe("pass0:greenfield-build");
334
- });
335
- }
336
- it("Pass 0 greenfield defers to cascade for build-FAILURE prompts (debug, not build)", async () => {
337
- mockedClassify.mockReturnValue({ tier: "abstain", reason: "regex:no-match", confidence: 0.1 });
338
- const result = await layer1Intent(makeCtx("the build is failing after the merge"));
339
- expect(mockedClassify).toHaveBeenCalled();
340
- expect(result.taskType).not.toBe("build");
341
- });
342
- it("Pass 0 greenfield defers to cascade for explanation prompts (analyze, not build)", async () => {
343
- mockedClassify.mockReturnValue({ tier: "abstain", reason: "regex:no-match", confidence: 0.1 });
344
- mockedClassifyViaBrain.mockResolvedValue("analyze,balanced");
345
- const result = await layer1Intent(makeCtx("explain how to build a parser"));
346
- expect(mockedClassify).toHaveBeenCalled();
347
- expect(result.taskType).not.toBe("build");
348
- });
349
- it("Pass 0 greenfield does NOT fire on refactor of an existing artifact", async () => {
350
- mockedClassify.mockReturnValue({ tier: "hot", reason: "regex:refactor", confidence: 0.75 });
351
- const result = await layer1Intent(makeCtx("refactor the user service"));
352
- expect(mockedClassify).toHaveBeenCalled();
353
- expect(result.taskType).toBe("refactor");
354
- });
355
- });
356
- it("fails open on error — returns ctx unchanged with applied=false", async () => {
357
- mockedClassify.mockImplementation(() => {
358
- throw new Error("classifier crashed");
359
- });
360
- const ctx = makeCtx("test input");
361
- const result = await layer1Intent(ctx);
362
- expect(result.taskType).toBeNull();
363
- expect(result.layers).toHaveLength(1);
364
- expect(result.layers[0].applied).toBe(false);
365
- });
366
- });
367
- describe("hasActionableToolIntent — explicit run/tool requests are never chitchat", () => {
368
- it("detects an explicit bash/command-execution request (VI + EN)", () => {
369
- // The exact prompt from live harness session 817e508f57ee that the LLM
370
- // classifier mislabelled chitchat → tools dropped → agent could not act.
371
- expect(hasActionableToolIntent("Dùng bash tool chạy đúng 1 lệnh để đếm số file *.ts")).toBe(true);
372
- expect(hasActionableToolIntent("Run exactly 1 bash command to count all *.ts files")).toBe(true);
373
- expect(hasActionableToolIntent("chạy lệnh build cho tôi")).toBe(true);
374
- expect(hasActionableToolIntent("execute the test script")).toBe(true);
375
- });
376
- it("does NOT fire on greetings / continuations / pure-explanation asks", () => {
377
- expect(hasActionableToolIntent("hi there")).toBe(false);
378
- expect(hasActionableToolIntent("tiếp tục nhé")).toBe(false);
379
- expect(hasActionableToolIntent("thank you so much for that")).toBe(false);
380
- expect(hasActionableToolIntent("what time is it")).toBe(false);
381
- });
382
- });
383
- describe("intentKind guard — a tool/command request must never route as chitchat", () => {
384
- const generalFallback = async () => ({
385
- taskType: "general",
386
- outputStyle: null,
387
- confidence: 0.75,
388
- intentKind: "task",
389
- deliverableKind: null,
390
- depthTier: null,
391
- ecosystemScope: null,
392
- replyLanguage: null,
393
- });
394
- it("flips chitchat → task when the LLM fallback returns 'general' but the prompt is a command request", async () => {
395
- // Reproduces 817e508f57ee: classify abstains, LLM fallback returns
396
- // general → intentKind would be chitchat → message-processor drops the
397
- // entire toolset (incl. bash). The guard must keep it a task.
398
- mockedClassify.mockReturnValue({ tier: "abstain", reason: "regex:no-match", confidence: 0.1 });
399
- const result = await layer1Intent(makeCtx("Dùng bash tool chạy đúng 1 lệnh để đếm số file *.ts"), {
400
- llmFallback: generalFallback,
401
- });
402
- expect(result.intentKind).toBe("task");
403
- });
404
- it("leaves a genuine chitchat turn as chitchat (no false promotion)", async () => {
405
- // "thank you so much for that" is caught by Pass 2.6 (isSocialPleasantry)
406
- // UPSTREAM of the LLM fallback — so it stays chitchat regardless of the
407
- // Pass 4 mapping. generalFallback is provided but never invoked here.
408
- mockedClassify.mockReturnValue({ tier: "abstain", reason: "regex:no-match", confidence: 0.1 });
409
- const result = await layer1Intent(makeCtx("thank you so much for that"), {
410
- llmFallback: generalFallback,
411
- });
412
- expect(result.intentKind).toBe("chitchat");
413
- });
414
- it("keeps a SUBSTANTIVE general question tool-capable (session b51ba653e890)", async () => {
415
- // "how does this CLI affect you?" — a self/CLI-referential question that
416
- // slips past every greeting detector (not ultra-short, not a pleasantry,
417
- // not a status-check) and reaches Pass 4. The LLM returns general; the old
418
- // code mapped general→chitchat → message-processor dropped the whole
419
- // toolset → the model could not investigate → narration + respond spam.
420
- // The Pass 4 result must be a tool-capable "task", never chitchat.
421
- mockedClassify.mockReturnValue({ tier: "abstain", reason: "regex:no-match", confidence: 0.1 });
422
- const result = await layer1Intent(makeCtx("bạn đang được chạy bên trong CLI này thì bạn xem CLI tác động như thế nào đến bạn?"), { llmFallback: generalFallback });
423
- expect(result.intentKind).toBe("task");
424
- });
425
- });
426
- describe("isGreenfieldBuildTask — greenfield create/build intent (Pass 0 pin)", () => {
427
- const positives = [
428
- "build a muonroi-building-block microservice with a fraud-detection rule engine, multi-tenancy, and auth",
429
- "build a Node TypeScript ISO-4217 currency code validator with vitest tests",
430
- "build a small Node TS lib",
431
- "create a REST API in Express",
432
- "create a CLI tool for managing tasks",
433
- "make a React dashboard component",
434
- "implement a rate limiter middleware",
435
- "develop a chat application with websockets",
436
- "scaffold a new CLI tool",
437
- "build me a currency converter",
438
- "Build a GraphQL server",
439
- "please create an authentication service",
440
- "can you build a parser for ISO-8601 dates",
441
- "set up a CI pipeline for the repo",
442
- "build a faster JSON parser",
443
- "i want to build a todo app",
444
- ];
445
- const negatives = [
446
- "the build is failing",
447
- "fix the build",
448
- "build broke after the merge",
449
- "why is the build red?",
450
- "the CI pipeline is broken",
451
- "explain how to build a parser",
452
- "how would you build a microservice?",
453
- "should I build this as a monolith or microservices?",
454
- "review the auth service I built",
455
- "refactor the user service",
456
- "rename the build function",
457
- "analyze the rule engine",
458
- "make it faster",
459
- "make the tests pass",
460
- "create a branch and commit",
461
- "update the readme",
462
- "optimize the database queries",
463
- "what does the validator do?",
464
- "add a button to the form",
465
- "the server crashed",
466
- ];
467
- it("matches greenfield creation requests", () => {
468
- for (const p of positives)
469
- expect(isGreenfieldBuildTask(p), p).toBe(true);
470
- });
471
- it("does NOT match debug / analyze / refactor / question prompts", () => {
472
- for (const n of negatives)
473
- expect(isGreenfieldBuildTask(n), n).toBe(false);
474
- });
475
- it("returns false on empty / whitespace input", () => {
476
- expect(isGreenfieldBuildTask("")).toBe(false);
477
- expect(isGreenfieldBuildTask(" ")).toBe(false);
478
- });
479
- });
480
- describe("isStatusCheckQuestion — meta follow-ups about prior work (session c6387d2c6e1b)", () => {
481
- it("detects Vietnamese 'đã … chưa' status questions", () => {
482
- expect(isStatusCheckQuestion("bạn đã có plan chưa nhỉ")).toBe(true);
483
- expect(isStatusCheckQuestion("xong chưa")).toBe(true);
484
- expect(isStatusCheckQuestion("đã fix chưa vậy")).toBe(true);
485
- expect(isStatusCheckQuestion("plan xong chưa?")).toBe(true);
486
- });
487
- it("detects English status questions", () => {
488
- expect(isStatusCheckQuestion("are you done")).toBe(true);
489
- expect(isStatusCheckQuestion("did you finish")).toBe(true);
490
- expect(isStatusCheckQuestion("is it ready?")).toBe(true);
491
- expect(isStatusCheckQuestion("do you have the plan ready")).toBe(true);
492
- });
493
- it("does NOT fire on fresh task requests or trailing imperatives", () => {
494
- expect(isStatusCheckQuestion("lên plan fix cho tôi nhé")).toBe(false);
495
- // Trailing imperative — ends with the directive, not the interrogative.
496
- expect(isStatusCheckQuestion("đã có plan chưa, nếu chưa thì viết đi")).toBe(false);
497
- expect(isStatusCheckQuestion("explain how the router works")).toBe(false);
498
- expect(isStatusCheckQuestion("refactor this function")).toBe(false);
499
- });
500
- it("defers to actionable-tool intent (keeps the toolset)", () => {
501
- // "chạy lệnh … chưa" still carries an explicit run-command intent.
502
- expect(isStatusCheckQuestion("chạy lệnh test xong chưa")).toBe(false);
503
- });
504
- it("routes a status question to general/chitchat (skips GSD scaffold)", async () => {
505
- const result = await layer1Intent(makeCtx("bạn đã có plan chưa nhỉ"));
506
- expect(result.taskType).toBe("general");
507
- expect(result.intentKind).toBe("chitchat");
508
- expect(result._intentTrace?.pass1Reason).toBe("pass0:status-check");
509
- expect(mockedClassify).not.toHaveBeenCalled();
510
- });
511
- });
512
- describe("isSocialPleasantry — pure social phrases beyond the 2-word hot-path", () => {
513
- it("detects multi-word greetings / thanks / acks (EN + VI)", () => {
514
- // Live leak (session 40c726a31a37): "cảm ơn bạn rất nhiều nhé" (>10 chars,
515
- // 6 words) missed the ≤10-char/≤2-word chitchat gate → intentKind=null →
516
- // toolCount=37 (~15K wasted tool-schema tokens for a thank-you).
517
- for (const m of [
518
- "cảm ơn bạn rất nhiều nhé",
519
- "thank you so much",
520
- "thanks a lot",
521
- "ok great thanks",
522
- "hello there friend",
523
- "tạm biệt nhé",
524
- ]) {
525
- expect(isSocialPleasantry(m), m).toBe(true);
526
- }
527
- });
528
- it("returns false when ANY token carries task/tool content (never swallow work)", () => {
529
- for (const m of [
530
- "thanks now fix the auth bug",
531
- "ok but the build fails",
532
- "cảm ơn, giờ sửa file login.ts",
533
- "can you help me",
534
- "analyze data.csv",
535
- "fix it please",
536
- ]) {
537
- expect(isSocialPleasantry(m), m).toBe(false);
538
- }
539
- });
540
- it("requires at least one core social token (bare fillers / empty are not pleasantries)", () => {
541
- expect(isSocialPleasantry("the a for")).toBe(false);
542
- expect(isSocialPleasantry("")).toBe(false);
543
- });
544
- });
545
- describe("Pass 2.6 — social pleasantries route to chitchat (drop the tool-schema tax)", () => {
546
- it("classifies a multi-word thank-you as chitchat deterministically", async () => {
547
- mockedClassify.mockReturnValue({ tier: "hot", reason: "regex:short-message", confidence: 0.3 });
548
- const result = await layer1Intent(makeCtx("cảm ơn bạn rất nhiều nhé"));
549
- expect(result.intentKind).toBe("chitchat");
550
- expect(result.taskType).toBe("general");
551
- });
552
- it("does NOT route a thanks-then-task prompt to chitchat", async () => {
553
- mockedClassify.mockReturnValue({ tier: "abstain", reason: "regex:no-match", confidence: 0.1 });
554
- const result = await layer1Intent(makeCtx("thanks, now fix the bug in src/auth/login.ts"), {
555
- llmFallback: async () => ({
556
- taskType: "debug",
557
- outputStyle: null,
558
- confidence: 0.8,
559
- intentKind: "task",
560
- deliverableKind: "code",
561
- depthTier: "standard",
562
- ecosystemScope: null,
563
- replyLanguage: null,
564
- }),
565
- });
566
- expect(result.intentKind).toBe("task");
567
- });
568
- });
569
- describe("layer1Intent — model-first gate (MUONROI_LLM_FIRST_CLASSIFY)", () => {
570
- beforeEach(() => {
571
- mockedLlmFirst.mockReturnValue(true);
572
- // G3 (b1): brain fetch OFF by default so the classification tests don't
573
- // trigger pilContext; the brain-path tests flip it on explicitly.
574
- mockedLlmFirstBrain.mockReturnValue(false);
575
- mockedPilContext.mockReset();
576
- // Make the regex cascade obviously WRONG so passing tests prove the model won.
577
- mockedClassify.mockReturnValue({ tier: "hot", reason: "regex:create-file", confidence: 0.9 });
578
- });
579
- it("uses the model's verdict and never runs the regex classifier", async () => {
580
- const result = await layer1Intent(makeCtx("bạn thử call tool setup_guide xem được không"), {
581
- llmFallback: async () => ({
582
- taskType: "general",
583
- outputStyle: "concise",
584
- confidence: 0.9,
585
- intentKind: "task",
586
- deliverableKind: "answer",
587
- depthTier: null,
588
- ecosystemScope: null,
589
- replyLanguage: null,
590
- }),
591
- });
592
- expect(result.taskType).toBe("general"); // NOT the regex 'create-file' → generate
593
- expect(result.intentKind).toBe("task");
594
- expect(result.deliverableKind).toBe("answer"); // Phase 2b: model deliverable threads onto ctx
595
- expect(result._intentTrace?.pass1Reason).toBe("llm-first");
596
- expect(mockedClassify).not.toHaveBeenCalled();
597
- });
598
- it("G3 (b1): populates _brainData from pilContext on the model-first path (→ layer3 unified)", async () => {
599
- mockedLlmFirstBrain.mockReturnValue(true);
600
- // biome-ignore lint/suspicious/noExplicitAny: partial pil-context shape for the test
601
- mockedPilContext.mockResolvedValue({
602
- taskType: "general",
603
- intentKind: "task",
604
- outputStyle: "concise",
605
- confidence: 0.9,
606
- t0_principles: [{ text: "principle-1", score: 0.9 }],
607
- t1_rules: [{ text: "rule-1", score: 0.8 }],
608
- t2_patterns: [],
609
- retrieval_skipped_reason: null,
610
- });
611
- const result = await layer1Intent(makeCtx("explain the auth flow"), {
612
- llmFallback: async () => ({
613
- taskType: "general",
614
- outputStyle: "concise",
615
- confidence: 0.9,
616
- intentKind: "task",
617
- deliverableKind: "answer",
618
- depthTier: null,
619
- ecosystemScope: null,
620
- replyLanguage: null,
621
- }),
622
- });
623
- // _brainData now carries the unified brain → layer3 renders source="unified"
624
- // instead of its legacy dense-only /api/search round-trip.
625
- expect(result._brainData?.t0_principles).toHaveLength(1);
626
- expect(result._brainData?.t1_rules).toHaveLength(1);
627
- expect(result._intentTrace?.pass3UnifiedAttempted).toBe(true);
628
- expect(result._intentTrace?.pass3UnifiedSucceeded).toBe(true);
629
- expect(mockedPilContext).toHaveBeenCalledTimes(1);
630
- });
631
- it("G3 (b1): chitchat skips the brain fetch (no pilContext round-trip)", async () => {
632
- mockedLlmFirstBrain.mockReturnValue(true);
633
- const result = await layer1Intent(makeCtx("cảm ơn nhé"), {
634
- llmFallback: async () => ({
635
- taskType: "general",
636
- outputStyle: "concise",
637
- confidence: 0.9,
638
- intentKind: "chitchat",
639
- deliverableKind: "answer",
640
- depthTier: null,
641
- ecosystemScope: null,
642
- replyLanguage: null,
643
- }),
644
- });
645
- expect(result._brainData).toBeNull();
646
- expect(mockedPilContext).not.toHaveBeenCalled();
647
- });
648
- it("G3 (b1): a failed/empty pilContext leaves _brainData null (layer3 legacy path)", async () => {
649
- mockedLlmFirstBrain.mockReturnValue(true);
650
- mockedPilContext.mockResolvedValue(null);
651
- const result = await layer1Intent(makeCtx("explain the auth flow"), {
652
- llmFallback: async () => ({
653
- taskType: "general",
654
- outputStyle: "concise",
655
- confidence: 0.9,
656
- intentKind: "task",
657
- deliverableKind: "answer",
658
- depthTier: null,
659
- ecosystemScope: null,
660
- replyLanguage: null,
661
- }),
662
- });
663
- expect(result._brainData).toBeNull();
664
- expect(result.taskType).toBe("general"); // classification still intact
665
- expect(mockedPilContext).toHaveBeenCalledTimes(1);
666
- });
667
- it("marks chitchat from the model for a pure greeting", async () => {
668
- const result = await layer1Intent(makeCtx("cảm ơn bạn nhé"), {
669
- llmFallback: async () => ({
670
- taskType: "general",
671
- outputStyle: "concise",
672
- confidence: 0.9,
673
- intentKind: "chitchat",
674
- deliverableKind: "answer",
675
- depthTier: null,
676
- ecosystemScope: null,
677
- replyLanguage: null,
678
- }),
679
- });
680
- expect(result.intentKind).toBe("chitchat");
681
- });
682
- it("safety net: an actionable command never routes to chitchat even if the model says chat", async () => {
683
- const result = await layer1Intent(makeCtx("run the build: npm run build"), {
684
- llmFallback: async () => ({
685
- taskType: "general",
686
- outputStyle: "concise",
687
- confidence: 0.9,
688
- intentKind: "chitchat",
689
- deliverableKind: "answer",
690
- depthTier: null,
691
- ecosystemScope: null,
692
- replyLanguage: null,
693
- }),
694
- });
695
- expect(result.intentKind).toBe("task");
696
- });
697
- it("does NOT fall back to regex when the model returns null — fails loud, no wrong guess", async () => {
698
- mockedClassify.mockReturnValue({ tier: "hot", reason: "regex:debug", confidence: 0.85 });
699
- const result = await layer1Intent(makeCtx("fix the failing build"), {
700
- llmFallback: async () => null,
701
- });
702
- expect(mockedClassify).not.toHaveBeenCalled(); // regex cascade never runs
703
- expect(result.taskType).toBeNull(); // unknown, not a confidently-wrong regex guess
704
- expect(result.intentKind).toBe("task"); // keep-tools on failure
705
- expect(result._intentTrace?.pass1Reason).toBe("llm-first-failed");
706
- });
707
- it("does NOT fall back to regex when the model call throws — same fail-loud path", async () => {
708
- mockedClassify.mockReturnValue({ tier: "hot", reason: "regex:debug", confidence: 0.85 });
709
- const result = await layer1Intent(makeCtx("fix the failing build"), {
710
- llmFallback: async () => {
711
- throw new Error("rate limited");
712
- },
713
- });
714
- expect(mockedClassify).not.toHaveBeenCalled();
715
- expect(result.taskType).toBeNull();
716
- expect(result._intentTrace?.pass1Reason).toBe("llm-first-failed");
717
- });
718
- it("falls back to the cascade when the flag is OFF even with llmFallback wired", async () => {
719
- mockedLlmFirst.mockReturnValue(false);
720
- mockedClassify.mockReturnValue({ tier: "hot", reason: "regex:debug", confidence: 0.85 });
721
- const llm = vi.fn(async () => ({
722
- taskType: "general",
723
- outputStyle: null,
724
- confidence: 0.9,
725
- intentKind: "task",
726
- deliverableKind: null,
727
- depthTier: null,
728
- ecosystemScope: null,
729
- replyLanguage: null,
730
- }));
731
- const result = await layer1Intent(makeCtx("fix the failing build"), { llmFallback: llm });
732
- expect(llm).not.toHaveBeenCalled();
733
- expect(result.taskType).toBe("debug");
734
- });
735
- });
736
- describe("layer1Intent — WhoAmI v4.0 output-style baseline (opts.profileStyleBaseline)", () => {
737
- // A cheap regex task hit (high conf, unified PIL mocked off) skips the brain and
738
- // lands on the classifier-default branch — exactly where the profile baseline now
739
- // applies. The pipeline derives the baseline from the profile; layer1 just consumes
740
- // the option. The prompt carries no explicit style cue.
741
- const REFACTOR_PROMPT = "refactor the authentication module to use the new provider";
742
- it("uses the profile-derived style baseline when no per-turn signal resolves it", async () => {
743
- mockedClassify.mockReturnValue({ tier: "hot", reason: "regex:refactor", confidence: 0.9 });
744
- const result = await layer1Intent(makeCtx(REFACTOR_PROMPT), { profileStyleBaseline: "concise" });
745
- expect(result.taskType).toBe("refactor");
746
- expect(result.outputStyle).toBe("concise");
747
- expect(result._intentTrace?.styleSource).toBe("whoami-profile");
748
- });
749
- it("falls back to balanced when there is no profile baseline (behaviour unchanged)", async () => {
750
- mockedClassify.mockReturnValue({ tier: "hot", reason: "regex:refactor", confidence: 0.9 });
751
- const result = await layer1Intent(makeCtx(REFACTOR_PROMPT), { profileStyleBaseline: null });
752
- expect(result.outputStyle).toBe("balanced");
753
- expect(result._intentTrace?.styleSource).toBe("classifier-default");
754
- });
755
- it("an explicit per-turn style request still overrides the profile baseline", async () => {
756
- mockedClassify.mockReturnValue({ tier: "hot", reason: "regex:refactor", confidence: 0.9 });
757
- const result = await layer1Intent(makeCtx("refactor the auth module and explain step by step"), {
758
- profileStyleBaseline: "concise",
759
- });
760
- expect(result.outputStyle).toBe("detailed");
761
- expect(result._intentTrace?.styleSource).toBe("explicit-regex");
762
- });
763
- });
764
- //# sourceMappingURL=layer1-intent.test.js.map