@compass-ai/nova 1.0.72 → 1.0.74
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/dist/acp/agent.d.ts +318 -0
- package/dist/acp/agent.d.ts.map +1 -0
- package/dist/acp/agent.js +795 -0
- package/dist/acp/agent.js.map +1 -0
- package/dist/acp/backpressure-writer.d.ts +49 -0
- package/dist/acp/backpressure-writer.d.ts.map +1 -0
- package/dist/acp/backpressure-writer.js +153 -0
- package/dist/acp/backpressure-writer.js.map +1 -0
- package/dist/acp/event-adapter.d.ts +242 -0
- package/dist/acp/event-adapter.d.ts.map +1 -0
- package/dist/acp/event-adapter.js +456 -0
- package/dist/acp/event-adapter.js.map +1 -0
- package/dist/acp/index.d.ts +30 -0
- package/dist/acp/index.d.ts.map +1 -0
- package/dist/acp/index.js +36 -0
- package/dist/acp/index.js.map +1 -0
- package/dist/acp/modes.d.ts +56 -0
- package/dist/acp/modes.d.ts.map +1 -0
- package/dist/acp/modes.js +135 -0
- package/dist/acp/modes.js.map +1 -0
- package/dist/acp/session-manager.d.ts +170 -0
- package/dist/acp/session-manager.d.ts.map +1 -0
- package/dist/acp/session-manager.js +381 -0
- package/dist/acp/session-manager.js.map +1 -0
- package/dist/acp/text-coalescer.d.ts +45 -0
- package/dist/acp/text-coalescer.d.ts.map +1 -0
- package/dist/acp/text-coalescer.js +110 -0
- package/dist/acp/text-coalescer.js.map +1 -0
- package/dist/acp/tool-bridge.d.ts +156 -0
- package/dist/acp/tool-bridge.d.ts.map +1 -0
- package/dist/acp/tool-bridge.js +381 -0
- package/dist/acp/tool-bridge.js.map +1 -0
- package/dist/acp/types.d.ts +314 -0
- package/dist/acp/types.d.ts.map +1 -0
- package/dist/acp/types.js +8 -0
- package/dist/acp/types.js.map +1 -0
- package/dist/cli.d.ts +9 -0
- package/dist/cli.d.ts.map +1 -0
- package/dist/cli.js +185 -184
- package/dist/cli.js.map +1 -0
- package/dist/commands/acp.d.ts +26 -0
- package/dist/commands/acp.d.ts.map +1 -0
- package/dist/commands/acp.js +492 -0
- package/dist/commands/acp.js.map +1 -0
- package/dist/commands/cache.d.ts +33 -0
- package/dist/commands/cache.d.ts.map +1 -0
- package/dist/commands/cache.js +537 -0
- package/dist/commands/cache.js.map +1 -0
- package/dist/commands/config.d.ts +10 -0
- package/dist/commands/config.d.ts.map +1 -0
- package/dist/commands/config.js +367 -0
- package/dist/commands/config.js.map +1 -0
- package/dist/commands/consent.d.ts +21 -0
- package/dist/commands/consent.d.ts.map +1 -0
- package/dist/commands/consent.js +334 -0
- package/dist/commands/consent.js.map +1 -0
- package/dist/commands/data.d.ts +24 -0
- package/dist/commands/data.d.ts.map +1 -0
- package/dist/commands/data.js +586 -0
- package/dist/commands/data.js.map +1 -0
- package/dist/commands/index.d.ts +145 -0
- package/dist/commands/index.d.ts.map +1 -0
- package/dist/commands/index.js +210 -0
- package/dist/commands/index.js.map +1 -0
- package/dist/commands/init.d.ts +106 -0
- package/dist/commands/init.d.ts.map +1 -0
- package/dist/commands/init.js +349 -0
- package/dist/commands/init.js.map +1 -0
- package/dist/commands/logs.d.ts +13 -0
- package/dist/commands/logs.d.ts.map +1 -0
- package/dist/commands/logs.js +359 -0
- package/dist/commands/logs.js.map +1 -0
- package/dist/commands/mcp.d.ts +20 -0
- package/dist/commands/mcp.d.ts.map +1 -0
- package/dist/commands/mcp.js +687 -0
- package/dist/commands/mcp.js.map +1 -0
- package/dist/commands/reset.d.ts +20 -0
- package/dist/commands/reset.d.ts.map +1 -0
- package/dist/commands/reset.js +372 -0
- package/dist/commands/reset.js.map +1 -0
- package/dist/commands/setup.d.ts +74 -0
- package/dist/commands/setup.d.ts.map +1 -0
- package/dist/commands/setup.js +863 -0
- package/dist/commands/setup.js.map +1 -0
- package/dist/commands/slash/agents.d.ts +40 -0
- package/dist/commands/slash/agents.d.ts.map +1 -0
- package/dist/commands/slash/agents.js +519 -0
- package/dist/commands/slash/agents.js.map +1 -0
- package/dist/commands/slash/approve.d.ts +46 -0
- package/dist/commands/slash/approve.d.ts.map +1 -0
- package/dist/commands/slash/approve.js +239 -0
- package/dist/commands/slash/approve.js.map +1 -0
- package/dist/commands/slash/attach.d.ts +70 -0
- package/dist/commands/slash/attach.d.ts.map +1 -0
- package/dist/commands/slash/attach.js +333 -0
- package/dist/commands/slash/attach.js.map +1 -0
- package/dist/commands/slash/clear.d.ts +47 -0
- package/dist/commands/slash/clear.d.ts.map +1 -0
- package/dist/commands/slash/clear.js +261 -0
- package/dist/commands/slash/clear.js.map +1 -0
- package/dist/commands/slash/commit.d.ts +40 -0
- package/dist/commands/slash/commit.d.ts.map +1 -0
- package/dist/commands/slash/commit.js +337 -0
- package/dist/commands/slash/commit.js.map +1 -0
- package/dist/commands/slash/compact.d.ts +48 -0
- package/dist/commands/slash/compact.d.ts.map +1 -0
- package/dist/commands/slash/compact.js +288 -0
- package/dist/commands/slash/compact.js.map +1 -0
- package/dist/commands/slash/config.d.ts +20 -0
- package/dist/commands/slash/config.d.ts.map +1 -0
- package/dist/commands/slash/config.js +136 -0
- package/dist/commands/slash/config.js.map +1 -0
- package/dist/commands/slash/context.d.ts +49 -0
- package/dist/commands/slash/context.d.ts.map +1 -0
- package/dist/commands/slash/context.js +430 -0
- package/dist/commands/slash/context.js.map +1 -0
- package/dist/commands/slash/cost.d.ts +34 -0
- package/dist/commands/slash/cost.d.ts.map +1 -0
- package/dist/commands/slash/cost.js +312 -0
- package/dist/commands/slash/cost.js.map +1 -0
- package/dist/commands/slash/custom.d.ts +41 -0
- package/dist/commands/slash/custom.d.ts.map +1 -0
- package/dist/commands/slash/custom.js +126 -0
- package/dist/commands/slash/custom.js.map +1 -0
- package/dist/commands/slash/exit.d.ts +25 -0
- package/dist/commands/slash/exit.d.ts.map +1 -0
- package/dist/commands/slash/exit.js +186 -0
- package/dist/commands/slash/exit.js.map +1 -0
- package/dist/commands/slash/export.d.ts +27 -0
- package/dist/commands/slash/export.d.ts.map +1 -0
- package/dist/commands/slash/export.js +318 -0
- package/dist/commands/slash/export.js.map +1 -0
- package/dist/commands/slash/files.d.ts +47 -0
- package/dist/commands/slash/files.d.ts.map +1 -0
- package/dist/commands/slash/files.js +521 -0
- package/dist/commands/slash/files.js.map +1 -0
- package/dist/commands/slash/help.d.ts +50 -0
- package/dist/commands/slash/help.d.ts.map +1 -0
- package/dist/commands/slash/help.js +282 -0
- package/dist/commands/slash/help.js.map +1 -0
- package/dist/commands/slash/index-cmd.d.ts +41 -0
- package/dist/commands/slash/index-cmd.d.ts.map +1 -0
- package/dist/commands/slash/index-cmd.js +349 -0
- package/dist/commands/slash/index-cmd.js.map +1 -0
- package/dist/commands/slash/index.d.ts +97 -0
- package/dist/commands/slash/index.d.ts.map +1 -0
- package/dist/commands/slash/index.js +251 -0
- package/dist/commands/slash/index.js.map +1 -0
- package/dist/commands/slash/login.d.ts +23 -0
- package/dist/commands/slash/login.d.ts.map +1 -0
- package/dist/commands/slash/login.js +175 -0
- package/dist/commands/slash/login.js.map +1 -0
- package/dist/commands/slash/logout.d.ts +23 -0
- package/dist/commands/slash/logout.d.ts.map +1 -0
- package/dist/commands/slash/logout.js +153 -0
- package/dist/commands/slash/logout.js.map +1 -0
- package/dist/commands/slash/logs.d.ts +29 -0
- package/dist/commands/slash/logs.d.ts.map +1 -0
- package/dist/commands/slash/logs.js +423 -0
- package/dist/commands/slash/logs.js.map +1 -0
- package/dist/commands/slash/mcp.d.ts +29 -0
- package/dist/commands/slash/mcp.d.ts.map +1 -0
- package/dist/commands/slash/mcp.js +1026 -0
- package/dist/commands/slash/mcp.js.map +1 -0
- package/dist/commands/slash/model.d.ts +60 -0
- package/dist/commands/slash/model.d.ts.map +1 -0
- package/dist/commands/slash/model.js +466 -0
- package/dist/commands/slash/model.js.map +1 -0
- package/dist/commands/slash/personality.d.ts +40 -0
- package/dist/commands/slash/personality.d.ts.map +1 -0
- package/dist/commands/slash/personality.js +272 -0
- package/dist/commands/slash/personality.js.map +1 -0
- package/dist/commands/slash/purge.d.ts +42 -0
- package/dist/commands/slash/purge.d.ts.map +1 -0
- package/dist/commands/slash/purge.js +233 -0
- package/dist/commands/slash/purge.js.map +1 -0
- package/dist/commands/slash/reset.d.ts +44 -0
- package/dist/commands/slash/reset.d.ts.map +1 -0
- package/dist/commands/slash/reset.js +326 -0
- package/dist/commands/slash/reset.js.map +1 -0
- package/dist/commands/slash/skills.d.ts +40 -0
- package/dist/commands/slash/skills.d.ts.map +1 -0
- package/dist/commands/slash/skills.js +207 -0
- package/dist/commands/slash/skills.js.map +1 -0
- package/dist/commands/slash/tokens.d.ts +34 -0
- package/dist/commands/slash/tokens.d.ts.map +1 -0
- package/dist/commands/slash/tokens.js +205 -0
- package/dist/commands/slash/tokens.js.map +1 -0
- package/dist/commands/slash/unleash.d.ts +50 -0
- package/dist/commands/slash/unleash.d.ts.map +1 -0
- package/dist/commands/slash/unleash.js +262 -0
- package/dist/commands/slash/unleash.js.map +1 -0
- package/dist/commands/slash/update.d.ts +34 -0
- package/dist/commands/slash/update.d.ts.map +1 -0
- package/dist/commands/slash/update.js +364 -0
- package/dist/commands/slash/update.js.map +1 -0
- package/dist/commands/slash/wrap.d.ts +18 -0
- package/dist/commands/slash/wrap.d.ts.map +1 -0
- package/dist/commands/slash/wrap.js +21 -0
- package/dist/commands/slash/wrap.js.map +1 -0
- package/dist/commands/tokens.d.ts +26 -0
- package/dist/commands/tokens.d.ts.map +1 -0
- package/dist/commands/tokens.js +245 -0
- package/dist/commands/tokens.js.map +1 -0
- package/dist/constants/builtin-agents.d.ts +27 -0
- package/dist/constants/builtin-agents.d.ts.map +1 -0
- package/dist/constants/builtin-agents.js +710 -0
- package/dist/constants/builtin-agents.js.map +1 -0
- package/dist/constants/builtin-skills.d.ts +32 -0
- package/dist/constants/builtin-skills.d.ts.map +1 -0
- package/dist/constants/builtin-skills.js +389 -0
- package/dist/constants/builtin-skills.js.map +1 -0
- package/dist/constants/defaults.d.ts +448 -0
- package/dist/constants/defaults.d.ts.map +1 -0
- package/dist/constants/defaults.js +829 -0
- package/dist/constants/defaults.js.map +1 -0
- package/dist/constants/index.d.ts +27 -0
- package/dist/constants/index.d.ts.map +1 -0
- package/dist/constants/index.js +85 -0
- package/dist/constants/index.js.map +1 -0
- package/dist/constants/install-hints.d.ts +7 -0
- package/dist/constants/install-hints.d.ts.map +1 -0
- package/dist/constants/install-hints.js +123 -0
- package/dist/constants/install-hints.js.map +1 -0
- package/dist/constants/models.d.ts +255 -0
- package/dist/constants/models.d.ts.map +1 -0
- package/dist/constants/models.js +596 -0
- package/dist/constants/models.js.map +1 -0
- package/dist/constants/schedule.d.ts +43 -0
- package/dist/constants/schedule.d.ts.map +1 -0
- package/dist/constants/schedule.js +110 -0
- package/dist/constants/schedule.js.map +1 -0
- package/dist/constants/system-utilities.d.ts +57 -0
- package/dist/constants/system-utilities.d.ts.map +1 -0
- package/dist/constants/system-utilities.js +421 -0
- package/dist/constants/system-utilities.js.map +1 -0
- package/dist/constants/token-limits.d.ts +102 -0
- package/dist/constants/token-limits.d.ts.map +1 -0
- package/dist/constants/token-limits.js +286 -0
- package/dist/constants/token-limits.js.map +1 -0
- package/dist/core/autocomplete.d.ts +132 -0
- package/dist/core/autocomplete.d.ts.map +1 -0
- package/dist/core/autocomplete.js +653 -0
- package/dist/core/autocomplete.js.map +1 -0
- package/dist/core/command-parser.d.ts +301 -0
- package/dist/core/command-parser.d.ts.map +1 -0
- package/dist/core/command-parser.js +526 -0
- package/dist/core/command-parser.js.map +1 -0
- package/dist/core/context-builder.d.ts +264 -0
- package/dist/core/context-builder.d.ts.map +1 -0
- package/dist/core/context-builder.js +1018 -0
- package/dist/core/context-builder.js.map +1 -0
- package/dist/core/event-emitter.d.ts +411 -0
- package/dist/core/event-emitter.d.ts.map +1 -0
- package/dist/core/event-emitter.js +138 -0
- package/dist/core/event-emitter.js.map +1 -0
- package/dist/core/history-manager.d.ts +62 -0
- package/dist/core/history-manager.d.ts.map +1 -0
- package/dist/core/history-manager.js +151 -0
- package/dist/core/history-manager.js.map +1 -0
- package/dist/core/slash-command-handler.d.ts +352 -0
- package/dist/core/slash-command-handler.d.ts.map +1 -0
- package/dist/core/slash-command-handler.js +563 -0
- package/dist/core/slash-command-handler.js.map +1 -0
- package/dist/core/task-processor.d.ts +179 -0
- package/dist/core/task-processor.d.ts.map +1 -0
- package/dist/core/task-processor.js +519 -0
- package/dist/core/task-processor.js.map +1 -0
- package/dist/index.d.ts +90 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +4 -3
- package/dist/index.js.map +1 -0
- package/dist/prompts/agent-prompt-generator.d.ts +26 -0
- package/dist/prompts/agent-prompt-generator.d.ts.map +1 -0
- package/dist/prompts/agent-prompt-generator.js +244 -0
- package/dist/prompts/agent-prompt-generator.js.map +1 -0
- package/dist/prompts/commit-message.d.ts +35 -0
- package/dist/prompts/commit-message.d.ts.map +1 -0
- package/dist/prompts/commit-message.js +187 -0
- package/dist/prompts/commit-message.js.map +1 -0
- package/dist/prompts/conversation.d.ts +51 -0
- package/dist/prompts/conversation.d.ts.map +1 -0
- package/dist/prompts/conversation.js +115 -0
- package/dist/prompts/conversation.js.map +1 -0
- package/dist/prompts/index.d.ts +39 -0
- package/dist/prompts/index.d.ts.map +1 -0
- package/dist/prompts/index.js +74 -0
- package/dist/prompts/index.js.map +1 -0
- package/dist/prompts/memory.d.ts +6 -0
- package/dist/prompts/memory.d.ts.map +1 -0
- package/dist/prompts/memory.js +29 -0
- package/dist/prompts/memory.js.map +1 -0
- package/dist/prompts/personality.d.ts +77 -0
- package/dist/prompts/personality.d.ts.map +1 -0
- package/dist/prompts/personality.js +393 -0
- package/dist/prompts/personality.js.map +1 -0
- package/dist/prompts/plan-generator.d.ts +144 -0
- package/dist/prompts/plan-generator.d.ts.map +1 -0
- package/dist/prompts/plan-generator.js +553 -0
- package/dist/prompts/plan-generator.js.map +1 -0
- package/dist/prompts/system.d.ts +95 -0
- package/dist/prompts/system.d.ts.map +1 -0
- package/dist/prompts/system.js +461 -0
- package/dist/prompts/system.js.map +1 -0
- package/dist/prompts/task-processor.d.ts +94 -0
- package/dist/prompts/task-processor.d.ts.map +1 -0
- package/dist/prompts/task-processor.js +554 -0
- package/dist/prompts/task-processor.js.map +1 -0
- package/dist/prompts/unguarded.d.ts +78 -0
- package/dist/prompts/unguarded.d.ts.map +1 -0
- package/dist/prompts/unguarded.js +418 -0
- package/dist/prompts/unguarded.js.map +1 -0
- package/dist/prompts/utils.d.ts +73 -0
- package/dist/prompts/utils.d.ts.map +1 -0
- package/dist/prompts/utils.js +114 -0
- package/dist/prompts/utils.js.map +1 -0
- package/dist/prompts/workflow.d.ts +241 -0
- package/dist/prompts/workflow.d.ts.map +1 -0
- package/dist/prompts/workflow.js +608 -0
- package/dist/prompts/workflow.js.map +1 -0
- package/dist/services/action-logger.d.ts +383 -0
- package/dist/services/action-logger.d.ts.map +1 -0
- package/dist/services/action-logger.js +544 -0
- package/dist/services/action-logger.js.map +1 -0
- package/dist/services/agent-budget-allocator.d.ts +111 -0
- package/dist/services/agent-budget-allocator.d.ts.map +1 -0
- package/dist/services/agent-budget-allocator.js +278 -0
- package/dist/services/agent-budget-allocator.js.map +1 -0
- package/dist/services/agent-manager.d.ts +181 -0
- package/dist/services/agent-manager.d.ts.map +1 -0
- package/dist/services/agent-manager.js +749 -0
- package/dist/services/agent-manager.js.map +1 -0
- package/dist/services/agent-spawner.d.ts +138 -0
- package/dist/services/agent-spawner.d.ts.map +1 -0
- package/dist/services/agent-spawner.js +748 -0
- package/dist/services/agent-spawner.js.map +1 -0
- package/dist/services/agent-state-service.d.ts +145 -0
- package/dist/services/agent-state-service.d.ts.map +1 -0
- package/dist/services/agent-state-service.js +247 -0
- package/dist/services/agent-state-service.js.map +1 -0
- package/dist/services/anthropic-client.d.ts +357 -0
- package/dist/services/anthropic-client.d.ts.map +1 -0
- package/dist/services/anthropic-client.js +1451 -0
- package/dist/services/anthropic-client.js.map +1 -0
- package/dist/services/approval-manager.d.ts +385 -0
- package/dist/services/approval-manager.d.ts.map +1 -0
- package/dist/services/approval-manager.js +1044 -0
- package/dist/services/approval-manager.js.map +1 -0
- package/dist/services/audit-logger.d.ts +245 -0
- package/dist/services/audit-logger.d.ts.map +1 -0
- package/dist/services/audit-logger.js +324 -0
- package/dist/services/audit-logger.js.map +1 -0
- package/dist/services/backup-manager.d.ts +136 -0
- package/dist/services/backup-manager.d.ts.map +1 -0
- package/dist/services/backup-manager.js +260 -0
- package/dist/services/backup-manager.js.map +1 -0
- package/dist/services/cache-service.d.ts +247 -0
- package/dist/services/cache-service.d.ts.map +1 -0
- package/dist/services/cache-service.js +558 -0
- package/dist/services/cache-service.js.map +1 -0
- package/dist/services/chat-archival-service.d.ts +108 -0
- package/dist/services/chat-archival-service.d.ts.map +1 -0
- package/dist/services/chat-archival-service.js +465 -0
- package/dist/services/chat-archival-service.js.map +1 -0
- package/dist/services/codebase-indexer.d.ts +272 -0
- package/dist/services/codebase-indexer.d.ts.map +1 -0
- package/dist/services/codebase-indexer.js +863 -0
- package/dist/services/codebase-indexer.js.map +1 -0
- package/dist/services/compass-auth-service.d.ts +204 -0
- package/dist/services/compass-auth-service.d.ts.map +1 -0
- package/dist/services/compass-auth-service.js +391 -0
- package/dist/services/compass-auth-service.js.map +1 -0
- package/dist/services/complexity-classifier.d.ts +208 -0
- package/dist/services/complexity-classifier.d.ts.map +1 -0
- package/dist/services/complexity-classifier.js +1410 -0
- package/dist/services/complexity-classifier.js.map +1 -0
- package/dist/services/config-manager.d.ts +278 -0
- package/dist/services/config-manager.d.ts.map +1 -0
- package/dist/services/config-manager.js +651 -0
- package/dist/services/config-manager.js.map +1 -0
- package/dist/services/consent-manager.d.ts +239 -0
- package/dist/services/consent-manager.d.ts.map +1 -0
- package/dist/services/consent-manager.js +516 -0
- package/dist/services/consent-manager.js.map +1 -0
- package/dist/services/conversation-compactor.d.ts +223 -0
- package/dist/services/conversation-compactor.d.ts.map +1 -0
- package/dist/services/conversation-compactor.js +750 -0
- package/dist/services/conversation-compactor.js.map +1 -0
- package/dist/services/cost-tracker.d.ts +167 -0
- package/dist/services/cost-tracker.d.ts.map +1 -0
- package/dist/services/cost-tracker.js +199 -0
- package/dist/services/cost-tracker.js.map +1 -0
- package/dist/services/credential-store.d.ts +273 -0
- package/dist/services/credential-store.d.ts.map +1 -0
- package/dist/services/credential-store.js +877 -0
- package/dist/services/credential-store.js.map +1 -0
- package/dist/services/custom-command-service.d.ts +112 -0
- package/dist/services/custom-command-service.d.ts.map +1 -0
- package/dist/services/custom-command-service.js +464 -0
- package/dist/services/custom-command-service.js.map +1 -0
- package/dist/services/default-statusline-renderer.d.ts +60 -0
- package/dist/services/default-statusline-renderer.d.ts.map +1 -0
- package/dist/services/default-statusline-renderer.js +110 -0
- package/dist/services/default-statusline-renderer.js.map +1 -0
- package/dist/services/enhanced-context-gatherer.d.ts +116 -0
- package/dist/services/enhanced-context-gatherer.d.ts.map +1 -0
- package/dist/services/enhanced-context-gatherer.js +605 -0
- package/dist/services/enhanced-context-gatherer.js.map +1 -0
- package/dist/services/file-hash-tracker.d.ts +95 -0
- package/dist/services/file-hash-tracker.d.ts.map +1 -0
- package/dist/services/file-hash-tracker.js +199 -0
- package/dist/services/file-hash-tracker.js.map +1 -0
- package/dist/services/file-service.d.ts +274 -0
- package/dist/services/file-service.d.ts.map +1 -0
- package/dist/services/file-service.js +876 -0
- package/dist/services/file-service.js.map +1 -0
- package/dist/services/git-service.d.ts +536 -0
- package/dist/services/git-service.d.ts.map +1 -0
- package/dist/services/git-service.js +1215 -0
- package/dist/services/git-service.js.map +1 -0
- package/dist/services/hook-service.d.ts +148 -0
- package/dist/services/hook-service.d.ts.map +1 -0
- package/dist/services/hook-service.js +705 -0
- package/dist/services/hook-service.js.map +1 -0
- package/dist/services/ide-state-service.d.ts +114 -0
- package/dist/services/ide-state-service.d.ts.map +1 -0
- package/dist/services/ide-state-service.js +204 -0
- package/dist/services/ide-state-service.js.map +1 -0
- package/dist/services/interactive-clarifier.d.ts +90 -0
- package/dist/services/interactive-clarifier.d.ts.map +1 -0
- package/dist/services/interactive-clarifier.js +446 -0
- package/dist/services/interactive-clarifier.js.map +1 -0
- package/dist/services/iteration-scoper.d.ts +225 -0
- package/dist/services/iteration-scoper.d.ts.map +1 -0
- package/dist/services/iteration-scoper.js +387 -0
- package/dist/services/iteration-scoper.js.map +1 -0
- package/dist/services/llm-plan-generator.d.ts +44 -0
- package/dist/services/llm-plan-generator.d.ts.map +1 -0
- package/dist/services/llm-plan-generator.js +863 -0
- package/dist/services/llm-plan-generator.js.map +1 -0
- package/dist/services/llm-system-prompt-generator.d.ts +85 -0
- package/dist/services/llm-system-prompt-generator.d.ts.map +1 -0
- package/dist/services/llm-system-prompt-generator.js +257 -0
- package/dist/services/llm-system-prompt-generator.js.map +1 -0
- package/dist/services/log-interpreter.d.ts +190 -0
- package/dist/services/log-interpreter.d.ts.map +1 -0
- package/dist/services/log-interpreter.js +520 -0
- package/dist/services/log-interpreter.js.map +1 -0
- package/dist/services/mcp-config-manager.d.ts +141 -0
- package/dist/services/mcp-config-manager.d.ts.map +1 -0
- package/dist/services/mcp-config-manager.js +678 -0
- package/dist/services/mcp-config-manager.js.map +1 -0
- package/dist/services/mcp-oauth-service.d.ts +170 -0
- package/dist/services/mcp-oauth-service.d.ts.map +1 -0
- package/dist/services/mcp-oauth-service.js +892 -0
- package/dist/services/mcp-oauth-service.js.map +1 -0
- package/dist/services/mcp-plugin-support.d.ts +81 -0
- package/dist/services/mcp-plugin-support.d.ts.map +1 -0
- package/dist/services/mcp-plugin-support.js +305 -0
- package/dist/services/mcp-plugin-support.js.map +1 -0
- package/dist/services/mcp-server-manager.d.ts +134 -0
- package/dist/services/mcp-server-manager.d.ts.map +1 -0
- package/dist/services/mcp-server-manager.js +613 -0
- package/dist/services/mcp-server-manager.js.map +1 -0
- package/dist/services/mcp-tool-integration.d.ts +119 -0
- package/dist/services/mcp-tool-integration.d.ts.map +1 -0
- package/dist/services/mcp-tool-integration.js +381 -0
- package/dist/services/mcp-tool-integration.js.map +1 -0
- package/dist/services/mcp-transport.d.ts +105 -0
- package/dist/services/mcp-transport.d.ts.map +1 -0
- package/dist/services/mcp-transport.js +1316 -0
- package/dist/services/mcp-transport.js.map +1 -0
- package/dist/services/memory-service.d.ts +55 -0
- package/dist/services/memory-service.d.ts.map +1 -0
- package/dist/services/memory-service.js +251 -0
- package/dist/services/memory-service.js.map +1 -0
- package/dist/services/model-availability.d.ts +64 -0
- package/dist/services/model-availability.d.ts.map +1 -0
- package/dist/services/model-availability.js +114 -0
- package/dist/services/model-availability.js.map +1 -0
- package/dist/services/plan-generator.d.ts +98 -0
- package/dist/services/plan-generator.d.ts.map +1 -0
- package/dist/services/plan-generator.js +658 -0
- package/dist/services/plan-generator.js.map +1 -0
- package/dist/services/plan-mode-fallback.d.ts +80 -0
- package/dist/services/plan-mode-fallback.d.ts.map +1 -0
- package/dist/services/plan-mode-fallback.js +307 -0
- package/dist/services/plan-mode-fallback.js.map +1 -0
- package/dist/services/plan-mode-handler.d.ts +42 -0
- package/dist/services/plan-mode-handler.d.ts.map +1 -0
- package/dist/services/plan-mode-handler.js +388 -0
- package/dist/services/plan-mode-handler.js.map +1 -0
- package/dist/services/plan-persistence.d.ts +203 -0
- package/dist/services/plan-persistence.d.ts.map +1 -0
- package/dist/services/plan-persistence.js +538 -0
- package/dist/services/plan-persistence.js.map +1 -0
- package/dist/services/prompt-preprocessor.d.ts +73 -0
- package/dist/services/prompt-preprocessor.d.ts.map +1 -0
- package/dist/services/prompt-preprocessor.js +146 -0
- package/dist/services/prompt-preprocessor.js.map +1 -0
- package/dist/services/rating-service.d.ts +84 -0
- package/dist/services/rating-service.d.ts.map +1 -0
- package/dist/services/rating-service.js +171 -0
- package/dist/services/rating-service.js.map +1 -0
- package/dist/services/rating-state-manager.d.ts +131 -0
- package/dist/services/rating-state-manager.d.ts.map +1 -0
- package/dist/services/rating-state-manager.js +270 -0
- package/dist/services/rating-state-manager.js.map +1 -0
- package/dist/services/sdk-runner.d.ts +113 -0
- package/dist/services/sdk-runner.d.ts.map +1 -0
- package/dist/services/sdk-runner.js +1424 -0
- package/dist/services/sdk-runner.js.map +1 -0
- package/dist/services/session-manager.d.ts +528 -0
- package/dist/services/session-manager.d.ts.map +1 -0
- package/dist/services/session-manager.js +1184 -0
- package/dist/services/session-manager.js.map +1 -0
- package/dist/services/shell-executor.d.ts +337 -0
- package/dist/services/shell-executor.d.ts.map +1 -0
- package/dist/services/shell-executor.js +1201 -0
- package/dist/services/shell-executor.js.map +1 -0
- package/dist/services/skill-service.d.ts +149 -0
- package/dist/services/skill-service.d.ts.map +1 -0
- package/dist/services/skill-service.js +594 -0
- package/dist/services/skill-service.js.map +1 -0
- package/dist/services/statusline-executor.d.ts +102 -0
- package/dist/services/statusline-executor.d.ts.map +1 -0
- package/dist/services/statusline-executor.js +305 -0
- package/dist/services/statusline-executor.js.map +1 -0
- package/dist/services/step-tracker.d.ts +356 -0
- package/dist/services/step-tracker.d.ts.map +1 -0
- package/dist/services/step-tracker.js +634 -0
- package/dist/services/step-tracker.js.map +1 -0
- package/dist/services/system-event-logger.d.ts +473 -0
- package/dist/services/system-event-logger.d.ts.map +1 -0
- package/dist/services/system-event-logger.js +790 -0
- package/dist/services/system-event-logger.js.map +1 -0
- package/dist/services/system-utility-detector.d.ts +91 -0
- package/dist/services/system-utility-detector.d.ts.map +1 -0
- package/dist/services/system-utility-detector.js +238 -0
- package/dist/services/system-utility-detector.js.map +1 -0
- package/dist/services/team-context-store.d.ts +100 -0
- package/dist/services/team-context-store.d.ts.map +1 -0
- package/dist/services/team-context-store.js +513 -0
- package/dist/services/team-context-store.js.map +1 -0
- package/dist/services/temp-file-service.d.ts +164 -0
- package/dist/services/temp-file-service.d.ts.map +1 -0
- package/dist/services/temp-file-service.js +303 -0
- package/dist/services/temp-file-service.js.map +1 -0
- package/dist/services/token-limit-enforcer.d.ts +53 -0
- package/dist/services/token-limit-enforcer.d.ts.map +1 -0
- package/dist/services/token-limit-enforcer.js +90 -0
- package/dist/services/token-limit-enforcer.js.map +1 -0
- package/dist/services/token-limit-store.d.ts +105 -0
- package/dist/services/token-limit-store.d.ts.map +1 -0
- package/dist/services/token-limit-store.js +288 -0
- package/dist/services/token-limit-store.js.map +1 -0
- package/dist/services/token-tracker.d.ts +290 -0
- package/dist/services/token-tracker.d.ts.map +1 -0
- package/dist/services/token-tracker.js +751 -0
- package/dist/services/token-tracker.js.map +1 -0
- package/dist/services/tool-registry.d.ts +302 -0
- package/dist/services/tool-registry.d.ts.map +1 -0
- package/dist/services/tool-registry.js +606 -0
- package/dist/services/tool-registry.js.map +1 -0
- package/dist/services/tools-logger.d.ts +152 -0
- package/dist/services/tools-logger.d.ts.map +1 -0
- package/dist/services/tools-logger.js +222 -0
- package/dist/services/tools-logger.js.map +1 -0
- package/dist/services/update-plan-handler.d.ts +56 -0
- package/dist/services/update-plan-handler.d.ts.map +1 -0
- package/dist/services/update-plan-handler.js +372 -0
- package/dist/services/update-plan-handler.js.map +1 -0
- package/dist/services/update-service.d.ts +197 -0
- package/dist/services/update-service.d.ts.map +1 -0
- package/dist/services/update-service.js +749 -0
- package/dist/services/update-service.js.map +1 -0
- package/dist/services/verifier.d.ts +113 -0
- package/dist/services/verifier.d.ts.map +1 -0
- package/dist/services/verifier.js +541 -0
- package/dist/services/verifier.js.map +1 -0
- package/dist/services/workflow-manager.d.ts +277 -0
- package/dist/services/workflow-manager.d.ts.map +1 -0
- package/dist/services/workflow-manager.js +616 -0
- package/dist/services/workflow-manager.js.map +1 -0
- package/dist/services/workflow-orchestrator.d.ts +148 -0
- package/dist/services/workflow-orchestrator.d.ts.map +1 -0
- package/dist/services/workflow-orchestrator.js +617 -0
- package/dist/services/workflow-orchestrator.js.map +1 -0
- package/dist/services/worktree-manager.d.ts +36 -0
- package/dist/services/worktree-manager.d.ts.map +1 -0
- package/dist/services/worktree-manager.js +185 -0
- package/dist/services/worktree-manager.js.map +1 -0
- package/dist/templates/ascii-art.d.ts +136 -0
- package/dist/templates/ascii-art.d.ts.map +1 -0
- package/dist/templates/ascii-art.js +286 -0
- package/dist/templates/ascii-art.js.map +1 -0
- package/dist/templates/help.d.ts +186 -0
- package/dist/templates/help.d.ts.map +1 -0
- package/dist/templates/help.js +588 -0
- package/dist/templates/help.js.map +1 -0
- package/dist/templates/prompts/workflow-prompts.d.ts +9 -0
- package/dist/templates/prompts/workflow-prompts.d.ts.map +1 -0
- package/dist/templates/prompts/workflow-prompts.js +9 -0
- package/dist/templates/prompts/workflow-prompts.js.map +1 -0
- package/dist/tools/agent-tools.d.ts +9 -0
- package/dist/tools/agent-tools.d.ts.map +1 -0
- package/dist/tools/agent-tools.js +349 -0
- package/dist/tools/agent-tools.js.map +1 -0
- package/dist/tools/edit-replacers.d.ts +90 -0
- package/dist/tools/edit-replacers.d.ts.map +1 -0
- package/dist/tools/edit-replacers.js +553 -0
- package/dist/tools/edit-replacers.js.map +1 -0
- package/dist/tools/file-tools.d.ts +13 -0
- package/dist/tools/file-tools.d.ts.map +1 -0
- package/dist/tools/file-tools.js +954 -0
- package/dist/tools/file-tools.js.map +1 -0
- package/dist/tools/git-tools.d.ts +9 -0
- package/dist/tools/git-tools.d.ts.map +1 -0
- package/dist/tools/git-tools.js +261 -0
- package/dist/tools/git-tools.js.map +1 -0
- package/dist/tools/index.d.ts +13 -0
- package/dist/tools/index.d.ts.map +1 -0
- package/dist/tools/index.js +70 -0
- package/dist/tools/index.js.map +1 -0
- package/dist/tools/network-tools.d.ts +8 -0
- package/dist/tools/network-tools.d.ts.map +1 -0
- package/dist/tools/network-tools.js +261 -0
- package/dist/tools/network-tools.js.map +1 -0
- package/dist/tools/openai-tools.d.ts +16 -0
- package/dist/tools/openai-tools.d.ts.map +1 -0
- package/dist/tools/openai-tools.js +385 -0
- package/dist/tools/openai-tools.js.map +1 -0
- package/dist/tools/plan-tools.d.ts +9 -0
- package/dist/tools/plan-tools.d.ts.map +1 -0
- package/dist/tools/plan-tools.js +223 -0
- package/dist/tools/plan-tools.js.map +1 -0
- package/dist/tools/schedule-tools.d.ts +9 -0
- package/dist/tools/schedule-tools.d.ts.map +1 -0
- package/dist/tools/schedule-tools.js +405 -0
- package/dist/tools/schedule-tools.js.map +1 -0
- package/dist/tools/search-tools.d.ts +8 -0
- package/dist/tools/search-tools.d.ts.map +1 -0
- package/dist/tools/search-tools.js +357 -0
- package/dist/tools/search-tools.js.map +1 -0
- package/dist/tools/shared-utils.d.ts +91 -0
- package/dist/tools/shared-utils.d.ts.map +1 -0
- package/dist/tools/shared-utils.js +385 -0
- package/dist/tools/shared-utils.js.map +1 -0
- package/dist/tools/shell-tools.d.ts +9 -0
- package/dist/tools/shell-tools.d.ts.map +1 -0
- package/dist/tools/shell-tools.js +409 -0
- package/dist/tools/shell-tools.js.map +1 -0
- package/dist/tools/skill-tools.d.ts +13 -0
- package/dist/tools/skill-tools.d.ts.map +1 -0
- package/dist/tools/skill-tools.js +244 -0
- package/dist/tools/skill-tools.js.map +1 -0
- package/dist/tools/swarm-tools.d.ts +9 -0
- package/dist/tools/swarm-tools.d.ts.map +1 -0
- package/dist/tools/swarm-tools.js +422 -0
- package/dist/tools/swarm-tools.js.map +1 -0
- package/dist/tools/user-tools.d.ts +13 -0
- package/dist/tools/user-tools.d.ts.map +1 -0
- package/dist/tools/user-tools.js +232 -0
- package/dist/tools/user-tools.js.map +1 -0
- package/dist/types/agent-process.d.ts +244 -0
- package/dist/types/agent-process.d.ts.map +1 -0
- package/dist/types/agent-process.js +93 -0
- package/dist/types/agent-process.js.map +1 -0
- package/dist/types/agent.d.ts +358 -0
- package/dist/types/agent.d.ts.map +1 -0
- package/dist/types/agent.js +171 -0
- package/dist/types/agent.js.map +1 -0
- package/dist/types/anthropic.d.ts +438 -0
- package/dist/types/anthropic.d.ts.map +1 -0
- package/dist/types/anthropic.js +9 -0
- package/dist/types/anthropic.js.map +1 -0
- package/dist/types/approval.d.ts +332 -0
- package/dist/types/approval.d.ts.map +1 -0
- package/dist/types/approval.js +44 -0
- package/dist/types/approval.js.map +1 -0
- package/dist/types/autocomplete.d.ts +57 -0
- package/dist/types/autocomplete.d.ts.map +1 -0
- package/dist/types/autocomplete.js +7 -0
- package/dist/types/autocomplete.js.map +1 -0
- package/dist/types/chat-archive.d.ts +161 -0
- package/dist/types/chat-archive.d.ts.map +1 -0
- package/dist/types/chat-archive.js +36 -0
- package/dist/types/chat-archive.js.map +1 -0
- package/dist/types/config.d.ts +268 -0
- package/dist/types/config.d.ts.map +1 -0
- package/dist/types/config.js +188 -0
- package/dist/types/config.js.map +1 -0
- package/dist/types/consent.d.ts +191 -0
- package/dist/types/consent.d.ts.map +1 -0
- package/dist/types/consent.js +119 -0
- package/dist/types/consent.js.map +1 -0
- package/dist/types/custom-command.d.ts +139 -0
- package/dist/types/custom-command.d.ts.map +1 -0
- package/dist/types/custom-command.js +7 -0
- package/dist/types/custom-command.js.map +1 -0
- package/dist/types/git.d.ts +20 -0
- package/dist/types/git.d.ts.map +1 -0
- package/dist/types/git.js +2 -0
- package/dist/types/git.js.map +1 -0
- package/dist/types/hook.d.ts +342 -0
- package/dist/types/hook.d.ts.map +1 -0
- package/dist/types/hook.js +84 -0
- package/dist/types/hook.js.map +1 -0
- package/dist/types/index.d.ts +86 -0
- package/dist/types/index.d.ts.map +1 -0
- package/dist/types/index.js +71 -0
- package/dist/types/index.js.map +1 -0
- package/dist/types/mcp.d.ts +456 -0
- package/dist/types/mcp.d.ts.map +1 -0
- package/dist/types/mcp.js +94 -0
- package/dist/types/mcp.js.map +1 -0
- package/dist/types/rating.d.ts +110 -0
- package/dist/types/rating.d.ts.map +1 -0
- package/dist/types/rating.js +53 -0
- package/dist/types/rating.js.map +1 -0
- package/dist/types/schedule.d.ts +91 -0
- package/dist/types/schedule.d.ts.map +1 -0
- package/dist/types/schedule.js +8 -0
- package/dist/types/schedule.js.map +1 -0
- package/dist/types/session.d.ts +361 -0
- package/dist/types/session.d.ts.map +1 -0
- package/dist/types/session.js +9 -0
- package/dist/types/session.js.map +1 -0
- package/dist/types/skill.d.ts +258 -0
- package/dist/types/skill.d.ts.map +1 -0
- package/dist/types/skill.js +79 -0
- package/dist/types/skill.js.map +1 -0
- package/dist/types/statusline.d.ts +212 -0
- package/dist/types/statusline.d.ts.map +1 -0
- package/dist/types/statusline.js +8 -0
- package/dist/types/statusline.js.map +1 -0
- package/dist/types/stream.d.ts +61 -0
- package/dist/types/stream.d.ts.map +1 -0
- package/dist/types/stream.js +17 -0
- package/dist/types/stream.js.map +1 -0
- package/dist/types/swarm.d.ts +132 -0
- package/dist/types/swarm.d.ts.map +1 -0
- package/dist/types/swarm.js +21 -0
- package/dist/types/swarm.js.map +1 -0
- package/dist/types/token-limits.d.ts +107 -0
- package/dist/types/token-limits.d.ts.map +1 -0
- package/dist/types/token-limits.js +57 -0
- package/dist/types/token-limits.js.map +1 -0
- package/dist/types/token.d.ts +329 -0
- package/dist/types/token.d.ts.map +1 -0
- package/dist/types/token.js +9 -0
- package/dist/types/token.js.map +1 -0
- package/dist/types/update.d.ts +189 -0
- package/dist/types/update.d.ts.map +1 -0
- package/dist/types/update.js +55 -0
- package/dist/types/update.js.map +1 -0
- package/dist/types/workflow.d.ts +396 -0
- package/dist/types/workflow.d.ts.map +1 -0
- package/dist/types/workflow.js +46 -0
- package/dist/types/workflow.js.map +1 -0
- package/dist/ui/App.d.ts +62 -0
- package/dist/ui/App.d.ts.map +1 -0
- package/dist/ui/App.js +511 -0
- package/dist/ui/App.js.map +1 -0
- package/dist/ui/InteractiveSession.d.ts +34 -0
- package/dist/ui/InteractiveSession.d.ts.map +1 -0
- package/dist/ui/InteractiveSession.js +3611 -0
- package/dist/ui/InteractiveSession.js.map +1 -0
- package/dist/ui/MCPApprovalPrompt.d.ts +27 -0
- package/dist/ui/MCPApprovalPrompt.d.ts.map +1 -0
- package/dist/ui/MCPApprovalPrompt.js +51 -0
- package/dist/ui/MCPApprovalPrompt.js.map +1 -0
- package/dist/ui/SetupWizard.d.ts +26 -0
- package/dist/ui/SetupWizard.d.ts.map +1 -0
- package/dist/ui/SetupWizard.js +396 -0
- package/dist/ui/SetupWizard.js.map +1 -0
- package/dist/ui/components/AgentCreationWizard.d.ts +36 -0
- package/dist/ui/components/AgentCreationWizard.d.ts.map +1 -0
- package/dist/ui/components/AgentCreationWizard.js +619 -0
- package/dist/ui/components/AgentCreationWizard.js.map +1 -0
- package/dist/ui/components/AgentManager.d.ts +41 -0
- package/dist/ui/components/AgentManager.d.ts.map +1 -0
- package/dist/ui/components/AgentManager.js +343 -0
- package/dist/ui/components/AgentManager.js.map +1 -0
- package/dist/ui/components/ApprovalDialog.d.ts +18 -0
- package/dist/ui/components/ApprovalDialog.d.ts.map +1 -0
- package/dist/ui/components/ApprovalDialog.js +439 -0
- package/dist/ui/components/ApprovalDialog.js.map +1 -0
- package/dist/ui/components/AsciiArt.d.ts +54 -0
- package/dist/ui/components/AsciiArt.d.ts.map +1 -0
- package/dist/ui/components/AsciiArt.js +89 -0
- package/dist/ui/components/AsciiArt.js.map +1 -0
- package/dist/ui/components/ClarificationWizard.d.ts +36 -0
- package/dist/ui/components/ClarificationWizard.d.ts.map +1 -0
- package/dist/ui/components/ClarificationWizard.js +407 -0
- package/dist/ui/components/ClarificationWizard.js.map +1 -0
- package/dist/ui/components/CompassSpinner.d.ts +15 -0
- package/dist/ui/components/CompassSpinner.d.ts.map +1 -0
- package/dist/ui/components/CompassSpinner.js +50 -0
- package/dist/ui/components/CompassSpinner.js.map +1 -0
- package/dist/ui/components/ConfirmationSelector.d.ts +45 -0
- package/dist/ui/components/ConfirmationSelector.d.ts.map +1 -0
- package/dist/ui/components/ConfirmationSelector.js +106 -0
- package/dist/ui/components/ConfirmationSelector.js.map +1 -0
- package/dist/ui/components/ContextUsage.d.ts +76 -0
- package/dist/ui/components/ContextUsage.d.ts.map +1 -0
- package/dist/ui/components/ContextUsage.js +188 -0
- package/dist/ui/components/ContextUsage.js.map +1 -0
- package/dist/ui/components/DiffPreview.d.ts +13 -0
- package/dist/ui/components/DiffPreview.d.ts.map +1 -0
- package/dist/ui/components/DiffPreview.js +30 -0
- package/dist/ui/components/DiffPreview.js.map +1 -0
- package/dist/ui/components/ExecutionModeSelector.d.ts +45 -0
- package/dist/ui/components/ExecutionModeSelector.d.ts.map +1 -0
- package/dist/ui/components/ExecutionModeSelector.js +120 -0
- package/dist/ui/components/ExecutionModeSelector.js.map +1 -0
- package/dist/ui/components/FileTree.d.ts +47 -0
- package/dist/ui/components/FileTree.d.ts.map +1 -0
- package/dist/ui/components/FileTree.js +258 -0
- package/dist/ui/components/FileTree.js.map +1 -0
- package/dist/ui/components/HelpMenu.d.ts +49 -0
- package/dist/ui/components/HelpMenu.d.ts.map +1 -0
- package/dist/ui/components/HelpMenu.js +91 -0
- package/dist/ui/components/HelpMenu.js.map +1 -0
- package/dist/ui/components/InterleavedStream.d.ts +42 -0
- package/dist/ui/components/InterleavedStream.d.ts.map +1 -0
- package/dist/ui/components/InterleavedStream.js +1500 -0
- package/dist/ui/components/InterleavedStream.js.map +1 -0
- package/dist/ui/components/ModelSelector.d.ts +81 -0
- package/dist/ui/components/ModelSelector.d.ts.map +1 -0
- package/dist/ui/components/ModelSelector.js +305 -0
- package/dist/ui/components/ModelSelector.js.map +1 -0
- package/dist/ui/components/PlanApprovalDialog.d.ts +21 -0
- package/dist/ui/components/PlanApprovalDialog.d.ts.map +1 -0
- package/dist/ui/components/PlanApprovalDialog.js +189 -0
- package/dist/ui/components/PlanApprovalDialog.js.map +1 -0
- package/dist/ui/components/PlanExecutionTracker.d.ts +53 -0
- package/dist/ui/components/PlanExecutionTracker.d.ts.map +1 -0
- package/dist/ui/components/PlanExecutionTracker.js +113 -0
- package/dist/ui/components/PlanExecutionTracker.js.map +1 -0
- package/dist/ui/components/ProgressIndicator.d.ts +151 -0
- package/dist/ui/components/ProgressIndicator.d.ts.map +1 -0
- package/dist/ui/components/ProgressIndicator.js +171 -0
- package/dist/ui/components/ProgressIndicator.js.map +1 -0
- package/dist/ui/components/Prompt.d.ts +47 -0
- package/dist/ui/components/Prompt.d.ts.map +1 -0
- package/dist/ui/components/Prompt.js +632 -0
- package/dist/ui/components/Prompt.js.map +1 -0
- package/dist/ui/components/RatingPanel.d.ts +45 -0
- package/dist/ui/components/RatingPanel.d.ts.map +1 -0
- package/dist/ui/components/RatingPanel.js +119 -0
- package/dist/ui/components/RatingPanel.js.map +1 -0
- package/dist/ui/components/StatusLine.d.ts +43 -0
- package/dist/ui/components/StatusLine.d.ts.map +1 -0
- package/dist/ui/components/StatusLine.js +44 -0
- package/dist/ui/components/StatusLine.js.map +1 -0
- package/dist/ui/components/StreamingResponse.d.ts +45 -0
- package/dist/ui/components/StreamingResponse.d.ts.map +1 -0
- package/dist/ui/components/StreamingResponse.js +56 -0
- package/dist/ui/components/StreamingResponse.js.map +1 -0
- package/dist/ui/components/TokenUsage.d.ts +89 -0
- package/dist/ui/components/TokenUsage.d.ts.map +1 -0
- package/dist/ui/components/TokenUsage.js +99 -0
- package/dist/ui/components/TokenUsage.js.map +1 -0
- package/dist/ui/components/ToolSummary.d.ts +77 -0
- package/dist/ui/components/ToolSummary.d.ts.map +1 -0
- package/dist/ui/components/ToolSummary.js +162 -0
- package/dist/ui/components/ToolSummary.js.map +1 -0
- package/dist/ui/components/UpdateNotification.d.ts +65 -0
- package/dist/ui/components/UpdateNotification.d.ts.map +1 -0
- package/dist/ui/components/UpdateNotification.js +166 -0
- package/dist/ui/components/UpdateNotification.js.map +1 -0
- package/dist/ui/diff-renderer.d.ts +18 -0
- package/dist/ui/diff-renderer.d.ts.map +1 -0
- package/dist/ui/diff-renderer.js +206 -0
- package/dist/ui/diff-renderer.js.map +1 -0
- package/dist/ui/themes/markdown-theme.d.ts +48 -0
- package/dist/ui/themes/markdown-theme.d.ts.map +1 -0
- package/dist/ui/themes/markdown-theme.js +79 -0
- package/dist/ui/themes/markdown-theme.js.map +1 -0
- package/dist/ui/themes/ui-theme.d.ts +301 -0
- package/dist/ui/themes/ui-theme.d.ts.map +1 -0
- package/dist/ui/themes/ui-theme.js +204 -0
- package/dist/ui/themes/ui-theme.js.map +1 -0
- package/dist/utils/attachment-handler.d.ts +129 -0
- package/dist/utils/attachment-handler.d.ts.map +1 -0
- package/dist/utils/attachment-handler.js +280 -0
- package/dist/utils/attachment-handler.js.map +1 -0
- package/dist/utils/backup-cleanup.d.ts +28 -0
- package/dist/utils/backup-cleanup.d.ts.map +1 -0
- package/dist/utils/backup-cleanup.js +99 -0
- package/dist/utils/backup-cleanup.js.map +1 -0
- package/dist/utils/clipboard-handler.d.ts +82 -0
- package/dist/utils/clipboard-handler.d.ts.map +1 -0
- package/dist/utils/clipboard-handler.js +311 -0
- package/dist/utils/clipboard-handler.js.map +1 -0
- package/dist/utils/cloud-detection.d.ts +14 -0
- package/dist/utils/cloud-detection.d.ts.map +1 -0
- package/dist/utils/cloud-detection.js +92 -0
- package/dist/utils/cloud-detection.js.map +1 -0
- package/dist/utils/command-parser.d.ts +56 -0
- package/dist/utils/command-parser.d.ts.map +1 -0
- package/dist/utils/command-parser.js +206 -0
- package/dist/utils/command-parser.js.map +1 -0
- package/dist/utils/console-capture.d.ts +30 -0
- package/dist/utils/console-capture.d.ts.map +1 -0
- package/dist/utils/console-capture.js +88 -0
- package/dist/utils/console-capture.js.map +1 -0
- package/dist/utils/cron-parser.d.ts +52 -0
- package/dist/utils/cron-parser.d.ts.map +1 -0
- package/dist/utils/cron-parser.js +455 -0
- package/dist/utils/cron-parser.js.map +1 -0
- package/dist/utils/crypto.d.ts +351 -0
- package/dist/utils/crypto.d.ts.map +1 -0
- package/dist/utils/crypto.js +615 -0
- package/dist/utils/crypto.js.map +1 -0
- package/dist/utils/diff.d.ts +311 -0
- package/dist/utils/diff.d.ts.map +1 -0
- package/dist/utils/diff.js +566 -0
- package/dist/utils/diff.js.map +1 -0
- package/dist/utils/editor.d.ts +12 -0
- package/dist/utils/editor.d.ts.map +1 -0
- package/dist/utils/editor.js +30 -0
- package/dist/utils/editor.js.map +1 -0
- package/dist/utils/file-system.d.ts +512 -0
- package/dist/utils/file-system.d.ts.map +1 -0
- package/dist/utils/file-system.js +798 -0
- package/dist/utils/file-system.js.map +1 -0
- package/dist/utils/format.d.ts +318 -0
- package/dist/utils/format.d.ts.map +1 -0
- package/dist/utils/format.js +587 -0
- package/dist/utils/format.js.map +1 -0
- package/dist/utils/ignore-patterns.d.ts +93 -0
- package/dist/utils/ignore-patterns.d.ts.map +1 -0
- package/dist/utils/ignore-patterns.js +710 -0
- package/dist/utils/ignore-patterns.js.map +1 -0
- package/dist/utils/log-cleanup.d.ts +16 -0
- package/dist/utils/log-cleanup.d.ts.map +1 -0
- package/dist/utils/log-cleanup.js +51 -0
- package/dist/utils/log-cleanup.js.map +1 -0
- package/dist/utils/logger.d.ts +305 -0
- package/dist/utils/logger.d.ts.map +1 -0
- package/dist/utils/logger.js +447 -0
- package/dist/utils/logger.js.map +1 -0
- package/dist/utils/path.d.ts +406 -0
- package/dist/utils/path.d.ts.map +1 -0
- package/dist/utils/path.js +549 -0
- package/dist/utils/path.js.map +1 -0
- package/dist/utils/schedule-file.d.ts +63 -0
- package/dist/utils/schedule-file.d.ts.map +1 -0
- package/dist/utils/schedule-file.js +244 -0
- package/dist/utils/schedule-file.js.map +1 -0
- package/dist/utils/task-id.d.ts +29 -0
- package/dist/utils/task-id.d.ts.map +1 -0
- package/dist/utils/task-id.js +53 -0
- package/dist/utils/task-id.js.map +1 -0
- package/dist/utils/temp-cleanup.d.ts +46 -0
- package/dist/utils/temp-cleanup.d.ts.map +1 -0
- package/dist/utils/temp-cleanup.js +95 -0
- package/dist/utils/temp-cleanup.js.map +1 -0
- package/dist/utils/terminal-output.d.ts +34 -0
- package/dist/utils/terminal-output.d.ts.map +1 -0
- package/dist/utils/terminal-output.js +40 -0
- package/dist/utils/terminal-output.js.map +1 -0
- package/dist/utils/token-counter.d.ts +224 -0
- package/dist/utils/token-counter.d.ts.map +1 -0
- package/dist/utils/token-counter.js +332 -0
- package/dist/utils/token-counter.js.map +1 -0
- package/dist/utils/tool-mapper.d.ts +70 -0
- package/dist/utils/tool-mapper.d.ts.map +1 -0
- package/dist/utils/tool-mapper.js +234 -0
- package/dist/utils/tool-mapper.js.map +1 -0
- package/package.json +2 -1
- package/scripts/preuninstall.mjs +99 -0
|
@@ -0,0 +1,1184 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Session management service for conversation state persistence.
|
|
3
|
+
*
|
|
4
|
+
* This module provides comprehensive session management functionality for the Compass CLI,
|
|
5
|
+
* including creating, saving, loading, and persisting session state with conversation history,
|
|
6
|
+
* operations tracking, and metadata management.
|
|
7
|
+
*/
|
|
8
|
+
import path from 'path';
|
|
9
|
+
import { v4 as uuidv4 } from 'uuid';
|
|
10
|
+
import { ApprovalMode } from '../types/approval.js';
|
|
11
|
+
import { getGlobalCompassDir, getProjectCompassDir } from '../utils/path.js';
|
|
12
|
+
import { safeReadJson, safeWriteJson, pathExists, ensureDir, readDir, } from '../utils/file-system.js';
|
|
13
|
+
import { formatTimestamp } from '../utils/format.js';
|
|
14
|
+
import { DEFAULT_PERSONALITY_MODE } from '../constants/index.js';
|
|
15
|
+
import { logger } from '../utils/logger.js';
|
|
16
|
+
import { SESSION_FILE_NAME, SAVED_SESSIONS_DIR, DEFAULT_MODEL, MAX_HISTORY_LENGTH, AUTO_SAVE_INTERVAL_MS, } from '../constants/defaults.js';
|
|
17
|
+
import { getEventEmitter } from '../core/event-emitter.js';
|
|
18
|
+
import { createChatArchivalService, } from './chat-archival-service.js';
|
|
19
|
+
/**
|
|
20
|
+
* SessionManager class provides comprehensive session state management.
|
|
21
|
+
*
|
|
22
|
+
* Features:
|
|
23
|
+
* - Session creation and initialization
|
|
24
|
+
* - Conversation history management with automatic trimming
|
|
25
|
+
* - Operation tracking for file modifications and commands
|
|
26
|
+
* - Token usage and cost tracking
|
|
27
|
+
* - Session persistence with auto-save capability
|
|
28
|
+
* - Named session save/load for session restoration
|
|
29
|
+
* - Compacted summary support for conversation compaction
|
|
30
|
+
*/
|
|
31
|
+
class SessionManager {
|
|
32
|
+
session = null;
|
|
33
|
+
projectRoot = process.cwd();
|
|
34
|
+
autoSaveTimer = null;
|
|
35
|
+
dirty = false;
|
|
36
|
+
/** Transient unguarded mode flag - NOT persisted to session.json */
|
|
37
|
+
unguardedMode = false;
|
|
38
|
+
/** Pending attachments for the next message - NOT persisted to session.json */
|
|
39
|
+
pendingAttachments = [];
|
|
40
|
+
/** Chat archival service instance */
|
|
41
|
+
archivalService = null;
|
|
42
|
+
/**
|
|
43
|
+
* Creates a new session with default state.
|
|
44
|
+
*
|
|
45
|
+
* @param projectPath - Optional project root path. Defaults to current working directory.
|
|
46
|
+
* @returns The newly created Session object
|
|
47
|
+
*
|
|
48
|
+
* @example
|
|
49
|
+
* ```typescript
|
|
50
|
+
* const sessionManager = getSessionManager();
|
|
51
|
+
* const session = sessionManager.createSession('/path/to/project');
|
|
52
|
+
* console.log(session.id); // UUID of the new session
|
|
53
|
+
* ```
|
|
54
|
+
*/
|
|
55
|
+
createSession(projectPath) {
|
|
56
|
+
this.projectRoot = projectPath || process.cwd();
|
|
57
|
+
this.session = {
|
|
58
|
+
id: uuidv4(),
|
|
59
|
+
createdAt: formatTimestamp(),
|
|
60
|
+
updatedAt: formatTimestamp(),
|
|
61
|
+
projectPath: this.projectRoot,
|
|
62
|
+
state: {
|
|
63
|
+
conversationHistory: [],
|
|
64
|
+
operations: [],
|
|
65
|
+
currentModel: DEFAULT_MODEL,
|
|
66
|
+
approvalMode: ApprovalMode.MANUAL,
|
|
67
|
+
contextFiles: [],
|
|
68
|
+
executionMode: 'hybrid', // Default to hybrid mode (LLM decides)
|
|
69
|
+
},
|
|
70
|
+
metadata: {
|
|
71
|
+
totalTokensUsed: 0,
|
|
72
|
+
totalCost: 0,
|
|
73
|
+
messageCount: 0,
|
|
74
|
+
operationCount: 0,
|
|
75
|
+
lastActivity: formatTimestamp(),
|
|
76
|
+
tags: [],
|
|
77
|
+
},
|
|
78
|
+
};
|
|
79
|
+
this.dirty = true;
|
|
80
|
+
logger.debug(`Session created: ${this.session.id}`);
|
|
81
|
+
return this.session;
|
|
82
|
+
}
|
|
83
|
+
/**
|
|
84
|
+
* Gets the current session.
|
|
85
|
+
*
|
|
86
|
+
* @returns The current Session object or null if no session is active
|
|
87
|
+
*/
|
|
88
|
+
getSession() {
|
|
89
|
+
return this.session;
|
|
90
|
+
}
|
|
91
|
+
/**
|
|
92
|
+
* Gets the current session state.
|
|
93
|
+
*
|
|
94
|
+
* @returns The SessionState object or null if no session is active
|
|
95
|
+
*/
|
|
96
|
+
getState() {
|
|
97
|
+
return this.session?.state || null;
|
|
98
|
+
}
|
|
99
|
+
/**
|
|
100
|
+
* Gets the session metadata.
|
|
101
|
+
*
|
|
102
|
+
* @returns The SessionMetadata object or null if no session is active
|
|
103
|
+
*/
|
|
104
|
+
getMetadata() {
|
|
105
|
+
return this.session?.metadata || null;
|
|
106
|
+
}
|
|
107
|
+
/**
|
|
108
|
+
* Adds a message to the conversation history.
|
|
109
|
+
* Automatically trims history if it exceeds MAX_HISTORY_LENGTH.
|
|
110
|
+
*
|
|
111
|
+
* @param message - The message to add (without id and timestamp)
|
|
112
|
+
* @returns The complete ConversationMessage with generated id and timestamp
|
|
113
|
+
*
|
|
114
|
+
* @example
|
|
115
|
+
* ```typescript
|
|
116
|
+
* const message = sessionManager.addMessage({
|
|
117
|
+
* role: 'user',
|
|
118
|
+
* content: 'Hello, Claude!'
|
|
119
|
+
* });
|
|
120
|
+
* console.log(message.id); // Generated UUID
|
|
121
|
+
* console.log(message.timestamp); // ISO timestamp
|
|
122
|
+
* ```
|
|
123
|
+
*/
|
|
124
|
+
addMessage(message) {
|
|
125
|
+
if (!this.session) {
|
|
126
|
+
this.createSession();
|
|
127
|
+
}
|
|
128
|
+
const fullMessage = {
|
|
129
|
+
id: uuidv4(),
|
|
130
|
+
timestamp: formatTimestamp(),
|
|
131
|
+
...message,
|
|
132
|
+
};
|
|
133
|
+
this.session.state.conversationHistory.push(fullMessage);
|
|
134
|
+
this.session.metadata.messageCount++;
|
|
135
|
+
this.session.metadata.lastActivity = formatTimestamp();
|
|
136
|
+
this.session.updatedAt = formatTimestamp();
|
|
137
|
+
// Trim history if too long
|
|
138
|
+
if (this.session.state.conversationHistory.length > MAX_HISTORY_LENGTH) {
|
|
139
|
+
this.session.state.conversationHistory =
|
|
140
|
+
this.session.state.conversationHistory.slice(-MAX_HISTORY_LENGTH);
|
|
141
|
+
}
|
|
142
|
+
this.dirty = true;
|
|
143
|
+
logger.debug(`Message added: ${fullMessage.role} (${fullMessage.id})`);
|
|
144
|
+
return fullMessage;
|
|
145
|
+
}
|
|
146
|
+
/**
|
|
147
|
+
* Gets the conversation history.
|
|
148
|
+
*
|
|
149
|
+
* @returns Array of ConversationMessage objects
|
|
150
|
+
*/
|
|
151
|
+
getConversationHistory() {
|
|
152
|
+
return this.session?.state.conversationHistory || [];
|
|
153
|
+
}
|
|
154
|
+
/**
|
|
155
|
+
* Clears the conversation history while preserving other session state.
|
|
156
|
+
* Also clears any compacted summary and operations.
|
|
157
|
+
*/
|
|
158
|
+
clearHistory() {
|
|
159
|
+
if (this.session) {
|
|
160
|
+
const clearedCount = this.session.state.conversationHistory.length;
|
|
161
|
+
const clearedOpsCount = this.session.state.operations.length;
|
|
162
|
+
this.session.state.conversationHistory = [];
|
|
163
|
+
this.session.state.operations = [];
|
|
164
|
+
this.session.state.compactedSummary = undefined;
|
|
165
|
+
this.session.updatedAt = formatTimestamp();
|
|
166
|
+
this.dirty = true;
|
|
167
|
+
logger.debug(`Conversation history cleared: ${clearedCount} messages, ${clearedOpsCount} operations removed`);
|
|
168
|
+
}
|
|
169
|
+
}
|
|
170
|
+
/**
|
|
171
|
+
* Archives the current session's conversation history to .compass/chats/.
|
|
172
|
+
* Call this before clearing history to preserve the conversation.
|
|
173
|
+
*
|
|
174
|
+
* @returns Archive result with path and ID, or error if archival failed
|
|
175
|
+
*/
|
|
176
|
+
async archiveCurrentSession() {
|
|
177
|
+
if (!this.session) {
|
|
178
|
+
return { success: false, error: 'No active session to archive' };
|
|
179
|
+
}
|
|
180
|
+
// Skip if no messages to archive
|
|
181
|
+
if (!this.session.state.conversationHistory || this.session.state.conversationHistory.length === 0) {
|
|
182
|
+
logger.debug('No messages to archive, skipping');
|
|
183
|
+
return { success: false, error: 'No messages to archive' };
|
|
184
|
+
}
|
|
185
|
+
// Initialize archival service if needed
|
|
186
|
+
if (!this.archivalService) {
|
|
187
|
+
this.archivalService = createChatArchivalService(this.projectRoot);
|
|
188
|
+
}
|
|
189
|
+
try {
|
|
190
|
+
const result = await this.archivalService.archiveSession(this.session);
|
|
191
|
+
if (result.success) {
|
|
192
|
+
logger.info(`Session archived to: ${result.filename}`);
|
|
193
|
+
}
|
|
194
|
+
return result;
|
|
195
|
+
}
|
|
196
|
+
catch (error) {
|
|
197
|
+
logger.error('Failed to archive session', error);
|
|
198
|
+
return {
|
|
199
|
+
success: false,
|
|
200
|
+
error: error instanceof Error ? error.message : 'Unknown error',
|
|
201
|
+
};
|
|
202
|
+
}
|
|
203
|
+
}
|
|
204
|
+
/**
|
|
205
|
+
* Archives the current session and clears the history.
|
|
206
|
+
* Use this on startup to preserve previous conversation before starting fresh.
|
|
207
|
+
*
|
|
208
|
+
* @returns The archived conversation data (for -c flag to load into context), or null if archival failed
|
|
209
|
+
*/
|
|
210
|
+
async archiveAndClearSession() {
|
|
211
|
+
// First, get the archive data before clearing
|
|
212
|
+
let archive = null;
|
|
213
|
+
// Initialize archival service if needed
|
|
214
|
+
if (!this.archivalService) {
|
|
215
|
+
this.archivalService = createChatArchivalService(this.projectRoot);
|
|
216
|
+
}
|
|
217
|
+
// Archive the session
|
|
218
|
+
const result = await this.archiveCurrentSession();
|
|
219
|
+
// If archival succeeded, load the archive data for returning
|
|
220
|
+
if (result.success && result.path) {
|
|
221
|
+
archive = await this.archivalService.getLatestArchive();
|
|
222
|
+
}
|
|
223
|
+
// Clear the history regardless of archival success
|
|
224
|
+
this.clearHistory();
|
|
225
|
+
// Run cleanup of old archives (non-blocking)
|
|
226
|
+
this.archivalService.cleanupOldArchives().catch((err) => {
|
|
227
|
+
logger.warn('Failed to cleanup old archives', err);
|
|
228
|
+
});
|
|
229
|
+
return { archive, result };
|
|
230
|
+
}
|
|
231
|
+
/**
|
|
232
|
+
* Gets the chat archival service instance.
|
|
233
|
+
* Creates one if it doesn't exist.
|
|
234
|
+
*
|
|
235
|
+
* @returns ChatArchivalService instance
|
|
236
|
+
*/
|
|
237
|
+
getArchivalService() {
|
|
238
|
+
if (!this.archivalService) {
|
|
239
|
+
this.archivalService = createChatArchivalService(this.projectRoot);
|
|
240
|
+
}
|
|
241
|
+
return this.archivalService;
|
|
242
|
+
}
|
|
243
|
+
/**
|
|
244
|
+
* Sets a compacted summary and clears the conversation history.
|
|
245
|
+
* Used by the conversation compactor to reduce token usage.
|
|
246
|
+
*
|
|
247
|
+
* @param summary - The compacted summary text
|
|
248
|
+
*/
|
|
249
|
+
setCompactedSummary(summary) {
|
|
250
|
+
if (this.session) {
|
|
251
|
+
this.session.state.compactedSummary = summary;
|
|
252
|
+
this.session.state.conversationHistory = [];
|
|
253
|
+
this.session.updatedAt = formatTimestamp();
|
|
254
|
+
this.dirty = true;
|
|
255
|
+
logger.info('Compacted summary set, conversation history cleared');
|
|
256
|
+
}
|
|
257
|
+
}
|
|
258
|
+
/**
|
|
259
|
+
* Gets the compacted summary if one exists.
|
|
260
|
+
*
|
|
261
|
+
* @returns The compacted summary string or undefined
|
|
262
|
+
*/
|
|
263
|
+
getCompactedSummary() {
|
|
264
|
+
return this.session?.state.compactedSummary;
|
|
265
|
+
}
|
|
266
|
+
/**
|
|
267
|
+
* Updates the session after agentic loop compaction.
|
|
268
|
+
* Stores the summary and keeps a record of recent messages for context.
|
|
269
|
+
*
|
|
270
|
+
* @param summary - The compacted summary text
|
|
271
|
+
* @param recentMessagesCount - Number of recent messages that were preserved (for context)
|
|
272
|
+
*/
|
|
273
|
+
syncAfterCompaction(summary, recentMessagesCount) {
|
|
274
|
+
if (this.session) {
|
|
275
|
+
this.session.state.compactedSummary = summary;
|
|
276
|
+
// Keep recent messages in history for UI display, but mark session as compacted
|
|
277
|
+
this.session.metadata.isCompacted = true;
|
|
278
|
+
this.session.metadata.compactionTimestamp = formatTimestamp();
|
|
279
|
+
this.session.metadata.messagesPreserved = recentMessagesCount;
|
|
280
|
+
this.session.updatedAt = formatTimestamp();
|
|
281
|
+
this.dirty = true;
|
|
282
|
+
logger.info(`Session synced after compaction: summary stored, ${recentMessagesCount} recent messages preserved`);
|
|
283
|
+
}
|
|
284
|
+
}
|
|
285
|
+
/**
|
|
286
|
+
* Replaces the entire conversation history.
|
|
287
|
+
* Used when syncing the agentic loop messages back to the session.
|
|
288
|
+
*
|
|
289
|
+
* @param messages - Array of messages to set as the new history
|
|
290
|
+
*/
|
|
291
|
+
replaceConversationHistory(messages) {
|
|
292
|
+
if (this.session) {
|
|
293
|
+
this.session.state.conversationHistory = messages;
|
|
294
|
+
this.session.metadata.messageCount = messages.length;
|
|
295
|
+
this.session.updatedAt = formatTimestamp();
|
|
296
|
+
this.dirty = true;
|
|
297
|
+
logger.debug(`Conversation history replaced: ${messages.length} messages`);
|
|
298
|
+
}
|
|
299
|
+
}
|
|
300
|
+
/**
|
|
301
|
+
* Updates the estimated context token count.
|
|
302
|
+
* Called during agentic loops to keep the session metadata in sync with
|
|
303
|
+
* the actual API messages token usage.
|
|
304
|
+
*
|
|
305
|
+
* @param tokenCount - The estimated token count of current context
|
|
306
|
+
*/
|
|
307
|
+
updateEstimatedContextTokens(tokenCount) {
|
|
308
|
+
if (this.session) {
|
|
309
|
+
this.session.metadata.estimatedContextTokens = tokenCount;
|
|
310
|
+
// Don't mark dirty for frequent token updates - this is informational only
|
|
311
|
+
logger.debug(`Session context tokens updated: ${tokenCount.toLocaleString()}`);
|
|
312
|
+
}
|
|
313
|
+
}
|
|
314
|
+
/**
|
|
315
|
+
* Gets the estimated context token count.
|
|
316
|
+
*
|
|
317
|
+
* @returns The estimated context tokens or 0 if not set
|
|
318
|
+
*/
|
|
319
|
+
getEstimatedContextTokens() {
|
|
320
|
+
return this.session?.metadata.estimatedContextTokens ?? 0;
|
|
321
|
+
}
|
|
322
|
+
/**
|
|
323
|
+
* Records an operation (file modification, command execution, etc.).
|
|
324
|
+
*
|
|
325
|
+
* @param operation - The operation to record (without id and timestamp)
|
|
326
|
+
* @returns The complete Operation with generated id and timestamp
|
|
327
|
+
*
|
|
328
|
+
* @example
|
|
329
|
+
* ```typescript
|
|
330
|
+
* const operation = sessionManager.recordOperation({
|
|
331
|
+
* type: 'file_modify',
|
|
332
|
+
* description: 'Updated src/index.ts',
|
|
333
|
+
* status: 'completed',
|
|
334
|
+
* details: {
|
|
335
|
+
* filePath: 'src/index.ts',
|
|
336
|
+
* oldContent: '...',
|
|
337
|
+
* newContent: '...'
|
|
338
|
+
* }
|
|
339
|
+
* });
|
|
340
|
+
* ```
|
|
341
|
+
*/
|
|
342
|
+
recordOperation(operation) {
|
|
343
|
+
if (!this.session) {
|
|
344
|
+
this.createSession();
|
|
345
|
+
}
|
|
346
|
+
const fullOperation = {
|
|
347
|
+
id: uuidv4(),
|
|
348
|
+
timestamp: formatTimestamp(),
|
|
349
|
+
...operation,
|
|
350
|
+
};
|
|
351
|
+
this.session.state.operations.push(fullOperation);
|
|
352
|
+
this.session.metadata.operationCount++;
|
|
353
|
+
this.session.metadata.lastActivity = formatTimestamp();
|
|
354
|
+
this.session.updatedAt = formatTimestamp();
|
|
355
|
+
this.dirty = true;
|
|
356
|
+
logger.debug(`Operation recorded: ${fullOperation.type} (${fullOperation.id})`);
|
|
357
|
+
return fullOperation;
|
|
358
|
+
}
|
|
359
|
+
/**
|
|
360
|
+
* Gets the operations history.
|
|
361
|
+
*
|
|
362
|
+
* @returns Array of Operation objects
|
|
363
|
+
*/
|
|
364
|
+
getOperations() {
|
|
365
|
+
return this.session?.state.operations || [];
|
|
366
|
+
}
|
|
367
|
+
/**
|
|
368
|
+
* Gets the last operation performed.
|
|
369
|
+
*
|
|
370
|
+
* @returns The most recent Operation or undefined if none exist
|
|
371
|
+
*/
|
|
372
|
+
getLastOperation() {
|
|
373
|
+
const operations = this.session?.state.operations || [];
|
|
374
|
+
return operations[operations.length - 1];
|
|
375
|
+
}
|
|
376
|
+
/**
|
|
377
|
+
* Updates an existing operation's status.
|
|
378
|
+
*
|
|
379
|
+
* @param operationId - The ID of the operation to update
|
|
380
|
+
* @param updates - Partial operation data to merge
|
|
381
|
+
* @returns True if the operation was found and updated
|
|
382
|
+
*/
|
|
383
|
+
updateOperation(operationId, updates) {
|
|
384
|
+
if (!this.session) {
|
|
385
|
+
return false;
|
|
386
|
+
}
|
|
387
|
+
const operation = this.session.state.operations.find((op) => op.id === operationId);
|
|
388
|
+
if (!operation) {
|
|
389
|
+
return false;
|
|
390
|
+
}
|
|
391
|
+
Object.assign(operation, updates);
|
|
392
|
+
this.session.updatedAt = formatTimestamp();
|
|
393
|
+
this.dirty = true;
|
|
394
|
+
logger.debug(`Operation updated: ${operationId}`);
|
|
395
|
+
return true;
|
|
396
|
+
}
|
|
397
|
+
/**
|
|
398
|
+
* Updates token usage and cost statistics.
|
|
399
|
+
*
|
|
400
|
+
* @param tokens - Number of tokens to add
|
|
401
|
+
* @param cost - Cost to add
|
|
402
|
+
*/
|
|
403
|
+
updateTokenUsage(tokens, cost) {
|
|
404
|
+
if (this.session) {
|
|
405
|
+
this.session.metadata.totalTokensUsed += tokens;
|
|
406
|
+
this.session.metadata.totalCost += cost;
|
|
407
|
+
this.session.metadata.lastActivity = formatTimestamp();
|
|
408
|
+
this.session.updatedAt = formatTimestamp();
|
|
409
|
+
this.dirty = true;
|
|
410
|
+
}
|
|
411
|
+
}
|
|
412
|
+
/**
|
|
413
|
+
* Sets the current model for the session.
|
|
414
|
+
*
|
|
415
|
+
* @param modelId - The model ID to set
|
|
416
|
+
*/
|
|
417
|
+
setModel(modelId) {
|
|
418
|
+
if (this.session) {
|
|
419
|
+
this.session.state.currentModel = modelId;
|
|
420
|
+
this.session.updatedAt = formatTimestamp();
|
|
421
|
+
this.dirty = true;
|
|
422
|
+
logger.debug(`Model set: ${modelId}`);
|
|
423
|
+
}
|
|
424
|
+
}
|
|
425
|
+
/**
|
|
426
|
+
* Gets the current model ID.
|
|
427
|
+
*
|
|
428
|
+
* @returns The current model ID or the default model
|
|
429
|
+
*/
|
|
430
|
+
getCurrentModel() {
|
|
431
|
+
return this.session?.state.currentModel || DEFAULT_MODEL;
|
|
432
|
+
}
|
|
433
|
+
/**
|
|
434
|
+
* Sets the approval mode for the session.
|
|
435
|
+
*
|
|
436
|
+
* @param mode - The ApprovalMode to set
|
|
437
|
+
*/
|
|
438
|
+
setApprovalMode(mode) {
|
|
439
|
+
if (this.session) {
|
|
440
|
+
this.session.state.approvalMode = mode;
|
|
441
|
+
this.session.updatedAt = formatTimestamp();
|
|
442
|
+
this.dirty = true;
|
|
443
|
+
logger.debug(`Approval mode set: ${mode}`);
|
|
444
|
+
}
|
|
445
|
+
}
|
|
446
|
+
/**
|
|
447
|
+
* Gets the current approval mode.
|
|
448
|
+
*
|
|
449
|
+
* @returns The current ApprovalMode
|
|
450
|
+
*/
|
|
451
|
+
getApprovalMode() {
|
|
452
|
+
return this.session?.state.approvalMode || ApprovalMode.MANUAL;
|
|
453
|
+
}
|
|
454
|
+
/**
|
|
455
|
+
* Sets the execution mode for the session.
|
|
456
|
+
*
|
|
457
|
+
* @param mode - The ExecutionMode to set
|
|
458
|
+
*/
|
|
459
|
+
setExecutionMode(mode) {
|
|
460
|
+
if (this.session) {
|
|
461
|
+
this.session.state.executionMode = mode;
|
|
462
|
+
this.session.updatedAt = formatTimestamp();
|
|
463
|
+
this.dirty = true;
|
|
464
|
+
logger.debug(`Execution mode set: ${mode}`);
|
|
465
|
+
}
|
|
466
|
+
}
|
|
467
|
+
/**
|
|
468
|
+
* Gets the current execution mode.
|
|
469
|
+
*
|
|
470
|
+
* @returns The current ExecutionMode (defaults to 'hybrid' if not set)
|
|
471
|
+
*/
|
|
472
|
+
getExecutionMode() {
|
|
473
|
+
return this.session?.state.executionMode || 'hybrid';
|
|
474
|
+
}
|
|
475
|
+
/**
|
|
476
|
+
* Sets whether to show tool execution blocks in conversation history.
|
|
477
|
+
*
|
|
478
|
+
* @param show - Whether to show tool blocks (true) or minimal text-only (false)
|
|
479
|
+
*/
|
|
480
|
+
setShowToolBlocks(show) {
|
|
481
|
+
if (this.session) {
|
|
482
|
+
this.session.state.showToolBlocks = show;
|
|
483
|
+
this.session.updatedAt = formatTimestamp();
|
|
484
|
+
this.dirty = true;
|
|
485
|
+
logger.debug(`Show tool blocks set: ${show}`);
|
|
486
|
+
}
|
|
487
|
+
}
|
|
488
|
+
/**
|
|
489
|
+
* Gets whether tool execution blocks should be shown in conversation history.
|
|
490
|
+
*
|
|
491
|
+
* @returns Whether to show tool blocks (defaults to true if not set)
|
|
492
|
+
*/
|
|
493
|
+
getShowToolBlocks() {
|
|
494
|
+
return this.session?.state.showToolBlocks ?? true;
|
|
495
|
+
}
|
|
496
|
+
/**
|
|
497
|
+
* Adds a file to the context files list.
|
|
498
|
+
*
|
|
499
|
+
* @param filePath - The file path to add
|
|
500
|
+
*/
|
|
501
|
+
addContextFile(filePath) {
|
|
502
|
+
if (this.session) {
|
|
503
|
+
if (!this.session.state.contextFiles.includes(filePath)) {
|
|
504
|
+
this.session.state.contextFiles.push(filePath);
|
|
505
|
+
this.session.updatedAt = formatTimestamp();
|
|
506
|
+
this.dirty = true;
|
|
507
|
+
}
|
|
508
|
+
}
|
|
509
|
+
}
|
|
510
|
+
/**
|
|
511
|
+
* Removes a file from the context files list.
|
|
512
|
+
*
|
|
513
|
+
* @param filePath - The file path to remove
|
|
514
|
+
*/
|
|
515
|
+
removeContextFile(filePath) {
|
|
516
|
+
if (this.session) {
|
|
517
|
+
const index = this.session.state.contextFiles.indexOf(filePath);
|
|
518
|
+
if (index !== -1) {
|
|
519
|
+
this.session.state.contextFiles.splice(index, 1);
|
|
520
|
+
this.session.updatedAt = formatTimestamp();
|
|
521
|
+
this.dirty = true;
|
|
522
|
+
}
|
|
523
|
+
}
|
|
524
|
+
}
|
|
525
|
+
/**
|
|
526
|
+
* Gets the list of context files.
|
|
527
|
+
*
|
|
528
|
+
* @returns Array of file paths
|
|
529
|
+
*/
|
|
530
|
+
getContextFiles() {
|
|
531
|
+
return this.session?.state.contextFiles || [];
|
|
532
|
+
}
|
|
533
|
+
/**
|
|
534
|
+
* Adds a folder to the excluded folders list.
|
|
535
|
+
* These folders will be excluded from indexing, code snippets, and file discovery.
|
|
536
|
+
*
|
|
537
|
+
* @param folderPattern - The folder pattern to exclude (glob pattern supported)
|
|
538
|
+
*/
|
|
539
|
+
addExcludedFolder(folderPattern) {
|
|
540
|
+
if (this.session) {
|
|
541
|
+
if (!this.session.state.excludedFolders) {
|
|
542
|
+
this.session.state.excludedFolders = [];
|
|
543
|
+
}
|
|
544
|
+
if (!this.session.state.excludedFolders.includes(folderPattern)) {
|
|
545
|
+
this.session.state.excludedFolders.push(folderPattern);
|
|
546
|
+
this.session.updatedAt = formatTimestamp();
|
|
547
|
+
this.dirty = true;
|
|
548
|
+
logger.debug(`Excluded folder added: ${folderPattern}`);
|
|
549
|
+
}
|
|
550
|
+
}
|
|
551
|
+
}
|
|
552
|
+
/**
|
|
553
|
+
* Removes a folder from the excluded folders list.
|
|
554
|
+
*
|
|
555
|
+
* @param folderPattern - The folder pattern to remove
|
|
556
|
+
*/
|
|
557
|
+
removeExcludedFolder(folderPattern) {
|
|
558
|
+
if (this.session && this.session.state.excludedFolders) {
|
|
559
|
+
const index = this.session.state.excludedFolders.indexOf(folderPattern);
|
|
560
|
+
if (index !== -1) {
|
|
561
|
+
this.session.state.excludedFolders.splice(index, 1);
|
|
562
|
+
this.session.updatedAt = formatTimestamp();
|
|
563
|
+
this.dirty = true;
|
|
564
|
+
logger.debug(`Excluded folder removed: ${folderPattern}`);
|
|
565
|
+
}
|
|
566
|
+
}
|
|
567
|
+
}
|
|
568
|
+
/**
|
|
569
|
+
* Sets the excluded folders list, replacing any existing entries.
|
|
570
|
+
*
|
|
571
|
+
* @param folderPatterns - Array of folder patterns to exclude
|
|
572
|
+
*/
|
|
573
|
+
setExcludedFolders(folderPatterns) {
|
|
574
|
+
if (this.session) {
|
|
575
|
+
this.session.state.excludedFolders = [...folderPatterns];
|
|
576
|
+
this.session.updatedAt = formatTimestamp();
|
|
577
|
+
this.dirty = true;
|
|
578
|
+
logger.debug(`Excluded folders set: ${folderPatterns.length} patterns`);
|
|
579
|
+
}
|
|
580
|
+
}
|
|
581
|
+
/**
|
|
582
|
+
* Gets the list of excluded folders.
|
|
583
|
+
*
|
|
584
|
+
* @returns Array of folder patterns
|
|
585
|
+
*/
|
|
586
|
+
getExcludedFolders() {
|
|
587
|
+
return this.session?.state.excludedFolders || [];
|
|
588
|
+
}
|
|
589
|
+
/**
|
|
590
|
+
* Clears all excluded folders.
|
|
591
|
+
*/
|
|
592
|
+
clearExcludedFolders() {
|
|
593
|
+
if (this.session) {
|
|
594
|
+
this.session.state.excludedFolders = [];
|
|
595
|
+
this.session.updatedAt = formatTimestamp();
|
|
596
|
+
this.dirty = true;
|
|
597
|
+
logger.debug('Excluded folders cleared');
|
|
598
|
+
}
|
|
599
|
+
}
|
|
600
|
+
/**
|
|
601
|
+
* Sets the personality mode for the assistant's communication style.
|
|
602
|
+
*
|
|
603
|
+
* @param mode - The PersonalityMode to set
|
|
604
|
+
*/
|
|
605
|
+
setPersonalityMode(mode) {
|
|
606
|
+
if (this.session) {
|
|
607
|
+
this.session.state.personalityMode = mode;
|
|
608
|
+
this.session.updatedAt = formatTimestamp();
|
|
609
|
+
this.dirty = true;
|
|
610
|
+
logger.debug(`Personality mode set: ${mode}`);
|
|
611
|
+
}
|
|
612
|
+
}
|
|
613
|
+
/**
|
|
614
|
+
* Gets the current personality mode.
|
|
615
|
+
*
|
|
616
|
+
* @returns The current PersonalityMode (defaults to 'professional' if not set)
|
|
617
|
+
*/
|
|
618
|
+
getPersonalityMode() {
|
|
619
|
+
return this.session?.state.personalityMode || DEFAULT_PERSONALITY_MODE;
|
|
620
|
+
}
|
|
621
|
+
/**
|
|
622
|
+
* Sets a temporary personality mode for the next response only.
|
|
623
|
+
* This overrides the regular personality mode until cleared.
|
|
624
|
+
*
|
|
625
|
+
* @param mode - The temporary PersonalityMode to set
|
|
626
|
+
*/
|
|
627
|
+
setTemporaryPersonalityMode(mode) {
|
|
628
|
+
if (this.session) {
|
|
629
|
+
this.session.state.temporaryPersonalityMode = mode;
|
|
630
|
+
this.session.updatedAt = formatTimestamp();
|
|
631
|
+
// Don't mark dirty - temporary mode shouldn't persist to disk
|
|
632
|
+
logger.debug(`Temporary personality mode set: ${mode}`);
|
|
633
|
+
}
|
|
634
|
+
}
|
|
635
|
+
/**
|
|
636
|
+
* Clears the temporary personality mode.
|
|
637
|
+
* Should be called after each response when temporary mode is set.
|
|
638
|
+
*/
|
|
639
|
+
clearTemporaryPersonalityMode() {
|
|
640
|
+
if (this.session && this.session.state.temporaryPersonalityMode) {
|
|
641
|
+
this.session.state.temporaryPersonalityMode = undefined;
|
|
642
|
+
this.session.updatedAt = formatTimestamp();
|
|
643
|
+
logger.debug('Temporary personality mode cleared');
|
|
644
|
+
}
|
|
645
|
+
}
|
|
646
|
+
/**
|
|
647
|
+
* Gets the effective personality mode (temporary if set, otherwise regular).
|
|
648
|
+
*
|
|
649
|
+
* @returns The effective PersonalityMode to use for the current response
|
|
650
|
+
*/
|
|
651
|
+
getEffectivePersonalityMode() {
|
|
652
|
+
if (this.session?.state.temporaryPersonalityMode) {
|
|
653
|
+
return this.session.state.temporaryPersonalityMode;
|
|
654
|
+
}
|
|
655
|
+
return this.getPersonalityMode();
|
|
656
|
+
}
|
|
657
|
+
/**
|
|
658
|
+
* Checks if a temporary personality mode is currently active.
|
|
659
|
+
*
|
|
660
|
+
* @returns True if temporary mode is set
|
|
661
|
+
*/
|
|
662
|
+
hasTemporaryPersonalityMode() {
|
|
663
|
+
return this.session?.state.temporaryPersonalityMode !== undefined;
|
|
664
|
+
}
|
|
665
|
+
/**
|
|
666
|
+
* Sets the unguarded mode for the session.
|
|
667
|
+
* When enabled, removes safety guardrails from the system prompt.
|
|
668
|
+
* NOTE: This is a transient setting that is NOT persisted to session.json.
|
|
669
|
+
*
|
|
670
|
+
* @param enabled - Whether to enable unguarded mode
|
|
671
|
+
*/
|
|
672
|
+
setUnguardedMode(enabled) {
|
|
673
|
+
this.unguardedMode = enabled;
|
|
674
|
+
logger.debug(`Unguarded mode set: ${enabled} (transient - not persisted)`);
|
|
675
|
+
}
|
|
676
|
+
/**
|
|
677
|
+
* Gets whether unguarded mode is currently active.
|
|
678
|
+
* NOTE: This is a transient setting that is NOT persisted to session.json.
|
|
679
|
+
*
|
|
680
|
+
* @returns True if unguarded mode is enabled
|
|
681
|
+
*/
|
|
682
|
+
getUnguardedMode() {
|
|
683
|
+
return this.unguardedMode;
|
|
684
|
+
}
|
|
685
|
+
/**
|
|
686
|
+
* Adds a tag to the session.
|
|
687
|
+
*
|
|
688
|
+
* @param tag - The tag to add
|
|
689
|
+
*/
|
|
690
|
+
addTag(tag) {
|
|
691
|
+
if (this.session) {
|
|
692
|
+
if (!this.session.metadata.tags.includes(tag)) {
|
|
693
|
+
this.session.metadata.tags.push(tag);
|
|
694
|
+
this.session.updatedAt = formatTimestamp();
|
|
695
|
+
this.dirty = true;
|
|
696
|
+
}
|
|
697
|
+
}
|
|
698
|
+
}
|
|
699
|
+
/**
|
|
700
|
+
* Removes a tag from the session.
|
|
701
|
+
*
|
|
702
|
+
* @param tag - The tag to remove
|
|
703
|
+
*/
|
|
704
|
+
removeTag(tag) {
|
|
705
|
+
if (this.session) {
|
|
706
|
+
const index = this.session.metadata.tags.indexOf(tag);
|
|
707
|
+
if (index !== -1) {
|
|
708
|
+
this.session.metadata.tags.splice(index, 1);
|
|
709
|
+
this.session.updatedAt = formatTimestamp();
|
|
710
|
+
this.dirty = true;
|
|
711
|
+
}
|
|
712
|
+
}
|
|
713
|
+
}
|
|
714
|
+
/**
|
|
715
|
+
* Saves the current session to the project's .compass directory.
|
|
716
|
+
*/
|
|
717
|
+
async save() {
|
|
718
|
+
if (!this.session) {
|
|
719
|
+
logger.debug('No session to save');
|
|
720
|
+
return;
|
|
721
|
+
}
|
|
722
|
+
if (!this.dirty) {
|
|
723
|
+
logger.debug('Session not dirty, skipping save');
|
|
724
|
+
return;
|
|
725
|
+
}
|
|
726
|
+
try {
|
|
727
|
+
const compassDir = getProjectCompassDir(this.projectRoot);
|
|
728
|
+
await ensureDir(compassDir);
|
|
729
|
+
const sessionPath = path.join(compassDir, SESSION_FILE_NAME);
|
|
730
|
+
await safeWriteJson(sessionPath, this.session);
|
|
731
|
+
this.dirty = false;
|
|
732
|
+
logger.debug('Session saved');
|
|
733
|
+
// Emit session saved event
|
|
734
|
+
const eventEmitter = getEventEmitter();
|
|
735
|
+
eventEmitter.emit('session-saved', { sessionId: this.session.id });
|
|
736
|
+
}
|
|
737
|
+
catch (error) {
|
|
738
|
+
logger.error('Failed to save session', error);
|
|
739
|
+
throw error;
|
|
740
|
+
}
|
|
741
|
+
}
|
|
742
|
+
/**
|
|
743
|
+
* Loads a session from the project's .compass directory.
|
|
744
|
+
*
|
|
745
|
+
* @param projectPath - Optional project root path
|
|
746
|
+
* @returns The loaded Session or null if not found
|
|
747
|
+
*/
|
|
748
|
+
async load(projectPath) {
|
|
749
|
+
this.projectRoot = projectPath || process.cwd();
|
|
750
|
+
const sessionPath = path.join(getProjectCompassDir(this.projectRoot), SESSION_FILE_NAME);
|
|
751
|
+
if (!(await pathExists(sessionPath))) {
|
|
752
|
+
logger.debug('No existing session found');
|
|
753
|
+
return null;
|
|
754
|
+
}
|
|
755
|
+
try {
|
|
756
|
+
const session = await safeReadJson(sessionPath);
|
|
757
|
+
if (session) {
|
|
758
|
+
// Migrate/validate session structure to ensure all required fields exist
|
|
759
|
+
this.session = this.migrateSession(session);
|
|
760
|
+
this.dirty = false;
|
|
761
|
+
logger.info(`Session loaded: ${this.session.id}`);
|
|
762
|
+
// Update projectPath if it doesn't match the current absolute path
|
|
763
|
+
const absoluteProjectRoot = path.resolve(this.projectRoot);
|
|
764
|
+
const absoluteSessionPath = path.resolve(this.session.projectPath);
|
|
765
|
+
if (absoluteSessionPath !== absoluteProjectRoot) {
|
|
766
|
+
logger.debug(`Updating session projectPath from ${this.session.projectPath} to ${absoluteProjectRoot}`);
|
|
767
|
+
this.session.projectPath = absoluteProjectRoot;
|
|
768
|
+
this.session.updatedAt = formatTimestamp();
|
|
769
|
+
this.dirty = true;
|
|
770
|
+
}
|
|
771
|
+
}
|
|
772
|
+
return this.session;
|
|
773
|
+
}
|
|
774
|
+
catch (error) {
|
|
775
|
+
logger.error('Failed to load session', error);
|
|
776
|
+
return null;
|
|
777
|
+
}
|
|
778
|
+
}
|
|
779
|
+
/**
|
|
780
|
+
* Migrates a session loaded from disk to ensure all required fields exist.
|
|
781
|
+
* This handles backward compatibility when session schema changes.
|
|
782
|
+
*
|
|
783
|
+
* @param session - The raw session data loaded from disk
|
|
784
|
+
* @returns A valid Session object with all required fields
|
|
785
|
+
*/
|
|
786
|
+
migrateSession(session) {
|
|
787
|
+
let needsMigration = false;
|
|
788
|
+
// Ensure metadata exists with all required fields
|
|
789
|
+
if (!session.metadata) {
|
|
790
|
+
session.metadata = {
|
|
791
|
+
totalTokensUsed: 0,
|
|
792
|
+
totalCost: 0,
|
|
793
|
+
messageCount: 0,
|
|
794
|
+
operationCount: 0,
|
|
795
|
+
lastActivity: formatTimestamp(),
|
|
796
|
+
tags: [],
|
|
797
|
+
};
|
|
798
|
+
needsMigration = true;
|
|
799
|
+
logger.debug('Session migrated: added missing metadata field');
|
|
800
|
+
}
|
|
801
|
+
else {
|
|
802
|
+
// Ensure all metadata fields exist
|
|
803
|
+
const metadata = session.metadata;
|
|
804
|
+
if (typeof metadata.totalTokensUsed !== 'number') {
|
|
805
|
+
metadata.totalTokensUsed = 0;
|
|
806
|
+
needsMigration = true;
|
|
807
|
+
}
|
|
808
|
+
if (typeof metadata.totalCost !== 'number') {
|
|
809
|
+
metadata.totalCost = 0;
|
|
810
|
+
needsMigration = true;
|
|
811
|
+
}
|
|
812
|
+
if (typeof metadata.messageCount !== 'number') {
|
|
813
|
+
metadata.messageCount = 0;
|
|
814
|
+
needsMigration = true;
|
|
815
|
+
}
|
|
816
|
+
if (typeof metadata.operationCount !== 'number') {
|
|
817
|
+
metadata.operationCount = 0;
|
|
818
|
+
needsMigration = true;
|
|
819
|
+
}
|
|
820
|
+
if (!metadata.lastActivity) {
|
|
821
|
+
metadata.lastActivity = formatTimestamp();
|
|
822
|
+
needsMigration = true;
|
|
823
|
+
}
|
|
824
|
+
if (!Array.isArray(metadata.tags)) {
|
|
825
|
+
metadata.tags = [];
|
|
826
|
+
needsMigration = true;
|
|
827
|
+
}
|
|
828
|
+
}
|
|
829
|
+
// Ensure state exists with all required fields
|
|
830
|
+
if (!session.state) {
|
|
831
|
+
session.state = {
|
|
832
|
+
conversationHistory: [],
|
|
833
|
+
operations: [],
|
|
834
|
+
currentModel: DEFAULT_MODEL,
|
|
835
|
+
approvalMode: ApprovalMode.MANUAL,
|
|
836
|
+
contextFiles: [],
|
|
837
|
+
executionMode: 'hybrid',
|
|
838
|
+
};
|
|
839
|
+
needsMigration = true;
|
|
840
|
+
logger.debug('Session migrated: added missing state field');
|
|
841
|
+
}
|
|
842
|
+
else {
|
|
843
|
+
// Ensure all state fields exist
|
|
844
|
+
const state = session.state;
|
|
845
|
+
if (!Array.isArray(state.conversationHistory)) {
|
|
846
|
+
state.conversationHistory = [];
|
|
847
|
+
needsMigration = true;
|
|
848
|
+
}
|
|
849
|
+
if (!Array.isArray(state.operations)) {
|
|
850
|
+
state.operations = [];
|
|
851
|
+
needsMigration = true;
|
|
852
|
+
}
|
|
853
|
+
if (!state.currentModel) {
|
|
854
|
+
state.currentModel = DEFAULT_MODEL;
|
|
855
|
+
needsMigration = true;
|
|
856
|
+
}
|
|
857
|
+
if (!state.approvalMode) {
|
|
858
|
+
state.approvalMode = ApprovalMode.MANUAL;
|
|
859
|
+
needsMigration = true;
|
|
860
|
+
}
|
|
861
|
+
if (!Array.isArray(state.contextFiles)) {
|
|
862
|
+
state.contextFiles = [];
|
|
863
|
+
needsMigration = true;
|
|
864
|
+
}
|
|
865
|
+
}
|
|
866
|
+
// Ensure required top-level fields exist
|
|
867
|
+
if (!session.id) {
|
|
868
|
+
session.id = uuidv4();
|
|
869
|
+
needsMigration = true;
|
|
870
|
+
}
|
|
871
|
+
if (!session.createdAt) {
|
|
872
|
+
session.createdAt = formatTimestamp();
|
|
873
|
+
needsMigration = true;
|
|
874
|
+
}
|
|
875
|
+
if (!session.updatedAt) {
|
|
876
|
+
session.updatedAt = formatTimestamp();
|
|
877
|
+
needsMigration = true;
|
|
878
|
+
}
|
|
879
|
+
if (!session.projectPath) {
|
|
880
|
+
session.projectPath = this.projectRoot;
|
|
881
|
+
needsMigration = true;
|
|
882
|
+
}
|
|
883
|
+
if (needsMigration) {
|
|
884
|
+
this.dirty = true;
|
|
885
|
+
logger.info('Session structure migrated to current schema');
|
|
886
|
+
}
|
|
887
|
+
return session;
|
|
888
|
+
}
|
|
889
|
+
/**
|
|
890
|
+
* Saves the current session to a named file in the saved-sessions directory.
|
|
891
|
+
*
|
|
892
|
+
* @param name - The name for the saved session
|
|
893
|
+
* @param description - Optional description for the saved session
|
|
894
|
+
* @returns The path to the saved session file
|
|
895
|
+
*
|
|
896
|
+
* @example
|
|
897
|
+
* ```typescript
|
|
898
|
+
* const path = await sessionManager.saveAs('my-feature-work', 'Working on login feature');
|
|
899
|
+
* console.log(`Session saved to: ${path}`);
|
|
900
|
+
* ```
|
|
901
|
+
*/
|
|
902
|
+
async saveAs(name, description) {
|
|
903
|
+
if (!this.session) {
|
|
904
|
+
throw new Error('No active session to save');
|
|
905
|
+
}
|
|
906
|
+
const savedSessionsDir = path.join(getGlobalCompassDir(), SAVED_SESSIONS_DIR);
|
|
907
|
+
await ensureDir(savedSessionsDir);
|
|
908
|
+
const savedSession = {
|
|
909
|
+
session: this.session,
|
|
910
|
+
savedAt: formatTimestamp(),
|
|
911
|
+
name,
|
|
912
|
+
description,
|
|
913
|
+
};
|
|
914
|
+
// Sanitize the name for use as a filename
|
|
915
|
+
const sanitizedName = name.replace(/[^a-zA-Z0-9-_]/g, '_');
|
|
916
|
+
const fileName = `${sanitizedName}.json`;
|
|
917
|
+
const filePath = path.join(savedSessionsDir, fileName);
|
|
918
|
+
await safeWriteJson(filePath, savedSession);
|
|
919
|
+
logger.info(`Session saved as: ${name}`);
|
|
920
|
+
return filePath;
|
|
921
|
+
}
|
|
922
|
+
/**
|
|
923
|
+
* Lists all saved sessions.
|
|
924
|
+
*
|
|
925
|
+
* @returns Array of SavedSession objects sorted by savedAt (most recent first)
|
|
926
|
+
*/
|
|
927
|
+
async listSavedSessions() {
|
|
928
|
+
const savedSessionsDir = path.join(getGlobalCompassDir(), SAVED_SESSIONS_DIR);
|
|
929
|
+
if (!(await pathExists(savedSessionsDir))) {
|
|
930
|
+
return [];
|
|
931
|
+
}
|
|
932
|
+
const files = await readDir(savedSessionsDir);
|
|
933
|
+
const sessions = [];
|
|
934
|
+
for (const file of files) {
|
|
935
|
+
if (file.endsWith('.json')) {
|
|
936
|
+
const filePath = path.join(savedSessionsDir, file);
|
|
937
|
+
try {
|
|
938
|
+
const saved = await safeReadJson(filePath);
|
|
939
|
+
if (saved) {
|
|
940
|
+
sessions.push(saved);
|
|
941
|
+
}
|
|
942
|
+
}
|
|
943
|
+
catch (error) {
|
|
944
|
+
logger.debug(`Failed to load saved session: ${file}`, error);
|
|
945
|
+
}
|
|
946
|
+
}
|
|
947
|
+
}
|
|
948
|
+
// Sort by savedAt, most recent first
|
|
949
|
+
return sessions.sort((a, b) => new Date(b.savedAt).getTime() - new Date(a.savedAt).getTime());
|
|
950
|
+
}
|
|
951
|
+
/**
|
|
952
|
+
* Loads a saved session by name.
|
|
953
|
+
*
|
|
954
|
+
* @param name - The name of the saved session to load
|
|
955
|
+
* @returns The loaded Session or null if not found
|
|
956
|
+
*/
|
|
957
|
+
async loadSaved(name) {
|
|
958
|
+
const savedSessionsDir = path.join(getGlobalCompassDir(), SAVED_SESSIONS_DIR);
|
|
959
|
+
const sanitizedName = name.replace(/[^a-zA-Z0-9-_]/g, '_');
|
|
960
|
+
const fileName = `${sanitizedName}.json`;
|
|
961
|
+
const filePath = path.join(savedSessionsDir, fileName);
|
|
962
|
+
if (!(await pathExists(filePath))) {
|
|
963
|
+
logger.debug(`Saved session not found: ${name}`);
|
|
964
|
+
return null;
|
|
965
|
+
}
|
|
966
|
+
try {
|
|
967
|
+
const saved = await safeReadJson(filePath);
|
|
968
|
+
if (saved) {
|
|
969
|
+
this.session = saved.session;
|
|
970
|
+
this.projectRoot = saved.session.projectPath;
|
|
971
|
+
this.dirty = false;
|
|
972
|
+
logger.info(`Loaded saved session: ${name}`);
|
|
973
|
+
return this.session;
|
|
974
|
+
}
|
|
975
|
+
return null;
|
|
976
|
+
}
|
|
977
|
+
catch (error) {
|
|
978
|
+
logger.error(`Failed to load saved session: ${name}`, error);
|
|
979
|
+
return null;
|
|
980
|
+
}
|
|
981
|
+
}
|
|
982
|
+
/**
|
|
983
|
+
* Deletes a saved session by name.
|
|
984
|
+
*
|
|
985
|
+
* @param name - The name of the saved session to delete
|
|
986
|
+
* @returns True if the session was deleted, false if not found
|
|
987
|
+
*/
|
|
988
|
+
async deleteSavedSession(name) {
|
|
989
|
+
const savedSessionsDir = path.join(getGlobalCompassDir(), SAVED_SESSIONS_DIR);
|
|
990
|
+
const sanitizedName = name.replace(/[^a-zA-Z0-9-_]/g, '_');
|
|
991
|
+
const fileName = `${sanitizedName}.json`;
|
|
992
|
+
const filePath = path.join(savedSessionsDir, fileName);
|
|
993
|
+
if (!(await pathExists(filePath))) {
|
|
994
|
+
return false;
|
|
995
|
+
}
|
|
996
|
+
try {
|
|
997
|
+
const { remove } = await import('../utils/file-system.js');
|
|
998
|
+
await remove(filePath);
|
|
999
|
+
logger.info(`Deleted saved session: ${name}`);
|
|
1000
|
+
return true;
|
|
1001
|
+
}
|
|
1002
|
+
catch (error) {
|
|
1003
|
+
logger.error(`Failed to delete saved session: ${name}`, error);
|
|
1004
|
+
return false;
|
|
1005
|
+
}
|
|
1006
|
+
}
|
|
1007
|
+
/**
|
|
1008
|
+
* Starts the auto-save timer.
|
|
1009
|
+
*
|
|
1010
|
+
* @param intervalMs - Interval in milliseconds between auto-saves
|
|
1011
|
+
*/
|
|
1012
|
+
startAutoSave(intervalMs = AUTO_SAVE_INTERVAL_MS) {
|
|
1013
|
+
this.stopAutoSave();
|
|
1014
|
+
this.autoSaveTimer = setInterval(() => {
|
|
1015
|
+
if (this.dirty) {
|
|
1016
|
+
this.save().catch((err) => {
|
|
1017
|
+
logger.error('Auto-save failed', err);
|
|
1018
|
+
});
|
|
1019
|
+
}
|
|
1020
|
+
}, intervalMs);
|
|
1021
|
+
logger.debug(`Auto-save started with interval: ${intervalMs}ms`);
|
|
1022
|
+
}
|
|
1023
|
+
/**
|
|
1024
|
+
* Stops the auto-save timer.
|
|
1025
|
+
*/
|
|
1026
|
+
stopAutoSave() {
|
|
1027
|
+
if (this.autoSaveTimer) {
|
|
1028
|
+
clearInterval(this.autoSaveTimer);
|
|
1029
|
+
this.autoSaveTimer = null;
|
|
1030
|
+
logger.debug('Auto-save stopped');
|
|
1031
|
+
}
|
|
1032
|
+
}
|
|
1033
|
+
/**
|
|
1034
|
+
* Checks if the session has unsaved changes.
|
|
1035
|
+
*
|
|
1036
|
+
* @returns True if there are unsaved changes
|
|
1037
|
+
*/
|
|
1038
|
+
isDirty() {
|
|
1039
|
+
return this.dirty;
|
|
1040
|
+
}
|
|
1041
|
+
/**
|
|
1042
|
+
* Forces a save regardless of dirty state.
|
|
1043
|
+
*/
|
|
1044
|
+
async forceSave() {
|
|
1045
|
+
this.dirty = true;
|
|
1046
|
+
await this.save();
|
|
1047
|
+
}
|
|
1048
|
+
/**
|
|
1049
|
+
* Gets the project root path.
|
|
1050
|
+
*
|
|
1051
|
+
* @returns The project root path
|
|
1052
|
+
*/
|
|
1053
|
+
getProjectRoot() {
|
|
1054
|
+
return this.projectRoot;
|
|
1055
|
+
}
|
|
1056
|
+
/**
|
|
1057
|
+
* Sets the project root path.
|
|
1058
|
+
*
|
|
1059
|
+
* @param projectRoot - The new project root path
|
|
1060
|
+
*/
|
|
1061
|
+
setProjectRoot(projectRoot) {
|
|
1062
|
+
this.projectRoot = projectRoot;
|
|
1063
|
+
if (this.session) {
|
|
1064
|
+
this.session.projectPath = projectRoot;
|
|
1065
|
+
this.dirty = true;
|
|
1066
|
+
}
|
|
1067
|
+
}
|
|
1068
|
+
/**
|
|
1069
|
+
* Exports the current session data for backup or analysis.
|
|
1070
|
+
*
|
|
1071
|
+
* @returns The current session or null
|
|
1072
|
+
*/
|
|
1073
|
+
exportSession() {
|
|
1074
|
+
return this.session ? { ...this.session } : null;
|
|
1075
|
+
}
|
|
1076
|
+
/**
|
|
1077
|
+
* Imports a session from exported data.
|
|
1078
|
+
*
|
|
1079
|
+
* @param session - The session data to import
|
|
1080
|
+
*/
|
|
1081
|
+
importSession(session) {
|
|
1082
|
+
this.session = { ...session };
|
|
1083
|
+
this.projectRoot = session.projectPath;
|
|
1084
|
+
this.dirty = true;
|
|
1085
|
+
logger.info(`Session imported: ${session.id}`);
|
|
1086
|
+
}
|
|
1087
|
+
/**
|
|
1088
|
+
* Gets the list of pending attachments for the next message.
|
|
1089
|
+
*
|
|
1090
|
+
* @returns Array of pending Attachment objects
|
|
1091
|
+
*/
|
|
1092
|
+
getPendingAttachments() {
|
|
1093
|
+
return [...this.pendingAttachments];
|
|
1094
|
+
}
|
|
1095
|
+
/**
|
|
1096
|
+
* Adds an attachment to the pending list.
|
|
1097
|
+
*
|
|
1098
|
+
* @param attachment - The attachment to add
|
|
1099
|
+
*/
|
|
1100
|
+
addPendingAttachment(attachment) {
|
|
1101
|
+
this.pendingAttachments.push(attachment);
|
|
1102
|
+
logger.debug(`Pending attachment added: ${attachment.filename} (${attachment.type})`);
|
|
1103
|
+
}
|
|
1104
|
+
/**
|
|
1105
|
+
* Adds multiple attachments to the pending list.
|
|
1106
|
+
*
|
|
1107
|
+
* @param attachments - Array of attachments to add
|
|
1108
|
+
*/
|
|
1109
|
+
addPendingAttachments(attachments) {
|
|
1110
|
+
this.pendingAttachments.push(...attachments);
|
|
1111
|
+
logger.debug(`Added ${attachments.length} pending attachments`);
|
|
1112
|
+
}
|
|
1113
|
+
/**
|
|
1114
|
+
* Clears all pending attachments.
|
|
1115
|
+
*/
|
|
1116
|
+
clearPendingAttachments() {
|
|
1117
|
+
const count = this.pendingAttachments.length;
|
|
1118
|
+
this.pendingAttachments = [];
|
|
1119
|
+
if (count > 0) {
|
|
1120
|
+
logger.debug(`Cleared ${count} pending attachments`);
|
|
1121
|
+
}
|
|
1122
|
+
}
|
|
1123
|
+
/**
|
|
1124
|
+
* Consumes and returns all pending attachments, clearing the pending list.
|
|
1125
|
+
* Use this when sending a message that includes attachments.
|
|
1126
|
+
*
|
|
1127
|
+
* @returns Array of Attachment objects
|
|
1128
|
+
*/
|
|
1129
|
+
consumePendingAttachments() {
|
|
1130
|
+
const attachments = [...this.pendingAttachments];
|
|
1131
|
+
this.pendingAttachments = [];
|
|
1132
|
+
if (attachments.length > 0) {
|
|
1133
|
+
logger.debug(`Consumed ${attachments.length} pending attachments`);
|
|
1134
|
+
}
|
|
1135
|
+
return attachments;
|
|
1136
|
+
}
|
|
1137
|
+
/**
|
|
1138
|
+
* Checks if there are any pending attachments.
|
|
1139
|
+
*
|
|
1140
|
+
* @returns True if there are pending attachments
|
|
1141
|
+
*/
|
|
1142
|
+
hasPendingAttachments() {
|
|
1143
|
+
return this.pendingAttachments.length > 0;
|
|
1144
|
+
}
|
|
1145
|
+
/**
|
|
1146
|
+
* Gets the count of pending attachments.
|
|
1147
|
+
*
|
|
1148
|
+
* @returns Number of pending attachments
|
|
1149
|
+
*/
|
|
1150
|
+
getPendingAttachmentsCount() {
|
|
1151
|
+
return this.pendingAttachments.length;
|
|
1152
|
+
}
|
|
1153
|
+
}
|
|
1154
|
+
// Singleton instance
|
|
1155
|
+
let sessionManagerInstance = null;
|
|
1156
|
+
/**
|
|
1157
|
+
* Gets the singleton SessionManager instance.
|
|
1158
|
+
* Creates the instance on first call.
|
|
1159
|
+
*
|
|
1160
|
+
* @returns The SessionManager instance
|
|
1161
|
+
*
|
|
1162
|
+
* @example
|
|
1163
|
+
* ```typescript
|
|
1164
|
+
* const sessionManager = getSessionManager();
|
|
1165
|
+
* const session = sessionManager.createSession();
|
|
1166
|
+
* ```
|
|
1167
|
+
*/
|
|
1168
|
+
export function getSessionManager() {
|
|
1169
|
+
if (!sessionManagerInstance) {
|
|
1170
|
+
sessionManagerInstance = new SessionManager();
|
|
1171
|
+
}
|
|
1172
|
+
return sessionManagerInstance;
|
|
1173
|
+
}
|
|
1174
|
+
/**
|
|
1175
|
+
* Creates a new SessionManager instance with custom configuration.
|
|
1176
|
+
* Use this when you need a separate instance from the singleton.
|
|
1177
|
+
*
|
|
1178
|
+
* @returns A new SessionManager instance
|
|
1179
|
+
*/
|
|
1180
|
+
export function createSessionManager() {
|
|
1181
|
+
return new SessionManager();
|
|
1182
|
+
}
|
|
1183
|
+
export { SessionManager };
|
|
1184
|
+
//# sourceMappingURL=session-manager.js.map
|