@compilr-dev/cli 0.4.0 → 0.5.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +254 -68
- package/dist/.tsbuildinfo.app +1 -0
- package/dist/.tsbuildinfo.data +1 -0
- package/dist/.tsbuildinfo.domain +1 -0
- package/dist/.tsbuildinfo.foundation +1 -0
- package/dist/agent.d.ts +134 -4
- package/dist/agent.js +345 -166
- package/dist/anchors/index.d.ts +9 -0
- package/dist/anchors/index.js +9 -0
- package/dist/anchors/project-anchors.d.ts +79 -0
- package/dist/anchors/project-anchors.js +202 -0
- package/dist/auth/api-client.d.ts +124 -0
- package/dist/auth/api-client.js +261 -0
- package/dist/auth/index.d.ts +172 -0
- package/dist/auth/index.js +545 -0
- package/dist/auth/storage.d.ts +52 -0
- package/dist/auth/storage.js +118 -0
- package/dist/changelog/index.d.ts +16 -0
- package/dist/changelog/index.js +24 -0
- package/dist/changelog/releases.d.ts +17 -0
- package/dist/changelog/releases.js +63 -0
- package/dist/commands/index.d.ts +2 -1
- package/dist/commands-v2/handlers/auth.d.ts +10 -0
- package/dist/commands-v2/handlers/auth.js +118 -0
- package/dist/commands-v2/handlers/background.d.ts +14 -0
- package/dist/commands-v2/handlers/background.js +276 -0
- package/dist/commands-v2/handlers/context.d.ts +13 -0
- package/dist/commands-v2/handlers/context.js +533 -0
- package/dist/commands-v2/handlers/core.d.ts +14 -0
- package/dist/commands-v2/handlers/core.js +290 -0
- package/dist/commands-v2/handlers/debug.d.ts +11 -0
- package/dist/commands-v2/handlers/debug.js +177 -0
- package/dist/commands-v2/handlers/delegations.d.ts +8 -0
- package/dist/commands-v2/handlers/delegations.js +29 -0
- package/dist/commands-v2/handlers/files.d.ts +8 -0
- package/dist/commands-v2/handlers/files.js +162 -0
- package/dist/commands-v2/handlers/filter.d.ts +9 -0
- package/dist/commands-v2/handlers/filter.js +130 -0
- package/dist/commands-v2/handlers/games.d.ts +7 -0
- package/dist/commands-v2/handlers/games.js +57 -0
- package/dist/commands-v2/handlers/index.d.ts +25 -0
- package/dist/commands-v2/handlers/index.js +63 -0
- package/dist/commands-v2/handlers/mcp.d.ts +8 -0
- package/dist/commands-v2/handlers/mcp.js +39 -0
- package/dist/commands-v2/handlers/notifications.d.ts +9 -0
- package/dist/commands-v2/handlers/notifications.js +34 -0
- package/dist/commands-v2/handlers/project.d.ts +22 -0
- package/dist/commands-v2/handlers/project.js +1035 -0
- package/dist/commands-v2/handlers/reset.d.ts +11 -0
- package/dist/commands-v2/handlers/reset.js +118 -0
- package/dist/commands-v2/handlers/session.d.ts +161 -0
- package/dist/commands-v2/handlers/session.js +805 -0
- package/dist/commands-v2/handlers/settings.d.ts +17 -0
- package/dist/commands-v2/handlers/settings.js +417 -0
- package/dist/commands-v2/handlers/tasks.d.ts +5 -0
- package/dist/commands-v2/handlers/tasks.js +36 -0
- package/dist/commands-v2/handlers/team.d.ts +9 -0
- package/dist/commands-v2/handlers/team.js +549 -0
- package/dist/commands-v2/handlers/terminals.d.ts +9 -0
- package/dist/commands-v2/handlers/terminals.js +34 -0
- package/dist/commands-v2/index.d.ts +14 -0
- package/dist/commands-v2/index.js +18 -0
- package/dist/commands-v2/registry.d.ts +52 -0
- package/dist/commands-v2/registry.js +114 -0
- package/dist/commands-v2/types.d.ts +153 -0
- package/dist/commands-v2/types.js +7 -0
- package/dist/commands.js +123 -7
- package/dist/compilr-diff-companion.vsix +0 -0
- package/dist/db/index.js +98 -4
- package/dist/db/repositories/document-repository.d.ts +2 -0
- package/dist/db/repositories/document-repository.js +5 -1
- package/dist/db/repositories/index.d.ts +2 -0
- package/dist/db/repositories/index.js +1 -0
- package/dist/db/repositories/plan-repository.d.ts +101 -0
- package/dist/db/repositories/plan-repository.js +275 -0
- package/dist/db/repositories/project-repository.d.ts +6 -0
- package/dist/db/repositories/project-repository.js +41 -0
- package/dist/db/repositories/work-item-repository.d.ts +15 -0
- package/dist/db/repositories/work-item-repository.js +69 -4
- package/dist/db/schema.d.ts +40 -3
- package/dist/db/schema.js +66 -3
- package/dist/episodes/index.d.ts +20 -0
- package/dist/episodes/index.js +27 -0
- package/dist/episodes/recorder.d.ts +51 -0
- package/dist/episodes/recorder.js +195 -0
- package/dist/episodes/significant-work.d.ts +21 -0
- package/dist/episodes/significant-work.js +56 -0
- package/dist/episodes/store.d.ts +38 -0
- package/dist/episodes/store.js +199 -0
- package/dist/episodes/types.d.ts +35 -0
- package/dist/episodes/types.js +6 -0
- package/dist/episodes/work-at-risk.d.ts +12 -0
- package/dist/episodes/work-at-risk.js +38 -0
- package/dist/episodes/work-summary-anchor.d.ts +23 -0
- package/dist/episodes/work-summary-anchor.js +73 -0
- package/dist/games/coins.d.ts +66 -0
- package/dist/games/coins.js +165 -0
- package/dist/games/game-base.d.ts +84 -0
- package/dist/games/game-base.js +204 -0
- package/dist/games/index.d.ts +16 -0
- package/dist/games/index.js +49 -0
- package/dist/games/scores.d.ts +69 -0
- package/dist/games/scores.js +191 -0
- package/dist/games/tetris/board.d.ts +59 -0
- package/dist/games/tetris/board.js +170 -0
- package/dist/games/tetris/index.d.ts +109 -0
- package/dist/games/tetris/index.js +610 -0
- package/dist/games/tetris/pieces.d.ts +44 -0
- package/dist/games/tetris/pieces.js +271 -0
- package/dist/games/tetris/renderer.d.ts +26 -0
- package/dist/games/tetris/renderer.js +77 -0
- package/dist/guide/guide-content.d.ts +23 -0
- package/dist/guide/guide-content.js +196 -0
- package/dist/guide/index.d.ts +8 -0
- package/dist/guide/index.js +7 -0
- package/dist/guide/shared-content.d.ts +37 -0
- package/dist/guide/shared-content.js +1272 -0
- package/dist/guide/tutorial-helpers.d.ts +57 -0
- package/dist/guide/tutorial-helpers.js +147 -0
- package/dist/handlers/ask-user-handlers.d.ts +32 -0
- package/dist/handlers/ask-user-handlers.js +104 -0
- package/dist/handlers/delegation-handlers.d.ts +34 -0
- package/dist/handlers/delegation-handlers.js +291 -0
- package/dist/handlers/permission-handler.d.ts +30 -0
- package/dist/handlers/permission-handler.js +205 -0
- package/dist/index.d.ts +11 -1
- package/dist/index.js +615 -179
- package/dist/input-handlers/index.d.ts +7 -0
- package/dist/input-handlers/index.js +7 -0
- package/dist/input-handlers/memory-handler.d.ts +26 -0
- package/dist/input-handlers/memory-handler.js +69 -0
- package/dist/models/index.d.ts +10 -0
- package/dist/models/index.js +12 -0
- package/dist/models/model-registry.d.ts +38 -0
- package/dist/models/model-registry.js +69 -0
- package/dist/models/model-tiers.d.ts +28 -0
- package/dist/models/model-tiers.js +71 -0
- package/dist/models/model-validation.d.ts +25 -0
- package/dist/models/model-validation.js +291 -0
- package/dist/models/ollama-models.d.ts +73 -0
- package/dist/models/ollama-models.js +178 -0
- package/dist/models/provider-types.d.ts +6 -0
- package/dist/models/provider-types.js +1 -0
- package/dist/models/providers.d.ts +35 -0
- package/dist/models/providers.js +58 -0
- package/dist/models/types.d.ts +4 -0
- package/dist/models/types.js +4 -0
- package/dist/multi-agent/activity.d.ts +21 -0
- package/dist/multi-agent/activity.js +34 -0
- package/dist/multi-agent/agent-selection.d.ts +55 -0
- package/dist/multi-agent/agent-selection.js +90 -0
- package/dist/multi-agent/artifacts.d.ts +197 -0
- package/dist/multi-agent/artifacts.js +379 -0
- package/dist/multi-agent/checkpointer.d.ts +138 -0
- package/dist/multi-agent/checkpointer.js +471 -0
- package/dist/multi-agent/collision-utils.d.ts +16 -0
- package/dist/multi-agent/collision-utils.js +28 -0
- package/dist/multi-agent/context-resolver.d.ts +97 -0
- package/dist/multi-agent/context-resolver.js +316 -0
- package/dist/multi-agent/custom-agents.d.ts +83 -0
- package/dist/multi-agent/custom-agents.js +227 -0
- package/dist/multi-agent/delegation-tracker.d.ts +157 -0
- package/dist/multi-agent/delegation-tracker.js +243 -0
- package/dist/multi-agent/file-lock-hook.d.ts +29 -0
- package/dist/multi-agent/file-lock-hook.js +97 -0
- package/dist/multi-agent/file-locks.d.ts +58 -0
- package/dist/multi-agent/file-locks.js +194 -0
- package/dist/multi-agent/index.d.ts +24 -0
- package/dist/multi-agent/index.js +30 -0
- package/dist/multi-agent/mention-parser.d.ts +64 -0
- package/dist/multi-agent/mention-parser.js +146 -0
- package/dist/multi-agent/notification-manager.d.ts +84 -0
- package/dist/multi-agent/notification-manager.js +224 -0
- package/dist/multi-agent/pending-requests.d.ts +122 -0
- package/dist/multi-agent/pending-requests.js +155 -0
- package/dist/multi-agent/session-registry.d.ts +139 -0
- package/dist/multi-agent/session-registry.js +514 -0
- package/dist/multi-agent/shared-context.d.ts +293 -0
- package/dist/multi-agent/shared-context.js +671 -0
- package/dist/multi-agent/skill-requirements.d.ts +66 -0
- package/dist/multi-agent/skill-requirements.js +178 -0
- package/dist/multi-agent/task-assignment.d.ts +69 -0
- package/dist/multi-agent/task-assignment.js +123 -0
- package/dist/multi-agent/task-suggestion.d.ts +31 -0
- package/dist/multi-agent/task-suggestion.js +72 -0
- package/dist/multi-agent/team-agent.d.ts +201 -0
- package/dist/multi-agent/team-agent.js +488 -0
- package/dist/multi-agent/team.d.ts +286 -0
- package/dist/multi-agent/team.js +610 -0
- package/dist/multi-agent/tool-config.d.ts +110 -0
- package/dist/multi-agent/tool-config.js +661 -0
- package/dist/multi-agent/types.d.ts +211 -0
- package/dist/multi-agent/types.js +617 -0
- package/dist/prompts/plan-mode-prompt.d.ts +11 -0
- package/dist/prompts/plan-mode-prompt.js +95 -0
- package/dist/repl-helpers.d.ts +63 -0
- package/dist/repl-helpers.js +319 -0
- package/dist/repl-v2.d.ts +554 -0
- package/dist/repl-v2.js +3286 -0
- package/dist/session/index.d.ts +6 -0
- package/dist/session/index.js +6 -0
- package/dist/session/project-session-manager.d.ts +158 -0
- package/dist/session/project-session-manager.js +650 -0
- package/dist/settings/index.d.ts +156 -13
- package/dist/settings/index.js +377 -24
- package/dist/settings/mcp-config.d.ts +76 -0
- package/dist/settings/mcp-config.js +143 -0
- package/dist/settings/paths.d.ts +114 -0
- package/dist/settings/paths.js +270 -0
- package/dist/shared-handlers.d.ts +62 -0
- package/dist/shared-handlers.js +48 -0
- package/dist/system-prompt/builder.d.ts +5 -0
- package/dist/system-prompt/builder.js +4 -0
- package/dist/system-prompt/index.d.ts +18 -0
- package/dist/system-prompt/index.js +18 -0
- package/dist/system-prompt/modules.d.ts +5 -0
- package/dist/system-prompt/modules.js +4 -0
- package/dist/tabbed-menu.js +2 -1
- package/dist/templates/compilr-md-import.d.ts +16 -0
- package/dist/templates/compilr-md-import.js +241 -0
- package/dist/templates/compilr-md.js +10 -58
- package/dist/templates/config-json.d.ts +1 -25
- package/dist/templates/index.d.ts +2 -0
- package/dist/templates/index.js +35 -75
- package/dist/themes/colors.js +3 -1
- package/dist/themes/registry.d.ts +5 -36
- package/dist/themes/registry.js +11 -95
- package/dist/themes/types.d.ts +3 -38
- package/dist/themes/types.js +2 -2
- package/dist/tool-names.d.ts +108 -0
- package/dist/tool-names.js +227 -0
- package/dist/tools/anchor-tools.d.ts +31 -0
- package/dist/tools/anchor-tools.js +255 -0
- package/dist/tools/artifact-tools.d.ts +42 -0
- package/dist/tools/artifact-tools.js +328 -0
- package/dist/tools/ask-user-simple.d.ts +1 -1
- package/dist/tools/ask-user-simple.js +2 -1
- package/dist/tools/ask-user.d.ts +1 -1
- package/dist/tools/ask-user.js +2 -1
- package/dist/tools/backlog-wrappers.d.ts +56 -0
- package/dist/tools/backlog-wrappers.js +353 -0
- package/dist/tools/backlog.d.ts +2 -2
- package/dist/tools/backlog.js +2 -2
- package/dist/tools/db-tools.d.ts +12 -0
- package/dist/tools/db-tools.js +14 -0
- package/dist/tools/delegate-background.d.ts +27 -0
- package/dist/tools/delegate-background.js +115 -0
- package/dist/tools/delegate.d.ts +22 -0
- package/dist/tools/delegate.js +97 -0
- package/dist/tools/delegation-status.d.ts +16 -0
- package/dist/tools/delegation-status.js +128 -0
- package/dist/tools/document-db.d.ts +43 -0
- package/dist/tools/document-db.js +220 -0
- package/dist/tools/guide-tool.d.ts +12 -0
- package/dist/tools/guide-tool.js +59 -0
- package/dist/tools/handoff.d.ts +25 -0
- package/dist/tools/handoff.js +99 -0
- package/dist/tools/meta-tools.d.ts +26 -0
- package/dist/tools/meta-tools.js +47 -0
- package/dist/tools/plan-tools.d.ts +54 -0
- package/dist/tools/plan-tools.js +338 -0
- package/dist/tools/platform-adapter.d.ts +29 -0
- package/dist/tools/platform-adapter.js +394 -0
- package/dist/tools/project-db.d.ts +34 -0
- package/dist/tools/project-db.js +39 -0
- package/dist/tools/recall-work-tool.d.ts +18 -0
- package/dist/tools/recall-work-tool.js +82 -0
- package/dist/tools/workitem-db.d.ts +135 -0
- package/dist/tools/workitem-db.js +730 -0
- package/dist/tools.d.ts +67 -2
- package/dist/tools.js +238 -38
- package/dist/ui/ask-user-overlay.d.ts +2 -2
- package/dist/ui/ask-user-overlay.js +443 -535
- package/dist/ui/ask-user-simple-overlay.d.ts +2 -2
- package/dist/ui/ask-user-simple-overlay.js +182 -209
- package/dist/ui/autocomplete-controller.d.ts +42 -0
- package/dist/ui/autocomplete-controller.js +384 -0
- package/dist/ui/base/index.d.ts +26 -0
- package/dist/ui/base/index.js +33 -0
- package/dist/ui/base/inline-overlay-utils.d.ts +217 -0
- package/dist/ui/base/inline-overlay-utils.js +320 -0
- package/dist/ui/base/inline-overlay.d.ts +159 -0
- package/dist/ui/base/inline-overlay.js +257 -0
- package/dist/ui/base/key-utils.d.ts +15 -0
- package/dist/ui/base/key-utils.js +30 -0
- package/dist/ui/base/overlay-base-v2.d.ts +203 -0
- package/dist/ui/base/overlay-base-v2.js +260 -0
- package/dist/ui/base/overlay-base.d.ts +156 -0
- package/dist/ui/base/overlay-base.js +238 -0
- package/dist/ui/base/overlay-lifecycle.d.ts +65 -0
- package/dist/ui/base/overlay-lifecycle.js +159 -0
- package/dist/ui/base/overlay-types.d.ts +185 -0
- package/dist/ui/base/overlay-types.js +7 -0
- package/dist/ui/base/render-utils.d.ts +27 -0
- package/dist/ui/base/render-utils.js +36 -0
- package/dist/ui/base/screen-stack.d.ts +148 -0
- package/dist/ui/base/screen-stack.js +184 -0
- package/dist/ui/base/tabbed-list-overlay-v2.d.ts +118 -0
- package/dist/ui/base/tabbed-list-overlay-v2.js +335 -0
- package/dist/ui/base/tabbed-list-overlay.d.ts +153 -0
- package/dist/ui/base/tabbed-list-overlay.js +369 -0
- package/dist/ui/constants/labels.d.ts +14 -0
- package/dist/ui/constants/labels.js +51 -0
- package/dist/ui/conversation-store.d.ts +55 -0
- package/dist/ui/conversation-store.js +107 -0
- package/dist/ui/conversation.d.ts +75 -4
- package/dist/ui/conversation.js +376 -165
- package/dist/ui/diff.d.ts +7 -1
- package/dist/ui/diff.js +85 -48
- package/dist/ui/ephemeral.d.ts +1 -1
- package/dist/ui/ephemeral.js +4 -10
- package/dist/ui/features/index.d.ts +34 -0
- package/dist/ui/features/index.js +34 -0
- package/dist/ui/features/input-feature.d.ts +85 -0
- package/dist/ui/features/input-feature.js +238 -0
- package/dist/ui/features/list-feature.d.ts +155 -0
- package/dist/ui/features/list-feature.js +244 -0
- package/dist/ui/features/pagination-feature.d.ts +154 -0
- package/dist/ui/features/pagination-feature.js +238 -0
- package/dist/ui/features/search-feature.d.ts +148 -0
- package/dist/ui/features/search-feature.js +185 -0
- package/dist/ui/features/tab-feature.d.ts +194 -0
- package/dist/ui/features/tab-feature.js +307 -0
- package/dist/ui/file-autocomplete.d.ts +24 -0
- package/dist/ui/file-autocomplete.js +56 -0
- package/dist/ui/footer-renderer.d.ts +69 -0
- package/dist/ui/footer-renderer.js +431 -0
- package/dist/ui/footer.d.ts +181 -7
- package/dist/ui/footer.js +523 -74
- package/dist/ui/guardrail-overlay.d.ts +29 -0
- package/dist/ui/guardrail-overlay.js +145 -0
- package/dist/ui/index.d.ts +1 -1
- package/dist/ui/index.js +1 -3
- package/dist/ui/input-controller.d.ts +51 -0
- package/dist/ui/input-controller.js +176 -0
- package/dist/ui/input-prompt.d.ts +135 -33
- package/dist/ui/input-prompt.js +728 -337
- package/dist/ui/iteration-limit-overlay.d.ts +2 -2
- package/dist/ui/iteration-limit-overlay.js +92 -128
- package/dist/ui/keyboard-handler.d.ts +57 -0
- package/dist/ui/keyboard-handler.js +557 -0
- package/dist/ui/keys-overlay.d.ts +1 -0
- package/dist/ui/keys-overlay.js +203 -141
- package/dist/ui/line-utils.d.ts +88 -0
- package/dist/ui/line-utils.js +150 -0
- package/dist/ui/live-region-facade.d.ts +42 -0
- package/dist/ui/live-region-facade.js +205 -0
- package/dist/ui/live-region.d.ts +157 -0
- package/dist/ui/live-region.js +379 -0
- package/dist/ui/mascot/expressions.d.ts +32 -0
- package/dist/ui/mascot/expressions.js +213 -0
- package/dist/ui/mascot/index.d.ts +8 -0
- package/dist/ui/mascot/index.js +8 -0
- package/dist/ui/mascot/renderer.d.ts +19 -0
- package/dist/ui/mascot/renderer.js +132 -0
- package/dist/ui/overlay/data/tutorial-content.d.ts +9 -0
- package/dist/ui/overlay/data/tutorial-content.js +9 -0
- package/dist/ui/overlay/data/tutorial-registry.d.ts +12 -0
- package/dist/ui/overlay/data/tutorial-registry.js +116 -0
- package/dist/ui/overlay/data/tutorial-types.d.ts +35 -0
- package/dist/ui/overlay/data/tutorial-types.js +6 -0
- package/dist/ui/overlay/data/tutorials/basics/first-conversation.d.ts +7 -0
- package/dist/ui/overlay/data/tutorials/basics/first-conversation.js +220 -0
- package/dist/ui/overlay/data/tutorials/basics/first-project.d.ts +7 -0
- package/dist/ui/overlay/data/tutorials/basics/first-project.js +284 -0
- package/dist/ui/overlay/data/tutorials/basics/navigation.d.ts +8 -0
- package/dist/ui/overlay/data/tutorials/basics/navigation.js +22 -0
- package/dist/ui/overlay/data/tutorials/basics/welcome.d.ts +7 -0
- package/dist/ui/overlay/data/tutorials/basics/welcome.js +174 -0
- package/dist/ui/overlay/data/tutorials/config/context-management.d.ts +7 -0
- package/dist/ui/overlay/data/tutorials/config/context-management.js +158 -0
- package/dist/ui/overlay/data/tutorials/config/mcp-servers.d.ts +8 -0
- package/dist/ui/overlay/data/tutorials/config/mcp-servers.js +155 -0
- package/dist/ui/overlay/data/tutorials/config/model-selection.d.ts +7 -0
- package/dist/ui/overlay/data/tutorials/config/model-selection.js +162 -0
- package/dist/ui/overlay/data/tutorials/config/permissions-safety.d.ts +7 -0
- package/dist/ui/overlay/data/tutorials/config/permissions-safety.js +163 -0
- package/dist/ui/overlay/data/tutorials/config/settings-config.d.ts +7 -0
- package/dist/ui/overlay/data/tutorials/config/settings-config.js +166 -0
- package/dist/ui/overlay/data/tutorials/planning/arch.d.ts +7 -0
- package/dist/ui/overlay/data/tutorials/planning/arch.js +168 -0
- package/dist/ui/overlay/data/tutorials/planning/backlog.d.ts +7 -0
- package/dist/ui/overlay/data/tutorials/planning/backlog.js +103 -0
- package/dist/ui/overlay/data/tutorials/planning/build.d.ts +7 -0
- package/dist/ui/overlay/data/tutorials/planning/build.js +173 -0
- package/dist/ui/overlay/data/tutorials/planning/design.d.ts +7 -0
- package/dist/ui/overlay/data/tutorials/planning/design.js +205 -0
- package/dist/ui/overlay/data/tutorials/planning/docs.d.ts +7 -0
- package/dist/ui/overlay/data/tutorials/planning/docs.js +143 -0
- package/dist/ui/overlay/data/tutorials/planning/prd.d.ts +7 -0
- package/dist/ui/overlay/data/tutorials/planning/prd.js +173 -0
- package/dist/ui/overlay/data/tutorials/planning/scaffold.d.ts +7 -0
- package/dist/ui/overlay/data/tutorials/planning/scaffold.js +164 -0
- package/dist/ui/overlay/data/tutorials/planning/sketch.d.ts +7 -0
- package/dist/ui/overlay/data/tutorials/planning/sketch.js +58 -0
- package/dist/ui/overlay/data/tutorials/projects/anchors.d.ts +7 -0
- package/dist/ui/overlay/data/tutorials/projects/anchors.js +248 -0
- package/dist/ui/overlay/data/tutorials/projects/import-project.d.ts +7 -0
- package/dist/ui/overlay/data/tutorials/projects/import-project.js +172 -0
- package/dist/ui/overlay/data/tutorials/projects/managing-projects.d.ts +8 -0
- package/dist/ui/overlay/data/tutorials/projects/managing-projects.js +212 -0
- package/dist/ui/overlay/data/tutorials/projects/new-project.d.ts +7 -0
- package/dist/ui/overlay/data/tutorials/projects/new-project.js +251 -0
- package/dist/ui/overlay/data/tutorials/projects/session-management.d.ts +7 -0
- package/dist/ui/overlay/data/tutorials/projects/session-management.js +169 -0
- package/dist/ui/overlay/data/tutorials/teams/background-execution.d.ts +7 -0
- package/dist/ui/overlay/data/tutorials/teams/background-execution.js +171 -0
- package/dist/ui/overlay/data/tutorials/teams/multi-terminal.d.ts +8 -0
- package/dist/ui/overlay/data/tutorials/teams/multi-terminal.js +147 -0
- package/dist/ui/overlay/data/tutorials/teams/task-assignment.d.ts +7 -0
- package/dist/ui/overlay/data/tutorials/teams/task-assignment.js +204 -0
- package/dist/ui/overlay/data/tutorials/teams/team-overview.d.ts +7 -0
- package/dist/ui/overlay/data/tutorials/teams/team-overview.js +165 -0
- package/dist/ui/overlay/data/tutorials/teams/working-with-agents.d.ts +7 -0
- package/dist/ui/overlay/data/tutorials/teams/working-with-agents.js +172 -0
- package/dist/ui/overlay/impl/agents-overlay-v2.d.ts +45 -0
- package/dist/ui/overlay/impl/agents-overlay-v2.js +814 -0
- package/dist/ui/overlay/impl/anchors-overlay-v2.d.ts +47 -0
- package/dist/ui/overlay/impl/anchors-overlay-v2.js +749 -0
- package/dist/ui/overlay/impl/arch-type-overlay-v2.d.ts +37 -0
- package/dist/ui/overlay/impl/arch-type-overlay-v2.js +240 -0
- package/dist/ui/overlay/impl/artifact-detail-overlay-v2.d.ts +43 -0
- package/dist/ui/overlay/impl/artifact-detail-overlay-v2.js +232 -0
- package/dist/ui/overlay/impl/artifact-overlay-v2.d.ts +40 -0
- package/dist/ui/overlay/impl/artifact-overlay-v2.js +115 -0
- package/dist/ui/overlay/impl/ask-user-overlay-v2.d.ts +72 -0
- package/dist/ui/overlay/impl/ask-user-overlay-v2.js +581 -0
- package/dist/ui/overlay/impl/ask-user-simple-overlay-v2.d.ts +46 -0
- package/dist/ui/overlay/impl/ask-user-simple-overlay-v2.js +204 -0
- package/dist/ui/overlay/impl/background-overlay-v2.d.ts +40 -0
- package/dist/ui/overlay/impl/background-overlay-v2.js +147 -0
- package/dist/ui/overlay/impl/backlog-overlay-v2.d.ts +52 -0
- package/dist/ui/overlay/impl/backlog-overlay-v2.js +681 -0
- package/dist/ui/overlay/impl/changelog-overlay-v2.d.ts +44 -0
- package/dist/ui/overlay/impl/changelog-overlay-v2.js +165 -0
- package/dist/ui/overlay/impl/commands-overlay-v2.d.ts +33 -0
- package/dist/ui/overlay/impl/commands-overlay-v2.js +439 -0
- package/dist/ui/overlay/impl/config-overlay-v2.d.ts +111 -0
- package/dist/ui/overlay/impl/config-overlay-v2.js +718 -0
- package/dist/ui/overlay/impl/custom-agent-form-overlay-v2.d.ts +83 -0
- package/dist/ui/overlay/impl/custom-agent-form-overlay-v2.js +711 -0
- package/dist/ui/overlay/impl/dashboard-overlay-v2.d.ts +57 -0
- package/dist/ui/overlay/impl/dashboard-overlay-v2.js +382 -0
- package/dist/ui/overlay/impl/delegations-overlay-v2.d.ts +28 -0
- package/dist/ui/overlay/impl/delegations-overlay-v2.js +279 -0
- package/dist/ui/overlay/impl/docs-overlay-v2.d.ts +45 -0
- package/dist/ui/overlay/impl/docs-overlay-v2.js +117 -0
- package/dist/ui/overlay/impl/document-detail-overlay-v2.d.ts +84 -0
- package/dist/ui/overlay/impl/document-detail-overlay-v2.js +1112 -0
- package/dist/ui/overlay/impl/filter-overlay-v2.d.ts +41 -0
- package/dist/ui/overlay/impl/filter-overlay-v2.js +110 -0
- package/dist/ui/overlay/impl/games-overlay-v2.d.ts +31 -0
- package/dist/ui/overlay/impl/games-overlay-v2.js +135 -0
- package/dist/ui/overlay/impl/guardrail-overlay-v2.d.ts +43 -0
- package/dist/ui/overlay/impl/guardrail-overlay-v2.js +114 -0
- package/dist/ui/overlay/impl/help-overlay-v2.d.ts +57 -0
- package/dist/ui/overlay/impl/help-overlay-v2.js +287 -0
- package/dist/ui/overlay/impl/init-setup-overlay-v2.d.ts +25 -0
- package/dist/ui/overlay/impl/init-setup-overlay-v2.js +97 -0
- package/dist/ui/overlay/impl/iteration-limit-overlay-v2.d.ts +35 -0
- package/dist/ui/overlay/impl/iteration-limit-overlay-v2.js +105 -0
- package/dist/ui/overlay/impl/keys-overlay-v2.d.ts +41 -0
- package/dist/ui/overlay/impl/keys-overlay-v2.js +248 -0
- package/dist/ui/overlay/impl/login-overlay-v2.d.ts +49 -0
- package/dist/ui/overlay/impl/login-overlay-v2.js +277 -0
- package/dist/ui/overlay/impl/mascot-overlay-v2.d.ts +41 -0
- package/dist/ui/overlay/impl/mascot-overlay-v2.js +138 -0
- package/dist/ui/overlay/impl/mcp-overlay-v2.d.ts +63 -0
- package/dist/ui/overlay/impl/mcp-overlay-v2.js +907 -0
- package/dist/ui/overlay/impl/model-overlay-v2.d.ts +93 -0
- package/dist/ui/overlay/impl/model-overlay-v2.js +1143 -0
- package/dist/ui/overlay/impl/model-warning-overlay-v2.d.ts +46 -0
- package/dist/ui/overlay/impl/model-warning-overlay-v2.js +132 -0
- package/dist/ui/overlay/impl/new-overlay-v2.d.ts +108 -0
- package/dist/ui/overlay/impl/new-overlay-v2.js +1243 -0
- package/dist/ui/overlay/impl/notifications-overlay-v2.d.ts +20 -0
- package/dist/ui/overlay/impl/notifications-overlay-v2.js +116 -0
- package/dist/ui/overlay/impl/onboarding-wizard-overlay-v2.d.ts +76 -0
- package/dist/ui/overlay/impl/onboarding-wizard-overlay-v2.js +728 -0
- package/dist/ui/overlay/impl/pending-overlay-v2.d.ts +51 -0
- package/dist/ui/overlay/impl/pending-overlay-v2.js +445 -0
- package/dist/ui/overlay/impl/permission-overlay-v2.d.ts +36 -0
- package/dist/ui/overlay/impl/permission-overlay-v2.js +380 -0
- package/dist/ui/overlay/impl/permissions-overlay-v2.d.ts +85 -0
- package/dist/ui/overlay/impl/permissions-overlay-v2.js +820 -0
- package/dist/ui/overlay/impl/plan-approval-overlay-v2.d.ts +35 -0
- package/dist/ui/overlay/impl/plan-approval-overlay-v2.js +181 -0
- package/dist/ui/overlay/impl/project-edit-overlay-v2.d.ts +36 -0
- package/dist/ui/overlay/impl/project-edit-overlay-v2.js +195 -0
- package/dist/ui/overlay/impl/projects-overlay-v2.d.ts +37 -0
- package/dist/ui/overlay/impl/projects-overlay-v2.js +733 -0
- package/dist/ui/overlay/impl/reset-overlay-v2.d.ts +39 -0
- package/dist/ui/overlay/impl/reset-overlay-v2.js +107 -0
- package/dist/ui/overlay/impl/resume-overlay-v2.d.ts +60 -0
- package/dist/ui/overlay/impl/resume-overlay-v2.js +414 -0
- package/dist/ui/overlay/impl/session-mode-overlay-v2.d.ts +43 -0
- package/dist/ui/overlay/impl/session-mode-overlay-v2.js +124 -0
- package/dist/ui/overlay/impl/tasks-overlay-v2.d.ts +28 -0
- package/dist/ui/overlay/impl/tasks-overlay-v2.js +283 -0
- package/dist/ui/overlay/impl/team-overlay-v2.d.ts +86 -0
- package/dist/ui/overlay/impl/team-overlay-v2.js +692 -0
- package/dist/ui/overlay/impl/terminals-overlay-v2.d.ts +26 -0
- package/dist/ui/overlay/impl/terminals-overlay-v2.js +217 -0
- package/dist/ui/overlay/impl/theme-overlay-v2.d.ts +42 -0
- package/dist/ui/overlay/impl/theme-overlay-v2.js +135 -0
- package/dist/ui/overlay/impl/tools-overlay-v2.d.ts +47 -0
- package/dist/ui/overlay/impl/tools-overlay-v2.js +214 -0
- package/dist/ui/overlay/impl/tutorial-overlay-v2.d.ts +45 -0
- package/dist/ui/overlay/impl/tutorial-overlay-v2.js +212 -0
- package/dist/ui/overlay/impl/workflow-overlay-v2.d.ts +80 -0
- package/dist/ui/overlay/impl/workflow-overlay-v2.js +641 -0
- package/dist/ui/overlay/index.d.ts +52 -0
- package/dist/ui/overlay/index.js +54 -0
- package/dist/ui/overlay/key-utils.d.ts +6 -0
- package/dist/ui/overlay/key-utils.js +6 -0
- package/dist/ui/overlay/types.d.ts +140 -0
- package/dist/ui/overlay/types.js +22 -0
- package/dist/ui/overlay-manager.d.ts +43 -0
- package/dist/ui/overlay-manager.js +238 -0
- package/dist/ui/overlays.d.ts +0 -4
- package/dist/ui/overlays.js +4 -460
- package/dist/ui/permission-overlay.d.ts +1 -1
- package/dist/ui/permission-overlay.js +189 -300
- package/dist/ui/providers/types.d.ts +178 -0
- package/dist/ui/providers/types.js +9 -0
- package/dist/ui/render-modes.d.ts +36 -0
- package/dist/ui/render-modes.js +44 -0
- package/dist/ui/startup-menu.d.ts +36 -0
- package/dist/ui/startup-menu.js +236 -0
- package/dist/ui/status-bar-controller.d.ts +33 -0
- package/dist/ui/status-bar-controller.js +99 -0
- package/dist/ui/subagent-renderer.d.ts +117 -0
- package/dist/ui/subagent-renderer.js +318 -0
- package/dist/ui/terminal-autocomplete-utils.d.ts +23 -0
- package/dist/ui/terminal-autocomplete-utils.js +83 -0
- package/dist/ui/terminal-codes.d.ts +94 -0
- package/dist/ui/terminal-codes.js +124 -0
- package/dist/ui/terminal-line-builders.d.ts +17 -0
- package/dist/ui/terminal-line-builders.js +42 -0
- package/dist/ui/terminal-render-item.d.ts +16 -0
- package/dist/ui/terminal-render-item.js +267 -0
- package/dist/ui/terminal-renderer.d.ts +220 -0
- package/dist/ui/terminal-renderer.js +750 -0
- package/dist/ui/terminal-types.d.ts +179 -0
- package/dist/ui/terminal-types.js +34 -0
- package/dist/ui/terminal-ui.d.ts +331 -0
- package/dist/ui/terminal-ui.js +819 -0
- package/dist/ui/terminal.d.ts +20 -0
- package/dist/ui/terminal.js +72 -0
- package/dist/ui/todo-zone.d.ts +19 -1
- package/dist/ui/todo-zone.js +124 -38
- package/dist/ui/tool-formatters.d.ts +16 -0
- package/dist/ui/tool-formatters.js +1027 -0
- package/dist/ui/turn-metrics.d.ts +56 -0
- package/dist/ui/turn-metrics.js +75 -0
- package/dist/ui/types.d.ts +28 -0
- package/dist/ui/types.js +1 -0
- package/dist/ui/vscode-diff-ipc.d.ts +102 -0
- package/dist/ui/vscode-diff-ipc.js +385 -0
- package/dist/utils/credentials.d.ts +24 -5
- package/dist/utils/credentials.js +123 -9
- package/dist/utils/debug-log.d.ts +28 -0
- package/dist/utils/debug-log.js +57 -0
- package/dist/utils/format-tokens.d.ts +13 -0
- package/dist/utils/format-tokens.js +18 -0
- package/dist/utils/git-config.d.ts +26 -0
- package/dist/utils/git-config.js +54 -0
- package/dist/utils/message-utils.d.ts +61 -0
- package/dist/utils/message-utils.js +72 -0
- package/dist/utils/model-tiers.d.ts +8 -1
- package/dist/utils/model-tiers.js +39 -17
- package/dist/utils/open-browser.d.ts +5 -0
- package/dist/utils/open-browser.js +32 -0
- package/dist/utils/path-safety.d.ts +56 -0
- package/dist/utils/path-safety.js +240 -0
- package/dist/utils/project-detection.d.ts +58 -0
- package/dist/utils/project-detection.js +424 -0
- package/dist/utils/project-memory.js +2 -1
- package/dist/utils/project-status.d.ts +2 -2
- package/dist/utils/startup-perf.d.ts +18 -0
- package/dist/utils/startup-perf.js +60 -0
- package/dist/utils/token-tracker.d.ts +62 -0
- package/dist/utils/token-tracker.js +150 -0
- package/dist/utils/token-types.d.ts +23 -0
- package/dist/utils/token-types.js +18 -0
- package/dist/utils/types/config-types.d.ts +32 -0
- package/dist/utils/types/config-types.js +8 -0
- package/dist/utils/update-checker.d.ts +28 -0
- package/dist/utils/update-checker.js +106 -0
- package/dist/utils/version.d.ts +7 -0
- package/dist/utils/version.js +10 -0
- package/dist/utils/vscode-detect.d.ts +39 -0
- package/dist/utils/vscode-detect.js +137 -0
- package/dist/workflow/guided-mode-injector.d.ts +42 -0
- package/dist/workflow/guided-mode-injector.js +191 -0
- package/dist/workflow/index.d.ts +8 -0
- package/dist/workflow/index.js +8 -0
- package/dist/workflow/step-criteria.d.ts +62 -0
- package/dist/workflow/step-criteria.js +150 -0
- package/dist/workflow/step-tracker.d.ts +92 -0
- package/dist/workflow/step-tracker.js +141 -0
- package/package.json +32 -12
- package/dist/index.old.d.ts +0 -7
- package/dist/index.old.js +0 -1014
- package/dist/repl.d.ts +0 -121
- package/dist/repl.js +0 -1878
- package/dist/templates/claude-md.d.ts +0 -7
- package/dist/templates/claude-md.js +0 -189
- package/dist/test-autocomplete.d.ts +0 -7
- package/dist/test-autocomplete.js +0 -85
- package/dist/test-tabbed-menu.d.ts +0 -7
- package/dist/test-tabbed-menu.js +0 -25
- package/dist/tool-selector.d.ts +0 -71
- package/dist/tool-selector.js +0 -184
- package/dist/ui/agents-overlay.d.ts +0 -12
- package/dist/ui/agents-overlay.js +0 -501
- package/dist/ui/arch-type-overlay.d.ts +0 -20
- package/dist/ui/arch-type-overlay.js +0 -229
- package/dist/ui/backlog-overlay.d.ts +0 -17
- package/dist/ui/backlog-overlay.js +0 -786
- package/dist/ui/commands-overlay.d.ts +0 -11
- package/dist/ui/commands-overlay.js +0 -410
- package/dist/ui/config-overlay.d.ts +0 -34
- package/dist/ui/config-overlay.js +0 -977
- package/dist/ui/init-overlay.d.ts +0 -24
- package/dist/ui/init-overlay.js +0 -525
- package/dist/ui/input-prompt-v2.d.ts +0 -179
- package/dist/ui/input-prompt-v2.js +0 -991
- package/dist/ui/model-warning-overlay.d.ts +0 -30
- package/dist/ui/model-warning-overlay.js +0 -171
- package/dist/ui/tools-overlay.d.ts +0 -26
- package/dist/ui/tools-overlay.js +0 -278
- package/dist/ui/tutorial-overlay.d.ts +0 -10
- package/dist/ui/tutorial-overlay.js +0 -936
package/dist/index.js
CHANGED
|
@@ -8,27 +8,48 @@ process.env.FORCE_COLOR = '3';
|
|
|
8
8
|
* AI-powered coding assistant CLI using @compilr-dev/agents.
|
|
9
9
|
* A terminal-based REPL for interacting with AI agents.
|
|
10
10
|
*/
|
|
11
|
+
import { perf, flushStartupPerf } from './utils/startup-perf.js';
|
|
12
|
+
perf('imports-start');
|
|
11
13
|
import { createAgent } from './agent.js';
|
|
12
|
-
import {
|
|
13
|
-
import
|
|
14
|
-
import
|
|
14
|
+
import { getModelForTier } from './models/index.js';
|
|
15
|
+
import { ReplV2 } from './repl-v2.js';
|
|
16
|
+
import { AgentTeam, setActiveSharedContext } from './multi-agent/index.js';
|
|
15
17
|
import { getStyles } from './themes/index.js';
|
|
16
|
-
import { getDefaultProvider, getDefaultModel as getDefaultModelSetting } from './settings/index.js';
|
|
17
|
-
import {
|
|
18
|
+
import { getDefaultProvider, getDefaultModel as getDefaultModelSetting, getProjectStartupMode, getLastProjectId, isCheckUpdatesEnabled, getLastUpdateCheck, recordUpdateCheck, isFirstRunComplete, setSetting, getSetting } from './settings/index.js';
|
|
19
|
+
import { checkForUpdates, performUpdate } from './utils/update-checker.js';
|
|
18
20
|
import { showAskUserSimpleOverlay } from './ui/ask-user-simple-overlay.js';
|
|
19
|
-
import { showPermissionOverlay } from './ui/permission-overlay.js';
|
|
20
|
-
import { showIterationLimitOverlay } from './ui/iteration-limit-overlay.js';
|
|
21
21
|
import { showKeysOverlay } from './ui/keys-overlay.js';
|
|
22
|
+
import { projectRepository, workItemRepository } from './db/repositories/index.js';
|
|
23
|
+
import { setActiveProject } from './tools/project-db.js';
|
|
24
|
+
import { getFullGuidedPrompt, shouldInjectGuidedContext, } from './workflow/index.js';
|
|
22
25
|
import { hasApiKey, settingsProviderToCredentialKey } from './utils/credentials.js';
|
|
23
|
-
import {
|
|
24
|
-
import {
|
|
25
|
-
import {
|
|
26
|
-
import
|
|
27
|
-
|
|
26
|
+
import { loadProjectMemory } from './utils/project-memory.js';
|
|
27
|
+
import { getGlobalAnchorManager, getAnchorManager } from './anchors/index.js';
|
|
28
|
+
import { getAuthManager } from './auth/index.js';
|
|
29
|
+
import { loadMCPConfig } from './settings/mcp-config.js';
|
|
30
|
+
import { isInVSCode } from './utils/vscode-detect.js';
|
|
31
|
+
import { cleanupStaleDiffs } from './ui/vscode-diff-ipc.js';
|
|
32
|
+
import { createPermissionHandler } from './handlers/permission-handler.js';
|
|
33
|
+
import { registerDelegationHandlers } from './handlers/delegation-handlers.js';
|
|
34
|
+
import { registerAskUserHandlers } from './handlers/ask-user-handlers.js';
|
|
35
|
+
import { EpisodeRecorder, FileEpisodeStore, setGlobalEpisodeStore } from './episodes/index.js';
|
|
36
|
+
import { updateWorkSummaryAnchor } from './episodes/work-summary-anchor.js';
|
|
37
|
+
import { getSessionsPath } from './settings/paths.js';
|
|
38
|
+
import * as path from 'path';
|
|
39
|
+
perf('imports-done');
|
|
40
|
+
const sharedState = {
|
|
41
|
+
mode: 'normal',
|
|
42
|
+
pendingSuggestion: null,
|
|
43
|
+
pendingDelegation: null,
|
|
44
|
+
vsDiffEnabled: false,
|
|
45
|
+
sessionPrefix: '',
|
|
46
|
+
vsDiffExtensionChecked: false,
|
|
47
|
+
};
|
|
28
48
|
// =============================================================================
|
|
29
49
|
// Version
|
|
30
50
|
// =============================================================================
|
|
31
|
-
|
|
51
|
+
import { VERSION } from './utils/version.js';
|
|
52
|
+
export { VERSION };
|
|
32
53
|
function parseArgs() {
|
|
33
54
|
const args = process.argv.slice(2);
|
|
34
55
|
const options = {};
|
|
@@ -46,6 +67,9 @@ function parseArgs() {
|
|
|
46
67
|
else if (arg === '--show-filtering') {
|
|
47
68
|
options.showFiltering = true;
|
|
48
69
|
}
|
|
70
|
+
else if (arg === '--update') {
|
|
71
|
+
options.update = true;
|
|
72
|
+
}
|
|
49
73
|
else if (arg === '--help' || arg === '-h') {
|
|
50
74
|
showHelp();
|
|
51
75
|
process.exit(0);
|
|
@@ -64,6 +88,7 @@ Options:
|
|
|
64
88
|
--model, -m <model> Model name (e.g., claude-3-5-haiku-20241022)
|
|
65
89
|
--minimal Use minimal tool set
|
|
66
90
|
--show-filtering Show tool filtering analysis
|
|
91
|
+
--update Check for and install updates
|
|
67
92
|
--help, -h Show this help
|
|
68
93
|
|
|
69
94
|
Environment Variables:
|
|
@@ -76,241 +101,652 @@ Examples:
|
|
|
76
101
|
npm run dev -- --model claude-3-5-haiku-20241022
|
|
77
102
|
npm run dev -- --provider gemini --model gemini-2.0-flash
|
|
78
103
|
npm run dev -- --minimal --show-filtering
|
|
104
|
+
npm run dev -- --update
|
|
79
105
|
`);
|
|
80
106
|
}
|
|
81
107
|
// =============================================================================
|
|
108
|
+
// MCP Initialization
|
|
109
|
+
// =============================================================================
|
|
110
|
+
/** MCPManager instance — stored at module level for /mcp command and cleanup */
|
|
111
|
+
let mcpManagerInstance = null;
|
|
112
|
+
async function createMCPManager(servers) {
|
|
113
|
+
// Dynamic import to avoid loading MCP code when not needed
|
|
114
|
+
perf('mcp-dynamic-import');
|
|
115
|
+
const { MCPManager } = await import('@compilr-dev/sdk');
|
|
116
|
+
perf('mcp-dynamic-import-done');
|
|
117
|
+
const manager = new MCPManager({ toolPrefix: 'mcp', autoConnect: true });
|
|
118
|
+
// Connect all servers in parallel — each addServer is independent
|
|
119
|
+
perf(`mcp-connect-${String(servers.length)}-servers`);
|
|
120
|
+
await Promise.allSettled(servers.map(server => manager.addServer(server)));
|
|
121
|
+
perf('mcp-connect-done');
|
|
122
|
+
return manager;
|
|
123
|
+
}
|
|
124
|
+
/**
|
|
125
|
+
* Initialize MCP servers and discover tools.
|
|
126
|
+
* Returns empty array if no servers configured or on error.
|
|
127
|
+
* Non-blocking: failures are silently ignored.
|
|
128
|
+
*/
|
|
129
|
+
async function initializeMCP(projectPath) {
|
|
130
|
+
const servers = loadMCPConfig(projectPath);
|
|
131
|
+
if (servers.length === 0) {
|
|
132
|
+
return [];
|
|
133
|
+
}
|
|
134
|
+
try {
|
|
135
|
+
const manager = await createMCPManager(servers);
|
|
136
|
+
mcpManagerInstance = manager;
|
|
137
|
+
perf('mcp-discover-tools');
|
|
138
|
+
const tools = await manager.discoverTools();
|
|
139
|
+
perf('mcp-discover-tools-done');
|
|
140
|
+
return tools;
|
|
141
|
+
}
|
|
142
|
+
catch {
|
|
143
|
+
// MCP initialization failed — continue without MCP tools
|
|
144
|
+
return [];
|
|
145
|
+
}
|
|
146
|
+
}
|
|
147
|
+
/** Get the MCPManager instance (for /mcp command) */
|
|
148
|
+
export function getMCPManager() {
|
|
149
|
+
return mcpManagerInstance;
|
|
150
|
+
}
|
|
151
|
+
/**
|
|
152
|
+
* Get or lazily create an MCPManager instance.
|
|
153
|
+
* When no servers were configured at startup, mcpManagerInstance is null.
|
|
154
|
+
* This creates one on demand so the /mcp overlay can add servers at runtime.
|
|
155
|
+
*/
|
|
156
|
+
export async function ensureMCPManager() {
|
|
157
|
+
if (mcpManagerInstance)
|
|
158
|
+
return mcpManagerInstance;
|
|
159
|
+
const { MCPManager: MCPManagerClass } = await import('@compilr-dev/sdk');
|
|
160
|
+
mcpManagerInstance = new MCPManagerClass({ toolPrefix: 'mcp', autoConnect: true });
|
|
161
|
+
return mcpManagerInstance;
|
|
162
|
+
}
|
|
163
|
+
// =============================================================================
|
|
82
164
|
// Main Entry Point
|
|
83
165
|
// =============================================================================
|
|
84
166
|
async function main() {
|
|
167
|
+
perf('main-start');
|
|
85
168
|
const options = parseArgs();
|
|
86
|
-
|
|
87
|
-
|
|
169
|
+
const s = getStyles();
|
|
170
|
+
// ==========================================================================
|
|
171
|
+
// Handle --update flag: perform update and exit
|
|
172
|
+
// ==========================================================================
|
|
173
|
+
if (options.update) {
|
|
174
|
+
console.log('Checking for updates...');
|
|
175
|
+
const updateInfo = await checkForUpdates();
|
|
176
|
+
if (updateInfo.updateAvailable) {
|
|
177
|
+
console.log(s.primary(`Update available: v${updateInfo.currentVersion} → v${updateInfo.latestVersion}`));
|
|
178
|
+
console.log('Installing update...\n');
|
|
179
|
+
const result = await performUpdate();
|
|
180
|
+
console.log(result.success ? s.success(result.message) : s.error(result.message));
|
|
181
|
+
}
|
|
182
|
+
else {
|
|
183
|
+
console.log(s.success(`You're on the latest version (v${updateInfo.currentVersion})`));
|
|
184
|
+
}
|
|
185
|
+
process.exit(0);
|
|
186
|
+
}
|
|
187
|
+
// ==========================================================================
|
|
188
|
+
// Update check (deferred to background — don't block startup)
|
|
189
|
+
// ==========================================================================
|
|
190
|
+
let updateAvailable = null;
|
|
191
|
+
// Fire update check in background (result used later if available before REPL starts)
|
|
192
|
+
let updateCheckPromise = null;
|
|
193
|
+
if (isCheckUpdatesEnabled()) {
|
|
194
|
+
const lastCheck = getLastUpdateCheck();
|
|
195
|
+
const oneDayAgo = Date.now() - 24 * 60 * 60 * 1000;
|
|
196
|
+
if (!lastCheck || lastCheck < oneDayAgo) {
|
|
197
|
+
updateCheckPromise = checkForUpdates()
|
|
198
|
+
.then((updateInfo) => {
|
|
199
|
+
recordUpdateCheck();
|
|
200
|
+
if (updateInfo.updateAvailable) {
|
|
201
|
+
updateAvailable = {
|
|
202
|
+
current: updateInfo.currentVersion,
|
|
203
|
+
latest: updateInfo.latestVersion,
|
|
204
|
+
};
|
|
205
|
+
}
|
|
206
|
+
})
|
|
207
|
+
.catch(() => {
|
|
208
|
+
// Silently ignore update check failures
|
|
209
|
+
});
|
|
210
|
+
}
|
|
211
|
+
}
|
|
212
|
+
// ==========================================================================
|
|
213
|
+
// VS Code diff IPC: clean up stale files from previous sessions
|
|
214
|
+
// ==========================================================================
|
|
215
|
+
perf('stale-diff-cleanup');
|
|
216
|
+
cleanupStaleDiffs(300_000); // 5 minutes
|
|
217
|
+
// ==========================================================================
|
|
218
|
+
// Authentication check (mandatory — but fast with API tokens)
|
|
219
|
+
// ==========================================================================
|
|
220
|
+
perf('auth-start');
|
|
221
|
+
const auth = getAuthManager();
|
|
222
|
+
const isAuthenticated = await auth.isAuthenticated();
|
|
223
|
+
perf('auth-done');
|
|
224
|
+
const showLogin = !isAuthenticated;
|
|
225
|
+
// Auth status is used by REPL to skip login overlay
|
|
226
|
+
// (email displayed in welcome banner, not here)
|
|
88
227
|
// Resolve provider: CLI arg > settings > auto-detect
|
|
89
228
|
const settingsProvider = getDefaultProvider();
|
|
90
|
-
|
|
229
|
+
let provider = options.provider
|
|
91
230
|
?? (settingsProvider !== 'auto' ? settingsProvider : null)
|
|
92
231
|
?? detectProvider();
|
|
93
232
|
// Resolve model: CLI arg > settings > provider default
|
|
94
233
|
const settingsModel = getDefaultModelSetting();
|
|
95
|
-
|
|
234
|
+
let model = options.model ?? settingsModel ?? getDefaultModel(provider);
|
|
96
235
|
// Check if API key is available for selected provider (skip for ollama)
|
|
97
236
|
if (provider !== 'ollama') {
|
|
98
237
|
const credentialKey = settingsProviderToCredentialKey(provider === 'claude' ? 'claude' : provider);
|
|
99
238
|
if (!hasApiKey(credentialKey)) {
|
|
100
|
-
const s = getStyles();
|
|
101
239
|
console.log(s.warning('⚠ No API key found for ' + provider));
|
|
102
240
|
console.log(s.muted(' Use --provider ollama for local models without an API key.'));
|
|
103
241
|
console.log('');
|
|
104
|
-
//
|
|
105
|
-
const
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
242
|
+
// Ask user what they want to do
|
|
243
|
+
const choice = await showAskUserSimpleOverlay({
|
|
244
|
+
question: 'What would you like to do?',
|
|
245
|
+
options: [
|
|
246
|
+
`Set API key for ${provider}`,
|
|
247
|
+
'Switch to a different provider',
|
|
248
|
+
],
|
|
249
|
+
});
|
|
250
|
+
if (choice.skipped) {
|
|
109
251
|
console.log(s.error('No API key configured. Cannot start.'));
|
|
110
|
-
console.log(s.muted(' Set a key with /keys or use: export ANTHROPIC_API_KEY=sk-ant-...'));
|
|
111
|
-
console.log('');
|
|
112
252
|
process.exit(1);
|
|
113
253
|
}
|
|
114
|
-
|
|
115
|
-
|
|
254
|
+
if (choice.answer.includes('Switch')) {
|
|
255
|
+
// Let user pick a different provider
|
|
256
|
+
const providerChoice = await showAskUserSimpleOverlay({
|
|
257
|
+
question: 'Select a provider:',
|
|
258
|
+
options: [
|
|
259
|
+
'Claude (Anthropic)',
|
|
260
|
+
'OpenAI (GPT)',
|
|
261
|
+
'Gemini (Google)',
|
|
262
|
+
'Ollama (local, no key needed)',
|
|
263
|
+
],
|
|
264
|
+
});
|
|
265
|
+
if (providerChoice.skipped) {
|
|
266
|
+
console.log(s.error('No provider selected. Cannot start.'));
|
|
267
|
+
process.exit(1);
|
|
268
|
+
}
|
|
269
|
+
// Map choice to provider
|
|
270
|
+
let newProvider;
|
|
271
|
+
if (providerChoice.answer.includes('Claude')) {
|
|
272
|
+
newProvider = 'claude';
|
|
273
|
+
}
|
|
274
|
+
else if (providerChoice.answer.includes('OpenAI')) {
|
|
275
|
+
newProvider = 'openai';
|
|
276
|
+
}
|
|
277
|
+
else if (providerChoice.answer.includes('Gemini')) {
|
|
278
|
+
newProvider = 'gemini';
|
|
279
|
+
}
|
|
280
|
+
else if (providerChoice.answer.includes('Ollama')) {
|
|
281
|
+
newProvider = 'ollama';
|
|
282
|
+
}
|
|
283
|
+
else {
|
|
284
|
+
newProvider = 'claude'; // Default fallback
|
|
285
|
+
}
|
|
286
|
+
// Update settings (provider AND model) and restart check
|
|
287
|
+
const newModel = getDefaultModel(newProvider);
|
|
288
|
+
setSetting('defaultProvider', newProvider);
|
|
289
|
+
setSetting('defaultModel', newModel);
|
|
290
|
+
provider = newProvider;
|
|
291
|
+
model = newModel;
|
|
292
|
+
console.log(s.success(`✓ Switched to ${newProvider} (${newModel})`));
|
|
293
|
+
console.log('');
|
|
294
|
+
// Re-check API key for new provider
|
|
295
|
+
if (newProvider !== 'ollama') {
|
|
296
|
+
const newCredKey = settingsProviderToCredentialKey(newProvider);
|
|
297
|
+
if (!hasApiKey(newCredKey)) {
|
|
298
|
+
console.log(s.warning(`⚠ No API key found for ${newProvider}`));
|
|
299
|
+
const result = await showKeysOverlay();
|
|
300
|
+
if (!result.changed || !hasApiKey(newCredKey)) {
|
|
301
|
+
console.log(s.error('No API key configured. Cannot start.'));
|
|
302
|
+
process.exit(1);
|
|
303
|
+
}
|
|
304
|
+
}
|
|
305
|
+
}
|
|
306
|
+
}
|
|
307
|
+
else {
|
|
308
|
+
// Show keys overlay to set API key
|
|
309
|
+
const result = await showKeysOverlay();
|
|
310
|
+
// Check again after overlay closes
|
|
311
|
+
if (!result.changed || !hasApiKey(credentialKey)) {
|
|
312
|
+
console.log('');
|
|
313
|
+
console.log(s.error('No API key configured. Cannot start.'));
|
|
314
|
+
console.log(s.muted(' Set a key with /keys or use: export ANTHROPIC_API_KEY=sk-ant-...'));
|
|
315
|
+
console.log('');
|
|
316
|
+
process.exit(1);
|
|
317
|
+
}
|
|
318
|
+
console.log(s.success('✓ API key configured'));
|
|
319
|
+
console.log('');
|
|
320
|
+
}
|
|
116
321
|
}
|
|
117
322
|
}
|
|
118
323
|
// Load project memory (COMPILR.md or CLAUDE.md)
|
|
324
|
+
perf('project-memory-start');
|
|
119
325
|
const projectMemory = loadProjectMemory();
|
|
120
326
|
let projectContext;
|
|
121
327
|
if (projectMemory.found && projectMemory.filePath) {
|
|
122
|
-
const s = getStyles();
|
|
123
|
-
const filename = projectMemory.filePath.split('/').pop() ?? 'COMPILR.md';
|
|
124
|
-
const sizeCategory = getSizeCategory(projectMemory.originalSize);
|
|
125
|
-
if (projectMemory.truncated) {
|
|
126
|
-
// Large file - was truncated
|
|
127
|
-
console.log(s.warning(`⚠ Loaded ${filename} (${formatBytes(projectMemory.originalSize)} → truncated to 100KB)`));
|
|
128
|
-
}
|
|
129
|
-
else if (sizeCategory === 'medium') {
|
|
130
|
-
// Medium file - loaded with note
|
|
131
|
-
console.log(s.muted(` Loaded ${filename} (${formatBytes(projectMemory.originalSize)}, ~${projectMemory.estimatedTokens.toLocaleString()} tokens)`));
|
|
132
|
-
}
|
|
133
|
-
else {
|
|
134
|
-
// Small file - loaded silently (just a subtle note)
|
|
135
|
-
console.log(s.muted(` Loaded ${filename}`));
|
|
136
|
-
}
|
|
137
328
|
projectContext = projectMemory.content;
|
|
138
329
|
}
|
|
139
|
-
//
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
330
|
+
// ==========================================================================
|
|
331
|
+
// Load guided mode context from database (if project uses guided mode)
|
|
332
|
+
// ==========================================================================
|
|
333
|
+
perf('project-db-start');
|
|
334
|
+
let guidedModeContext;
|
|
335
|
+
// Determine which project to load based on projectStartup setting
|
|
336
|
+
const projectStartupMode = getProjectStartupMode();
|
|
337
|
+
let dbProject = null;
|
|
338
|
+
if (projectStartupMode === 'last') {
|
|
339
|
+
// Try to load the last opened project
|
|
340
|
+
const lastProjectId = getLastProjectId();
|
|
341
|
+
if (lastProjectId !== null) {
|
|
342
|
+
dbProject = projectRepository.getById(lastProjectId);
|
|
343
|
+
// If last project no longer exists (deleted), don't auto-load any project
|
|
144
344
|
}
|
|
145
|
-
//
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
|
|
159
|
-
(typeof request.input.new_string === 'string' ? request.input.new_string : null) ||
|
|
160
|
-
(typeof request.input.new_text === 'string' ? request.input.new_text : null) || '');
|
|
161
|
-
const replaceAll = Boolean(request.input.replaceAll);
|
|
162
|
-
if (filePath && oldText && newText) {
|
|
163
|
-
const editDiff = diff.generateEditDiff(filePath, oldText, newText, replaceAll);
|
|
164
|
-
const s = getStyles();
|
|
165
|
-
terminal.writeLine('');
|
|
166
|
-
if (editDiff) {
|
|
167
|
-
terminal.writeLine(s.warning('● ') + chalk.bold(`Edit(${filePath.split('/').pop() ?? 'unknown'})`));
|
|
168
|
-
terminal.writeLine(diff.formatDiffHeader(filePath, editDiff.additions, editDiff.removals));
|
|
169
|
-
for (const line of editDiff.lines) {
|
|
170
|
-
terminal.writeLine(line);
|
|
171
|
-
}
|
|
172
|
-
terminal.writeLine('');
|
|
173
|
-
}
|
|
174
|
-
else {
|
|
175
|
-
// Fallback: show simple edit info
|
|
176
|
-
terminal.writeLine(s.warning('● ') + chalk.bold(`Edit(${filePath.split('/').pop() ?? 'unknown'})`));
|
|
177
|
-
terminal.writeLine(` ${s.muted('⎿')} Will replace text in ${s.primary(filePath.split('/').pop() ?? filePath)}`);
|
|
178
|
-
terminal.writeLine(` ${chalk.bgRed.white(' - ')} ${s.muted(oldText.slice(0, 60))}${oldText.length > 60 ? '...' : ''}`);
|
|
179
|
-
terminal.writeLine(` ${chalk.bgGreen.black(' + ')} ${s.muted(newText.slice(0, 60))}${newText.length > 60 ? '...' : ''}`);
|
|
180
|
-
terminal.writeLine('');
|
|
181
|
-
}
|
|
345
|
+
// If no lastProjectId remembered, don't auto-load any project
|
|
346
|
+
}
|
|
347
|
+
// else projectStartupMode === 'off': don't auto-load any project
|
|
348
|
+
if (dbProject) {
|
|
349
|
+
// Set as active project for tools to use
|
|
350
|
+
setActiveProject({ id: dbProject.id, name: dbProject.name, displayName: dbProject.displayName, path: dbProject.path });
|
|
351
|
+
// If in guided mode, generate context
|
|
352
|
+
if (shouldInjectGuidedContext(dbProject)) {
|
|
353
|
+
// Get work item counts
|
|
354
|
+
const statusCounts = workItemRepository.getStatusCounts(dbProject.id);
|
|
355
|
+
// Get current work item if set
|
|
356
|
+
let currentItem = null;
|
|
357
|
+
if (dbProject.currentItemId) {
|
|
358
|
+
currentItem = workItemRepository.getByItemId(dbProject.id, dbProject.currentItemId);
|
|
182
359
|
}
|
|
183
|
-
|
|
184
|
-
|
|
185
|
-
|
|
186
|
-
|
|
187
|
-
|
|
188
|
-
|
|
189
|
-
|
|
190
|
-
|
|
191
|
-
|
|
192
|
-
|
|
193
|
-
// Switch to auto-accept mode so user can see and toggle back if needed
|
|
194
|
-
sharedState.setMode?.('auto-accept');
|
|
360
|
+
else {
|
|
361
|
+
// Look for any in-progress item
|
|
362
|
+
const inProgressItems = workItemRepository.query({
|
|
363
|
+
project_id: dbProject.id,
|
|
364
|
+
status: 'in_progress',
|
|
365
|
+
limit: 1,
|
|
366
|
+
});
|
|
367
|
+
if (inProgressItems.items.length > 0) {
|
|
368
|
+
currentItem = inProgressItems.items[0];
|
|
369
|
+
}
|
|
195
370
|
}
|
|
196
|
-
//
|
|
197
|
-
|
|
198
|
-
|
|
199
|
-
|
|
200
|
-
|
|
201
|
-
|
|
202
|
-
|
|
203
|
-
|
|
204
|
-
|
|
205
|
-
// Register ask_user handler that coordinates with footer
|
|
206
|
-
registerAskUserHandler(async (input) => {
|
|
207
|
-
// Pause footer to prevent interference with the overlay
|
|
208
|
-
sharedState.pauseFooter?.();
|
|
209
|
-
try {
|
|
210
|
-
// Show the overlay and get answers
|
|
211
|
-
const result = await showAskUserOverlay({
|
|
212
|
-
questions: input.questions,
|
|
213
|
-
context: input.context,
|
|
214
|
-
});
|
|
215
|
-
return result;
|
|
216
|
-
}
|
|
217
|
-
finally {
|
|
218
|
-
// Resume footer after overlay closes
|
|
219
|
-
sharedState.resumeFooter?.();
|
|
371
|
+
// Generate guided mode context
|
|
372
|
+
const contextOptions = {
|
|
373
|
+
project: dbProject,
|
|
374
|
+
currentItem,
|
|
375
|
+
backlogCount: statusCounts.backlog,
|
|
376
|
+
inProgressCount: statusCounts.in_progress,
|
|
377
|
+
completedCount: statusCounts.completed,
|
|
378
|
+
};
|
|
379
|
+
guidedModeContext = getFullGuidedPrompt(contextOptions);
|
|
220
380
|
}
|
|
221
|
-
}
|
|
222
|
-
//
|
|
223
|
-
|
|
224
|
-
|
|
225
|
-
|
|
226
|
-
|
|
227
|
-
|
|
228
|
-
|
|
229
|
-
|
|
230
|
-
|
|
231
|
-
|
|
232
|
-
|
|
233
|
-
|
|
234
|
-
|
|
235
|
-
|
|
236
|
-
|
|
237
|
-
|
|
238
|
-
|
|
239
|
-
|
|
381
|
+
}
|
|
382
|
+
// ==========================================================================
|
|
383
|
+
// Load persisted anchors (critical info that survives compaction)
|
|
384
|
+
// ==========================================================================
|
|
385
|
+
perf('anchors-start');
|
|
386
|
+
// Load global anchors (always)
|
|
387
|
+
const globalAnchors = getGlobalAnchorManager().getAll({ scope: 'persistent' });
|
|
388
|
+
// Load project-specific anchors (if in a tracked project)
|
|
389
|
+
const projectAnchors = dbProject
|
|
390
|
+
? getAnchorManager(String(dbProject.id)).getAll({ scope: 'persistent' })
|
|
391
|
+
: [];
|
|
392
|
+
// Combine into persistedAnchors array for agent
|
|
393
|
+
const persistedAnchors = [
|
|
394
|
+
...globalAnchors.map((a) => ({
|
|
395
|
+
id: a.id,
|
|
396
|
+
content: a.content,
|
|
397
|
+
priority: a.priority,
|
|
398
|
+
scope: a.scope,
|
|
399
|
+
tags: a.tags,
|
|
400
|
+
})),
|
|
401
|
+
...projectAnchors.map((a) => ({
|
|
402
|
+
id: a.id,
|
|
403
|
+
content: a.content,
|
|
404
|
+
priority: a.priority,
|
|
405
|
+
scope: a.scope,
|
|
406
|
+
tags: a.tags,
|
|
407
|
+
projectId: String(dbProject?.id),
|
|
408
|
+
})),
|
|
409
|
+
];
|
|
410
|
+
// ==========================================================================
|
|
411
|
+
// Create handlers and agent BEFORE menu (so menu can access agent info)
|
|
412
|
+
// ==========================================================================
|
|
413
|
+
perf('handlers-start');
|
|
414
|
+
// Create permission handler that respects mode state and custom rules
|
|
415
|
+
const onPermissionRequest = createPermissionHandler(sharedState);
|
|
416
|
+
// Register ask_user and ask_user_simple handlers
|
|
417
|
+
registerAskUserHandlers(sharedState);
|
|
418
|
+
// Register delegate, delegate_background, and handoff handlers for multi-agent delegation
|
|
419
|
+
registerDelegationHandlers(sharedState);
|
|
240
420
|
// Create iteration limit handler that shows overlay
|
|
241
421
|
const onIterationLimitReached = async (context) => {
|
|
242
|
-
//
|
|
243
|
-
|
|
244
|
-
|
|
245
|
-
|
|
246
|
-
|
|
247
|
-
|
|
248
|
-
|
|
249
|
-
toolCallCount: context.toolCallCount,
|
|
250
|
-
});
|
|
251
|
-
if (result.continue) {
|
|
252
|
-
return result.additionalIterations;
|
|
253
|
-
}
|
|
254
|
-
return false;
|
|
422
|
+
// Wait for event loop to process any pending tool_end events
|
|
423
|
+
await new Promise((resolve) => setImmediate(resolve));
|
|
424
|
+
// Flush any accumulated text BEFORE showing the overlay
|
|
425
|
+
sharedState.flushTextBuffer?.();
|
|
426
|
+
// Use TerminalUI overlay system
|
|
427
|
+
if (!sharedState.showIterationLimitOverlayV2) {
|
|
428
|
+
throw new Error('iteration_limit overlay not initialized');
|
|
255
429
|
}
|
|
256
|
-
|
|
257
|
-
|
|
258
|
-
|
|
259
|
-
|
|
430
|
+
const result = await sharedState.showIterationLimitOverlayV2({
|
|
431
|
+
iteration: context.iteration,
|
|
432
|
+
maxIterations: context.maxIterations,
|
|
433
|
+
toolCallCount: context.toolCallCount,
|
|
434
|
+
});
|
|
435
|
+
if (result.continue) {
|
|
436
|
+
return result.additionalIterations;
|
|
260
437
|
}
|
|
438
|
+
return false;
|
|
439
|
+
};
|
|
440
|
+
// Create guardrail confirmation handler (for risky operations that need approval)
|
|
441
|
+
const onGuardrailTriggered = async (result, context) => {
|
|
442
|
+
// Wait for event loop to process any pending events
|
|
443
|
+
await new Promise((resolve) => setImmediate(resolve));
|
|
444
|
+
// Flush any accumulated text BEFORE showing the overlay
|
|
445
|
+
sharedState.flushTextBuffer?.();
|
|
446
|
+
const overlayOptions = {
|
|
447
|
+
name: result.guardrail?.name ?? 'Unknown Guardrail',
|
|
448
|
+
message: result.guardrail?.message ?? 'This operation requires confirmation.',
|
|
449
|
+
action: result.guardrail?.action ?? 'confirm',
|
|
450
|
+
toolName: context.toolName,
|
|
451
|
+
matchedInput: result.match ?? context.inputString,
|
|
452
|
+
category: result.guardrail?.tags?.[0],
|
|
453
|
+
};
|
|
454
|
+
// Use TerminalUI overlay system
|
|
455
|
+
if (!sharedState.showGuardrailOverlayV2) {
|
|
456
|
+
throw new Error('guardrail overlay not initialized');
|
|
457
|
+
}
|
|
458
|
+
const overlayResult = await sharedState.showGuardrailOverlayV2(overlayOptions);
|
|
459
|
+
return overlayResult.approved;
|
|
460
|
+
};
|
|
461
|
+
// ==========================================================================
|
|
462
|
+
// MCP Server Initialization (deferred — connects in background after REPL starts)
|
|
463
|
+
// ==========================================================================
|
|
464
|
+
perf('mcp-init-fire');
|
|
465
|
+
// Check if there are MCP servers to connect — fire the promise but don't await yet
|
|
466
|
+
const mcpServerCount = loadMCPConfig(dbProject?.path).length;
|
|
467
|
+
const mcpInitPromise = mcpServerCount > 0 ? initializeMCP(dbProject?.path) : null;
|
|
468
|
+
// Mutable ref for MCP tools — read by team agent factory when creating new agents.
|
|
469
|
+
// Updated when background MCP init completes.
|
|
470
|
+
let mcpToolsRef = [];
|
|
471
|
+
// ==========================================================================
|
|
472
|
+
// Episode Recorder Setup (work history tracking)
|
|
473
|
+
// ==========================================================================
|
|
474
|
+
const createEpisodeRecorder = (agentId) => {
|
|
475
|
+
if (!dbProject)
|
|
476
|
+
return undefined;
|
|
477
|
+
const episodesPath = path.join(getSessionsPath(), `project-${String(dbProject.id)}`, 'episodes.json');
|
|
478
|
+
const store = new FileEpisodeStore({ filePath: episodesPath });
|
|
479
|
+
// Set global store for recall_work tool access
|
|
480
|
+
setGlobalEpisodeStore(store);
|
|
481
|
+
return new EpisodeRecorder({
|
|
482
|
+
store,
|
|
483
|
+
agentId,
|
|
484
|
+
terminalPrefix: sharedState.sessionPrefix || 'unknown',
|
|
485
|
+
sessionId: sharedState.sessionPrefix || 'unknown',
|
|
486
|
+
onBatchFlushed: () => {
|
|
487
|
+
updateWorkSummaryAnchor({
|
|
488
|
+
store,
|
|
489
|
+
projectId: String(dbProject.id),
|
|
490
|
+
getAnchorManager,
|
|
491
|
+
});
|
|
492
|
+
},
|
|
493
|
+
});
|
|
261
494
|
};
|
|
262
|
-
|
|
495
|
+
const defaultEpisodeRecorder = createEpisodeRecorder('default');
|
|
496
|
+
// Create agent with permission handler and suggestion callback (no MCP tools yet)
|
|
497
|
+
perf('create-agent-start');
|
|
263
498
|
const agent = createAgent({
|
|
264
499
|
provider,
|
|
265
500
|
model,
|
|
266
501
|
minimal: options.minimal,
|
|
502
|
+
quiet: true,
|
|
503
|
+
enableMetaTools: !options.minimal, // Use meta-tools for token optimization
|
|
267
504
|
onPermissionRequest,
|
|
268
505
|
onIterationLimitReached,
|
|
269
506
|
onSuggest: (event) => {
|
|
270
507
|
// Store suggestion to be applied after agent finishes
|
|
271
508
|
sharedState.pendingSuggestion = event.action;
|
|
272
509
|
},
|
|
510
|
+
projectName: dbProject?.displayName,
|
|
273
511
|
projectContext,
|
|
512
|
+
guidedModeContext,
|
|
513
|
+
// Anchors - library handles re-injection on every LLM call
|
|
514
|
+
enableAnchors: true,
|
|
515
|
+
persistedAnchors: persistedAnchors.length > 0 ? persistedAnchors : undefined,
|
|
516
|
+
// Guardrails - 15 built-in safety patterns for risky operations
|
|
517
|
+
// Warnings are emitted as 'guardrail_warning' events and handled by REPL
|
|
518
|
+
enableGuardrails: true,
|
|
519
|
+
onGuardrailTriggered,
|
|
520
|
+
// Subagent tracking callbacks (forwarded to footer via sharedState)
|
|
521
|
+
// Now using toolUseId for direct correlation (no more FIFO matching)
|
|
522
|
+
onSubagentStart: (toolUseId, agentType, description) => {
|
|
523
|
+
sharedState.onSubagentStart?.(toolUseId, agentType, description);
|
|
524
|
+
},
|
|
525
|
+
onSubagentEnd: (toolUseId, success, tokenCount, error) => {
|
|
526
|
+
sharedState.onSubagentEnd?.(toolUseId, success, tokenCount, error);
|
|
527
|
+
},
|
|
528
|
+
onSubagentToolUse: (toolUseId, toolName, summary) => {
|
|
529
|
+
sharedState.onSubagentToolUse?.(toolUseId, toolName, summary);
|
|
530
|
+
},
|
|
531
|
+
// Receive function to clear subagent tracking between runs
|
|
532
|
+
onSubagentTrackingReady: (clearTracking) => {
|
|
533
|
+
sharedState.clearSubagentTracking = clearTracking;
|
|
534
|
+
},
|
|
535
|
+
// MCP tools injected later via agent.registerTools() when background init completes
|
|
536
|
+
// Episode recorder for work history tracking
|
|
537
|
+
episodeRecorder: defaultEpisodeRecorder,
|
|
274
538
|
});
|
|
539
|
+
perf('create-agent-done');
|
|
275
540
|
// Bind grantSession for the permission handler to use
|
|
276
541
|
sharedState.grantSession = (toolName) => {
|
|
277
542
|
agent.grantSessionPermission(toolName);
|
|
278
543
|
};
|
|
279
|
-
//
|
|
280
|
-
// Create
|
|
281
|
-
|
|
544
|
+
// ==========================================================================
|
|
545
|
+
// Create AgentTeam with the default agent (or restore from persistence)
|
|
546
|
+
// ==========================================================================
|
|
547
|
+
perf('team-setup-start');
|
|
548
|
+
// Define agent factory for creating team agents
|
|
549
|
+
const agentFactory = (_config, systemPromptAddition, useMinimalSystemPrompt, noTools, toolFilter, modelTier) => {
|
|
550
|
+
// Resolve model from tier if provided, otherwise use global model
|
|
551
|
+
const agentModel = modelTier ? getModelForTier(provider, modelTier) : model;
|
|
552
|
+
// Create new agent with same base options plus role-specific system prompt
|
|
553
|
+
return Promise.resolve(createAgent({
|
|
554
|
+
provider,
|
|
555
|
+
model: agentModel,
|
|
556
|
+
minimal: options.minimal,
|
|
557
|
+
enableMetaTools: !options.minimal && !noTools, // Disable meta-tools if noTools is set
|
|
558
|
+
onPermissionRequest,
|
|
559
|
+
onIterationLimitReached,
|
|
560
|
+
onSuggest: (event) => {
|
|
561
|
+
sharedState.pendingSuggestion = event.action;
|
|
562
|
+
},
|
|
563
|
+
projectName: dbProject?.displayName,
|
|
564
|
+
projectContext,
|
|
565
|
+
guidedModeContext,
|
|
566
|
+
enableAnchors: true,
|
|
567
|
+
persistedAnchors: persistedAnchors.length > 0 ? persistedAnchors : undefined,
|
|
568
|
+
enableGuardrails: true,
|
|
569
|
+
onGuardrailTriggered,
|
|
570
|
+
onSubagentStart: (toolUseId, agentType, description) => {
|
|
571
|
+
sharedState.onSubagentStart?.(toolUseId, agentType, description);
|
|
572
|
+
},
|
|
573
|
+
onSubagentEnd: (toolUseId, success, tokenCount, error) => {
|
|
574
|
+
sharedState.onSubagentEnd?.(toolUseId, success, tokenCount, error);
|
|
575
|
+
},
|
|
576
|
+
onSubagentToolUse: (toolUseId, toolName, summary) => {
|
|
577
|
+
sharedState.onSubagentToolUse?.(toolUseId, toolName, summary);
|
|
578
|
+
},
|
|
579
|
+
onSubagentTrackingReady: (clearTracking) => {
|
|
580
|
+
sharedState.clearSubagentTracking = clearTracking;
|
|
581
|
+
},
|
|
582
|
+
// Add role-specific system prompt
|
|
583
|
+
systemPromptAddition,
|
|
584
|
+
// Use minimal system prompt (skip all modules) - for testing role identity
|
|
585
|
+
useMinimalSystemPrompt,
|
|
586
|
+
// Skip all tool registration - for testing role identity without tool interference
|
|
587
|
+
noTools,
|
|
588
|
+
// Tool filter - limit which tools this agent can use
|
|
589
|
+
toolFilter,
|
|
590
|
+
// MCP tools from external servers (reads mutable ref — includes tools once MCP init completes)
|
|
591
|
+
mcpTools: mcpToolsRef.length > 0 ? mcpToolsRef : undefined,
|
|
592
|
+
// Suppress startup logs for team agents (avoid UI interference)
|
|
593
|
+
quiet: true,
|
|
594
|
+
// Episode recorder for work history tracking (team agents share project store)
|
|
595
|
+
episodeRecorder: createEpisodeRecorder('team-agent'),
|
|
596
|
+
}));
|
|
597
|
+
};
|
|
598
|
+
// Create fresh team — team restoration happens through session restore in ReplV2.
|
|
599
|
+
// This ensures team state is always bound to a session (no independent team loading).
|
|
600
|
+
const team = new AgentTeam({
|
|
601
|
+
name: 'Team',
|
|
602
|
+
agentFactory,
|
|
603
|
+
});
|
|
604
|
+
team.setDefaultAgent(agent);
|
|
605
|
+
// Set the active shared context for activity recording
|
|
606
|
+
setActiveSharedContext(team.sharedContext);
|
|
607
|
+
// Populate shared context with actual project info so agents know the project name
|
|
608
|
+
if (dbProject) {
|
|
609
|
+
team.sharedContext.setProject({
|
|
610
|
+
id: dbProject.id,
|
|
611
|
+
name: dbProject.displayName,
|
|
612
|
+
path: dbProject.path,
|
|
613
|
+
});
|
|
614
|
+
}
|
|
615
|
+
// ==========================================================================
|
|
616
|
+
// Create and run REPL
|
|
617
|
+
// ==========================================================================
|
|
618
|
+
perf('repl-setup-start');
|
|
619
|
+
// Store team reference in sharedState for delegate handler access
|
|
620
|
+
sharedState.team = team;
|
|
621
|
+
// Await background update check (ran in parallel with auth + project loading)
|
|
622
|
+
if (updateCheckPromise) {
|
|
623
|
+
perf('update-check-wait');
|
|
624
|
+
await updateCheckPromise;
|
|
625
|
+
perf('update-check-done');
|
|
626
|
+
}
|
|
627
|
+
// VS Code diff: set enabled state based on settings + environment
|
|
628
|
+
perf('vscode-detect');
|
|
629
|
+
sharedState.vsDiffEnabled = isInVSCode() && getSetting('vsDiffExtension');
|
|
630
|
+
perf('repl-v2-create');
|
|
631
|
+
const replV2 = new ReplV2({
|
|
282
632
|
agent,
|
|
633
|
+
team,
|
|
634
|
+
agentFactory,
|
|
283
635
|
model,
|
|
284
636
|
provider,
|
|
285
637
|
version: VERSION,
|
|
286
|
-
|
|
287
|
-
|
|
288
|
-
|
|
638
|
+
updateAvailable,
|
|
639
|
+
projectName: dbProject?.displayName ?? process.cwd().split('/').pop(),
|
|
640
|
+
// Set up V2 permission overlay callback when UI is ready
|
|
641
|
+
onUIReady: (showOverlay) => {
|
|
642
|
+
sharedState.showPermissionOverlayV2 = showOverlay;
|
|
643
|
+
},
|
|
644
|
+
// Set up text buffer flush callback for V2 mode
|
|
645
|
+
onTextBufferReady: (flushTextBuffer) => {
|
|
646
|
+
sharedState.flushTextBuffer = flushTextBuffer;
|
|
647
|
+
},
|
|
648
|
+
// Set up ask_user_simple V2 overlay callback
|
|
649
|
+
onAskUserSimpleReady: (showOverlay) => {
|
|
650
|
+
sharedState.showAskUserSimpleOverlayV2 = showOverlay;
|
|
651
|
+
},
|
|
652
|
+
// Set up guardrail V2 overlay callback
|
|
653
|
+
onGuardrailReady: (showOverlay) => {
|
|
654
|
+
sharedState.showGuardrailOverlayV2 = showOverlay;
|
|
655
|
+
},
|
|
656
|
+
// Set up ask_user V2 overlay callback
|
|
657
|
+
onAskUserReady: (showOverlay) => {
|
|
658
|
+
sharedState.showAskUserOverlayV2 = showOverlay;
|
|
289
659
|
},
|
|
290
|
-
|
|
291
|
-
|
|
292
|
-
sharedState.
|
|
660
|
+
// Set up iteration_limit V2 overlay callback
|
|
661
|
+
onIterationLimitReady: (showOverlay) => {
|
|
662
|
+
sharedState.showIterationLimitOverlayV2 = showOverlay;
|
|
663
|
+
},
|
|
664
|
+
// Set up delegate V2 overlay callback
|
|
665
|
+
onDelegateReady: (showOverlay) => {
|
|
666
|
+
sharedState.showDelegateOverlayV2 = showOverlay;
|
|
667
|
+
},
|
|
668
|
+
// Callback to handle pending delegation after agent finishes
|
|
669
|
+
onPendingDelegation: () => {
|
|
670
|
+
const pending = sharedState.pendingDelegation;
|
|
671
|
+
sharedState.pendingDelegation = null;
|
|
672
|
+
return pending ?? null;
|
|
673
|
+
},
|
|
674
|
+
// Set up subagent tracking callbacks for LiveRegion rendering
|
|
675
|
+
onSubagentReady: (callbacks) => {
|
|
676
|
+
sharedState.onSubagentStart = callbacks.onStart;
|
|
677
|
+
sharedState.onSubagentToolUse = callbacks.onToolUse;
|
|
678
|
+
sharedState.onSubagentEnd = callbacks.onEnd;
|
|
679
|
+
},
|
|
680
|
+
// Pass function to clear agent.ts subagent tracking between runs
|
|
681
|
+
clearSubagentTracking: sharedState.clearSubagentTracking,
|
|
682
|
+
// Set up suggestion callback when UI is ready
|
|
683
|
+
onSuggestionReady: (setSuggestion) => {
|
|
293
684
|
sharedState.setSuggestion = setSuggestion;
|
|
294
685
|
},
|
|
686
|
+
// Apply pending suggestions when agent finishes
|
|
295
687
|
onAgentFinish: () => {
|
|
296
|
-
// Apply any pending suggestion now that agent has finished
|
|
297
688
|
if (sharedState.pendingSuggestion) {
|
|
298
689
|
sharedState.setSuggestion?.(sharedState.pendingSuggestion);
|
|
299
690
|
sharedState.pendingSuggestion = null;
|
|
300
691
|
}
|
|
301
692
|
},
|
|
693
|
+
// Phase 3b: Set up background agent tracking callbacks for permission routing
|
|
694
|
+
onBackgroundAgentReady: (callbacks) => {
|
|
695
|
+
sharedState.isBackgroundAgent = callbacks.isBackgroundAgent;
|
|
696
|
+
sharedState.getActiveBackgroundAgentId = callbacks.getActiveBackgroundAgentId;
|
|
697
|
+
sharedState.getBackgroundAgentInfo = callbacks.getBackgroundAgentInfo;
|
|
698
|
+
},
|
|
699
|
+
// Phase 3d-beta: Set up background delegation callback for coordinator mode
|
|
700
|
+
onBackgroundDelegationReady: (runDelegation) => {
|
|
701
|
+
sharedState.runBackgroundDelegation = runDelegation;
|
|
702
|
+
},
|
|
703
|
+
// Update sharedState.team when session restore replaces the team object
|
|
704
|
+
// (so delegation handlers see restored agents, not just 'default')
|
|
705
|
+
onTeamReplaced: (newTeam) => {
|
|
706
|
+
sharedState.team = newTeam;
|
|
707
|
+
},
|
|
708
|
+
// Set session prefix for VS Code diff IPC after session registration
|
|
709
|
+
onSessionRegistered: (sessionId) => {
|
|
710
|
+
sharedState.sessionPrefix = sessionId.slice(0, 8);
|
|
711
|
+
},
|
|
712
|
+
// Show onboarding wizard on first run
|
|
713
|
+
showOnboarding: !isFirstRunComplete(),
|
|
714
|
+
// Show login overlay if not authenticated
|
|
715
|
+
showLogin,
|
|
302
716
|
});
|
|
303
|
-
// Bind setMode for the permission handler to use
|
|
304
|
-
sharedState.setMode = (mode) => {
|
|
305
|
-
repl.setMode(mode);
|
|
306
|
-
};
|
|
307
717
|
// Handle Ctrl+C gracefully
|
|
308
718
|
process.on('SIGINT', () => {
|
|
309
|
-
|
|
719
|
+
// Flush episode recorder before exit
|
|
720
|
+
defaultEpisodeRecorder?.flush();
|
|
721
|
+
replV2.stop();
|
|
722
|
+
// Clean up MCP servers (kill child processes)
|
|
723
|
+
void mcpManagerInstance?.disconnectAll();
|
|
310
724
|
process.exit(0);
|
|
311
725
|
});
|
|
312
|
-
|
|
313
|
-
|
|
726
|
+
perf('repl-v2-start');
|
|
727
|
+
replV2.start();
|
|
728
|
+
perf('startup-complete');
|
|
729
|
+
flushStartupPerf();
|
|
730
|
+
// Complete MCP initialization in background — inject tools once connected.
|
|
731
|
+
// Shows "mcp: connecting..." in footer status bar while loading.
|
|
732
|
+
// MCP timing details available in ~/.compilr-dev/startup-perf.log.
|
|
733
|
+
if (mcpInitPromise) {
|
|
734
|
+
replV2.setMCPLoading(true);
|
|
735
|
+
mcpInitPromise
|
|
736
|
+
.then((tools) => {
|
|
737
|
+
perf('mcp-background-done');
|
|
738
|
+
replV2.setMCPLoading(false, tools.length);
|
|
739
|
+
if (tools.length > 0) {
|
|
740
|
+
agent.registerTools(tools);
|
|
741
|
+
mcpToolsRef = tools;
|
|
742
|
+
}
|
|
743
|
+
})
|
|
744
|
+
.catch(() => {
|
|
745
|
+
// MCP failure is non-fatal — agent works without MCP tools
|
|
746
|
+
replV2.setMCPLoading(false);
|
|
747
|
+
});
|
|
748
|
+
}
|
|
749
|
+
// REPL V2 runs in event loop - the ReplV2 manages its own lifecycle
|
|
314
750
|
}
|
|
315
751
|
// =============================================================================
|
|
316
752
|
// Provider Detection
|
|
@@ -328,15 +764,15 @@ function detectProvider() {
|
|
|
328
764
|
function getDefaultModel(provider) {
|
|
329
765
|
switch (provider) {
|
|
330
766
|
case 'claude':
|
|
331
|
-
return 'claude-sonnet-4-
|
|
767
|
+
return 'claude-sonnet-4-5-20250929';
|
|
332
768
|
case 'openai':
|
|
333
|
-
return 'gpt-
|
|
769
|
+
return 'gpt-5-mini-2025-08-07';
|
|
334
770
|
case 'gemini':
|
|
335
|
-
return 'gemini-
|
|
771
|
+
return 'gemini-3-flash-preview';
|
|
336
772
|
case 'ollama':
|
|
337
|
-
return 'llama3.2';
|
|
773
|
+
return 'llama3.2:8b';
|
|
338
774
|
default:
|
|
339
|
-
return 'claude-sonnet-4-
|
|
775
|
+
return 'claude-sonnet-4-5-20250929';
|
|
340
776
|
}
|
|
341
777
|
}
|
|
342
778
|
// =============================================================================
|