quoxcli 0.0.0-stage → 0.2.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 +35 -0
- package/README.md +142 -2
- package/bin/quox.js +292 -0
- package/bin/quoxon.js +8 -0
- package/lib/api/endpoints/admin.js +125 -0
- package/lib/api/endpoints/aee.js +38 -0
- package/lib/api/endpoints/agent-attach.js +126 -0
- package/lib/api/endpoints/agents.js +56 -0
- package/lib/api/endpoints/assistants.js +50 -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/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 +54 -0
- package/lib/api/endpoints/consent.js +26 -0
- package/lib/api/endpoints/contactsq.js +66 -0
- package/lib/api/endpoints/conversations.js +32 -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 +32 -0
- package/lib/api/endpoints/file.js +20 -0
- package/lib/api/endpoints/files.js +26 -0
- package/lib/api/endpoints/github.js +21 -0
- package/lib/api/endpoints/governance.js +43 -0
- package/lib/api/endpoints/hat.js +36 -0
- package/lib/api/endpoints/inbox.js +32 -0
- package/lib/api/endpoints/inboxq.js +120 -0
- package/lib/api/endpoints/index.js +228 -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 +75 -0
- package/lib/api/endpoints/mfa.js +32 -0
- package/lib/api/endpoints/mon.js +178 -0
- package/lib/api/endpoints/notesq.js +43 -0
- package/lib/api/endpoints/objectives.js +62 -0
- package/lib/api/endpoints/orgs.js +38 -0
- package/lib/api/endpoints/plugins.js +134 -0
- package/lib/api/endpoints/powers.js +75 -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 +114 -0
- package/lib/api/endpoints/quoxseo.js +108 -0
- package/lib/api/endpoints/reach.js +47 -0
- package/lib/api/endpoints/runs.js +38 -0
- package/lib/api/endpoints/safety.js +46 -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 +180 -0
- package/lib/api/endpoints/sso.js +67 -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 +70 -0
- package/lib/api/endpoints/user-library.js +41 -0
- package/lib/api/endpoints/users.js +20 -0
- package/lib/api/endpoints/v1.js +499 -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 +40 -0
- package/lib/api/endpoints/webhooks.js +46 -0
- package/lib/api/endpoints/workflows.js +162 -0
- package/lib/api/endpoints/x.js +24 -0
- package/lib/api/endpoints.js +15 -0
- package/lib/commands/admin.js +359 -0
- package/lib/commands/aee.js +99 -0
- package/lib/commands/agent.js +201 -0
- package/lib/commands/agentAttach.js +1440 -0
- package/lib/commands/approvals.js +47 -0
- package/lib/commands/assistant.js +114 -0
- package/lib/commands/auth.js +458 -0
- package/lib/commands/awareness.js +88 -0
- package/lib/commands/backup.js +373 -0
- package/lib/commands/brain.js +994 -0
- package/lib/commands/budget.js +241 -0
- package/lib/commands/build.js +156 -0
- package/lib/commands/calendar.js +216 -0
- package/lib/commands/capabilities.js +34 -0
- package/lib/commands/chat.js +240 -0
- package/lib/commands/claude.js +354 -0
- package/lib/commands/config-cmd.js +106 -0
- package/lib/commands/consent.js +84 -0
- package/lib/commands/contacts.js +967 -0
- package/lib/commands/contactsSelftest.js +132 -0
- package/lib/commands/conversation.js +74 -0
- package/lib/commands/department.js +75 -0
- package/lib/commands/dev.js +620 -0
- package/lib/commands/devResident.js +314 -0
- package/lib/commands/devSupervisor.js +1050 -0
- package/lib/commands/discord.js +96 -0
- package/lib/commands/doctor.js +181 -0
- package/lib/commands/domain.js +114 -0
- package/lib/commands/done.js +277 -0
- package/lib/commands/engagement.js +586 -0
- package/lib/commands/entity.js +119 -0
- package/lib/commands/facebook.js +212 -0
- package/lib/commands/file.js +128 -0
- package/lib/commands/fleet.js +882 -0
- package/lib/commands/governance.js +638 -0
- package/lib/commands/gripe.js +324 -0
- package/lib/commands/hat.js +205 -0
- package/lib/commands/helpers.js +79 -0
- package/lib/commands/inbox.js +122 -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 +280 -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 +591 -0
- package/lib/commands/mail.js +531 -0
- package/lib/commands/memory.js +284 -0
- package/lib/commands/mon.js +514 -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 +92 -0
- package/lib/commands/objective.js +229 -0
- package/lib/commands/onboard.js +328 -0
- package/lib/commands/open.js +56 -0
- package/lib/commands/org.js +266 -0
- package/lib/commands/plan.js +906 -0
- package/lib/commands/plugin-doctor.js +1091 -0
- package/lib/commands/plugin.js +539 -0
- package/lib/commands/policy.js +78 -0
- package/lib/commands/powers.js +296 -0
- package/lib/commands/prompt.js +350 -0
- package/lib/commands/qlarity.js +690 -0
- package/lib/commands/quoxbox.js +270 -0
- package/lib/commands/quoxchat.js +266 -0
- package/lib/commands/quoxseo.js +340 -0
- package/lib/commands/reach.js +158 -0
- package/lib/commands/role.js +286 -0
- package/lib/commands/run.js +132 -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/service.js +89 -0
- package/lib/commands/settings.js +99 -0
- package/lib/commands/setup.js +543 -0
- package/lib/commands/skillManifest.js +113 -0
- package/lib/commands/skillRightsFormat.js +38 -0
- package/lib/commands/skills.js +644 -0
- package/lib/commands/slot.js +1198 -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 +140 -0
- package/lib/commands/tg.js +240 -0
- package/lib/commands/tiktok.js +218 -0
- package/lib/commands/tool.js +216 -0
- package/lib/commands/trace.js +525 -0
- package/lib/commands/trigger.js +128 -0
- package/lib/commands/vault.js +1424 -0
- package/lib/commands/voice.js +182 -0
- package/lib/commands/volt.js +528 -0
- package/lib/commands/watch.js +115 -0
- package/lib/commands/webhook.js +137 -0
- package/lib/commands/workflow.js +503 -0
- package/lib/commands/x.js +439 -0
- package/lib/core/actingAs.js +136 -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/auth.js +350 -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/client.js +584 -0
- package/lib/core/completions.js +163 -0
- package/lib/core/config.js +551 -0
- package/lib/core/confirm.js +37 -0
- package/lib/core/deeplinks.js +76 -0
- package/lib/core/doneEngineFetch.js +219 -0
- package/lib/core/errors.js +132 -0
- package/lib/core/global-flags.js +90 -0
- package/lib/core/governedSession.js +402 -0
- package/lib/core/lazyCommands.js +119 -0
- package/lib/core/liveSessionsReport.js +112 -0
- package/lib/core/org-override.js +52 -0
- package/lib/core/output.js +239 -0
- package/lib/core/prodEnv.js +7 -0
- package/lib/core/quoxglyph.js +158 -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 +104 -0
- package/lib/core/sessionHeartbeat.js +192 -0
- package/lib/core/sessionsOverview.js +160 -0
- package/lib/core/slotKeeper.js +282 -0
- package/lib/core/supervisorEngine.js +864 -0
- package/lib/core/systemdInstaller.js +256 -0
- package/lib/core/version.js +87 -0
- package/lib/core/websiteSession.js +148 -0
- package/lib/lucid/LucidIntro.jsx +105 -0
- package/lib/lucid/blind.js +71 -0
- package/lib/lucid/deck.js +32 -0
- package/lib/lucid/fmt.js +139 -0
- package/lib/lucid/sitrep.js +173 -0
- package/lib/plugins/loader.js +93 -0
- package/lib/quoxon/activity.js +104 -0
- package/lib/quoxon/api.js +473 -0
- package/lib/quoxon/app.js +1262 -0
- package/lib/quoxon/capabilities.js +75 -0
- package/lib/quoxon/commands.js +154 -0
- package/lib/quoxon/connect.js +467 -0
- package/lib/quoxon/connectCard.js +28 -0
- package/lib/quoxon/context.js +68 -0
- package/lib/quoxon/copy.js +33 -0
- package/lib/quoxon/demo.fixtures.js +24 -0
- package/lib/quoxon/demo.js +35 -0
- package/lib/quoxon/egg.js +36 -0
- package/lib/quoxon/events.js +458 -0
- package/lib/quoxon/gallery.js +223 -0
- package/lib/quoxon/indicator.js +193 -0
- package/lib/quoxon/intent.js +41 -0
- package/lib/quoxon/keys.js +121 -0
- package/lib/quoxon/main.js +244 -0
- package/lib/quoxon/markdown.js +317 -0
- package/lib/quoxon/model.js +205 -0
- package/lib/quoxon/motion/clock.js +69 -0
- package/lib/quoxon/motion/color.js +35 -0
- package/lib/quoxon/motion/frame.js +14 -0
- package/lib/quoxon/motion/reveal.js +54 -0
- package/lib/quoxon/motion/ring.js +79 -0
- package/lib/quoxon/objects/agent.js +61 -0
- package/lib/quoxon/objects/crystal.js +100 -0
- package/lib/quoxon/objects/fetch.js +170 -0
- package/lib/quoxon/objects/index.js +85 -0
- package/lib/quoxon/objects/ladder.js +71 -0
- package/lib/quoxon/objects/memory.js +44 -0
- package/lib/quoxon/objects/model.js +118 -0
- package/lib/quoxon/objects/proof.js +110 -0
- package/lib/quoxon/objects/skill.js +105 -0
- package/lib/quoxon/objects/view.js +76 -0
- package/lib/quoxon/objects/workflow.js +119 -0
- package/lib/quoxon/observers.js +42 -0
- package/lib/quoxon/onboarding/copy.js +235 -0
- package/lib/quoxon/onboarding/credential.js +95 -0
- package/lib/quoxon/onboarding/detect.js +22 -0
- package/lib/quoxon/onboarding/finish.js +119 -0
- package/lib/quoxon/onboarding/index.js +67 -0
- package/lib/quoxon/onboarding/installRunner.js +225 -0
- package/lib/quoxon/onboarding/intent.js +53 -0
- package/lib/quoxon/onboarding/journey.js +73 -0
- package/lib/quoxon/onboarding/preflight.js +142 -0
- package/lib/quoxon/onboarding/runner.js +58 -0
- package/lib/quoxon/onboarding/view.js +625 -0
- package/lib/quoxon/print.js +94 -0
- package/lib/quoxon/qart.js +379 -0
- package/lib/quoxon/qglyph.js +143 -0
- package/lib/quoxon/qhello.js +58 -0
- package/lib/quoxon/qmotion.js +111 -0
- package/lib/quoxon/render.js +648 -0
- package/lib/quoxon/roster.js +221 -0
- package/lib/quoxon/route.js +38 -0
- package/lib/quoxon/rules.js +130 -0
- package/lib/quoxon/session.js +68 -0
- package/lib/quoxon/skills.js +30 -0
- package/lib/quoxon/slash/compact.js +90 -0
- package/lib/quoxon/slash/ledger.js +83 -0
- package/lib/quoxon/slash/listView.js +28 -0
- package/lib/quoxon/slash/palette.js +104 -0
- package/lib/quoxon/slash/paletteController.js +59 -0
- package/lib/quoxon/slash/panels.js +101 -0
- package/lib/quoxon/slash/picker.js +38 -0
- package/lib/quoxon/slash/restart.js +144 -0
- package/lib/quoxon/slash/resume.js +59 -0
- package/lib/quoxon/slash/settings.js +50 -0
- package/lib/quoxon/sound/index.js +186 -0
- package/lib/quoxon/sound/mapping.js +119 -0
- package/lib/quoxon/sound/output.js +52 -0
- package/lib/quoxon/sound/synth.js +122 -0
- package/lib/quoxon/term.js +106 -0
- package/lib/quoxon/textBuffer.js +242 -0
- package/lib/quoxon/theme.js +253 -0
- package/lib/quoxon/transcript.js +150 -0
- package/lib/quoxon/web/qface.js +81 -0
- package/lib/quoxon/welcome.js +52 -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/InboxView.jsx +228 -0
- package/lib/tui/views/LucidDeck.jsx +727 -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 +72 -4
package/LICENSE
ADDED
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
QUOX COMMUNITY SOURCE LICENCE 1.0
|
|
2
|
+
Effective: 12 October 2026
|
|
3
|
+
Copyright (c) 2025-2026 Quox LTD. All rights reserved.
|
|
4
|
+
|
|
5
|
+
THIS IS A SOURCE-AVAILABLE PROPRIETARY LICENCE. IT IS NOT AN OPEN-SOURCE LICENCE.
|
|
6
|
+
|
|
7
|
+
1. Scope and ownership. "Licensor" is Quox LTD ("Quox"). "You" is a person or legal entity exercising the licence. "Licensed Software" means Quox-owned source code, executables, user interface, and accompanying documentation expressly distributed with this licence. It excludes third-party components governed by their own notices, and separately licensed Quox products such as Apache-2.0 protocols and MIT SDKs. Quox retains all rights not expressly granted.
|
|
8
|
+
|
|
9
|
+
2. Free self-hosting and inspection. Subject to compliance, Quox grants You a worldwide, royalty-free, non-exclusive, non-transferable, non-sublicensable licence to acquire official Quox distributions, view and inspect their source, build unmodified software as required for deployment, and install and run any number of unmodified instances for Your own personal, educational, non-profit, or commercial operations. There are no licence fees or limits on seats, installations, servers, business revenue or duration for compliant use. You may make copies reasonably needed for installation, development and test environments, backups, disaster recovery, upgrades and migration, including on infrastructure You rent or control. A version lawfully acquired under this licence may be used indefinitely unless Your licence for that version validly terminates for breach under Section 11.
|
|
10
|
+
|
|
11
|
+
3. Independent extensions. You may create, use, modify, publish, distribute, license, and sell independent plugins, agents, skills, workflows, automations, themes, integrations, connectors, applications and other extensions through documented Quox APIs, plugin systems and extension points. Quox does not gain ownership of those independent works by their use with Quox. Their creators choose their licences, subject to any third-party components and any separately accepted marketplace terms. An extension must not contain or distribute Quox-owned protected core code absent separate permission. Selling Your own outputs, services or products made USING Quox is permitted; selling access to Quox itself as a platform is addressed in Section 6.
|
|
12
|
+
|
|
13
|
+
4. Protected core. Unless expressly allowed by this licence or non-waivable law, You must not edit, patch, modify or create derivative distributions of Quox-owned core source or binaries, replace or bypass core security/governance/licence controls, or distribute unofficial altered builds. Documented configuration, deployment settings, ordinary build output of unmodified source, dependency installation, troubleshooting, logging, source inspection, independent interoperability and supported plugins are permitted. This section does not attempt to forbid lawful observation, testing, security research or mandatory statutory rights.
|
|
14
|
+
|
|
15
|
+
5. Distribution and repackaging. You must not sublicense, mirror, redistribute, rent, sell, OEM-bundle, repackage, commercially distribute or present protected Quox software (or a substantial portion) as a product without written permission. Copies reasonably necessary for Your permitted deployment, internal company operations and backups are allowed. GitHub forks/copies permitted by GitHub's own platform terms remain permitted on that service, but grant no independent right to alter core or distribute it commercially. Independently authored installers, scripts or deployment manifests may reference official Quox downloads without bundling the Licensed Software. Do not represent unofficial software as an official Quox release.
|
|
16
|
+
|
|
17
|
+
6. Hosting, managed services, and white label. You may not supply third parties with Quox platform functions as a hosted, managed, multi-customer, white-labelled, OEM or platform-as-a-service offering, or operate multiple customer Quox instances as Your branded commercial service, without a separate agreement. This does not prohibit operating Quox for Your own organisation, using generic cloud hosting, selling Your own business services or their outputs, or paying a contractor to install or maintain YOUR directly licensed official Quox instance as Your agent. A contractor must not present Quox as its own hosted product. Commercial hosted-service and white-label terms are available from Quox separately.
|
|
18
|
+
|
|
19
|
+
7. Branding and attribution. The official Quox name, logo, copyright notices and existing attribution in product-owned interfaces and command-line presentation must remain visible and unaltered, except under a separate written white-label agreement. You may add branding for Your own organisations, tenants, plugins, reports, documents and content via supported configuration without obscuring Quox product identity. No Quox trade mark ownership, registration rights, or general trade mark licence is granted. Accurate descriptive references and legally permitted use are unaffected.
|
|
20
|
+
|
|
21
|
+
8. Commercial exceptions. Quox may separately license core changes, redistributions, OEM integrations, managed hosting, white labels, support and commercial features. No such agreement is required for compliant free self-hosting or the development and sale of genuinely independent extensions. A commercial agreement must expressly state its granted rights.
|
|
22
|
+
|
|
23
|
+
9. Third-party and statutory rights. Third-party and open-source notices govern their respective components; nothing here claims to relicense them. Nothing restricts independent interoperable software solely for communicating through Quox interfaces. Nothing excludes rights which applicable law makes non-waivable, including software backups, lawful observation and testing, interoperability and applicable consumer or security-research rights. Any conflicting restriction is limited to the extent required by law.
|
|
24
|
+
|
|
25
|
+
10. No mandatory account or telemetry. This licence does not require paid activation, compulsory telemetry or a Quox-hosted account to run the free self-hosted software. You retain rights in Your data, configurations, and independent extensions. Optional online services or marketplaces may have additional separately disclosed terms.
|
|
26
|
+
|
|
27
|
+
11. Breach, cure and termination. Rights depend on compliance. For a curable material breach, Quox will ordinarily provide written notice describing it and thirty (30) days to cure before termination. Deliberate, continuing misappropriation, misleading commercial distribution or unlawful circumvention may justify immediate protective action as allowed by law. Upon valid termination, cease unlicensed use/distribution of protected Quox-owned software. Termination does not transfer ownership of Your extensions or data or revoke third-party open-source rights.
|
|
28
|
+
|
|
29
|
+
12. Warranty and liability. TO THE MAXIMUM EXTENT PERMITTED BY LAW, LICENSED SOFTWARE IS PROVIDED "AS IS", WITHOUT EXPRESS OR IMPLIED WARRANTIES, INCLUDING MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, AND NON-INFRINGEMENT. QUOX EXCLUDES LIABILITY FOR INDIRECT, SPECIAL, INCIDENTAL, CONSEQUENTIAL AND PUNITIVE DAMAGES TO THE EXTENT LAWFUL. NOTHING EXCLUDES LIABILITY WHICH CANNOT BE EXCLUDED BY LAW, INCLUDING FRAUD OR DEATH OR PERSONAL INJURY CAUSED BY NEGLIGENCE WHERE APPLICABLE.
|
|
30
|
+
|
|
31
|
+
13. Law and versions. This licence is governed by the law of England and Wales, subject to mandatory protections in Your jurisdiction. Courts of England and Wales have jurisdiction where legally permitted. Quox may offer NEW versions under revised terms. Publishing new terms does not retroactively withdraw grants validly received for earlier versions. Separately signed agreements and applicable third-party licences govern where they apply.
|
|
32
|
+
|
|
33
|
+
14. Contact. For white-label, managed-hosting, OEM, redistribution or other permissions: contact@quox.ai.
|
|
34
|
+
|
|
35
|
+
Copyright (c) 2025-2026 Quox LTD. All rights reserved.
|
package/README.md
CHANGED
|
@@ -1,3 +1,143 @@
|
|
|
1
|
-
#
|
|
1
|
+
# Quox
|
|
2
2
|
|
|
3
|
-
|
|
3
|
+
The conversational front door to your self-hosted AI agent control plane. The `quoxcli` package gives you the `quox` command: a conversational terminal and a command line for QuoxCORE.
|
|
4
|
+
|
|
5
|
+
It is a client. It does not include the server.
|
|
6
|
+
|
|
7
|
+
## Install
|
|
8
|
+
|
|
9
|
+
```sh
|
|
10
|
+
npm install -g quoxcli
|
|
11
|
+
```
|
|
12
|
+
|
|
13
|
+
Needs Node.js 20 or later. This installs two commands: `quox`, and `quoxon` (an alias that opens the conversation).
|
|
14
|
+
|
|
15
|
+
## Prerequisite: a running QuoxCORE
|
|
16
|
+
|
|
17
|
+
You need a QuoxCORE instance to talk to. Install one on a machine you control: see https://github.com/quoxai/quoxcore, or run:
|
|
18
|
+
|
|
19
|
+
```sh
|
|
20
|
+
curl -fsSL https://get.quox.ai | sh
|
|
21
|
+
```
|
|
22
|
+
|
|
23
|
+
A built-in `quox server install` is coming. It does not exist yet.
|
|
24
|
+
|
|
25
|
+
## Sign in
|
|
26
|
+
|
|
27
|
+
```sh
|
|
28
|
+
quox login
|
|
29
|
+
```
|
|
30
|
+
|
|
31
|
+
You will be asked for the address of your QuoxCORE and your credentials. Use `-p <name>` to keep several profiles (for example a dev box and a production box):
|
|
32
|
+
|
|
33
|
+
```sh
|
|
34
|
+
quox login -p work
|
|
35
|
+
quox -p work whoami
|
|
36
|
+
quox -p work
|
|
37
|
+
```
|
|
38
|
+
|
|
39
|
+
If you do not pass `-p`, Quox picks your human profile automatically. It never falls back to an ambient service key from your environment unless you pass `--service-key`.
|
|
40
|
+
|
|
41
|
+
## Talk
|
|
42
|
+
|
|
43
|
+
```sh
|
|
44
|
+
quox
|
|
45
|
+
```
|
|
46
|
+
|
|
47
|
+
Bare `quox` opens the conversation. `quoxon` is an alias for the same thing. The older menu is still there as `quox tui`.
|
|
48
|
+
|
|
49
|
+
Type what you want. Quox routes it to the right agent and shows what it is doing, including any tool that is held for your approval.
|
|
50
|
+
|
|
51
|
+
| Key | What it does |
|
|
52
|
+
|-----|--------------|
|
|
53
|
+
| Enter | Send. While Quox is working, steer the running turn. |
|
|
54
|
+
| Tab | Queue the message to send after the current turn. |
|
|
55
|
+
| Esc | Stop the turn. Quox waits for the server to confirm it stopped. |
|
|
56
|
+
| Ctrl+C | Press twice to quit. |
|
|
57
|
+
| Ctrl+J | New line in the draft. |
|
|
58
|
+
| Ctrl+G | Edit the draft in your editor. |
|
|
59
|
+
| `/help` | List every key and command. |
|
|
60
|
+
|
|
61
|
+
`quox --demo` runs a simulated session with no server, so you can look around first. Nothing real runs.
|
|
62
|
+
|
|
63
|
+
### Approvals
|
|
64
|
+
|
|
65
|
+
When a tool is held for your approval, act on it with an empty draft, or press Tab. Approvals are never a single key while you are typing, so a stray keystroke cannot approve anything. `/approvals` lists what is waiting.
|
|
66
|
+
|
|
67
|
+
### Project rules: QUOX.md
|
|
68
|
+
|
|
69
|
+
Put a `QUOX.md` in your project and Quox follows it. It is read from the current directory up to the git root, plus `~/.quox/QUOX.md` for rules that apply everywhere. Rules are capped at 5500 characters in total.
|
|
70
|
+
|
|
71
|
+
| Command | What it does |
|
|
72
|
+
|---------|--------------|
|
|
73
|
+
| `/rules` | Show which rules are loaded |
|
|
74
|
+
| `/rules off` | Turn rules off for this session |
|
|
75
|
+
|
|
76
|
+
### Skills
|
|
77
|
+
|
|
78
|
+
`/skills` lists the governed skills available to you. `/skill <name>` runs one.
|
|
79
|
+
|
|
80
|
+
### Running work
|
|
81
|
+
|
|
82
|
+
Workflows and loops that are running appear in a roster under the status line. `/roster` shows it in full, and `/observers` shows what is watching.
|
|
83
|
+
|
|
84
|
+
## Headless
|
|
85
|
+
|
|
86
|
+
```sh
|
|
87
|
+
quox --print "summarise what happened on the fleet today"
|
|
88
|
+
echo "check the approvals queue" | quox --print
|
|
89
|
+
quox --print "list my agents" --output json
|
|
90
|
+
```
|
|
91
|
+
|
|
92
|
+
`--output json` writes one event per line. Other flags: `--conversation <id>`, `--turn-id <id>`, `--timeout <seconds>`.
|
|
93
|
+
|
|
94
|
+
| Exit code | Meaning |
|
|
95
|
+
|-----------|---------|
|
|
96
|
+
| 0 | Completed |
|
|
97
|
+
| 1 | Error |
|
|
98
|
+
| 2 | Held for approval |
|
|
99
|
+
| 3 | Interrupted |
|
|
100
|
+
| 4 | Not signed in, or identity problem |
|
|
101
|
+
| 5 | Ended without confirmation |
|
|
102
|
+
|
|
103
|
+
## Everyday commands
|
|
104
|
+
|
|
105
|
+
Run `quox --help` for the full list, and `quox <command> --help` for each one.
|
|
106
|
+
|
|
107
|
+
| Command | What it does |
|
|
108
|
+
|---------|--------------|
|
|
109
|
+
| `quox login` / `logout` / `whoami` | Sign in, sign out, show who you are |
|
|
110
|
+
| `quox status` | Platform health overview |
|
|
111
|
+
| `quox doctor` | Run diagnostics on the CLI and the platform |
|
|
112
|
+
| `quox chat "<message>"` | Chat with CommanderQ or any agent |
|
|
113
|
+
| `quox agent` | Manage agents |
|
|
114
|
+
| `quox workflow` | Manage workflows |
|
|
115
|
+
| `quox fleet` | Fleet monitoring and management |
|
|
116
|
+
| `quox memory` | Manage memories |
|
|
117
|
+
| `quox approvals` | Tool approvals held for a human decision |
|
|
118
|
+
| `quox inbox` | Inbox and approval requests |
|
|
119
|
+
| `quox mail` | InboxQ: connected mail accounts and triaged messages |
|
|
120
|
+
| `quox calendar` | Calendar-Q: agenda and coverage |
|
|
121
|
+
| `quox governance` | Policies, the WARD chain and evidence |
|
|
122
|
+
| `quox config` | CLI configuration and profiles |
|
|
123
|
+
|
|
124
|
+
Global options include `--json`, `-p/--profile`, `--org`, `--dry-run`, `-y/--yes` and `--debug`.
|
|
125
|
+
|
|
126
|
+
## Troubleshooting
|
|
127
|
+
|
|
128
|
+
**Self-signed certificate (`fetch failed`).** If your QuoxCORE uses its own certificate authority, point Node at the certificate. Do not turn TLS checking off.
|
|
129
|
+
|
|
130
|
+
```sh
|
|
131
|
+
export NODE_EXTRA_CA_CERTS=/path/to/your-ca.pem
|
|
132
|
+
```
|
|
133
|
+
|
|
134
|
+
**"Not signed in" or exit code 4.** Run `quox login` again, with the same `-p` profile you used before. Check with `quox whoami`.
|
|
135
|
+
|
|
136
|
+
**Slow or no response.** Run `quox status` and `quox doctor` to see whether the server is reachable and healthy. Add `--debug` to see the HTTP calls. In headless mode, set `--timeout`.
|
|
137
|
+
|
|
138
|
+
## Licence
|
|
139
|
+
|
|
140
|
+
Quox Community Source Licence 1.0. This is source-available software, not open source. You may self-host and inspect it freely; redistribution and repackaging are restricted. Read the full text in the `LICENSE` file or at https://github.com/quoxai/quoxcore.
|
|
141
|
+
|
|
142
|
+
Website: https://quox.ai
|
|
143
|
+
CLI home: https://cli.quox.ai
|
package/bin/quox.js
ADDED
|
@@ -0,0 +1,292 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
import '../lib/core/prodEnv.js'; // first: production React unless NODE_ENV is set (before anything loads React)
|
|
3
|
+
|
|
4
|
+
import { Command } from 'commander';
|
|
5
|
+
import { loadConfig, resolveProfileFlagFromArgv } from '../lib/core/config.js';
|
|
6
|
+
import { resolveCliVersion, BASE_VERSION } from '../lib/core/version.js';
|
|
7
|
+
import { mergeShadowedGlobals } from '../lib/core/global-flags.js';
|
|
8
|
+
import { createAuth } from '../lib/core/auth.js';
|
|
9
|
+
import { extractActingAs } from '../lib/core/actingAs.js';
|
|
10
|
+
import { createClient } from '../lib/core/client.js';
|
|
11
|
+
import { handleError } from '../lib/core/errors.js';
|
|
12
|
+
import { assertOrgOverrideSafe, commandPath } from '../lib/core/org-override.js';
|
|
13
|
+
// QUOXIFY pass 2 (DEVSUITE phase 15): the two dev-suite members that had no
|
|
14
|
+
// unified verb at all. Gripe's own definition of done named `quox gripe`.
|
|
15
|
+
import { generateCompletion } from '../lib/core/completions.js';
|
|
16
|
+
import { loadAllPlugins } from '../lib/plugins/loader.js';
|
|
17
|
+
import { registerCommandGroups } from '../lib/core/lazyCommands.js';
|
|
18
|
+
import v8 from 'node:v8';
|
|
19
|
+
|
|
20
|
+
// CORTEX-BENCH: Node's fetch parses HTTP with a WebAssembly module, and V8
|
|
21
|
+
// recompiles it at the optimising tier on a background thread; Node waits for
|
|
22
|
+
// that compile before exiting, adding 350-700ms to every short command after
|
|
23
|
+
// its output is already printed. The baseline tier is plenty for a CLI.
|
|
24
|
+
v8.setFlagsFromString('--liftoff-only');
|
|
25
|
+
|
|
26
|
+
// Bare `quox` is the conversation (CLI-QUOXON Q3, owner decision): with no
|
|
27
|
+
// subcommand and only client flags, a TTY gets the QUOXON client and
|
|
28
|
+
// `--print` runs headless. The old 15-item menu is `quox tui`. Decided from
|
|
29
|
+
// argv alone, before config or any command module loads.
|
|
30
|
+
{
|
|
31
|
+
const { routesToQuoxon } = await import('../lib/quoxon/route.js');
|
|
32
|
+
const qArgv = process.argv.slice(2);
|
|
33
|
+
if (routesToQuoxon(qArgv, process.stdout.isTTY)) {
|
|
34
|
+
const { main: quoxonMain } = await import('../lib/quoxon/main.js');
|
|
35
|
+
try {
|
|
36
|
+
await quoxonMain(qArgv);
|
|
37
|
+
} catch (err) {
|
|
38
|
+
console.error(err?.message || err);
|
|
39
|
+
process.exitCode = 1;
|
|
40
|
+
}
|
|
41
|
+
process.exit(process.exitCode || 0);
|
|
42
|
+
}
|
|
43
|
+
}
|
|
44
|
+
|
|
45
|
+
// #610: --version must reflect the ACTUAL running commit, not a frozen literal
|
|
46
|
+
// (the global CLI worktree was silently 32 commits behind and --version never
|
|
47
|
+
// showed it). The git-backed resolution lives in ../lib/core/version.js, shared
|
|
48
|
+
// with `quox doctor` so the two never disagree. Resolving the commit needs a
|
|
49
|
+
// git read, so only pay that cost when --version/-V is actually requested —
|
|
50
|
+
// every other command stays zero-cost by keeping the argv guard HERE (the
|
|
51
|
+
// shared resolver has none, because doctor wants the facts unconditionally).
|
|
52
|
+
const versionRequested = process.argv.includes('--version') || process.argv.includes('-V');
|
|
53
|
+
|
|
54
|
+
const program = new Command();
|
|
55
|
+
|
|
56
|
+
program
|
|
57
|
+
.name('quox')
|
|
58
|
+
.description('QuoxCORE CLI — manage agents, workflows, memory, fleet, and more')
|
|
59
|
+
.version(versionRequested ? resolveCliVersion() : BASE_VERSION)
|
|
60
|
+
.option('-o, --output <format>', 'output format: table, json, csv, quiet', 'table')
|
|
61
|
+
.option('--json', 'shorthand for --output json')
|
|
62
|
+
.option('-q, --quiet', 'suppress output, show IDs only')
|
|
63
|
+
.option('--org <slug>', 'override active organization')
|
|
64
|
+
.option('-p, --profile <name>', 'use a specific config profile')
|
|
65
|
+
.option('--no-color', 'disable colored output')
|
|
66
|
+
.option('-v, --verbose', 'show detailed output')
|
|
67
|
+
.option('--debug', 'show HTTP request/response details')
|
|
68
|
+
.option('--dry-run', 'show what would happen without executing')
|
|
69
|
+
.option('-y, --yes', 'skip confirmation prompts')
|
|
70
|
+
.option('--insecure', 'allow self-signed SSL certificates')
|
|
71
|
+
.addHelpText('after', '\nConversation (QUOXON client):\n quox interactive conversation (terminal only)\n quox --print "<prompt>" [--output text|json] [--conversation <id>] [--timeout <s>] one headless turn; exit 0 completed, 2 held for approval, 3 interrupted, 4 not signed in, 5 unconfirmed\n quox --demo simulated journey, nothing real runs\n');
|
|
72
|
+
|
|
73
|
+
// Wire up global flags
|
|
74
|
+
program.hook('preAction', (thisCommand) => {
|
|
75
|
+
const opts = thisCommand.opts();
|
|
76
|
+
if (opts.json) opts.output = 'json';
|
|
77
|
+
if (opts.quiet) opts.output = 'quiet';
|
|
78
|
+
});
|
|
79
|
+
|
|
80
|
+
// A subcommand that redeclares a root flag (--yes, --org, --json, --dry-run)
|
|
81
|
+
// never receives it: commander resolves against the root first and the
|
|
82
|
+
// subcommand reads undefined forever. See lib/core/global-flags.js for the
|
|
83
|
+
// 13 places this had already shipped, including --dry-run executing for real.
|
|
84
|
+
program.hook('preAction', (thisCommand, actionCommand) => {
|
|
85
|
+
mergeShadowedGlobals(thisCommand, actionCommand);
|
|
86
|
+
});
|
|
87
|
+
|
|
88
|
+
// GRIPE-709: --org must be honoured or refused, never silently ignored.
|
|
89
|
+
program.hook('preAction', (thisCommand, actionCommand) => {
|
|
90
|
+
assertOrgOverrideSafe({
|
|
91
|
+
override: thisCommand.opts().org,
|
|
92
|
+
authData: config.getAuth?.() || null,
|
|
93
|
+
hasUserToken: Boolean(auth.getTokens?.()?.access_token),
|
|
94
|
+
command: commandPath(actionCommand),
|
|
95
|
+
});
|
|
96
|
+
});
|
|
97
|
+
|
|
98
|
+
// Handle --insecure and --no-color before anything runs
|
|
99
|
+
// QUOX_INSECURE=1 is the env twin of --insecure: dev-server wrappers set it
|
|
100
|
+
// because the LAN dashboard proxy serves a self-signed cert and requiring
|
|
101
|
+
// --insecure on every verb is a papercut (DEVSUITE phase 8). Same warning,
|
|
102
|
+
// same mechanism, so it is never silent.
|
|
103
|
+
if (process.argv.includes('--insecure') || process.env.QUOX_INSECURE === '1') {
|
|
104
|
+
process.env.NODE_TLS_REJECT_UNAUTHORIZED = '0';
|
|
105
|
+
console.error('\x1b[33mWARNING: TLS certificate verification disabled (--insecure)\x1b[0m');
|
|
106
|
+
}
|
|
107
|
+
if (process.argv.includes('--no-color') || process.env.NO_COLOR) {
|
|
108
|
+
process.env.FORCE_COLOR = '0';
|
|
109
|
+
}
|
|
110
|
+
|
|
111
|
+
// Build shared context
|
|
112
|
+
// program.opts() is EMPTY here (parse() runs later) — the -p flag must come
|
|
113
|
+
// from the argv pre-scan or it silently falls back to activeProfile.
|
|
114
|
+
// quox#772: fold a global `--as <agent>` into QUOX_AS (flag wins) and strip it
|
|
115
|
+
// from argv before commander sees it (linkedin/claude own their own --as).
|
|
116
|
+
{
|
|
117
|
+
const acting = extractActingAs(process.argv.slice(2), process.env);
|
|
118
|
+
if (acting.name) {
|
|
119
|
+
// flag vs env matters to `whoami` only: record the origin (flag wins).
|
|
120
|
+
const fromFlag = extractActingAs(process.argv.slice(2), {}).name;
|
|
121
|
+
process.env.QUOX_AS = acting.name;
|
|
122
|
+
process.env.QUOX_AS_FLAG = fromFlag ? '1' : '0';
|
|
123
|
+
}
|
|
124
|
+
process.argv = [...process.argv.slice(0, 2), ...acting.argv];
|
|
125
|
+
}
|
|
126
|
+
const config = loadConfig(resolveProfileFlagFromArgv(process.argv.slice(2)));
|
|
127
|
+
const auth = createAuth(config);
|
|
128
|
+
const client = createClient(config, auth);
|
|
129
|
+
const ctx = { config, auth, client, program };
|
|
130
|
+
|
|
131
|
+
// Register all command groups
|
|
132
|
+
// Command groups, in registration order. CORTEX-BENCH (quox#7xx CLI startup):
|
|
133
|
+
// importing all 86 modules cost ~1s on EVERY invocation, including each
|
|
134
|
+
// attached-agent `quox agent exec` tool call. They now load lazily: only the
|
|
135
|
+
// module(s) that define the command being run (see lib/core/lazyCommands.js),
|
|
136
|
+
// with a full load whenever the command is unknown, help is asked for, or the
|
|
137
|
+
// lazy path fails. A miss can only be slower, never wrong.
|
|
138
|
+
const COMMAND_REGISTRARS = [
|
|
139
|
+
['../lib/commands/auth.js', 'registerAuthCommands'],
|
|
140
|
+
['../lib/commands/service.js', 'registerServiceCommands'],
|
|
141
|
+
['../lib/commands/status.js', 'registerStatusCommand'],
|
|
142
|
+
['../lib/commands/doctor.js', 'registerDoctorCommand'],
|
|
143
|
+
['../lib/commands/open.js', 'registerOpenCommand'],
|
|
144
|
+
['../lib/commands/motion.js', 'registerMotionCommand'],
|
|
145
|
+
['../lib/commands/config-cmd.js', 'registerConfigCommands'],
|
|
146
|
+
['../lib/commands/org.js', 'registerOrgCommands'],
|
|
147
|
+
['../lib/commands/invites.js', 'registerInvitesCommands'],
|
|
148
|
+
['../lib/commands/team.js', 'registerTeamCommands'],
|
|
149
|
+
['../lib/commands/department.js', 'registerDepartmentCommands'],
|
|
150
|
+
['../lib/commands/agent.js', 'registerAgentCommands'],
|
|
151
|
+
['../lib/commands/tool.js', 'registerToolCommands'],
|
|
152
|
+
['../lib/commands/workflow.js', 'registerWorkflowCommands'],
|
|
153
|
+
['../lib/commands/objective.js', 'registerObjectiveCommands'],
|
|
154
|
+
['../lib/commands/assistant.js', 'registerAssistantCommands'],
|
|
155
|
+
['../lib/commands/fleet.js', 'registerFleetCommands'],
|
|
156
|
+
['../lib/commands/chat.js', 'registerChatCommands'],
|
|
157
|
+
['../lib/commands/memory.js', 'registerMemoryCommands'],
|
|
158
|
+
['../lib/commands/brain.js', 'registerBrainCommands'],
|
|
159
|
+
['../lib/commands/entity.js', 'registerEntityCommands'],
|
|
160
|
+
['../lib/commands/backup.js', 'registerBackupCommands'],
|
|
161
|
+
['../lib/commands/inbox.js', 'registerInboxCommands'],
|
|
162
|
+
['../lib/commands/approvals.js', 'registerApprovalsCommands'],
|
|
163
|
+
['../lib/commands/mail.js', 'registerMailCommands'],
|
|
164
|
+
['../lib/commands/calendar.js', 'registerCalendarCommands'],
|
|
165
|
+
['../lib/commands/notes.js', 'registerNotesCommands'],
|
|
166
|
+
['../lib/commands/contacts.js', 'registerContactsCommands'],
|
|
167
|
+
['../lib/commands/licence.js', 'registerLicenceCommands'],
|
|
168
|
+
['../lib/commands/run.js', 'registerRunCommands'],
|
|
169
|
+
['../lib/commands/file.js', 'registerFileCommands'],
|
|
170
|
+
['../lib/commands/admin.js', 'registerAdminCommands'],
|
|
171
|
+
['../lib/commands/aee.js', 'registerAeeCommands'],
|
|
172
|
+
['../lib/commands/integration.js', 'registerIntegrationCommands'],
|
|
173
|
+
['../lib/commands/consent.js', 'registerConsentCommands'],
|
|
174
|
+
['../lib/commands/setup.js', 'registerSetupCommands'],
|
|
175
|
+
['../lib/commands/watch.js', 'registerWatchCommands'],
|
|
176
|
+
['../lib/commands/tag.js', 'registerTagCommands'],
|
|
177
|
+
['../lib/commands/scope.js', 'registerScopeCommands'],
|
|
178
|
+
['../lib/commands/notification.js', 'registerNotificationCommands'],
|
|
179
|
+
['../lib/commands/prompt.js', 'registerPromptCommands'],
|
|
180
|
+
['../lib/commands/plugin.js', 'registerPluginCommands'],
|
|
181
|
+
['../lib/commands/powers.js', 'registerPowersCommands'],
|
|
182
|
+
['../lib/commands/conversation.js', 'registerConversationCommands'],
|
|
183
|
+
['../lib/commands/vault.js', 'registerVaultCommands'],
|
|
184
|
+
['../lib/commands/volt.js', 'registerVoltCommands'],
|
|
185
|
+
['../lib/commands/governance.js', 'registerGovernanceCommands'],
|
|
186
|
+
['../lib/commands/skills.js', 'registerSkillsCommands'],
|
|
187
|
+
['../lib/commands/claude.js', 'registerClaudeCommands'],
|
|
188
|
+
['../lib/commands/monitoring.js', 'registerMonitoringCommands'],
|
|
189
|
+
['../lib/commands/trigger.js', 'registerTriggerCommands'],
|
|
190
|
+
['../lib/commands/webhook.js', 'registerWebhookCommands'],
|
|
191
|
+
['../lib/commands/sso.js', 'registerSsoCommands'],
|
|
192
|
+
['../lib/commands/role.js', 'registerRoleCommands'],
|
|
193
|
+
['../lib/commands/domain.js', 'registerDomainCommands'],
|
|
194
|
+
['../lib/commands/security.js', 'registerSecurityCommands'],
|
|
195
|
+
['../lib/commands/safety.js', 'registerSafetyCommands'],
|
|
196
|
+
['../lib/commands/scim.js', 'registerScimCommands'],
|
|
197
|
+
['../lib/commands/llm-policy.js', 'registerLlmPolicyCommands'],
|
|
198
|
+
['../lib/commands/hat.js', 'registerHatCommands'],
|
|
199
|
+
['../lib/commands/settings.js', 'registerSettingsCommands'],
|
|
200
|
+
['../lib/commands/llm.js', 'registerLlmCommands'],
|
|
201
|
+
['../lib/commands/capabilities.js', 'registerCapabilitiesCommands'],
|
|
202
|
+
['../lib/commands/quoxchat.js', 'registerQuoxchatCommands'],
|
|
203
|
+
['../lib/commands/budget.js', 'registerBudgetCommands'],
|
|
204
|
+
['../lib/commands/trace.js', 'registerTraceCommands'],
|
|
205
|
+
['../lib/commands/mon.js', 'registerMonCommands'],
|
|
206
|
+
['../lib/commands/quoxbox.js', 'registerQuoxboxCommands'],
|
|
207
|
+
['../lib/commands/plan.js', 'registerPlanCommands'],
|
|
208
|
+
['../lib/commands/engagement.js', 'registerEngagementCommands'],
|
|
209
|
+
['../lib/commands/done.js', 'registerDoneCommands'],
|
|
210
|
+
['../lib/commands/discord.js', 'registerDiscordCommands'],
|
|
211
|
+
['../lib/commands/qlarity.js', 'registerQlarityCommands'],
|
|
212
|
+
['../lib/commands/reach.js', 'registerReachCommands'],
|
|
213
|
+
['../lib/commands/inventory.js', 'registerInventoryCommands'],
|
|
214
|
+
['../lib/commands/policy.js', 'registerPolicyCommands'],
|
|
215
|
+
['../lib/commands/quoxseo.js', 'registerQuoxseoCommands'],
|
|
216
|
+
['../lib/commands/voice.js', 'registerVoiceCommands'],
|
|
217
|
+
['../lib/commands/awareness.js', 'registerAwarenessCommands'],
|
|
218
|
+
['../lib/commands/lucid.js', 'registerLucidCommands'],
|
|
219
|
+
['../lib/commands/tg.js', 'registerTgCommands'],
|
|
220
|
+
['../lib/commands/dev.js', 'registerDevCommands'],
|
|
221
|
+
['../lib/commands/build.js', 'registerBuildCommands'],
|
|
222
|
+
['../lib/commands/slot.js', 'registerSlotCommands'],
|
|
223
|
+
['../lib/commands/gripe.js', 'registerGripeCommands'],
|
|
224
|
+
['../lib/commands/nucleus.js', 'registerNucleusCommands'],
|
|
225
|
+
['../lib/commands/onboard.js', 'registerOnboardCommands'],
|
|
226
|
+
['../lib/commands/x.js', 'registerXCommands'],
|
|
227
|
+
['../lib/commands/linkedin.js', 'registerLinkedInCommands'],
|
|
228
|
+
['../lib/commands/facebook.js', 'registerFacebookCommands'],
|
|
229
|
+
['../lib/commands/instagram.js', 'registerInstagramCommands'],
|
|
230
|
+
['../lib/commands/tiktok.js', 'registerTikTokCommands'],
|
|
231
|
+
];
|
|
232
|
+
await registerCommandGroups(program, ctx, COMMAND_REGISTRARS, process.argv.slice(2), import.meta.url);
|
|
233
|
+
|
|
234
|
+
// TUI command
|
|
235
|
+
program
|
|
236
|
+
.command('tui')
|
|
237
|
+
.argument('[screen]', 'Open directly on a screen (fleet, agents, tools, orgs, memory, brain, workflows, chat, admin, files, backups, objectives, inbox, vault, governance, health)')
|
|
238
|
+
.option('--governed', 'Run the TUI in a Quox governed tmux session (survives sleep and drops)')
|
|
239
|
+
.option('--name <name>', 'Session name for --governed (reattaches if it is already running)')
|
|
240
|
+
.option('--no-tmux', 'With --governed: skip tmux')
|
|
241
|
+
.description('Launch the classic menu TUI (bare `quox` opens the conversation)')
|
|
242
|
+
.action(async (screen, opts) => {
|
|
243
|
+
if (opts && opts.governed) {
|
|
244
|
+
const { runTuiGoverned } = await import('../lib/commands/claude.js');
|
|
245
|
+
process.exitCode = runTuiGoverned({ screen, name: opts.name, noTmux: opts.tmux === false });
|
|
246
|
+
return;
|
|
247
|
+
}
|
|
248
|
+
const { launchTUI } = await import('../lib/tui/index.js');
|
|
249
|
+
await launchTUI(ctx, { initialScreen: screen });
|
|
250
|
+
});
|
|
251
|
+
|
|
252
|
+
// Shell completion command
|
|
253
|
+
program
|
|
254
|
+
.command('completion <shell>')
|
|
255
|
+
.description('Generate shell completions (bash, zsh, fish)')
|
|
256
|
+
.action((shell) => {
|
|
257
|
+
process.stdout.write(generateCompletion(shell));
|
|
258
|
+
});
|
|
259
|
+
|
|
260
|
+
// Load plugins (non-blocking — errors are logged, not thrown)
|
|
261
|
+
try {
|
|
262
|
+
const { loaded, errors } = await loadAllPlugins(program, ctx);
|
|
263
|
+
if (program.opts().debug && loaded.length > 0) {
|
|
264
|
+
console.error(`Loaded ${loaded.length} plugin(s): ${loaded.map(p => p.name).join(', ')}`);
|
|
265
|
+
}
|
|
266
|
+
if (errors.length > 0) {
|
|
267
|
+
for (const e of errors) {
|
|
268
|
+
console.error(`Plugin "${e.name}" failed: ${e.error}`);
|
|
269
|
+
}
|
|
270
|
+
}
|
|
271
|
+
} catch {
|
|
272
|
+
// Plugin loading should never crash the CLI
|
|
273
|
+
}
|
|
274
|
+
|
|
275
|
+
// Bare `quox` in a TTY never reaches here (routed to QUOXON above); bare
|
|
276
|
+
// non-TTY prints the banner so a script never hangs.
|
|
277
|
+
{
|
|
278
|
+
try {
|
|
279
|
+
if (process.argv.length <= 2) {
|
|
280
|
+
// Bare `quox`: the splash, not a help dump (DEVSUITE-GLYPH).
|
|
281
|
+
const { printBanner } = await import('../lib/core/banner.js');
|
|
282
|
+
let loggedIn = true;
|
|
283
|
+
try { loggedIn = !!auth.isLoggedIn(); } catch { /* banner must never fail */ }
|
|
284
|
+
printBanner(program.version(), { loggedIn });
|
|
285
|
+
process.exit(0);
|
|
286
|
+
}
|
|
287
|
+
await program.parseAsync(process.argv);
|
|
288
|
+
} catch (err) {
|
|
289
|
+
handleError(err, program.opts().output);
|
|
290
|
+
process.exit(err.exitCode || 1);
|
|
291
|
+
}
|
|
292
|
+
}
|
package/bin/quoxon.js
ADDED
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
import '../lib/core/prodEnv.js'; // first: production React unless NODE_ENV is set (before anything loads React)
|
|
3
|
+
import { main } from '../lib/quoxon/main.js';
|
|
4
|
+
|
|
5
|
+
main().catch((err) => {
|
|
6
|
+
console.error(err?.message || err);
|
|
7
|
+
process.exit(1);
|
|
8
|
+
});
|
|
@@ -0,0 +1,125 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* 'admin.*' endpoints — extracted from the former monolithic
|
|
3
|
+
* cli/lib/api/endpoints.js as part of the per-domain fragment split.
|
|
4
|
+
* See cli/lib/api/endpoints/index.js for aggregation + the fragment convention.
|
|
5
|
+
*/
|
|
6
|
+
|
|
7
|
+
export const admin = {
|
|
8
|
+
'admin.config.list': {
|
|
9
|
+
method: 'GET',
|
|
10
|
+
service: 'auth',
|
|
11
|
+
path: () => `/api/admin/config`,
|
|
12
|
+
tags: ['live-safe'],
|
|
13
|
+
},
|
|
14
|
+
'admin.agent_identity.mint': {
|
|
15
|
+
method: 'POST',
|
|
16
|
+
service: 'auth',
|
|
17
|
+
path: () => '/api/admin/agent-identities',
|
|
18
|
+
tags: ['admin-write'],
|
|
19
|
+
},
|
|
20
|
+
'admin.config.update': {
|
|
21
|
+
method: 'PATCH',
|
|
22
|
+
service: 'auth',
|
|
23
|
+
path: ({ key }) => `/api/admin/config/${key}`,
|
|
24
|
+
tags: ['live-write'],
|
|
25
|
+
},
|
|
26
|
+
// LICENSE-LAUNCH LL-6b — enforcement posture + break-glass. Served by
|
|
27
|
+
// services/auth/routes/setup.js; read is any authenticated user, both
|
|
28
|
+
// writes are instance-admin only.
|
|
29
|
+
'admin.enforcement.list': {
|
|
30
|
+
method: 'GET',
|
|
31
|
+
service: 'auth',
|
|
32
|
+
path: () => `/api/setup/enforcement`,
|
|
33
|
+
tags: ['live-safe'],
|
|
34
|
+
},
|
|
35
|
+
'admin.enforcement.break_glass.open': {
|
|
36
|
+
method: 'POST',
|
|
37
|
+
service: 'auth',
|
|
38
|
+
path: () => `/api/setup/enforcement/break-glass`,
|
|
39
|
+
tags: ['admin-write'],
|
|
40
|
+
},
|
|
41
|
+
'admin.enforcement.break_glass.clear': {
|
|
42
|
+
method: 'DELETE',
|
|
43
|
+
service: 'auth',
|
|
44
|
+
path: ({ flag }) => `/api/setup/enforcement/break-glass/${flag}`,
|
|
45
|
+
tags: ['admin-write'],
|
|
46
|
+
},
|
|
47
|
+
'admin.email.status': {
|
|
48
|
+
method: 'GET',
|
|
49
|
+
service: 'auth',
|
|
50
|
+
path: () => `/api/admin/email/status`,
|
|
51
|
+
tags: ['live-safe'],
|
|
52
|
+
},
|
|
53
|
+
'admin.email.smtp': {
|
|
54
|
+
method: 'PUT',
|
|
55
|
+
service: 'auth',
|
|
56
|
+
path: () => `/api/admin/email/smtp`,
|
|
57
|
+
tags: ['live-write'],
|
|
58
|
+
},
|
|
59
|
+
'admin.email.test': {
|
|
60
|
+
method: 'POST',
|
|
61
|
+
service: 'auth',
|
|
62
|
+
path: () => `/api/admin/email/test`,
|
|
63
|
+
tags: ['live-write'],
|
|
64
|
+
},
|
|
65
|
+
'admin.keys.create': {
|
|
66
|
+
method: 'POST',
|
|
67
|
+
service: 'auth',
|
|
68
|
+
path: () => `/api/admin/keys`,
|
|
69
|
+
tags: ['live-write'],
|
|
70
|
+
},
|
|
71
|
+
'admin.keys.delete': {
|
|
72
|
+
method: 'DELETE',
|
|
73
|
+
service: 'auth',
|
|
74
|
+
path: ({ keyId }) => `/api/admin/keys/${keyId}`,
|
|
75
|
+
tags: ['live-write'],
|
|
76
|
+
},
|
|
77
|
+
'admin.keys.list': {
|
|
78
|
+
method: 'GET',
|
|
79
|
+
service: 'auth',
|
|
80
|
+
path: () => `/api/admin/keys`,
|
|
81
|
+
tags: ['live-safe'],
|
|
82
|
+
},
|
|
83
|
+
'admin.keys.test': {
|
|
84
|
+
method: 'POST',
|
|
85
|
+
service: 'auth',
|
|
86
|
+
path: ({ keyId }) => `/api/admin/keys/${keyId}/test`,
|
|
87
|
+
tags: ['live-write'],
|
|
88
|
+
},
|
|
89
|
+
'admin.logs.list': {
|
|
90
|
+
method: 'GET',
|
|
91
|
+
service: 'auth',
|
|
92
|
+
path: () => `/api/admin/logs`,
|
|
93
|
+
tags: ['live-safe'],
|
|
94
|
+
},
|
|
95
|
+
'admin.retention.cleanup': {
|
|
96
|
+
method: 'POST',
|
|
97
|
+
service: 'auth',
|
|
98
|
+
path: () => `/api/admin/retention/cleanup`,
|
|
99
|
+
tags: ['live-write'],
|
|
100
|
+
},
|
|
101
|
+
'admin.retention.config.list': {
|
|
102
|
+
method: 'GET',
|
|
103
|
+
service: 'auth',
|
|
104
|
+
path: () => `/api/admin/retention/config`,
|
|
105
|
+
tags: ['live-safe'],
|
|
106
|
+
},
|
|
107
|
+
'admin.retention.stats.list': {
|
|
108
|
+
method: 'GET',
|
|
109
|
+
service: 'auth',
|
|
110
|
+
path: () => `/api/admin/retention/stats`,
|
|
111
|
+
tags: ['live-safe'],
|
|
112
|
+
},
|
|
113
|
+
'admin.services.list': {
|
|
114
|
+
method: 'GET',
|
|
115
|
+
service: 'auth',
|
|
116
|
+
path: () => `/api/admin/services`,
|
|
117
|
+
tags: ['live-safe'],
|
|
118
|
+
},
|
|
119
|
+
'admin.stats.list': {
|
|
120
|
+
method: 'GET',
|
|
121
|
+
service: 'auth',
|
|
122
|
+
path: () => `/api/admin/stats`,
|
|
123
|
+
tags: ['live-safe'],
|
|
124
|
+
},
|
|
125
|
+
};
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* 'aee.*' endpoints — extracted from the former monolithic
|
|
3
|
+
* cli/lib/api/endpoints.js as part of the per-domain fragment split.
|
|
4
|
+
* See cli/lib/api/endpoints/index.js for aggregation + the fragment convention.
|
|
5
|
+
*/
|
|
6
|
+
|
|
7
|
+
export const aee = {
|
|
8
|
+
'aee.conversations.list': {
|
|
9
|
+
method: 'GET',
|
|
10
|
+
service: 'collector',
|
|
11
|
+
path: () => `/aee/conversations`,
|
|
12
|
+
tags: ['live-safe'],
|
|
13
|
+
},
|
|
14
|
+
'aee.get': {
|
|
15
|
+
method: 'GET',
|
|
16
|
+
service: 'collector',
|
|
17
|
+
path: ({ id }) => `/aee/${id}`,
|
|
18
|
+
tags: ['live-safe'],
|
|
19
|
+
},
|
|
20
|
+
'aee.query.list': {
|
|
21
|
+
method: 'GET',
|
|
22
|
+
service: 'collector',
|
|
23
|
+
path: () => `/aee/query`,
|
|
24
|
+
tags: ['live-safe'],
|
|
25
|
+
},
|
|
26
|
+
'aee.stats.list': {
|
|
27
|
+
method: 'GET',
|
|
28
|
+
service: 'collector',
|
|
29
|
+
path: () => `/aee/stats`,
|
|
30
|
+
tags: ['live-safe'],
|
|
31
|
+
},
|
|
32
|
+
'aee.store': {
|
|
33
|
+
method: 'POST',
|
|
34
|
+
service: 'collector',
|
|
35
|
+
path: () => `/aee/store`,
|
|
36
|
+
tags: ['live-write'],
|
|
37
|
+
},
|
|
38
|
+
};
|