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,132 @@
1
+ /**
2
+ * `quox discord` — Quox Discord Pro from the canonical CLI (quoxcli-parity-gate:
3
+ * nothing ships without quox CLI support).
4
+ *
5
+ * Same principle as `quox done`: this is a thin wrapper over the daemon's own
6
+ * control CLI (`qdp`, quox-discord-pro/bin/qdp.mjs), not a reimplementation.
7
+ * The daemon already exposes status | instances | bindings | bind | unbind |
8
+ * gaps | health over its token-gated loopback control API, and qdp is the one
9
+ * client for it. Two clients for one control surface is how a control surface
10
+ * drifts, so `quox discord <verb>` shells straight through to qdp with the
11
+ * arguments unchanged, and qdp's exit code is passed through.
12
+ *
13
+ * Host-local, like `quox done` shelling to the DoneEngine: the operator CLI
14
+ * runs where the daemon runs (one daemon per QuoxCORE instance). Set
15
+ * QDP_CLI_PATH if qdp lives elsewhere.
16
+ */
17
+
18
+ import { spawnSync } from 'node:child_process';
19
+ import fs from 'node:fs';
20
+ import os from 'node:os';
21
+ import path from 'node:path';
22
+
23
+ const QDP = process.env.QDP_CLI_PATH
24
+ || path.join(os.homedir(), 'quox-discord-pro', 'bin', 'qdp.mjs');
25
+
26
+ /**
27
+ * Per-verb usage, mirrored from qdp.mjs's own header doc block (bin/qdp.mjs
28
+ * in the quox-discord-pro repo), shown in each subcommand's --help. qdp has no
29
+ * --help handling of its own; before quox#1077 this command hand-rolled arg
30
+ * dispatch and had to intercept --help itself (quox#603). Commander
31
+ * subcommands now answer --help before any action runs.
32
+ */
33
+ const VERB_USAGE = {
34
+ status: 'qdp status daemon liveness, instances, binding count',
35
+ instances: 'qdp instances configured instances and their targets',
36
+ bindings: 'qdp bindings every channel binding',
37
+ gaps: 'qdp gaps open support-gap items awaiting an official answer',
38
+ health: 'qdp health one-line OK/actionable summary',
39
+ doctor: 'qdp doctor per-binding view/webhook/liveness check; exits\n'
40
+ + ' non-zero if any binding is non-functional',
41
+ bind: 'qdp bind <channelId> <mode> [key=value ...] bind an EXISTING channel',
42
+ unbind: 'qdp unbind <channelId>',
43
+ provision: 'qdp provision <agent-id> [options] create/reuse a channel AND bind it\n'
44
+ + ' --mode <feed|bridge|team|roundtable> default: feed\n'
45
+ + ' --channel <name> default: feed-<agent-id> for feed, <agent-id> otherwise\n'
46
+ + ' --host <hostname-or-ip> dev server the agent runs on (sets bridge_remote_host)\n'
47
+ + ' --inbox <name> remote session-mail inbox (default <agent-id>-inbox)\n'
48
+ + ' --outbox <name> remote outbox (default discord-outbox)\n'
49
+ + ' --two-way allow authorised humans to talk back (bridge only)\n'
50
+ + ' --persona <name> webhook display name (default: titlecased agent id)\n'
51
+ + ' --roster <ids> roundtable only: comma-separated "id" or "id:role" list\n'
52
+ + ' --dry-run print exactly what it WOULD do, change nothing',
53
+ };
54
+
55
+ /**
56
+ * qdp verbs that only READ (quox#1077). Each was checked against bin/qdp.mjs:
57
+ * status/instances/bindings print config.json, the pid file and the systemd
58
+ * state; gaps GETs the open support-gap inbox items; health reads the pid and
59
+ * systemd state; doctor GETs the control API /health and Discord's channel,
60
+ * webhook and @me endpoints. None issues PUT/POST/PATCH/DELETE or writes a
61
+ * file. bind, unbind and provision PUT/DELETE bindings and create channels.
62
+ */
63
+ export const DISCORD_READ_VERBS = ['status', 'instances', 'bindings', 'gaps', 'health', 'doctor'];
64
+ export const DISCORD_WRITE_VERBS = ['bind', 'unbind', 'provision'];
65
+
66
+ // No "Usage:" line here: the matrix's --help walker (scripts/matrix/cli-tree.mjs) reads one as the command's usage.
67
+ const GENERAL_USAGE = Object.values(VERB_USAGE).map((u) => ` ${u}`).join('\n')
68
+ + '\n\nRun `quox discord <verb> --help` for a single verb\'s usage.';
69
+
70
+ function runQdp(verb, args = []) {
71
+ if (!fs.existsSync(QDP)) {
72
+ process.stderr.write(
73
+ `Discord Pro control CLI (qdp) not found at ${QDP}\n` +
74
+ 'Set QDP_CLI_PATH if it lives elsewhere, or install the quox-discord-pro daemon on this host.\n',
75
+ );
76
+ process.exit(2);
77
+ }
78
+ const r = spawnSync(process.execPath, [QDP, verb, ...args], { stdio: 'inherit' });
79
+ if (r.error) {
80
+ process.stderr.write(`qdp failed to run: ${r.error.message}\n`);
81
+ process.exit(2);
82
+ }
83
+ process.exit(r.status ?? 2);
84
+ }
85
+
86
+ const VERB_DESC = { unbind: 'remove a channel binding', doctor: 'per-binding view/webhook/liveness check (exits non-zero if any binding is broken)' };
87
+ const firstLine = (verb) => VERB_DESC[verb] || VERB_USAGE[verb].split('\n')[0].replace(/^qdp \S+(?: [<[][^\]>]*[>\]])*\s+/, '').trim();
88
+
89
+ /**
90
+ * One commander subcommand per qdp verb (quox#1077). It used to be a single
91
+ * `discord [args...]` leaf, so the CLI leaf policy could only class the whole
92
+ * group, and it classed it write: a read like `quox discord bindings` was held
93
+ * for approval. Per-verb leaves let reads be read and keep bind/unbind/provision
94
+ * write. Commander's own --help runs before any action, so `--help` can never
95
+ * reach qdp and run a mutating verb (quox#603).
96
+ */
97
+ export function registerDiscordCommands(program) {
98
+ const discord = program
99
+ .command('discord')
100
+ .description('Quox Discord Pro daemon: status | instances | bindings | gaps | health | doctor | bind | unbind | provision')
101
+ .addHelpText('after', `\nPer-verb usage (each verb shells straight through to qdp):\n${GENERAL_USAGE}`);
102
+
103
+ for (const verb of DISCORD_READ_VERBS) {
104
+ discord
105
+ .command(verb)
106
+ .description(firstLine(verb) || verb)
107
+ .addHelpText('after', `\nqdp usage:\n ${VERB_USAGE[verb]}`)
108
+ .action(() => runQdp(verb));
109
+ }
110
+
111
+ const writeArgs = { bind: '<channelId> <mode> [pairs...]', unbind: '<channelId>', provision: '<agentId> [args...]' };
112
+ for (const verb of DISCORD_WRITE_VERBS) {
113
+ const leaf = discord
114
+ .command(`${verb} ${writeArgs[verb]}`);
115
+ // Only provision has a dry run in qdp. Declaring it here keeps it in --help and lets the
116
+ // root guard refuse `discord bind|unbind --dry-run` instead of binding for real.
117
+ if (verb === 'provision') leaf.option('--dry-run', 'print exactly what it WOULD do, change nothing');
118
+ leaf
119
+ .description(firstLine(verb) || verb)
120
+ .addHelpText('after', `\nqdp usage:\n ${VERB_USAGE[verb]}`)
121
+ // qdp parses its own options (provision --mode/--host/...), so they pass through unchanged.
122
+ .allowUnknownOption(true)
123
+ .action((...a) => {
124
+ const cmd = a[a.length - 1];
125
+ const args = [...cmd.args];
126
+ // --dry-run is also a root quox flag, so commander hands it to the root and it never reaches
127
+ // cmd.args: a requested dry run of provision used to provision for real. Forward it explicitly.
128
+ if (cmd.optsWithGlobals().dryRun && !args.includes('--dry-run')) args.push('--dry-run');
129
+ runQdp(verb, args);
130
+ });
131
+ }
132
+ }
@@ -0,0 +1,181 @@
1
+ /**
2
+ * quox doctor — Platform Diagnostics
3
+ *
4
+ * Deep-checks every service, database, agent daemon, and credential.
5
+ * Reports pass/warning/critical with actionable details.
6
+ *
7
+ * CLI-3b (Stream CLI Phase 3)
8
+ */
9
+
10
+ import chalk from 'chalk';
11
+ import { SERVICE_PORTS } from '../core/config.js';
12
+ import { emitCliEvent } from '../core/aee.js';
13
+ import { resolveCliVersion, checkCliDrift } from '../core/version.js';
14
+
15
+ const CHECKS = [
16
+ // Core services
17
+ { name: 'Auth service', service: 'auth', port: 3101, path: '/health', critical: true },
18
+ { name: 'Memory service', service: 'memory', port: 3103, path: '/health' },
19
+ { name: 'Collector', service: 'collector', port: 9848, path: '/health', critical: true },
20
+ { name: 'QuoxFlow', service: 'quoxflow', port: 3200, path: '/health' },
21
+ { name: 'Files service', service: 'files', port: 3102, path: '/health' },
22
+ // External services
23
+ { name: 'QuoxAgent daemon', port: 9847, path: '/health', url: 'http://localhost:9847' },
24
+ { name: 'Qdrant vectors', port: 6333, path: '/', url: 'http://localhost:6333' },
25
+ ];
26
+
27
+ async function checkEndpoint(url, path, timeoutMs = 3000) {
28
+ const start = Date.now();
29
+ try {
30
+ const resp = await fetch(`${url}${path}`, {
31
+ signal: AbortSignal.timeout(timeoutMs),
32
+ });
33
+ const latency = Date.now() - start;
34
+ if (resp.ok) {
35
+ return { status: 'pass', latency_ms: latency };
36
+ }
37
+ return { status: 'warn', latency_ms: latency, detail: `HTTP ${resp.status}` };
38
+ } catch (err) {
39
+ return { status: 'fail', latency_ms: null, detail: err.message };
40
+ }
41
+ }
42
+
43
+ /**
44
+ * Every doctor check, in this process: services, auth token, CLI version. Shared by `quox doctor` and the
45
+ * conversation's /doctor so the two can never disagree. -> [{ name, status, detail?, latency_ms?, ... }].
46
+ */
47
+ export async function runDoctorChecks({ config }) {
48
+ // Check all services in parallel — per-item try/catch so one failure doesn't lose all results
49
+ const checks = await Promise.all(
50
+ CHECKS.map(async (check) => {
51
+ try {
52
+ const url = check.url || config.getServiceUrl(check.service);
53
+ let result = await checkEndpoint(url, check.path);
54
+ // #623: doctor was crying CRITICAL when the configured URL was just
55
+ // WRONG (stale profile override / wrong scheme+host) while the
56
+ // service was up on its loopback bind. On a connection failure,
57
+ // probe http://127.0.0.1:<port> — if THAT answers, the service is
58
+ // UP and the verdict is "misconfigured URL", not "service down".
59
+ // Downgrade to a warning that names the reachable bind + the bad
60
+ // URL, so an operator fixes the config instead of chasing an outage.
61
+ if (result.status === 'fail' && check.port) {
62
+ const loopbackUrl = `http://127.0.0.1:${check.port}`;
63
+ if (url !== loopbackUrl) {
64
+ const alt = await checkEndpoint(loopbackUrl, check.path);
65
+ if (alt.status === 'pass') {
66
+ result = {
67
+ status: 'warn',
68
+ latency_ms: alt.latency_ms,
69
+ detail: `reachable at ${loopbackUrl} but configured URL ${url} failed — profile URL likely stale/wrong (misconfig, not an outage)`,
70
+ };
71
+ }
72
+ }
73
+ }
74
+ return {
75
+ name: check.name,
76
+ port: check.port,
77
+ ...result,
78
+ critical: check.critical || false,
79
+ };
80
+ } catch {
81
+ return {
82
+ name: check.name,
83
+ port: check.port,
84
+ ok: false,
85
+ status: 'error',
86
+ ms: 0,
87
+ critical: check.critical || false,
88
+ };
89
+ }
90
+ })
91
+ );
92
+
93
+ // Check auth token. fleet #479: the CURRENT profile (persisted
94
+ // default, or a -p/QUOX_PROFILE override) is config._effectiveProfile,
95
+ // never config._data.activeProfile (that's always the persisted
96
+ // default now, and would report the wrong profile under an override).
97
+ const auth = config.getAuth?.() || config._data?.profiles?.[config._effectiveProfile]?.auth;
98
+ if (auth?.access_token) {
99
+ const expired = auth.expires_at && Date.now() > auth.expires_at;
100
+ if (expired) {
101
+ checks.push({ name: 'Auth token', status: 'warn', detail: 'expired' });
102
+ } else {
103
+ const remaining = auth.expires_at ? Math.round((auth.expires_at - Date.now()) / 3600000) : '?';
104
+ checks.push({ name: 'Auth token', status: 'pass', detail: `valid (expires in ${remaining}h)` });
105
+ }
106
+ } else {
107
+ checks.push({ name: 'Auth token', status: 'warn', detail: 'not logged in' });
108
+ }
109
+
110
+ // #610 Part 3: which build is this, and is it drifted from origin/main?
111
+ // A silently-stale CLI (the worktree was 32 commits behind and nothing
112
+ // said so) is a real warning, so a stale drift maps to 'warn' and bumps
113
+ // the exit code like any other. unknown/skip are informational (pass) —
114
+ // never fail a health check because we could not compute drift. The
115
+ // drift count reflects the last fetch (no network fetch here).
116
+ const cliVersion = resolveCliVersion();
117
+ const drift = checkCliDrift();
118
+ checks.push({
119
+ name: 'CLI version',
120
+ status: drift.status === 'stale' ? 'warn' : 'pass',
121
+ detail: `${cliVersion} · ${drift.detail}`,
122
+ });
123
+
124
+ return checks;
125
+ }
126
+
127
+ export function registerDoctorCommand(program, ctx) {
128
+ const { config, client } = ctx;
129
+
130
+ program
131
+ .command('doctor')
132
+ .description('Run platform health diagnostics')
133
+ .action(async (opts, cmd) => {
134
+ const outputFormat = cmd.parent?.opts()?.output || 'table';
135
+ const isJson = outputFormat === 'json' || cmd.parent?.opts()?.json;
136
+
137
+ const checks = await runDoctorChecks({ config });
138
+
139
+ // Summary
140
+ const passed = checks.filter(c => c.status === 'pass').length;
141
+ const warnings = checks.filter(c => c.status === 'warn').length;
142
+ const failed = checks.filter(c => c.status === 'fail').length;
143
+
144
+ if (isJson) {
145
+ console.log(JSON.stringify({ checks, summary: { passed, warnings, failed } }, null, 2));
146
+ return;
147
+ }
148
+
149
+ // Render
150
+ console.log('');
151
+ for (const c of checks) {
152
+ const icon = c.status === 'pass' ? chalk.green(' ✓')
153
+ : c.status === 'warn' ? chalk.yellow(' ⚠')
154
+ : chalk.red(' ✗');
155
+
156
+ const latency = c.latency_ms != null ? chalk.dim(` (${c.latency_ms}ms)`) : '';
157
+ const detail = c.detail ? chalk.dim(` ${c.detail}`) : '';
158
+ const port = c.port ? chalk.dim(` ${c.port}`) : '';
159
+
160
+ console.log(`${icon} ${c.name.padEnd(20)}${port}${latency}${detail}`);
161
+ }
162
+
163
+ console.log('');
164
+ const parts = [];
165
+ if (passed) parts.push(chalk.green(`${passed} passed`));
166
+ if (warnings) parts.push(chalk.yellow(`${warnings} warning${warnings > 1 ? 's' : ''}`));
167
+ if (failed) parts.push(chalk.red(`${failed} critical`));
168
+ console.log(` ${parts.join(' ')}`);
169
+ console.log('');
170
+
171
+ emitCliEvent(client, {
172
+ command: 'doctor',
173
+ intent: 'quox.cli.doctor',
174
+ payload: { passed, warnings, failed, total: checks.length },
175
+ status: failed > 0 ? 'error' : 'success',
176
+ });
177
+
178
+ if (failed > 0) process.exitCode = 2;
179
+ else if (warnings > 0) process.exitCode = 1;
180
+ });
181
+ }
@@ -0,0 +1,114 @@
1
+ /**
2
+ * Domain commands: org domain verification (DNS TXT record ownership proof)
3
+ *
4
+ * quox domain list|add|verify|remove
5
+ *
6
+ * Backend: services/auth/routes/domains.js, mounted at plain `/api`
7
+ * (org-scoped IN the URL: /api/orgs/:orgId/domains...). Team-tier+ +
8
+ * ORG_MANAGE_SETTINGS gated — expect 402/403 on non-team orgs.
9
+ *
10
+ * `add` returns a verification token and human-readable DNS instructions;
11
+ * `verify` re-checks DNS and returns 202 (retryable) rather than an error
12
+ * when the TXT record isn't there yet or hasn't propagated.
13
+ */
14
+
15
+ import { formatOutput, formatDetail, printSuccess, printWarning, printInfo } from '../core/output.js';
16
+ import { resolveOrgId } from './helpers.js';
17
+ import { resolveEndpoint } from '../api/endpoints.js';
18
+
19
+ export function registerDomainCommands(program, ctx) {
20
+ const { client, auth } = ctx;
21
+
22
+ const domain = program
23
+ .command('domain')
24
+ .description('Manage org domain verification (team+ — DNS ownership proof)');
25
+
26
+ // ── domain list ──────────────────────────────────────────────────────────────
27
+
28
+ domain
29
+ .command('list')
30
+ .description('List domains claimed by the active org')
31
+ .action(async () => {
32
+ auth.requireAuth();
33
+ const orgId = resolveOrgId(auth, program);
34
+ const ep = resolveEndpoint('domains.list', { orgId });
35
+ const data = await client.get(ep.path, { service: ep.service });
36
+ const rows = data.domains || data || [];
37
+
38
+ formatOutput({
39
+ // fleet #392: column is verified_at (a timestamp), not a `verified` flag.
40
+ columns: ['id', 'domain', 'verified_at', 'created_at'],
41
+ headers: ['ID', 'Domain', 'Verified', 'Created'],
42
+ rows,
43
+ }, { format: program.opts().output, emptyMessage: 'No domains claimed for this org.' });
44
+ });
45
+
46
+ // ── domain add ───────────────────────────────────────────────────────────────
47
+
48
+ domain
49
+ .command('add')
50
+ .description('Claim a domain and get its DNS verification instructions')
51
+ .argument('<domain>', 'domain name (e.g. "example.com")')
52
+ .action(async (domainName) => {
53
+ auth.requireAuth();
54
+ const orgId = resolveOrgId(auth, program);
55
+ const body = { domain: domainName };
56
+
57
+ const ep = resolveEndpoint('domains.create', { orgId });
58
+ const data = await client.post(ep.path, { service: ep.service, body });
59
+ printSuccess(`Domain "${domainName}" claim started.`);
60
+ formatDetail(data.domain || {}, { format: program.opts().output });
61
+ if (data.instructions && program.opts().output !== 'json') {
62
+ printInfo(data.instructions);
63
+ }
64
+ });
65
+
66
+ // ── domain verify ────────────────────────────────────────────────────────────
67
+
68
+ domain
69
+ .command('verify')
70
+ .description('Re-check DNS for a claimed domain')
71
+ .argument('<domainId>', 'domain ID')
72
+ .action(async (domainId) => {
73
+ auth.requireAuth();
74
+ const orgId = resolveOrgId(auth, program);
75
+ const ep = resolveEndpoint('domains.verify', { orgId, domainId });
76
+ const data = await client.post(ep.path, { service: ep.service });
77
+
78
+ if (data.verified) {
79
+ printSuccess('Domain verified.');
80
+ } else {
81
+ printWarning(`Not verified yet (reason: ${data.reason || 'unknown'}).${data.retryable ? ' Retryable — DNS changes can take up to 48 hours.' : ''}`);
82
+ }
83
+ });
84
+
85
+ // ── domain remove ────────────────────────────────────────────────────────────
86
+
87
+ domain
88
+ .command('remove')
89
+ .description('Remove a claimed domain')
90
+ .argument('<domainId>', 'domain ID')
91
+ .option('--force', 'skip confirmation')
92
+ .action(async (domainId, options) => {
93
+ auth.requireAuth();
94
+ const orgId = resolveOrgId(auth, program);
95
+
96
+ if (!options.force && !program.opts().yes) {
97
+ const { default: inquirer } = await import('inquirer');
98
+ const ans = await inquirer.prompt([{
99
+ type: 'confirm',
100
+ name: 'confirm',
101
+ message: `Remove domain ${domainId}? SSO/user-domain routing tied to it will stop working.`,
102
+ default: false,
103
+ }]);
104
+ if (!ans.confirm) {
105
+ printInfo('Cancelled.');
106
+ return;
107
+ }
108
+ }
109
+
110
+ const ep = resolveEndpoint('domains.delete', { orgId, domainId });
111
+ await client.delete(ep.path, { service: ep.service });
112
+ printSuccess('Domain removed.');
113
+ });
114
+ }