@nexus-cortex/cli 4.26.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/.cortex/agents/AGENT_PROFILE_GUIDE.md +307 -0
- package/.cortex/agents/README.md +268 -0
- package/.cortex/agents/a-frontend-landing-page-designer.md +41 -0
- package/.cortex/agents/autoresearch-agent.md +49 -0
- package/.cortex/agents/code-reviewer.md +63 -0
- package/.cortex/agents/context-research.md +26 -0
- package/.cortex/agents/doc-writer.md +92 -0
- package/.cortex/agents/explore.md +63 -0
- package/.cortex/agents/new-model-api-integrator-analyst.md +41 -0
- package/.cortex/agents/plan.md +109 -0
- package/.cortex/agents/pr-architecture-reviewer.md +77 -0
- package/.cortex/agents/pr-code-quality.md +78 -0
- package/.cortex/agents/pr-implementer.md +50 -0
- package/.cortex/agents/pr-security-auditor.md +62 -0
- package/.cortex/agents/pr-test-writer.md +67 -0
- package/.cortex/agents/refactor.md +118 -0
- package/.cortex/agents/test-writer.md +72 -0
- package/.cortex/agents/web-researcher.md +72 -0
- package/.cortex/bench/tasks/sample-tasks.json +20 -0
- package/.cortex/commands/compare.md +14 -0
- package/.cortex/commands/deps.md +16 -0
- package/.cortex/commands/diff.md +14 -0
- package/.cortex/commands/explain.md +16 -0
- package/.cortex/commands/find-bug.md +13 -0
- package/.cortex/commands/profile.md +15 -0
- package/.cortex/commands/review.md +18 -0
- package/.cortex/commands/search.md +16 -0
- package/.cortex/commands/test.md +15 -0
- package/.cortex/permissions.dev.json +20 -0
- package/.cortex/permissions.example.json +71 -0
- package/.cortex/permissions.prod.json +63 -0
- package/.cortex/permissions.test.json +19 -0
- package/.cortex/skills/autoresearch/SKILL.md +77 -0
- package/.cortex/skills/autoresearch/personas/README.md +45 -0
- package/.cortex/skills/autoresearch/personas/aggressive-refactor.md +25 -0
- package/.cortex/skills/autoresearch/personas/creative.md +29 -0
- package/.cortex/skills/autoresearch/personas/perf-hunter.md +27 -0
- package/.cortex/skills/autoresearch/personas/precise.md +23 -0
- package/.cortex/skills/autoresearch/personas/root-cause.md +26 -0
- package/.cortex/skills/autoresearch/personas/security-auditor.md +29 -0
- package/.cortex/skills/autoresearch/personas/skeptic-reviewer.md +31 -0
- package/.cortex/skills/autoresearch/personas/test-first.md +25 -0
- package/.cortex/skills/best-of-n/SKILL.md +76 -0
- package/.cortex/skills/cortex/SKILL.md +834 -0
- package/.cortex/skills/cortex-bench/SKILL.md +354 -0
- package/.cortex/skills/docx/SKILL.md +83 -0
- package/.cortex/skills/pdf-documents/SKILL.md +297 -0
- package/.cortex/skills/pdf-documents/sections/01-image-acquisition.md +132 -0
- package/.cortex/skills/pdf-documents/sections/02-ai-image-generation.md +274 -0
- package/.cortex/skills/pdf-documents/sections/03-paper-sizes.md +89 -0
- package/.cortex/skills/pdf-documents/sections/04-design-system.md +549 -0
- package/.cortex/skills/pdf-documents/sections/05-css-print-rules.md +135 -0
- package/.cortex/skills/pdf-documents/sections/06-svg-charts.md +100 -0
- package/.cortex/skills/pdf-documents/sections/07-templates.md +224 -0
- package/.cortex/skills/pdf-documents/sections/08-scaled-output.md +164 -0
- package/.cortex/skills/pdf-documents/sections/09-preview-qa.md +66 -0
- package/.cortex/skills/pdf-documents/sections/10-reading-pdfs.md +499 -0
- package/.cortex/skills/pdf-documents/sections/11-form-filling.md +241 -0
- package/.cortex/skills/pptx/SKILL.md +90 -0
- package/.cortex/skills/resume-analyst/SKILL.md +373 -0
- package/.cortex/skills/verify-work/SKILL.md +74 -0
- package/.cortex/skills/xlsx/SKILL.md +101 -0
- package/.cortex/system-messages/messages/WORK_QUALITY.md +159 -0
- package/.cortex/system-messages/registry.json +18 -0
- package/LICENSE +202 -0
- package/NOTICE +2 -0
- package/README.md +13 -0
- package/bin/cortex.js +548 -0
- package/dist/agent-mode.d.ts +21 -0
- package/dist/agent-mode.d.ts.map +1 -0
- package/dist/agent-mode.js +511 -0
- package/dist/agent-mode.js.map +1 -0
- package/dist/client/CortexClient.d.ts +84 -0
- package/dist/client/CortexClient.d.ts.map +1 -0
- package/dist/client/CortexClient.js +163 -0
- package/dist/client/CortexClient.js.map +1 -0
- package/dist/commands/artifact/list.d.ts +15 -0
- package/dist/commands/artifact/list.d.ts.map +1 -0
- package/dist/commands/artifact/list.js +89 -0
- package/dist/commands/artifact/list.js.map +1 -0
- package/dist/commands/artifact/restart.d.ts +13 -0
- package/dist/commands/artifact/restart.d.ts.map +1 -0
- package/dist/commands/artifact/restart.js +56 -0
- package/dist/commands/artifact/restart.js.map +1 -0
- package/dist/commands/artifact/status.d.ts +13 -0
- package/dist/commands/artifact/status.d.ts.map +1 -0
- package/dist/commands/artifact/status.js +100 -0
- package/dist/commands/artifact/status.js.map +1 -0
- package/dist/commands/artifact/stop.d.ts +13 -0
- package/dist/commands/artifact/stop.d.ts.map +1 -0
- package/dist/commands/artifact/stop.js +50 -0
- package/dist/commands/artifact/stop.js.map +1 -0
- package/dist/commands/autoresearch/bench.d.ts +32 -0
- package/dist/commands/autoresearch/bench.d.ts.map +1 -0
- package/dist/commands/autoresearch/bench.js +123 -0
- package/dist/commands/autoresearch/bench.js.map +1 -0
- package/dist/commands/autoresearch/commandRunner.d.ts +35 -0
- package/dist/commands/autoresearch/commandRunner.d.ts.map +1 -0
- package/dist/commands/autoresearch/commandRunner.js +91 -0
- package/dist/commands/autoresearch/commandRunner.js.map +1 -0
- package/dist/commands/autoresearch/evaluate.d.ts +18 -0
- package/dist/commands/autoresearch/evaluate.d.ts.map +1 -0
- package/dist/commands/autoresearch/evaluate.js +117 -0
- package/dist/commands/autoresearch/evaluate.js.map +1 -0
- package/dist/commands/autoresearch/experiment.d.ts +38 -0
- package/dist/commands/autoresearch/experiment.d.ts.map +1 -0
- package/dist/commands/autoresearch/experiment.js +168 -0
- package/dist/commands/autoresearch/experiment.js.map +1 -0
- package/dist/commands/autoresearch/fix.d.ts +10 -0
- package/dist/commands/autoresearch/fix.d.ts.map +1 -0
- package/dist/commands/autoresearch/fix.js +86 -0
- package/dist/commands/autoresearch/fix.js.map +1 -0
- package/dist/commands/autoresearch/harnessProcess.d.ts +48 -0
- package/dist/commands/autoresearch/harnessProcess.d.ts.map +1 -0
- package/dist/commands/autoresearch/harnessProcess.js +140 -0
- package/dist/commands/autoresearch/harnessProcess.js.map +1 -0
- package/dist/commands/autoresearch/list.d.ts +6 -0
- package/dist/commands/autoresearch/list.d.ts.map +1 -0
- package/dist/commands/autoresearch/list.js +38 -0
- package/dist/commands/autoresearch/list.js.map +1 -0
- package/dist/commands/autoresearch/loop.d.ts +26 -0
- package/dist/commands/autoresearch/loop.d.ts.map +1 -0
- package/dist/commands/autoresearch/loop.js +242 -0
- package/dist/commands/autoresearch/loop.js.map +1 -0
- package/dist/commands/cache/metrics.d.ts +13 -0
- package/dist/commands/cache/metrics.d.ts.map +1 -0
- package/dist/commands/cache/metrics.js +77 -0
- package/dist/commands/cache/metrics.js.map +1 -0
- package/dist/commands/chat/AgenticChat.d.ts +39 -0
- package/dist/commands/chat/AgenticChat.d.ts.map +1 -0
- package/dist/commands/chat/AgenticChat.js +201 -0
- package/dist/commands/chat/AgenticChat.js.map +1 -0
- package/dist/commands/chat/renderers/CodeRenderer.d.ts +36 -0
- package/dist/commands/chat/renderers/CodeRenderer.d.ts.map +1 -0
- package/dist/commands/chat/renderers/CodeRenderer.js +85 -0
- package/dist/commands/chat/renderers/CodeRenderer.js.map +1 -0
- package/dist/commands/chat/renderers/ToolRenderer.d.ts +30 -0
- package/dist/commands/chat/renderers/ToolRenderer.d.ts.map +1 -0
- package/dist/commands/chat/renderers/ToolRenderer.js +93 -0
- package/dist/commands/chat/renderers/ToolRenderer.js.map +1 -0
- package/dist/commands/chat/single-message.d.ts +15 -0
- package/dist/commands/chat/single-message.d.ts.map +1 -0
- package/dist/commands/chat/single-message.js +85 -0
- package/dist/commands/chat/single-message.js.map +1 -0
- package/dist/commands/config/categories.d.ts +8 -0
- package/dist/commands/config/categories.d.ts.map +1 -0
- package/dist/commands/config/categories.js +75 -0
- package/dist/commands/config/categories.js.map +1 -0
- package/dist/commands/config/category.d.ts +8 -0
- package/dist/commands/config/category.d.ts.map +1 -0
- package/dist/commands/config/category.js +81 -0
- package/dist/commands/config/category.js.map +1 -0
- package/dist/commands/config/get.d.ts +9 -0
- package/dist/commands/config/get.d.ts.map +1 -0
- package/dist/commands/config/get.js +98 -0
- package/dist/commands/config/get.js.map +1 -0
- package/dist/commands/config/reset.d.ts +6 -0
- package/dist/commands/config/reset.d.ts.map +1 -0
- package/dist/commands/config/reset.js +68 -0
- package/dist/commands/config/reset.js.map +1 -0
- package/dist/commands/config/set.d.ts +6 -0
- package/dist/commands/config/set.d.ts.map +1 -0
- package/dist/commands/config/set.js +60 -0
- package/dist/commands/config/set.js.map +1 -0
- package/dist/commands/config/utils.d.ts +14 -0
- package/dist/commands/config/utils.d.ts.map +1 -0
- package/dist/commands/config/utils.js +54 -0
- package/dist/commands/config/utils.js.map +1 -0
- package/dist/commands/context/boundaries.d.ts +13 -0
- package/dist/commands/context/boundaries.d.ts.map +1 -0
- package/dist/commands/context/boundaries.js +45 -0
- package/dist/commands/context/boundaries.js.map +1 -0
- package/dist/commands/context/compact.d.ts +13 -0
- package/dist/commands/context/compact.d.ts.map +1 -0
- package/dist/commands/context/compact.js +41 -0
- package/dist/commands/context/compact.js.map +1 -0
- package/dist/commands/context/savings.d.ts +13 -0
- package/dist/commands/context/savings.d.ts.map +1 -0
- package/dist/commands/context/savings.js +49 -0
- package/dist/commands/context/savings.js.map +1 -0
- package/dist/commands/context/status.d.ts +13 -0
- package/dist/commands/context/status.d.ts.map +1 -0
- package/dist/commands/context/status.js +52 -0
- package/dist/commands/context/status.js.map +1 -0
- package/dist/commands/context/strategy.d.ts +13 -0
- package/dist/commands/context/strategy.d.ts.map +1 -0
- package/dist/commands/context/strategy.js +66 -0
- package/dist/commands/context/strategy.js.map +1 -0
- package/dist/commands/mcp/disable.d.ts +5 -0
- package/dist/commands/mcp/disable.d.ts.map +1 -0
- package/dist/commands/mcp/disable.js +26 -0
- package/dist/commands/mcp/disable.js.map +1 -0
- package/dist/commands/mcp/edit.d.ts +9 -0
- package/dist/commands/mcp/edit.d.ts.map +1 -0
- package/dist/commands/mcp/edit.js +62 -0
- package/dist/commands/mcp/edit.js.map +1 -0
- package/dist/commands/mcp/enable.d.ts +5 -0
- package/dist/commands/mcp/enable.d.ts.map +1 -0
- package/dist/commands/mcp/enable.js +27 -0
- package/dist/commands/mcp/enable.js.map +1 -0
- package/dist/commands/mcp/init.d.ts +9 -0
- package/dist/commands/mcp/init.d.ts.map +1 -0
- package/dist/commands/mcp/init.js +97 -0
- package/dist/commands/mcp/init.js.map +1 -0
- package/dist/commands/mcp/list.d.ts +6 -0
- package/dist/commands/mcp/list.d.ts.map +1 -0
- package/dist/commands/mcp/list.js +56 -0
- package/dist/commands/mcp/list.js.map +1 -0
- package/dist/commands/mcp/server.d.ts +6 -0
- package/dist/commands/mcp/server.d.ts.map +1 -0
- package/dist/commands/mcp/server.js +44 -0
- package/dist/commands/mcp/server.js.map +1 -0
- package/dist/commands/mcp/status.d.ts +6 -0
- package/dist/commands/mcp/status.d.ts.map +1 -0
- package/dist/commands/mcp/status.js +43 -0
- package/dist/commands/mcp/status.js.map +1 -0
- package/dist/commands/mcp/tools.d.ts +7 -0
- package/dist/commands/mcp/tools.d.ts.map +1 -0
- package/dist/commands/mcp/tools.js +82 -0
- package/dist/commands/mcp/tools.js.map +1 -0
- package/dist/commands/mcp/validate.d.ts +8 -0
- package/dist/commands/mcp/validate.d.ts.map +1 -0
- package/dist/commands/mcp/validate.js +121 -0
- package/dist/commands/mcp/validate.js.map +1 -0
- package/dist/commands/middleware/config.d.ts +13 -0
- package/dist/commands/middleware/config.d.ts.map +1 -0
- package/dist/commands/middleware/config.js +87 -0
- package/dist/commands/middleware/config.js.map +1 -0
- package/dist/commands/middleware/disable.d.ts +13 -0
- package/dist/commands/middleware/disable.d.ts.map +1 -0
- package/dist/commands/middleware/disable.js +50 -0
- package/dist/commands/middleware/disable.js.map +1 -0
- package/dist/commands/middleware/enable.d.ts +13 -0
- package/dist/commands/middleware/enable.d.ts.map +1 -0
- package/dist/commands/middleware/enable.js +50 -0
- package/dist/commands/middleware/enable.js.map +1 -0
- package/dist/commands/middleware/list.d.ts +13 -0
- package/dist/commands/middleware/list.d.ts.map +1 -0
- package/dist/commands/middleware/list.js +64 -0
- package/dist/commands/middleware/list.js.map +1 -0
- package/dist/commands/middleware/status.d.ts +13 -0
- package/dist/commands/middleware/status.d.ts.map +1 -0
- package/dist/commands/middleware/status.js +80 -0
- package/dist/commands/middleware/status.js.map +1 -0
- package/dist/commands/models/compare.d.ts +9 -0
- package/dist/commands/models/compare.d.ts.map +1 -0
- package/dist/commands/models/compare.js +76 -0
- package/dist/commands/models/compare.js.map +1 -0
- package/dist/commands/models/cost.d.ts +9 -0
- package/dist/commands/models/cost.d.ts.map +1 -0
- package/dist/commands/models/cost.js +64 -0
- package/dist/commands/models/cost.js.map +1 -0
- package/dist/commands/models/info.d.ts +9 -0
- package/dist/commands/models/info.d.ts.map +1 -0
- package/dist/commands/models/info.js +61 -0
- package/dist/commands/models/info.js.map +1 -0
- package/dist/commands/models/list.d.ts +6 -0
- package/dist/commands/models/list.d.ts.map +1 -0
- package/dist/commands/models/list.js +66 -0
- package/dist/commands/models/list.js.map +1 -0
- package/dist/commands/models/providers.d.ts +13 -0
- package/dist/commands/models/providers.d.ts.map +1 -0
- package/dist/commands/models/providers.js +45 -0
- package/dist/commands/models/providers.js.map +1 -0
- package/dist/commands/models/search.d.ts +10 -0
- package/dist/commands/models/search.d.ts.map +1 -0
- package/dist/commands/models/search.js +56 -0
- package/dist/commands/models/search.js.map +1 -0
- package/dist/commands/models/switch.d.ts +14 -0
- package/dist/commands/models/switch.d.ts.map +1 -0
- package/dist/commands/models/switch.js +67 -0
- package/dist/commands/models/switch.js.map +1 -0
- package/dist/commands/permissions/auto-approve.d.ts +13 -0
- package/dist/commands/permissions/auto-approve.d.ts.map +1 -0
- package/dist/commands/permissions/auto-approve.js +53 -0
- package/dist/commands/permissions/auto-approve.js.map +1 -0
- package/dist/commands/permissions/grant.d.ts +13 -0
- package/dist/commands/permissions/grant.d.ts.map +1 -0
- package/dist/commands/permissions/grant.js +46 -0
- package/dist/commands/permissions/grant.js.map +1 -0
- package/dist/commands/permissions/mode.d.ts +12 -0
- package/dist/commands/permissions/mode.d.ts.map +1 -0
- package/dist/commands/permissions/mode.js +61 -0
- package/dist/commands/permissions/mode.js.map +1 -0
- package/dist/commands/permissions/policies.d.ts +13 -0
- package/dist/commands/permissions/policies.d.ts.map +1 -0
- package/dist/commands/permissions/policies.js +47 -0
- package/dist/commands/permissions/policies.js.map +1 -0
- package/dist/commands/permissions/revoke.d.ts +13 -0
- package/dist/commands/permissions/revoke.d.ts.map +1 -0
- package/dist/commands/permissions/revoke.js +46 -0
- package/dist/commands/permissions/revoke.js.map +1 -0
- package/dist/commands/permissions/set.d.ts +13 -0
- package/dist/commands/permissions/set.d.ts.map +1 -0
- package/dist/commands/permissions/set.js +57 -0
- package/dist/commands/permissions/set.js.map +1 -0
- package/dist/commands/permissions/tools.d.ts +13 -0
- package/dist/commands/permissions/tools.d.ts.map +1 -0
- package/dist/commands/permissions/tools.js +50 -0
- package/dist/commands/permissions/tools.js.map +1 -0
- package/dist/commands/server/start.d.ts +11 -0
- package/dist/commands/server/start.d.ts.map +1 -0
- package/dist/commands/server/start.js +58 -0
- package/dist/commands/server/start.js.map +1 -0
- package/dist/commands/session/checkpoints.d.ts +6 -0
- package/dist/commands/session/checkpoints.d.ts.map +1 -0
- package/dist/commands/session/checkpoints.js +41 -0
- package/dist/commands/session/checkpoints.js.map +1 -0
- package/dist/commands/session/compact.d.ts +13 -0
- package/dist/commands/session/compact.d.ts.map +1 -0
- package/dist/commands/session/compact.js +56 -0
- package/dist/commands/session/compact.js.map +1 -0
- package/dist/commands/session/export.d.ts +6 -0
- package/dist/commands/session/export.d.ts.map +1 -0
- package/dist/commands/session/export.js +31 -0
- package/dist/commands/session/export.js.map +1 -0
- package/dist/commands/session/list.d.ts +7 -0
- package/dist/commands/session/list.d.ts.map +1 -0
- package/dist/commands/session/list.js +63 -0
- package/dist/commands/session/list.js.map +1 -0
- package/dist/commands/session/new.d.ts +8 -0
- package/dist/commands/session/new.d.ts.map +1 -0
- package/dist/commands/session/new.js +23 -0
- package/dist/commands/session/new.js.map +1 -0
- package/dist/commands/session/resume.d.ts +6 -0
- package/dist/commands/session/resume.d.ts.map +1 -0
- package/dist/commands/session/resume.js +32 -0
- package/dist/commands/session/resume.js.map +1 -0
- package/dist/commands/session/search.d.ts +10 -0
- package/dist/commands/session/search.d.ts.map +1 -0
- package/dist/commands/session/search.js +65 -0
- package/dist/commands/session/search.js.map +1 -0
- package/dist/commands/session/stats.d.ts +6 -0
- package/dist/commands/session/stats.d.ts.map +1 -0
- package/dist/commands/session/stats.js +58 -0
- package/dist/commands/session/stats.js.map +1 -0
- package/dist/commands/session/view.d.ts +6 -0
- package/dist/commands/session/view.d.ts.map +1 -0
- package/dist/commands/session/view.js +65 -0
- package/dist/commands/session/view.js.map +1 -0
- package/dist/commands/slash/CommandPalette.d.ts +60 -0
- package/dist/commands/slash/CommandPalette.d.ts.map +1 -0
- package/dist/commands/slash/CommandPalette.js +351 -0
- package/dist/commands/slash/CommandPalette.js.map +1 -0
- package/dist/commands/slash/SlashCommandParser.d.ts +11 -0
- package/dist/commands/slash/SlashCommandParser.d.ts.map +1 -0
- package/dist/commands/slash/SlashCommandParser.js +11 -0
- package/dist/commands/slash/SlashCommandParser.js.map +1 -0
- package/dist/commands/slash/SlashCommandRegistry.d.ts +11 -0
- package/dist/commands/slash/SlashCommandRegistry.d.ts.map +1 -0
- package/dist/commands/slash/SlashCommandRegistry.js +11 -0
- package/dist/commands/slash/SlashCommandRegistry.js.map +1 -0
- package/dist/commands/slash/index.d.ts +11 -0
- package/dist/commands/slash/index.d.ts.map +1 -0
- package/dist/commands/slash/index.js +13 -0
- package/dist/commands/slash/index.js.map +1 -0
- package/dist/commands/system-messages/list.d.ts +13 -0
- package/dist/commands/system-messages/list.d.ts.map +1 -0
- package/dist/commands/system-messages/list.js +54 -0
- package/dist/commands/system-messages/list.js.map +1 -0
- package/dist/commands/system-messages/reload.d.ts +13 -0
- package/dist/commands/system-messages/reload.d.ts.map +1 -0
- package/dist/commands/system-messages/reload.js +36 -0
- package/dist/commands/system-messages/reload.js.map +1 -0
- package/dist/commands/system-messages/view.d.ts +13 -0
- package/dist/commands/system-messages/view.d.ts.map +1 -0
- package/dist/commands/system-messages/view.js +52 -0
- package/dist/commands/system-messages/view.js.map +1 -0
- package/dist/commands/tmux/list.d.ts +13 -0
- package/dist/commands/tmux/list.d.ts.map +1 -0
- package/dist/commands/tmux/list.js +68 -0
- package/dist/commands/tmux/list.js.map +1 -0
- package/dist/commands/tools/info.d.ts +13 -0
- package/dist/commands/tools/info.d.ts.map +1 -0
- package/dist/commands/tools/info.js +82 -0
- package/dist/commands/tools/info.js.map +1 -0
- package/dist/commands/tools/list.d.ts +14 -0
- package/dist/commands/tools/list.d.ts.map +1 -0
- package/dist/commands/tools/list.js +67 -0
- package/dist/commands/tools/list.js.map +1 -0
- package/dist/config/ConfigManager.d.ts +40 -0
- package/dist/config/ConfigManager.d.ts.map +1 -0
- package/dist/config/ConfigManager.js +162 -0
- package/dist/config/ConfigManager.js.map +1 -0
- package/dist/config/extension.d.ts +12 -0
- package/dist/config/extension.d.ts.map +1 -0
- package/dist/config/extension.js +5 -0
- package/dist/config/extension.js.map +1 -0
- package/dist/config/settings.d.ts +42 -0
- package/dist/config/settings.d.ts.map +1 -0
- package/dist/config/settings.js +32 -0
- package/dist/config/settings.js.map +1 -0
- package/dist/index.d.ts +3 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +883 -0
- package/dist/index.js.map +1 -0
- package/dist/orchestrator/OrchestratorClient.d.ts +385 -0
- package/dist/orchestrator/OrchestratorClient.d.ts.map +1 -0
- package/dist/orchestrator/OrchestratorClient.js +1195 -0
- package/dist/orchestrator/OrchestratorClient.js.map +1 -0
- package/dist/themes/DefaultTheme.d.ts +9 -0
- package/dist/themes/DefaultTheme.d.ts.map +1 -0
- package/dist/themes/DefaultTheme.js +29 -0
- package/dist/themes/DefaultTheme.js.map +1 -0
- package/dist/themes/MinimalTheme.d.ts +9 -0
- package/dist/themes/MinimalTheme.d.ts.map +1 -0
- package/dist/themes/MinimalTheme.js +29 -0
- package/dist/themes/MinimalTheme.js.map +1 -0
- package/dist/themes/Theme.interface.d.ts +36 -0
- package/dist/themes/Theme.interface.d.ts.map +1 -0
- package/dist/themes/Theme.interface.js +5 -0
- package/dist/themes/Theme.interface.js.map +1 -0
- package/dist/themes/ThemeManager.d.ts +63 -0
- package/dist/themes/ThemeManager.d.ts.map +1 -0
- package/dist/themes/ThemeManager.js +257 -0
- package/dist/themes/ThemeManager.js.map +1 -0
- package/dist/themes/colors.d.ts +108 -0
- package/dist/themes/colors.d.ts.map +1 -0
- package/dist/themes/colors.js +284 -0
- package/dist/themes/colors.js.map +1 -0
- package/dist/themes/createTheme.d.ts +40 -0
- package/dist/themes/createTheme.d.ts.map +1 -0
- package/dist/themes/createTheme.js +114 -0
- package/dist/themes/createTheme.js.map +1 -0
- package/dist/themes/themeDefinitions.d.ts +27 -0
- package/dist/themes/themeDefinitions.d.ts.map +1 -0
- package/dist/themes/themeDefinitions.js +244 -0
- package/dist/themes/themeDefinitions.js.map +1 -0
- package/dist/utils/CodeDiffRenderer.d.ts +124 -0
- package/dist/utils/CodeDiffRenderer.d.ts.map +1 -0
- package/dist/utils/CodeDiffRenderer.js +257 -0
- package/dist/utils/CodeDiffRenderer.js.map +1 -0
- package/dist/utils/MarkdownRenderer.d.ts +74 -0
- package/dist/utils/MarkdownRenderer.d.ts.map +1 -0
- package/dist/utils/MarkdownRenderer.js +260 -0
- package/dist/utils/MarkdownRenderer.js.map +1 -0
- package/dist/utils/MessageRenderer.d.ts +200 -0
- package/dist/utils/MessageRenderer.d.ts.map +1 -0
- package/dist/utils/MessageRenderer.js +283 -0
- package/dist/utils/MessageRenderer.js.map +1 -0
- package/dist/utils/ToolFormatter.d.ts +103 -0
- package/dist/utils/ToolFormatter.d.ts.map +1 -0
- package/dist/utils/ToolFormatter.js +357 -0
- package/dist/utils/ToolFormatter.js.map +1 -0
- package/dist/utils/boxDrawing.d.ts +23 -0
- package/dist/utils/boxDrawing.d.ts.map +1 -0
- package/dist/utils/boxDrawing.js +78 -0
- package/dist/utils/boxDrawing.js.map +1 -0
- package/dist/utils/checks.d.ts +9 -0
- package/dist/utils/checks.d.ts.map +1 -0
- package/dist/utils/checks.js +11 -0
- package/dist/utils/checks.js.map +1 -0
- package/dist/utils/events.d.ts +24 -0
- package/dist/utils/events.d.ts.map +1 -0
- package/dist/utils/events.js +17 -0
- package/dist/utils/events.js.map +1 -0
- package/dist/utils/formatters.d.ts +255 -0
- package/dist/utils/formatters.d.ts.map +1 -0
- package/dist/utils/formatters.js +361 -0
- package/dist/utils/formatters.js.map +1 -0
- package/dist/utils/math.d.ts +11 -0
- package/dist/utils/math.d.ts.map +1 -0
- package/dist/utils/math.js +13 -0
- package/dist/utils/math.js.map +1 -0
- package/package.json +82 -0
package/bin/cortex.js
ADDED
|
@@ -0,0 +1,548 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
* cortex — Natural language interface to the Nexus Cortex library
|
|
5
|
+
*
|
|
6
|
+
* Usage:
|
|
7
|
+
* cortex "Read package.json and tell me the version"
|
|
8
|
+
* cortex --model deepseek-v4-flash "Explain generics"
|
|
9
|
+
* cortex --resume abc123 "Continue from where we left off"
|
|
10
|
+
* cortex --new "Start a fresh conversation"
|
|
11
|
+
* cortex --json "Give me raw response"
|
|
12
|
+
* cortex --stats
|
|
13
|
+
* cortex --sessions
|
|
14
|
+
*
|
|
15
|
+
* Connects to a running Nexus Cortex server (default: localhost:4000).
|
|
16
|
+
* If no server is running, prints instructions to start one.
|
|
17
|
+
*
|
|
18
|
+
* Designed for:
|
|
19
|
+
* - Quick natural language queries from the shell
|
|
20
|
+
* - Agent-to-agent communication (invoke as a task tool)
|
|
21
|
+
* - Scripting and pipeline integration (--json mode)
|
|
22
|
+
* - Multi-turn conversations via session resume
|
|
23
|
+
*/
|
|
24
|
+
|
|
25
|
+
import { spawn, spawnSync } from 'child_process';
|
|
26
|
+
import { fileURLToPath } from 'url';
|
|
27
|
+
import { dirname, join, resolve } from 'path';
|
|
28
|
+
import { existsSync, realpathSync } from 'fs';
|
|
29
|
+
|
|
30
|
+
const __cortex_filename = fileURLToPath(import.meta.url);
|
|
31
|
+
const __cortex_dirname = dirname(realpathSync(__cortex_filename));
|
|
32
|
+
const MONOREPO_ROOT = resolve(__cortex_dirname, '..', '..', '..');
|
|
33
|
+
const SERVER_ENTRY = join(MONOREPO_ROOT, 'packages', 'server', 'dist', 'index.js');
|
|
34
|
+
|
|
35
|
+
// Resolve CORTEX_ROOT (the install root holding the shipped .cortex scaffold —
|
|
36
|
+
// builtin agents/skills) when the user hasn't set it. Git clone → the monorepo
|
|
37
|
+
// root; npm install → this package's root, where prepack vendored the scaffold.
|
|
38
|
+
// Inherited by the spawned server, so AgentStore/SkillTool builtin tiers resolve.
|
|
39
|
+
const CLI_PKG_ROOT = resolve(__cortex_dirname, '..');
|
|
40
|
+
if (!process.env.CORTEX_ROOT) {
|
|
41
|
+
if (existsSync(join(MONOREPO_ROOT, '.cortex'))) process.env.CORTEX_ROOT = MONOREPO_ROOT;
|
|
42
|
+
else if (existsSync(join(CLI_PKG_ROOT, '.cortex'))) process.env.CORTEX_ROOT = CLI_PKG_ROOT;
|
|
43
|
+
}
|
|
44
|
+
|
|
45
|
+
const BASE_PORT = process.env.PORT || '4000';
|
|
46
|
+
const BASE_URL = process.env.CORTEX_URL || `http://localhost:${BASE_PORT}`;
|
|
47
|
+
|
|
48
|
+
let serverProcess = null;
|
|
49
|
+
|
|
50
|
+
// ── Argument parsing ──────────────────────────────────────────────
|
|
51
|
+
|
|
52
|
+
const args = process.argv.slice(2);
|
|
53
|
+
|
|
54
|
+
// ── Headless Commander delegation ─────────────────────────────────
|
|
55
|
+
// `cortex` is primarily the HTTP chat/PR client; the headless Commander program
|
|
56
|
+
// (autoresearch, models, message, mcp, config, …) lives in dist/index.js. If the
|
|
57
|
+
// first positional arg is one of those subcommands, hand the whole invocation off
|
|
58
|
+
// to it — this is what makes `cortex autoresearch experiment … --json` work on PATH
|
|
59
|
+
// (the auto-research container contract).
|
|
60
|
+
const COMMANDER_SUBCOMMANDS = new Set([
|
|
61
|
+
'autoresearch', 'models', 'message', 'mcp', 'config', 'permissions', 'context',
|
|
62
|
+
'tools', 'middleware', 'artifact', 'cache', 'system-messages', 'tmux',
|
|
63
|
+
]);
|
|
64
|
+
const __firstPositional = args.find((a) => !a.startsWith('-'));
|
|
65
|
+
if (__firstPositional && COMMANDER_SUBCOMMANDS.has(__firstPositional)) {
|
|
66
|
+
const CLI_ENTRY = join(__cortex_dirname, '..', 'dist', 'index.js');
|
|
67
|
+
const res = spawnSync(process.execPath, [CLI_ENTRY, ...args], { stdio: 'inherit' });
|
|
68
|
+
process.exit(res.status ?? 0);
|
|
69
|
+
}
|
|
70
|
+
|
|
71
|
+
// `cortex agent "<task>"` (alias: `cortex run`) — an autonomous one-shot agent run.
|
|
72
|
+
// Same as the chat one-shot, but bundles the unattended defaults: auto-approve tools
|
|
73
|
+
// (YOLO), a fresh session, server self-stop on idle, and an optional --cwd to target a
|
|
74
|
+
// directory without `cd`. Defaults are applied after flag parsing (below).
|
|
75
|
+
let __agentMode = false;
|
|
76
|
+
{
|
|
77
|
+
const i = args.findIndex((a) => !a.startsWith('-'));
|
|
78
|
+
if (i !== -1 && (args[i] === 'agent' || args[i] === 'run')) {
|
|
79
|
+
__agentMode = true;
|
|
80
|
+
args.splice(i, 1); // drop the subcommand word; the rest is flags + the task
|
|
81
|
+
}
|
|
82
|
+
}
|
|
83
|
+
|
|
84
|
+
function hasFlag(name) {
|
|
85
|
+
const idx = args.indexOf(name);
|
|
86
|
+
if (idx !== -1) { args.splice(idx, 1); return true; }
|
|
87
|
+
return false;
|
|
88
|
+
}
|
|
89
|
+
|
|
90
|
+
function getFlagValue(name) {
|
|
91
|
+
const idx = args.indexOf(name);
|
|
92
|
+
if (idx !== -1 && idx + 1 < args.length) {
|
|
93
|
+
const val = args[idx + 1];
|
|
94
|
+
args.splice(idx, 2);
|
|
95
|
+
return val;
|
|
96
|
+
}
|
|
97
|
+
return null;
|
|
98
|
+
}
|
|
99
|
+
|
|
100
|
+
// Extract flags before consuming remaining args as prompt
|
|
101
|
+
const showHelp = hasFlag('--help') || hasFlag('-h');
|
|
102
|
+
const jsonOutput = hasFlag('--json');
|
|
103
|
+
let newSession = hasFlag('--new');
|
|
104
|
+
const showStats = hasFlag('--stats');
|
|
105
|
+
const showSessions = hasFlag('--sessions');
|
|
106
|
+
const doShutdown = hasFlag('--shutdown');
|
|
107
|
+
const showTmux = hasFlag('--tmux');
|
|
108
|
+
const quiet = hasFlag('--quiet') || hasFlag('-q');
|
|
109
|
+
const modelId = getFlagValue('--model') || getFlagValue('-m');
|
|
110
|
+
const resumeId = getFlagValue('--resume');
|
|
111
|
+
const prMode = getFlagValue('--pr');
|
|
112
|
+
const timeoutFlag = getFlagValue('--timeout');
|
|
113
|
+
let idleTimeoutFlag = getFlagValue('--idle-timeout');
|
|
114
|
+
const cwdFlag = getFlagValue('--cwd'); // `cortex agent` target directory
|
|
115
|
+
hasFlag('--yolo'); // accepted but redundant — agent auto-approves by default
|
|
116
|
+
const messageTimeoutMs = timeoutFlag ? parseInt(timeoutFlag, 10) : 600000; // 10 min default for messages
|
|
117
|
+
let prompt = args.join(' ').trim();
|
|
118
|
+
|
|
119
|
+
// Apply `cortex agent` autonomous defaults. Set BEFORE the server is auto-started so the
|
|
120
|
+
// spawned server inherits the cwd (project path) + YOLO env.
|
|
121
|
+
if (__agentMode) {
|
|
122
|
+
if (cwdFlag) {
|
|
123
|
+
try {
|
|
124
|
+
process.chdir(resolve(cwdFlag));
|
|
125
|
+
} catch (e) {
|
|
126
|
+
process.stderr.write(`[agent] --cwd: cannot enter ${cwdFlag}: ${e.message}\n`);
|
|
127
|
+
process.exit(1);
|
|
128
|
+
}
|
|
129
|
+
}
|
|
130
|
+
newSession = true; // each task is independent
|
|
131
|
+
if (idleTimeoutFlag === null) idleTimeoutFlag = '60'; // server self-stops; no orphan
|
|
132
|
+
// Headless autonomous runs have NO interactive approver — there is no human in the loop
|
|
133
|
+
// to say yes/no to a tool. So the agent auto-approves all tools (the practical reality of
|
|
134
|
+
// unattended operation). Disclosed up front; scope `cortex agent` to a throwaway / worktree
|
|
135
|
+
// / sandbox directory on a real repo. (A future opt-in "agent-safe" profile would hard-deny
|
|
136
|
+
// destructive ops instead of auto-approving — see research/future_ideas.)
|
|
137
|
+
process.env.YOLO = 'true';
|
|
138
|
+
process.stderr.write(
|
|
139
|
+
'[agent] autonomous: auto-approving all tools (headless has no interactive approver). ' +
|
|
140
|
+
'Point it at a throwaway/worktree/sandbox dir if the files matter.\n',
|
|
141
|
+
);
|
|
142
|
+
}
|
|
143
|
+
|
|
144
|
+
// ── Help ──────────────────────────────────────────────────────────
|
|
145
|
+
|
|
146
|
+
if (showHelp) {
|
|
147
|
+
console.log(`
|
|
148
|
+
cortex — Natural language interface to the Nexus Cortex library
|
|
149
|
+
|
|
150
|
+
USAGE:
|
|
151
|
+
cortex "your prompt here" Send a message (continues current session)
|
|
152
|
+
cortex agent "<task>" Autonomous one-shot agent run (see below)
|
|
153
|
+
cortex --new "start fresh" Start new session, then send message
|
|
154
|
+
cortex --model MODEL_ID "prompt" Use a specific model
|
|
155
|
+
cortex --resume SESSION_ID "prompt" Resume a specific session
|
|
156
|
+
cortex --json "prompt" Output raw JSON response
|
|
157
|
+
cortex --stats Show current session stats
|
|
158
|
+
cortex --sessions List all sessions
|
|
159
|
+
cortex --quiet "prompt" Suppress session info, print only response
|
|
160
|
+
cortex --shutdown Stop the running server
|
|
161
|
+
cortex --idle-timeout 300 "prompt" Auto-shutdown server after 300s idle
|
|
162
|
+
|
|
163
|
+
AGENT (autonomous one-shot):
|
|
164
|
+
cortex agent "<task>" Run one autonomous agent task to completion, then exit.
|
|
165
|
+
cortex agent --cwd <dir> "<task>" Target a directory (no need to cd into it first).
|
|
166
|
+
Autonomous & unattended: auto-approves all tools
|
|
167
|
+
(headless has no interactive approver), starts a fresh
|
|
168
|
+
session, and self-stops the server on idle. On a real
|
|
169
|
+
repo, point it at a throwaway/worktree/sandbox dir.
|
|
170
|
+
Combine with --json for scripting/agent pipelines.
|
|
171
|
+
(alias: cortex run "<task>")
|
|
172
|
+
|
|
173
|
+
FLAGS:
|
|
174
|
+
--help, -h Show this help
|
|
175
|
+
--model, -m ID Model to use (overrides server default)
|
|
176
|
+
--new Start a fresh session before sending
|
|
177
|
+
--resume ID Resume a specific session by UUID
|
|
178
|
+
--json Output full JSON response (for scripting/agents)
|
|
179
|
+
--quiet, -q Response text only, no session info
|
|
180
|
+
--timeout MS Request timeout in ms (default: 600000 = 10 min)
|
|
181
|
+
--idle-timeout SECS Auto-shutdown server after N seconds of inactivity
|
|
182
|
+
--cwd DIR (agent) Run in DIR — the agent's file tools operate there
|
|
183
|
+
--shutdown Stop the running server and exit
|
|
184
|
+
--tmux List active tmux sessions with dashboard URLs
|
|
185
|
+
--stats Show current session statistics
|
|
186
|
+
--sessions List all saved sessions
|
|
187
|
+
--pr MODE PR management (review, list, create)
|
|
188
|
+
|
|
189
|
+
ENVIRONMENT:
|
|
190
|
+
CORTEX_URL Server URL (default: http://localhost:4000)
|
|
191
|
+
PORT Server port (default: 4000)
|
|
192
|
+
SERVER_IDLE_TIMEOUT Server auto-shutdown after N seconds idle (default: 0 = off)
|
|
193
|
+
|
|
194
|
+
EXAMPLES:
|
|
195
|
+
cortex "What is this project?"
|
|
196
|
+
cortex --model deepseek-v4-flash "Explain TypeScript generics"
|
|
197
|
+
cortex "Read package.json" && cortex "What was the version?"
|
|
198
|
+
cortex --json "list files" | jq '.toolUses[].name'
|
|
199
|
+
cortex --new "Let's start over"
|
|
200
|
+
|
|
201
|
+
PR MANAGEMENT:
|
|
202
|
+
cortex --pr review owner/repo 123 Review a PR with parallel agents
|
|
203
|
+
cortex --pr list owner/repo List open PRs
|
|
204
|
+
cortex --pr create owner/repo --branch feature-x Create PR from changes
|
|
205
|
+
|
|
206
|
+
AGENT TEAM USAGE:
|
|
207
|
+
The session ID printed after each response enables multi-turn workflows:
|
|
208
|
+
|
|
209
|
+
SESSION=$(cortex --quiet --json "Analyze test gaps" | jq -r '.sessionId')
|
|
210
|
+
cortex --resume $SESSION "Now fix the top priority gap"
|
|
211
|
+
cortex --resume $SESSION "Run the tests to verify"
|
|
212
|
+
|
|
213
|
+
SERVER:
|
|
214
|
+
Auto-starts a server if none is running. The server persists in the
|
|
215
|
+
background after cortex exits. Use --shutdown to stop it.
|
|
216
|
+
Use --idle-timeout to auto-stop the server after a period of inactivity.
|
|
217
|
+
`);
|
|
218
|
+
process.exit(0);
|
|
219
|
+
}
|
|
220
|
+
|
|
221
|
+
// ── HTTP helpers ──────────────────────────────────────────────────
|
|
222
|
+
|
|
223
|
+
async function isServerUp() {
|
|
224
|
+
try {
|
|
225
|
+
const resp = await fetch(`${BASE_URL}/health`, { signal: AbortSignal.timeout(2000) });
|
|
226
|
+
return resp.ok;
|
|
227
|
+
} catch { return false; }
|
|
228
|
+
}
|
|
229
|
+
|
|
230
|
+
async function shutdownServer() {
|
|
231
|
+
if (!(await isServerUp())) {
|
|
232
|
+
process.stderr.write(`[cortex] No server running on ${BASE_URL}\n`);
|
|
233
|
+
process.exit(0);
|
|
234
|
+
}
|
|
235
|
+
try {
|
|
236
|
+
await fetch(`${BASE_URL}/shutdown`, { method: 'POST', signal: AbortSignal.timeout(5000) });
|
|
237
|
+
process.stderr.write(`[cortex] Server shutdown requested\n`);
|
|
238
|
+
} catch {
|
|
239
|
+
process.stderr.write(`[cortex] Failed to reach server for shutdown\n`);
|
|
240
|
+
process.exit(1);
|
|
241
|
+
}
|
|
242
|
+
}
|
|
243
|
+
|
|
244
|
+
async function startServer() {
|
|
245
|
+
if (!existsSync(SERVER_ENTRY)) {
|
|
246
|
+
console.error(`Server not built. Run: npm run build`);
|
|
247
|
+
process.exit(1);
|
|
248
|
+
}
|
|
249
|
+
process.stderr.write(`[cortex] No server on ${BASE_URL} -- starting one...\n`);
|
|
250
|
+
const serverArgs = [SERVER_ENTRY];
|
|
251
|
+
if (idleTimeoutFlag) {
|
|
252
|
+
serverArgs.push('--idle-timeout', idleTimeoutFlag);
|
|
253
|
+
}
|
|
254
|
+
serverProcess = spawn('node', serverArgs, {
|
|
255
|
+
stdio: ['ignore', 'pipe', 'pipe'],
|
|
256
|
+
env: { ...process.env, PORT: BASE_PORT },
|
|
257
|
+
detached: true,
|
|
258
|
+
});
|
|
259
|
+
serverProcess.unref();
|
|
260
|
+
|
|
261
|
+
serverProcess.stderr.on('data', (chunk) => {
|
|
262
|
+
const line = chunk.toString();
|
|
263
|
+
if (line.includes('[ERROR]') || line.includes('Failed to start')) {
|
|
264
|
+
process.stderr.write(line);
|
|
265
|
+
}
|
|
266
|
+
});
|
|
267
|
+
|
|
268
|
+
// Wait for healthy (up to 15s)
|
|
269
|
+
for (let i = 0; i < 30; i++) {
|
|
270
|
+
await new Promise(r => setTimeout(r, 500));
|
|
271
|
+
if (await isServerUp()) {
|
|
272
|
+
process.stderr.write(`[cortex] Server ready on ${BASE_URL}\n`);
|
|
273
|
+
// The server is detached + unref'd so it persists on its own. Its piped
|
|
274
|
+
// stdio handles, however, keep THIS short-lived client's event loop alive
|
|
275
|
+
// — so after a one-shot the client would hang until killed. Unref the
|
|
276
|
+
// pipes so the client can exit cleanly once its request completes while
|
|
277
|
+
// the background server keeps running.
|
|
278
|
+
serverProcess.stdout?.unref?.();
|
|
279
|
+
serverProcess.stderr?.unref?.();
|
|
280
|
+
return;
|
|
281
|
+
}
|
|
282
|
+
}
|
|
283
|
+
console.error('[cortex] Server failed to start within 15s');
|
|
284
|
+
process.exit(1);
|
|
285
|
+
}
|
|
286
|
+
|
|
287
|
+
async function ensureServer() {
|
|
288
|
+
if (!(await isServerUp())) {
|
|
289
|
+
await startServer();
|
|
290
|
+
}
|
|
291
|
+
}
|
|
292
|
+
|
|
293
|
+
async function fetchJSON(path, options = {}, timeoutMs = 30000) {
|
|
294
|
+
try {
|
|
295
|
+
const resp = await fetch(`${BASE_URL}${path}`, {
|
|
296
|
+
headers: { 'Content-Type': 'application/json' },
|
|
297
|
+
signal: AbortSignal.timeout(timeoutMs),
|
|
298
|
+
...options,
|
|
299
|
+
});
|
|
300
|
+
if (!resp.ok) {
|
|
301
|
+
const text = await resp.text();
|
|
302
|
+
throw new Error(`HTTP ${resp.status}: ${text}`);
|
|
303
|
+
}
|
|
304
|
+
return await resp.json();
|
|
305
|
+
} catch (err) {
|
|
306
|
+
if (err.name === 'TimeoutError' || err.name === 'AbortError') {
|
|
307
|
+
console.error(`Request timed out after ${(timeoutMs / 1000).toFixed(0)}s`);
|
|
308
|
+
process.exit(1);
|
|
309
|
+
}
|
|
310
|
+
if (err.cause?.code === 'ECONNREFUSED' || err.message?.includes('ECONNREFUSED')) {
|
|
311
|
+
console.error('[cortex] Lost connection to server at ' + BASE_URL);
|
|
312
|
+
process.exit(1);
|
|
313
|
+
}
|
|
314
|
+
throw err;
|
|
315
|
+
}
|
|
316
|
+
}
|
|
317
|
+
|
|
318
|
+
// ── Commands ──────────────────────────────────────────────────────
|
|
319
|
+
|
|
320
|
+
async function run() {
|
|
321
|
+
// --shutdown: stop the server and exit
|
|
322
|
+
if (doShutdown) {
|
|
323
|
+
await shutdownServer();
|
|
324
|
+
return;
|
|
325
|
+
}
|
|
326
|
+
|
|
327
|
+
await ensureServer();
|
|
328
|
+
|
|
329
|
+
// --tmux: list active tmux sessions (served by SandboxViewServer on port+1)
|
|
330
|
+
if (showTmux) {
|
|
331
|
+
try {
|
|
332
|
+
const viewPort = parseInt(BASE_PORT, 10) + 1;
|
|
333
|
+
const viewUrl = `http://localhost:${viewPort}`;
|
|
334
|
+
const tmuxResp = await fetch(`${viewUrl}/api/tmux/sessions`, {
|
|
335
|
+
signal: AbortSignal.timeout(10000),
|
|
336
|
+
});
|
|
337
|
+
if (!tmuxResp.ok) throw new Error(`HTTP ${tmuxResp.status}: ${await tmuxResp.text()}`);
|
|
338
|
+
const resp = await tmuxResp.json();
|
|
339
|
+
const sessions = resp.sessions || [];
|
|
340
|
+
if (jsonOutput) {
|
|
341
|
+
console.log(JSON.stringify(resp, null, 2));
|
|
342
|
+
return;
|
|
343
|
+
}
|
|
344
|
+
if (sessions.length === 0) {
|
|
345
|
+
console.log('[OK] No active tmux sessions');
|
|
346
|
+
return;
|
|
347
|
+
}
|
|
348
|
+
const dashboardBase = resp.dashboardUrl || `http://localhost:${viewPort}/tmux`;
|
|
349
|
+
console.log(`Tmux Sessions (${sessions.length}):\n`);
|
|
350
|
+
for (const s of sessions) {
|
|
351
|
+
const created = s.created ? new Date(s.created).toLocaleString() : '?';
|
|
352
|
+
const lastUsed = s.lastUsed ? new Date(s.lastUsed).toLocaleString() : '?';
|
|
353
|
+
const tag = s.recovered ? '[RECOVERED]' : '[ACTIVE]';
|
|
354
|
+
console.log(` ${tag} ${s.sessionId}`);
|
|
355
|
+
console.log(` Directory: ${s.workingDirectory || '?'}`);
|
|
356
|
+
console.log(` Created: ${created}`);
|
|
357
|
+
console.log(` Last Used: ${lastUsed}`);
|
|
358
|
+
if (s.recovered && s.recoveredAt) {
|
|
359
|
+
console.log(` Recovered: ${new Date(s.recoveredAt).toLocaleString()}`);
|
|
360
|
+
}
|
|
361
|
+
console.log(` Dashboard: ${dashboardBase}/${s.sessionId}`);
|
|
362
|
+
console.log('');
|
|
363
|
+
}
|
|
364
|
+
} catch (err) {
|
|
365
|
+
console.error(`[WARN] Failed to list tmux sessions: ${err.message}`);
|
|
366
|
+
process.exit(1);
|
|
367
|
+
}
|
|
368
|
+
return;
|
|
369
|
+
}
|
|
370
|
+
|
|
371
|
+
// --sessions: list all sessions
|
|
372
|
+
if (showSessions) {
|
|
373
|
+
const raw = await fetchJSON('/sessions');
|
|
374
|
+
const sessions = raw.sessions || raw; // handle {sessions:[...]} or bare array
|
|
375
|
+
if (jsonOutput) {
|
|
376
|
+
console.log(JSON.stringify(sessions, null, 2));
|
|
377
|
+
} else {
|
|
378
|
+
if (!Array.isArray(sessions) || sessions.length === 0) {
|
|
379
|
+
console.log('No sessions found.');
|
|
380
|
+
return;
|
|
381
|
+
}
|
|
382
|
+
console.log(`Sessions (${sessions.length}):\n`);
|
|
383
|
+
for (const s of sessions) {
|
|
384
|
+
const modified = s.lastModified || s.metadata?.lastModified;
|
|
385
|
+
const age = modified ? timeSince(new Date(modified)) : '?';
|
|
386
|
+
const msgs = s.messageCount || s.metadata?.messageCount || '?';
|
|
387
|
+
console.log(` ${s.sessionId.substring(0, 8)}... ${msgs} msgs ${age} ago`);
|
|
388
|
+
}
|
|
389
|
+
}
|
|
390
|
+
return;
|
|
391
|
+
}
|
|
392
|
+
|
|
393
|
+
// --stats: show current session stats
|
|
394
|
+
if (showStats) {
|
|
395
|
+
// Get sessions list to find the current one
|
|
396
|
+
const raw = await fetchJSON('/sessions');
|
|
397
|
+
const sessions = raw.sessions || raw;
|
|
398
|
+
if (!Array.isArray(sessions) || sessions.length === 0) {
|
|
399
|
+
console.log('No active session.');
|
|
400
|
+
return;
|
|
401
|
+
}
|
|
402
|
+
const current = sessions[0]; // most recent
|
|
403
|
+
try {
|
|
404
|
+
const stats = await fetchJSON(`/sessions/${current.sessionId}/stats`);
|
|
405
|
+
if (jsonOutput) {
|
|
406
|
+
console.log(JSON.stringify(stats, null, 2));
|
|
407
|
+
} else {
|
|
408
|
+
console.log(`Session: ${current.sessionId.substring(0, 8)}...`);
|
|
409
|
+
console.log(`Messages: ${stats.messageCount || '?'}`);
|
|
410
|
+
console.log(`Turns: ${stats.turnCount || '?'}`);
|
|
411
|
+
if (stats.tokenUsage) {
|
|
412
|
+
console.log(`Tokens: ${stats.tokenUsage.totalInput || 0} in / ${stats.tokenUsage.totalOutput || 0} out`);
|
|
413
|
+
}
|
|
414
|
+
if (stats.toolUsage) {
|
|
415
|
+
console.log(`Tool calls: ${stats.toolUsage.totalCalls || 0}`);
|
|
416
|
+
}
|
|
417
|
+
}
|
|
418
|
+
} catch (e) {
|
|
419
|
+
console.log(`Session: ${current.sessionId.substring(0, 8)}... (${current.messageCount || '?'} messages)`);
|
|
420
|
+
}
|
|
421
|
+
return;
|
|
422
|
+
}
|
|
423
|
+
|
|
424
|
+
// --pr: PR management shorthand
|
|
425
|
+
if (prMode) {
|
|
426
|
+
// Parse: --pr review owner/repo 123, --pr list owner/repo, --pr create owner/repo --branch feature-x
|
|
427
|
+
const mode = prMode; // review, list, create
|
|
428
|
+
const remaining = prompt.split(/\s+/);
|
|
429
|
+
const repo = remaining[0] || '';
|
|
430
|
+
const prNumber = remaining[1] || '';
|
|
431
|
+
|
|
432
|
+
if (mode === 'review' && repo && prNumber) {
|
|
433
|
+
prompt = `Use the PRAgent tool in review mode for repo "${repo}" PR #${prNumber}. Extract the diff and metadata, then dispatch parallel audit agents (security, quality, architecture) to review it. Synthesize their findings into a final review.`;
|
|
434
|
+
} else if (mode === 'list' && repo) {
|
|
435
|
+
prompt = `Use the PRAgent tool in list mode for repo "${repo}". Show all open PRs with their number, title, author, and review status.`;
|
|
436
|
+
} else if (mode === 'create' && repo) {
|
|
437
|
+
const branch = getFlagValue('--branch') || 'main';
|
|
438
|
+
prompt = `Use the WorkspaceManager tool to create a worktree for repo "${repo}" on branch "${branch}", then use the PRAgent tool in create mode to set up a PR workflow.`;
|
|
439
|
+
} else {
|
|
440
|
+
console.error('Usage: cortex --pr review owner/repo 123');
|
|
441
|
+
console.error(' cortex --pr list owner/repo');
|
|
442
|
+
console.error(' cortex --pr create owner/repo --branch feature-x');
|
|
443
|
+
process.exit(1);
|
|
444
|
+
}
|
|
445
|
+
}
|
|
446
|
+
|
|
447
|
+
// Need a prompt for message commands
|
|
448
|
+
if (!prompt) {
|
|
449
|
+
console.error('Usage: cortex "your prompt here"');
|
|
450
|
+
console.error(' cortex --help for more options');
|
|
451
|
+
process.exit(1);
|
|
452
|
+
}
|
|
453
|
+
|
|
454
|
+
// --new: create fresh session first
|
|
455
|
+
if (newSession) {
|
|
456
|
+
await fetchJSON('/sessions/new', { method: 'POST' });
|
|
457
|
+
if (!quiet) {
|
|
458
|
+
process.stderr.write('New session created.\n');
|
|
459
|
+
}
|
|
460
|
+
}
|
|
461
|
+
|
|
462
|
+
// --resume: switch to a specific session
|
|
463
|
+
if (resumeId) {
|
|
464
|
+
try {
|
|
465
|
+
const result = await fetchJSON(`/sessions/${resumeId}/load`, { method: 'POST' });
|
|
466
|
+
if (!quiet) {
|
|
467
|
+
process.stderr.write(`Resumed session ${resumeId.substring(0, 8)}... (${result.messageCount} messages)\n`);
|
|
468
|
+
}
|
|
469
|
+
} catch (err) {
|
|
470
|
+
process.stderr.write(`Failed to resume session ${resumeId}: ${err.message}\n`);
|
|
471
|
+
process.exit(1);
|
|
472
|
+
}
|
|
473
|
+
}
|
|
474
|
+
|
|
475
|
+
// Build the model ID - only set when user passed -m explicitly. When omitted,
|
|
476
|
+
// leave it out of the payload so the server can pick the session's current model
|
|
477
|
+
// (important on --resume: forcing a local fallback like "grok-4-1-fast-reasoning"
|
|
478
|
+
// would silently override the session's persisted model and break the
|
|
479
|
+
// previous_response_id chain on XAI Responses API sessions).
|
|
480
|
+
const health = await fetchJSON('/health');
|
|
481
|
+
|
|
482
|
+
const payload = {
|
|
483
|
+
messages: [{ role: 'user', content: prompt }],
|
|
484
|
+
};
|
|
485
|
+
if (modelId) {
|
|
486
|
+
payload.model = modelId;
|
|
487
|
+
}
|
|
488
|
+
|
|
489
|
+
const data = await fetchJSON('/v1/messages', {
|
|
490
|
+
method: 'POST',
|
|
491
|
+
body: JSON.stringify(payload),
|
|
492
|
+
}, messageTimeoutMs);
|
|
493
|
+
|
|
494
|
+
// --json: raw output
|
|
495
|
+
if (jsonOutput) {
|
|
496
|
+
// Inject sessionId for agent workflows
|
|
497
|
+
const raw = await fetchJSON('/sessions');
|
|
498
|
+
const sessions = raw.sessions || raw;
|
|
499
|
+
if (Array.isArray(sessions) && sessions.length > 0) {
|
|
500
|
+
data.sessionId = sessions[0].sessionId;
|
|
501
|
+
}
|
|
502
|
+
console.log(JSON.stringify(data, null, 2));
|
|
503
|
+
return;
|
|
504
|
+
}
|
|
505
|
+
|
|
506
|
+
// Extract text content
|
|
507
|
+
const text = (data.content || [])
|
|
508
|
+
.filter(b => b.type === 'text')
|
|
509
|
+
.map(b => b.text)
|
|
510
|
+
.join('\n');
|
|
511
|
+
|
|
512
|
+
// Print response
|
|
513
|
+
console.log(text);
|
|
514
|
+
|
|
515
|
+
// Print session info to stderr (unless --quiet)
|
|
516
|
+
if (!quiet) {
|
|
517
|
+
const usage = data.usage || {};
|
|
518
|
+
const tools = (data.toolUses || []).length;
|
|
519
|
+
const iterations = data.metadata?.toolCallIterations || 0;
|
|
520
|
+
const parts = [];
|
|
521
|
+
if (usage.inputTokens) parts.push(`${usage.inputTokens} in`);
|
|
522
|
+
if (usage.outputTokens) parts.push(`${usage.outputTokens} out`);
|
|
523
|
+
if (tools > 0) parts.push(`${tools} tool${tools > 1 ? 's' : ''}`);
|
|
524
|
+
if (iterations > 0) parts.push(`${iterations} iteration${iterations > 1 ? 's' : ''}`);
|
|
525
|
+
if (parts.length > 0) {
|
|
526
|
+
process.stderr.write(`\n[${parts.join(' | ')}]\n`);
|
|
527
|
+
}
|
|
528
|
+
}
|
|
529
|
+
}
|
|
530
|
+
|
|
531
|
+
// ── Utilities ─────────────────────────────────────────────────────
|
|
532
|
+
|
|
533
|
+
function timeSince(date) {
|
|
534
|
+
const seconds = Math.floor((Date.now() - date.getTime()) / 1000);
|
|
535
|
+
if (seconds < 60) return `${seconds}s`;
|
|
536
|
+
const minutes = Math.floor(seconds / 60);
|
|
537
|
+
if (minutes < 60) return `${minutes}m`;
|
|
538
|
+
const hours = Math.floor(minutes / 60);
|
|
539
|
+
if (hours < 24) return `${hours}h`;
|
|
540
|
+
return `${Math.floor(hours / 24)}d`;
|
|
541
|
+
}
|
|
542
|
+
|
|
543
|
+
// ── Entry point ───────────────────────────────────────────────────
|
|
544
|
+
|
|
545
|
+
run().catch(err => {
|
|
546
|
+
console.error(err.message || err);
|
|
547
|
+
process.exit(1);
|
|
548
|
+
});
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
/**
|
|
3
|
+
* Agent Mode Entry Point
|
|
4
|
+
*
|
|
5
|
+
* This module is executed when the CLI is spawned as a sub-agent child process.
|
|
6
|
+
* It receives configuration via IPC, runs the agent task autonomously, and
|
|
7
|
+
* streams progress/results back to the parent process.
|
|
8
|
+
*
|
|
9
|
+
* Usage: This file is NOT called directly. It's spawned by SubAgentProcessManager
|
|
10
|
+
* via child_process.fork().
|
|
11
|
+
*
|
|
12
|
+
* Communication:
|
|
13
|
+
* - Parent sends IPCStartMessage to begin execution
|
|
14
|
+
* - Child streams IPCProgressMessage, IPCToolCallMessage, etc.
|
|
15
|
+
* - Child sends IPCCompletedMessage when done
|
|
16
|
+
*
|
|
17
|
+
* @module cli/agent-mode
|
|
18
|
+
* @version 1.0.0
|
|
19
|
+
*/
|
|
20
|
+
export {};
|
|
21
|
+
//# sourceMappingURL=agent-mode.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"agent-mode.d.ts","sourceRoot":"","sources":["../src/agent-mode.ts"],"names":[],"mappings":";AACA;;;;;;;;;;;;;;;;;GAiBG"}
|