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,286 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Role commands: org custom roles (RBAC) + agent/tool permission rules
|
|
3
|
+
*
|
|
4
|
+
* quox role list|get|create|delete
|
|
5
|
+
* quox role capability add|remove
|
|
6
|
+
* quox role agent list|set|clear
|
|
7
|
+
* quox role tool list|set|clear
|
|
8
|
+
*
|
|
9
|
+
* Backend: services/auth/routes/customRoles.js, mounted at plain `/api`
|
|
10
|
+
* (org-scoped IN the URL: /api/orgs/:orgId/custom-roles...). Enterprise-tier
|
|
11
|
+
* + ORG_MANAGE_ROLES gated — expect 402/403 on non-enterprise orgs.
|
|
12
|
+
*
|
|
13
|
+
* Capability grants are subject to a server-side privilege-escalation
|
|
14
|
+
* guard: for capabilities in the known Capabilities enum, the caller must
|
|
15
|
+
* already hold the capability themselves or the grant is rejected with
|
|
16
|
+
* `forbidden_escalation` (customRoles.js:166-188). Free-form custom
|
|
17
|
+
* capability strings bypass this check (org-defined extensions).
|
|
18
|
+
*/
|
|
19
|
+
|
|
20
|
+
import { formatOutput, formatDetail, printSuccess, printInfo } from '../core/output.js';
|
|
21
|
+
import { resolveOrgId } from './helpers.js';
|
|
22
|
+
import { resolveEndpoint } from '../api/endpoints.js';
|
|
23
|
+
|
|
24
|
+
export function registerRoleCommands(program, ctx) {
|
|
25
|
+
const { client, auth } = ctx;
|
|
26
|
+
|
|
27
|
+
const role = program
|
|
28
|
+
.command('role')
|
|
29
|
+
.description('Manage org custom roles (enterprise — RBAC)');
|
|
30
|
+
|
|
31
|
+
// ── role list ────────────────────────────────────────────────────────────────
|
|
32
|
+
|
|
33
|
+
role
|
|
34
|
+
.command('list')
|
|
35
|
+
.description('List custom roles for the active org')
|
|
36
|
+
.action(async () => {
|
|
37
|
+
auth.requireAuth();
|
|
38
|
+
const orgId = resolveOrgId(auth, program);
|
|
39
|
+
const ep = resolveEndpoint('custom-roles.list', { orgId });
|
|
40
|
+
const data = await client.get(ep.path, { service: ep.service });
|
|
41
|
+
const rows = data.roles || data || [];
|
|
42
|
+
|
|
43
|
+
formatOutput({
|
|
44
|
+
columns: ['id', 'slug', 'name', 'description', 'created_at'],
|
|
45
|
+
headers: ['ID', 'Slug', 'Name', 'Description', 'Created'],
|
|
46
|
+
rows,
|
|
47
|
+
}, { format: program.opts().output, emptyMessage: 'No custom roles configured.' });
|
|
48
|
+
});
|
|
49
|
+
|
|
50
|
+
// ── role get ─────────────────────────────────────────────────────────────────
|
|
51
|
+
|
|
52
|
+
role
|
|
53
|
+
.command('get')
|
|
54
|
+
.description('Show a custom role and its granted capabilities')
|
|
55
|
+
.argument('<roleId>', 'role ID')
|
|
56
|
+
.action(async (roleId) => {
|
|
57
|
+
auth.requireAuth();
|
|
58
|
+
const orgId = resolveOrgId(auth, program);
|
|
59
|
+
const ep = resolveEndpoint('custom-roles.get', { orgId, roleId });
|
|
60
|
+
const data = await client.get(ep.path, { service: ep.service });
|
|
61
|
+
|
|
62
|
+
formatDetail(data.role || {}, {
|
|
63
|
+
format: program.opts().output,
|
|
64
|
+
title: `Role: ${data.role?.name || roleId}`,
|
|
65
|
+
fields: ['id', 'slug', 'name', 'description', 'created_at'],
|
|
66
|
+
});
|
|
67
|
+
const capabilities = data.capabilities || [];
|
|
68
|
+
if (program.opts().output !== 'json') {
|
|
69
|
+
formatOutput({
|
|
70
|
+
columns: ['capability', 'scope_id'],
|
|
71
|
+
headers: ['Capability', 'Scope'],
|
|
72
|
+
rows: capabilities,
|
|
73
|
+
}, { format: program.opts().output, emptyMessage: 'No capabilities granted.' });
|
|
74
|
+
}
|
|
75
|
+
});
|
|
76
|
+
|
|
77
|
+
// ── role create ──────────────────────────────────────────────────────────────
|
|
78
|
+
|
|
79
|
+
role
|
|
80
|
+
.command('create')
|
|
81
|
+
.description('Create a custom role')
|
|
82
|
+
.requiredOption('--slug <slug>', 'unique role slug')
|
|
83
|
+
.requiredOption('--name <name>', 'role name')
|
|
84
|
+
.option('--description <text>', 'role description')
|
|
85
|
+
.action(async (options) => {
|
|
86
|
+
auth.requireAuth();
|
|
87
|
+
const orgId = resolveOrgId(auth, program);
|
|
88
|
+
const body = { slug: options.slug, name: options.name };
|
|
89
|
+
if (options.description) body.description = options.description;
|
|
90
|
+
|
|
91
|
+
const ep = resolveEndpoint('custom-roles.create', { orgId });
|
|
92
|
+
const data = await client.post(ep.path, { service: ep.service, body });
|
|
93
|
+
printSuccess(`Role "${options.name}" created.`);
|
|
94
|
+
formatDetail(data.role || data, { format: program.opts().output });
|
|
95
|
+
});
|
|
96
|
+
|
|
97
|
+
// ── role delete ──────────────────────────────────────────────────────────────
|
|
98
|
+
|
|
99
|
+
role
|
|
100
|
+
.command('delete')
|
|
101
|
+
.description('Delete a custom role')
|
|
102
|
+
.argument('<roleId>', 'role ID')
|
|
103
|
+
.option('--force', 'skip confirmation')
|
|
104
|
+
.action(async (roleId, options) => {
|
|
105
|
+
auth.requireAuth();
|
|
106
|
+
const orgId = resolveOrgId(auth, program);
|
|
107
|
+
|
|
108
|
+
if (!options.force && !program.opts().yes) {
|
|
109
|
+
const { default: inquirer } = await import('inquirer');
|
|
110
|
+
const ans = await inquirer.prompt([{
|
|
111
|
+
type: 'confirm',
|
|
112
|
+
name: 'confirm',
|
|
113
|
+
message: `Delete role ${roleId}? Members assigned this role lose its capabilities immediately.`,
|
|
114
|
+
default: false,
|
|
115
|
+
}]);
|
|
116
|
+
if (!ans.confirm) {
|
|
117
|
+
printInfo('Cancelled.');
|
|
118
|
+
return;
|
|
119
|
+
}
|
|
120
|
+
}
|
|
121
|
+
|
|
122
|
+
const ep = resolveEndpoint('custom-roles.delete', { orgId, roleId });
|
|
123
|
+
await client.delete(ep.path, { service: ep.service });
|
|
124
|
+
printSuccess('Role deleted.');
|
|
125
|
+
});
|
|
126
|
+
|
|
127
|
+
// ── role capability ─────────────────────────────────────────────────────────
|
|
128
|
+
|
|
129
|
+
const capability = role
|
|
130
|
+
.command('capability')
|
|
131
|
+
.description('Manage capability grants on a role');
|
|
132
|
+
|
|
133
|
+
capability
|
|
134
|
+
.command('add')
|
|
135
|
+
.description('Grant a capability to a role')
|
|
136
|
+
.argument('<roleId>', 'role ID')
|
|
137
|
+
.argument('<capability>', 'capability string (e.g. "agents.manage")')
|
|
138
|
+
.option('--scope-id <scopeId>', 'restrict the grant to a specific scope')
|
|
139
|
+
.action(async (roleId, cap, options) => {
|
|
140
|
+
auth.requireAuth();
|
|
141
|
+
const orgId = resolveOrgId(auth, program);
|
|
142
|
+
const body = { capability: cap };
|
|
143
|
+
if (options.scopeId) body.scope_id = options.scopeId;
|
|
144
|
+
|
|
145
|
+
const ep = resolveEndpoint('custom-roles.capabilities.add', { orgId, roleId });
|
|
146
|
+
await client.post(ep.path, { service: ep.service, body });
|
|
147
|
+
printSuccess(`Capability "${cap}" granted.`);
|
|
148
|
+
});
|
|
149
|
+
|
|
150
|
+
capability
|
|
151
|
+
.command('remove')
|
|
152
|
+
.description('Revoke a capability from a role')
|
|
153
|
+
.argument('<roleId>', 'role ID')
|
|
154
|
+
.argument('<capability>', 'capability string')
|
|
155
|
+
.option('--scope-id <scopeId>', 'scope ID (must match the grant\'s scope)')
|
|
156
|
+
.action(async (roleId, cap, options) => {
|
|
157
|
+
auth.requireAuth();
|
|
158
|
+
const orgId = resolveOrgId(auth, program);
|
|
159
|
+
const query = { capability: cap };
|
|
160
|
+
if (options.scopeId) query.scope_id = options.scopeId;
|
|
161
|
+
|
|
162
|
+
const ep = resolveEndpoint('custom-roles.capabilities.remove', { orgId, roleId });
|
|
163
|
+
await client.delete(ep.path, { service: ep.service, query });
|
|
164
|
+
printSuccess(`Capability "${cap}" revoked.`);
|
|
165
|
+
});
|
|
166
|
+
|
|
167
|
+
// ── role agent ───────────────────────────────────────────────────────────────
|
|
168
|
+
|
|
169
|
+
const agent = role
|
|
170
|
+
.command('agent')
|
|
171
|
+
.description('Manage agent access rules on a role');
|
|
172
|
+
|
|
173
|
+
agent
|
|
174
|
+
.command('list')
|
|
175
|
+
.description('List agent access rules for a role')
|
|
176
|
+
.argument('<roleId>', 'role ID')
|
|
177
|
+
.action(async (roleId) => {
|
|
178
|
+
auth.requireAuth();
|
|
179
|
+
const orgId = resolveOrgId(auth, program);
|
|
180
|
+
const ep = resolveEndpoint('custom-roles.agents.list', { orgId, roleId });
|
|
181
|
+
const data = await client.get(ep.path, { service: ep.service });
|
|
182
|
+
const rows = data.permissions || data || [];
|
|
183
|
+
|
|
184
|
+
formatOutput({
|
|
185
|
+
columns: ['agent_id', 'scope_id', 'allowed'],
|
|
186
|
+
headers: ['Agent ID', 'Scope', 'Allowed'],
|
|
187
|
+
rows,
|
|
188
|
+
}, { format: program.opts().output, emptyMessage: 'No agent access rules set for this role.' });
|
|
189
|
+
});
|
|
190
|
+
|
|
191
|
+
agent
|
|
192
|
+
.command('set')
|
|
193
|
+
.description('Set (allow or deny) a role\'s access to an agent')
|
|
194
|
+
.argument('<roleId>', 'role ID')
|
|
195
|
+
.argument('<agentId>', 'agent ID')
|
|
196
|
+
.requiredOption('--allowed <bool>', 'true|false')
|
|
197
|
+
.option('--scope-id <scopeId>', 'restrict the rule to a specific scope')
|
|
198
|
+
.action(async (roleId, agentId, options) => {
|
|
199
|
+
auth.requireAuth();
|
|
200
|
+
const orgId = resolveOrgId(auth, program);
|
|
201
|
+
if (options.allowed !== 'true' && options.allowed !== 'false') {
|
|
202
|
+
throw new Error('--allowed must be "true" or "false".');
|
|
203
|
+
}
|
|
204
|
+
const body = { agent_id: agentId, allowed: options.allowed === 'true' };
|
|
205
|
+
if (options.scopeId) body.scope_id = options.scopeId;
|
|
206
|
+
|
|
207
|
+
const ep = resolveEndpoint('custom-roles.agents.set', { orgId, roleId });
|
|
208
|
+
await client.put(ep.path, { service: ep.service, body });
|
|
209
|
+
printSuccess(`Agent access rule set (${body.allowed ? 'allowed' : 'denied'}).`);
|
|
210
|
+
});
|
|
211
|
+
|
|
212
|
+
agent
|
|
213
|
+
.command('clear')
|
|
214
|
+
.description('Remove an agent access rule from a role')
|
|
215
|
+
.argument('<roleId>', 'role ID')
|
|
216
|
+
.argument('<agentId>', 'agent ID')
|
|
217
|
+
.option('--scope-id <scopeId>', 'scope ID (must match the rule\'s scope)')
|
|
218
|
+
.action(async (roleId, agentId, options) => {
|
|
219
|
+
auth.requireAuth();
|
|
220
|
+
const orgId = resolveOrgId(auth, program);
|
|
221
|
+
const query = { agent_id: agentId };
|
|
222
|
+
if (options.scopeId) query.scope_id = options.scopeId;
|
|
223
|
+
|
|
224
|
+
const ep = resolveEndpoint('custom-roles.agents.clear', { orgId, roleId });
|
|
225
|
+
await client.delete(ep.path, { service: ep.service, query });
|
|
226
|
+
printSuccess('Agent access rule cleared.');
|
|
227
|
+
});
|
|
228
|
+
|
|
229
|
+
// ── role tool ────────────────────────────────────────────────────────────────
|
|
230
|
+
|
|
231
|
+
const tool = role
|
|
232
|
+
.command('tool')
|
|
233
|
+
.description('Manage tool access rules on a role');
|
|
234
|
+
|
|
235
|
+
tool
|
|
236
|
+
.command('list')
|
|
237
|
+
.description('List tool access rules for a role')
|
|
238
|
+
.argument('<roleId>', 'role ID')
|
|
239
|
+
.action(async (roleId) => {
|
|
240
|
+
auth.requireAuth();
|
|
241
|
+
const orgId = resolveOrgId(auth, program);
|
|
242
|
+
const ep = resolveEndpoint('custom-roles.tools.list', { orgId, roleId });
|
|
243
|
+
const data = await client.get(ep.path, { service: ep.service });
|
|
244
|
+
const rows = data.permissions || data || [];
|
|
245
|
+
|
|
246
|
+
formatOutput({
|
|
247
|
+
columns: ['tool_id', 'allowed'],
|
|
248
|
+
headers: ['Tool ID', 'Allowed'],
|
|
249
|
+
rows,
|
|
250
|
+
}, { format: program.opts().output, emptyMessage: 'No tool access rules set for this role.' });
|
|
251
|
+
});
|
|
252
|
+
|
|
253
|
+
tool
|
|
254
|
+
.command('set')
|
|
255
|
+
.description('Set (allow or deny) a role\'s access to a tool')
|
|
256
|
+
.argument('<roleId>', 'role ID')
|
|
257
|
+
.argument('<toolId>', 'tool ID')
|
|
258
|
+
.requiredOption('--allowed <bool>', 'true|false')
|
|
259
|
+
.action(async (roleId, toolId, options) => {
|
|
260
|
+
auth.requireAuth();
|
|
261
|
+
const orgId = resolveOrgId(auth, program);
|
|
262
|
+
if (options.allowed !== 'true' && options.allowed !== 'false') {
|
|
263
|
+
throw new Error('--allowed must be "true" or "false".');
|
|
264
|
+
}
|
|
265
|
+
const body = { tool_id: toolId, allowed: options.allowed === 'true' };
|
|
266
|
+
|
|
267
|
+
const ep = resolveEndpoint('custom-roles.tools.set', { orgId, roleId });
|
|
268
|
+
await client.put(ep.path, { service: ep.service, body });
|
|
269
|
+
printSuccess(`Tool access rule set (${body.allowed ? 'allowed' : 'denied'}).`);
|
|
270
|
+
});
|
|
271
|
+
|
|
272
|
+
tool
|
|
273
|
+
.command('clear')
|
|
274
|
+
.description('Remove a tool access rule from a role')
|
|
275
|
+
.argument('<roleId>', 'role ID')
|
|
276
|
+
.argument('<toolId>', 'tool ID')
|
|
277
|
+
.action(async (roleId, toolId) => {
|
|
278
|
+
auth.requireAuth();
|
|
279
|
+
const orgId = resolveOrgId(auth, program);
|
|
280
|
+
const query = { tool_id: toolId };
|
|
281
|
+
|
|
282
|
+
const ep = resolveEndpoint('custom-roles.tools.clear', { orgId, roleId });
|
|
283
|
+
await client.delete(ep.path, { service: ep.service, query });
|
|
284
|
+
printSuccess('Tool access rule cleared.');
|
|
285
|
+
});
|
|
286
|
+
}
|
|
@@ -0,0 +1,77 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* `quox router` : read-only MikroTik RouterOS views via the NETWATCH tools (ROUTEROS-WIRE).
|
|
3
|
+
*
|
|
4
|
+
* quox router health CPU, memory, temperature, uptime
|
|
5
|
+
* quox router leases DHCP leases
|
|
6
|
+
* quox router pools DHCP pool usage
|
|
7
|
+
* quox router conflicts IP address conflicts (ARP vs DHCP leases)
|
|
8
|
+
* quox router free-ip [--count n] [--pool name] spare addresses for static use (reserves nothing)
|
|
9
|
+
* quox router vpn VPN tunnel health (WireGuard + IPsec)
|
|
10
|
+
* quox router wireguard WireGuard peers and whether they are connected
|
|
11
|
+
* quox router inventory routers and the devices connected to them
|
|
12
|
+
* quox router trust --show the router's current TLS fingerprint (sends NO credentials; pins nothing)
|
|
13
|
+
*
|
|
14
|
+
* Every verb is one tool call through POST /api/v1/tools/execute. No verb writes to the router.
|
|
15
|
+
* Engine: lib/core/router.js.
|
|
16
|
+
*/
|
|
17
|
+
import { resolveOrgId } from './helpers.js';
|
|
18
|
+
import { ROUTER_TOOLS, ROUTER_FORMATTERS, makeRouterExec, formatTrust } from '../core/router.js';
|
|
19
|
+
import { resolveEndpoint } from '../api/endpoints.js';
|
|
20
|
+
|
|
21
|
+
const DESCRIPTIONS = {
|
|
22
|
+
health: 'Router CPU, memory, temperature and uptime (read only)',
|
|
23
|
+
leases: 'DHCP leases: which devices hold an address (read only)',
|
|
24
|
+
pools: 'DHCP pool usage: size, used, free (read only)',
|
|
25
|
+
conflicts: 'IP address conflicts seen by the router, ARP vs DHCP leases (read only)',
|
|
26
|
+
'free-ip': 'Spare pool addresses for static assignment; reserves nothing (read only)',
|
|
27
|
+
vpn: 'VPN tunnel health, WireGuard and IPsec (read only)',
|
|
28
|
+
wireguard: 'WireGuard peers and whether each is connected (read only)',
|
|
29
|
+
inventory: 'MikroTik routers and the devices connected to them (read only)',
|
|
30
|
+
};
|
|
31
|
+
|
|
32
|
+
export function registerRouterCommands(program, ctx) {
|
|
33
|
+
const { client, auth } = ctx;
|
|
34
|
+
const json = () => program.opts().output === 'json';
|
|
35
|
+
|
|
36
|
+
const router = program
|
|
37
|
+
.command('router')
|
|
38
|
+
.description('MikroTik RouterOS read-only views via NETWATCH (health, DHCP, VPN, inventory)');
|
|
39
|
+
|
|
40
|
+
for (const verb of Object.keys(ROUTER_TOOLS)) {
|
|
41
|
+
const cmd = router.command(verb).description(DESCRIPTIONS[verb]);
|
|
42
|
+
if (verb === 'free-ip') {
|
|
43
|
+
cmd.option('--count <n>', 'how many addresses (1-20)', '3').option('--pool <name>', 'only this DHCP pool');
|
|
44
|
+
}
|
|
45
|
+
cmd.action(async (opts = {}) => {
|
|
46
|
+
auth.requireAuth();
|
|
47
|
+
const exec = makeRouterExec({ client, orgId: resolveOrgId(auth, program) });
|
|
48
|
+
const input = {};
|
|
49
|
+
if (verb === 'free-ip') {
|
|
50
|
+
const n = Number.parseInt(opts.count, 10);
|
|
51
|
+
if (!Number.isInteger(n) || n < 1 || n > 20) throw new Error('--count must be a whole number from 1 to 20');
|
|
52
|
+
input.count = n;
|
|
53
|
+
if (opts.pool) input.pool = String(opts.pool);
|
|
54
|
+
}
|
|
55
|
+
const p = await exec(ROUTER_TOOLS[verb], input);
|
|
56
|
+
if (json()) console.log(JSON.stringify(p, null, 2));
|
|
57
|
+
else console.log(ROUTER_FORMATTERS[verb](p).join('\n'));
|
|
58
|
+
});
|
|
59
|
+
}
|
|
60
|
+
|
|
61
|
+
// quoxai/quox#1236: the operator reads the endpoint's fingerprint here (no credentials sent),
|
|
62
|
+
// compares it out of band, then sets MIKROTIK_TLS_PIN themselves. This verb never pins.
|
|
63
|
+
router
|
|
64
|
+
.command('trust')
|
|
65
|
+
.description("Show the router's current TLS fingerprint, sending no credentials (never pins; you set MIKROTIK_TLS_PIN yourself)")
|
|
66
|
+
.option('--show', "print the fingerprint the router's HTTPS endpoint presents now")
|
|
67
|
+
.action(async (opts = {}) => {
|
|
68
|
+
auth.requireAuth();
|
|
69
|
+
if (!opts.show) {
|
|
70
|
+
throw new Error('quox router trust only has --show. It never pins anything: compare the fingerprint out of band, then set MIKROTIK_TLS_PIN yourself.');
|
|
71
|
+
}
|
|
72
|
+
const ep = resolveEndpoint('router.tlsFingerprint');
|
|
73
|
+
const data = await client.get(ep.path, { service: ep.service, query: { org_id: resolveOrgId(auth, program) } });
|
|
74
|
+
if (json()) { console.log(JSON.stringify(data, null, 2)); return; }
|
|
75
|
+
console.log(formatTrust(data).join('\n'));
|
|
76
|
+
});
|
|
77
|
+
}
|