quoxcli 0.2.0 → 0.4.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +1 -1
- package/README.md +2 -0
- package/bin/quox.js +99 -126
- package/lib/api/endpoints/actions.js +15 -0
- package/lib/api/endpoints/admin.js +46 -0
- package/lib/api/endpoints/agent-schedules.js +26 -0
- package/lib/api/endpoints/agents.js +7 -0
- package/lib/api/endpoints/assistants.js +12 -0
- package/lib/api/endpoints/away.js +15 -0
- package/lib/api/endpoints/blog.js +16 -0
- package/lib/api/endpoints/chat.js +14 -0
- package/lib/api/endpoints/contactsq.js +6 -0
- package/lib/api/endpoints/conversations.js +14 -0
- package/lib/api/endpoints/devServerRegistry.js +25 -0
- package/lib/api/endpoints/engagement.js +26 -0
- package/lib/api/endpoints/evidence.js +20 -0
- package/lib/api/endpoints/executions.js +13 -0
- package/lib/api/endpoints/fetchAllowlist.js +27 -0
- package/lib/api/endpoints/files.js +14 -0
- package/lib/api/endpoints/hat.js +44 -0
- package/lib/api/endpoints/inbox.js +20 -0
- package/lib/api/endpoints/index.js +26 -0
- package/lib/api/endpoints/loops.js +26 -0
- package/lib/api/endpoints/memory.js +19 -0
- package/lib/api/endpoints/mind.js +13 -0
- package/lib/api/endpoints/mon.js +179 -0
- package/lib/api/endpoints/objectives.js +12 -0
- package/lib/api/endpoints/plugins.js +18 -0
- package/lib/api/endpoints/presence.js +33 -0
- package/lib/api/endpoints/quoxplan.js +7 -0
- package/lib/api/endpoints/quoxseo.js +12 -0
- package/lib/api/endpoints/router.js +17 -0
- package/lib/api/endpoints/safety.js +7 -0
- package/lib/api/endpoints/server.js +21 -0
- package/lib/api/endpoints/setup.js +6 -0
- package/lib/api/endpoints/skills.js +20 -0
- package/lib/api/endpoints/stepup.js +20 -0
- package/lib/api/endpoints/teams.js +2 -2
- package/lib/api/endpoints/triggers.js +26 -0
- package/lib/api/endpoints/v1.js +120 -0
- package/lib/api/endpoints/ward.js +7 -0
- package/lib/api/endpoints/workflows.js +7 -0
- package/lib/api/endpoints/x.js +8 -0
- package/lib/commands/actions.js +131 -0
- package/lib/commands/admin.js +16 -0
- package/lib/commands/agent.js +170 -27
- package/lib/commands/agentAttach.js +140 -13
- package/lib/commands/approvals.js +78 -1
- package/lib/commands/aside.js +24 -0
- package/lib/commands/ask.js +146 -0
- package/lib/commands/assistant.js +59 -4
- package/lib/commands/auth.js +8 -2
- package/lib/commands/backup.js +8 -4
- package/lib/commands/blog.js +110 -0
- package/lib/commands/brain.js +105 -14
- package/lib/commands/build.js +19 -5
- package/lib/commands/chat.js +180 -26
- package/lib/commands/chatCompanion.js +27 -0
- package/lib/commands/chatState.js +45 -0
- package/lib/commands/claude.js +35 -38
- package/lib/commands/contacts.js +134 -4
- package/lib/commands/contactsSendAt.js +21 -0
- package/lib/commands/conversation.js +35 -4
- package/lib/commands/dashboard.js +43 -0
- package/lib/commands/department.js +28 -7
- package/lib/commands/devResident.js +15 -3
- package/lib/commands/devSupervisor.js +13 -1
- package/lib/commands/discord.js +75 -39
- package/lib/commands/done.js +98 -28
- package/lib/commands/engagement.js +107 -6
- package/lib/commands/evidence.js +154 -0
- package/lib/commands/ext.js +23 -0
- package/lib/commands/fetchAllowlist.js +71 -0
- package/lib/commands/file.js +38 -1
- package/lib/commands/fleet.js +336 -4
- package/lib/commands/governance.js +12 -3
- package/lib/commands/gripe.js +44 -13
- package/lib/commands/hat.js +254 -9
- package/lib/commands/helpers.js +18 -1
- package/lib/commands/hyperion.js +58 -0
- package/lib/commands/image.js +68 -0
- package/lib/commands/inbox.js +74 -23
- package/lib/commands/kuma.js +1050 -0
- package/lib/commands/kumaSla.js +174 -0
- package/lib/commands/licence.js +52 -155
- package/lib/commands/loop.js +291 -0
- package/lib/commands/lucid.js +10 -4
- package/lib/commands/memory.js +85 -8
- package/lib/commands/mind.js +71 -0
- package/lib/commands/mon.js +69 -2
- package/lib/commands/monitoring.js +1 -1
- package/lib/commands/motion.js +2 -2
- package/lib/commands/nucleus.js +48 -17
- package/lib/commands/objective.js +59 -1
- package/lib/commands/offload.js +89 -0
- package/lib/commands/onboard.js +2 -1
- package/lib/commands/org.js +30 -3
- package/lib/commands/peek.js +28 -0
- package/lib/commands/plan.js +38 -0
- package/lib/commands/plugin.js +110 -0
- package/lib/commands/presence.js +89 -0
- package/lib/commands/provider.js +217 -0
- package/lib/commands/qlarity.js +19 -3
- package/lib/commands/quoxchat.js +13 -4
- package/lib/commands/quoxseo.js +69 -0
- package/lib/commands/reach.js +2 -1
- package/lib/commands/research.js +79 -0
- package/lib/commands/router.js +77 -0
- package/lib/commands/rows.js +367 -0
- package/lib/commands/run.js +82 -10
- package/lib/commands/scope.js +2 -2
- package/lib/commands/server.js +405 -0
- package/lib/commands/setup.js +33 -7
- package/lib/commands/shortcut.js +41 -0
- package/lib/commands/skills.js +68 -9
- package/lib/commands/slot.js +260 -7
- package/lib/commands/status.js +1 -1
- package/lib/commands/team.js +3 -1
- package/lib/commands/tips.js +23 -0
- package/lib/commands/tool.js +133 -45
- package/lib/commands/trace.js +12 -7
- package/lib/commands/trigger.js +95 -0
- package/lib/commands/update.js +46 -0
- package/lib/commands/vault.js +31 -8
- package/lib/commands/vm.js +237 -0
- package/lib/commands/voice.js +34 -3
- package/lib/commands/volt.js +45 -3
- package/lib/commands/walkthrough.js +32 -0
- package/lib/commands/watch.js +73 -21
- package/lib/commands/welcome.js +14 -0
- package/lib/commands/workflow.js +189 -32
- package/lib/commands/x.js +13 -4
- package/lib/commands/youtube.js +172 -0
- package/lib/core/actingAs.js +2 -2
- package/lib/core/actionItems.js +115 -0
- package/lib/core/activeSummary.js +186 -0
- package/lib/core/agentAlias.js +2 -0
- package/lib/core/agentFamilies.js +7 -0
- package/lib/core/aside.js +54 -0
- package/lib/core/askDecision.js +60 -0
- package/lib/core/auth.js +164 -13
- package/lib/core/callerSource.js +1 -1
- package/lib/core/cliBuild.js +62 -0
- package/lib/core/client.js +152 -35
- package/lib/core/commandRegistrars.js +130 -0
- package/lib/core/config.js +143 -25
- package/lib/core/customHats.js +168 -0
- package/lib/core/doneEngineFetch.js +8 -0
- package/lib/core/errors.js +329 -20
- package/lib/core/findingReconcile.js +90 -0
- package/lib/core/global-flags.js +105 -5
- package/lib/core/governedSession.js +1 -3
- package/lib/core/hyperion.js +102 -0
- package/lib/core/inboxResolution.js +65 -0
- package/lib/core/lazyCommands.js +4 -1
- package/lib/core/liveSessionsReport.js +1 -1
- package/lib/core/loopGlyph.js +97 -0
- package/lib/core/offload.js +533 -0
- package/lib/core/org-override.js +1 -1
- package/lib/core/orgResolve.js +70 -0
- package/lib/core/output.js +11 -11
- package/lib/core/peek.js +126 -0
- package/lib/core/profileUsers.js +51 -0
- package/lib/core/promptCancel.js +18 -0
- package/lib/core/repoPath.js +11 -0
- package/lib/core/residentSeed.js +3 -1
- 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 +12 -8
- package/lib/core/sessionsOverview.js +64 -0
- package/lib/core/shortcut.js +83 -0
- package/lib/core/slotKeeper.js +248 -3
- package/lib/core/slotWake.js +120 -0
- package/lib/core/supervisorEngine.js +71 -2
- package/lib/core/version.js +1 -1
- package/lib/core/vm.js +366 -0
- package/lib/core/vmTui.js +86 -0
- package/lib/core/walkthrough.js +35 -0
- package/lib/dragon/companionView.js +34 -0
- package/lib/dragon/frames.js +118 -0
- package/lib/dragon/jobs.js +123 -0
- package/lib/dragon/renderWorker.js +15 -0
- package/lib/dragon/select.js +72 -0
- package/lib/evidence/bundleExport.js +47 -0
- package/lib/evidence/bundleVerify.js +77 -0
- package/lib/hyperion/deck.js +29 -0
- package/lib/lucid/LucidCard.jsx +68 -0
- package/lib/lucid/LucidIntro.jsx +45 -58
- package/lib/lucid/cards.js +86 -0
- package/lib/lucid/markdown.js +81 -0
- package/lib/lucid/motion.js +56 -0
- package/lib/quoxon/EXTENSIONS.md +23 -0
- package/lib/quoxon/activity.js +14 -2
- package/lib/quoxon/aocl.js +117 -0
- package/lib/quoxon/api.js +690 -25
- package/lib/quoxon/app.js +3586 -250
- package/lib/quoxon/approvalFacts.js +96 -0
- package/lib/quoxon/approvalSentence.js +44 -0
- package/lib/quoxon/approvalsView.js +384 -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 +13 -6
- package/lib/quoxon/cells.js +53 -0
- package/lib/quoxon/commandShort.js +124 -0
- package/lib/quoxon/commands.js +429 -39
- package/lib/quoxon/connect.js +210 -23
- package/lib/quoxon/connectCard.js +19 -2
- package/lib/quoxon/consent.js +86 -0
- package/lib/quoxon/copy.js +4 -3
- package/lib/quoxon/countdownLine.js +20 -0
- package/lib/quoxon/deck.js +30 -0
- package/lib/quoxon/demo.autoplay.js +29 -0
- package/lib/quoxon/demo.fixtures.js +1 -1
- package/lib/quoxon/demo.js +46 -3
- package/lib/quoxon/devObserver.js +20 -0
- package/lib/quoxon/dividerAocl.js +192 -0
- package/lib/quoxon/dividerRule.js +57 -0
- package/lib/quoxon/dragonCompanion.js +255 -0
- package/lib/quoxon/dragonModes.js +151 -0
- package/lib/quoxon/dragonMoments.js +82 -0
- package/lib/quoxon/dragonReads.js +68 -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 +2 -2
- package/lib/quoxon/events.js +266 -26
- package/lib/quoxon/extensions.js +276 -0
- package/lib/quoxon/feedback.js +50 -0
- package/lib/quoxon/gallery.js +21 -7
- 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/inboxView.js +79 -0
- package/lib/quoxon/indicator.js +6 -2
- package/lib/quoxon/installCli.js +79 -0
- package/lib/quoxon/intent.js +12 -1
- package/lib/quoxon/keys.js +51 -8
- package/lib/quoxon/launcher.js +103 -0
- package/lib/quoxon/loopCard.js +456 -0
- package/lib/quoxon/loopCards.js +180 -0
- package/lib/quoxon/loopStream.js +87 -0
- package/lib/quoxon/main.js +101 -160
- package/lib/quoxon/markdown.js +45 -21
- 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 +132 -26
- package/lib/quoxon/modelPrefs.js +345 -0
- package/lib/quoxon/motion/clock.js +3 -2
- package/lib/quoxon/motion/level.js +91 -0
- package/lib/quoxon/mouse.js +222 -0
- package/lib/quoxon/noai.js +57 -0
- package/lib/quoxon/objectiveOffer.js +82 -0
- package/lib/quoxon/objects/away.js +72 -0
- package/lib/quoxon/objects/fetch.js +17 -5
- package/lib/quoxon/objects/fleet.js +149 -0
- package/lib/quoxon/objects/health.js +186 -0
- package/lib/quoxon/objects/index.js +46 -7
- package/lib/quoxon/objects/mirror.js +137 -0
- package/lib/quoxon/objects/model.js +33 -0
- package/lib/quoxon/objects/peek.js +17 -0
- package/lib/quoxon/objects/proof.js +12 -4
- 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/view.js +11 -0
- package/lib/quoxon/onboarding/copy.js +32 -4
- package/lib/quoxon/onboarding/credential.js +17 -4
- package/lib/quoxon/onboarding/dockerOffer.js +45 -0
- package/lib/quoxon/onboarding/failureCause.js +33 -0
- package/lib/quoxon/onboarding/finish.js +15 -0
- package/lib/quoxon/onboarding/index.js +34 -7
- package/lib/quoxon/onboarding/installRunner.js +64 -5
- package/lib/quoxon/onboarding/preflight.js +17 -3
- package/lib/quoxon/onboarding/probe.js +65 -0
- package/lib/quoxon/onboarding/shortcutOffer.js +28 -0
- package/lib/quoxon/onboarding/view.js +76 -19
- package/lib/quoxon/orgLabel.js +10 -0
- package/lib/quoxon/orgSwitch.js +59 -0
- package/lib/quoxon/ownBroadcast.js +22 -0
- package/lib/quoxon/palette.js +43 -0
- package/lib/quoxon/planSteps.js +51 -0
- package/lib/quoxon/print.js +12 -5
- 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 +20 -51
- package/lib/quoxon/qdragon.js +410 -0
- package/lib/quoxon/qdragonFly.js +62 -0
- package/lib/quoxon/qdragonScenes.js +282 -0
- package/lib/quoxon/qeyes.js +213 -0
- package/lib/quoxon/qmotion.js +75 -37
- package/lib/quoxon/render.js +740 -124
- package/lib/quoxon/resend.js +72 -0
- package/lib/quoxon/roster.js +117 -17
- package/lib/quoxon/route.js +6 -5
- package/lib/quoxon/rows.js +954 -0
- package/lib/quoxon/rowsStore.js +80 -0
- package/lib/quoxon/screenContext.js +150 -0
- package/lib/quoxon/screenFrames.js +254 -0
- package/lib/quoxon/serverChip.js +42 -0
- package/lib/quoxon/session.js +182 -2
- package/lib/quoxon/sessionDead.js +17 -0
- package/lib/quoxon/signin.js +125 -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 +94 -0
- package/lib/quoxon/slash/cliLeaves.json +1023 -0
- package/lib/quoxon/slash/compact.js +1 -1
- 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/evidenceCmd.js +34 -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 +13 -8
- package/lib/quoxon/slash/listView.js +3 -1
- package/lib/quoxon/slash/modelCmd.js +261 -0
- package/lib/quoxon/slash/palette.js +22 -8
- package/lib/quoxon/slash/paletteController.js +117 -7
- package/lib/quoxon/slash/panels.js +21 -6
- package/lib/quoxon/slash/picker.js +20 -2
- package/lib/quoxon/slash/qpeCmd.js +35 -0
- package/lib/quoxon/slash/restart.js +95 -13
- package/lib/quoxon/slash/resume.js +18 -1
- package/lib/quoxon/slash/rowCmd.js +157 -0
- package/lib/quoxon/slash/rowWalk.js +175 -0
- package/lib/quoxon/slash/settings.js +16 -6
- 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/todoCmd.js +122 -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/mapping.js +2 -1
- package/lib/quoxon/stray.js +22 -0
- package/lib/quoxon/suggestCommand.js +90 -0
- package/lib/quoxon/term.js +46 -11
- package/lib/quoxon/textBuffer.js +176 -2
- package/lib/quoxon/theme.js +58 -25
- package/lib/quoxon/tips.js +433 -0
- package/lib/quoxon/toolCards.js +30 -0
- package/lib/quoxon/toolError.js +41 -0
- package/lib/quoxon/transcript.js +42 -4
- package/lib/quoxon/web/qface.js +18 -10
- package/lib/quoxon/welcome.js +1 -1
- package/lib/quoxon/whatsnew.js +136 -0
- package/lib/quoxon/whatsnew.jsonl +134 -0
- package/lib/quoxon/windowOrg.js +123 -0
- package/lib/server/devServers.js +137 -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/views/HyperionDeck.jsx +79 -0
- package/lib/tui/views/LucidDeck.jsx +209 -217
- package/package.json +5 -1
- package/vendor/dragonlab/SOURCE +4 -0
- package/vendor/dragonlab/design/cipher/v1/cipher-master.svg +46 -0
- package/vendor/dragonlab/design/cipher/v2/character.mjs +49 -0
- package/vendor/dragonlab/design/cipher/v2/review.mjs +33 -0
- package/vendor/dragonlab/design/cipher/v2/watch.mjs +56 -0
- package/vendor/dragonlab/design/drago/v1/character.mjs +19 -0
- package/vendor/dragonlab/design/drago/v1/drago-master.svg +56 -0
- package/vendor/dragonlab/design/drago/v2/character.mjs +87 -0
- package/vendor/dragonlab/design/drago/v4/character.mjs +67 -0
- package/vendor/dragonlab/design/drago/v4/profile.mjs +35 -0
- package/vendor/dragonlab/design/drago/v4/review.mjs +33 -0
- package/vendor/dragonlab/design/drago/v4/watch.mjs +56 -0
- package/vendor/dragonlab/design/hyperion/v1/hyperion-master.svg +56 -0
- package/vendor/dragonlab/design/hyperion/v2/character.mjs +79 -0
- package/vendor/dragonlab/design/hyperion/v2/review.mjs +33 -0
- package/vendor/dragonlab/design/hyperion/v2/watch.mjs +56 -0
- package/vendor/dragonlab/design/lucid/recovery/arrival.mjs +22 -0
- package/vendor/dragonlab/design/lucid/recovery/character.mjs +106 -0
- package/vendor/dragonlab/design/lucid/recovery/layout.mjs +50 -0
- package/vendor/dragonlab/design/lucid/recovery/lucid-master.svg +78 -0
- package/vendor/dragonlab/design/lucid/recovery/motion.mjs +42 -0
- package/vendor/dragonlab/design/lucid/recovery/render.mjs +121 -0
- package/vendor/dragonlab/design/lucid/recovery/review.mjs +68 -0
- package/vendor/dragonlab/design/lucid/recovery/verify.mjs +84 -0
- package/vendor/dragonlab/design/lucid/recovery/watch.mjs +56 -0
- package/vendor/dragonlab/design/seer/v1/seer-master.svg +53 -0
- package/vendor/dragonlab/design/seer/v2/character.mjs +88 -0
- package/vendor/dragonlab/design/seer/v3/character.mjs +33 -0
- package/vendor/dragonlab/design/seer/v4/character.mjs +66 -0
- package/vendor/dragonlab/design/seer/v4/review.mjs +33 -0
- package/vendor/dragonlab/design/seer/v4/watch.mjs +56 -0
- package/vendor/dragonlab/design/stage3/companion-review.mjs +28 -0
- package/vendor/dragonlab/design/stage3/sentinel-art.js +39 -0
- package/vendor/dragonlab/design/stage3/sentinel-braille.js +216 -0
- package/vendor/dragonlab/design/stage3/sentinel-character.js +257 -0
- package/vendor/dragonlab/design/stage3/sentinel-icon.js +103 -0
- package/vendor/dragonlab/design/stage3/sentinel-warden-eyes.js +95 -0
- package/vendor/dragonlab/design/stage3/svg-coverage.js +148 -0
- package/vendor/dragonlab/factory/svg-rig.mjs +63 -0
- package/vendor/dragonlab/integration/companions-v1/characters.mjs +88 -0
- package/vendor/dragonlab/integration/companions-v1/cipher.mjs +2 -0
- package/vendor/dragonlab/integration/companions-v1/companion.mjs +63 -0
- package/vendor/dragonlab/integration/companions-v1/drago.mjs +2 -0
- package/vendor/dragonlab/integration/companions-v1/hyperion.mjs +2 -0
- package/vendor/dragonlab/integration/companions-v1/lucid.mjs +2 -0
- package/vendor/dragonlab/integration/companions-v1/seer.mjs +2 -0
- package/vendor/dragonlab/integration/companions-v1/sentinel.mjs +2 -0
- package/vendor/dragonlab/integration/companions-v1/view.mjs +28 -0
- package/vendor/dragonlab/integration/hyperion-v3/activity.mjs +76 -0
- package/vendor/dragonlab/lib/power-effects.js +294 -0
- package/vendor/dragonlab/lib/power-registry.js +74 -0
- package/vendor/dragonlab/vendor/quox-dragon/qart.js +348 -0
- package/vendor/dragonlab/vendor/quox-dragon/qeyes.js +213 -0
- package/lib/core/websiteSession.js +0 -148
|
@@ -0,0 +1,154 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Evidence commands (DEVFLEET EV-1): `quox evidence status` shows size, rows, time span, growth, archive and
|
|
3
|
+
* backup for the AEE, WARD and VOLT stores. Read-only; the collector route is instance admin only.
|
|
4
|
+
*/
|
|
5
|
+
|
|
6
|
+
import chalk from 'chalk';
|
|
7
|
+
import { formatOutput } from '../core/output.js';
|
|
8
|
+
import { resolveEndpoint } from '../api/endpoints.js';
|
|
9
|
+
import fs from 'node:fs';
|
|
10
|
+
import { exportConversationBundle, newestConversationId } from '../evidence/bundleExport.js';
|
|
11
|
+
import { verifyEvidenceBundle } from '../evidence/bundleVerify.js';
|
|
12
|
+
|
|
13
|
+
const NA = 'n/a';
|
|
14
|
+
|
|
15
|
+
// verify_state from auth, said once: 'verified', 'never verified', 'verify failed', 'verify n/a'.
|
|
16
|
+
function verifyLabel(v) {
|
|
17
|
+
if (v === null || v === undefined || v === '') return 'verify n/a';
|
|
18
|
+
if (v === 'verified') return 'verified';
|
|
19
|
+
if (v === 'failed') return 'verify failed';
|
|
20
|
+
if (v === 'never_verified') return 'never verified';
|
|
21
|
+
return `verify ${String(v).replace(/_/g, ' ')}`;
|
|
22
|
+
}
|
|
23
|
+
|
|
24
|
+
function bytes(n) {
|
|
25
|
+
if (n === null || n === undefined) return NA;
|
|
26
|
+
if (n < 1024) return `${n} B`;
|
|
27
|
+
const units = ['KB', 'MB', 'GB', 'TB'];
|
|
28
|
+
let v = n; let i = -1;
|
|
29
|
+
do { v /= 1024; i++; } while (v >= 1024 && i < units.length - 1);
|
|
30
|
+
return `${v.toFixed(1)} ${units[i]}`;
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
const val = (v) => (v === null || v === undefined ? NA : String(v));
|
|
34
|
+
const day = (iso) => (iso ? String(iso).slice(0, 10) : NA);
|
|
35
|
+
|
|
36
|
+
function archiveCell(a) {
|
|
37
|
+
if (a === null || a === undefined) return NA;
|
|
38
|
+
if (typeof a === 'string') return a;
|
|
39
|
+
return `${a.anchors} anchors${a.newest_archived_at ? `, newest ${day(a.newest_archived_at)}` : ''}`;
|
|
40
|
+
}
|
|
41
|
+
|
|
42
|
+
function diskCell(d) {
|
|
43
|
+
if (!d) return NA;
|
|
44
|
+
return `${bytes(d.free_bytes)} free of ${bytes(d.total_bytes)} (${d.mount})`;
|
|
45
|
+
}
|
|
46
|
+
|
|
47
|
+
export function registerEvidenceCommands(program, ctx) {
|
|
48
|
+
const { client, auth } = ctx;
|
|
49
|
+
|
|
50
|
+
const evidence = program
|
|
51
|
+
.command('evidence')
|
|
52
|
+
.description('Evidence stores: AEE, WARD, VOLT');
|
|
53
|
+
|
|
54
|
+
evidence
|
|
55
|
+
.command('status')
|
|
56
|
+
.description('Evidence stores (AEE, WARD, VOLT): size, rows, time span, growth, archive and backup, read-only')
|
|
57
|
+
.action(async () => {
|
|
58
|
+
auth.requireAuth();
|
|
59
|
+
const ep = resolveEndpoint('evidence.status');
|
|
60
|
+
const data = await client.get(ep.path, { service: ep.service });
|
|
61
|
+
if (!data || !Array.isArray(data.stores)) {
|
|
62
|
+
throw new Error(`Unexpected evidence status response${data && data.error ? `: ${data.error}` : ''}`);
|
|
63
|
+
}
|
|
64
|
+
const format = program.opts().output;
|
|
65
|
+
if (format === 'json') { console.log(JSON.stringify(data, null, 2)); return; }
|
|
66
|
+
|
|
67
|
+
const rows = data.stores.map((s) => ({
|
|
68
|
+
store: s.name,
|
|
69
|
+
size: bytes(s.bytes),
|
|
70
|
+
wal: bytes(s.wal_bytes),
|
|
71
|
+
rows: val(s.rows),
|
|
72
|
+
oldest: day(s.oldest),
|
|
73
|
+
newest: day(s.newest),
|
|
74
|
+
last7d: s.per_day && s.per_day.last_7d ? `${s.per_day.last_7d.per_day}/day` : NA,
|
|
75
|
+
archive: archiveCell(s.archive),
|
|
76
|
+
disk: diskCell(s.disk),
|
|
77
|
+
}));
|
|
78
|
+
formatOutput({
|
|
79
|
+
columns: ['store', 'size', 'wal', 'rows', 'oldest', 'newest', 'last7d', 'archive', 'disk'],
|
|
80
|
+
headers: ['Store', 'Size', 'WAL', 'Rows', 'Oldest', 'Newest', 'Last 7d', 'Archive', 'Disk'],
|
|
81
|
+
rows,
|
|
82
|
+
}, { format, full: true });
|
|
83
|
+
|
|
84
|
+
const b = data.backup || {};
|
|
85
|
+
if (b.last) {
|
|
86
|
+
const l = b.last;
|
|
87
|
+
const when = l.ts ? `${String(l.ts).slice(0, 10)} ${String(l.ts).slice(11, 16)} UTC` : NA;
|
|
88
|
+
const parts = [
|
|
89
|
+
b.age_hours === null || b.age_hours === undefined ? 'age n/a' : `${b.age_hours} h ago`,
|
|
90
|
+
l.count === null || l.count === undefined ? 'count n/a' : `${l.count} backups`,
|
|
91
|
+
(b.scope && b.scope.ts) || 'all orgs',
|
|
92
|
+
];
|
|
93
|
+
const line = `Last backup ${when} (${parts.join(', ')})${b.stale ? ' STALE' : ''}`;
|
|
94
|
+
console.log(b.stale ? chalk.yellow(line) : line);
|
|
95
|
+
// The newest backup can belong to any org; health and verify state are the caller's org only.
|
|
96
|
+
console.log(`Backup health (${(b.scope && b.scope.health) || 'your org'}): ${val(l.status)}, ${verifyLabel(l.verified)}`);
|
|
97
|
+
if (l.last_failed) console.log(` last failure: ${val(l.last_failed.error)} (${l.last_failed.at ? String(l.last_failed.at).slice(0, 16).replace('T', ' ') + ' UTC' : NA})`);
|
|
98
|
+
if (b.verify_error) console.log(` ${b.verify_error}`);
|
|
99
|
+
} else {
|
|
100
|
+
console.log(`Backup: ${NA}`);
|
|
101
|
+
}
|
|
102
|
+
|
|
103
|
+
const errors = [];
|
|
104
|
+
for (const s of data.stores) for (const e of s.errors || []) errors.push(`${s.name}: ${e}`);
|
|
105
|
+
if (b.error) errors.push(`backup: ${b.error}`);
|
|
106
|
+
if (errors.length) {
|
|
107
|
+
console.log(chalk.yellow('Errors'));
|
|
108
|
+
for (const e of errors) console.log(` ${e}`);
|
|
109
|
+
}
|
|
110
|
+
});
|
|
111
|
+
evidence
|
|
112
|
+
.command('bundle')
|
|
113
|
+
.description('Export a signed, offline-verifiable evidence bundle (zip) of every AEE envelope, WARD receipt and VOLT run for one conversation')
|
|
114
|
+
.argument('[conversation]', 'conversation id (the corr); default: your newest chat conversation')
|
|
115
|
+
.option('--out <file.zip>', 'where to write it (default ~/quox-evidence/<conversation>-<timestamp>.zip)')
|
|
116
|
+
.option('--json', 'print the result as JSON')
|
|
117
|
+
.action(async (conversation, options) => {
|
|
118
|
+
auth.requireAuth();
|
|
119
|
+
const corr = conversation || await newestConversationId(client);
|
|
120
|
+
if (!corr) throw new Error('No conversation to export: pass a conversation id (`quox conversation list`).');
|
|
121
|
+
const r = await exportConversationBundle({ client, corr, out: options.out });
|
|
122
|
+
const failed = r.verify.checks.filter((c) => !c.ok);
|
|
123
|
+
if (options.json || program.opts().output === 'json') {
|
|
124
|
+
console.log(JSON.stringify({ path: r.path, conversation: r.corr, bytes: r.bytes, envelopes: r.envelopes, receipts: r.receipts, verified: r.verify.ok, failed_checks: failed }, null, 2));
|
|
125
|
+
} else {
|
|
126
|
+
console.log(`${r.verify.ok ? chalk.green('Evidence bundle written') : chalk.red('Evidence bundle written but FAILED verification')}: ${r.path}`);
|
|
127
|
+
console.log(` conversation ${r.corr} | ${r.envelopes} envelopes | ${r.receipts} WARD receipts | ${r.bytes} bytes`);
|
|
128
|
+
console.log(` verify offline: quox evidence verify ${r.path}`);
|
|
129
|
+
for (const c of failed) console.log(chalk.red(` FAILED ${c.name}: ${c.detail || ''}`));
|
|
130
|
+
}
|
|
131
|
+
if (!r.verify.ok) process.exitCode = 1;
|
|
132
|
+
});
|
|
133
|
+
|
|
134
|
+
evidence
|
|
135
|
+
.command('verify')
|
|
136
|
+
.description('Verify an evidence bundle zip offline: file hashes, envelope list hash, counts and the Ed25519 signature (no network)')
|
|
137
|
+
.argument('<file.zip>', 'a bundle from `quox evidence bundle`')
|
|
138
|
+
.option('--json', 'print the result as JSON')
|
|
139
|
+
.action(async (file, options) => {
|
|
140
|
+
let bytes;
|
|
141
|
+
try { bytes = fs.readFileSync(file); } catch (e) { throw new Error(`Cannot read ${file}: ${e.message}`); }
|
|
142
|
+
const v = await verifyEvidenceBundle(bytes);
|
|
143
|
+
if (options.json || program.opts().output === 'json') {
|
|
144
|
+
console.log(JSON.stringify({ file, verified: v.ok, checks: v.checks, counts: v.manifest?.counts || null, conversation: v.manifest?.corr || null, key_id: v.signature?.key_id || null }, null, 2));
|
|
145
|
+
} else {
|
|
146
|
+
for (const c of v.checks) console.log(` ${c.ok ? chalk.green('PASS') : chalk.red('FAIL')} ${c.name}${c.detail ? ` (${c.detail})` : ''}`);
|
|
147
|
+
const m = v.manifest;
|
|
148
|
+
console.log(v.ok
|
|
149
|
+
? chalk.green(`VERIFIED: ${m.counts.envelopes} envelopes, ${m.counts.ward_receipts} WARD receipts, conversation ${m.corr}, signed by ${v.signature.key_id}`)
|
|
150
|
+
: chalk.red('NOT VERIFIED: this bundle was altered or is not a Quox evidence bundle.'));
|
|
151
|
+
}
|
|
152
|
+
if (!v.ok) process.exitCode = 1;
|
|
153
|
+
});
|
|
154
|
+
}
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* quox ext add|remove|list <pkg>
|
|
3
|
+
*
|
|
4
|
+
* The listing behind quoxon's extension host (cli/lib/quoxon/extensions.js, contract EXTENSIONS.md). It edits
|
|
5
|
+
* ~/.quox/extensions.json only; it does not install npm packages (npm i -g <pkg> does that). Nothing loads unless
|
|
6
|
+
* it is both installed and listed.
|
|
7
|
+
*/
|
|
8
|
+
import { readExtList, extAdd, extRemove, extListPath } from '../quoxon/extensions.js';
|
|
9
|
+
|
|
10
|
+
export function registerExtCommands(program) {
|
|
11
|
+
const ext = program.command('ext').description('Optional quoxon extensions: list, add or remove one (npm i -g <pkg> installs it)');
|
|
12
|
+
const out = (r) => { console.log(r.text); if (!r.ok) process.exitCode = 1; };
|
|
13
|
+
ext.command('list').description('Extensions listed in ~/.quox/extensions.json')
|
|
14
|
+
.option('--json', 'print as JSON')
|
|
15
|
+
.action((opts) => {
|
|
16
|
+
const list = readExtList();
|
|
17
|
+
if (opts.json || program.opts().output === 'json') { console.log(JSON.stringify({ file: extListPath(), extensions: list }, null, 2)); return; }
|
|
18
|
+
if (!list.length) { console.log('No extensions listed. quox ext add <pkg>'); return; }
|
|
19
|
+
for (const x of list) console.log(`${x.name} ${x.enabled ? 'on' : 'off'}`);
|
|
20
|
+
});
|
|
21
|
+
ext.command('add').description('List an extension so quoxon loads it once installed').argument('<pkg>').action((pkg) => out(extAdd(pkg)));
|
|
22
|
+
ext.command('remove').description('Stop listing an extension').argument('<pkg>').action((pkg) => out(extRemove(pkg)));
|
|
23
|
+
}
|
|
@@ -0,0 +1,71 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* `quox fetch allow` — the URL prefixes this org's agents may GET through the
|
|
3
|
+
* governed web_fetch_allowlisted tool (quox#1171). Default-deny: nothing is
|
|
4
|
+
* fetchable until an org admin adds a prefix. Every call goes through the
|
|
5
|
+
* collector; adding and removing need a human org admin (the server refuses
|
|
6
|
+
* agent tokens).
|
|
7
|
+
*/
|
|
8
|
+
|
|
9
|
+
import { resolveEndpoint } from '../api/endpoints.js';
|
|
10
|
+
|
|
11
|
+
async function call(client, id, params = {}, body) {
|
|
12
|
+
const ep = resolveEndpoint(id, params);
|
|
13
|
+
const opts = { service: ep.service };
|
|
14
|
+
if (body) opts.body = body;
|
|
15
|
+
switch (ep.method) {
|
|
16
|
+
case 'POST': return client.post(ep.path, opts);
|
|
17
|
+
case 'DELETE': return client.delete(ep.path, opts);
|
|
18
|
+
default: return client.get(ep.path, opts);
|
|
19
|
+
}
|
|
20
|
+
}
|
|
21
|
+
|
|
22
|
+
export function registerFetchAllowlistCommands(program, ctx) {
|
|
23
|
+
const { client } = ctx;
|
|
24
|
+
|
|
25
|
+
const f = program
|
|
26
|
+
.command('fetch')
|
|
27
|
+
.description('Governed agent fetch: which URLs your agents may GET');
|
|
28
|
+
|
|
29
|
+
const al = f.command('allow')
|
|
30
|
+
.description('The URL prefixes this org allows agents to fetch (default-deny)');
|
|
31
|
+
|
|
32
|
+
al.command('list', { isDefault: true })
|
|
33
|
+
.description('Show the allowed URL prefixes for this org')
|
|
34
|
+
.action(async () => {
|
|
35
|
+
const d = await call(client, 'fetchAllowlist.list');
|
|
36
|
+
if (d.prefixes?.length) {
|
|
37
|
+
process.stdout.write('allowed prefixes:\n');
|
|
38
|
+
for (const e of d.prefixes) process.stdout.write(` ${e.url_prefix}${e.note ? ` (${e.note})` : ''}\n`);
|
|
39
|
+
} else {
|
|
40
|
+
process.stdout.write('none allowed yet: agents cannot fetch anything. Add one with `quox fetch allow add <url-prefix>`\n');
|
|
41
|
+
}
|
|
42
|
+
});
|
|
43
|
+
|
|
44
|
+
al.command('add <url-prefix>')
|
|
45
|
+
.description('Allow agents to GET URLs under a prefix, e.g. https://status.example.com/api/')
|
|
46
|
+
.option('--note <text>', 'why it is allowed, shown alongside it later')
|
|
47
|
+
.action(async (urlPrefix, opts) => {
|
|
48
|
+
try {
|
|
49
|
+
const d = await call(client, 'fetchAllowlist.add', {}, { url_prefix: urlPrefix, note: opts.note });
|
|
50
|
+
process.stdout.write(`allowed ${d.entry.url_prefix}\n`);
|
|
51
|
+
process.stdout.write(` ${d.prefixes.length} prefix(es) now allowed for this org\n`);
|
|
52
|
+
} catch (err) {
|
|
53
|
+
if (err?.status === 400 && err?.message) {
|
|
54
|
+
process.stderr.write(`Not added: ${err.message}\n`);
|
|
55
|
+
process.exitCode = 1;
|
|
56
|
+
return;
|
|
57
|
+
}
|
|
58
|
+
throw err;
|
|
59
|
+
}
|
|
60
|
+
});
|
|
61
|
+
|
|
62
|
+
al.command('remove <url-prefix>')
|
|
63
|
+
.description('Stop allowing a URL prefix')
|
|
64
|
+
.action(async (urlPrefix) => {
|
|
65
|
+
const d = await call(client, 'fetchAllowlist.remove', { prefix: urlPrefix });
|
|
66
|
+
if (d.removed) process.stdout.write(`removed ${urlPrefix}\n`);
|
|
67
|
+
else process.stdout.write(`nothing to remove: ${urlPrefix} was not allowed for this org\n`);
|
|
68
|
+
});
|
|
69
|
+
}
|
|
70
|
+
|
|
71
|
+
export default registerFetchAllowlistCommands;
|
package/lib/commands/file.js
CHANGED
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
* File commands: upload, download, list, delete
|
|
3
3
|
*/
|
|
4
4
|
|
|
5
|
-
import { createWriteStream } from 'node:fs';
|
|
5
|
+
import { createWriteStream, readFileSync } from 'node:fs';
|
|
6
6
|
import { basename } from 'node:path';
|
|
7
7
|
import { formatOutput, formatDetail, printSuccess } from '../core/output.js';
|
|
8
8
|
import { resolveEndpoint } from '../api/endpoints.js';
|
|
@@ -125,4 +125,41 @@ export function registerFileCommands(program, ctx) {
|
|
|
125
125
|
const data = await client.get(resolveEndpoint('files.stats').path, { service: resolveEndpoint('files.stats').service });
|
|
126
126
|
formatDetail(data.stats || data, { format: program.opts().output, title: 'File Storage Stats' });
|
|
127
127
|
});
|
|
128
|
+
|
|
129
|
+
// F01 A': legacy files with no proven owner are hidden from every org until a human instance admin assigns them.
|
|
130
|
+
file
|
|
131
|
+
.command('quarantine')
|
|
132
|
+
.description('List files with no proven owner org (instance admin only)')
|
|
133
|
+
.action(async () => {
|
|
134
|
+
auth.requireAuth();
|
|
135
|
+
const ep = resolveEndpoint('files.quarantine.list');
|
|
136
|
+
const data = await client.get(ep.path, { service: ep.service });
|
|
137
|
+
formatOutput({ columns: ['id', 'name', 'size'], headers: ['ID', 'Name', 'Size'], rows: data.files || [] }, { format: program.opts().output });
|
|
138
|
+
});
|
|
139
|
+
|
|
140
|
+
file
|
|
141
|
+
.command('assign')
|
|
142
|
+
.description('Assign a quarantined file to an org (instance admin only; witnessed): <fileId> --org <orgId>, or --from-report <dry-run.json>')
|
|
143
|
+
.argument('[fileId]', 'quarantined file id')
|
|
144
|
+
.option('--org <orgId>', 'org that owns the file')
|
|
145
|
+
.option('--from-report <path>', 'an owner-approved backfill dry-run report: assigns only rows with a derived owner')
|
|
146
|
+
.action(async (fileId, options) => {
|
|
147
|
+
auth.requireAuth();
|
|
148
|
+
let assignments;
|
|
149
|
+
if (options.fromReport) {
|
|
150
|
+
const report = JSON.parse(readFileSync(options.fromReport, 'utf8'));
|
|
151
|
+
assignments = (report.rows || []).filter((r) => r && r.id && r.orgId).map((r) => ({ file_id: r.id, org_id: r.orgId }));
|
|
152
|
+
if (!assignments.length) throw new Error('The report has no rows with a derived owner; nothing to assign.');
|
|
153
|
+
} else if (fileId) {
|
|
154
|
+
if (!options.org) throw new Error('Give the owning org: quox file assign <fileId> --org <orgId>');
|
|
155
|
+
assignments = [{ file_id: fileId, org_id: options.org }];
|
|
156
|
+
} else {
|
|
157
|
+
throw new Error('Give <fileId> --org <orgId>, or --from-report <dry-run.json>');
|
|
158
|
+
}
|
|
159
|
+
const ep = resolveEndpoint('files.quarantine.assign');
|
|
160
|
+
const data = await client.post(ep.path, { service: ep.service, body: { assignments } });
|
|
161
|
+
formatOutput({ columns: ['file_id', 'org_id', 'ok', 'error'], headers: ['File', 'Org', 'Assigned', 'Error'], rows: data.results || [] }, { format: program.opts().output });
|
|
162
|
+
const failed = (data.results || []).filter((r) => !r.ok).length;
|
|
163
|
+
if (failed) { process.exitCode = 1; } else { printSuccess(`Assigned ${assignments.length} file(s).`); }
|
|
164
|
+
});
|
|
128
165
|
}
|