@compilr-dev/cli 0.5.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 +236 -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 +61 -4
- package/dist/agent.js +241 -245
- package/dist/anchors/index.d.ts +1 -1
- package/dist/anchors/index.js +1 -1
- package/dist/anchors/project-anchors.d.ts +2 -2
- package/dist/anchors/project-anchors.js +1 -1
- 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-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.js +266 -81
- package/dist/commands-v2/handlers/core.d.ts +1 -0
- package/dist/commands-v2/handlers/core.js +133 -8
- package/dist/commands-v2/handlers/debug.js +18 -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 +13 -0
- package/dist/commands-v2/handlers/index.js +39 -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.js +244 -23
- 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 +2 -0
- package/dist/commands-v2/handlers/settings.js +217 -35
- 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 +3 -2
- package/dist/commands-v2/index.js +4 -1
- package/dist/commands-v2/registry.d.ts +15 -0
- package/dist/commands-v2/registry.js +34 -0
- package/dist/commands-v2/types.d.ts +81 -3
- package/dist/commands.js +13 -0
- 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 +448 -271
- package/dist/input-handlers/memory-handler.d.ts +1 -1
- package/dist/input-handlers/memory-handler.js +2 -1
- 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.js +3 -2
- package/dist/repl-v2.d.ts +401 -2
- package/dist/repl-v2.js +2577 -65
- 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 +133 -13
- package/dist/settings/index.js +329 -24
- package/dist/settings/mcp-config.d.ts +76 -0
- package/dist/settings/mcp-config.js +143 -0
- package/dist/settings/paths.d.ts +4 -0
- package/dist/settings/paths.js +6 -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 -61
- package/dist/templates/config-json.d.ts +1 -25
- package/dist/templates/index.d.ts +2 -0
- package/dist/templates/index.js +34 -73
- package/dist/tool-names.d.ts +108 -0
- package/dist/tool-names.js +227 -0
- package/dist/tools/anchor-tools.d.ts +4 -4
- package/dist/tools/anchor-tools.js +1 -1
- 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 +5 -3
- package/dist/tools/backlog-wrappers.js +16 -1
- package/dist/tools/backlog.d.ts +2 -2
- package/dist/tools/backlog.js +1 -1
- package/dist/tools/db-tools.d.ts +8 -61
- package/dist/tools/db-tools.js +8 -13
- 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 +5 -5
- package/dist/tools/document-db.js +1 -1
- 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 +5 -73
- package/dist/tools/project-db.js +5 -336
- 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 +43 -11
- package/dist/tools/workitem-db.js +186 -5
- package/dist/tools.d.ts +67 -2
- package/dist/tools.js +237 -47
- package/dist/ui/autocomplete-controller.d.ts +42 -0
- package/dist/ui/autocomplete-controller.js +384 -0
- package/dist/ui/base/index.d.ts +1 -1
- package/dist/ui/base/index.js +1 -1
- package/dist/ui/base/overlay-base-v2.d.ts +10 -0
- package/dist/ui/base/overlay-base-v2.js +14 -0
- package/dist/ui/base/render-utils.d.ts +19 -0
- package/dist/ui/base/render-utils.js +25 -0
- package/dist/ui/base/tabbed-list-overlay-v2.d.ts +16 -1
- package/dist/ui/base/tabbed-list-overlay-v2.js +19 -1
- 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.js +11 -13
- package/dist/ui/diff.d.ts +7 -1
- package/dist/ui/diff.js +85 -48
- package/dist/ui/ephemeral.js +3 -9
- 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 +74 -7
- package/dist/ui/footer.js +173 -16
- package/dist/ui/input-controller.d.ts +51 -0
- package/dist/ui/input-controller.js +176 -0
- package/dist/ui/input-prompt.d.ts +19 -0
- package/dist/ui/input-prompt.js +206 -14
- package/dist/ui/keyboard-handler.d.ts +57 -0
- package/dist/ui/keyboard-handler.js +557 -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 +0 -4
- package/dist/ui/live-region.js +6 -14
- package/dist/ui/mascot/renderer.d.ts +1 -1
- package/dist/ui/mascot/renderer.js +37 -2
- 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.js +6 -17
- package/dist/ui/overlay/impl/anchors-overlay-v2.js +30 -64
- 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.js +2 -5
- 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 +4 -1
- package/dist/ui/overlay/impl/backlog-overlay-v2.js +55 -16
- 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.js +4 -6
- package/dist/ui/overlay/impl/config-overlay-v2.d.ts +12 -1
- package/dist/ui/overlay/impl/config-overlay-v2.js +164 -100
- 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 +2 -0
- package/dist/ui/overlay/impl/dashboard-overlay-v2.js +26 -3
- 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.js +12 -9
- package/dist/ui/overlay/impl/document-detail-overlay-v2.d.ts +7 -0
- package/dist/ui/overlay/impl/document-detail-overlay-v2.js +119 -78
- 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/help-overlay-v2.d.ts +26 -3
- package/dist/ui/overlay/impl/help-overlay-v2.js +20 -42
- 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/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 +57 -13
- package/dist/ui/overlay/impl/model-overlay-v2.js +1086 -61
- package/dist/ui/overlay/impl/new-overlay-v2.d.ts +37 -6
- package/dist/ui/overlay/impl/new-overlay-v2.js +715 -65
- 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.js +5 -5
- 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 +1 -0
- package/dist/ui/overlay/impl/projects-overlay-v2.js +278 -44
- 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/tools-overlay-v2.js +3 -7
- package/dist/ui/overlay/impl/tutorial-overlay-v2.d.ts +30 -16
- package/dist/ui/overlay/impl/tutorial-overlay-v2.js +133 -956
- package/dist/ui/overlay/impl/workflow-overlay-v2.js +5 -1
- package/dist/ui/overlay/index.d.ts +20 -1
- package/dist/ui/overlay/index.js +19 -0
- package/dist/ui/overlay/types.d.ts +5 -0
- package/dist/ui/overlay-manager.d.ts +43 -0
- package/dist/ui/overlay-manager.js +238 -0
- package/dist/ui/overlays.js +4 -16
- package/dist/ui/permission-overlay.js +6 -5
- package/dist/ui/status-bar-controller.d.ts +33 -0
- package/dist/ui/status-bar-controller.js +99 -0
- package/dist/ui/subagent-renderer.js +3 -19
- package/dist/ui/terminal-autocomplete-utils.d.ts +23 -0
- package/dist/ui/terminal-autocomplete-utils.js +83 -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 +7 -8
- package/dist/ui/terminal-renderer.js +7 -8
- package/dist/ui/terminal-types.d.ts +179 -0
- package/dist/ui/terminal-types.js +34 -0
- package/dist/ui/terminal-ui.d.ts +144 -276
- package/dist/ui/terminal-ui.js +384 -1861
- package/dist/ui/todo-zone.d.ts +19 -1
- package/dist/ui/todo-zone.js +71 -13
- package/dist/ui/tool-formatters.js +512 -1
- 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/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 +38 -16
- package/dist/utils/open-browser.d.ts +5 -0
- package/dist/utils/open-browser.js +32 -0
- package/dist/utils/path-safety.js +3 -2
- 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/package.json +25 -12
- package/dist/commands/handler-types.d.ts +0 -68
- package/dist/commands/handler-types.js +0 -8
- package/dist/commands/handlers/agent-commands.d.ts +0 -13
- package/dist/commands/handlers/agent-commands.js +0 -305
- package/dist/commands/handlers/design-commands.d.ts +0 -15
- package/dist/commands/handlers/design-commands.js +0 -334
- package/dist/commands/handlers/index.d.ts +0 -20
- package/dist/commands/handlers/index.js +0 -43
- package/dist/commands/handlers/overlay-commands.d.ts +0 -21
- package/dist/commands/handlers/overlay-commands.js +0 -287
- package/dist/commands/handlers/project-commands.d.ts +0 -11
- package/dist/commands/handlers/project-commands.js +0 -167
- package/dist/commands/handlers/simple-commands.d.ts +0 -19
- package/dist/commands/handlers/simple-commands.js +0 -144
- package/dist/commands/registry.d.ts +0 -50
- package/dist/commands/registry.js +0 -75
- package/dist/index.old.d.ts +0 -7
- package/dist/index.old.js +0 -1014
- package/dist/repl.d.ts +0 -149
- package/dist/repl.js +0 -1151
- 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-v2.d.ts +0 -43
- package/dist/ui/agents-overlay-v2.js +0 -809
- package/dist/ui/agents-overlay.d.ts +0 -12
- package/dist/ui/agents-overlay.js +0 -863
- package/dist/ui/anchors-overlay.d.ts +0 -12
- package/dist/ui/anchors-overlay.js +0 -775
- package/dist/ui/arch-type-overlay.d.ts +0 -15
- package/dist/ui/arch-type-overlay.js +0 -201
- package/dist/ui/ask-user-overlay-v2.d.ts +0 -26
- package/dist/ui/ask-user-overlay-v2.js +0 -555
- package/dist/ui/ask-user-simple-overlay-v2.d.ts +0 -25
- package/dist/ui/ask-user-simple-overlay-v2.js +0 -215
- package/dist/ui/backlog-overlay.d.ts +0 -32
- package/dist/ui/backlog-overlay.js +0 -652
- package/dist/ui/commands-overlay-v2.d.ts +0 -33
- package/dist/ui/commands-overlay-v2.js +0 -441
- package/dist/ui/commands-overlay.d.ts +0 -16
- package/dist/ui/commands-overlay.js +0 -439
- package/dist/ui/config-overlay.d.ts +0 -35
- package/dist/ui/config-overlay.js +0 -707
- package/dist/ui/docs-overlay.d.ts +0 -17
- package/dist/ui/docs-overlay.js +0 -303
- package/dist/ui/footer-v2.d.ts +0 -222
- package/dist/ui/footer-v2.js +0 -1349
- package/dist/ui/help-overlay-v2.d.ts +0 -34
- package/dist/ui/help-overlay-v2.js +0 -309
- package/dist/ui/help-overlay.d.ts +0 -16
- package/dist/ui/help-overlay.js +0 -316
- package/dist/ui/init-overlay-v2.d.ts +0 -34
- package/dist/ui/init-overlay-v2.js +0 -600
- package/dist/ui/init-overlay.d.ts +0 -34
- package/dist/ui/init-overlay.js +0 -604
- package/dist/ui/input-prompt-v2.d.ts +0 -180
- package/dist/ui/input-prompt-v2.js +0 -999
- package/dist/ui/iteration-limit-overlay-v2.d.ts +0 -21
- package/dist/ui/iteration-limit-overlay-v2.js +0 -114
- package/dist/ui/keys-overlay-v2.d.ts +0 -41
- package/dist/ui/keys-overlay-v2.js +0 -248
- package/dist/ui/mascot-overlay-v2.d.ts +0 -41
- package/dist/ui/mascot-overlay-v2.js +0 -138
- package/dist/ui/mascot-overlay.d.ts +0 -21
- package/dist/ui/mascot-overlay.js +0 -146
- package/dist/ui/model-overlay-v2.d.ts +0 -49
- package/dist/ui/model-overlay-v2.js +0 -118
- package/dist/ui/model-overlay.d.ts +0 -27
- package/dist/ui/model-overlay.js +0 -221
- package/dist/ui/model-warning-overlay.d.ts +0 -30
- package/dist/ui/model-warning-overlay.js +0 -169
- package/dist/ui/new-overlay.d.ts +0 -34
- package/dist/ui/new-overlay.js +0 -604
- package/dist/ui/overlay/impl/init-overlay-v2.d.ts +0 -77
- package/dist/ui/overlay/impl/init-overlay-v2.js +0 -593
- package/dist/ui/overlay/overlay-types.d.ts +0 -128
- package/dist/ui/overlay/overlay-types.js +0 -22
- package/dist/ui/overlays/help-overlay-v2.d.ts +0 -28
- package/dist/ui/overlays/help-overlay-v2.js +0 -198
- package/dist/ui/overlays/index.d.ts +0 -11
- package/dist/ui/overlays/index.js +0 -11
- package/dist/ui/permission-overlay-v2.d.ts +0 -36
- package/dist/ui/permission-overlay-v2.js +0 -380
- package/dist/ui/projects-overlay.d.ts +0 -19
- package/dist/ui/projects-overlay.js +0 -484
- package/dist/ui/theme-overlay-v2.d.ts +0 -42
- package/dist/ui/theme-overlay-v2.js +0 -135
- package/dist/ui/theme-overlay.d.ts +0 -24
- package/dist/ui/theme-overlay.js +0 -127
- package/dist/ui/tools-overlay-v2.d.ts +0 -47
- package/dist/ui/tools-overlay-v2.js +0 -218
- package/dist/ui/tools-overlay.d.ts +0 -34
- package/dist/ui/tools-overlay.js +0 -230
- package/dist/ui/tutorial-overlay-v2.d.ts +0 -31
- package/dist/ui/tutorial-overlay-v2.js +0 -1035
- package/dist/ui/tutorial-overlay.d.ts +0 -11
- package/dist/ui/tutorial-overlay.js +0 -1034
- package/dist/ui/workflow-overlay.d.ts +0 -22
- package/dist/ui/workflow-overlay.js +0 -636
|
@@ -4,8 +4,11 @@
|
|
|
4
4
|
* Command system for the new TerminalUI-based REPL.
|
|
5
5
|
* Uses TerminalUI instead of Footer, with real agent integration.
|
|
6
6
|
*/
|
|
7
|
-
import type { Agent, ContextManager } from '@compilr-dev/
|
|
7
|
+
import type { Agent, ContextManager } from '@compilr-dev/sdk';
|
|
8
8
|
import type { TerminalUI, AgentMessage } from '../ui/terminal-ui.js';
|
|
9
|
+
import type { AgentTeam } from '../multi-agent/index.js';
|
|
10
|
+
import type { BackgroundSessionInfo } from '../multi-agent/types.js';
|
|
11
|
+
export type { BackgroundSessionInfo };
|
|
9
12
|
/**
|
|
10
13
|
* Context passed to V2 command handlers.
|
|
11
14
|
* Provides access to agent, UI, and session information.
|
|
@@ -15,12 +18,36 @@ export interface CommandContextV2 {
|
|
|
15
18
|
ui: TerminalUI;
|
|
16
19
|
/** CLI version string */
|
|
17
20
|
version: string;
|
|
21
|
+
/** Update available info (if any) */
|
|
22
|
+
updateAvailable?: {
|
|
23
|
+
current: string;
|
|
24
|
+
latest: string;
|
|
25
|
+
} | null;
|
|
18
26
|
/** Re-print the welcome screen (logo + hints for REPL mode) */
|
|
19
|
-
printWelcome: () => void
|
|
27
|
+
printWelcome: () => Promise<void>;
|
|
20
28
|
/** Print just the logo (for dashboard mode) */
|
|
21
29
|
printLogo: () => void;
|
|
30
|
+
/** Session restoration info from startup (one-shot, cleared after first read) */
|
|
31
|
+
consumeRestoredSessionInfo: () => string | null;
|
|
22
32
|
/** The main agent instance (may be undefined in simulation mode) */
|
|
23
33
|
agent?: Agent;
|
|
34
|
+
/** The multi-agent team (if multi-agent mode is enabled) */
|
|
35
|
+
team?: AgentTeam;
|
|
36
|
+
/**
|
|
37
|
+
* Replace the current team with a new one (after project switch).
|
|
38
|
+
* Returns the old team so it can be saved if needed.
|
|
39
|
+
*/
|
|
40
|
+
setTeam?: (team: AgentTeam) => AgentTeam | undefined;
|
|
41
|
+
/**
|
|
42
|
+
* Agent factory function for creating new agents.
|
|
43
|
+
* Used when switching projects to create new team.
|
|
44
|
+
*/
|
|
45
|
+
agentFactory?: (config: Record<string, unknown>, systemPromptAddition?: string, useMinimalSystemPrompt?: boolean, noTools?: boolean) => Promise<Agent>;
|
|
46
|
+
/**
|
|
47
|
+
* Replace the current agent with a restored one.
|
|
48
|
+
* Used by /resume command to restore from a saved session.
|
|
49
|
+
*/
|
|
50
|
+
restoreAgent?: (agent: Agent) => void;
|
|
24
51
|
/** Current LLM model ID */
|
|
25
52
|
model?: string;
|
|
26
53
|
/** Current LLM provider (claude, openai, gemini, ollama) */
|
|
@@ -46,6 +73,51 @@ export interface CommandContextV2 {
|
|
|
46
73
|
sessionOutputTokens?: number;
|
|
47
74
|
/** Total requests in session */
|
|
48
75
|
sessionRequests?: number;
|
|
76
|
+
/**
|
|
77
|
+
* Get information about all running background sessions.
|
|
78
|
+
*/
|
|
79
|
+
getBackgroundSessions?: () => BackgroundSessionInfo[];
|
|
80
|
+
/**
|
|
81
|
+
* Bring a background agent to the foreground.
|
|
82
|
+
* The current foreground agent (if any) will continue running but output will be minimized.
|
|
83
|
+
* @param agentId - The agent to bring to foreground
|
|
84
|
+
* @returns true if successful, false if agent not found
|
|
85
|
+
*/
|
|
86
|
+
bringToForeground?: (agentId: string) => Promise<boolean>;
|
|
87
|
+
/**
|
|
88
|
+
* Switch the active agent (consolidated switching).
|
|
89
|
+
* Performs team switch, agent ref update, tool filter, footer, session tracking, telemetry.
|
|
90
|
+
* Callers handle their own messaging.
|
|
91
|
+
* @param agentId - The agent to switch to
|
|
92
|
+
*/
|
|
93
|
+
switchAgent?: (agentId: string) => Promise<void>;
|
|
94
|
+
/**
|
|
95
|
+
* Kill/cancel a background agent.
|
|
96
|
+
* @param agentId - The agent to kill
|
|
97
|
+
* @returns true if successful, false if agent not found
|
|
98
|
+
*/
|
|
99
|
+
killBackgroundAgent?: (agentId: string) => boolean;
|
|
100
|
+
/**
|
|
101
|
+
* Send the current foreground agent to background without aborting it.
|
|
102
|
+
* The agent continues running; the user regains the input prompt.
|
|
103
|
+
* @returns The agent ID that was sent to background, or null if no foreground session
|
|
104
|
+
*/
|
|
105
|
+
sendForegroundToBackground?: () => string | null;
|
|
106
|
+
/**
|
|
107
|
+
* Clear all message queues for all agents.
|
|
108
|
+
* Used by /reset to clear queued messages along with conversation history.
|
|
109
|
+
* @returns Total number of messages cleared
|
|
110
|
+
*/
|
|
111
|
+
clearAllQueues?: () => number;
|
|
112
|
+
}
|
|
113
|
+
/**
|
|
114
|
+
* Example usage for a command.
|
|
115
|
+
*/
|
|
116
|
+
export interface CommandExample {
|
|
117
|
+
/** The command to run (e.g., '/backlog') */
|
|
118
|
+
code: string;
|
|
119
|
+
/** What this example demonstrates */
|
|
120
|
+
description?: string;
|
|
49
121
|
}
|
|
50
122
|
/**
|
|
51
123
|
* Interface for a V2 command handler.
|
|
@@ -55,8 +127,14 @@ export interface CommandHandlerV2 {
|
|
|
55
127
|
name: string;
|
|
56
128
|
/** Optional aliases that resolve to this command */
|
|
57
129
|
aliases?: string[];
|
|
58
|
-
/** Short description for help text */
|
|
130
|
+
/** Short description for help text and autocomplete */
|
|
59
131
|
description: string;
|
|
132
|
+
/** Detailed explanation of what the command does (for help detail view) */
|
|
133
|
+
details?: string;
|
|
134
|
+
/** Usage examples with optional descriptions */
|
|
135
|
+
examples?: CommandExample[];
|
|
136
|
+
/** UI interaction hints (keyboard shortcuts, navigation) */
|
|
137
|
+
interactions?: string[];
|
|
60
138
|
/**
|
|
61
139
|
* Execute the command.
|
|
62
140
|
*
|
package/dist/commands.js
CHANGED
|
@@ -219,6 +219,19 @@ export const COMMANDS = [
|
|
|
219
219
|
'q/Esc to close without changing',
|
|
220
220
|
],
|
|
221
221
|
},
|
|
222
|
+
{
|
|
223
|
+
name: 'mcp',
|
|
224
|
+
description: 'View MCP servers and tools',
|
|
225
|
+
details: 'Opens the MCP (Model Context Protocol) servers overlay. View connected external tool servers, their discovered tools, and manage connections (restart/disconnect). Configure servers in ~/.compilr-dev/mcp.json.',
|
|
226
|
+
examples: [{ code: '/mcp' }],
|
|
227
|
+
interactions: [
|
|
228
|
+
'Enter to view server details and tools',
|
|
229
|
+
'r to restart a server',
|
|
230
|
+
'd to disconnect a server',
|
|
231
|
+
'/ to search',
|
|
232
|
+
'Esc to close',
|
|
233
|
+
],
|
|
234
|
+
},
|
|
222
235
|
{
|
|
223
236
|
name: 'model',
|
|
224
237
|
description: 'Select LLM model',
|
|
Binary file
|
package/dist/db/index.js
CHANGED
|
@@ -49,6 +49,8 @@ export function getDb() {
|
|
|
49
49
|
dbInstance.pragma('foreign_keys = ON');
|
|
50
50
|
// Enable WAL mode for better concurrency
|
|
51
51
|
dbInstance.pragma('journal_mode = WAL');
|
|
52
|
+
// Prevent SQLITE_BUSY under concurrent access (multi-terminal)
|
|
53
|
+
dbInstance.pragma('busy_timeout = 5000');
|
|
52
54
|
// Initialize schema if needed
|
|
53
55
|
initializeSchema(dbInstance);
|
|
54
56
|
return dbInstance;
|
|
@@ -81,10 +83,102 @@ function initializeSchema(db) {
|
|
|
81
83
|
* Run database migrations from one version to another
|
|
82
84
|
*/
|
|
83
85
|
function runMigrations(db, fromVersion, toVersion) {
|
|
84
|
-
//
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
db.
|
|
86
|
+
// Migration from v1 to v2: Add plan columns to project_documents
|
|
87
|
+
if (fromVersion < 2 && toVersion >= 2) {
|
|
88
|
+
// Add status column (for plans)
|
|
89
|
+
db.exec(`
|
|
90
|
+
ALTER TABLE project_documents ADD COLUMN status TEXT;
|
|
91
|
+
`);
|
|
92
|
+
// Add work_item_id column (for linking plans to work items)
|
|
93
|
+
db.exec(`
|
|
94
|
+
ALTER TABLE project_documents ADD COLUMN work_item_id INTEGER
|
|
95
|
+
REFERENCES work_items(id) ON DELETE SET NULL;
|
|
96
|
+
`);
|
|
97
|
+
// Add indexes for the new columns
|
|
98
|
+
db.exec(`
|
|
99
|
+
CREATE INDEX IF NOT EXISTS idx_project_documents_status ON project_documents(status);
|
|
100
|
+
CREATE INDEX IF NOT EXISTS idx_project_documents_work_item ON project_documents(work_item_id);
|
|
101
|
+
`);
|
|
102
|
+
db.prepare('INSERT INTO schema_version (version) VALUES (?)').run(2);
|
|
103
|
+
}
|
|
104
|
+
// Migration from v2 to v3: Add owner column to work_items
|
|
105
|
+
if (fromVersion < 3 && toVersion >= 3) {
|
|
106
|
+
// Add owner column for multi-agent task assignment
|
|
107
|
+
db.exec(`
|
|
108
|
+
ALTER TABLE work_items ADD COLUMN owner TEXT;
|
|
109
|
+
`);
|
|
110
|
+
// Add index for owner queries
|
|
111
|
+
db.exec(`
|
|
112
|
+
CREATE INDEX IF NOT EXISTS idx_work_items_owner ON work_items(owner);
|
|
113
|
+
`);
|
|
114
|
+
db.prepare('INSERT INTO schema_version (version) VALUES (?)').run(3);
|
|
115
|
+
}
|
|
116
|
+
// Migration from v3 to v4: Add terminal_sessions table (multi-terminal awareness)
|
|
117
|
+
if (fromVersion < 4 && toVersion >= 4) {
|
|
118
|
+
db.exec(`
|
|
119
|
+
CREATE TABLE IF NOT EXISTS terminal_sessions (
|
|
120
|
+
id TEXT PRIMARY KEY,
|
|
121
|
+
project_id INTEGER,
|
|
122
|
+
pid INTEGER NOT NULL,
|
|
123
|
+
tty_path TEXT,
|
|
124
|
+
label TEXT,
|
|
125
|
+
started_at DATETIME DEFAULT CURRENT_TIMESTAMP,
|
|
126
|
+
last_heartbeat DATETIME DEFAULT CURRENT_TIMESTAMP,
|
|
127
|
+
active_agent TEXT DEFAULT 'default',
|
|
128
|
+
agents_json TEXT DEFAULT '[]',
|
|
129
|
+
status TEXT DEFAULT 'active',
|
|
130
|
+
FOREIGN KEY (project_id) REFERENCES projects(id) ON DELETE SET NULL
|
|
131
|
+
);
|
|
132
|
+
`);
|
|
133
|
+
db.exec(`
|
|
134
|
+
CREATE INDEX IF NOT EXISTS idx_terminal_sessions_project ON terminal_sessions(project_id);
|
|
135
|
+
CREATE INDEX IF NOT EXISTS idx_terminal_sessions_status ON terminal_sessions(status);
|
|
136
|
+
`);
|
|
137
|
+
db.prepare('INSERT INTO schema_version (version) VALUES (?)').run(4);
|
|
138
|
+
}
|
|
139
|
+
// Migration from v4 to v5: Add file_locks table (multi-terminal file lock awareness)
|
|
140
|
+
if (fromVersion < 5 && toVersion >= 5) {
|
|
141
|
+
db.exec(`
|
|
142
|
+
CREATE TABLE IF NOT EXISTS file_locks (
|
|
143
|
+
path TEXT NOT NULL,
|
|
144
|
+
project_id INTEGER NOT NULL,
|
|
145
|
+
session_id TEXT NOT NULL,
|
|
146
|
+
agent_id TEXT NOT NULL,
|
|
147
|
+
locked_at DATETIME DEFAULT CURRENT_TIMESTAMP,
|
|
148
|
+
PRIMARY KEY (path, project_id),
|
|
149
|
+
FOREIGN KEY (session_id) REFERENCES terminal_sessions(id) ON DELETE CASCADE,
|
|
150
|
+
FOREIGN KEY (project_id) REFERENCES projects(id) ON DELETE CASCADE
|
|
151
|
+
);
|
|
152
|
+
`);
|
|
153
|
+
db.exec(`
|
|
154
|
+
CREATE INDEX IF NOT EXISTS idx_file_locks_session ON file_locks(session_id);
|
|
155
|
+
`);
|
|
156
|
+
db.prepare('INSERT INTO schema_version (version) VALUES (?)').run(5);
|
|
157
|
+
}
|
|
158
|
+
// Migration from v5 to v6: Add session_notifications table (cross-session notifications)
|
|
159
|
+
if (fromVersion < 6 && toVersion >= 6) {
|
|
160
|
+
db.exec(`
|
|
161
|
+
CREATE TABLE IF NOT EXISTS session_notifications (
|
|
162
|
+
id TEXT PRIMARY KEY,
|
|
163
|
+
project_id INTEGER NOT NULL,
|
|
164
|
+
from_session_id TEXT NOT NULL,
|
|
165
|
+
to_session_id TEXT,
|
|
166
|
+
type TEXT NOT NULL,
|
|
167
|
+
title TEXT NOT NULL,
|
|
168
|
+
message TEXT,
|
|
169
|
+
payload_json TEXT,
|
|
170
|
+
created_at DATETIME DEFAULT CURRENT_TIMESTAMP,
|
|
171
|
+
read_at DATETIME,
|
|
172
|
+
FOREIGN KEY (project_id) REFERENCES projects(id) ON DELETE CASCADE,
|
|
173
|
+
FOREIGN KEY (from_session_id) REFERENCES terminal_sessions(id) ON DELETE CASCADE
|
|
174
|
+
);
|
|
175
|
+
`);
|
|
176
|
+
db.exec(`
|
|
177
|
+
CREATE INDEX IF NOT EXISTS idx_session_notifications_project ON session_notifications(project_id);
|
|
178
|
+
CREATE INDEX IF NOT EXISTS idx_session_notifications_to_session ON session_notifications(to_session_id);
|
|
179
|
+
CREATE INDEX IF NOT EXISTS idx_session_notifications_unread ON session_notifications(read_at);
|
|
180
|
+
`);
|
|
181
|
+
db.prepare('INSERT INTO schema_version (version) VALUES (?)').run(6);
|
|
88
182
|
}
|
|
89
183
|
}
|
|
90
184
|
/**
|
|
@@ -16,6 +16,8 @@ function recordToDocument(record) {
|
|
|
16
16
|
content: record.content,
|
|
17
17
|
createdAt: new Date(record.created_at),
|
|
18
18
|
updatedAt: new Date(record.updated_at),
|
|
19
|
+
status: record.status,
|
|
20
|
+
workItemId: record.work_item_id,
|
|
19
21
|
};
|
|
20
22
|
}
|
|
21
23
|
export const documentRepository = {
|
|
@@ -105,7 +107,8 @@ export const documentRepository = {
|
|
|
105
107
|
WHEN 'architecture' THEN 2
|
|
106
108
|
WHEN 'design' THEN 3
|
|
107
109
|
WHEN 'notes' THEN 4
|
|
108
|
-
|
|
110
|
+
WHEN 'plan' THEN 5
|
|
111
|
+
ELSE 6
|
|
109
112
|
END,
|
|
110
113
|
created_at ASC
|
|
111
114
|
`)
|
|
@@ -175,6 +178,7 @@ export const documentRepository = {
|
|
|
175
178
|
architecture: 0,
|
|
176
179
|
design: 0,
|
|
177
180
|
notes: 0,
|
|
181
|
+
plan: 0,
|
|
178
182
|
};
|
|
179
183
|
for (const row of results) {
|
|
180
184
|
counts[row.doc_type] = row.count;
|
|
@@ -7,3 +7,5 @@ export { workItemRepository } from './work-item-repository.js';
|
|
|
7
7
|
export type { CreateWorkItemInput, UpdateWorkItemInput, QueryWorkItemsInput, WorkItem, } from './work-item-repository.js';
|
|
8
8
|
export { documentRepository } from './document-repository.js';
|
|
9
9
|
export type { CreateDocumentInput, UpdateDocumentInput, ProjectDocument, } from './document-repository.js';
|
|
10
|
+
export { planRepository } from './plan-repository.js';
|
|
11
|
+
export type { CreatePlanInput, UpdatePlanInput, ListPlansOptions, Plan, PlanSummary, PlanWithWorkItem, } from './plan-repository.js';
|
|
@@ -0,0 +1,101 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Plan Repository
|
|
3
|
+
*
|
|
4
|
+
* Handles all database operations for plans.
|
|
5
|
+
* Plans are stored in project_documents with doc_type='plan'.
|
|
6
|
+
*/
|
|
7
|
+
import type { PlanStatus } from '../schema.js';
|
|
8
|
+
export interface CreatePlanInput {
|
|
9
|
+
project_id: number;
|
|
10
|
+
name: string;
|
|
11
|
+
content: string;
|
|
12
|
+
work_item_id?: number;
|
|
13
|
+
}
|
|
14
|
+
export interface UpdatePlanInput {
|
|
15
|
+
content?: string;
|
|
16
|
+
status?: PlanStatus;
|
|
17
|
+
work_item_id?: number | null;
|
|
18
|
+
}
|
|
19
|
+
export interface ListPlansOptions {
|
|
20
|
+
status?: PlanStatus | PlanStatus[];
|
|
21
|
+
work_item_id?: number;
|
|
22
|
+
limit?: number;
|
|
23
|
+
order_by?: 'updated_desc' | 'updated_asc' | 'created_desc' | 'name_asc';
|
|
24
|
+
}
|
|
25
|
+
export interface Plan {
|
|
26
|
+
id: number;
|
|
27
|
+
projectId: number;
|
|
28
|
+
name: string;
|
|
29
|
+
content: string;
|
|
30
|
+
status: PlanStatus;
|
|
31
|
+
workItemId: number | null;
|
|
32
|
+
createdAt: Date;
|
|
33
|
+
updatedAt: Date;
|
|
34
|
+
}
|
|
35
|
+
export interface PlanSummary {
|
|
36
|
+
id: number;
|
|
37
|
+
name: string;
|
|
38
|
+
status: PlanStatus;
|
|
39
|
+
workItemId: number | null;
|
|
40
|
+
workItemTitle?: string;
|
|
41
|
+
workItemItemId?: string;
|
|
42
|
+
updatedAt: Date;
|
|
43
|
+
}
|
|
44
|
+
export interface PlanWithWorkItem extends Plan {
|
|
45
|
+
workItem?: {
|
|
46
|
+
id: number;
|
|
47
|
+
itemId: string;
|
|
48
|
+
title: string;
|
|
49
|
+
status: string;
|
|
50
|
+
};
|
|
51
|
+
}
|
|
52
|
+
export declare const planRepository: {
|
|
53
|
+
/**
|
|
54
|
+
* Create a new plan
|
|
55
|
+
*/
|
|
56
|
+
create(input: CreatePlanInput): Plan;
|
|
57
|
+
/**
|
|
58
|
+
* Get plan by ID
|
|
59
|
+
*/
|
|
60
|
+
getById(id: number): Plan | null;
|
|
61
|
+
/**
|
|
62
|
+
* Get plan by name for a project
|
|
63
|
+
*/
|
|
64
|
+
getByName(projectId: number, name: string): Plan | null;
|
|
65
|
+
/**
|
|
66
|
+
* Get plan with linked work item details
|
|
67
|
+
*/
|
|
68
|
+
getWithWorkItem(id: number): PlanWithWorkItem | null;
|
|
69
|
+
/**
|
|
70
|
+
* Update a plan
|
|
71
|
+
*/
|
|
72
|
+
update(id: number, input: UpdatePlanInput): Plan | null;
|
|
73
|
+
/**
|
|
74
|
+
* Delete a plan
|
|
75
|
+
*/
|
|
76
|
+
delete(id: number): boolean;
|
|
77
|
+
/**
|
|
78
|
+
* List plans for a project
|
|
79
|
+
*/
|
|
80
|
+
list(projectId: number, options?: ListPlansOptions): PlanSummary[];
|
|
81
|
+
/**
|
|
82
|
+
* Count plans by status for a project
|
|
83
|
+
*/
|
|
84
|
+
countByStatus(projectId: number): Record<PlanStatus, number>;
|
|
85
|
+
/**
|
|
86
|
+
* Get plans with status 'in_progress' for a project
|
|
87
|
+
*/
|
|
88
|
+
getInProgress(projectId: number): PlanSummary[];
|
|
89
|
+
/**
|
|
90
|
+
* Check if there are any in_progress plans for a project
|
|
91
|
+
*/
|
|
92
|
+
hasInProgress(projectId: number): boolean;
|
|
93
|
+
/**
|
|
94
|
+
* Link a plan to a work item
|
|
95
|
+
*/
|
|
96
|
+
linkWorkItem(planId: number, workItemId: number): Plan | null;
|
|
97
|
+
/**
|
|
98
|
+
* Unlink a plan from its work item
|
|
99
|
+
*/
|
|
100
|
+
unlinkWorkItem(planId: number): Plan | null;
|
|
101
|
+
};
|
|
@@ -0,0 +1,275 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Plan Repository
|
|
3
|
+
*
|
|
4
|
+
* Handles all database operations for plans.
|
|
5
|
+
* Plans are stored in project_documents with doc_type='plan'.
|
|
6
|
+
*/
|
|
7
|
+
import { getDb } from '../index.js';
|
|
8
|
+
// =============================================================================
|
|
9
|
+
// Status Transition Rules
|
|
10
|
+
// =============================================================================
|
|
11
|
+
const VALID_TRANSITIONS = {
|
|
12
|
+
draft: ['approved', 'abandoned'],
|
|
13
|
+
approved: ['in_progress', 'abandoned'],
|
|
14
|
+
in_progress: ['completed', 'abandoned'],
|
|
15
|
+
completed: [], // Terminal state
|
|
16
|
+
abandoned: ['draft'], // Can re-open
|
|
17
|
+
};
|
|
18
|
+
function isValidTransition(from, to) {
|
|
19
|
+
return VALID_TRANSITIONS[from].includes(to);
|
|
20
|
+
}
|
|
21
|
+
// =============================================================================
|
|
22
|
+
// Helpers
|
|
23
|
+
// =============================================================================
|
|
24
|
+
function recordToPlan(record) {
|
|
25
|
+
return {
|
|
26
|
+
id: record.id,
|
|
27
|
+
projectId: record.project_id,
|
|
28
|
+
name: record.title,
|
|
29
|
+
content: record.content,
|
|
30
|
+
status: record.status ?? 'draft',
|
|
31
|
+
workItemId: record.work_item_id,
|
|
32
|
+
createdAt: new Date(record.created_at),
|
|
33
|
+
updatedAt: new Date(record.updated_at),
|
|
34
|
+
};
|
|
35
|
+
}
|
|
36
|
+
function recordToPlanSummary(record) {
|
|
37
|
+
return {
|
|
38
|
+
id: record.id,
|
|
39
|
+
name: record.title,
|
|
40
|
+
status: record.status ?? 'draft',
|
|
41
|
+
workItemId: record.work_item_id,
|
|
42
|
+
workItemTitle: record.work_item_title,
|
|
43
|
+
workItemItemId: record.work_item_item_id,
|
|
44
|
+
updatedAt: new Date(record.updated_at),
|
|
45
|
+
};
|
|
46
|
+
}
|
|
47
|
+
// =============================================================================
|
|
48
|
+
// Repository
|
|
49
|
+
// =============================================================================
|
|
50
|
+
export const planRepository = {
|
|
51
|
+
/**
|
|
52
|
+
* Create a new plan
|
|
53
|
+
*/
|
|
54
|
+
create(input) {
|
|
55
|
+
const db = getDb();
|
|
56
|
+
const now = new Date().toISOString();
|
|
57
|
+
const result = db
|
|
58
|
+
.prepare(`
|
|
59
|
+
INSERT INTO project_documents (
|
|
60
|
+
project_id, doc_type, title, content, status, work_item_id,
|
|
61
|
+
created_at, updated_at
|
|
62
|
+
) VALUES (?, 'plan', ?, ?, 'draft', ?, ?, ?)
|
|
63
|
+
`)
|
|
64
|
+
.run(input.project_id, input.name, input.content, input.work_item_id ?? null, now, now);
|
|
65
|
+
const plan = this.getById(Number(result.lastInsertRowid));
|
|
66
|
+
if (!plan)
|
|
67
|
+
throw new Error('Failed to create plan');
|
|
68
|
+
return plan;
|
|
69
|
+
},
|
|
70
|
+
/**
|
|
71
|
+
* Get plan by ID
|
|
72
|
+
*/
|
|
73
|
+
getById(id) {
|
|
74
|
+
const db = getDb();
|
|
75
|
+
const record = db
|
|
76
|
+
.prepare(`SELECT * FROM project_documents WHERE id = ? AND doc_type = 'plan'`)
|
|
77
|
+
.get(id);
|
|
78
|
+
return record ? recordToPlan(record) : null;
|
|
79
|
+
},
|
|
80
|
+
/**
|
|
81
|
+
* Get plan by name for a project
|
|
82
|
+
*/
|
|
83
|
+
getByName(projectId, name) {
|
|
84
|
+
const db = getDb();
|
|
85
|
+
const record = db
|
|
86
|
+
.prepare(`SELECT * FROM project_documents
|
|
87
|
+
WHERE project_id = ? AND doc_type = 'plan' AND title = ?`)
|
|
88
|
+
.get(projectId, name);
|
|
89
|
+
return record ? recordToPlan(record) : null;
|
|
90
|
+
},
|
|
91
|
+
/**
|
|
92
|
+
* Get plan with linked work item details
|
|
93
|
+
*/
|
|
94
|
+
getWithWorkItem(id) {
|
|
95
|
+
const db = getDb();
|
|
96
|
+
const record = db
|
|
97
|
+
.prepare(`
|
|
98
|
+
SELECT pd.*, wi.item_id as wi_item_id, wi.title as wi_title, wi.status as wi_status
|
|
99
|
+
FROM project_documents pd
|
|
100
|
+
LEFT JOIN work_items wi ON pd.work_item_id = wi.id
|
|
101
|
+
WHERE pd.id = ? AND pd.doc_type = 'plan'
|
|
102
|
+
`)
|
|
103
|
+
.get(id);
|
|
104
|
+
if (!record)
|
|
105
|
+
return null;
|
|
106
|
+
const plan = recordToPlan(record);
|
|
107
|
+
if (record.wi_item_id && record.work_item_id !== null) {
|
|
108
|
+
plan.workItem = {
|
|
109
|
+
id: record.work_item_id,
|
|
110
|
+
itemId: record.wi_item_id,
|
|
111
|
+
title: record.wi_title ?? '',
|
|
112
|
+
status: record.wi_status ?? '',
|
|
113
|
+
};
|
|
114
|
+
}
|
|
115
|
+
return plan;
|
|
116
|
+
},
|
|
117
|
+
/**
|
|
118
|
+
* Update a plan
|
|
119
|
+
*/
|
|
120
|
+
update(id, input) {
|
|
121
|
+
const db = getDb();
|
|
122
|
+
// Get current plan for status validation
|
|
123
|
+
const current = this.getById(id);
|
|
124
|
+
if (!current)
|
|
125
|
+
return null;
|
|
126
|
+
// Validate status transition if changing status
|
|
127
|
+
if (input.status && input.status !== current.status) {
|
|
128
|
+
if (!isValidTransition(current.status, input.status)) {
|
|
129
|
+
throw new Error(`Invalid status transition: ${current.status} → ${input.status}`);
|
|
130
|
+
}
|
|
131
|
+
}
|
|
132
|
+
const updates = [];
|
|
133
|
+
const params = [];
|
|
134
|
+
if (input.content !== undefined) {
|
|
135
|
+
updates.push('content = ?');
|
|
136
|
+
params.push(input.content);
|
|
137
|
+
}
|
|
138
|
+
if (input.status !== undefined) {
|
|
139
|
+
updates.push('status = ?');
|
|
140
|
+
params.push(input.status);
|
|
141
|
+
}
|
|
142
|
+
if (input.work_item_id !== undefined) {
|
|
143
|
+
updates.push('work_item_id = ?');
|
|
144
|
+
params.push(input.work_item_id);
|
|
145
|
+
}
|
|
146
|
+
if (updates.length === 0) {
|
|
147
|
+
return current;
|
|
148
|
+
}
|
|
149
|
+
updates.push('updated_at = ?');
|
|
150
|
+
params.push(new Date().toISOString());
|
|
151
|
+
params.push(id);
|
|
152
|
+
const query = `UPDATE project_documents SET ${updates.join(', ')} WHERE id = ? AND doc_type = 'plan'`;
|
|
153
|
+
db.prepare(query).run(...params);
|
|
154
|
+
return this.getById(id);
|
|
155
|
+
},
|
|
156
|
+
/**
|
|
157
|
+
* Delete a plan
|
|
158
|
+
*/
|
|
159
|
+
delete(id) {
|
|
160
|
+
const db = getDb();
|
|
161
|
+
const result = db
|
|
162
|
+
.prepare(`DELETE FROM project_documents WHERE id = ? AND doc_type = 'plan'`)
|
|
163
|
+
.run(id);
|
|
164
|
+
return result.changes > 0;
|
|
165
|
+
},
|
|
166
|
+
/**
|
|
167
|
+
* List plans for a project
|
|
168
|
+
*/
|
|
169
|
+
list(projectId, options = {}) {
|
|
170
|
+
const db = getDb();
|
|
171
|
+
const conditions = ["pd.project_id = ?", "pd.doc_type = 'plan'"];
|
|
172
|
+
const params = [projectId];
|
|
173
|
+
// Filter by status
|
|
174
|
+
if (options.status) {
|
|
175
|
+
if (Array.isArray(options.status)) {
|
|
176
|
+
const placeholders = options.status.map(() => '?').join(', ');
|
|
177
|
+
conditions.push(`pd.status IN (${placeholders})`);
|
|
178
|
+
params.push(...options.status);
|
|
179
|
+
}
|
|
180
|
+
else {
|
|
181
|
+
conditions.push('pd.status = ?');
|
|
182
|
+
params.push(options.status);
|
|
183
|
+
}
|
|
184
|
+
}
|
|
185
|
+
// Filter by work item
|
|
186
|
+
if (options.work_item_id !== undefined) {
|
|
187
|
+
conditions.push('pd.work_item_id = ?');
|
|
188
|
+
params.push(options.work_item_id);
|
|
189
|
+
}
|
|
190
|
+
// Order by
|
|
191
|
+
let orderBy = 'pd.updated_at DESC';
|
|
192
|
+
switch (options.order_by) {
|
|
193
|
+
case 'updated_asc':
|
|
194
|
+
orderBy = 'pd.updated_at ASC';
|
|
195
|
+
break;
|
|
196
|
+
case 'created_desc':
|
|
197
|
+
orderBy = 'pd.created_at DESC';
|
|
198
|
+
break;
|
|
199
|
+
case 'name_asc':
|
|
200
|
+
orderBy = 'pd.title ASC';
|
|
201
|
+
break;
|
|
202
|
+
}
|
|
203
|
+
// Limit
|
|
204
|
+
const limit = options.limit ?? 20;
|
|
205
|
+
const query = `
|
|
206
|
+
SELECT pd.*, wi.title as work_item_title, wi.item_id as work_item_item_id
|
|
207
|
+
FROM project_documents pd
|
|
208
|
+
LEFT JOIN work_items wi ON pd.work_item_id = wi.id
|
|
209
|
+
WHERE ${conditions.join(' AND ')}
|
|
210
|
+
ORDER BY ${orderBy}
|
|
211
|
+
LIMIT ?
|
|
212
|
+
`;
|
|
213
|
+
params.push(limit);
|
|
214
|
+
const records = db.prepare(query).all(...params);
|
|
215
|
+
return records.map(recordToPlanSummary);
|
|
216
|
+
},
|
|
217
|
+
/**
|
|
218
|
+
* Count plans by status for a project
|
|
219
|
+
*/
|
|
220
|
+
countByStatus(projectId) {
|
|
221
|
+
const db = getDb();
|
|
222
|
+
const results = db
|
|
223
|
+
.prepare(`
|
|
224
|
+
SELECT status, COUNT(*) as count
|
|
225
|
+
FROM project_documents
|
|
226
|
+
WHERE project_id = ? AND doc_type = 'plan'
|
|
227
|
+
GROUP BY status
|
|
228
|
+
`)
|
|
229
|
+
.all(projectId);
|
|
230
|
+
const counts = {
|
|
231
|
+
draft: 0,
|
|
232
|
+
approved: 0,
|
|
233
|
+
in_progress: 0,
|
|
234
|
+
completed: 0,
|
|
235
|
+
abandoned: 0,
|
|
236
|
+
};
|
|
237
|
+
for (const row of results) {
|
|
238
|
+
if (row.status && row.status in counts) {
|
|
239
|
+
counts[row.status] = row.count;
|
|
240
|
+
}
|
|
241
|
+
}
|
|
242
|
+
return counts;
|
|
243
|
+
},
|
|
244
|
+
/**
|
|
245
|
+
* Get plans with status 'in_progress' for a project
|
|
246
|
+
*/
|
|
247
|
+
getInProgress(projectId) {
|
|
248
|
+
return this.list(projectId, { status: 'in_progress' });
|
|
249
|
+
},
|
|
250
|
+
/**
|
|
251
|
+
* Check if there are any in_progress plans for a project
|
|
252
|
+
*/
|
|
253
|
+
hasInProgress(projectId) {
|
|
254
|
+
const db = getDb();
|
|
255
|
+
const result = db
|
|
256
|
+
.prepare(`
|
|
257
|
+
SELECT COUNT(*) as count FROM project_documents
|
|
258
|
+
WHERE project_id = ? AND doc_type = 'plan' AND status = 'in_progress'
|
|
259
|
+
`)
|
|
260
|
+
.get(projectId);
|
|
261
|
+
return result.count > 0;
|
|
262
|
+
},
|
|
263
|
+
/**
|
|
264
|
+
* Link a plan to a work item
|
|
265
|
+
*/
|
|
266
|
+
linkWorkItem(planId, workItemId) {
|
|
267
|
+
return this.update(planId, { work_item_id: workItemId });
|
|
268
|
+
},
|
|
269
|
+
/**
|
|
270
|
+
* Unlink a plan from its work item
|
|
271
|
+
*/
|
|
272
|
+
unlinkWorkItem(planId) {
|
|
273
|
+
return this.update(planId, { work_item_id: null });
|
|
274
|
+
},
|
|
275
|
+
};
|