quoxcli 0.0.0-stage → 0.2.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 (348) hide show
  1. package/LICENSE +35 -0
  2. package/README.md +142 -2
  3. package/bin/quox.js +292 -0
  4. package/bin/quoxon.js +8 -0
  5. package/lib/api/endpoints/admin.js +125 -0
  6. package/lib/api/endpoints/aee.js +38 -0
  7. package/lib/api/endpoints/agent-attach.js +126 -0
  8. package/lib/api/endpoints/agents.js +56 -0
  9. package/lib/api/endpoints/assistants.js +50 -0
  10. package/lib/api/endpoints/audit.js +14 -0
  11. package/lib/api/endpoints/auth.js +50 -0
  12. package/lib/api/endpoints/awareness.js +34 -0
  13. package/lib/api/endpoints/backup-schedules.js +20 -0
  14. package/lib/api/endpoints/backups.js +86 -0
  15. package/lib/api/endpoints/brain.js +140 -0
  16. package/lib/api/endpoints/budgets.js +62 -0
  17. package/lib/api/endpoints/calendarq.js +71 -0
  18. package/lib/api/endpoints/catalog.js +14 -0
  19. package/lib/api/endpoints/chat.js +54 -0
  20. package/lib/api/endpoints/consent.js +26 -0
  21. package/lib/api/endpoints/contactsq.js +66 -0
  22. package/lib/api/endpoints/conversations.js +32 -0
  23. package/lib/api/endpoints/custom-roles.js +92 -0
  24. package/lib/api/endpoints/divisions.js +56 -0
  25. package/lib/api/endpoints/domains.js +38 -0
  26. package/lib/api/endpoints/engagement.js +231 -0
  27. package/lib/api/endpoints/engine.js +11 -0
  28. package/lib/api/endpoints/entity.js +50 -0
  29. package/lib/api/endpoints/executions.js +32 -0
  30. package/lib/api/endpoints/file.js +20 -0
  31. package/lib/api/endpoints/files.js +26 -0
  32. package/lib/api/endpoints/github.js +21 -0
  33. package/lib/api/endpoints/governance.js +43 -0
  34. package/lib/api/endpoints/hat.js +36 -0
  35. package/lib/api/endpoints/inbox.js +32 -0
  36. package/lib/api/endpoints/inboxq.js +120 -0
  37. package/lib/api/endpoints/index.js +228 -0
  38. package/lib/api/endpoints/invites.js +19 -0
  39. package/lib/api/endpoints/llm-policy.js +43 -0
  40. package/lib/api/endpoints/lucid.js +89 -0
  41. package/lib/api/endpoints/members.js +32 -0
  42. package/lib/api/endpoints/memory.js +75 -0
  43. package/lib/api/endpoints/mfa.js +32 -0
  44. package/lib/api/endpoints/mon.js +178 -0
  45. package/lib/api/endpoints/notesq.js +43 -0
  46. package/lib/api/endpoints/objectives.js +62 -0
  47. package/lib/api/endpoints/orgs.js +38 -0
  48. package/lib/api/endpoints/plugins.js +134 -0
  49. package/lib/api/endpoints/powers.js +75 -0
  50. package/lib/api/endpoints/prompts.js +69 -0
  51. package/lib/api/endpoints/qlarity.js +122 -0
  52. package/lib/api/endpoints/quoxbox.js +55 -0
  53. package/lib/api/endpoints/quoxchat.js +54 -0
  54. package/lib/api/endpoints/quoxflow.js +32 -0
  55. package/lib/api/endpoints/quoxplan.js +114 -0
  56. package/lib/api/endpoints/quoxseo.js +108 -0
  57. package/lib/api/endpoints/reach.js +47 -0
  58. package/lib/api/endpoints/runs.js +38 -0
  59. package/lib/api/endpoints/safety.js +46 -0
  60. package/lib/api/endpoints/scim.js +46 -0
  61. package/lib/api/endpoints/scopes.js +14 -0
  62. package/lib/api/endpoints/security.js +69 -0
  63. package/lib/api/endpoints/setup.js +90 -0
  64. package/lib/api/endpoints/skills.js +180 -0
  65. package/lib/api/endpoints/sso.js +67 -0
  66. package/lib/api/endpoints/tags.js +32 -0
  67. package/lib/api/endpoints/teams.js +56 -0
  68. package/lib/api/endpoints/telephony.js +46 -0
  69. package/lib/api/endpoints/tg.js +56 -0
  70. package/lib/api/endpoints/tools.js +50 -0
  71. package/lib/api/endpoints/traces.js +157 -0
  72. package/lib/api/endpoints/triggers.js +70 -0
  73. package/lib/api/endpoints/user-library.js +41 -0
  74. package/lib/api/endpoints/users.js +20 -0
  75. package/lib/api/endpoints/v1.js +499 -0
  76. package/lib/api/endpoints/vault.js +192 -0
  77. package/lib/api/endpoints/voice.js +22 -0
  78. package/lib/api/endpoints/volt.js +84 -0
  79. package/lib/api/endpoints/ward.js +40 -0
  80. package/lib/api/endpoints/webhooks.js +46 -0
  81. package/lib/api/endpoints/workflows.js +162 -0
  82. package/lib/api/endpoints/x.js +24 -0
  83. package/lib/api/endpoints.js +15 -0
  84. package/lib/commands/admin.js +359 -0
  85. package/lib/commands/aee.js +99 -0
  86. package/lib/commands/agent.js +201 -0
  87. package/lib/commands/agentAttach.js +1440 -0
  88. package/lib/commands/approvals.js +47 -0
  89. package/lib/commands/assistant.js +114 -0
  90. package/lib/commands/auth.js +458 -0
  91. package/lib/commands/awareness.js +88 -0
  92. package/lib/commands/backup.js +373 -0
  93. package/lib/commands/brain.js +994 -0
  94. package/lib/commands/budget.js +241 -0
  95. package/lib/commands/build.js +156 -0
  96. package/lib/commands/calendar.js +216 -0
  97. package/lib/commands/capabilities.js +34 -0
  98. package/lib/commands/chat.js +240 -0
  99. package/lib/commands/claude.js +354 -0
  100. package/lib/commands/config-cmd.js +106 -0
  101. package/lib/commands/consent.js +84 -0
  102. package/lib/commands/contacts.js +967 -0
  103. package/lib/commands/contactsSelftest.js +132 -0
  104. package/lib/commands/conversation.js +74 -0
  105. package/lib/commands/department.js +75 -0
  106. package/lib/commands/dev.js +620 -0
  107. package/lib/commands/devResident.js +314 -0
  108. package/lib/commands/devSupervisor.js +1050 -0
  109. package/lib/commands/discord.js +96 -0
  110. package/lib/commands/doctor.js +181 -0
  111. package/lib/commands/domain.js +114 -0
  112. package/lib/commands/done.js +277 -0
  113. package/lib/commands/engagement.js +586 -0
  114. package/lib/commands/entity.js +119 -0
  115. package/lib/commands/facebook.js +212 -0
  116. package/lib/commands/file.js +128 -0
  117. package/lib/commands/fleet.js +882 -0
  118. package/lib/commands/governance.js +638 -0
  119. package/lib/commands/gripe.js +324 -0
  120. package/lib/commands/hat.js +205 -0
  121. package/lib/commands/helpers.js +79 -0
  122. package/lib/commands/inbox.js +122 -0
  123. package/lib/commands/instagram.js +264 -0
  124. package/lib/commands/integration.js +100 -0
  125. package/lib/commands/inventory.js +115 -0
  126. package/lib/commands/invites.js +45 -0
  127. package/lib/commands/licence.js +280 -0
  128. package/lib/commands/linkedin.js +178 -0
  129. package/lib/commands/llm-policy.js +117 -0
  130. package/lib/commands/llm.js +45 -0
  131. package/lib/commands/lucid.js +591 -0
  132. package/lib/commands/mail.js +531 -0
  133. package/lib/commands/memory.js +284 -0
  134. package/lib/commands/mon.js +514 -0
  135. package/lib/commands/monitoring.js +86 -0
  136. package/lib/commands/motion.js +22 -0
  137. package/lib/commands/notes.js +1246 -0
  138. package/lib/commands/notesBatch.js +160 -0
  139. package/lib/commands/notesBridges.js +56 -0
  140. package/lib/commands/notesLinks.js +60 -0
  141. package/lib/commands/notification.js +57 -0
  142. package/lib/commands/nucleus.js +92 -0
  143. package/lib/commands/objective.js +229 -0
  144. package/lib/commands/onboard.js +328 -0
  145. package/lib/commands/open.js +56 -0
  146. package/lib/commands/org.js +266 -0
  147. package/lib/commands/plan.js +906 -0
  148. package/lib/commands/plugin-doctor.js +1091 -0
  149. package/lib/commands/plugin.js +539 -0
  150. package/lib/commands/policy.js +78 -0
  151. package/lib/commands/powers.js +296 -0
  152. package/lib/commands/prompt.js +350 -0
  153. package/lib/commands/qlarity.js +690 -0
  154. package/lib/commands/quoxbox.js +270 -0
  155. package/lib/commands/quoxchat.js +266 -0
  156. package/lib/commands/quoxseo.js +340 -0
  157. package/lib/commands/reach.js +158 -0
  158. package/lib/commands/role.js +286 -0
  159. package/lib/commands/run.js +132 -0
  160. package/lib/commands/safety.js +107 -0
  161. package/lib/commands/scim.js +88 -0
  162. package/lib/commands/scope.js +58 -0
  163. package/lib/commands/security.js +157 -0
  164. package/lib/commands/service.js +89 -0
  165. package/lib/commands/settings.js +99 -0
  166. package/lib/commands/setup.js +543 -0
  167. package/lib/commands/skillManifest.js +113 -0
  168. package/lib/commands/skillRightsFormat.js +38 -0
  169. package/lib/commands/skills.js +644 -0
  170. package/lib/commands/slot.js +1198 -0
  171. package/lib/commands/sso.js +229 -0
  172. package/lib/commands/status.js +137 -0
  173. package/lib/commands/tag.js +91 -0
  174. package/lib/commands/team.js +140 -0
  175. package/lib/commands/tg.js +240 -0
  176. package/lib/commands/tiktok.js +218 -0
  177. package/lib/commands/tool.js +216 -0
  178. package/lib/commands/trace.js +525 -0
  179. package/lib/commands/trigger.js +128 -0
  180. package/lib/commands/vault.js +1424 -0
  181. package/lib/commands/voice.js +182 -0
  182. package/lib/commands/volt.js +528 -0
  183. package/lib/commands/watch.js +115 -0
  184. package/lib/commands/webhook.js +137 -0
  185. package/lib/commands/workflow.js +503 -0
  186. package/lib/commands/x.js +439 -0
  187. package/lib/core/actingAs.js +136 -0
  188. package/lib/core/aee.js +53 -0
  189. package/lib/core/agentAlias.js +163 -0
  190. package/lib/core/approvalContext.js +61 -0
  191. package/lib/core/auth.js +350 -0
  192. package/lib/core/banner.js +143 -0
  193. package/lib/core/brainPrime.js +90 -0
  194. package/lib/core/callerSource.js +129 -0
  195. package/lib/core/claudeLs.js +94 -0
  196. package/lib/core/client.js +584 -0
  197. package/lib/core/completions.js +163 -0
  198. package/lib/core/config.js +551 -0
  199. package/lib/core/confirm.js +37 -0
  200. package/lib/core/deeplinks.js +76 -0
  201. package/lib/core/doneEngineFetch.js +219 -0
  202. package/lib/core/errors.js +132 -0
  203. package/lib/core/global-flags.js +90 -0
  204. package/lib/core/governedSession.js +402 -0
  205. package/lib/core/lazyCommands.js +119 -0
  206. package/lib/core/liveSessionsReport.js +112 -0
  207. package/lib/core/org-override.js +52 -0
  208. package/lib/core/output.js +239 -0
  209. package/lib/core/prodEnv.js +7 -0
  210. package/lib/core/quoxglyph.js +158 -0
  211. package/lib/core/residentAlarm.js +282 -0
  212. package/lib/core/residentAuth.js +243 -0
  213. package/lib/core/residentPump.js +229 -0
  214. package/lib/core/residentSeed.js +104 -0
  215. package/lib/core/sessionHeartbeat.js +192 -0
  216. package/lib/core/sessionsOverview.js +160 -0
  217. package/lib/core/slotKeeper.js +282 -0
  218. package/lib/core/supervisorEngine.js +864 -0
  219. package/lib/core/systemdInstaller.js +256 -0
  220. package/lib/core/version.js +87 -0
  221. package/lib/core/websiteSession.js +148 -0
  222. package/lib/lucid/LucidIntro.jsx +105 -0
  223. package/lib/lucid/blind.js +71 -0
  224. package/lib/lucid/deck.js +32 -0
  225. package/lib/lucid/fmt.js +139 -0
  226. package/lib/lucid/sitrep.js +173 -0
  227. package/lib/plugins/loader.js +93 -0
  228. package/lib/quoxon/activity.js +104 -0
  229. package/lib/quoxon/api.js +473 -0
  230. package/lib/quoxon/app.js +1262 -0
  231. package/lib/quoxon/capabilities.js +75 -0
  232. package/lib/quoxon/commands.js +154 -0
  233. package/lib/quoxon/connect.js +467 -0
  234. package/lib/quoxon/connectCard.js +28 -0
  235. package/lib/quoxon/context.js +68 -0
  236. package/lib/quoxon/copy.js +33 -0
  237. package/lib/quoxon/demo.fixtures.js +24 -0
  238. package/lib/quoxon/demo.js +35 -0
  239. package/lib/quoxon/egg.js +36 -0
  240. package/lib/quoxon/events.js +458 -0
  241. package/lib/quoxon/gallery.js +223 -0
  242. package/lib/quoxon/indicator.js +193 -0
  243. package/lib/quoxon/intent.js +41 -0
  244. package/lib/quoxon/keys.js +121 -0
  245. package/lib/quoxon/main.js +244 -0
  246. package/lib/quoxon/markdown.js +317 -0
  247. package/lib/quoxon/model.js +205 -0
  248. package/lib/quoxon/motion/clock.js +69 -0
  249. package/lib/quoxon/motion/color.js +35 -0
  250. package/lib/quoxon/motion/frame.js +14 -0
  251. package/lib/quoxon/motion/reveal.js +54 -0
  252. package/lib/quoxon/motion/ring.js +79 -0
  253. package/lib/quoxon/objects/agent.js +61 -0
  254. package/lib/quoxon/objects/crystal.js +100 -0
  255. package/lib/quoxon/objects/fetch.js +170 -0
  256. package/lib/quoxon/objects/index.js +85 -0
  257. package/lib/quoxon/objects/ladder.js +71 -0
  258. package/lib/quoxon/objects/memory.js +44 -0
  259. package/lib/quoxon/objects/model.js +118 -0
  260. package/lib/quoxon/objects/proof.js +110 -0
  261. package/lib/quoxon/objects/skill.js +105 -0
  262. package/lib/quoxon/objects/view.js +76 -0
  263. package/lib/quoxon/objects/workflow.js +119 -0
  264. package/lib/quoxon/observers.js +42 -0
  265. package/lib/quoxon/onboarding/copy.js +235 -0
  266. package/lib/quoxon/onboarding/credential.js +95 -0
  267. package/lib/quoxon/onboarding/detect.js +22 -0
  268. package/lib/quoxon/onboarding/finish.js +119 -0
  269. package/lib/quoxon/onboarding/index.js +67 -0
  270. package/lib/quoxon/onboarding/installRunner.js +225 -0
  271. package/lib/quoxon/onboarding/intent.js +53 -0
  272. package/lib/quoxon/onboarding/journey.js +73 -0
  273. package/lib/quoxon/onboarding/preflight.js +142 -0
  274. package/lib/quoxon/onboarding/runner.js +58 -0
  275. package/lib/quoxon/onboarding/view.js +625 -0
  276. package/lib/quoxon/print.js +94 -0
  277. package/lib/quoxon/qart.js +379 -0
  278. package/lib/quoxon/qglyph.js +143 -0
  279. package/lib/quoxon/qhello.js +58 -0
  280. package/lib/quoxon/qmotion.js +111 -0
  281. package/lib/quoxon/render.js +648 -0
  282. package/lib/quoxon/roster.js +221 -0
  283. package/lib/quoxon/route.js +38 -0
  284. package/lib/quoxon/rules.js +130 -0
  285. package/lib/quoxon/session.js +68 -0
  286. package/lib/quoxon/skills.js +30 -0
  287. package/lib/quoxon/slash/compact.js +90 -0
  288. package/lib/quoxon/slash/ledger.js +83 -0
  289. package/lib/quoxon/slash/listView.js +28 -0
  290. package/lib/quoxon/slash/palette.js +104 -0
  291. package/lib/quoxon/slash/paletteController.js +59 -0
  292. package/lib/quoxon/slash/panels.js +101 -0
  293. package/lib/quoxon/slash/picker.js +38 -0
  294. package/lib/quoxon/slash/restart.js +144 -0
  295. package/lib/quoxon/slash/resume.js +59 -0
  296. package/lib/quoxon/slash/settings.js +50 -0
  297. package/lib/quoxon/sound/index.js +186 -0
  298. package/lib/quoxon/sound/mapping.js +119 -0
  299. package/lib/quoxon/sound/output.js +52 -0
  300. package/lib/quoxon/sound/synth.js +122 -0
  301. package/lib/quoxon/term.js +106 -0
  302. package/lib/quoxon/textBuffer.js +242 -0
  303. package/lib/quoxon/theme.js +253 -0
  304. package/lib/quoxon/transcript.js +150 -0
  305. package/lib/quoxon/web/qface.js +81 -0
  306. package/lib/quoxon/welcome.js +52 -0
  307. package/lib/tui/app.jsx +289 -0
  308. package/lib/tui/components/Breadcrumb.jsx +42 -0
  309. package/lib/tui/components/ChatInput.jsx +68 -0
  310. package/lib/tui/components/Confirm.jsx +32 -0
  311. package/lib/tui/components/DataTable.jsx +270 -0
  312. package/lib/tui/components/DetailPanel.jsx +241 -0
  313. package/lib/tui/components/HelpOverlay.jsx +67 -0
  314. package/lib/tui/components/Layout.jsx +129 -0
  315. package/lib/tui/components/Palette.jsx +141 -0
  316. package/lib/tui/components/SearchInput.jsx +125 -0
  317. package/lib/tui/components/Sparkline.jsx +55 -0
  318. package/lib/tui/components/StatusBar.jsx +133 -0
  319. package/lib/tui/components/Toast.jsx +52 -0
  320. package/lib/tui/hooks/useApi.js +44 -0
  321. package/lib/tui/hooks/useHealth.js +90 -0
  322. package/lib/tui/hooks/usePolledApi.js +86 -0
  323. package/lib/tui/hooks/useTerminalSize.js +46 -0
  324. package/lib/tui/index.js +56 -0
  325. package/lib/tui/intro/Intro.jsx +332 -0
  326. package/lib/tui/jsx-loader.js +32 -0
  327. package/lib/tui/keys.js +87 -0
  328. package/lib/tui/registry.js +49 -0
  329. package/lib/tui/theme.js +103 -0
  330. package/lib/tui/views/AdminView.jsx +398 -0
  331. package/lib/tui/views/AgentView.jsx +204 -0
  332. package/lib/tui/views/BackupView.jsx +225 -0
  333. package/lib/tui/views/BrainView.jsx +223 -0
  334. package/lib/tui/views/ChatView.jsx +468 -0
  335. package/lib/tui/views/FilesView.jsx +218 -0
  336. package/lib/tui/views/FleetView.jsx +234 -0
  337. package/lib/tui/views/GovernanceView.jsx +453 -0
  338. package/lib/tui/views/HealthView.jsx +216 -0
  339. package/lib/tui/views/InboxView.jsx +228 -0
  340. package/lib/tui/views/LucidDeck.jsx +727 -0
  341. package/lib/tui/views/MainMenu.jsx +123 -0
  342. package/lib/tui/views/MemoryView.jsx +377 -0
  343. package/lib/tui/views/ObjectivesView.jsx +230 -0
  344. package/lib/tui/views/OrgView.jsx +229 -0
  345. package/lib/tui/views/ToolView.jsx +221 -0
  346. package/lib/tui/views/VaultView.jsx +422 -0
  347. package/lib/tui/views/WorkflowView.jsx +329 -0
  348. package/package.json +72 -4
@@ -0,0 +1,231 @@
1
+ /**
2
+ * 'engagement.*' endpoints — QUOX-SECURITY Phase 0 engagement/scope API.
3
+ * Collector-native (services/collector/server.js:
4
+ * app.post/get('/api/v1/security/engagements...', requireServiceOrUserAuth(), ...)),
5
+ * not a proxy. org_id is derived server-side from the authenticated user,
6
+ * same as the wazuh and quoxagent endpoint fragments, never sent by the CLI.
7
+ *
8
+ * NAMING NOTE: the REST path is /api/v1/security/engagements/* but the
9
+ * endpoint-key prefix here is `engagement.*`, not `security.*` — that
10
+ * prefix is already taken by services/auth/routes/orgSecurity.js's org
11
+ * session-policy/ip-allowlist/MFA settings (cli/lib/api/endpoints/security.js),
12
+ * a genuinely different product concern (org access-control settings, not a
13
+ * security-testing engagement's scope/policy object). The fragment guard
14
+ * (test/api/endpoints-fragments.test.js) requires key prefix === filename
15
+ * minus '.js', so this needed its own file either way.
16
+ *
17
+ * See cli/lib/api/endpoints/index.js for the fragment convention.
18
+ */
19
+
20
+ export const engagement = {
21
+ 'engagement.create': {
22
+ method: 'POST',
23
+ service: 'collector',
24
+ path: () => `/api/v1/security/engagements`,
25
+ tags: ['live-write'],
26
+ },
27
+ 'engagement.list': {
28
+ method: 'GET',
29
+ service: 'collector',
30
+ path: () => `/api/v1/security/engagements`,
31
+ tags: ['live-safe'],
32
+ },
33
+ 'engagement.get': {
34
+ method: 'GET',
35
+ service: 'collector',
36
+ path: ({ id }) => `/api/v1/security/engagements/${id}`,
37
+ tags: ['live-safe'],
38
+ },
39
+ // Per-engagement gripe target: which repo a finding filed from this
40
+ // engagement goes to, and which org's GitHub connector token files it.
41
+ // lib/securityEngagement.js's setEngagementGripeTarget.
42
+ 'engagement.gripe_target.set': {
43
+ method: 'PATCH',
44
+ service: 'collector',
45
+ path: ({ id }) => `/api/v1/security/engagements/${id}/gripe-target`,
46
+ tags: ['live-write'],
47
+ },
48
+ 'engagement.target.create': {
49
+ method: 'POST',
50
+ service: 'collector',
51
+ path: ({ id }) => `/api/v1/security/engagements/${id}/targets`,
52
+ tags: ['live-write'],
53
+ },
54
+ 'engagement.target.verify': {
55
+ method: 'POST',
56
+ service: 'collector',
57
+ path: ({ id, targetId }) => `/api/v1/security/engagements/${id}/verify-target/${targetId}`,
58
+ tags: ['live-write'],
59
+ },
60
+ // Phase 1 parity fix: the policy gate and the 3 real capability tools
61
+ // (lib/securityCapabilityTools.js) were agent-only until this route
62
+ // existed. Still policy-gated first, still honest about no scan host
63
+ // being configured, this is the same safety envelope as the agent path.
64
+ 'engagement.check_policy': {
65
+ method: 'POST',
66
+ service: 'collector',
67
+ path: ({ id }) => `/api/v1/security/engagements/${id}/check-policy`,
68
+ tags: ['live-safe'],
69
+ },
70
+ 'engagement.capability': {
71
+ method: 'POST',
72
+ service: 'collector',
73
+ path: ({ id, tool }) => `/api/v1/security/engagements/${id}/capability/${tool}`,
74
+ tags: ['live-write'],
75
+ },
76
+ // COVERAGE Phase 2: httpx-based app-port discovery on a bare in-scope host,
77
+ // finding the ports that actually serve HTTP(S) so a scan hits the real
78
+ // surface, not only :80/:443. With { add:true } each discovered endpoint is
79
+ // registered + verified as a url target. lib/securityAppPortDiscovery.js.
80
+ 'engagement.discover_app_ports': {
81
+ method: 'POST',
82
+ service: 'collector',
83
+ path: ({ id }) => `/api/v1/security/engagements/${id}/discover-app-ports`,
84
+ tags: ['live-write'],
85
+ },
86
+ // Quoxcli-parity fix: this catalog existed for the dashboard's Tools tab
87
+ // but was never CLI-reachable. lib/securityCapabilityTools.js's
88
+ // getCapabilityToolCatalog().
89
+ 'engagement.capability_tools': {
90
+ method: 'GET',
91
+ service: 'collector',
92
+ path: () => `/api/v1/security/capability-tools`,
93
+ tags: ['live-safe'],
94
+ },
95
+ // Async job model (found live 2026-08-10/11: a real sectest_vuln_scan/
96
+ // nuclei run outruns the sync route's 30s budget). Same policy gate,
97
+ // returns job_id immediately, poll engagement.job.get for the result.
98
+ 'engagement.capability.start': {
99
+ method: 'POST',
100
+ service: 'collector',
101
+ path: ({ id, tool }) => `/api/v1/security/engagements/${id}/capability/${tool}/start`,
102
+ tags: ['live-write'],
103
+ },
104
+ 'engagement.job.get': {
105
+ method: 'GET',
106
+ service: 'collector',
107
+ path: ({ jobId }) => `/api/v1/security/jobs/${jobId}`,
108
+ tags: ['live-safe'],
109
+ },
110
+ 'engagement.jobs.list': {
111
+ method: 'GET',
112
+ service: 'collector',
113
+ path: ({ id }) => `/api/v1/security/engagements/${id}/jobs`,
114
+ tags: ['live-safe'],
115
+ },
116
+ // Findings storage (Phase 1, continued): closes the "no findings storage"
117
+ // gap. lib/securityFindings.js.
118
+ 'engagement.findings.report': {
119
+ method: 'POST',
120
+ service: 'collector',
121
+ path: ({ id }) => `/api/v1/security/engagements/${id}/findings`,
122
+ tags: ['live-write'],
123
+ },
124
+ 'engagement.findings.list': {
125
+ method: 'GET',
126
+ service: 'collector',
127
+ path: ({ id }) => `/api/v1/security/engagements/${id}/findings`,
128
+ tags: ['live-safe'],
129
+ },
130
+ 'engagement.findings.verify': {
131
+ method: 'POST',
132
+ service: 'collector',
133
+ path: ({ findingId }) => `/api/v1/security/findings/${findingId}/verify`,
134
+ tags: ['live-write'],
135
+ },
136
+ // Quoxcli-parity fix: marks a finding remediated ("resolved"), e.g. after
137
+ // the GitHub issue it was filed as was closed. lib/securityFindings.js.
138
+ 'engagement.findings.resolve': {
139
+ method: 'POST',
140
+ service: 'collector',
141
+ path: ({ findingId }) => `/api/v1/security/findings/${findingId}/resolve`,
142
+ tags: ['live-write'],
143
+ },
144
+ // Re-grade a finding's severity after it was reported (quox#601). Governed +
145
+ // witnessed; a reason is required. lib/securityFindings.js regradeFinding.
146
+ 'engagement.findings.regrade': {
147
+ method: 'POST',
148
+ service: 'collector',
149
+ path: ({ findingId }) => `/api/v1/security/findings/${findingId}/regrade`,
150
+ tags: ['live-write'],
151
+ },
152
+ // Finding -> next-steps pipeline: lib/securityReportActions.js. Raise as
153
+ // Gripe (GitHub issue), Propose as QuoxPlan (a note on the QUOX-SECURITY
154
+ // stream), Download PDF (whole engagement report). Email PDF is
155
+ // explicitly out of scope (needs SMTP).
156
+ 'engagement.report.pdf': {
157
+ method: 'GET',
158
+ service: 'collector',
159
+ path: ({ id }) => `/api/v1/security/engagements/${id}/report.pdf`,
160
+ tags: ['live-safe'],
161
+ },
162
+ 'engagement.findings.gripe': {
163
+ method: 'POST',
164
+ service: 'collector',
165
+ path: ({ findingId }) => `/api/v1/security/findings/${findingId}/gripe`,
166
+ tags: ['live-write'],
167
+ },
168
+ 'engagement.findings.propose': {
169
+ method: 'POST',
170
+ service: 'collector',
171
+ path: ({ findingId }) => `/api/v1/security/findings/${findingId}/quoxplan`,
172
+ tags: ['live-write'],
173
+ },
174
+ // QUOX-SECURITY-SCHED Phase 4: recurring scan schedules, backed by
175
+ // lib/securityEngagementSchedules.js (Phase 1 storage) and driven by the
176
+ // server-side scheduler (lib/securityScanScheduler.js, Phase 2). Cadence is
177
+ // interval (interval_seconds) or cron (schedule_kind:'cron' + cron_expression,
178
+ // a 5-field UTC expression); the command builds the body, this fragment is a
179
+ // pure route descriptor.
180
+ 'engagement.schedule.create': {
181
+ method: 'POST',
182
+ service: 'collector',
183
+ path: ({ id }) => `/api/v1/security/engagements/${id}/schedules`,
184
+ tags: ['live-write'],
185
+ },
186
+ 'engagement.schedule.list': {
187
+ method: 'GET',
188
+ service: 'collector',
189
+ path: ({ id }) => `/api/v1/security/engagements/${id}/schedules`,
190
+ tags: ['live-safe'],
191
+ },
192
+ 'engagement.schedule.get': {
193
+ method: 'GET',
194
+ service: 'collector',
195
+ path: ({ scheduleId }) => `/api/v1/security/schedules/${scheduleId}`,
196
+ tags: ['live-safe'],
197
+ },
198
+ 'engagement.schedule.update': {
199
+ method: 'PATCH',
200
+ service: 'collector',
201
+ path: ({ scheduleId }) => `/api/v1/security/schedules/${scheduleId}`,
202
+ tags: ['live-write'],
203
+ },
204
+ 'engagement.schedule.enable': {
205
+ method: 'POST',
206
+ service: 'collector',
207
+ path: ({ scheduleId }) => `/api/v1/security/schedules/${scheduleId}/enable`,
208
+ tags: ['live-write'],
209
+ },
210
+ 'engagement.schedule.disable': {
211
+ method: 'POST',
212
+ service: 'collector',
213
+ path: ({ scheduleId }) => `/api/v1/security/schedules/${scheduleId}/disable`,
214
+ tags: ['live-write'],
215
+ },
216
+ 'engagement.schedule.delete': {
217
+ method: 'DELETE',
218
+ service: 'collector',
219
+ path: ({ scheduleId }) => `/api/v1/security/schedules/${scheduleId}`,
220
+ tags: ['live-write'],
221
+ },
222
+ // Quoxcli-parity fix: best-effort sync of GitHub issue states onto this
223
+ // engagement's filed findings (a closed issue auto-resolves its finding).
224
+ // lib/securityReportActions.js's syncFindingIssueStates.
225
+ 'engagement.sync_issue_states': {
226
+ method: 'POST',
227
+ service: 'collector',
228
+ path: ({ id }) => `/api/v1/security/engagements/${id}/sync-issue-states`,
229
+ tags: ['live-write'],
230
+ },
231
+ };
@@ -0,0 +1,11 @@
1
+ /**
2
+ * 'engine.*' endpoints: tasks-service implant stats (QuoxReflect / QuoxLearn / QuoxInsight).
3
+ * Read-only, org-scoped from the caller's auth (tasks server.js /api/engine/<implant>/stats).
4
+ * Used by QUOXON /observers for what Quox already records about its own learning.
5
+ */
6
+
7
+ export const engine = {
8
+ 'engine.reflect.stats': { method: 'GET', service: 'tasks', path: () => `/api/engine/reflect/stats`, tags: ['live-safe'] },
9
+ 'engine.learn.stats': { method: 'GET', service: 'tasks', path: () => `/api/engine/learn/stats`, tags: ['live-safe'] },
10
+ 'engine.insight.stats': { method: 'GET', service: 'tasks', path: () => `/api/engine/insight/stats`, tags: ['live-safe'] },
11
+ };
@@ -0,0 +1,50 @@
1
+ /**
2
+ * 'entity.*' endpoints — extracted from the former monolithic
3
+ * cli/lib/api/endpoints.js as part of the per-domain fragment split.
4
+ * See cli/lib/api/endpoints/index.js for aggregation + the fragment convention.
5
+ */
6
+
7
+ export const entity = {
8
+ 'entity.create': {
9
+ method: 'POST',
10
+ service: 'memory',
11
+ path: () => `/api/entity`,
12
+ tags: ['live-write'],
13
+ },
14
+ 'entity.get': {
15
+ method: 'GET',
16
+ service: 'memory',
17
+ path: ({ id }) => `/api/entity/${id}`,
18
+ tags: ['live-safe'],
19
+ },
20
+ 'entity.delete': {
21
+ method: 'DELETE',
22
+ service: 'memory',
23
+ path: ({ id }) => `/api/entity/${id}`,
24
+ tags: ['live-write'],
25
+ },
26
+ 'entity.list': {
27
+ method: 'GET',
28
+ service: 'memory',
29
+ path: () => `/api/entity`,
30
+ tags: ['live-safe'],
31
+ },
32
+ 'entity.relation': {
33
+ method: 'POST',
34
+ service: 'memory',
35
+ path: () => `/api/entity/relation`,
36
+ tags: ['live-write'],
37
+ },
38
+ 'entity.relation.delete': {
39
+ method: 'DELETE',
40
+ service: 'memory',
41
+ path: ({ id }) => `/api/entity/relation/${id}`,
42
+ tags: ['live-write'],
43
+ },
44
+ 'entity.search.list': {
45
+ method: 'GET',
46
+ service: 'memory',
47
+ path: () => `/api/entity/search`,
48
+ tags: ['live-safe'],
49
+ },
50
+ };
@@ -0,0 +1,32 @@
1
+ /**
2
+ * 'executions.*' endpoints — extracted from the former monolithic
3
+ * cli/lib/api/endpoints.js as part of the per-domain fragment split.
4
+ * See cli/lib/api/endpoints/index.js for aggregation + the fragment convention.
5
+ *
6
+ * fleet #465: quoxflow-direct GET routes for execution records
7
+ * (quoxflow/src/api/routes/executions.ts, mounted at
8
+ * app.route('/api/executions', ...)). These are the engine's OWN execution
9
+ * store — a different backend from the auth-service 'runs.*' entries
10
+ * (runs.js), which quoxflow never writes to. `quox run get`/`run list` use
11
+ * these as the engine-first read, falling back to 'runs.get'/'runs.list' on
12
+ * the auth-service model. Same access-path precedent as
13
+ * 'workflows.activate'/'workflows.applyGet' in workflows.js: org_id is
14
+ * resolved server-side from the caller's JWT/service-key context
15
+ * (org-scope.ts, resolveOrgScope), never a URL/query param, so no orgId
16
+ * path param appears here.
17
+ */
18
+
19
+ export const executions = {
20
+ 'executions.get': {
21
+ method: 'GET',
22
+ service: 'quoxflow',
23
+ path: ({ executionId }) => `/api/executions/${executionId}`,
24
+ tags: ['live-safe'],
25
+ },
26
+ 'executions.list': {
27
+ method: 'GET',
28
+ service: 'quoxflow',
29
+ path: () => `/api/executions`,
30
+ tags: ['live-safe'],
31
+ },
32
+ };
@@ -0,0 +1,20 @@
1
+ /**
2
+ * 'file.*' endpoints — extracted from the former monolithic
3
+ * cli/lib/api/endpoints.js as part of the per-domain fragment split.
4
+ * See cli/lib/api/endpoints/index.js for aggregation + the fragment convention.
5
+ */
6
+
7
+ export const file = {
8
+ 'file.delete': {
9
+ method: 'DELETE',
10
+ service: 'files',
11
+ path: ({ fileId }) => `/file/${fileId}`,
12
+ tags: ['live-write'],
13
+ },
14
+ 'file.get': {
15
+ method: 'GET',
16
+ service: 'files',
17
+ path: ({ fileId }) => `/file/${fileId}`,
18
+ tags: ['live-safe'],
19
+ },
20
+ };
@@ -0,0 +1,26 @@
1
+ /**
2
+ * 'files.*' endpoints — extracted from the former monolithic
3
+ * cli/lib/api/endpoints.js as part of the per-domain fragment split.
4
+ * See cli/lib/api/endpoints/index.js for aggregation + the fragment convention.
5
+ */
6
+
7
+ export const files = {
8
+ 'files.list': {
9
+ method: 'GET',
10
+ service: 'files',
11
+ path: () => `/list`,
12
+ tags: ['live-safe'],
13
+ },
14
+ 'files.stats': {
15
+ method: 'GET',
16
+ service: 'files',
17
+ path: () => `/stats`,
18
+ tags: ['live-safe'],
19
+ },
20
+ 'files.upload': {
21
+ method: 'POST',
22
+ service: 'files',
23
+ path: () => `/upload`,
24
+ tags: ['live-write'],
25
+ },
26
+ };
@@ -0,0 +1,21 @@
1
+ /**
2
+ * 'github.*' endpoints — the collector's governed GitHub proxy
3
+ * (services/collector/server.js mounts routes/github-proxy.js at /github,
4
+ * user-authed + github plugin entitlement; credentials resolve from the
5
+ * org vault server-side, never client-side).
6
+ *
7
+ * First fragment added for quox#478 (gripe --yes deterministic fallback).
8
+ * The full `quox github` command group is tracked separately (quox#566).
9
+ *
10
+ * See cli/lib/api/endpoints/index.js for the fragment convention.
11
+ */
12
+
13
+ export const github = {
14
+ 'github.issue.create': {
15
+ method: 'POST',
16
+ service: 'collector',
17
+ path: () => `/github/issues`,
18
+ },
19
+ };
20
+
21
+ export default github;
@@ -0,0 +1,43 @@
1
+ /**
2
+ * 'governance.*' endpoints — OPGOV quox#582: the governance compiler's
3
+ * draft-review-arm flow on the collector. Compile is deterministic
4
+ * (lib/governance/ruleCompiler.js); arming requires a logged-in human, so a
5
+ * service-key session can compile and list but never arm. Enforcement is
6
+ * phase 3 and NOT wired yet; nothing here claims otherwise.
7
+ *
8
+ * See cli/lib/api/endpoints/index.js for the fragment convention.
9
+ */
10
+
11
+ export const governance = {
12
+ // Pre-existing incident endpoints (from the monolithic endpoints.js split).
13
+ 'governance.incidents.get': {
14
+ method: 'GET',
15
+ service: 'collector',
16
+ path: ({ id }) => `/governance/incidents/${id}`,
17
+ tags: ['live-safe'],
18
+ },
19
+ 'governance.incidents.list': {
20
+ method: 'GET',
21
+ service: 'collector',
22
+ path: () => `/governance/incidents`,
23
+ tags: ['live-safe'],
24
+ },
25
+ 'governance.policy.compile': {
26
+ method: 'POST',
27
+ service: 'collector',
28
+ path: (p) => `/orgs/${p.orgId}/governance/policies/compile`,
29
+ },
30
+ 'governance.policy.list': {
31
+ method: 'GET',
32
+ service: 'collector',
33
+ path: (p) => `/orgs/${p.orgId}/governance/policies${p.state ? `?state=${encodeURIComponent(p.state)}` : ''}`,
34
+ tags: ['live-safe'],
35
+ },
36
+ 'governance.policy.arm': {
37
+ method: 'POST',
38
+ service: 'collector',
39
+ path: (p) => `/orgs/${p.orgId}/governance/policies/${p.id}/arm`,
40
+ },
41
+ };
42
+
43
+ export default governance;
@@ -0,0 +1,36 @@
1
+ /**
2
+ * 'hat.*' endpoints (QUOXHAT #721 b): read-only views of the org's hats.
3
+ * See cli/lib/api/endpoints/index.js for aggregation + the fragment convention.
4
+ *
5
+ * Backend: services/auth/routes/quoxhat.js, mounted at plain `/api` on the
6
+ * auth service; every route applies requireAuth + requireOrgMembership.
7
+ * The collector holds only the /internal service-key hat routes, so the
8
+ * user-facing reads live on auth (same as the dashboard's quoxhatClient).
9
+ *
10
+ * - list returns `{ hats: [...hat with definition], settings }`; listing
11
+ * also lazily installs/upgrades built-in templates (audited).
12
+ * - get returns `{ hat, enforcement }`; `hat.revisions` is the history and
13
+ * `?revision=n` swaps in that revision's definition (`hat.revision_shown`).
14
+ */
15
+
16
+ export const hat = {
17
+ 'hat.list': {
18
+ method: 'GET',
19
+ service: 'auth',
20
+ path: ({ orgId }) => `/api/orgs/${orgId}/quoxhat/hats`,
21
+ tags: ['live-safe'],
22
+ },
23
+ 'hat.get': {
24
+ method: 'GET',
25
+ service: 'auth',
26
+ path: ({ orgId, hatId }) => `/api/orgs/${orgId}/quoxhat/hats/${encodeURIComponent(hatId)}`,
27
+ tags: ['live-safe'],
28
+ },
29
+ // Audited reset of an org-edited built-in hat back to its current template
30
+ // (needs org manage-settings); writes quoxhat.hat.reset_to_template.
31
+ 'hat.reset': {
32
+ method: 'POST',
33
+ service: 'auth',
34
+ path: ({ orgId, hatId }) => `/api/orgs/${orgId}/quoxhat/hats/${encodeURIComponent(hatId)}/reset-to-template`,
35
+ },
36
+ };
@@ -0,0 +1,32 @@
1
+ /**
2
+ * 'inbox.*' endpoints — extracted from the former monolithic
3
+ * cli/lib/api/endpoints.js as part of the per-domain fragment split.
4
+ * See cli/lib/api/endpoints/index.js for aggregation + the fragment convention.
5
+ */
6
+
7
+ export const inbox = {
8
+ 'inbox.get': {
9
+ method: 'GET',
10
+ service: 'auth',
11
+ path: ({ orgId, itemId }) => `/api/orgs/${orgId}/inbox/${itemId}`,
12
+ tags: ['live-safe'],
13
+ },
14
+ 'inbox.list': {
15
+ method: 'GET',
16
+ service: 'auth',
17
+ path: ({ orgId }) => `/api/orgs/${orgId}/inbox`,
18
+ tags: ['live-safe'],
19
+ },
20
+ 'inbox.respond': {
21
+ method: 'POST',
22
+ service: 'auth',
23
+ path: ({ orgId, itemId }) => `/api/orgs/${orgId}/inbox/${itemId}/respond`,
24
+ tags: ['live-write'],
25
+ },
26
+ 'inbox.stats.list': {
27
+ method: 'GET',
28
+ service: 'auth',
29
+ path: ({ orgId }) => `/api/orgs/${orgId}/inbox/stats`,
30
+ tags: ['live-safe'],
31
+ },
32
+ };
@@ -0,0 +1,120 @@
1
+ /**
2
+ * 'inboxq.*' endpoints — InboxQ (governed email-management plugin), proxied
3
+ * through the collector (services/collector/server.js:
4
+ * /api/v1/inboxq/* -> InboxQ routes, org resolved server-side from auth).
5
+ * No org segment in the URL — same shape as `quoxplan.*`/`quoxbox.*`.
6
+ *
7
+ * See cli/lib/api/endpoints/index.js for the fragment convention.
8
+ */
9
+
10
+ export const inboxq = {
11
+ 'inboxq.accounts.list': {
12
+ method: 'GET',
13
+ service: 'collector',
14
+ path: () => `/api/v1/inboxq/accounts`,
15
+ tags: ['live-safe'],
16
+ },
17
+ 'inboxq.accounts.create': {
18
+ method: 'POST',
19
+ service: 'collector',
20
+ path: () => `/api/v1/inboxq/accounts`,
21
+ tags: ['live-write'],
22
+ },
23
+ 'inboxq.accounts.delete': {
24
+ method: 'DELETE',
25
+ service: 'collector',
26
+ path: ({ accountId }) => `/api/v1/inboxq/accounts/${accountId}`,
27
+ tags: ['live-write'],
28
+ },
29
+ 'inboxq.messages.get': {
30
+ method: 'GET',
31
+ service: 'collector',
32
+ path: ({ id }) => `/api/v1/inboxq/messages/${encodeURIComponent(id)}`,
33
+ tags: ['live-safe'],
34
+ },
35
+ 'inboxq.messages.fetchBody': {
36
+ method: 'POST',
37
+ service: 'collector',
38
+ path: ({ id }) => `/api/v1/inboxq/messages/${encodeURIComponent(id)}/fetch-body`,
39
+ tags: ['live-write'],
40
+ },
41
+ 'inboxq.messages.list': {
42
+ method: 'GET',
43
+ service: 'collector',
44
+ path: () => `/api/v1/inboxq/messages`,
45
+ tags: ['live-safe'],
46
+ },
47
+ 'inboxq.zones.get': {
48
+ method: 'GET',
49
+ service: 'collector',
50
+ path: () => `/api/v1/inboxq/zones`,
51
+ tags: ['live-safe'],
52
+ },
53
+ // AQ-9E U2: reversible moves
54
+ 'inboxq.moves.recent': {
55
+ method: 'GET',
56
+ service: 'collector',
57
+ path: () => `/api/v1/inboxq/moves/recent`,
58
+ tags: ['live-safe'],
59
+ },
60
+ 'inboxq.moves.undo': {
61
+ method: 'POST',
62
+ service: 'collector',
63
+ path: () => `/api/v1/inboxq/moves/undo`,
64
+ tags: ['live-write'],
65
+ },
66
+ 'inboxq.sync': {
67
+ method: 'POST',
68
+ service: 'collector',
69
+ path: () => `/api/v1/inboxq/sync`,
70
+ tags: ['live-write'],
71
+ },
72
+ 'inboxq.report.generate': {
73
+ method: 'POST',
74
+ service: 'collector',
75
+ path: () => `/api/v1/inboxq/report/generate`,
76
+ tags: ['live-write'],
77
+ },
78
+ 'inboxq.report.latest': {
79
+ method: 'GET',
80
+ service: 'collector',
81
+ path: () => `/api/v1/inboxq/report/latest`,
82
+ tags: ['live-safe'],
83
+ },
84
+ 'inboxq.watches.list': {
85
+ method: 'GET',
86
+ service: 'collector',
87
+ path: () => `/api/v1/inboxq/watches`,
88
+ tags: ['live-safe'],
89
+ },
90
+ 'inboxq.watches.create': {
91
+ method: 'POST',
92
+ service: 'collector',
93
+ path: () => `/api/v1/inboxq/watches`,
94
+ tags: ['live-write'],
95
+ },
96
+ 'inboxq.watches.active': {
97
+ method: 'POST',
98
+ service: 'collector',
99
+ path: ({ watchId }) => `/api/v1/inboxq/watches/${watchId}/active`,
100
+ tags: ['live-write'],
101
+ },
102
+ 'inboxq.proposals.list': {
103
+ method: 'GET',
104
+ service: 'collector',
105
+ path: () => `/api/v1/inboxq/proposals`,
106
+ tags: ['live-safe'],
107
+ },
108
+ 'inboxq.proposals.create': {
109
+ method: 'POST',
110
+ service: 'collector',
111
+ path: () => `/api/v1/inboxq/proposals`,
112
+ tags: ['live-write'],
113
+ },
114
+ 'inboxq.proposals.resolve': {
115
+ method: 'POST',
116
+ service: 'collector',
117
+ path: ({ proposalId }) => `/api/v1/inboxq/proposals/${proposalId}/resolve`,
118
+ tags: ['live-write'],
119
+ },
120
+ };