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,102 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* HYPERION activity: the shared reader and plain-text renderers behind `quox hyperion`,
|
|
3
|
+
* `quox hyperion deck` and the QUOXON /hyperion command. Pure functions over the
|
|
4
|
+
* GET /api/v1/proxmox/activity payload; no colour (callers paint), no grey, labels not bare values.
|
|
5
|
+
*/
|
|
6
|
+
import { resolveEndpoint } from '../api/endpoints.js';
|
|
7
|
+
|
|
8
|
+
export function fetchActivity(client) {
|
|
9
|
+
const ep = resolveEndpoint('v1.proxmox.activity');
|
|
10
|
+
return client.get(ep.path, { service: ep.service });
|
|
11
|
+
}
|
|
12
|
+
|
|
13
|
+
const ms = (v) => {
|
|
14
|
+
if (v == null || v === '') return null;
|
|
15
|
+
const n = typeof v === 'number' ? v : Date.parse(v);
|
|
16
|
+
return Number.isFinite(n) ? n : null;
|
|
17
|
+
};
|
|
18
|
+
|
|
19
|
+
function span(delta) {
|
|
20
|
+
const s = Math.max(0, Math.floor(delta / 1000));
|
|
21
|
+
if (s < 60) return `${s}s`;
|
|
22
|
+
const m = Math.floor(s / 60);
|
|
23
|
+
if (m < 60) return `${m}m`;
|
|
24
|
+
const h = Math.floor(m / 60);
|
|
25
|
+
if (h < 24) return `${h}h`;
|
|
26
|
+
return `${Math.floor(h / 24)}d`;
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
/** Expiry wins ("expires in 3h" / "expired 1h ago"), else how long it has been held, else "-". */
|
|
30
|
+
export function whenText(held, now = Date.now()) {
|
|
31
|
+
const exp = ms(held && held.expires);
|
|
32
|
+
if (exp != null) return exp >= now ? `expires in ${span(exp - now)}` : `expired ${span(now - exp)} ago`;
|
|
33
|
+
const since = ms(held && held.since);
|
|
34
|
+
if (since != null) return `held ${span(now - since)}`;
|
|
35
|
+
return '-';
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
export function holderText(held) {
|
|
39
|
+
const h = held || {};
|
|
40
|
+
if (h.source === 'pool') return h.lessee ? `${h.lessee} (pool)` : 'free (pool)';
|
|
41
|
+
if (h.source === 'lane') return `${h.lessee || 'unknown'} (lane)`;
|
|
42
|
+
return 'nobody recorded';
|
|
43
|
+
}
|
|
44
|
+
|
|
45
|
+
const isHeld = (v) => Boolean(v.held_by && v.held_by.lessee);
|
|
46
|
+
const pct = (x) => (typeof x === 'number' ? `${Math.round(x * 100)}%` : '?');
|
|
47
|
+
const gb = (b) => (typeof b === 'number' ? (b / 1e9).toFixed(1) : '?');
|
|
48
|
+
const clipTo = (s, n) => (s.length > n ? `${s.slice(0, n - 1)}…` : s);
|
|
49
|
+
|
|
50
|
+
/** Full one-shot view: VM table, node load, pool counts, last 5 ops. */
|
|
51
|
+
export function statusLines(data, { now = Date.now() } = {}) {
|
|
52
|
+
const d = data || {};
|
|
53
|
+
const out = [];
|
|
54
|
+
const vms = d.vms || [];
|
|
55
|
+
if (!vms.length) out.push('No VMs are held or pooled right now.');
|
|
56
|
+
else {
|
|
57
|
+
const rows = vms.map((v) => [String(v.vmid), v.name || '', v.node || '', v.status || '', holderText(v.held_by), (v.held_by && v.held_by.purpose) || '-', whenText(v.held_by, now)]);
|
|
58
|
+
const head = ['VMID', 'NAME', 'NODE', 'STATUS', 'HELD BY', 'PURPOSE', 'AGE / EXPIRY'];
|
|
59
|
+
const w = head.map((h, i) => Math.max(h.length, ...rows.map((r) => r[i].length)));
|
|
60
|
+
const fmt = (r) => r.map((c, i) => c.padEnd(w[i])).join(' ').trimEnd();
|
|
61
|
+
out.push(fmt(head), ...rows.map(fmt));
|
|
62
|
+
}
|
|
63
|
+
if (d.vms_truncated) out.push(`⚠ ${d.vms_truncated} more tagged VMs not shown`);
|
|
64
|
+
if (d.vm_config_errors) out.push(`⚠ ${d.vm_config_errors} VM description(s) could not be read, holder taken from tags`);
|
|
65
|
+
out.push('');
|
|
66
|
+
out.push('Node load');
|
|
67
|
+
if (d.nodes_error) out.push(` Node load unavailable: ${d.nodes_error}`);
|
|
68
|
+
else if (!(d.nodes || []).length) out.push(' no nodes reported');
|
|
69
|
+
else for (const n of d.nodes) out.push(` ${String(n.node).padEnd(10)} ${String(n.status).padEnd(8)} cpu ${pct(n.cpu)} mem ${gb(n.mem_used)}/${gb(n.mem_total)} GB`);
|
|
70
|
+
out.push('');
|
|
71
|
+
if (d.pool) {
|
|
72
|
+
const counts = Object.entries(d.pool.counts || {}).map(([k, v]) => `${k} ${v}`).join(', ') || 'no VMs';
|
|
73
|
+
out.push(`Pool: ${d.pool.enabled ? 'enabled' : 'disabled'}, ${counts}${d.pool.paused ? ' (paused, waiting for approval)' : ''}`);
|
|
74
|
+
} else out.push(`Pool unavailable: ${d.pool_error || 'unknown'}`);
|
|
75
|
+
out.push('');
|
|
76
|
+
if (d.ops_error) out.push(`Recent ops unavailable: ${d.ops_error}`);
|
|
77
|
+
else {
|
|
78
|
+
const ops = (d.recent_ops || []).slice(0, 5);
|
|
79
|
+
out.push(`Recent ops (${ops.length})`);
|
|
80
|
+
if (!ops.length) out.push(' none recorded');
|
|
81
|
+
for (const o of ops) out.push(` ${o.ts} ${o.intent} vmid ${o.vmid ?? '-'} by ${o.actor || '?'} outcome ${o.outcome ?? '-'}`);
|
|
82
|
+
}
|
|
83
|
+
return out;
|
|
84
|
+
}
|
|
85
|
+
|
|
86
|
+
/** Compact list for the TUI: a header, then one line per held VM. */
|
|
87
|
+
export function heldLines(data, { now = Date.now(), width = 100 } = {}) {
|
|
88
|
+
const held = ((data && data.vms) || []).filter(isHeld);
|
|
89
|
+
if (!held.length) return ['No VMs are held right now.'];
|
|
90
|
+
const lines = [`${held.length} held`];
|
|
91
|
+
for (const v of held) {
|
|
92
|
+
const purpose = v.held_by.purpose ? `, ${v.held_by.purpose}` : '';
|
|
93
|
+
lines.push(clipTo(`${v.vmid} ${v.name || ''} on ${v.node || '?'} ${v.status || ''}: held by ${holderText(v.held_by)}${purpose}, ${whenText(v.held_by, now)}`, width));
|
|
94
|
+
}
|
|
95
|
+
return lines;
|
|
96
|
+
}
|
|
97
|
+
|
|
98
|
+
/** Result text for the QuoxGlyph header line. */
|
|
99
|
+
export function summaryText(data) {
|
|
100
|
+
const vms = (data && data.vms) || [];
|
|
101
|
+
return `${vms.length} VMs · ${vms.filter(isHeld).length} held`;
|
|
102
|
+
}
|
|
@@ -0,0 +1,65 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* CLI-ERRORS (owner 2026-10-17): "Already approved by <who> at <time>; nothing to do".
|
|
3
|
+
* Mirrors services/auth/lib/alreadyResolved.js so an older server (no `resolution` in its
|
|
4
|
+
* 400 body) still gets the same one-line answer from the card itself.
|
|
5
|
+
*/
|
|
6
|
+
import { QuoxUserError } from './errors.js';
|
|
7
|
+
|
|
8
|
+
const APPROVE = new Set(['approve', 'approved', 'accept', 'accepted', 'grant', 'granted']);
|
|
9
|
+
const DENY = new Set(['deny', 'denied', 'dismissed', 'reject', 'rejected']);
|
|
10
|
+
|
|
11
|
+
function normalise(action) {
|
|
12
|
+
const a = String(action || '').trim().toLowerCase();
|
|
13
|
+
if (APPROVE.has(a)) return 'approved';
|
|
14
|
+
if (DENY.has(a)) return 'rejected';
|
|
15
|
+
if (a === 'answer') return 'answered';
|
|
16
|
+
if (a === 'defer') return 'deferred';
|
|
17
|
+
if (a === 'request_changes') return 'changes requested';
|
|
18
|
+
return a ? 'resolved' : null;
|
|
19
|
+
}
|
|
20
|
+
|
|
21
|
+
/** A y/n decision answered "y" reads as approved, "n" as rejected; another option as answered "<key>". */
|
|
22
|
+
function outcomeOf(prior) {
|
|
23
|
+
const opt = prior && typeof prior.option === 'string' ? prior.option : null;
|
|
24
|
+
if (opt === 'y') return 'approved';
|
|
25
|
+
if (opt === 'n') return 'rejected';
|
|
26
|
+
const n = normalise(prior?.action);
|
|
27
|
+
return n === 'answered' && opt ? `answered "${opt}"` : n;
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
function toIso(ts) {
|
|
31
|
+
if (!ts) return null;
|
|
32
|
+
const s = String(ts);
|
|
33
|
+
const d = new Date(/[zZ]|[+-]\d\d:?\d\d$/.test(s) ? s : `${s.replace(' ', 'T')}Z`);
|
|
34
|
+
return Number.isNaN(d.getTime()) ? null : d.toISOString();
|
|
35
|
+
}
|
|
36
|
+
|
|
37
|
+
export function humanUtc(iso) {
|
|
38
|
+
return iso ? `${iso.slice(0, 10)} ${iso.slice(11, 16)} UTC` : 'an unknown time';
|
|
39
|
+
}
|
|
40
|
+
|
|
41
|
+
export function resolutionFromItem(item, requestedAction) {
|
|
42
|
+
if (!item || !item.id) return null;
|
|
43
|
+
const response = item.response || null;
|
|
44
|
+
const outcome = item.status === 'expired' ? 'expired' : item.status === 'cancelled' ? 'cancelled' : (outcomeOf(response) || 'resolved');
|
|
45
|
+
const name = item.resolved_by_name || response?.responded_by_name || null;
|
|
46
|
+
const at = toIso(item.resolved_at) || toIso(response?.responded_at) || null;
|
|
47
|
+
const requested = String(requestedAction || '').trim().toLowerCase() || null;
|
|
48
|
+
const matches = Boolean(requested) && outcome !== 'expired' && outcome !== 'cancelled' && normalise(requested) === outcome;
|
|
49
|
+
let message;
|
|
50
|
+
if (outcome === 'expired') message = `This approval expired at ${humanUtc(at)}; nothing was approved. Ask for it again.`;
|
|
51
|
+
else if (outcome === 'cancelled') message = `This item was cancelled at ${humanUtc(at)}${name ? ` by ${name}` : ''}; there is nothing to respond to.`;
|
|
52
|
+
else {
|
|
53
|
+
const head = `Already ${outcome}${name ? ` by ${name}` : ''} at ${humanUtc(at)}`;
|
|
54
|
+
message = matches || !requested ? `${head}; nothing to do.` : `${head}; your ${requested} was not applied.`;
|
|
55
|
+
}
|
|
56
|
+
return { item_id: item.id, status: item.status, outcome, resolved_by: item.resolved_by || null, resolved_by_name: name, resolved_at: at, requested, matches, message };
|
|
57
|
+
}
|
|
58
|
+
|
|
59
|
+
/** A respond whose outcome does NOT match what is already recorded: exit 6 (conflict). */
|
|
60
|
+
export function alreadyResolvedError(resolution, cause) {
|
|
61
|
+
return new QuoxUserError(resolution.message, {
|
|
62
|
+
next: `\`quox inbox show ${resolution.item_id}\` shows the decision.`,
|
|
63
|
+
exitCode: 6, code: 'already_resolved', status: cause?.status, body: cause?.body,
|
|
64
|
+
});
|
|
65
|
+
}
|
package/lib/core/lazyCommands.js
CHANGED
|
@@ -95,7 +95,10 @@ async function fullLoad(program, ctx, registrars, baseUrl, key) {
|
|
|
95
95
|
* @param {string} baseUrl import.meta.url of the caller
|
|
96
96
|
*/
|
|
97
97
|
export async function registerCommandGroups(program, ctx, registrars, argv, baseUrl) {
|
|
98
|
-
|
|
98
|
+
// The directory the registrar modules live in, resolved from the registrar paths
|
|
99
|
+
// themselves (the list moved to lib/core/commandRegistrars.js, so baseUrl is no
|
|
100
|
+
// longer bin/quox.js and a fixed '../lib/commands' would miss).
|
|
101
|
+
const commandsDir = registrars.length ? dirname(fileURLToPath(new URL(registrars[0][0], baseUrl))) : join(dirname(fileURLToPath(baseUrl)), '..', 'lib', 'commands');
|
|
99
102
|
const key = process.env.QUOX_CLI_EAGER === '1' ? null : mapKey(registrars, commandsDir);
|
|
100
103
|
const token = commandToken(argv);
|
|
101
104
|
if (key && token && !FULL_LOAD_TOKENS.has(token)) {
|
|
@@ -10,7 +10,7 @@ import { spawnSync } from 'node:child_process';
|
|
|
10
10
|
|
|
11
11
|
export const TMUX_FORMAT = '#{session_name}\t#{session_created}\t#{session_attached}\t#{pane_current_command}\t#{pane_pid}\t#{session_activity}';
|
|
12
12
|
|
|
13
|
-
const AGENT_PROGRAMS = new Set(['claude', 'codex'
|
|
13
|
+
const AGENT_PROGRAMS = new Set(['claude', 'codex']);
|
|
14
14
|
|
|
15
15
|
/** Parse `tmux list-panes -a -F TMUX_FORMAT` output; one entry per session (first pane wins). */
|
|
16
16
|
export function parseTmuxPanes(out) {
|
|
@@ -0,0 +1,97 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* QLOOP-LIVE: render loop events as QuoxGlyph lines (`quox loop watch`).
|
|
3
|
+
* ∞ QLOOP │ turn 3/10 │ wrote report.md · 41s ✔
|
|
4
|
+
*
|
|
5
|
+
* Pure: event in, string out, so the watch loop, the tests and anything else that wants the same
|
|
6
|
+
* voice (the TUI card's observe lines) share one renderer. The ∞ icon is claimed here by extending
|
|
7
|
+
* the exported registry at import time (the vendored quoxglyph.js is source-locked to the package).
|
|
8
|
+
*/
|
|
9
|
+
|
|
10
|
+
import { ICONS, STATUS, brandName } from './quoxglyph.js';
|
|
11
|
+
|
|
12
|
+
ICONS.qloop = '∞ QLOOP';
|
|
13
|
+
|
|
14
|
+
const R = '\x1b[0m', DIM = '\x1b[2m';
|
|
15
|
+
const colourOn = () => brandName('x y') !== 'x y';
|
|
16
|
+
|
|
17
|
+
function oneLine(s, n) {
|
|
18
|
+
const t = String(s == null ? '' : s).replace(/\s+/g, ' ').trim();
|
|
19
|
+
return [...t].length > n ? `${[...t].slice(0, n - 1).join('')}…` : t;
|
|
20
|
+
}
|
|
21
|
+
|
|
22
|
+
/** "41s", "1m12s", "2h03m" */
|
|
23
|
+
export function elapsedLabel(ms) {
|
|
24
|
+
const s = Math.max(0, Math.round(ms / 1000));
|
|
25
|
+
if (s < 60) return `${s}s`;
|
|
26
|
+
if (s < 3600) return `${Math.floor(s / 60)}m${String(s % 60).padStart(2, '0')}s`;
|
|
27
|
+
return `${Math.floor(s / 3600)}h${String(Math.floor((s % 3600) / 60)).padStart(2, '0')}m`;
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
/** One QLOOP line: icon+name, verb, optional result, optional status glyph. Result is NOT budget-truncated here (callers cap it). */
|
|
31
|
+
export function loopLine(verb, result, status) {
|
|
32
|
+
const col = colourOn();
|
|
33
|
+
const sep = col ? `${DIM}│${R}` : '│';
|
|
34
|
+
let out = `${brandName(ICONS.qloop)} ${sep} ${verb}`;
|
|
35
|
+
if (result) out += ` ${sep} ${result}`;
|
|
36
|
+
const s = status && STATUS[status];
|
|
37
|
+
if (s) out += ' ' + (col && s.rgb ? `\x1b[38;2;${s.rgb[0]};${s.rgb[1]};${s.rgb[2]}m${s.glyph}${R}` : s.glyph);
|
|
38
|
+
return out;
|
|
39
|
+
}
|
|
40
|
+
|
|
41
|
+
const OBSERVE_STATUS = { interval: 'busy', milestone: 'ok', error: 'fail', approval: 'warn', stall: 'warn' };
|
|
42
|
+
|
|
43
|
+
/**
|
|
44
|
+
* @param {object} e a loop event (design section 1)
|
|
45
|
+
* @param {object} ctx { title, maxTurns, startedMs, spool }
|
|
46
|
+
* @returns {string[]} lines to print (may be empty)
|
|
47
|
+
*/
|
|
48
|
+
export function renderEvent(e, ctx = {}) {
|
|
49
|
+
const max = ctx.maxTurns ? `/${ctx.maxTurns}` : '';
|
|
50
|
+
const since = ctx.startedMs ? ` · ${elapsedLabel(Date.parse(e.at) - ctx.startedMs)}` : '';
|
|
51
|
+
switch (e.type) {
|
|
52
|
+
case 'loop.started': {
|
|
53
|
+
const scope = Array.isArray(e.scope) && e.scope.length ? e.scope.join(',') : 'none';
|
|
54
|
+
return [loopLine('started', `host ${e.host} · ${e.backend} · scope ${oneLine(scope, 60)}${e.max_turns ? ` · ${e.max_turns} turns max` : ''}`, 'busy')];
|
|
55
|
+
}
|
|
56
|
+
case 'loop.turn.started':
|
|
57
|
+
return ctx.spool ? [loopLine(`turn ${e.turn}${max}`, 'working', 'busy')] : [];
|
|
58
|
+
case 'loop.turn.output':
|
|
59
|
+
return ctx.spool ? String(e.chunk).replace(/\n+$/, '').split('\n').map((l) => ` │ ${l}`) : [];
|
|
60
|
+
case 'loop.turn.tool': {
|
|
61
|
+
if (e.note) return [loopLine(`turn ${e.turn}`, `${e.tool} no result (${oneLine(e.note, 60)})${since}`, 'warn')];
|
|
62
|
+
if (e.denied) return [loopLine(`turn ${e.turn}`, `${e.tool} denied: ${oneLine(e.denied, 60)}${since}`, 'warn')];
|
|
63
|
+
return [loopLine(`turn ${e.turn}`, `${e.tool} ${e.ok ? 'ok' : 'failed'}${e.ms ? ` ${e.ms}ms` : ''}${since}`, e.ok ? 'ok' : 'fail')];
|
|
64
|
+
}
|
|
65
|
+
case 'loop.turn.completed':
|
|
66
|
+
return [loopLine(`turn ${e.turn}${max}`, `${oneLine(e.summary, 70)}${since}`, 'ok')];
|
|
67
|
+
case 'loop.observe':
|
|
68
|
+
if (e.kind === 'milestone') return [loopLine('milestone', oneLine(e.text, 100), 'ok')];
|
|
69
|
+
return [loopLine(e.kind === 'interval' ? 'status' : e.kind, oneLine(e.text, 110), OBSERVE_STATUS[e.kind] || 'busy')];
|
|
70
|
+
case 'loop.ward':
|
|
71
|
+
if (e.status === 'pending') return []; // announced, not yet witnessed: nothing to say yet
|
|
72
|
+
return [loopLine('receipt', `${String(e.envelope_id).slice(0, 12)} ${e.status}`, e.status === 'WITNESSED' ? 'ok' : 'warn')];
|
|
73
|
+
case 'loop.approval':
|
|
74
|
+
return [loopLine('approval', `${oneLine(e.what, 90)} (${e.checkpoint_id})`, 'warn')];
|
|
75
|
+
case 'loop.finished': {
|
|
76
|
+
// Only a clean completion is a tick. completed_with_errors and a halt / interruption warn; a failure fails. The reason is
|
|
77
|
+
// whole (a wrapped line beats a cut sentence) and loses the raw component prefix the spawner puts first.
|
|
78
|
+
const status = e.state === 'completed' ? 'ok' : e.state === 'failed' ? 'fail' : 'warn';
|
|
79
|
+
const wit = e.receipts != null ? `, ${e.witnessed}/${e.receipts} witnessed` : '';
|
|
80
|
+
const reason = String(e.reason || '').replace(/\s+/g, ' ').trim().replace(/^[a-z][A-Za-z0-9]*[A-Z][A-Za-z0-9]*:\s+/, '');
|
|
81
|
+
const why = e.state !== 'completed' && reason ? `: ${reason}` : '';
|
|
82
|
+
return [loopLine(oneLine(ctx.title || 'loop', 48), `${e.state}, ${e.turns} turn${e.turns === 1 ? '' : 's'}${wit}${why}`, status)];
|
|
83
|
+
}
|
|
84
|
+
default:
|
|
85
|
+
return [];
|
|
86
|
+
}
|
|
87
|
+
}
|
|
88
|
+
|
|
89
|
+
/** Exit code for a finished loop: 0 completed (also with errors), 1 failed, 2 halted by a human, 3 interrupted. */
|
|
90
|
+
export function exitCodeFor(state) {
|
|
91
|
+
switch (state) {
|
|
92
|
+
case 'completed': case 'completed_with_errors': return 0;
|
|
93
|
+
case 'halted': return 2;
|
|
94
|
+
case 'interrupted': return 3;
|
|
95
|
+
default: return 1;
|
|
96
|
+
}
|
|
97
|
+
}
|