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,375 @@
1
+ /**
2
+ * Admin commands: config, keys, services, logs, stats, retention
3
+ */
4
+
5
+ import { formatOutput, formatDetail, printSuccess } from '../core/output.js';
6
+ import { resolveEndpoint } from '../api/endpoints.js';
7
+
8
+ export function registerAdminCommands(program, ctx) {
9
+ const { client, auth } = ctx;
10
+
11
+ const admin = program
12
+ .command('admin')
13
+ .description('Platform administration');
14
+
15
+ // Config
16
+ const cfg = admin
17
+ .command('config')
18
+ .description('Manage platform configuration');
19
+
20
+ cfg
21
+ .command('get')
22
+ .description('Get platform config (all keys, or one key)')
23
+ .argument('[key]', 'show only this key')
24
+ .action(async (key) => {
25
+ auth.requireAuth();
26
+ const data = await client.get(resolveEndpoint('admin.config.list').path, { service: resolveEndpoint('admin.config.list').service });
27
+ const config = data.config || data;
28
+ if (key) {
29
+ // quox#533: `get <key>` used to be rejected outright.
30
+ // #1010: auth returns an ARRAY of { key, value, ... } rows; an object map is handled too.
31
+ if (Array.isArray(config)) {
32
+ const row = config.find((r) => r && r.key === key);
33
+ if (!row) throw new Error(`config key "${key}" not found. Run \`quox admin config get\` to list all keys.`);
34
+ formatDetail(row, { format: program.opts().output, title: 'Platform Config' });
35
+ return;
36
+ }
37
+ if (!config || typeof config !== 'object' || !(key in config)) {
38
+ throw new Error(`config key "${key}" not found. Run \`quox admin config get\` to list all keys.`);
39
+ }
40
+ formatDetail({ [key]: config[key] }, { format: program.opts().output, title: 'Platform Config' });
41
+ return;
42
+ }
43
+ formatDetail(config, { format: program.opts().output, title: 'Platform Config' });
44
+ });
45
+
46
+ cfg
47
+ .command('set')
48
+ .description('Set a config value')
49
+ .argument('<key>', 'config key')
50
+ .argument('<value>', 'config value')
51
+ .action(async (key, value) => {
52
+ auth.requireAuth();
53
+ await client.patch(resolveEndpoint('admin.config.update', { key }).path, { service: resolveEndpoint('admin.config.update', { key }).service, body: { value } });
54
+ printSuccess(`Config ${key} updated.`);
55
+ });
56
+
57
+ // LICENSE-LAUNCH LL-6b: enforcement posture + break-glass. Parity with the
58
+ // dashboard's Settings → Security → Enforcement panel. In production a
59
+ // security gate switched off in the environment is enforced anyway unless an
60
+ // unexpired break-glass record exists, so an operator needs to see and set
61
+ // those records from the CLI too, not only from the browser.
62
+ const enforcement = admin
63
+ .command('enforcement')
64
+ .description('Security enforcement posture and break-glass windows');
65
+
66
+ enforcement
67
+ .command('list')
68
+ .description('Show every enforcement flag: what the environment asks for and what is actually enforced')
69
+ .action(async () => {
70
+ auth.requireAuth();
71
+ const ep = resolveEndpoint('admin.enforcement.list');
72
+ const data = await client.get(ep.path, { service: ep.service });
73
+ const rows = (data.flags || []).map((f) => ({
74
+ key: f.key,
75
+ env: f.env_enforced ? 'enforce' : 'off',
76
+ effective: f.forced_on ? 'ENFORCED (forced)' : (f.enforced ? 'enforced' : 'off'),
77
+ break_glass: f.break_glass ? `until ${f.break_glass.expires_at}` : '-',
78
+ reason: f.break_glass ? f.break_glass.reason : '',
79
+ }));
80
+ formatOutput({
81
+ columns: ['key', 'env', 'effective', 'break_glass', 'reason'],
82
+ headers: ['Flag', 'Env', 'Effective', 'Break-glass', 'Reason'],
83
+ rows,
84
+ }, { format: program.opts().output });
85
+ });
86
+
87
+ enforcement
88
+ .command('break-glass')
89
+ .description('Open a bounded break-glass window so a gate may stay off in production')
90
+ .argument('<flag>', 'enforcement flag, e.g. COLLECTOR_AUTH_ENFORCE')
91
+ .requiredOption('--reason <reason>', 'why this gate has to be off (recorded against your account)')
92
+ .option('--hours <hours>', 'window length in hours, 72 maximum', '4')
93
+ .action(async (flag, opts) => {
94
+ auth.requireAuth();
95
+ const hours = Number(opts.hours);
96
+ if (!Number.isFinite(hours) || hours <= 0) {
97
+ throw new Error('--hours must be a positive number of hours (72 maximum)');
98
+ }
99
+ const ep = resolveEndpoint('admin.enforcement.break_glass.open');
100
+ const data = await client.post(ep.path, {
101
+ service: ep.service,
102
+ body: {
103
+ flag,
104
+ reason: opts.reason,
105
+ expires_at: new Date(Date.now() + hours * 3600_000).toISOString(),
106
+ },
107
+ });
108
+ printSuccess(`Break-glass open for ${flag} until ${data.break_glass.expires_at}.`);
109
+ });
110
+
111
+ enforcement
112
+ .command('clear')
113
+ .description('Close a break-glass window early')
114
+ .argument('<flag>', 'enforcement flag, e.g. COLLECTOR_AUTH_ENFORCE')
115
+ .action(async (flag) => {
116
+ auth.requireAuth();
117
+ const ep = resolveEndpoint('admin.enforcement.break_glass.clear', { flag });
118
+ const data = await client.delete(ep.path, { service: ep.service });
119
+ printSuccess(data.cleared
120
+ ? `Break-glass closed for ${flag}.`
121
+ : `No break-glass window was open for ${flag}.`);
122
+ });
123
+
124
+ // QUOXPERTICUS P2: governed agent-identity mint (instance-admin only).
125
+ const agentIdentity = admin
126
+ .command('agent-identity')
127
+ .description('Manage governed agent identities (agent-typed user + bound mcp token)');
128
+
129
+ agentIdentity
130
+ .command('mint')
131
+ .description('Mint (or rotate) an agent identity; prints the raw token ONCE')
132
+ .argument('<agentId>', 'agent id, e.g. quoxperticus')
133
+ // NOT requiredOption: --org shadows the root program's global --org
134
+ // <slug> (bin/quox.js). Commander's mandatory-option check runs BEFORE
135
+ // the mergeShadowedGlobals preAction hook, so a requiredOption here
136
+ // always fired "required option '--org' not specified" even when the
137
+ // user supplied it (quox#457 sweep). Validated explicitly below instead.
138
+ .option('--org <orgId>', 'org ULID the agent operates under')
139
+ .option('--rotate', 'revoke the live token and issue a new one')
140
+ .action(async (agentId, opts) => {
141
+ auth.requireAuth();
142
+ if (!opts.org || !String(opts.org).trim()) {
143
+ throw new Error(
144
+ 'Missing --org <orgId>. Usage: quox admin agent-identity mint <agentId> --org <orgId>'
145
+ );
146
+ }
147
+ const ep = resolveEndpoint('admin.agent_identity.mint');
148
+ const data = await client.post(ep.path, {
149
+ service: ep.service,
150
+ body: { agent_id: agentId, org_id: opts.org, rotate: opts.rotate === true },
151
+ });
152
+ printSuccess(`Agent identity ${data.agent_id} ${data.rotated ? 'rotated' : 'minted'} (user ${data.user_id}).`);
153
+ console.log('Raw token (shown ONCE, place it in the supervisor root-only env):');
154
+ console.log(data.token);
155
+ });
156
+
157
+ // Email / SMTP (QCPRO-SMTP): instance email onboarding parity
158
+ const email = admin
159
+ .command('email')
160
+ .description('Instance email delivery (SMTP)');
161
+
162
+ email
163
+ .command('status')
164
+ .description('Show email delivery status (configured, from, last test)')
165
+ .action(async () => {
166
+ auth.requireAuth();
167
+ const ep = resolveEndpoint('admin.email.status');
168
+ const data = await client.get(ep.path, { service: ep.service });
169
+ formatDetail(data, { format: program.opts().output, title: 'Email Delivery' });
170
+ });
171
+
172
+ email
173
+ .command('setup')
174
+ .description('Configure instance SMTP (password encrypted at rest; omit --pass to keep the stored one)')
175
+ .requiredOption('--host <host>', 'SMTP host')
176
+ .option('--port <port>', 'SMTP port', '587')
177
+ .option('--user <user>', 'SMTP username')
178
+ .option('--pass <pass>', 'SMTP password')
179
+ .requiredOption('--from <from>', 'From address, e.g. "QuoxCORE <noreply@acme.com>"')
180
+ .option('--secure', 'Use TLS (direct TLS for 465, STARTTLS otherwise)', true)
181
+ .option('--no-secure', 'Disable TLS')
182
+ .action(async (opts) => {
183
+ auth.requireAuth();
184
+ const ep = resolveEndpoint('admin.email.smtp');
185
+ await client.put(ep.path, {
186
+ service: ep.service,
187
+ body: {
188
+ host: opts.host,
189
+ port: Number(opts.port),
190
+ user: opts.user || '',
191
+ pass: opts.pass || '',
192
+ from: opts.from,
193
+ secure: !!opts.secure,
194
+ },
195
+ });
196
+ printSuccess('SMTP configured. Run "quox admin email test" to verify delivery.');
197
+ });
198
+
199
+ email
200
+ .command('test')
201
+ .description('Send a test email and report the honest outcome')
202
+ .option('--to <address>', 'Recipient (defaults to your account email)')
203
+ .action(async (opts) => {
204
+ auth.requireAuth();
205
+ const ep = resolveEndpoint('admin.email.test');
206
+ const result = await client.post(ep.path, { service: ep.service, body: opts.to ? { to: opts.to } : {} });
207
+ if (result.delivered) {
208
+ printSuccess(`Delivered (message id ${result.message_id || 'unknown'}).`);
209
+ } else {
210
+ console.error(`Not delivered: ${result.reason || 'unknown error'}`);
211
+ process.exitCode = 1;
212
+ }
213
+ });
214
+
215
+ // API Keys
216
+ const keys = admin
217
+ .command('key')
218
+ .description('Manage API keys');
219
+
220
+ keys
221
+ .command('list')
222
+ .description('List API keys')
223
+ .action(async () => {
224
+ auth.requireAuth();
225
+ const data = await client.get(resolveEndpoint('admin.keys.list').path, { service: resolveEndpoint('admin.keys.list').service });
226
+ formatOutput({
227
+ // fleet #392: api_keys has key_preview/last_used_at; prefix, role
228
+ // and expires_at don't exist on this row at all.
229
+ columns: ['id', 'name', 'key_preview', 'last_used_at', 'created_at'],
230
+ headers: ['ID', 'Name', 'Preview', 'Last Used', 'Created'],
231
+ rows: data.keys || data,
232
+ }, { format: program.opts().output });
233
+ });
234
+
235
+ keys
236
+ .command('create')
237
+ .description('Create an API key')
238
+ .requiredOption('--name <name>', 'key name')
239
+ .option('--role <role>', 'key role', 'viewer')
240
+ .option('--expires <date>', 'expiry date (ISO)')
241
+ .action(async (options) => {
242
+ auth.requireAuth();
243
+ const body = { name: options.name, role: options.role };
244
+ if (options.expires) body.expires_at = options.expires;
245
+ const data = await client.post(resolveEndpoint('admin.keys.create').path, { service: resolveEndpoint('admin.keys.create').service, body });
246
+ if (data.key || data.api_key) {
247
+ const key = data.key || data.api_key;
248
+ if (program.opts().output === 'json') {
249
+ console.log(JSON.stringify({ key, id: data.id, name: data.name }));
250
+ } else if (program.opts().output === 'quiet') {
251
+ console.log(key);
252
+ } else {
253
+ console.log(`API Key: ${key}`);
254
+ console.log('(Save this key now — it will not be shown again)');
255
+ }
256
+ } else {
257
+ printSuccess('API key created.');
258
+ }
259
+ });
260
+
261
+ keys
262
+ .command('delete')
263
+ .description('Delete an API key')
264
+ .argument('<keyId>', 'key ID')
265
+ .action(async (keyId) => {
266
+ auth.requireAuth();
267
+ await client.delete(resolveEndpoint('admin.keys.delete', { keyId }).path, { service: resolveEndpoint('admin.keys.delete', { keyId }).service });
268
+ printSuccess('API key deleted.');
269
+ });
270
+
271
+ keys
272
+ .command('test')
273
+ .description('Test an API key')
274
+ .argument('<keyId>', 'key ID')
275
+ .action(async (keyId) => {
276
+ auth.requireAuth();
277
+ const data = await client.post(resolveEndpoint('admin.keys.test', { keyId }).path, { service: resolveEndpoint('admin.keys.test', { keyId }).service });
278
+ printSuccess(data.valid ? 'API key is valid.' : 'API key test failed.');
279
+ });
280
+
281
+ // Services
282
+ const services = admin
283
+ .command('service')
284
+ .description('Manage platform services');
285
+
286
+ services
287
+ .command('list')
288
+ .description('List registered services')
289
+ .action(async () => {
290
+ auth.requireAuth();
291
+ const data = await client.get(resolveEndpoint('admin.services.list').path, { service: resolveEndpoint('admin.services.list').service });
292
+ formatOutput({
293
+ // fleet #392: services has health_endpoint/last_check_at, not
294
+ // url/last_check.
295
+ columns: ['id', 'name', 'status', 'health_endpoint', 'last_check_at'],
296
+ headers: ['ID', 'Name', 'Status', 'Health URL', 'Last Check'],
297
+ rows: data.services || data,
298
+ }, { format: program.opts().output });
299
+ });
300
+
301
+ // Logs
302
+ admin
303
+ .command('logs')
304
+ .description('View admin audit logs')
305
+ .option('--action <action>', 'filter by action')
306
+ .option('--limit <n>', 'max results', '50')
307
+ .action(async (options) => {
308
+ auth.requireAuth();
309
+ const query = { limit: options.limit };
310
+ if (options.action) query.action = options.action;
311
+ const data = await client.get(resolveEndpoint('admin.logs.list').path, { service: resolveEndpoint('admin.logs.list').service, query });
312
+ formatOutput({
313
+ // fleet #392: system_logs has { created_at, service, level, message,
314
+ // user_id } — none of timestamp/user_email/action/detail exist, so
315
+ // all four columns were dashes.
316
+ columns: ['created_at', 'service', 'level', 'message', 'user_id'],
317
+ headers: ['Time', 'Service', 'Level', 'Message', 'User'],
318
+ rows: data.logs || data.entries || data,
319
+ }, { format: program.opts().output });
320
+ });
321
+
322
+ // Stats
323
+ admin
324
+ .command('stats')
325
+ .description('Show platform statistics')
326
+ .action(async () => {
327
+ auth.requireAuth();
328
+ const data = await client.get(resolveEndpoint('admin.stats.list').path, { service: resolveEndpoint('admin.stats.list').service });
329
+ formatDetail(data.stats || data, { format: program.opts().output, title: 'Platform Stats' });
330
+ });
331
+
332
+ // Retention
333
+ const retention = admin
334
+ .command('retention')
335
+ .description('Manage data retention');
336
+
337
+ retention
338
+ .command('config')
339
+ .description('View retention config')
340
+ .action(async () => {
341
+ auth.requireAuth();
342
+ const data = await client.get(resolveEndpoint('admin.retention.config.list').path, { service: resolveEndpoint('admin.retention.config.list').service });
343
+ formatDetail(data.config || data, { format: program.opts().output, title: 'Retention Config' });
344
+ });
345
+
346
+ retention
347
+ .command('cleanup')
348
+ .description('Run retention cleanup')
349
+ .option('--dry-run', 'preview without deleting')
350
+ .action(async (options) => {
351
+ auth.requireAuth();
352
+ const body = {};
353
+ if (options.dryRun) body.dry_run = true;
354
+ const data = await client.post(resolveEndpoint('admin.retention.cleanup').path, { service: resolveEndpoint('admin.retention.cleanup').service, body });
355
+ if (options.dryRun) {
356
+ // quox#1084: servers before the fix ignored dry_run and deleted for real.
357
+ // Never present an unconfirmed result as a harmless preview.
358
+ if (!data || data.dry_run !== true) {
359
+ throw new Error('the server did not honour --dry-run (it predates quox#1084): the cleanup may have run for real. Check `quox admin retention stats`.');
360
+ }
361
+ formatDetail(data, { format: program.opts().output, title: 'Cleanup preview (dry run): nothing deleted' });
362
+ return;
363
+ }
364
+ formatDetail(data, { format: program.opts().output, title: 'Cleanup Result' });
365
+ });
366
+
367
+ retention
368
+ .command('stats')
369
+ .description('View retention statistics')
370
+ .action(async () => {
371
+ auth.requireAuth();
372
+ const data = await client.get(resolveEndpoint('admin.retention.stats.list').path, { service: resolveEndpoint('admin.retention.stats.list').service });
373
+ formatDetail(data.stats || data, { format: program.opts().output, title: 'Retention Stats' });
374
+ });
375
+ }
@@ -0,0 +1,99 @@
1
+ /**
2
+ * AEE (Agent Envelope Exchange) commands
3
+ */
4
+
5
+ import { formatOutput, formatDetail, printSuccess } from '../core/output.js';
6
+ import { parseJSON } from './helpers.js';
7
+ import { resolveEndpoint } from '../api/endpoints.js';
8
+
9
+ export function registerAeeCommands(program, ctx) {
10
+ const { client, auth } = ctx;
11
+
12
+ const aee = program
13
+ .command('aee')
14
+ .description('Agent Envelope Exchange protocol');
15
+
16
+ aee
17
+ .command('store')
18
+ .description('Store an AEE envelope')
19
+ .requiredOption('--envelope <json>', 'envelope data as JSON')
20
+ .action(async (options) => {
21
+ auth.requireAuth();
22
+ const envelope = parseJSON(options.envelope, '--envelope');
23
+ await client.post(resolveEndpoint('aee.store').path, { service: resolveEndpoint('aee.store').service, body: envelope });
24
+ printSuccess('Envelope stored.');
25
+ });
26
+
27
+ aee
28
+ .command('get')
29
+ .description('Get an envelope by ID')
30
+ .argument('<id>', 'envelope ID')
31
+ .action(async (id) => {
32
+ auth.requireAuth();
33
+ const data = await client.get(resolveEndpoint('aee.get', { id }).path, { service: resolveEndpoint('aee.get', { id }).service });
34
+ formatDetail(data.envelope || data, { format: program.opts().output });
35
+ });
36
+
37
+ aee
38
+ .command('query')
39
+ .description('Query envelopes')
40
+ // fleet #386 + adjacent fix: --from/--to were described as dates, but the
41
+ // route matches them against the envelope's "from"/"to" columns — the AEE
42
+ // sender and recipient (from: 'human.adam', to: 'agent.cipher'). Passing a
43
+ // date matched a sender literally named "2026-01-01", i.e. nothing. The
44
+ // route's real date filters are after/before, which the CLI never sent, so
45
+ // date filtering was unreachable. Descriptions now match the protocol, and
46
+ // --after/--before/--intent expose filters the route already supported.
47
+ .option('--from <sender>', 'envelope sender (e.g. human.adam, agent.cipher)')
48
+ .option('--to <recipient>', 'envelope recipient')
49
+ .option('--after <date>', 'only envelopes at/after this ISO timestamp')
50
+ .option('--before <date>', 'only envelopes before this ISO timestamp')
51
+ .option('--intent <intent>', 'intent substring match (e.g. quox.chat)')
52
+ .option('--corr <id>', 'correlation ID — the envelopes of one conversation (see `aee conversations`)')
53
+ .option('--type <type>', 'envelope type')
54
+ .option('--limit <n>', 'max results', '50')
55
+ .action(async (options) => {
56
+ auth.requireAuth();
57
+ const query = { limit: options.limit };
58
+ if (options.from) query.from = options.from;
59
+ if (options.to) query.to = options.to;
60
+ if (options.after) query.after = options.after;
61
+ if (options.before) query.before = options.before;
62
+ if (options.intent) query.intent = options.intent;
63
+ if (options.corr) query.corr = options.corr;
64
+ if (options.type) query.type = options.type;
65
+ const data = await client.get(resolveEndpoint('aee.query.list').path, { service: resolveEndpoint('aee.query.list').service, query });
66
+ formatOutput({
67
+ columns: ['id', 'type', 'from', 'to', 'intent', 'ts'],
68
+ headers: ['ID', 'Type', 'From', 'To', 'Intent', 'Time'],
69
+ rows: data.envelopes || data.results || data,
70
+ }, { format: program.opts().output });
71
+ });
72
+
73
+ aee
74
+ .command('conversations')
75
+ .description('List AEE conversations')
76
+ .option('--limit <n>', 'max results', '20')
77
+ .action(async (options) => {
78
+ auth.requireAuth();
79
+ const data = await client.get(resolveEndpoint('aee.conversations.list').path, { service: resolveEndpoint('aee.conversations.list').service, query: { limit: options.limit } });
80
+ formatOutput({
81
+ // fleet #385: the endpoint returns { corr, first_ts, last_ts, count }
82
+ // (see the GROUP BY corr query in collector/server.js). This declared
83
+ // corr_id/envelope_count, which don't exist in the payload, so two of
84
+ // three columns rendered as dashes with no error.
85
+ columns: ['corr', 'count', 'last_ts'],
86
+ headers: ['Conversation', 'Envelopes', 'Last Activity'],
87
+ rows: data.conversations || data,
88
+ }, { format: program.opts().output });
89
+ });
90
+
91
+ aee
92
+ .command('stats')
93
+ .description('AEE statistics')
94
+ .action(async () => {
95
+ auth.requireAuth();
96
+ const data = await client.get(resolveEndpoint('aee.stats.list').path, { service: resolveEndpoint('aee.stats.list').service });
97
+ formatDetail(data.stats || data, { format: program.opts().output, title: 'AEE Stats' });
98
+ });
99
+ }