@compass-ai/nova 1.0.74 → 1.0.76
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/cli.js +557 -555
- package/dist/index.js +10 -8
- package/package.json +1 -1
- package/dist/acp/agent.d.ts +0 -318
- package/dist/acp/agent.d.ts.map +0 -1
- package/dist/acp/agent.js +0 -795
- package/dist/acp/agent.js.map +0 -1
- package/dist/acp/backpressure-writer.d.ts +0 -49
- package/dist/acp/backpressure-writer.d.ts.map +0 -1
- package/dist/acp/backpressure-writer.js +0 -153
- package/dist/acp/backpressure-writer.js.map +0 -1
- package/dist/acp/event-adapter.d.ts +0 -242
- package/dist/acp/event-adapter.d.ts.map +0 -1
- package/dist/acp/event-adapter.js +0 -456
- package/dist/acp/event-adapter.js.map +0 -1
- package/dist/acp/index.d.ts +0 -30
- package/dist/acp/index.d.ts.map +0 -1
- package/dist/acp/index.js +0 -36
- package/dist/acp/index.js.map +0 -1
- package/dist/acp/modes.d.ts +0 -56
- package/dist/acp/modes.d.ts.map +0 -1
- package/dist/acp/modes.js +0 -135
- package/dist/acp/modes.js.map +0 -1
- package/dist/acp/session-manager.d.ts +0 -170
- package/dist/acp/session-manager.d.ts.map +0 -1
- package/dist/acp/session-manager.js +0 -381
- package/dist/acp/session-manager.js.map +0 -1
- package/dist/acp/text-coalescer.d.ts +0 -45
- package/dist/acp/text-coalescer.d.ts.map +0 -1
- package/dist/acp/text-coalescer.js +0 -110
- package/dist/acp/text-coalescer.js.map +0 -1
- package/dist/acp/tool-bridge.d.ts +0 -156
- package/dist/acp/tool-bridge.d.ts.map +0 -1
- package/dist/acp/tool-bridge.js +0 -381
- package/dist/acp/tool-bridge.js.map +0 -1
- package/dist/acp/types.d.ts +0 -314
- package/dist/acp/types.d.ts.map +0 -1
- package/dist/acp/types.js +0 -8
- package/dist/acp/types.js.map +0 -1
- package/dist/cli.d.ts +0 -9
- package/dist/cli.d.ts.map +0 -1
- package/dist/cli.js.map +0 -1
- package/dist/commands/acp.d.ts +0 -26
- package/dist/commands/acp.d.ts.map +0 -1
- package/dist/commands/acp.js +0 -492
- package/dist/commands/acp.js.map +0 -1
- package/dist/commands/cache.d.ts +0 -33
- package/dist/commands/cache.d.ts.map +0 -1
- package/dist/commands/cache.js +0 -537
- package/dist/commands/cache.js.map +0 -1
- package/dist/commands/config.d.ts +0 -10
- package/dist/commands/config.d.ts.map +0 -1
- package/dist/commands/config.js +0 -367
- package/dist/commands/config.js.map +0 -1
- package/dist/commands/consent.d.ts +0 -21
- package/dist/commands/consent.d.ts.map +0 -1
- package/dist/commands/consent.js +0 -334
- package/dist/commands/consent.js.map +0 -1
- package/dist/commands/data.d.ts +0 -24
- package/dist/commands/data.d.ts.map +0 -1
- package/dist/commands/data.js +0 -586
- package/dist/commands/data.js.map +0 -1
- package/dist/commands/index.d.ts +0 -145
- package/dist/commands/index.d.ts.map +0 -1
- package/dist/commands/index.js +0 -210
- package/dist/commands/index.js.map +0 -1
- package/dist/commands/init.d.ts +0 -106
- package/dist/commands/init.d.ts.map +0 -1
- package/dist/commands/init.js +0 -349
- package/dist/commands/init.js.map +0 -1
- package/dist/commands/logs.d.ts +0 -13
- package/dist/commands/logs.d.ts.map +0 -1
- package/dist/commands/logs.js +0 -359
- package/dist/commands/logs.js.map +0 -1
- package/dist/commands/mcp.d.ts +0 -20
- package/dist/commands/mcp.d.ts.map +0 -1
- package/dist/commands/mcp.js +0 -687
- package/dist/commands/mcp.js.map +0 -1
- package/dist/commands/reset.d.ts +0 -20
- package/dist/commands/reset.d.ts.map +0 -1
- package/dist/commands/reset.js +0 -372
- package/dist/commands/reset.js.map +0 -1
- package/dist/commands/setup.d.ts +0 -74
- package/dist/commands/setup.d.ts.map +0 -1
- package/dist/commands/setup.js +0 -863
- package/dist/commands/setup.js.map +0 -1
- package/dist/commands/slash/agents.d.ts +0 -40
- package/dist/commands/slash/agents.d.ts.map +0 -1
- package/dist/commands/slash/agents.js +0 -519
- package/dist/commands/slash/agents.js.map +0 -1
- package/dist/commands/slash/approve.d.ts +0 -46
- package/dist/commands/slash/approve.d.ts.map +0 -1
- package/dist/commands/slash/approve.js +0 -239
- package/dist/commands/slash/approve.js.map +0 -1
- package/dist/commands/slash/attach.d.ts +0 -70
- package/dist/commands/slash/attach.d.ts.map +0 -1
- package/dist/commands/slash/attach.js +0 -333
- package/dist/commands/slash/attach.js.map +0 -1
- package/dist/commands/slash/clear.d.ts +0 -47
- package/dist/commands/slash/clear.d.ts.map +0 -1
- package/dist/commands/slash/clear.js +0 -261
- package/dist/commands/slash/clear.js.map +0 -1
- package/dist/commands/slash/commit.d.ts +0 -40
- package/dist/commands/slash/commit.d.ts.map +0 -1
- package/dist/commands/slash/commit.js +0 -337
- package/dist/commands/slash/commit.js.map +0 -1
- package/dist/commands/slash/compact.d.ts +0 -48
- package/dist/commands/slash/compact.d.ts.map +0 -1
- package/dist/commands/slash/compact.js +0 -288
- package/dist/commands/slash/compact.js.map +0 -1
- package/dist/commands/slash/config.d.ts +0 -20
- package/dist/commands/slash/config.d.ts.map +0 -1
- package/dist/commands/slash/config.js +0 -136
- package/dist/commands/slash/config.js.map +0 -1
- package/dist/commands/slash/context.d.ts +0 -49
- package/dist/commands/slash/context.d.ts.map +0 -1
- package/dist/commands/slash/context.js +0 -430
- package/dist/commands/slash/context.js.map +0 -1
- package/dist/commands/slash/cost.d.ts +0 -34
- package/dist/commands/slash/cost.d.ts.map +0 -1
- package/dist/commands/slash/cost.js +0 -312
- package/dist/commands/slash/cost.js.map +0 -1
- package/dist/commands/slash/custom.d.ts +0 -41
- package/dist/commands/slash/custom.d.ts.map +0 -1
- package/dist/commands/slash/custom.js +0 -126
- package/dist/commands/slash/custom.js.map +0 -1
- package/dist/commands/slash/exit.d.ts +0 -25
- package/dist/commands/slash/exit.d.ts.map +0 -1
- package/dist/commands/slash/exit.js +0 -186
- package/dist/commands/slash/exit.js.map +0 -1
- package/dist/commands/slash/export.d.ts +0 -27
- package/dist/commands/slash/export.d.ts.map +0 -1
- package/dist/commands/slash/export.js +0 -318
- package/dist/commands/slash/export.js.map +0 -1
- package/dist/commands/slash/files.d.ts +0 -47
- package/dist/commands/slash/files.d.ts.map +0 -1
- package/dist/commands/slash/files.js +0 -521
- package/dist/commands/slash/files.js.map +0 -1
- package/dist/commands/slash/help.d.ts +0 -50
- package/dist/commands/slash/help.d.ts.map +0 -1
- package/dist/commands/slash/help.js +0 -282
- package/dist/commands/slash/help.js.map +0 -1
- package/dist/commands/slash/index-cmd.d.ts +0 -41
- package/dist/commands/slash/index-cmd.d.ts.map +0 -1
- package/dist/commands/slash/index-cmd.js +0 -349
- package/dist/commands/slash/index-cmd.js.map +0 -1
- package/dist/commands/slash/index.d.ts +0 -97
- package/dist/commands/slash/index.d.ts.map +0 -1
- package/dist/commands/slash/index.js +0 -251
- package/dist/commands/slash/index.js.map +0 -1
- package/dist/commands/slash/login.d.ts +0 -23
- package/dist/commands/slash/login.d.ts.map +0 -1
- package/dist/commands/slash/login.js +0 -175
- package/dist/commands/slash/login.js.map +0 -1
- package/dist/commands/slash/logout.d.ts +0 -23
- package/dist/commands/slash/logout.d.ts.map +0 -1
- package/dist/commands/slash/logout.js +0 -153
- package/dist/commands/slash/logout.js.map +0 -1
- package/dist/commands/slash/logs.d.ts +0 -29
- package/dist/commands/slash/logs.d.ts.map +0 -1
- package/dist/commands/slash/logs.js +0 -423
- package/dist/commands/slash/logs.js.map +0 -1
- package/dist/commands/slash/mcp.d.ts +0 -29
- package/dist/commands/slash/mcp.d.ts.map +0 -1
- package/dist/commands/slash/mcp.js +0 -1026
- package/dist/commands/slash/mcp.js.map +0 -1
- package/dist/commands/slash/model.d.ts +0 -60
- package/dist/commands/slash/model.d.ts.map +0 -1
- package/dist/commands/slash/model.js +0 -466
- package/dist/commands/slash/model.js.map +0 -1
- package/dist/commands/slash/personality.d.ts +0 -40
- package/dist/commands/slash/personality.d.ts.map +0 -1
- package/dist/commands/slash/personality.js +0 -272
- package/dist/commands/slash/personality.js.map +0 -1
- package/dist/commands/slash/purge.d.ts +0 -42
- package/dist/commands/slash/purge.d.ts.map +0 -1
- package/dist/commands/slash/purge.js +0 -233
- package/dist/commands/slash/purge.js.map +0 -1
- package/dist/commands/slash/reset.d.ts +0 -44
- package/dist/commands/slash/reset.d.ts.map +0 -1
- package/dist/commands/slash/reset.js +0 -326
- package/dist/commands/slash/reset.js.map +0 -1
- package/dist/commands/slash/skills.d.ts +0 -40
- package/dist/commands/slash/skills.d.ts.map +0 -1
- package/dist/commands/slash/skills.js +0 -207
- package/dist/commands/slash/skills.js.map +0 -1
- package/dist/commands/slash/tokens.d.ts +0 -34
- package/dist/commands/slash/tokens.d.ts.map +0 -1
- package/dist/commands/slash/tokens.js +0 -205
- package/dist/commands/slash/tokens.js.map +0 -1
- package/dist/commands/slash/unleash.d.ts +0 -50
- package/dist/commands/slash/unleash.d.ts.map +0 -1
- package/dist/commands/slash/unleash.js +0 -262
- package/dist/commands/slash/unleash.js.map +0 -1
- package/dist/commands/slash/update.d.ts +0 -34
- package/dist/commands/slash/update.d.ts.map +0 -1
- package/dist/commands/slash/update.js +0 -364
- package/dist/commands/slash/update.js.map +0 -1
- package/dist/commands/slash/wrap.d.ts +0 -18
- package/dist/commands/slash/wrap.d.ts.map +0 -1
- package/dist/commands/slash/wrap.js +0 -21
- package/dist/commands/slash/wrap.js.map +0 -1
- package/dist/commands/tokens.d.ts +0 -26
- package/dist/commands/tokens.d.ts.map +0 -1
- package/dist/commands/tokens.js +0 -245
- package/dist/commands/tokens.js.map +0 -1
- package/dist/constants/builtin-agents.d.ts +0 -27
- package/dist/constants/builtin-agents.d.ts.map +0 -1
- package/dist/constants/builtin-agents.js +0 -710
- package/dist/constants/builtin-agents.js.map +0 -1
- package/dist/constants/builtin-skills.d.ts +0 -32
- package/dist/constants/builtin-skills.d.ts.map +0 -1
- package/dist/constants/builtin-skills.js +0 -389
- package/dist/constants/builtin-skills.js.map +0 -1
- package/dist/constants/defaults.d.ts +0 -448
- package/dist/constants/defaults.d.ts.map +0 -1
- package/dist/constants/defaults.js +0 -829
- package/dist/constants/defaults.js.map +0 -1
- package/dist/constants/index.d.ts +0 -27
- package/dist/constants/index.d.ts.map +0 -1
- package/dist/constants/index.js +0 -85
- package/dist/constants/index.js.map +0 -1
- package/dist/constants/install-hints.d.ts +0 -7
- package/dist/constants/install-hints.d.ts.map +0 -1
- package/dist/constants/install-hints.js +0 -123
- package/dist/constants/install-hints.js.map +0 -1
- package/dist/constants/models.d.ts +0 -255
- package/dist/constants/models.d.ts.map +0 -1
- package/dist/constants/models.js +0 -596
- package/dist/constants/models.js.map +0 -1
- package/dist/constants/schedule.d.ts +0 -43
- package/dist/constants/schedule.d.ts.map +0 -1
- package/dist/constants/schedule.js +0 -110
- package/dist/constants/schedule.js.map +0 -1
- package/dist/constants/system-utilities.d.ts +0 -57
- package/dist/constants/system-utilities.d.ts.map +0 -1
- package/dist/constants/system-utilities.js +0 -421
- package/dist/constants/system-utilities.js.map +0 -1
- package/dist/constants/token-limits.d.ts +0 -102
- package/dist/constants/token-limits.d.ts.map +0 -1
- package/dist/constants/token-limits.js +0 -286
- package/dist/constants/token-limits.js.map +0 -1
- package/dist/core/autocomplete.d.ts +0 -132
- package/dist/core/autocomplete.d.ts.map +0 -1
- package/dist/core/autocomplete.js +0 -653
- package/dist/core/autocomplete.js.map +0 -1
- package/dist/core/command-parser.d.ts +0 -301
- package/dist/core/command-parser.d.ts.map +0 -1
- package/dist/core/command-parser.js +0 -526
- package/dist/core/command-parser.js.map +0 -1
- package/dist/core/context-builder.d.ts +0 -264
- package/dist/core/context-builder.d.ts.map +0 -1
- package/dist/core/context-builder.js +0 -1018
- package/dist/core/context-builder.js.map +0 -1
- package/dist/core/event-emitter.d.ts +0 -411
- package/dist/core/event-emitter.d.ts.map +0 -1
- package/dist/core/event-emitter.js +0 -138
- package/dist/core/event-emitter.js.map +0 -1
- package/dist/core/history-manager.d.ts +0 -62
- package/dist/core/history-manager.d.ts.map +0 -1
- package/dist/core/history-manager.js +0 -151
- package/dist/core/history-manager.js.map +0 -1
- package/dist/core/slash-command-handler.d.ts +0 -352
- package/dist/core/slash-command-handler.d.ts.map +0 -1
- package/dist/core/slash-command-handler.js +0 -563
- package/dist/core/slash-command-handler.js.map +0 -1
- package/dist/core/task-processor.d.ts +0 -179
- package/dist/core/task-processor.d.ts.map +0 -1
- package/dist/core/task-processor.js +0 -519
- package/dist/core/task-processor.js.map +0 -1
- package/dist/index.d.ts +0 -90
- package/dist/index.d.ts.map +0 -1
- package/dist/index.js.map +0 -1
- package/dist/prompts/agent-prompt-generator.d.ts +0 -26
- package/dist/prompts/agent-prompt-generator.d.ts.map +0 -1
- package/dist/prompts/agent-prompt-generator.js +0 -244
- package/dist/prompts/agent-prompt-generator.js.map +0 -1
- package/dist/prompts/commit-message.d.ts +0 -35
- package/dist/prompts/commit-message.d.ts.map +0 -1
- package/dist/prompts/commit-message.js +0 -187
- package/dist/prompts/commit-message.js.map +0 -1
- package/dist/prompts/conversation.d.ts +0 -51
- package/dist/prompts/conversation.d.ts.map +0 -1
- package/dist/prompts/conversation.js +0 -115
- package/dist/prompts/conversation.js.map +0 -1
- package/dist/prompts/index.d.ts +0 -39
- package/dist/prompts/index.d.ts.map +0 -1
- package/dist/prompts/index.js +0 -74
- package/dist/prompts/index.js.map +0 -1
- package/dist/prompts/memory.d.ts +0 -6
- package/dist/prompts/memory.d.ts.map +0 -1
- package/dist/prompts/memory.js +0 -29
- package/dist/prompts/memory.js.map +0 -1
- package/dist/prompts/personality.d.ts +0 -77
- package/dist/prompts/personality.d.ts.map +0 -1
- package/dist/prompts/personality.js +0 -393
- package/dist/prompts/personality.js.map +0 -1
- package/dist/prompts/plan-generator.d.ts +0 -144
- package/dist/prompts/plan-generator.d.ts.map +0 -1
- package/dist/prompts/plan-generator.js +0 -553
- package/dist/prompts/plan-generator.js.map +0 -1
- package/dist/prompts/system.d.ts +0 -95
- package/dist/prompts/system.d.ts.map +0 -1
- package/dist/prompts/system.js +0 -461
- package/dist/prompts/system.js.map +0 -1
- package/dist/prompts/task-processor.d.ts +0 -94
- package/dist/prompts/task-processor.d.ts.map +0 -1
- package/dist/prompts/task-processor.js +0 -554
- package/dist/prompts/task-processor.js.map +0 -1
- package/dist/prompts/unguarded.d.ts +0 -78
- package/dist/prompts/unguarded.d.ts.map +0 -1
- package/dist/prompts/unguarded.js +0 -418
- package/dist/prompts/unguarded.js.map +0 -1
- package/dist/prompts/utils.d.ts +0 -73
- package/dist/prompts/utils.d.ts.map +0 -1
- package/dist/prompts/utils.js +0 -114
- package/dist/prompts/utils.js.map +0 -1
- package/dist/prompts/workflow.d.ts +0 -241
- package/dist/prompts/workflow.d.ts.map +0 -1
- package/dist/prompts/workflow.js +0 -608
- package/dist/prompts/workflow.js.map +0 -1
- package/dist/services/action-logger.d.ts +0 -383
- package/dist/services/action-logger.d.ts.map +0 -1
- package/dist/services/action-logger.js +0 -544
- package/dist/services/action-logger.js.map +0 -1
- package/dist/services/agent-budget-allocator.d.ts +0 -111
- package/dist/services/agent-budget-allocator.d.ts.map +0 -1
- package/dist/services/agent-budget-allocator.js +0 -278
- package/dist/services/agent-budget-allocator.js.map +0 -1
- package/dist/services/agent-manager.d.ts +0 -181
- package/dist/services/agent-manager.d.ts.map +0 -1
- package/dist/services/agent-manager.js +0 -749
- package/dist/services/agent-manager.js.map +0 -1
- package/dist/services/agent-spawner.d.ts +0 -138
- package/dist/services/agent-spawner.d.ts.map +0 -1
- package/dist/services/agent-spawner.js +0 -748
- package/dist/services/agent-spawner.js.map +0 -1
- package/dist/services/agent-state-service.d.ts +0 -145
- package/dist/services/agent-state-service.d.ts.map +0 -1
- package/dist/services/agent-state-service.js +0 -247
- package/dist/services/agent-state-service.js.map +0 -1
- package/dist/services/anthropic-client.d.ts +0 -357
- package/dist/services/anthropic-client.d.ts.map +0 -1
- package/dist/services/anthropic-client.js +0 -1451
- package/dist/services/anthropic-client.js.map +0 -1
- package/dist/services/approval-manager.d.ts +0 -385
- package/dist/services/approval-manager.d.ts.map +0 -1
- package/dist/services/approval-manager.js +0 -1044
- package/dist/services/approval-manager.js.map +0 -1
- package/dist/services/audit-logger.d.ts +0 -245
- package/dist/services/audit-logger.d.ts.map +0 -1
- package/dist/services/audit-logger.js +0 -324
- package/dist/services/audit-logger.js.map +0 -1
- package/dist/services/backup-manager.d.ts +0 -136
- package/dist/services/backup-manager.d.ts.map +0 -1
- package/dist/services/backup-manager.js +0 -260
- package/dist/services/backup-manager.js.map +0 -1
- package/dist/services/cache-service.d.ts +0 -247
- package/dist/services/cache-service.d.ts.map +0 -1
- package/dist/services/cache-service.js +0 -558
- package/dist/services/cache-service.js.map +0 -1
- package/dist/services/chat-archival-service.d.ts +0 -108
- package/dist/services/chat-archival-service.d.ts.map +0 -1
- package/dist/services/chat-archival-service.js +0 -465
- package/dist/services/chat-archival-service.js.map +0 -1
- package/dist/services/codebase-indexer.d.ts +0 -272
- package/dist/services/codebase-indexer.d.ts.map +0 -1
- package/dist/services/codebase-indexer.js +0 -863
- package/dist/services/codebase-indexer.js.map +0 -1
- package/dist/services/compass-auth-service.d.ts +0 -204
- package/dist/services/compass-auth-service.d.ts.map +0 -1
- package/dist/services/compass-auth-service.js +0 -391
- package/dist/services/compass-auth-service.js.map +0 -1
- package/dist/services/complexity-classifier.d.ts +0 -208
- package/dist/services/complexity-classifier.d.ts.map +0 -1
- package/dist/services/complexity-classifier.js +0 -1410
- package/dist/services/complexity-classifier.js.map +0 -1
- package/dist/services/config-manager.d.ts +0 -278
- package/dist/services/config-manager.d.ts.map +0 -1
- package/dist/services/config-manager.js +0 -651
- package/dist/services/config-manager.js.map +0 -1
- package/dist/services/consent-manager.d.ts +0 -239
- package/dist/services/consent-manager.d.ts.map +0 -1
- package/dist/services/consent-manager.js +0 -516
- package/dist/services/consent-manager.js.map +0 -1
- package/dist/services/conversation-compactor.d.ts +0 -223
- package/dist/services/conversation-compactor.d.ts.map +0 -1
- package/dist/services/conversation-compactor.js +0 -750
- package/dist/services/conversation-compactor.js.map +0 -1
- package/dist/services/cost-tracker.d.ts +0 -167
- package/dist/services/cost-tracker.d.ts.map +0 -1
- package/dist/services/cost-tracker.js +0 -199
- package/dist/services/cost-tracker.js.map +0 -1
- package/dist/services/credential-store.d.ts +0 -273
- package/dist/services/credential-store.d.ts.map +0 -1
- package/dist/services/credential-store.js +0 -877
- package/dist/services/credential-store.js.map +0 -1
- package/dist/services/custom-command-service.d.ts +0 -112
- package/dist/services/custom-command-service.d.ts.map +0 -1
- package/dist/services/custom-command-service.js +0 -464
- package/dist/services/custom-command-service.js.map +0 -1
- package/dist/services/default-statusline-renderer.d.ts +0 -60
- package/dist/services/default-statusline-renderer.d.ts.map +0 -1
- package/dist/services/default-statusline-renderer.js +0 -110
- package/dist/services/default-statusline-renderer.js.map +0 -1
- package/dist/services/enhanced-context-gatherer.d.ts +0 -116
- package/dist/services/enhanced-context-gatherer.d.ts.map +0 -1
- package/dist/services/enhanced-context-gatherer.js +0 -605
- package/dist/services/enhanced-context-gatherer.js.map +0 -1
- package/dist/services/file-hash-tracker.d.ts +0 -95
- package/dist/services/file-hash-tracker.d.ts.map +0 -1
- package/dist/services/file-hash-tracker.js +0 -199
- package/dist/services/file-hash-tracker.js.map +0 -1
- package/dist/services/file-service.d.ts +0 -274
- package/dist/services/file-service.d.ts.map +0 -1
- package/dist/services/file-service.js +0 -876
- package/dist/services/file-service.js.map +0 -1
- package/dist/services/git-service.d.ts +0 -536
- package/dist/services/git-service.d.ts.map +0 -1
- package/dist/services/git-service.js +0 -1215
- package/dist/services/git-service.js.map +0 -1
- package/dist/services/hook-service.d.ts +0 -148
- package/dist/services/hook-service.d.ts.map +0 -1
- package/dist/services/hook-service.js +0 -705
- package/dist/services/hook-service.js.map +0 -1
- package/dist/services/ide-state-service.d.ts +0 -114
- package/dist/services/ide-state-service.d.ts.map +0 -1
- package/dist/services/ide-state-service.js +0 -204
- package/dist/services/ide-state-service.js.map +0 -1
- package/dist/services/interactive-clarifier.d.ts +0 -90
- package/dist/services/interactive-clarifier.d.ts.map +0 -1
- package/dist/services/interactive-clarifier.js +0 -446
- package/dist/services/interactive-clarifier.js.map +0 -1
- package/dist/services/iteration-scoper.d.ts +0 -225
- package/dist/services/iteration-scoper.d.ts.map +0 -1
- package/dist/services/iteration-scoper.js +0 -387
- package/dist/services/iteration-scoper.js.map +0 -1
- package/dist/services/llm-plan-generator.d.ts +0 -44
- package/dist/services/llm-plan-generator.d.ts.map +0 -1
- package/dist/services/llm-plan-generator.js +0 -863
- package/dist/services/llm-plan-generator.js.map +0 -1
- package/dist/services/llm-system-prompt-generator.d.ts +0 -85
- package/dist/services/llm-system-prompt-generator.d.ts.map +0 -1
- package/dist/services/llm-system-prompt-generator.js +0 -257
- package/dist/services/llm-system-prompt-generator.js.map +0 -1
- package/dist/services/log-interpreter.d.ts +0 -190
- package/dist/services/log-interpreter.d.ts.map +0 -1
- package/dist/services/log-interpreter.js +0 -520
- package/dist/services/log-interpreter.js.map +0 -1
- package/dist/services/mcp-config-manager.d.ts +0 -141
- package/dist/services/mcp-config-manager.d.ts.map +0 -1
- package/dist/services/mcp-config-manager.js +0 -678
- package/dist/services/mcp-config-manager.js.map +0 -1
- package/dist/services/mcp-oauth-service.d.ts +0 -170
- package/dist/services/mcp-oauth-service.d.ts.map +0 -1
- package/dist/services/mcp-oauth-service.js +0 -892
- package/dist/services/mcp-oauth-service.js.map +0 -1
- package/dist/services/mcp-plugin-support.d.ts +0 -81
- package/dist/services/mcp-plugin-support.d.ts.map +0 -1
- package/dist/services/mcp-plugin-support.js +0 -305
- package/dist/services/mcp-plugin-support.js.map +0 -1
- package/dist/services/mcp-server-manager.d.ts +0 -134
- package/dist/services/mcp-server-manager.d.ts.map +0 -1
- package/dist/services/mcp-server-manager.js +0 -613
- package/dist/services/mcp-server-manager.js.map +0 -1
- package/dist/services/mcp-tool-integration.d.ts +0 -119
- package/dist/services/mcp-tool-integration.d.ts.map +0 -1
- package/dist/services/mcp-tool-integration.js +0 -381
- package/dist/services/mcp-tool-integration.js.map +0 -1
- package/dist/services/mcp-transport.d.ts +0 -105
- package/dist/services/mcp-transport.d.ts.map +0 -1
- package/dist/services/mcp-transport.js +0 -1316
- package/dist/services/mcp-transport.js.map +0 -1
- package/dist/services/memory-service.d.ts +0 -55
- package/dist/services/memory-service.d.ts.map +0 -1
- package/dist/services/memory-service.js +0 -251
- package/dist/services/memory-service.js.map +0 -1
- package/dist/services/model-availability.d.ts +0 -64
- package/dist/services/model-availability.d.ts.map +0 -1
- package/dist/services/model-availability.js +0 -114
- package/dist/services/model-availability.js.map +0 -1
- package/dist/services/plan-generator.d.ts +0 -98
- package/dist/services/plan-generator.d.ts.map +0 -1
- package/dist/services/plan-generator.js +0 -658
- package/dist/services/plan-generator.js.map +0 -1
- package/dist/services/plan-mode-fallback.d.ts +0 -80
- package/dist/services/plan-mode-fallback.d.ts.map +0 -1
- package/dist/services/plan-mode-fallback.js +0 -307
- package/dist/services/plan-mode-fallback.js.map +0 -1
- package/dist/services/plan-mode-handler.d.ts +0 -42
- package/dist/services/plan-mode-handler.d.ts.map +0 -1
- package/dist/services/plan-mode-handler.js +0 -388
- package/dist/services/plan-mode-handler.js.map +0 -1
- package/dist/services/plan-persistence.d.ts +0 -203
- package/dist/services/plan-persistence.d.ts.map +0 -1
- package/dist/services/plan-persistence.js +0 -538
- package/dist/services/plan-persistence.js.map +0 -1
- package/dist/services/prompt-preprocessor.d.ts +0 -73
- package/dist/services/prompt-preprocessor.d.ts.map +0 -1
- package/dist/services/prompt-preprocessor.js +0 -146
- package/dist/services/prompt-preprocessor.js.map +0 -1
- package/dist/services/rating-service.d.ts +0 -84
- package/dist/services/rating-service.d.ts.map +0 -1
- package/dist/services/rating-service.js +0 -171
- package/dist/services/rating-service.js.map +0 -1
- package/dist/services/rating-state-manager.d.ts +0 -131
- package/dist/services/rating-state-manager.d.ts.map +0 -1
- package/dist/services/rating-state-manager.js +0 -270
- package/dist/services/rating-state-manager.js.map +0 -1
- package/dist/services/sdk-runner.d.ts +0 -113
- package/dist/services/sdk-runner.d.ts.map +0 -1
- package/dist/services/sdk-runner.js +0 -1424
- package/dist/services/sdk-runner.js.map +0 -1
- package/dist/services/session-manager.d.ts +0 -528
- package/dist/services/session-manager.d.ts.map +0 -1
- package/dist/services/session-manager.js +0 -1184
- package/dist/services/session-manager.js.map +0 -1
- package/dist/services/shell-executor.d.ts +0 -337
- package/dist/services/shell-executor.d.ts.map +0 -1
- package/dist/services/shell-executor.js +0 -1201
- package/dist/services/shell-executor.js.map +0 -1
- package/dist/services/skill-service.d.ts +0 -149
- package/dist/services/skill-service.d.ts.map +0 -1
- package/dist/services/skill-service.js +0 -594
- package/dist/services/skill-service.js.map +0 -1
- package/dist/services/statusline-executor.d.ts +0 -102
- package/dist/services/statusline-executor.d.ts.map +0 -1
- package/dist/services/statusline-executor.js +0 -305
- package/dist/services/statusline-executor.js.map +0 -1
- package/dist/services/step-tracker.d.ts +0 -356
- package/dist/services/step-tracker.d.ts.map +0 -1
- package/dist/services/step-tracker.js +0 -634
- package/dist/services/step-tracker.js.map +0 -1
- package/dist/services/system-event-logger.d.ts +0 -473
- package/dist/services/system-event-logger.d.ts.map +0 -1
- package/dist/services/system-event-logger.js +0 -790
- package/dist/services/system-event-logger.js.map +0 -1
- package/dist/services/system-utility-detector.d.ts +0 -91
- package/dist/services/system-utility-detector.d.ts.map +0 -1
- package/dist/services/system-utility-detector.js +0 -238
- package/dist/services/system-utility-detector.js.map +0 -1
- package/dist/services/team-context-store.d.ts +0 -100
- package/dist/services/team-context-store.d.ts.map +0 -1
- package/dist/services/team-context-store.js +0 -513
- package/dist/services/team-context-store.js.map +0 -1
- package/dist/services/temp-file-service.d.ts +0 -164
- package/dist/services/temp-file-service.d.ts.map +0 -1
- package/dist/services/temp-file-service.js +0 -303
- package/dist/services/temp-file-service.js.map +0 -1
- package/dist/services/token-limit-enforcer.d.ts +0 -53
- package/dist/services/token-limit-enforcer.d.ts.map +0 -1
- package/dist/services/token-limit-enforcer.js +0 -90
- package/dist/services/token-limit-enforcer.js.map +0 -1
- package/dist/services/token-limit-store.d.ts +0 -105
- package/dist/services/token-limit-store.d.ts.map +0 -1
- package/dist/services/token-limit-store.js +0 -288
- package/dist/services/token-limit-store.js.map +0 -1
- package/dist/services/token-tracker.d.ts +0 -290
- package/dist/services/token-tracker.d.ts.map +0 -1
- package/dist/services/token-tracker.js +0 -751
- package/dist/services/token-tracker.js.map +0 -1
- package/dist/services/tool-registry.d.ts +0 -302
- package/dist/services/tool-registry.d.ts.map +0 -1
- package/dist/services/tool-registry.js +0 -606
- package/dist/services/tool-registry.js.map +0 -1
- package/dist/services/tools-logger.d.ts +0 -152
- package/dist/services/tools-logger.d.ts.map +0 -1
- package/dist/services/tools-logger.js +0 -222
- package/dist/services/tools-logger.js.map +0 -1
- package/dist/services/update-plan-handler.d.ts +0 -56
- package/dist/services/update-plan-handler.d.ts.map +0 -1
- package/dist/services/update-plan-handler.js +0 -372
- package/dist/services/update-plan-handler.js.map +0 -1
- package/dist/services/update-service.d.ts +0 -197
- package/dist/services/update-service.d.ts.map +0 -1
- package/dist/services/update-service.js +0 -749
- package/dist/services/update-service.js.map +0 -1
- package/dist/services/verifier.d.ts +0 -113
- package/dist/services/verifier.d.ts.map +0 -1
- package/dist/services/verifier.js +0 -541
- package/dist/services/verifier.js.map +0 -1
- package/dist/services/workflow-manager.d.ts +0 -277
- package/dist/services/workflow-manager.d.ts.map +0 -1
- package/dist/services/workflow-manager.js +0 -616
- package/dist/services/workflow-manager.js.map +0 -1
- package/dist/services/workflow-orchestrator.d.ts +0 -148
- package/dist/services/workflow-orchestrator.d.ts.map +0 -1
- package/dist/services/workflow-orchestrator.js +0 -617
- package/dist/services/workflow-orchestrator.js.map +0 -1
- package/dist/services/worktree-manager.d.ts +0 -36
- package/dist/services/worktree-manager.d.ts.map +0 -1
- package/dist/services/worktree-manager.js +0 -185
- package/dist/services/worktree-manager.js.map +0 -1
- package/dist/templates/ascii-art.d.ts +0 -136
- package/dist/templates/ascii-art.d.ts.map +0 -1
- package/dist/templates/ascii-art.js +0 -286
- package/dist/templates/ascii-art.js.map +0 -1
- package/dist/templates/help.d.ts +0 -186
- package/dist/templates/help.d.ts.map +0 -1
- package/dist/templates/help.js +0 -588
- package/dist/templates/help.js.map +0 -1
- package/dist/templates/prompts/workflow-prompts.d.ts +0 -9
- package/dist/templates/prompts/workflow-prompts.d.ts.map +0 -1
- package/dist/templates/prompts/workflow-prompts.js +0 -9
- package/dist/templates/prompts/workflow-prompts.js.map +0 -1
- package/dist/tools/agent-tools.d.ts +0 -9
- package/dist/tools/agent-tools.d.ts.map +0 -1
- package/dist/tools/agent-tools.js +0 -349
- package/dist/tools/agent-tools.js.map +0 -1
- package/dist/tools/edit-replacers.d.ts +0 -90
- package/dist/tools/edit-replacers.d.ts.map +0 -1
- package/dist/tools/edit-replacers.js +0 -553
- package/dist/tools/edit-replacers.js.map +0 -1
- package/dist/tools/file-tools.d.ts +0 -13
- package/dist/tools/file-tools.d.ts.map +0 -1
- package/dist/tools/file-tools.js +0 -954
- package/dist/tools/file-tools.js.map +0 -1
- package/dist/tools/git-tools.d.ts +0 -9
- package/dist/tools/git-tools.d.ts.map +0 -1
- package/dist/tools/git-tools.js +0 -261
- package/dist/tools/git-tools.js.map +0 -1
- package/dist/tools/index.d.ts +0 -13
- package/dist/tools/index.d.ts.map +0 -1
- package/dist/tools/index.js +0 -70
- package/dist/tools/index.js.map +0 -1
- package/dist/tools/network-tools.d.ts +0 -8
- package/dist/tools/network-tools.d.ts.map +0 -1
- package/dist/tools/network-tools.js +0 -261
- package/dist/tools/network-tools.js.map +0 -1
- package/dist/tools/openai-tools.d.ts +0 -16
- package/dist/tools/openai-tools.d.ts.map +0 -1
- package/dist/tools/openai-tools.js +0 -385
- package/dist/tools/openai-tools.js.map +0 -1
- package/dist/tools/plan-tools.d.ts +0 -9
- package/dist/tools/plan-tools.d.ts.map +0 -1
- package/dist/tools/plan-tools.js +0 -223
- package/dist/tools/plan-tools.js.map +0 -1
- package/dist/tools/schedule-tools.d.ts +0 -9
- package/dist/tools/schedule-tools.d.ts.map +0 -1
- package/dist/tools/schedule-tools.js +0 -405
- package/dist/tools/schedule-tools.js.map +0 -1
- package/dist/tools/search-tools.d.ts +0 -8
- package/dist/tools/search-tools.d.ts.map +0 -1
- package/dist/tools/search-tools.js +0 -357
- package/dist/tools/search-tools.js.map +0 -1
- package/dist/tools/shared-utils.d.ts +0 -91
- package/dist/tools/shared-utils.d.ts.map +0 -1
- package/dist/tools/shared-utils.js +0 -385
- package/dist/tools/shared-utils.js.map +0 -1
- package/dist/tools/shell-tools.d.ts +0 -9
- package/dist/tools/shell-tools.d.ts.map +0 -1
- package/dist/tools/shell-tools.js +0 -409
- package/dist/tools/shell-tools.js.map +0 -1
- package/dist/tools/skill-tools.d.ts +0 -13
- package/dist/tools/skill-tools.d.ts.map +0 -1
- package/dist/tools/skill-tools.js +0 -244
- package/dist/tools/skill-tools.js.map +0 -1
- package/dist/tools/swarm-tools.d.ts +0 -9
- package/dist/tools/swarm-tools.d.ts.map +0 -1
- package/dist/tools/swarm-tools.js +0 -422
- package/dist/tools/swarm-tools.js.map +0 -1
- package/dist/tools/user-tools.d.ts +0 -13
- package/dist/tools/user-tools.d.ts.map +0 -1
- package/dist/tools/user-tools.js +0 -232
- package/dist/tools/user-tools.js.map +0 -1
- package/dist/types/agent-process.d.ts +0 -244
- package/dist/types/agent-process.d.ts.map +0 -1
- package/dist/types/agent-process.js +0 -93
- package/dist/types/agent-process.js.map +0 -1
- package/dist/types/agent.d.ts +0 -358
- package/dist/types/agent.d.ts.map +0 -1
- package/dist/types/agent.js +0 -171
- package/dist/types/agent.js.map +0 -1
- package/dist/types/anthropic.d.ts +0 -438
- package/dist/types/anthropic.d.ts.map +0 -1
- package/dist/types/anthropic.js +0 -9
- package/dist/types/anthropic.js.map +0 -1
- package/dist/types/approval.d.ts +0 -332
- package/dist/types/approval.d.ts.map +0 -1
- package/dist/types/approval.js +0 -44
- package/dist/types/approval.js.map +0 -1
- package/dist/types/autocomplete.d.ts +0 -57
- package/dist/types/autocomplete.d.ts.map +0 -1
- package/dist/types/autocomplete.js +0 -7
- package/dist/types/autocomplete.js.map +0 -1
- package/dist/types/chat-archive.d.ts +0 -161
- package/dist/types/chat-archive.d.ts.map +0 -1
- package/dist/types/chat-archive.js +0 -36
- package/dist/types/chat-archive.js.map +0 -1
- package/dist/types/config.d.ts +0 -268
- package/dist/types/config.d.ts.map +0 -1
- package/dist/types/config.js +0 -188
- package/dist/types/config.js.map +0 -1
- package/dist/types/consent.d.ts +0 -191
- package/dist/types/consent.d.ts.map +0 -1
- package/dist/types/consent.js +0 -119
- package/dist/types/consent.js.map +0 -1
- package/dist/types/custom-command.d.ts +0 -139
- package/dist/types/custom-command.d.ts.map +0 -1
- package/dist/types/custom-command.js +0 -7
- package/dist/types/custom-command.js.map +0 -1
- package/dist/types/git.d.ts +0 -20
- package/dist/types/git.d.ts.map +0 -1
- package/dist/types/git.js +0 -2
- package/dist/types/git.js.map +0 -1
- package/dist/types/hook.d.ts +0 -342
- package/dist/types/hook.d.ts.map +0 -1
- package/dist/types/hook.js +0 -84
- package/dist/types/hook.js.map +0 -1
- package/dist/types/index.d.ts +0 -86
- package/dist/types/index.d.ts.map +0 -1
- package/dist/types/index.js +0 -71
- package/dist/types/index.js.map +0 -1
- package/dist/types/mcp.d.ts +0 -456
- package/dist/types/mcp.d.ts.map +0 -1
- package/dist/types/mcp.js +0 -94
- package/dist/types/mcp.js.map +0 -1
- package/dist/types/rating.d.ts +0 -110
- package/dist/types/rating.d.ts.map +0 -1
- package/dist/types/rating.js +0 -53
- package/dist/types/rating.js.map +0 -1
- package/dist/types/schedule.d.ts +0 -91
- package/dist/types/schedule.d.ts.map +0 -1
- package/dist/types/schedule.js +0 -8
- package/dist/types/schedule.js.map +0 -1
- package/dist/types/session.d.ts +0 -361
- package/dist/types/session.d.ts.map +0 -1
- package/dist/types/session.js +0 -9
- package/dist/types/session.js.map +0 -1
- package/dist/types/skill.d.ts +0 -258
- package/dist/types/skill.d.ts.map +0 -1
- package/dist/types/skill.js +0 -79
- package/dist/types/skill.js.map +0 -1
- package/dist/types/statusline.d.ts +0 -212
- package/dist/types/statusline.d.ts.map +0 -1
- package/dist/types/statusline.js +0 -8
- package/dist/types/statusline.js.map +0 -1
- package/dist/types/stream.d.ts +0 -61
- package/dist/types/stream.d.ts.map +0 -1
- package/dist/types/stream.js +0 -17
- package/dist/types/stream.js.map +0 -1
- package/dist/types/swarm.d.ts +0 -132
- package/dist/types/swarm.d.ts.map +0 -1
- package/dist/types/swarm.js +0 -21
- package/dist/types/swarm.js.map +0 -1
- package/dist/types/token-limits.d.ts +0 -107
- package/dist/types/token-limits.d.ts.map +0 -1
- package/dist/types/token-limits.js +0 -57
- package/dist/types/token-limits.js.map +0 -1
- package/dist/types/token.d.ts +0 -329
- package/dist/types/token.d.ts.map +0 -1
- package/dist/types/token.js +0 -9
- package/dist/types/token.js.map +0 -1
- package/dist/types/update.d.ts +0 -189
- package/dist/types/update.d.ts.map +0 -1
- package/dist/types/update.js +0 -55
- package/dist/types/update.js.map +0 -1
- package/dist/types/workflow.d.ts +0 -396
- package/dist/types/workflow.d.ts.map +0 -1
- package/dist/types/workflow.js +0 -46
- package/dist/types/workflow.js.map +0 -1
- package/dist/ui/App.d.ts +0 -62
- package/dist/ui/App.d.ts.map +0 -1
- package/dist/ui/App.js +0 -511
- package/dist/ui/App.js.map +0 -1
- package/dist/ui/InteractiveSession.d.ts +0 -34
- package/dist/ui/InteractiveSession.d.ts.map +0 -1
- package/dist/ui/InteractiveSession.js +0 -3611
- package/dist/ui/InteractiveSession.js.map +0 -1
- package/dist/ui/MCPApprovalPrompt.d.ts +0 -27
- package/dist/ui/MCPApprovalPrompt.d.ts.map +0 -1
- package/dist/ui/MCPApprovalPrompt.js +0 -51
- package/dist/ui/MCPApprovalPrompt.js.map +0 -1
- package/dist/ui/SetupWizard.d.ts +0 -26
- package/dist/ui/SetupWizard.d.ts.map +0 -1
- package/dist/ui/SetupWizard.js +0 -396
- package/dist/ui/SetupWizard.js.map +0 -1
- package/dist/ui/components/AgentCreationWizard.d.ts +0 -36
- package/dist/ui/components/AgentCreationWizard.d.ts.map +0 -1
- package/dist/ui/components/AgentCreationWizard.js +0 -619
- package/dist/ui/components/AgentCreationWizard.js.map +0 -1
- package/dist/ui/components/AgentManager.d.ts +0 -41
- package/dist/ui/components/AgentManager.d.ts.map +0 -1
- package/dist/ui/components/AgentManager.js +0 -343
- package/dist/ui/components/AgentManager.js.map +0 -1
- package/dist/ui/components/ApprovalDialog.d.ts +0 -18
- package/dist/ui/components/ApprovalDialog.d.ts.map +0 -1
- package/dist/ui/components/ApprovalDialog.js +0 -439
- package/dist/ui/components/ApprovalDialog.js.map +0 -1
- package/dist/ui/components/AsciiArt.d.ts +0 -54
- package/dist/ui/components/AsciiArt.d.ts.map +0 -1
- package/dist/ui/components/AsciiArt.js +0 -89
- package/dist/ui/components/AsciiArt.js.map +0 -1
- package/dist/ui/components/ClarificationWizard.d.ts +0 -36
- package/dist/ui/components/ClarificationWizard.d.ts.map +0 -1
- package/dist/ui/components/ClarificationWizard.js +0 -407
- package/dist/ui/components/ClarificationWizard.js.map +0 -1
- package/dist/ui/components/CompassSpinner.d.ts +0 -15
- package/dist/ui/components/CompassSpinner.d.ts.map +0 -1
- package/dist/ui/components/CompassSpinner.js +0 -50
- package/dist/ui/components/CompassSpinner.js.map +0 -1
- package/dist/ui/components/ConfirmationSelector.d.ts +0 -45
- package/dist/ui/components/ConfirmationSelector.d.ts.map +0 -1
- package/dist/ui/components/ConfirmationSelector.js +0 -106
- package/dist/ui/components/ConfirmationSelector.js.map +0 -1
- package/dist/ui/components/ContextUsage.d.ts +0 -76
- package/dist/ui/components/ContextUsage.d.ts.map +0 -1
- package/dist/ui/components/ContextUsage.js +0 -188
- package/dist/ui/components/ContextUsage.js.map +0 -1
- package/dist/ui/components/DiffPreview.d.ts +0 -13
- package/dist/ui/components/DiffPreview.d.ts.map +0 -1
- package/dist/ui/components/DiffPreview.js +0 -30
- package/dist/ui/components/DiffPreview.js.map +0 -1
- package/dist/ui/components/ExecutionModeSelector.d.ts +0 -45
- package/dist/ui/components/ExecutionModeSelector.d.ts.map +0 -1
- package/dist/ui/components/ExecutionModeSelector.js +0 -120
- package/dist/ui/components/ExecutionModeSelector.js.map +0 -1
- package/dist/ui/components/FileTree.d.ts +0 -47
- package/dist/ui/components/FileTree.d.ts.map +0 -1
- package/dist/ui/components/FileTree.js +0 -258
- package/dist/ui/components/FileTree.js.map +0 -1
- package/dist/ui/components/HelpMenu.d.ts +0 -49
- package/dist/ui/components/HelpMenu.d.ts.map +0 -1
- package/dist/ui/components/HelpMenu.js +0 -91
- package/dist/ui/components/HelpMenu.js.map +0 -1
- package/dist/ui/components/InterleavedStream.d.ts +0 -42
- package/dist/ui/components/InterleavedStream.d.ts.map +0 -1
- package/dist/ui/components/InterleavedStream.js +0 -1500
- package/dist/ui/components/InterleavedStream.js.map +0 -1
- package/dist/ui/components/ModelSelector.d.ts +0 -81
- package/dist/ui/components/ModelSelector.d.ts.map +0 -1
- package/dist/ui/components/ModelSelector.js +0 -305
- package/dist/ui/components/ModelSelector.js.map +0 -1
- package/dist/ui/components/PlanApprovalDialog.d.ts +0 -21
- package/dist/ui/components/PlanApprovalDialog.d.ts.map +0 -1
- package/dist/ui/components/PlanApprovalDialog.js +0 -189
- package/dist/ui/components/PlanApprovalDialog.js.map +0 -1
- package/dist/ui/components/PlanExecutionTracker.d.ts +0 -53
- package/dist/ui/components/PlanExecutionTracker.d.ts.map +0 -1
- package/dist/ui/components/PlanExecutionTracker.js +0 -113
- package/dist/ui/components/PlanExecutionTracker.js.map +0 -1
- package/dist/ui/components/ProgressIndicator.d.ts +0 -151
- package/dist/ui/components/ProgressIndicator.d.ts.map +0 -1
- package/dist/ui/components/ProgressIndicator.js +0 -171
- package/dist/ui/components/ProgressIndicator.js.map +0 -1
- package/dist/ui/components/Prompt.d.ts +0 -47
- package/dist/ui/components/Prompt.d.ts.map +0 -1
- package/dist/ui/components/Prompt.js +0 -632
- package/dist/ui/components/Prompt.js.map +0 -1
- package/dist/ui/components/RatingPanel.d.ts +0 -45
- package/dist/ui/components/RatingPanel.d.ts.map +0 -1
- package/dist/ui/components/RatingPanel.js +0 -119
- package/dist/ui/components/RatingPanel.js.map +0 -1
- package/dist/ui/components/StatusLine.d.ts +0 -43
- package/dist/ui/components/StatusLine.d.ts.map +0 -1
- package/dist/ui/components/StatusLine.js +0 -44
- package/dist/ui/components/StatusLine.js.map +0 -1
- package/dist/ui/components/StreamingResponse.d.ts +0 -45
- package/dist/ui/components/StreamingResponse.d.ts.map +0 -1
- package/dist/ui/components/StreamingResponse.js +0 -56
- package/dist/ui/components/StreamingResponse.js.map +0 -1
- package/dist/ui/components/TokenUsage.d.ts +0 -89
- package/dist/ui/components/TokenUsage.d.ts.map +0 -1
- package/dist/ui/components/TokenUsage.js +0 -99
- package/dist/ui/components/TokenUsage.js.map +0 -1
- package/dist/ui/components/ToolSummary.d.ts +0 -77
- package/dist/ui/components/ToolSummary.d.ts.map +0 -1
- package/dist/ui/components/ToolSummary.js +0 -162
- package/dist/ui/components/ToolSummary.js.map +0 -1
- package/dist/ui/components/UpdateNotification.d.ts +0 -65
- package/dist/ui/components/UpdateNotification.d.ts.map +0 -1
- package/dist/ui/components/UpdateNotification.js +0 -166
- package/dist/ui/components/UpdateNotification.js.map +0 -1
- package/dist/ui/diff-renderer.d.ts +0 -18
- package/dist/ui/diff-renderer.d.ts.map +0 -1
- package/dist/ui/diff-renderer.js +0 -206
- package/dist/ui/diff-renderer.js.map +0 -1
- package/dist/ui/themes/markdown-theme.d.ts +0 -48
- package/dist/ui/themes/markdown-theme.d.ts.map +0 -1
- package/dist/ui/themes/markdown-theme.js +0 -79
- package/dist/ui/themes/markdown-theme.js.map +0 -1
- package/dist/ui/themes/ui-theme.d.ts +0 -301
- package/dist/ui/themes/ui-theme.d.ts.map +0 -1
- package/dist/ui/themes/ui-theme.js +0 -204
- package/dist/ui/themes/ui-theme.js.map +0 -1
- package/dist/utils/attachment-handler.d.ts +0 -129
- package/dist/utils/attachment-handler.d.ts.map +0 -1
- package/dist/utils/attachment-handler.js +0 -280
- package/dist/utils/attachment-handler.js.map +0 -1
- package/dist/utils/backup-cleanup.d.ts +0 -28
- package/dist/utils/backup-cleanup.d.ts.map +0 -1
- package/dist/utils/backup-cleanup.js +0 -99
- package/dist/utils/backup-cleanup.js.map +0 -1
- package/dist/utils/clipboard-handler.d.ts +0 -82
- package/dist/utils/clipboard-handler.d.ts.map +0 -1
- package/dist/utils/clipboard-handler.js +0 -311
- package/dist/utils/clipboard-handler.js.map +0 -1
- package/dist/utils/cloud-detection.d.ts +0 -14
- package/dist/utils/cloud-detection.d.ts.map +0 -1
- package/dist/utils/cloud-detection.js +0 -92
- package/dist/utils/cloud-detection.js.map +0 -1
- package/dist/utils/command-parser.d.ts +0 -56
- package/dist/utils/command-parser.d.ts.map +0 -1
- package/dist/utils/command-parser.js +0 -206
- package/dist/utils/command-parser.js.map +0 -1
- package/dist/utils/console-capture.d.ts +0 -30
- package/dist/utils/console-capture.d.ts.map +0 -1
- package/dist/utils/console-capture.js +0 -88
- package/dist/utils/console-capture.js.map +0 -1
- package/dist/utils/cron-parser.d.ts +0 -52
- package/dist/utils/cron-parser.d.ts.map +0 -1
- package/dist/utils/cron-parser.js +0 -455
- package/dist/utils/cron-parser.js.map +0 -1
- package/dist/utils/crypto.d.ts +0 -351
- package/dist/utils/crypto.d.ts.map +0 -1
- package/dist/utils/crypto.js +0 -615
- package/dist/utils/crypto.js.map +0 -1
- package/dist/utils/diff.d.ts +0 -311
- package/dist/utils/diff.d.ts.map +0 -1
- package/dist/utils/diff.js +0 -566
- package/dist/utils/diff.js.map +0 -1
- package/dist/utils/editor.d.ts +0 -12
- package/dist/utils/editor.d.ts.map +0 -1
- package/dist/utils/editor.js +0 -30
- package/dist/utils/editor.js.map +0 -1
- package/dist/utils/file-system.d.ts +0 -512
- package/dist/utils/file-system.d.ts.map +0 -1
- package/dist/utils/file-system.js +0 -798
- package/dist/utils/file-system.js.map +0 -1
- package/dist/utils/format.d.ts +0 -318
- package/dist/utils/format.d.ts.map +0 -1
- package/dist/utils/format.js +0 -587
- package/dist/utils/format.js.map +0 -1
- package/dist/utils/ignore-patterns.d.ts +0 -93
- package/dist/utils/ignore-patterns.d.ts.map +0 -1
- package/dist/utils/ignore-patterns.js +0 -710
- package/dist/utils/ignore-patterns.js.map +0 -1
- package/dist/utils/log-cleanup.d.ts +0 -16
- package/dist/utils/log-cleanup.d.ts.map +0 -1
- package/dist/utils/log-cleanup.js +0 -51
- package/dist/utils/log-cleanup.js.map +0 -1
- package/dist/utils/logger.d.ts +0 -305
- package/dist/utils/logger.d.ts.map +0 -1
- package/dist/utils/logger.js +0 -447
- package/dist/utils/logger.js.map +0 -1
- package/dist/utils/path.d.ts +0 -406
- package/dist/utils/path.d.ts.map +0 -1
- package/dist/utils/path.js +0 -549
- package/dist/utils/path.js.map +0 -1
- package/dist/utils/schedule-file.d.ts +0 -63
- package/dist/utils/schedule-file.d.ts.map +0 -1
- package/dist/utils/schedule-file.js +0 -244
- package/dist/utils/schedule-file.js.map +0 -1
- package/dist/utils/task-id.d.ts +0 -29
- package/dist/utils/task-id.d.ts.map +0 -1
- package/dist/utils/task-id.js +0 -53
- package/dist/utils/task-id.js.map +0 -1
- package/dist/utils/temp-cleanup.d.ts +0 -46
- package/dist/utils/temp-cleanup.d.ts.map +0 -1
- package/dist/utils/temp-cleanup.js +0 -95
- package/dist/utils/temp-cleanup.js.map +0 -1
- package/dist/utils/terminal-output.d.ts +0 -34
- package/dist/utils/terminal-output.d.ts.map +0 -1
- package/dist/utils/terminal-output.js +0 -40
- package/dist/utils/terminal-output.js.map +0 -1
- package/dist/utils/token-counter.d.ts +0 -224
- package/dist/utils/token-counter.d.ts.map +0 -1
- package/dist/utils/token-counter.js +0 -332
- package/dist/utils/token-counter.js.map +0 -1
- package/dist/utils/tool-mapper.d.ts +0 -70
- package/dist/utils/tool-mapper.d.ts.map +0 -1
- package/dist/utils/tool-mapper.js +0 -234
- package/dist/utils/tool-mapper.js.map +0 -1
|
@@ -1,1424 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* SDK Runner Service for non-interactive CLI mode
|
|
3
|
-
*
|
|
4
|
-
* This service handles the -p flag functionality where the CLI runs a single
|
|
5
|
-
* query and exits. It provides the full agentic experience (tools, MCP, etc.)
|
|
6
|
-
* with output suitable for programmatic consumption.
|
|
7
|
-
*
|
|
8
|
-
* Key features:
|
|
9
|
-
* - Full agentic loop with tool execution
|
|
10
|
-
* - MCP tool integration
|
|
11
|
-
* - Streaming output to stdout
|
|
12
|
-
* - Auto-approval mode for non-interactive use
|
|
13
|
-
* - Piped input support with size limits
|
|
14
|
-
*/
|
|
15
|
-
import { getAnthropicClient } from './anthropic-client.js';
|
|
16
|
-
import { getSessionManager } from './session-manager.js';
|
|
17
|
-
import { getTokenTracker } from './token-tracker.js';
|
|
18
|
-
import { getConfigManager } from './config-manager.js';
|
|
19
|
-
import { getConsentManager } from './consent-manager.js';
|
|
20
|
-
import { getCredentialStore } from './credential-store.js';
|
|
21
|
-
import { getContextBuilder } from '../core/context-builder.js';
|
|
22
|
-
import { getToolRegistry } from './tool-registry.js';
|
|
23
|
-
import { registerBuiltInTools } from '../tools/index.js';
|
|
24
|
-
import { getMCPToolIntegration } from './mcp-tool-integration.js';
|
|
25
|
-
import { getApprovalManager } from './approval-manager.js';
|
|
26
|
-
import { getAuditLogger } from './audit-logger.js';
|
|
27
|
-
import { buildSystemPrompt } from '../prompts/index.js';
|
|
28
|
-
import { getSystemUtilitiesPromptSection } from './system-utility-detector.js';
|
|
29
|
-
import { loadAllMemory } from './memory-service.js';
|
|
30
|
-
import { ensureDir } from '../utils/file-system.js';
|
|
31
|
-
import { getGlobalCompassDir, getProjectCompassDir } from '../utils/path.js';
|
|
32
|
-
import { logger } from '../utils/logger.js';
|
|
33
|
-
import { buildAttachmentContentBlocks } from '../utils/attachment-handler.js';
|
|
34
|
-
import { ApprovalMode } from '../types/approval.js';
|
|
35
|
-
import { getCompassAuthService } from './compass-auth-service.js';
|
|
36
|
-
import { DEFAULT_MAX_TOKENS, DEFAULT_MAX_AGENTIC_ITERATIONS } from '../constants/defaults.js';
|
|
37
|
-
import chalk from 'chalk';
|
|
38
|
-
/** Maximum size for piped input in bytes (100KB) */
|
|
39
|
-
const MAX_PIPED_INPUT_SIZE = 100 * 1024;
|
|
40
|
-
/** Timeout for reading stdin in milliseconds */
|
|
41
|
-
const STDIN_READ_TIMEOUT = 500;
|
|
42
|
-
/**
|
|
43
|
-
* Extracts a short summary from an error message
|
|
44
|
-
*/
|
|
45
|
-
function summarizeError(error) {
|
|
46
|
-
// Extract key information from common error patterns
|
|
47
|
-
if (error.includes('not unique')) {
|
|
48
|
-
const match = error.match(/Found (\d+) occurrences/i);
|
|
49
|
-
return match ? `non-unique match (${match[1]} occurrences)` : 'non-unique match';
|
|
50
|
-
}
|
|
51
|
-
if (error.includes('not found in file')) {
|
|
52
|
-
return 'text not found';
|
|
53
|
-
}
|
|
54
|
-
if (error.includes('Permission denied')) {
|
|
55
|
-
return 'permission denied';
|
|
56
|
-
}
|
|
57
|
-
if (error.includes('File not found') || error.includes('ENOENT')) {
|
|
58
|
-
return 'file not found';
|
|
59
|
-
}
|
|
60
|
-
// Fallback: truncate long errors
|
|
61
|
-
const cleanError = error.replace(/^Error:\s*/i, '');
|
|
62
|
-
return cleanError.length > 50 ? cleanError.slice(0, 47) + '...' : cleanError;
|
|
63
|
-
}
|
|
64
|
-
/**
|
|
65
|
-
* Checks if the current tool call is a retry of the previous failed tool
|
|
66
|
-
*/
|
|
67
|
-
function isConsecutiveRetry(currentToolName, currentInput, retryState) {
|
|
68
|
-
if (!retryState)
|
|
69
|
-
return false;
|
|
70
|
-
// Must be the same tool
|
|
71
|
-
if (retryState.toolName !== currentToolName)
|
|
72
|
-
return false;
|
|
73
|
-
// For file-based tools, check if targeting the same file
|
|
74
|
-
const fileTools = ['edit_file', 'read_file', 'write_file'];
|
|
75
|
-
if (fileTools.includes(currentToolName)) {
|
|
76
|
-
const currentPath = currentInput.path;
|
|
77
|
-
if (currentPath && retryState.targetPath && currentPath !== retryState.targetPath) {
|
|
78
|
-
return false; // Different file, not a retry
|
|
79
|
-
}
|
|
80
|
-
}
|
|
81
|
-
return true;
|
|
82
|
-
}
|
|
83
|
-
/**
|
|
84
|
-
* Annotates tool result content with retry information
|
|
85
|
-
*/
|
|
86
|
-
function annotateToolResult(content, isError, attemptCount, previousErrors) {
|
|
87
|
-
if (attemptCount <= 1) {
|
|
88
|
-
return content; // First attempt, no annotation needed
|
|
89
|
-
}
|
|
90
|
-
const previousSummary = previousErrors.join(' → ');
|
|
91
|
-
if (isError) {
|
|
92
|
-
// Still failing - show attempt count and history
|
|
93
|
-
return `[Attempt ${attemptCount}] ${content}\n\n--- Previous attempts ---\n${previousErrors.map((e, i) => `#${i + 1}: ${e}`).join('\n')}`;
|
|
94
|
-
}
|
|
95
|
-
else {
|
|
96
|
-
// Success after failures - show resolution info
|
|
97
|
-
return `${content}\n\n[Resolved after ${attemptCount} attempts. Previous errors: ${previousSummary}]`;
|
|
98
|
-
}
|
|
99
|
-
}
|
|
100
|
-
/**
|
|
101
|
-
* Reads piped input from stdin with size limit and timeout
|
|
102
|
-
* @returns The piped content or undefined if no pipe or empty
|
|
103
|
-
*/
|
|
104
|
-
export async function readStdin() {
|
|
105
|
-
// Only read stdin if data is being piped (not a TTY)
|
|
106
|
-
if (process.stdin.isTTY) {
|
|
107
|
-
return undefined;
|
|
108
|
-
}
|
|
109
|
-
return new Promise((resolve) => {
|
|
110
|
-
let data = '';
|
|
111
|
-
let resolved = false;
|
|
112
|
-
const finish = (result) => {
|
|
113
|
-
if (!resolved) {
|
|
114
|
-
resolved = true;
|
|
115
|
-
process.stdin.removeAllListeners();
|
|
116
|
-
process.stdin.pause();
|
|
117
|
-
resolve(result);
|
|
118
|
-
}
|
|
119
|
-
};
|
|
120
|
-
process.stdin.setEncoding('utf8');
|
|
121
|
-
process.stdin.on('data', (chunk) => {
|
|
122
|
-
data += chunk;
|
|
123
|
-
// Check size limit
|
|
124
|
-
if (Buffer.byteLength(data, 'utf8') > MAX_PIPED_INPUT_SIZE) {
|
|
125
|
-
logger.warn(`Piped input exceeds ${MAX_PIPED_INPUT_SIZE / 1024}KB limit, truncating`);
|
|
126
|
-
data = data.slice(0, MAX_PIPED_INPUT_SIZE);
|
|
127
|
-
finish(data);
|
|
128
|
-
}
|
|
129
|
-
});
|
|
130
|
-
process.stdin.on('end', () => {
|
|
131
|
-
finish(data || undefined);
|
|
132
|
-
});
|
|
133
|
-
process.stdin.on('error', (err) => {
|
|
134
|
-
logger.debug('Error reading stdin', err);
|
|
135
|
-
finish(undefined);
|
|
136
|
-
});
|
|
137
|
-
// Timeout to avoid hanging if no data
|
|
138
|
-
setTimeout(() => {
|
|
139
|
-
finish(data || undefined);
|
|
140
|
-
}, STDIN_READ_TIMEOUT);
|
|
141
|
-
// Start reading
|
|
142
|
-
process.stdin.resume();
|
|
143
|
-
});
|
|
144
|
-
}
|
|
145
|
-
/**
|
|
146
|
-
* Maps agent-friendly tool aliases to registered tool names.
|
|
147
|
-
* Agent definitions use Claude-Code-style names (Read, Grep, Bash, etc.)
|
|
148
|
-
* but tools are registered with different names (read_file, search_code, etc.).
|
|
149
|
-
*/
|
|
150
|
-
const TOOL_NAME_ALIASES = {
|
|
151
|
-
'grep': 'search_code',
|
|
152
|
-
'bash': 'execute_command',
|
|
153
|
-
'askuserquestion': 'ask_user',
|
|
154
|
-
'notebookedit': 'notebook_edit',
|
|
155
|
-
// Swarm tools
|
|
156
|
-
'spawnteam': 'spawn_team',
|
|
157
|
-
'getteamstatus': 'get_team_status',
|
|
158
|
-
'listteams': 'list_teams',
|
|
159
|
-
'cancelteam': 'cancel_team',
|
|
160
|
-
'teammessage': 'team_message',
|
|
161
|
-
};
|
|
162
|
-
/**
|
|
163
|
-
* Builds a set of tool names that are allowed by an agent's allowedTools list.
|
|
164
|
-
* Resolves aliases and display names to actual registered tool names.
|
|
165
|
-
*/
|
|
166
|
-
function resolveAllowedToolNames(allowedTools, toolRegistry) {
|
|
167
|
-
const resolvedNames = new Set();
|
|
168
|
-
for (const alias of allowedTools) {
|
|
169
|
-
const lower = alias.toLowerCase();
|
|
170
|
-
// Check direct alias mapping
|
|
171
|
-
if (TOOL_NAME_ALIASES[lower]) {
|
|
172
|
-
resolvedNames.add(TOOL_NAME_ALIASES[lower]);
|
|
173
|
-
}
|
|
174
|
-
// Also add the raw name (handles cases where allowedTools uses the actual name)
|
|
175
|
-
resolvedNames.add(lower);
|
|
176
|
-
}
|
|
177
|
-
// Now build the final set: for each registered tool, check if it matches
|
|
178
|
-
const allTools = toolRegistry.getToolDefinitions({ includeDisabled: true });
|
|
179
|
-
const matchedNames = new Set();
|
|
180
|
-
for (const tool of allTools) {
|
|
181
|
-
const toolNameLower = tool.name.toLowerCase();
|
|
182
|
-
const displayNameLower = toolRegistry.getDisplayName(tool.name).toLowerCase();
|
|
183
|
-
if (resolvedNames.has(toolNameLower) || resolvedNames.has(displayNameLower)) {
|
|
184
|
-
matchedNames.add(tool.name);
|
|
185
|
-
}
|
|
186
|
-
}
|
|
187
|
-
return matchedNames;
|
|
188
|
-
}
|
|
189
|
-
/**
|
|
190
|
-
* Tools that are safe to execute in parallel (read-only, no side effects)
|
|
191
|
-
*/
|
|
192
|
-
const PARALLEL_SAFE_TOOLS = new Set([
|
|
193
|
-
// File reads
|
|
194
|
-
'read_file',
|
|
195
|
-
'read_media_file',
|
|
196
|
-
'read_multiple_files',
|
|
197
|
-
// Directory operations (read-only)
|
|
198
|
-
'list_files',
|
|
199
|
-
'list_directory',
|
|
200
|
-
'list_directory_with_sizes',
|
|
201
|
-
'directory_tree',
|
|
202
|
-
'get_file_info',
|
|
203
|
-
// Search operations
|
|
204
|
-
'search_code',
|
|
205
|
-
'find_files',
|
|
206
|
-
'analyze_dependencies',
|
|
207
|
-
// Git read operations
|
|
208
|
-
'git_status',
|
|
209
|
-
'git_diff',
|
|
210
|
-
'git_log',
|
|
211
|
-
// Process/task listing
|
|
212
|
-
'list_processes',
|
|
213
|
-
'list_tasks',
|
|
214
|
-
// NOTE: poll_task is NOT parallel-safe because it blocks by default until completion
|
|
215
|
-
'list_skills',
|
|
216
|
-
]);
|
|
217
|
-
/**
|
|
218
|
-
* Determines if a tool call is safe to execute in parallel
|
|
219
|
-
*/
|
|
220
|
-
function isParallelSafe(toolName, toolInput) {
|
|
221
|
-
// Check if tool is in the safe list
|
|
222
|
-
if (PARALLEL_SAFE_TOOLS.has(toolName)) {
|
|
223
|
-
return true;
|
|
224
|
-
}
|
|
225
|
-
// Special case: execute_command is safe if it's a read-only command
|
|
226
|
-
if (toolName === 'execute_command') {
|
|
227
|
-
const command = String(toolInput.command || '').trim().toLowerCase();
|
|
228
|
-
// Common read-only command patterns
|
|
229
|
-
const readOnlyPatterns = [
|
|
230
|
-
/^git\s+(status|diff|log|show|branch|tag)/,
|
|
231
|
-
/^ls\b/,
|
|
232
|
-
/^cat\b/,
|
|
233
|
-
/^echo\b/,
|
|
234
|
-
/^pwd\b/,
|
|
235
|
-
/^whoami\b/,
|
|
236
|
-
/^which\b/,
|
|
237
|
-
/^where\b/,
|
|
238
|
-
/^node\s+--version/,
|
|
239
|
-
/^npm\s+(list|ls|view|show)/,
|
|
240
|
-
/^yarn\s+(list|info)/,
|
|
241
|
-
/^pnpm\s+list/,
|
|
242
|
-
/^python\s+--version/,
|
|
243
|
-
/^java\s+-version/,
|
|
244
|
-
];
|
|
245
|
-
return readOnlyPatterns.some(pattern => pattern.test(command));
|
|
246
|
-
}
|
|
247
|
-
// Default to sequential for safety
|
|
248
|
-
return false;
|
|
249
|
-
}
|
|
250
|
-
/**
|
|
251
|
-
* Executes a single tool call and returns formatted results
|
|
252
|
-
*/
|
|
253
|
-
async function executeSingleTool(toolUse, projectRoot, toolRegistry) {
|
|
254
|
-
const startTime = Date.now();
|
|
255
|
-
let userRejected = false;
|
|
256
|
-
let endTurn = false;
|
|
257
|
-
try {
|
|
258
|
-
const result = await toolRegistry.executeTool(toolUse.name, toolUse.input, { projectRoot, toolCallId: toolUse.id });
|
|
259
|
-
const duration = Date.now() - startTime;
|
|
260
|
-
if (result.success) {
|
|
261
|
-
const toolData = result.data;
|
|
262
|
-
const isToolRejection = toolData?.success === false &&
|
|
263
|
-
(String(toolData?.error || '').toLowerCase().includes('rejected by user') ||
|
|
264
|
-
String(toolData?.error || '').toLowerCase().includes('rejected'));
|
|
265
|
-
// Check if a plan was cancelled — this signals the turn should end
|
|
266
|
-
if (toolData?.planCancelled === true) {
|
|
267
|
-
endTurn = true;
|
|
268
|
-
logger.info(`Plan cancelled via ${toolUse.name} — will end turn`);
|
|
269
|
-
}
|
|
270
|
-
if (isToolRejection) {
|
|
271
|
-
userRejected = true;
|
|
272
|
-
return {
|
|
273
|
-
toolResult: {
|
|
274
|
-
type: 'tool_result',
|
|
275
|
-
tool_use_id: toolUse.id,
|
|
276
|
-
content: `Error: ${toolData?.error || 'Operation rejected by user'}`,
|
|
277
|
-
is_error: true,
|
|
278
|
-
},
|
|
279
|
-
toolRecord: {
|
|
280
|
-
name: toolUse.name,
|
|
281
|
-
input: toolUse.input,
|
|
282
|
-
result: null,
|
|
283
|
-
success: false,
|
|
284
|
-
error: String(toolData?.error || 'Operation rejected by user'),
|
|
285
|
-
duration_ms: duration,
|
|
286
|
-
},
|
|
287
|
-
userRejected,
|
|
288
|
-
endTurn,
|
|
289
|
-
};
|
|
290
|
-
}
|
|
291
|
-
else {
|
|
292
|
-
logger.debug(`Tool ${toolUse.name} succeeded in ${duration}ms`);
|
|
293
|
-
return {
|
|
294
|
-
toolResult: {
|
|
295
|
-
type: 'tool_result',
|
|
296
|
-
tool_use_id: toolUse.id,
|
|
297
|
-
content: JSON.stringify(result.data, null, 2),
|
|
298
|
-
},
|
|
299
|
-
toolRecord: {
|
|
300
|
-
name: toolUse.name,
|
|
301
|
-
input: toolUse.input,
|
|
302
|
-
result: result.data,
|
|
303
|
-
success: true,
|
|
304
|
-
duration_ms: duration,
|
|
305
|
-
},
|
|
306
|
-
userRejected,
|
|
307
|
-
endTurn,
|
|
308
|
-
};
|
|
309
|
-
}
|
|
310
|
-
}
|
|
311
|
-
else {
|
|
312
|
-
const isUserRejection = result.error?.toLowerCase().includes('rejected by user') ||
|
|
313
|
-
result.error?.toLowerCase().includes('rejected');
|
|
314
|
-
if (isUserRejection) {
|
|
315
|
-
userRejected = true;
|
|
316
|
-
}
|
|
317
|
-
logger.debug(`Tool ${toolUse.name} failed: ${result.error}`);
|
|
318
|
-
return {
|
|
319
|
-
toolResult: {
|
|
320
|
-
type: 'tool_result',
|
|
321
|
-
tool_use_id: toolUse.id,
|
|
322
|
-
content: `Error: ${result.error}`,
|
|
323
|
-
is_error: true,
|
|
324
|
-
},
|
|
325
|
-
toolRecord: {
|
|
326
|
-
name: toolUse.name,
|
|
327
|
-
input: toolUse.input,
|
|
328
|
-
result: null,
|
|
329
|
-
success: false,
|
|
330
|
-
error: result.error,
|
|
331
|
-
duration_ms: duration,
|
|
332
|
-
},
|
|
333
|
-
userRejected,
|
|
334
|
-
endTurn,
|
|
335
|
-
};
|
|
336
|
-
}
|
|
337
|
-
}
|
|
338
|
-
catch (err) {
|
|
339
|
-
const duration = Date.now() - startTime;
|
|
340
|
-
const errorMsg = err instanceof Error ? err.message : 'Tool execution failed';
|
|
341
|
-
logger.error(`Tool ${toolUse.name} threw error`, err);
|
|
342
|
-
return {
|
|
343
|
-
toolResult: {
|
|
344
|
-
type: 'tool_result',
|
|
345
|
-
tool_use_id: toolUse.id,
|
|
346
|
-
content: `Error: ${errorMsg}`,
|
|
347
|
-
is_error: true,
|
|
348
|
-
},
|
|
349
|
-
toolRecord: {
|
|
350
|
-
name: toolUse.name,
|
|
351
|
-
input: toolUse.input,
|
|
352
|
-
result: null,
|
|
353
|
-
success: false,
|
|
354
|
-
error: errorMsg,
|
|
355
|
-
duration_ms: duration,
|
|
356
|
-
},
|
|
357
|
-
userRejected,
|
|
358
|
-
endTurn,
|
|
359
|
-
};
|
|
360
|
-
}
|
|
361
|
-
}
|
|
362
|
-
/**
|
|
363
|
-
* Executes tool calls and returns tool results.
|
|
364
|
-
* Automatically runs tools in parallel when safe to do so.
|
|
365
|
-
*/
|
|
366
|
-
async function executeToolCalls(toolUseBlocks, projectRoot) {
|
|
367
|
-
const toolRegistry = getToolRegistry();
|
|
368
|
-
let userRejected = false;
|
|
369
|
-
let endTurn = false;
|
|
370
|
-
// Check if all tools are safe for parallel execution
|
|
371
|
-
const allSafeForParallel = toolUseBlocks.every(toolUse => isParallelSafe(toolUse.name, toolUse.input));
|
|
372
|
-
if (allSafeForParallel && toolUseBlocks.length > 1) {
|
|
373
|
-
// Execute all tools in parallel
|
|
374
|
-
logger.debug(`Executing ${toolUseBlocks.length} tools in parallel: ${toolUseBlocks.map(t => t.name).join(', ')}`);
|
|
375
|
-
const executionPromises = toolUseBlocks.map(toolUse => executeSingleTool(toolUse, projectRoot, toolRegistry));
|
|
376
|
-
const executionResults = await Promise.all(executionPromises);
|
|
377
|
-
// Extract results and check for user rejections
|
|
378
|
-
const toolResults = [];
|
|
379
|
-
const toolRecords = [];
|
|
380
|
-
for (const execResult of executionResults) {
|
|
381
|
-
toolResults.push(execResult.toolResult);
|
|
382
|
-
toolRecords.push(execResult.toolRecord);
|
|
383
|
-
if (execResult.userRejected) {
|
|
384
|
-
userRejected = true;
|
|
385
|
-
}
|
|
386
|
-
if (execResult.endTurn) {
|
|
387
|
-
endTurn = true;
|
|
388
|
-
}
|
|
389
|
-
}
|
|
390
|
-
return { results: toolResults, records: toolRecords, userRejected, endTurn };
|
|
391
|
-
}
|
|
392
|
-
else {
|
|
393
|
-
// Execute tools sequentially (original behavior)
|
|
394
|
-
if (toolUseBlocks.length > 1) {
|
|
395
|
-
logger.debug(`Executing ${toolUseBlocks.length} tools sequentially (contains write operations)`);
|
|
396
|
-
}
|
|
397
|
-
const toolResults = [];
|
|
398
|
-
const toolRecords = [];
|
|
399
|
-
for (const toolUse of toolUseBlocks) {
|
|
400
|
-
logger.debug(`Executing tool: ${toolUse.name}`);
|
|
401
|
-
const execResult = await executeSingleTool(toolUse, projectRoot, toolRegistry);
|
|
402
|
-
toolResults.push(execResult.toolResult);
|
|
403
|
-
toolRecords.push(execResult.toolRecord);
|
|
404
|
-
if (execResult.userRejected) {
|
|
405
|
-
userRejected = true;
|
|
406
|
-
}
|
|
407
|
-
if (execResult.endTurn) {
|
|
408
|
-
endTurn = true;
|
|
409
|
-
}
|
|
410
|
-
}
|
|
411
|
-
return { results: toolResults, records: toolRecords, userRejected, endTurn };
|
|
412
|
-
}
|
|
413
|
-
}
|
|
414
|
-
/**
|
|
415
|
-
* Runs a single query in non-interactive mode with full agentic capabilities
|
|
416
|
-
* Outputs response to stdout for programmatic consumption
|
|
417
|
-
*/
|
|
418
|
-
export async function runSDKQuery(options) {
|
|
419
|
-
const { query, pipedInput, attachments, projectRoot, continueSession, debug, autoApprove = true, cliAgentsJson, agentConfig, standaloneAgent, callbacks, silent = false, } = options;
|
|
420
|
-
// Helper to emit text chunks via callback or stdout
|
|
421
|
-
const emitTextChunk = (chunk) => {
|
|
422
|
-
if (callbacks?.onTextChunk) {
|
|
423
|
-
callbacks.onTextChunk(chunk);
|
|
424
|
-
}
|
|
425
|
-
if (!silent) {
|
|
426
|
-
process.stdout.write(chunk);
|
|
427
|
-
}
|
|
428
|
-
};
|
|
429
|
-
// Helper to emit status updates via callback or stderr
|
|
430
|
-
const emitStatus = (status) => {
|
|
431
|
-
if (callbacks?.onStatusUpdate) {
|
|
432
|
-
callbacks.onStatusUpdate(status);
|
|
433
|
-
}
|
|
434
|
-
};
|
|
435
|
-
// Helper to emit tool events
|
|
436
|
-
const emitToolStart = (toolName, toolId, input) => {
|
|
437
|
-
if (callbacks?.onToolStart) {
|
|
438
|
-
callbacks.onToolStart(toolName, toolId, input);
|
|
439
|
-
}
|
|
440
|
-
};
|
|
441
|
-
const emitToolComplete = (toolName, toolId, result, success, error) => {
|
|
442
|
-
if (callbacks?.onToolComplete) {
|
|
443
|
-
callbacks.onToolComplete(toolName, toolId, result, success, error);
|
|
444
|
-
}
|
|
445
|
-
};
|
|
446
|
-
// Helper to emit errors
|
|
447
|
-
const emitError = (error) => {
|
|
448
|
-
if (callbacks?.onError) {
|
|
449
|
-
callbacks.onError(error);
|
|
450
|
-
}
|
|
451
|
-
if (!silent) {
|
|
452
|
-
process.stderr.write(chalk.red(`Error: ${error}\n`));
|
|
453
|
-
}
|
|
454
|
-
};
|
|
455
|
-
if (debug) {
|
|
456
|
-
logger.configure({ level: 'debug' });
|
|
457
|
-
}
|
|
458
|
-
try {
|
|
459
|
-
// === SUBAGENT FAST-PATH ===
|
|
460
|
-
// When running as a subagent, skip all singleton re-initialization to avoid
|
|
461
|
-
// corrupting parent process state (model, session, approval mode, etc.)
|
|
462
|
-
// Uses the already-initialized singleton client but passes model per-call
|
|
463
|
-
// instead of mutating with setModel().
|
|
464
|
-
if (options.isSubagent) {
|
|
465
|
-
logger.debug('Running in subagent mode - skipping singleton re-initialization');
|
|
466
|
-
// Use the already-initialized singleton client (read-only - never call setModel)
|
|
467
|
-
const client = await getAnthropicClient();
|
|
468
|
-
if (!client.isInitialized()) {
|
|
469
|
-
emitError('Subagent: API client not initialized.');
|
|
470
|
-
return {
|
|
471
|
-
success: false,
|
|
472
|
-
content: '',
|
|
473
|
-
error: 'Subagent: API client not initialized.',
|
|
474
|
-
exitCode: 1,
|
|
475
|
-
};
|
|
476
|
-
}
|
|
477
|
-
// Resolve the model to use per-call (without mutating the singleton)
|
|
478
|
-
const { resolveModelId, getModelConfig } = await import('../constants/models.js');
|
|
479
|
-
let subagentModelId; // undefined = use client's current default
|
|
480
|
-
if (options.model) {
|
|
481
|
-
subagentModelId = options.model.modelId;
|
|
482
|
-
logger.debug(`Subagent using session model: ${options.model.providerId}/${subagentModelId}`);
|
|
483
|
-
}
|
|
484
|
-
if (agentConfig?.model && agentConfig.model !== 'inherit') {
|
|
485
|
-
subagentModelId = resolveModelId(agentConfig.model);
|
|
486
|
-
logger.debug(`Subagent using agent model: ${agentConfig.model} → ${subagentModelId}`);
|
|
487
|
-
}
|
|
488
|
-
// Resolve model config for system prompt (without mutating singleton)
|
|
489
|
-
const modelConfig = subagentModelId
|
|
490
|
-
? (getModelConfig(subagentModelId) || client.getCurrentModel())
|
|
491
|
-
: client.getCurrentModel();
|
|
492
|
-
// Reuse existing tool registry (already registered by parent)
|
|
493
|
-
const toolRegistry = getToolRegistry();
|
|
494
|
-
let tools = toolRegistry.getToolDefinitions();
|
|
495
|
-
// Filter tools if agent has allowedTools restriction
|
|
496
|
-
if (agentConfig?.allowedTools && agentConfig.allowedTools.length > 0) {
|
|
497
|
-
const allowedNames = resolveAllowedToolNames(agentConfig.allowedTools, toolRegistry);
|
|
498
|
-
tools = tools.filter(tool => allowedNames.has(tool.name));
|
|
499
|
-
logger.debug(`Subagent filtered tools (${tools.length} matched): ${tools.map(t => t.name).join(', ')}`);
|
|
500
|
-
}
|
|
501
|
-
// Build system prompt
|
|
502
|
-
const contextBuilder = getContextBuilder({ projectRoot });
|
|
503
|
-
const projectSummary = await contextBuilder.getProjectSummary();
|
|
504
|
-
let systemPrompt;
|
|
505
|
-
if (standaloneAgent && agentConfig?.systemPrompt) {
|
|
506
|
-
systemPrompt = agentConfig.systemPrompt;
|
|
507
|
-
}
|
|
508
|
-
else {
|
|
509
|
-
const sessionManager = getSessionManager();
|
|
510
|
-
const personalityMode = sessionManager.getEffectivePersonalityMode();
|
|
511
|
-
const unguardedMode = options.unguardedMode ?? sessionManager.getUnguardedMode();
|
|
512
|
-
let systemUtilitiesSection;
|
|
513
|
-
if (unguardedMode) {
|
|
514
|
-
try {
|
|
515
|
-
systemUtilitiesSection = await getSystemUtilitiesPromptSection();
|
|
516
|
-
}
|
|
517
|
-
catch (error) {
|
|
518
|
-
logger.debug('Failed to generate system utilities section', error);
|
|
519
|
-
}
|
|
520
|
-
}
|
|
521
|
-
systemPrompt = buildSystemPrompt({
|
|
522
|
-
projectSummary: projectSummary ? { formatted: projectSummary.formatted } : null,
|
|
523
|
-
workingDirectory: projectRoot,
|
|
524
|
-
modelName: modelConfig.name,
|
|
525
|
-
modelId: modelConfig.id,
|
|
526
|
-
personalityMode,
|
|
527
|
-
unguardedMode,
|
|
528
|
-
systemUtilitiesSection,
|
|
529
|
-
});
|
|
530
|
-
if (agentConfig?.systemPrompt) {
|
|
531
|
-
systemPrompt = `${agentConfig.systemPrompt}\n\n---\n\n${systemPrompt}`;
|
|
532
|
-
}
|
|
533
|
-
}
|
|
534
|
-
if (options.systemPromptAddition) {
|
|
535
|
-
systemPrompt = `${systemPrompt}\n\n${options.systemPromptAddition}`;
|
|
536
|
-
}
|
|
537
|
-
// Append memory content (NOVA.md + auto memory)
|
|
538
|
-
try {
|
|
539
|
-
const memoryContent = await loadAllMemory(projectRoot);
|
|
540
|
-
if (memoryContent) {
|
|
541
|
-
systemPrompt = `${systemPrompt}\n\n${memoryContent}`;
|
|
542
|
-
}
|
|
543
|
-
}
|
|
544
|
-
catch (error) {
|
|
545
|
-
logger.debug('Failed to load memory content for subagent', error);
|
|
546
|
-
}
|
|
547
|
-
// Build user message
|
|
548
|
-
let userContent = query;
|
|
549
|
-
if (pipedInput && pipedInput.trim()) {
|
|
550
|
-
userContent = `Context:\n\`\`\`\n${pipedInput.trim()}\n\`\`\`\n\n${query}`;
|
|
551
|
-
}
|
|
552
|
-
let userMessageContent = userContent;
|
|
553
|
-
if (attachments && attachments.length > 0) {
|
|
554
|
-
const attachmentBlocks = buildAttachmentContentBlocks(attachments);
|
|
555
|
-
userMessageContent = [
|
|
556
|
-
{ type: 'text', text: userContent },
|
|
557
|
-
...attachmentBlocks,
|
|
558
|
-
];
|
|
559
|
-
}
|
|
560
|
-
const messages = [];
|
|
561
|
-
messages.push({ role: 'user', content: userMessageContent });
|
|
562
|
-
// === SUBAGENT AGENTIC LOOP ===
|
|
563
|
-
const configManager = getConfigManager();
|
|
564
|
-
const agenticConfig = configManager.getValue('agentic');
|
|
565
|
-
const maxIterations = agenticConfig?.maxIterations ?? DEFAULT_MAX_AGENTIC_ITERATIONS;
|
|
566
|
-
let iterations = 0;
|
|
567
|
-
let accumulatedText = '';
|
|
568
|
-
let finalResponse = '';
|
|
569
|
-
let hasStartedOutput = false;
|
|
570
|
-
let toolRetryState = null;
|
|
571
|
-
while (iterations < maxIterations) {
|
|
572
|
-
iterations++;
|
|
573
|
-
// Cancellation check
|
|
574
|
-
if (options.processId) {
|
|
575
|
-
const { getAgentSpawner } = await import('./agent-spawner.js');
|
|
576
|
-
const spawner = getAgentSpawner();
|
|
577
|
-
const proc = spawner.getProcess(options.processId);
|
|
578
|
-
if (proc?.status === 'cancelled') {
|
|
579
|
-
finalResponse = accumulatedText + '\n\n*(Process cancelled)*';
|
|
580
|
-
break;
|
|
581
|
-
}
|
|
582
|
-
}
|
|
583
|
-
// Budget enforcement
|
|
584
|
-
if (options.budget) {
|
|
585
|
-
const budget = options.budget;
|
|
586
|
-
if (budget.turnsUsed >= budget.maxTurns) {
|
|
587
|
-
finalResponse = accumulatedText + '\n\n*(Turn budget exceeded)*';
|
|
588
|
-
if (options.onBudgetExceeded)
|
|
589
|
-
options.onBudgetExceeded('turns');
|
|
590
|
-
break;
|
|
591
|
-
}
|
|
592
|
-
if (budget.tokensUsed >= budget.maxTokens) {
|
|
593
|
-
finalResponse = accumulatedText + '\n\n*(Token budget exceeded)*';
|
|
594
|
-
if (options.onBudgetExceeded)
|
|
595
|
-
options.onBudgetExceeded('tokens');
|
|
596
|
-
break;
|
|
597
|
-
}
|
|
598
|
-
}
|
|
599
|
-
if (callbacks?.onIterationStart) {
|
|
600
|
-
callbacks.onIterationStart(iterations, maxIterations);
|
|
601
|
-
}
|
|
602
|
-
// Pass model per-call to avoid mutating the singleton
|
|
603
|
-
const response = await client.createAgenticMessage(messages, { system: systemPrompt, tools, maxTokens: DEFAULT_MAX_TOKENS, model: subagentModelId }, (chunk) => {
|
|
604
|
-
accumulatedText += chunk;
|
|
605
|
-
if (!hasStartedOutput)
|
|
606
|
-
hasStartedOutput = true;
|
|
607
|
-
emitTextChunk(chunk);
|
|
608
|
-
}, (toolEvent) => {
|
|
609
|
-
if (toolEvent.type === 'tool_start') {
|
|
610
|
-
emitToolStart(toolEvent.name, toolEvent.id, {});
|
|
611
|
-
}
|
|
612
|
-
else if (toolEvent.type === 'tool_complete') {
|
|
613
|
-
emitToolComplete(toolEvent.name, toolEvent.id, toolEvent.input, true);
|
|
614
|
-
}
|
|
615
|
-
});
|
|
616
|
-
// Budget tracking
|
|
617
|
-
if (options.budget) {
|
|
618
|
-
const tokensThisTurn = response.usage.inputTokens + response.usage.outputTokens;
|
|
619
|
-
options.budget.tokensUsed += tokensThisTurn;
|
|
620
|
-
options.budget.turnsUsed = iterations;
|
|
621
|
-
}
|
|
622
|
-
if (response.stopReason === 'max_tokens') {
|
|
623
|
-
messages.push({ role: 'assistant', content: response.contentBlocks });
|
|
624
|
-
messages.push({ role: 'user', content: 'Continue from where you left off.' });
|
|
625
|
-
continue;
|
|
626
|
-
}
|
|
627
|
-
if (response.stopReason !== 'tool_use' || response.toolUseBlocks.length === 0) {
|
|
628
|
-
finalResponse = accumulatedText;
|
|
629
|
-
break;
|
|
630
|
-
}
|
|
631
|
-
// Execute tool calls
|
|
632
|
-
const { results: toolResults, records: toolRecords, endTurn } = await executeToolCalls(response.toolUseBlocks, projectRoot);
|
|
633
|
-
// End turn check (plan cancellation)
|
|
634
|
-
if (endTurn) {
|
|
635
|
-
logger.info('End turn signalled (plan cancelled) — stopping subagent agentic loop');
|
|
636
|
-
finalResponse = accumulatedText;
|
|
637
|
-
break;
|
|
638
|
-
}
|
|
639
|
-
// Cancellation check after tools
|
|
640
|
-
if (options.processId) {
|
|
641
|
-
const { getAgentSpawner } = await import('./agent-spawner.js');
|
|
642
|
-
const spawner = getAgentSpawner();
|
|
643
|
-
const proc = spawner.getProcess(options.processId);
|
|
644
|
-
if (proc?.status === 'cancelled') {
|
|
645
|
-
finalResponse = accumulatedText + '\n\n*(Process cancelled)*';
|
|
646
|
-
break;
|
|
647
|
-
}
|
|
648
|
-
}
|
|
649
|
-
// Tool retry replacement logic (same as parent loop)
|
|
650
|
-
const isSingleToolCall = response.toolUseBlocks.length === 1;
|
|
651
|
-
const singleTool = isSingleToolCall ? response.toolUseBlocks[0] : null;
|
|
652
|
-
const singleToolResult = isSingleToolCall ? toolResults[0] : null;
|
|
653
|
-
const singleToolRecord = isSingleToolCall ? toolRecords[0] : null;
|
|
654
|
-
const shouldReplace = isSingleToolCall && singleTool && toolRetryState &&
|
|
655
|
-
isConsecutiveRetry(singleTool.name, singleTool.input, toolRetryState);
|
|
656
|
-
if (shouldReplace && singleToolResult && singleToolRecord) {
|
|
657
|
-
const isCurrentError = singleToolResult.is_error === true;
|
|
658
|
-
const currentContent = singleToolResult.content;
|
|
659
|
-
if (isCurrentError) {
|
|
660
|
-
toolRetryState.attemptCount++;
|
|
661
|
-
toolRetryState.previousErrors.push(summarizeError(currentContent));
|
|
662
|
-
}
|
|
663
|
-
const annotatedContent = annotateToolResult(currentContent, isCurrentError, toolRetryState.attemptCount, toolRetryState.previousErrors.slice(0, -1));
|
|
664
|
-
const annotatedToolResult = { ...singleToolResult, content: annotatedContent };
|
|
665
|
-
messages.pop();
|
|
666
|
-
messages.pop();
|
|
667
|
-
messages.push({ role: 'assistant', content: response.contentBlocks });
|
|
668
|
-
messages.push({ role: 'user', content: [annotatedToolResult] });
|
|
669
|
-
if (!isCurrentError)
|
|
670
|
-
toolRetryState = null;
|
|
671
|
-
}
|
|
672
|
-
else {
|
|
673
|
-
messages.push({ role: 'assistant', content: response.contentBlocks });
|
|
674
|
-
messages.push({ role: 'user', content: toolResults });
|
|
675
|
-
if (isSingleToolCall && singleToolRecord && !singleToolRecord.success) {
|
|
676
|
-
const toolInput = singleTool.input;
|
|
677
|
-
toolRetryState = {
|
|
678
|
-
toolName: singleTool.name,
|
|
679
|
-
targetPath: toolInput.path,
|
|
680
|
-
attemptCount: 1,
|
|
681
|
-
previousErrors: [summarizeError(singleToolRecord.error || 'Unknown error')],
|
|
682
|
-
};
|
|
683
|
-
}
|
|
684
|
-
else {
|
|
685
|
-
toolRetryState = null;
|
|
686
|
-
}
|
|
687
|
-
}
|
|
688
|
-
if (iterations >= maxIterations) {
|
|
689
|
-
finalResponse = accumulatedText + '\n\n*(Reached maximum iterations)*';
|
|
690
|
-
break;
|
|
691
|
-
}
|
|
692
|
-
}
|
|
693
|
-
if (callbacks?.onComplete) {
|
|
694
|
-
callbacks.onComplete(finalResponse, { inputTokens: 0, outputTokens: 0, totalTokens: 0 }, { inputCost: 0, outputCost: 0, totalCost: 0, currency: 'USD' });
|
|
695
|
-
}
|
|
696
|
-
return {
|
|
697
|
-
success: true,
|
|
698
|
-
content: finalResponse,
|
|
699
|
-
exitCode: 0,
|
|
700
|
-
};
|
|
701
|
-
}
|
|
702
|
-
// === INITIALIZATION PHASE (parent / non-subagent path) ===
|
|
703
|
-
const _diag = silent
|
|
704
|
-
? (step) => process.stderr.write(`[SDK-DIAG] ${step} (${Date.now()})\n`)
|
|
705
|
-
: (step) => logger.debug(`[SDK-DIAG] ${step}`);
|
|
706
|
-
// Ensure directories exist
|
|
707
|
-
_diag('ensureDir START');
|
|
708
|
-
await ensureDir(getGlobalCompassDir());
|
|
709
|
-
await ensureDir(getProjectCompassDir(projectRoot));
|
|
710
|
-
_diag('ensureDir DONE');
|
|
711
|
-
// Load configuration
|
|
712
|
-
_diag('configManager.load START');
|
|
713
|
-
const configManager = getConfigManager();
|
|
714
|
-
await configManager.load(projectRoot);
|
|
715
|
-
_diag('configManager.load DONE');
|
|
716
|
-
// Check consent
|
|
717
|
-
_diag('consentManager START');
|
|
718
|
-
const consentManager = await getConsentManager();
|
|
719
|
-
const consentStatus = await consentManager.getStatus();
|
|
720
|
-
_diag('consentManager DONE');
|
|
721
|
-
if (!consentStatus.isValid) {
|
|
722
|
-
emitError('Consent not granted. Run "compass setup" first.');
|
|
723
|
-
return {
|
|
724
|
-
success: false,
|
|
725
|
-
content: '',
|
|
726
|
-
error: 'Consent not granted. Run "compass setup" first.',
|
|
727
|
-
exitCode: 1,
|
|
728
|
-
};
|
|
729
|
-
}
|
|
730
|
-
// Check API key
|
|
731
|
-
_diag('credentialStore START');
|
|
732
|
-
const credentialStore = await getCredentialStore();
|
|
733
|
-
const hasApiKey = await credentialStore.hasApiKey();
|
|
734
|
-
_diag('credentialStore DONE');
|
|
735
|
-
if (!hasApiKey) {
|
|
736
|
-
emitError('API key not configured. Run "compass setup" first.');
|
|
737
|
-
return {
|
|
738
|
-
success: false,
|
|
739
|
-
content: '',
|
|
740
|
-
error: 'API key not configured. Run "compass setup" first.',
|
|
741
|
-
exitCode: 1,
|
|
742
|
-
};
|
|
743
|
-
}
|
|
744
|
-
// Initialize Anthropic client
|
|
745
|
-
_diag('client.initialize START');
|
|
746
|
-
const client = await getAnthropicClient();
|
|
747
|
-
const initialized = await client.initialize();
|
|
748
|
-
_diag('client.initialize DONE');
|
|
749
|
-
if (!initialized) {
|
|
750
|
-
emitError('Failed to initialize API client.');
|
|
751
|
-
return {
|
|
752
|
-
success: false,
|
|
753
|
-
content: '',
|
|
754
|
-
error: 'Failed to initialize API client.',
|
|
755
|
-
exitCode: 1,
|
|
756
|
-
};
|
|
757
|
-
}
|
|
758
|
-
// Validate Compass API key to resolve subscription/plan status
|
|
759
|
-
// Without this, compassAuth defaults to 'no_subscription' (150K limit)
|
|
760
|
-
_diag('compassAuth.validateApiKey START');
|
|
761
|
-
try {
|
|
762
|
-
const compassAuth = getCompassAuthService();
|
|
763
|
-
const compassKey = await credentialStore.getCompassApiKey();
|
|
764
|
-
if (compassKey) {
|
|
765
|
-
await compassAuth.validateApiKey(compassKey);
|
|
766
|
-
logger.debug(`SDK mode plan status: ${compassAuth.getPlanStatus()}`);
|
|
767
|
-
}
|
|
768
|
-
}
|
|
769
|
-
catch (planError) {
|
|
770
|
-
logger.warn('Failed to validate Compass API key in SDK mode', planError);
|
|
771
|
-
// Non-fatal — defaults to no_subscription limits
|
|
772
|
-
}
|
|
773
|
-
_diag('compassAuth.validateApiKey DONE');
|
|
774
|
-
// Initialize token tracker
|
|
775
|
-
_diag('tokenTracker START');
|
|
776
|
-
const tokenTracker = await getTokenTracker();
|
|
777
|
-
tokenTracker.startSession();
|
|
778
|
-
_diag('tokenTracker DONE');
|
|
779
|
-
// Register built-in tools
|
|
780
|
-
_diag('registerBuiltInTools START');
|
|
781
|
-
await registerBuiltInTools();
|
|
782
|
-
_diag('registerBuiltInTools DONE');
|
|
783
|
-
// Initialize MCP tool integration
|
|
784
|
-
_diag('mcpToolIntegration.initialize START');
|
|
785
|
-
try {
|
|
786
|
-
const mcpToolIntegration = getMCPToolIntegration();
|
|
787
|
-
await mcpToolIntegration.initialize(projectRoot);
|
|
788
|
-
logger.debug('MCP tool integration initialized');
|
|
789
|
-
}
|
|
790
|
-
catch (mcpError) {
|
|
791
|
-
logger.warn('Failed to initialize MCP tool integration', mcpError);
|
|
792
|
-
// Non-fatal - continue without MCP tools
|
|
793
|
-
}
|
|
794
|
-
_diag('mcpToolIntegration.initialize DONE');
|
|
795
|
-
// Initialize skill service with project root
|
|
796
|
-
const { setSkillProjectRoot } = await import('./skill-service.js');
|
|
797
|
-
setSkillProjectRoot(projectRoot);
|
|
798
|
-
// Initialize custom command service with project root
|
|
799
|
-
const { setCommandsProjectRoot } = await import('./custom-command-service.js');
|
|
800
|
-
setCommandsProjectRoot(projectRoot);
|
|
801
|
-
// Initialize hook service with project root
|
|
802
|
-
const { setHooksProjectRoot } = await import('./hook-service.js');
|
|
803
|
-
setHooksProjectRoot(projectRoot);
|
|
804
|
-
// Initialize agent manager with CLI agents if provided
|
|
805
|
-
if (cliAgentsJson) {
|
|
806
|
-
try {
|
|
807
|
-
const { initializeAgentManager } = await import('./agent-manager.js');
|
|
808
|
-
await initializeAgentManager(projectRoot, cliAgentsJson);
|
|
809
|
-
logger.debug('Agent manager initialized with CLI agents');
|
|
810
|
-
}
|
|
811
|
-
catch (agentError) {
|
|
812
|
-
logger.warn('Failed to initialize agent manager with CLI agents', agentError);
|
|
813
|
-
// Non-fatal - continue without CLI agents
|
|
814
|
-
}
|
|
815
|
-
}
|
|
816
|
-
// Apply model configuration if provided (e.g., from ACP session)
|
|
817
|
-
// This takes precedence over the default model but can be overridden by agentConfig
|
|
818
|
-
if (options.model) {
|
|
819
|
-
const modelIdToSet = options.model.modelId;
|
|
820
|
-
client.setModel(modelIdToSet);
|
|
821
|
-
logger.debug(`Switched to session model: ${options.model.providerId}/${modelIdToSet}`);
|
|
822
|
-
}
|
|
823
|
-
// Apply agent configuration if provided
|
|
824
|
-
if (agentConfig) {
|
|
825
|
-
logger.info(`Running with agent: ${agentConfig.name}`);
|
|
826
|
-
// Switch model if agent specifies one (overrides session model)
|
|
827
|
-
if (agentConfig.model && agentConfig.model !== 'inherit') {
|
|
828
|
-
const { resolveModelId } = await import('../constants/models.js');
|
|
829
|
-
const resolvedModelId = resolveModelId(agentConfig.model);
|
|
830
|
-
client.setModel(resolvedModelId);
|
|
831
|
-
logger.debug(`Switched to agent model: ${agentConfig.model}`);
|
|
832
|
-
}
|
|
833
|
-
}
|
|
834
|
-
// Set approval mode for non-interactive use
|
|
835
|
-
const approvalManager = getApprovalManager();
|
|
836
|
-
if (autoApprove) {
|
|
837
|
-
approvalManager.setMode(ApprovalMode.AUTO);
|
|
838
|
-
approvalManager.enableSessionAutoApproval();
|
|
839
|
-
logger.debug('Auto-approval enabled for non-interactive mode');
|
|
840
|
-
}
|
|
841
|
-
// Initialize session manager
|
|
842
|
-
_diag('sessionManager.load START');
|
|
843
|
-
const sessionManager = getSessionManager();
|
|
844
|
-
const existingSession = await sessionManager.load(projectRoot);
|
|
845
|
-
_diag('sessionManager.load DONE');
|
|
846
|
-
if (!existingSession) {
|
|
847
|
-
sessionManager.createSession(projectRoot);
|
|
848
|
-
}
|
|
849
|
-
// Initialize audit logger
|
|
850
|
-
const auditLogger = getAuditLogger(projectRoot);
|
|
851
|
-
const session = sessionManager.getSession();
|
|
852
|
-
if (session) {
|
|
853
|
-
auditLogger.setSessionId(session.id);
|
|
854
|
-
}
|
|
855
|
-
// Get conversation history and handle archival
|
|
856
|
-
_diag('sessionArchival START');
|
|
857
|
-
let messages = [];
|
|
858
|
-
const state = sessionManager.getState();
|
|
859
|
-
const hasHistory = state?.conversationHistory && state.conversationHistory.length > 0;
|
|
860
|
-
const hasOperations = state?.operations && state.operations.length > 0;
|
|
861
|
-
if (hasHistory) {
|
|
862
|
-
if (continueSession) {
|
|
863
|
-
// -c flag: Archive, load messages into context, then clear session.json
|
|
864
|
-
const { archive, result } = await sessionManager.archiveAndClearSession();
|
|
865
|
-
if (result.success && result.filename) {
|
|
866
|
-
logger.info(`Archived previous session to: ${result.filename}`);
|
|
867
|
-
}
|
|
868
|
-
// Load archived messages into context
|
|
869
|
-
if (archive && archive.messages.length > 0) {
|
|
870
|
-
messages = archive.messages.map((msg) => ({
|
|
871
|
-
role: msg.role,
|
|
872
|
-
content: msg.content,
|
|
873
|
-
}));
|
|
874
|
-
logger.debug(`Continuing with ${messages.length} archived messages`);
|
|
875
|
-
}
|
|
876
|
-
}
|
|
877
|
-
else {
|
|
878
|
-
// No -c flag: Archive and clear, don't load into context
|
|
879
|
-
const { result } = await sessionManager.archiveAndClearSession();
|
|
880
|
-
if (result.success && result.filename) {
|
|
881
|
-
logger.info(`Archived previous session to: ${result.filename}`);
|
|
882
|
-
}
|
|
883
|
-
}
|
|
884
|
-
}
|
|
885
|
-
else {
|
|
886
|
-
// No conversation history — clear stale operations if any
|
|
887
|
-
if (hasOperations) {
|
|
888
|
-
sessionManager.clearHistory();
|
|
889
|
-
}
|
|
890
|
-
// -c flag: load latest archive even when session is clean
|
|
891
|
-
if (continueSession) {
|
|
892
|
-
const archivalService = sessionManager.getArchivalService();
|
|
893
|
-
const archive = await archivalService.getLatestArchive();
|
|
894
|
-
if (archive && archive.messages.length > 0) {
|
|
895
|
-
messages = archive.messages.map((msg) => ({
|
|
896
|
-
role: msg.role,
|
|
897
|
-
content: msg.content,
|
|
898
|
-
}));
|
|
899
|
-
logger.debug(`Continuing with ${messages.length} messages from latest archive`);
|
|
900
|
-
}
|
|
901
|
-
}
|
|
902
|
-
}
|
|
903
|
-
_diag('sessionArchival DONE');
|
|
904
|
-
// Build the user message with optional piped context and attachments
|
|
905
|
-
let userContent = query;
|
|
906
|
-
if (pipedInput && pipedInput.trim()) {
|
|
907
|
-
userContent = `Context:\n\`\`\`\n${pipedInput.trim()}\n\`\`\`\n\n${query}`;
|
|
908
|
-
}
|
|
909
|
-
// Handle file attachments if provided
|
|
910
|
-
let userMessageContent = userContent;
|
|
911
|
-
if (attachments && attachments.length > 0) {
|
|
912
|
-
// Build ContentBlock[] with text and attachments
|
|
913
|
-
const attachmentBlocks = buildAttachmentContentBlocks(attachments);
|
|
914
|
-
userMessageContent = [
|
|
915
|
-
{ type: 'text', text: userContent },
|
|
916
|
-
...attachmentBlocks,
|
|
917
|
-
];
|
|
918
|
-
logger.info(`Added ${attachments.length} file attachment(s) to user message`);
|
|
919
|
-
}
|
|
920
|
-
// Add user message
|
|
921
|
-
messages.push({
|
|
922
|
-
role: 'user',
|
|
923
|
-
content: userMessageContent,
|
|
924
|
-
});
|
|
925
|
-
// Build system prompt with project context
|
|
926
|
-
_diag('contextBuilder.getProjectSummary START');
|
|
927
|
-
const contextBuilder = getContextBuilder({ projectRoot });
|
|
928
|
-
const projectSummary = await contextBuilder.getProjectSummary();
|
|
929
|
-
_diag('contextBuilder.getProjectSummary DONE');
|
|
930
|
-
const model = client.getCurrentModel();
|
|
931
|
-
let systemPrompt;
|
|
932
|
-
// Handle standalone agent mode - use ONLY the agent's system prompt
|
|
933
|
-
if (standaloneAgent && agentConfig?.systemPrompt) {
|
|
934
|
-
systemPrompt = agentConfig.systemPrompt;
|
|
935
|
-
logger.info(`Running in standalone agent mode - using only agent's system prompt (${agentConfig.systemPrompt.length} chars)`);
|
|
936
|
-
}
|
|
937
|
-
else {
|
|
938
|
-
// Get personality mode and unguarded mode from session (prefer explicit option over singleton)
|
|
939
|
-
const sessionManager = getSessionManager();
|
|
940
|
-
const personalityMode = sessionManager.getEffectivePersonalityMode();
|
|
941
|
-
const unguardedMode = options.unguardedMode ?? sessionManager.getUnguardedMode();
|
|
942
|
-
// Get system utilities section for unguarded mode
|
|
943
|
-
let systemUtilitiesSection;
|
|
944
|
-
if (unguardedMode) {
|
|
945
|
-
try {
|
|
946
|
-
systemUtilitiesSection = await getSystemUtilitiesPromptSection();
|
|
947
|
-
if (systemUtilitiesSection) {
|
|
948
|
-
logger.debug('System utilities section generated for unguarded mode');
|
|
949
|
-
}
|
|
950
|
-
}
|
|
951
|
-
catch (error) {
|
|
952
|
-
logger.debug('Failed to generate system utilities section', error);
|
|
953
|
-
}
|
|
954
|
-
}
|
|
955
|
-
// Build default CLI system prompt with personality and unguarded mode
|
|
956
|
-
systemPrompt = buildSystemPrompt({
|
|
957
|
-
projectSummary: projectSummary ? { formatted: projectSummary.formatted } : null,
|
|
958
|
-
workingDirectory: projectRoot,
|
|
959
|
-
modelName: model.name,
|
|
960
|
-
modelId: model.id,
|
|
961
|
-
personalityMode,
|
|
962
|
-
unguardedMode,
|
|
963
|
-
systemUtilitiesSection,
|
|
964
|
-
});
|
|
965
|
-
// Prepend agent's system prompt if provided (non-standalone mode)
|
|
966
|
-
if (agentConfig?.systemPrompt) {
|
|
967
|
-
systemPrompt = `${agentConfig.systemPrompt}\n\n---\n\n${systemPrompt}`;
|
|
968
|
-
logger.debug(`Applied agent system prompt (${agentConfig.systemPrompt.length} chars)`);
|
|
969
|
-
}
|
|
970
|
-
}
|
|
971
|
-
// Apply mode-specific system prompt additions
|
|
972
|
-
if (options.systemPromptAddition) {
|
|
973
|
-
systemPrompt = `${systemPrompt}\n\n${options.systemPromptAddition}`;
|
|
974
|
-
logger.debug(`Applied system prompt addition (${options.systemPromptAddition.length} chars)`);
|
|
975
|
-
}
|
|
976
|
-
// Append memory content (NOVA.md + auto memory)
|
|
977
|
-
_diag('loadAllMemory START');
|
|
978
|
-
try {
|
|
979
|
-
const memoryContent = await loadAllMemory(projectRoot);
|
|
980
|
-
if (memoryContent) {
|
|
981
|
-
systemPrompt = `${systemPrompt}\n\n${memoryContent}`;
|
|
982
|
-
logger.debug(`Applied memory content (${memoryContent.length} chars)`);
|
|
983
|
-
}
|
|
984
|
-
}
|
|
985
|
-
catch (error) {
|
|
986
|
-
logger.debug('Failed to load memory content', error);
|
|
987
|
-
}
|
|
988
|
-
_diag('loadAllMemory DONE');
|
|
989
|
-
// Apply plan mode instructions if forced
|
|
990
|
-
if (options.forcePlanMode) {
|
|
991
|
-
const planModeInstructions = `
|
|
992
|
-
## ⚠️ PLAN MODE ENFORCED - MANDATORY TOOL CALL REQUIRED
|
|
993
|
-
|
|
994
|
-
**CRITICAL REQUIREMENT**: You MUST call the \`enter_plan_mode\` tool as your FIRST action for ANY task that involves code changes, file modifications, or implementation work.
|
|
995
|
-
|
|
996
|
-
### Mandatory First Step
|
|
997
|
-
Before doing ANYTHING else, call:
|
|
998
|
-
\`\`\`
|
|
999
|
-
enter_plan_mode({ task_summary: "<brief description of the task>" })
|
|
1000
|
-
\`\`\`
|
|
1001
|
-
|
|
1002
|
-
### Rules You MUST Follow
|
|
1003
|
-
1. **ALWAYS call \`enter_plan_mode\` FIRST** - No exceptions. Do not analyze, do not explain, do not read files first. Call the tool immediately.
|
|
1004
|
-
2. **NO direct implementation** - You are FORBIDDEN from using file editing tools (edit_file, write_file) until a plan is approved.
|
|
1005
|
-
3. **NO skipping** - Even for "simple" tasks, you must use \`enter_plan_mode\`. The tool will assess complexity.
|
|
1006
|
-
4. **Wait for approval** - After the plan is generated, wait for user approval before executing any changes.
|
|
1007
|
-
|
|
1008
|
-
### What Happens If You Don't Comply
|
|
1009
|
-
If you attempt to make code changes without first calling \`enter_plan_mode\`, you are violating the user's explicit mode selection. The user chose Plan Mode because they want to review and approve changes before they happen.
|
|
1010
|
-
|
|
1011
|
-
### After Plan Approval
|
|
1012
|
-
- Execute tasks one at a time
|
|
1013
|
-
- Call \`complete_plan_task\` after each task
|
|
1014
|
-
- If issues arise, call \`update_plan\` instead of improvising
|
|
1015
|
-
|
|
1016
|
-
**START by calling \`enter_plan_mode\` NOW.**
|
|
1017
|
-
`;
|
|
1018
|
-
systemPrompt = `${systemPrompt}\n\n${planModeInstructions}`;
|
|
1019
|
-
logger.debug('Applied plan mode enforcement instructions');
|
|
1020
|
-
}
|
|
1021
|
-
// Log for audit
|
|
1022
|
-
await auditLogger.logUserInput(userContent, false);
|
|
1023
|
-
await auditLogger.logSystemPrompt(systemPrompt);
|
|
1024
|
-
// Get tool definitions
|
|
1025
|
-
const toolRegistry = getToolRegistry();
|
|
1026
|
-
let tools = toolRegistry.getToolDefinitions();
|
|
1027
|
-
// Filter tools if agent has allowedTools restriction
|
|
1028
|
-
if (agentConfig?.allowedTools && agentConfig.allowedTools.length > 0) {
|
|
1029
|
-
const allowedNames = resolveAllowedToolNames(agentConfig.allowedTools, toolRegistry);
|
|
1030
|
-
tools = tools.filter(tool => allowedNames.has(tool.name));
|
|
1031
|
-
logger.debug(`Filtered tools to agent's allowed list (${tools.length} matched): ${tools.map(t => t.name).join(', ')}`);
|
|
1032
|
-
}
|
|
1033
|
-
// Filter MCP tools if agent has mcpServers restriction
|
|
1034
|
-
if (agentConfig?.mcpServers && agentConfig.mcpServers.length > 0) {
|
|
1035
|
-
const mcpToolIntegration = getMCPToolIntegration();
|
|
1036
|
-
const allowedMcpTools = new Set(mcpToolIntegration.getFilteredToolNames(agentConfig.mcpServers).map(t => t.toLowerCase()));
|
|
1037
|
-
// Keep non-MCP tools and only MCP tools from allowed servers
|
|
1038
|
-
tools = tools.filter(tool => {
|
|
1039
|
-
const isFromMcp = mcpToolIntegration.isMCPTool(tool.name);
|
|
1040
|
-
if (!isFromMcp) {
|
|
1041
|
-
return true; // Keep all non-MCP tools
|
|
1042
|
-
}
|
|
1043
|
-
return allowedMcpTools.has(tool.name.toLowerCase());
|
|
1044
|
-
});
|
|
1045
|
-
logger.debug(`Filtered MCP tools to agent's allowed servers: ${agentConfig.mcpServers.join(', ')}`);
|
|
1046
|
-
}
|
|
1047
|
-
// === AGENTIC LOOP ===
|
|
1048
|
-
_diag('INIT COMPLETE - entering agentic loop');
|
|
1049
|
-
// Get MCP tool integration for silent tool checks
|
|
1050
|
-
const mcpToolIntegration = getMCPToolIntegration();
|
|
1051
|
-
// Load agentic configuration
|
|
1052
|
-
const agenticConfig = configManager.getValue('agentic');
|
|
1053
|
-
const maxIterations = agenticConfig?.maxIterations ?? DEFAULT_MAX_AGENTIC_ITERATIONS;
|
|
1054
|
-
// Track agentic loop data
|
|
1055
|
-
const loopStartTime = Date.now();
|
|
1056
|
-
const agenticIterations = [];
|
|
1057
|
-
let totalToolCalls = 0;
|
|
1058
|
-
const totalUsage = { inputTokens: 0, outputTokens: 0, totalTokens: 0 };
|
|
1059
|
-
const totalCost = { inputCost: 0, outputCost: 0, totalCost: 0, currency: 'USD' };
|
|
1060
|
-
let iterations = 0;
|
|
1061
|
-
let accumulatedText = '';
|
|
1062
|
-
let finalResponse = '';
|
|
1063
|
-
let reachedMaxIterations = false;
|
|
1064
|
-
let hasStartedOutput = false;
|
|
1065
|
-
// Track consecutive tool retry attempts to replace instead of accumulate
|
|
1066
|
-
let toolRetryState = null;
|
|
1067
|
-
while (iterations < maxIterations) {
|
|
1068
|
-
iterations++;
|
|
1069
|
-
logger.debug(`Agentic loop iteration ${iterations}`);
|
|
1070
|
-
// === CANCELLATION CHECK ===
|
|
1071
|
-
// Check if process was cancelled before each iteration
|
|
1072
|
-
if (options.processId) {
|
|
1073
|
-
const { getAgentSpawner } = await import('./agent-spawner.js');
|
|
1074
|
-
const spawner = getAgentSpawner();
|
|
1075
|
-
const process = spawner.getProcess(options.processId);
|
|
1076
|
-
if (process?.status === 'cancelled') {
|
|
1077
|
-
logger.info(`Process ${options.processId} was cancelled - stopping execution`);
|
|
1078
|
-
finalResponse = accumulatedText + '\n\n*(Process cancelled)*';
|
|
1079
|
-
break;
|
|
1080
|
-
}
|
|
1081
|
-
}
|
|
1082
|
-
// === BUDGET ENFORCEMENT ===
|
|
1083
|
-
// Check budget limits before each iteration
|
|
1084
|
-
if (options.budget) {
|
|
1085
|
-
const budget = options.budget;
|
|
1086
|
-
// Check turn limit
|
|
1087
|
-
if (budget.turnsUsed >= budget.maxTurns) {
|
|
1088
|
-
logger.warn(`Agent turn budget exceeded: ${budget.turnsUsed}/${budget.maxTurns} turns`);
|
|
1089
|
-
finalResponse = accumulatedText + '\n\n*(Turn budget exceeded)*';
|
|
1090
|
-
if (options.onBudgetExceeded) {
|
|
1091
|
-
options.onBudgetExceeded('turns');
|
|
1092
|
-
}
|
|
1093
|
-
break;
|
|
1094
|
-
}
|
|
1095
|
-
// Check token limit (pre-flight estimate)
|
|
1096
|
-
if (budget.tokensUsed >= budget.maxTokens) {
|
|
1097
|
-
logger.warn(`Agent token budget exceeded: ${budget.tokensUsed}/${budget.maxTokens} tokens`);
|
|
1098
|
-
finalResponse = accumulatedText + '\n\n*(Token budget exceeded)*';
|
|
1099
|
-
if (options.onBudgetExceeded) {
|
|
1100
|
-
options.onBudgetExceeded('tokens');
|
|
1101
|
-
}
|
|
1102
|
-
break;
|
|
1103
|
-
}
|
|
1104
|
-
// Log budget status
|
|
1105
|
-
const tokenPercent = ((budget.tokensUsed / budget.maxTokens) * 100).toFixed(1);
|
|
1106
|
-
const turnPercent = ((budget.turnsUsed / budget.maxTurns) * 100).toFixed(1);
|
|
1107
|
-
logger.debug(`Budget status: ${budget.tokensUsed}/${budget.maxTokens} tokens (${tokenPercent}%), ${budget.turnsUsed}/${budget.maxTurns} turns (${turnPercent}%)`);
|
|
1108
|
-
}
|
|
1109
|
-
// Emit iteration start event
|
|
1110
|
-
if (callbacks?.onIterationStart) {
|
|
1111
|
-
callbacks.onIterationStart(iterations, maxIterations);
|
|
1112
|
-
}
|
|
1113
|
-
// Call Claude with tools
|
|
1114
|
-
_diag(`API CALL START (iteration ${iterations})`);
|
|
1115
|
-
const response = await client.createAgenticMessage(messages, {
|
|
1116
|
-
system: systemPrompt,
|
|
1117
|
-
tools,
|
|
1118
|
-
maxTokens: DEFAULT_MAX_TOKENS,
|
|
1119
|
-
}, (chunk) => {
|
|
1120
|
-
// Stream text chunks
|
|
1121
|
-
accumulatedText += chunk;
|
|
1122
|
-
if (!hasStartedOutput) {
|
|
1123
|
-
hasStartedOutput = true;
|
|
1124
|
-
}
|
|
1125
|
-
emitTextChunk(chunk);
|
|
1126
|
-
}, (toolEvent) => {
|
|
1127
|
-
// Log tool events
|
|
1128
|
-
if (toolEvent.type === 'tool_start') {
|
|
1129
|
-
const isSilent = mcpToolIntegration.isSilentTool(toolEvent.name);
|
|
1130
|
-
logger.debug(`Tool started: ${toolEvent.name}${isSilent ? ' (silent)' : ''}`);
|
|
1131
|
-
if (!isSilent) {
|
|
1132
|
-
emitToolStart(toolEvent.name, toolEvent.id, {});
|
|
1133
|
-
if (hasStartedOutput && !silent) {
|
|
1134
|
-
// Show tool execution in stderr so it doesn't pollute stdout
|
|
1135
|
-
process.stderr.write(chalk.dim(`\n[Executing: ${toolEvent.name}]\n`));
|
|
1136
|
-
}
|
|
1137
|
-
}
|
|
1138
|
-
}
|
|
1139
|
-
else if (toolEvent.type === 'tool_complete') {
|
|
1140
|
-
const isSilent = mcpToolIntegration.isSilentTool(toolEvent.name);
|
|
1141
|
-
if (!isSilent) {
|
|
1142
|
-
emitToolComplete(toolEvent.name, toolEvent.id, toolEvent.input, true);
|
|
1143
|
-
}
|
|
1144
|
-
}
|
|
1145
|
-
});
|
|
1146
|
-
_diag(`API CALL DONE (iteration ${iterations}, stopReason=${response.stopReason})`);
|
|
1147
|
-
logger.debug(`Response stop_reason: ${response.stopReason}, tool calls: ${response.toolUseBlocks.length}`);
|
|
1148
|
-
// Accumulate usage and cost
|
|
1149
|
-
totalUsage.inputTokens += response.usage.inputTokens;
|
|
1150
|
-
totalUsage.outputTokens += response.usage.outputTokens;
|
|
1151
|
-
totalUsage.totalTokens += response.usage.totalTokens;
|
|
1152
|
-
totalCost.inputCost += response.cost.inputCost;
|
|
1153
|
-
totalCost.outputCost += response.cost.outputCost;
|
|
1154
|
-
totalCost.totalCost += response.cost.totalCost;
|
|
1155
|
-
// === BUDGET TRACKING ===
|
|
1156
|
-
// Update budget usage after API call
|
|
1157
|
-
if (options.budget) {
|
|
1158
|
-
const tokensThisTurn = response.usage.inputTokens + response.usage.outputTokens;
|
|
1159
|
-
options.budget.tokensUsed += tokensThisTurn;
|
|
1160
|
-
options.budget.turnsUsed = iterations;
|
|
1161
|
-
logger.debug(`Budget updated: +${tokensThisTurn} tokens this turn, total: ${options.budget.tokensUsed}/${options.budget.maxTokens}`);
|
|
1162
|
-
// Check if we exceeded budget after this call
|
|
1163
|
-
if (options.budget.tokensUsed >= options.budget.maxTokens) {
|
|
1164
|
-
logger.warn(`Token budget exceeded after API call: ${options.budget.tokensUsed}/${options.budget.maxTokens}`);
|
|
1165
|
-
// Don't break here - let the loop continue to process this response
|
|
1166
|
-
// Budget will be checked at start of next iteration
|
|
1167
|
-
}
|
|
1168
|
-
}
|
|
1169
|
-
// Handle max_tokens - prompt continuation
|
|
1170
|
-
if (response.stopReason === 'max_tokens') {
|
|
1171
|
-
logger.warn('Response truncated due to max_tokens - prompting continuation');
|
|
1172
|
-
agenticIterations.push({
|
|
1173
|
-
iteration: iterations,
|
|
1174
|
-
llm_call: {
|
|
1175
|
-
messages_count: messages.length,
|
|
1176
|
-
response_text: response.textContent,
|
|
1177
|
-
tool_calls_count: 0,
|
|
1178
|
-
usage: response.usage,
|
|
1179
|
-
cost: response.cost,
|
|
1180
|
-
},
|
|
1181
|
-
tool_calls: [],
|
|
1182
|
-
stop_reason: response.stopReason,
|
|
1183
|
-
});
|
|
1184
|
-
messages.push({
|
|
1185
|
-
role: 'assistant',
|
|
1186
|
-
content: response.contentBlocks,
|
|
1187
|
-
});
|
|
1188
|
-
messages.push({
|
|
1189
|
-
role: 'user',
|
|
1190
|
-
content: 'Continue from where you left off.',
|
|
1191
|
-
});
|
|
1192
|
-
continue;
|
|
1193
|
-
}
|
|
1194
|
-
// If no tool calls, we're done
|
|
1195
|
-
if (response.stopReason !== 'tool_use' || response.toolUseBlocks.length === 0) {
|
|
1196
|
-
agenticIterations.push({
|
|
1197
|
-
iteration: iterations,
|
|
1198
|
-
llm_call: {
|
|
1199
|
-
messages_count: messages.length,
|
|
1200
|
-
response_text: response.textContent,
|
|
1201
|
-
tool_calls_count: 0,
|
|
1202
|
-
usage: response.usage,
|
|
1203
|
-
cost: response.cost,
|
|
1204
|
-
},
|
|
1205
|
-
tool_calls: [],
|
|
1206
|
-
stop_reason: response.stopReason,
|
|
1207
|
-
});
|
|
1208
|
-
finalResponse = accumulatedText;
|
|
1209
|
-
break;
|
|
1210
|
-
}
|
|
1211
|
-
// Execute tool calls
|
|
1212
|
-
emitStatus(`Running ${response.toolUseBlocks.length} tool(s)`);
|
|
1213
|
-
// Emit tool start events for all non-silent tools about to be executed
|
|
1214
|
-
for (const toolUse of response.toolUseBlocks) {
|
|
1215
|
-
if (!mcpToolIntegration.isSilentTool(toolUse.name)) {
|
|
1216
|
-
emitToolStart(toolUse.name, toolUse.id, toolUse.input);
|
|
1217
|
-
}
|
|
1218
|
-
else {
|
|
1219
|
-
logger.debug(`Silent tool suppressed from UI: ${toolUse.name}`);
|
|
1220
|
-
}
|
|
1221
|
-
}
|
|
1222
|
-
const { results: toolResults, records: toolRecords, userRejected, endTurn } = await executeToolCalls(response.toolUseBlocks, projectRoot);
|
|
1223
|
-
totalToolCalls += toolRecords.length;
|
|
1224
|
-
// Emit tool complete events for all executed tools
|
|
1225
|
-
// Silent tools: suppress UI output unless there's an error (errors always surface)
|
|
1226
|
-
for (let i = 0; i < toolRecords.length; i++) {
|
|
1227
|
-
const record = toolRecords[i];
|
|
1228
|
-
const toolUse = response.toolUseBlocks[i];
|
|
1229
|
-
const isToolSilent = mcpToolIntegration.isSilentTool(record.name);
|
|
1230
|
-
if (!isToolSilent || !record.success) {
|
|
1231
|
-
// Always emit for non-silent tools; also emit for silent tools that errored
|
|
1232
|
-
emitToolComplete(record.name, toolUse.id, record.result, record.success, record.error);
|
|
1233
|
-
}
|
|
1234
|
-
else {
|
|
1235
|
-
logger.debug(`Silent tool result suppressed from UI: ${record.name}`);
|
|
1236
|
-
}
|
|
1237
|
-
}
|
|
1238
|
-
// === CANCELLATION CHECK (after tool execution) ===
|
|
1239
|
-
// Check again after tools complete, in case cancellation happened during tool execution
|
|
1240
|
-
if (options.processId) {
|
|
1241
|
-
const { getAgentSpawner } = await import('./agent-spawner.js');
|
|
1242
|
-
const spawner = getAgentSpawner();
|
|
1243
|
-
const process = spawner.getProcess(options.processId);
|
|
1244
|
-
if (process?.status === 'cancelled') {
|
|
1245
|
-
logger.info(`Process ${options.processId} was cancelled during tool execution - stopping`);
|
|
1246
|
-
finalResponse = accumulatedText + '\n\n*(Process cancelled)*';
|
|
1247
|
-
break;
|
|
1248
|
-
}
|
|
1249
|
-
}
|
|
1250
|
-
// === END TURN CHECK (plan cancellation) ===
|
|
1251
|
-
// If a plan tool signalled endTurn (user cancelled a plan), stop the loop immediately
|
|
1252
|
-
if (endTurn) {
|
|
1253
|
-
logger.info('End turn signalled (plan cancelled) — stopping agentic loop');
|
|
1254
|
-
finalResponse = accumulatedText;
|
|
1255
|
-
break;
|
|
1256
|
-
}
|
|
1257
|
-
// If user rejected an operation, log it but continue the loop
|
|
1258
|
-
// The LLM will see the rejection error in the tool result and can decide what to do
|
|
1259
|
-
if (userRejected) {
|
|
1260
|
-
logger.info('Operation rejected - continuing agentic loop so LLM can respond');
|
|
1261
|
-
}
|
|
1262
|
-
// Log this iteration
|
|
1263
|
-
agenticIterations.push({
|
|
1264
|
-
iteration: iterations,
|
|
1265
|
-
llm_call: {
|
|
1266
|
-
messages_count: messages.length,
|
|
1267
|
-
response_text: response.textContent,
|
|
1268
|
-
tool_calls_count: response.toolUseBlocks.length,
|
|
1269
|
-
usage: response.usage,
|
|
1270
|
-
cost: response.cost,
|
|
1271
|
-
},
|
|
1272
|
-
tool_calls: toolRecords,
|
|
1273
|
-
stop_reason: response.stopReason,
|
|
1274
|
-
});
|
|
1275
|
-
// === TOOL RETRY REPLACEMENT LOGIC ===
|
|
1276
|
-
// Check if this is a consecutive retry of a single failed tool
|
|
1277
|
-
const isSingleToolCall = response.toolUseBlocks.length === 1;
|
|
1278
|
-
const singleTool = isSingleToolCall ? response.toolUseBlocks[0] : null;
|
|
1279
|
-
const singleToolResult = isSingleToolCall ? toolResults[0] : null;
|
|
1280
|
-
const singleToolRecord = isSingleToolCall ? toolRecords[0] : null;
|
|
1281
|
-
// Determine if we should replace the previous failed attempt
|
|
1282
|
-
const shouldReplace = isSingleToolCall &&
|
|
1283
|
-
singleTool &&
|
|
1284
|
-
toolRetryState &&
|
|
1285
|
-
isConsecutiveRetry(singleTool.name, singleTool.input, toolRetryState);
|
|
1286
|
-
if (shouldReplace && singleToolResult && singleToolRecord) {
|
|
1287
|
-
// This is a retry - replace the previous messages instead of appending
|
|
1288
|
-
const isCurrentError = singleToolResult.is_error === true;
|
|
1289
|
-
const currentContent = singleToolResult.content;
|
|
1290
|
-
// Update retry state
|
|
1291
|
-
if (isCurrentError) {
|
|
1292
|
-
toolRetryState.attemptCount++;
|
|
1293
|
-
toolRetryState.previousErrors.push(summarizeError(currentContent));
|
|
1294
|
-
}
|
|
1295
|
-
// Annotate the tool result with retry information
|
|
1296
|
-
const annotatedContent = annotateToolResult(currentContent, isCurrentError, toolRetryState.attemptCount, toolRetryState.previousErrors.slice(0, -1) // Exclude current error from "previous"
|
|
1297
|
-
);
|
|
1298
|
-
// Create annotated tool result
|
|
1299
|
-
const annotatedToolResult = {
|
|
1300
|
-
...singleToolResult,
|
|
1301
|
-
content: annotatedContent,
|
|
1302
|
-
};
|
|
1303
|
-
// Replace the last two messages (previous assistant + previous tool_result)
|
|
1304
|
-
messages.pop(); // Remove previous tool_result
|
|
1305
|
-
messages.pop(); // Remove previous assistant message
|
|
1306
|
-
// Add updated messages
|
|
1307
|
-
messages.push({
|
|
1308
|
-
role: 'assistant',
|
|
1309
|
-
content: response.contentBlocks,
|
|
1310
|
-
});
|
|
1311
|
-
messages.push({
|
|
1312
|
-
role: 'user',
|
|
1313
|
-
content: [annotatedToolResult],
|
|
1314
|
-
});
|
|
1315
|
-
logger.debug(`Tool retry detected: ${singleTool.name} attempt ${toolRetryState.attemptCount} (replaced previous)`);
|
|
1316
|
-
// Reset retry state if this attempt succeeded
|
|
1317
|
-
if (!isCurrentError) {
|
|
1318
|
-
toolRetryState = null;
|
|
1319
|
-
}
|
|
1320
|
-
}
|
|
1321
|
-
else {
|
|
1322
|
-
// Not a retry or multiple tools - append normally
|
|
1323
|
-
messages.push({
|
|
1324
|
-
role: 'assistant',
|
|
1325
|
-
content: response.contentBlocks,
|
|
1326
|
-
});
|
|
1327
|
-
messages.push({
|
|
1328
|
-
role: 'user',
|
|
1329
|
-
content: toolResults,
|
|
1330
|
-
});
|
|
1331
|
-
// Update retry state for potential future retries
|
|
1332
|
-
if (isSingleToolCall && singleToolRecord && !singleToolRecord.success) {
|
|
1333
|
-
// Single tool failed - start tracking for potential retry
|
|
1334
|
-
const toolInput = singleTool.input;
|
|
1335
|
-
toolRetryState = {
|
|
1336
|
-
toolName: singleTool.name,
|
|
1337
|
-
targetPath: toolInput.path,
|
|
1338
|
-
attemptCount: 1,
|
|
1339
|
-
previousErrors: [summarizeError(singleToolRecord.error || 'Unknown error')],
|
|
1340
|
-
};
|
|
1341
|
-
logger.debug(`Tool retry tracking started: ${singleTool.name}`);
|
|
1342
|
-
}
|
|
1343
|
-
else {
|
|
1344
|
-
// Multiple tools or success - reset retry state
|
|
1345
|
-
toolRetryState = null;
|
|
1346
|
-
}
|
|
1347
|
-
}
|
|
1348
|
-
// Check iteration limit
|
|
1349
|
-
if (iterations >= maxIterations) {
|
|
1350
|
-
logger.warn('Agentic loop reached maximum iterations');
|
|
1351
|
-
finalResponse = accumulatedText + '\n\n*(Reached maximum iterations)*';
|
|
1352
|
-
reachedMaxIterations = true;
|
|
1353
|
-
break;
|
|
1354
|
-
}
|
|
1355
|
-
}
|
|
1356
|
-
// Ensure output ends with newline
|
|
1357
|
-
if (finalResponse && !finalResponse.endsWith('\n') && !silent) {
|
|
1358
|
-
process.stdout.write('\n');
|
|
1359
|
-
}
|
|
1360
|
-
// Emit completion callback
|
|
1361
|
-
if (callbacks?.onComplete) {
|
|
1362
|
-
callbacks.onComplete(finalResponse, totalUsage, totalCost);
|
|
1363
|
-
}
|
|
1364
|
-
// Log the complete agentic loop
|
|
1365
|
-
const loopDuration = Date.now() - loopStartTime;
|
|
1366
|
-
await auditLogger.logAgenticLoop({
|
|
1367
|
-
user_input: userContent,
|
|
1368
|
-
system_prompt: systemPrompt,
|
|
1369
|
-
model: client.getCurrentModel().id,
|
|
1370
|
-
iterations: agenticIterations,
|
|
1371
|
-
final_response: finalResponse,
|
|
1372
|
-
total_iterations: iterations,
|
|
1373
|
-
total_tool_calls: totalToolCalls,
|
|
1374
|
-
total_usage: totalUsage,
|
|
1375
|
-
total_cost: totalCost,
|
|
1376
|
-
duration_ms: loopDuration,
|
|
1377
|
-
reached_max_iterations: reachedMaxIterations,
|
|
1378
|
-
isPlanMode: false,
|
|
1379
|
-
});
|
|
1380
|
-
// Save conversation for potential continuation
|
|
1381
|
-
// Convert ContentBlock[] to string for session storage
|
|
1382
|
-
const userContentForStorage = typeof userMessageContent === 'string'
|
|
1383
|
-
? userMessageContent
|
|
1384
|
-
: userMessageContent.map(block => {
|
|
1385
|
-
if (block.type === 'text') {
|
|
1386
|
-
return block.text;
|
|
1387
|
-
}
|
|
1388
|
-
else if (block.type === 'image' && block.source) {
|
|
1389
|
-
return `[Image: ${block.source.media_type}]`;
|
|
1390
|
-
}
|
|
1391
|
-
else if (block.type === 'document' && block.source) {
|
|
1392
|
-
return `[Document: ${block.source.media_type}]`;
|
|
1393
|
-
}
|
|
1394
|
-
return '[Unknown content type]';
|
|
1395
|
-
}).join('\n');
|
|
1396
|
-
const userMessageWithAttachments = attachments && attachments.length > 0
|
|
1397
|
-
? { role: 'user', content: userContentForStorage, attachments }
|
|
1398
|
-
: { role: 'user', content: userContentForStorage };
|
|
1399
|
-
sessionManager.addMessage(userMessageWithAttachments);
|
|
1400
|
-
if (finalResponse) {
|
|
1401
|
-
sessionManager.addMessage({ role: 'assistant', content: finalResponse });
|
|
1402
|
-
}
|
|
1403
|
-
await sessionManager.save();
|
|
1404
|
-
// End token tracking
|
|
1405
|
-
await tokenTracker.endSession();
|
|
1406
|
-
return {
|
|
1407
|
-
success: true,
|
|
1408
|
-
content: finalResponse,
|
|
1409
|
-
exitCode: 0,
|
|
1410
|
-
};
|
|
1411
|
-
}
|
|
1412
|
-
catch (error) {
|
|
1413
|
-
const errorMessage = error instanceof Error ? error.message : String(error);
|
|
1414
|
-
logger.error('SDK runner error', error);
|
|
1415
|
-
emitError(errorMessage);
|
|
1416
|
-
return {
|
|
1417
|
-
success: false,
|
|
1418
|
-
content: '',
|
|
1419
|
-
error: errorMessage,
|
|
1420
|
-
exitCode: 1,
|
|
1421
|
-
};
|
|
1422
|
-
}
|
|
1423
|
-
}
|
|
1424
|
-
//# sourceMappingURL=sdk-runner.js.map
|