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.
Files changed (188) hide show
  1. package/lib/api/endpoints/actions.js +15 -0
  2. package/lib/api/endpoints/admin.js +20 -0
  3. package/lib/api/endpoints/blog.js +16 -0
  4. package/lib/api/endpoints/chat.js +7 -0
  5. package/lib/api/endpoints/contactsq.js +4 -0
  6. package/lib/api/endpoints/devServerRegistry.js +25 -0
  7. package/lib/api/endpoints/engagement.js +26 -0
  8. package/lib/api/endpoints/evidence.js +20 -0
  9. package/lib/api/endpoints/hat.js +14 -0
  10. package/lib/api/endpoints/index.js +12 -0
  11. package/lib/api/endpoints/loops.js +26 -0
  12. package/lib/api/endpoints/mon.js +173 -0
  13. package/lib/api/endpoints/objectives.js +6 -0
  14. package/lib/api/endpoints/quoxseo.js +6 -0
  15. package/lib/api/endpoints/server.js +21 -0
  16. package/lib/api/endpoints/setup.js +6 -0
  17. package/lib/api/endpoints/v1.js +34 -0
  18. package/lib/commands/actions.js +81 -11
  19. package/lib/commands/agent.js +11 -4
  20. package/lib/commands/agentAttach.js +46 -7
  21. package/lib/commands/approvals.js +5 -0
  22. package/lib/commands/ask.js +3 -1
  23. package/lib/commands/blog.js +110 -0
  24. package/lib/commands/chat.js +127 -28
  25. package/lib/commands/chatCompanion.js +27 -0
  26. package/lib/commands/chatState.js +45 -0
  27. package/lib/commands/claude.js +3 -32
  28. package/lib/commands/contacts.js +85 -4
  29. package/lib/commands/contactsSendAt.js +21 -0
  30. package/lib/commands/engagement.js +90 -0
  31. package/lib/commands/evidence.js +154 -0
  32. package/lib/commands/ext.js +23 -0
  33. package/lib/commands/fleet.js +25 -0
  34. package/lib/commands/hat.js +76 -0
  35. package/lib/commands/image.js +68 -0
  36. package/lib/commands/kuma.js +1050 -0
  37. package/lib/commands/kumaSla.js +174 -0
  38. package/lib/commands/licence.js +39 -1
  39. package/lib/commands/loop.js +291 -0
  40. package/lib/commands/objective.js +48 -1
  41. package/lib/commands/org.js +21 -4
  42. package/lib/commands/provider.js +58 -0
  43. package/lib/commands/quoxseo.js +31 -0
  44. package/lib/commands/research.js +79 -0
  45. package/lib/commands/rows.js +9 -0
  46. package/lib/commands/run.js +18 -1
  47. package/lib/commands/scope.js +2 -2
  48. package/lib/commands/server.js +113 -0
  49. package/lib/commands/shortcut.js +41 -0
  50. package/lib/commands/skills.js +20 -4
  51. package/lib/commands/vm.js +2 -2
  52. package/lib/commands/youtube.js +172 -0
  53. package/lib/core/actionItems.js +115 -0
  54. package/lib/core/agentAlias.js +2 -0
  55. package/lib/core/agentFamilies.js +7 -0
  56. package/lib/core/client.js +10 -2
  57. package/lib/core/commandRegistrars.js +9 -0
  58. package/lib/core/config.js +1 -1
  59. package/lib/core/findingReconcile.js +90 -0
  60. package/lib/core/global-flags.js +1 -1
  61. package/lib/core/governedSession.js +1 -3
  62. package/lib/core/liveSessionsReport.js +1 -1
  63. package/lib/core/loopGlyph.js +97 -0
  64. package/lib/core/offload.js +36 -7
  65. package/lib/core/output.js +7 -7
  66. package/lib/core/sessionHeartbeat.js +12 -8
  67. package/lib/core/shortcut.js +83 -0
  68. package/lib/core/version.js +1 -1
  69. package/lib/core/vm.js +5 -0
  70. package/lib/dragon/companionView.js +34 -0
  71. package/lib/dragon/frames.js +118 -0
  72. package/lib/dragon/jobs.js +123 -0
  73. package/lib/dragon/renderWorker.js +15 -0
  74. package/lib/dragon/select.js +72 -0
  75. package/lib/evidence/bundleExport.js +47 -0
  76. package/lib/evidence/bundleVerify.js +77 -0
  77. package/lib/quoxon/EXTENSIONS.md +23 -0
  78. package/lib/quoxon/api.js +192 -6
  79. package/lib/quoxon/app.js +655 -89
  80. package/lib/quoxon/approvalFacts.js +8 -6
  81. package/lib/quoxon/approvalSentence.js +44 -0
  82. package/lib/quoxon/approvalsView.js +63 -4
  83. package/lib/quoxon/commandShort.js +15 -3
  84. package/lib/quoxon/commands.js +75 -10
  85. package/lib/quoxon/countdownLine.js +10 -1
  86. package/lib/quoxon/deck.js +30 -0
  87. package/lib/quoxon/demo.autoplay.js +1 -1
  88. package/lib/quoxon/demo.js +3 -1
  89. package/lib/quoxon/dividerAocl.js +4 -3
  90. package/lib/quoxon/dividerRule.js +3 -3
  91. package/lib/quoxon/dragonCompanion.js +255 -0
  92. package/lib/quoxon/dragonModes.js +1 -0
  93. package/lib/quoxon/dragonMoments.js +82 -0
  94. package/lib/quoxon/dragonReads.js +68 -0
  95. package/lib/quoxon/dragonView.js +2 -2
  96. package/lib/quoxon/events.js +24 -3
  97. package/lib/quoxon/extensions.js +276 -0
  98. package/lib/quoxon/inboxView.js +79 -0
  99. package/lib/quoxon/installCli.js +79 -0
  100. package/lib/quoxon/keys.js +2 -2
  101. package/lib/quoxon/loopCard.js +456 -0
  102. package/lib/quoxon/loopCards.js +180 -0
  103. package/lib/quoxon/loopStream.js +87 -0
  104. package/lib/quoxon/main.js +12 -3
  105. package/lib/quoxon/mouse.js +12 -1
  106. package/lib/quoxon/objectiveOffer.js +82 -0
  107. package/lib/quoxon/objects/index.js +22 -4
  108. package/lib/quoxon/objects/model.js +33 -0
  109. package/lib/quoxon/objects/proof.js +12 -4
  110. package/lib/quoxon/onboarding/shortcutOffer.js +28 -0
  111. package/lib/quoxon/onboarding/view.js +1 -1
  112. package/lib/quoxon/orgSwitch.js +27 -1
  113. package/lib/quoxon/planSteps.js +51 -0
  114. package/lib/quoxon/print.js +6 -3
  115. package/lib/quoxon/qdragonFly.js +7 -6
  116. package/lib/quoxon/qmotion.js +17 -0
  117. package/lib/quoxon/render.js +130 -33
  118. package/lib/quoxon/roster.js +26 -12
  119. package/lib/quoxon/rows.js +244 -1
  120. package/lib/quoxon/serverChip.js +42 -0
  121. package/lib/quoxon/session.js +10 -0
  122. package/lib/quoxon/slash/cliCommand.js +42 -1
  123. package/lib/quoxon/slash/cliLeaves.json +76 -1
  124. package/lib/quoxon/slash/evidenceCmd.js +34 -0
  125. package/lib/quoxon/slash/palette.js +1 -1
  126. package/lib/quoxon/slash/qpeCmd.js +35 -0
  127. package/lib/quoxon/slash/restart.js +25 -1
  128. package/lib/quoxon/slash/resume.js +18 -1
  129. package/lib/quoxon/slash/todoCmd.js +122 -0
  130. package/lib/quoxon/suggestCommand.js +33 -2
  131. package/lib/quoxon/toolCards.js +30 -0
  132. package/lib/quoxon/whatsnew.jsonl +45 -0
  133. package/lib/quoxon/windowOrg.js +11 -1
  134. package/lib/server/devServers.js +137 -0
  135. package/package.json +2 -1
  136. package/vendor/dragonlab/SOURCE +4 -0
  137. package/vendor/dragonlab/design/cipher/v1/cipher-master.svg +46 -0
  138. package/vendor/dragonlab/design/cipher/v2/character.mjs +49 -0
  139. package/vendor/dragonlab/design/cipher/v2/review.mjs +33 -0
  140. package/vendor/dragonlab/design/cipher/v2/watch.mjs +56 -0
  141. package/vendor/dragonlab/design/drago/v1/character.mjs +19 -0
  142. package/vendor/dragonlab/design/drago/v1/drago-master.svg +56 -0
  143. package/vendor/dragonlab/design/drago/v2/character.mjs +87 -0
  144. package/vendor/dragonlab/design/drago/v4/character.mjs +67 -0
  145. package/vendor/dragonlab/design/drago/v4/profile.mjs +35 -0
  146. package/vendor/dragonlab/design/drago/v4/review.mjs +33 -0
  147. package/vendor/dragonlab/design/drago/v4/watch.mjs +56 -0
  148. package/vendor/dragonlab/design/hyperion/v1/hyperion-master.svg +56 -0
  149. package/vendor/dragonlab/design/hyperion/v2/character.mjs +79 -0
  150. package/vendor/dragonlab/design/hyperion/v2/review.mjs +33 -0
  151. package/vendor/dragonlab/design/hyperion/v2/watch.mjs +56 -0
  152. package/vendor/dragonlab/design/lucid/recovery/arrival.mjs +22 -0
  153. package/vendor/dragonlab/design/lucid/recovery/character.mjs +106 -0
  154. package/vendor/dragonlab/design/lucid/recovery/layout.mjs +50 -0
  155. package/vendor/dragonlab/design/lucid/recovery/lucid-master.svg +78 -0
  156. package/vendor/dragonlab/design/lucid/recovery/motion.mjs +42 -0
  157. package/vendor/dragonlab/design/lucid/recovery/render.mjs +121 -0
  158. package/vendor/dragonlab/design/lucid/recovery/review.mjs +68 -0
  159. package/vendor/dragonlab/design/lucid/recovery/verify.mjs +84 -0
  160. package/vendor/dragonlab/design/lucid/recovery/watch.mjs +56 -0
  161. package/vendor/dragonlab/design/seer/v1/seer-master.svg +53 -0
  162. package/vendor/dragonlab/design/seer/v2/character.mjs +88 -0
  163. package/vendor/dragonlab/design/seer/v3/character.mjs +33 -0
  164. package/vendor/dragonlab/design/seer/v4/character.mjs +66 -0
  165. package/vendor/dragonlab/design/seer/v4/review.mjs +33 -0
  166. package/vendor/dragonlab/design/seer/v4/watch.mjs +56 -0
  167. package/vendor/dragonlab/design/stage3/companion-review.mjs +28 -0
  168. package/vendor/dragonlab/design/stage3/sentinel-art.js +39 -0
  169. package/vendor/dragonlab/design/stage3/sentinel-braille.js +216 -0
  170. package/vendor/dragonlab/design/stage3/sentinel-character.js +257 -0
  171. package/vendor/dragonlab/design/stage3/sentinel-icon.js +103 -0
  172. package/vendor/dragonlab/design/stage3/sentinel-warden-eyes.js +95 -0
  173. package/vendor/dragonlab/design/stage3/svg-coverage.js +148 -0
  174. package/vendor/dragonlab/factory/svg-rig.mjs +63 -0
  175. package/vendor/dragonlab/integration/companions-v1/characters.mjs +88 -0
  176. package/vendor/dragonlab/integration/companions-v1/cipher.mjs +2 -0
  177. package/vendor/dragonlab/integration/companions-v1/companion.mjs +63 -0
  178. package/vendor/dragonlab/integration/companions-v1/drago.mjs +2 -0
  179. package/vendor/dragonlab/integration/companions-v1/hyperion.mjs +2 -0
  180. package/vendor/dragonlab/integration/companions-v1/lucid.mjs +2 -0
  181. package/vendor/dragonlab/integration/companions-v1/seer.mjs +2 -0
  182. package/vendor/dragonlab/integration/companions-v1/sentinel.mjs +2 -0
  183. package/vendor/dragonlab/integration/companions-v1/view.mjs +28 -0
  184. package/vendor/dragonlab/integration/hyperion-v3/activity.mjs +76 -0
  185. package/vendor/dragonlab/lib/power-effects.js +294 -0
  186. package/vendor/dragonlab/lib/power-registry.js +74 -0
  187. package/vendor/dragonlab/vendor/quox-dragon/qart.js +348 -0
  188. 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
+ };
@@ -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
+ };
@@ -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',
@@ -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',