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,240 @@
1
+ /**
2
+ * Telegram Pro commands (QTG-PRO P0 CLI parity): onboarding status, owner
3
+ * binding, session leases, and webhook admin.
4
+ *
5
+ * quox tg status [--bot <botId>]
6
+ * quox tg bind-owner <tg_chat_id> [--bot <botId>]
7
+ * quox tg leases
8
+ * quox tg webhook-info [--bot <botId>]
9
+ * quox tg setup <webhook_url> [--bot <botId>]
10
+ *
11
+ * Backend: services/collector/server.js (QTG-PRO P0 sections) — every route
12
+ * is collector-direct (no org segment in the URL), requireServiceOrUserAuth()
13
+ * gated. Onboarding handler bodies live in
14
+ * services/collector/lib/telegramPro/onboardingService.js (getOnboardingStatus,
15
+ * bindOwner); session leases in services/collector/lib/telegramPro/sessionLeaseStore.js;
16
+ * webhook admin reuses the existing /webhook/telegram/* routes shared with
17
+ * the original Telegram integration setup flow.
18
+ *
19
+ * bind-owner 409s when a primary owner binding already exists for the
20
+ * bot/chat/thread — mirrored on the quoxchat `reply` 409 convention
21
+ * (cli/lib/commands/quoxchat.js): catch, surface a plain-language error, and
22
+ * point the caller at `quox tg status` rather than trying to unpack response
23
+ * detail the generic client error path doesn't forward (QuoxApiError only
24
+ * carries `detail`/`details`, not arbitrary body fields like `binding`).
25
+ */
26
+
27
+ import { formatOutput, formatDetail, printSuccess } from '../core/output.js';
28
+ import { resolveEndpoint } from '../api/endpoints.js';
29
+
30
+ function yesNo(value) {
31
+ return value ? 'yes' : 'no';
32
+ }
33
+
34
+ function isoOrDash(value) {
35
+ if (value === null || value === undefined) return '-';
36
+ const d = new Date(value);
37
+ return Number.isNaN(d.getTime()) ? String(value) : d.toISOString();
38
+ }
39
+
40
+ function renderStatus(data, botId) {
41
+ const lines = [];
42
+ lines.push('');
43
+ lines.push(`Bot: ${botId || 'default'}`);
44
+ if (data.bot) {
45
+ lines.push(` Username ${data.bot.username || '-'}`);
46
+ lines.push(` Name ${data.bot.name || '-'}`);
47
+ } else {
48
+ lines.push(' (no bot token configured)');
49
+ }
50
+ lines.push(` Webhook URL ${data.webhook?.url || '-'}`);
51
+ lines.push(` Webhook active ${yesNo(!!data.webhook?.active)}`);
52
+ if (data.webhook?.last_error_message) {
53
+ lines.push(` Last error ${data.webhook.last_error_message}`);
54
+ }
55
+ if (data.owner_binding) {
56
+ lines.push(` Owner chat ${data.owner_binding.tg_chat_id}${data.owner_binding.title ? ` (${data.owner_binding.title})` : ''}`);
57
+ } else {
58
+ lines.push(' Owner chat not bound');
59
+ }
60
+ return lines.join('\n');
61
+ }
62
+
63
+ export function registerTgCommands(program, ctx) {
64
+ const { client, auth } = ctx;
65
+
66
+ const tg = program
67
+ .command('tg')
68
+ .description('Manage Telegram Pro: onboarding status, owner binding, session leases, webhook admin');
69
+
70
+ // ── status ───────────────────────────────────────────────────────────────
71
+
72
+ tg
73
+ .command('status')
74
+ .description('Show Telegram Pro onboarding status: bot, webhook, seen chats, owner binding')
75
+ .option('--bot <botId>', 'target a specific bot ID instead of the default gateway bot')
76
+ .action(async (options) => {
77
+ auth.requireAuth();
78
+ const query = {};
79
+ if (options.bot) query.bot_id = options.bot;
80
+
81
+ const ep = resolveEndpoint('tg.status');
82
+ const data = await client.get(ep.path, { service: ep.service, query });
83
+
84
+ const format = program.opts().output;
85
+ if (format === 'json') {
86
+ console.log(JSON.stringify(data, null, 2));
87
+ return;
88
+ }
89
+ if (format === 'quiet') {
90
+ console.log(data.bot?.username || '');
91
+ return;
92
+ }
93
+
94
+ console.log(renderStatus(data, options.bot));
95
+
96
+ formatOutput({
97
+ columns: ['tg_chat_id', 'title', 'is_forum', 'seen_at'],
98
+ headers: ['Chat ID', 'Title', 'Forum', 'Seen'],
99
+ rows: (data.chats_seen || []).map((c) => ({
100
+ tg_chat_id: c.tg_chat_id,
101
+ title: c.title || '-',
102
+ is_forum: yesNo(c.is_forum),
103
+ seen_at: c.seen_at || '-',
104
+ })),
105
+ }, { format, emptyMessage: 'No chats seen yet — message the bot from a chat first.' });
106
+
107
+ if (data.bots && data.bots.length) {
108
+ console.log('\nBots');
109
+ formatOutput({
110
+ columns: ['bot_id', 'username', 'kind', 'webhook_active', 'chats_bound'],
111
+ headers: ['Bot ID', 'Username', 'Kind', 'Webhook', 'Chats'],
112
+ rows: data.bots.map((b) => ({
113
+ bot_id: b.bot_id,
114
+ username: b.username || '-',
115
+ kind: b.kind,
116
+ webhook_active: yesNo(b.webhook_active),
117
+ chats_bound: b.chats_bound,
118
+ })),
119
+ }, { format, emptyMessage: 'No bots configured.' });
120
+ }
121
+ });
122
+
123
+ // ── bind-owner ───────────────────────────────────────────────────────────
124
+
125
+ tg
126
+ .command('bind-owner')
127
+ .description('Bind a Telegram chat as the owner target (the chat must have messaged the bot first)')
128
+ .argument('<tg_chat_id>', 'Telegram chat ID that has already messaged the bot')
129
+ .option('--bot <botId>', 'target a specific bot ID instead of the default gateway bot')
130
+ .action(async (tgChatId, options) => {
131
+ auth.requireAuth();
132
+ const body = { tg_chat_id: tgChatId };
133
+ if (options.bot) body.bot_id = options.bot;
134
+
135
+ const ep = resolveEndpoint('tg.bindOwner');
136
+ try {
137
+ const data = await client.post(ep.path, { service: ep.service, body });
138
+ if (program.opts().output === 'json') {
139
+ console.log(JSON.stringify(data, null, 2));
140
+ return;
141
+ }
142
+ printSuccess(`Owner bound to chat ${tgChatId}.`);
143
+ if (data.binding) {
144
+ formatDetail(data.binding, {
145
+ format: program.opts().output,
146
+ title: 'Owner Binding',
147
+ });
148
+ }
149
+ } catch (err) {
150
+ if (err.status === 409) {
151
+ throw new Error(
152
+ `A primary owner binding already exists for this bot. Run \`quox tg status${options.bot ? ` --bot ${options.bot}` : ''}\` to see the current owner binding before rebinding.`
153
+ );
154
+ }
155
+ throw err;
156
+ }
157
+ });
158
+
159
+ // ── leases ───────────────────────────────────────────────────────────────
160
+
161
+ tg
162
+ .command('leases')
163
+ .description('List session leases for parallel terminal identities (T1-T8)')
164
+ .action(async () => {
165
+ auth.requireAuth();
166
+ const ep = resolveEndpoint('tg.leases.list');
167
+ const data = await client.get(ep.path, { service: ep.service });
168
+
169
+ formatOutput({
170
+ columns: ['terminal', 'session_id', 'stream', 'alive', 'expires_at'],
171
+ headers: ['Terminal', 'Session ID', 'Stream', 'Alive', 'Expires'],
172
+ rows: (data.leases || []).map((l) => ({
173
+ terminal: l.terminal,
174
+ session_id: l.session_id,
175
+ stream: l.stream || '-',
176
+ alive: yesNo(l.alive),
177
+ expires_at: isoOrDash(l.expires_at),
178
+ })),
179
+ }, { format: program.opts().output, emptyMessage: 'No active session leases.' });
180
+ });
181
+
182
+ // ── webhook-info ─────────────────────────────────────────────────────────
183
+
184
+ tg
185
+ .command('webhook-info')
186
+ .description('Show current Telegram webhook status (per-bot info is pending backend support; --bot is a no-op today)')
187
+ .option('--bot <botId>', 'target a specific bot ID (not yet honored server-side)')
188
+ .action(async (options) => {
189
+ auth.requireAuth();
190
+ const query = {};
191
+ if (options.bot) query.bot_id = options.bot;
192
+
193
+ const ep = resolveEndpoint('tg.webhook.info');
194
+ const data = await client.get(ep.path, { service: ep.service, query });
195
+
196
+ formatDetail({
197
+ active: data.active,
198
+ has_token: data.has_token,
199
+ bot_username: data.bot_username,
200
+ webhook_url: data.webhook_url,
201
+ pending_update_count: data.pending_update_count,
202
+ last_error_date: data.last_error_date,
203
+ last_error_message: data.last_error_message,
204
+ }, {
205
+ format: program.opts().output,
206
+ title: 'Telegram Webhook Info',
207
+ labels: {
208
+ active: 'Active',
209
+ has_token: 'Has token',
210
+ bot_username: 'Bot username',
211
+ webhook_url: 'Webhook URL',
212
+ pending_update_count: 'Pending updates',
213
+ last_error_date: 'Last error date',
214
+ last_error_message: 'Last error message',
215
+ },
216
+ });
217
+ });
218
+
219
+ // ── setup ────────────────────────────────────────────────────────────────
220
+
221
+ tg
222
+ .command('setup')
223
+ .description('Register the Telegram webhook URL for the bot')
224
+ .argument('<webhook_url>', 'HTTPS URL Telegram should POST updates to')
225
+ .option('--bot <botId>', 'target a specific bot ID instead of the default gateway bot')
226
+ .action(async (webhookUrl, options) => {
227
+ auth.requireAuth();
228
+ const body = { webhook_url: webhookUrl };
229
+ if (options.bot) body.bot_id = options.bot;
230
+
231
+ const ep = resolveEndpoint('tg.webhook.setup');
232
+ const data = await client.post(ep.path, { service: ep.service, body });
233
+
234
+ if (program.opts().output === 'json') {
235
+ console.log(JSON.stringify(data, null, 2));
236
+ return;
237
+ }
238
+ printSuccess(`Webhook registered: ${data.webhook_url} (bot: ${data.bot_username || 'unknown'}).`);
239
+ });
240
+ }
@@ -0,0 +1,218 @@
1
+ /**
2
+ * `quox tiktok` — TikTok plugin verbs, TT-4 (instagram CLI parity).
3
+ *
4
+ * quox tiktok publish "<title>" --file <path-in-media-root> [--privacy SELF_ONLY|MUTUAL_FOLLOW_FRIENDS|PUBLIC_TO_EVERYONE] [--no-duet] [--no-comment] [--no-stitch]
5
+ * quox tiktok draft "<title>" --file <path-in-media-root>
6
+ * quox tiktok profile
7
+ * quox tiktok videos [--limit <n>]
8
+ * quox tiktok stats --ids <id,id,...>
9
+ * quox tiktok status --publish-id <id>
10
+ *
11
+ * The write verbs (publish, draft) execute the tiktok connector tool through
12
+ * the governed collector endpoint (POST /api/v1/tools/execute -> connector
13
+ * bridge). The bridge gates both on requiresApproval: it files an owner
14
+ * approval card and returns immediately with { pending:true,
15
+ * status:'awaiting_approval', approvalId, inbox_item_id }. The actual TikTok
16
+ * API write (video/init -> upload -> publish, or the inbox/draft init ->
17
+ * upload) only happens once the owner approves via the dashboard inbox or
18
+ * `quox inbox respond <id> --action approve`.
19
+ *
20
+ * TikTok has its OWN dedicated vaulted credential; there is no shared
21
+ * credential with any other plugin. Two hard truths this CLI states
22
+ * honestly: an unaudited TikTok app is restricted to posting private
23
+ * (SELF_ONLY) content regardless of the privacy level requested, until
24
+ * TikTok approves the app audit; and access tokens live 24 hours with no
25
+ * automatic refresh built yet.
26
+ */
27
+
28
+ import { formatDetail, printSuccess, printInfo, printWarning } from '../core/output.js';
29
+ import { resolveEndpoint } from '../api/endpoints.js';
30
+ import { resolveOrgId } from './helpers.js';
31
+
32
+ const PRIVACY_LEVELS = ['SELF_ONLY', 'MUTUAL_FOLLOW_FRIENDS', 'PUBLIC_TO_EVERYONE'];
33
+
34
+ /**
35
+ * Execute one tiktok connector tool via the governed collector endpoint.
36
+ * A pending-approval response is a SUCCESS shape here (the card was filed);
37
+ * only a non-pending success:false is an error.
38
+ */
39
+ async function executeTikTokTool({ client, auth, program }, toolName, input) {
40
+ auth.requireAuth();
41
+ const orgId = resolveOrgId(auth, program);
42
+ const ep = resolveEndpoint('v1.tools.execute');
43
+ const body = { tool_name: toolName, input, org_id: orgId };
44
+ const data = await client.post(ep.path, { service: ep.service, body });
45
+ if (data && data.success === false && !data.pending) {
46
+ throw new Error(`${toolName} via POST ${ep.path} returned success:false: ${data.error || 'unknown error'}`);
47
+ }
48
+ return data;
49
+ }
50
+
51
+ function printAwaitingApproval(action, data) {
52
+ const itemRef = data.inbox_item_id || data.approvalId || 'unknown';
53
+ printSuccess(`${action} filed for owner approval - inbox item ${itemRef} (awaiting approval). Nothing publishes until an approver says yes.`);
54
+ if (data.inbox_item_id) {
55
+ printInfo(`Review and approve: quox inbox get ${data.inbox_item_id} (or: quox inbox respond ${data.inbox_item_id} --action approve)`);
56
+ }
57
+ }
58
+
59
+ export function registerTikTokCommands(program, ctx) {
60
+ const { client, auth } = ctx;
61
+
62
+ const tiktok = program
63
+ .command('tiktok')
64
+ .description('TikTok video publishing and draft uploads: governed, HITL-approved via HITL Inbox, on your own dedicated TikTok credential');
65
+
66
+ // ── tiktok publish ────────────────────────────────────────────────────
67
+
68
+ tiktok
69
+ .command('publish')
70
+ .description('Publish a video from a file under the org TikTok media root. Files an owner approval card and returns immediately; never publishes directly.')
71
+ .argument('<title>', 'video title/caption')
72
+ .requiredOption('--file <path>', 'video file path, relative to the org TikTok media root')
73
+ .option('--privacy <level>', `privacy level: ${PRIVACY_LEVELS.join('|')} (default SELF_ONLY)`, 'SELF_ONLY')
74
+ .option('--no-duet', 'disable duets on this video')
75
+ .option('--no-comment', 'disable comments on this video')
76
+ .option('--no-stitch', 'disable stitching on this video')
77
+ .action(async (title, options) => {
78
+ const privacy = options.privacy || 'SELF_ONLY';
79
+ if (!PRIVACY_LEVELS.includes(privacy)) {
80
+ throw new Error(`--privacy must be one of ${PRIVACY_LEVELS.join(', ')} (got ${privacy})`);
81
+ }
82
+
83
+ const input = {
84
+ title,
85
+ video_path: options.file,
86
+ privacy_level: privacy,
87
+ disable_duet: !options.duet,
88
+ disable_comment: !options.comment,
89
+ disable_stitch: !options.stitch,
90
+ };
91
+
92
+ const data = await executeTikTokTool({ client, auth, program }, 'tiktok_publish_video', input);
93
+
94
+ if (program.opts().output === 'json') {
95
+ formatDetail(data, { format: 'json' });
96
+ return;
97
+ }
98
+ printAwaitingApproval('Publish', data);
99
+ if (privacy !== 'SELF_ONLY') {
100
+ printWarning(`Requested privacy_level=${privacy} is sent to TikTok exactly as asked, but an unaudited TikTok app is restricted to private (SELF_ONLY) viewing until TikTok approves the app audit. Check the outcome with: quox tiktok status --publish-id <id>`);
101
+ }
102
+ });
103
+
104
+ // ── tiktok draft ──────────────────────────────────────────────────────
105
+
106
+ tiktok
107
+ .command('draft')
108
+ .description('Upload a video to the account\'s TikTok inbox as a draft, finished manually in the TikTok app. Files an owner approval card and returns immediately; never uploads directly.')
109
+ .argument('<title>', 'working title for the draft (display only)')
110
+ .requiredOption('--file <path>', 'video file path, relative to the org TikTok media root')
111
+ .action(async (title, options) => {
112
+ const input = { title, video_path: options.file };
113
+ const data = await executeTikTokTool({ client, auth, program }, 'tiktok_upload_draft', input);
114
+
115
+ if (program.opts().output === 'json') {
116
+ formatDetail(data, { format: 'json' });
117
+ return;
118
+ }
119
+ printAwaitingApproval('Draft upload', data);
120
+ });
121
+
122
+ // ── tiktok profile (read; cheapest live credential check) ──────────────
123
+
124
+ tiktok
125
+ .command('profile')
126
+ .description('Show the connected TikTok profile (also the cheapest live credential check).')
127
+ .action(async () => {
128
+ const data = await executeTikTokTool({ client, auth, program }, 'tiktok_get_profile', {});
129
+
130
+ if (program.opts().output === 'json') {
131
+ formatDetail(data, { format: 'json' });
132
+ return;
133
+ }
134
+ const result = data.result || {};
135
+ if (!result.open_id && !result.display_name) {
136
+ printInfo('No profile returned.');
137
+ return;
138
+ }
139
+ console.log(`${result.display_name || 'unknown'} (${result.open_id || 'unknown'})`);
140
+ console.log(` followers: ${result.followers ?? 'unknown'} following: ${result.following ?? 'unknown'} likes: ${result.likes ?? 'unknown'} videos: ${result.videos ?? 'unknown'}`);
141
+ });
142
+
143
+ // ── tiktok videos (read) ────────────────────────────────────────────────
144
+
145
+ tiktok
146
+ .command('videos')
147
+ .description('List the connected account\'s recent videos (read-only, no approval needed).')
148
+ .option('--limit <n>', 'max videos to return (max 20)', '10')
149
+ .action(async (options) => {
150
+ const maxCount = Math.min(parseInt(options.limit, 10) || 10, 20);
151
+ const data = await executeTikTokTool({ client, auth, program }, 'tiktok_list_videos', { max_count: maxCount });
152
+
153
+ if (program.opts().output === 'json') {
154
+ formatDetail(data, { format: 'json' });
155
+ return;
156
+ }
157
+ const videos = data.result?.videos || [];
158
+ if (videos.length === 0) {
159
+ printInfo('No videos returned.');
160
+ return;
161
+ }
162
+ for (const v of videos) {
163
+ console.log(`${v.id} ${v.title || '(no title)'}`);
164
+ console.log(` views: ${v.views ?? 0} likes: ${v.likes ?? 0} comments: ${v.comments ?? 0} shares: ${v.shares ?? 0}`);
165
+ }
166
+ });
167
+
168
+ // ── tiktok stats (read) ──────────────────────────────────────────────────
169
+
170
+ tiktok
171
+ .command('stats')
172
+ .description('Show engagement stats for specific videos by id.')
173
+ .requiredOption('--ids <ids>', 'comma-separated TikTok video IDs')
174
+ .action(async (options) => {
175
+ const videoIds = options.ids.split(',').map((s) => s.trim()).filter(Boolean);
176
+ if (videoIds.length === 0) {
177
+ throw new Error('tiktok stats requires at least one id in --ids');
178
+ }
179
+ const data = await executeTikTokTool({ client, auth, program }, 'tiktok_get_video_stats', { video_ids: videoIds });
180
+
181
+ if (program.opts().output === 'json') {
182
+ formatDetail(data, { format: 'json' });
183
+ return;
184
+ }
185
+ const videos = data.result || [];
186
+ if (videos.length === 0) {
187
+ printInfo('No stats returned.');
188
+ return;
189
+ }
190
+ for (const v of videos) {
191
+ console.log(`${v.id} ${v.title || '(no title)'}`);
192
+ console.log(` views: ${v.views ?? 0} likes: ${v.likes ?? 0} comments: ${v.comments ?? 0} shares: ${v.shares ?? 0}`);
193
+ }
194
+ });
195
+
196
+ // ── tiktok status (read) ─────────────────────────────────────────────────
197
+
198
+ tiktok
199
+ .command('status')
200
+ .description('Check the status of a video publish or draft upload by publish_id.')
201
+ .requiredOption('--publish-id <id>', 'the publish_id returned by publish or draft')
202
+ .action(async (options) => {
203
+ const data = await executeTikTokTool({ client, auth, program }, 'tiktok_get_publish_status', { publish_id: options.publishId });
204
+
205
+ if (program.opts().output === 'json') {
206
+ formatDetail(data, { format: 'json' });
207
+ return;
208
+ }
209
+ const result = data.result || {};
210
+ if (!result.status) {
211
+ printInfo('No status returned.');
212
+ return;
213
+ }
214
+ console.log(`${result.publish_id} status: ${result.status}`);
215
+ if (result.fail_reason) console.log(` fail_reason: ${result.fail_reason}`);
216
+ if (result.publicly_available_post_ids) console.log(` publicly_available_post_ids: ${result.publicly_available_post_ids}`);
217
+ });
218
+ }
@@ -0,0 +1,23 @@
1
+ /**
2
+ * quox tips [--json]
3
+ *
4
+ * The canned "did you know" tips behind the terminal's /tip (QUOXON-TIPS). Offline: this prints the registry
5
+ * (cli/lib/quoxon/tips.js), not what is ready on your install; the terminal applies the honesty gate
6
+ * (shipped maturity, capabilities contract, /tip-settings) when it shows one. --json (or -o json) is the
7
+ * shape the dashboard and cli.quox.ai reuse.
8
+ */
9
+
10
+ import { TIPS, tipsJson, tipsReply } from '../quoxon/tips.js';
11
+
12
+ export function registerTipsCommands(program) {
13
+ program
14
+ .command('tips')
15
+ .description('List the "did you know" tips the terminal shows (/tip); --json for the registry as data')
16
+ .argument('[query...]', 'search the tips by topic or words (like /tips); bare lists every tip')
17
+ .option('--json', 'print the registry as JSON')
18
+ .action((query, opts) => {
19
+ if (opts.json || program.opts().output === 'json') { console.log(JSON.stringify(tipsJson(), null, 2)); return; }
20
+ if (query?.length) { for (const l of tipsReply(query.join(' ')).lines) console.log(l); return; }
21
+ for (const t of TIPS) console.log(`${t.id} [${t.product} · ${t.tier} · ${t.maturity}] ${t.text} Try: ${t.try}`);
22
+ });
23
+ }