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.
- package/CHANGELOG.md +110 -0
- package/README.md +2 -2
- package/bin/quox.js +19 -1
- package/bin/quoxon.js +6 -1
- package/lib/api/endpoints/admin.js +7 -0
- package/lib/api/endpoints/agent-attach.js +7 -0
- package/lib/api/endpoints/compliance.js +25 -0
- package/lib/api/endpoints/governance.js +7 -0
- package/lib/api/endpoints/inbox.js +6 -0
- package/lib/api/endpoints/inboxq.js +58 -0
- package/lib/api/endpoints/index.js +4 -0
- package/lib/api/endpoints/lucid.js +17 -0
- package/lib/api/endpoints/mcp.js +35 -0
- package/lib/api/endpoints/mon.js +122 -0
- package/lib/api/endpoints/notesq.js +2 -0
- package/lib/api/endpoints/quoxplan.js +51 -0
- package/lib/api/endpoints/tools.js +13 -0
- package/lib/api/endpoints/v1.js +13 -0
- package/lib/commands/actions.js +51 -13
- package/lib/commands/admin.js +35 -0
- package/lib/commands/agentAttach.js +15 -0
- package/lib/commands/approvals.js +193 -3
- package/lib/commands/ask.js +1 -1
- package/lib/commands/auth.js +64 -11
- package/lib/commands/backup.js +11 -4
- package/lib/commands/capabilities.js +3 -2
- package/lib/commands/chat.js +15 -0
- package/lib/commands/claude.js +4 -1
- package/lib/commands/compliance.js +109 -0
- package/lib/commands/connect.js +69 -0
- package/lib/commands/contacts.js +2 -0
- package/lib/commands/dev.js +6 -8
- package/lib/commands/doctor.js +22 -3
- package/lib/commands/evidence.js +2 -1
- package/lib/commands/gripe.js +24 -13
- package/lib/commands/inbox.js +37 -3
- package/lib/commands/inboxq.js +147 -0
- package/lib/commands/kuma.js +78 -5
- package/lib/commands/licenceLinkView.js +311 -0
- package/lib/commands/linkedin.js +19 -0
- package/lib/commands/loop.js +30 -3
- package/lib/commands/lucid.js +7 -0
- package/lib/commands/lucidGoals.js +389 -0
- package/lib/commands/mail.js +427 -25
- package/lib/commands/mcp.js +190 -0
- package/lib/commands/memory.js +68 -4
- package/lib/commands/memorySync.js +158 -0
- package/lib/commands/mon.js +69 -144
- package/lib/commands/monitoring.js +68 -0
- package/lib/commands/notes.js +29 -7
- package/lib/commands/notesSeal.js +617 -0
- package/lib/commands/objective.js +5 -2
- package/lib/commands/offload.js +52 -12
- package/lib/commands/plan.js +487 -52
- package/lib/commands/provider.js +29 -8
- package/lib/commands/qlarity.js +32 -1
- package/lib/commands/run.js +2 -1
- package/lib/commands/server.js +37 -0
- package/lib/commands/setup.js +127 -75
- package/lib/commands/skills.js +4 -1
- package/lib/commands/slot.js +49 -9
- package/lib/commands/status.js +92 -44
- package/lib/commands/tool.js +30 -0
- package/lib/commands/vault.js +6 -3
- package/lib/commands/volt.js +6 -1
- package/lib/commands/walkthrough.js +14 -2
- package/lib/commands/watch.js +11 -2
- package/lib/commands/wazuh.js +880 -0
- package/lib/commands/wazuhIntake.js +358 -0
- package/lib/commands/wazuhReport.js +192 -0
- package/lib/commands/workflow.js +47 -4
- package/lib/commands/x.js +50 -0
- package/lib/core/announce.js +86 -0
- package/lib/core/auth.js +20 -2
- package/lib/core/callMe.js +118 -0
- package/lib/core/client.js +27 -1
- package/lib/core/commandRegistrars.js +9 -0
- package/lib/core/config.js +42 -3
- package/lib/core/confirm.js +68 -7
- package/lib/core/crossOrgApprovals.js +69 -0
- package/lib/core/errors.js +52 -1
- package/lib/core/governedSession.js +135 -5
- package/lib/core/inboxResolution.js +3 -2
- package/lib/core/loginGuard.js +73 -0
- package/lib/core/offload.js +120 -0
- package/lib/core/org-override.js +5 -1
- package/lib/core/output.js +30 -5
- package/lib/core/profileTrust.js +182 -0
- package/lib/core/quoxglyph.js +22 -1
- package/lib/core/router.js +14 -0
- package/lib/core/selfUpdate.js +2 -0
- package/lib/core/stepUpPrompt.js +99 -0
- package/lib/core/version.js +1 -1
- package/lib/core/walkthrough.js +9 -5
- package/lib/dragon/select.js +2 -2
- package/lib/quoxon/EXTENSIONS.md +142 -19
- package/lib/quoxon/api.js +189 -34
- package/lib/quoxon/app.js +1277 -188
- package/lib/quoxon/approvalBatch.js +117 -0
- package/lib/quoxon/approvalFacts.js +56 -2
- package/lib/quoxon/approvalSentence.js +8 -4
- package/lib/quoxon/approvalsView.js +72 -12
- package/lib/quoxon/ask.js +4 -2
- package/lib/quoxon/autoOpen.js +94 -0
- package/lib/quoxon/backgroundWork.js +59 -0
- package/lib/quoxon/bang.js +8 -2
- package/lib/quoxon/capabilities.js +7 -2
- package/lib/quoxon/commandShort.js +8 -1
- package/lib/quoxon/commands.js +42 -12
- package/lib/quoxon/connect.js +5 -3
- package/lib/quoxon/deckLazy.js +58 -0
- package/lib/quoxon/delegationDragon.js +49 -0
- package/lib/quoxon/destructive.js +35 -0
- package/lib/quoxon/dnd.js +118 -0
- package/lib/quoxon/dragonCompanion.js +37 -7
- package/lib/quoxon/dragonMoments.js +78 -0
- package/lib/quoxon/echo.js +1 -0
- package/lib/quoxon/events.js +55 -8
- package/lib/quoxon/extensions.js +400 -38
- package/lib/quoxon/foreignText.js +49 -0
- package/lib/quoxon/gripeQueue.js +135 -0
- package/lib/quoxon/inboxView.js +125 -22
- package/lib/quoxon/keys.js +2 -2
- package/lib/quoxon/launcher.js +2 -1
- package/lib/quoxon/loopCard.js +7 -2
- package/lib/quoxon/loopCards.js +17 -8
- package/lib/quoxon/loopStream.js +20 -9
- package/lib/quoxon/mailView.js +71 -0
- package/lib/quoxon/main.js +27 -6
- package/lib/quoxon/markdown.js +1 -1
- package/lib/quoxon/model.js +15 -0
- package/lib/quoxon/neverAnswered.js +20 -0
- package/lib/quoxon/objects/away.js +43 -5
- package/lib/quoxon/onboarding/connectServer.js +162 -0
- package/lib/quoxon/onboarding/copy.js +6 -0
- package/lib/quoxon/onboarding/dockerOffer.js +3 -1
- package/lib/quoxon/onboarding/index.js +5 -43
- package/lib/quoxon/onboarding/probe.js +20 -1
- package/lib/quoxon/onboarding/view.js +16 -3
- package/lib/quoxon/orgSwitch.js +22 -0
- package/lib/quoxon/print.js +2 -0
- package/lib/quoxon/profileSwitch.js +7 -0
- package/lib/quoxon/promptHistory.js +3 -1
- package/lib/quoxon/render.js +68 -16
- package/lib/quoxon/resend.js +14 -0
- package/lib/quoxon/roster.js +10 -5
- package/lib/quoxon/rosterSessions.js +44 -0
- package/lib/quoxon/rows.js +3 -1
- package/lib/quoxon/screenContext.js +1 -1
- package/lib/quoxon/secretShape.js +88 -0
- package/lib/quoxon/slash/agents.js +2 -1
- package/lib/quoxon/slash/argSources.js +9 -2
- package/lib/quoxon/slash/args.js +4 -2
- package/lib/quoxon/slash/broadcast.js +48 -11
- package/lib/quoxon/slash/broadcastRun.js +24 -7
- package/lib/quoxon/slash/cliLeaves.json +98 -1
- package/lib/quoxon/slash/dashboard.js +2 -0
- package/lib/quoxon/slash/hatWalk.js +1 -1
- package/lib/quoxon/slash/listView.js +2 -1
- package/lib/quoxon/slash/palette.js +63 -1
- package/lib/quoxon/slash/paletteController.js +15 -5
- package/lib/quoxon/slash/restart.js +9 -4
- package/lib/quoxon/slash/stepUp.js +5 -5
- package/lib/quoxon/slash/stepUpCmds.js +74 -1
- package/lib/quoxon/slashSpinner.js +35 -0
- package/lib/quoxon/slotAttach.js +8 -0
- package/lib/quoxon/slotChat.js +24 -3
- package/lib/quoxon/slotFormat.js +1 -1
- package/lib/quoxon/slotOutbox.js +113 -0
- package/lib/quoxon/slotRun.js +2 -0
- package/lib/quoxon/suggestCommand.js +1 -1
- package/lib/quoxon/term.js +25 -1
- package/lib/quoxon/transcript.js +2 -1
- package/lib/quoxon/webPty.js +15 -0
- package/lib/quoxon/welcome.js +1 -1
- package/lib/quoxon/whatsnew.js +1 -1
- package/lib/quoxon/whatsnew.jsonl +42 -0
- package/lib/render/planBrief.js +614 -0
- package/lib/server/installFlow.js +168 -0
- package/lib/server/status.js +15 -1
- package/lib/toolOutputShape.js +61 -3
- package/package.json +3 -2
- package/vendor/dragonlab/SOURCE +3 -3
- package/vendor/dragonlab/design/quoxperticus/v2/quoxperticus-master.svg +59 -0
- package/vendor/dragonlab/design/quoxperticus/v3/character.mjs +43 -0
- package/vendor/dragonlab/design/quoxperticus/v4/character.mjs +57 -0
- package/vendor/dragonlab/design/quoxperticus/v4/review.mjs +35 -0
- package/vendor/dragonlab/design/quoxperticus/v4/watch.mjs +56 -0
- package/vendor/dragonlab/design/vulcan/v1/character.mjs +34 -0
- package/vendor/dragonlab/design/vulcan/v1/vulcan-master.svg +57 -0
- package/vendor/dragonlab/design/vulcan/v2/character.mjs +39 -0
- package/vendor/dragonlab/design/vulcan/v3/character.mjs +41 -0
- package/vendor/dragonlab/design/vulcan/v3/review.mjs +35 -0
- package/vendor/dragonlab/design/vulcan/v3/watch.mjs +56 -0
- package/vendor/dragonlab/factory/svg-rig-contour.mjs +64 -0
- package/vendor/dragonlab/integration/companions-v1/characters.mjs +20 -0
- package/vendor/dragonlab/integration/companions-v1/quoxperticus.mjs +2 -0
- package/vendor/dragonlab/integration/companions-v1/view.mjs +1 -1
- 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://
|
|
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://
|
|
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
|
-
|
|
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
|
-
|
|
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
|
+
};
|
package/lib/api/endpoints/mon.js
CHANGED
|
@@ -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
|
};
|