agent-nuvira 2.7.3 → 3.0.0

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 (366) hide show
  1. package/dist/agents/agents/writer-tool-calling.d.ts +14 -0
  2. package/dist/agents/agents/writer-tool-calling.d.ts.map +1 -1
  3. package/dist/agents/agents/writer-tool-calling.js +20 -0
  4. package/dist/agents/agents/writer-tool-calling.js.map +1 -1
  5. package/dist/agents/agents/writer.d.ts.map +1 -1
  6. package/dist/agents/agents/writer.js +15 -4
  7. package/dist/agents/agents/writer.js.map +1 -1
  8. package/dist/agents/edit-module.d.ts +7 -0
  9. package/dist/agents/edit-module.d.ts.map +1 -1
  10. package/dist/agents/edit-module.js +21 -6
  11. package/dist/agents/edit-module.js.map +1 -1
  12. package/dist/agents/orchestrator.d.ts +40 -0
  13. package/dist/agents/orchestrator.d.ts.map +1 -1
  14. package/dist/agents/orchestrator.js +116 -27
  15. package/dist/agents/orchestrator.js.map +1 -1
  16. package/dist/agents/tool-calling-agent.d.ts +19 -0
  17. package/dist/agents/tool-calling-agent.d.ts.map +1 -1
  18. package/dist/agents/tool-calling-agent.js +42 -2
  19. package/dist/agents/tool-calling-agent.js.map +1 -1
  20. package/dist/cli/chat.d.ts +55 -1
  21. package/dist/cli/chat.d.ts.map +1 -1
  22. package/dist/cli/chat.js +239 -63
  23. package/dist/cli/chat.js.map +1 -1
  24. package/dist/cli/cli-program.d.ts +6 -0
  25. package/dist/cli/cli-program.d.ts.map +1 -0
  26. package/dist/cli/cli-program.js +222 -0
  27. package/dist/cli/cli-program.js.map +1 -0
  28. package/dist/cli/edit.d.ts.map +1 -1
  29. package/dist/cli/edit.js +18 -3
  30. package/dist/cli/edit.js.map +1 -1
  31. package/dist/cli/execute.d.ts.map +1 -1
  32. package/dist/cli/execute.js +29 -5
  33. package/dist/cli/execute.js.map +1 -1
  34. package/dist/cli/failover-runner.d.ts +13 -0
  35. package/dist/cli/failover-runner.d.ts.map +1 -1
  36. package/dist/cli/failover-runner.js +11 -0
  37. package/dist/cli/failover-runner.js.map +1 -1
  38. package/dist/cli/gateway.d.ts +16 -0
  39. package/dist/cli/gateway.d.ts.map +1 -1
  40. package/dist/cli/gateway.js +108 -2
  41. package/dist/cli/gateway.js.map +1 -1
  42. package/dist/cli/loop-executor.d.ts.map +1 -1
  43. package/dist/cli/loop-executor.js +245 -12
  44. package/dist/cli/loop-executor.js.map +1 -1
  45. package/dist/cli/plan.d.ts.map +1 -1
  46. package/dist/cli/plan.js +20 -6
  47. package/dist/cli/plan.js.map +1 -1
  48. package/dist/cli/process-control.d.ts +10 -0
  49. package/dist/cli/process-control.d.ts.map +1 -1
  50. package/dist/cli/process-control.js +73 -7
  51. package/dist/cli/process-control.js.map +1 -1
  52. package/dist/cli/router.d.ts +16 -5
  53. package/dist/cli/router.d.ts.map +1 -1
  54. package/dist/cli/router.js +31 -206
  55. package/dist/cli/router.js.map +1 -1
  56. package/dist/config/paths.d.ts +23 -0
  57. package/dist/config/paths.d.ts.map +1 -1
  58. package/dist/config/paths.js +30 -0
  59. package/dist/config/paths.js.map +1 -1
  60. package/dist/config/provider-env.d.ts +37 -0
  61. package/dist/config/provider-env.d.ts.map +1 -0
  62. package/dist/config/provider-env.js +86 -0
  63. package/dist/config/provider-env.js.map +1 -0
  64. package/dist/context/history.d.ts.map +1 -1
  65. package/dist/context/history.js +24 -8
  66. package/dist/context/history.js.map +1 -1
  67. package/dist/context/session-recall.d.ts +30 -0
  68. package/dist/context/session-recall.d.ts.map +1 -1
  69. package/dist/context/session-recall.js +61 -0
  70. package/dist/context/session-recall.js.map +1 -1
  71. package/dist/file.js +0 -1
  72. package/dist/file.js.map +1 -1
  73. package/dist/gateway/adapters.d.ts +10 -0
  74. package/dist/gateway/adapters.d.ts.map +1 -1
  75. package/dist/gateway/adapters.js +4 -1
  76. package/dist/gateway/adapters.js.map +1 -1
  77. package/dist/gateway/dedup.d.ts +105 -0
  78. package/dist/gateway/dedup.d.ts.map +1 -0
  79. package/dist/gateway/dedup.js +160 -0
  80. package/dist/gateway/dedup.js.map +1 -0
  81. package/dist/gateway/heartbeat.d.ts +99 -0
  82. package/dist/gateway/heartbeat.d.ts.map +1 -0
  83. package/dist/gateway/heartbeat.js +122 -0
  84. package/dist/gateway/heartbeat.js.map +1 -0
  85. package/dist/gateway/inbox.d.ts +14 -1
  86. package/dist/gateway/inbox.d.ts.map +1 -1
  87. package/dist/gateway/inbox.js.map +1 -1
  88. package/dist/gateway/platform-config.d.ts +5 -0
  89. package/dist/gateway/platform-config.d.ts.map +1 -1
  90. package/dist/gateway/platform-config.js +8 -13
  91. package/dist/gateway/platform-config.js.map +1 -1
  92. package/dist/gateway/registry.d.ts +47 -0
  93. package/dist/gateway/registry.d.ts.map +1 -1
  94. package/dist/gateway/registry.js +227 -21
  95. package/dist/gateway/registry.js.map +1 -1
  96. package/dist/gateway/whatsapp/baileys-bridge.d.ts +11 -1
  97. package/dist/gateway/whatsapp/baileys-bridge.d.ts.map +1 -1
  98. package/dist/gateway/whatsapp/baileys-bridge.js +64 -1
  99. package/dist/gateway/whatsapp/baileys-bridge.js.map +1 -1
  100. package/dist/gateway/whatsapp/bridge.d.ts +4 -2
  101. package/dist/gateway/whatsapp/bridge.d.ts.map +1 -1
  102. package/dist/gateway/whatsapp/bridge.js.map +1 -1
  103. package/dist/index.js +1 -1
  104. package/dist/index.js.map +1 -1
  105. package/dist/inference/factory.d.ts +16 -0
  106. package/dist/inference/factory.d.ts.map +1 -1
  107. package/dist/inference/factory.js +42 -0
  108. package/dist/inference/factory.js.map +1 -1
  109. package/dist/inference/gemini-adapter.d.ts.map +1 -1
  110. package/dist/inference/gemini-adapter.js +3 -0
  111. package/dist/inference/gemini-adapter.js.map +1 -1
  112. package/dist/inference/interface.d.ts +12 -0
  113. package/dist/inference/interface.d.ts.map +1 -1
  114. package/dist/inference/local-adapter.d.ts +2 -0
  115. package/dist/inference/local-adapter.d.ts.map +1 -1
  116. package/dist/inference/local-adapter.js +36 -5
  117. package/dist/inference/local-adapter.js.map +1 -1
  118. package/dist/inference/native-tools.d.ts +8 -0
  119. package/dist/inference/native-tools.d.ts.map +1 -1
  120. package/dist/inference/native-tools.js +14 -3
  121. package/dist/inference/native-tools.js.map +1 -1
  122. package/dist/inference/tool-call-utils.d.ts +66 -7
  123. package/dist/inference/tool-call-utils.d.ts.map +1 -1
  124. package/dist/inference/tool-call-utils.js +134 -13
  125. package/dist/inference/tool-call-utils.js.map +1 -1
  126. package/dist/learning/auto-router.d.ts.map +1 -1
  127. package/dist/learning/auto-router.js +90 -5
  128. package/dist/learning/auto-router.js.map +1 -1
  129. package/dist/learning/context-budget.d.ts +133 -0
  130. package/dist/learning/context-budget.d.ts.map +1 -0
  131. package/dist/learning/context-budget.js +196 -0
  132. package/dist/learning/context-budget.js.map +1 -0
  133. package/dist/learning/cost-tracker.d.ts.map +1 -1
  134. package/dist/learning/cost-tracker.js +20 -8
  135. package/dist/learning/cost-tracker.js.map +1 -1
  136. package/dist/learning/eval-framework.d.ts.map +1 -1
  137. package/dist/learning/eval-framework.js +6 -2
  138. package/dist/learning/eval-framework.js.map +1 -1
  139. package/dist/learning/failure-bookkeeping.d.ts +19 -0
  140. package/dist/learning/failure-bookkeeping.d.ts.map +1 -1
  141. package/dist/learning/failure-bookkeeping.js +67 -2
  142. package/dist/learning/failure-bookkeeping.js.map +1 -1
  143. package/dist/learning/feedback.d.ts.map +1 -1
  144. package/dist/learning/feedback.js +19 -8
  145. package/dist/learning/feedback.js.map +1 -1
  146. package/dist/learning/model-harness.d.ts +76 -0
  147. package/dist/learning/model-harness.d.ts.map +1 -0
  148. package/dist/learning/model-harness.js +119 -0
  149. package/dist/learning/model-harness.js.map +1 -0
  150. package/dist/learning/model-selection.d.ts +15 -0
  151. package/dist/learning/model-selection.d.ts.map +1 -1
  152. package/dist/learning/model-selection.js +27 -1
  153. package/dist/learning/model-selection.js.map +1 -1
  154. package/dist/learning/provider-fallback.d.ts +12 -0
  155. package/dist/learning/provider-fallback.d.ts.map +1 -1
  156. package/dist/learning/provider-fallback.js +74 -0
  157. package/dist/learning/provider-fallback.js.map +1 -1
  158. package/dist/learning/provider-revival.d.ts +106 -0
  159. package/dist/learning/provider-revival.d.ts.map +1 -0
  160. package/dist/learning/provider-revival.js +154 -0
  161. package/dist/learning/provider-revival.js.map +1 -0
  162. package/dist/learning/resilient-call.d.ts.map +1 -1
  163. package/dist/learning/resilient-call.js +48 -3
  164. package/dist/learning/resilient-call.js.map +1 -1
  165. package/dist/nlu/conversation-gate.d.ts +37 -0
  166. package/dist/nlu/conversation-gate.d.ts.map +1 -1
  167. package/dist/nlu/conversation-gate.js +49 -0
  168. package/dist/nlu/conversation-gate.js.map +1 -1
  169. package/dist/nlu/schema.d.ts +2 -2
  170. package/dist/observability/dag-bridge.d.ts +69 -0
  171. package/dist/observability/dag-bridge.d.ts.map +1 -0
  172. package/dist/observability/dag-bridge.js +56 -0
  173. package/dist/observability/dag-bridge.js.map +1 -0
  174. package/dist/observability/event-bus.d.ts +5 -10
  175. package/dist/observability/event-bus.d.ts.map +1 -1
  176. package/dist/observability/event-bus.js +10 -42
  177. package/dist/observability/event-bus.js.map +1 -1
  178. package/dist/skills/execution-audit.d.ts.map +1 -1
  179. package/dist/skills/execution-audit.js +17 -5
  180. package/dist/skills/execution-audit.js.map +1 -1
  181. package/dist/skills/sandbox-executor.d.ts +12 -1
  182. package/dist/skills/sandbox-executor.d.ts.map +1 -1
  183. package/dist/skills/sandbox-executor.js +28 -6
  184. package/dist/skills/sandbox-executor.js.map +1 -1
  185. package/dist/skills/secret-capture.d.ts +45 -1
  186. package/dist/skills/secret-capture.d.ts.map +1 -1
  187. package/dist/skills/secret-capture.js +82 -19
  188. package/dist/skills/secret-capture.js.map +1 -1
  189. package/dist/skills/skill-env-inventory.d.ts +79 -0
  190. package/dist/skills/skill-env-inventory.d.ts.map +1 -0
  191. package/dist/skills/skill-env-inventory.js +167 -0
  192. package/dist/skills/skill-env-inventory.js.map +1 -0
  193. package/dist/skills/skill-executor.d.ts +2 -0
  194. package/dist/skills/skill-executor.d.ts.map +1 -1
  195. package/dist/skills/skill-executor.js +19 -24
  196. package/dist/skills/skill-executor.js.map +1 -1
  197. package/dist/tools/ask-user.d.ts +14 -1
  198. package/dist/tools/ask-user.d.ts.map +1 -1
  199. package/dist/tools/ask-user.js +25 -1
  200. package/dist/tools/ask-user.js.map +1 -1
  201. package/dist/tools/followup-utils.d.ts +64 -0
  202. package/dist/tools/followup-utils.d.ts.map +1 -0
  203. package/dist/tools/followup-utils.js +158 -0
  204. package/dist/tools/followup-utils.js.map +1 -0
  205. package/dist/tools/memory-tools.d.ts +35 -0
  206. package/dist/tools/memory-tools.d.ts.map +1 -1
  207. package/dist/tools/memory-tools.js +76 -0
  208. package/dist/tools/memory-tools.js.map +1 -1
  209. package/dist/tools/pipeline-tool.d.ts.map +1 -1
  210. package/dist/tools/pipeline-tool.js +8 -3
  211. package/dist/tools/pipeline-tool.js.map +1 -1
  212. package/dist/tools/registry.d.ts +25 -12
  213. package/dist/tools/registry.d.ts.map +1 -1
  214. package/dist/tools/registry.js +31 -6
  215. package/dist/tools/registry.js.map +1 -1
  216. package/dist/tools/skill-tool.d.ts.map +1 -1
  217. package/dist/tools/skill-tool.js +52 -5
  218. package/dist/tools/skill-tool.js.map +1 -1
  219. package/dist/tools/tool-loop.d.ts +63 -1
  220. package/dist/tools/tool-loop.d.ts.map +1 -1
  221. package/dist/tools/tool-loop.js +305 -66
  222. package/dist/tools/tool-loop.js.map +1 -1
  223. package/dist/tools/toolsets.d.ts +19 -3
  224. package/dist/tools/toolsets.d.ts.map +1 -1
  225. package/dist/tools/toolsets.js +21 -5
  226. package/dist/tools/toolsets.js.map +1 -1
  227. package/dist/utils/env.d.ts.map +1 -1
  228. package/dist/utils/env.js +9 -13
  229. package/dist/utils/env.js.map +1 -1
  230. package/dist/web-dashboard/chat-console.d.ts +13 -1
  231. package/dist/web-dashboard/chat-console.d.ts.map +1 -1
  232. package/dist/web-dashboard/chat-console.js +16 -2
  233. package/dist/web-dashboard/chat-console.js.map +1 -1
  234. package/dist/web-dashboard/hub-data.d.ts +2 -0
  235. package/dist/web-dashboard/hub-data.d.ts.map +1 -1
  236. package/dist/web-dashboard/hub-data.js +4 -0
  237. package/dist/web-dashboard/hub-data.js.map +1 -1
  238. package/dist/web-dashboard/server.d.ts +6 -0
  239. package/dist/web-dashboard/server.d.ts.map +1 -1
  240. package/dist/web-dashboard/server.js +192 -3
  241. package/dist/web-dashboard/server.js.map +1 -1
  242. package/dist/web-dashboard/src/types.d.ts +31 -1
  243. package/dist/web-dashboard/src/types.d.ts.map +1 -1
  244. package/package.json +11 -1
  245. package/src/web-dashboard/public/assets/index-56yPnN_m.js +207 -0
  246. package/src/web-dashboard/public/assets/index-56yPnN_m.js.map +1 -0
  247. package/src/web-dashboard/public/assets/{index-C507EUWf.css → index-Cyd6tIew.css} +1 -1
  248. package/src/web-dashboard/public/index.html +2 -2
  249. package/dist/example.d.ts +0 -1
  250. package/dist/example.d.ts.map +0 -1
  251. package/dist/example.js +0 -3
  252. package/dist/example.js.map +0 -1
  253. package/dist/fresh.d.ts +0 -2
  254. package/dist/fresh.d.ts.map +0 -1
  255. package/dist/fresh.js +0 -2
  256. package/dist/fresh.js.map +0 -1
  257. package/dist/mcp/mcp-dashboard-oauth.d.ts +0 -94
  258. package/dist/mcp/mcp-dashboard-oauth.d.ts.map +0 -1
  259. package/dist/mcp/mcp-dashboard-oauth.js +0 -140
  260. package/dist/mcp/mcp-dashboard-oauth.js.map +0 -1
  261. package/dist/memory/background-sync.d.ts +0 -107
  262. package/dist/memory/background-sync.d.ts.map +0 -1
  263. package/dist/memory/background-sync.js +0 -242
  264. package/dist/memory/background-sync.js.map +0 -1
  265. package/dist/memory/cross-session.d.ts +0 -68
  266. package/dist/memory/cross-session.d.ts.map +0 -1
  267. package/dist/memory/cross-session.js +0 -153
  268. package/dist/memory/cross-session.js.map +0 -1
  269. package/dist/memory/drift-detector.d.ts +0 -76
  270. package/dist/memory/drift-detector.d.ts.map +0 -1
  271. package/dist/memory/drift-detector.js +0 -216
  272. package/dist/memory/drift-detector.js.map +0 -1
  273. package/dist/memory/enhanced-manager.d.ts +0 -105
  274. package/dist/memory/enhanced-manager.d.ts.map +0 -1
  275. package/dist/memory/enhanced-manager.js +0 -280
  276. package/dist/memory/enhanced-manager.js.map +0 -1
  277. package/dist/memory/session-extraction.d.ts +0 -93
  278. package/dist/memory/session-extraction.d.ts.map +0 -1
  279. package/dist/memory/session-extraction.js +0 -290
  280. package/dist/memory/session-extraction.js.map +0 -1
  281. package/dist/memory/sqlite-store.d.ts +0 -208
  282. package/dist/memory/sqlite-store.d.ts.map +0 -1
  283. package/dist/memory/sqlite-store.js +0 -556
  284. package/dist/memory/sqlite-store.js.map +0 -1
  285. package/dist/skills/daytona-executor.d.ts +0 -78
  286. package/dist/skills/daytona-executor.d.ts.map +0 -1
  287. package/dist/skills/daytona-executor.js +0 -256
  288. package/dist/skills/daytona-executor.js.map +0 -1
  289. package/dist/skills/modal-executor.d.ts +0 -81
  290. package/dist/skills/modal-executor.d.ts.map +0 -1
  291. package/dist/skills/modal-executor.js +0 -285
  292. package/dist/skills/modal-executor.js.map +0 -1
  293. package/dist/sync/inventory.d.ts +0 -1
  294. package/dist/sync/inventory.d.ts.map +0 -1
  295. package/dist/sync/inventory.js +0 -3
  296. package/dist/sync/inventory.js.map +0 -1
  297. package/dist/sync/validate.d.ts +0 -1
  298. package/dist/sync/validate.d.ts.map +0 -1
  299. package/dist/sync/validate.js +0 -3
  300. package/dist/sync/validate.js.map +0 -1
  301. package/dist/test.d.ts +0 -2
  302. package/dist/test.d.ts.map +0 -1
  303. package/dist/test.js +0 -3
  304. package/dist/test.js.map +0 -1
  305. package/dist/tools/browser-tool.d.ts +0 -206
  306. package/dist/tools/browser-tool.d.ts.map +0 -1
  307. package/dist/tools/browser-tool.js +0 -726
  308. package/dist/tools/browser-tool.js.map +0 -1
  309. package/dist/tools/delegate-tool.d.ts +0 -109
  310. package/dist/tools/delegate-tool.d.ts.map +0 -1
  311. package/dist/tools/delegate-tool.js +0 -185
  312. package/dist/tools/delegate-tool.js.map +0 -1
  313. package/dist/tools/delegation-state.d.ts +0 -87
  314. package/dist/tools/delegation-state.d.ts.map +0 -1
  315. package/dist/tools/delegation-state.js +0 -278
  316. package/dist/tools/delegation-state.js.map +0 -1
  317. package/dist/tools/desktop-ui.d.ts +0 -148
  318. package/dist/tools/desktop-ui.d.ts.map +0 -1
  319. package/dist/tools/desktop-ui.js +0 -486
  320. package/dist/tools/desktop-ui.js.map +0 -1
  321. package/dist/tools/image-video-tool.d.ts +0 -88
  322. package/dist/tools/image-video-tool.d.ts.map +0 -1
  323. package/dist/tools/image-video-tool.js +0 -276
  324. package/dist/tools/image-video-tool.js.map +0 -1
  325. package/dist/tools/kanban-cron-tools.d.ts +0 -92
  326. package/dist/tools/kanban-cron-tools.d.ts.map +0 -1
  327. package/dist/tools/kanban-cron-tools.js +0 -197
  328. package/dist/tools/kanban-cron-tools.js.map +0 -1
  329. package/dist/tools/messaging-tool.d.ts +0 -127
  330. package/dist/tools/messaging-tool.d.ts.map +0 -1
  331. package/dist/tools/messaging-tool.js +0 -314
  332. package/dist/tools/messaging-tool.js.map +0 -1
  333. package/dist/tools/modality/generic-caller.d.ts +0 -43
  334. package/dist/tools/modality/generic-caller.d.ts.map +0 -1
  335. package/dist/tools/modality/generic-caller.js +0 -254
  336. package/dist/tools/modality/generic-caller.js.map +0 -1
  337. package/dist/tools/modality/modality-catalog.d.ts +0 -134
  338. package/dist/tools/modality/modality-catalog.d.ts.map +0 -1
  339. package/dist/tools/modality/modality-catalog.js +0 -445
  340. package/dist/tools/modality/modality-catalog.js.map +0 -1
  341. package/dist/tools/modality/tool-router.d.ts +0 -81
  342. package/dist/tools/modality/tool-router.d.ts.map +0 -1
  343. package/dist/tools/modality/tool-router.js +0 -84
  344. package/dist/tools/modality/tool-router.js.map +0 -1
  345. package/dist/tools/security-tools.d.ts +0 -107
  346. package/dist/tools/security-tools.d.ts.map +0 -1
  347. package/dist/tools/security-tools.js +0 -264
  348. package/dist/tools/security-tools.js.map +0 -1
  349. package/dist/tools/ssh-tool.d.ts +0 -130
  350. package/dist/tools/ssh-tool.d.ts.map +0 -1
  351. package/dist/tools/ssh-tool.js +0 -328
  352. package/dist/tools/ssh-tool.js.map +0 -1
  353. package/dist/tools/tts-tool.d.ts +0 -91
  354. package/dist/tools/tts-tool.d.ts.map +0 -1
  355. package/dist/tools/tts-tool.js +0 -406
  356. package/dist/tools/tts-tool.js.map +0 -1
  357. package/dist/utils/shell-detection.d.ts +0 -124
  358. package/dist/utils/shell-detection.d.ts.map +0 -1
  359. package/dist/utils/shell-detection.js +0 -305
  360. package/dist/utils/shell-detection.js.map +0 -1
  361. package/dist/utils/windows-paths.d.ts +0 -185
  362. package/dist/utils/windows-paths.d.ts.map +0 -1
  363. package/dist/utils/windows-paths.js +0 -472
  364. package/dist/utils/windows-paths.js.map +0 -1
  365. package/src/web-dashboard/public/assets/index-C4frng1Q.js +0 -207
  366. package/src/web-dashboard/public/assets/index-C4frng1Q.js.map +0 -1
@@ -16,6 +16,7 @@ import { join, extname, dirname, basename, resolve, isAbsolute } from 'node:path
16
16
  import { fileURLToPath } from 'node:url';
17
17
  import { homedir } from 'node:os';
18
18
  import { parseRbacUsers } from '../enterprise/rbac.js';
19
+ import { registerDagHandlers } from '../observability/dag-bridge.js';
19
20
  import { resolveBuffConfigDir, resolveBuffConfigPath, resolveNuviraHome } from '../config/paths.js';
20
21
  import { loadEnv } from '../utils/env.js';
21
22
  import { ConfigManager } from '../config/manager.js';
@@ -563,6 +564,20 @@ export function resetDAG() {
563
564
  activeLoopTurn = null;
564
565
  broadcastDAG();
565
566
  }
567
+ // ─── Dependency inversion: publish the DAG API to producers ────────────────
568
+ // `observability/event-bus.ts` (imported by nearly everything) and
569
+ // `agents/orchestrator.ts` need to write this graph, but they must NOT import
570
+ // this module: doing so put the web layer in the agent's dependency closure and
571
+ // created an import cycle (they used `await import()` to dodge it, which still
572
+ // loaded 270 KB of dashboard in every CLI run). Instead they import the tiny
573
+ // `observability/dag-bridge.ts`, and this module registers the real
574
+ // implementation — the composition-root pattern, in the direction that keeps
575
+ // load order sane.
576
+ registerDagHandlers({
577
+ pushDAGUpdate: (update) => pushDAGUpdate(update),
578
+ updateDAGNode: (nodeId, patch) => updateDAGNode(nodeId, patch),
579
+ resetDAG: () => resetDAG(),
580
+ });
566
581
  /** Broadcast current DAG state to all SSE clients */
567
582
  function broadcastDAG() {
568
583
  const dagData = {
@@ -2353,6 +2368,22 @@ let dashboardShutdownAction = () => {
2353
2368
  export function setDashboardShutdownForTest(action) {
2354
2369
  dashboardShutdownAction = action ?? (() => { });
2355
2370
  }
2371
+ /**
2372
+ * The gateway-stop action behind `POST /api/admin/shutdown {target:'gateway'}`.
2373
+ * `null` (the default) → the REAL `stopGateway()`, which discovers the gateway
2374
+ * by command line and SIGTERMs it.
2375
+ *
2376
+ * Swappable because that discovery is machine-wide: running the test suite on a
2377
+ * machine with a LIVE gateway stops it (observed — the suite killed a supervised
2378
+ * gateway mid-run, and the test's own comment assumed "no `gateway start`
2379
+ * process running in the test sandbox"). A test asserting the ROUTE must not
2380
+ * reach out and kill a real service.
2381
+ */
2382
+ let gatewayShutdownAction = null;
2383
+ /** Test hook: stub the gateway-stop action (null restores the real one). */
2384
+ export function setGatewayShutdownForTest(action) {
2385
+ gatewayShutdownAction = action;
2386
+ }
2356
2387
  /** Invoke the current dashboard shutdown action (used by the shutdown route). */
2357
2388
  function runDashboardShutdown() {
2358
2389
  dashboardShutdownAction();
@@ -2527,6 +2558,41 @@ function handleRequest(req, res) {
2527
2558
  }
2528
2559
  return;
2529
2560
  }
2561
+ // ── Skill execution audit (`ExecutionHistory` panel) ───────────────────
2562
+ // SKILL RUNS WERE INVISIBLE. `skills/execution-audit.ts` (a complete audit
2563
+ // backend: log/query/stats/cleanup/export) and `ExecutionHistory.tsx` (a
2564
+ // complete panel matching its entry shape field-for-field) were BOTH
2565
+ // unreferenced — nothing wrote the log and nothing could read it, so a skill
2566
+ // execution left no inspectable trace anywhere in the product.
2567
+ //
2568
+ // Runtime import keeps this module free of a static edge into the skills tree.
2569
+ // Filters mirror the panel: skillName / status / limit.
2570
+ if (pathname === '/api/executions') {
2571
+ const skillName = url.searchParams.get('skillName') ?? undefined;
2572
+ const statusParam = url.searchParams.get('status') ?? undefined;
2573
+ const limitParam = Number(url.searchParams.get('limit'));
2574
+ const filters = {
2575
+ skillName,
2576
+ status: statusParam || undefined,
2577
+ limit: Number.isFinite(limitParam) && limitParam > 0 ? limitParam : 100,
2578
+ };
2579
+ void (async () => {
2580
+ try {
2581
+ const { queryAuditEntries, getAuditStats } = await import('../skills/execution-audit.js');
2582
+ const [entries, stats] = await Promise.all([
2583
+ // The panel sends the status as a raw query string; the audit backend
2584
+ // validates it (an unknown value simply matches nothing).
2585
+ queryAuditEntries(filters),
2586
+ getAuditStats(),
2587
+ ]);
2588
+ writeJson(res, 200, { entries, stats });
2589
+ }
2590
+ catch (err) {
2591
+ writeJson(res, 500, { error: err instanceof Error ? err.message : String(err) });
2592
+ }
2593
+ })();
2594
+ return;
2595
+ }
2530
2596
  // ── Admin command-runner: run ALL state commands on demand ───────────
2531
2597
  // The dashboard executes doctor/system/enterprise checks (one source with
2532
2598
  // `nuvira doctor` — runAllChecks) so the user never types a command. Read
@@ -2656,6 +2722,13 @@ function handleRequest(req, res) {
2656
2722
  return;
2657
2723
  }
2658
2724
  if (target === 'gateway') {
2725
+ if (gatewayShutdownAction) {
2726
+ const result = await gatewayShutdownAction();
2727
+ writeJson(res, 200, result.stopped
2728
+ ? { ok: true, target, stopped: true, pid: result.pid }
2729
+ : { ok: true, target, stopped: false, reason: result.reason ?? 'no running gateway found' });
2730
+ return;
2731
+ }
2659
2732
  const { stopGateway } = await import('../cli/process-control.js');
2660
2733
  const result = await stopGateway();
2661
2734
  if (result.stopped) {
@@ -2992,18 +3065,134 @@ function handleRequest(req, res) {
2992
3065
  return;
2993
3066
  }
2994
3067
  const saved = [];
3068
+ // Vars that were WANTED but not stored, with the reason. Previously a
3069
+ // refused key was simply absent from `saved` and the UI said "Saved" — so
3070
+ // a blocked provider credential looked like a successful write.
3071
+ const refused = [];
3072
+ // Values that actually landed, kept here so the process-hydration step
3073
+ // below does not have to re-index the untyped request body.
3074
+ const applied = {};
2995
3075
  try {
2996
3076
  const { saveEnvValue } = await import('../skills/secret-capture.js');
2997
3077
  for (const [key, value] of Object.entries(vars)) {
2998
3078
  if (typeof key !== 'string' || typeof value !== 'string')
2999
3079
  continue;
3000
- if (!/^[A-Z][A-Z0-9_]+$/.test(key))
3080
+ if (!/^[A-Z][A-Z0-9_]+$/.test(key)) {
3081
+ refused.push({ name: key, reason: 'invalid-name' });
3001
3082
  continue;
3083
+ }
3002
3084
  const result = saveEnvValue(key, value);
3003
- if (result.success)
3085
+ if (result.success) {
3004
3086
  saved.push(key);
3087
+ applied[key] = value;
3088
+ }
3089
+ else {
3090
+ refused.push({ name: key, reason: result.reason ?? 'write-failed' });
3091
+ }
3092
+ }
3093
+ if (saved.length > 0) {
3094
+ // Apply to THIS process so a read that goes through process.env sees
3095
+ // the new value without a dashboard restart. It does NOT make the
3096
+ // value visible to the agent's own process — that is why skill-tool
3097
+ // resolves declared vars through the env FILE (see its import note).
3098
+ try {
3099
+ const { applyEnvToProcess } = await import('../gateway/platform-config.js');
3100
+ applyEnvToProcess(applied);
3101
+ }
3102
+ catch {
3103
+ /* best-effort */
3104
+ }
3005
3105
  }
3006
- writeJson(res, 200, { ok: true, saved });
3106
+ writeJson(res, 200, { ok: true, saved, refused });
3107
+ }
3108
+ catch (err) {
3109
+ writeJson(res, 500, { ok: false, error: err instanceof Error ? err.message : String(err) });
3110
+ }
3111
+ })();
3112
+ return;
3113
+ }
3114
+ // ── PA5 — skill env-var inventory + delete + probe (dashboard editor) ─────
3115
+ // `EnvVarEditor` was written against exactly this data and had no producer,
3116
+ // so the panel was unreachable and the credential boundary it draws
3117
+ // (🔒 provider credentials are not editable here) was unenforced. Reads need
3118
+ // a session; mutating a secret needs routing.operate, same as the write path.
3119
+ if (pathname === '/api/skills/env' && req.method === 'GET') {
3120
+ void (async () => {
3121
+ const session = adminSessions.validate(bearerToken(req));
3122
+ if (!session) {
3123
+ writeJson(res, 401, { ok: false, error: 'Not authenticated — log in first.' });
3124
+ return;
3125
+ }
3126
+ try {
3127
+ const { readSkillEnvInventory } = await import('../skills/skill-env-inventory.js');
3128
+ writeJson(res, 200, { ok: true, vars: readSkillEnvInventory() });
3129
+ }
3130
+ catch (err) {
3131
+ writeJson(res, 500, { ok: false, error: err instanceof Error ? err.message : String(err) });
3132
+ }
3133
+ })();
3134
+ return;
3135
+ }
3136
+ if (pathname === '/api/skills/env/delete' && req.method === 'POST') {
3137
+ void (async () => {
3138
+ const session = adminSessions.validate(bearerToken(req));
3139
+ if (!session) {
3140
+ writeJson(res, 401, { ok: false, error: 'Not authenticated — log in first.' });
3141
+ return;
3142
+ }
3143
+ if (!roleCan(session.role, 'routing.operate')) {
3144
+ writeJson(res, 403, {
3145
+ ok: false,
3146
+ error: `Access denied — role '${session.role}' cannot delete secrets (requires admin or operator).`,
3147
+ });
3148
+ return;
3149
+ }
3150
+ const body = await readJsonBody(req);
3151
+ const name = typeof body?.name === 'string' ? body.name.trim() : '';
3152
+ if (!/^[A-Za-z_][A-Za-z0-9_]*$/.test(name)) {
3153
+ writeJson(res, 400, { ok: false, error: 'Invalid variable name.' });
3154
+ return;
3155
+ }
3156
+ try {
3157
+ const { deleteEnvValue } = await import('../skills/secret-capture.js');
3158
+ const result = deleteEnvValue(name);
3159
+ if (!result.success) {
3160
+ writeJson(res, 400, { ok: false, error: result.reason ?? 'delete failed' });
3161
+ return;
3162
+ }
3163
+ // Drop it from this process too, or the value would survive in memory
3164
+ // and keep being read via process.env until a restart.
3165
+ try {
3166
+ delete process.env[name];
3167
+ }
3168
+ catch {
3169
+ /* best-effort */
3170
+ }
3171
+ writeJson(res, 200, { ok: true, removed: result.removed });
3172
+ }
3173
+ catch (err) {
3174
+ writeJson(res, 500, { ok: false, error: err instanceof Error ? err.message : String(err) });
3175
+ }
3176
+ })();
3177
+ return;
3178
+ }
3179
+ if (pathname === '/api/skills/env/test' && req.method === 'POST') {
3180
+ void (async () => {
3181
+ const session = adminSessions.validate(bearerToken(req));
3182
+ if (!session) {
3183
+ writeJson(res, 401, { ok: false, error: 'Not authenticated — log in first.' });
3184
+ return;
3185
+ }
3186
+ const body = await readJsonBody(req);
3187
+ const name = typeof body?.name === 'string' ? body.name.trim() : '';
3188
+ if (!/^[A-Za-z_][A-Za-z0-9_]*$/.test(name)) {
3189
+ writeJson(res, 400, { ok: false, error: 'Invalid variable name.' });
3190
+ return;
3191
+ }
3192
+ try {
3193
+ const { probeSkillEnvVar } = await import('../skills/skill-env-inventory.js');
3194
+ const probe = probeSkillEnvVar(name);
3195
+ writeJson(res, 200, { ok: true, usable: probe.usable, detail: probe.detail });
3007
3196
  }
3008
3197
  catch (err) {
3009
3198
  writeJson(res, 500, { ok: false, error: err instanceof Error ? err.message : String(err) });