quoxcli 0.3.1 → 0.4.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/lib/api/endpoints/actions.js +15 -0
- package/lib/api/endpoints/admin.js +20 -0
- package/lib/api/endpoints/blog.js +16 -0
- package/lib/api/endpoints/chat.js +7 -0
- package/lib/api/endpoints/contactsq.js +4 -0
- package/lib/api/endpoints/devServerRegistry.js +25 -0
- package/lib/api/endpoints/engagement.js +26 -0
- package/lib/api/endpoints/evidence.js +20 -0
- package/lib/api/endpoints/hat.js +14 -0
- package/lib/api/endpoints/index.js +12 -0
- package/lib/api/endpoints/loops.js +26 -0
- package/lib/api/endpoints/mon.js +173 -0
- package/lib/api/endpoints/objectives.js +6 -0
- package/lib/api/endpoints/quoxseo.js +6 -0
- package/lib/api/endpoints/server.js +21 -0
- package/lib/api/endpoints/setup.js +6 -0
- package/lib/api/endpoints/v1.js +34 -0
- package/lib/commands/actions.js +81 -11
- package/lib/commands/agent.js +11 -4
- package/lib/commands/agentAttach.js +46 -7
- package/lib/commands/approvals.js +5 -0
- package/lib/commands/ask.js +3 -1
- package/lib/commands/blog.js +110 -0
- package/lib/commands/chat.js +127 -28
- package/lib/commands/chatCompanion.js +27 -0
- package/lib/commands/chatState.js +45 -0
- package/lib/commands/claude.js +3 -32
- package/lib/commands/contacts.js +85 -4
- package/lib/commands/contactsSendAt.js +21 -0
- package/lib/commands/engagement.js +90 -0
- package/lib/commands/evidence.js +154 -0
- package/lib/commands/ext.js +23 -0
- package/lib/commands/fleet.js +25 -0
- package/lib/commands/hat.js +76 -0
- package/lib/commands/image.js +68 -0
- package/lib/commands/kuma.js +1050 -0
- package/lib/commands/kumaSla.js +174 -0
- package/lib/commands/licence.js +39 -1
- package/lib/commands/loop.js +291 -0
- package/lib/commands/objective.js +48 -1
- package/lib/commands/org.js +21 -4
- package/lib/commands/provider.js +58 -0
- package/lib/commands/quoxseo.js +31 -0
- package/lib/commands/research.js +79 -0
- package/lib/commands/rows.js +9 -0
- package/lib/commands/run.js +18 -1
- package/lib/commands/scope.js +2 -2
- package/lib/commands/server.js +113 -0
- package/lib/commands/shortcut.js +41 -0
- package/lib/commands/skills.js +20 -4
- package/lib/commands/vm.js +2 -2
- package/lib/commands/youtube.js +172 -0
- package/lib/core/actionItems.js +115 -0
- package/lib/core/agentAlias.js +2 -0
- package/lib/core/agentFamilies.js +7 -0
- package/lib/core/client.js +10 -2
- package/lib/core/commandRegistrars.js +9 -0
- package/lib/core/config.js +1 -1
- package/lib/core/findingReconcile.js +90 -0
- package/lib/core/global-flags.js +1 -1
- package/lib/core/governedSession.js +1 -3
- package/lib/core/liveSessionsReport.js +1 -1
- package/lib/core/loopGlyph.js +97 -0
- package/lib/core/offload.js +36 -7
- package/lib/core/output.js +7 -7
- package/lib/core/sessionHeartbeat.js +12 -8
- package/lib/core/shortcut.js +83 -0
- package/lib/core/version.js +1 -1
- package/lib/core/vm.js +5 -0
- package/lib/dragon/companionView.js +34 -0
- package/lib/dragon/frames.js +118 -0
- package/lib/dragon/jobs.js +123 -0
- package/lib/dragon/renderWorker.js +15 -0
- package/lib/dragon/select.js +72 -0
- package/lib/evidence/bundleExport.js +47 -0
- package/lib/evidence/bundleVerify.js +77 -0
- package/lib/quoxon/EXTENSIONS.md +23 -0
- package/lib/quoxon/api.js +192 -6
- package/lib/quoxon/app.js +655 -89
- package/lib/quoxon/approvalFacts.js +8 -6
- package/lib/quoxon/approvalSentence.js +44 -0
- package/lib/quoxon/approvalsView.js +63 -4
- package/lib/quoxon/commandShort.js +15 -3
- package/lib/quoxon/commands.js +75 -10
- package/lib/quoxon/countdownLine.js +10 -1
- package/lib/quoxon/deck.js +30 -0
- package/lib/quoxon/demo.autoplay.js +1 -1
- package/lib/quoxon/demo.js +3 -1
- package/lib/quoxon/dividerAocl.js +4 -3
- package/lib/quoxon/dividerRule.js +3 -3
- package/lib/quoxon/dragonCompanion.js +255 -0
- package/lib/quoxon/dragonModes.js +1 -0
- package/lib/quoxon/dragonMoments.js +82 -0
- package/lib/quoxon/dragonReads.js +68 -0
- package/lib/quoxon/dragonView.js +2 -2
- package/lib/quoxon/events.js +24 -3
- package/lib/quoxon/extensions.js +276 -0
- package/lib/quoxon/inboxView.js +79 -0
- package/lib/quoxon/installCli.js +79 -0
- package/lib/quoxon/keys.js +2 -2
- package/lib/quoxon/loopCard.js +456 -0
- package/lib/quoxon/loopCards.js +180 -0
- package/lib/quoxon/loopStream.js +87 -0
- package/lib/quoxon/main.js +12 -3
- package/lib/quoxon/mouse.js +12 -1
- package/lib/quoxon/objectiveOffer.js +82 -0
- package/lib/quoxon/objects/index.js +22 -4
- package/lib/quoxon/objects/model.js +33 -0
- package/lib/quoxon/objects/proof.js +12 -4
- package/lib/quoxon/onboarding/shortcutOffer.js +28 -0
- package/lib/quoxon/onboarding/view.js +1 -1
- package/lib/quoxon/orgSwitch.js +27 -1
- package/lib/quoxon/planSteps.js +51 -0
- package/lib/quoxon/print.js +6 -3
- package/lib/quoxon/qdragonFly.js +7 -6
- package/lib/quoxon/qmotion.js +17 -0
- package/lib/quoxon/render.js +130 -33
- package/lib/quoxon/roster.js +26 -12
- package/lib/quoxon/rows.js +244 -1
- package/lib/quoxon/serverChip.js +42 -0
- package/lib/quoxon/session.js +10 -0
- package/lib/quoxon/slash/cliCommand.js +42 -1
- package/lib/quoxon/slash/cliLeaves.json +76 -1
- package/lib/quoxon/slash/evidenceCmd.js +34 -0
- package/lib/quoxon/slash/palette.js +1 -1
- package/lib/quoxon/slash/qpeCmd.js +35 -0
- package/lib/quoxon/slash/restart.js +25 -1
- package/lib/quoxon/slash/resume.js +18 -1
- package/lib/quoxon/slash/todoCmd.js +122 -0
- package/lib/quoxon/suggestCommand.js +33 -2
- package/lib/quoxon/toolCards.js +30 -0
- package/lib/quoxon/whatsnew.jsonl +45 -0
- package/lib/quoxon/windowOrg.js +11 -1
- package/lib/server/devServers.js +137 -0
- package/package.json +2 -1
- package/vendor/dragonlab/SOURCE +4 -0
- package/vendor/dragonlab/design/cipher/v1/cipher-master.svg +46 -0
- package/vendor/dragonlab/design/cipher/v2/character.mjs +49 -0
- package/vendor/dragonlab/design/cipher/v2/review.mjs +33 -0
- package/vendor/dragonlab/design/cipher/v2/watch.mjs +56 -0
- package/vendor/dragonlab/design/drago/v1/character.mjs +19 -0
- package/vendor/dragonlab/design/drago/v1/drago-master.svg +56 -0
- package/vendor/dragonlab/design/drago/v2/character.mjs +87 -0
- package/vendor/dragonlab/design/drago/v4/character.mjs +67 -0
- package/vendor/dragonlab/design/drago/v4/profile.mjs +35 -0
- package/vendor/dragonlab/design/drago/v4/review.mjs +33 -0
- package/vendor/dragonlab/design/drago/v4/watch.mjs +56 -0
- package/vendor/dragonlab/design/hyperion/v1/hyperion-master.svg +56 -0
- package/vendor/dragonlab/design/hyperion/v2/character.mjs +79 -0
- package/vendor/dragonlab/design/hyperion/v2/review.mjs +33 -0
- package/vendor/dragonlab/design/hyperion/v2/watch.mjs +56 -0
- package/vendor/dragonlab/design/lucid/recovery/arrival.mjs +22 -0
- package/vendor/dragonlab/design/lucid/recovery/character.mjs +106 -0
- package/vendor/dragonlab/design/lucid/recovery/layout.mjs +50 -0
- package/vendor/dragonlab/design/lucid/recovery/lucid-master.svg +78 -0
- package/vendor/dragonlab/design/lucid/recovery/motion.mjs +42 -0
- package/vendor/dragonlab/design/lucid/recovery/render.mjs +121 -0
- package/vendor/dragonlab/design/lucid/recovery/review.mjs +68 -0
- package/vendor/dragonlab/design/lucid/recovery/verify.mjs +84 -0
- package/vendor/dragonlab/design/lucid/recovery/watch.mjs +56 -0
- package/vendor/dragonlab/design/seer/v1/seer-master.svg +53 -0
- package/vendor/dragonlab/design/seer/v2/character.mjs +88 -0
- package/vendor/dragonlab/design/seer/v3/character.mjs +33 -0
- package/vendor/dragonlab/design/seer/v4/character.mjs +66 -0
- package/vendor/dragonlab/design/seer/v4/review.mjs +33 -0
- package/vendor/dragonlab/design/seer/v4/watch.mjs +56 -0
- package/vendor/dragonlab/design/stage3/companion-review.mjs +28 -0
- package/vendor/dragonlab/design/stage3/sentinel-art.js +39 -0
- package/vendor/dragonlab/design/stage3/sentinel-braille.js +216 -0
- package/vendor/dragonlab/design/stage3/sentinel-character.js +257 -0
- package/vendor/dragonlab/design/stage3/sentinel-icon.js +103 -0
- package/vendor/dragonlab/design/stage3/sentinel-warden-eyes.js +95 -0
- package/vendor/dragonlab/design/stage3/svg-coverage.js +148 -0
- package/vendor/dragonlab/factory/svg-rig.mjs +63 -0
- package/vendor/dragonlab/integration/companions-v1/characters.mjs +88 -0
- package/vendor/dragonlab/integration/companions-v1/cipher.mjs +2 -0
- package/vendor/dragonlab/integration/companions-v1/companion.mjs +63 -0
- package/vendor/dragonlab/integration/companions-v1/drago.mjs +2 -0
- package/vendor/dragonlab/integration/companions-v1/hyperion.mjs +2 -0
- package/vendor/dragonlab/integration/companions-v1/lucid.mjs +2 -0
- package/vendor/dragonlab/integration/companions-v1/seer.mjs +2 -0
- package/vendor/dragonlab/integration/companions-v1/sentinel.mjs +2 -0
- package/vendor/dragonlab/integration/companions-v1/view.mjs +28 -0
- package/vendor/dragonlab/integration/hyperion-v3/activity.mjs +76 -0
- package/vendor/dragonlab/lib/power-effects.js +294 -0
- package/vendor/dragonlab/lib/power-registry.js +74 -0
- package/vendor/dragonlab/vendor/quox-dragon/qart.js +348 -0
- package/vendor/dragonlab/vendor/quox-dragon/qeyes.js +213 -0
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* 'actions.*' endpoints — Action Tracker items through the collector proxy
|
|
3
|
+
* (services/collector/server.js /api/v1/actions*, which forwards to the auth
|
|
4
|
+
* service's org-scoped actions routes with the caller's own bearer token).
|
|
5
|
+
* No org segment in the URL: the collector takes the org from the verified JWT.
|
|
6
|
+
*
|
|
7
|
+
* See cli/lib/api/endpoints/index.js for the fragment convention.
|
|
8
|
+
*/
|
|
9
|
+
|
|
10
|
+
export const actions = {
|
|
11
|
+
'actions.list': { method: 'GET', service: 'collector', path: () => '/api/v1/actions', tags: ['live-safe'] },
|
|
12
|
+
'actions.create': { method: 'POST', service: 'collector', path: () => '/api/v1/actions', tags: ['live-write'] },
|
|
13
|
+
'actions.update': { method: 'PATCH', service: 'collector', path: ({ id }) => `/api/v1/actions/${id}`, tags: ['live-write'] },
|
|
14
|
+
'actions.delete': { method: 'DELETE', service: 'collector', path: ({ id }) => `/api/v1/actions/${id}`, tags: ['live-write'] },
|
|
15
|
+
};
|
|
@@ -43,6 +43,26 @@ export const admin = {
|
|
|
43
43
|
path: () => '/api/admin/instance/lan-targets',
|
|
44
44
|
tags: ['admin-write'],
|
|
45
45
|
},
|
|
46
|
+
// SECURITY containment (2026-10-26): orgs allowed to run QLoop loops in-server (core-local). Served by
|
|
47
|
+
// services/auth/routes/admin-instance.js; writes are instance-admin only.
|
|
48
|
+
'admin.instance.core_local_orgs.list': {
|
|
49
|
+
method: 'GET',
|
|
50
|
+
service: 'auth',
|
|
51
|
+
path: () => '/api/admin/instance/core-local-orgs',
|
|
52
|
+
tags: ['live-safe'],
|
|
53
|
+
},
|
|
54
|
+
'admin.instance.core_local_orgs.add': {
|
|
55
|
+
method: 'POST',
|
|
56
|
+
service: 'auth',
|
|
57
|
+
path: () => '/api/admin/instance/core-local-orgs',
|
|
58
|
+
tags: ['admin-write'],
|
|
59
|
+
},
|
|
60
|
+
'admin.instance.core_local_orgs.remove': {
|
|
61
|
+
method: 'DELETE',
|
|
62
|
+
service: 'auth',
|
|
63
|
+
path: ({ orgId }) => `/api/admin/instance/core-local-orgs/${orgId}`,
|
|
64
|
+
tags: ['admin-write'],
|
|
65
|
+
},
|
|
46
66
|
'admin.config.update': {
|
|
47
67
|
method: 'PATCH',
|
|
48
68
|
service: 'auth',
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* 'blog.*' endpoints: BLOG-DRAFT. Blog drafts are NotesQ notes in the blog-drafts collection,
|
|
3
|
+
* submitted and handed to the blog publisher through the collector
|
|
4
|
+
* (services/collector/lib/blogDraftRoutes.js). Nothing here publishes.
|
|
5
|
+
*
|
|
6
|
+
* See cli/lib/api/endpoints/index.js for the fragment convention.
|
|
7
|
+
*/
|
|
8
|
+
|
|
9
|
+
const B = '/api/v1/blog/drafts';
|
|
10
|
+
|
|
11
|
+
export const blog = {
|
|
12
|
+
'blog.drafts.submit': { method: 'POST', service: 'collector', path: () => B, tags: ['live-write'] },
|
|
13
|
+
'blog.drafts.list': { method: 'GET', service: 'collector', path: () => B, tags: ['live-safe'] },
|
|
14
|
+
'blog.drafts.get': { method: 'GET', service: 'collector', path: ({ id }) => `${B}/${id}`, tags: ['live-safe'] },
|
|
15
|
+
'blog.drafts.published': { method: 'POST', service: 'collector', path: ({ id }) => `${B}/${id}/published`, tags: ['live-write'] },
|
|
16
|
+
};
|
|
@@ -11,6 +11,13 @@ export const chat = {
|
|
|
11
11
|
path: () => `/chat/claude`,
|
|
12
12
|
tags: ['live-write'],
|
|
13
13
|
},
|
|
14
|
+
// CHAT-TIMEOUTS: poll an async chat turn (POST /chat/claude with Prefer: respond-async) by id.
|
|
15
|
+
'chat.turn.get': {
|
|
16
|
+
method: 'GET',
|
|
17
|
+
service: 'collector',
|
|
18
|
+
path: ({ id }) => `/chat/turns/${encodeURIComponent(id)}`,
|
|
19
|
+
tags: ['live-safe'],
|
|
20
|
+
},
|
|
14
21
|
'chat.status.list': {
|
|
15
22
|
method: 'GET',
|
|
16
23
|
service: 'collector',
|
|
@@ -64,5 +64,9 @@ export const contactsq = {
|
|
|
64
64
|
'contactsq.policy': { method: 'POST', service: 'collector', path: ({ id }) => `${B}/contacts/${id}/policy`, tags: ['live-safe'] },
|
|
65
65
|
'contactsq.handoffs.add': { method: 'POST', service: 'collector', path: ({ id }) => `${B}/contacts/${id}/handoffs` },
|
|
66
66
|
'contactsq.handoffs': { method: 'GET', service: 'collector', path: ({ id }) => `${B}/contacts/${id}/handoffs`, tags: ['live-safe'] },
|
|
67
|
+
// Scheduled sends: a human send (now or --at), the pending queue, cancel.
|
|
68
|
+
'contactsq.sends.create': { method: 'POST', service: 'collector', path: () => `${B}/sends`, tags: ['live-write'] },
|
|
69
|
+
'contactsq.sends.scheduled': { method: 'GET', service: 'collector', path: () => `${B}/sends/scheduled`, tags: ['live-safe'] },
|
|
70
|
+
'contactsq.sends.cancel': { method: 'POST', service: 'collector', path: ({ id }) => `${B}/sends/scheduled/${id}/cancel`, tags: ['live-write'] },
|
|
67
71
|
'contactsq.settings.update': { method: 'PUT', service: 'collector', path: () => `${B}/settings`, tags: ['live-write'] },
|
|
68
72
|
};
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* 'devServerRegistry.*' endpoints: the org-scoped dev-server registry behind `quox server list|mark|go`
|
|
3
|
+
* and the TUI server chip (DEVFLEET). Collector-owned (services/collector/lib/devServerRegistryRoutes.js).
|
|
4
|
+
*
|
|
5
|
+
* See cli/lib/api/endpoints/index.js for the fragment convention.
|
|
6
|
+
*/
|
|
7
|
+
|
|
8
|
+
export const devServerRegistry = {
|
|
9
|
+
'devServerRegistry.list': {
|
|
10
|
+
method: 'GET',
|
|
11
|
+
service: 'collector',
|
|
12
|
+
path: () => `/api/v1/dev-server-registry`,
|
|
13
|
+
tags: ['live-safe'],
|
|
14
|
+
},
|
|
15
|
+
'devServerRegistry.put': {
|
|
16
|
+
method: 'PUT',
|
|
17
|
+
service: 'collector',
|
|
18
|
+
path: ({ name }) => `/api/v1/dev-server-registry/${encodeURIComponent(name)}`,
|
|
19
|
+
},
|
|
20
|
+
'devServerRegistry.remove': {
|
|
21
|
+
method: 'DELETE',
|
|
22
|
+
service: 'collector',
|
|
23
|
+
path: ({ name }) => `/api/v1/dev-server-registry/${encodeURIComponent(name)}`,
|
|
24
|
+
},
|
|
25
|
+
};
|
|
@@ -36,6 +36,12 @@ export const engagement = {
|
|
|
36
36
|
path: ({ id }) => `/api/v1/security/engagements/${id}`,
|
|
37
37
|
tags: ['live-safe'],
|
|
38
38
|
},
|
|
39
|
+
'engagement.verify': {
|
|
40
|
+
method: 'GET',
|
|
41
|
+
service: 'collector',
|
|
42
|
+
path: ({ id }) => `/api/v1/security/engagements/${id}/verify`,
|
|
43
|
+
tags: ['live-safe'],
|
|
44
|
+
},
|
|
39
45
|
// Per-engagement gripe target: which repo a finding filed from this
|
|
40
46
|
// engagement goes to, and which org's GitHub connector token files it.
|
|
41
47
|
// lib/securityEngagement.js's setEngagementGripeTarget.
|
|
@@ -141,6 +147,26 @@ export const engagement = {
|
|
|
141
147
|
path: ({ findingId }) => `/api/v1/security/findings/${findingId}/resolve`,
|
|
142
148
|
tags: ['live-write'],
|
|
143
149
|
},
|
|
150
|
+
// SITREP-FINDINGS: reconcile a finding against gathered evidence (issue state, fix commit
|
|
151
|
+
// landed or deployed). The collector decides; lib/securityFindings.js reconcileFinding.
|
|
152
|
+
'engagement.findings.reconcile': {
|
|
153
|
+
method: 'POST',
|
|
154
|
+
service: 'collector',
|
|
155
|
+
path: ({ findingId }) => `/api/v1/security/findings/${findingId}/reconcile`,
|
|
156
|
+
tags: ['live-write'],
|
|
157
|
+
},
|
|
158
|
+
'engagement.findings.reconciliations': {
|
|
159
|
+
method: 'GET',
|
|
160
|
+
service: 'collector',
|
|
161
|
+
path: ({ findingId }) => `/api/v1/security/findings/${findingId}/reconciliations`,
|
|
162
|
+
tags: ['live-safe'],
|
|
163
|
+
},
|
|
164
|
+
'engagement.findings.open': {
|
|
165
|
+
method: 'GET',
|
|
166
|
+
service: 'collector',
|
|
167
|
+
path: () => '/api/v1/security/findings/open',
|
|
168
|
+
tags: ['live-safe'],
|
|
169
|
+
},
|
|
144
170
|
// Re-grade a finding's severity after it was reported (quox#601). Governed +
|
|
145
171
|
// witnessed; a reason is required. lib/securityFindings.js regradeFinding.
|
|
146
172
|
'engagement.findings.regrade': {
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* 'evidence.*' endpoints (DEVFLEET EV-1): read-only status of the evidence stores.
|
|
3
|
+
* Collector route, instance admin only (enforced server-side).
|
|
4
|
+
*/
|
|
5
|
+
|
|
6
|
+
export const evidence = {
|
|
7
|
+
'evidence.status': {
|
|
8
|
+
method: 'GET',
|
|
9
|
+
service: 'collector',
|
|
10
|
+
path: () => `/api/v1/admin/evidence/status`,
|
|
11
|
+
tags: ['live-safe'],
|
|
12
|
+
},
|
|
13
|
+
// The signed zip for one conversation (collector GET /aee/conversation/:corr/bundle?format=zip), org-scoped server-side.
|
|
14
|
+
'evidence.bundle': {
|
|
15
|
+
method: 'GET',
|
|
16
|
+
service: 'collector',
|
|
17
|
+
path: ({ corr }) => `/aee/conversation/${encodeURIComponent(corr)}/bundle`,
|
|
18
|
+
tags: ['live-safe'],
|
|
19
|
+
},
|
|
20
|
+
};
|
package/lib/api/endpoints/hat.js
CHANGED
|
@@ -63,4 +63,18 @@ export const hat = {
|
|
|
63
63
|
service: 'auth',
|
|
64
64
|
path: ({ orgId, hatId }) => `/api/orgs/${orgId}/quoxhat/hats/${encodeURIComponent(hatId)}/reset-to-template`,
|
|
65
65
|
},
|
|
66
|
+
// Merge-upgrade (2026-10-19): 3-way merge of an org-edited built-in onto the current
|
|
67
|
+
// template. Preview is a dry run (writes nothing); upgrade appends one system-authored
|
|
68
|
+
// revision (audited quoxhat.hat.template_merged) and refuses a stale preview (409).
|
|
69
|
+
'hat.upgrade.preview': {
|
|
70
|
+
method: 'GET',
|
|
71
|
+
service: 'auth',
|
|
72
|
+
path: ({ orgId, hatId }) => `/api/orgs/${orgId}/quoxhat/hats/${encodeURIComponent(hatId)}/upgrade-preview`,
|
|
73
|
+
tags: ['live-safe'],
|
|
74
|
+
},
|
|
75
|
+
'hat.upgrade': {
|
|
76
|
+
method: 'POST',
|
|
77
|
+
service: 'auth',
|
|
78
|
+
path: ({ orgId, hatId }) => `/api/orgs/${orgId}/quoxhat/hats/${encodeURIComponent(hatId)}/upgrade`,
|
|
79
|
+
},
|
|
66
80
|
};
|
|
@@ -50,6 +50,7 @@
|
|
|
50
50
|
* of silently landing in the wrong file.
|
|
51
51
|
*/
|
|
52
52
|
|
|
53
|
+
import { actions } from './actions.js';
|
|
53
54
|
import { admin } from './admin.js';
|
|
54
55
|
import { aee } from './aee.js';
|
|
55
56
|
import { agentAttach } from './agent-attach.js';
|
|
@@ -61,6 +62,7 @@ import { awareness } from './awareness.js';
|
|
|
61
62
|
import { router } from './router.js';
|
|
62
63
|
import { mind } from './mind.js';
|
|
63
64
|
import { lucid } from './lucid.js';
|
|
65
|
+
import { loops } from './loops.js';
|
|
64
66
|
import { away } from './away.js';
|
|
65
67
|
import { presence } from './presence.js';
|
|
66
68
|
import { invites } from './invites.js';
|
|
@@ -83,10 +85,12 @@ import { engine } from './engine.js';
|
|
|
83
85
|
import { executions } from './executions.js';
|
|
84
86
|
import { file } from './file.js';
|
|
85
87
|
import { files } from './files.js';
|
|
88
|
+
import { evidence } from './evidence.js';
|
|
86
89
|
import { governance } from './governance.js';
|
|
87
90
|
import { inbox } from './inbox.js';
|
|
88
91
|
import { inboxq } from './inboxq.js';
|
|
89
92
|
import { notesq } from './notesq.js';
|
|
93
|
+
import { blog } from './blog.js';
|
|
90
94
|
import { contactsq } from './contactsq.js';
|
|
91
95
|
import { x } from './x.js';
|
|
92
96
|
import { llmPolicy } from './llm-policy.js';
|
|
@@ -106,6 +110,7 @@ import { quoxflow } from './quoxflow.js';
|
|
|
106
110
|
import { quoxplan } from './quoxplan.js';
|
|
107
111
|
import { qlarity } from './qlarity.js';
|
|
108
112
|
import { fetchAllowlist } from './fetchAllowlist.js';
|
|
113
|
+
import { devServerRegistry } from './devServerRegistry.js';
|
|
109
114
|
import { quoxseo } from './quoxseo.js';
|
|
110
115
|
import { telephony } from './telephony.js';
|
|
111
116
|
import { voice } from './voice.js';
|
|
@@ -115,6 +120,7 @@ import { runs } from './runs.js';
|
|
|
115
120
|
import { scim } from './scim.js';
|
|
116
121
|
import { scopes } from './scopes.js';
|
|
117
122
|
import { security } from './security.js';
|
|
123
|
+
import { server } from './server.js';
|
|
118
124
|
import { setup } from './setup.js';
|
|
119
125
|
import { skills } from './skills.js';
|
|
120
126
|
import { sso } from './sso.js';
|
|
@@ -136,6 +142,7 @@ import { webhooks } from './webhooks.js';
|
|
|
136
142
|
import { workflows } from './workflows.js';
|
|
137
143
|
|
|
138
144
|
export const ENDPOINTS = {
|
|
145
|
+
...actions,
|
|
139
146
|
...admin,
|
|
140
147
|
...aee,
|
|
141
148
|
...agentAttach,
|
|
@@ -147,6 +154,7 @@ export const ENDPOINTS = {
|
|
|
147
154
|
...router,
|
|
148
155
|
...mind,
|
|
149
156
|
...lucid,
|
|
157
|
+
...loops,
|
|
150
158
|
...away,
|
|
151
159
|
...presence,
|
|
152
160
|
...invites,
|
|
@@ -169,10 +177,12 @@ export const ENDPOINTS = {
|
|
|
169
177
|
...executions,
|
|
170
178
|
...file,
|
|
171
179
|
...files,
|
|
180
|
+
...evidence,
|
|
172
181
|
...governance,
|
|
173
182
|
...inbox,
|
|
174
183
|
...inboxq,
|
|
175
184
|
...notesq,
|
|
185
|
+
...blog,
|
|
176
186
|
...contactsq,
|
|
177
187
|
...x,
|
|
178
188
|
...llmPolicy,
|
|
@@ -192,6 +202,7 @@ export const ENDPOINTS = {
|
|
|
192
202
|
...quoxplan,
|
|
193
203
|
...qlarity,
|
|
194
204
|
...fetchAllowlist,
|
|
205
|
+
...devServerRegistry,
|
|
195
206
|
...quoxseo,
|
|
196
207
|
...telephony,
|
|
197
208
|
...voice,
|
|
@@ -201,6 +212,7 @@ export const ENDPOINTS = {
|
|
|
201
212
|
...scim,
|
|
202
213
|
...scopes,
|
|
203
214
|
...security,
|
|
215
|
+
...server,
|
|
204
216
|
...setup,
|
|
205
217
|
...skills,
|
|
206
218
|
...sso,
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* 'loops.*' endpoints: QLOOP-LIVE, observe a loop as it runs.
|
|
3
|
+
* Served by the collector (/api/v1/loops/*), which forwards the caller's identity to the tasks
|
|
4
|
+
* service that owns the durable per-loop event log. Contract: ~/quoxon-work/qloop-live-design.md section 1.
|
|
5
|
+
*/
|
|
6
|
+
|
|
7
|
+
export const loops = {
|
|
8
|
+
'loops.list': {
|
|
9
|
+
method: 'GET',
|
|
10
|
+
service: 'collector',
|
|
11
|
+
path: () => `/api/v1/loops`,
|
|
12
|
+
tags: ['live-safe'],
|
|
13
|
+
},
|
|
14
|
+
'loops.get': {
|
|
15
|
+
method: 'GET',
|
|
16
|
+
service: 'collector',
|
|
17
|
+
path: ({ id }) => `/api/v1/loops/${id}`,
|
|
18
|
+
tags: ['live-safe'],
|
|
19
|
+
},
|
|
20
|
+
'loops.events': {
|
|
21
|
+
method: 'STREAM',
|
|
22
|
+
service: 'collector',
|
|
23
|
+
path: ({ id }) => `/api/v1/loops/${id}/events`,
|
|
24
|
+
tags: ['live-safe'],
|
|
25
|
+
},
|
|
26
|
+
};
|
package/lib/api/endpoints/mon.js
CHANGED
|
@@ -127,6 +127,179 @@ export const mon = {
|
|
|
127
127
|
path: () => `/docker/system-df`,
|
|
128
128
|
tags: ['live-safe'],
|
|
129
129
|
},
|
|
130
|
+
'mon.kuma.monitors.list': {
|
|
131
|
+
method: 'GET',
|
|
132
|
+
service: 'collector',
|
|
133
|
+
path: ({ id } = {}) => `/api/v1/kuma/monitors`,
|
|
134
|
+
tags: ['live-safe'],
|
|
135
|
+
},
|
|
136
|
+
'mon.kuma.monitors.get': {
|
|
137
|
+
method: 'GET',
|
|
138
|
+
service: 'collector',
|
|
139
|
+
path: ({ id } = {}) => `/api/v1/kuma/monitors/${encodeURIComponent(id)}`,
|
|
140
|
+
tags: ['live-safe'],
|
|
141
|
+
},
|
|
142
|
+
'mon.kuma.monitors.create': {
|
|
143
|
+
method: 'POST',
|
|
144
|
+
service: 'collector',
|
|
145
|
+
path: ({ id } = {}) => `/api/v1/kuma/monitors`,
|
|
146
|
+
tags: ['live-write'],
|
|
147
|
+
},
|
|
148
|
+
'mon.kuma.monitors.update': {
|
|
149
|
+
method: 'PATCH',
|
|
150
|
+
service: 'collector',
|
|
151
|
+
path: ({ id } = {}) => `/api/v1/kuma/monitors/${encodeURIComponent(id)}`,
|
|
152
|
+
tags: ['live-write'],
|
|
153
|
+
},
|
|
154
|
+
'mon.kuma.monitors.pause': {
|
|
155
|
+
method: 'POST',
|
|
156
|
+
service: 'collector',
|
|
157
|
+
path: ({ id } = {}) => `/api/v1/kuma/monitors/${encodeURIComponent(id)}/pause`,
|
|
158
|
+
tags: ['live-write'],
|
|
159
|
+
},
|
|
160
|
+
'mon.kuma.monitors.resume': {
|
|
161
|
+
method: 'POST',
|
|
162
|
+
service: 'collector',
|
|
163
|
+
path: ({ id } = {}) => `/api/v1/kuma/monitors/${encodeURIComponent(id)}/resume`,
|
|
164
|
+
tags: ['live-write'],
|
|
165
|
+
},
|
|
166
|
+
'mon.kuma.monitors.delete': {
|
|
167
|
+
method: 'DELETE',
|
|
168
|
+
service: 'collector',
|
|
169
|
+
path: ({ id } = {}) => `/api/v1/kuma/monitors/${encodeURIComponent(id)}`,
|
|
170
|
+
tags: ['live-write'],
|
|
171
|
+
},
|
|
172
|
+
'mon.kuma.incidents.list': {
|
|
173
|
+
method: 'GET',
|
|
174
|
+
service: 'collector',
|
|
175
|
+
path: ({ open, limit } = {}) => {
|
|
176
|
+
const q = [];
|
|
177
|
+
if (open) q.push('open=1');
|
|
178
|
+
if (limit) q.push(`limit=${encodeURIComponent(limit)}`);
|
|
179
|
+
return `/api/v1/kuma/incidents${q.length ? `?${q.join('&')}` : ''}`;
|
|
180
|
+
},
|
|
181
|
+
tags: ['live-safe'],
|
|
182
|
+
},
|
|
183
|
+
'mon.kuma.incidents.get': {
|
|
184
|
+
method: 'GET',
|
|
185
|
+
service: 'collector',
|
|
186
|
+
path: ({ id } = {}) => `/api/v1/kuma/incidents/${encodeURIComponent(id)}`,
|
|
187
|
+
tags: ['live-safe'],
|
|
188
|
+
},
|
|
189
|
+
'mon.kuma.coverage.get': {
|
|
190
|
+
method: 'GET',
|
|
191
|
+
service: 'collector',
|
|
192
|
+
path: () => `/api/v1/kuma/coverage`,
|
|
193
|
+
tags: ['live-safe'],
|
|
194
|
+
},
|
|
195
|
+
'mon.kuma.coverage.propose': {
|
|
196
|
+
method: 'POST',
|
|
197
|
+
service: 'collector',
|
|
198
|
+
path: () => `/api/v1/kuma/coverage/propose`,
|
|
199
|
+
tags: ['live-safe'],
|
|
200
|
+
},
|
|
201
|
+
'mon.kuma.maintenance.list': {
|
|
202
|
+
method: 'GET',
|
|
203
|
+
service: 'collector',
|
|
204
|
+
path: () => `/api/v1/kuma/maintenance`,
|
|
205
|
+
tags: ['live-safe'],
|
|
206
|
+
},
|
|
207
|
+
'mon.kuma.maintenance.open': {
|
|
208
|
+
method: 'POST',
|
|
209
|
+
service: 'collector',
|
|
210
|
+
path: () => `/api/v1/kuma/maintenance`,
|
|
211
|
+
tags: ['live-write'],
|
|
212
|
+
},
|
|
213
|
+
'mon.kuma.maintenance.end': {
|
|
214
|
+
method: 'POST',
|
|
215
|
+
service: 'collector',
|
|
216
|
+
path: ({ id } = {}) => `/api/v1/kuma/maintenance/${encodeURIComponent(id)}/end`,
|
|
217
|
+
tags: ['live-write'],
|
|
218
|
+
},
|
|
219
|
+
'mon.kuma.statusIncident.draft': {
|
|
220
|
+
method: 'GET',
|
|
221
|
+
service: 'collector',
|
|
222
|
+
path: ({ id } = {}) => `/api/v1/kuma/status-incidents/${encodeURIComponent(id)}/draft`,
|
|
223
|
+
tags: ['live-safe'],
|
|
224
|
+
},
|
|
225
|
+
'mon.kuma.statusIncident.publish': {
|
|
226
|
+
method: 'POST',
|
|
227
|
+
service: 'collector',
|
|
228
|
+
path: ({ id } = {}) => `/api/v1/kuma/status-incidents/${encodeURIComponent(id)}/publish`,
|
|
229
|
+
tags: ['live-write'],
|
|
230
|
+
},
|
|
231
|
+
'mon.kuma.statusIncident.resolve': {
|
|
232
|
+
method: 'POST',
|
|
233
|
+
service: 'collector',
|
|
234
|
+
path: () => `/api/v1/kuma/status-incidents/resolve`,
|
|
235
|
+
tags: ['live-write'],
|
|
236
|
+
},
|
|
237
|
+
'mon.kuma.diagnose.create': {
|
|
238
|
+
method: 'POST',
|
|
239
|
+
service: 'collector',
|
|
240
|
+
path: () => `/api/v1/kuma/diagnose`,
|
|
241
|
+
tags: ['live-safe'],
|
|
242
|
+
},
|
|
243
|
+
'mon.kuma.sla.create': {
|
|
244
|
+
method: 'POST',
|
|
245
|
+
service: 'collector',
|
|
246
|
+
path: () => `/api/v1/kuma/sla`,
|
|
247
|
+
tags: ['live-safe'],
|
|
248
|
+
},
|
|
249
|
+
'mon.kuma.sla.list': {
|
|
250
|
+
method: 'GET',
|
|
251
|
+
service: 'collector',
|
|
252
|
+
path: () => `/api/v1/kuma/sla`,
|
|
253
|
+
tags: ['live-safe'],
|
|
254
|
+
},
|
|
255
|
+
'mon.kuma.sla.get': {
|
|
256
|
+
method: 'GET',
|
|
257
|
+
service: 'collector',
|
|
258
|
+
path: ({ id } = {}) => `/api/v1/kuma/sla/${encodeURIComponent(id)}`,
|
|
259
|
+
tags: ['live-safe'],
|
|
260
|
+
},
|
|
261
|
+
'mon.kuma.sla.verify': {
|
|
262
|
+
method: 'GET',
|
|
263
|
+
service: 'collector',
|
|
264
|
+
path: ({ id } = {}) => `/api/v1/kuma/sla/${encodeURIComponent(id)}/verify`,
|
|
265
|
+
tags: ['live-safe'],
|
|
266
|
+
},
|
|
267
|
+
'mon.kuma.hooks.list': {
|
|
268
|
+
method: 'GET',
|
|
269
|
+
service: 'collector',
|
|
270
|
+
path: () => `/api/v1/kuma/hooks`,
|
|
271
|
+
tags: ['live-safe'],
|
|
272
|
+
},
|
|
273
|
+
'mon.kuma.hooks.create': {
|
|
274
|
+
method: 'POST',
|
|
275
|
+
service: 'collector',
|
|
276
|
+
path: () => `/api/v1/kuma/hooks`,
|
|
277
|
+
tags: ['live-write'],
|
|
278
|
+
},
|
|
279
|
+
'mon.kuma.hooks.delete': {
|
|
280
|
+
method: 'DELETE',
|
|
281
|
+
service: 'collector',
|
|
282
|
+
path: ({ id } = {}) => `/api/v1/kuma/hooks/${encodeURIComponent(id)}`,
|
|
283
|
+
tags: ['live-write'],
|
|
284
|
+
},
|
|
285
|
+
'mon.kuma.refresh.create': {
|
|
286
|
+
method: 'POST',
|
|
287
|
+
service: 'collector',
|
|
288
|
+
path: () => `/api/v1/monitoring/uptime-kuma/refresh`,
|
|
289
|
+
tags: ['live-write'],
|
|
290
|
+
},
|
|
291
|
+
'mon.kuma.live.get': {
|
|
292
|
+
method: 'GET',
|
|
293
|
+
service: 'collector',
|
|
294
|
+
path: ({ fresh } = {}) => `/api/v1/kuma/status${fresh ? '?fresh=1' : ''}`,
|
|
295
|
+
tags: ['live-safe'],
|
|
296
|
+
},
|
|
297
|
+
'mon.kuma.status.get': {
|
|
298
|
+
method: 'GET',
|
|
299
|
+
service: 'collector',
|
|
300
|
+
path: ({ slug }) => `/api/v1/monitoring/uptime-kuma/status/${encodeURIComponent(slug)}`,
|
|
301
|
+
tags: ['live-safe'],
|
|
302
|
+
},
|
|
130
303
|
'mon.metrics.get': {
|
|
131
304
|
method: 'GET',
|
|
132
305
|
service: 'collector',
|
|
@@ -11,6 +11,12 @@ export const objectives = {
|
|
|
11
11
|
path: ({ id }) => `/api/objectives/${id}/approve-plan`,
|
|
12
12
|
tags: ['live-write'],
|
|
13
13
|
},
|
|
14
|
+
'objectives.retry': {
|
|
15
|
+
method: 'POST',
|
|
16
|
+
service: 'tasks',
|
|
17
|
+
path: ({ id }) => `/api/objectives/${id}/retry`,
|
|
18
|
+
tags: ['live-write'],
|
|
19
|
+
},
|
|
14
20
|
'objectives.cancel': {
|
|
15
21
|
method: 'DELETE',
|
|
16
22
|
service: 'tasks',
|
|
@@ -59,6 +59,12 @@ export const quoxseo = {
|
|
|
59
59
|
path: ({ query = '' }) => `/api/v1/quoxseo/trends${query}`,
|
|
60
60
|
tags: ['live-safe'],
|
|
61
61
|
},
|
|
62
|
+
'quoxseo.queries.rows': {
|
|
63
|
+
method: 'GET',
|
|
64
|
+
service: 'collector',
|
|
65
|
+
path: ({ query = '' }) => `/api/v1/quoxseo/queries/rows${query}`,
|
|
66
|
+
tags: ['live-safe'],
|
|
67
|
+
},
|
|
62
68
|
'quoxseo.inspection': {
|
|
63
69
|
method: 'GET',
|
|
64
70
|
service: 'collector',
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* 'server.*' endpoints: moved out of admin.js so each key carries its fragment's own domain prefix.
|
|
3
|
+
* See cli/lib/api/endpoints/index.js for aggregation + the fragment convention.
|
|
4
|
+
*/
|
|
5
|
+
|
|
6
|
+
export const server = {
|
|
7
|
+
// DEVFLEET CX-2: server roles registry (role -> url, read before env by resolveServiceUrl). Collector routes;
|
|
8
|
+
// list is instance-admin readable, set/unset/test are instance-OWNER only (see services/collector/server.js).
|
|
9
|
+
'server.roles.list': {
|
|
10
|
+
method: 'GET', service: 'collector', path: () => '/api/v1/server/roles', tags: ['live-safe'],
|
|
11
|
+
},
|
|
12
|
+
'server.roles.set': {
|
|
13
|
+
method: 'PUT', service: 'collector', path: ({ role }) => `/api/v1/server/roles/${encodeURIComponent(role)}`, tags: ['admin-write'],
|
|
14
|
+
},
|
|
15
|
+
'server.roles.unset': {
|
|
16
|
+
method: 'DELETE', service: 'collector', path: ({ role }) => `/api/v1/server/roles/${encodeURIComponent(role)}`, tags: ['admin-write'],
|
|
17
|
+
},
|
|
18
|
+
'server.roles.test': {
|
|
19
|
+
method: 'POST', service: 'collector', path: ({ role }) => `/api/v1/server/roles/${encodeURIComponent(role)}/test`, tags: ['admin-write'],
|
|
20
|
+
},
|
|
21
|
+
};
|
|
@@ -81,6 +81,12 @@ export const setup = {
|
|
|
81
81
|
path: ({ pluginId }) => `/api/setup/licensing/seats/${encodeURIComponent(pluginId)}/release-dead`,
|
|
82
82
|
tags: ['live-write'],
|
|
83
83
|
},
|
|
84
|
+
'setup.licensing.seats.release': {
|
|
85
|
+
method: 'POST',
|
|
86
|
+
service: 'auth',
|
|
87
|
+
path: ({ pluginId }) => `/api/setup/licensing/seats/${encodeURIComponent(pluginId)}/release`,
|
|
88
|
+
tags: ['live-write'],
|
|
89
|
+
},
|
|
84
90
|
'setup.status.list': {
|
|
85
91
|
method: 'GET',
|
|
86
92
|
service: 'auth',
|
package/lib/api/endpoints/v1.js
CHANGED
|
@@ -59,6 +59,14 @@ export const v1 = {
|
|
|
59
59
|
path: () => `/api/v1/fleet/hosts`,
|
|
60
60
|
tags: ['live-safe'],
|
|
61
61
|
},
|
|
62
|
+
// quoxbastion#34 — `quox fleet ping [host]`: governed Bastion host-state
|
|
63
|
+
// refresh (org admin; emits a quox.fleet.ping evidence envelope).
|
|
64
|
+
'v1.fleet.ping': {
|
|
65
|
+
method: 'POST',
|
|
66
|
+
service: 'collector',
|
|
67
|
+
path: () => `/api/v1/fleet/ping`,
|
|
68
|
+
tags: ['admin-write'],
|
|
69
|
+
},
|
|
62
70
|
// DEVSUITE-HUB Phase 2 — `quox dev enable` (see lib/commands/dev.js).
|
|
63
71
|
// Constructs + signs + delivers a quoxagent dev.CapabilityProfile onto a
|
|
64
72
|
// target host via Bastion. See services/collector/server.js's
|
|
@@ -290,6 +298,32 @@ export const v1 = {
|
|
|
290
298
|
path: () => `/api/v1/policies/validate`,
|
|
291
299
|
tags: ['live-write'],
|
|
292
300
|
},
|
|
301
|
+
// LAZY-AI-CLI: vendor CLIs (Claude Code, Codex) the user's own server installs from npm. Status is any
|
|
302
|
+
// signed-in caller; plan + install need a human instance admin (the binary is instance-wide).
|
|
303
|
+
'v1.providers.cli.status': {
|
|
304
|
+
method: 'GET',
|
|
305
|
+
service: 'collector',
|
|
306
|
+
path: () => `/api/v1/providers/cli`,
|
|
307
|
+
tags: ['live-safe'],
|
|
308
|
+
},
|
|
309
|
+
'v1.providers.cli.plan': {
|
|
310
|
+
method: 'GET',
|
|
311
|
+
service: 'collector',
|
|
312
|
+
path: ({ tool }) => `/api/v1/providers/cli/${encodeURIComponent(tool)}/plan`,
|
|
313
|
+
tags: ['live-safe'],
|
|
314
|
+
},
|
|
315
|
+
'v1.providers.cli.install': {
|
|
316
|
+
method: 'POST',
|
|
317
|
+
service: 'collector',
|
|
318
|
+
path: ({ tool }) => `/api/v1/providers/cli/${encodeURIComponent(tool)}/install`,
|
|
319
|
+
tags: ['live-write'],
|
|
320
|
+
},
|
|
321
|
+
'v1.providers.cli.job': {
|
|
322
|
+
method: 'GET',
|
|
323
|
+
service: 'collector',
|
|
324
|
+
path: ({ id }) => `/api/v1/providers/cli/jobs/${encodeURIComponent(id)}`,
|
|
325
|
+
tags: ['live-safe'],
|
|
326
|
+
},
|
|
293
327
|
'v1.tools.execute': {
|
|
294
328
|
method: 'POST',
|
|
295
329
|
service: 'collector',
|