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,361 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Memory commands: CRUD, search, stats, export, batch
|
|
3
|
+
*
|
|
4
|
+
* FINDING F5 (SEER first-test, QuoxIdentity): `memory search` used to hit
|
|
5
|
+
* the memory service DIRECTLY at :3103 (fragile cert/port, and a different
|
|
6
|
+
* code path from everything else). It now routes through the collector's
|
|
7
|
+
* governed POST /api/v1/tools/execute (tool_name memory_search), matching
|
|
8
|
+
* how nucleus.js and fleet.js already call that endpoint, so the op is
|
|
9
|
+
* org-scoped and audited exactly like every other tool call.
|
|
10
|
+
*
|
|
11
|
+
* `list` and `create` stay on the direct memory-service path: the collector
|
|
12
|
+
* only exposes memory_save/memory_search/memory_update/entity_note as
|
|
13
|
+
* governed tools (services/collector/lib/agentTools.js MEMORY_TOOLS): there
|
|
14
|
+
* is no memory_list tool, and memory_search itself 400s without a non-empty
|
|
15
|
+
* `q` (services/memory/server.js), so it cannot stand in for an unfiltered
|
|
16
|
+
* list. memory_save's type enum (fact/preference/decision/constraint/
|
|
17
|
+
* observation) also does not match `create`'s documented enum (which
|
|
18
|
+
* includes `entity`, not `constraint`), and it has no input for targeting
|
|
19
|
+
* an arbitrary --agent the way the direct endpoint's body.agent_id does.
|
|
20
|
+
* Converting either would be a silent behaviour change, not a port fix, so
|
|
21
|
+
* they were left as-is. See the F5 task report for the full note.
|
|
22
|
+
*/
|
|
23
|
+
|
|
24
|
+
import { formatOutput, formatDetail, printSuccess } from '../core/output.js';
|
|
25
|
+
import { resolveEndpoint } from '../api/endpoints.js';
|
|
26
|
+
import { QuoxError } from '../core/errors.js';
|
|
27
|
+
import { resolveOrgId } from './helpers.js';
|
|
28
|
+
import { resolveMyAttach } from './agentAttach.js';
|
|
29
|
+
import { hasExplicitProfile } from '../core/actingAs.js';
|
|
30
|
+
|
|
31
|
+
// QUOXIDENTITY P9: which agent this session acts as is resolved session-scoped
|
|
32
|
+
// (QUOX_T subtree / QUOX_ATTACH_AGENT override / single-attach fallback), so
|
|
33
|
+
// two sessions on one box no longer collide. See agentAttach.js resolveMyAttach.
|
|
34
|
+
const detectSoleAttachLease = resolveMyAttach;
|
|
35
|
+
|
|
36
|
+
/**
|
|
37
|
+
* Call a governed collector memory tool (POST /api/v1/tools/execute).
|
|
38
|
+
* Lease-aware: when exactly one attach lease is active, the call is made
|
|
39
|
+
* AS that agent (its attach token, no caller org_id override) so the op is
|
|
40
|
+
* witnessed under the agent's own identity and scoped server-side to its
|
|
41
|
+
* namespace (services/collector/lib/memoryToolHandlers.js already scopes
|
|
42
|
+
* memory_search to attachLeaseId's agent_id). Otherwise it runs as the
|
|
43
|
+
* caller's own identity, org-scoped like nucleus.js's tool calls.
|
|
44
|
+
*/
|
|
45
|
+
async function callMemoryTool({ client, auth, program }, toolName, input) {
|
|
46
|
+
const ep = resolveEndpoint('v1.tools.execute');
|
|
47
|
+
const body = { tool_name: toolName, input };
|
|
48
|
+
const requestOptions = { service: ep.service, body };
|
|
49
|
+
|
|
50
|
+
// An explicit -p/--profile (or QUOX_PROFILE) is the caller saying "as me":
|
|
51
|
+
// it wins over the session's attach lease, same precedence as
|
|
52
|
+
// core/actingAs. Before this, `quox -p moo memory search` inside an attached
|
|
53
|
+
// session went out on the lease token and 401'd (proof engine 2026-10-14).
|
|
54
|
+
const argv = (program.rawArgs || process.argv).slice(2);
|
|
55
|
+
const lease = hasExplicitProfile(argv) ? null : detectSoleAttachLease();
|
|
56
|
+
if (lease) {
|
|
57
|
+
requestOptions.noAuth = true;
|
|
58
|
+
requestOptions.headers = { Authorization: `Bearer ${lease.token}` };
|
|
59
|
+
} else {
|
|
60
|
+
const orgId = resolveOrgId(auth, program);
|
|
61
|
+
if (orgId) body.org_id = orgId;
|
|
62
|
+
}
|
|
63
|
+
|
|
64
|
+
return client.post(ep.path, requestOptions);
|
|
65
|
+
}
|
|
66
|
+
|
|
67
|
+
export function registerMemoryCommands(program, ctx) {
|
|
68
|
+
const { client, auth } = ctx;
|
|
69
|
+
|
|
70
|
+
const memory = program
|
|
71
|
+
.command('memory')
|
|
72
|
+
.description('Manage memories');
|
|
73
|
+
|
|
74
|
+
memory
|
|
75
|
+
.command('list')
|
|
76
|
+
.description('List memories')
|
|
77
|
+
.option('--type <type>', 'filter by type: fact, preference, decision, entity, observation')
|
|
78
|
+
.option('--limit <n>', 'max results', '50')
|
|
79
|
+
.option('--agent <agentId>', 'filter by agent')
|
|
80
|
+
.action(async (options) => {
|
|
81
|
+
auth.requireAuth();
|
|
82
|
+
const query = { limit: options.limit };
|
|
83
|
+
if (options.type) query.type = options.type;
|
|
84
|
+
if (options.agent) query.agent_id = options.agent;
|
|
85
|
+
const data = await client.get(resolveEndpoint('memory.list').path, { service: resolveEndpoint('memory.list').service, query });
|
|
86
|
+
formatOutput({
|
|
87
|
+
columns: ['id', 'type', 'content', 'tags', 'created_at'],
|
|
88
|
+
headers: ['ID', 'Type', 'Content', 'Tags', 'Created'],
|
|
89
|
+
rows: (data.memories || data).map(m => ({
|
|
90
|
+
...m,
|
|
91
|
+
// fleet #373: the service stores/returns `memory_type`; this table
|
|
92
|
+
// read `type` and so rendered "-" for every row even though
|
|
93
|
+
// `--json` showed the value correctly.
|
|
94
|
+
type: m.memory_type ?? m.type,
|
|
95
|
+
content: (m.content || '').slice(0, 80),
|
|
96
|
+
tags: Array.isArray(m.tags) ? m.tags.join(', ') : m.tags,
|
|
97
|
+
})),
|
|
98
|
+
}, { format: program.opts().output });
|
|
99
|
+
});
|
|
100
|
+
|
|
101
|
+
memory
|
|
102
|
+
.command('get')
|
|
103
|
+
.description('Get memory details')
|
|
104
|
+
.argument('<id>', 'memory ID')
|
|
105
|
+
.action(async (id) => {
|
|
106
|
+
auth.requireAuth();
|
|
107
|
+
const data = await client.get(resolveEndpoint('memory.get', { id }).path, { service: resolveEndpoint('memory.get', { id }).service });
|
|
108
|
+
formatDetail(data.memory || data, { format: program.opts().output });
|
|
109
|
+
});
|
|
110
|
+
|
|
111
|
+
// Codex cycle 4 #10: how beliefs changed, and undoing a wrong correction.
|
|
112
|
+
memory
|
|
113
|
+
.command('timeline')
|
|
114
|
+
.description('Decisions that changed over time (newest change first)')
|
|
115
|
+
.argument('[query]', 'only chains mentioning this text')
|
|
116
|
+
.option('--limit <n>', 'max decisions', '20')
|
|
117
|
+
.action(async (query, options) => {
|
|
118
|
+
auth.requireAuth();
|
|
119
|
+
const ep = resolveEndpoint('memory.timeline');
|
|
120
|
+
const data = await client.get(ep.path, { service: ep.service, query: { q: query || '', limit: options.limit } });
|
|
121
|
+
const decisions = data.decisions || [];
|
|
122
|
+
formatOutput({
|
|
123
|
+
columns: ['id', 'changes', 'last_change', 'now', 'was'],
|
|
124
|
+
headers: ['Current ID', 'Changes', 'Last change', 'Now', 'Was'],
|
|
125
|
+
rows: decisions.map((d) => ({
|
|
126
|
+
id: d.current.id,
|
|
127
|
+
changes: d.changes,
|
|
128
|
+
last_change: d.last_change || '-',
|
|
129
|
+
now: (d.current.content || '').slice(0, 70),
|
|
130
|
+
was: (d.history[d.history.length - 2]?.content || '').slice(0, 70),
|
|
131
|
+
})),
|
|
132
|
+
}, { format: program.opts().output, raw: data });
|
|
133
|
+
});
|
|
134
|
+
|
|
135
|
+
memory
|
|
136
|
+
.command('history')
|
|
137
|
+
.description('Full change history of one belief, oldest first, with reasons')
|
|
138
|
+
.argument('<id>', 'memory ID (any version in the chain)')
|
|
139
|
+
.action(async (id) => {
|
|
140
|
+
auth.requireAuth();
|
|
141
|
+
const ep = resolveEndpoint('memory.history', { id });
|
|
142
|
+
const data = await client.get(ep.path, { service: ep.service });
|
|
143
|
+
formatOutput({
|
|
144
|
+
columns: ['id', 'state', 'created_at', 'content', 'reason'],
|
|
145
|
+
headers: ['ID', 'State', 'Created', 'Content', 'Replaced because'],
|
|
146
|
+
rows: (data.history || []).map((m) => ({
|
|
147
|
+
id: m.id,
|
|
148
|
+
state: m.valid ? 'current' : 'replaced',
|
|
149
|
+
created_at: m.created_at,
|
|
150
|
+
content: (m.content || '').slice(0, 80),
|
|
151
|
+
reason: (m.superseded_reason || '').slice(0, 80),
|
|
152
|
+
})),
|
|
153
|
+
}, { format: program.opts().output, raw: data });
|
|
154
|
+
});
|
|
155
|
+
|
|
156
|
+
memory
|
|
157
|
+
.command('reinstate')
|
|
158
|
+
.description('Undo a wrong correction: make a replaced belief current again')
|
|
159
|
+
.argument('<id>', 'ID of the replaced belief that was right')
|
|
160
|
+
.action(async (id) => {
|
|
161
|
+
auth.requireAuth();
|
|
162
|
+
const ep = resolveEndpoint('memory.reinstate', { id });
|
|
163
|
+
const data = await client.post(ep.path, { service: ep.service, body: {} });
|
|
164
|
+
if (program.opts().output === 'json') { console.log(JSON.stringify(data, null, 2)); return; }
|
|
165
|
+
printSuccess(`Reinstated ${data.reinstated?.id}; retired ${data.retired?.id} (marked disputed, Dream will not re-apply it)`);
|
|
166
|
+
});
|
|
167
|
+
|
|
168
|
+
memory
|
|
169
|
+
.command('create')
|
|
170
|
+
.description('Save a new memory')
|
|
171
|
+
.requiredOption('--type <type>', 'memory type: fact, preference, decision, entity, observation')
|
|
172
|
+
.requiredOption('--content <text>', 'memory content')
|
|
173
|
+
.option('--tags <tags>', 'comma-separated tags')
|
|
174
|
+
.option('--agent <agentId>', 'agent ID')
|
|
175
|
+
.action(async (options) => {
|
|
176
|
+
auth.requireAuth();
|
|
177
|
+
const body = {
|
|
178
|
+
type: options.type,
|
|
179
|
+
content: options.content,
|
|
180
|
+
};
|
|
181
|
+
if (options.tags) body.tags = options.tags.split(',').map(t => t.trim());
|
|
182
|
+
if (options.agent) body.agent_id = options.agent;
|
|
183
|
+
await client.post(resolveEndpoint('memory.create').path, { service: resolveEndpoint('memory.create').service, body });
|
|
184
|
+
printSuccess('Memory saved.');
|
|
185
|
+
});
|
|
186
|
+
|
|
187
|
+
memory
|
|
188
|
+
.command('update')
|
|
189
|
+
.description('Update a memory')
|
|
190
|
+
.argument('<id>', 'memory ID')
|
|
191
|
+
.option('--content <text>', 'new content')
|
|
192
|
+
.option('--tags <tags>', 'new tags (comma-separated)')
|
|
193
|
+
.action(async (id, options) => {
|
|
194
|
+
auth.requireAuth();
|
|
195
|
+
const body = {};
|
|
196
|
+
if (options.content) body.content = options.content;
|
|
197
|
+
if (options.tags) body.tags = options.tags.split(',').map(t => t.trim());
|
|
198
|
+
await client.patch(resolveEndpoint('memory.update', { id }).path, { service: resolveEndpoint('memory.update', { id }).service, body });
|
|
199
|
+
printSuccess('Memory updated.');
|
|
200
|
+
});
|
|
201
|
+
|
|
202
|
+
memory
|
|
203
|
+
.command('delete')
|
|
204
|
+
.description('Delete a memory')
|
|
205
|
+
.argument('<id>', 'memory ID')
|
|
206
|
+
.option('--hard', 'permanently delete (no soft-delete)')
|
|
207
|
+
.action(async (id, options) => {
|
|
208
|
+
auth.requireAuth();
|
|
209
|
+
const query = {};
|
|
210
|
+
if (options.hard) query.hard = 'true';
|
|
211
|
+
await client.delete(resolveEndpoint('memory.delete', { id }).path, { service: resolveEndpoint('memory.delete', { id }).service, query });
|
|
212
|
+
printSuccess('Memory deleted.');
|
|
213
|
+
});
|
|
214
|
+
|
|
215
|
+
// ONE-BRAIN CX6: the user-facing twin of the Cortex memory_forget tool.
|
|
216
|
+
// Same endpoint as `delete`; confirmation is required, like `notes rm`.
|
|
217
|
+
memory
|
|
218
|
+
.command('forget')
|
|
219
|
+
.description('Forget one of your memories (soft delete). Requires --yes. --permanent erases it for good (irreversible).')
|
|
220
|
+
.argument('<id>', 'memory ID')
|
|
221
|
+
.option('--permanent', 'permanently erase the memory (no soft-delete); cannot be undone')
|
|
222
|
+
.option('--yes', 'confirm forgetting')
|
|
223
|
+
.action(async (id, options) => {
|
|
224
|
+
auth.requireAuth();
|
|
225
|
+
if (!options.yes) throw new QuoxError(`Refusing to ${options.permanent ? 'permanently erase' : 'forget'} memory ${id} without --yes.`, 2);
|
|
226
|
+
const ep = resolveEndpoint('memory.delete', { id });
|
|
227
|
+
const query = {};
|
|
228
|
+
if (options.permanent) query.hard = 'true';
|
|
229
|
+
await client.delete(ep.path, { service: ep.service, query });
|
|
230
|
+
printSuccess(options.permanent ? `Permanently erased memory ${id}.` : `Forgot memory ${id}.`);
|
|
231
|
+
});
|
|
232
|
+
|
|
233
|
+
memory
|
|
234
|
+
.command('search')
|
|
235
|
+
.description('Search memories')
|
|
236
|
+
// #620: accept a positional query as shorthand; --query still works and
|
|
237
|
+
// wins if both are given. One of the two is required.
|
|
238
|
+
.argument('[query]', 'search query (shorthand for --query)')
|
|
239
|
+
.option('--query <q>', 'search query')
|
|
240
|
+
.option('--limit <n>', 'max results', '20')
|
|
241
|
+
.option('--type <type>', 'filter by type')
|
|
242
|
+
.action(async (queryArg, options) => {
|
|
243
|
+
auth.requireAuth();
|
|
244
|
+
const query = options.query || queryArg;
|
|
245
|
+
if (!query) {
|
|
246
|
+
throw new Error('A search query is required: `quox memory search "your query"` or --query "your query".');
|
|
247
|
+
}
|
|
248
|
+
// FINDING F5: governed path (POST /api/v1/tools/execute, tool_name
|
|
249
|
+
// memory_search) instead of a direct GET against the memory service.
|
|
250
|
+
// See the file header comment for why list/create stayed direct.
|
|
251
|
+
const input = { query, limit: options.limit };
|
|
252
|
+
if (options.type) input.type_filter = options.type;
|
|
253
|
+
const data = await callMemoryTool({ client, auth, program }, 'memory_search', input);
|
|
254
|
+
formatOutput({
|
|
255
|
+
// The governed memory_search tool's result shape (services/collector
|
|
256
|
+
// /lib/memoryToolHandlers.js memorySearch) has no `rank`/`score`
|
|
257
|
+
// field (it drops the FTS bm25 rank), so this column shows '-'.
|
|
258
|
+
columns: ['id', 'type', 'content', 'rank'],
|
|
259
|
+
headers: ['ID', 'Type', 'Content', 'Score'],
|
|
260
|
+
rows: (data.results || data.memories || []).map(m => ({
|
|
261
|
+
...m,
|
|
262
|
+
type: m.memory_type ?? m.type, // fleet #373, same as list above
|
|
263
|
+
content: (m.content || '').slice(0, 80),
|
|
264
|
+
rank: typeof m.rank === 'number' ? m.rank.toFixed(2) : (m.rank ?? '-'),
|
|
265
|
+
})),
|
|
266
|
+
}, { format: program.opts().output });
|
|
267
|
+
});
|
|
268
|
+
|
|
269
|
+
// QUOXMIND #1111: the old view counted only rows under YOUR user id, so an
|
|
270
|
+
// org holding hundreds of agent-written memories looked nearly empty. Default
|
|
271
|
+
// is now the org view (per agent, per writer), falling back honestly.
|
|
272
|
+
memory
|
|
273
|
+
.command('stats')
|
|
274
|
+
.description('Show memory statistics: the whole org by agent and writer (org admins), else your own')
|
|
275
|
+
.option('--mine', 'only memories written under your own login')
|
|
276
|
+
.action(async (options) => {
|
|
277
|
+
auth.requireAuth();
|
|
278
|
+
const ep = resolveEndpoint('memory.stats.list');
|
|
279
|
+
let data;
|
|
280
|
+
let note = '';
|
|
281
|
+
if (options.mine) {
|
|
282
|
+
data = await client.get(ep.path, { service: ep.service, query: {} });
|
|
283
|
+
} else {
|
|
284
|
+
try {
|
|
285
|
+
data = await client.get(ep.path, { service: ep.service, query: { scope: 'org' } });
|
|
286
|
+
} catch (err) {
|
|
287
|
+
if (err?.status !== 403) throw err;
|
|
288
|
+
data = await client.get(ep.path, { service: ep.service, query: {} });
|
|
289
|
+
note = 'Org-wide counts need an org admin or owner. Showing only memories written under your own login; agents write under their own identities, so the org holds more.';
|
|
290
|
+
}
|
|
291
|
+
}
|
|
292
|
+
const format = program.opts().output;
|
|
293
|
+
if (format === 'json') { console.log(JSON.stringify(note ? { ...data, note } : data, null, 2)); return; }
|
|
294
|
+
if (data?.scope !== 'org') {
|
|
295
|
+
formatDetail(data.stats || data, { format, title: 'Memory Stats (your login only)' });
|
|
296
|
+
console.log(note || 'Counts only memories written under your own login. `quox memory stats` without --mine shows the whole org (org admins).');
|
|
297
|
+
return;
|
|
298
|
+
}
|
|
299
|
+
const m = data.memories || {};
|
|
300
|
+
console.log(`Memory Stats (org): ${m.total ?? 0} valid memories, ${m.not_valid ?? 0} superseded or deleted (kept for history), ${data.pinned ?? 0} pinned, last write ${data.last_write_at || 'never'}`);
|
|
301
|
+
if (m.by_type) console.log(`By type: ${Object.entries(m.by_type).map(([k, v]) => `${k} ${v}`).join(', ')}`);
|
|
302
|
+
formatOutput({
|
|
303
|
+
columns: ['agent', 'count'], headers: ['Agent', 'Memories'],
|
|
304
|
+
rows: Object.entries(data.by_agent || {}).map(([agent, count]) => ({ agent, count })),
|
|
305
|
+
}, { format });
|
|
306
|
+
formatOutput({
|
|
307
|
+
columns: ['user_id', 'kind', 'count', 'agents'], headers: ['Writer', 'Kind', 'Memories', 'Agents'],
|
|
308
|
+
rows: (data.by_user || []).map((u) => ({ ...u, agents: (u.agents || []).join(',') })),
|
|
309
|
+
}, { format });
|
|
310
|
+
console.log('Valid = not deleted and not superseded. A writer is the login a memory was saved under: your own, an agent identity, service/system (internal agents), or org-shared beliefs.');
|
|
311
|
+
});
|
|
312
|
+
|
|
313
|
+
memory
|
|
314
|
+
.command('core')
|
|
315
|
+
.description('Show the core set: memories loaded into every chat turn (pinned, plus auto-promoted decisions and facts rated high or critical)')
|
|
316
|
+
.option('--limit <n>', 'max memories', '20')
|
|
317
|
+
.action(async (options) => {
|
|
318
|
+
auth.requireAuth();
|
|
319
|
+
const ep = resolveEndpoint('memory.core-set');
|
|
320
|
+
const data = await client.get(ep.path, { service: ep.service, query: { limit: options.limit } });
|
|
321
|
+
formatOutput({
|
|
322
|
+
columns: ['id', 'core_reason', 'agent_id', 'memory_type', 'content'],
|
|
323
|
+
headers: ['ID', 'Why', 'Agent', 'Type', 'Content'],
|
|
324
|
+
rows: (data.memories || []).map((m) => ({ ...m, content: (m.content || '').slice(0, 80) })),
|
|
325
|
+
}, { format: program.opts().output, raw: data });
|
|
326
|
+
});
|
|
327
|
+
|
|
328
|
+
memory
|
|
329
|
+
.command('pin')
|
|
330
|
+
.description('Pin a memory into the core set so every chat turn carries it')
|
|
331
|
+
.argument('<id>', 'memory ID')
|
|
332
|
+
.action(async (id) => {
|
|
333
|
+
auth.requireAuth();
|
|
334
|
+
const ep = resolveEndpoint('memory.pin', { id });
|
|
335
|
+
const data = await client.post(ep.path, { service: ep.service, body: {} });
|
|
336
|
+
if (program.opts().output === 'json') { console.log(JSON.stringify(data, null, 2)); return; }
|
|
337
|
+
printSuccess(`Pinned ${id} into the core set.`);
|
|
338
|
+
});
|
|
339
|
+
|
|
340
|
+
memory
|
|
341
|
+
.command('unpin')
|
|
342
|
+
.description('Take a memory out of the core set (also stops it being auto-promoted)')
|
|
343
|
+
.argument('<id>', 'memory ID')
|
|
344
|
+
.action(async (id) => {
|
|
345
|
+
auth.requireAuth();
|
|
346
|
+
const ep = resolveEndpoint('memory.unpin', { id });
|
|
347
|
+
const data = await client.delete(ep.path, { service: ep.service });
|
|
348
|
+
if (program.opts().output === 'json') { console.log(JSON.stringify(data, null, 2)); return; }
|
|
349
|
+
printSuccess(`Unpinned ${id}: it stays a memory, but is no longer in the core set.`);
|
|
350
|
+
});
|
|
351
|
+
|
|
352
|
+
memory
|
|
353
|
+
.command('export')
|
|
354
|
+
.description('Export all memories')
|
|
355
|
+
.option('--format <fmt>', 'export format', 'json')
|
|
356
|
+
.action(async (options) => {
|
|
357
|
+
auth.requireAuth();
|
|
358
|
+
const data = await client.get(resolveEndpoint('memory.export.list').path, { service: resolveEndpoint('memory.export.list').service, query: { format: options.format } });
|
|
359
|
+
console.log(JSON.stringify(data, null, 2));
|
|
360
|
+
});
|
|
361
|
+
}
|
|
@@ -0,0 +1,71 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* `quox mind implants|implant <id>|health`: QuoxMind cognitive implants (read-only).
|
|
3
|
+
* Collector routes under /api/v1/mind (org-scoped). Implants with no recorded
|
|
4
|
+
* activity say so; nothing is invented.
|
|
5
|
+
*/
|
|
6
|
+
import { formatOutput } from '../core/output.js';
|
|
7
|
+
import { resolveEndpoint } from '../api/endpoints.js';
|
|
8
|
+
import { resolveOrgId } from './helpers.js';
|
|
9
|
+
|
|
10
|
+
export function registerMindCommands(program, ctx) {
|
|
11
|
+
const { client, auth } = ctx;
|
|
12
|
+
const get = async (name, params) => {
|
|
13
|
+
auth.requireAuth();
|
|
14
|
+
const ep = resolveEndpoint(name, params);
|
|
15
|
+
return client.get(ep.path, { service: ep.service, query: { org_id: resolveOrgId(auth, program) } });
|
|
16
|
+
};
|
|
17
|
+
const isJson = () => program.opts().output === 'json';
|
|
18
|
+
|
|
19
|
+
const mind = program.command('mind').description('QuoxMind: the cognitive implants (read-only)');
|
|
20
|
+
|
|
21
|
+
mind
|
|
22
|
+
.command('implants')
|
|
23
|
+
.description('List the cognitive implants: purpose, status, last activity')
|
|
24
|
+
.action(async () => {
|
|
25
|
+
const data = await get('mind.implants');
|
|
26
|
+
const rows = data.implants || [];
|
|
27
|
+
formatOutput(rows.map((i) => ({
|
|
28
|
+
ID: i.short,
|
|
29
|
+
NAME: i.name,
|
|
30
|
+
PURPOSE: i.purpose,
|
|
31
|
+
STATUS: i.status,
|
|
32
|
+
'LAST ACTIVITY': i.last_activity || 'no activity recorded',
|
|
33
|
+
// QUOXMIND-PROOF: firing evidence from the implant's own table (null = not tracked).
|
|
34
|
+
'LAST FIRED': i.activity_error ? 'unknown' : (typeof i.fired_7d === 'number' ? (i.last_fired || 'never') : 'not tracked'),
|
|
35
|
+
'7D': typeof i.fired_7d === 'number' && !i.activity_error ? i.fired_7d : '-',
|
|
36
|
+
})), {
|
|
37
|
+
format: program.opts().output,
|
|
38
|
+
columns: ['ID', 'NAME', 'STATUS', 'LAST FIRED', '7D', 'PURPOSE'],
|
|
39
|
+
emptyMessage: 'No implants registered.',
|
|
40
|
+
raw: rows,
|
|
41
|
+
});
|
|
42
|
+
});
|
|
43
|
+
|
|
44
|
+
mind
|
|
45
|
+
.command('implant <id>')
|
|
46
|
+
.description('One implant in detail (e.g. predict, reflect, repobrain, qortex)')
|
|
47
|
+
.action(async (id) => {
|
|
48
|
+
const d = await get('mind.implant', { id });
|
|
49
|
+
if (isJson()) { console.log(JSON.stringify(d, null, 2)); return; }
|
|
50
|
+
console.log(`${d.name} (${d.short}) · ${d.status}${d.tier ? ` · ${d.tier}` : ''}`);
|
|
51
|
+
console.log(d.description || d.purpose);
|
|
52
|
+
if (d.inspired_by) console.log(`Inspired by: ${d.inspired_by}`);
|
|
53
|
+
if (d.summary) console.log(`Now: ${d.summary}`);
|
|
54
|
+
console.log(d.activity);
|
|
55
|
+
if (typeof d.fired_7d === 'number' && !d.activity_error) console.log(`Fired: ${d.last_fired || 'never'} · ${d.fired_7d} in the last 7 days${d.activity_source ? ` (from ${d.activity_source})` : ''}`);
|
|
56
|
+
else if (d.activity_error) console.log(`Fired: unknown (${d.activity_error})`);
|
|
57
|
+
for (const [k, v] of Object.entries(d.metrics || {})) if (v !== null && typeof v !== 'object') console.log(` ${k}: ${v}`);
|
|
58
|
+
});
|
|
59
|
+
|
|
60
|
+
mind
|
|
61
|
+
.command('health')
|
|
62
|
+
.description('Summary of QuoxMind health across all implants')
|
|
63
|
+
.action(async () => {
|
|
64
|
+
const d = await get('mind.health');
|
|
65
|
+
if (isJson()) { console.log(JSON.stringify(d, null, 2)); return; }
|
|
66
|
+
console.log(`${d.total} implants: ${Object.entries(d.by_status).map(([k, v]) => `${v} ${k}`).join(', ')}`);
|
|
67
|
+
console.log(`${d.with_activity} with recorded activity, ${d.no_activity} with no activity recorded`);
|
|
68
|
+
if (typeof d.fired_7d_total === 'number') console.log(`Last 7 days: ${d.fired_7d_implants} implants fired (${d.fired_7d_total} firings), ${d.silent_7d} silent, ${d.activity_unknown} not tracked`);
|
|
69
|
+
console.log(d.average_health === null ? 'Average health: not enough data' : `Average health: ${d.average_health} (over ${d.scored} scored)`);
|
|
70
|
+
});
|
|
71
|
+
}
|