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
package/LICENSE ADDED
@@ -0,0 +1,35 @@
1
+ QUOX COMMUNITY SOURCE LICENCE 1.0
2
+ Effective: 12 October 2026
3
+ Copyright (c) 2025-2026 Quox LTD. All rights reserved.
4
+
5
+ THIS IS A SOURCE-AVAILABLE PROPRIETARY LICENCE. IT IS NOT AN OPEN-SOURCE LICENCE.
6
+
7
+ 1. Scope and ownership. "Licensor" is Quox LTD ("Quox"). "You" is a person or legal entity exercising the licence. "Licensed Software" means Quox-owned source code, executables, user interface, and accompanying documentation expressly distributed with this licence. It excludes third-party components governed by their own notices, and separately licensed Quox products such as Apache-2.0 protocols and MIT SDKs. Quox retains all rights not expressly granted.
8
+
9
+ 2. Free self-hosting and inspection. Subject to compliance, Quox grants You a worldwide, royalty-free, non-exclusive, non-transferable, non-sublicensable licence to acquire official Quox distributions, view and inspect their source, build unmodified software as required for deployment, and install and run any number of unmodified instances for Your own personal, educational, non-profit, or commercial operations. There are no licence fees or limits on seats, installations, servers, business revenue or duration for compliant use. You may make copies reasonably needed for installation, development and test environments, backups, disaster recovery, upgrades and migration, including on infrastructure You rent or control. A version lawfully acquired under this licence may be used indefinitely unless Your licence for that version validly terminates for breach under Section 11.
10
+
11
+ 3. Independent extensions. You may create, use, modify, publish, distribute, license, and sell independent plugins, agents, skills, workflows, automations, themes, integrations, connectors, applications and other extensions through documented Quox APIs, plugin systems and extension points. Quox does not gain ownership of those independent works by their use with Quox. Their creators choose their licences, subject to any third-party components and any separately accepted marketplace terms. An extension must not contain or distribute Quox-owned protected core code absent separate permission. Selling Your own outputs, services or products made USING Quox is permitted; selling access to Quox itself as a platform is addressed in Section 6.
12
+
13
+ 4. Protected core. Unless expressly allowed by this licence or non-waivable law, You must not edit, patch, modify or create derivative distributions of Quox-owned core source or binaries, replace or bypass core security/governance/licence controls, or distribute unofficial altered builds. Documented configuration, deployment settings, ordinary build output of unmodified source, dependency installation, troubleshooting, logging, source inspection, independent interoperability and supported plugins are permitted. This section does not attempt to forbid lawful observation, testing, security research or mandatory statutory rights.
14
+
15
+ 5. Distribution and repackaging. You must not sublicense, mirror, redistribute, rent, sell, OEM-bundle, repackage, commercially distribute or present protected Quox software (or a substantial portion) as a product without written permission. Copies reasonably necessary for Your permitted deployment, internal company operations and backups are allowed. GitHub forks/copies permitted by GitHub's own platform terms remain permitted on that service, but grant no independent right to alter core or distribute it commercially. Independently authored installers, scripts or deployment manifests may reference official Quox downloads without bundling the Licensed Software. Do not represent unofficial software as an official Quox release.
16
+
17
+ 6. Hosting, managed services, and white label. You may not supply third parties with Quox platform functions as a hosted, managed, multi-customer, white-labelled, OEM or platform-as-a-service offering, or operate multiple customer Quox instances as Your branded commercial service, without a separate agreement. This does not prohibit operating Quox for Your own organisation, using generic cloud hosting, selling Your own business services or their outputs, or paying a contractor to install or maintain YOUR directly licensed official Quox instance as Your agent. A contractor must not present Quox as its own hosted product. Commercial hosted-service and white-label terms are available from Quox separately.
18
+
19
+ 7. Branding and attribution. The official Quox name, logo, copyright notices and existing attribution in product-owned interfaces and command-line presentation must remain visible and unaltered, except under a separate written white-label agreement. You may add branding for Your own organisations, tenants, plugins, reports, documents and content via supported configuration without obscuring Quox product identity. No Quox trade mark ownership, registration rights, or general trade mark licence is granted. Accurate descriptive references and legally permitted use are unaffected.
20
+
21
+ 8. Commercial exceptions. Quox may separately license core changes, redistributions, OEM integrations, managed hosting, white labels, support and commercial features. No such agreement is required for compliant free self-hosting or the development and sale of genuinely independent extensions. A commercial agreement must expressly state its granted rights.
22
+
23
+ 9. Third-party and statutory rights. Third-party and open-source notices govern their respective components; nothing here claims to relicense them. Nothing restricts independent interoperable software solely for communicating through Quox interfaces. Nothing excludes rights which applicable law makes non-waivable, including software backups, lawful observation and testing, interoperability and applicable consumer or security-research rights. Any conflicting restriction is limited to the extent required by law.
24
+
25
+ 10. No mandatory account or telemetry. This licence does not require paid activation, compulsory telemetry or a Quox-hosted account to run the free self-hosted software. You retain rights in Your data, configurations, and independent extensions. Optional online services or marketplaces may have additional separately disclosed terms.
26
+
27
+ 11. Breach, cure and termination. Rights depend on compliance. For a curable material breach, Quox will ordinarily provide written notice describing it and thirty (30) days to cure before termination. Deliberate, continuing misappropriation, misleading commercial distribution or unlawful circumvention may justify immediate protective action as allowed by law. Upon valid termination, cease unlicensed use/distribution of protected Quox-owned software. Termination does not transfer ownership of Your extensions or data or revoke third-party open-source rights.
28
+
29
+ 12. Warranty and liability. TO THE MAXIMUM EXTENT PERMITTED BY LAW, LICENSED SOFTWARE IS PROVIDED "AS IS", WITHOUT EXPRESS OR IMPLIED WARRANTIES, INCLUDING MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, AND NON-INFRINGEMENT. QUOX EXCLUDES LIABILITY FOR INDIRECT, SPECIAL, INCIDENTAL, CONSEQUENTIAL AND PUNITIVE DAMAGES TO THE EXTENT LAWFUL. NOTHING EXCLUDES LIABILITY WHICH CANNOT BE EXCLUDED BY LAW, INCLUDING FRAUD OR DEATH OR PERSONAL INJURY CAUSED BY NEGLIGENCE WHERE APPLICABLE.
30
+
31
+ 13. Law and versions. This licence is governed by the law of England and Wales, subject to mandatory protections in Your jurisdiction. Courts of England and Wales have jurisdiction where legally permitted. Quox may offer NEW versions under revised terms. Publishing new terms does not retroactively withdraw grants validly received for earlier versions. Separately signed agreements and applicable third-party licences govern where they apply.
32
+
33
+ 14. Contact. For white-label, managed-hosting, OEM, redistribution or other permissions: hello@quox.ai.
34
+
35
+ Copyright (c) 2025-2026 Quox LTD. All rights reserved.
package/README.md CHANGED
@@ -1,3 +1,145 @@
1
- # Temporary Holding Version
1
+ # Quox
2
2
 
3
- This version is a temporary placeholder for this package. An operational version to replace this has been submitted for review and is awaiting a staged release.
3
+ The conversational front door to your self-hosted AI agent control plane. The `quoxcli` package gives you the `quox` command: a conversational terminal and a command line for QuoxCORE.
4
+
5
+ It is a client. It does not include the server.
6
+
7
+ ## Install
8
+
9
+ ```sh
10
+ npm install -g quoxcli
11
+ ```
12
+
13
+ Needs Node.js 20 or later. This installs two commands: `quox`, and `quoxon` (an alias that opens the conversation).
14
+
15
+ Docs: https://cli.quox.ai/docs/start/
16
+
17
+ ## Prerequisite: a running QuoxCORE
18
+
19
+ You need a QuoxCORE instance to talk to. Install one on a machine you control: see https://github.com/quoxai/quoxcore, or run:
20
+
21
+ ```sh
22
+ curl -fsSL https://get.quox.ai | sh
23
+ ```
24
+
25
+ A built-in `quox server install` is coming. It does not exist yet.
26
+
27
+ ## Sign in
28
+
29
+ ```sh
30
+ quox login
31
+ ```
32
+
33
+ You will be asked for the address of your QuoxCORE and your credentials. Use `-p <name>` to keep several profiles (for example a dev box and a production box):
34
+
35
+ ```sh
36
+ quox login -p work
37
+ quox -p work whoami
38
+ quox -p work
39
+ ```
40
+
41
+ If you do not pass `-p`, Quox picks your human profile automatically. It never falls back to an ambient service key from your environment unless you pass `--service-key`.
42
+
43
+ ## Talk
44
+
45
+ ```sh
46
+ quox
47
+ ```
48
+
49
+ Bare `quox` opens the conversation. `quoxon` is an alias for the same thing. The older menu is still there as `quox tui`.
50
+
51
+ Type what you want. Quox routes it to the right agent and shows what it is doing, including any tool that is held for your approval.
52
+
53
+ | Key | What it does |
54
+ |-----|--------------|
55
+ | Enter | Send. While Quox is working, steer the running turn. |
56
+ | Tab | Queue the message to send after the current turn. |
57
+ | Esc | Stop the turn. Quox waits for the server to confirm it stopped. |
58
+ | Ctrl+C | Press twice to quit. |
59
+ | Ctrl+J | New line in the draft. |
60
+ | Ctrl+G | Edit the draft in your editor. |
61
+ | `/help` | List every key and command. |
62
+
63
+ `quox --demo` runs a simulated session with no server, so you can look around first. Nothing real runs.
64
+
65
+ ### Approvals
66
+
67
+ When a tool is held for your approval, act on it with an empty draft, or press Tab. Approvals are never a single key while you are typing, so a stray keystroke cannot approve anything. `/approvals` lists what is waiting.
68
+
69
+ ### Project rules: QUOX.md
70
+
71
+ Put a `QUOX.md` in your project and Quox follows it. It is read from the current directory up to the git root, plus `~/.quox/QUOX.md` for rules that apply everywhere. Rules are capped at 5500 characters in total.
72
+
73
+ | Command | What it does |
74
+ |---------|--------------|
75
+ | `/rules` | Show which rules are loaded |
76
+ | `/rules off` | Turn rules off for this session |
77
+
78
+ ### Skills
79
+
80
+ `/skills` lists the governed skills available to you. `/skill <name>` runs one.
81
+
82
+ ### Running work
83
+
84
+ Workflows and loops that are running appear in a roster under the status line. `/roster` shows it in full, and `/observers` shows what is watching.
85
+
86
+ ## Headless
87
+
88
+ ```sh
89
+ quox --print "summarise what happened on the fleet today"
90
+ echo "check the approvals queue" | quox --print
91
+ quox --print "list my agents" --output json
92
+ ```
93
+
94
+ `--output json` writes one event per line. Other flags: `--conversation <id>`, `--turn-id <id>`, `--timeout <seconds>`.
95
+
96
+ | Exit code | Meaning |
97
+ |-----------|---------|
98
+ | 0 | Completed |
99
+ | 1 | Error |
100
+ | 2 | Held for approval |
101
+ | 3 | Interrupted |
102
+ | 4 | Not signed in, or identity problem |
103
+ | 5 | Ended without confirmation |
104
+
105
+ ## Everyday commands
106
+
107
+ Run `quox --help` for the full list, and `quox <command> --help` for each one.
108
+
109
+ | Command | What it does |
110
+ |---------|--------------|
111
+ | `quox login` / `logout` / `whoami` | Sign in, sign out, show who you are |
112
+ | `quox status` | Platform health overview |
113
+ | `quox doctor` | Run diagnostics on the CLI and the platform |
114
+ | `quox chat "<message>"` | Chat with CommanderQ or any agent |
115
+ | `quox agent` | Manage agents |
116
+ | `quox workflow` | Manage workflows |
117
+ | `quox fleet` | Fleet monitoring and management |
118
+ | `quox memory` | Manage memories |
119
+ | `quox approvals` | Tool approvals held for a human decision |
120
+ | `quox inbox` | Inbox and approval requests |
121
+ | `quox mail` | InboxQ: connected mail accounts and triaged messages |
122
+ | `quox calendar` | Calendar-Q: agenda and coverage |
123
+ | `quox governance` | Policies, the WARD chain and evidence |
124
+ | `quox config` | CLI configuration and profiles |
125
+
126
+ Global options include `--json`, `-p/--profile`, `--org`, `--dry-run`, `-y/--yes` and `--debug`.
127
+
128
+ ## Troubleshooting
129
+
130
+ **Self-signed certificate (`fetch failed`).** If your QuoxCORE uses its own certificate authority, point Node at the certificate. Do not turn TLS checking off.
131
+
132
+ ```sh
133
+ export NODE_EXTRA_CA_CERTS=/path/to/your-ca.pem
134
+ ```
135
+
136
+ **"Not signed in" or exit code 4.** Run `quox login` again, with the same `-p` profile you used before. Check with `quox whoami`.
137
+
138
+ **Slow or no response.** Run `quox status` and `quox doctor` to see whether the server is reachable and healthy. Add `--debug` to see the HTTP calls. In headless mode, set `--timeout`.
139
+
140
+ ## Licence
141
+
142
+ Quox Community Source Licence 1.0. This is source-available software, not open source. You may self-host and inspect it freely; redistribution and repackaging are restricted. Read the full text in the `LICENSE` file or at https://github.com/quoxai/quoxcore.
143
+
144
+ Website: https://quox.ai
145
+ CLI home: https://cli.quox.ai
package/bin/quox.js ADDED
@@ -0,0 +1,265 @@
1
+ #!/usr/bin/env node
2
+ import '../lib/core/prodEnv.js'; // first: production React unless NODE_ENV is set (before anything loads React)
3
+
4
+ import v8 from 'node:v8';
5
+
6
+ // QUOXON-LATENCY: a warm `claude` spare cannot carry this turn's conversation id in its
7
+ // (fixed) env, so the collector writes it to QUOX_SESSION_ID_FILE for the turn. Surface it
8
+ // as QUOX_SESSION_ID before any command reads it. An explicit QUOX_SESSION_ID wins.
9
+ if (!process.env.QUOX_SESSION_ID && process.env.QUOX_SESSION_ID_FILE) {
10
+ // dynamic, not a static import: bin/quox.js keeps its static imports to prodEnv + node:v8 (r3early, input capture first)
11
+ try { process.env.QUOX_SESSION_ID = (await import('node:fs')).readFileSync(process.env.QUOX_SESSION_ID_FILE, 'utf8').trim(); } catch { /* turn ended: no session */ }
12
+ }
13
+
14
+ // CORTEX-BENCH: Node's fetch parses HTTP with a WebAssembly module, and V8
15
+ // recompiles it at the optimising tier on a background thread; Node waits for
16
+ // that compile before exiting, adding 350-700ms to every short command after
17
+ // its output is already printed. The baseline tier is plenty for a CLI.
18
+ v8.setFlagsFromString('--liftoff-only');
19
+
20
+ // Bare `quox` is the conversation (CLI-QUOXON Q3, owner decision): with no
21
+ // subcommand and only client flags, a TTY gets the QUOXON client and
22
+ // `--print` runs headless. The old 15-item menu is `quox tui`. Decided from
23
+ // argv alone, before config or any command module loads.
24
+ // R3 D4: raw mode before ANY heavy module loads. The command modules below used to be static imports,
25
+ // evaluated before this block, so keys typed in the first ~2 s echoed cooked and an Enter was lost.
26
+ {
27
+ const { routesToQuoxon } = await import('../lib/quoxon/route.js');
28
+ const qArgv = process.argv.slice(2);
29
+ if (routesToQuoxon(qArgv, process.stdout.isTTY)) {
30
+ // QUOXON-RESTART-LEAK: the first interactive client on a terminal becomes a tiny launcher (no TUI, no polling)
31
+ // that runs the client as its child and re-runs it on /restart, so restarts never nest (98 deep, 15 GB, 2026-10-17).
32
+ const launcher = await import('../lib/quoxon/launcher.js');
33
+ if (launcher.shouldLaunch({ argv: qArgv })) {
34
+ const code = await launcher.runLauncher({ argv: qArgv });
35
+ if (code !== null) process.exit(code); // null: no handoff dir, so run the client in this process as before
36
+ }
37
+ launcher.takeLauncherHandoff(); // a launched client: read and drop the handoff var before anything can spawn
38
+ if (!qArgv.some(a => a === '--print' || a.startsWith('--print=') || a === '-h' || a === '--help')) (await import('../lib/quoxon/earlyInput.js')).captureEarlyInput();
39
+ try {
40
+ // QUOXON-LATENCY: --print runs headless without loading React / Ink / the App (~2 s cold).
41
+ const headless = qArgv.some(a => a === '--print' || a.startsWith('--print='))
42
+ && await (await import('../lib/quoxon/headless.js')).runHeadless(qArgv);
43
+ if (!headless) {
44
+ const { main: quoxonMain } = await import('../lib/quoxon/main.js');
45
+ await quoxonMain(qArgv);
46
+ }
47
+ } catch (err) {
48
+ console.error(err?.message || err);
49
+ process.exitCode = 1;
50
+ }
51
+ process.exit(process.exitCode || 0);
52
+ }
53
+ }
54
+
55
+ // The commander CLI: loaded only when the conversation client is not (see the block above).
56
+ // `quox --update` is `quox update` (owner 2026-10-16): one updater, lib/core/selfUpdate.js.
57
+ if (process.argv.includes('--update')) process.argv = [...process.argv.slice(0, 2), ...(await import('../lib/core/selfUpdate.js')).rewriteUpdateFlag(process.argv.slice(2))];
58
+ const { Command } = await import('commander');
59
+ const { loadConfig, resolveProfileFlagFromArgv } = await import('../lib/core/config.js');
60
+ const { resolveCliVersion, BASE_VERSION } = await import('../lib/core/version.js');
61
+ const { applyRootOptions, installFlagDeliveryHooks } = await import('../lib/core/rootOptions.js');
62
+ const { createAuth } = await import('../lib/core/auth.js');
63
+ const { extractActingAs } = await import('../lib/core/actingAs.js');
64
+ const { createClient } = await import('../lib/core/client.js');
65
+ const { handleError } = await import('../lib/core/errors.js');
66
+ const { assertOrgOverrideSafe, commandPath } = await import('../lib/core/org-override.js');
67
+ // QUOXIFY pass 2 (DEVSUITE phase 15): the two dev-suite members that had no
68
+ // unified verb at all. Gripe's own definition of done named `quox gripe`.
69
+ const { generateCompletion } = await import('../lib/core/completions.js');
70
+ const { loadAllPlugins } = await import('../lib/plugins/loader.js');
71
+ const { registerCommandGroups } = await import('../lib/core/lazyCommands.js');
72
+
73
+ // #610: --version must reflect the ACTUAL running commit, not a frozen literal
74
+ // (the global CLI worktree was silently 32 commits behind and --version never
75
+ // showed it). The git-backed resolution lives in ../lib/core/version.js, shared
76
+ // with `quox doctor` so the two never disagree. Resolving the commit needs a
77
+ // git read, so only pay that cost when --version/-V is actually requested —
78
+ // every other command stays zero-cost by keeping the argv guard HERE (the
79
+ // shared resolver has none, because doctor wants the facts unconditionally).
80
+ const versionRequested = process.argv.includes('--version') || process.argv.includes('-V');
81
+
82
+ const program = new Command();
83
+
84
+ program
85
+ .name('quox')
86
+ .description('QuoxCORE CLI — manage agents, workflows, memory, fleet, and more')
87
+ .version(versionRequested ? resolveCliVersion() : BASE_VERSION);
88
+ // Global options live in lib/core/rootOptions.js so the safety-flag test builds this same root.
89
+ applyRootOptions(program)
90
+ .addHelpText('after', '\nConversation (QUOXON client):\n quox interactive conversation (terminal only)\n quox --print "<prompt>" [--output text|json] [--conversation <id>] [--timeout <s>] one headless turn; exit 0 completed, 2 held for approval, 3 interrupted, 4 not signed in, 5 unconfirmed\n quox --demo simulated journey, nothing real runs\n');
91
+
92
+ // Wire up global flags
93
+ program.hook('preAction', (thisCommand) => {
94
+ const opts = thisCommand.opts();
95
+ if (opts.json) opts.output = 'json';
96
+ if (opts.quiet) opts.output = 'quiet';
97
+ });
98
+
99
+ // A subcommand that redeclares a root flag (--yes, --org, --json, --dry-run)
100
+ // never receives it: commander resolves against the root first and the
101
+ // subcommand reads undefined forever. See lib/core/global-flags.js for the
102
+ // 13 places this had already shipped, including --dry-run executing for real.
103
+ // Also: a --dry-run the leaf cannot honour is refused, never silently dropped
104
+ // (quox#1077 follow-up). Both hooks live in lib/core/rootOptions.js.
105
+ installFlagDeliveryHooks(program);
106
+
107
+ // #1141: `--org <slug>` (and a slug in QUOX_ORG_ID) resolves to the org ID once, here, so every verb and
108
+ // the GRIPE-709 guard below see an ID. ID-shaped values pass through with no call. Login-type verbs are left alone.
109
+ program.hook('preAction', async (thisCommand, actionCommand) => {
110
+ const { isOrgId, resolveOrgRef } = await import('../lib/core/orgResolve.js');
111
+ const { EXEMPT } = await import('../lib/core/org-override.js');
112
+ if (EXEMPT.has(commandPath(actionCommand))) return;
113
+ const rootOrg = thisCommand.opts().org;
114
+ const leafOrg = actionCommand !== thisCommand ? actionCommand.getOptionValue?.('org') : undefined;
115
+ const envOrg = process.env.QUOX_ORG_ID;
116
+ if ([rootOrg, leafOrg, envOrg].every((v) => !v || typeof v !== 'string' || isOrgId(v))) return;
117
+ const { resolveEndpoint } = await import('../lib/api/endpoints.js');
118
+ const listOrgs = async () => {
119
+ const ep = resolveEndpoint('orgs.list');
120
+ const d = await client.get(ep.path, { service: ep.service });
121
+ return Array.isArray(d) ? d : (d?.organizations || d?.orgs || d?.data || []);
122
+ };
123
+ const base = { profile: config.getActiveProfileName?.() || 'default', authData: config.getAuth?.() || null, listOrgs };
124
+ if (typeof rootOrg === 'string' && !isOrgId(rootOrg)) thisCommand.setOptionValue('org', await resolveOrgRef(rootOrg, base));
125
+ if (typeof leafOrg === 'string' && !isOrgId(leafOrg)) actionCommand.setOptionValue('org', await resolveOrgRef(leafOrg, base));
126
+ if (envOrg && !isOrgId(envOrg)) process.env.QUOX_ORG_ID = await resolveOrgRef(envOrg, { ...base, source: 'QUOX_ORG_ID' });
127
+ });
128
+
129
+ // GRIPE-709: --org must be honoured or refused, never silently ignored.
130
+ program.hook('preAction', (thisCommand, actionCommand) => {
131
+ assertOrgOverrideSafe({
132
+ override: thisCommand.opts().org,
133
+ authData: config.getAuth?.() || null,
134
+ hasUserToken: Boolean(auth.getTokens?.()?.access_token),
135
+ command: commandPath(actionCommand),
136
+ });
137
+ });
138
+
139
+ // Handle --insecure and --no-color before anything runs
140
+ // QUOX_INSECURE=1 is the env twin of --insecure: dev-server wrappers set it
141
+ // because the LAN dashboard proxy serves a self-signed cert and requiring
142
+ // --insecure on every verb is a papercut (DEVSUITE phase 8). Same warning,
143
+ // same mechanism, so it is never silent.
144
+ if (process.argv.includes('--insecure') || process.env.QUOX_INSECURE === '1') {
145
+ process.env.NODE_TLS_REJECT_UNAUTHORIZED = '0';
146
+ console.error('\x1b[33mWARNING: TLS certificate verification disabled (--insecure)\x1b[0m');
147
+ }
148
+ if (process.argv.includes('--no-color') || process.env.NO_COLOR) {
149
+ process.env.FORCE_COLOR = '0';
150
+ }
151
+
152
+ // Build shared context
153
+ // program.opts() is EMPTY here (parse() runs later) — the -p flag must come
154
+ // from the argv pre-scan or it silently falls back to activeProfile.
155
+ // quox#772: fold a global `--as <agent>` into QUOX_AS (flag wins) and strip it
156
+ // from argv before commander sees it (linkedin/claude own their own --as).
157
+ {
158
+ const acting = extractActingAs(process.argv.slice(2), process.env);
159
+ if (acting.name) {
160
+ // flag vs env matters to `whoami` only: record the origin (flag wins).
161
+ const fromFlag = extractActingAs(process.argv.slice(2), {}).name;
162
+ process.env.QUOX_AS = acting.name;
163
+ process.env.QUOX_AS_FLAG = fromFlag ? '1' : '0';
164
+ }
165
+ process.argv = [...process.argv.slice(0, 2), ...acting.argv];
166
+ }
167
+ const config = loadConfig(resolveProfileFlagFromArgv(process.argv.slice(2)));
168
+ const auth = createAuth(config);
169
+ const client = createClient(config, auth);
170
+ const ctx = { config, auth, client, program };
171
+
172
+ // Register all command groups
173
+ // Command groups, in registration order. CORTEX-BENCH (quox#7xx CLI startup):
174
+ // importing all 86 modules cost ~1s on EVERY invocation, including each
175
+ // attached-agent `quox agent exec` tool call. They now load lazily: only the
176
+ // module(s) that define the command being run (see lib/core/lazyCommands.js),
177
+ // with a full load whenever the command is unknown, help is asked for, or the
178
+ // lazy path fails. A miss can only be slower, never wrong.
179
+ const { COMMAND_REGISTRARS, COMMAND_REGISTRARS_BASE } = await import('../lib/core/commandRegistrars.js');
180
+ await registerCommandGroups(program, ctx, COMMAND_REGISTRARS, process.argv.slice(2), COMMAND_REGISTRARS_BASE);
181
+
182
+ // TUI command
183
+ program
184
+ .command('tui')
185
+ .argument('[screen]', 'Open directly on a screen (fleet, agents, tools, orgs, memory, brain, workflows, chat, admin, files, backups, objectives, inbox, vault, governance, health)')
186
+ .option('--governed', 'Run the TUI in a Quox governed tmux session (survives sleep and drops)')
187
+ .option('--name <name>', 'Session name for --governed (reattaches if it is already running)')
188
+ .option('--no-tmux', 'With --governed: skip tmux')
189
+ .description('Launch the classic menu TUI (bare `quox` opens the conversation)')
190
+ .action(async (screen, opts) => {
191
+ if (opts && opts.governed) {
192
+ const { runTuiGoverned } = await import('../lib/commands/claude.js');
193
+ process.exitCode = runTuiGoverned({ screen, name: opts.name, noTmux: opts.tmux === false });
194
+ return;
195
+ }
196
+ const { launchTUI } = await import('../lib/tui/index.js');
197
+ await launchTUI(ctx, { initialScreen: screen });
198
+ });
199
+
200
+ // Shell completion command
201
+ program
202
+ .command('completion <shell>')
203
+ .description('Generate shell completions (bash, zsh, fish)')
204
+ .action((shell) => {
205
+ process.stdout.write(generateCompletion(shell));
206
+ });
207
+
208
+ // Load plugins (non-blocking — errors are logged, not thrown)
209
+ try {
210
+ const { loaded, errors } = await loadAllPlugins(program, ctx);
211
+ if (program.opts().debug && loaded.length > 0) {
212
+ console.error(`Loaded ${loaded.length} plugin(s): ${loaded.map(p => p.name).join(', ')}`);
213
+ }
214
+ if (errors.length > 0) {
215
+ for (const e of errors) {
216
+ console.error(`Plugin "${e.name}" failed: ${e.error}`);
217
+ }
218
+ }
219
+ } catch {
220
+ // Plugin loading should never crash the CLI
221
+ }
222
+
223
+ // C4: once a day, warn when this CLI and the server differ in major/minor. Never for JSON/quiet output,
224
+ // a non-TTY stderr, or `quox server …` itself (that verb shows versions); never fails a command.
225
+ async function warnVersionSkew() {
226
+ try {
227
+ const o = program.opts();
228
+ if (o.output === 'json' || o.output === 'quiet' || o.json || o.quiet || !process.stderr.isTTY || process.env.QUOX_NO_SKEW_CHECK) return;
229
+ const first = process.argv.slice(2).find((a) => !a.startsWith('-'));
230
+ if (!first || first === 'server') return;
231
+ const { checkSkewOncePerDay } = await import('../lib/server/skew.js');
232
+ const sk = await checkSkewOncePerDay({ collectorUrl: config.getServiceUrl('collector') });
233
+ if (sk) process.stderr.write(`\u26a0 version skew: ${sk.message}\n`);
234
+ } catch { /* advisory only */ }
235
+ }
236
+
237
+ // Bare `quox` in a TTY never reaches here (routed to QUOXON above); bare
238
+ // non-TTY prints the banner so a script never hangs.
239
+ {
240
+ try {
241
+ if (process.argv.length <= 2) {
242
+ // Bare `quox`: the splash, not a help dump (DEVSUITE-GLYPH).
243
+ const { printBanner } = await import('../lib/core/banner.js');
244
+ let loggedIn = true;
245
+ try { loggedIn = !!auth.isLoggedIn(); } catch { /* banner must never fail */ }
246
+ printBanner(program.version(), { loggedIn });
247
+ process.exit(0);
248
+ }
249
+ await program.parseAsync(process.argv);
250
+ await warnVersionSkew();
251
+ } catch (err) {
252
+ // #1101: Ctrl-C at any inquirer prompt is the user leaving: "Cancelled.", cursor back, exit 130, no stack.
253
+ const { exitOnPromptCancel } = await import('../lib/core/promptCancel.js');
254
+ exitOnPromptCancel(err); // exits 130 on a cancel; otherwise falls through to the normal error printer
255
+ // #995: tell the error printer which group failed and what verbs it has, so a 404 hint names a real one
256
+ let ctx = null;
257
+ try {
258
+ const word = process.argv.slice(2).find((a, i, all) => !a.startsWith('-') && !['-p', '--profile', '--org', '-o', '--output'].includes(all[i - 1]));
259
+ const grp = word && program.commands.find((c) => c.name() === word || c.aliases().includes(word));
260
+ if (grp) ctx = { group: grp.name(), subcommands: grp.commands.map((c) => c.name()) };
261
+ } catch { /* the hint is advisory */ }
262
+ handleError(err, program.opts().output, ctx);
263
+ process.exit(err.exitCode || 1);
264
+ }
265
+ }
package/bin/quoxon.js ADDED
@@ -0,0 +1,8 @@
1
+ #!/usr/bin/env node
2
+ import '../lib/core/prodEnv.js'; // first: production React unless NODE_ENV is set (before anything loads React)
3
+ import { main } from '../lib/quoxon/main.js';
4
+
5
+ main().catch((err) => {
6
+ console.error(err?.message || err);
7
+ process.exit(1);
8
+ });
@@ -0,0 +1,151 @@
1
+ /**
2
+ * 'admin.*' endpoints — extracted from the former monolithic
3
+ * cli/lib/api/endpoints.js as part of the per-domain fragment split.
4
+ * See cli/lib/api/endpoints/index.js for aggregation + the fragment convention.
5
+ */
6
+
7
+ export const admin = {
8
+ 'admin.config.list': {
9
+ method: 'GET',
10
+ service: 'auth',
11
+ path: () => `/api/admin/config`,
12
+ tags: ['live-safe'],
13
+ },
14
+ 'admin.agent_identity.mint': {
15
+ method: 'POST',
16
+ service: 'auth',
17
+ path: () => '/api/admin/agent-identities',
18
+ tags: ['admin-write'],
19
+ },
20
+ // Instance basics after setup (app URL etc). Served by services/auth/routes/admin-instance.js.
21
+ 'admin.instance.basics.get': {
22
+ method: 'GET',
23
+ service: 'auth',
24
+ path: () => '/api/admin/instance/basics',
25
+ tags: ['live-safe'],
26
+ },
27
+ 'admin.instance.basics.set': {
28
+ method: 'PUT',
29
+ service: 'auth',
30
+ path: () => '/api/admin/instance/basics',
31
+ tags: ['admin-write'],
32
+ },
33
+ // LAN integration targets gate (allow_lan_integration_targets). Served by services/auth/routes/admin-instance.js.
34
+ 'admin.instance.lan_targets.get': {
35
+ method: 'GET',
36
+ service: 'auth',
37
+ path: () => '/api/admin/instance/lan-targets',
38
+ tags: ['live-safe'],
39
+ },
40
+ 'admin.instance.lan_targets.set': {
41
+ method: 'PUT',
42
+ service: 'auth',
43
+ path: () => '/api/admin/instance/lan-targets',
44
+ tags: ['admin-write'],
45
+ },
46
+ 'admin.config.update': {
47
+ method: 'PATCH',
48
+ service: 'auth',
49
+ path: ({ key }) => `/api/admin/config/${key}`,
50
+ tags: ['live-write'],
51
+ },
52
+ // LICENSE-LAUNCH LL-6b — enforcement posture + break-glass. Served by
53
+ // services/auth/routes/setup.js; read is any authenticated user, both
54
+ // writes are instance-admin only.
55
+ 'admin.enforcement.list': {
56
+ method: 'GET',
57
+ service: 'auth',
58
+ path: () => `/api/setup/enforcement`,
59
+ tags: ['live-safe'],
60
+ },
61
+ 'admin.enforcement.break_glass.open': {
62
+ method: 'POST',
63
+ service: 'auth',
64
+ path: () => `/api/setup/enforcement/break-glass`,
65
+ tags: ['admin-write'],
66
+ },
67
+ 'admin.enforcement.break_glass.clear': {
68
+ method: 'DELETE',
69
+ service: 'auth',
70
+ path: ({ flag }) => `/api/setup/enforcement/break-glass/${flag}`,
71
+ tags: ['admin-write'],
72
+ },
73
+ 'admin.email.status': {
74
+ method: 'GET',
75
+ service: 'auth',
76
+ path: () => `/api/admin/email/status`,
77
+ tags: ['live-safe'],
78
+ },
79
+ 'admin.email.smtp': {
80
+ method: 'PUT',
81
+ service: 'auth',
82
+ path: () => `/api/admin/email/smtp`,
83
+ tags: ['live-write'],
84
+ },
85
+ 'admin.email.test': {
86
+ method: 'POST',
87
+ service: 'auth',
88
+ path: () => `/api/admin/email/test`,
89
+ tags: ['live-write'],
90
+ },
91
+ 'admin.keys.create': {
92
+ method: 'POST',
93
+ service: 'auth',
94
+ path: () => `/api/admin/keys`,
95
+ tags: ['live-write'],
96
+ },
97
+ 'admin.keys.delete': {
98
+ method: 'DELETE',
99
+ service: 'auth',
100
+ path: ({ keyId }) => `/api/admin/keys/${keyId}`,
101
+ tags: ['live-write'],
102
+ },
103
+ 'admin.keys.list': {
104
+ method: 'GET',
105
+ service: 'auth',
106
+ path: () => `/api/admin/keys`,
107
+ tags: ['live-safe'],
108
+ },
109
+ 'admin.keys.test': {
110
+ method: 'POST',
111
+ service: 'auth',
112
+ path: ({ keyId }) => `/api/admin/keys/${keyId}/test`,
113
+ tags: ['live-write'],
114
+ },
115
+ 'admin.logs.list': {
116
+ method: 'GET',
117
+ service: 'auth',
118
+ path: () => `/api/admin/logs`,
119
+ tags: ['live-safe'],
120
+ },
121
+ 'admin.retention.cleanup': {
122
+ method: 'POST',
123
+ service: 'auth',
124
+ path: () => `/api/admin/retention/cleanup`,
125
+ tags: ['live-write'],
126
+ },
127
+ 'admin.retention.config.list': {
128
+ method: 'GET',
129
+ service: 'auth',
130
+ path: () => `/api/admin/retention/config`,
131
+ tags: ['live-safe'],
132
+ },
133
+ 'admin.retention.stats.list': {
134
+ method: 'GET',
135
+ service: 'auth',
136
+ path: () => `/api/admin/retention/stats`,
137
+ tags: ['live-safe'],
138
+ },
139
+ 'admin.services.list': {
140
+ method: 'GET',
141
+ service: 'auth',
142
+ path: () => `/api/admin/services`,
143
+ tags: ['live-safe'],
144
+ },
145
+ 'admin.stats.list': {
146
+ method: 'GET',
147
+ service: 'auth',
148
+ path: () => `/api/admin/stats`,
149
+ tags: ['live-safe'],
150
+ },
151
+ };
@@ -0,0 +1,38 @@
1
+ /**
2
+ * 'aee.*' endpoints — extracted from the former monolithic
3
+ * cli/lib/api/endpoints.js as part of the per-domain fragment split.
4
+ * See cli/lib/api/endpoints/index.js for aggregation + the fragment convention.
5
+ */
6
+
7
+ export const aee = {
8
+ 'aee.conversations.list': {
9
+ method: 'GET',
10
+ service: 'collector',
11
+ path: () => `/aee/conversations`,
12
+ tags: ['live-safe'],
13
+ },
14
+ 'aee.get': {
15
+ method: 'GET',
16
+ service: 'collector',
17
+ path: ({ id }) => `/aee/${id}`,
18
+ tags: ['live-safe'],
19
+ },
20
+ 'aee.query.list': {
21
+ method: 'GET',
22
+ service: 'collector',
23
+ path: () => `/aee/query`,
24
+ tags: ['live-safe'],
25
+ },
26
+ 'aee.stats.list': {
27
+ method: 'GET',
28
+ service: 'collector',
29
+ path: () => `/aee/stats`,
30
+ tags: ['live-safe'],
31
+ },
32
+ 'aee.store': {
33
+ method: 'POST',
34
+ service: 'collector',
35
+ path: () => `/aee/store`,
36
+ tags: ['live-write'],
37
+ },
38
+ };