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.
- package/LICENSE +35 -0
- package/README.md +142 -2
- package/bin/quox.js +292 -0
- package/bin/quoxon.js +8 -0
- package/lib/api/endpoints/admin.js +125 -0
- package/lib/api/endpoints/aee.js +38 -0
- package/lib/api/endpoints/agent-attach.js +126 -0
- package/lib/api/endpoints/agents.js +56 -0
- package/lib/api/endpoints/assistants.js +50 -0
- package/lib/api/endpoints/audit.js +14 -0
- package/lib/api/endpoints/auth.js +50 -0
- package/lib/api/endpoints/awareness.js +34 -0
- package/lib/api/endpoints/backup-schedules.js +20 -0
- package/lib/api/endpoints/backups.js +86 -0
- package/lib/api/endpoints/brain.js +140 -0
- package/lib/api/endpoints/budgets.js +62 -0
- package/lib/api/endpoints/calendarq.js +71 -0
- package/lib/api/endpoints/catalog.js +14 -0
- package/lib/api/endpoints/chat.js +54 -0
- package/lib/api/endpoints/consent.js +26 -0
- package/lib/api/endpoints/contactsq.js +66 -0
- package/lib/api/endpoints/conversations.js +32 -0
- package/lib/api/endpoints/custom-roles.js +92 -0
- package/lib/api/endpoints/divisions.js +56 -0
- package/lib/api/endpoints/domains.js +38 -0
- package/lib/api/endpoints/engagement.js +231 -0
- package/lib/api/endpoints/engine.js +11 -0
- package/lib/api/endpoints/entity.js +50 -0
- package/lib/api/endpoints/executions.js +32 -0
- package/lib/api/endpoints/file.js +20 -0
- package/lib/api/endpoints/files.js +26 -0
- package/lib/api/endpoints/github.js +21 -0
- package/lib/api/endpoints/governance.js +43 -0
- package/lib/api/endpoints/hat.js +36 -0
- package/lib/api/endpoints/inbox.js +32 -0
- package/lib/api/endpoints/inboxq.js +120 -0
- package/lib/api/endpoints/index.js +228 -0
- package/lib/api/endpoints/invites.js +19 -0
- package/lib/api/endpoints/llm-policy.js +43 -0
- package/lib/api/endpoints/lucid.js +89 -0
- package/lib/api/endpoints/members.js +32 -0
- package/lib/api/endpoints/memory.js +75 -0
- package/lib/api/endpoints/mfa.js +32 -0
- package/lib/api/endpoints/mon.js +178 -0
- package/lib/api/endpoints/notesq.js +43 -0
- package/lib/api/endpoints/objectives.js +62 -0
- package/lib/api/endpoints/orgs.js +38 -0
- package/lib/api/endpoints/plugins.js +134 -0
- package/lib/api/endpoints/powers.js +75 -0
- package/lib/api/endpoints/prompts.js +69 -0
- package/lib/api/endpoints/qlarity.js +122 -0
- package/lib/api/endpoints/quoxbox.js +55 -0
- package/lib/api/endpoints/quoxchat.js +54 -0
- package/lib/api/endpoints/quoxflow.js +32 -0
- package/lib/api/endpoints/quoxplan.js +114 -0
- package/lib/api/endpoints/quoxseo.js +108 -0
- package/lib/api/endpoints/reach.js +47 -0
- package/lib/api/endpoints/runs.js +38 -0
- package/lib/api/endpoints/safety.js +46 -0
- package/lib/api/endpoints/scim.js +46 -0
- package/lib/api/endpoints/scopes.js +14 -0
- package/lib/api/endpoints/security.js +69 -0
- package/lib/api/endpoints/setup.js +90 -0
- package/lib/api/endpoints/skills.js +180 -0
- package/lib/api/endpoints/sso.js +67 -0
- package/lib/api/endpoints/tags.js +32 -0
- package/lib/api/endpoints/teams.js +56 -0
- package/lib/api/endpoints/telephony.js +46 -0
- package/lib/api/endpoints/tg.js +56 -0
- package/lib/api/endpoints/tools.js +50 -0
- package/lib/api/endpoints/traces.js +157 -0
- package/lib/api/endpoints/triggers.js +70 -0
- package/lib/api/endpoints/user-library.js +41 -0
- package/lib/api/endpoints/users.js +20 -0
- package/lib/api/endpoints/v1.js +499 -0
- package/lib/api/endpoints/vault.js +192 -0
- package/lib/api/endpoints/voice.js +22 -0
- package/lib/api/endpoints/volt.js +84 -0
- package/lib/api/endpoints/ward.js +40 -0
- package/lib/api/endpoints/webhooks.js +46 -0
- package/lib/api/endpoints/workflows.js +162 -0
- package/lib/api/endpoints/x.js +24 -0
- package/lib/api/endpoints.js +15 -0
- package/lib/commands/admin.js +359 -0
- package/lib/commands/aee.js +99 -0
- package/lib/commands/agent.js +201 -0
- package/lib/commands/agentAttach.js +1440 -0
- package/lib/commands/approvals.js +47 -0
- package/lib/commands/assistant.js +114 -0
- package/lib/commands/auth.js +458 -0
- package/lib/commands/awareness.js +88 -0
- package/lib/commands/backup.js +373 -0
- package/lib/commands/brain.js +994 -0
- package/lib/commands/budget.js +241 -0
- package/lib/commands/build.js +156 -0
- package/lib/commands/calendar.js +216 -0
- package/lib/commands/capabilities.js +34 -0
- package/lib/commands/chat.js +240 -0
- package/lib/commands/claude.js +354 -0
- package/lib/commands/config-cmd.js +106 -0
- package/lib/commands/consent.js +84 -0
- package/lib/commands/contacts.js +967 -0
- package/lib/commands/contactsSelftest.js +132 -0
- package/lib/commands/conversation.js +74 -0
- package/lib/commands/department.js +75 -0
- package/lib/commands/dev.js +620 -0
- package/lib/commands/devResident.js +314 -0
- package/lib/commands/devSupervisor.js +1050 -0
- package/lib/commands/discord.js +96 -0
- package/lib/commands/doctor.js +181 -0
- package/lib/commands/domain.js +114 -0
- package/lib/commands/done.js +277 -0
- package/lib/commands/engagement.js +586 -0
- package/lib/commands/entity.js +119 -0
- package/lib/commands/facebook.js +212 -0
- package/lib/commands/file.js +128 -0
- package/lib/commands/fleet.js +882 -0
- package/lib/commands/governance.js +638 -0
- package/lib/commands/gripe.js +324 -0
- package/lib/commands/hat.js +205 -0
- package/lib/commands/helpers.js +79 -0
- package/lib/commands/inbox.js +122 -0
- package/lib/commands/instagram.js +264 -0
- package/lib/commands/integration.js +100 -0
- package/lib/commands/inventory.js +115 -0
- package/lib/commands/invites.js +45 -0
- package/lib/commands/licence.js +280 -0
- package/lib/commands/linkedin.js +178 -0
- package/lib/commands/llm-policy.js +117 -0
- package/lib/commands/llm.js +45 -0
- package/lib/commands/lucid.js +591 -0
- package/lib/commands/mail.js +531 -0
- package/lib/commands/memory.js +284 -0
- package/lib/commands/mon.js +514 -0
- package/lib/commands/monitoring.js +86 -0
- package/lib/commands/motion.js +22 -0
- package/lib/commands/notes.js +1246 -0
- package/lib/commands/notesBatch.js +160 -0
- package/lib/commands/notesBridges.js +56 -0
- package/lib/commands/notesLinks.js +60 -0
- package/lib/commands/notification.js +57 -0
- package/lib/commands/nucleus.js +92 -0
- package/lib/commands/objective.js +229 -0
- package/lib/commands/onboard.js +328 -0
- package/lib/commands/open.js +56 -0
- package/lib/commands/org.js +266 -0
- package/lib/commands/plan.js +906 -0
- package/lib/commands/plugin-doctor.js +1091 -0
- package/lib/commands/plugin.js +539 -0
- package/lib/commands/policy.js +78 -0
- package/lib/commands/powers.js +296 -0
- package/lib/commands/prompt.js +350 -0
- package/lib/commands/qlarity.js +690 -0
- package/lib/commands/quoxbox.js +270 -0
- package/lib/commands/quoxchat.js +266 -0
- package/lib/commands/quoxseo.js +340 -0
- package/lib/commands/reach.js +158 -0
- package/lib/commands/role.js +286 -0
- package/lib/commands/run.js +132 -0
- package/lib/commands/safety.js +107 -0
- package/lib/commands/scim.js +88 -0
- package/lib/commands/scope.js +58 -0
- package/lib/commands/security.js +157 -0
- package/lib/commands/service.js +89 -0
- package/lib/commands/settings.js +99 -0
- package/lib/commands/setup.js +543 -0
- package/lib/commands/skillManifest.js +113 -0
- package/lib/commands/skillRightsFormat.js +38 -0
- package/lib/commands/skills.js +644 -0
- package/lib/commands/slot.js +1198 -0
- package/lib/commands/sso.js +229 -0
- package/lib/commands/status.js +137 -0
- package/lib/commands/tag.js +91 -0
- package/lib/commands/team.js +140 -0
- package/lib/commands/tg.js +240 -0
- package/lib/commands/tiktok.js +218 -0
- package/lib/commands/tool.js +216 -0
- package/lib/commands/trace.js +525 -0
- package/lib/commands/trigger.js +128 -0
- package/lib/commands/vault.js +1424 -0
- package/lib/commands/voice.js +182 -0
- package/lib/commands/volt.js +528 -0
- package/lib/commands/watch.js +115 -0
- package/lib/commands/webhook.js +137 -0
- package/lib/commands/workflow.js +503 -0
- package/lib/commands/x.js +439 -0
- package/lib/core/actingAs.js +136 -0
- package/lib/core/aee.js +53 -0
- package/lib/core/agentAlias.js +163 -0
- package/lib/core/approvalContext.js +61 -0
- package/lib/core/auth.js +350 -0
- package/lib/core/banner.js +143 -0
- package/lib/core/brainPrime.js +90 -0
- package/lib/core/callerSource.js +129 -0
- package/lib/core/claudeLs.js +94 -0
- package/lib/core/client.js +584 -0
- package/lib/core/completions.js +163 -0
- package/lib/core/config.js +551 -0
- package/lib/core/confirm.js +37 -0
- package/lib/core/deeplinks.js +76 -0
- package/lib/core/doneEngineFetch.js +219 -0
- package/lib/core/errors.js +132 -0
- package/lib/core/global-flags.js +90 -0
- package/lib/core/governedSession.js +402 -0
- package/lib/core/lazyCommands.js +119 -0
- package/lib/core/liveSessionsReport.js +112 -0
- package/lib/core/org-override.js +52 -0
- package/lib/core/output.js +239 -0
- package/lib/core/prodEnv.js +7 -0
- package/lib/core/quoxglyph.js +158 -0
- package/lib/core/residentAlarm.js +282 -0
- package/lib/core/residentAuth.js +243 -0
- package/lib/core/residentPump.js +229 -0
- package/lib/core/residentSeed.js +104 -0
- package/lib/core/sessionHeartbeat.js +192 -0
- package/lib/core/sessionsOverview.js +160 -0
- package/lib/core/slotKeeper.js +282 -0
- package/lib/core/supervisorEngine.js +864 -0
- package/lib/core/systemdInstaller.js +256 -0
- package/lib/core/version.js +87 -0
- package/lib/core/websiteSession.js +148 -0
- package/lib/lucid/LucidIntro.jsx +105 -0
- package/lib/lucid/blind.js +71 -0
- package/lib/lucid/deck.js +32 -0
- package/lib/lucid/fmt.js +139 -0
- package/lib/lucid/sitrep.js +173 -0
- package/lib/plugins/loader.js +93 -0
- package/lib/quoxon/activity.js +104 -0
- package/lib/quoxon/api.js +473 -0
- package/lib/quoxon/app.js +1262 -0
- package/lib/quoxon/capabilities.js +75 -0
- package/lib/quoxon/commands.js +154 -0
- package/lib/quoxon/connect.js +467 -0
- package/lib/quoxon/connectCard.js +28 -0
- package/lib/quoxon/context.js +68 -0
- package/lib/quoxon/copy.js +33 -0
- package/lib/quoxon/demo.fixtures.js +24 -0
- package/lib/quoxon/demo.js +35 -0
- package/lib/quoxon/egg.js +36 -0
- package/lib/quoxon/events.js +458 -0
- package/lib/quoxon/gallery.js +223 -0
- package/lib/quoxon/indicator.js +193 -0
- package/lib/quoxon/intent.js +41 -0
- package/lib/quoxon/keys.js +121 -0
- package/lib/quoxon/main.js +244 -0
- package/lib/quoxon/markdown.js +317 -0
- package/lib/quoxon/model.js +205 -0
- package/lib/quoxon/motion/clock.js +69 -0
- package/lib/quoxon/motion/color.js +35 -0
- package/lib/quoxon/motion/frame.js +14 -0
- package/lib/quoxon/motion/reveal.js +54 -0
- package/lib/quoxon/motion/ring.js +79 -0
- package/lib/quoxon/objects/agent.js +61 -0
- package/lib/quoxon/objects/crystal.js +100 -0
- package/lib/quoxon/objects/fetch.js +170 -0
- package/lib/quoxon/objects/index.js +85 -0
- package/lib/quoxon/objects/ladder.js +71 -0
- package/lib/quoxon/objects/memory.js +44 -0
- package/lib/quoxon/objects/model.js +118 -0
- package/lib/quoxon/objects/proof.js +110 -0
- package/lib/quoxon/objects/skill.js +105 -0
- package/lib/quoxon/objects/view.js +76 -0
- package/lib/quoxon/objects/workflow.js +119 -0
- package/lib/quoxon/observers.js +42 -0
- package/lib/quoxon/onboarding/copy.js +235 -0
- package/lib/quoxon/onboarding/credential.js +95 -0
- package/lib/quoxon/onboarding/detect.js +22 -0
- package/lib/quoxon/onboarding/finish.js +119 -0
- package/lib/quoxon/onboarding/index.js +67 -0
- package/lib/quoxon/onboarding/installRunner.js +225 -0
- package/lib/quoxon/onboarding/intent.js +53 -0
- package/lib/quoxon/onboarding/journey.js +73 -0
- package/lib/quoxon/onboarding/preflight.js +142 -0
- package/lib/quoxon/onboarding/runner.js +58 -0
- package/lib/quoxon/onboarding/view.js +625 -0
- package/lib/quoxon/print.js +94 -0
- package/lib/quoxon/qart.js +379 -0
- package/lib/quoxon/qglyph.js +143 -0
- package/lib/quoxon/qhello.js +58 -0
- package/lib/quoxon/qmotion.js +111 -0
- package/lib/quoxon/render.js +648 -0
- package/lib/quoxon/roster.js +221 -0
- package/lib/quoxon/route.js +38 -0
- package/lib/quoxon/rules.js +130 -0
- package/lib/quoxon/session.js +68 -0
- package/lib/quoxon/skills.js +30 -0
- package/lib/quoxon/slash/compact.js +90 -0
- package/lib/quoxon/slash/ledger.js +83 -0
- package/lib/quoxon/slash/listView.js +28 -0
- package/lib/quoxon/slash/palette.js +104 -0
- package/lib/quoxon/slash/paletteController.js +59 -0
- package/lib/quoxon/slash/panels.js +101 -0
- package/lib/quoxon/slash/picker.js +38 -0
- package/lib/quoxon/slash/restart.js +144 -0
- package/lib/quoxon/slash/resume.js +59 -0
- package/lib/quoxon/slash/settings.js +50 -0
- package/lib/quoxon/sound/index.js +186 -0
- package/lib/quoxon/sound/mapping.js +119 -0
- package/lib/quoxon/sound/output.js +52 -0
- package/lib/quoxon/sound/synth.js +122 -0
- package/lib/quoxon/term.js +106 -0
- package/lib/quoxon/textBuffer.js +242 -0
- package/lib/quoxon/theme.js +253 -0
- package/lib/quoxon/transcript.js +150 -0
- package/lib/quoxon/web/qface.js +81 -0
- package/lib/quoxon/welcome.js +52 -0
- package/lib/tui/app.jsx +289 -0
- package/lib/tui/components/Breadcrumb.jsx +42 -0
- package/lib/tui/components/ChatInput.jsx +68 -0
- package/lib/tui/components/Confirm.jsx +32 -0
- package/lib/tui/components/DataTable.jsx +270 -0
- package/lib/tui/components/DetailPanel.jsx +241 -0
- package/lib/tui/components/HelpOverlay.jsx +67 -0
- package/lib/tui/components/Layout.jsx +129 -0
- package/lib/tui/components/Palette.jsx +141 -0
- package/lib/tui/components/SearchInput.jsx +125 -0
- package/lib/tui/components/Sparkline.jsx +55 -0
- package/lib/tui/components/StatusBar.jsx +133 -0
- package/lib/tui/components/Toast.jsx +52 -0
- package/lib/tui/hooks/useApi.js +44 -0
- package/lib/tui/hooks/useHealth.js +90 -0
- package/lib/tui/hooks/usePolledApi.js +86 -0
- package/lib/tui/hooks/useTerminalSize.js +46 -0
- package/lib/tui/index.js +56 -0
- package/lib/tui/intro/Intro.jsx +332 -0
- package/lib/tui/jsx-loader.js +32 -0
- package/lib/tui/keys.js +87 -0
- package/lib/tui/registry.js +49 -0
- package/lib/tui/theme.js +103 -0
- package/lib/tui/views/AdminView.jsx +398 -0
- package/lib/tui/views/AgentView.jsx +204 -0
- package/lib/tui/views/BackupView.jsx +225 -0
- package/lib/tui/views/BrainView.jsx +223 -0
- package/lib/tui/views/ChatView.jsx +468 -0
- package/lib/tui/views/FilesView.jsx +218 -0
- package/lib/tui/views/FleetView.jsx +234 -0
- package/lib/tui/views/GovernanceView.jsx +453 -0
- package/lib/tui/views/HealthView.jsx +216 -0
- package/lib/tui/views/InboxView.jsx +228 -0
- package/lib/tui/views/LucidDeck.jsx +727 -0
- package/lib/tui/views/MainMenu.jsx +123 -0
- package/lib/tui/views/MemoryView.jsx +377 -0
- package/lib/tui/views/ObjectivesView.jsx +230 -0
- package/lib/tui/views/OrgView.jsx +229 -0
- package/lib/tui/views/ToolView.jsx +221 -0
- package/lib/tui/views/VaultView.jsx +422 -0
- package/lib/tui/views/WorkflowView.jsx +329 -0
- package/package.json +72 -4
|
@@ -0,0 +1,122 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* 'qlarity.*' endpoints — Qlarity, governed browser inspection for dev servers
|
|
3
|
+
* (DEVSUITE-CLARIFY). Proxied through the collector
|
|
4
|
+
* (services/collector/server.js: app.all('/api/v1/qlarity/*', ...) rewrites to
|
|
5
|
+
* QLARITY_URL/api/v1/*, port 3109).
|
|
6
|
+
*
|
|
7
|
+
* Unlike the quoxplan proxy, this one is org-resolved and licence-gated from
|
|
8
|
+
* its first commit, so every call here can return 403 for an unlicensed org.
|
|
9
|
+
* That is the gate working, not a fault, and the command layer says so.
|
|
10
|
+
*
|
|
11
|
+
* See cli/lib/api/endpoints/index.js for the fragment convention.
|
|
12
|
+
*/
|
|
13
|
+
|
|
14
|
+
export const qlarity = {
|
|
15
|
+
'qlarity.health': {
|
|
16
|
+
method: 'GET',
|
|
17
|
+
service: 'collector',
|
|
18
|
+
path: () => `/api/v1/qlarity/health`,
|
|
19
|
+
tags: ['live-safe'],
|
|
20
|
+
},
|
|
21
|
+
'qlarity.inspectors.list': {
|
|
22
|
+
method: 'GET',
|
|
23
|
+
service: 'collector',
|
|
24
|
+
path: () => `/api/v1/qlarity/inspectors`,
|
|
25
|
+
tags: ['live-safe'],
|
|
26
|
+
},
|
|
27
|
+
// NO-ENV-ONLY-CONFIG: the per-ORG allowlist a customer can actually manage.
|
|
28
|
+
// Distinct from 'qlarity.allowlist' above, which reports the install-wide
|
|
29
|
+
// env-var list the operator set. These are collector-owned routes, not
|
|
30
|
+
// proxied to the QLarity service, hence the different path prefix.
|
|
31
|
+
'qlarity.orgAllowlist.list': {
|
|
32
|
+
method: 'GET',
|
|
33
|
+
service: 'collector',
|
|
34
|
+
path: () => `/api/v1/qlarity-allowlist`,
|
|
35
|
+
tags: ['live-safe'],
|
|
36
|
+
},
|
|
37
|
+
'qlarity.orgAllowlist.add': {
|
|
38
|
+
method: 'POST',
|
|
39
|
+
service: 'collector',
|
|
40
|
+
path: () => `/api/v1/qlarity-allowlist`,
|
|
41
|
+
},
|
|
42
|
+
'qlarity.orgAllowlist.remove': {
|
|
43
|
+
method: 'DELETE',
|
|
44
|
+
service: 'collector',
|
|
45
|
+
path: ({ origin }) => `/api/v1/qlarity-allowlist?origin=${encodeURIComponent(origin)}`,
|
|
46
|
+
},
|
|
47
|
+
'qlarity.allowlist': {
|
|
48
|
+
method: 'GET',
|
|
49
|
+
service: 'collector',
|
|
50
|
+
path: () => `/api/v1/qlarity/allowlist`,
|
|
51
|
+
tags: ['live-safe'],
|
|
52
|
+
},
|
|
53
|
+
'qlarity.sessions.list': {
|
|
54
|
+
method: 'GET',
|
|
55
|
+
service: 'collector',
|
|
56
|
+
path: () => `/api/v1/qlarity/sessions`,
|
|
57
|
+
tags: ['live-safe'],
|
|
58
|
+
},
|
|
59
|
+
'qlarity.session.create': {
|
|
60
|
+
method: 'POST',
|
|
61
|
+
service: 'collector',
|
|
62
|
+
path: () => `/api/v1/qlarity/sessions`,
|
|
63
|
+
},
|
|
64
|
+
'qlarity.session.close': {
|
|
65
|
+
method: 'DELETE',
|
|
66
|
+
service: 'collector',
|
|
67
|
+
path: (p) => `/api/v1/qlarity/sessions/${p.sessionId}`,
|
|
68
|
+
},
|
|
69
|
+
'qlarity.session.open': {
|
|
70
|
+
method: 'POST',
|
|
71
|
+
service: 'collector',
|
|
72
|
+
path: (p) => `/api/v1/qlarity/sessions/${p.sessionId}/open`,
|
|
73
|
+
},
|
|
74
|
+
'qlarity.session.inspect': {
|
|
75
|
+
method: 'POST',
|
|
76
|
+
service: 'collector',
|
|
77
|
+
path: (p) => `/api/v1/qlarity/sessions/${p.sessionId}/inspect`,
|
|
78
|
+
},
|
|
79
|
+
'qlarity.session.blocked': {
|
|
80
|
+
method: 'GET',
|
|
81
|
+
service: 'collector',
|
|
82
|
+
path: (p) => `/api/v1/qlarity/sessions/${p.sessionId}/blocked`,
|
|
83
|
+
tags: ['live-safe'],
|
|
84
|
+
},
|
|
85
|
+
'qlarity.session.console': {
|
|
86
|
+
method: 'GET',
|
|
87
|
+
service: 'collector',
|
|
88
|
+
path: (p) => `/api/v1/qlarity/sessions/${p.sessionId}/console`,
|
|
89
|
+
tags: ['live-safe'],
|
|
90
|
+
},
|
|
91
|
+
'qlarity.session.network': {
|
|
92
|
+
method: 'GET',
|
|
93
|
+
service: 'collector',
|
|
94
|
+
path: (p) => `/api/v1/qlarity/sessions/${p.sessionId}/network`,
|
|
95
|
+
tags: ['live-safe'],
|
|
96
|
+
},
|
|
97
|
+
'qlarity.session.screenshot': {
|
|
98
|
+
method: 'POST',
|
|
99
|
+
service: 'collector',
|
|
100
|
+
path: (p) => `/api/v1/qlarity/sessions/${p.sessionId}/screenshot`,
|
|
101
|
+
},
|
|
102
|
+
/** Always files an approval; never executes inline. */
|
|
103
|
+
'qlarity.session.eval': {
|
|
104
|
+
method: 'POST',
|
|
105
|
+
service: 'collector',
|
|
106
|
+
path: (p) => `/api/v1/qlarity/sessions/${p.sessionId}/eval`,
|
|
107
|
+
},
|
|
108
|
+
/**
|
|
109
|
+
* Governed authed-session bootstrap (issue #15). Body carries
|
|
110
|
+
* `credential_id` (a stored `browser_login` vault credential), never a raw
|
|
111
|
+
* password — the collector resolves it server-side and forwards the
|
|
112
|
+
* resolved fields to qlarity on the internal network only. See
|
|
113
|
+
* server.js's resolveQlarityLoginCredential.
|
|
114
|
+
*/
|
|
115
|
+
'qlarity.session.login': {
|
|
116
|
+
method: 'POST',
|
|
117
|
+
service: 'collector',
|
|
118
|
+
path: (p) => `/api/v1/qlarity/sessions/${p.sessionId}/login`,
|
|
119
|
+
},
|
|
120
|
+
};
|
|
121
|
+
|
|
122
|
+
export default qlarity;
|
|
@@ -0,0 +1,55 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* 'quoxbox.*' endpoints — QuoxBox governed Mac-mini agent gateway, proxied
|
|
3
|
+
* through the collector (services/collector/routes/quoxbox-proxy.js,
|
|
4
|
+
* mounted at /api/quoxbox). Collector-direct, no org segment in the URL —
|
|
5
|
+
* same shape as `traces.*`/`aee.*`/`mon.*`. requireAuth() is applied to
|
|
6
|
+
* every route server-side (org-scoped, no anonymous access), but the
|
|
7
|
+
* gateway itself (and its bearer token) never reach the browser/CLI.
|
|
8
|
+
*
|
|
9
|
+
* See cli/lib/api/endpoints/index.js for the fragment convention.
|
|
10
|
+
*/
|
|
11
|
+
|
|
12
|
+
export const quoxbox = {
|
|
13
|
+
'quoxbox.live': {
|
|
14
|
+
method: 'GET',
|
|
15
|
+
service: 'collector',
|
|
16
|
+
path: () => `/api/quoxbox/live`,
|
|
17
|
+
tags: ['live-safe'],
|
|
18
|
+
},
|
|
19
|
+
'quoxbox.workflows.list': {
|
|
20
|
+
method: 'GET',
|
|
21
|
+
service: 'collector',
|
|
22
|
+
path: () => `/api/quoxbox/workflows`,
|
|
23
|
+
tags: ['live-safe'],
|
|
24
|
+
},
|
|
25
|
+
'quoxbox.task.run': {
|
|
26
|
+
method: 'POST',
|
|
27
|
+
service: 'collector',
|
|
28
|
+
path: () => `/api/quoxbox/task/run`,
|
|
29
|
+
tags: ['live-write'],
|
|
30
|
+
},
|
|
31
|
+
'quoxbox.task.get': {
|
|
32
|
+
method: 'GET',
|
|
33
|
+
service: 'collector',
|
|
34
|
+
path: ({ taskId }) => `/api/quoxbox/task/${taskId}`,
|
|
35
|
+
tags: ['live-safe'],
|
|
36
|
+
},
|
|
37
|
+
'quoxbox.approve': {
|
|
38
|
+
method: 'POST',
|
|
39
|
+
service: 'collector',
|
|
40
|
+
path: ({ approvalId }) => `/api/quoxbox/approve/${approvalId}`,
|
|
41
|
+
tags: ['live-write'],
|
|
42
|
+
},
|
|
43
|
+
'quoxbox.deny': {
|
|
44
|
+
method: 'POST',
|
|
45
|
+
service: 'collector',
|
|
46
|
+
path: ({ approvalId }) => `/api/quoxbox/deny/${approvalId}`,
|
|
47
|
+
tags: ['live-write'],
|
|
48
|
+
},
|
|
49
|
+
'quoxbox.mode.set': {
|
|
50
|
+
method: 'POST',
|
|
51
|
+
service: 'collector',
|
|
52
|
+
path: () => `/api/quoxbox/mode`,
|
|
53
|
+
tags: ['live-write'],
|
|
54
|
+
},
|
|
55
|
+
};
|
|
@@ -0,0 +1,54 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* 'quoxchat.*' endpoints — QuoxChat website-widget management (auth service,
|
|
3
|
+
* services/auth/routes/widgets.js, mounted at plain `/api`, requireOrgMembership).
|
|
4
|
+
*
|
|
5
|
+
* Covers the QuoxChat Pro operator availability surface: `operator_online` and
|
|
6
|
+
* `office_hours_json` live on the widget row and are toggled via the widget
|
|
7
|
+
* PATCH route (plan-gated fields return 402 `plan_upgrade_required`).
|
|
8
|
+
*
|
|
9
|
+
* Live-support desk parity (QuoxChat Pro /live-support view): conversations
|
|
10
|
+
* list/transcript come from services/auth/routes/widgets.js; operator-reply
|
|
11
|
+
* comes from the separate org-authed router in
|
|
12
|
+
* services/auth/routes/internal-widget-matrix.js (widgetConversationOrgRouter,
|
|
13
|
+
* mounted at plain `/api` in server.js), which derives sender identity
|
|
14
|
+
* server-side and 409s when the conversation isn't `handed_off`.
|
|
15
|
+
*/
|
|
16
|
+
|
|
17
|
+
export const quoxchat = {
|
|
18
|
+
'quoxchat.widgets.get': {
|
|
19
|
+
method: 'GET',
|
|
20
|
+
service: 'auth',
|
|
21
|
+
path: ({ orgId, widgetId }) => `/api/orgs/${orgId}/widgets/${widgetId}`,
|
|
22
|
+
tags: ['live-safe'],
|
|
23
|
+
},
|
|
24
|
+
'quoxchat.widgets.list': {
|
|
25
|
+
method: 'GET',
|
|
26
|
+
service: 'auth',
|
|
27
|
+
path: ({ orgId }) => `/api/orgs/${orgId}/widgets`,
|
|
28
|
+
tags: ['live-safe'],
|
|
29
|
+
},
|
|
30
|
+
'quoxchat.widgets.update': {
|
|
31
|
+
method: 'PATCH',
|
|
32
|
+
service: 'auth',
|
|
33
|
+
path: ({ orgId, widgetId }) => `/api/orgs/${orgId}/widgets/${widgetId}`,
|
|
34
|
+
tags: ['live-write'],
|
|
35
|
+
},
|
|
36
|
+
'quoxchat.conversations.list': {
|
|
37
|
+
method: 'GET',
|
|
38
|
+
service: 'auth',
|
|
39
|
+
path: ({ orgId, widgetId }) => `/api/orgs/${orgId}/widgets/${widgetId}/conversations`,
|
|
40
|
+
tags: ['live-safe'],
|
|
41
|
+
},
|
|
42
|
+
'quoxchat.conversations.messages.list': {
|
|
43
|
+
method: 'GET',
|
|
44
|
+
service: 'auth',
|
|
45
|
+
path: ({ orgId, widgetId, conversationId }) => `/api/orgs/${orgId}/widgets/${widgetId}/conversations/${conversationId}/messages`,
|
|
46
|
+
tags: ['live-safe'],
|
|
47
|
+
},
|
|
48
|
+
'quoxchat.conversations.reply.create': {
|
|
49
|
+
method: 'POST',
|
|
50
|
+
service: 'auth',
|
|
51
|
+
path: ({ orgId, widgetId, conversationId }) => `/api/orgs/${orgId}/widgets/${widgetId}/conversations/${conversationId}/operator-reply`,
|
|
52
|
+
tags: ['live-write'],
|
|
53
|
+
},
|
|
54
|
+
};
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* 'quoxflow.*' 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 quoxflow = {
|
|
8
|
+
'quoxflow.evidence.list': {
|
|
9
|
+
method: 'GET',
|
|
10
|
+
service: 'collector',
|
|
11
|
+
path: () => `/quoxflow/evidence`,
|
|
12
|
+
tags: ['live-safe'],
|
|
13
|
+
},
|
|
14
|
+
'quoxflow.observations.list': {
|
|
15
|
+
method: 'GET',
|
|
16
|
+
service: 'collector',
|
|
17
|
+
path: () => `/quoxflow/observations`,
|
|
18
|
+
tags: ['live-safe'],
|
|
19
|
+
},
|
|
20
|
+
'quoxflow.skills.get': {
|
|
21
|
+
method: 'GET',
|
|
22
|
+
service: 'collector',
|
|
23
|
+
path: ({ id }) => `/quoxflow/skills/${id}`,
|
|
24
|
+
tags: ['live-safe'],
|
|
25
|
+
},
|
|
26
|
+
'quoxflow.skills.list': {
|
|
27
|
+
method: 'GET',
|
|
28
|
+
service: 'collector',
|
|
29
|
+
path: () => `/quoxflow/skills`,
|
|
30
|
+
tags: ['live-safe'],
|
|
31
|
+
},
|
|
32
|
+
};
|
|
@@ -0,0 +1,114 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* 'quoxplan.*' endpoints — QuoxPlan (the productised planning suite,
|
|
3
|
+
* STREAM_QUOXPLAN_PLAN.md), proxied through the collector
|
|
4
|
+
* (services/collector/server.js: app.all('/api/v1/quoxplan/*', ...) rewrites
|
|
5
|
+
* to QUOXPLAN_URL/api/v1/*, port 3107). Collector-direct, no org segment in
|
|
6
|
+
* the URL — same shape as `quoxbox.*`/`traces.*`/`aee.*`/`mon.*`: the proxy
|
|
7
|
+
* applies requireServiceOrUserAuth() server-side, no per-org scoping yet
|
|
8
|
+
* (QuoxPlan is dummy-data-only until the P5 multi-tenant phase).
|
|
9
|
+
*
|
|
10
|
+
* See cli/lib/api/endpoints/index.js for the fragment convention.
|
|
11
|
+
*/
|
|
12
|
+
|
|
13
|
+
export const quoxplan = {
|
|
14
|
+
'quoxplan.roadmaps.list': {
|
|
15
|
+
method: 'GET',
|
|
16
|
+
service: 'collector',
|
|
17
|
+
path: () => `/api/v1/quoxplan/roadmaps`,
|
|
18
|
+
tags: ['live-safe'],
|
|
19
|
+
},
|
|
20
|
+
// Roadmap-create primitive (ONBOARD step 0): there was no `roadmap create`
|
|
21
|
+
// verb, only list. The wizard needs a governed way to give a fresh tenant
|
|
22
|
+
// its own roadmap. Collector proxies POST /api/v1/quoxplan/roadmaps to the
|
|
23
|
+
// QuoxPlan server, same governed path as every other quoxplan.* entry.
|
|
24
|
+
'quoxplan.roadmaps.create': {
|
|
25
|
+
method: 'POST',
|
|
26
|
+
service: 'collector',
|
|
27
|
+
path: () => `/api/v1/quoxplan/roadmaps`,
|
|
28
|
+
tags: ['live-write'],
|
|
29
|
+
},
|
|
30
|
+
'quoxplan.roadmap.streams.list': {
|
|
31
|
+
method: 'GET',
|
|
32
|
+
service: 'collector',
|
|
33
|
+
path: ({ roadmapId }) => `/api/v1/quoxplan/roadmaps/${roadmapId}/streams`,
|
|
34
|
+
tags: ['live-safe'],
|
|
35
|
+
},
|
|
36
|
+
'quoxplan.roadmap.timeline.get': {
|
|
37
|
+
method: 'GET',
|
|
38
|
+
service: 'collector',
|
|
39
|
+
path: ({ roadmapId }) => `/api/v1/quoxplan/roadmaps/${roadmapId}/timeline`,
|
|
40
|
+
tags: ['live-safe'],
|
|
41
|
+
},
|
|
42
|
+
'quoxplan.roadmap.reprioritise': {
|
|
43
|
+
method: 'POST',
|
|
44
|
+
service: 'collector',
|
|
45
|
+
path: ({ roadmapId }) => `/api/v1/quoxplan/roadmaps/${roadmapId}/reprioritise`,
|
|
46
|
+
tags: ['live-write'],
|
|
47
|
+
},
|
|
48
|
+
'quoxplan.roadmap.streams.create': {
|
|
49
|
+
method: 'POST',
|
|
50
|
+
service: 'collector',
|
|
51
|
+
path: ({ roadmapId }) => `/api/v1/quoxplan/roadmaps/${roadmapId}/streams`,
|
|
52
|
+
tags: ['live-write'],
|
|
53
|
+
},
|
|
54
|
+
'quoxplan.roadmap.export.get': {
|
|
55
|
+
method: 'GET',
|
|
56
|
+
service: 'collector',
|
|
57
|
+
path: ({ roadmapId }) => `/api/v1/quoxplan/roadmaps/${roadmapId}/export`,
|
|
58
|
+
tags: ['live-safe'],
|
|
59
|
+
},
|
|
60
|
+
'quoxplan.stream.get': {
|
|
61
|
+
method: 'GET',
|
|
62
|
+
service: 'collector',
|
|
63
|
+
path: ({ id }) => `/api/v1/quoxplan/streams/${id}`,
|
|
64
|
+
tags: ['live-safe'],
|
|
65
|
+
},
|
|
66
|
+
'quoxplan.stream.update': {
|
|
67
|
+
method: 'PATCH',
|
|
68
|
+
service: 'collector',
|
|
69
|
+
path: ({ id }) => `/api/v1/quoxplan/streams/${id}`,
|
|
70
|
+
tags: ['live-write'],
|
|
71
|
+
},
|
|
72
|
+
'quoxplan.stream.rename': {
|
|
73
|
+
method: 'POST',
|
|
74
|
+
service: 'collector',
|
|
75
|
+
path: ({ id }) => `/api/v1/quoxplan/streams/${id}/rename`,
|
|
76
|
+
tags: ['live-write'],
|
|
77
|
+
},
|
|
78
|
+
'quoxplan.stream.notes.create': {
|
|
79
|
+
method: 'POST',
|
|
80
|
+
service: 'collector',
|
|
81
|
+
path: ({ id }) => `/api/v1/quoxplan/streams/${id}/notes`,
|
|
82
|
+
tags: ['live-write'],
|
|
83
|
+
},
|
|
84
|
+
'quoxplan.stream.phases.create': {
|
|
85
|
+
method: 'POST',
|
|
86
|
+
service: 'collector',
|
|
87
|
+
path: ({ id }) => `/api/v1/quoxplan/streams/${id}/phases`,
|
|
88
|
+
tags: ['live-write'],
|
|
89
|
+
},
|
|
90
|
+
'quoxplan.phase.update': {
|
|
91
|
+
method: 'PATCH',
|
|
92
|
+
service: 'collector',
|
|
93
|
+
path: ({ phaseId }) => `/api/v1/quoxplan/phases/${phaseId}`,
|
|
94
|
+
tags: ['live-write'],
|
|
95
|
+
},
|
|
96
|
+
'quoxplan.phase.delete': {
|
|
97
|
+
method: 'DELETE',
|
|
98
|
+
service: 'collector',
|
|
99
|
+
path: ({ phaseId }) => `/api/v1/quoxplan/phases/${phaseId}`,
|
|
100
|
+
tags: ['live-write'],
|
|
101
|
+
},
|
|
102
|
+
'quoxplan.stream.plan.put': {
|
|
103
|
+
method: 'PUT',
|
|
104
|
+
service: 'collector',
|
|
105
|
+
path: ({ id }) => `/api/v1/quoxplan/streams/${id}/plan`,
|
|
106
|
+
tags: ['live-write'],
|
|
107
|
+
},
|
|
108
|
+
'quoxplan.stream.plan.versions.list': {
|
|
109
|
+
method: 'GET',
|
|
110
|
+
service: 'collector',
|
|
111
|
+
path: ({ id }) => `/api/v1/quoxplan/streams/${id}/plan/versions`,
|
|
112
|
+
tags: ['live-safe'],
|
|
113
|
+
},
|
|
114
|
+
};
|
|
@@ -0,0 +1,108 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* 'quoxseo.*' endpoints — QuoxSEO, the witnessed SEO warehouse (QUOXSEO S2).
|
|
3
|
+
* Proxied through the collector (services/collector/server.js:
|
|
4
|
+
* app.all('/api/v1/quoxseo/*', ...) rewrites to QUOXSEO_URL/api/v1/*, port
|
|
5
|
+
* 3110, repo quoxai/quox-seo). Entitlement-gated from the first commit; a
|
|
6
|
+
* 403 is the licence gate working. The surface is read-only by design bar
|
|
7
|
+
* ONE governed mutation, site registration (quox#583): ingest and witnessing
|
|
8
|
+
* run on a server-side timer, never through HTTP.
|
|
9
|
+
*
|
|
10
|
+
* See cli/lib/api/endpoints/index.js for the fragment convention.
|
|
11
|
+
*/
|
|
12
|
+
|
|
13
|
+
export const quoxseo = {
|
|
14
|
+
'quoxseo.health': {
|
|
15
|
+
method: 'GET',
|
|
16
|
+
service: 'collector',
|
|
17
|
+
path: () => `/api/v1/quoxseo/health`,
|
|
18
|
+
tags: ['live-safe'],
|
|
19
|
+
},
|
|
20
|
+
'quoxseo.summary': {
|
|
21
|
+
method: 'GET',
|
|
22
|
+
service: 'collector',
|
|
23
|
+
path: () => `/api/v1/quoxseo/summary`,
|
|
24
|
+
tags: ['live-safe'],
|
|
25
|
+
},
|
|
26
|
+
'quoxseo.urls': {
|
|
27
|
+
method: 'GET',
|
|
28
|
+
service: 'collector',
|
|
29
|
+
path: ({ query = '' }) => `/api/v1/quoxseo/urls${query}`,
|
|
30
|
+
tags: ['live-safe'],
|
|
31
|
+
},
|
|
32
|
+
'quoxseo.url.detail': {
|
|
33
|
+
method: 'GET',
|
|
34
|
+
service: 'collector',
|
|
35
|
+
path: ({ path: urlPath }) => `/api/v1/quoxseo/urls/detail?path=${encodeURIComponent(urlPath)}`,
|
|
36
|
+
tags: ['live-safe'],
|
|
37
|
+
},
|
|
38
|
+
'quoxseo.crawls': {
|
|
39
|
+
method: 'GET',
|
|
40
|
+
service: 'collector',
|
|
41
|
+
path: () => `/api/v1/quoxseo/crawls`,
|
|
42
|
+
tags: ['live-safe'],
|
|
43
|
+
},
|
|
44
|
+
'quoxseo.changes': {
|
|
45
|
+
method: 'GET',
|
|
46
|
+
service: 'collector',
|
|
47
|
+
path: ({ query = '' }) => `/api/v1/quoxseo/changes${query}`,
|
|
48
|
+
tags: ['live-safe'],
|
|
49
|
+
},
|
|
50
|
+
'quoxseo.verify': {
|
|
51
|
+
method: 'GET',
|
|
52
|
+
service: 'collector',
|
|
53
|
+
path: () => `/api/v1/quoxseo/verify`,
|
|
54
|
+
tags: ['live-safe'],
|
|
55
|
+
},
|
|
56
|
+
'quoxseo.trends': {
|
|
57
|
+
method: 'GET',
|
|
58
|
+
service: 'collector',
|
|
59
|
+
path: ({ query = '' }) => `/api/v1/quoxseo/trends${query}`,
|
|
60
|
+
tags: ['live-safe'],
|
|
61
|
+
},
|
|
62
|
+
'quoxseo.inspection': {
|
|
63
|
+
method: 'GET',
|
|
64
|
+
service: 'collector',
|
|
65
|
+
path: ({ query = '' }) => `/api/v1/quoxseo/inspection${query}`,
|
|
66
|
+
tags: ['live-safe'],
|
|
67
|
+
},
|
|
68
|
+
// quox#583: the org's registered properties, and the one governed write.
|
|
69
|
+
'quoxseo.sites': {
|
|
70
|
+
method: 'GET',
|
|
71
|
+
service: 'collector',
|
|
72
|
+
path: () => `/api/v1/quoxseo/properties`,
|
|
73
|
+
tags: ['live-safe'],
|
|
74
|
+
},
|
|
75
|
+
'quoxseo.sites.add': {
|
|
76
|
+
method: 'POST',
|
|
77
|
+
service: 'collector',
|
|
78
|
+
path: () => `/api/v1/quoxseo/sites`,
|
|
79
|
+
},
|
|
80
|
+
// quox#676: governed report delivery (email via instance SMTP and/or the HITL
|
|
81
|
+
// inbox, AEE-witnessed at the collector).
|
|
82
|
+
'quoxseo.report.deliver': {
|
|
83
|
+
method: 'POST',
|
|
84
|
+
service: 'collector',
|
|
85
|
+
path: () => `/api/v1/quoxseo/report/deliver`,
|
|
86
|
+
},
|
|
87
|
+
// Paid layer (DataForSEO), read-only over data already bought and persisted
|
|
88
|
+
// by the CLI/scheduler; these three never trigger a paid DataForSEO call
|
|
89
|
+
// themselves. See quox-seo/server/src/server.mjs for the route handlers.
|
|
90
|
+
'quoxseo.keywords': {
|
|
91
|
+
method: 'GET',
|
|
92
|
+
service: 'collector',
|
|
93
|
+
path: ({ query = '' }) => `/api/v1/quoxseo/keywords${query}`,
|
|
94
|
+
tags: ['live-safe'],
|
|
95
|
+
},
|
|
96
|
+
'quoxseo.gaps': {
|
|
97
|
+
method: 'GET',
|
|
98
|
+
service: 'collector',
|
|
99
|
+
path: ({ query = '' }) => `/api/v1/quoxseo/gaps${query}`,
|
|
100
|
+
tags: ['live-safe'],
|
|
101
|
+
},
|
|
102
|
+
'quoxseo.backlinks': {
|
|
103
|
+
method: 'GET',
|
|
104
|
+
service: 'collector',
|
|
105
|
+
path: ({ query = '' }) => `/api/v1/quoxseo/backlinks${query}`,
|
|
106
|
+
tags: ['live-safe'],
|
|
107
|
+
},
|
|
108
|
+
};
|
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* 'reach.*' endpoints — an agent's governed blast radius (BLAST-RADIUS-P0/P1/P2).
|
|
3
|
+
* Proxied straight through to the collector route:
|
|
4
|
+
* services/collector/server.js: GET /orgs/:orgId/agents/:agentId/reach
|
|
5
|
+
* (requireServiceOrUserAuth: JWT or service key).
|
|
6
|
+
*
|
|
7
|
+
* See cli/lib/api/endpoints/index.js for the fragment convention.
|
|
8
|
+
*/
|
|
9
|
+
|
|
10
|
+
export const reach = {
|
|
11
|
+
'reach.agent.get': {
|
|
12
|
+
method: 'GET',
|
|
13
|
+
service: 'collector',
|
|
14
|
+
path: (p) => `/orgs/${p.orgId}/agents/${p.agentId}/reach`,
|
|
15
|
+
tags: ['live-safe'],
|
|
16
|
+
},
|
|
17
|
+
// BLAST-RADIUS-P4: predicted-vs-actual least-privilege report.
|
|
18
|
+
// services/collector/server.js: GET /orgs/:orgId/agents/:agentId/reach/least-privilege
|
|
19
|
+
'reach.agent.leastPrivilege': {
|
|
20
|
+
method: 'GET',
|
|
21
|
+
service: 'collector',
|
|
22
|
+
path: (p) => `/orgs/${p.orgId}/agents/${p.agentId}/reach/least-privilege${p.days ? `?days=${encodeURIComponent(p.days)}` : ''}`,
|
|
23
|
+
tags: ['live-safe'],
|
|
24
|
+
},
|
|
25
|
+
// OPGOV quox#573: org-wide rollup of the same grant graph (the agent CMDB).
|
|
26
|
+
// services/collector/server.js: GET /orgs/:orgId/inventory
|
|
27
|
+
// OPGOV quox#573 phase 3: witnessed drift vs the last stored snapshot.
|
|
28
|
+
// services/collector/server.js: GET /orgs/:orgId/inventory/drift
|
|
29
|
+
'reach.org.inventory.drift': {
|
|
30
|
+
method: 'GET',
|
|
31
|
+
service: 'collector',
|
|
32
|
+
path: (p) => `/orgs/${p.orgId}/inventory/drift`,
|
|
33
|
+
},
|
|
34
|
+
'reach.org.inventory': {
|
|
35
|
+
method: 'GET',
|
|
36
|
+
service: 'collector',
|
|
37
|
+
path: (p) => {
|
|
38
|
+
const q = [];
|
|
39
|
+
if (p.days) q.push(`days=${encodeURIComponent(p.days)}`);
|
|
40
|
+
if (p.unused === true) q.push('unused=true');
|
|
41
|
+
return `/orgs/${p.orgId}/inventory${q.length ? `?${q.join('&')}` : ''}`;
|
|
42
|
+
},
|
|
43
|
+
tags: ['live-safe'],
|
|
44
|
+
},
|
|
45
|
+
};
|
|
46
|
+
|
|
47
|
+
export default reach;
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* 'runs.*' 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 runs = {
|
|
8
|
+
'runs.cancel': {
|
|
9
|
+
method: 'POST',
|
|
10
|
+
service: 'auth',
|
|
11
|
+
path: ({ orgId, runId }) => `/api/orgs/${orgId}/runs/${runId}/cancel`,
|
|
12
|
+
tags: ['live-write'],
|
|
13
|
+
},
|
|
14
|
+
'runs.create': {
|
|
15
|
+
method: 'POST',
|
|
16
|
+
service: 'auth',
|
|
17
|
+
path: ({ orgId }) => `/api/orgs/${orgId}/runs`,
|
|
18
|
+
tags: ['live-write'],
|
|
19
|
+
},
|
|
20
|
+
'runs.get': {
|
|
21
|
+
method: 'GET',
|
|
22
|
+
service: 'auth',
|
|
23
|
+
path: ({ orgId, pollRunId }) => `/api/orgs/${orgId}/runs/${pollRunId}`,
|
|
24
|
+
tags: ['live-safe'],
|
|
25
|
+
},
|
|
26
|
+
'runs.list': {
|
|
27
|
+
method: 'GET',
|
|
28
|
+
service: 'auth',
|
|
29
|
+
path: ({ orgId }) => `/api/orgs/${orgId}/runs`,
|
|
30
|
+
tags: ['live-safe'],
|
|
31
|
+
},
|
|
32
|
+
'runs.resume': {
|
|
33
|
+
method: 'POST',
|
|
34
|
+
service: 'auth',
|
|
35
|
+
path: ({ orgId, runId }) => `/api/orgs/${orgId}/runs/${runId}/resume`,
|
|
36
|
+
tags: ['live-write'],
|
|
37
|
+
},
|
|
38
|
+
};
|
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* 'safety.*' endpoints — kill switch / DEFCON (quox#503/#505/#506/#507).
|
|
3
|
+
* Collector routes/safetyGate.js, mounted at /api/v1/safety behind
|
|
4
|
+
* requireServiceOrUserAuth(); mutations additionally require a HUMAN admin
|
|
5
|
+
* server-side (requireHumanAdmin rejects agent/resident/service tokens BY
|
|
6
|
+
* DESIGN — an agent must never flip its own kill switch).
|
|
7
|
+
*/
|
|
8
|
+
|
|
9
|
+
export const safety = {
|
|
10
|
+
'safety.status': {
|
|
11
|
+
method: 'GET',
|
|
12
|
+
service: 'collector',
|
|
13
|
+
path: () => `/api/v1/safety/status`,
|
|
14
|
+
tags: ['live-safe'],
|
|
15
|
+
},
|
|
16
|
+
'safety.gate': {
|
|
17
|
+
method: 'GET',
|
|
18
|
+
service: 'collector',
|
|
19
|
+
path: ({ agentId }) => `/api/v1/safety/gate?agent_id=${encodeURIComponent(agentId)}`,
|
|
20
|
+
tags: ['live-safe'],
|
|
21
|
+
},
|
|
22
|
+
'safety.estop': {
|
|
23
|
+
method: 'POST',
|
|
24
|
+
service: 'collector',
|
|
25
|
+
path: ({ agentId }) => `/api/v1/safety/kill-switch/${encodeURIComponent(agentId)}`,
|
|
26
|
+
tags: ['live-write'],
|
|
27
|
+
},
|
|
28
|
+
'safety.release': {
|
|
29
|
+
method: 'DELETE',
|
|
30
|
+
service: 'collector',
|
|
31
|
+
path: ({ agentId }) => `/api/v1/safety/kill-switch/${encodeURIComponent(agentId)}`,
|
|
32
|
+
tags: ['live-write'],
|
|
33
|
+
},
|
|
34
|
+
'safety.defcon': {
|
|
35
|
+
method: 'POST',
|
|
36
|
+
service: 'collector',
|
|
37
|
+
path: () => `/api/v1/safety/defcon`,
|
|
38
|
+
tags: ['live-write'],
|
|
39
|
+
},
|
|
40
|
+
'safety.history': {
|
|
41
|
+
method: 'GET',
|
|
42
|
+
service: 'collector',
|
|
43
|
+
path: () => `/api/v1/safety/history`,
|
|
44
|
+
tags: ['live-safe'],
|
|
45
|
+
},
|
|
46
|
+
};
|
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* 'scim.*' endpoints — WP3.1 (docs/STREAM_CLI_PARITY_PLAN.md §2.3 #6).
|
|
3
|
+
* See cli/lib/api/endpoints/index.js for aggregation + the fragment convention.
|
|
4
|
+
*
|
|
5
|
+
* Backend: services/auth/routes/webhooks.js, mounted at plain `/api`
|
|
6
|
+
* (server.js `app.use('/api', webhooksRoutes)`) — org-scoped IN the URL
|
|
7
|
+
* (`/api/orgs/:orgId/scim/tokens...`). Same enterprise-tier +
|
|
8
|
+
* ORG_MANAGE_SETTINGS `chain` as the webhooks.* routes on this router, but
|
|
9
|
+
* a distinct resource (SCIM bearer tokens for IdP-driven directory sync,
|
|
10
|
+
* not team_event fan-out subscribers) — deliberately out of scope for the
|
|
11
|
+
* `webhooks.*` fragment/WP2.2 per that fragment's header note, and given
|
|
12
|
+
* its own domain here.
|
|
13
|
+
*
|
|
14
|
+
* Verified at the handler: list/create/delete all resolve through
|
|
15
|
+
* `req.org.id` (services/auth/utils/scimTokens.js — every query includes
|
|
16
|
+
* `WHERE org_id = ?`), so a tokenId from another org cannot be revoked.
|
|
17
|
+
*
|
|
18
|
+
* `scim.tokens.create`'s response body is NOT wrapped in `{ token: {...} }`
|
|
19
|
+
* — it's the raw `{ id, token }` shape returned by `createScimToken()`
|
|
20
|
+
* (webhooks.js `res.status(201).json(out)`), where `token` is the
|
|
21
|
+
* plaintext bearer credential, shown exactly once. Every other route on
|
|
22
|
+
* this fragment (and `webhooks.*`) wraps its payload under a named key;
|
|
23
|
+
* this one does not. Reproduced faithfully — do not add a wrapper key
|
|
24
|
+
* without changing the backend route.
|
|
25
|
+
*/
|
|
26
|
+
|
|
27
|
+
export const scim = {
|
|
28
|
+
'scim.tokens.create': {
|
|
29
|
+
method: 'POST',
|
|
30
|
+
service: 'auth',
|
|
31
|
+
path: ({ orgId }) => `/api/orgs/${orgId}/scim/tokens`,
|
|
32
|
+
tags: ['live-write'],
|
|
33
|
+
},
|
|
34
|
+
'scim.tokens.delete': {
|
|
35
|
+
method: 'DELETE',
|
|
36
|
+
service: 'auth',
|
|
37
|
+
path: ({ orgId, tokenId }) => `/api/orgs/${orgId}/scim/tokens/${tokenId}`,
|
|
38
|
+
tags: ['live-write'],
|
|
39
|
+
},
|
|
40
|
+
'scim.tokens.list': {
|
|
41
|
+
method: 'GET',
|
|
42
|
+
service: 'auth',
|
|
43
|
+
path: ({ orgId }) => `/api/orgs/${orgId}/scim/tokens`,
|
|
44
|
+
tags: ['live-safe'],
|
|
45
|
+
},
|
|
46
|
+
};
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* 'scopes.*' 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 scopes = {
|
|
8
|
+
'scopes.list': {
|
|
9
|
+
method: 'GET',
|
|
10
|
+
service: 'auth',
|
|
11
|
+
path: ({ orgId }) => `/api/orgs/${orgId}/scopes`,
|
|
12
|
+
tags: ['live-safe'],
|
|
13
|
+
},
|
|
14
|
+
};
|