agent-nuvira 3.3.12 → 3.3.14

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (458) hide show
  1. package/README.md +67 -1
  2. package/dist/agents/agents/planner.d.ts.map +1 -1
  3. package/dist/agents/agents/planner.js +9 -0
  4. package/dist/agents/agents/planner.js.map +1 -1
  5. package/dist/agents/agents/reasoner.d.ts.map +1 -1
  6. package/dist/agents/agents/reasoner.js +13 -0
  7. package/dist/agents/agents/reasoner.js.map +1 -1
  8. package/dist/agents/orchestrator.d.ts +31 -0
  9. package/dist/agents/orchestrator.d.ts.map +1 -1
  10. package/dist/agents/orchestrator.js +103 -135
  11. package/dist/agents/orchestrator.js.map +1 -1
  12. package/dist/cli/chat.d.ts +89 -0
  13. package/dist/cli/chat.d.ts.map +1 -1
  14. package/dist/cli/chat.js +798 -39
  15. package/dist/cli/chat.js.map +1 -1
  16. package/dist/cli/cli-program.d.ts.map +1 -1
  17. package/dist/cli/cli-program.js +20 -0
  18. package/dist/cli/cli-program.js.map +1 -1
  19. package/dist/cli/config.d.ts +12 -0
  20. package/dist/cli/config.d.ts.map +1 -1
  21. package/dist/cli/config.js +107 -3
  22. package/dist/cli/config.js.map +1 -1
  23. package/dist/cli/decisions.d.ts +28 -0
  24. package/dist/cli/decisions.d.ts.map +1 -0
  25. package/dist/cli/decisions.js +140 -0
  26. package/dist/cli/decisions.js.map +1 -0
  27. package/dist/cli/doctor.d.ts +6 -0
  28. package/dist/cli/doctor.d.ts.map +1 -1
  29. package/dist/cli/doctor.js +46 -0
  30. package/dist/cli/doctor.js.map +1 -1
  31. package/dist/cli/execute.d.ts.map +1 -1
  32. package/dist/cli/execute.js +6 -0
  33. package/dist/cli/execute.js.map +1 -1
  34. package/dist/cli/failover-runner.d.ts.map +1 -1
  35. package/dist/cli/failover-runner.js +19 -1
  36. package/dist/cli/failover-runner.js.map +1 -1
  37. package/dist/cli/feedback.d.ts.map +1 -1
  38. package/dist/cli/feedback.js +5 -1
  39. package/dist/cli/feedback.js.map +1 -1
  40. package/dist/cli/hooks.d.ts +30 -0
  41. package/dist/cli/hooks.d.ts.map +1 -0
  42. package/dist/cli/hooks.js +224 -0
  43. package/dist/cli/hooks.js.map +1 -0
  44. package/dist/cli/knowledge.d.ts +31 -0
  45. package/dist/cli/knowledge.d.ts.map +1 -0
  46. package/dist/cli/knowledge.js +223 -0
  47. package/dist/cli/knowledge.js.map +1 -0
  48. package/dist/cli/loop-executor.d.ts.map +1 -1
  49. package/dist/cli/loop-executor.js +92 -18
  50. package/dist/cli/loop-executor.js.map +1 -1
  51. package/dist/cli/model.d.ts +20 -0
  52. package/dist/cli/model.d.ts.map +1 -1
  53. package/dist/cli/model.js +294 -14
  54. package/dist/cli/model.js.map +1 -1
  55. package/dist/cli/omniroute-control.d.ts +88 -0
  56. package/dist/cli/omniroute-control.d.ts.map +1 -0
  57. package/dist/cli/omniroute-control.js +179 -0
  58. package/dist/cli/omniroute-control.js.map +1 -0
  59. package/dist/cli/omniroute.d.ts +21 -0
  60. package/dist/cli/omniroute.d.ts.map +1 -0
  61. package/dist/cli/omniroute.js +67 -0
  62. package/dist/cli/omniroute.js.map +1 -0
  63. package/dist/cli/rate.d.ts +78 -0
  64. package/dist/cli/rate.d.ts.map +1 -0
  65. package/dist/cli/rate.js +294 -0
  66. package/dist/cli/rate.js.map +1 -0
  67. package/dist/config/process-env.d.ts.map +1 -1
  68. package/dist/config/process-env.js +10 -0
  69. package/dist/config/process-env.js.map +1 -1
  70. package/dist/config/types.d.ts +8 -0
  71. package/dist/config/types.d.ts.map +1 -1
  72. package/dist/context/history.d.ts +21 -0
  73. package/dist/context/history.d.ts.map +1 -1
  74. package/dist/context/history.js +50 -0
  75. package/dist/context/history.js.map +1 -1
  76. package/dist/enterprise/vault.d.ts.map +1 -1
  77. package/dist/enterprise/vault.js +5 -21
  78. package/dist/enterprise/vault.js.map +1 -1
  79. package/dist/gateway/hook-contract.d.ts +206 -0
  80. package/dist/gateway/hook-contract.d.ts.map +1 -0
  81. package/dist/gateway/hook-contract.js +449 -0
  82. package/dist/gateway/hook-contract.js.map +1 -0
  83. package/dist/gateway/hooks.d.ts.map +1 -1
  84. package/dist/gateway/hooks.js +14 -0
  85. package/dist/gateway/hooks.js.map +1 -1
  86. package/dist/inference/gemini-adapter.d.ts.map +1 -1
  87. package/dist/inference/gemini-adapter.js +4 -0
  88. package/dist/inference/gemini-adapter.js.map +1 -1
  89. package/dist/inference/interface.d.ts +54 -0
  90. package/dist/inference/interface.d.ts.map +1 -1
  91. package/dist/inference/model-id-validation.d.ts +57 -0
  92. package/dist/inference/model-id-validation.d.ts.map +1 -0
  93. package/dist/inference/model-id-validation.js +127 -0
  94. package/dist/inference/model-id-validation.js.map +1 -0
  95. package/dist/inference/native-tools.d.ts +16 -1
  96. package/dist/inference/native-tools.d.ts.map +1 -1
  97. package/dist/inference/native-tools.js +34 -10
  98. package/dist/inference/native-tools.js.map +1 -1
  99. package/dist/inference/openai-compat-adapter.d.ts.map +1 -1
  100. package/dist/inference/openai-compat-adapter.js +12 -1
  101. package/dist/inference/openai-compat-adapter.js.map +1 -1
  102. package/dist/inference/provider-catalog.d.ts +11 -0
  103. package/dist/inference/provider-catalog.d.ts.map +1 -1
  104. package/dist/inference/provider-catalog.js +80 -0
  105. package/dist/inference/provider-catalog.js.map +1 -1
  106. package/dist/inference/route-resolver.d.ts +32 -8
  107. package/dist/inference/route-resolver.d.ts.map +1 -1
  108. package/dist/inference/route-resolver.js +175 -1
  109. package/dist/inference/route-resolver.js.map +1 -1
  110. package/dist/inference/tool-call-utils.d.ts.map +1 -1
  111. package/dist/inference/tool-call-utils.js +10 -8
  112. package/dist/inference/tool-call-utils.js.map +1 -1
  113. package/dist/inference/tools.d.ts +17 -1
  114. package/dist/inference/tools.d.ts.map +1 -1
  115. package/dist/inference/tools.js +69 -19
  116. package/dist/inference/tools.js.map +1 -1
  117. package/dist/learning/acceptance-model.d.ts +247 -0
  118. package/dist/learning/acceptance-model.d.ts.map +1 -0
  119. package/dist/learning/acceptance-model.js +708 -0
  120. package/dist/learning/acceptance-model.js.map +1 -0
  121. package/dist/learning/auto-router.d.ts +121 -24
  122. package/dist/learning/auto-router.d.ts.map +1 -1
  123. package/dist/learning/auto-router.js +374 -96
  124. package/dist/learning/auto-router.js.map +1 -1
  125. package/dist/learning/autonomy-policy.d.ts +12 -16
  126. package/dist/learning/autonomy-policy.d.ts.map +1 -1
  127. package/dist/learning/autonomy-policy.js +50 -48
  128. package/dist/learning/autonomy-policy.js.map +1 -1
  129. package/dist/learning/behavioural-labels.d.ts +86 -0
  130. package/dist/learning/behavioural-labels.d.ts.map +1 -0
  131. package/dist/learning/behavioural-labels.js +166 -0
  132. package/dist/learning/behavioural-labels.js.map +1 -0
  133. package/dist/learning/capability-evidence.d.ts +167 -0
  134. package/dist/learning/capability-evidence.d.ts.map +1 -0
  135. package/dist/learning/capability-evidence.js +210 -0
  136. package/dist/learning/capability-evidence.js.map +1 -0
  137. package/dist/learning/capability-readiness.d.ts +64 -0
  138. package/dist/learning/capability-readiness.d.ts.map +1 -0
  139. package/dist/learning/capability-readiness.js +74 -0
  140. package/dist/learning/capability-readiness.js.map +1 -0
  141. package/dist/learning/capability-types.d.ts +169 -0
  142. package/dist/learning/capability-types.d.ts.map +1 -0
  143. package/dist/learning/capability-types.js +20 -0
  144. package/dist/learning/capability-types.js.map +1 -0
  145. package/dist/learning/catalog-feed.d.ts +89 -0
  146. package/dist/learning/catalog-feed.d.ts.map +1 -0
  147. package/dist/learning/catalog-feed.js +211 -0
  148. package/dist/learning/catalog-feed.js.map +1 -0
  149. package/dist/learning/cli-intent-effects.d.ts +60 -0
  150. package/dist/learning/cli-intent-effects.d.ts.map +1 -0
  151. package/dist/learning/cli-intent-effects.js +153 -0
  152. package/dist/learning/cli-intent-effects.js.map +1 -0
  153. package/dist/learning/command-adaptation.d.ts +41 -0
  154. package/dist/learning/command-adaptation.d.ts.map +1 -0
  155. package/dist/learning/command-adaptation.js +122 -0
  156. package/dist/learning/command-adaptation.js.map +1 -0
  157. package/dist/learning/consent-picture.d.ts +42 -0
  158. package/dist/learning/consent-picture.d.ts.map +1 -0
  159. package/dist/learning/consent-picture.js +53 -0
  160. package/dist/learning/consent-picture.js.map +1 -0
  161. package/dist/learning/context-budget.d.ts +37 -6
  162. package/dist/learning/context-budget.d.ts.map +1 -1
  163. package/dist/learning/context-budget.js +38 -9
  164. package/dist/learning/context-budget.js.map +1 -1
  165. package/dist/learning/decision-log.d.ts +114 -0
  166. package/dist/learning/decision-log.d.ts.map +1 -0
  167. package/dist/learning/decision-log.js +296 -0
  168. package/dist/learning/decision-log.js.map +1 -0
  169. package/dist/learning/deliverable-class.d.ts.map +1 -1
  170. package/dist/learning/deliverable-class.js +19 -0
  171. package/dist/learning/deliverable-class.js.map +1 -1
  172. package/dist/learning/deliverable-corpus.d.ts +117 -0
  173. package/dist/learning/deliverable-corpus.d.ts.map +1 -0
  174. package/dist/learning/deliverable-corpus.js +176 -0
  175. package/dist/learning/deliverable-corpus.js.map +1 -0
  176. package/dist/learning/error-repair.d.ts +45 -2
  177. package/dist/learning/error-repair.d.ts.map +1 -1
  178. package/dist/learning/error-repair.js +95 -0
  179. package/dist/learning/error-repair.js.map +1 -1
  180. package/dist/learning/exhaustion-report.d.ts +136 -0
  181. package/dist/learning/exhaustion-report.d.ts.map +1 -0
  182. package/dist/learning/exhaustion-report.js +239 -0
  183. package/dist/learning/exhaustion-report.js.map +1 -0
  184. package/dist/learning/failure-bookkeeping.d.ts +16 -0
  185. package/dist/learning/failure-bookkeeping.d.ts.map +1 -1
  186. package/dist/learning/failure-bookkeeping.js +51 -5
  187. package/dist/learning/failure-bookkeeping.js.map +1 -1
  188. package/dist/learning/gate-friction.d.ts +39 -0
  189. package/dist/learning/gate-friction.d.ts.map +1 -0
  190. package/dist/learning/gate-friction.js +91 -0
  191. package/dist/learning/gate-friction.js.map +1 -0
  192. package/dist/learning/harness-narration.d.ts +34 -0
  193. package/dist/learning/harness-narration.d.ts.map +1 -0
  194. package/dist/learning/harness-narration.js +58 -0
  195. package/dist/learning/harness-narration.js.map +1 -0
  196. package/dist/learning/hub-skill-catalog.d.ts.map +1 -1
  197. package/dist/learning/hub-skill-catalog.js +1 -2
  198. package/dist/learning/hub-skill-catalog.js.map +1 -1
  199. package/dist/learning/hybrid-router.d.ts +65 -0
  200. package/dist/learning/hybrid-router.d.ts.map +1 -1
  201. package/dist/learning/hybrid-router.js +186 -0
  202. package/dist/learning/hybrid-router.js.map +1 -1
  203. package/dist/learning/knowledge-base.d.ts +350 -0
  204. package/dist/learning/knowledge-base.d.ts.map +1 -0
  205. package/dist/learning/knowledge-base.js +906 -0
  206. package/dist/learning/knowledge-base.js.map +1 -0
  207. package/dist/learning/knowledge-eval.d.ts +171 -0
  208. package/dist/learning/knowledge-eval.d.ts.map +1 -0
  209. package/dist/learning/knowledge-eval.js +196 -0
  210. package/dist/learning/knowledge-eval.js.map +1 -0
  211. package/dist/learning/knowledge-turn.d.ts +92 -0
  212. package/dist/learning/knowledge-turn.d.ts.map +1 -0
  213. package/dist/learning/knowledge-turn.js +190 -0
  214. package/dist/learning/knowledge-turn.js.map +1 -0
  215. package/dist/learning/learned-commands.d.ts +64 -0
  216. package/dist/learning/learned-commands.d.ts.map +1 -0
  217. package/dist/learning/learned-commands.js +108 -0
  218. package/dist/learning/learned-commands.js.map +1 -0
  219. package/dist/learning/lexical-search.d.ts +50 -0
  220. package/dist/learning/lexical-search.d.ts.map +1 -0
  221. package/dist/learning/lexical-search.js +111 -0
  222. package/dist/learning/lexical-search.js.map +1 -0
  223. package/dist/learning/machine-facts.d.ts +71 -0
  224. package/dist/learning/machine-facts.d.ts.map +1 -0
  225. package/dist/learning/machine-facts.js +164 -0
  226. package/dist/learning/machine-facts.js.map +1 -0
  227. package/dist/learning/markdown-outline.d.ts +73 -0
  228. package/dist/learning/markdown-outline.d.ts.map +1 -0
  229. package/dist/learning/markdown-outline.js +136 -0
  230. package/dist/learning/markdown-outline.js.map +1 -0
  231. package/dist/learning/model-first-router.d.ts +33 -1
  232. package/dist/learning/model-first-router.d.ts.map +1 -1
  233. package/dist/learning/model-first-router.js +123 -9
  234. package/dist/learning/model-first-router.js.map +1 -1
  235. package/dist/learning/model-identity.d.ts +80 -0
  236. package/dist/learning/model-identity.d.ts.map +1 -0
  237. package/dist/learning/model-identity.js +115 -0
  238. package/dist/learning/model-identity.js.map +1 -0
  239. package/dist/learning/model-registry.d.ts +141 -2
  240. package/dist/learning/model-registry.d.ts.map +1 -1
  241. package/dist/learning/model-registry.js +324 -38
  242. package/dist/learning/model-registry.js.map +1 -1
  243. package/dist/learning/model-scoring.d.ts.map +1 -1
  244. package/dist/learning/model-scoring.js +8 -1
  245. package/dist/learning/model-scoring.js.map +1 -1
  246. package/dist/learning/model-selection.d.ts +2 -1
  247. package/dist/learning/model-selection.d.ts.map +1 -1
  248. package/dist/learning/model-selection.js +76 -2
  249. package/dist/learning/model-selection.js.map +1 -1
  250. package/dist/learning/outcome-observation.d.ts +49 -0
  251. package/dist/learning/outcome-observation.d.ts.map +1 -0
  252. package/dist/learning/outcome-observation.js +95 -0
  253. package/dist/learning/outcome-observation.js.map +1 -0
  254. package/dist/learning/pair-entitlement.d.ts +184 -0
  255. package/dist/learning/pair-entitlement.d.ts.map +1 -0
  256. package/dist/learning/pair-entitlement.js +214 -0
  257. package/dist/learning/pair-entitlement.js.map +1 -0
  258. package/dist/learning/project-docs.d.ts +83 -0
  259. package/dist/learning/project-docs.d.ts.map +1 -0
  260. package/dist/learning/project-docs.js +132 -0
  261. package/dist/learning/project-docs.js.map +1 -0
  262. package/dist/learning/provider-fallback.d.ts +23 -1
  263. package/dist/learning/provider-fallback.d.ts.map +1 -1
  264. package/dist/learning/provider-fallback.js +24 -0
  265. package/dist/learning/provider-fallback.js.map +1 -1
  266. package/dist/learning/quota-ledger.d.ts +13 -0
  267. package/dist/learning/quota-ledger.d.ts.map +1 -1
  268. package/dist/learning/quota-ledger.js +28 -0
  269. package/dist/learning/quota-ledger.js.map +1 -1
  270. package/dist/learning/reasoning-trace.d.ts +65 -1
  271. package/dist/learning/reasoning-trace.d.ts.map +1 -1
  272. package/dist/learning/reasoning-trace.js +123 -1
  273. package/dist/learning/reasoning-trace.js.map +1 -1
  274. package/dist/learning/requirement-probe.d.ts +55 -0
  275. package/dist/learning/requirement-probe.d.ts.map +1 -0
  276. package/dist/learning/requirement-probe.js +77 -0
  277. package/dist/learning/requirement-probe.js.map +1 -0
  278. package/dist/learning/resilient-call.d.ts +20 -1
  279. package/dist/learning/resilient-call.d.ts.map +1 -1
  280. package/dist/learning/resilient-call.js +42 -4
  281. package/dist/learning/resilient-call.js.map +1 -1
  282. package/dist/learning/response-usability.d.ts +85 -0
  283. package/dist/learning/response-usability.d.ts.map +1 -0
  284. package/dist/learning/response-usability.js +135 -0
  285. package/dist/learning/response-usability.js.map +1 -0
  286. package/dist/learning/router-bandit.d.ts +132 -0
  287. package/dist/learning/router-bandit.d.ts.map +1 -1
  288. package/dist/learning/router-bandit.js +253 -0
  289. package/dist/learning/router-bandit.js.map +1 -1
  290. package/dist/learning/routing-history.d.ts +41 -2
  291. package/dist/learning/routing-history.d.ts.map +1 -1
  292. package/dist/learning/routing-history.js.map +1 -1
  293. package/dist/learning/run-trace.d.ts +21 -0
  294. package/dist/learning/run-trace.d.ts.map +1 -1
  295. package/dist/learning/run-trace.js +38 -0
  296. package/dist/learning/run-trace.js.map +1 -1
  297. package/dist/learning/seeded-benchmark.d.ts +14 -0
  298. package/dist/learning/seeded-benchmark.d.ts.map +1 -1
  299. package/dist/learning/seeded-benchmark.js +43 -4
  300. package/dist/learning/seeded-benchmark.js.map +1 -1
  301. package/dist/learning/session-grant.d.ts +75 -0
  302. package/dist/learning/session-grant.d.ts.map +1 -0
  303. package/dist/learning/session-grant.js +112 -0
  304. package/dist/learning/session-grant.js.map +1 -0
  305. package/dist/learning/task-model-continuity.d.ts +73 -0
  306. package/dist/learning/task-model-continuity.d.ts.map +1 -0
  307. package/dist/learning/task-model-continuity.js +87 -0
  308. package/dist/learning/task-model-continuity.js.map +1 -0
  309. package/dist/learning/turn-feedback.d.ts +93 -0
  310. package/dist/learning/turn-feedback.d.ts.map +1 -0
  311. package/dist/learning/turn-feedback.js +127 -0
  312. package/dist/learning/turn-feedback.js.map +1 -0
  313. package/dist/learning/turn-report.d.ts +104 -2
  314. package/dist/learning/turn-report.d.ts.map +1 -1
  315. package/dist/learning/turn-report.js +161 -6
  316. package/dist/learning/turn-report.js.map +1 -1
  317. package/dist/learning/verdict-routing.d.ts +51 -0
  318. package/dist/learning/verdict-routing.d.ts.map +1 -0
  319. package/dist/learning/verdict-routing.js +122 -0
  320. package/dist/learning/verdict-routing.js.map +1 -0
  321. package/dist/mcp/client.d.ts.map +1 -1
  322. package/dist/mcp/client.js +5 -0
  323. package/dist/mcp/client.js.map +1 -1
  324. package/dist/mcp/manager.d.ts +10 -0
  325. package/dist/mcp/manager.d.ts.map +1 -1
  326. package/dist/mcp/manager.js +20 -0
  327. package/dist/mcp/manager.js.map +1 -1
  328. package/dist/mcp/mcp-discovery.d.ts +34 -0
  329. package/dist/mcp/mcp-discovery.d.ts.map +1 -0
  330. package/dist/mcp/mcp-discovery.js +71 -0
  331. package/dist/mcp/mcp-discovery.js.map +1 -0
  332. package/dist/mcp/mcp-schema-cache.d.ts +17 -0
  333. package/dist/mcp/mcp-schema-cache.d.ts.map +1 -1
  334. package/dist/mcp/mcp-schema-cache.js +47 -3
  335. package/dist/mcp/mcp-schema-cache.js.map +1 -1
  336. package/dist/mcp/types.d.ts +28 -0
  337. package/dist/mcp/types.d.ts.map +1 -1
  338. package/dist/mcp/types.js.map +1 -1
  339. package/dist/security/secret-scan.d.ts +156 -0
  340. package/dist/security/secret-scan.d.ts.map +1 -0
  341. package/dist/security/secret-scan.js +525 -0
  342. package/dist/security/secret-scan.js.map +1 -0
  343. package/dist/tools/ask-user.d.ts.map +1 -1
  344. package/dist/tools/ask-user.js +4 -0
  345. package/dist/tools/ask-user.js.map +1 -1
  346. package/dist/tools/capability-registry.d.ts +150 -0
  347. package/dist/tools/capability-registry.d.ts.map +1 -0
  348. package/dist/tools/capability-registry.js +400 -0
  349. package/dist/tools/capability-registry.js.map +1 -0
  350. package/dist/tools/child-agent-runtime.d.ts.map +1 -1
  351. package/dist/tools/child-agent-runtime.js +19 -5
  352. package/dist/tools/child-agent-runtime.js.map +1 -1
  353. package/dist/tools/coding-tools.d.ts +17 -5
  354. package/dist/tools/coding-tools.d.ts.map +1 -1
  355. package/dist/tools/coding-tools.js +80 -11
  356. package/dist/tools/coding-tools.js.map +1 -1
  357. package/dist/tools/command-memo.d.ts +116 -0
  358. package/dist/tools/command-memo.d.ts.map +1 -0
  359. package/dist/tools/command-memo.js +202 -0
  360. package/dist/tools/command-memo.js.map +1 -0
  361. package/dist/tools/git-tool.d.ts.map +1 -1
  362. package/dist/tools/git-tool.js +13 -3
  363. package/dist/tools/git-tool.js.map +1 -1
  364. package/dist/tools/harness-directive.d.ts +42 -0
  365. package/dist/tools/harness-directive.d.ts.map +1 -0
  366. package/dist/tools/harness-directive.js +45 -0
  367. package/dist/tools/harness-directive.js.map +1 -0
  368. package/dist/tools/loop-skill-hint.d.ts +74 -174
  369. package/dist/tools/loop-skill-hint.d.ts.map +1 -1
  370. package/dist/tools/loop-skill-hint.js +110 -536
  371. package/dist/tools/loop-skill-hint.js.map +1 -1
  372. package/dist/tools/mcp-client-tool.d.ts +2 -0
  373. package/dist/tools/mcp-client-tool.d.ts.map +1 -1
  374. package/dist/tools/mcp-client-tool.js +3 -0
  375. package/dist/tools/mcp-client-tool.js.map +1 -1
  376. package/dist/tools/modality/shared.d.ts +1 -4
  377. package/dist/tools/modality/shared.d.ts.map +1 -1
  378. package/dist/tools/modality/shared.js +7 -22
  379. package/dist/tools/modality/shared.js.map +1 -1
  380. package/dist/tools/plan-store.d.ts +44 -4
  381. package/dist/tools/plan-store.d.ts.map +1 -1
  382. package/dist/tools/plan-store.js +93 -9
  383. package/dist/tools/plan-store.js.map +1 -1
  384. package/dist/tools/registry.d.ts +76 -3
  385. package/dist/tools/registry.d.ts.map +1 -1
  386. package/dist/tools/registry.js +623 -15
  387. package/dist/tools/registry.js.map +1 -1
  388. package/dist/tools/remediation-ladder.d.ts +91 -0
  389. package/dist/tools/remediation-ladder.d.ts.map +1 -0
  390. package/dist/tools/remediation-ladder.js +316 -0
  391. package/dist/tools/remediation-ladder.js.map +1 -0
  392. package/dist/tools/run-cli.d.ts.map +1 -1
  393. package/dist/tools/run-cli.js +29 -4
  394. package/dist/tools/run-cli.js.map +1 -1
  395. package/dist/tools/run-terminal.d.ts +11 -0
  396. package/dist/tools/run-terminal.d.ts.map +1 -1
  397. package/dist/tools/run-terminal.js +289 -10
  398. package/dist/tools/run-terminal.js.map +1 -1
  399. package/dist/tools/skills-hub.d.ts +7 -0
  400. package/dist/tools/skills-hub.d.ts.map +1 -1
  401. package/dist/tools/skills-hub.js +11 -2
  402. package/dist/tools/skills-hub.js.map +1 -1
  403. package/dist/tools/step-artifact.d.ts +35 -0
  404. package/dist/tools/step-artifact.d.ts.map +1 -0
  405. package/dist/tools/step-artifact.js +154 -0
  406. package/dist/tools/step-artifact.js.map +1 -0
  407. package/dist/tools/tool-loop.d.ts +327 -13
  408. package/dist/tools/tool-loop.d.ts.map +1 -1
  409. package/dist/tools/tool-loop.js +891 -66
  410. package/dist/tools/tool-loop.js.map +1 -1
  411. package/dist/tools/toolsets.js +4 -4
  412. package/dist/tools/toolsets.js.map +1 -1
  413. package/dist/tools/worktree.d.ts +11 -2
  414. package/dist/tools/worktree.d.ts.map +1 -1
  415. package/dist/tools/worktree.js +11 -2
  416. package/dist/tools/worktree.js.map +1 -1
  417. package/dist/utils/atomic-store.d.ts +53 -0
  418. package/dist/utils/atomic-store.d.ts.map +1 -0
  419. package/dist/utils/atomic-store.js +178 -0
  420. package/dist/utils/atomic-store.js.map +1 -0
  421. package/dist/utils/binary-probe.d.ts +25 -0
  422. package/dist/utils/binary-probe.d.ts.map +1 -0
  423. package/dist/utils/binary-probe.js +48 -0
  424. package/dist/utils/binary-probe.js.map +1 -0
  425. package/dist/utils/workspace-path.d.ts +50 -0
  426. package/dist/utils/workspace-path.d.ts.map +1 -0
  427. package/dist/utils/workspace-path.js +86 -0
  428. package/dist/utils/workspace-path.js.map +1 -0
  429. package/dist/web-dashboard/chat-console.d.ts +24 -0
  430. package/dist/web-dashboard/chat-console.d.ts.map +1 -1
  431. package/dist/web-dashboard/chat-console.js +38 -0
  432. package/dist/web-dashboard/chat-console.js.map +1 -1
  433. package/dist/web-dashboard/project-context.d.ts +27 -2
  434. package/dist/web-dashboard/project-context.d.ts.map +1 -1
  435. package/dist/web-dashboard/project-context.js +32 -2
  436. package/dist/web-dashboard/project-context.js.map +1 -1
  437. package/dist/web-dashboard/server.d.ts +40 -0
  438. package/dist/web-dashboard/server.d.ts.map +1 -1
  439. package/dist/web-dashboard/server.js +733 -15
  440. package/dist/web-dashboard/server.js.map +1 -1
  441. package/dist/web-dashboard/src/types.d.ts +236 -1
  442. package/dist/web-dashboard/src/types.d.ts.map +1 -1
  443. package/dist/web-dashboard/workspace-guard.d.ts +18 -2
  444. package/dist/web-dashboard/workspace-guard.d.ts.map +1 -1
  445. package/dist/web-dashboard/workspace-guard.js +94 -12
  446. package/dist/web-dashboard/workspace-guard.js.map +1 -1
  447. package/dist/web-dashboard/workspace-resolution.d.ts +87 -0
  448. package/dist/web-dashboard/workspace-resolution.d.ts.map +1 -0
  449. package/dist/web-dashboard/workspace-resolution.js +105 -0
  450. package/dist/web-dashboard/workspace-resolution.js.map +1 -0
  451. package/package.json +1 -1
  452. package/src/web-dashboard/public/assets/index-tK8Y2qHB.css +1 -0
  453. package/src/web-dashboard/public/assets/index-zjbdJnO-.js +210 -0
  454. package/src/web-dashboard/public/assets/index-zjbdJnO-.js.map +1 -0
  455. package/src/web-dashboard/public/index.html +2 -2
  456. package/src/web-dashboard/public/assets/index-BrZcYhy6.js +0 -207
  457. package/src/web-dashboard/public/assets/index-BrZcYhy6.js.map +0 -1
  458. package/src/web-dashboard/public/assets/index-DsWczTa6.css +0 -1
@@ -0,0 +1,53 @@
1
+ export interface FileLockOptions {
2
+ /** How long to wait for a held lock before running the section WITHOUT it. */
3
+ timeoutMs?: number;
4
+ /** A lock file older than this is presumed abandoned (its holder died). */
5
+ staleMs?: number;
6
+ /** Pause between attempts. */
7
+ retryMs?: number;
8
+ }
9
+ export declare const DEFAULT_LOCK_TIMEOUT_MS = 2000;
10
+ export declare const DEFAULT_LOCK_STALE_MS = 10000;
11
+ export declare const DEFAULT_LOCK_RETRY_MS = 10;
12
+ /**
13
+ * Try ONCE to take the lock. An exclusive create (`wx`) is the atomic primitive:
14
+ * exactly one caller can win it, everywhere, without a daemon.
15
+ *
16
+ * A lock older than `staleMs` is broken, because the alternative is a store that
17
+ * can never be written again after one process is killed mid-section. The
18
+ * holder's pid is written for diagnosis, not for correctness — pid reuse makes
19
+ * pid liveness an unsafe test, and the mtime is what decides.
20
+ */
21
+ export declare function tryAcquireFileLock(lockPath: string, staleMs?: number): boolean;
22
+ /** Release a lock this process holds. Best-effort: never throws. */
23
+ export declare function releaseFileLock(lockPath: string): void;
24
+ /**
25
+ * Run `fn` while holding `lockPath`, or — if the lock cannot be taken within
26
+ * `timeoutMs` — run it anyway and report `heldLock: false`.
27
+ *
28
+ * RUNNING ANYWAY IS THE POINT. Every caller here is a best-effort write on a
29
+ * routing path: refusing to persist because a lock is busy would trade a rare
30
+ * lost update for a certain lost learning. A contention timeout is a signal to
31
+ * the caller, not a failure.
32
+ */
33
+ export declare function withFileLockSync<T>(lockPath: string, fn: () => T, opts?: FileLockOptions): {
34
+ value: T;
35
+ heldLock: boolean;
36
+ };
37
+ /**
38
+ * Write `content` to `path` so that no reader can ever see a partial document:
39
+ * write a uniquely-named sibling, then `rename`.
40
+ *
41
+ * The unique name matters — a fixed `.tmp` lets two writers race on the temp
42
+ * file itself and publish each other's bytes. `rename` over an existing path is
43
+ * atomic on POSIX and on Windows (`MoveFileEx` with replace).
44
+ */
45
+ export declare function writeFileAtomicSync(path: string, content: string): void;
46
+ /**
47
+ * Order-independent JSON for comparing two records. `JSON.stringify` depends on
48
+ * key insertion order, so two entries built by different code paths can be
49
+ * semantically identical and compare unequal — which would make a merge treat an
50
+ * untouched entry as a change and clobber a peer's learning.
51
+ */
52
+ export declare function stableJson(value: unknown): string;
53
+ //# sourceMappingURL=atomic-store.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"atomic-store.d.ts","sourceRoot":"","sources":["../../src/utils/atomic-store.ts"],"names":[],"mappings":"AAoCA,MAAM,WAAW,eAAe;IAC9B,8EAA8E;IAC9E,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,2EAA2E;IAC3E,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,8BAA8B;IAC9B,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAED,eAAO,MAAM,uBAAuB,OAAQ,CAAC;AAC7C,eAAO,MAAM,qBAAqB,QAAS,CAAC;AAC5C,eAAO,MAAM,qBAAqB,KAAK,CAAC;AAmBxC;;;;;;;;GAQG;AACH,wBAAgB,kBAAkB,CAAC,QAAQ,EAAE,MAAM,EAAE,OAAO,SAAwB,GAAG,OAAO,CA2B7F;AAED,oEAAoE;AACpE,wBAAgB,eAAe,CAAC,QAAQ,EAAE,MAAM,GAAG,IAAI,CAMtD;AAED;;;;;;;;GAQG;AACH,wBAAgB,gBAAgB,CAAC,CAAC,EAChC,QAAQ,EAAE,MAAM,EAChB,EAAE,EAAE,MAAM,CAAC,EACX,IAAI,GAAE,eAAoB,GACzB;IAAE,KAAK,EAAE,CAAC,CAAC;IAAC,QAAQ,EAAE,OAAO,CAAA;CAAE,CAsBjC;AAID;;;;;;;GAOG;AACH,wBAAgB,mBAAmB,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,IAAI,CAcvE;AAcD;;;;;GAKG;AACH,wBAAgB,UAAU,CAAC,KAAK,EAAE,OAAO,GAAG,MAAM,CAEjD"}
@@ -0,0 +1,178 @@
1
+ /**
2
+ * Shared mechanics for the JSON stores under `~/.nuvira/memory`: an advisory
3
+ * CROSS-PROCESS lock and an atomic write.
4
+ *
5
+ * WHY THIS EXISTS (measured, 2026-10-07). Several long-lived processes share one
6
+ * memory dir — the dashboard, the gateway, the warmup daemon and any CLI run —
7
+ * and each holds a JSON store in memory and flushes the WHOLE map back on
8
+ * persist. Two consequences, both measured, neither theoretical:
9
+ *
10
+ * 1. LOST UPDATES. Two processes read the file, each learns something, each
11
+ * writes its own snapshot. The second write wins entirely, so the first
12
+ * process's learning is gone — on the registry this flipped a strict-pin
13
+ * verdict from `credit-exhausted` back to `unverified` between two runs of
14
+ * the same command.
15
+ * 2. TORN READS. A plain `writeFileSync` is not atomic, so a reader that
16
+ * catches the file mid-write parses a truncated document. Every store here
17
+ * catches that and returns an EMPTY state, which the next persist then
18
+ * writes back — turning one unlucky read into a wiped file.
19
+ *
20
+ * The lock closes (1) for whatever critical section the caller wraps; the atomic
21
+ * write closes (2) outright, and that one needs no cooperation from other
22
+ * processes. Both are deliberately synchronous, because every caller here is on
23
+ * a synchronous path that must never throw.
24
+ */
25
+ import { closeSync, mkdirSync, openSync, renameSync, rmSync, statSync, writeFileSync, writeSync, } from 'node:fs';
26
+ import { dirname } from 'node:path';
27
+ export const DEFAULT_LOCK_TIMEOUT_MS = 2_000;
28
+ export const DEFAULT_LOCK_STALE_MS = 10_000;
29
+ export const DEFAULT_LOCK_RETRY_MS = 10;
30
+ /**
31
+ * Sleep without spinning. `Atomics.wait` is permitted on the Node main thread
32
+ * (unlike a browser's), so a contended lock costs no CPU; the busy loop is only
33
+ * a fallback for an engine without `SharedArrayBuffer`.
34
+ */
35
+ function sleepSync(ms) {
36
+ if (ms <= 0)
37
+ return;
38
+ try {
39
+ Atomics.wait(new Int32Array(new SharedArrayBuffer(4)), 0, 0, ms);
40
+ }
41
+ catch {
42
+ const until = Date.now() + ms;
43
+ while (Date.now() < until) {
44
+ /* last resort */
45
+ }
46
+ }
47
+ }
48
+ /**
49
+ * Try ONCE to take the lock. An exclusive create (`wx`) is the atomic primitive:
50
+ * exactly one caller can win it, everywhere, without a daemon.
51
+ *
52
+ * A lock older than `staleMs` is broken, because the alternative is a store that
53
+ * can never be written again after one process is killed mid-section. The
54
+ * holder's pid is written for diagnosis, not for correctness — pid reuse makes
55
+ * pid liveness an unsafe test, and the mtime is what decides.
56
+ */
57
+ export function tryAcquireFileLock(lockPath, staleMs = DEFAULT_LOCK_STALE_MS) {
58
+ const take = () => {
59
+ try {
60
+ const fd = openSync(lockPath, 'wx');
61
+ try {
62
+ writeSync(fd, `${process.pid}\n`);
63
+ }
64
+ catch {
65
+ /* the pid is diagnostics only */
66
+ }
67
+ closeSync(fd);
68
+ return true;
69
+ }
70
+ catch {
71
+ return false;
72
+ }
73
+ };
74
+ if (take())
75
+ return true;
76
+ // Someone holds it — break it only if it is too old to belong to a live call.
77
+ try {
78
+ if (Date.now() - statSync(lockPath).mtimeMs > staleMs) {
79
+ rmSync(lockPath, { force: true });
80
+ return take();
81
+ }
82
+ }
83
+ catch {
84
+ /* lost the race to break it, or it vanished — either way, do not own it */
85
+ }
86
+ return false;
87
+ }
88
+ /** Release a lock this process holds. Best-effort: never throws. */
89
+ export function releaseFileLock(lockPath) {
90
+ try {
91
+ rmSync(lockPath, { force: true });
92
+ }
93
+ catch {
94
+ /* a lock left behind expires by `staleMs` */
95
+ }
96
+ }
97
+ /**
98
+ * Run `fn` while holding `lockPath`, or — if the lock cannot be taken within
99
+ * `timeoutMs` — run it anyway and report `heldLock: false`.
100
+ *
101
+ * RUNNING ANYWAY IS THE POINT. Every caller here is a best-effort write on a
102
+ * routing path: refusing to persist because a lock is busy would trade a rare
103
+ * lost update for a certain lost learning. A contention timeout is a signal to
104
+ * the caller, not a failure.
105
+ */
106
+ export function withFileLockSync(lockPath, fn, opts = {}) {
107
+ const timeoutMs = opts.timeoutMs ?? DEFAULT_LOCK_TIMEOUT_MS;
108
+ const staleMs = opts.staleMs ?? DEFAULT_LOCK_STALE_MS;
109
+ const retryMs = opts.retryMs ?? DEFAULT_LOCK_RETRY_MS;
110
+ try {
111
+ mkdirSync(dirname(lockPath), { recursive: true });
112
+ }
113
+ catch {
114
+ /* the write itself will fail loudly enough if the dir is truly unusable */
115
+ }
116
+ const deadline = Date.now() + timeoutMs;
117
+ let heldLock = tryAcquireFileLock(lockPath, staleMs);
118
+ while (!heldLock && Date.now() < deadline) {
119
+ sleepSync(retryMs);
120
+ heldLock = tryAcquireFileLock(lockPath, staleMs);
121
+ }
122
+ try {
123
+ return { value: fn(), heldLock };
124
+ }
125
+ finally {
126
+ if (heldLock)
127
+ releaseFileLock(lockPath);
128
+ }
129
+ }
130
+ let atomicWriteSeq = 0;
131
+ /**
132
+ * Write `content` to `path` so that no reader can ever see a partial document:
133
+ * write a uniquely-named sibling, then `rename`.
134
+ *
135
+ * The unique name matters — a fixed `.tmp` lets two writers race on the temp
136
+ * file itself and publish each other's bytes. `rename` over an existing path is
137
+ * atomic on POSIX and on Windows (`MoveFileEx` with replace).
138
+ */
139
+ export function writeFileAtomicSync(path, content) {
140
+ const tmp = `${path}.tmp-${process.pid}-${(atomicWriteSeq += 1)}`;
141
+ try {
142
+ mkdirSync(dirname(path), { recursive: true });
143
+ writeFileSync(tmp, content, 'utf-8');
144
+ renameSync(tmp, path);
145
+ }
146
+ catch (err) {
147
+ try {
148
+ rmSync(tmp, { force: true });
149
+ }
150
+ catch {
151
+ /* nothing to clean up */
152
+ }
153
+ throw err;
154
+ }
155
+ }
156
+ /** Recursively sort object keys so two structurally equal values stringify identically. */
157
+ function sortForComparison(value) {
158
+ if (Array.isArray(value))
159
+ return value.map(sortForComparison);
160
+ if (value && typeof value === 'object') {
161
+ const out = {};
162
+ const src = value;
163
+ for (const key of Object.keys(src).sort())
164
+ out[key] = sortForComparison(src[key]);
165
+ return out;
166
+ }
167
+ return value;
168
+ }
169
+ /**
170
+ * Order-independent JSON for comparing two records. `JSON.stringify` depends on
171
+ * key insertion order, so two entries built by different code paths can be
172
+ * semantically identical and compare unequal — which would make a merge treat an
173
+ * untouched entry as a change and clobber a peer's learning.
174
+ */
175
+ export function stableJson(value) {
176
+ return JSON.stringify(sortForComparison(value));
177
+ }
178
+ //# sourceMappingURL=atomic-store.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"atomic-store.js","sourceRoot":"","sources":["../../src/utils/atomic-store.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,25 @@
1
+ /**
2
+ * Is an executable on PATH? ONE implementation, shared.
3
+ *
4
+ * WHY THIS FILE EXISTS. Two copies of this function already existed —
5
+ * `tools/modality/shared.ts` and `enterprise/vault.ts` — with identical bodies;
6
+ * the modality one even documents itself as "mirrors vault.ts binaryOnPath". The
7
+ * capability layer needs a third caller (a requirement pre-flight), so the
8
+ * duplication is resolved here rather than tripled.
9
+ *
10
+ * WHY `which`/`where` RATHER THAN A PATH SCAN. The OS resolver already handles
11
+ * PATHEXT, shell shims and `.cmd` wrappers. A hand-rolled `existsSync` scan
12
+ * silently disagrees with what the shell will ACTUALLY run, which is the wrong
13
+ * answer for a check whose whole job is to predict whether a command will work.
14
+ *
15
+ * MEMOIZED. OS tool presence cannot change mid-process, and this is consulted on
16
+ * every `Vault.open` (which every ConfigManager construction triggers) and on
17
+ * every capability readiness check, so one spawn per tool per process is enough.
18
+ */
19
+ /** True when `name` resolves on PATH. Never throws. */
20
+ export declare function binaryOnPath(name: string): boolean;
21
+ /** Which of `names` resolve on PATH. */
22
+ export declare function binariesOnPath(names: string[]): Record<string, boolean>;
23
+ /** Clear the memo — for test isolation, which is why it is exported. */
24
+ export declare function resetBinaryProbeCache(): void;
25
+ //# sourceMappingURL=binary-probe.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"binary-probe.d.ts","sourceRoot":"","sources":["../../src/utils/binary-probe.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;GAiBG;AAMH,uDAAuD;AACvD,wBAAgB,YAAY,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAalD;AAED,wCAAwC;AACxC,wBAAgB,cAAc,CAAC,KAAK,EAAE,MAAM,EAAE,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAIvE;AAED,wEAAwE;AACxE,wBAAgB,qBAAqB,IAAI,IAAI,CAE5C"}
@@ -0,0 +1,48 @@
1
+ /**
2
+ * Is an executable on PATH? ONE implementation, shared.
3
+ *
4
+ * WHY THIS FILE EXISTS. Two copies of this function already existed —
5
+ * `tools/modality/shared.ts` and `enterprise/vault.ts` — with identical bodies;
6
+ * the modality one even documents itself as "mirrors vault.ts binaryOnPath". The
7
+ * capability layer needs a third caller (a requirement pre-flight), so the
8
+ * duplication is resolved here rather than tripled.
9
+ *
10
+ * WHY `which`/`where` RATHER THAN A PATH SCAN. The OS resolver already handles
11
+ * PATHEXT, shell shims and `.cmd` wrappers. A hand-rolled `existsSync` scan
12
+ * silently disagrees with what the shell will ACTUALLY run, which is the wrong
13
+ * answer for a check whose whole job is to predict whether a command will work.
14
+ *
15
+ * MEMOIZED. OS tool presence cannot change mid-process, and this is consulted on
16
+ * every `Vault.open` (which every ConfigManager construction triggers) and on
17
+ * every capability readiness check, so one spawn per tool per process is enough.
18
+ */
19
+ import { execFileSync } from 'node:child_process';
20
+ const cache = new Map();
21
+ /** True when `name` resolves on PATH. Never throws. */
22
+ export function binaryOnPath(name) {
23
+ const cached = cache.get(name);
24
+ if (cached !== undefined)
25
+ return cached;
26
+ let found;
27
+ try {
28
+ execFileSync(process.platform === 'win32' ? 'where' : 'which', [name], { stdio: 'ignore' });
29
+ found = true;
30
+ }
31
+ catch {
32
+ found = false;
33
+ }
34
+ cache.set(name, found);
35
+ return found;
36
+ }
37
+ /** Which of `names` resolve on PATH. */
38
+ export function binariesOnPath(names) {
39
+ const out = {};
40
+ for (const n of names)
41
+ out[n] = binaryOnPath(n);
42
+ return out;
43
+ }
44
+ /** Clear the memo — for test isolation, which is why it is exported. */
45
+ export function resetBinaryProbeCache() {
46
+ cache.clear();
47
+ }
48
+ //# sourceMappingURL=binary-probe.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"binary-probe.js","sourceRoot":"","sources":["../../src/utils/binary-probe.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;GAiBG;AAEH,OAAO,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAElD,MAAM,KAAK,GAAG,IAAI,GAAG,EAAmB,CAAC;AAEzC,uDAAuD;AACvD,MAAM,UAAU,YAAY,CAAC,IAAY;IACvC,MAAM,MAAM,GAAG,KAAK,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;IAC/B,IAAI,MAAM,KAAK,SAAS;QAAE,OAAO,MAAM,CAAC;IAExC,IAAI,KAAc,CAAC;IACnB,IAAI,CAAC;QACH,YAAY,CAAC,OAAO,CAAC,QAAQ,KAAK,OAAO,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,OAAO,EAAE,CAAC,IAAI,CAAC,EAAE,EAAE,KAAK,EAAE,QAAQ,EAAE,CAAC,CAAC;QAC5F,KAAK,GAAG,IAAI,CAAC;IACf,CAAC;IAAC,MAAM,CAAC;QACP,KAAK,GAAG,KAAK,CAAC;IAChB,CAAC;IACD,KAAK,CAAC,GAAG,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC;IACvB,OAAO,KAAK,CAAC;AACf,CAAC;AAED,wCAAwC;AACxC,MAAM,UAAU,cAAc,CAAC,KAAe;IAC5C,MAAM,GAAG,GAA4B,EAAE,CAAC;IACxC,KAAK,MAAM,CAAC,IAAI,KAAK;QAAE,GAAG,CAAC,CAAC,CAAC,GAAG,YAAY,CAAC,CAAC,CAAC,CAAC;IAChD,OAAO,GAAG,CAAC;AACb,CAAC;AAED,wEAAwE;AACxE,MAAM,UAAU,qBAAqB;IACnC,KAAK,CAAC,KAAK,EAAE,CAAC;AAChB,CAAC"}
@@ -0,0 +1,50 @@
1
+ /**
2
+ * Path rules shared by the SURFACES that resolve a workspace (the dashboard's
3
+ * chat server) and the TOOLS that must respect one (the tool registry's
4
+ * `ask_user`, which adopts a folder the user names in a reply).
5
+ *
6
+ * It lives in `utils/` rather than next to either user because it has two, and
7
+ * a tool importing the dashboard would invert the dependency: `src/tools` is
8
+ * driven by the CLI, the SDK and the child agent too, none of which are the
9
+ * dashboard. The rules are pure string/filesystem questions, so a shared,
10
+ * dependency-free home is the honest one.
11
+ *
12
+ * See the Cluster G write-up in `docs/PLAN_MODEL_ROUTING_PARITY.md` for the
13
+ * measured failures these answer.
14
+ */
15
+ /**
16
+ * True when `p` exists and is a directory something can actually run in.
17
+ *
18
+ * The exists+isDirectory pair is deliberate: a configured path that has since
19
+ * been deleted, or one that points at a FILE, is not a workspace, and treating
20
+ * it as one is how a turn ends up scoped to nothing and reporting success.
21
+ */
22
+ export declare function isUsableDirectory(p: string | undefined): p is string;
23
+ /**
24
+ * Expand `~` and make the path absolute. Returns undefined for anything that is
25
+ * not a path we can act on: empty, a URL, or a RELATIVE path.
26
+ *
27
+ * A relative path is rejected on purpose and is the important case. Resolving
28
+ * it would require a base directory, and the only basis for choosing one is the
29
+ * process's own cwd — which is exactly the guess that produced the reported
30
+ * "it went to kuttaaddon": the dashboard was started from the home folder and
31
+ * read a checkout sitting there as the user's project.
32
+ */
33
+ export declare function normalizeWorkspacePath(raw: string): string | undefined;
34
+ /**
35
+ * The DIRECTORY the user named in their own message, if any.
36
+ *
37
+ * Deliberately narrow, and each restriction has a failure behind it:
38
+ * - ONLY an absolute path (or `~/…`) counts — see {@link normalizeWorkspacePath}.
39
+ * - The candidate must be an existing DIRECTORY. A path in a message is usually
40
+ * a FILE the user is talking about ("fix /Users/x/proj/src/app.ts"); adopting
41
+ * that file's folder would silently move the turn into a project the user
42
+ * merely mentioned.
43
+ * - Trailing sentence punctuation and wrapping quotes are trimmed, so
44
+ * "work in /Users/you/app." and '"/Users/you/app"' both resolve.
45
+ *
46
+ * With nothing else available, the user's own words do not get to relocate the
47
+ * turn by accident.
48
+ */
49
+ export declare function directoryFromMessage(message: string | undefined): string | undefined;
50
+ //# sourceMappingURL=workspace-path.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"workspace-path.d.ts","sourceRoot":"","sources":["../../src/utils/workspace-path.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AAMH;;;;;;GAMG;AACH,wBAAgB,iBAAiB,CAAC,CAAC,EAAE,MAAM,GAAG,SAAS,GAAG,CAAC,IAAI,MAAM,CAOpE;AAED;;;;;;;;;GASG;AACH,wBAAgB,sBAAsB,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS,CAMtE;AAED;;;;;;;;;;;;;;GAcG;AACH,wBAAgB,oBAAoB,CAAC,OAAO,EAAE,MAAM,GAAG,SAAS,GAAG,MAAM,GAAG,SAAS,CAYpF"}
@@ -0,0 +1,86 @@
1
+ /**
2
+ * Path rules shared by the SURFACES that resolve a workspace (the dashboard's
3
+ * chat server) and the TOOLS that must respect one (the tool registry's
4
+ * `ask_user`, which adopts a folder the user names in a reply).
5
+ *
6
+ * It lives in `utils/` rather than next to either user because it has two, and
7
+ * a tool importing the dashboard would invert the dependency: `src/tools` is
8
+ * driven by the CLI, the SDK and the child agent too, none of which are the
9
+ * dashboard. The rules are pure string/filesystem questions, so a shared,
10
+ * dependency-free home is the honest one.
11
+ *
12
+ * See the Cluster G write-up in `docs/PLAN_MODEL_ROUTING_PARITY.md` for the
13
+ * measured failures these answer.
14
+ */
15
+ import { existsSync, statSync } from 'node:fs';
16
+ import { homedir } from 'node:os';
17
+ import { isAbsolute, join, resolve } from 'node:path';
18
+ /**
19
+ * True when `p` exists and is a directory something can actually run in.
20
+ *
21
+ * The exists+isDirectory pair is deliberate: a configured path that has since
22
+ * been deleted, or one that points at a FILE, is not a workspace, and treating
23
+ * it as one is how a turn ends up scoped to nothing and reporting success.
24
+ */
25
+ export function isUsableDirectory(p) {
26
+ if (typeof p !== 'string' || !p.trim())
27
+ return false;
28
+ try {
29
+ return existsSync(p) && statSync(p).isDirectory();
30
+ }
31
+ catch {
32
+ return false;
33
+ }
34
+ }
35
+ /**
36
+ * Expand `~` and make the path absolute. Returns undefined for anything that is
37
+ * not a path we can act on: empty, a URL, or a RELATIVE path.
38
+ *
39
+ * A relative path is rejected on purpose and is the important case. Resolving
40
+ * it would require a base directory, and the only basis for choosing one is the
41
+ * process's own cwd — which is exactly the guess that produced the reported
42
+ * "it went to kuttaaddon": the dashboard was started from the home folder and
43
+ * read a checkout sitting there as the user's project.
44
+ */
45
+ export function normalizeWorkspacePath(raw) {
46
+ const t = raw.trim().replace(/^["'`]+|["'`]+$/g, '');
47
+ if (!t || /^[a-z][a-z0-9+.-]*:\/\//i.test(t))
48
+ return undefined;
49
+ if (t === '~')
50
+ return resolve(homedir());
51
+ if (t.startsWith('~/') || t.startsWith('~\\'))
52
+ return resolve(join(homedir(), t.slice(2)));
53
+ return isAbsolute(t) ? resolve(t) : undefined;
54
+ }
55
+ /**
56
+ * The DIRECTORY the user named in their own message, if any.
57
+ *
58
+ * Deliberately narrow, and each restriction has a failure behind it:
59
+ * - ONLY an absolute path (or `~/…`) counts — see {@link normalizeWorkspacePath}.
60
+ * - The candidate must be an existing DIRECTORY. A path in a message is usually
61
+ * a FILE the user is talking about ("fix /Users/x/proj/src/app.ts"); adopting
62
+ * that file's folder would silently move the turn into a project the user
63
+ * merely mentioned.
64
+ * - Trailing sentence punctuation and wrapping quotes are trimmed, so
65
+ * "work in /Users/you/app." and '"/Users/you/app"' both resolve.
66
+ *
67
+ * With nothing else available, the user's own words do not get to relocate the
68
+ * turn by accident.
69
+ */
70
+ export function directoryFromMessage(message) {
71
+ if (typeof message !== 'string' || !message)
72
+ return undefined;
73
+ // Path-ish tokens: start at `~`, `/`, or a drive letter; stop at whitespace
74
+ // and at the delimiters that end a sentence, a clause or an inline-code span.
75
+ const candidates = message.match(/(?:~[\\/]|\/|[A-Za-z]:[\\/])[^\s"'`<>|]*/g) ?? [];
76
+ for (const raw of candidates) {
77
+ const cleaned = raw.replace(/[.,;:!?)\]}]+$/, '');
78
+ if (!cleaned)
79
+ continue;
80
+ const abs = normalizeWorkspacePath(cleaned);
81
+ if (abs && isUsableDirectory(abs))
82
+ return abs;
83
+ }
84
+ return undefined;
85
+ }
86
+ //# sourceMappingURL=workspace-path.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"workspace-path.js","sourceRoot":"","sources":["../../src/utils/workspace-path.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AAEH,OAAO,EAAE,UAAU,EAAE,QAAQ,EAAE,MAAM,SAAS,CAAC;AAC/C,OAAO,EAAE,OAAO,EAAE,MAAM,SAAS,CAAC;AAClC,OAAO,EAAE,UAAU,EAAE,IAAI,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAEtD;;;;;;GAMG;AACH,MAAM,UAAU,iBAAiB,CAAC,CAAqB;IACrD,IAAI,OAAO,CAAC,KAAK,QAAQ,IAAI,CAAC,CAAC,CAAC,IAAI,EAAE;QAAE,OAAO,KAAK,CAAC;IACrD,IAAI,CAAC;QACH,OAAO,UAAU,CAAC,CAAC,CAAC,IAAI,QAAQ,CAAC,CAAC,CAAC,CAAC,WAAW,EAAE,CAAC;IACpD,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,KAAK,CAAC;IACf,CAAC;AACH,CAAC;AAED;;;;;;;;;GASG;AACH,MAAM,UAAU,sBAAsB,CAAC,GAAW;IAChD,MAAM,CAAC,GAAG,GAAG,CAAC,IAAI,EAAE,CAAC,OAAO,CAAC,kBAAkB,EAAE,EAAE,CAAC,CAAC;IACrD,IAAI,CAAC,CAAC,IAAI,0BAA0B,CAAC,IAAI,CAAC,CAAC,CAAC;QAAE,OAAO,SAAS,CAAC;IAC/D,IAAI,CAAC,KAAK,GAAG;QAAE,OAAO,OAAO,CAAC,OAAO,EAAE,CAAC,CAAC;IACzC,IAAI,CAAC,CAAC,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,UAAU,CAAC,KAAK,CAAC;QAAE,OAAO,OAAO,CAAC,IAAI,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;IAC3F,OAAO,UAAU,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;AAChD,CAAC;AAED;;;;;;;;;;;;;;GAcG;AACH,MAAM,UAAU,oBAAoB,CAAC,OAA2B;IAC9D,IAAI,OAAO,OAAO,KAAK,QAAQ,IAAI,CAAC,OAAO;QAAE,OAAO,SAAS,CAAC;IAC9D,4EAA4E;IAC5E,8EAA8E;IAC9E,MAAM,UAAU,GAAG,OAAO,CAAC,KAAK,CAAC,2CAA2C,CAAC,IAAI,EAAE,CAAC;IACpF,KAAK,MAAM,GAAG,IAAI,UAAU,EAAE,CAAC;QAC7B,MAAM,OAAO,GAAG,GAAG,CAAC,OAAO,CAAC,gBAAgB,EAAE,EAAE,CAAC,CAAC;QAClD,IAAI,CAAC,OAAO;YAAE,SAAS;QACvB,MAAM,GAAG,GAAG,sBAAsB,CAAC,OAAO,CAAC,CAAC;QAC5C,IAAI,GAAG,IAAI,iBAAiB,CAAC,GAAG,CAAC;YAAE,OAAO,GAAG,CAAC;IAChD,CAAC;IACD,OAAO,SAAS,CAAC;AACnB,CAAC"}
@@ -39,6 +39,12 @@ export interface ChatEngine {
39
39
  projectContext?: string;
40
40
  /** P4 — attached project dir; the engine recalls its sessions + facts. */
41
41
  projectPath?: string;
42
+ /**
43
+ * Cluster G — this turn has NO workspace. Carried into the tool context so
44
+ * a write asks WHERE the file goes rather than dropping it in the
45
+ * dashboard process's own cwd (see `unscopedWriteRefusal`).
46
+ */
47
+ unscopedWorkspace?: boolean;
42
48
  /**
43
49
  * Session 3 — channel/format POLICY merged into the STABLE (system)
44
50
  * layer instead of being re-injected into every user turn. The gateway
@@ -532,6 +538,8 @@ export declare class ChatConsole {
532
538
  model?: string;
533
539
  projectContext?: string;
534
540
  projectPath?: string;
541
+ /** Cluster G — no workspace for this turn: writes must ask where. */
542
+ unscopedWorkspace?: boolean;
535
543
  attachments?: ChatAttachment[];
536
544
  recordTurn?: boolean;
537
545
  /** WS1 — a finding was recorded this turn, with the gate's verdict. */
@@ -582,6 +590,22 @@ export declare class ChatConsole {
582
590
  private planStoreFor;
583
591
  /** Drop a session's in-memory AND on-disk plan (new conversation / delete). */
584
592
  private clearPlan;
593
+ /**
594
+ * The live session grants across this process's sessions (Bundle 37a).
595
+ *
596
+ * The grant is keyed to the session's plan store, so the console — which owns
597
+ * every session's store — is the one place that can see them all. A session
598
+ * with no grant, or an expired one, simply does not appear (an expired grant
599
+ * must never be shown as live).
600
+ */
601
+ listSessionGrants(): Array<{
602
+ sessionId: string;
603
+ categories: string[];
604
+ grantedAt: number;
605
+ expiresAt: number;
606
+ }>;
607
+ /** End a session's grant — the user asked to be asked again (Bundle 37a). */
608
+ revokeSessionGrant(sessionId: string): boolean;
585
609
  /** Forget a session's history (new conversation) + drop its pending questions. */
586
610
  reset(sessionId: string): void;
587
611
  }
@@ -1 +1 @@
1
- {"version":3,"file":"chat-console.d.ts","sourceRoot":"","sources":["../../src/web-dashboard/chat-console.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"chat-console.d.ts","sourceRoot":"","sources":["../../src/web-dashboard/chat-console.ts"],"names":[],"mappings":"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"}
@@ -19,6 +19,7 @@ import { dirname } from 'node:path';
19
19
  import { isSuggestedFollowup, normalizeFollowups } from '../tools/followup-utils.js';
20
20
  import { looksLikeReasoningLeakReply, stripLeadingReasoningTrace, stripToolCallArtifacts, } from '../inference/tool-call-utils.js';
21
21
  import { createPersistentPlanStore, planFilePath, writePlanFile, } from '../tools/plan-store.js';
22
+ import { getSessionGrant, clearSessionGrant } from '../learning/session-grant.js';
22
23
  /** Per-session per-message limits (the CLI has no hard cap; bound the server). */
23
24
  const MAX_MESSAGE_LENGTH = 8000;
24
25
  const DEFAULT_MAX_TURNS = 40;
@@ -369,6 +370,12 @@ export class ChatConsole {
369
370
  // P4 — the attached project dir triggers the engine's per-turn recall
370
371
  // of that project's prior sessions + facts.
371
372
  ...(opts.projectPath ? { projectPath: opts.projectPath } : {}),
373
+ // Cluster G — this turn has NO workspace (nothing attached, nothing
374
+ // named in the message, no configured default). The engine carries the
375
+ // flag into the tool context so a write asks WHERE to put the file
376
+ // instead of landing in the dashboard process's own cwd, which belongs
377
+ // to nobody and used to be invisible to the user.
378
+ ...(opts.unscopedWorkspace ? { unscopedWorkspace: true } : {}),
372
379
  // P4 — stream answer tokens to the GUI (the typewriter bubble).
373
380
  onToken: (text) => emitTurn({ kind: 'token', text }),
374
381
  history: history.map((h) => ({ role: h.role, content: h.content })),
@@ -686,6 +693,37 @@ export class ChatConsole {
686
693
  this.planStores.delete(sessionId);
687
694
  writePlanFile(planFilePath(sessionId), null);
688
695
  }
696
+ /**
697
+ * The live session grants across this process's sessions (Bundle 37a).
698
+ *
699
+ * The grant is keyed to the session's plan store, so the console — which owns
700
+ * every session's store — is the one place that can see them all. A session
701
+ * with no grant, or an expired one, simply does not appear (an expired grant
702
+ * must never be shown as live).
703
+ */
704
+ listSessionGrants() {
705
+ const out = [];
706
+ for (const [sessionId, store] of this.planStores) {
707
+ const grant = getSessionGrant(store);
708
+ if (grant) {
709
+ out.push({
710
+ sessionId,
711
+ categories: [...grant.categories],
712
+ grantedAt: grant.grantedAt,
713
+ expiresAt: grant.expiresAt,
714
+ });
715
+ }
716
+ }
717
+ return out.sort((a, b) => b.grantedAt - a.grantedAt);
718
+ }
719
+ /** End a session's grant — the user asked to be asked again (Bundle 37a). */
720
+ revokeSessionGrant(sessionId) {
721
+ const store = this.planStores.get(sessionId);
722
+ if (!store)
723
+ return false;
724
+ clearSessionGrant(store);
725
+ return true;
726
+ }
689
727
  /** Forget a session's history (new conversation) + drop its pending questions. */
690
728
  reset(sessionId) {
691
729
  for (const [id, p] of this.pendingQuestions) {