quoxcli 0.0.0-stage → 0.3.1

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 (516) hide show
  1. package/LICENSE +35 -0
  2. package/README.md +144 -2
  3. package/bin/quox.js +265 -0
  4. package/bin/quoxon.js +8 -0
  5. package/lib/api/endpoints/admin.js +151 -0
  6. package/lib/api/endpoints/aee.js +38 -0
  7. package/lib/api/endpoints/agent-attach.js +126 -0
  8. package/lib/api/endpoints/agent-schedules.js +26 -0
  9. package/lib/api/endpoints/agents.js +63 -0
  10. package/lib/api/endpoints/assistants.js +62 -0
  11. package/lib/api/endpoints/audit.js +14 -0
  12. package/lib/api/endpoints/auth.js +50 -0
  13. package/lib/api/endpoints/awareness.js +34 -0
  14. package/lib/api/endpoints/away.js +15 -0
  15. package/lib/api/endpoints/backup-schedules.js +20 -0
  16. package/lib/api/endpoints/backups.js +86 -0
  17. package/lib/api/endpoints/brain.js +140 -0
  18. package/lib/api/endpoints/budgets.js +62 -0
  19. package/lib/api/endpoints/calendarq.js +71 -0
  20. package/lib/api/endpoints/catalog.js +14 -0
  21. package/lib/api/endpoints/chat.js +61 -0
  22. package/lib/api/endpoints/consent.js +26 -0
  23. package/lib/api/endpoints/contactsq.js +68 -0
  24. package/lib/api/endpoints/conversations.js +46 -0
  25. package/lib/api/endpoints/custom-roles.js +92 -0
  26. package/lib/api/endpoints/divisions.js +56 -0
  27. package/lib/api/endpoints/domains.js +38 -0
  28. package/lib/api/endpoints/engagement.js +231 -0
  29. package/lib/api/endpoints/engine.js +11 -0
  30. package/lib/api/endpoints/entity.js +50 -0
  31. package/lib/api/endpoints/executions.js +45 -0
  32. package/lib/api/endpoints/fetchAllowlist.js +27 -0
  33. package/lib/api/endpoints/file.js +20 -0
  34. package/lib/api/endpoints/files.js +40 -0
  35. package/lib/api/endpoints/github.js +21 -0
  36. package/lib/api/endpoints/governance.js +43 -0
  37. package/lib/api/endpoints/hat.js +66 -0
  38. package/lib/api/endpoints/inbox.js +52 -0
  39. package/lib/api/endpoints/inboxq.js +120 -0
  40. package/lib/api/endpoints/index.js +242 -0
  41. package/lib/api/endpoints/invites.js +19 -0
  42. package/lib/api/endpoints/llm-policy.js +43 -0
  43. package/lib/api/endpoints/lucid.js +89 -0
  44. package/lib/api/endpoints/members.js +32 -0
  45. package/lib/api/endpoints/memory.js +94 -0
  46. package/lib/api/endpoints/mfa.js +32 -0
  47. package/lib/api/endpoints/mind.js +13 -0
  48. package/lib/api/endpoints/mon.js +184 -0
  49. package/lib/api/endpoints/notesq.js +43 -0
  50. package/lib/api/endpoints/objectives.js +68 -0
  51. package/lib/api/endpoints/orgs.js +38 -0
  52. package/lib/api/endpoints/plugins.js +152 -0
  53. package/lib/api/endpoints/powers.js +75 -0
  54. package/lib/api/endpoints/presence.js +33 -0
  55. package/lib/api/endpoints/prompts.js +69 -0
  56. package/lib/api/endpoints/qlarity.js +122 -0
  57. package/lib/api/endpoints/quoxbox.js +55 -0
  58. package/lib/api/endpoints/quoxchat.js +54 -0
  59. package/lib/api/endpoints/quoxflow.js +32 -0
  60. package/lib/api/endpoints/quoxplan.js +121 -0
  61. package/lib/api/endpoints/quoxseo.js +114 -0
  62. package/lib/api/endpoints/reach.js +47 -0
  63. package/lib/api/endpoints/router.js +17 -0
  64. package/lib/api/endpoints/runs.js +38 -0
  65. package/lib/api/endpoints/safety.js +53 -0
  66. package/lib/api/endpoints/scim.js +46 -0
  67. package/lib/api/endpoints/scopes.js +14 -0
  68. package/lib/api/endpoints/security.js +69 -0
  69. package/lib/api/endpoints/setup.js +90 -0
  70. package/lib/api/endpoints/skills.js +200 -0
  71. package/lib/api/endpoints/sso.js +67 -0
  72. package/lib/api/endpoints/stepup.js +20 -0
  73. package/lib/api/endpoints/tags.js +32 -0
  74. package/lib/api/endpoints/teams.js +56 -0
  75. package/lib/api/endpoints/telephony.js +46 -0
  76. package/lib/api/endpoints/tg.js +56 -0
  77. package/lib/api/endpoints/tools.js +50 -0
  78. package/lib/api/endpoints/traces.js +157 -0
  79. package/lib/api/endpoints/triggers.js +96 -0
  80. package/lib/api/endpoints/user-library.js +41 -0
  81. package/lib/api/endpoints/users.js +20 -0
  82. package/lib/api/endpoints/v1.js +585 -0
  83. package/lib/api/endpoints/vault.js +192 -0
  84. package/lib/api/endpoints/voice.js +22 -0
  85. package/lib/api/endpoints/volt.js +84 -0
  86. package/lib/api/endpoints/ward.js +47 -0
  87. package/lib/api/endpoints/webhooks.js +46 -0
  88. package/lib/api/endpoints/workflows.js +169 -0
  89. package/lib/api/endpoints/x.js +32 -0
  90. package/lib/api/endpoints.js +15 -0
  91. package/lib/commands/actions.js +61 -0
  92. package/lib/commands/admin.js +375 -0
  93. package/lib/commands/aee.js +99 -0
  94. package/lib/commands/agent.js +337 -0
  95. package/lib/commands/agentAttach.js +1528 -0
  96. package/lib/commands/approvals.js +119 -0
  97. package/lib/commands/aside.js +24 -0
  98. package/lib/commands/ask.js +144 -0
  99. package/lib/commands/assistant.js +169 -0
  100. package/lib/commands/auth.js +464 -0
  101. package/lib/commands/awareness.js +88 -0
  102. package/lib/commands/backup.js +377 -0
  103. package/lib/commands/brain.js +1085 -0
  104. package/lib/commands/budget.js +241 -0
  105. package/lib/commands/build.js +170 -0
  106. package/lib/commands/calendar.js +216 -0
  107. package/lib/commands/capabilities.js +34 -0
  108. package/lib/commands/chat.js +295 -0
  109. package/lib/commands/claude.js +380 -0
  110. package/lib/commands/config-cmd.js +106 -0
  111. package/lib/commands/consent.js +84 -0
  112. package/lib/commands/contacts.js +1016 -0
  113. package/lib/commands/contactsSelftest.js +132 -0
  114. package/lib/commands/conversation.js +105 -0
  115. package/lib/commands/dashboard.js +43 -0
  116. package/lib/commands/department.js +96 -0
  117. package/lib/commands/dev.js +620 -0
  118. package/lib/commands/devResident.js +326 -0
  119. package/lib/commands/devSupervisor.js +1062 -0
  120. package/lib/commands/discord.js +132 -0
  121. package/lib/commands/doctor.js +181 -0
  122. package/lib/commands/domain.js +114 -0
  123. package/lib/commands/done.js +347 -0
  124. package/lib/commands/engagement.js +597 -0
  125. package/lib/commands/entity.js +119 -0
  126. package/lib/commands/facebook.js +212 -0
  127. package/lib/commands/fetchAllowlist.js +71 -0
  128. package/lib/commands/file.js +165 -0
  129. package/lib/commands/fleet.js +1189 -0
  130. package/lib/commands/governance.js +647 -0
  131. package/lib/commands/gripe.js +355 -0
  132. package/lib/commands/hat.js +374 -0
  133. package/lib/commands/helpers.js +96 -0
  134. package/lib/commands/hyperion.js +58 -0
  135. package/lib/commands/inbox.js +173 -0
  136. package/lib/commands/instagram.js +264 -0
  137. package/lib/commands/integration.js +100 -0
  138. package/lib/commands/inventory.js +115 -0
  139. package/lib/commands/invites.js +45 -0
  140. package/lib/commands/licence.js +139 -0
  141. package/lib/commands/linkedin.js +178 -0
  142. package/lib/commands/llm-policy.js +117 -0
  143. package/lib/commands/llm.js +45 -0
  144. package/lib/commands/lucid.js +597 -0
  145. package/lib/commands/mail.js +531 -0
  146. package/lib/commands/memory.js +361 -0
  147. package/lib/commands/mind.js +71 -0
  148. package/lib/commands/mon.js +581 -0
  149. package/lib/commands/monitoring.js +86 -0
  150. package/lib/commands/motion.js +22 -0
  151. package/lib/commands/notes.js +1246 -0
  152. package/lib/commands/notesBatch.js +160 -0
  153. package/lib/commands/notesBridges.js +56 -0
  154. package/lib/commands/notesLinks.js +60 -0
  155. package/lib/commands/notification.js +57 -0
  156. package/lib/commands/nucleus.js +123 -0
  157. package/lib/commands/objective.js +240 -0
  158. package/lib/commands/offload.js +89 -0
  159. package/lib/commands/onboard.js +329 -0
  160. package/lib/commands/open.js +56 -0
  161. package/lib/commands/org.js +276 -0
  162. package/lib/commands/peek.js +28 -0
  163. package/lib/commands/plan.js +944 -0
  164. package/lib/commands/plugin-doctor.js +1091 -0
  165. package/lib/commands/plugin.js +649 -0
  166. package/lib/commands/policy.js +78 -0
  167. package/lib/commands/powers.js +296 -0
  168. package/lib/commands/presence.js +89 -0
  169. package/lib/commands/prompt.js +350 -0
  170. package/lib/commands/provider.js +159 -0
  171. package/lib/commands/qlarity.js +706 -0
  172. package/lib/commands/quoxbox.js +270 -0
  173. package/lib/commands/quoxchat.js +275 -0
  174. package/lib/commands/quoxseo.js +378 -0
  175. package/lib/commands/reach.js +159 -0
  176. package/lib/commands/role.js +286 -0
  177. package/lib/commands/router.js +77 -0
  178. package/lib/commands/rows.js +358 -0
  179. package/lib/commands/run.js +187 -0
  180. package/lib/commands/safety.js +107 -0
  181. package/lib/commands/scim.js +88 -0
  182. package/lib/commands/scope.js +58 -0
  183. package/lib/commands/security.js +157 -0
  184. package/lib/commands/server.js +292 -0
  185. package/lib/commands/service.js +89 -0
  186. package/lib/commands/settings.js +99 -0
  187. package/lib/commands/setup.js +569 -0
  188. package/lib/commands/skillManifest.js +113 -0
  189. package/lib/commands/skillRightsFormat.js +38 -0
  190. package/lib/commands/skills.js +687 -0
  191. package/lib/commands/slot.js +1451 -0
  192. package/lib/commands/sso.js +229 -0
  193. package/lib/commands/status.js +137 -0
  194. package/lib/commands/tag.js +91 -0
  195. package/lib/commands/team.js +142 -0
  196. package/lib/commands/tg.js +240 -0
  197. package/lib/commands/tiktok.js +218 -0
  198. package/lib/commands/tips.js +23 -0
  199. package/lib/commands/tool.js +304 -0
  200. package/lib/commands/trace.js +530 -0
  201. package/lib/commands/trigger.js +223 -0
  202. package/lib/commands/update.js +46 -0
  203. package/lib/commands/vault.js +1447 -0
  204. package/lib/commands/vm.js +237 -0
  205. package/lib/commands/voice.js +213 -0
  206. package/lib/commands/volt.js +570 -0
  207. package/lib/commands/walkthrough.js +32 -0
  208. package/lib/commands/watch.js +167 -0
  209. package/lib/commands/webhook.js +137 -0
  210. package/lib/commands/welcome.js +14 -0
  211. package/lib/commands/workflow.js +660 -0
  212. package/lib/commands/x.js +448 -0
  213. package/lib/core/actingAs.js +136 -0
  214. package/lib/core/activeSummary.js +186 -0
  215. package/lib/core/aee.js +53 -0
  216. package/lib/core/agentAlias.js +163 -0
  217. package/lib/core/approvalContext.js +61 -0
  218. package/lib/core/aside.js +54 -0
  219. package/lib/core/askDecision.js +60 -0
  220. package/lib/core/auth.js +501 -0
  221. package/lib/core/banner.js +143 -0
  222. package/lib/core/brainPrime.js +90 -0
  223. package/lib/core/callerSource.js +129 -0
  224. package/lib/core/claudeLs.js +94 -0
  225. package/lib/core/cliBuild.js +62 -0
  226. package/lib/core/client.js +693 -0
  227. package/lib/core/commandRegistrars.js +121 -0
  228. package/lib/core/completions.js +163 -0
  229. package/lib/core/config.js +669 -0
  230. package/lib/core/confirm.js +37 -0
  231. package/lib/core/customHats.js +168 -0
  232. package/lib/core/deeplinks.js +76 -0
  233. package/lib/core/doneEngineFetch.js +227 -0
  234. package/lib/core/errors.js +441 -0
  235. package/lib/core/global-flags.js +190 -0
  236. package/lib/core/governedSession.js +402 -0
  237. package/lib/core/hyperion.js +102 -0
  238. package/lib/core/inboxResolution.js +65 -0
  239. package/lib/core/lazyCommands.js +122 -0
  240. package/lib/core/liveSessionsReport.js +112 -0
  241. package/lib/core/offload.js +504 -0
  242. package/lib/core/org-override.js +52 -0
  243. package/lib/core/orgResolve.js +70 -0
  244. package/lib/core/output.js +239 -0
  245. package/lib/core/peek.js +126 -0
  246. package/lib/core/prodEnv.js +7 -0
  247. package/lib/core/profileUsers.js +51 -0
  248. package/lib/core/promptCancel.js +18 -0
  249. package/lib/core/quoxglyph.js +158 -0
  250. package/lib/core/repoPath.js +11 -0
  251. package/lib/core/residentAlarm.js +282 -0
  252. package/lib/core/residentAuth.js +243 -0
  253. package/lib/core/residentPump.js +229 -0
  254. package/lib/core/residentSeed.js +106 -0
  255. package/lib/core/rootOptions.js +39 -0
  256. package/lib/core/router.js +168 -0
  257. package/lib/core/selfUpdate.js +188 -0
  258. package/lib/core/sessionHeartbeat.js +192 -0
  259. package/lib/core/sessionsOverview.js +224 -0
  260. package/lib/core/slotKeeper.js +527 -0
  261. package/lib/core/slotWake.js +120 -0
  262. package/lib/core/supervisorEngine.js +933 -0
  263. package/lib/core/systemdInstaller.js +256 -0
  264. package/lib/core/version.js +87 -0
  265. package/lib/core/vm.js +361 -0
  266. package/lib/core/vmTui.js +86 -0
  267. package/lib/core/walkthrough.js +35 -0
  268. package/lib/hyperion/deck.js +29 -0
  269. package/lib/lucid/LucidCard.jsx +68 -0
  270. package/lib/lucid/LucidIntro.jsx +92 -0
  271. package/lib/lucid/blind.js +71 -0
  272. package/lib/lucid/cards.js +86 -0
  273. package/lib/lucid/deck.js +32 -0
  274. package/lib/lucid/fmt.js +139 -0
  275. package/lib/lucid/markdown.js +81 -0
  276. package/lib/lucid/motion.js +56 -0
  277. package/lib/lucid/sitrep.js +173 -0
  278. package/lib/plugins/loader.js +93 -0
  279. package/lib/quoxon/activity.js +116 -0
  280. package/lib/quoxon/aocl.js +117 -0
  281. package/lib/quoxon/api.js +952 -0
  282. package/lib/quoxon/app.js +4032 -0
  283. package/lib/quoxon/approvalFacts.js +94 -0
  284. package/lib/quoxon/approvalsView.js +325 -0
  285. package/lib/quoxon/asideView.js +40 -0
  286. package/lib/quoxon/ask.js +121 -0
  287. package/lib/quoxon/away.js +52 -0
  288. package/lib/quoxon/bang.js +224 -0
  289. package/lib/quoxon/bulkRisk.js +17 -0
  290. package/lib/quoxon/capabilities.js +82 -0
  291. package/lib/quoxon/cells.js +53 -0
  292. package/lib/quoxon/commandShort.js +112 -0
  293. package/lib/quoxon/commands.js +479 -0
  294. package/lib/quoxon/connect.js +654 -0
  295. package/lib/quoxon/connectCard.js +45 -0
  296. package/lib/quoxon/consent.js +86 -0
  297. package/lib/quoxon/context.js +68 -0
  298. package/lib/quoxon/copy.js +34 -0
  299. package/lib/quoxon/countdownLine.js +11 -0
  300. package/lib/quoxon/demo.autoplay.js +29 -0
  301. package/lib/quoxon/demo.fixtures.js +24 -0
  302. package/lib/quoxon/demo.js +76 -0
  303. package/lib/quoxon/devObserver.js +20 -0
  304. package/lib/quoxon/dividerAocl.js +191 -0
  305. package/lib/quoxon/dividerRule.js +57 -0
  306. package/lib/quoxon/dragonModes.js +150 -0
  307. package/lib/quoxon/dragonView.js +41 -0
  308. package/lib/quoxon/earlyInput.js +40 -0
  309. package/lib/quoxon/echo.js +15 -0
  310. package/lib/quoxon/egg.js +36 -0
  311. package/lib/quoxon/events.js +677 -0
  312. package/lib/quoxon/feedback.js +50 -0
  313. package/lib/quoxon/gallery.js +237 -0
  314. package/lib/quoxon/handoffOffer.js +78 -0
  315. package/lib/quoxon/hatSwitch.js +37 -0
  316. package/lib/quoxon/headless.js +161 -0
  317. package/lib/quoxon/hostUrls.js +41 -0
  318. package/lib/quoxon/indicator.js +197 -0
  319. package/lib/quoxon/intent.js +52 -0
  320. package/lib/quoxon/keys.js +164 -0
  321. package/lib/quoxon/launcher.js +103 -0
  322. package/lib/quoxon/main.js +176 -0
  323. package/lib/quoxon/markdown.js +341 -0
  324. package/lib/quoxon/markdownSettle.js +19 -0
  325. package/lib/quoxon/matrixDomains.json +46 -0
  326. package/lib/quoxon/mentions.js +90 -0
  327. package/lib/quoxon/mind.js +103 -0
  328. package/lib/quoxon/mode.js +46 -0
  329. package/lib/quoxon/model.js +311 -0
  330. package/lib/quoxon/modelPrefs.js +345 -0
  331. package/lib/quoxon/motion/clock.js +70 -0
  332. package/lib/quoxon/motion/color.js +35 -0
  333. package/lib/quoxon/motion/frame.js +14 -0
  334. package/lib/quoxon/motion/level.js +91 -0
  335. package/lib/quoxon/motion/reveal.js +54 -0
  336. package/lib/quoxon/motion/ring.js +79 -0
  337. package/lib/quoxon/mouse.js +211 -0
  338. package/lib/quoxon/noai.js +57 -0
  339. package/lib/quoxon/objects/agent.js +61 -0
  340. package/lib/quoxon/objects/away.js +72 -0
  341. package/lib/quoxon/objects/crystal.js +100 -0
  342. package/lib/quoxon/objects/fetch.js +182 -0
  343. package/lib/quoxon/objects/fleet.js +149 -0
  344. package/lib/quoxon/objects/health.js +186 -0
  345. package/lib/quoxon/objects/index.js +106 -0
  346. package/lib/quoxon/objects/ladder.js +71 -0
  347. package/lib/quoxon/objects/memory.js +44 -0
  348. package/lib/quoxon/objects/mirror.js +137 -0
  349. package/lib/quoxon/objects/model.js +118 -0
  350. package/lib/quoxon/objects/peek.js +17 -0
  351. package/lib/quoxon/objects/proof.js +110 -0
  352. package/lib/quoxon/objects/prove.js +130 -0
  353. package/lib/quoxon/objects/replay.js +125 -0
  354. package/lib/quoxon/objects/sitrep.js +58 -0
  355. package/lib/quoxon/objects/skill.js +105 -0
  356. package/lib/quoxon/objects/view.js +87 -0
  357. package/lib/quoxon/objects/workflow.js +119 -0
  358. package/lib/quoxon/observers.js +42 -0
  359. package/lib/quoxon/onboarding/copy.js +263 -0
  360. package/lib/quoxon/onboarding/credential.js +108 -0
  361. package/lib/quoxon/onboarding/detect.js +22 -0
  362. package/lib/quoxon/onboarding/dockerOffer.js +45 -0
  363. package/lib/quoxon/onboarding/failureCause.js +33 -0
  364. package/lib/quoxon/onboarding/finish.js +134 -0
  365. package/lib/quoxon/onboarding/index.js +94 -0
  366. package/lib/quoxon/onboarding/installRunner.js +284 -0
  367. package/lib/quoxon/onboarding/intent.js +53 -0
  368. package/lib/quoxon/onboarding/journey.js +73 -0
  369. package/lib/quoxon/onboarding/preflight.js +156 -0
  370. package/lib/quoxon/onboarding/probe.js +65 -0
  371. package/lib/quoxon/onboarding/runner.js +58 -0
  372. package/lib/quoxon/onboarding/view.js +682 -0
  373. package/lib/quoxon/orgLabel.js +10 -0
  374. package/lib/quoxon/orgSwitch.js +33 -0
  375. package/lib/quoxon/ownBroadcast.js +22 -0
  376. package/lib/quoxon/palette.js +43 -0
  377. package/lib/quoxon/print.js +98 -0
  378. package/lib/quoxon/profileSwitch.js +53 -0
  379. package/lib/quoxon/promptHistory.js +41 -0
  380. package/lib/quoxon/providers.js +48 -0
  381. package/lib/quoxon/qart.js +348 -0
  382. package/lib/quoxon/qdragon.js +410 -0
  383. package/lib/quoxon/qdragonFly.js +61 -0
  384. package/lib/quoxon/qdragonScenes.js +282 -0
  385. package/lib/quoxon/qeyes.js +213 -0
  386. package/lib/quoxon/qglyph.js +143 -0
  387. package/lib/quoxon/qhello.js +58 -0
  388. package/lib/quoxon/qmotion.js +132 -0
  389. package/lib/quoxon/render.js +1167 -0
  390. package/lib/quoxon/resend.js +72 -0
  391. package/lib/quoxon/roster.js +307 -0
  392. package/lib/quoxon/route.js +39 -0
  393. package/lib/quoxon/rows.js +711 -0
  394. package/lib/quoxon/rowsStore.js +80 -0
  395. package/lib/quoxon/rules.js +130 -0
  396. package/lib/quoxon/screenContext.js +150 -0
  397. package/lib/quoxon/screenFrames.js +254 -0
  398. package/lib/quoxon/session.js +238 -0
  399. package/lib/quoxon/sessionDead.js +17 -0
  400. package/lib/quoxon/signin.js +125 -0
  401. package/lib/quoxon/skills.js +30 -0
  402. package/lib/quoxon/slash/agents.js +112 -0
  403. package/lib/quoxon/slash/argSources.js +65 -0
  404. package/lib/quoxon/slash/args.js +65 -0
  405. package/lib/quoxon/slash/automate.js +89 -0
  406. package/lib/quoxon/slash/broadcast.js +140 -0
  407. package/lib/quoxon/slash/broadcastRun.js +108 -0
  408. package/lib/quoxon/slash/card.js +30 -0
  409. package/lib/quoxon/slash/challenge.js +114 -0
  410. package/lib/quoxon/slash/cliCommand.js +53 -0
  411. package/lib/quoxon/slash/cliLeaves.json +948 -0
  412. package/lib/quoxon/slash/compact.js +90 -0
  413. package/lib/quoxon/slash/confirm.js +30 -0
  414. package/lib/quoxon/slash/crystallize.js +69 -0
  415. package/lib/quoxon/slash/dashboard.js +136 -0
  416. package/lib/quoxon/slash/draft.js +54 -0
  417. package/lib/quoxon/slash/hatWalk.js +206 -0
  418. package/lib/quoxon/slash/inverses.js +77 -0
  419. package/lib/quoxon/slash/killer.js +24 -0
  420. package/lib/quoxon/slash/killerApi.js +16 -0
  421. package/lib/quoxon/slash/ledger.js +88 -0
  422. package/lib/quoxon/slash/listView.js +30 -0
  423. package/lib/quoxon/slash/modelCmd.js +261 -0
  424. package/lib/quoxon/slash/palette.js +118 -0
  425. package/lib/quoxon/slash/paletteController.js +169 -0
  426. package/lib/quoxon/slash/panels.js +116 -0
  427. package/lib/quoxon/slash/picker.js +56 -0
  428. package/lib/quoxon/slash/restart.js +202 -0
  429. package/lib/quoxon/slash/resume.js +59 -0
  430. package/lib/quoxon/slash/rowCmd.js +157 -0
  431. package/lib/quoxon/slash/rowWalk.js +175 -0
  432. package/lib/quoxon/slash/settings.js +60 -0
  433. package/lib/quoxon/slash/spawn.js +177 -0
  434. package/lib/quoxon/slash/stepUp.js +274 -0
  435. package/lib/quoxon/slash/stepUpCard.js +60 -0
  436. package/lib/quoxon/slash/stepUpCmds.js +78 -0
  437. package/lib/quoxon/slash/undoApi.js +38 -0
  438. package/lib/quoxon/slash/undoCmd.js +49 -0
  439. package/lib/quoxon/slash/undoWish.js +15 -0
  440. package/lib/quoxon/slash/watch.js +164 -0
  441. package/lib/quoxon/slash/wish.js +23 -0
  442. package/lib/quoxon/slash/wishCmd.js +32 -0
  443. package/lib/quoxon/slotChat.js +300 -0
  444. package/lib/quoxon/slotFormat.js +195 -0
  445. package/lib/quoxon/slotRun.js +131 -0
  446. package/lib/quoxon/sound/index.js +186 -0
  447. package/lib/quoxon/sound/mapping.js +120 -0
  448. package/lib/quoxon/sound/output.js +52 -0
  449. package/lib/quoxon/sound/synth.js +122 -0
  450. package/lib/quoxon/stray.js +22 -0
  451. package/lib/quoxon/suggestCommand.js +59 -0
  452. package/lib/quoxon/term.js +141 -0
  453. package/lib/quoxon/textBuffer.js +416 -0
  454. package/lib/quoxon/theme.js +286 -0
  455. package/lib/quoxon/tips.js +433 -0
  456. package/lib/quoxon/toolError.js +41 -0
  457. package/lib/quoxon/transcript.js +188 -0
  458. package/lib/quoxon/web/qface.js +89 -0
  459. package/lib/quoxon/welcome.js +52 -0
  460. package/lib/quoxon/whatsnew.js +136 -0
  461. package/lib/quoxon/whatsnew.jsonl +89 -0
  462. package/lib/quoxon/windowOrg.js +113 -0
  463. package/lib/server/diag.js +129 -0
  464. package/lib/server/doctor.js +71 -0
  465. package/lib/server/install.js +149 -0
  466. package/lib/server/pluginEnable.js +161 -0
  467. package/lib/server/skew.js +56 -0
  468. package/lib/server/snapshot.js +131 -0
  469. package/lib/server/status.js +128 -0
  470. package/lib/server/sys.js +65 -0
  471. package/lib/server/uninstall.js +63 -0
  472. package/lib/server/update.js +234 -0
  473. package/lib/toolOutputShape.js +315 -0
  474. package/lib/tui/app.jsx +289 -0
  475. package/lib/tui/components/Breadcrumb.jsx +42 -0
  476. package/lib/tui/components/ChatInput.jsx +68 -0
  477. package/lib/tui/components/Confirm.jsx +32 -0
  478. package/lib/tui/components/DataTable.jsx +270 -0
  479. package/lib/tui/components/DetailPanel.jsx +241 -0
  480. package/lib/tui/components/HelpOverlay.jsx +67 -0
  481. package/lib/tui/components/Layout.jsx +129 -0
  482. package/lib/tui/components/Palette.jsx +141 -0
  483. package/lib/tui/components/SearchInput.jsx +125 -0
  484. package/lib/tui/components/Sparkline.jsx +55 -0
  485. package/lib/tui/components/StatusBar.jsx +133 -0
  486. package/lib/tui/components/Toast.jsx +52 -0
  487. package/lib/tui/hooks/useApi.js +44 -0
  488. package/lib/tui/hooks/useHealth.js +90 -0
  489. package/lib/tui/hooks/usePolledApi.js +86 -0
  490. package/lib/tui/hooks/useTerminalSize.js +46 -0
  491. package/lib/tui/index.js +56 -0
  492. package/lib/tui/intro/Intro.jsx +332 -0
  493. package/lib/tui/jsx-loader.js +32 -0
  494. package/lib/tui/keys.js +87 -0
  495. package/lib/tui/registry.js +49 -0
  496. package/lib/tui/theme.js +103 -0
  497. package/lib/tui/views/AdminView.jsx +398 -0
  498. package/lib/tui/views/AgentView.jsx +204 -0
  499. package/lib/tui/views/BackupView.jsx +225 -0
  500. package/lib/tui/views/BrainView.jsx +223 -0
  501. package/lib/tui/views/ChatView.jsx +468 -0
  502. package/lib/tui/views/FilesView.jsx +218 -0
  503. package/lib/tui/views/FleetView.jsx +234 -0
  504. package/lib/tui/views/GovernanceView.jsx +453 -0
  505. package/lib/tui/views/HealthView.jsx +216 -0
  506. package/lib/tui/views/HyperionDeck.jsx +79 -0
  507. package/lib/tui/views/InboxView.jsx +228 -0
  508. package/lib/tui/views/LucidDeck.jsx +719 -0
  509. package/lib/tui/views/MainMenu.jsx +123 -0
  510. package/lib/tui/views/MemoryView.jsx +377 -0
  511. package/lib/tui/views/ObjectivesView.jsx +230 -0
  512. package/lib/tui/views/OrgView.jsx +229 -0
  513. package/lib/tui/views/ToolView.jsx +221 -0
  514. package/lib/tui/views/VaultView.jsx +422 -0
  515. package/lib/tui/views/WorkflowView.jsx +329 -0
  516. package/package.json +75 -4
@@ -0,0 +1,530 @@
1
+ /**
2
+ * Trace commands: TRV (Trace Replay & Visualization) — assembled QuoxTraces,
3
+ * what-if simulation, trace comparison, and persisted replay
4
+ * sessions/comparisons/correlation cache.
5
+ *
6
+ * quox trace list|get|simulate|compare
7
+ * quox trace replay list|get|create|update|delete|delete-all
8
+ * quox trace comparison list|get|create|update|delete|delete-all
9
+ * quox trace correlation list|get|create|delete
10
+ *
11
+ * Backend: services/collector/server.js (TRV-1/TRV-2/TRV-5/TRV-6), mounted
12
+ * at plain `/traces` — collector-direct, NOT org-scoped in the URL (same
13
+ * pattern as `quox aee`/`quox chat`). See endpoints/traces.js's header for
14
+ * the verified org-scoping finding on the list reads.
15
+ *
16
+ * UX note (repo lesson, project_trv_ux): don't bury the useful data behind
17
+ * an extra fetch. `trace get` prints the narrative + key facts inline, not
18
+ * just a raw JSON dump requiring a follow-up call.
19
+ */
20
+
21
+ import { randomUUID } from 'node:crypto';
22
+ import { formatOutput, formatDetail, printSuccess, printWarning, printInfo } from '../core/output.js';
23
+ import { parseJSON, withTimeoutHint } from './helpers.js';
24
+ import { resolveEndpoint } from '../api/endpoints.js';
25
+
26
+ /** Flatten the nested `actor` object into a display string for table rows. */
27
+ function actorLabel(actor) {
28
+ if (!actor) return '';
29
+ return actor.display_name || actor.id || '';
30
+ }
31
+
32
+ function normalizeTraceSummary(t) {
33
+ return { ...t, actor: actorLabel(t.actor) };
34
+ }
35
+
36
+ async function confirmOrSkip(program, options, message) {
37
+ if (options.force || program.opts().yes) return true;
38
+ const { default: inquirer } = await import('inquirer');
39
+ const ans = await inquirer.prompt([{ type: 'confirm', name: 'confirm', message, default: false }]);
40
+ return ans.confirm;
41
+ }
42
+
43
+ export function registerTraceCommands(program, ctx) {
44
+ const { client, auth } = ctx;
45
+
46
+ const trace = program
47
+ .command('trace')
48
+ .description('Trace Replay & Visualization: assembled traces, simulation, comparison, replay sessions');
49
+
50
+ // ── trace list ──────────────────────────────────────────────────────────────
51
+
52
+ trace
53
+ .command('list')
54
+ .description('List assembled trace summaries')
55
+ .option('--limit <n>', 'max results', '30')
56
+ .option('--offset <n>', 'result offset', '0')
57
+ .option('--after <iso>', 'only traces starting at/after this ISO timestamp')
58
+ .option('--before <iso>', 'only traces starting before this ISO timestamp')
59
+ .option('--actor <id>', 'filter by actor ID (e.g. human.adam)')
60
+ .option('--outcome <outcome>', 'filter by outcome')
61
+ .option('--denied', 'only traces with at least one policy denial')
62
+ .option('--hitl', 'only traces with at least one HITL layer')
63
+ .option('--sort <mode>', 'newest|oldest|slowest|fastest', 'newest')
64
+ .action(async (options) => {
65
+ auth.requireAuth();
66
+ const query = { limit: options.limit, offset: options.offset, sort: options.sort };
67
+ if (options.after) query.after = options.after;
68
+ if (options.before) query.before = options.before;
69
+ if (options.actor) query.actor = options.actor;
70
+ if (options.outcome) query.outcome = options.outcome;
71
+ if (options.denied) query.has_denial = 'true';
72
+ if (options.hitl) query.has_hitl = 'true';
73
+
74
+ const data = await withTimeoutHint(
75
+ 'quox trace list',
76
+ 'Try a smaller --limit or a narrower window (--after <iso>, --before <iso>).',
77
+ () => client.get(resolveEndpoint('traces.list').path, {
78
+ service: resolveEndpoint('traces.list').service,
79
+ query,
80
+ }),
81
+ );
82
+ const traces = (data.traces || data || []).map(normalizeTraceSummary);
83
+
84
+ formatOutput({
85
+ columns: ['run_id', 'actor', 'outcome', 'layer_count', 'decision_count', 'has_denial', 'has_hitl', 'duration_ms', 'started_at'],
86
+ headers: ['Run ID', 'Actor', 'Outcome', 'Layers', 'Decisions', 'Denied', 'HITL', 'Duration (ms)', 'Started'],
87
+ rows: traces,
88
+ }, { format: program.opts().output, emptyMessage: 'No traces found.' });
89
+
90
+ if (program.opts().output !== 'json' && program.opts().output !== 'quiet') {
91
+ if (typeof data.total === 'number') printInfo(`Showing ${traces.length} of ${data.total} trace(s).`);
92
+ else if (data.has_more) printInfo(`Showing ${traces.length} trace(s); more available (--offset ${Number(options.offset || 0) + Number(options.limit || 30)}).`);
93
+ }
94
+ });
95
+
96
+ // ── trace get ───────────────────────────────────────────────────────────────
97
+
98
+ trace
99
+ .command('get')
100
+ .description('Assemble and show a single trace (narrative + per-layer waterfall)')
101
+ .argument('<identifier>', 'conversation ID (corr) or RUN_ id')
102
+ .option('--include-raw', 'include raw layer payloads')
103
+ .action(async (identifier, options) => {
104
+ auth.requireAuth();
105
+ const query = {};
106
+ if (options.includeRaw) query.include_raw = 'true';
107
+
108
+ const t = await client.get(resolveEndpoint('traces.get', { id: identifier }).path, {
109
+ service: resolveEndpoint('traces.get', { id: identifier }).service,
110
+ query,
111
+ });
112
+
113
+ const format = program.opts().output;
114
+ if (format === 'json') {
115
+ console.log(JSON.stringify(t, null, 2));
116
+ return;
117
+ }
118
+ if (format === 'quiet') {
119
+ console.log(t.run_id || t.corr || '');
120
+ return;
121
+ }
122
+
123
+ formatDetail({ ...t, id: t.run_id }, {
124
+ format,
125
+ title: `Trace: ${t.run_id || identifier}`,
126
+ fields: ['id', 'corr', 'actor', 'query', 'outcome', 'narrative', 'duration_ms', 'layer_count', 'decision_count', 'has_denial', 'has_hitl', 'compliance_tags', 'most_interesting_layer', 'started_at', 'ended_at', 'volt'],
127
+ labels: {
128
+ id: 'Run ID', corr: 'Conversation', actor: 'Actor', query: 'Query', outcome: 'Outcome',
129
+ narrative: 'Narrative', duration_ms: 'Duration (ms)', layer_count: 'Layers',
130
+ decision_count: 'Decisions', has_denial: 'Denied', has_hitl: 'HITL',
131
+ compliance_tags: 'Compliance Tags', most_interesting_layer: 'Most Interesting Layer',
132
+ started_at: 'Started', ended_at: 'Ended', volt: 'VOLT',
133
+ },
134
+ });
135
+
136
+ if (Array.isArray(t.layers) && t.layers.length > 0) {
137
+ console.log('');
138
+ formatOutput({
139
+ columns: ['layer_id', 'layer_label', 'status', 'outcome', 'duration_ms', 'layer_summary'],
140
+ headers: ['Layer', 'Name', 'Status', 'Outcome', 'Duration (ms)', 'Summary'],
141
+ rows: t.layers,
142
+ }, { format, emptyMessage: 'No layers.' });
143
+ }
144
+ });
145
+
146
+ // ── trace simulate ──────────────────────────────────────────────────────────
147
+
148
+ trace
149
+ .command('simulate')
150
+ .description('Run a what-if policy simulation against a trace (TRV-5)')
151
+ .argument('<identifier>', 'conversation ID (corr) or RUN_ id')
152
+ .option('--policy-overrides <json>', 'JSON map of layer_id -> { action } overrides')
153
+ .option('--layer-toggles <json>', 'JSON map of layer_id -> enabled(bool)')
154
+ .option('--query-override <text>', 'replacement query text')
155
+ .action(async (identifier, options) => {
156
+ auth.requireAuth();
157
+ const body = {};
158
+ if (options.policyOverrides) body.policy_overrides = parseJSON(options.policyOverrides, '--policy-overrides');
159
+ if (options.layerToggles) body.layer_toggles = parseJSON(options.layerToggles, '--layer-toggles');
160
+ if (options.queryOverride !== undefined) body.query_override = options.queryOverride;
161
+
162
+ const data = await client.post(resolveEndpoint('traces.simulate', { id: identifier }).path, {
163
+ service: resolveEndpoint('traces.simulate', { id: identifier }).service,
164
+ body,
165
+ });
166
+
167
+ const format = program.opts().output;
168
+ if (format === 'json') {
169
+ console.log(JSON.stringify(data, null, 2));
170
+ return;
171
+ }
172
+ printInfo(`Confidence: ${data.confidence}${data.simulation_boundary ? ` (boundary ${data.simulation_boundary})` : ''}`);
173
+ formatOutput({
174
+ columns: ['layer_id', 'original_outcome', 'simulated_outcome'],
175
+ headers: ['Layer', 'Original', 'Simulated'],
176
+ rows: data.diffs || [],
177
+ }, { format, emptyMessage: 'No differences — simulation matches the original trace.' });
178
+ });
179
+
180
+ // ── trace compare ───────────────────────────────────────────────────────────
181
+
182
+ trace
183
+ .command('compare')
184
+ .description('Compare two traces with layer-aligned diffs (TRV-6)')
185
+ .requiredOption('--a <identifier>', 'first trace ID (corr or RUN_ id)')
186
+ .requiredOption('--b <identifier>', 'second trace ID (corr or RUN_ id)')
187
+ .action(async (options) => {
188
+ auth.requireAuth();
189
+ const data = await client.post(resolveEndpoint('traces.compare').path, {
190
+ service: resolveEndpoint('traces.compare').service,
191
+ body: { trace_a: options.a, trace_b: options.b },
192
+ });
193
+
194
+ const format = program.opts().output;
195
+ if (format === 'json') {
196
+ console.log(JSON.stringify(data, null, 2));
197
+ return;
198
+ }
199
+ printInfo(data.summary || '');
200
+ formatOutput({
201
+ // fleet #392: compare returns diff_type, not status.
202
+ columns: ['layer_id', 'diff_type'],
203
+ headers: ['Layer', 'Diff'],
204
+ rows: data.layer_diffs || [],
205
+ }, { format, emptyMessage: 'No layer diffs.' });
206
+ });
207
+
208
+ // ══ trace replay — persisted replay sessions ════════════════════════════════
209
+
210
+ const replay = trace
211
+ .command('replay')
212
+ .description('Manage persisted trace replay sessions');
213
+
214
+ replay
215
+ .command('list')
216
+ .description('List replay sessions')
217
+ .option('--limit <n>', 'max results', '30')
218
+ .option('--offset <n>', 'result offset', '0')
219
+ .action(async (options) => {
220
+ auth.requireAuth();
221
+ const data = await client.get(resolveEndpoint('traces.replaySessions.list').path, {
222
+ service: resolveEndpoint('traces.replaySessions.list').service,
223
+ query: { limit: options.limit, offset: options.offset },
224
+ });
225
+ formatOutput({
226
+ columns: ['id', 'run_id', 'status', 'created_at', 'completed_at'],
227
+ headers: ['ID', 'Run ID', 'Status', 'Created', 'Completed'],
228
+ rows: data.sessions || data || [],
229
+ }, { format: program.opts().output, emptyMessage: 'No replay sessions found.' });
230
+ });
231
+
232
+ replay
233
+ .command('get')
234
+ .description('Show a replay session')
235
+ .argument('<id>', 'replay session ID')
236
+ .action(async (id) => {
237
+ auth.requireAuth();
238
+ const data = await client.get(resolveEndpoint('traces.replaySessions.get', { id }).path, {
239
+ service: resolveEndpoint('traces.replaySessions.get', { id }).service,
240
+ });
241
+ formatDetail(data.session || data, { format: program.opts().output, title: `Replay Session: ${id}` });
242
+ });
243
+
244
+ replay
245
+ .command('create')
246
+ .description('Create a replay session for a run')
247
+ .requiredOption('--run-id <runId>', 'the RUN_ id being replayed')
248
+ .option('--id <id>', 'replay session ID (auto-generated if omitted)')
249
+ .option('--status <status>', 'initial status', 'pending')
250
+ .option('--query <text>', 'replacement query for the replay')
251
+ .option('--layer-config <json>', 'JSON layer configuration')
252
+ .option('--mock-config <json>', 'JSON mock configuration')
253
+ .option('--original-trace <json>', 'JSON snapshot of the original trace')
254
+ .action(async (options) => {
255
+ auth.requireAuth();
256
+ const body = {
257
+ id: options.id || randomUUID(),
258
+ run_id: options.runId,
259
+ status: options.status,
260
+ };
261
+ if (options.query) body.query = options.query;
262
+ if (options.layerConfig) body.layer_config = parseJSON(options.layerConfig, '--layer-config');
263
+ if (options.mockConfig) body.mock_config = parseJSON(options.mockConfig, '--mock-config');
264
+ if (options.originalTrace) body.original_trace = parseJSON(options.originalTrace, '--original-trace');
265
+
266
+ const data = await client.post(resolveEndpoint('traces.replaySessions.create').path, {
267
+ service: resolveEndpoint('traces.replaySessions.create').service,
268
+ body,
269
+ });
270
+ printSuccess(`Replay session "${body.id}" created.`);
271
+ formatDetail(data.session || data, { format: program.opts().output });
272
+ });
273
+
274
+ replay
275
+ .command('update')
276
+ .description('Update a replay session (status and/or result)')
277
+ .argument('<id>', 'replay session ID')
278
+ .option('--status <status>', 'new status')
279
+ .option('--result <json>', 'JSON replay result')
280
+ .action(async (id, options) => {
281
+ auth.requireAuth();
282
+ if (!options.status && !options.result) {
283
+ throw new Error('Specify at least one field to update (--status, --result).');
284
+ }
285
+ const body = {};
286
+ if (options.status) body.status = options.status;
287
+ if (options.result) body.replay_result = parseJSON(options.result, '--result');
288
+
289
+ const data = await client.put(resolveEndpoint('traces.replaySessions.update', { id }).path, {
290
+ service: resolveEndpoint('traces.replaySessions.update', { id }).service,
291
+ body,
292
+ });
293
+ printSuccess('Replay session updated.');
294
+ formatDetail(data.session || data, { format: program.opts().output });
295
+ });
296
+
297
+ replay
298
+ .command('delete')
299
+ .description('Delete a replay session')
300
+ .argument('<id>', 'replay session ID')
301
+ .option('--force', 'skip confirmation')
302
+ .action(async (id, options) => {
303
+ auth.requireAuth();
304
+ if (!(await confirmOrSkip(program, options, `Delete replay session ${id}? This cannot be undone.`))) {
305
+ printInfo('Cancelled.');
306
+ return;
307
+ }
308
+ await client.delete(resolveEndpoint('traces.replaySessions.delete', { id }).path, {
309
+ service: resolveEndpoint('traces.replaySessions.delete', { id }).service,
310
+ });
311
+ printSuccess('Replay session deleted.');
312
+ });
313
+
314
+ replay
315
+ .command('delete-all')
316
+ .description('Delete ALL replay sessions')
317
+ .option('--force', 'skip confirmation')
318
+ .action(async (options) => {
319
+ auth.requireAuth();
320
+ if (!(await confirmOrSkip(program, options, 'Delete ALL replay sessions? This cannot be undone.'))) {
321
+ printInfo('Cancelled.');
322
+ return;
323
+ }
324
+ await client.delete(resolveEndpoint('traces.replaySessions.deleteAll').path, {
325
+ service: resolveEndpoint('traces.replaySessions.deleteAll').service,
326
+ });
327
+ printSuccess('All replay sessions deleted.');
328
+ });
329
+
330
+ // ══ trace comparison — persisted trace comparisons ══════════════════════════
331
+
332
+ const comparison = trace
333
+ .command('comparison')
334
+ .description('Manage persisted trace comparisons');
335
+
336
+ comparison
337
+ .command('list')
338
+ .description('List trace comparisons')
339
+ .option('--limit <n>', 'max results', '30')
340
+ .option('--offset <n>', 'result offset', '0')
341
+ .action(async (options) => {
342
+ auth.requireAuth();
343
+ const data = await client.get(resolveEndpoint('traces.comparisons.list').path, {
344
+ service: resolveEndpoint('traces.comparisons.list').service,
345
+ query: { limit: options.limit, offset: options.offset },
346
+ });
347
+ const rows = (data.comparisons || data || []).map(c => ({
348
+ ...c,
349
+ corr_ids: Array.isArray(c.corr_ids) ? c.corr_ids.join(', ') : c.corr_ids,
350
+ }));
351
+ formatOutput({
352
+ columns: ['id', 'name', 'corr_ids', 'similarity_score', 'created_at'],
353
+ headers: ['ID', 'Name', 'Traces', 'Similarity', 'Created'],
354
+ rows,
355
+ }, { format: program.opts().output, emptyMessage: 'No trace comparisons found.' });
356
+ });
357
+
358
+ comparison
359
+ .command('get')
360
+ .description('Show a trace comparison')
361
+ .argument('<id>', 'comparison ID')
362
+ .action(async (id) => {
363
+ auth.requireAuth();
364
+ const data = await client.get(resolveEndpoint('traces.comparisons.get', { id }).path, {
365
+ service: resolveEndpoint('traces.comparisons.get', { id }).service,
366
+ });
367
+ formatDetail(data.comparison || data, { format: program.opts().output, title: `Trace Comparison: ${id}` });
368
+ });
369
+
370
+ comparison
371
+ .command('create')
372
+ .description('Persist a comparison across two or more traces')
373
+ .requiredOption('--corr-ids <ids>', 'comma-separated conversation IDs (corr) to compare')
374
+ .option('--id <id>', 'comparison ID (auto-generated if omitted)')
375
+ .option('--name <name>', 'comparison name')
376
+ .option('--options <json>', 'JSON comparison options')
377
+ .option('--result <json>', 'JSON precomputed comparison result')
378
+ .option('--similarity-score <n>', 'similarity score (0-1)')
379
+ .action(async (options) => {
380
+ auth.requireAuth();
381
+ const body = {
382
+ id: options.id || randomUUID(),
383
+ corr_ids: options.corrIds.split(',').map(s => s.trim()).filter(Boolean),
384
+ };
385
+ if (options.name) body.name = options.name;
386
+ if (options.options) body.options = parseJSON(options.options, '--options');
387
+ if (options.result) body.result = parseJSON(options.result, '--result');
388
+ if (options.similarityScore) body.similarity_score = parseFloat(options.similarityScore);
389
+
390
+ const data = await client.post(resolveEndpoint('traces.comparisons.create').path, {
391
+ service: resolveEndpoint('traces.comparisons.create').service,
392
+ body,
393
+ });
394
+ printSuccess(`Trace comparison "${body.id}" created.`);
395
+ formatDetail(data.comparison || data, { format: program.opts().output });
396
+ });
397
+
398
+ comparison
399
+ .command('update')
400
+ .description('Rename a trace comparison')
401
+ .argument('<id>', 'comparison ID')
402
+ .requiredOption('--name <name>', 'new name')
403
+ .action(async (id, options) => {
404
+ auth.requireAuth();
405
+ await client.put(resolveEndpoint('traces.comparisons.update', { id }).path, {
406
+ service: resolveEndpoint('traces.comparisons.update', { id }).service,
407
+ body: { name: options.name },
408
+ });
409
+ printSuccess('Trace comparison updated.');
410
+ });
411
+
412
+ comparison
413
+ .command('delete')
414
+ .description('Delete a trace comparison')
415
+ .argument('<id>', 'comparison ID')
416
+ .option('--force', 'skip confirmation')
417
+ .action(async (id, options) => {
418
+ auth.requireAuth();
419
+ if (!(await confirmOrSkip(program, options, `Delete trace comparison ${id}? This cannot be undone.`))) {
420
+ printInfo('Cancelled.');
421
+ return;
422
+ }
423
+ await client.delete(resolveEndpoint('traces.comparisons.delete', { id }).path, {
424
+ service: resolveEndpoint('traces.comparisons.delete', { id }).service,
425
+ });
426
+ printSuccess('Trace comparison deleted.');
427
+ });
428
+
429
+ comparison
430
+ .command('delete-all')
431
+ .description('Delete ALL trace comparisons')
432
+ .option('--force', 'skip confirmation')
433
+ .action(async (options) => {
434
+ auth.requireAuth();
435
+ if (!(await confirmOrSkip(program, options, 'Delete ALL trace comparisons? This cannot be undone.'))) {
436
+ printInfo('Cancelled.');
437
+ return;
438
+ }
439
+ await client.delete(resolveEndpoint('traces.comparisons.deleteAll').path, {
440
+ service: resolveEndpoint('traces.comparisons.deleteAll').service,
441
+ });
442
+ printSuccess('All trace comparisons deleted.');
443
+ });
444
+
445
+ // ══ trace correlation — cross-agent correlation cache ═══════════════════════
446
+ // NOTE: the backend route is `/traces/correlations/:runId`, but the row it
447
+ // resolves against is keyed by `root_run_id` (see trvStatements.getCorrelationByRun
448
+ // / deleteCorrelation in services/collector/server.js) — the CLI argument is
449
+ // named <rootRunId> to match that semantics, not the literal route segment name.
450
+
451
+ const correlation = trace
452
+ .command('correlation')
453
+ .description('Manage the cross-agent trace correlation cache');
454
+
455
+ correlation
456
+ .command('list')
457
+ .description('List cached correlations')
458
+ .option('--limit <n>', 'max results', '30')
459
+ .option('--offset <n>', 'result offset', '0')
460
+ .action(async (options) => {
461
+ auth.requireAuth();
462
+ const data = await client.get(resolveEndpoint('traces.correlations.list').path, {
463
+ service: resolveEndpoint('traces.correlations.list').service,
464
+ query: { limit: options.limit, offset: options.offset },
465
+ });
466
+ formatOutput({
467
+ columns: ['id', 'root_run_id', 'correlation_id', 'agent_count', 'handoff_count', 'created_at', 'expires_at'],
468
+ headers: ['ID', 'Root Run', 'Correlation ID', 'Agents', 'Handoffs', 'Created', 'Expires'],
469
+ rows: data.correlations || data || [],
470
+ }, { format: program.opts().output, emptyMessage: 'No cached correlations found.' });
471
+ });
472
+
473
+ correlation
474
+ .command('get')
475
+ .description('Show the cached correlation tree for a root run')
476
+ .argument('<rootRunId>', 'root run ID')
477
+ .action(async (rootRunId) => {
478
+ auth.requireAuth();
479
+ const data = await client.get(resolveEndpoint('traces.correlations.get', { runId: rootRunId }).path, {
480
+ service: resolveEndpoint('traces.correlations.get', { runId: rootRunId }).service,
481
+ });
482
+ formatDetail(data.correlation || data, { format: program.opts().output, title: `Correlation: ${rootRunId}` });
483
+ });
484
+
485
+ correlation
486
+ .command('create')
487
+ .description('Store a correlation tree in the cache (24h TTL)')
488
+ .requiredOption('--root-run-id <id>', 'root run ID')
489
+ .requiredOption('--correlation-id <id>', 'correlation ID')
490
+ .option('--id <id>', 'cache entry ID (auto-generated if omitted)')
491
+ .option('--tree <json>', 'JSON correlation tree', '{}')
492
+ .option('--stats <json>', 'JSON stats object')
493
+ .option('--agent-count <n>', 'agent count', '0')
494
+ .option('--handoff-count <n>', 'handoff count', '0')
495
+ .action(async (options) => {
496
+ auth.requireAuth();
497
+ const body = {
498
+ id: options.id || randomUUID(),
499
+ root_run_id: options.rootRunId,
500
+ correlation_id: options.correlationId,
501
+ tree: parseJSON(options.tree, '--tree'),
502
+ agent_count: parseInt(options.agentCount, 10),
503
+ handoff_count: parseInt(options.handoffCount, 10),
504
+ };
505
+ if (options.stats) body.stats = parseJSON(options.stats, '--stats');
506
+
507
+ const data = await client.post(resolveEndpoint('traces.correlations.create').path, {
508
+ service: resolveEndpoint('traces.correlations.create').service,
509
+ body,
510
+ });
511
+ printSuccess(`Correlation cached (expires ${data.expires_at}).`);
512
+ });
513
+
514
+ correlation
515
+ .command('delete')
516
+ .description('Delete the cached correlation for a root run')
517
+ .argument('<rootRunId>', 'root run ID')
518
+ .option('--force', 'skip confirmation')
519
+ .action(async (rootRunId, options) => {
520
+ auth.requireAuth();
521
+ if (!(await confirmOrSkip(program, options, `Delete cached correlation for ${rootRunId}?`))) {
522
+ printInfo('Cancelled.');
523
+ return;
524
+ }
525
+ await client.delete(resolveEndpoint('traces.correlations.delete', { runId: rootRunId }).path, {
526
+ service: resolveEndpoint('traces.correlations.delete', { runId: rootRunId }).service,
527
+ });
528
+ printSuccess('Cached correlation deleted.');
529
+ });
530
+ }