quoxcli 0.0.0-stage → 0.3.1
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 +144 -2
- package/bin/quox.js +265 -0
- package/bin/quoxon.js +8 -0
- package/lib/api/endpoints/admin.js +151 -0
- package/lib/api/endpoints/aee.js +38 -0
- package/lib/api/endpoints/agent-attach.js +126 -0
- package/lib/api/endpoints/agent-schedules.js +26 -0
- package/lib/api/endpoints/agents.js +63 -0
- package/lib/api/endpoints/assistants.js +62 -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/away.js +15 -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 +61 -0
- package/lib/api/endpoints/consent.js +26 -0
- package/lib/api/endpoints/contactsq.js +68 -0
- package/lib/api/endpoints/conversations.js +46 -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 +45 -0
- package/lib/api/endpoints/fetchAllowlist.js +27 -0
- package/lib/api/endpoints/file.js +20 -0
- package/lib/api/endpoints/files.js +40 -0
- package/lib/api/endpoints/github.js +21 -0
- package/lib/api/endpoints/governance.js +43 -0
- package/lib/api/endpoints/hat.js +66 -0
- package/lib/api/endpoints/inbox.js +52 -0
- package/lib/api/endpoints/inboxq.js +120 -0
- package/lib/api/endpoints/index.js +242 -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 +94 -0
- package/lib/api/endpoints/mfa.js +32 -0
- package/lib/api/endpoints/mind.js +13 -0
- package/lib/api/endpoints/mon.js +184 -0
- package/lib/api/endpoints/notesq.js +43 -0
- package/lib/api/endpoints/objectives.js +68 -0
- package/lib/api/endpoints/orgs.js +38 -0
- package/lib/api/endpoints/plugins.js +152 -0
- package/lib/api/endpoints/powers.js +75 -0
- package/lib/api/endpoints/presence.js +33 -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 +121 -0
- package/lib/api/endpoints/quoxseo.js +114 -0
- package/lib/api/endpoints/reach.js +47 -0
- package/lib/api/endpoints/router.js +17 -0
- package/lib/api/endpoints/runs.js +38 -0
- package/lib/api/endpoints/safety.js +53 -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 +200 -0
- package/lib/api/endpoints/sso.js +67 -0
- package/lib/api/endpoints/stepup.js +20 -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 +96 -0
- package/lib/api/endpoints/user-library.js +41 -0
- package/lib/api/endpoints/users.js +20 -0
- package/lib/api/endpoints/v1.js +585 -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 +47 -0
- package/lib/api/endpoints/webhooks.js +46 -0
- package/lib/api/endpoints/workflows.js +169 -0
- package/lib/api/endpoints/x.js +32 -0
- package/lib/api/endpoints.js +15 -0
- package/lib/commands/actions.js +61 -0
- package/lib/commands/admin.js +375 -0
- package/lib/commands/aee.js +99 -0
- package/lib/commands/agent.js +337 -0
- package/lib/commands/agentAttach.js +1528 -0
- package/lib/commands/approvals.js +119 -0
- package/lib/commands/aside.js +24 -0
- package/lib/commands/ask.js +144 -0
- package/lib/commands/assistant.js +169 -0
- package/lib/commands/auth.js +464 -0
- package/lib/commands/awareness.js +88 -0
- package/lib/commands/backup.js +377 -0
- package/lib/commands/brain.js +1085 -0
- package/lib/commands/budget.js +241 -0
- package/lib/commands/build.js +170 -0
- package/lib/commands/calendar.js +216 -0
- package/lib/commands/capabilities.js +34 -0
- package/lib/commands/chat.js +295 -0
- package/lib/commands/claude.js +380 -0
- package/lib/commands/config-cmd.js +106 -0
- package/lib/commands/consent.js +84 -0
- package/lib/commands/contacts.js +1016 -0
- package/lib/commands/contactsSelftest.js +132 -0
- package/lib/commands/conversation.js +105 -0
- package/lib/commands/dashboard.js +43 -0
- package/lib/commands/department.js +96 -0
- package/lib/commands/dev.js +620 -0
- package/lib/commands/devResident.js +326 -0
- package/lib/commands/devSupervisor.js +1062 -0
- package/lib/commands/discord.js +132 -0
- package/lib/commands/doctor.js +181 -0
- package/lib/commands/domain.js +114 -0
- package/lib/commands/done.js +347 -0
- package/lib/commands/engagement.js +597 -0
- package/lib/commands/entity.js +119 -0
- package/lib/commands/facebook.js +212 -0
- package/lib/commands/fetchAllowlist.js +71 -0
- package/lib/commands/file.js +165 -0
- package/lib/commands/fleet.js +1189 -0
- package/lib/commands/governance.js +647 -0
- package/lib/commands/gripe.js +355 -0
- package/lib/commands/hat.js +374 -0
- package/lib/commands/helpers.js +96 -0
- package/lib/commands/hyperion.js +58 -0
- package/lib/commands/inbox.js +173 -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 +139 -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 +597 -0
- package/lib/commands/mail.js +531 -0
- package/lib/commands/memory.js +361 -0
- package/lib/commands/mind.js +71 -0
- package/lib/commands/mon.js +581 -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 +123 -0
- package/lib/commands/objective.js +240 -0
- package/lib/commands/offload.js +89 -0
- package/lib/commands/onboard.js +329 -0
- package/lib/commands/open.js +56 -0
- package/lib/commands/org.js +276 -0
- package/lib/commands/peek.js +28 -0
- package/lib/commands/plan.js +944 -0
- package/lib/commands/plugin-doctor.js +1091 -0
- package/lib/commands/plugin.js +649 -0
- package/lib/commands/policy.js +78 -0
- package/lib/commands/powers.js +296 -0
- package/lib/commands/presence.js +89 -0
- package/lib/commands/prompt.js +350 -0
- package/lib/commands/provider.js +159 -0
- package/lib/commands/qlarity.js +706 -0
- package/lib/commands/quoxbox.js +270 -0
- package/lib/commands/quoxchat.js +275 -0
- package/lib/commands/quoxseo.js +378 -0
- package/lib/commands/reach.js +159 -0
- package/lib/commands/role.js +286 -0
- package/lib/commands/router.js +77 -0
- package/lib/commands/rows.js +358 -0
- package/lib/commands/run.js +187 -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/server.js +292 -0
- package/lib/commands/service.js +89 -0
- package/lib/commands/settings.js +99 -0
- package/lib/commands/setup.js +569 -0
- package/lib/commands/skillManifest.js +113 -0
- package/lib/commands/skillRightsFormat.js +38 -0
- package/lib/commands/skills.js +687 -0
- package/lib/commands/slot.js +1451 -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 +142 -0
- package/lib/commands/tg.js +240 -0
- package/lib/commands/tiktok.js +218 -0
- package/lib/commands/tips.js +23 -0
- package/lib/commands/tool.js +304 -0
- package/lib/commands/trace.js +530 -0
- package/lib/commands/trigger.js +223 -0
- package/lib/commands/update.js +46 -0
- package/lib/commands/vault.js +1447 -0
- package/lib/commands/vm.js +237 -0
- package/lib/commands/voice.js +213 -0
- package/lib/commands/volt.js +570 -0
- package/lib/commands/walkthrough.js +32 -0
- package/lib/commands/watch.js +167 -0
- package/lib/commands/webhook.js +137 -0
- package/lib/commands/welcome.js +14 -0
- package/lib/commands/workflow.js +660 -0
- package/lib/commands/x.js +448 -0
- package/lib/core/actingAs.js +136 -0
- package/lib/core/activeSummary.js +186 -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/aside.js +54 -0
- package/lib/core/askDecision.js +60 -0
- package/lib/core/auth.js +501 -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/cliBuild.js +62 -0
- package/lib/core/client.js +693 -0
- package/lib/core/commandRegistrars.js +121 -0
- package/lib/core/completions.js +163 -0
- package/lib/core/config.js +669 -0
- package/lib/core/confirm.js +37 -0
- package/lib/core/customHats.js +168 -0
- package/lib/core/deeplinks.js +76 -0
- package/lib/core/doneEngineFetch.js +227 -0
- package/lib/core/errors.js +441 -0
- package/lib/core/global-flags.js +190 -0
- package/lib/core/governedSession.js +402 -0
- package/lib/core/hyperion.js +102 -0
- package/lib/core/inboxResolution.js +65 -0
- package/lib/core/lazyCommands.js +122 -0
- package/lib/core/liveSessionsReport.js +112 -0
- package/lib/core/offload.js +504 -0
- package/lib/core/org-override.js +52 -0
- package/lib/core/orgResolve.js +70 -0
- package/lib/core/output.js +239 -0
- package/lib/core/peek.js +126 -0
- package/lib/core/prodEnv.js +7 -0
- package/lib/core/profileUsers.js +51 -0
- package/lib/core/promptCancel.js +18 -0
- package/lib/core/quoxglyph.js +158 -0
- package/lib/core/repoPath.js +11 -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 +106 -0
- package/lib/core/rootOptions.js +39 -0
- package/lib/core/router.js +168 -0
- package/lib/core/selfUpdate.js +188 -0
- package/lib/core/sessionHeartbeat.js +192 -0
- package/lib/core/sessionsOverview.js +224 -0
- package/lib/core/slotKeeper.js +527 -0
- package/lib/core/slotWake.js +120 -0
- package/lib/core/supervisorEngine.js +933 -0
- package/lib/core/systemdInstaller.js +256 -0
- package/lib/core/version.js +87 -0
- package/lib/core/vm.js +361 -0
- package/lib/core/vmTui.js +86 -0
- package/lib/core/walkthrough.js +35 -0
- package/lib/hyperion/deck.js +29 -0
- package/lib/lucid/LucidCard.jsx +68 -0
- package/lib/lucid/LucidIntro.jsx +92 -0
- package/lib/lucid/blind.js +71 -0
- package/lib/lucid/cards.js +86 -0
- package/lib/lucid/deck.js +32 -0
- package/lib/lucid/fmt.js +139 -0
- package/lib/lucid/markdown.js +81 -0
- package/lib/lucid/motion.js +56 -0
- package/lib/lucid/sitrep.js +173 -0
- package/lib/plugins/loader.js +93 -0
- package/lib/quoxon/activity.js +116 -0
- package/lib/quoxon/aocl.js +117 -0
- package/lib/quoxon/api.js +952 -0
- package/lib/quoxon/app.js +4032 -0
- package/lib/quoxon/approvalFacts.js +94 -0
- package/lib/quoxon/approvalsView.js +325 -0
- package/lib/quoxon/asideView.js +40 -0
- package/lib/quoxon/ask.js +121 -0
- package/lib/quoxon/away.js +52 -0
- package/lib/quoxon/bang.js +224 -0
- package/lib/quoxon/bulkRisk.js +17 -0
- package/lib/quoxon/capabilities.js +82 -0
- package/lib/quoxon/cells.js +53 -0
- package/lib/quoxon/commandShort.js +112 -0
- package/lib/quoxon/commands.js +479 -0
- package/lib/quoxon/connect.js +654 -0
- package/lib/quoxon/connectCard.js +45 -0
- package/lib/quoxon/consent.js +86 -0
- package/lib/quoxon/context.js +68 -0
- package/lib/quoxon/copy.js +34 -0
- package/lib/quoxon/countdownLine.js +11 -0
- package/lib/quoxon/demo.autoplay.js +29 -0
- package/lib/quoxon/demo.fixtures.js +24 -0
- package/lib/quoxon/demo.js +76 -0
- package/lib/quoxon/devObserver.js +20 -0
- package/lib/quoxon/dividerAocl.js +191 -0
- package/lib/quoxon/dividerRule.js +57 -0
- package/lib/quoxon/dragonModes.js +150 -0
- package/lib/quoxon/dragonView.js +41 -0
- package/lib/quoxon/earlyInput.js +40 -0
- package/lib/quoxon/echo.js +15 -0
- package/lib/quoxon/egg.js +36 -0
- package/lib/quoxon/events.js +677 -0
- package/lib/quoxon/feedback.js +50 -0
- package/lib/quoxon/gallery.js +237 -0
- package/lib/quoxon/handoffOffer.js +78 -0
- package/lib/quoxon/hatSwitch.js +37 -0
- package/lib/quoxon/headless.js +161 -0
- package/lib/quoxon/hostUrls.js +41 -0
- package/lib/quoxon/indicator.js +197 -0
- package/lib/quoxon/intent.js +52 -0
- package/lib/quoxon/keys.js +164 -0
- package/lib/quoxon/launcher.js +103 -0
- package/lib/quoxon/main.js +176 -0
- package/lib/quoxon/markdown.js +341 -0
- package/lib/quoxon/markdownSettle.js +19 -0
- package/lib/quoxon/matrixDomains.json +46 -0
- package/lib/quoxon/mentions.js +90 -0
- package/lib/quoxon/mind.js +103 -0
- package/lib/quoxon/mode.js +46 -0
- package/lib/quoxon/model.js +311 -0
- package/lib/quoxon/modelPrefs.js +345 -0
- package/lib/quoxon/motion/clock.js +70 -0
- package/lib/quoxon/motion/color.js +35 -0
- package/lib/quoxon/motion/frame.js +14 -0
- package/lib/quoxon/motion/level.js +91 -0
- package/lib/quoxon/motion/reveal.js +54 -0
- package/lib/quoxon/motion/ring.js +79 -0
- package/lib/quoxon/mouse.js +211 -0
- package/lib/quoxon/noai.js +57 -0
- package/lib/quoxon/objects/agent.js +61 -0
- package/lib/quoxon/objects/away.js +72 -0
- package/lib/quoxon/objects/crystal.js +100 -0
- package/lib/quoxon/objects/fetch.js +182 -0
- package/lib/quoxon/objects/fleet.js +149 -0
- package/lib/quoxon/objects/health.js +186 -0
- package/lib/quoxon/objects/index.js +106 -0
- package/lib/quoxon/objects/ladder.js +71 -0
- package/lib/quoxon/objects/memory.js +44 -0
- package/lib/quoxon/objects/mirror.js +137 -0
- package/lib/quoxon/objects/model.js +118 -0
- package/lib/quoxon/objects/peek.js +17 -0
- package/lib/quoxon/objects/proof.js +110 -0
- package/lib/quoxon/objects/prove.js +130 -0
- package/lib/quoxon/objects/replay.js +125 -0
- package/lib/quoxon/objects/sitrep.js +58 -0
- package/lib/quoxon/objects/skill.js +105 -0
- package/lib/quoxon/objects/view.js +87 -0
- package/lib/quoxon/objects/workflow.js +119 -0
- package/lib/quoxon/observers.js +42 -0
- package/lib/quoxon/onboarding/copy.js +263 -0
- package/lib/quoxon/onboarding/credential.js +108 -0
- package/lib/quoxon/onboarding/detect.js +22 -0
- package/lib/quoxon/onboarding/dockerOffer.js +45 -0
- package/lib/quoxon/onboarding/failureCause.js +33 -0
- package/lib/quoxon/onboarding/finish.js +134 -0
- package/lib/quoxon/onboarding/index.js +94 -0
- package/lib/quoxon/onboarding/installRunner.js +284 -0
- package/lib/quoxon/onboarding/intent.js +53 -0
- package/lib/quoxon/onboarding/journey.js +73 -0
- package/lib/quoxon/onboarding/preflight.js +156 -0
- package/lib/quoxon/onboarding/probe.js +65 -0
- package/lib/quoxon/onboarding/runner.js +58 -0
- package/lib/quoxon/onboarding/view.js +682 -0
- package/lib/quoxon/orgLabel.js +10 -0
- package/lib/quoxon/orgSwitch.js +33 -0
- package/lib/quoxon/ownBroadcast.js +22 -0
- package/lib/quoxon/palette.js +43 -0
- package/lib/quoxon/print.js +98 -0
- package/lib/quoxon/profileSwitch.js +53 -0
- package/lib/quoxon/promptHistory.js +41 -0
- package/lib/quoxon/providers.js +48 -0
- package/lib/quoxon/qart.js +348 -0
- package/lib/quoxon/qdragon.js +410 -0
- package/lib/quoxon/qdragonFly.js +61 -0
- package/lib/quoxon/qdragonScenes.js +282 -0
- package/lib/quoxon/qeyes.js +213 -0
- package/lib/quoxon/qglyph.js +143 -0
- package/lib/quoxon/qhello.js +58 -0
- package/lib/quoxon/qmotion.js +132 -0
- package/lib/quoxon/render.js +1167 -0
- package/lib/quoxon/resend.js +72 -0
- package/lib/quoxon/roster.js +307 -0
- package/lib/quoxon/route.js +39 -0
- package/lib/quoxon/rows.js +711 -0
- package/lib/quoxon/rowsStore.js +80 -0
- package/lib/quoxon/rules.js +130 -0
- package/lib/quoxon/screenContext.js +150 -0
- package/lib/quoxon/screenFrames.js +254 -0
- package/lib/quoxon/session.js +238 -0
- package/lib/quoxon/sessionDead.js +17 -0
- package/lib/quoxon/signin.js +125 -0
- package/lib/quoxon/skills.js +30 -0
- package/lib/quoxon/slash/agents.js +112 -0
- package/lib/quoxon/slash/argSources.js +65 -0
- package/lib/quoxon/slash/args.js +65 -0
- package/lib/quoxon/slash/automate.js +89 -0
- package/lib/quoxon/slash/broadcast.js +140 -0
- package/lib/quoxon/slash/broadcastRun.js +108 -0
- package/lib/quoxon/slash/card.js +30 -0
- package/lib/quoxon/slash/challenge.js +114 -0
- package/lib/quoxon/slash/cliCommand.js +53 -0
- package/lib/quoxon/slash/cliLeaves.json +948 -0
- package/lib/quoxon/slash/compact.js +90 -0
- package/lib/quoxon/slash/confirm.js +30 -0
- package/lib/quoxon/slash/crystallize.js +69 -0
- package/lib/quoxon/slash/dashboard.js +136 -0
- package/lib/quoxon/slash/draft.js +54 -0
- package/lib/quoxon/slash/hatWalk.js +206 -0
- package/lib/quoxon/slash/inverses.js +77 -0
- package/lib/quoxon/slash/killer.js +24 -0
- package/lib/quoxon/slash/killerApi.js +16 -0
- package/lib/quoxon/slash/ledger.js +88 -0
- package/lib/quoxon/slash/listView.js +30 -0
- package/lib/quoxon/slash/modelCmd.js +261 -0
- package/lib/quoxon/slash/palette.js +118 -0
- package/lib/quoxon/slash/paletteController.js +169 -0
- package/lib/quoxon/slash/panels.js +116 -0
- package/lib/quoxon/slash/picker.js +56 -0
- package/lib/quoxon/slash/restart.js +202 -0
- package/lib/quoxon/slash/resume.js +59 -0
- package/lib/quoxon/slash/rowCmd.js +157 -0
- package/lib/quoxon/slash/rowWalk.js +175 -0
- package/lib/quoxon/slash/settings.js +60 -0
- package/lib/quoxon/slash/spawn.js +177 -0
- package/lib/quoxon/slash/stepUp.js +274 -0
- package/lib/quoxon/slash/stepUpCard.js +60 -0
- package/lib/quoxon/slash/stepUpCmds.js +78 -0
- package/lib/quoxon/slash/undoApi.js +38 -0
- package/lib/quoxon/slash/undoCmd.js +49 -0
- package/lib/quoxon/slash/undoWish.js +15 -0
- package/lib/quoxon/slash/watch.js +164 -0
- package/lib/quoxon/slash/wish.js +23 -0
- package/lib/quoxon/slash/wishCmd.js +32 -0
- package/lib/quoxon/slotChat.js +300 -0
- package/lib/quoxon/slotFormat.js +195 -0
- package/lib/quoxon/slotRun.js +131 -0
- package/lib/quoxon/sound/index.js +186 -0
- package/lib/quoxon/sound/mapping.js +120 -0
- package/lib/quoxon/sound/output.js +52 -0
- package/lib/quoxon/sound/synth.js +122 -0
- package/lib/quoxon/stray.js +22 -0
- package/lib/quoxon/suggestCommand.js +59 -0
- package/lib/quoxon/term.js +141 -0
- package/lib/quoxon/textBuffer.js +416 -0
- package/lib/quoxon/theme.js +286 -0
- package/lib/quoxon/tips.js +433 -0
- package/lib/quoxon/toolError.js +41 -0
- package/lib/quoxon/transcript.js +188 -0
- package/lib/quoxon/web/qface.js +89 -0
- package/lib/quoxon/welcome.js +52 -0
- package/lib/quoxon/whatsnew.js +136 -0
- package/lib/quoxon/whatsnew.jsonl +89 -0
- package/lib/quoxon/windowOrg.js +113 -0
- package/lib/server/diag.js +129 -0
- package/lib/server/doctor.js +71 -0
- package/lib/server/install.js +149 -0
- package/lib/server/pluginEnable.js +161 -0
- package/lib/server/skew.js +56 -0
- package/lib/server/snapshot.js +131 -0
- package/lib/server/status.js +128 -0
- package/lib/server/sys.js +65 -0
- package/lib/server/uninstall.js +63 -0
- package/lib/server/update.js +234 -0
- package/lib/toolOutputShape.js +315 -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/HyperionDeck.jsx +79 -0
- package/lib/tui/views/InboxView.jsx +228 -0
- package/lib/tui/views/LucidDeck.jsx +719 -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 +75 -4
|
@@ -0,0 +1,375 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Admin commands: config, keys, services, logs, stats, retention
|
|
3
|
+
*/
|
|
4
|
+
|
|
5
|
+
import { formatOutput, formatDetail, printSuccess } from '../core/output.js';
|
|
6
|
+
import { resolveEndpoint } from '../api/endpoints.js';
|
|
7
|
+
|
|
8
|
+
export function registerAdminCommands(program, ctx) {
|
|
9
|
+
const { client, auth } = ctx;
|
|
10
|
+
|
|
11
|
+
const admin = program
|
|
12
|
+
.command('admin')
|
|
13
|
+
.description('Platform administration');
|
|
14
|
+
|
|
15
|
+
// Config
|
|
16
|
+
const cfg = admin
|
|
17
|
+
.command('config')
|
|
18
|
+
.description('Manage platform configuration');
|
|
19
|
+
|
|
20
|
+
cfg
|
|
21
|
+
.command('get')
|
|
22
|
+
.description('Get platform config (all keys, or one key)')
|
|
23
|
+
.argument('[key]', 'show only this key')
|
|
24
|
+
.action(async (key) => {
|
|
25
|
+
auth.requireAuth();
|
|
26
|
+
const data = await client.get(resolveEndpoint('admin.config.list').path, { service: resolveEndpoint('admin.config.list').service });
|
|
27
|
+
const config = data.config || data;
|
|
28
|
+
if (key) {
|
|
29
|
+
// quox#533: `get <key>` used to be rejected outright.
|
|
30
|
+
// #1010: auth returns an ARRAY of { key, value, ... } rows; an object map is handled too.
|
|
31
|
+
if (Array.isArray(config)) {
|
|
32
|
+
const row = config.find((r) => r && r.key === key);
|
|
33
|
+
if (!row) throw new Error(`config key "${key}" not found. Run \`quox admin config get\` to list all keys.`);
|
|
34
|
+
formatDetail(row, { format: program.opts().output, title: 'Platform Config' });
|
|
35
|
+
return;
|
|
36
|
+
}
|
|
37
|
+
if (!config || typeof config !== 'object' || !(key in config)) {
|
|
38
|
+
throw new Error(`config key "${key}" not found. Run \`quox admin config get\` to list all keys.`);
|
|
39
|
+
}
|
|
40
|
+
formatDetail({ [key]: config[key] }, { format: program.opts().output, title: 'Platform Config' });
|
|
41
|
+
return;
|
|
42
|
+
}
|
|
43
|
+
formatDetail(config, { format: program.opts().output, title: 'Platform Config' });
|
|
44
|
+
});
|
|
45
|
+
|
|
46
|
+
cfg
|
|
47
|
+
.command('set')
|
|
48
|
+
.description('Set a config value')
|
|
49
|
+
.argument('<key>', 'config key')
|
|
50
|
+
.argument('<value>', 'config value')
|
|
51
|
+
.action(async (key, value) => {
|
|
52
|
+
auth.requireAuth();
|
|
53
|
+
await client.patch(resolveEndpoint('admin.config.update', { key }).path, { service: resolveEndpoint('admin.config.update', { key }).service, body: { value } });
|
|
54
|
+
printSuccess(`Config ${key} updated.`);
|
|
55
|
+
});
|
|
56
|
+
|
|
57
|
+
// LICENSE-LAUNCH LL-6b: enforcement posture + break-glass. Parity with the
|
|
58
|
+
// dashboard's Settings → Security → Enforcement panel. In production a
|
|
59
|
+
// security gate switched off in the environment is enforced anyway unless an
|
|
60
|
+
// unexpired break-glass record exists, so an operator needs to see and set
|
|
61
|
+
// those records from the CLI too, not only from the browser.
|
|
62
|
+
const enforcement = admin
|
|
63
|
+
.command('enforcement')
|
|
64
|
+
.description('Security enforcement posture and break-glass windows');
|
|
65
|
+
|
|
66
|
+
enforcement
|
|
67
|
+
.command('list')
|
|
68
|
+
.description('Show every enforcement flag: what the environment asks for and what is actually enforced')
|
|
69
|
+
.action(async () => {
|
|
70
|
+
auth.requireAuth();
|
|
71
|
+
const ep = resolveEndpoint('admin.enforcement.list');
|
|
72
|
+
const data = await client.get(ep.path, { service: ep.service });
|
|
73
|
+
const rows = (data.flags || []).map((f) => ({
|
|
74
|
+
key: f.key,
|
|
75
|
+
env: f.env_enforced ? 'enforce' : 'off',
|
|
76
|
+
effective: f.forced_on ? 'ENFORCED (forced)' : (f.enforced ? 'enforced' : 'off'),
|
|
77
|
+
break_glass: f.break_glass ? `until ${f.break_glass.expires_at}` : '-',
|
|
78
|
+
reason: f.break_glass ? f.break_glass.reason : '',
|
|
79
|
+
}));
|
|
80
|
+
formatOutput({
|
|
81
|
+
columns: ['key', 'env', 'effective', 'break_glass', 'reason'],
|
|
82
|
+
headers: ['Flag', 'Env', 'Effective', 'Break-glass', 'Reason'],
|
|
83
|
+
rows,
|
|
84
|
+
}, { format: program.opts().output });
|
|
85
|
+
});
|
|
86
|
+
|
|
87
|
+
enforcement
|
|
88
|
+
.command('break-glass')
|
|
89
|
+
.description('Open a bounded break-glass window so a gate may stay off in production')
|
|
90
|
+
.argument('<flag>', 'enforcement flag, e.g. COLLECTOR_AUTH_ENFORCE')
|
|
91
|
+
.requiredOption('--reason <reason>', 'why this gate has to be off (recorded against your account)')
|
|
92
|
+
.option('--hours <hours>', 'window length in hours, 72 maximum', '4')
|
|
93
|
+
.action(async (flag, opts) => {
|
|
94
|
+
auth.requireAuth();
|
|
95
|
+
const hours = Number(opts.hours);
|
|
96
|
+
if (!Number.isFinite(hours) || hours <= 0) {
|
|
97
|
+
throw new Error('--hours must be a positive number of hours (72 maximum)');
|
|
98
|
+
}
|
|
99
|
+
const ep = resolveEndpoint('admin.enforcement.break_glass.open');
|
|
100
|
+
const data = await client.post(ep.path, {
|
|
101
|
+
service: ep.service,
|
|
102
|
+
body: {
|
|
103
|
+
flag,
|
|
104
|
+
reason: opts.reason,
|
|
105
|
+
expires_at: new Date(Date.now() + hours * 3600_000).toISOString(),
|
|
106
|
+
},
|
|
107
|
+
});
|
|
108
|
+
printSuccess(`Break-glass open for ${flag} until ${data.break_glass.expires_at}.`);
|
|
109
|
+
});
|
|
110
|
+
|
|
111
|
+
enforcement
|
|
112
|
+
.command('clear')
|
|
113
|
+
.description('Close a break-glass window early')
|
|
114
|
+
.argument('<flag>', 'enforcement flag, e.g. COLLECTOR_AUTH_ENFORCE')
|
|
115
|
+
.action(async (flag) => {
|
|
116
|
+
auth.requireAuth();
|
|
117
|
+
const ep = resolveEndpoint('admin.enforcement.break_glass.clear', { flag });
|
|
118
|
+
const data = await client.delete(ep.path, { service: ep.service });
|
|
119
|
+
printSuccess(data.cleared
|
|
120
|
+
? `Break-glass closed for ${flag}.`
|
|
121
|
+
: `No break-glass window was open for ${flag}.`);
|
|
122
|
+
});
|
|
123
|
+
|
|
124
|
+
// QUOXPERTICUS P2: governed agent-identity mint (instance-admin only).
|
|
125
|
+
const agentIdentity = admin
|
|
126
|
+
.command('agent-identity')
|
|
127
|
+
.description('Manage governed agent identities (agent-typed user + bound mcp token)');
|
|
128
|
+
|
|
129
|
+
agentIdentity
|
|
130
|
+
.command('mint')
|
|
131
|
+
.description('Mint (or rotate) an agent identity; prints the raw token ONCE')
|
|
132
|
+
.argument('<agentId>', 'agent id, e.g. quoxperticus')
|
|
133
|
+
// NOT requiredOption: --org shadows the root program's global --org
|
|
134
|
+
// <slug> (bin/quox.js). Commander's mandatory-option check runs BEFORE
|
|
135
|
+
// the mergeShadowedGlobals preAction hook, so a requiredOption here
|
|
136
|
+
// always fired "required option '--org' not specified" even when the
|
|
137
|
+
// user supplied it (quox#457 sweep). Validated explicitly below instead.
|
|
138
|
+
.option('--org <orgId>', 'org ULID the agent operates under')
|
|
139
|
+
.option('--rotate', 'revoke the live token and issue a new one')
|
|
140
|
+
.action(async (agentId, opts) => {
|
|
141
|
+
auth.requireAuth();
|
|
142
|
+
if (!opts.org || !String(opts.org).trim()) {
|
|
143
|
+
throw new Error(
|
|
144
|
+
'Missing --org <orgId>. Usage: quox admin agent-identity mint <agentId> --org <orgId>'
|
|
145
|
+
);
|
|
146
|
+
}
|
|
147
|
+
const ep = resolveEndpoint('admin.agent_identity.mint');
|
|
148
|
+
const data = await client.post(ep.path, {
|
|
149
|
+
service: ep.service,
|
|
150
|
+
body: { agent_id: agentId, org_id: opts.org, rotate: opts.rotate === true },
|
|
151
|
+
});
|
|
152
|
+
printSuccess(`Agent identity ${data.agent_id} ${data.rotated ? 'rotated' : 'minted'} (user ${data.user_id}).`);
|
|
153
|
+
console.log('Raw token (shown ONCE, place it in the supervisor root-only env):');
|
|
154
|
+
console.log(data.token);
|
|
155
|
+
});
|
|
156
|
+
|
|
157
|
+
// Email / SMTP (QCPRO-SMTP): instance email onboarding parity
|
|
158
|
+
const email = admin
|
|
159
|
+
.command('email')
|
|
160
|
+
.description('Instance email delivery (SMTP)');
|
|
161
|
+
|
|
162
|
+
email
|
|
163
|
+
.command('status')
|
|
164
|
+
.description('Show email delivery status (configured, from, last test)')
|
|
165
|
+
.action(async () => {
|
|
166
|
+
auth.requireAuth();
|
|
167
|
+
const ep = resolveEndpoint('admin.email.status');
|
|
168
|
+
const data = await client.get(ep.path, { service: ep.service });
|
|
169
|
+
formatDetail(data, { format: program.opts().output, title: 'Email Delivery' });
|
|
170
|
+
});
|
|
171
|
+
|
|
172
|
+
email
|
|
173
|
+
.command('setup')
|
|
174
|
+
.description('Configure instance SMTP (password encrypted at rest; omit --pass to keep the stored one)')
|
|
175
|
+
.requiredOption('--host <host>', 'SMTP host')
|
|
176
|
+
.option('--port <port>', 'SMTP port', '587')
|
|
177
|
+
.option('--user <user>', 'SMTP username')
|
|
178
|
+
.option('--pass <pass>', 'SMTP password')
|
|
179
|
+
.requiredOption('--from <from>', 'From address, e.g. "QuoxCORE <noreply@acme.com>"')
|
|
180
|
+
.option('--secure', 'Use TLS (direct TLS for 465, STARTTLS otherwise)', true)
|
|
181
|
+
.option('--no-secure', 'Disable TLS')
|
|
182
|
+
.action(async (opts) => {
|
|
183
|
+
auth.requireAuth();
|
|
184
|
+
const ep = resolveEndpoint('admin.email.smtp');
|
|
185
|
+
await client.put(ep.path, {
|
|
186
|
+
service: ep.service,
|
|
187
|
+
body: {
|
|
188
|
+
host: opts.host,
|
|
189
|
+
port: Number(opts.port),
|
|
190
|
+
user: opts.user || '',
|
|
191
|
+
pass: opts.pass || '',
|
|
192
|
+
from: opts.from,
|
|
193
|
+
secure: !!opts.secure,
|
|
194
|
+
},
|
|
195
|
+
});
|
|
196
|
+
printSuccess('SMTP configured. Run "quox admin email test" to verify delivery.');
|
|
197
|
+
});
|
|
198
|
+
|
|
199
|
+
email
|
|
200
|
+
.command('test')
|
|
201
|
+
.description('Send a test email and report the honest outcome')
|
|
202
|
+
.option('--to <address>', 'Recipient (defaults to your account email)')
|
|
203
|
+
.action(async (opts) => {
|
|
204
|
+
auth.requireAuth();
|
|
205
|
+
const ep = resolveEndpoint('admin.email.test');
|
|
206
|
+
const result = await client.post(ep.path, { service: ep.service, body: opts.to ? { to: opts.to } : {} });
|
|
207
|
+
if (result.delivered) {
|
|
208
|
+
printSuccess(`Delivered (message id ${result.message_id || 'unknown'}).`);
|
|
209
|
+
} else {
|
|
210
|
+
console.error(`Not delivered: ${result.reason || 'unknown error'}`);
|
|
211
|
+
process.exitCode = 1;
|
|
212
|
+
}
|
|
213
|
+
});
|
|
214
|
+
|
|
215
|
+
// API Keys
|
|
216
|
+
const keys = admin
|
|
217
|
+
.command('key')
|
|
218
|
+
.description('Manage API keys');
|
|
219
|
+
|
|
220
|
+
keys
|
|
221
|
+
.command('list')
|
|
222
|
+
.description('List API keys')
|
|
223
|
+
.action(async () => {
|
|
224
|
+
auth.requireAuth();
|
|
225
|
+
const data = await client.get(resolveEndpoint('admin.keys.list').path, { service: resolveEndpoint('admin.keys.list').service });
|
|
226
|
+
formatOutput({
|
|
227
|
+
// fleet #392: api_keys has key_preview/last_used_at; prefix, role
|
|
228
|
+
// and expires_at don't exist on this row at all.
|
|
229
|
+
columns: ['id', 'name', 'key_preview', 'last_used_at', 'created_at'],
|
|
230
|
+
headers: ['ID', 'Name', 'Preview', 'Last Used', 'Created'],
|
|
231
|
+
rows: data.keys || data,
|
|
232
|
+
}, { format: program.opts().output });
|
|
233
|
+
});
|
|
234
|
+
|
|
235
|
+
keys
|
|
236
|
+
.command('create')
|
|
237
|
+
.description('Create an API key')
|
|
238
|
+
.requiredOption('--name <name>', 'key name')
|
|
239
|
+
.option('--role <role>', 'key role', 'viewer')
|
|
240
|
+
.option('--expires <date>', 'expiry date (ISO)')
|
|
241
|
+
.action(async (options) => {
|
|
242
|
+
auth.requireAuth();
|
|
243
|
+
const body = { name: options.name, role: options.role };
|
|
244
|
+
if (options.expires) body.expires_at = options.expires;
|
|
245
|
+
const data = await client.post(resolveEndpoint('admin.keys.create').path, { service: resolveEndpoint('admin.keys.create').service, body });
|
|
246
|
+
if (data.key || data.api_key) {
|
|
247
|
+
const key = data.key || data.api_key;
|
|
248
|
+
if (program.opts().output === 'json') {
|
|
249
|
+
console.log(JSON.stringify({ key, id: data.id, name: data.name }));
|
|
250
|
+
} else if (program.opts().output === 'quiet') {
|
|
251
|
+
console.log(key);
|
|
252
|
+
} else {
|
|
253
|
+
console.log(`API Key: ${key}`);
|
|
254
|
+
console.log('(Save this key now — it will not be shown again)');
|
|
255
|
+
}
|
|
256
|
+
} else {
|
|
257
|
+
printSuccess('API key created.');
|
|
258
|
+
}
|
|
259
|
+
});
|
|
260
|
+
|
|
261
|
+
keys
|
|
262
|
+
.command('delete')
|
|
263
|
+
.description('Delete an API key')
|
|
264
|
+
.argument('<keyId>', 'key ID')
|
|
265
|
+
.action(async (keyId) => {
|
|
266
|
+
auth.requireAuth();
|
|
267
|
+
await client.delete(resolveEndpoint('admin.keys.delete', { keyId }).path, { service: resolveEndpoint('admin.keys.delete', { keyId }).service });
|
|
268
|
+
printSuccess('API key deleted.');
|
|
269
|
+
});
|
|
270
|
+
|
|
271
|
+
keys
|
|
272
|
+
.command('test')
|
|
273
|
+
.description('Test an API key')
|
|
274
|
+
.argument('<keyId>', 'key ID')
|
|
275
|
+
.action(async (keyId) => {
|
|
276
|
+
auth.requireAuth();
|
|
277
|
+
const data = await client.post(resolveEndpoint('admin.keys.test', { keyId }).path, { service: resolveEndpoint('admin.keys.test', { keyId }).service });
|
|
278
|
+
printSuccess(data.valid ? 'API key is valid.' : 'API key test failed.');
|
|
279
|
+
});
|
|
280
|
+
|
|
281
|
+
// Services
|
|
282
|
+
const services = admin
|
|
283
|
+
.command('service')
|
|
284
|
+
.description('Manage platform services');
|
|
285
|
+
|
|
286
|
+
services
|
|
287
|
+
.command('list')
|
|
288
|
+
.description('List registered services')
|
|
289
|
+
.action(async () => {
|
|
290
|
+
auth.requireAuth();
|
|
291
|
+
const data = await client.get(resolveEndpoint('admin.services.list').path, { service: resolveEndpoint('admin.services.list').service });
|
|
292
|
+
formatOutput({
|
|
293
|
+
// fleet #392: services has health_endpoint/last_check_at, not
|
|
294
|
+
// url/last_check.
|
|
295
|
+
columns: ['id', 'name', 'status', 'health_endpoint', 'last_check_at'],
|
|
296
|
+
headers: ['ID', 'Name', 'Status', 'Health URL', 'Last Check'],
|
|
297
|
+
rows: data.services || data,
|
|
298
|
+
}, { format: program.opts().output });
|
|
299
|
+
});
|
|
300
|
+
|
|
301
|
+
// Logs
|
|
302
|
+
admin
|
|
303
|
+
.command('logs')
|
|
304
|
+
.description('View admin audit logs')
|
|
305
|
+
.option('--action <action>', 'filter by action')
|
|
306
|
+
.option('--limit <n>', 'max results', '50')
|
|
307
|
+
.action(async (options) => {
|
|
308
|
+
auth.requireAuth();
|
|
309
|
+
const query = { limit: options.limit };
|
|
310
|
+
if (options.action) query.action = options.action;
|
|
311
|
+
const data = await client.get(resolveEndpoint('admin.logs.list').path, { service: resolveEndpoint('admin.logs.list').service, query });
|
|
312
|
+
formatOutput({
|
|
313
|
+
// fleet #392: system_logs has { created_at, service, level, message,
|
|
314
|
+
// user_id } — none of timestamp/user_email/action/detail exist, so
|
|
315
|
+
// all four columns were dashes.
|
|
316
|
+
columns: ['created_at', 'service', 'level', 'message', 'user_id'],
|
|
317
|
+
headers: ['Time', 'Service', 'Level', 'Message', 'User'],
|
|
318
|
+
rows: data.logs || data.entries || data,
|
|
319
|
+
}, { format: program.opts().output });
|
|
320
|
+
});
|
|
321
|
+
|
|
322
|
+
// Stats
|
|
323
|
+
admin
|
|
324
|
+
.command('stats')
|
|
325
|
+
.description('Show platform statistics')
|
|
326
|
+
.action(async () => {
|
|
327
|
+
auth.requireAuth();
|
|
328
|
+
const data = await client.get(resolveEndpoint('admin.stats.list').path, { service: resolveEndpoint('admin.stats.list').service });
|
|
329
|
+
formatDetail(data.stats || data, { format: program.opts().output, title: 'Platform Stats' });
|
|
330
|
+
});
|
|
331
|
+
|
|
332
|
+
// Retention
|
|
333
|
+
const retention = admin
|
|
334
|
+
.command('retention')
|
|
335
|
+
.description('Manage data retention');
|
|
336
|
+
|
|
337
|
+
retention
|
|
338
|
+
.command('config')
|
|
339
|
+
.description('View retention config')
|
|
340
|
+
.action(async () => {
|
|
341
|
+
auth.requireAuth();
|
|
342
|
+
const data = await client.get(resolveEndpoint('admin.retention.config.list').path, { service: resolveEndpoint('admin.retention.config.list').service });
|
|
343
|
+
formatDetail(data.config || data, { format: program.opts().output, title: 'Retention Config' });
|
|
344
|
+
});
|
|
345
|
+
|
|
346
|
+
retention
|
|
347
|
+
.command('cleanup')
|
|
348
|
+
.description('Run retention cleanup')
|
|
349
|
+
.option('--dry-run', 'preview without deleting')
|
|
350
|
+
.action(async (options) => {
|
|
351
|
+
auth.requireAuth();
|
|
352
|
+
const body = {};
|
|
353
|
+
if (options.dryRun) body.dry_run = true;
|
|
354
|
+
const data = await client.post(resolveEndpoint('admin.retention.cleanup').path, { service: resolveEndpoint('admin.retention.cleanup').service, body });
|
|
355
|
+
if (options.dryRun) {
|
|
356
|
+
// quox#1084: servers before the fix ignored dry_run and deleted for real.
|
|
357
|
+
// Never present an unconfirmed result as a harmless preview.
|
|
358
|
+
if (!data || data.dry_run !== true) {
|
|
359
|
+
throw new Error('the server did not honour --dry-run (it predates quox#1084): the cleanup may have run for real. Check `quox admin retention stats`.');
|
|
360
|
+
}
|
|
361
|
+
formatDetail(data, { format: program.opts().output, title: 'Cleanup preview (dry run): nothing deleted' });
|
|
362
|
+
return;
|
|
363
|
+
}
|
|
364
|
+
formatDetail(data, { format: program.opts().output, title: 'Cleanup Result' });
|
|
365
|
+
});
|
|
366
|
+
|
|
367
|
+
retention
|
|
368
|
+
.command('stats')
|
|
369
|
+
.description('View retention statistics')
|
|
370
|
+
.action(async () => {
|
|
371
|
+
auth.requireAuth();
|
|
372
|
+
const data = await client.get(resolveEndpoint('admin.retention.stats.list').path, { service: resolveEndpoint('admin.retention.stats.list').service });
|
|
373
|
+
formatDetail(data.stats || data, { format: program.opts().output, title: 'Retention Stats' });
|
|
374
|
+
});
|
|
375
|
+
}
|
|
@@ -0,0 +1,99 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* AEE (Agent Envelope Exchange) commands
|
|
3
|
+
*/
|
|
4
|
+
|
|
5
|
+
import { formatOutput, formatDetail, printSuccess } from '../core/output.js';
|
|
6
|
+
import { parseJSON } from './helpers.js';
|
|
7
|
+
import { resolveEndpoint } from '../api/endpoints.js';
|
|
8
|
+
|
|
9
|
+
export function registerAeeCommands(program, ctx) {
|
|
10
|
+
const { client, auth } = ctx;
|
|
11
|
+
|
|
12
|
+
const aee = program
|
|
13
|
+
.command('aee')
|
|
14
|
+
.description('Agent Envelope Exchange protocol');
|
|
15
|
+
|
|
16
|
+
aee
|
|
17
|
+
.command('store')
|
|
18
|
+
.description('Store an AEE envelope')
|
|
19
|
+
.requiredOption('--envelope <json>', 'envelope data as JSON')
|
|
20
|
+
.action(async (options) => {
|
|
21
|
+
auth.requireAuth();
|
|
22
|
+
const envelope = parseJSON(options.envelope, '--envelope');
|
|
23
|
+
await client.post(resolveEndpoint('aee.store').path, { service: resolveEndpoint('aee.store').service, body: envelope });
|
|
24
|
+
printSuccess('Envelope stored.');
|
|
25
|
+
});
|
|
26
|
+
|
|
27
|
+
aee
|
|
28
|
+
.command('get')
|
|
29
|
+
.description('Get an envelope by ID')
|
|
30
|
+
.argument('<id>', 'envelope ID')
|
|
31
|
+
.action(async (id) => {
|
|
32
|
+
auth.requireAuth();
|
|
33
|
+
const data = await client.get(resolveEndpoint('aee.get', { id }).path, { service: resolveEndpoint('aee.get', { id }).service });
|
|
34
|
+
formatDetail(data.envelope || data, { format: program.opts().output });
|
|
35
|
+
});
|
|
36
|
+
|
|
37
|
+
aee
|
|
38
|
+
.command('query')
|
|
39
|
+
.description('Query envelopes')
|
|
40
|
+
// fleet #386 + adjacent fix: --from/--to were described as dates, but the
|
|
41
|
+
// route matches them against the envelope's "from"/"to" columns — the AEE
|
|
42
|
+
// sender and recipient (from: 'human.adam', to: 'agent.cipher'). Passing a
|
|
43
|
+
// date matched a sender literally named "2026-01-01", i.e. nothing. The
|
|
44
|
+
// route's real date filters are after/before, which the CLI never sent, so
|
|
45
|
+
// date filtering was unreachable. Descriptions now match the protocol, and
|
|
46
|
+
// --after/--before/--intent expose filters the route already supported.
|
|
47
|
+
.option('--from <sender>', 'envelope sender (e.g. human.adam, agent.cipher)')
|
|
48
|
+
.option('--to <recipient>', 'envelope recipient')
|
|
49
|
+
.option('--after <date>', 'only envelopes at/after this ISO timestamp')
|
|
50
|
+
.option('--before <date>', 'only envelopes before this ISO timestamp')
|
|
51
|
+
.option('--intent <intent>', 'intent substring match (e.g. quox.chat)')
|
|
52
|
+
.option('--corr <id>', 'correlation ID — the envelopes of one conversation (see `aee conversations`)')
|
|
53
|
+
.option('--type <type>', 'envelope type')
|
|
54
|
+
.option('--limit <n>', 'max results', '50')
|
|
55
|
+
.action(async (options) => {
|
|
56
|
+
auth.requireAuth();
|
|
57
|
+
const query = { limit: options.limit };
|
|
58
|
+
if (options.from) query.from = options.from;
|
|
59
|
+
if (options.to) query.to = options.to;
|
|
60
|
+
if (options.after) query.after = options.after;
|
|
61
|
+
if (options.before) query.before = options.before;
|
|
62
|
+
if (options.intent) query.intent = options.intent;
|
|
63
|
+
if (options.corr) query.corr = options.corr;
|
|
64
|
+
if (options.type) query.type = options.type;
|
|
65
|
+
const data = await client.get(resolveEndpoint('aee.query.list').path, { service: resolveEndpoint('aee.query.list').service, query });
|
|
66
|
+
formatOutput({
|
|
67
|
+
columns: ['id', 'type', 'from', 'to', 'intent', 'ts'],
|
|
68
|
+
headers: ['ID', 'Type', 'From', 'To', 'Intent', 'Time'],
|
|
69
|
+
rows: data.envelopes || data.results || data,
|
|
70
|
+
}, { format: program.opts().output });
|
|
71
|
+
});
|
|
72
|
+
|
|
73
|
+
aee
|
|
74
|
+
.command('conversations')
|
|
75
|
+
.description('List AEE conversations')
|
|
76
|
+
.option('--limit <n>', 'max results', '20')
|
|
77
|
+
.action(async (options) => {
|
|
78
|
+
auth.requireAuth();
|
|
79
|
+
const data = await client.get(resolveEndpoint('aee.conversations.list').path, { service: resolveEndpoint('aee.conversations.list').service, query: { limit: options.limit } });
|
|
80
|
+
formatOutput({
|
|
81
|
+
// fleet #385: the endpoint returns { corr, first_ts, last_ts, count }
|
|
82
|
+
// (see the GROUP BY corr query in collector/server.js). This declared
|
|
83
|
+
// corr_id/envelope_count, which don't exist in the payload, so two of
|
|
84
|
+
// three columns rendered as dashes with no error.
|
|
85
|
+
columns: ['corr', 'count', 'last_ts'],
|
|
86
|
+
headers: ['Conversation', 'Envelopes', 'Last Activity'],
|
|
87
|
+
rows: data.conversations || data,
|
|
88
|
+
}, { format: program.opts().output });
|
|
89
|
+
});
|
|
90
|
+
|
|
91
|
+
aee
|
|
92
|
+
.command('stats')
|
|
93
|
+
.description('AEE statistics')
|
|
94
|
+
.action(async () => {
|
|
95
|
+
auth.requireAuth();
|
|
96
|
+
const data = await client.get(resolveEndpoint('aee.stats.list').path, { service: resolveEndpoint('aee.stats.list').service });
|
|
97
|
+
formatDetail(data.stats || data, { format: program.opts().output, title: 'AEE Stats' });
|
|
98
|
+
});
|
|
99
|
+
}
|