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,361 @@
1
+ /**
2
+ * Memory commands: CRUD, search, stats, export, batch
3
+ *
4
+ * FINDING F5 (SEER first-test, QuoxIdentity): `memory search` used to hit
5
+ * the memory service DIRECTLY at :3103 (fragile cert/port, and a different
6
+ * code path from everything else). It now routes through the collector's
7
+ * governed POST /api/v1/tools/execute (tool_name memory_search), matching
8
+ * how nucleus.js and fleet.js already call that endpoint, so the op is
9
+ * org-scoped and audited exactly like every other tool call.
10
+ *
11
+ * `list` and `create` stay on the direct memory-service path: the collector
12
+ * only exposes memory_save/memory_search/memory_update/entity_note as
13
+ * governed tools (services/collector/lib/agentTools.js MEMORY_TOOLS): there
14
+ * is no memory_list tool, and memory_search itself 400s without a non-empty
15
+ * `q` (services/memory/server.js), so it cannot stand in for an unfiltered
16
+ * list. memory_save's type enum (fact/preference/decision/constraint/
17
+ * observation) also does not match `create`'s documented enum (which
18
+ * includes `entity`, not `constraint`), and it has no input for targeting
19
+ * an arbitrary --agent the way the direct endpoint's body.agent_id does.
20
+ * Converting either would be a silent behaviour change, not a port fix, so
21
+ * they were left as-is. See the F5 task report for the full note.
22
+ */
23
+
24
+ import { formatOutput, formatDetail, printSuccess } from '../core/output.js';
25
+ import { resolveEndpoint } from '../api/endpoints.js';
26
+ import { QuoxError } from '../core/errors.js';
27
+ import { resolveOrgId } from './helpers.js';
28
+ import { resolveMyAttach } from './agentAttach.js';
29
+ import { hasExplicitProfile } from '../core/actingAs.js';
30
+
31
+ // QUOXIDENTITY P9: which agent this session acts as is resolved session-scoped
32
+ // (QUOX_T subtree / QUOX_ATTACH_AGENT override / single-attach fallback), so
33
+ // two sessions on one box no longer collide. See agentAttach.js resolveMyAttach.
34
+ const detectSoleAttachLease = resolveMyAttach;
35
+
36
+ /**
37
+ * Call a governed collector memory tool (POST /api/v1/tools/execute).
38
+ * Lease-aware: when exactly one attach lease is active, the call is made
39
+ * AS that agent (its attach token, no caller org_id override) so the op is
40
+ * witnessed under the agent's own identity and scoped server-side to its
41
+ * namespace (services/collector/lib/memoryToolHandlers.js already scopes
42
+ * memory_search to attachLeaseId's agent_id). Otherwise it runs as the
43
+ * caller's own identity, org-scoped like nucleus.js's tool calls.
44
+ */
45
+ async function callMemoryTool({ client, auth, program }, toolName, input) {
46
+ const ep = resolveEndpoint('v1.tools.execute');
47
+ const body = { tool_name: toolName, input };
48
+ const requestOptions = { service: ep.service, body };
49
+
50
+ // An explicit -p/--profile (or QUOX_PROFILE) is the caller saying "as me":
51
+ // it wins over the session's attach lease, same precedence as
52
+ // core/actingAs. Before this, `quox -p moo memory search` inside an attached
53
+ // session went out on the lease token and 401'd (proof engine 2026-10-14).
54
+ const argv = (program.rawArgs || process.argv).slice(2);
55
+ const lease = hasExplicitProfile(argv) ? null : detectSoleAttachLease();
56
+ if (lease) {
57
+ requestOptions.noAuth = true;
58
+ requestOptions.headers = { Authorization: `Bearer ${lease.token}` };
59
+ } else {
60
+ const orgId = resolveOrgId(auth, program);
61
+ if (orgId) body.org_id = orgId;
62
+ }
63
+
64
+ return client.post(ep.path, requestOptions);
65
+ }
66
+
67
+ export function registerMemoryCommands(program, ctx) {
68
+ const { client, auth } = ctx;
69
+
70
+ const memory = program
71
+ .command('memory')
72
+ .description('Manage memories');
73
+
74
+ memory
75
+ .command('list')
76
+ .description('List memories')
77
+ .option('--type <type>', 'filter by type: fact, preference, decision, entity, observation')
78
+ .option('--limit <n>', 'max results', '50')
79
+ .option('--agent <agentId>', 'filter by agent')
80
+ .action(async (options) => {
81
+ auth.requireAuth();
82
+ const query = { limit: options.limit };
83
+ if (options.type) query.type = options.type;
84
+ if (options.agent) query.agent_id = options.agent;
85
+ const data = await client.get(resolveEndpoint('memory.list').path, { service: resolveEndpoint('memory.list').service, query });
86
+ formatOutput({
87
+ columns: ['id', 'type', 'content', 'tags', 'created_at'],
88
+ headers: ['ID', 'Type', 'Content', 'Tags', 'Created'],
89
+ rows: (data.memories || data).map(m => ({
90
+ ...m,
91
+ // fleet #373: the service stores/returns `memory_type`; this table
92
+ // read `type` and so rendered "-" for every row even though
93
+ // `--json` showed the value correctly.
94
+ type: m.memory_type ?? m.type,
95
+ content: (m.content || '').slice(0, 80),
96
+ tags: Array.isArray(m.tags) ? m.tags.join(', ') : m.tags,
97
+ })),
98
+ }, { format: program.opts().output });
99
+ });
100
+
101
+ memory
102
+ .command('get')
103
+ .description('Get memory details')
104
+ .argument('<id>', 'memory ID')
105
+ .action(async (id) => {
106
+ auth.requireAuth();
107
+ const data = await client.get(resolveEndpoint('memory.get', { id }).path, { service: resolveEndpoint('memory.get', { id }).service });
108
+ formatDetail(data.memory || data, { format: program.opts().output });
109
+ });
110
+
111
+ // Codex cycle 4 #10: how beliefs changed, and undoing a wrong correction.
112
+ memory
113
+ .command('timeline')
114
+ .description('Decisions that changed over time (newest change first)')
115
+ .argument('[query]', 'only chains mentioning this text')
116
+ .option('--limit <n>', 'max decisions', '20')
117
+ .action(async (query, options) => {
118
+ auth.requireAuth();
119
+ const ep = resolveEndpoint('memory.timeline');
120
+ const data = await client.get(ep.path, { service: ep.service, query: { q: query || '', limit: options.limit } });
121
+ const decisions = data.decisions || [];
122
+ formatOutput({
123
+ columns: ['id', 'changes', 'last_change', 'now', 'was'],
124
+ headers: ['Current ID', 'Changes', 'Last change', 'Now', 'Was'],
125
+ rows: decisions.map((d) => ({
126
+ id: d.current.id,
127
+ changes: d.changes,
128
+ last_change: d.last_change || '-',
129
+ now: (d.current.content || '').slice(0, 70),
130
+ was: (d.history[d.history.length - 2]?.content || '').slice(0, 70),
131
+ })),
132
+ }, { format: program.opts().output, raw: data });
133
+ });
134
+
135
+ memory
136
+ .command('history')
137
+ .description('Full change history of one belief, oldest first, with reasons')
138
+ .argument('<id>', 'memory ID (any version in the chain)')
139
+ .action(async (id) => {
140
+ auth.requireAuth();
141
+ const ep = resolveEndpoint('memory.history', { id });
142
+ const data = await client.get(ep.path, { service: ep.service });
143
+ formatOutput({
144
+ columns: ['id', 'state', 'created_at', 'content', 'reason'],
145
+ headers: ['ID', 'State', 'Created', 'Content', 'Replaced because'],
146
+ rows: (data.history || []).map((m) => ({
147
+ id: m.id,
148
+ state: m.valid ? 'current' : 'replaced',
149
+ created_at: m.created_at,
150
+ content: (m.content || '').slice(0, 80),
151
+ reason: (m.superseded_reason || '').slice(0, 80),
152
+ })),
153
+ }, { format: program.opts().output, raw: data });
154
+ });
155
+
156
+ memory
157
+ .command('reinstate')
158
+ .description('Undo a wrong correction: make a replaced belief current again')
159
+ .argument('<id>', 'ID of the replaced belief that was right')
160
+ .action(async (id) => {
161
+ auth.requireAuth();
162
+ const ep = resolveEndpoint('memory.reinstate', { id });
163
+ const data = await client.post(ep.path, { service: ep.service, body: {} });
164
+ if (program.opts().output === 'json') { console.log(JSON.stringify(data, null, 2)); return; }
165
+ printSuccess(`Reinstated ${data.reinstated?.id}; retired ${data.retired?.id} (marked disputed, Dream will not re-apply it)`);
166
+ });
167
+
168
+ memory
169
+ .command('create')
170
+ .description('Save a new memory')
171
+ .requiredOption('--type <type>', 'memory type: fact, preference, decision, entity, observation')
172
+ .requiredOption('--content <text>', 'memory content')
173
+ .option('--tags <tags>', 'comma-separated tags')
174
+ .option('--agent <agentId>', 'agent ID')
175
+ .action(async (options) => {
176
+ auth.requireAuth();
177
+ const body = {
178
+ type: options.type,
179
+ content: options.content,
180
+ };
181
+ if (options.tags) body.tags = options.tags.split(',').map(t => t.trim());
182
+ if (options.agent) body.agent_id = options.agent;
183
+ await client.post(resolveEndpoint('memory.create').path, { service: resolveEndpoint('memory.create').service, body });
184
+ printSuccess('Memory saved.');
185
+ });
186
+
187
+ memory
188
+ .command('update')
189
+ .description('Update a memory')
190
+ .argument('<id>', 'memory ID')
191
+ .option('--content <text>', 'new content')
192
+ .option('--tags <tags>', 'new tags (comma-separated)')
193
+ .action(async (id, options) => {
194
+ auth.requireAuth();
195
+ const body = {};
196
+ if (options.content) body.content = options.content;
197
+ if (options.tags) body.tags = options.tags.split(',').map(t => t.trim());
198
+ await client.patch(resolveEndpoint('memory.update', { id }).path, { service: resolveEndpoint('memory.update', { id }).service, body });
199
+ printSuccess('Memory updated.');
200
+ });
201
+
202
+ memory
203
+ .command('delete')
204
+ .description('Delete a memory')
205
+ .argument('<id>', 'memory ID')
206
+ .option('--hard', 'permanently delete (no soft-delete)')
207
+ .action(async (id, options) => {
208
+ auth.requireAuth();
209
+ const query = {};
210
+ if (options.hard) query.hard = 'true';
211
+ await client.delete(resolveEndpoint('memory.delete', { id }).path, { service: resolveEndpoint('memory.delete', { id }).service, query });
212
+ printSuccess('Memory deleted.');
213
+ });
214
+
215
+ // ONE-BRAIN CX6: the user-facing twin of the Cortex memory_forget tool.
216
+ // Same endpoint as `delete`; confirmation is required, like `notes rm`.
217
+ memory
218
+ .command('forget')
219
+ .description('Forget one of your memories (soft delete). Requires --yes. --permanent erases it for good (irreversible).')
220
+ .argument('<id>', 'memory ID')
221
+ .option('--permanent', 'permanently erase the memory (no soft-delete); cannot be undone')
222
+ .option('--yes', 'confirm forgetting')
223
+ .action(async (id, options) => {
224
+ auth.requireAuth();
225
+ if (!options.yes) throw new QuoxError(`Refusing to ${options.permanent ? 'permanently erase' : 'forget'} memory ${id} without --yes.`, 2);
226
+ const ep = resolveEndpoint('memory.delete', { id });
227
+ const query = {};
228
+ if (options.permanent) query.hard = 'true';
229
+ await client.delete(ep.path, { service: ep.service, query });
230
+ printSuccess(options.permanent ? `Permanently erased memory ${id}.` : `Forgot memory ${id}.`);
231
+ });
232
+
233
+ memory
234
+ .command('search')
235
+ .description('Search memories')
236
+ // #620: accept a positional query as shorthand; --query still works and
237
+ // wins if both are given. One of the two is required.
238
+ .argument('[query]', 'search query (shorthand for --query)')
239
+ .option('--query <q>', 'search query')
240
+ .option('--limit <n>', 'max results', '20')
241
+ .option('--type <type>', 'filter by type')
242
+ .action(async (queryArg, options) => {
243
+ auth.requireAuth();
244
+ const query = options.query || queryArg;
245
+ if (!query) {
246
+ throw new Error('A search query is required: `quox memory search "your query"` or --query "your query".');
247
+ }
248
+ // FINDING F5: governed path (POST /api/v1/tools/execute, tool_name
249
+ // memory_search) instead of a direct GET against the memory service.
250
+ // See the file header comment for why list/create stayed direct.
251
+ const input = { query, limit: options.limit };
252
+ if (options.type) input.type_filter = options.type;
253
+ const data = await callMemoryTool({ client, auth, program }, 'memory_search', input);
254
+ formatOutput({
255
+ // The governed memory_search tool's result shape (services/collector
256
+ // /lib/memoryToolHandlers.js memorySearch) has no `rank`/`score`
257
+ // field (it drops the FTS bm25 rank), so this column shows '-'.
258
+ columns: ['id', 'type', 'content', 'rank'],
259
+ headers: ['ID', 'Type', 'Content', 'Score'],
260
+ rows: (data.results || data.memories || []).map(m => ({
261
+ ...m,
262
+ type: m.memory_type ?? m.type, // fleet #373, same as list above
263
+ content: (m.content || '').slice(0, 80),
264
+ rank: typeof m.rank === 'number' ? m.rank.toFixed(2) : (m.rank ?? '-'),
265
+ })),
266
+ }, { format: program.opts().output });
267
+ });
268
+
269
+ // QUOXMIND #1111: the old view counted only rows under YOUR user id, so an
270
+ // org holding hundreds of agent-written memories looked nearly empty. Default
271
+ // is now the org view (per agent, per writer), falling back honestly.
272
+ memory
273
+ .command('stats')
274
+ .description('Show memory statistics: the whole org by agent and writer (org admins), else your own')
275
+ .option('--mine', 'only memories written under your own login')
276
+ .action(async (options) => {
277
+ auth.requireAuth();
278
+ const ep = resolveEndpoint('memory.stats.list');
279
+ let data;
280
+ let note = '';
281
+ if (options.mine) {
282
+ data = await client.get(ep.path, { service: ep.service, query: {} });
283
+ } else {
284
+ try {
285
+ data = await client.get(ep.path, { service: ep.service, query: { scope: 'org' } });
286
+ } catch (err) {
287
+ if (err?.status !== 403) throw err;
288
+ data = await client.get(ep.path, { service: ep.service, query: {} });
289
+ note = 'Org-wide counts need an org admin or owner. Showing only memories written under your own login; agents write under their own identities, so the org holds more.';
290
+ }
291
+ }
292
+ const format = program.opts().output;
293
+ if (format === 'json') { console.log(JSON.stringify(note ? { ...data, note } : data, null, 2)); return; }
294
+ if (data?.scope !== 'org') {
295
+ formatDetail(data.stats || data, { format, title: 'Memory Stats (your login only)' });
296
+ console.log(note || 'Counts only memories written under your own login. `quox memory stats` without --mine shows the whole org (org admins).');
297
+ return;
298
+ }
299
+ const m = data.memories || {};
300
+ console.log(`Memory Stats (org): ${m.total ?? 0} valid memories, ${m.not_valid ?? 0} superseded or deleted (kept for history), ${data.pinned ?? 0} pinned, last write ${data.last_write_at || 'never'}`);
301
+ if (m.by_type) console.log(`By type: ${Object.entries(m.by_type).map(([k, v]) => `${k} ${v}`).join(', ')}`);
302
+ formatOutput({
303
+ columns: ['agent', 'count'], headers: ['Agent', 'Memories'],
304
+ rows: Object.entries(data.by_agent || {}).map(([agent, count]) => ({ agent, count })),
305
+ }, { format });
306
+ formatOutput({
307
+ columns: ['user_id', 'kind', 'count', 'agents'], headers: ['Writer', 'Kind', 'Memories', 'Agents'],
308
+ rows: (data.by_user || []).map((u) => ({ ...u, agents: (u.agents || []).join(',') })),
309
+ }, { format });
310
+ console.log('Valid = not deleted and not superseded. A writer is the login a memory was saved under: your own, an agent identity, service/system (internal agents), or org-shared beliefs.');
311
+ });
312
+
313
+ memory
314
+ .command('core')
315
+ .description('Show the core set: memories loaded into every chat turn (pinned, plus auto-promoted decisions and facts rated high or critical)')
316
+ .option('--limit <n>', 'max memories', '20')
317
+ .action(async (options) => {
318
+ auth.requireAuth();
319
+ const ep = resolveEndpoint('memory.core-set');
320
+ const data = await client.get(ep.path, { service: ep.service, query: { limit: options.limit } });
321
+ formatOutput({
322
+ columns: ['id', 'core_reason', 'agent_id', 'memory_type', 'content'],
323
+ headers: ['ID', 'Why', 'Agent', 'Type', 'Content'],
324
+ rows: (data.memories || []).map((m) => ({ ...m, content: (m.content || '').slice(0, 80) })),
325
+ }, { format: program.opts().output, raw: data });
326
+ });
327
+
328
+ memory
329
+ .command('pin')
330
+ .description('Pin a memory into the core set so every chat turn carries it')
331
+ .argument('<id>', 'memory ID')
332
+ .action(async (id) => {
333
+ auth.requireAuth();
334
+ const ep = resolveEndpoint('memory.pin', { id });
335
+ const data = await client.post(ep.path, { service: ep.service, body: {} });
336
+ if (program.opts().output === 'json') { console.log(JSON.stringify(data, null, 2)); return; }
337
+ printSuccess(`Pinned ${id} into the core set.`);
338
+ });
339
+
340
+ memory
341
+ .command('unpin')
342
+ .description('Take a memory out of the core set (also stops it being auto-promoted)')
343
+ .argument('<id>', 'memory ID')
344
+ .action(async (id) => {
345
+ auth.requireAuth();
346
+ const ep = resolveEndpoint('memory.unpin', { id });
347
+ const data = await client.delete(ep.path, { service: ep.service });
348
+ if (program.opts().output === 'json') { console.log(JSON.stringify(data, null, 2)); return; }
349
+ printSuccess(`Unpinned ${id}: it stays a memory, but is no longer in the core set.`);
350
+ });
351
+
352
+ memory
353
+ .command('export')
354
+ .description('Export all memories')
355
+ .option('--format <fmt>', 'export format', 'json')
356
+ .action(async (options) => {
357
+ auth.requireAuth();
358
+ const data = await client.get(resolveEndpoint('memory.export.list').path, { service: resolveEndpoint('memory.export.list').service, query: { format: options.format } });
359
+ console.log(JSON.stringify(data, null, 2));
360
+ });
361
+ }
@@ -0,0 +1,71 @@
1
+ /**
2
+ * `quox mind implants|implant <id>|health`: QuoxMind cognitive implants (read-only).
3
+ * Collector routes under /api/v1/mind (org-scoped). Implants with no recorded
4
+ * activity say so; nothing is invented.
5
+ */
6
+ import { formatOutput } from '../core/output.js';
7
+ import { resolveEndpoint } from '../api/endpoints.js';
8
+ import { resolveOrgId } from './helpers.js';
9
+
10
+ export function registerMindCommands(program, ctx) {
11
+ const { client, auth } = ctx;
12
+ const get = async (name, params) => {
13
+ auth.requireAuth();
14
+ const ep = resolveEndpoint(name, params);
15
+ return client.get(ep.path, { service: ep.service, query: { org_id: resolveOrgId(auth, program) } });
16
+ };
17
+ const isJson = () => program.opts().output === 'json';
18
+
19
+ const mind = program.command('mind').description('QuoxMind: the cognitive implants (read-only)');
20
+
21
+ mind
22
+ .command('implants')
23
+ .description('List the cognitive implants: purpose, status, last activity')
24
+ .action(async () => {
25
+ const data = await get('mind.implants');
26
+ const rows = data.implants || [];
27
+ formatOutput(rows.map((i) => ({
28
+ ID: i.short,
29
+ NAME: i.name,
30
+ PURPOSE: i.purpose,
31
+ STATUS: i.status,
32
+ 'LAST ACTIVITY': i.last_activity || 'no activity recorded',
33
+ // QUOXMIND-PROOF: firing evidence from the implant's own table (null = not tracked).
34
+ 'LAST FIRED': i.activity_error ? 'unknown' : (typeof i.fired_7d === 'number' ? (i.last_fired || 'never') : 'not tracked'),
35
+ '7D': typeof i.fired_7d === 'number' && !i.activity_error ? i.fired_7d : '-',
36
+ })), {
37
+ format: program.opts().output,
38
+ columns: ['ID', 'NAME', 'STATUS', 'LAST FIRED', '7D', 'PURPOSE'],
39
+ emptyMessage: 'No implants registered.',
40
+ raw: rows,
41
+ });
42
+ });
43
+
44
+ mind
45
+ .command('implant <id>')
46
+ .description('One implant in detail (e.g. predict, reflect, repobrain, qortex)')
47
+ .action(async (id) => {
48
+ const d = await get('mind.implant', { id });
49
+ if (isJson()) { console.log(JSON.stringify(d, null, 2)); return; }
50
+ console.log(`${d.name} (${d.short}) · ${d.status}${d.tier ? ` · ${d.tier}` : ''}`);
51
+ console.log(d.description || d.purpose);
52
+ if (d.inspired_by) console.log(`Inspired by: ${d.inspired_by}`);
53
+ if (d.summary) console.log(`Now: ${d.summary}`);
54
+ console.log(d.activity);
55
+ if (typeof d.fired_7d === 'number' && !d.activity_error) console.log(`Fired: ${d.last_fired || 'never'} · ${d.fired_7d} in the last 7 days${d.activity_source ? ` (from ${d.activity_source})` : ''}`);
56
+ else if (d.activity_error) console.log(`Fired: unknown (${d.activity_error})`);
57
+ for (const [k, v] of Object.entries(d.metrics || {})) if (v !== null && typeof v !== 'object') console.log(` ${k}: ${v}`);
58
+ });
59
+
60
+ mind
61
+ .command('health')
62
+ .description('Summary of QuoxMind health across all implants')
63
+ .action(async () => {
64
+ const d = await get('mind.health');
65
+ if (isJson()) { console.log(JSON.stringify(d, null, 2)); return; }
66
+ console.log(`${d.total} implants: ${Object.entries(d.by_status).map(([k, v]) => `${v} ${k}`).join(', ')}`);
67
+ console.log(`${d.with_activity} with recorded activity, ${d.no_activity} with no activity recorded`);
68
+ if (typeof d.fired_7d_total === 'number') console.log(`Last 7 days: ${d.fired_7d_implants} implants fired (${d.fired_7d_total} firings), ${d.silent_7d} silent, ${d.activity_unknown} not tracked`);
69
+ console.log(d.average_health === null ? 'Average health: not enough data' : `Average health: ${d.average_health} (over ${d.scored} scored)`);
70
+ });
71
+ }