quoxcli 0.4.0 → 0.6.0

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 (199) hide show
  1. package/CHANGELOG.md +110 -0
  2. package/README.md +2 -2
  3. package/bin/quox.js +19 -1
  4. package/bin/quoxon.js +6 -1
  5. package/lib/api/endpoints/admin.js +7 -0
  6. package/lib/api/endpoints/agent-attach.js +7 -0
  7. package/lib/api/endpoints/compliance.js +25 -0
  8. package/lib/api/endpoints/governance.js +7 -0
  9. package/lib/api/endpoints/inbox.js +6 -0
  10. package/lib/api/endpoints/inboxq.js +58 -0
  11. package/lib/api/endpoints/index.js +4 -0
  12. package/lib/api/endpoints/lucid.js +17 -0
  13. package/lib/api/endpoints/mcp.js +35 -0
  14. package/lib/api/endpoints/mon.js +122 -0
  15. package/lib/api/endpoints/notesq.js +2 -0
  16. package/lib/api/endpoints/quoxplan.js +51 -0
  17. package/lib/api/endpoints/tools.js +13 -0
  18. package/lib/api/endpoints/v1.js +13 -0
  19. package/lib/commands/actions.js +51 -13
  20. package/lib/commands/admin.js +35 -0
  21. package/lib/commands/agentAttach.js +15 -0
  22. package/lib/commands/approvals.js +193 -3
  23. package/lib/commands/ask.js +1 -1
  24. package/lib/commands/auth.js +64 -11
  25. package/lib/commands/backup.js +11 -4
  26. package/lib/commands/capabilities.js +3 -2
  27. package/lib/commands/chat.js +15 -0
  28. package/lib/commands/claude.js +4 -1
  29. package/lib/commands/compliance.js +109 -0
  30. package/lib/commands/connect.js +69 -0
  31. package/lib/commands/contacts.js +2 -0
  32. package/lib/commands/dev.js +6 -8
  33. package/lib/commands/doctor.js +22 -3
  34. package/lib/commands/evidence.js +2 -1
  35. package/lib/commands/gripe.js +24 -13
  36. package/lib/commands/inbox.js +37 -3
  37. package/lib/commands/inboxq.js +147 -0
  38. package/lib/commands/kuma.js +78 -5
  39. package/lib/commands/licenceLinkView.js +311 -0
  40. package/lib/commands/linkedin.js +19 -0
  41. package/lib/commands/loop.js +30 -3
  42. package/lib/commands/lucid.js +7 -0
  43. package/lib/commands/lucidGoals.js +389 -0
  44. package/lib/commands/mail.js +427 -25
  45. package/lib/commands/mcp.js +190 -0
  46. package/lib/commands/memory.js +68 -4
  47. package/lib/commands/memorySync.js +158 -0
  48. package/lib/commands/mon.js +69 -144
  49. package/lib/commands/monitoring.js +68 -0
  50. package/lib/commands/notes.js +29 -7
  51. package/lib/commands/notesSeal.js +617 -0
  52. package/lib/commands/objective.js +5 -2
  53. package/lib/commands/offload.js +52 -12
  54. package/lib/commands/plan.js +487 -52
  55. package/lib/commands/provider.js +29 -8
  56. package/lib/commands/qlarity.js +32 -1
  57. package/lib/commands/run.js +2 -1
  58. package/lib/commands/server.js +37 -0
  59. package/lib/commands/setup.js +127 -75
  60. package/lib/commands/skills.js +4 -1
  61. package/lib/commands/slot.js +49 -9
  62. package/lib/commands/status.js +92 -44
  63. package/lib/commands/tool.js +30 -0
  64. package/lib/commands/vault.js +6 -3
  65. package/lib/commands/volt.js +6 -1
  66. package/lib/commands/walkthrough.js +14 -2
  67. package/lib/commands/watch.js +11 -2
  68. package/lib/commands/wazuh.js +880 -0
  69. package/lib/commands/wazuhIntake.js +358 -0
  70. package/lib/commands/wazuhReport.js +192 -0
  71. package/lib/commands/workflow.js +47 -4
  72. package/lib/commands/x.js +50 -0
  73. package/lib/core/announce.js +86 -0
  74. package/lib/core/auth.js +20 -2
  75. package/lib/core/callMe.js +118 -0
  76. package/lib/core/client.js +27 -1
  77. package/lib/core/commandRegistrars.js +9 -0
  78. package/lib/core/config.js +42 -3
  79. package/lib/core/confirm.js +68 -7
  80. package/lib/core/crossOrgApprovals.js +69 -0
  81. package/lib/core/errors.js +52 -1
  82. package/lib/core/governedSession.js +135 -5
  83. package/lib/core/inboxResolution.js +3 -2
  84. package/lib/core/loginGuard.js +73 -0
  85. package/lib/core/offload.js +120 -0
  86. package/lib/core/org-override.js +5 -1
  87. package/lib/core/output.js +30 -5
  88. package/lib/core/profileTrust.js +182 -0
  89. package/lib/core/quoxglyph.js +22 -1
  90. package/lib/core/router.js +14 -0
  91. package/lib/core/selfUpdate.js +2 -0
  92. package/lib/core/stepUpPrompt.js +99 -0
  93. package/lib/core/version.js +1 -1
  94. package/lib/core/walkthrough.js +9 -5
  95. package/lib/dragon/select.js +2 -2
  96. package/lib/quoxon/EXTENSIONS.md +142 -19
  97. package/lib/quoxon/api.js +189 -34
  98. package/lib/quoxon/app.js +1277 -188
  99. package/lib/quoxon/approvalBatch.js +117 -0
  100. package/lib/quoxon/approvalFacts.js +56 -2
  101. package/lib/quoxon/approvalSentence.js +8 -4
  102. package/lib/quoxon/approvalsView.js +72 -12
  103. package/lib/quoxon/ask.js +4 -2
  104. package/lib/quoxon/autoOpen.js +94 -0
  105. package/lib/quoxon/backgroundWork.js +59 -0
  106. package/lib/quoxon/bang.js +8 -2
  107. package/lib/quoxon/capabilities.js +7 -2
  108. package/lib/quoxon/commandShort.js +8 -1
  109. package/lib/quoxon/commands.js +42 -12
  110. package/lib/quoxon/connect.js +5 -3
  111. package/lib/quoxon/deckLazy.js +58 -0
  112. package/lib/quoxon/delegationDragon.js +49 -0
  113. package/lib/quoxon/destructive.js +35 -0
  114. package/lib/quoxon/dnd.js +118 -0
  115. package/lib/quoxon/dragonCompanion.js +37 -7
  116. package/lib/quoxon/dragonMoments.js +78 -0
  117. package/lib/quoxon/echo.js +1 -0
  118. package/lib/quoxon/events.js +55 -8
  119. package/lib/quoxon/extensions.js +400 -38
  120. package/lib/quoxon/foreignText.js +49 -0
  121. package/lib/quoxon/gripeQueue.js +135 -0
  122. package/lib/quoxon/inboxView.js +125 -22
  123. package/lib/quoxon/keys.js +2 -2
  124. package/lib/quoxon/launcher.js +2 -1
  125. package/lib/quoxon/loopCard.js +7 -2
  126. package/lib/quoxon/loopCards.js +17 -8
  127. package/lib/quoxon/loopStream.js +20 -9
  128. package/lib/quoxon/mailView.js +71 -0
  129. package/lib/quoxon/main.js +27 -6
  130. package/lib/quoxon/markdown.js +1 -1
  131. package/lib/quoxon/model.js +15 -0
  132. package/lib/quoxon/neverAnswered.js +20 -0
  133. package/lib/quoxon/objects/away.js +43 -5
  134. package/lib/quoxon/onboarding/connectServer.js +162 -0
  135. package/lib/quoxon/onboarding/copy.js +6 -0
  136. package/lib/quoxon/onboarding/dockerOffer.js +3 -1
  137. package/lib/quoxon/onboarding/index.js +5 -43
  138. package/lib/quoxon/onboarding/probe.js +20 -1
  139. package/lib/quoxon/onboarding/view.js +16 -3
  140. package/lib/quoxon/orgSwitch.js +22 -0
  141. package/lib/quoxon/print.js +2 -0
  142. package/lib/quoxon/profileSwitch.js +7 -0
  143. package/lib/quoxon/promptHistory.js +3 -1
  144. package/lib/quoxon/render.js +68 -16
  145. package/lib/quoxon/resend.js +14 -0
  146. package/lib/quoxon/roster.js +10 -5
  147. package/lib/quoxon/rosterSessions.js +44 -0
  148. package/lib/quoxon/rows.js +3 -1
  149. package/lib/quoxon/screenContext.js +1 -1
  150. package/lib/quoxon/secretShape.js +88 -0
  151. package/lib/quoxon/slash/agents.js +2 -1
  152. package/lib/quoxon/slash/argSources.js +9 -2
  153. package/lib/quoxon/slash/args.js +4 -2
  154. package/lib/quoxon/slash/broadcast.js +48 -11
  155. package/lib/quoxon/slash/broadcastRun.js +24 -7
  156. package/lib/quoxon/slash/cliLeaves.json +98 -1
  157. package/lib/quoxon/slash/dashboard.js +2 -0
  158. package/lib/quoxon/slash/hatWalk.js +1 -1
  159. package/lib/quoxon/slash/listView.js +2 -1
  160. package/lib/quoxon/slash/palette.js +63 -1
  161. package/lib/quoxon/slash/paletteController.js +15 -5
  162. package/lib/quoxon/slash/restart.js +9 -4
  163. package/lib/quoxon/slash/stepUp.js +5 -5
  164. package/lib/quoxon/slash/stepUpCmds.js +74 -1
  165. package/lib/quoxon/slashSpinner.js +35 -0
  166. package/lib/quoxon/slotAttach.js +8 -0
  167. package/lib/quoxon/slotChat.js +24 -3
  168. package/lib/quoxon/slotFormat.js +1 -1
  169. package/lib/quoxon/slotOutbox.js +113 -0
  170. package/lib/quoxon/slotRun.js +2 -0
  171. package/lib/quoxon/suggestCommand.js +1 -1
  172. package/lib/quoxon/term.js +25 -1
  173. package/lib/quoxon/transcript.js +2 -1
  174. package/lib/quoxon/webPty.js +15 -0
  175. package/lib/quoxon/welcome.js +1 -1
  176. package/lib/quoxon/whatsnew.js +1 -1
  177. package/lib/quoxon/whatsnew.jsonl +42 -0
  178. package/lib/render/planBrief.js +614 -0
  179. package/lib/server/installFlow.js +168 -0
  180. package/lib/server/status.js +15 -1
  181. package/lib/toolOutputShape.js +61 -3
  182. package/package.json +3 -2
  183. package/vendor/dragonlab/SOURCE +3 -3
  184. package/vendor/dragonlab/design/quoxperticus/v2/quoxperticus-master.svg +59 -0
  185. package/vendor/dragonlab/design/quoxperticus/v3/character.mjs +43 -0
  186. package/vendor/dragonlab/design/quoxperticus/v4/character.mjs +57 -0
  187. package/vendor/dragonlab/design/quoxperticus/v4/review.mjs +35 -0
  188. package/vendor/dragonlab/design/quoxperticus/v4/watch.mjs +56 -0
  189. package/vendor/dragonlab/design/vulcan/v1/character.mjs +34 -0
  190. package/vendor/dragonlab/design/vulcan/v1/vulcan-master.svg +57 -0
  191. package/vendor/dragonlab/design/vulcan/v2/character.mjs +39 -0
  192. package/vendor/dragonlab/design/vulcan/v3/character.mjs +41 -0
  193. package/vendor/dragonlab/design/vulcan/v3/review.mjs +35 -0
  194. package/vendor/dragonlab/design/vulcan/v3/watch.mjs +56 -0
  195. package/vendor/dragonlab/factory/svg-rig-contour.mjs +64 -0
  196. package/vendor/dragonlab/integration/companions-v1/characters.mjs +20 -0
  197. package/vendor/dragonlab/integration/companions-v1/quoxperticus.mjs +2 -0
  198. package/vendor/dragonlab/integration/companions-v1/view.mjs +1 -1
  199. package/vendor/dragonlab/integration/companions-v1/vulcan.mjs +2 -0
package/CHANGELOG.md ADDED
@@ -0,0 +1,110 @@
1
+ # Changelog
2
+
3
+ User-visible changes to the `quoxcli` package. Items marked *(unproven)* ship in
4
+ the package and pass their tests, but nobody has run them end to end from the
5
+ published package yet.
6
+
7
+ ## 0.6.0 (2026-11-10)
8
+
9
+ Nothing below has been run end to end from the published 0.6.0 package yet: treat every
10
+ item as *(unproven from the package)*. Items marked *(driven live)* were driven against a
11
+ live instance from the source tree before release.
12
+
13
+ ### New commands
14
+ - `quox notes seal convert <id>` and `quox notes seal purge <id>` (human sessions only):
15
+ seal an existing plaintext note in place, then wipe its old plaintext revisions. Convert
16
+ names any attachments and says they are NOT protected. *(driven live)*
17
+ - Sealed notes harden: each sealed note is bound to its note id (another note's envelope
18
+ is refused), the version comes from the authenticated envelope, and a local rollback
19
+ floor fails closed under a lock.
20
+ - `quox notes seal` finds ENQRYPT without setup: `QUOX_ENQRYPT_PATH`, then
21
+ `~/.quox/enqrypt-src` (a clone of quoxai/enqrypt main plus `npm ci`); a copy missing a
22
+ function the CLI calls is refused by name. ENQRYPT is not on npm, and the npm package
23
+ named `enqrypt` is unrelated malware. *(driven live)*
24
+ - `quox mail block | unblock | blocked | junk | trust`.
25
+ - `quox mcp token create | list | revoke`.
26
+ - `quox lucid goals`, `quox lucid insights`, `quox lucid brief`.
27
+ - `quox plan brief`, `quox plan watch`, `quox plan followups` / `followup add | done | status`,
28
+ `quox plan roadmap archive | unarchive`, `quox plan roadmaps --archived`.
29
+ - `quox monitoring incidents claim <id>` and `quox monitoring incidents status <id> <status>`: claim and move a
30
+ governance incident (witnessed, org scoped). `quox wazuh connect --indexer-ca` and
31
+ `--password-stdin` / `--indexer-password-stdin`.
32
+
33
+ ### Changes
34
+ - `quox plan add` honours `roadmap_id` in the JSON (streams used to land in the first
35
+ roadmap). `quox plan focus` counts substreams and caps its output; unblockers name the
36
+ whole chain.
37
+ - `quox wazuh vulns` totals are exact or labelled a lower bound (10,000+); `quox wazuh status`
38
+ says its agent count includes the manager; no MAINT? column when the org has no Uptime Kuma.
39
+ - `quox offload` lists every worker lease and warns 12h before one expires; `offload release
40
+ --worker` targets that worker, never the shared default.
41
+ - `quox tool exec --select .` returns the whole result. `quox actions list` fits the terminal.
42
+ - Conversation app (`quox` with no arguments): `/wake`, `/poke` and `/page` take several
43
+ slots; `/inbox show N` reads a whole item; `/morningreport` digests what happened since you
44
+ were last here; a typed `/org switch` or `/org back` no longer asks a second y/n; an inline
45
+ approval says approved only after the server records it and no longer re-opens as a popup;
46
+ decision cards never echo the asker's pick as their own advice; contact-consent approvals ask
47
+ for the lawful basis; slot messages from other sessions never show raw colour codes.
48
+
49
+ ## 0.5.0 (2026-11-06)
50
+
51
+ ### New commands
52
+ - `quox wazuh`: first-class Wazuh commands. `agents`, `fim`, `sca`, `rootcheck`
53
+ and `coverage` are reads. `vulns --priority` ranks CVEs by CISA KEV, EPSS,
54
+ CVSS and how many hosts each one hits (driven live across the fleet before
55
+ this release). Fleet-wide reads cover up to 200 active agents (it was a
56
+ silent 25 before).
57
+ - `quox wazuh report generate | list | show | verify`: signed vulnerability
58
+ reports. `verify` works offline against a pinned PEM or a raw key.
59
+ *(unproven from the package)*
60
+ - `quox wazuh connect`, `quox wazuh hooks create | list | rotate | delete | install`,
61
+ `quox wazuh incidents [--open] [--since] | show | close | diagnose | escalate`
62
+ and `quox wazuh triage`. Writes go through one approval per call.
63
+ *(unproven from the package)*
64
+ - `quox compliance reports list | show` (read): framework, period, score,
65
+ status per control and sampled evidence ids. `quox compliance jobs list`, and
66
+ jobs can now be named. *(unproven from the package)*
67
+ - `quox tool installed` and `quox tool uninstall`, to read back and undo a
68
+ `quox tool install`. *(unproven from the package)*
69
+ - `quox approvals approve | deny | list` by id or short tail, `quox approvals withdraw`
70
+ (the requester takes its own hold back), and `quox approvals call-me [status|on|off]`
71
+ (needs the quox-voice licence).
72
+ - `quox connect <url>` with certificate pinning per profile (`--trust-cert`,
73
+ `--fingerprint`), and `quox server install` (with `--dry-run`, `--yes`, `--json`).
74
+ - `quox notes seal init | status | new | open | edit | print`: ENQRYPT sealed
75
+ notes. Encryption happens on your machine and the server stores only the
76
+ envelope. *(unproven from the package)*
77
+ - `quox notes seal convert <id> --yes [--keep-title]` seals an existing note and
78
+ purges its earlier plaintext from the server (revisions, embeddings, derived
79
+ beliefs; human sessions only); `quox notes seal purge <id> --yes` reruns the
80
+ purge. Both say that backups taken earlier still hold the old text until they
81
+ expire. `seal edit` now takes the version from the sealed envelope, not from a
82
+ server field, and the local rollback floor refuses a damaged or missing floor
83
+ file instead of starting again from zero. *(unproven from the package)*
84
+ - `quox admin users verify-email <email> --reason` (step-up PIN).
85
+ - `quox memory sync`: Claude file memory is saved to Quox memory too
86
+ (idempotent; credential-shaped text is refused).
87
+ - `quox inbox unread <id...>`, `quox x whoami | accounts`, `quox linkedin whoami`,
88
+ `quox workflow create | apply | import-n8n --activate` (a plain create is not armed).
89
+
90
+ ### Terminal UI (quoxon)
91
+ - New approvals and questions open by themselves as the walkthrough card.
92
+ - Approve verbs ask for the step-up PIN on a terminal; destructive approvals
93
+ need the target name typed.
94
+ - Do not disturb and `/sleep` survive restarts; `/morningreport` gives a grouped
95
+ digest of what arrived while you were away.
96
+ - `/mail` reads triaged email (read-only), `/outbox` queues `/say` sends that
97
+ failed on connectivity and sends them in order once you are back online.
98
+ - Other-org approvals show on the bar, with a hint about how many more are waiting.
99
+ - A secret paste guard asks before it sends text that looks like a credential,
100
+ and redacts it from history.
101
+ - Extensions hot-reload, and extension host contract v1 is out (panels, tabs,
102
+ settings).
103
+
104
+ ### Fixes
105
+ - An explicit `-p <profile>` with no session now fails, instead of quietly
106
+ using the service key.
107
+ - `quox workflow update` finds engine workflows. `quox run list` fills in its
108
+ columns again.
109
+ - Watch and loop streams back off and give up cleanly, instead of polling forever.
110
+ - Docs links point at quox.ai/cli.
package/README.md CHANGED
@@ -12,7 +12,7 @@ npm install -g quoxcli
12
12
 
13
13
  Needs Node.js 20 or later. This installs two commands: `quox`, and `quoxon` (an alias that opens the conversation).
14
14
 
15
- Docs: https://cli.quox.ai/docs/start/
15
+ Docs: https://quox.ai/cli/docs/quickstart/
16
16
 
17
17
  ## Prerequisite: a running QuoxCORE
18
18
 
@@ -142,4 +142,4 @@ export NODE_EXTRA_CA_CERTS=/path/to/your-ca.pem
142
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
143
 
144
144
  Website: https://quox.ai
145
- CLI home: https://cli.quox.ai
145
+ CLI home: https://quox.ai/cli
package/bin/quox.js CHANGED
@@ -11,6 +11,14 @@ if (!process.env.QUOX_SESSION_ID && process.env.QUOX_SESSION_ID_FILE) {
11
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
12
  }
13
13
 
14
+ // ONBOARD-P1: a profile that trusts its server's own certificate (quox connect) makes this run trust it too, via a
15
+ // one-time re-run with NODE_EXTRA_CA_CERTS set for this process tree only. Before anything else loads.
16
+ {
17
+ const { reexecWithProfileTrust } = await import('../lib/core/profileTrust.js');
18
+ const code = reexecWithProfileTrust(process.argv.slice(2), process.env);
19
+ if (code !== null) process.exit(code);
20
+ }
21
+
14
22
  // CORTEX-BENCH: Node's fetch parses HTTP with a WebAssembly module, and V8
15
23
  // recompiles it at the optimising tier on a background thread; Node waits for
16
24
  // that compile before exiting, adding 350-700ms to every short command after
@@ -167,7 +175,17 @@ if (process.argv.includes('--no-color') || process.env.NO_COLOR) {
167
175
  const config = loadConfig(resolveProfileFlagFromArgv(process.argv.slice(2)));
168
176
  const auth = createAuth(config);
169
177
  const client = createClient(config, auth);
170
- const ctx = { config, auth, client, program };
178
+ // A client on the SAME user's token for another org the user belongs to (minted per org, window scope, never moves the
179
+ // profile's org). Lazy: nothing is minted unless a verb asks (approvals --org, the "more waiting in <org>" hint).
180
+ let _orgClients = null;
181
+ const clientForOrg = async (orgId) => {
182
+ if (!_orgClients) {
183
+ const { createWindowClient } = await import('../lib/quoxon/windowOrg.js');
184
+ _orgClients = createWindowClient({ config, auth, createClient }).clientForOrg;
185
+ }
186
+ return _orgClients(orgId);
187
+ };
188
+ const ctx = { config, auth, client, program, clientForOrg };
171
189
 
172
190
  // Register all command groups
173
191
  // Command groups, in registration order. CORTEX-BENCH (quox#7xx CLI startup):
package/bin/quoxon.js CHANGED
@@ -1,6 +1,11 @@
1
1
  #!/usr/bin/env node
2
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';
3
+ {
4
+ const { reexecWithProfileTrust } = await import('../lib/core/profileTrust.js');
5
+ const code = reexecWithProfileTrust(process.argv.slice(2), process.env);
6
+ if (code !== null) process.exit(code);
7
+ }
8
+ const { main } = await import('../lib/quoxon/main.js');
4
9
 
5
10
  main().catch((err) => {
6
11
  console.error(err?.message || err);
@@ -17,6 +17,13 @@ export const admin = {
17
17
  path: () => '/api/admin/agent-identities',
18
18
  tags: ['admin-write'],
19
19
  },
20
+ // ADMIN-VERIFY-EMAIL: instance-admin + human + step-up (scope override). Served by services/auth/routes/admin.js.
21
+ 'admin.users.verify_email': {
22
+ method: 'POST',
23
+ service: 'auth',
24
+ path: () => '/api/admin/users/verify-email',
25
+ tags: ['admin-write'],
26
+ },
20
27
  // Instance basics after setup (app URL etc). Served by services/auth/routes/admin-instance.js.
21
28
  'admin.instance.basics.get': {
22
29
  method: 'GET',
@@ -27,6 +27,13 @@ export const agentAttach = {
27
27
  path: ({ leaseId }) => `/api/agent-attach/lease/${encodeURIComponent(leaseId)}/release`,
28
28
  tags: ['live-write'],
29
29
  },
30
+ // Org-wide list of live attaches (org owner/admin). Feeds `quox agent attaches` and the quoxon /roster.
31
+ 'agent-attach.list': {
32
+ method: 'GET',
33
+ service: 'auth',
34
+ path: () => '/api/agent-attach',
35
+ tags: ['live-safe'],
36
+ },
30
37
  'agent-attach.status': {
31
38
  method: 'GET',
32
39
  service: 'auth',
@@ -0,0 +1,25 @@
1
+ /**
2
+ * 'compliance.*' endpoints: scheduled compliance report jobs and generated reports.
3
+ * See cli/lib/api/endpoints/index.js for aggregation + the fragment convention.
4
+ */
5
+
6
+ export const compliance = {
7
+ 'compliance.jobs.list': {
8
+ method: 'GET',
9
+ service: 'collector',
10
+ path: () => `/compliance/jobs`,
11
+ tags: ['live-safe'],
12
+ },
13
+ 'compliance.reports.list': {
14
+ method: 'GET',
15
+ service: 'collector',
16
+ path: () => `/compliance/reports`,
17
+ tags: ['live-safe'],
18
+ },
19
+ 'compliance.reports.get': {
20
+ method: 'GET',
21
+ service: 'collector',
22
+ path: ({ id }) => `/compliance/reports/${encodeURIComponent(id)}`,
23
+ tags: ['live-safe'],
24
+ },
25
+ };
@@ -22,6 +22,13 @@ export const governance = {
22
22
  path: () => `/governance/incidents`,
23
23
  tags: ['live-safe'],
24
24
  },
25
+ // WAZ P11 slice 1b: the witnessed lifecycle move (claim = self, status with a resolution for terminal states).
26
+ // Collector: lib/governanceIncidentLifecycle.js. Writes, so not live-safe.
27
+ 'governance.incidents.transition': {
28
+ method: 'POST',
29
+ service: 'collector',
30
+ path: ({ id }) => `/governance/incidents/${encodeURIComponent(id)}/transition`,
31
+ },
25
32
  'governance.policy.compile': {
26
33
  method: 'POST',
27
34
  service: 'collector',
@@ -30,6 +30,12 @@ export const inbox = {
30
30
  path: ({ orgId, itemId }) => `/api/orgs/${orgId}/inbox/${itemId}/respond`,
31
31
  tags: ['live-write'],
32
32
  },
33
+ 'inbox.withdraw': {
34
+ method: 'POST',
35
+ service: 'auth',
36
+ path: ({ orgId, itemId }) => `/api/orgs/${orgId}/inbox/${itemId}/withdraw`,
37
+ tags: ['live-write'],
38
+ },
33
39
  // quox ask: a session files a decision request (one inbox item) and waits for the human's answer.
34
40
  'inbox.decision.create': {
35
41
  method: 'POST',
@@ -26,6 +26,19 @@ export const inboxq = {
26
26
  path: ({ accountId }) => `/api/v1/inboxq/accounts/${accountId}`,
27
27
  tags: ['live-write'],
28
28
  },
29
+ // quox#1504: per-account TLS certificate pin (human org admin only).
30
+ 'inboxq.accounts.tlsPin': {
31
+ method: 'PUT',
32
+ service: 'collector',
33
+ path: ({ accountId }) => `/api/v1/inboxq/accounts/${encodeURIComponent(accountId)}/tls-pin`,
34
+ tags: ['live-write'],
35
+ },
36
+ 'inboxq.syncStatus': {
37
+ method: 'GET',
38
+ service: 'collector',
39
+ path: () => `/api/v1/inboxq/sync-status`,
40
+ tags: ['live-safe'],
41
+ },
29
42
  'inboxq.messages.get': {
30
43
  method: 'GET',
31
44
  service: 'collector',
@@ -99,6 +112,12 @@ export const inboxq = {
99
112
  path: ({ watchId }) => `/api/v1/inboxq/watches/${watchId}/active`,
100
113
  tags: ['live-write'],
101
114
  },
115
+ 'inboxq.watches.delete': {
116
+ method: 'DELETE',
117
+ service: 'collector',
118
+ path: ({ watchId }) => `/api/v1/inboxq/watches/${watchId}`,
119
+ tags: ['live-write'],
120
+ },
102
121
  'inboxq.proposals.list': {
103
122
  method: 'GET',
104
123
  service: 'collector',
@@ -117,4 +136,43 @@ export const inboxq = {
117
136
  path: ({ proposalId }) => `/api/v1/inboxq/proposals/${proposalId}/resolve`,
118
137
  tags: ['live-write'],
119
138
  },
139
+ // EMAIL-Q CLI audit (2026-11-09): the sender/junk routes the dashboard already
140
+ // calls (src/components/inboxq/lib/api.js), wrapped by `quox mail block|unblock|
141
+ // blocked|junk|trust`. No new server logic: these are the existing InboxQ routes.
142
+ 'inboxq.messages.search': {
143
+ method: 'GET',
144
+ service: 'collector',
145
+ path: () => `/api/v1/inboxq/messages/search`,
146
+ tags: ['live-safe'],
147
+ },
148
+ 'inboxq.messages.confirmJunk': {
149
+ method: 'POST',
150
+ service: 'collector',
151
+ path: () => `/api/v1/inboxq/messages/confirm-junk`,
152
+ tags: ['live-write'],
153
+ },
154
+ 'inboxq.senders.block': {
155
+ method: 'POST',
156
+ service: 'collector',
157
+ path: () => `/api/v1/inboxq/senders/block`,
158
+ tags: ['live-write'],
159
+ },
160
+ 'inboxq.senders.unblock': {
161
+ method: 'POST',
162
+ service: 'collector',
163
+ path: () => `/api/v1/inboxq/senders/unblock`,
164
+ tags: ['live-write'],
165
+ },
166
+ 'inboxq.senders.blocked': {
167
+ method: 'GET',
168
+ service: 'collector',
169
+ path: () => `/api/v1/inboxq/senders/blocked`,
170
+ tags: ['live-safe'],
171
+ },
172
+ 'inboxq.senders.trust': {
173
+ method: 'POST',
174
+ service: 'collector',
175
+ path: () => `/api/v1/inboxq/senders/trust`,
176
+ tags: ['live-write'],
177
+ },
120
178
  };
@@ -74,6 +74,7 @@ import { budgets } from './budgets.js';
74
74
  import { calendarq } from './calendarq.js';
75
75
  import { catalog } from './catalog.js';
76
76
  import { chat } from './chat.js';
77
+ import { compliance } from './compliance.js';
77
78
  import { consent } from './consent.js';
78
79
  import { conversations } from './conversations.js';
79
80
  import { customRoles } from './custom-roles.js';
@@ -95,6 +96,7 @@ import { contactsq } from './contactsq.js';
95
96
  import { x } from './x.js';
96
97
  import { llmPolicy } from './llm-policy.js';
97
98
  import { hat } from './hat.js';
99
+ import { mcp } from './mcp.js';
98
100
  import { members } from './members.js';
99
101
  import { memory } from './memory.js';
100
102
  import { mfa } from './mfa.js';
@@ -166,6 +168,7 @@ export const ENDPOINTS = {
166
168
  ...calendarq,
167
169
  ...catalog,
168
170
  ...chat,
171
+ ...compliance,
169
172
  ...consent,
170
173
  ...conversations,
171
174
  ...customRoles,
@@ -187,6 +190,7 @@ export const ENDPOINTS = {
187
190
  ...x,
188
191
  ...llmPolicy,
189
192
  ...hat,
193
+ ...mcp,
190
194
  ...members,
191
195
  ...memory,
192
196
  ...mfa,
@@ -86,4 +86,21 @@ export const lucid = {
86
86
  path: () => `/api/v1/lucid/herald/test`,
87
87
  tags: ['live-safe'],
88
88
  },
89
+ // LUCID-INTELLIGENCE World Model (LI-1): goals, initiatives, decisions, links. People confirm; agents propose.
90
+ 'lucid.world.list': { method: 'GET', service: 'collector', path: () => `/api/v1/lucid/intelligence/world`, tags: ['live-safe'] },
91
+ 'lucid.world.create': { method: 'POST', service: 'collector', path: () => `/api/v1/lucid/intelligence/world`, tags: ['live-write'] },
92
+ 'lucid.world.export': { method: 'GET', service: 'collector', path: () => `/api/v1/lucid/intelligence/world/export`, tags: ['live-safe'] },
93
+ 'lucid.world.erase': { method: 'DELETE', service: 'collector', path: () => `/api/v1/lucid/intelligence/world/mine`, tags: ['live-write'] },
94
+ 'lucid.world.get': { method: 'GET', service: 'collector', path: ({ id }) => `/api/v1/lucid/intelligence/world/${encodeURIComponent(id)}`, tags: ['live-safe'] },
95
+ 'lucid.world.amend': { method: 'PATCH', service: 'collector', path: ({ id }) => `/api/v1/lucid/intelligence/world/${encodeURIComponent(id)}`, tags: ['live-write'] },
96
+ 'lucid.world.confirm': { method: 'POST', service: 'collector', path: ({ id }) => `/api/v1/lucid/intelligence/world/${encodeURIComponent(id)}/confirm`, tags: ['live-write'] },
97
+ 'lucid.world.archive': { method: 'POST', service: 'collector', path: ({ id }) => `/api/v1/lucid/intelligence/world/${encodeURIComponent(id)}/archive`, tags: ['live-write'] },
98
+ 'lucid.world.restore': { method: 'POST', service: 'collector', path: ({ id }) => `/api/v1/lucid/intelligence/world/${encodeURIComponent(id)}/restore`, tags: ['live-write'] },
99
+ 'lucid.world.history': { method: 'GET', service: 'collector', path: ({ id }) => `/api/v1/lucid/intelligence/world/${encodeURIComponent(id)}/history`, tags: ['live-safe'] },
100
+ // LUCID-INTELLIGENCE LI-2 shadow insights (read-only).
101
+ 'lucid.insights.list': { method: 'GET', service: 'collector', path: () => `/api/v1/lucid/intelligence/insights`, tags: ['live-safe'] },
102
+ 'lucid.insights.status': { method: 'GET', service: 'collector', path: () => `/api/v1/lucid/intelligence/insights/status`, tags: ['live-safe'] },
103
+ 'lucid.insights.get': { method: 'GET', service: 'collector', path: ({ id }) => `/api/v1/lucid/intelligence/insights/${encodeURIComponent(id)}`, tags: ['live-safe'] },
104
+ // LUCID-INTELLIGENCE LI-3 brief (read-only, never moves a cursor).
105
+ 'lucid.brief': { method: 'GET', service: 'collector', path: () => `/api/v1/lucid/intelligence/brief`, tags: ['live-safe'] },
89
106
  };
@@ -0,0 +1,35 @@
1
+ /**
2
+ * 'mcp.*' endpoints: per-user QuoxMCP tokens and the personalised Claude Desktop bundle.
3
+ *
4
+ * - mcp.tokens.* auth service, services/auth/routes/mcp-tokens.js (mounted /api/auth/tokens/mcp, requireAuth,
5
+ * scoped to the caller: list/revoke only ever see the caller's own tokens; create needs an org context).
6
+ * - mcp.bundle collector, services/collector/routes/mcp-bundle.js (JWT only). POST { token, collector_url, agent_id }
7
+ * returns a .mcpb zip whose manifest EMBEDS the token as QUOX_SERVICE_KEY. Binary, read with raw: true.
8
+ */
9
+
10
+ export const mcp = {
11
+ 'mcp.tokens.create': {
12
+ method: 'POST',
13
+ service: 'auth',
14
+ path: () => '/api/auth/tokens/mcp',
15
+ tags: ['live-write'],
16
+ },
17
+ 'mcp.tokens.list': {
18
+ method: 'GET',
19
+ service: 'auth',
20
+ path: () => '/api/auth/tokens/mcp',
21
+ tags: ['live-safe'],
22
+ },
23
+ 'mcp.tokens.revoke': {
24
+ method: 'DELETE',
25
+ service: 'auth',
26
+ path: ({ id }) => `/api/auth/tokens/mcp/${encodeURIComponent(id)}`,
27
+ tags: ['live-write'],
28
+ },
29
+ 'mcp.bundle': {
30
+ method: 'POST',
31
+ service: 'collector',
32
+ path: () => '/api/v1/mcp/bundle',
33
+ tags: ['live-write'],
34
+ },
35
+ };
@@ -163,6 +163,12 @@ export const mon = {
163
163
  path: ({ id } = {}) => `/api/v1/kuma/monitors/${encodeURIComponent(id)}/resume`,
164
164
  tags: ['live-write'],
165
165
  },
166
+ 'mon.kuma.monitors.wire-alerts': {
167
+ method: 'POST',
168
+ service: 'collector',
169
+ path: ({ id } = {}) => `/api/v1/kuma/monitors/${encodeURIComponent(id)}/wire-alerts`,
170
+ tags: ['live-write'],
171
+ },
166
172
  'mon.kuma.monitors.delete': {
167
173
  method: 'DELETE',
168
174
  service: 'collector',
@@ -318,12 +324,36 @@ export const mon = {
318
324
  path: () => `/api/v1/wazuh/agents`,
319
325
  tags: ['live-safe'],
320
326
  },
327
+ 'mon.wazuh.read': {
328
+ method: 'GET',
329
+ service: 'collector',
330
+ path: ({ tool }) => `/api/v1/wazuh/read/${tool}`,
331
+ tags: ['live-safe'],
332
+ },
321
333
  'mon.wazuh.alerts.list': {
322
334
  method: 'GET',
323
335
  service: 'collector',
324
336
  path: () => `/api/v1/wazuh/alerts`,
325
337
  tags: ['live-safe'],
326
338
  },
339
+ 'mon.wazuh.alerts.triage': {
340
+ method: 'GET',
341
+ service: 'collector',
342
+ path: () => `/api/v1/wazuh/alerts/triage`,
343
+ tags: ['live-safe'],
344
+ },
345
+ 'mon.wazuh.coverage': {
346
+ method: 'GET',
347
+ service: 'collector',
348
+ path: () => `/api/v1/wazuh/coverage`,
349
+ tags: ['live-safe'],
350
+ },
351
+ 'mon.wazuh.credential.import-instance-env': {
352
+ method: 'POST',
353
+ service: 'collector',
354
+ path: () => `/api/v1/wazuh/credential/import-instance-env`,
355
+ tags: ['live-write'],
356
+ },
327
357
  'mon.wazuh.deploy-agent': {
328
358
  method: 'POST',
329
359
  service: 'collector',
@@ -348,6 +378,98 @@ export const mon = {
348
378
  path: () => `/api/v1/wazuh/manager/status`,
349
379
  tags: ['live-safe'],
350
380
  },
381
+ 'mon.wazuh.reports.create': {
382
+ method: 'POST',
383
+ service: 'collector',
384
+ path: () => `/api/v1/wazuh/reports`,
385
+ tags: ['live-safe'],
386
+ },
387
+ 'mon.wazuh.reports.list': {
388
+ method: 'GET',
389
+ service: 'collector',
390
+ path: () => `/api/v1/wazuh/reports`,
391
+ tags: ['live-safe'],
392
+ },
393
+ 'mon.wazuh.reports.get': {
394
+ method: 'GET',
395
+ service: 'collector',
396
+ path: ({ id } = {}) => `/api/v1/wazuh/reports/${encodeURIComponent(id)}`,
397
+ tags: ['live-safe'],
398
+ },
399
+ 'mon.wazuh.reports.verify': {
400
+ method: 'GET',
401
+ service: 'collector',
402
+ path: ({ id } = {}) => `/api/v1/wazuh/reports/${encodeURIComponent(id)}/verify`,
403
+ tags: ['live-safe'],
404
+ },
405
+ // WAZ P6: Wazuh integratord alert hooks (org admin) and the incidents they open.
406
+ 'mon.wazuh.hooks.list': {
407
+ method: 'GET',
408
+ service: 'collector',
409
+ path: () => `/api/v1/wazuh/hooks`,
410
+ tags: ['live-safe'],
411
+ },
412
+ 'mon.wazuh.hooks.create': {
413
+ method: 'POST',
414
+ service: 'collector',
415
+ path: () => `/api/v1/wazuh/hooks`,
416
+ tags: ['live-write'],
417
+ },
418
+ 'mon.wazuh.hooks.rotate': {
419
+ method: 'POST',
420
+ service: 'collector',
421
+ path: ({ id } = {}) => `/api/v1/wazuh/hooks/${encodeURIComponent(id)}/rotate`,
422
+ tags: ['live-write'],
423
+ },
424
+ 'mon.wazuh.hooks.delete': {
425
+ method: 'DELETE',
426
+ service: 'collector',
427
+ path: ({ id } = {}) => `/api/v1/wazuh/hooks/${encodeURIComponent(id)}`,
428
+ tags: ['live-write'],
429
+ },
430
+ 'mon.wazuh.incidents.list': {
431
+ method: 'GET',
432
+ service: 'collector',
433
+ path: ({ open, since, limit } = {}) => {
434
+ const q = [];
435
+ if (open) q.push('open=1');
436
+ if (since) q.push(`since=${encodeURIComponent(since)}`);
437
+ if (limit) q.push(`limit=${encodeURIComponent(limit)}`);
438
+ return `/api/v1/wazuh/incidents${q.length ? `?${q.join('&')}` : ''}`;
439
+ },
440
+ tags: ['live-safe'],
441
+ },
442
+ 'mon.wazuh.incidents.get': {
443
+ method: 'GET',
444
+ service: 'collector',
445
+ path: ({ id } = {}) => `/api/v1/wazuh/incidents/${encodeURIComponent(id)}`,
446
+ tags: ['live-safe'],
447
+ },
448
+ 'mon.wazuh.incidents.close': {
449
+ method: 'POST',
450
+ service: 'collector',
451
+ path: ({ id } = {}) => `/api/v1/wazuh/incidents/${encodeURIComponent(id)}/close`,
452
+ tags: ['live-write'],
453
+ },
454
+ // WAZ P7: read-only host diagnosis (off-list reads are held by the ssh_exec approval gate) and hand-off to QuoxSecurity.
455
+ 'mon.wazuh.incidents.diagnose': {
456
+ method: 'POST',
457
+ service: 'collector',
458
+ path: ({ id } = {}) => `/api/v1/wazuh/incidents/${encodeURIComponent(id)}/diagnose`,
459
+ tags: ['live-write'],
460
+ },
461
+ 'mon.wazuh.incidents.escalate': {
462
+ method: 'POST',
463
+ service: 'collector',
464
+ path: ({ id } = {}) => `/api/v1/wazuh/incidents/${encodeURIComponent(id)}/escalate`,
465
+ tags: ['live-write'],
466
+ },
467
+ 'mon.wazuh.vulnerabilities.priority': {
468
+ method: 'GET',
469
+ service: 'collector',
470
+ path: () => `/api/v1/wazuh/vulnerabilities/priority`,
471
+ tags: ['live-safe'],
472
+ },
351
473
  'mon.wazuh.vulnerabilities.list': {
352
474
  method: 'GET',
353
475
  service: 'collector',
@@ -19,6 +19,8 @@ export const notesq = {
19
19
  'notesq.notes.revisions': { method: 'GET', service: 'collector', path: ({ id }) => `${B}/notes/${id}/revisions`, tags: ['live-safe'] },
20
20
  'notesq.notes.revision': { method: 'GET', service: 'collector', path: ({ id, rev }) => `${B}/notes/${id}/revisions/${rev}`, tags: ['live-safe'] },
21
21
  'notesq.notes.restore': { method: 'POST', service: 'collector', path: ({ id }) => `${B}/notes/${id}/restore`, tags: ['live-write'] },
22
+ // ENQRYPT-NOTES: human-only purge of a sealed note's earlier plaintext (revisions, embeddings, derived beliefs).
23
+ 'notesq.notes.sealPurge': { method: 'POST', service: 'collector', path: ({ id }) => `${B}/notes/${id}/seal-purge`, tags: ['live-write'] },
22
24
  'notesq.import': { method: 'POST', service: 'collector', path: () => `${B}/import`, tags: ['live-write'] },
23
25
  // AQ-9D P4: Action-Q item create (auth, org-scoped), used by `quox notes actions`.
24
26
  'notesq.actionq.create': { method: 'POST', service: 'auth', path: ({ orgId }) => `/api/orgs/${orgId}/actions`, tags: ['live-write'] },
@@ -40,6 +40,14 @@ export const quoxplan = {
40
40
  path: ({ roadmapId }) => `/api/v1/quoxplan/roadmaps/${roadmapId}/streams`,
41
41
  tags: ['live-safe'],
42
42
  },
43
+ // One-screen roadmap brief (QUOXPLAN-TERMINAL): top priorities, needs-you,
44
+ // unblockers, recent movers, stale count. Query: top (1..25), days (1..60).
45
+ 'quoxplan.roadmap.brief.get': {
46
+ method: 'GET',
47
+ service: 'collector',
48
+ path: ({ roadmapId }) => `/api/v1/quoxplan/roadmaps/${roadmapId}/brief`,
49
+ tags: ['live-safe'],
50
+ },
43
51
  'quoxplan.roadmap.timeline.get': {
44
52
  method: 'GET',
45
53
  service: 'collector',
@@ -58,6 +66,21 @@ export const quoxplan = {
58
66
  path: ({ roadmapId }) => `/api/v1/quoxplan/roadmaps/${roadmapId}/streams`,
59
67
  tags: ['live-write'],
60
68
  },
69
+ // Archive / unarchive a roadmap (QUOXPLAN-TERMINAL, gripe quoxai/quox#1586):
70
+ // hides it from GET /roadmaps and /search and refuses writes to its streams;
71
+ // reads by id keep working. Both idempotent server-side.
72
+ 'quoxplan.roadmap.archive': {
73
+ method: 'POST',
74
+ service: 'collector',
75
+ path: ({ roadmapId }) => `/api/v1/quoxplan/roadmaps/${roadmapId}/archive`,
76
+ tags: ['live-write'],
77
+ },
78
+ 'quoxplan.roadmap.unarchive': {
79
+ method: 'POST',
80
+ service: 'collector',
81
+ path: ({ roadmapId }) => `/api/v1/quoxplan/roadmaps/${roadmapId}/unarchive`,
82
+ tags: ['live-write'],
83
+ },
61
84
  'quoxplan.roadmap.export.get': {
62
85
  method: 'GET',
63
86
  service: 'collector',
@@ -118,4 +141,32 @@ export const quoxplan = {
118
141
  path: ({ id }) => `/api/v1/quoxplan/streams/${id}/plan/versions`,
119
142
  tags: ['live-safe'],
120
143
  },
144
+ // Action items (QUOXPLAN-TERMINAL: the dashboard's action-item panel had no
145
+ // CLI counterpart). Server: quoxplan/server/src/api/actionItems.js. Auto
146
+ // items (kind blocked/decision) are raised by stream status transitions;
147
+ // manual items are added here. Statuses: OPEN | DONE | CANCELLED.
148
+ 'quoxplan.roadmap.actionItems.list': {
149
+ method: 'GET',
150
+ service: 'collector',
151
+ path: ({ roadmapId }) => `/api/v1/quoxplan/roadmaps/${roadmapId}/action-items`,
152
+ tags: ['live-safe'],
153
+ },
154
+ 'quoxplan.stream.actionItems.list': {
155
+ method: 'GET',
156
+ service: 'collector',
157
+ path: ({ id }) => `/api/v1/quoxplan/streams/${id}/action-items`,
158
+ tags: ['live-safe'],
159
+ },
160
+ 'quoxplan.stream.actionItems.create': {
161
+ method: 'POST',
162
+ service: 'collector',
163
+ path: ({ id }) => `/api/v1/quoxplan/streams/${id}/action-items`,
164
+ tags: ['live-write'],
165
+ },
166
+ 'quoxplan.actionItem.update': {
167
+ method: 'PATCH',
168
+ service: 'collector',
169
+ path: ({ actionId }) => `/api/v1/quoxplan/action-items/${actionId}`,
170
+ tags: ['live-write'],
171
+ },
121
172
  };