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,132 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* `quox discord` — Quox Discord Pro from the canonical CLI (quoxcli-parity-gate:
|
|
3
|
+
* nothing ships without quox CLI support).
|
|
4
|
+
*
|
|
5
|
+
* Same principle as `quox done`: this is a thin wrapper over the daemon's own
|
|
6
|
+
* control CLI (`qdp`, quox-discord-pro/bin/qdp.mjs), not a reimplementation.
|
|
7
|
+
* The daemon already exposes status | instances | bindings | bind | unbind |
|
|
8
|
+
* gaps | health over its token-gated loopback control API, and qdp is the one
|
|
9
|
+
* client for it. Two clients for one control surface is how a control surface
|
|
10
|
+
* drifts, so `quox discord <verb>` shells straight through to qdp with the
|
|
11
|
+
* arguments unchanged, and qdp's exit code is passed through.
|
|
12
|
+
*
|
|
13
|
+
* Host-local, like `quox done` shelling to the DoneEngine: the operator CLI
|
|
14
|
+
* runs where the daemon runs (one daemon per QuoxCORE instance). Set
|
|
15
|
+
* QDP_CLI_PATH if qdp lives elsewhere.
|
|
16
|
+
*/
|
|
17
|
+
|
|
18
|
+
import { spawnSync } from 'node:child_process';
|
|
19
|
+
import fs from 'node:fs';
|
|
20
|
+
import os from 'node:os';
|
|
21
|
+
import path from 'node:path';
|
|
22
|
+
|
|
23
|
+
const QDP = process.env.QDP_CLI_PATH
|
|
24
|
+
|| path.join(os.homedir(), 'quox-discord-pro', 'bin', 'qdp.mjs');
|
|
25
|
+
|
|
26
|
+
/**
|
|
27
|
+
* Per-verb usage, mirrored from qdp.mjs's own header doc block (bin/qdp.mjs
|
|
28
|
+
* in the quox-discord-pro repo), shown in each subcommand's --help. qdp has no
|
|
29
|
+
* --help handling of its own; before quox#1077 this command hand-rolled arg
|
|
30
|
+
* dispatch and had to intercept --help itself (quox#603). Commander
|
|
31
|
+
* subcommands now answer --help before any action runs.
|
|
32
|
+
*/
|
|
33
|
+
const VERB_USAGE = {
|
|
34
|
+
status: 'qdp status daemon liveness, instances, binding count',
|
|
35
|
+
instances: 'qdp instances configured instances and their targets',
|
|
36
|
+
bindings: 'qdp bindings every channel binding',
|
|
37
|
+
gaps: 'qdp gaps open support-gap items awaiting an official answer',
|
|
38
|
+
health: 'qdp health one-line OK/actionable summary',
|
|
39
|
+
doctor: 'qdp doctor per-binding view/webhook/liveness check; exits\n'
|
|
40
|
+
+ ' non-zero if any binding is non-functional',
|
|
41
|
+
bind: 'qdp bind <channelId> <mode> [key=value ...] bind an EXISTING channel',
|
|
42
|
+
unbind: 'qdp unbind <channelId>',
|
|
43
|
+
provision: 'qdp provision <agent-id> [options] create/reuse a channel AND bind it\n'
|
|
44
|
+
+ ' --mode <feed|bridge|team|roundtable> default: feed\n'
|
|
45
|
+
+ ' --channel <name> default: feed-<agent-id> for feed, <agent-id> otherwise\n'
|
|
46
|
+
+ ' --host <hostname-or-ip> dev server the agent runs on (sets bridge_remote_host)\n'
|
|
47
|
+
+ ' --inbox <name> remote session-mail inbox (default <agent-id>-inbox)\n'
|
|
48
|
+
+ ' --outbox <name> remote outbox (default discord-outbox)\n'
|
|
49
|
+
+ ' --two-way allow authorised humans to talk back (bridge only)\n'
|
|
50
|
+
+ ' --persona <name> webhook display name (default: titlecased agent id)\n'
|
|
51
|
+
+ ' --roster <ids> roundtable only: comma-separated "id" or "id:role" list\n'
|
|
52
|
+
+ ' --dry-run print exactly what it WOULD do, change nothing',
|
|
53
|
+
};
|
|
54
|
+
|
|
55
|
+
/**
|
|
56
|
+
* qdp verbs that only READ (quox#1077). Each was checked against bin/qdp.mjs:
|
|
57
|
+
* status/instances/bindings print config.json, the pid file and the systemd
|
|
58
|
+
* state; gaps GETs the open support-gap inbox items; health reads the pid and
|
|
59
|
+
* systemd state; doctor GETs the control API /health and Discord's channel,
|
|
60
|
+
* webhook and @me endpoints. None issues PUT/POST/PATCH/DELETE or writes a
|
|
61
|
+
* file. bind, unbind and provision PUT/DELETE bindings and create channels.
|
|
62
|
+
*/
|
|
63
|
+
export const DISCORD_READ_VERBS = ['status', 'instances', 'bindings', 'gaps', 'health', 'doctor'];
|
|
64
|
+
export const DISCORD_WRITE_VERBS = ['bind', 'unbind', 'provision'];
|
|
65
|
+
|
|
66
|
+
// No "Usage:" line here: the matrix's --help walker (scripts/matrix/cli-tree.mjs) reads one as the command's usage.
|
|
67
|
+
const GENERAL_USAGE = Object.values(VERB_USAGE).map((u) => ` ${u}`).join('\n')
|
|
68
|
+
+ '\n\nRun `quox discord <verb> --help` for a single verb\'s usage.';
|
|
69
|
+
|
|
70
|
+
function runQdp(verb, args = []) {
|
|
71
|
+
if (!fs.existsSync(QDP)) {
|
|
72
|
+
process.stderr.write(
|
|
73
|
+
`Discord Pro control CLI (qdp) not found at ${QDP}\n` +
|
|
74
|
+
'Set QDP_CLI_PATH if it lives elsewhere, or install the quox-discord-pro daemon on this host.\n',
|
|
75
|
+
);
|
|
76
|
+
process.exit(2);
|
|
77
|
+
}
|
|
78
|
+
const r = spawnSync(process.execPath, [QDP, verb, ...args], { stdio: 'inherit' });
|
|
79
|
+
if (r.error) {
|
|
80
|
+
process.stderr.write(`qdp failed to run: ${r.error.message}\n`);
|
|
81
|
+
process.exit(2);
|
|
82
|
+
}
|
|
83
|
+
process.exit(r.status ?? 2);
|
|
84
|
+
}
|
|
85
|
+
|
|
86
|
+
const VERB_DESC = { unbind: 'remove a channel binding', doctor: 'per-binding view/webhook/liveness check (exits non-zero if any binding is broken)' };
|
|
87
|
+
const firstLine = (verb) => VERB_DESC[verb] || VERB_USAGE[verb].split('\n')[0].replace(/^qdp \S+(?: [<[][^\]>]*[>\]])*\s+/, '').trim();
|
|
88
|
+
|
|
89
|
+
/**
|
|
90
|
+
* One commander subcommand per qdp verb (quox#1077). It used to be a single
|
|
91
|
+
* `discord [args...]` leaf, so the CLI leaf policy could only class the whole
|
|
92
|
+
* group, and it classed it write: a read like `quox discord bindings` was held
|
|
93
|
+
* for approval. Per-verb leaves let reads be read and keep bind/unbind/provision
|
|
94
|
+
* write. Commander's own --help runs before any action, so `--help` can never
|
|
95
|
+
* reach qdp and run a mutating verb (quox#603).
|
|
96
|
+
*/
|
|
97
|
+
export function registerDiscordCommands(program) {
|
|
98
|
+
const discord = program
|
|
99
|
+
.command('discord')
|
|
100
|
+
.description('Quox Discord Pro daemon: status | instances | bindings | gaps | health | doctor | bind | unbind | provision')
|
|
101
|
+
.addHelpText('after', `\nPer-verb usage (each verb shells straight through to qdp):\n${GENERAL_USAGE}`);
|
|
102
|
+
|
|
103
|
+
for (const verb of DISCORD_READ_VERBS) {
|
|
104
|
+
discord
|
|
105
|
+
.command(verb)
|
|
106
|
+
.description(firstLine(verb) || verb)
|
|
107
|
+
.addHelpText('after', `\nqdp usage:\n ${VERB_USAGE[verb]}`)
|
|
108
|
+
.action(() => runQdp(verb));
|
|
109
|
+
}
|
|
110
|
+
|
|
111
|
+
const writeArgs = { bind: '<channelId> <mode> [pairs...]', unbind: '<channelId>', provision: '<agentId> [args...]' };
|
|
112
|
+
for (const verb of DISCORD_WRITE_VERBS) {
|
|
113
|
+
const leaf = discord
|
|
114
|
+
.command(`${verb} ${writeArgs[verb]}`);
|
|
115
|
+
// Only provision has a dry run in qdp. Declaring it here keeps it in --help and lets the
|
|
116
|
+
// root guard refuse `discord bind|unbind --dry-run` instead of binding for real.
|
|
117
|
+
if (verb === 'provision') leaf.option('--dry-run', 'print exactly what it WOULD do, change nothing');
|
|
118
|
+
leaf
|
|
119
|
+
.description(firstLine(verb) || verb)
|
|
120
|
+
.addHelpText('after', `\nqdp usage:\n ${VERB_USAGE[verb]}`)
|
|
121
|
+
// qdp parses its own options (provision --mode/--host/...), so they pass through unchanged.
|
|
122
|
+
.allowUnknownOption(true)
|
|
123
|
+
.action((...a) => {
|
|
124
|
+
const cmd = a[a.length - 1];
|
|
125
|
+
const args = [...cmd.args];
|
|
126
|
+
// --dry-run is also a root quox flag, so commander hands it to the root and it never reaches
|
|
127
|
+
// cmd.args: a requested dry run of provision used to provision for real. Forward it explicitly.
|
|
128
|
+
if (cmd.optsWithGlobals().dryRun && !args.includes('--dry-run')) args.push('--dry-run');
|
|
129
|
+
runQdp(verb, args);
|
|
130
|
+
});
|
|
131
|
+
}
|
|
132
|
+
}
|
|
@@ -0,0 +1,181 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* quox doctor — Platform Diagnostics
|
|
3
|
+
*
|
|
4
|
+
* Deep-checks every service, database, agent daemon, and credential.
|
|
5
|
+
* Reports pass/warning/critical with actionable details.
|
|
6
|
+
*
|
|
7
|
+
* CLI-3b (Stream CLI Phase 3)
|
|
8
|
+
*/
|
|
9
|
+
|
|
10
|
+
import chalk from 'chalk';
|
|
11
|
+
import { SERVICE_PORTS } from '../core/config.js';
|
|
12
|
+
import { emitCliEvent } from '../core/aee.js';
|
|
13
|
+
import { resolveCliVersion, checkCliDrift } from '../core/version.js';
|
|
14
|
+
|
|
15
|
+
const CHECKS = [
|
|
16
|
+
// Core services
|
|
17
|
+
{ name: 'Auth service', service: 'auth', port: 3101, path: '/health', critical: true },
|
|
18
|
+
{ name: 'Memory service', service: 'memory', port: 3103, path: '/health' },
|
|
19
|
+
{ name: 'Collector', service: 'collector', port: 9848, path: '/health', critical: true },
|
|
20
|
+
{ name: 'QuoxFlow', service: 'quoxflow', port: 3200, path: '/health' },
|
|
21
|
+
{ name: 'Files service', service: 'files', port: 3102, path: '/health' },
|
|
22
|
+
// External services
|
|
23
|
+
{ name: 'QuoxAgent daemon', port: 9847, path: '/health', url: 'http://localhost:9847' },
|
|
24
|
+
{ name: 'Qdrant vectors', port: 6333, path: '/', url: 'http://localhost:6333' },
|
|
25
|
+
];
|
|
26
|
+
|
|
27
|
+
async function checkEndpoint(url, path, timeoutMs = 3000) {
|
|
28
|
+
const start = Date.now();
|
|
29
|
+
try {
|
|
30
|
+
const resp = await fetch(`${url}${path}`, {
|
|
31
|
+
signal: AbortSignal.timeout(timeoutMs),
|
|
32
|
+
});
|
|
33
|
+
const latency = Date.now() - start;
|
|
34
|
+
if (resp.ok) {
|
|
35
|
+
return { status: 'pass', latency_ms: latency };
|
|
36
|
+
}
|
|
37
|
+
return { status: 'warn', latency_ms: latency, detail: `HTTP ${resp.status}` };
|
|
38
|
+
} catch (err) {
|
|
39
|
+
return { status: 'fail', latency_ms: null, detail: err.message };
|
|
40
|
+
}
|
|
41
|
+
}
|
|
42
|
+
|
|
43
|
+
/**
|
|
44
|
+
* Every doctor check, in this process: services, auth token, CLI version. Shared by `quox doctor` and the
|
|
45
|
+
* conversation's /doctor so the two can never disagree. -> [{ name, status, detail?, latency_ms?, ... }].
|
|
46
|
+
*/
|
|
47
|
+
export async function runDoctorChecks({ config }) {
|
|
48
|
+
// Check all services in parallel — per-item try/catch so one failure doesn't lose all results
|
|
49
|
+
const checks = await Promise.all(
|
|
50
|
+
CHECKS.map(async (check) => {
|
|
51
|
+
try {
|
|
52
|
+
const url = check.url || config.getServiceUrl(check.service);
|
|
53
|
+
let result = await checkEndpoint(url, check.path);
|
|
54
|
+
// #623: doctor was crying CRITICAL when the configured URL was just
|
|
55
|
+
// WRONG (stale profile override / wrong scheme+host) while the
|
|
56
|
+
// service was up on its loopback bind. On a connection failure,
|
|
57
|
+
// probe http://127.0.0.1:<port> — if THAT answers, the service is
|
|
58
|
+
// UP and the verdict is "misconfigured URL", not "service down".
|
|
59
|
+
// Downgrade to a warning that names the reachable bind + the bad
|
|
60
|
+
// URL, so an operator fixes the config instead of chasing an outage.
|
|
61
|
+
if (result.status === 'fail' && check.port) {
|
|
62
|
+
const loopbackUrl = `http://127.0.0.1:${check.port}`;
|
|
63
|
+
if (url !== loopbackUrl) {
|
|
64
|
+
const alt = await checkEndpoint(loopbackUrl, check.path);
|
|
65
|
+
if (alt.status === 'pass') {
|
|
66
|
+
result = {
|
|
67
|
+
status: 'warn',
|
|
68
|
+
latency_ms: alt.latency_ms,
|
|
69
|
+
detail: `reachable at ${loopbackUrl} but configured URL ${url} failed — profile URL likely stale/wrong (misconfig, not an outage)`,
|
|
70
|
+
};
|
|
71
|
+
}
|
|
72
|
+
}
|
|
73
|
+
}
|
|
74
|
+
return {
|
|
75
|
+
name: check.name,
|
|
76
|
+
port: check.port,
|
|
77
|
+
...result,
|
|
78
|
+
critical: check.critical || false,
|
|
79
|
+
};
|
|
80
|
+
} catch {
|
|
81
|
+
return {
|
|
82
|
+
name: check.name,
|
|
83
|
+
port: check.port,
|
|
84
|
+
ok: false,
|
|
85
|
+
status: 'error',
|
|
86
|
+
ms: 0,
|
|
87
|
+
critical: check.critical || false,
|
|
88
|
+
};
|
|
89
|
+
}
|
|
90
|
+
})
|
|
91
|
+
);
|
|
92
|
+
|
|
93
|
+
// Check auth token. fleet #479: the CURRENT profile (persisted
|
|
94
|
+
// default, or a -p/QUOX_PROFILE override) is config._effectiveProfile,
|
|
95
|
+
// never config._data.activeProfile (that's always the persisted
|
|
96
|
+
// default now, and would report the wrong profile under an override).
|
|
97
|
+
const auth = config.getAuth?.() || config._data?.profiles?.[config._effectiveProfile]?.auth;
|
|
98
|
+
if (auth?.access_token) {
|
|
99
|
+
const expired = auth.expires_at && Date.now() > auth.expires_at;
|
|
100
|
+
if (expired) {
|
|
101
|
+
checks.push({ name: 'Auth token', status: 'warn', detail: 'expired' });
|
|
102
|
+
} else {
|
|
103
|
+
const remaining = auth.expires_at ? Math.round((auth.expires_at - Date.now()) / 3600000) : '?';
|
|
104
|
+
checks.push({ name: 'Auth token', status: 'pass', detail: `valid (expires in ${remaining}h)` });
|
|
105
|
+
}
|
|
106
|
+
} else {
|
|
107
|
+
checks.push({ name: 'Auth token', status: 'warn', detail: 'not logged in' });
|
|
108
|
+
}
|
|
109
|
+
|
|
110
|
+
// #610 Part 3: which build is this, and is it drifted from origin/main?
|
|
111
|
+
// A silently-stale CLI (the worktree was 32 commits behind and nothing
|
|
112
|
+
// said so) is a real warning, so a stale drift maps to 'warn' and bumps
|
|
113
|
+
// the exit code like any other. unknown/skip are informational (pass) —
|
|
114
|
+
// never fail a health check because we could not compute drift. The
|
|
115
|
+
// drift count reflects the last fetch (no network fetch here).
|
|
116
|
+
const cliVersion = resolveCliVersion();
|
|
117
|
+
const drift = checkCliDrift();
|
|
118
|
+
checks.push({
|
|
119
|
+
name: 'CLI version',
|
|
120
|
+
status: drift.status === 'stale' ? 'warn' : 'pass',
|
|
121
|
+
detail: `${cliVersion} · ${drift.detail}`,
|
|
122
|
+
});
|
|
123
|
+
|
|
124
|
+
return checks;
|
|
125
|
+
}
|
|
126
|
+
|
|
127
|
+
export function registerDoctorCommand(program, ctx) {
|
|
128
|
+
const { config, client } = ctx;
|
|
129
|
+
|
|
130
|
+
program
|
|
131
|
+
.command('doctor')
|
|
132
|
+
.description('Run platform health diagnostics')
|
|
133
|
+
.action(async (opts, cmd) => {
|
|
134
|
+
const outputFormat = cmd.parent?.opts()?.output || 'table';
|
|
135
|
+
const isJson = outputFormat === 'json' || cmd.parent?.opts()?.json;
|
|
136
|
+
|
|
137
|
+
const checks = await runDoctorChecks({ config });
|
|
138
|
+
|
|
139
|
+
// Summary
|
|
140
|
+
const passed = checks.filter(c => c.status === 'pass').length;
|
|
141
|
+
const warnings = checks.filter(c => c.status === 'warn').length;
|
|
142
|
+
const failed = checks.filter(c => c.status === 'fail').length;
|
|
143
|
+
|
|
144
|
+
if (isJson) {
|
|
145
|
+
console.log(JSON.stringify({ checks, summary: { passed, warnings, failed } }, null, 2));
|
|
146
|
+
return;
|
|
147
|
+
}
|
|
148
|
+
|
|
149
|
+
// Render
|
|
150
|
+
console.log('');
|
|
151
|
+
for (const c of checks) {
|
|
152
|
+
const icon = c.status === 'pass' ? chalk.green(' ✓')
|
|
153
|
+
: c.status === 'warn' ? chalk.yellow(' ⚠')
|
|
154
|
+
: chalk.red(' ✗');
|
|
155
|
+
|
|
156
|
+
const latency = c.latency_ms != null ? chalk.dim(` (${c.latency_ms}ms)`) : '';
|
|
157
|
+
const detail = c.detail ? chalk.dim(` ${c.detail}`) : '';
|
|
158
|
+
const port = c.port ? chalk.dim(` ${c.port}`) : '';
|
|
159
|
+
|
|
160
|
+
console.log(`${icon} ${c.name.padEnd(20)}${port}${latency}${detail}`);
|
|
161
|
+
}
|
|
162
|
+
|
|
163
|
+
console.log('');
|
|
164
|
+
const parts = [];
|
|
165
|
+
if (passed) parts.push(chalk.green(`${passed} passed`));
|
|
166
|
+
if (warnings) parts.push(chalk.yellow(`${warnings} warning${warnings > 1 ? 's' : ''}`));
|
|
167
|
+
if (failed) parts.push(chalk.red(`${failed} critical`));
|
|
168
|
+
console.log(` ${parts.join(' ')}`);
|
|
169
|
+
console.log('');
|
|
170
|
+
|
|
171
|
+
emitCliEvent(client, {
|
|
172
|
+
command: 'doctor',
|
|
173
|
+
intent: 'quox.cli.doctor',
|
|
174
|
+
payload: { passed, warnings, failed, total: checks.length },
|
|
175
|
+
status: failed > 0 ? 'error' : 'success',
|
|
176
|
+
});
|
|
177
|
+
|
|
178
|
+
if (failed > 0) process.exitCode = 2;
|
|
179
|
+
else if (warnings > 0) process.exitCode = 1;
|
|
180
|
+
});
|
|
181
|
+
}
|
|
@@ -0,0 +1,114 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Domain commands: org domain verification (DNS TXT record ownership proof)
|
|
3
|
+
*
|
|
4
|
+
* quox domain list|add|verify|remove
|
|
5
|
+
*
|
|
6
|
+
* Backend: services/auth/routes/domains.js, mounted at plain `/api`
|
|
7
|
+
* (org-scoped IN the URL: /api/orgs/:orgId/domains...). Team-tier+ +
|
|
8
|
+
* ORG_MANAGE_SETTINGS gated — expect 402/403 on non-team orgs.
|
|
9
|
+
*
|
|
10
|
+
* `add` returns a verification token and human-readable DNS instructions;
|
|
11
|
+
* `verify` re-checks DNS and returns 202 (retryable) rather than an error
|
|
12
|
+
* when the TXT record isn't there yet or hasn't propagated.
|
|
13
|
+
*/
|
|
14
|
+
|
|
15
|
+
import { formatOutput, formatDetail, printSuccess, printWarning, printInfo } from '../core/output.js';
|
|
16
|
+
import { resolveOrgId } from './helpers.js';
|
|
17
|
+
import { resolveEndpoint } from '../api/endpoints.js';
|
|
18
|
+
|
|
19
|
+
export function registerDomainCommands(program, ctx) {
|
|
20
|
+
const { client, auth } = ctx;
|
|
21
|
+
|
|
22
|
+
const domain = program
|
|
23
|
+
.command('domain')
|
|
24
|
+
.description('Manage org domain verification (team+ — DNS ownership proof)');
|
|
25
|
+
|
|
26
|
+
// ── domain list ──────────────────────────────────────────────────────────────
|
|
27
|
+
|
|
28
|
+
domain
|
|
29
|
+
.command('list')
|
|
30
|
+
.description('List domains claimed by the active org')
|
|
31
|
+
.action(async () => {
|
|
32
|
+
auth.requireAuth();
|
|
33
|
+
const orgId = resolveOrgId(auth, program);
|
|
34
|
+
const ep = resolveEndpoint('domains.list', { orgId });
|
|
35
|
+
const data = await client.get(ep.path, { service: ep.service });
|
|
36
|
+
const rows = data.domains || data || [];
|
|
37
|
+
|
|
38
|
+
formatOutput({
|
|
39
|
+
// fleet #392: column is verified_at (a timestamp), not a `verified` flag.
|
|
40
|
+
columns: ['id', 'domain', 'verified_at', 'created_at'],
|
|
41
|
+
headers: ['ID', 'Domain', 'Verified', 'Created'],
|
|
42
|
+
rows,
|
|
43
|
+
}, { format: program.opts().output, emptyMessage: 'No domains claimed for this org.' });
|
|
44
|
+
});
|
|
45
|
+
|
|
46
|
+
// ── domain add ───────────────────────────────────────────────────────────────
|
|
47
|
+
|
|
48
|
+
domain
|
|
49
|
+
.command('add')
|
|
50
|
+
.description('Claim a domain and get its DNS verification instructions')
|
|
51
|
+
.argument('<domain>', 'domain name (e.g. "example.com")')
|
|
52
|
+
.action(async (domainName) => {
|
|
53
|
+
auth.requireAuth();
|
|
54
|
+
const orgId = resolveOrgId(auth, program);
|
|
55
|
+
const body = { domain: domainName };
|
|
56
|
+
|
|
57
|
+
const ep = resolveEndpoint('domains.create', { orgId });
|
|
58
|
+
const data = await client.post(ep.path, { service: ep.service, body });
|
|
59
|
+
printSuccess(`Domain "${domainName}" claim started.`);
|
|
60
|
+
formatDetail(data.domain || {}, { format: program.opts().output });
|
|
61
|
+
if (data.instructions && program.opts().output !== 'json') {
|
|
62
|
+
printInfo(data.instructions);
|
|
63
|
+
}
|
|
64
|
+
});
|
|
65
|
+
|
|
66
|
+
// ── domain verify ────────────────────────────────────────────────────────────
|
|
67
|
+
|
|
68
|
+
domain
|
|
69
|
+
.command('verify')
|
|
70
|
+
.description('Re-check DNS for a claimed domain')
|
|
71
|
+
.argument('<domainId>', 'domain ID')
|
|
72
|
+
.action(async (domainId) => {
|
|
73
|
+
auth.requireAuth();
|
|
74
|
+
const orgId = resolveOrgId(auth, program);
|
|
75
|
+
const ep = resolveEndpoint('domains.verify', { orgId, domainId });
|
|
76
|
+
const data = await client.post(ep.path, { service: ep.service });
|
|
77
|
+
|
|
78
|
+
if (data.verified) {
|
|
79
|
+
printSuccess('Domain verified.');
|
|
80
|
+
} else {
|
|
81
|
+
printWarning(`Not verified yet (reason: ${data.reason || 'unknown'}).${data.retryable ? ' Retryable — DNS changes can take up to 48 hours.' : ''}`);
|
|
82
|
+
}
|
|
83
|
+
});
|
|
84
|
+
|
|
85
|
+
// ── domain remove ────────────────────────────────────────────────────────────
|
|
86
|
+
|
|
87
|
+
domain
|
|
88
|
+
.command('remove')
|
|
89
|
+
.description('Remove a claimed domain')
|
|
90
|
+
.argument('<domainId>', 'domain ID')
|
|
91
|
+
.option('--force', 'skip confirmation')
|
|
92
|
+
.action(async (domainId, options) => {
|
|
93
|
+
auth.requireAuth();
|
|
94
|
+
const orgId = resolveOrgId(auth, program);
|
|
95
|
+
|
|
96
|
+
if (!options.force && !program.opts().yes) {
|
|
97
|
+
const { default: inquirer } = await import('inquirer');
|
|
98
|
+
const ans = await inquirer.prompt([{
|
|
99
|
+
type: 'confirm',
|
|
100
|
+
name: 'confirm',
|
|
101
|
+
message: `Remove domain ${domainId}? SSO/user-domain routing tied to it will stop working.`,
|
|
102
|
+
default: false,
|
|
103
|
+
}]);
|
|
104
|
+
if (!ans.confirm) {
|
|
105
|
+
printInfo('Cancelled.');
|
|
106
|
+
return;
|
|
107
|
+
}
|
|
108
|
+
}
|
|
109
|
+
|
|
110
|
+
const ep = resolveEndpoint('domains.delete', { orgId, domainId });
|
|
111
|
+
await client.delete(ep.path, { service: ep.service });
|
|
112
|
+
printSuccess('Domain removed.');
|
|
113
|
+
});
|
|
114
|
+
}
|