agent-nuvira 3.3.1 → 3.3.4

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 (466) hide show
  1. package/README.md +18 -13
  2. package/dist/agent-sdk/src/agent.d.ts +2 -0
  3. package/dist/agent-sdk/src/agent.d.ts.map +1 -1
  4. package/dist/agent-sdk/src/define.d.ts +64 -0
  5. package/dist/agent-sdk/src/define.d.ts.map +1 -0
  6. package/dist/agent-sdk/src/define.js +76 -0
  7. package/dist/agent-sdk/src/define.js.map +1 -0
  8. package/dist/agent-sdk/src/index.d.ts +9 -0
  9. package/dist/agent-sdk/src/index.d.ts.map +1 -1
  10. package/dist/agent-sdk/src/index.js +9 -0
  11. package/dist/agent-sdk/src/index.js.map +1 -1
  12. package/dist/agent-sdk/src/scaffold.d.ts +11 -0
  13. package/dist/agent-sdk/src/scaffold.d.ts.map +1 -1
  14. package/dist/agent-sdk/src/scaffold.js +16 -6
  15. package/dist/agent-sdk/src/scaffold.js.map +1 -1
  16. package/dist/agents/agents/runner.d.ts +9 -0
  17. package/dist/agents/agents/runner.d.ts.map +1 -1
  18. package/dist/agents/agents/runner.js +34 -12
  19. package/dist/agents/agents/runner.js.map +1 -1
  20. package/dist/agents/agents/writer-tool-calling.d.ts.map +1 -1
  21. package/dist/agents/agents/writer-tool-calling.js +7 -2
  22. package/dist/agents/agents/writer-tool-calling.js.map +1 -1
  23. package/dist/agents/agents/writer.d.ts.map +1 -1
  24. package/dist/agents/agents/writer.js +7 -1
  25. package/dist/agents/agents/writer.js.map +1 -1
  26. package/dist/agents/artifact-verification.d.ts +102 -0
  27. package/dist/agents/artifact-verification.d.ts.map +1 -0
  28. package/dist/agents/artifact-verification.js +216 -0
  29. package/dist/agents/artifact-verification.js.map +1 -0
  30. package/dist/agents/checkpoint-store.d.ts +73 -0
  31. package/dist/agents/checkpoint-store.d.ts.map +1 -1
  32. package/dist/agents/checkpoint-store.js +161 -0
  33. package/dist/agents/checkpoint-store.js.map +1 -1
  34. package/dist/agents/credential-store.d.ts +120 -0
  35. package/dist/agents/credential-store.d.ts.map +1 -1
  36. package/dist/agents/credential-store.js +358 -19
  37. package/dist/agents/credential-store.js.map +1 -1
  38. package/dist/agents/long-form-plan.d.ts.map +1 -1
  39. package/dist/agents/long-form-plan.js +2 -1
  40. package/dist/agents/long-form-plan.js.map +1 -1
  41. package/dist/agents/orchestrator.d.ts +10 -1
  42. package/dist/agents/orchestrator.d.ts.map +1 -1
  43. package/dist/agents/orchestrator.js +239 -79
  44. package/dist/agents/orchestrator.js.map +1 -1
  45. package/dist/agents/phase-engine.d.ts +61 -0
  46. package/dist/agents/phase-engine.d.ts.map +1 -1
  47. package/dist/agents/phase-engine.js +68 -2
  48. package/dist/agents/phase-engine.js.map +1 -1
  49. package/dist/agents/prompt-assembly.d.ts +11 -0
  50. package/dist/agents/prompt-assembly.d.ts.map +1 -1
  51. package/dist/agents/prompt-assembly.js +17 -0
  52. package/dist/agents/prompt-assembly.js.map +1 -1
  53. package/dist/agents/release-preflight.d.ts +121 -0
  54. package/dist/agents/release-preflight.d.ts.map +1 -0
  55. package/dist/agents/release-preflight.js +259 -0
  56. package/dist/agents/release-preflight.js.map +1 -0
  57. package/dist/agents/release-runner.d.ts +157 -0
  58. package/dist/agents/release-runner.d.ts.map +1 -0
  59. package/dist/agents/release-runner.js +719 -0
  60. package/dist/agents/release-runner.js.map +1 -0
  61. package/dist/agents/step-handoff.d.ts +190 -0
  62. package/dist/agents/step-handoff.d.ts.map +1 -0
  63. package/dist/agents/step-handoff.js +443 -0
  64. package/dist/agents/step-handoff.js.map +1 -0
  65. package/dist/cli/agent.d.ts +2 -2
  66. package/dist/cli/agent.js +10 -10
  67. package/dist/cli/benchmark.d.ts.map +1 -1
  68. package/dist/cli/benchmark.js +11 -4
  69. package/dist/cli/benchmark.js.map +1 -1
  70. package/dist/cli/chat.d.ts +94 -0
  71. package/dist/cli/chat.d.ts.map +1 -1
  72. package/dist/cli/chat.js +379 -24
  73. package/dist/cli/chat.js.map +1 -1
  74. package/dist/cli/cli-program.d.ts.map +1 -1
  75. package/dist/cli/cli-program.js +8 -0
  76. package/dist/cli/cli-program.js.map +1 -1
  77. package/dist/cli/config.d.ts.map +1 -1
  78. package/dist/cli/config.js +9 -1
  79. package/dist/cli/config.js.map +1 -1
  80. package/dist/cli/credentials.d.ts +28 -0
  81. package/dist/cli/credentials.d.ts.map +1 -0
  82. package/dist/cli/credentials.js +213 -0
  83. package/dist/cli/credentials.js.map +1 -0
  84. package/dist/cli/doctor.d.ts.map +1 -1
  85. package/dist/cli/doctor.js +3 -2
  86. package/dist/cli/doctor.js.map +1 -1
  87. package/dist/cli/edit.js +2 -2
  88. package/dist/cli/eval.d.ts +17 -0
  89. package/dist/cli/eval.d.ts.map +1 -1
  90. package/dist/cli/eval.js +105 -2
  91. package/dist/cli/eval.js.map +1 -1
  92. package/dist/cli/execute.d.ts +16 -1
  93. package/dist/cli/execute.d.ts.map +1 -1
  94. package/dist/cli/execute.js +192 -22
  95. package/dist/cli/execute.js.map +1 -1
  96. package/dist/cli/failover-runner.d.ts.map +1 -1
  97. package/dist/cli/failover-runner.js +9 -3
  98. package/dist/cli/failover-runner.js.map +1 -1
  99. package/dist/cli/loop-executor.d.ts +55 -0
  100. package/dist/cli/loop-executor.d.ts.map +1 -1
  101. package/dist/cli/loop-executor.js +285 -19
  102. package/dist/cli/loop-executor.js.map +1 -1
  103. package/dist/cli/model.d.ts.map +1 -1
  104. package/dist/cli/model.js +9 -8
  105. package/dist/cli/model.js.map +1 -1
  106. package/dist/cli/models.d.ts +1 -1
  107. package/dist/cli/models.js +4 -4
  108. package/dist/cli/nlu.d.ts.map +1 -1
  109. package/dist/cli/nlu.js +8 -2
  110. package/dist/cli/nlu.js.map +1 -1
  111. package/dist/cli/parity.d.ts +85 -0
  112. package/dist/cli/parity.d.ts.map +1 -0
  113. package/dist/cli/parity.js +506 -0
  114. package/dist/cli/parity.js.map +1 -0
  115. package/dist/cli/plan.d.ts.map +1 -1
  116. package/dist/cli/plan.js +2 -1
  117. package/dist/cli/plan.js.map +1 -1
  118. package/dist/cli/publish.d.ts +22 -0
  119. package/dist/cli/publish.d.ts.map +1 -1
  120. package/dist/cli/publish.js +109 -13
  121. package/dist/cli/publish.js.map +1 -1
  122. package/dist/cli/retrieval.d.ts.map +1 -1
  123. package/dist/cli/retrieval.js +5 -4
  124. package/dist/cli/retrieval.js.map +1 -1
  125. package/dist/cli/sdk.js +4 -4
  126. package/dist/cli/sdk.js.map +1 -1
  127. package/dist/cli/trace.d.ts.map +1 -1
  128. package/dist/cli/trace.js +2 -1
  129. package/dist/cli/trace.js.map +1 -1
  130. package/dist/cli/workflow.js +2 -2
  131. package/dist/cli/workflow.js.map +1 -1
  132. package/dist/config/live-credentials.d.ts +57 -0
  133. package/dist/config/live-credentials.d.ts.map +1 -0
  134. package/dist/config/live-credentials.js +126 -0
  135. package/dist/config/live-credentials.js.map +1 -0
  136. package/dist/config/paths.d.ts +18 -0
  137. package/dist/config/paths.d.ts.map +1 -1
  138. package/dist/config/paths.js +25 -0
  139. package/dist/config/paths.js.map +1 -1
  140. package/dist/config/types.d.ts +44 -0
  141. package/dist/config/types.d.ts.map +1 -1
  142. package/dist/federation/a2a-types.js +1 -1
  143. package/dist/federation/a2a-types.js.map +1 -1
  144. package/dist/findings/verdicts.d.ts +241 -0
  145. package/dist/findings/verdicts.d.ts.map +1 -0
  146. package/dist/findings/verdicts.js +284 -0
  147. package/dist/findings/verdicts.js.map +1 -0
  148. package/dist/gateway/adapters.d.ts +65 -0
  149. package/dist/gateway/adapters.d.ts.map +1 -1
  150. package/dist/gateway/adapters.js +216 -10
  151. package/dist/gateway/adapters.js.map +1 -1
  152. package/dist/gateway/channel-directory.d.ts +31 -0
  153. package/dist/gateway/channel-directory.d.ts.map +1 -1
  154. package/dist/gateway/channel-directory.js +40 -0
  155. package/dist/gateway/channel-directory.js.map +1 -1
  156. package/dist/gateway/gateway-log.d.ts +1 -1
  157. package/dist/gateway/gateway-log.d.ts.map +1 -1
  158. package/dist/gateway/gateway-log.js.map +1 -1
  159. package/dist/gateway/hooks.d.ts +87 -19
  160. package/dist/gateway/hooks.d.ts.map +1 -1
  161. package/dist/gateway/hooks.js +62 -23
  162. package/dist/gateway/hooks.js.map +1 -1
  163. package/dist/gateway/inbound-media.d.ts +147 -0
  164. package/dist/gateway/inbound-media.d.ts.map +1 -0
  165. package/dist/gateway/inbound-media.js +317 -0
  166. package/dist/gateway/inbound-media.js.map +1 -0
  167. package/dist/gateway/inbox.d.ts +8 -1
  168. package/dist/gateway/inbox.d.ts.map +1 -1
  169. package/dist/gateway/inbox.js.map +1 -1
  170. package/dist/gateway/platform-config.d.ts +14 -0
  171. package/dist/gateway/platform-config.d.ts.map +1 -1
  172. package/dist/gateway/platform-config.js +26 -8
  173. package/dist/gateway/platform-config.js.map +1 -1
  174. package/dist/gateway/realtime.d.ts +114 -0
  175. package/dist/gateway/realtime.d.ts.map +1 -0
  176. package/dist/gateway/realtime.js +402 -0
  177. package/dist/gateway/realtime.js.map +1 -0
  178. package/dist/gateway/registry.d.ts +31 -0
  179. package/dist/gateway/registry.d.ts.map +1 -1
  180. package/dist/gateway/registry.js +224 -4
  181. package/dist/gateway/registry.js.map +1 -1
  182. package/dist/gateway/whatsapp/baileys-bridge.d.ts +11 -1
  183. package/dist/gateway/whatsapp/baileys-bridge.d.ts.map +1 -1
  184. package/dist/gateway/whatsapp/baileys-bridge.js +123 -4
  185. package/dist/gateway/whatsapp/baileys-bridge.js.map +1 -1
  186. package/dist/gateway/whatsapp/bridge.d.ts +6 -2
  187. package/dist/gateway/whatsapp/bridge.d.ts.map +1 -1
  188. package/dist/gateway/whatsapp/bridge.js.map +1 -1
  189. package/dist/index.js +8 -0
  190. package/dist/index.js.map +1 -1
  191. package/dist/inference/factory.d.ts +14 -0
  192. package/dist/inference/factory.d.ts.map +1 -1
  193. package/dist/inference/factory.js +17 -0
  194. package/dist/inference/factory.js.map +1 -1
  195. package/dist/inference/groq-adapter.d.ts +2 -0
  196. package/dist/inference/groq-adapter.d.ts.map +1 -1
  197. package/dist/inference/groq-adapter.js +16 -6
  198. package/dist/inference/groq-adapter.js.map +1 -1
  199. package/dist/inference/model-validator.d.ts +6 -1
  200. package/dist/inference/model-validator.d.ts.map +1 -1
  201. package/dist/inference/model-validator.js +7 -2
  202. package/dist/inference/model-validator.js.map +1 -1
  203. package/dist/inference/route-resolver.d.ts +116 -0
  204. package/dist/inference/route-resolver.d.ts.map +1 -0
  205. package/dist/inference/route-resolver.js +159 -0
  206. package/dist/inference/route-resolver.js.map +1 -0
  207. package/dist/inference/tools.d.ts.map +1 -1
  208. package/dist/inference/tools.js +29 -0
  209. package/dist/inference/tools.js.map +1 -1
  210. package/dist/learning/autonomy-policy.d.ts +18 -0
  211. package/dist/learning/autonomy-policy.d.ts.map +1 -1
  212. package/dist/learning/autonomy-policy.js +35 -0
  213. package/dist/learning/autonomy-policy.js.map +1 -1
  214. package/dist/learning/benchmark.d.ts.map +1 -1
  215. package/dist/learning/benchmark.js +3 -2
  216. package/dist/learning/benchmark.js.map +1 -1
  217. package/dist/learning/continuation.d.ts.map +1 -1
  218. package/dist/learning/continuation.js +2 -1
  219. package/dist/learning/continuation.js.map +1 -1
  220. package/dist/learning/cost-tracker.d.ts.map +1 -1
  221. package/dist/learning/cost-tracker.js +2 -1
  222. package/dist/learning/cost-tracker.js.map +1 -1
  223. package/dist/learning/deferred-task.d.ts.map +1 -1
  224. package/dist/learning/deferred-task.js +13 -4
  225. package/dist/learning/deferred-task.js.map +1 -1
  226. package/dist/learning/eval-framework.d.ts.map +1 -1
  227. package/dist/learning/eval-framework.js +2 -1
  228. package/dist/learning/eval-framework.js.map +1 -1
  229. package/dist/learning/long-form.d.ts.map +1 -1
  230. package/dist/learning/long-form.js +2 -1
  231. package/dist/learning/long-form.js.map +1 -1
  232. package/dist/learning/model-registry.d.ts.map +1 -1
  233. package/dist/learning/model-registry.js +2 -1
  234. package/dist/learning/model-registry.js.map +1 -1
  235. package/dist/learning/reasoning-cache.d.ts.map +1 -1
  236. package/dist/learning/reasoning-cache.js +2 -1
  237. package/dist/learning/reasoning-cache.js.map +1 -1
  238. package/dist/learning/reasoning-trace.d.ts +38 -2
  239. package/dist/learning/reasoning-trace.d.ts.map +1 -1
  240. package/dist/learning/reasoning-trace.js +91 -1
  241. package/dist/learning/reasoning-trace.js.map +1 -1
  242. package/dist/learning/resilient-call.d.ts.map +1 -1
  243. package/dist/learning/resilient-call.js +31 -18
  244. package/dist/learning/resilient-call.js.map +1 -1
  245. package/dist/learning/retrieval.d.ts.map +1 -1
  246. package/dist/learning/retrieval.js +2 -1
  247. package/dist/learning/retrieval.js.map +1 -1
  248. package/dist/learning/seeded-benchmark.d.ts +160 -0
  249. package/dist/learning/seeded-benchmark.d.ts.map +1 -0
  250. package/dist/learning/seeded-benchmark.js +321 -0
  251. package/dist/learning/seeded-benchmark.js.map +1 -0
  252. package/dist/learning/seeded-bugs.d.ts +142 -0
  253. package/dist/learning/seeded-bugs.d.ts.map +1 -0
  254. package/dist/learning/seeded-bugs.js +535 -0
  255. package/dist/learning/seeded-bugs.js.map +1 -0
  256. package/dist/learning/skill-store.d.ts.map +1 -1
  257. package/dist/learning/skill-store.js +30 -9
  258. package/dist/learning/skill-store.js.map +1 -1
  259. package/dist/learning/step-checkpoint.d.ts +127 -0
  260. package/dist/learning/step-checkpoint.d.ts.map +1 -0
  261. package/dist/learning/step-checkpoint.js +244 -0
  262. package/dist/learning/step-checkpoint.js.map +1 -0
  263. package/dist/mcp/catalog.js +2 -3
  264. package/dist/mcp/catalog.js.map +1 -1
  265. package/dist/mcp/manager.d.ts.map +1 -1
  266. package/dist/mcp/manager.js +5 -3
  267. package/dist/mcp/manager.js.map +1 -1
  268. package/dist/nlu/intent-confirm.d.ts +23 -1
  269. package/dist/nlu/intent-confirm.d.ts.map +1 -1
  270. package/dist/nlu/intent-confirm.js +85 -2
  271. package/dist/nlu/intent-confirm.js.map +1 -1
  272. package/dist/nlu/learnings.d.ts +7 -0
  273. package/dist/nlu/learnings.d.ts.map +1 -1
  274. package/dist/nlu/learnings.js +7 -0
  275. package/dist/nlu/learnings.js.map +1 -1
  276. package/dist/observability/debug-log.d.ts +250 -0
  277. package/dist/observability/debug-log.d.ts.map +1 -0
  278. package/dist/observability/debug-log.js +500 -0
  279. package/dist/observability/debug-log.js.map +1 -0
  280. package/dist/observability/event-bus.d.ts.map +1 -1
  281. package/dist/observability/event-bus.js +4 -1
  282. package/dist/observability/event-bus.js.map +1 -1
  283. package/dist/observability/otel.d.ts +278 -0
  284. package/dist/observability/otel.d.ts.map +1 -0
  285. package/dist/observability/otel.js +590 -0
  286. package/dist/observability/otel.js.map +1 -0
  287. package/dist/parity/drivers.d.ts +99 -0
  288. package/dist/parity/drivers.d.ts.map +1 -0
  289. package/dist/parity/drivers.js +1362 -0
  290. package/dist/parity/drivers.js.map +1 -0
  291. package/dist/parity/graph.d.ts +73 -0
  292. package/dist/parity/graph.d.ts.map +1 -0
  293. package/dist/parity/graph.js +162 -0
  294. package/dist/parity/graph.js.map +1 -0
  295. package/dist/parity/matrix.d.ts +105 -0
  296. package/dist/parity/matrix.d.ts.map +1 -0
  297. package/dist/parity/matrix.js +352 -0
  298. package/dist/parity/matrix.js.map +1 -0
  299. package/dist/parity/observation.d.ts +444 -0
  300. package/dist/parity/observation.d.ts.map +1 -0
  301. package/dist/parity/observation.js +333 -0
  302. package/dist/parity/observation.js.map +1 -0
  303. package/dist/parity/scenarios.d.ts +229 -0
  304. package/dist/parity/scenarios.d.ts.map +1 -0
  305. package/dist/parity/scenarios.js +175 -0
  306. package/dist/parity/scenarios.js.map +1 -0
  307. package/dist/parity/surfaces.d.ts +122 -0
  308. package/dist/parity/surfaces.d.ts.map +1 -0
  309. package/dist/parity/surfaces.js +190 -0
  310. package/dist/parity/surfaces.js.map +1 -0
  311. package/dist/runtime/fault-injection.d.ts +173 -0
  312. package/dist/runtime/fault-injection.d.ts.map +1 -0
  313. package/dist/runtime/fault-injection.js +281 -0
  314. package/dist/runtime/fault-injection.js.map +1 -0
  315. package/dist/skills/secret-capture.d.ts.map +1 -1
  316. package/dist/skills/secret-capture.js +9 -4
  317. package/dist/skills/secret-capture.js.map +1 -1
  318. package/dist/tools/child-agent-entry.d.ts +23 -0
  319. package/dist/tools/child-agent-entry.d.ts.map +1 -0
  320. package/dist/tools/child-agent-entry.js +129 -0
  321. package/dist/tools/child-agent-entry.js.map +1 -0
  322. package/dist/tools/child-agent-runtime.d.ts +124 -0
  323. package/dist/tools/child-agent-runtime.d.ts.map +1 -0
  324. package/dist/tools/child-agent-runtime.js +704 -0
  325. package/dist/tools/child-agent-runtime.js.map +1 -0
  326. package/dist/tools/coding-tools.d.ts.map +1 -1
  327. package/dist/tools/coding-tools.js +82 -10
  328. package/dist/tools/coding-tools.js.map +1 -1
  329. package/dist/tools/credentials-tool.d.ts +24 -0
  330. package/dist/tools/credentials-tool.d.ts.map +1 -0
  331. package/dist/tools/credentials-tool.js +125 -0
  332. package/dist/tools/credentials-tool.js.map +1 -0
  333. package/dist/tools/delegation-system.d.ts +31 -0
  334. package/dist/tools/delegation-system.d.ts.map +1 -1
  335. package/dist/tools/delegation-system.js +70 -9
  336. package/dist/tools/delegation-system.js.map +1 -1
  337. package/dist/tools/extract/docx.d.ts +27 -0
  338. package/dist/tools/extract/docx.d.ts.map +1 -0
  339. package/dist/tools/extract/docx.js +48 -0
  340. package/dist/tools/extract/docx.js.map +1 -0
  341. package/dist/tools/extract/html-text.d.ts +27 -0
  342. package/dist/tools/extract/html-text.d.ts.map +1 -0
  343. package/dist/tools/extract/html-text.js +86 -0
  344. package/dist/tools/extract/html-text.js.map +1 -0
  345. package/dist/tools/extract/pdf-ocr.d.ts +58 -0
  346. package/dist/tools/extract/pdf-ocr.d.ts.map +1 -0
  347. package/dist/tools/extract/pdf-ocr.js +116 -0
  348. package/dist/tools/extract/pdf-ocr.js.map +1 -0
  349. package/dist/tools/extract/pdf.d.ts +65 -0
  350. package/dist/tools/extract/pdf.d.ts.map +1 -0
  351. package/dist/tools/extract/pdf.js +197 -0
  352. package/dist/tools/extract/pdf.js.map +1 -0
  353. package/dist/tools/extract/pptx.d.ts +32 -0
  354. package/dist/tools/extract/pptx.d.ts.map +1 -0
  355. package/dist/tools/extract/pptx.js +77 -0
  356. package/dist/tools/extract/pptx.js.map +1 -0
  357. package/dist/tools/extract/xlsx.d.ts +47 -0
  358. package/dist/tools/extract/xlsx.d.ts.map +1 -0
  359. package/dist/tools/extract/xlsx.js +111 -0
  360. package/dist/tools/extract/xlsx.js.map +1 -0
  361. package/dist/tools/finding-tool.d.ts +76 -0
  362. package/dist/tools/finding-tool.d.ts.map +1 -0
  363. package/dist/tools/finding-tool.js +125 -0
  364. package/dist/tools/finding-tool.js.map +1 -0
  365. package/dist/tools/git-tool.d.ts +25 -7
  366. package/dist/tools/git-tool.d.ts.map +1 -1
  367. package/dist/tools/git-tool.js +155 -15
  368. package/dist/tools/git-tool.js.map +1 -1
  369. package/dist/tools/loop-project-context.d.ts.map +1 -1
  370. package/dist/tools/loop-project-context.js +16 -0
  371. package/dist/tools/loop-project-context.js.map +1 -1
  372. package/dist/tools/loop-route-feed.d.ts +57 -0
  373. package/dist/tools/loop-route-feed.d.ts.map +1 -0
  374. package/dist/tools/loop-route-feed.js +101 -0
  375. package/dist/tools/loop-route-feed.js.map +1 -0
  376. package/dist/tools/messaging-tools.d.ts +41 -11
  377. package/dist/tools/messaging-tools.d.ts.map +1 -1
  378. package/dist/tools/messaging-tools.js +104 -55
  379. package/dist/tools/messaging-tools.js.map +1 -1
  380. package/dist/tools/neutts-synth.d.ts +27 -3
  381. package/dist/tools/neutts-synth.d.ts.map +1 -1
  382. package/dist/tools/neutts-synth.js +57 -13
  383. package/dist/tools/neutts-synth.js.map +1 -1
  384. package/dist/tools/pipeline-tool.d.ts +43 -1
  385. package/dist/tools/pipeline-tool.d.ts.map +1 -1
  386. package/dist/tools/pipeline-tool.js +21 -4
  387. package/dist/tools/pipeline-tool.js.map +1 -1
  388. package/dist/tools/publish-tool.d.ts.map +1 -1
  389. package/dist/tools/publish-tool.js +76 -10
  390. package/dist/tools/publish-tool.js.map +1 -1
  391. package/dist/tools/read-extract.d.ts +116 -45
  392. package/dist/tools/read-extract.d.ts.map +1 -1
  393. package/dist/tools/read-extract.js +494 -158
  394. package/dist/tools/read-extract.js.map +1 -1
  395. package/dist/tools/registry.d.ts +23 -3
  396. package/dist/tools/registry.d.ts.map +1 -1
  397. package/dist/tools/registry.js +196 -29
  398. package/dist/tools/registry.js.map +1 -1
  399. package/dist/tools/run-terminal.d.ts +9 -0
  400. package/dist/tools/run-terminal.d.ts.map +1 -1
  401. package/dist/tools/run-terminal.js +80 -2
  402. package/dist/tools/run-terminal.js.map +1 -1
  403. package/dist/tools/subagent-refusal.d.ts +15 -0
  404. package/dist/tools/subagent-refusal.d.ts.map +1 -0
  405. package/dist/tools/subagent-refusal.js +18 -0
  406. package/dist/tools/subagent-refusal.js.map +1 -0
  407. package/dist/tools/subagent-spawner.d.ts +122 -0
  408. package/dist/tools/subagent-spawner.d.ts.map +1 -1
  409. package/dist/tools/subagent-spawner.js +249 -28
  410. package/dist/tools/subagent-spawner.js.map +1 -1
  411. package/dist/tools/tool-hooks.d.ts +177 -0
  412. package/dist/tools/tool-hooks.d.ts.map +1 -0
  413. package/dist/tools/tool-hooks.js +427 -0
  414. package/dist/tools/tool-hooks.js.map +1 -0
  415. package/dist/tools/tool-loop.d.ts +94 -5
  416. package/dist/tools/tool-loop.d.ts.map +1 -1
  417. package/dist/tools/tool-loop.js +315 -9
  418. package/dist/tools/tool-loop.js.map +1 -1
  419. package/dist/tools/tool-refusal.d.ts +68 -0
  420. package/dist/tools/tool-refusal.d.ts.map +1 -0
  421. package/dist/tools/tool-refusal.js +78 -0
  422. package/dist/tools/tool-refusal.js.map +1 -0
  423. package/dist/tools/toolsets.d.ts +8 -0
  424. package/dist/tools/toolsets.d.ts.map +1 -1
  425. package/dist/tools/toolsets.js +14 -4
  426. package/dist/tools/toolsets.js.map +1 -1
  427. package/dist/tools/vision-tools.d.ts +88 -83
  428. package/dist/tools/vision-tools.d.ts.map +1 -1
  429. package/dist/tools/vision-tools.js +134 -103
  430. package/dist/tools/vision-tools.js.map +1 -1
  431. package/dist/tools/worktree.d.ts +210 -0
  432. package/dist/tools/worktree.d.ts.map +1 -0
  433. package/dist/tools/worktree.js +374 -0
  434. package/dist/tools/worktree.js.map +1 -0
  435. package/dist/utils/format.d.ts +3 -0
  436. package/dist/utils/format.d.ts.map +1 -0
  437. package/dist/utils/format.js +32 -0
  438. package/dist/utils/format.js.map +1 -0
  439. package/dist/web-dashboard/attachment-extract.d.ts +64 -0
  440. package/dist/web-dashboard/attachment-extract.d.ts.map +1 -0
  441. package/dist/web-dashboard/attachment-extract.js +154 -0
  442. package/dist/web-dashboard/attachment-extract.js.map +1 -0
  443. package/dist/web-dashboard/chat-console.d.ts +108 -1
  444. package/dist/web-dashboard/chat-console.d.ts.map +1 -1
  445. package/dist/web-dashboard/chat-console.js +36 -0
  446. package/dist/web-dashboard/chat-console.js.map +1 -1
  447. package/dist/web-dashboard/hub-data.d.ts +37 -0
  448. package/dist/web-dashboard/hub-data.d.ts.map +1 -1
  449. package/dist/web-dashboard/hub-data.js +61 -1
  450. package/dist/web-dashboard/hub-data.js.map +1 -1
  451. package/dist/web-dashboard/server.d.ts +14 -0
  452. package/dist/web-dashboard/server.d.ts.map +1 -1
  453. package/dist/web-dashboard/server.js +247 -13
  454. package/dist/web-dashboard/server.js.map +1 -1
  455. package/dist/web-dashboard/src/types.d.ts +196 -48
  456. package/dist/web-dashboard/src/types.d.ts.map +1 -1
  457. package/dist/workflow/registry.js +1 -1
  458. package/dist/workflow/registry.js.map +1 -1
  459. package/package.json +22 -6
  460. package/src/web-dashboard/public/assets/{index-Cyd6tIew.css → index-XJjj2cBX.css} +1 -1
  461. package/src/web-dashboard/public/assets/index-YWF9FpwQ.js +207 -0
  462. package/src/web-dashboard/public/assets/index-YWF9FpwQ.js.map +1 -0
  463. package/src/web-dashboard/public/index.html +2 -2
  464. package/dist/tools/child-agent-worker.js +0 -212
  465. package/src/web-dashboard/public/assets/index-CjvoBhlz.js +0 -207
  466. package/src/web-dashboard/public/assets/index-CjvoBhlz.js.map +0 -1
@@ -0,0 +1,535 @@
1
+ /**
2
+ * WS7 (#29) — the seeded-bug benchmark.
3
+ *
4
+ * WHY THIS IS TEST INFRASTRUCTURE AND NOT A MATRIX ROW. `src/parity/matrix.ts`
5
+ * says it in one line: the seeded-bug benchmark is not a capability a surface can
6
+ * have, so it has no cells and no parity verdict of its own. What it has is a job —
7
+ * measure whether the agent can FIND and FIX a defect it was not told about, which
8
+ * is the thing a coding agent is for and the thing the M2b suite could only
9
+ * approximate: M2b tasks are written by hand and graded by hidden tests, but
10
+ * nothing proves the task was BROKEN before the agent ran, so a task that already
11
+ * passed measured nothing.
12
+ *
13
+ * THE PROPERTY THAT MAKES THIS A BENCHMARK RATHER THAN A TASK LIST. Every seeded
14
+ * bug is declared TWICE — the broken workspace the agent receives, and the same
15
+ * workspace after a reference fix — and `verifySeededBug` runs the checks against
16
+ * both. The checks must FAIL on the seed (and say so in their own words) and PASS
17
+ * after the fix. A seed that already passes its checks, or a check that cannot
18
+ * pass even when fixed, fails verification and is NOT scored: `runSeededSuite`
19
+ * verifies every task before it runs a single model call. `nuvira eval
20
+ * verify-seeds` exposes the same verification directly, so the ratchet is
21
+ * runnable from a terminal and in CI without a provider.
22
+ *
23
+ * WHAT 'FAILING' HAS TO MEAN. A check that exits non-zero because it crashed —
24
+ * a syntax error, a missing module — would satisfy a naive verification while
25
+ * proving nothing about the bug. So a seed counts as genuinely broken only when
26
+ * its check exits non-zero AND prints the failure marker its own assertions
27
+ * print (`FAIL`). Combined with "the same check passes once the fix is applied",
28
+ * that pins both ends: the check is well-formed, and it is the DEFECT that makes
29
+ * it fail.
30
+ *
31
+ * PLAIN NODE, ON PURPOSE. Every seed is a CommonJS `.js` file with a `.js` test
32
+ * script and no dependencies, so verification is deterministic, offline, and
33
+ * needs nothing but the `node` already running the suite. (A future Python seed
34
+ * would have to be gated on an interpreter actually being present rather than
35
+ * assumed — the honest version of "we also test Python".)
36
+ *
37
+ * Deliberately NOT measured here: collateral damage to files the fix should not
38
+ * touch is scored from a diff of the workspace against the seed
39
+ * (`src/learning/seeded-benchmark.ts`), not from reference patterns, because
40
+ * "this file still contains line X" is a weaker claim than "this file is
41
+ * unchanged" and the benchmark should not make the weak one.
42
+ */
43
+ import { execSync } from 'node:child_process';
44
+ import { mkdirSync, mkdtempSync, readFileSync, rmSync, writeFileSync } from 'node:fs';
45
+ import { tmpdir } from 'node:os';
46
+ import { join } from 'node:path';
47
+ /** The exact request every seeded task makes — uniform, so the score compares competence. */
48
+ export function seededGoal(bug) {
49
+ const commands = bug.checks.map((c) => `\`${c.command}\``).join(' and ');
50
+ return (`${commands} fails in this project. Diagnose the defect in the source and fix it so the ` +
51
+ `check passes. Do not modify the check file, and do not change any file that is not ` +
52
+ `responsible for the failure.`);
53
+ }
54
+ const RANGE_TEST = `const assert = require('node:assert');
55
+ const { range } = require('../src/range.js');
56
+ try {
57
+ assert.deepStrictEqual(range(3), [0, 1, 2]);
58
+ assert.deepStrictEqual(range(0), []);
59
+ console.log('ok');
60
+ } catch (err) {
61
+ console.error('FAIL: ' + err.message);
62
+ process.exit(1);
63
+ }
64
+ `;
65
+ const TOP_SCORES_TEST = `const assert = require('node:assert');
66
+ const { topScores } = require('../src/top-scores.js');
67
+ try {
68
+ assert.deepStrictEqual(topScores([10, 9, 100], 2), [100, 10]);
69
+ assert.deepStrictEqual(topScores([5, 5, 1], 2), [5, 5]);
70
+ console.log('ok');
71
+ } catch (err) {
72
+ console.error('FAIL: ' + err.message);
73
+ process.exit(1);
74
+ }
75
+ `;
76
+ const SUM_ASYNC_TEST = `const assert = require('node:assert');
77
+ const { sumAsync } = require('../src/sum-async.js');
78
+ (async () => {
79
+ try {
80
+ assert.strictEqual(await sumAsync([1, 2, 3]), 6);
81
+ assert.strictEqual(await sumAsync([]), 0);
82
+ console.log('ok');
83
+ } catch (err) {
84
+ console.error('FAIL: ' + err.message);
85
+ process.exit(1);
86
+ }
87
+ })();
88
+ `;
89
+ const FORMAT_AMOUNT_TEST = `const assert = require('node:assert');
90
+ const { formatAmount } = require('../src/format-amount.js');
91
+ try {
92
+ assert.strictEqual(formatAmount(12.5), '$12.50');
93
+ assert.strictEqual(formatAmount(0), '$0.00');
94
+ assert.strictEqual(formatAmount(null), '—');
95
+ console.log('ok');
96
+ } catch (err) {
97
+ console.error('FAIL: ' + err.message);
98
+ process.exit(1);
99
+ }
100
+ `;
101
+ const CLONE_CONFIG_TEST = `const assert = require('node:assert');
102
+ const { cloneConfig } = require('../src/clone-config.js');
103
+ try {
104
+ const original = { name: 'svc', limits: { max: 10 } };
105
+ const copy = cloneConfig(original);
106
+ copy.limits.max = 99;
107
+ assert.strictEqual(original.limits.max, 10, 'the original object was mutated through the copy');
108
+ assert.strictEqual(copy.name, 'svc');
109
+ console.log('ok');
110
+ } catch (err) {
111
+ console.error('FAIL: ' + err.message);
112
+ process.exit(1);
113
+ }
114
+ `;
115
+ const ADD_TAG_TEST = `const assert = require('node:assert');
116
+ const { addTag } = require('../src/add-tag.js');
117
+ try {
118
+ const tags = ['a'];
119
+ const next = addTag(tags, 'b');
120
+ assert.deepStrictEqual(next, ['a', 'b']);
121
+ assert.deepStrictEqual(tags, ['a'], 'addTag mutated the caller array');
122
+ console.log('ok');
123
+ } catch (err) {
124
+ console.error('FAIL: ' + err.message);
125
+ process.exit(1);
126
+ }
127
+ `;
128
+ const AVERAGE_TEST = `const assert = require('node:assert');
129
+ const { averageOf } = require('../src/average-of.js');
130
+ try {
131
+ assert.strictEqual(averageOf([10, null, 20]), 15);
132
+ assert.strictEqual(averageOf([null]), 0);
133
+ console.log('ok');
134
+ } catch (err) {
135
+ console.error('FAIL: ' + err.message);
136
+ process.exit(1);
137
+ }
138
+ `;
139
+ /**
140
+ * The suite.
141
+ *
142
+ * Each entry is a real defect with a real fix, small enough that a strong model
143
+ * can find it from the failing check and that the reference fix is unambiguous.
144
+ * The axes are the ones that actually bite in production code: an inclusive bound,
145
+ * a comparator that was never given, an async callback in a synchronous-looking
146
+ * call, a falsy guard that eats a legitimate zero, a copy that is only one level
147
+ * deep, a helper that mutates its caller's data, and a denominator that was not
148
+ * updated with the filter beside it.
149
+ */
150
+ export const SEEDED_BUGS = [
151
+ {
152
+ id: 'seed-range-off-by-one',
153
+ title: 'Range helper returns one element too many',
154
+ axis: 'boundary',
155
+ difficulty: 'easy',
156
+ bug: '`for (let i = 0; i <= n; i += 1)` makes `range(n)` produce n+1 elements; the bound must be exclusive.',
157
+ files: [
158
+ {
159
+ path: 'src/range.js',
160
+ content: `function range(n) {
161
+ const out = [];
162
+ for (let i = 0; i <= n; i += 1) out.push(i);
163
+ return out;
164
+ }
165
+
166
+ module.exports = { range };
167
+ `,
168
+ },
169
+ { path: 'test/range.test.js', content: RANGE_TEST },
170
+ ],
171
+ fixedFiles: [
172
+ {
173
+ path: 'src/range.js',
174
+ content: `function range(n) {
175
+ const out = [];
176
+ for (let i = 0; i < n; i += 1) out.push(i);
177
+ return out;
178
+ }
179
+
180
+ module.exports = { range };
181
+ `,
182
+ },
183
+ ],
184
+ target: 'src/range.js',
185
+ checks: [{ file: 'test/range.test.js', command: 'node test/range.test.js' }],
186
+ detectionSignals: ['off-by-one', 'off by one', 'inclusive', 'exclusive', '<='],
187
+ tokenBudget: 20_000,
188
+ },
189
+ {
190
+ id: 'seed-top-scores-lexical-sort',
191
+ title: 'Top scores sorted as strings',
192
+ axis: 'comparator',
193
+ difficulty: 'easy',
194
+ bug: '`scores.sort()` sorts lexically without a comparator, so 100 ranks below 9. The fix must also stop mutating the caller array.',
195
+ files: [
196
+ {
197
+ path: 'src/top-scores.js',
198
+ content: `function topScores(scores, n) {
199
+ return scores.sort().slice(0, n);
200
+ }
201
+
202
+ module.exports = { topScores };
203
+ `,
204
+ },
205
+ { path: 'test/top-scores.test.js', content: TOP_SCORES_TEST },
206
+ ],
207
+ fixedFiles: [
208
+ {
209
+ path: 'src/top-scores.js',
210
+ content: `function topScores(scores, n) {
211
+ return [...scores].sort((a, b) => b - a).slice(0, n);
212
+ }
213
+
214
+ module.exports = { topScores };
215
+ `,
216
+ },
217
+ ],
218
+ target: 'src/top-scores.js',
219
+ checks: [{ file: 'test/top-scores.test.js', command: 'node test/top-scores.test.js' }],
220
+ detectionSignals: ['lexicograph', 'string', 'comparator', 'numeric'],
221
+ tokenBudget: 20_000,
222
+ },
223
+ {
224
+ id: 'seed-sum-async-for-each',
225
+ title: 'Async callback in a synchronous-looking forEach',
226
+ axis: 'async',
227
+ difficulty: 'medium',
228
+ bug: '`values.forEach(async …)` never awaits the callbacks, so the function resolves before the calls finish and returns the initial 0.',
229
+ files: [
230
+ {
231
+ path: 'src/sum-async.js',
232
+ content: `async function sumAsync(values) {
233
+ let total = 0;
234
+ values.forEach(async (value) => {
235
+ total += await Promise.resolve(value);
236
+ });
237
+ return total;
238
+ }
239
+
240
+ module.exports = { sumAsync };
241
+ `,
242
+ },
243
+ { path: 'test/sum-async.test.js', content: SUM_ASYNC_TEST },
244
+ ],
245
+ fixedFiles: [
246
+ {
247
+ path: 'src/sum-async.js',
248
+ content: `async function sumAsync(values) {
249
+ let total = 0;
250
+ for (const value of values) {
251
+ total += await Promise.resolve(value);
252
+ }
253
+ return total;
254
+ }
255
+
256
+ module.exports = { sumAsync };
257
+ `,
258
+ },
259
+ ],
260
+ target: 'src/sum-async.js',
261
+ checks: [{ file: 'test/sum-async.test.js', command: 'node test/sum-async.test.js' }],
262
+ detectionSignals: ['forall', 'not awaited', 'await', 'race', 'synchronous'],
263
+ tokenBudget: 20_000,
264
+ },
265
+ {
266
+ id: 'seed-format-amount-falsy-zero',
267
+ title: 'A falsy guard swallows a legitimate zero',
268
+ axis: 'truthiness',
269
+ difficulty: 'easy',
270
+ bug: 'A falsy guard (if (!amount)) treats 0 as missing; the guard must test for null/undefined instead, while null must still read as an em dash.',
271
+ files: [
272
+ {
273
+ path: 'src/format-amount.js',
274
+ content: `function formatAmount(amount) {
275
+ if (!amount) return '—';
276
+ return '$' + amount.toFixed(2);
277
+ }
278
+
279
+ module.exports = { formatAmount };
280
+ `,
281
+ },
282
+ { path: 'test/format-amount.test.js', content: FORMAT_AMOUNT_TEST },
283
+ ],
284
+ fixedFiles: [
285
+ {
286
+ path: 'src/format-amount.js',
287
+ content: `function formatAmount(amount) {
288
+ if (amount === null || amount === undefined) return '—';
289
+ return '$' + amount.toFixed(2);
290
+ }
291
+
292
+ module.exports = { formatAmount };
293
+ `,
294
+ },
295
+ ],
296
+ target: 'src/format-amount.js',
297
+ checks: [{ file: 'test/format-amount.test.js', command: 'node test/format-amount.test.js' }],
298
+ detectionSignals: ['falsy', 'truthy', 'zero', '!amount', 'null'],
299
+ tokenBudget: 20_000,
300
+ },
301
+ {
302
+ id: 'seed-clone-config-shallow',
303
+ title: 'Config clone is only one level deep',
304
+ axis: 'aliasing',
305
+ difficulty: 'medium',
306
+ bug: '`{ ...cfg }` copies the top level only, so `copy.limits` IS `original.limits` and mutating one changes the other.',
307
+ files: [
308
+ {
309
+ path: 'src/clone-config.js',
310
+ content: `function cloneConfig(config) {
311
+ return { ...config };
312
+ }
313
+
314
+ module.exports = { cloneConfig };
315
+ `,
316
+ },
317
+ { path: 'test/clone-config.test.js', content: CLONE_CONFIG_TEST },
318
+ ],
319
+ fixedFiles: [
320
+ {
321
+ path: 'src/clone-config.js',
322
+ content: `function cloneConfig(config) {
323
+ return structuredClone(config);
324
+ }
325
+
326
+ module.exports = { cloneConfig };
327
+ `,
328
+ },
329
+ ],
330
+ target: 'src/clone-config.js',
331
+ checks: [{ file: 'test/clone-config.test.js', command: 'node test/clone-config.test.js' }],
332
+ detectionSignals: ['shallow', 'deep', 'nested', 'aliasing', 'reference'],
333
+ tokenBudget: 20_000,
334
+ },
335
+ {
336
+ id: 'seed-add-tag-mutates-input',
337
+ title: 'Helper mutates its caller array',
338
+ axis: 'mutation',
339
+ difficulty: 'easy',
340
+ bug: '`tags.push(tag); return tags;` returns the caller\'s own array after mutating it; it must return a new array.',
341
+ files: [
342
+ {
343
+ path: 'src/add-tag.js',
344
+ content: `function addTag(tags, tag) {
345
+ tags.push(tag);
346
+ return tags;
347
+ }
348
+
349
+ module.exports = { addTag };
350
+ `,
351
+ },
352
+ { path: 'test/add-tag.test.js', content: ADD_TAG_TEST },
353
+ ],
354
+ fixedFiles: [
355
+ {
356
+ path: 'src/add-tag.js',
357
+ content: `function addTag(tags, tag) {
358
+ return [...tags, tag];
359
+ }
360
+
361
+ module.exports = { addTag };
362
+ `,
363
+ },
364
+ ],
365
+ target: 'src/add-tag.js',
366
+ checks: [{ file: 'test/add-tag.test.js', command: 'node test/add-tag.test.js' }],
367
+ detectionSignals: ['mutat', 'in place', 'copy', 'push'],
368
+ tokenBudget: 20_000,
369
+ },
370
+ {
371
+ id: 'seed-average-filtered-denominator',
372
+ title: 'Denominator not updated with the filter',
373
+ axis: 'aggregation',
374
+ difficulty: 'medium',
375
+ bug: 'Entries are filtered out of the SUM but not out of the DIVISOR, so a missing measurement drags every average down.',
376
+ files: [
377
+ {
378
+ path: 'src/average-of.js',
379
+ content: `function averageOf(measurements) {
380
+ const real = measurements.filter((m) => m !== null);
381
+ if (measurements.length === 0) return 0;
382
+ const sum = real.reduce((total, value) => total + value, 0);
383
+ return sum / measurements.length;
384
+ }
385
+
386
+ module.exports = { averageOf };
387
+ `,
388
+ },
389
+ { path: 'test/average-of.test.js', content: AVERAGE_TEST },
390
+ ],
391
+ fixedFiles: [
392
+ {
393
+ path: 'src/average-of.js',
394
+ content: `function averageOf(measurements) {
395
+ const real = measurements.filter((m) => m !== null);
396
+ if (real.length === 0) return 0;
397
+ const sum = real.reduce((total, value) => total + value, 0);
398
+ return sum / real.length;
399
+ }
400
+
401
+ module.exports = { averageOf };
402
+ `,
403
+ },
404
+ ],
405
+ target: 'src/average-of.js',
406
+ checks: [{ file: 'test/average-of.test.js', command: 'node test/average-of.test.js' }],
407
+ detectionSignals: ['denominator', 'divisor', 'length', 'filtered'],
408
+ tokenBudget: 20_000,
409
+ },
410
+ ];
411
+ /** A bug by id, or undefined. */
412
+ export function seededBugById(id) {
413
+ return SEEDED_BUGS.find((bug) => bug.id === id);
414
+ }
415
+ /** Write a workspace to `dir`. `fixed` swaps in the reference fix. */
416
+ export function materializeSeededBug(bug, dir, fixed = false) {
417
+ const files = fixed
418
+ ? [
419
+ ...bug.files.filter((f) => !bug.fixedFiles.some((fixedFile) => fixedFile.path === f.path)),
420
+ ...bug.fixedFiles,
421
+ ]
422
+ : bug.files;
423
+ for (const file of files) {
424
+ const abs = join(dir, file.path);
425
+ mkdirSync(join(abs, '..'), { recursive: true });
426
+ writeFileSync(abs, file.content, 'utf-8');
427
+ }
428
+ return dir;
429
+ }
430
+ /** Run one check in a workspace. Never throws — a failure IS the result. */
431
+ export function runSeedCheck(workspace, check, timeoutMs = 30_000) {
432
+ const start = Date.now();
433
+ try {
434
+ const output = execSync(check.command, {
435
+ cwd: workspace,
436
+ timeout: timeoutMs,
437
+ stdio: 'pipe',
438
+ encoding: 'utf-8',
439
+ shell: process.platform === 'win32' ? 'cmd.exe' : '/bin/bash',
440
+ maxBuffer: 2 * 1024 * 1024,
441
+ });
442
+ return { command: check.command, exitCode: 0, output: String(output).trim(), durationMs: Date.now() - start };
443
+ }
444
+ catch (err) {
445
+ const e = err;
446
+ const stdout = typeof e.stdout === 'string' ? e.stdout : String(e.stdout || '');
447
+ const stderr = typeof e.stderr === 'string' ? e.stderr : String(e.stderr || '');
448
+ return {
449
+ command: check.command,
450
+ // A killed check (timeout) reports no status; 1 keeps it a failure rather
451
+ // than an accidental pass.
452
+ exitCode: e.status ?? 1,
453
+ output: `${stdout}\n${stderr}`.trim(),
454
+ durationMs: Date.now() - start,
455
+ };
456
+ }
457
+ }
458
+ /**
459
+ * Prove a seed is genuinely broken and genuinely fixable.
460
+ *
461
+ * Both halves are required, and the marker requirement is what stops a check that
462
+ * merely CRASHED from counting as evidence of a bug: a syntax error also exits
463
+ * non-zero, so "it failed" alone would verify nothing. The fix half is what proves
464
+ * the check is well-formed; the marker half is what proves the failure is the
465
+ * defect's.
466
+ */
467
+ export function verifySeededBug(bug) {
468
+ const seedDir = mkdtempSync(join(tmpdir(), `seed-verify-${bug.id}-`));
469
+ const fixedDir = mkdtempSync(join(tmpdir(), `seed-verify-fixed-${bug.id}-`));
470
+ try {
471
+ materializeSeededBug(bug, seedDir, false);
472
+ materializeSeededBug(bug, fixedDir, true);
473
+ const details = [];
474
+ let seedFails = true;
475
+ let fixPasses = true;
476
+ for (const check of bug.checks) {
477
+ const seeded = runSeedCheck(seedDir, check);
478
+ // The marker requirement: the check must fail BY ASSERTING, not by crashing.
479
+ const failedByAsserting = seeded.exitCode !== 0 && /FAIL/.test(seeded.output);
480
+ if (!failedByAsserting)
481
+ seedFails = false;
482
+ details.push(` seed ${check.command} → exit ${seeded.exitCode}` +
483
+ (failedByAsserting ? '' : ` (no FAIL marker — ${firstLine(seeded.output) || 'no output'})`) +
484
+ `\n ${firstLine(seeded.output)}`);
485
+ const repaired = runSeedCheck(fixedDir, check);
486
+ if (repaired.exitCode !== 0)
487
+ fixPasses = false;
488
+ details.push(` fixed ${check.command} → exit ${repaired.exitCode}` +
489
+ (repaired.exitCode === 0 ? '' : ` (${firstLine(repaired.output) || 'no output'})`));
490
+ }
491
+ return {
492
+ id: bug.id,
493
+ title: bug.title,
494
+ seedFails,
495
+ fixPasses,
496
+ ok: seedFails && fixPasses,
497
+ detail: details.join('\n'),
498
+ };
499
+ }
500
+ finally {
501
+ rmSync(seedDir, { recursive: true, force: true });
502
+ rmSync(fixedDir, { recursive: true, force: true });
503
+ }
504
+ }
505
+ /** The first non-empty line of output, for a one-line report. */
506
+ function firstLine(output) {
507
+ return (output || '').split('\n').map((l) => l.trim()).find(Boolean) ?? '';
508
+ }
509
+ /** A table of verifications, ready to print. */
510
+ export function formatSeedVerification(results) {
511
+ const lines = ['Seeded-bug verification (each seed must FAIL its checks, and PASS once fixed):', ''];
512
+ for (const result of results) {
513
+ lines.push(` ${result.ok ? '✅' : '✗ '} ${result.id.padEnd(36)} ${result.title}`);
514
+ if (!result.ok) {
515
+ lines.push(` seed fails: ${result.seedFails ? 'yes' : 'NO'} · fix passes: ${result.fixPasses ? 'yes' : 'NO'}`);
516
+ lines.push(result.detail);
517
+ }
518
+ }
519
+ const bad = results.filter((r) => !r.ok).length;
520
+ lines.push('');
521
+ lines.push(bad === 0
522
+ ? `✓ all ${results.length} seeded bug(s) verified — every one is genuinely broken, and genuinely fixable.`
523
+ : `✗ ${bad} of ${results.length} seeded bug(s) did not verify — a task that is not broken scores nothing.`);
524
+ return lines.join('\n');
525
+ }
526
+ /** Read a file from a workspace, or null. */
527
+ export function readWorkspaceFile(workspace, path) {
528
+ try {
529
+ return readFileSync(join(workspace, path), 'utf-8');
530
+ }
531
+ catch {
532
+ return null;
533
+ }
534
+ }
535
+ //# sourceMappingURL=seeded-bugs.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"seeded-bugs.js","sourceRoot":"","sources":["../../src/learning/seeded-bugs.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"skill-store.d.ts","sourceRoot":"","sources":["../../src/learning/skill-store.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAOH,OAAO,KAAK,EAAE,KAAK,EAAE,YAAY,EAAkB,MAAM,kBAAkB,CAAC;AAwD5E;;;;;GAKG;AACH,qBAAa,UAAU;IACrB,OAAO,CAAC,KAAK,CAAa;;IAe1B;;;;;;;OAOG;IACH,iBAAiB,IAAI,MAAM;IA8C3B;;;OAGG;IACH,IAAI,CAAC,KAAK,EAAE,KAAK,GAAG,IAAI;IA6BxB;;;OAGG;IACH,GAAG,CAAC,EAAE,EAAE,MAAM,GAAG,KAAK,GAAG,IAAI;IAW7B;;;OAGG;IACH,MAAM,CAAC,eAAe,CAAC,EAAE,MAAM,GAAG,KAAK,EAAE;IAiBzC;;;OAGG;IACH,MAAM,CAAC,KAAK,EAAE,MAAM,GAAG,KAAK,EAAE;IAa9B;;;OAGG;IACH,SAAS,CAAC,IAAI,EAAE,MAAM,GAAG,KAAK,GAAG,IAAI;IA0CrC;;OAEG;IACH,QAAQ,CAAC,EAAE,EAAE,MAAM,GAAG,IAAI;IAS1B;;OAEG;IACH,MAAM,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO;IA4B3B;;;OAGG;IACH,iBAAiB,CAAC,KAAK,EAAE,KAAK,GAAG,MAAM;IAqBvC;;;OAGG;IACH,cAAc,CAAC,OAAO,GAAE,OAAe,GAAG,MAAM;IA4ChD;;OAEG;IACH,UAAU,IAAI,YAAY;IAyC1B;;OAEG;IACH,KAAK,IAAI,IAAI;IAUb;;OAEG;IACH,gBAAgB,IAAI,KAAK,CAAC;QACxB,EAAE,EAAE,MAAM,CAAC;QACX,IAAI,EAAE,MAAM,CAAC;QACb,UAAU,EAAE,MAAM,CAAC;QACnB,UAAU,EAAE,MAAM,CAAC;QACnB,OAAO,EAAE,MAAM,CAAC;KACjB,CAAC;IAeF;;;;;;;;;;;;OAYG;IACH,SAAS,CAAC,IAAI,EAAE,MAAM,EAAE,QAAQ,CAAC,EAAE,MAAM,GAAG,MAAM;IA6BlD;;;OAGG;IACH,OAAO,CAAC,oBAAoB;IAS5B;;OAEG;IACH,OAAO,CAAC,kBAAkB;IAc1B;;OAEG;IACH,OAAO,CAAC,iBAAiB;IAoBzB;;;;OAIG;IACH,OAAO,CAAC,eAAe;IAyGvB,OAAO,CAAC,SAAS;IAajB,OAAO,CAAC,SAAS;CAIlB;AAMD,wBAAgB,aAAa,IAAI,UAAU,CAK1C;AAED,wBAAgB,eAAe,IAAI,IAAI,CAEtC"}
1
+ {"version":3,"file":"skill-store.d.ts","sourceRoot":"","sources":["../../src/learning/skill-store.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAMH,OAAO,KAAK,EAAE,KAAK,EAAE,YAAY,EAAkB,MAAM,kBAAkB,CAAC;AA8E5E;;;;;GAKG;AACH,qBAAa,UAAU;IACrB,OAAO,CAAC,KAAK,CAAa;;IAe1B;;;;;;;OAOG;IACH,iBAAiB,IAAI,MAAM;IA8C3B;;;OAGG;IACH,IAAI,CAAC,KAAK,EAAE,KAAK,GAAG,IAAI;IA6BxB;;;OAGG;IACH,GAAG,CAAC,EAAE,EAAE,MAAM,GAAG,KAAK,GAAG,IAAI;IAW7B;;;OAGG;IACH,MAAM,CAAC,eAAe,CAAC,EAAE,MAAM,GAAG,KAAK,EAAE;IAiBzC;;;OAGG;IACH,MAAM,CAAC,KAAK,EAAE,MAAM,GAAG,KAAK,EAAE;IAa9B;;;OAGG;IACH,SAAS,CAAC,IAAI,EAAE,MAAM,GAAG,KAAK,GAAG,IAAI;IA0CrC;;OAEG;IACH,QAAQ,CAAC,EAAE,EAAE,MAAM,GAAG,IAAI;IAS1B;;OAEG;IACH,MAAM,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO;IA4B3B;;;OAGG;IACH,iBAAiB,CAAC,KAAK,EAAE,KAAK,GAAG,MAAM;IAqBvC;;;OAGG;IACH,cAAc,CAAC,OAAO,GAAE,OAAe,GAAG,MAAM;IA4ChD;;OAEG;IACH,UAAU,IAAI,YAAY;IAyC1B;;OAEG;IACH,KAAK,IAAI,IAAI;IAUb;;OAEG;IACH,gBAAgB,IAAI,KAAK,CAAC;QACxB,EAAE,EAAE,MAAM,CAAC;QACX,IAAI,EAAE,MAAM,CAAC;QACb,UAAU,EAAE,MAAM,CAAC;QACnB,UAAU,EAAE,MAAM,CAAC;QACnB,OAAO,EAAE,MAAM,CAAC;KACjB,CAAC;IAeF;;;;;;;;;;;;OAYG;IACH,SAAS,CAAC,IAAI,EAAE,MAAM,EAAE,QAAQ,CAAC,EAAE,MAAM,GAAG,MAAM;IA6BlD;;;OAGG;IACH,OAAO,CAAC,oBAAoB;IAS5B;;OAEG;IACH,OAAO,CAAC,kBAAkB;IAc1B;;OAEG;IACH,OAAO,CAAC,iBAAiB;IAoBzB;;;;OAIG;IACH,OAAO,CAAC,eAAe;IAyGvB,OAAO,CAAC,SAAS;IAajB,OAAO,CAAC,SAAS;CAIlB;AAMD,wBAAgB,aAAa,IAAI,UAAU,CAK1C;AAED,wBAAgB,eAAe,IAAI,IAAI,CAEtC"}
@@ -13,27 +13,48 @@
13
13
  */
14
14
  import { readFileSync, writeFileSync, existsSync, mkdirSync, readdirSync, unlinkSync } from 'node:fs';
15
15
  import { join } from 'node:path';
16
- import { resolveNuviraHome } from '../config/paths.js';
16
+ import { envBuff, resolveNuviraDataPath } from '../config/paths.js';
17
17
  import { MAX_SKILLS, SKILL_PRECEDENCE_NOTE } from './skill-types.js';
18
18
  import { ALL_BUNDLED_SKILLS as BUNDLED_SKILLS } from '../skills/bundled-skills.js';
19
19
  import { logger } from '../utils/logger.js';
20
20
  // ─── Constants ──────────────────────────────────────────────────────────────
21
- const SKILLS_DIR = join(resolveNuviraHome(), 'skills');
22
- const INDEX_PATH = join(SKILLS_DIR, 'index.json');
21
+ /**
22
+ * Where the skills live: the active Nuvira data dir, or `$NUVIRA_SKILLS_DIR`.
23
+ *
24
+ * Resolved PER CALL, never at module load. This was
25
+ * `join(resolveNuviraHome(), 'skills')` — a module-load constant off the raw
26
+ * home, which is the exact reach `config/paths.ts` documents as the bug this
27
+ * helper exists to prevent: it ignores the isolation override, so an isolated
28
+ * process read and SEEDED the developer's real profile.
29
+ *
30
+ * Measured, not assumed: the test suite wrote all 152 bundled skills plus
31
+ * `index.json` into the real `~/.nuvira/skills` on every run, and the moment two
32
+ * test files ran at once they raced on that directory — `seedBundledSkills()`
33
+ * returned 140 where the test expected 0, and a store the test had just created
34
+ * saw 67 of 152 skills, because the other worker was mid-write. A store this
35
+ * chatty is shared state, and shared state has to sit behind the override.
36
+ */
37
+ function skillsDir() {
38
+ return envBuff('SKILLS_DIR') || resolveNuviraDataPath('skills');
39
+ }
40
+ function indexPath() {
41
+ return join(skillsDir(), 'index.json');
42
+ }
23
43
  // Skill decay: skills lose relevance over time
24
44
  const SKILL_TTL_DAYS = 120; // Expire after 120 days without use
25
45
  const DECAY_DAYS_FOR_HALF_SCORE = 45; // Score halves after 45 days of no use
26
46
  const MIN_SKILL_SCORE = 0.15; // Prune skills below this score
27
47
  // ─── Helpers ────────────────────────────────────────────────────────────────
28
48
  function ensureDir() {
29
- if (!existsSync(SKILLS_DIR)) {
30
- mkdirSync(SKILLS_DIR, { recursive: true });
49
+ const dir = skillsDir();
50
+ if (!existsSync(dir)) {
51
+ mkdirSync(dir, { recursive: true });
31
52
  }
32
53
  }
33
54
  function skillFilePath(id) {
34
55
  // Sanitize ID for filesystem
35
56
  const safeId = id.replace(/[^a-zA-Z0-9_-]/g, '_');
36
- return join(SKILLS_DIR, `${safeId}.json`);
57
+ return join(skillsDir(), `${safeId}.json`);
37
58
  }
38
59
  function generateId(name) {
39
60
  const slug = name
@@ -590,10 +611,10 @@ export class SkillStore {
590
611
  loadIndex() {
591
612
  try {
592
613
  ensureDir();
593
- if (!existsSync(INDEX_PATH)) {
614
+ if (!existsSync(indexPath())) {
594
615
  return { skills: [], version: 1 };
595
616
  }
596
- const raw = readFileSync(INDEX_PATH, 'utf-8');
617
+ const raw = readFileSync(indexPath(), 'utf-8');
597
618
  return JSON.parse(raw);
598
619
  }
599
620
  catch {
@@ -602,7 +623,7 @@ export class SkillStore {
602
623
  }
603
624
  saveIndex() {
604
625
  ensureDir();
605
- writeFileSync(INDEX_PATH, JSON.stringify(this.index, null, 2), 'utf-8');
626
+ writeFileSync(indexPath(), JSON.stringify(this.index, null, 2), 'utf-8');
606
627
  }
607
628
  }
608
629
  // ─── Singleton ──────────────────────────────────────────────────────────────