@compass-ai/nova 1.0.74 → 1.0.75
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 +540 -538
- 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,1201 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Shell command execution service using execa for cross-platform command execution,
|
|
3
|
-
* streaming output, timeout handling, and environment management.
|
|
4
|
-
*/
|
|
5
|
-
import { execa } from 'execa';
|
|
6
|
-
import { execSync } from 'child_process';
|
|
7
|
-
import { logger } from '../utils/logger.js';
|
|
8
|
-
import { SHELL_COMMAND_TIMEOUT_MS } from '../constants/defaults.js';
|
|
9
|
-
import { getSystemEventLogger } from './system-event-logger.js';
|
|
10
|
-
import { getEventEmitter } from '../core/event-emitter.js';
|
|
11
|
-
import { randomUUID } from 'crypto';
|
|
12
|
-
/**
|
|
13
|
-
* Cached preferred shell to avoid repeated detection
|
|
14
|
-
*/
|
|
15
|
-
let cachedPreferredShell = null;
|
|
16
|
-
/**
|
|
17
|
-
* Detects the preferred shell for the current platform.
|
|
18
|
-
* On Windows, prefers PowerShell over cmd.exe for better capabilities.
|
|
19
|
-
* Result is cached for performance.
|
|
20
|
-
*
|
|
21
|
-
* @returns The path or name of the preferred shell
|
|
22
|
-
*/
|
|
23
|
-
export function getPreferredShell() {
|
|
24
|
-
if (cachedPreferredShell !== null) {
|
|
25
|
-
return cachedPreferredShell;
|
|
26
|
-
}
|
|
27
|
-
if (process.platform === 'win32') {
|
|
28
|
-
// Check for PowerShell Core (pwsh) first - cross-platform, modern
|
|
29
|
-
try {
|
|
30
|
-
execSync('pwsh -Version', { stdio: 'pipe' });
|
|
31
|
-
cachedPreferredShell = 'pwsh';
|
|
32
|
-
logger.debug('Detected shell: pwsh (PowerShell Core)');
|
|
33
|
-
return cachedPreferredShell;
|
|
34
|
-
}
|
|
35
|
-
catch {
|
|
36
|
-
// pwsh not available
|
|
37
|
-
}
|
|
38
|
-
// Check for Windows PowerShell - always available on modern Windows
|
|
39
|
-
try {
|
|
40
|
-
execSync('powershell -Command "$PSVersionTable.PSVersion"', { stdio: 'pipe' });
|
|
41
|
-
cachedPreferredShell = 'powershell';
|
|
42
|
-
logger.debug('Detected shell: powershell (Windows PowerShell)');
|
|
43
|
-
return cachedPreferredShell;
|
|
44
|
-
}
|
|
45
|
-
catch {
|
|
46
|
-
// PowerShell not available (very rare)
|
|
47
|
-
}
|
|
48
|
-
// Fallback to cmd.exe
|
|
49
|
-
cachedPreferredShell = process.env.COMSPEC || 'cmd.exe';
|
|
50
|
-
logger.debug(`Detected shell: ${cachedPreferredShell} (fallback)`);
|
|
51
|
-
}
|
|
52
|
-
else {
|
|
53
|
-
// Unix-like systems - use SHELL env var or default to /bin/sh
|
|
54
|
-
cachedPreferredShell = process.env.SHELL || '/bin/sh';
|
|
55
|
-
logger.debug(`Detected shell: ${cachedPreferredShell}`);
|
|
56
|
-
}
|
|
57
|
-
return cachedPreferredShell;
|
|
58
|
-
}
|
|
59
|
-
/**
|
|
60
|
-
* Clears the cached shell detection (useful for testing)
|
|
61
|
-
*/
|
|
62
|
-
export function clearShellCache() {
|
|
63
|
-
cachedPreferredShell = null;
|
|
64
|
-
}
|
|
65
|
-
/**
|
|
66
|
-
* ShellExecutor class provides safe shell command execution with configurable
|
|
67
|
-
* allowlists, blocklists, timeout handling, and streaming output support.
|
|
68
|
-
*
|
|
69
|
-
* Features:
|
|
70
|
-
* - Cross-platform command execution using execa
|
|
71
|
-
* - Configurable command allowlist and blocklist
|
|
72
|
-
* - Timeout handling with configurable defaults
|
|
73
|
-
* - Streaming output support for real-time feedback
|
|
74
|
-
* - Sequential command execution
|
|
75
|
-
* - Command existence checking
|
|
76
|
-
*/
|
|
77
|
-
class ShellExecutor {
|
|
78
|
-
allowedCommands = [];
|
|
79
|
-
blockedCommands = [];
|
|
80
|
-
defaultTimeout = SHELL_COMMAND_TIMEOUT_MS;
|
|
81
|
-
backgroundProcesses = new Map();
|
|
82
|
-
/**
|
|
83
|
-
* Configures the shell executor with allowed/blocked commands and timeout settings.
|
|
84
|
-
*
|
|
85
|
-
* @param options - Configuration options
|
|
86
|
-
*/
|
|
87
|
-
configure(options) {
|
|
88
|
-
if (options.allowedCommands) {
|
|
89
|
-
this.allowedCommands = options.allowedCommands;
|
|
90
|
-
}
|
|
91
|
-
if (options.blockedCommands) {
|
|
92
|
-
this.blockedCommands = options.blockedCommands;
|
|
93
|
-
}
|
|
94
|
-
if (options.defaultTimeout !== undefined) {
|
|
95
|
-
this.defaultTimeout = options.defaultTimeout;
|
|
96
|
-
}
|
|
97
|
-
logger.debug('ShellExecutor configured', {
|
|
98
|
-
allowedCommands: this.allowedCommands.length,
|
|
99
|
-
blockedCommands: this.blockedCommands.length,
|
|
100
|
-
defaultTimeout: this.defaultTimeout,
|
|
101
|
-
});
|
|
102
|
-
}
|
|
103
|
-
/**
|
|
104
|
-
* Checks if a command is allowed to be executed based on the configured
|
|
105
|
-
* allowlist and blocklist.
|
|
106
|
-
*
|
|
107
|
-
* @param command - The command string to check
|
|
108
|
-
* @returns True if the command is allowed, false otherwise
|
|
109
|
-
*/
|
|
110
|
-
isCommandAllowed(command) {
|
|
111
|
-
const trimmedCommand = command.trim();
|
|
112
|
-
const baseCommand = trimmedCommand.split(/\s+/)[0];
|
|
113
|
-
// Check blocked commands first (patterns that should never be allowed)
|
|
114
|
-
for (const blocked of this.blockedCommands) {
|
|
115
|
-
// Check if the blocked pattern appears anywhere in the command
|
|
116
|
-
if (trimmedCommand.includes(blocked)) {
|
|
117
|
-
logger.warn(`Command blocked by pattern: ${blocked}`);
|
|
118
|
-
return false;
|
|
119
|
-
}
|
|
120
|
-
}
|
|
121
|
-
// If allowlist is empty, allow all non-blocked commands
|
|
122
|
-
if (this.allowedCommands.length === 0) {
|
|
123
|
-
return true;
|
|
124
|
-
}
|
|
125
|
-
// Check if the base command is in the allowlist
|
|
126
|
-
const isAllowed = this.allowedCommands.some((allowed) => {
|
|
127
|
-
// Exact match
|
|
128
|
-
if (baseCommand === allowed) {
|
|
129
|
-
return true;
|
|
130
|
-
}
|
|
131
|
-
// Match command at end of path (e.g., /usr/bin/npm matches npm)
|
|
132
|
-
if (baseCommand.endsWith(`/${allowed}`)) {
|
|
133
|
-
return true;
|
|
134
|
-
}
|
|
135
|
-
// Match npx-style commands (e.g., npx eslint)
|
|
136
|
-
if (baseCommand === 'npx' && this.allowedCommands.includes(trimmedCommand.split(/\s+/)[1])) {
|
|
137
|
-
return true;
|
|
138
|
-
}
|
|
139
|
-
return false;
|
|
140
|
-
});
|
|
141
|
-
if (!isAllowed) {
|
|
142
|
-
logger.warn(`Command not in allowlist: ${baseCommand}`);
|
|
143
|
-
}
|
|
144
|
-
return isAllowed;
|
|
145
|
-
}
|
|
146
|
-
/**
|
|
147
|
-
* Executes a shell command and returns the result.
|
|
148
|
-
* If toolCallId is provided, emits real-time status updates with the last 3 lines of output.
|
|
149
|
-
*
|
|
150
|
-
* @param command - The command to execute
|
|
151
|
-
* @param options - Execution options
|
|
152
|
-
* @returns Promise resolving to the execution result
|
|
153
|
-
*/
|
|
154
|
-
async execute(command, options = {}) {
|
|
155
|
-
const startTime = Date.now();
|
|
156
|
-
const trimmedCommand = command.trim();
|
|
157
|
-
// Check if command is allowed
|
|
158
|
-
if (!this.isCommandAllowed(trimmedCommand)) {
|
|
159
|
-
logger.warn(`Command blocked: ${trimmedCommand}`);
|
|
160
|
-
return {
|
|
161
|
-
success: false,
|
|
162
|
-
stdout: '',
|
|
163
|
-
stderr: `Command not allowed: ${trimmedCommand}`,
|
|
164
|
-
exitCode: 1,
|
|
165
|
-
duration: 0,
|
|
166
|
-
timedOut: false,
|
|
167
|
-
killed: false,
|
|
168
|
-
command: trimmedCommand,
|
|
169
|
-
};
|
|
170
|
-
}
|
|
171
|
-
const cwd = options.cwd || process.cwd();
|
|
172
|
-
// If toolCallId is provided, use streaming execution with status updates
|
|
173
|
-
if (options.toolCallId) {
|
|
174
|
-
return this.executeWithStatusUpdates(trimmedCommand, options, cwd, startTime);
|
|
175
|
-
}
|
|
176
|
-
// Standard execution (no streaming status updates)
|
|
177
|
-
// Use preferred shell for consistent cross-platform behavior
|
|
178
|
-
const preferredShell = getPreferredShell();
|
|
179
|
-
const execaOptions = {
|
|
180
|
-
cwd,
|
|
181
|
-
env: { ...process.env, ...options.env },
|
|
182
|
-
timeout: options.timeout ?? this.defaultTimeout,
|
|
183
|
-
shell: options.shell === false ? false : preferredShell,
|
|
184
|
-
reject: false,
|
|
185
|
-
input: options.stdin,
|
|
186
|
-
stripFinalNewline: options.stripFinalNewline ?? true,
|
|
187
|
-
cancelSignal: options.signal,
|
|
188
|
-
};
|
|
189
|
-
try {
|
|
190
|
-
logger.debug(`Executing command: ${trimmedCommand}`, {
|
|
191
|
-
cwd: execaOptions.cwd,
|
|
192
|
-
timeout: execaOptions.timeout,
|
|
193
|
-
});
|
|
194
|
-
const result = await execa(trimmedCommand, execaOptions);
|
|
195
|
-
const duration = Date.now() - startTime;
|
|
196
|
-
const executionResult = {
|
|
197
|
-
success: result.exitCode === 0,
|
|
198
|
-
stdout: String(result.stdout || ''),
|
|
199
|
-
stderr: String(result.stderr || ''),
|
|
200
|
-
exitCode: result.exitCode ?? 1,
|
|
201
|
-
duration,
|
|
202
|
-
timedOut: result.timedOut ?? false,
|
|
203
|
-
killed: result.isTerminated ?? false,
|
|
204
|
-
command: trimmedCommand,
|
|
205
|
-
};
|
|
206
|
-
logger.debug(`Command completed: ${trimmedCommand}`, {
|
|
207
|
-
exitCode: executionResult.exitCode,
|
|
208
|
-
duration: executionResult.duration,
|
|
209
|
-
timedOut: executionResult.timedOut,
|
|
210
|
-
});
|
|
211
|
-
// Log to system event logger
|
|
212
|
-
getSystemEventLogger().logBashExecuted({
|
|
213
|
-
command: trimmedCommand,
|
|
214
|
-
cwd: execaOptions.cwd,
|
|
215
|
-
exitCode: executionResult.exitCode,
|
|
216
|
-
duration_ms: executionResult.duration,
|
|
217
|
-
stdout: executionResult.stdout,
|
|
218
|
-
stderr: executionResult.stderr,
|
|
219
|
-
timedOut: executionResult.timedOut,
|
|
220
|
-
killed: executionResult.killed,
|
|
221
|
-
});
|
|
222
|
-
return executionResult;
|
|
223
|
-
}
|
|
224
|
-
catch (error) {
|
|
225
|
-
const duration = Date.now() - startTime;
|
|
226
|
-
const execaError = error;
|
|
227
|
-
logger.error(`Command failed: ${trimmedCommand}`, {
|
|
228
|
-
error: execaError.message,
|
|
229
|
-
exitCode: execaError.exitCode,
|
|
230
|
-
});
|
|
231
|
-
const errorResult = {
|
|
232
|
-
success: false,
|
|
233
|
-
stdout: String(execaError.stdout || ''),
|
|
234
|
-
stderr: String(execaError.stderr || execaError.message || 'Unknown error'),
|
|
235
|
-
exitCode: execaError.exitCode ?? 1,
|
|
236
|
-
duration,
|
|
237
|
-
timedOut: execaError.timedOut ?? false,
|
|
238
|
-
killed: execaError.isTerminated ?? false,
|
|
239
|
-
command: trimmedCommand,
|
|
240
|
-
};
|
|
241
|
-
// Log to system event logger
|
|
242
|
-
getSystemEventLogger().logBashExecuted({
|
|
243
|
-
command: trimmedCommand,
|
|
244
|
-
cwd,
|
|
245
|
-
exitCode: errorResult.exitCode,
|
|
246
|
-
duration_ms: errorResult.duration,
|
|
247
|
-
stdout: errorResult.stdout,
|
|
248
|
-
stderr: errorResult.stderr,
|
|
249
|
-
timedOut: errorResult.timedOut,
|
|
250
|
-
killed: errorResult.killed,
|
|
251
|
-
});
|
|
252
|
-
return errorResult;
|
|
253
|
-
}
|
|
254
|
-
}
|
|
255
|
-
/**
|
|
256
|
-
* Executes a command with real-time status updates showing the last 3 lines of output.
|
|
257
|
-
* This provides visibility into long-running commands in the UI.
|
|
258
|
-
*/
|
|
259
|
-
async executeWithStatusUpdates(command, options, cwd, startTime) {
|
|
260
|
-
const eventEmitter = getEventEmitter();
|
|
261
|
-
const toolCallId = options.toolCallId;
|
|
262
|
-
const lastLines = [];
|
|
263
|
-
const MAX_LINES = 5;
|
|
264
|
-
let hasMoreLines = false; // Track if we've dropped lines
|
|
265
|
-
// Buffer to accumulate incomplete lines
|
|
266
|
-
let stdoutBuffer = '';
|
|
267
|
-
let stderrBuffer = '';
|
|
268
|
-
let fullStdout = '';
|
|
269
|
-
let fullStderr = '';
|
|
270
|
-
// Emit initial status
|
|
271
|
-
eventEmitter.emit('tool-status-message', {
|
|
272
|
-
toolId: toolCallId,
|
|
273
|
-
message: 'Executing...',
|
|
274
|
-
});
|
|
275
|
-
let abortCleanup = null;
|
|
276
|
-
try {
|
|
277
|
-
logger.debug(`Executing command with status updates: ${command}`, { cwd });
|
|
278
|
-
const preferredShell = getPreferredShell();
|
|
279
|
-
const subprocess = execa(command, {
|
|
280
|
-
cwd,
|
|
281
|
-
env: { ...process.env, ...options.env },
|
|
282
|
-
timeout: options.timeout ?? this.defaultTimeout,
|
|
283
|
-
shell: options.shell === false ? false : preferredShell,
|
|
284
|
-
reject: false,
|
|
285
|
-
input: options.stdin,
|
|
286
|
-
stripFinalNewline: options.stripFinalNewline ?? true,
|
|
287
|
-
// NOTE: cancelSignal intentionally omitted — execa's cancel sends SIGTERM
|
|
288
|
-
// which on Windows doesn't force-kill the process tree. Instead, we listen
|
|
289
|
-
// for the abort event below and force-kill the entire process tree immediately.
|
|
290
|
-
});
|
|
291
|
-
// Force-kill the process tree immediately when Ctrl+X abort fires.
|
|
292
|
-
// On Windows, `taskkill /F /T /PID` kills the whole tree (child processes
|
|
293
|
-
// spawned by npm scripts, etc.) without waiting for graceful shutdown.
|
|
294
|
-
if (options.signal) {
|
|
295
|
-
const onAbort = () => {
|
|
296
|
-
const pid = subprocess.pid;
|
|
297
|
-
if (pid) {
|
|
298
|
-
logger.debug(`Force-killing process tree (PID ${pid}) after user abort`);
|
|
299
|
-
if (process.platform === 'win32') {
|
|
300
|
-
try {
|
|
301
|
-
execSync(`taskkill /F /T /PID ${pid}`, { stdio: 'ignore' });
|
|
302
|
-
}
|
|
303
|
-
catch {
|
|
304
|
-
// Process may have already exited
|
|
305
|
-
subprocess.kill('SIGKILL');
|
|
306
|
-
}
|
|
307
|
-
}
|
|
308
|
-
else {
|
|
309
|
-
// On Unix, kill the process group (negative PID)
|
|
310
|
-
try {
|
|
311
|
-
process.kill(-pid, 'SIGKILL');
|
|
312
|
-
}
|
|
313
|
-
catch {
|
|
314
|
-
subprocess.kill('SIGKILL');
|
|
315
|
-
}
|
|
316
|
-
}
|
|
317
|
-
}
|
|
318
|
-
else {
|
|
319
|
-
subprocess.kill('SIGKILL');
|
|
320
|
-
}
|
|
321
|
-
};
|
|
322
|
-
if (options.signal.aborted) {
|
|
323
|
-
onAbort();
|
|
324
|
-
}
|
|
325
|
-
else {
|
|
326
|
-
options.signal.addEventListener('abort', onAbort, { once: true });
|
|
327
|
-
abortCleanup = () => options.signal.removeEventListener('abort', onAbort);
|
|
328
|
-
}
|
|
329
|
-
}
|
|
330
|
-
// Process stdout chunks
|
|
331
|
-
if (subprocess.stdout) {
|
|
332
|
-
subprocess.stdout.on('data', (chunk) => {
|
|
333
|
-
const text = chunk.toString();
|
|
334
|
-
fullStdout += text;
|
|
335
|
-
stdoutBuffer += text;
|
|
336
|
-
// Process complete lines
|
|
337
|
-
const lines = stdoutBuffer.split('\n');
|
|
338
|
-
stdoutBuffer = lines.pop() || ''; // Keep incomplete line in buffer
|
|
339
|
-
for (const line of lines) {
|
|
340
|
-
if (line.trim()) {
|
|
341
|
-
lastLines.push(line.trim());
|
|
342
|
-
if (lastLines.length > MAX_LINES) {
|
|
343
|
-
lastLines.shift();
|
|
344
|
-
hasMoreLines = true;
|
|
345
|
-
}
|
|
346
|
-
}
|
|
347
|
-
}
|
|
348
|
-
// Emit status update with last lines (add ... if there are more lines)
|
|
349
|
-
if (lastLines.length > 0) {
|
|
350
|
-
const message = hasMoreLines
|
|
351
|
-
? lastLines.join('\n') + '\n...'
|
|
352
|
-
: lastLines.join('\n');
|
|
353
|
-
eventEmitter.emit('tool-status-message', {
|
|
354
|
-
toolId: toolCallId,
|
|
355
|
-
message,
|
|
356
|
-
});
|
|
357
|
-
}
|
|
358
|
-
});
|
|
359
|
-
}
|
|
360
|
-
// Process stderr chunks
|
|
361
|
-
if (subprocess.stderr) {
|
|
362
|
-
subprocess.stderr.on('data', (chunk) => {
|
|
363
|
-
const text = chunk.toString();
|
|
364
|
-
fullStderr += text;
|
|
365
|
-
stderrBuffer += text;
|
|
366
|
-
// Process complete lines
|
|
367
|
-
const lines = stderrBuffer.split('\n');
|
|
368
|
-
stderrBuffer = lines.pop() || '';
|
|
369
|
-
for (const line of lines) {
|
|
370
|
-
if (line.trim()) {
|
|
371
|
-
lastLines.push(line.trim());
|
|
372
|
-
if (lastLines.length > MAX_LINES) {
|
|
373
|
-
lastLines.shift();
|
|
374
|
-
hasMoreLines = true;
|
|
375
|
-
}
|
|
376
|
-
}
|
|
377
|
-
}
|
|
378
|
-
// Emit status update (add ... if there are more lines)
|
|
379
|
-
if (lastLines.length > 0) {
|
|
380
|
-
const message = hasMoreLines
|
|
381
|
-
? lastLines.join('\n') + '\n...'
|
|
382
|
-
: lastLines.join('\n');
|
|
383
|
-
eventEmitter.emit('tool-status-message', {
|
|
384
|
-
toolId: toolCallId,
|
|
385
|
-
message,
|
|
386
|
-
});
|
|
387
|
-
}
|
|
388
|
-
});
|
|
389
|
-
}
|
|
390
|
-
// Wait for process to complete
|
|
391
|
-
const result = await subprocess;
|
|
392
|
-
abortCleanup?.();
|
|
393
|
-
const duration = Date.now() - startTime;
|
|
394
|
-
const executionResult = {
|
|
395
|
-
success: result.exitCode === 0,
|
|
396
|
-
stdout: fullStdout || String(result.stdout || ''),
|
|
397
|
-
stderr: fullStderr || String(result.stderr || ''),
|
|
398
|
-
exitCode: result.exitCode ?? 1,
|
|
399
|
-
duration,
|
|
400
|
-
timedOut: result.timedOut ?? false,
|
|
401
|
-
killed: result.isTerminated ?? false,
|
|
402
|
-
command,
|
|
403
|
-
};
|
|
404
|
-
logger.debug(`Command completed: ${command}`, {
|
|
405
|
-
exitCode: executionResult.exitCode,
|
|
406
|
-
duration: executionResult.duration,
|
|
407
|
-
timedOut: executionResult.timedOut,
|
|
408
|
-
});
|
|
409
|
-
// Log to system event logger
|
|
410
|
-
getSystemEventLogger().logBashExecuted({
|
|
411
|
-
command,
|
|
412
|
-
cwd,
|
|
413
|
-
exitCode: executionResult.exitCode,
|
|
414
|
-
duration_ms: executionResult.duration,
|
|
415
|
-
stdout: executionResult.stdout,
|
|
416
|
-
stderr: executionResult.stderr,
|
|
417
|
-
timedOut: executionResult.timedOut,
|
|
418
|
-
killed: executionResult.killed,
|
|
419
|
-
});
|
|
420
|
-
return executionResult;
|
|
421
|
-
}
|
|
422
|
-
catch (error) {
|
|
423
|
-
abortCleanup?.();
|
|
424
|
-
const duration = Date.now() - startTime;
|
|
425
|
-
const execaError = error;
|
|
426
|
-
logger.error(`Command failed: ${command}`, {
|
|
427
|
-
error: execaError.message,
|
|
428
|
-
exitCode: execaError.exitCode,
|
|
429
|
-
});
|
|
430
|
-
const errorResult = {
|
|
431
|
-
success: false,
|
|
432
|
-
stdout: fullStdout || String(execaError.stdout || ''),
|
|
433
|
-
stderr: fullStderr || String(execaError.stderr || execaError.message || 'Unknown error'),
|
|
434
|
-
exitCode: execaError.exitCode ?? 1,
|
|
435
|
-
duration,
|
|
436
|
-
timedOut: execaError.timedOut ?? false,
|
|
437
|
-
killed: execaError.isTerminated ?? false,
|
|
438
|
-
command,
|
|
439
|
-
};
|
|
440
|
-
// Log to system event logger
|
|
441
|
-
getSystemEventLogger().logBashExecuted({
|
|
442
|
-
command,
|
|
443
|
-
cwd,
|
|
444
|
-
exitCode: errorResult.exitCode,
|
|
445
|
-
duration_ms: errorResult.duration,
|
|
446
|
-
stdout: errorResult.stdout,
|
|
447
|
-
stderr: errorResult.stderr,
|
|
448
|
-
timedOut: errorResult.timedOut,
|
|
449
|
-
killed: errorResult.killed,
|
|
450
|
-
});
|
|
451
|
-
return errorResult;
|
|
452
|
-
}
|
|
453
|
-
}
|
|
454
|
-
/**
|
|
455
|
-
* Executes a command and yields streaming output chunks.
|
|
456
|
-
* This allows for real-time output display during long-running commands.
|
|
457
|
-
*
|
|
458
|
-
* @param command - The command to execute
|
|
459
|
-
* @param options - Execution options
|
|
460
|
-
* @yields Streaming output chunks
|
|
461
|
-
*/
|
|
462
|
-
async *executeStreaming(command, options = {}) {
|
|
463
|
-
const trimmedCommand = command.trim();
|
|
464
|
-
// Check if command is allowed
|
|
465
|
-
if (!this.isCommandAllowed(trimmedCommand)) {
|
|
466
|
-
yield { type: 'stderr', data: `Command not allowed: ${trimmedCommand}` };
|
|
467
|
-
yield { type: 'exit', data: 1 };
|
|
468
|
-
return;
|
|
469
|
-
}
|
|
470
|
-
const preferredShell = getPreferredShell();
|
|
471
|
-
const execaOptions = {
|
|
472
|
-
cwd: options.cwd || process.cwd(),
|
|
473
|
-
env: { ...process.env, ...options.env },
|
|
474
|
-
timeout: options.timeout ?? this.defaultTimeout,
|
|
475
|
-
shell: options.shell === false ? false : preferredShell,
|
|
476
|
-
input: options.stdin,
|
|
477
|
-
stripFinalNewline: options.stripFinalNewline ?? true,
|
|
478
|
-
};
|
|
479
|
-
try {
|
|
480
|
-
logger.debug(`Executing streaming command: ${trimmedCommand}`);
|
|
481
|
-
// For streaming, we need to handle the subprocess differently
|
|
482
|
-
// Since execa v9 uses a different API, we'll collect output and yield it
|
|
483
|
-
const subprocess = execa(trimmedCommand, {
|
|
484
|
-
...execaOptions,
|
|
485
|
-
reject: false,
|
|
486
|
-
cancelSignal: options.signal,
|
|
487
|
-
});
|
|
488
|
-
// Wait for the process to complete
|
|
489
|
-
const result = await subprocess;
|
|
490
|
-
// Yield stdout if present
|
|
491
|
-
if (result.stdout) {
|
|
492
|
-
yield { type: 'stdout', data: String(result.stdout) };
|
|
493
|
-
}
|
|
494
|
-
// Yield stderr if present
|
|
495
|
-
if (result.stderr) {
|
|
496
|
-
yield { type: 'stderr', data: String(result.stderr) };
|
|
497
|
-
}
|
|
498
|
-
// Yield exit code
|
|
499
|
-
yield { type: 'exit', data: result.exitCode ?? 0 };
|
|
500
|
-
}
|
|
501
|
-
catch (error) {
|
|
502
|
-
const execaError = error;
|
|
503
|
-
// Yield any output that was captured
|
|
504
|
-
if (execaError.stdout) {
|
|
505
|
-
yield { type: 'stdout', data: String(execaError.stdout) };
|
|
506
|
-
}
|
|
507
|
-
// Yield error message
|
|
508
|
-
yield {
|
|
509
|
-
type: 'stderr',
|
|
510
|
-
data: String(execaError.stderr || execaError.message || 'Command execution failed'),
|
|
511
|
-
};
|
|
512
|
-
// Yield exit code
|
|
513
|
-
yield { type: 'exit', data: execaError.exitCode ?? 1 };
|
|
514
|
-
}
|
|
515
|
-
}
|
|
516
|
-
/**
|
|
517
|
-
* Executes multiple commands in sequence, stopping on first failure.
|
|
518
|
-
*
|
|
519
|
-
* @param commands - Array of commands to execute
|
|
520
|
-
* @param options - Execution options applied to all commands
|
|
521
|
-
* @returns Array of execution results (may be shorter than input if a command fails)
|
|
522
|
-
*/
|
|
523
|
-
async executeSequence(commands, options = {}) {
|
|
524
|
-
const results = [];
|
|
525
|
-
for (const command of commands) {
|
|
526
|
-
const result = await this.execute(command, options);
|
|
527
|
-
results.push(result);
|
|
528
|
-
// Stop on first failure
|
|
529
|
-
if (!result.success) {
|
|
530
|
-
logger.debug(`Sequence stopped due to failure at command: ${command}`);
|
|
531
|
-
break;
|
|
532
|
-
}
|
|
533
|
-
}
|
|
534
|
-
return results;
|
|
535
|
-
}
|
|
536
|
-
/**
|
|
537
|
-
* Executes multiple commands in parallel.
|
|
538
|
-
*
|
|
539
|
-
* @param commands - Array of commands to execute
|
|
540
|
-
* @param options - Execution options applied to all commands
|
|
541
|
-
* @returns Array of execution results in the same order as input commands
|
|
542
|
-
*/
|
|
543
|
-
async executeParallel(commands, options = {}) {
|
|
544
|
-
const promises = commands.map((command) => this.execute(command, options));
|
|
545
|
-
return Promise.all(promises);
|
|
546
|
-
}
|
|
547
|
-
/**
|
|
548
|
-
* Gets the preferred shell being used for command execution.
|
|
549
|
-
*
|
|
550
|
-
* @returns The path to the preferred shell
|
|
551
|
-
*/
|
|
552
|
-
getShell() {
|
|
553
|
-
return getPreferredShell();
|
|
554
|
-
}
|
|
555
|
-
/**
|
|
556
|
-
* Checks if a command exists and is executable.
|
|
557
|
-
*
|
|
558
|
-
* @param command - The command name to check
|
|
559
|
-
* @returns True if the command exists, false otherwise
|
|
560
|
-
*/
|
|
561
|
-
async commandExists(command) {
|
|
562
|
-
// Use where.exe explicitly on Windows because 'where' is aliased to Where-Object in PowerShell
|
|
563
|
-
const checkCommand = process.platform === 'win32' ? `where.exe ${command}` : `which ${command}`;
|
|
564
|
-
try {
|
|
565
|
-
const result = await this.execute(checkCommand, {
|
|
566
|
-
timeout: 5000,
|
|
567
|
-
shell: true,
|
|
568
|
-
});
|
|
569
|
-
return result.success && result.stdout.trim().length > 0;
|
|
570
|
-
}
|
|
571
|
-
catch {
|
|
572
|
-
return false;
|
|
573
|
-
}
|
|
574
|
-
}
|
|
575
|
-
/**
|
|
576
|
-
* Gets the version of a command if it supports --version flag.
|
|
577
|
-
*
|
|
578
|
-
* @param command - The command to get version for
|
|
579
|
-
* @returns The version string or null if not available
|
|
580
|
-
*/
|
|
581
|
-
async getCommandVersion(command) {
|
|
582
|
-
try {
|
|
583
|
-
const result = await this.execute(`${command} --version`, {
|
|
584
|
-
timeout: 5000,
|
|
585
|
-
});
|
|
586
|
-
if (result.success && result.stdout) {
|
|
587
|
-
// Extract first line which usually contains version
|
|
588
|
-
const firstLine = result.stdout.split('\n')[0].trim();
|
|
589
|
-
return firstLine || null;
|
|
590
|
-
}
|
|
591
|
-
return null;
|
|
592
|
-
}
|
|
593
|
-
catch {
|
|
594
|
-
return null;
|
|
595
|
-
}
|
|
596
|
-
}
|
|
597
|
-
/**
|
|
598
|
-
* Validates a command string for basic safety checks.
|
|
599
|
-
* This is a supplementary check to the allowlist/blocklist system.
|
|
600
|
-
*
|
|
601
|
-
* @param command - The command to validate
|
|
602
|
-
* @returns Object with validation result and optional error message
|
|
603
|
-
*/
|
|
604
|
-
validateCommand(command) {
|
|
605
|
-
const trimmed = command.trim();
|
|
606
|
-
// Check for empty command
|
|
607
|
-
if (!trimmed) {
|
|
608
|
-
return { valid: false, error: 'Command cannot be empty' };
|
|
609
|
-
}
|
|
610
|
-
// Check for command injection patterns
|
|
611
|
-
const dangerousPatterns = [
|
|
612
|
-
/;\s*rm\s+-rf/i,
|
|
613
|
-
/&&\s*rm\s+-rf/i,
|
|
614
|
-
/\|\s*rm\s+-rf/i,
|
|
615
|
-
/`.*`/, // Backtick command substitution
|
|
616
|
-
/\$\(.*\)/, // $() command substitution in dangerous context
|
|
617
|
-
];
|
|
618
|
-
for (const pattern of dangerousPatterns) {
|
|
619
|
-
if (pattern.test(trimmed)) {
|
|
620
|
-
return {
|
|
621
|
-
valid: false,
|
|
622
|
-
error: 'Command contains potentially dangerous patterns',
|
|
623
|
-
};
|
|
624
|
-
}
|
|
625
|
-
}
|
|
626
|
-
// Check against blocklist
|
|
627
|
-
if (!this.isCommandAllowed(trimmed)) {
|
|
628
|
-
return { valid: false, error: 'Command is not allowed' };
|
|
629
|
-
}
|
|
630
|
-
return { valid: true };
|
|
631
|
-
}
|
|
632
|
-
/**
|
|
633
|
-
* Creates a safe command string by escaping special characters.
|
|
634
|
-
* Note: This is a basic implementation; for complex cases, use proper escaping libraries.
|
|
635
|
-
*
|
|
636
|
-
* @param parts - Command parts to join safely
|
|
637
|
-
* @returns Escaped command string
|
|
638
|
-
*/
|
|
639
|
-
escapeCommand(parts) {
|
|
640
|
-
return parts
|
|
641
|
-
.map((part) => {
|
|
642
|
-
// If part contains spaces or special characters, quote it
|
|
643
|
-
if (/[\s"'`$\\]/.test(part)) {
|
|
644
|
-
// Escape existing quotes and wrap in quotes
|
|
645
|
-
return `"${part.replace(/"/g, '\\"')}"`;
|
|
646
|
-
}
|
|
647
|
-
return part;
|
|
648
|
-
})
|
|
649
|
-
.join(' ');
|
|
650
|
-
}
|
|
651
|
-
// ============================================================
|
|
652
|
-
// VERIFICATION MODE EXECUTION
|
|
653
|
-
// ============================================================
|
|
654
|
-
/**
|
|
655
|
-
* Executes a command and monitors output for success/error patterns.
|
|
656
|
-
* Useful for verifying that long-running commands like dev servers start correctly.
|
|
657
|
-
* The process is automatically terminated after verification or timeout.
|
|
658
|
-
*
|
|
659
|
-
* @param command - The command to execute
|
|
660
|
-
* @param options - Verification options including success/error patterns
|
|
661
|
-
* @returns Promise resolving to the verification result
|
|
662
|
-
*
|
|
663
|
-
* @example
|
|
664
|
-
* ```typescript
|
|
665
|
-
* const result = await executor.executeAndVerify('npm start', {
|
|
666
|
-
* successPatterns: ['Listening on port', 'Server started'],
|
|
667
|
-
* errorPatterns: ['Error:', 'EADDRINUSE'],
|
|
668
|
-
* verificationTimeout: 15000,
|
|
669
|
-
* });
|
|
670
|
-
* if (result.verified) {
|
|
671
|
-
* console.log('Server started successfully!');
|
|
672
|
-
* }
|
|
673
|
-
* ```
|
|
674
|
-
*/
|
|
675
|
-
async executeAndVerify(command, options = {}) {
|
|
676
|
-
const startTime = Date.now();
|
|
677
|
-
const trimmedCommand = command.trim();
|
|
678
|
-
// Check if command is allowed
|
|
679
|
-
if (!this.isCommandAllowed(trimmedCommand)) {
|
|
680
|
-
logger.warn(`Command blocked: ${trimmedCommand}`);
|
|
681
|
-
return {
|
|
682
|
-
success: false,
|
|
683
|
-
stdout: '',
|
|
684
|
-
stderr: `Command not allowed: ${trimmedCommand}`,
|
|
685
|
-
exitCode: 1,
|
|
686
|
-
duration: 0,
|
|
687
|
-
timedOut: false,
|
|
688
|
-
killed: false,
|
|
689
|
-
command: trimmedCommand,
|
|
690
|
-
verified: false,
|
|
691
|
-
terminatedAfterVerification: false,
|
|
692
|
-
};
|
|
693
|
-
}
|
|
694
|
-
const cwd = options.cwd || process.cwd();
|
|
695
|
-
const verificationTimeout = options.verificationTimeout ?? 15000;
|
|
696
|
-
const eventEmitter = getEventEmitter();
|
|
697
|
-
const toolCallId = options.toolCallId;
|
|
698
|
-
// Default patterns for common dev servers
|
|
699
|
-
const successPatterns = (options.successPatterns ?? [
|
|
700
|
-
'listening on',
|
|
701
|
-
'server started',
|
|
702
|
-
'server running',
|
|
703
|
-
'ready on',
|
|
704
|
-
'started server',
|
|
705
|
-
'compiled successfully',
|
|
706
|
-
'webpack compiled',
|
|
707
|
-
'dev server running',
|
|
708
|
-
'localhost:',
|
|
709
|
-
'127.0.0.1:',
|
|
710
|
-
]).map(p => new RegExp(p, 'i'));
|
|
711
|
-
const errorPatterns = (options.errorPatterns ?? [
|
|
712
|
-
'error:',
|
|
713
|
-
'eaddrinuse',
|
|
714
|
-
'eacces',
|
|
715
|
-
'enoent',
|
|
716
|
-
'failed to',
|
|
717
|
-
'cannot find',
|
|
718
|
-
'module not found',
|
|
719
|
-
'command not found',
|
|
720
|
-
'npm err!',
|
|
721
|
-
]).map(p => new RegExp(p, 'i'));
|
|
722
|
-
let fullStdout = '';
|
|
723
|
-
let fullStderr = '';
|
|
724
|
-
let verified = false;
|
|
725
|
-
let matchedPattern;
|
|
726
|
-
let isError = false;
|
|
727
|
-
const lastLines = [];
|
|
728
|
-
const MAX_LINES = 5;
|
|
729
|
-
let hasMoreLines = false;
|
|
730
|
-
// Emit initial status
|
|
731
|
-
if (toolCallId) {
|
|
732
|
-
eventEmitter.emit('tool-status-message', {
|
|
733
|
-
toolId: toolCallId,
|
|
734
|
-
message: 'Starting and verifying...',
|
|
735
|
-
});
|
|
736
|
-
}
|
|
737
|
-
return new Promise((resolve) => {
|
|
738
|
-
logger.debug(`Executing with verification: ${trimmedCommand}`, { cwd, verificationTimeout });
|
|
739
|
-
const preferredShell = getPreferredShell();
|
|
740
|
-
const subprocess = execa(trimmedCommand, {
|
|
741
|
-
cwd,
|
|
742
|
-
env: { ...process.env, ...options.env },
|
|
743
|
-
timeout: 0, // No timeout - we handle it ourselves
|
|
744
|
-
shell: options.shell === false ? false : preferredShell,
|
|
745
|
-
reject: false,
|
|
746
|
-
stripFinalNewline: options.stripFinalNewline ?? true,
|
|
747
|
-
cancelSignal: options.signal,
|
|
748
|
-
});
|
|
749
|
-
let resolved = false;
|
|
750
|
-
const finishVerification = (success, pattern, error = false) => {
|
|
751
|
-
if (resolved)
|
|
752
|
-
return;
|
|
753
|
-
resolved = true;
|
|
754
|
-
verified = success && !error;
|
|
755
|
-
matchedPattern = pattern;
|
|
756
|
-
isError = error;
|
|
757
|
-
// Kill the process gracefully
|
|
758
|
-
try {
|
|
759
|
-
subprocess.kill('SIGTERM');
|
|
760
|
-
// Give it a moment, then force kill if needed
|
|
761
|
-
setTimeout(() => {
|
|
762
|
-
try {
|
|
763
|
-
subprocess.kill('SIGKILL');
|
|
764
|
-
}
|
|
765
|
-
catch {
|
|
766
|
-
// Process may already be dead
|
|
767
|
-
}
|
|
768
|
-
}, 1000);
|
|
769
|
-
}
|
|
770
|
-
catch {
|
|
771
|
-
// Process may already be dead
|
|
772
|
-
}
|
|
773
|
-
const duration = Date.now() - startTime;
|
|
774
|
-
const result = {
|
|
775
|
-
success: verified,
|
|
776
|
-
stdout: fullStdout,
|
|
777
|
-
stderr: fullStderr,
|
|
778
|
-
exitCode: verified ? 0 : 1,
|
|
779
|
-
duration,
|
|
780
|
-
timedOut: !verified && !isError,
|
|
781
|
-
killed: true,
|
|
782
|
-
command: trimmedCommand,
|
|
783
|
-
verified,
|
|
784
|
-
matchedPattern,
|
|
785
|
-
terminatedAfterVerification: true,
|
|
786
|
-
};
|
|
787
|
-
logger.debug(`Verification complete: ${trimmedCommand}`, {
|
|
788
|
-
verified,
|
|
789
|
-
matchedPattern,
|
|
790
|
-
duration,
|
|
791
|
-
});
|
|
792
|
-
// Log to system event logger
|
|
793
|
-
getSystemEventLogger().logBashExecuted({
|
|
794
|
-
command: trimmedCommand,
|
|
795
|
-
cwd,
|
|
796
|
-
exitCode: result.exitCode,
|
|
797
|
-
duration_ms: duration,
|
|
798
|
-
stdout: result.stdout,
|
|
799
|
-
stderr: result.stderr,
|
|
800
|
-
timedOut: result.timedOut,
|
|
801
|
-
killed: result.killed,
|
|
802
|
-
});
|
|
803
|
-
resolve(result);
|
|
804
|
-
};
|
|
805
|
-
// Set up verification timeout
|
|
806
|
-
const timeoutId = setTimeout(() => {
|
|
807
|
-
logger.debug(`Verification timeout reached for: ${trimmedCommand}`);
|
|
808
|
-
if (toolCallId) {
|
|
809
|
-
eventEmitter.emit('tool-status-message', {
|
|
810
|
-
toolId: toolCallId,
|
|
811
|
-
message: 'Verification timeout - terminating process',
|
|
812
|
-
});
|
|
813
|
-
}
|
|
814
|
-
finishVerification(false, undefined, false);
|
|
815
|
-
}, verificationTimeout);
|
|
816
|
-
const checkOutput = (text, _source) => {
|
|
817
|
-
// Check for success patterns
|
|
818
|
-
for (const pattern of successPatterns) {
|
|
819
|
-
if (pattern.test(text)) {
|
|
820
|
-
logger.debug(`Success pattern matched: ${pattern.source}`);
|
|
821
|
-
clearTimeout(timeoutId);
|
|
822
|
-
if (toolCallId) {
|
|
823
|
-
eventEmitter.emit('tool-status-message', {
|
|
824
|
-
toolId: toolCallId,
|
|
825
|
-
message: `✓ Verified: ${pattern.source}`,
|
|
826
|
-
});
|
|
827
|
-
}
|
|
828
|
-
finishVerification(true, pattern.source, false);
|
|
829
|
-
return;
|
|
830
|
-
}
|
|
831
|
-
}
|
|
832
|
-
// Check for error patterns
|
|
833
|
-
for (const pattern of errorPatterns) {
|
|
834
|
-
if (pattern.test(text)) {
|
|
835
|
-
logger.debug(`Error pattern matched: ${pattern.source}`);
|
|
836
|
-
clearTimeout(timeoutId);
|
|
837
|
-
if (toolCallId) {
|
|
838
|
-
eventEmitter.emit('tool-status-message', {
|
|
839
|
-
toolId: toolCallId,
|
|
840
|
-
message: `✗ Error: ${pattern.source}`,
|
|
841
|
-
});
|
|
842
|
-
}
|
|
843
|
-
finishVerification(false, pattern.source, true);
|
|
844
|
-
return;
|
|
845
|
-
}
|
|
846
|
-
}
|
|
847
|
-
};
|
|
848
|
-
// Process stdout
|
|
849
|
-
if (subprocess.stdout) {
|
|
850
|
-
subprocess.stdout.on('data', (chunk) => {
|
|
851
|
-
const text = chunk.toString();
|
|
852
|
-
fullStdout += text;
|
|
853
|
-
// Update status display
|
|
854
|
-
const lines = text.split('\n').filter(l => l.trim());
|
|
855
|
-
for (const line of lines) {
|
|
856
|
-
lastLines.push(line.trim());
|
|
857
|
-
if (lastLines.length > MAX_LINES) {
|
|
858
|
-
lastLines.shift();
|
|
859
|
-
hasMoreLines = true;
|
|
860
|
-
}
|
|
861
|
-
}
|
|
862
|
-
if (toolCallId && lastLines.length > 0) {
|
|
863
|
-
const message = hasMoreLines
|
|
864
|
-
? lastLines.join('\n') + '\n...'
|
|
865
|
-
: lastLines.join('\n');
|
|
866
|
-
eventEmitter.emit('tool-status-message', {
|
|
867
|
-
toolId: toolCallId,
|
|
868
|
-
message,
|
|
869
|
-
});
|
|
870
|
-
}
|
|
871
|
-
checkOutput(text, 'stdout');
|
|
872
|
-
});
|
|
873
|
-
}
|
|
874
|
-
// Process stderr
|
|
875
|
-
if (subprocess.stderr) {
|
|
876
|
-
subprocess.stderr.on('data', (chunk) => {
|
|
877
|
-
const text = chunk.toString();
|
|
878
|
-
fullStderr += text;
|
|
879
|
-
// Update status display
|
|
880
|
-
const lines = text.split('\n').filter(l => l.trim());
|
|
881
|
-
for (const line of lines) {
|
|
882
|
-
lastLines.push(line.trim());
|
|
883
|
-
if (lastLines.length > MAX_LINES) {
|
|
884
|
-
lastLines.shift();
|
|
885
|
-
hasMoreLines = true;
|
|
886
|
-
}
|
|
887
|
-
}
|
|
888
|
-
if (toolCallId && lastLines.length > 0) {
|
|
889
|
-
const message = hasMoreLines
|
|
890
|
-
? lastLines.join('\n') + '\n...'
|
|
891
|
-
: lastLines.join('\n');
|
|
892
|
-
eventEmitter.emit('tool-status-message', {
|
|
893
|
-
toolId: toolCallId,
|
|
894
|
-
message,
|
|
895
|
-
});
|
|
896
|
-
}
|
|
897
|
-
checkOutput(text, 'stderr');
|
|
898
|
-
});
|
|
899
|
-
}
|
|
900
|
-
// Handle process exit (in case it exits on its own before verification)
|
|
901
|
-
subprocess.then((result) => {
|
|
902
|
-
clearTimeout(timeoutId);
|
|
903
|
-
if (!resolved) {
|
|
904
|
-
const exitSuccess = result.exitCode === 0;
|
|
905
|
-
fullStdout = String(result.stdout || fullStdout);
|
|
906
|
-
fullStderr = String(result.stderr || fullStderr);
|
|
907
|
-
const duration = Date.now() - startTime;
|
|
908
|
-
resolve({
|
|
909
|
-
success: exitSuccess,
|
|
910
|
-
stdout: fullStdout,
|
|
911
|
-
stderr: fullStderr,
|
|
912
|
-
exitCode: result.exitCode ?? 1,
|
|
913
|
-
duration,
|
|
914
|
-
timedOut: false,
|
|
915
|
-
killed: false,
|
|
916
|
-
command: trimmedCommand,
|
|
917
|
-
verified: exitSuccess,
|
|
918
|
-
matchedPattern: exitSuccess ? 'process exited successfully' : undefined,
|
|
919
|
-
terminatedAfterVerification: false,
|
|
920
|
-
});
|
|
921
|
-
}
|
|
922
|
-
}).catch((error) => {
|
|
923
|
-
clearTimeout(timeoutId);
|
|
924
|
-
if (!resolved) {
|
|
925
|
-
fullStdout = String(error.stdout || fullStdout);
|
|
926
|
-
fullStderr = String(error.stderr || fullStderr);
|
|
927
|
-
const duration = Date.now() - startTime;
|
|
928
|
-
resolve({
|
|
929
|
-
success: false,
|
|
930
|
-
stdout: fullStdout,
|
|
931
|
-
stderr: fullStderr,
|
|
932
|
-
exitCode: error.exitCode ?? 1,
|
|
933
|
-
duration,
|
|
934
|
-
timedOut: error.timedOut ?? false,
|
|
935
|
-
killed: error.isTerminated ?? false,
|
|
936
|
-
command: trimmedCommand,
|
|
937
|
-
verified: false,
|
|
938
|
-
matchedPattern: undefined,
|
|
939
|
-
terminatedAfterVerification: false,
|
|
940
|
-
});
|
|
941
|
-
}
|
|
942
|
-
});
|
|
943
|
-
});
|
|
944
|
-
}
|
|
945
|
-
// ============================================================
|
|
946
|
-
// BACKGROUND PROCESS MANAGEMENT
|
|
947
|
-
// ============================================================
|
|
948
|
-
/**
|
|
949
|
-
* Executes a command in the background and returns a process ID for tracking.
|
|
950
|
-
* The process will continue running and can be monitored or killed later.
|
|
951
|
-
*
|
|
952
|
-
* @param command - The command to execute
|
|
953
|
-
* @param options - Execution options
|
|
954
|
-
* @returns Object containing the process ID and initial status
|
|
955
|
-
*/
|
|
956
|
-
executeBackground(command, options = {}) {
|
|
957
|
-
const trimmedCommand = command.trim();
|
|
958
|
-
// Check if command is allowed
|
|
959
|
-
if (!this.isCommandAllowed(trimmedCommand)) {
|
|
960
|
-
logger.warn(`Background command blocked: ${trimmedCommand}`);
|
|
961
|
-
return {
|
|
962
|
-
id: '',
|
|
963
|
-
command: trimmedCommand,
|
|
964
|
-
status: 'blocked',
|
|
965
|
-
};
|
|
966
|
-
}
|
|
967
|
-
const id = randomUUID().substring(0, 8);
|
|
968
|
-
const cwd = options.cwd || process.cwd();
|
|
969
|
-
const preferredShell = getPreferredShell();
|
|
970
|
-
const execaOptions = {
|
|
971
|
-
cwd,
|
|
972
|
-
env: { ...process.env, ...options.env },
|
|
973
|
-
timeout: options.timeout ?? 0, // No timeout for background processes by default
|
|
974
|
-
shell: options.shell === false ? false : preferredShell,
|
|
975
|
-
reject: false,
|
|
976
|
-
input: options.stdin,
|
|
977
|
-
stripFinalNewline: options.stripFinalNewline ?? true,
|
|
978
|
-
};
|
|
979
|
-
logger.debug(`Starting background command [${id}]: ${trimmedCommand}`);
|
|
980
|
-
const subprocess = execa(trimmedCommand, execaOptions);
|
|
981
|
-
const backgroundProcess = {
|
|
982
|
-
id,
|
|
983
|
-
command: trimmedCommand,
|
|
984
|
-
cwd,
|
|
985
|
-
startedAt: new Date(),
|
|
986
|
-
status: 'running',
|
|
987
|
-
stdout: '',
|
|
988
|
-
stderr: '',
|
|
989
|
-
process: subprocess,
|
|
990
|
-
};
|
|
991
|
-
this.backgroundProcesses.set(id, backgroundProcess);
|
|
992
|
-
// Handle process completion
|
|
993
|
-
subprocess.then((result) => {
|
|
994
|
-
const proc = this.backgroundProcesses.get(id);
|
|
995
|
-
if (proc && proc.status === 'running') {
|
|
996
|
-
proc.status = result.exitCode === 0 ? 'completed' : 'failed';
|
|
997
|
-
proc.exitCode = result.exitCode ?? 1;
|
|
998
|
-
proc.stdout = String(result.stdout || '');
|
|
999
|
-
proc.stderr = String(result.stderr || '');
|
|
1000
|
-
logger.debug(`Background command [${id}] completed with exit code ${proc.exitCode}`);
|
|
1001
|
-
}
|
|
1002
|
-
}).catch((error) => {
|
|
1003
|
-
const proc = this.backgroundProcesses.get(id);
|
|
1004
|
-
if (proc && proc.status === 'running') {
|
|
1005
|
-
proc.status = 'failed';
|
|
1006
|
-
proc.exitCode = error.exitCode ?? 1;
|
|
1007
|
-
proc.stdout = String(error.stdout || '');
|
|
1008
|
-
proc.stderr = String(error.stderr || error.message || 'Command failed');
|
|
1009
|
-
logger.debug(`Background command [${id}] failed: ${error.message}`);
|
|
1010
|
-
}
|
|
1011
|
-
});
|
|
1012
|
-
return {
|
|
1013
|
-
id,
|
|
1014
|
-
command: trimmedCommand,
|
|
1015
|
-
status: 'running',
|
|
1016
|
-
};
|
|
1017
|
-
}
|
|
1018
|
-
/**
|
|
1019
|
-
* Kills a background process by its ID.
|
|
1020
|
-
*
|
|
1021
|
-
* @param id - The process ID to kill
|
|
1022
|
-
* @param signal - The signal to send (default: SIGTERM)
|
|
1023
|
-
* @returns Object with success status and details
|
|
1024
|
-
*/
|
|
1025
|
-
killProcess(id, signal = 'SIGTERM') {
|
|
1026
|
-
const proc = this.backgroundProcesses.get(id);
|
|
1027
|
-
if (!proc) {
|
|
1028
|
-
return {
|
|
1029
|
-
success: false,
|
|
1030
|
-
message: `No process found with ID: ${id}`,
|
|
1031
|
-
};
|
|
1032
|
-
}
|
|
1033
|
-
if (proc.status !== 'running') {
|
|
1034
|
-
return {
|
|
1035
|
-
success: false,
|
|
1036
|
-
message: `Process ${id} is not running (status: ${proc.status})`,
|
|
1037
|
-
process: { ...proc, process: undefined },
|
|
1038
|
-
};
|
|
1039
|
-
}
|
|
1040
|
-
try {
|
|
1041
|
-
// Kill the process
|
|
1042
|
-
proc.process.kill(signal);
|
|
1043
|
-
proc.status = 'killed';
|
|
1044
|
-
logger.info(`Killed background process [${id}]: ${proc.command}`);
|
|
1045
|
-
// Log to system event logger
|
|
1046
|
-
getSystemEventLogger().logBashExecuted({
|
|
1047
|
-
command: proc.command,
|
|
1048
|
-
cwd: proc.cwd,
|
|
1049
|
-
exitCode: -1,
|
|
1050
|
-
duration_ms: Date.now() - proc.startedAt.getTime(),
|
|
1051
|
-
stdout: proc.stdout,
|
|
1052
|
-
stderr: proc.stderr,
|
|
1053
|
-
timedOut: false,
|
|
1054
|
-
killed: true,
|
|
1055
|
-
});
|
|
1056
|
-
return {
|
|
1057
|
-
success: true,
|
|
1058
|
-
message: `Process ${id} killed successfully`,
|
|
1059
|
-
process: { ...proc, process: undefined },
|
|
1060
|
-
};
|
|
1061
|
-
}
|
|
1062
|
-
catch (error) {
|
|
1063
|
-
const errorMessage = error instanceof Error ? error.message : 'Unknown error';
|
|
1064
|
-
logger.error(`Failed to kill process [${id}]: ${errorMessage}`);
|
|
1065
|
-
return {
|
|
1066
|
-
success: false,
|
|
1067
|
-
message: `Failed to kill process: ${errorMessage}`,
|
|
1068
|
-
process: { ...proc, process: undefined },
|
|
1069
|
-
};
|
|
1070
|
-
}
|
|
1071
|
-
}
|
|
1072
|
-
/**
|
|
1073
|
-
* Gets the status of a background process.
|
|
1074
|
-
*
|
|
1075
|
-
* @param id - The process ID to check
|
|
1076
|
-
* @returns The process info or null if not found
|
|
1077
|
-
*/
|
|
1078
|
-
getProcessStatus(id) {
|
|
1079
|
-
const proc = this.backgroundProcesses.get(id);
|
|
1080
|
-
if (!proc) {
|
|
1081
|
-
return null;
|
|
1082
|
-
}
|
|
1083
|
-
// Return without the process object (not serializable)
|
|
1084
|
-
const { process: _process, ...rest } = proc;
|
|
1085
|
-
return rest;
|
|
1086
|
-
}
|
|
1087
|
-
/**
|
|
1088
|
-
* Lists all tracked background processes.
|
|
1089
|
-
*
|
|
1090
|
-
* @param filter - Optional filter by status
|
|
1091
|
-
* @returns Array of process info objects
|
|
1092
|
-
*/
|
|
1093
|
-
listProcesses(filter) {
|
|
1094
|
-
const processes = [];
|
|
1095
|
-
for (const proc of this.backgroundProcesses.values()) {
|
|
1096
|
-
if (!filter || proc.status === filter) {
|
|
1097
|
-
const { process: _process, ...rest } = proc;
|
|
1098
|
-
processes.push(rest);
|
|
1099
|
-
}
|
|
1100
|
-
}
|
|
1101
|
-
return processes;
|
|
1102
|
-
}
|
|
1103
|
-
/**
|
|
1104
|
-
* Cleans up completed/failed/killed processes from tracking.
|
|
1105
|
-
*
|
|
1106
|
-
* @param olderThan - Optional: only clean processes older than this many milliseconds
|
|
1107
|
-
* @returns Number of processes cleaned up
|
|
1108
|
-
*/
|
|
1109
|
-
cleanupProcesses(olderThan) {
|
|
1110
|
-
let cleaned = 0;
|
|
1111
|
-
const now = Date.now();
|
|
1112
|
-
for (const [id, proc] of this.backgroundProcesses) {
|
|
1113
|
-
if (proc.status !== 'running') {
|
|
1114
|
-
if (!olderThan || (now - proc.startedAt.getTime() > olderThan)) {
|
|
1115
|
-
this.backgroundProcesses.delete(id);
|
|
1116
|
-
cleaned++;
|
|
1117
|
-
}
|
|
1118
|
-
}
|
|
1119
|
-
}
|
|
1120
|
-
if (cleaned > 0) {
|
|
1121
|
-
logger.debug(`Cleaned up ${cleaned} background processes`);
|
|
1122
|
-
}
|
|
1123
|
-
return cleaned;
|
|
1124
|
-
}
|
|
1125
|
-
/**
|
|
1126
|
-
* Kills all running background processes.
|
|
1127
|
-
*
|
|
1128
|
-
* @param signal - The signal to send (default: SIGTERM)
|
|
1129
|
-
* @returns Number of processes killed
|
|
1130
|
-
*/
|
|
1131
|
-
killAllProcesses(signal = 'SIGTERM') {
|
|
1132
|
-
let killed = 0;
|
|
1133
|
-
for (const [id, proc] of this.backgroundProcesses) {
|
|
1134
|
-
if (proc.status === 'running') {
|
|
1135
|
-
const result = this.killProcess(id, signal);
|
|
1136
|
-
if (result.success) {
|
|
1137
|
-
killed++;
|
|
1138
|
-
}
|
|
1139
|
-
}
|
|
1140
|
-
}
|
|
1141
|
-
if (killed > 0) {
|
|
1142
|
-
logger.info(`Killed ${killed} background processes`);
|
|
1143
|
-
}
|
|
1144
|
-
return killed;
|
|
1145
|
-
}
|
|
1146
|
-
/**
|
|
1147
|
-
* Gets the current configuration of the executor.
|
|
1148
|
-
*
|
|
1149
|
-
* @returns Current configuration
|
|
1150
|
-
*/
|
|
1151
|
-
getConfig() {
|
|
1152
|
-
return {
|
|
1153
|
-
allowedCommands: [...this.allowedCommands],
|
|
1154
|
-
blockedCommands: [...this.blockedCommands],
|
|
1155
|
-
defaultTimeout: this.defaultTimeout,
|
|
1156
|
-
};
|
|
1157
|
-
}
|
|
1158
|
-
/**
|
|
1159
|
-
* Resets the executor configuration to defaults.
|
|
1160
|
-
* Also kills all running background processes.
|
|
1161
|
-
*/
|
|
1162
|
-
reset() {
|
|
1163
|
-
// Kill any running background processes
|
|
1164
|
-
this.killAllProcesses();
|
|
1165
|
-
this.backgroundProcesses.clear();
|
|
1166
|
-
this.allowedCommands = [];
|
|
1167
|
-
this.blockedCommands = [];
|
|
1168
|
-
this.defaultTimeout = SHELL_COMMAND_TIMEOUT_MS;
|
|
1169
|
-
logger.debug('ShellExecutor reset to defaults');
|
|
1170
|
-
}
|
|
1171
|
-
}
|
|
1172
|
-
// Singleton instance
|
|
1173
|
-
let shellExecutorInstance = null;
|
|
1174
|
-
/**
|
|
1175
|
-
* Gets the singleton ShellExecutor instance.
|
|
1176
|
-
* Creates the instance on first call.
|
|
1177
|
-
*
|
|
1178
|
-
* @returns The ShellExecutor singleton instance
|
|
1179
|
-
*/
|
|
1180
|
-
export function getShellExecutor() {
|
|
1181
|
-
if (!shellExecutorInstance) {
|
|
1182
|
-
shellExecutorInstance = new ShellExecutor();
|
|
1183
|
-
}
|
|
1184
|
-
return shellExecutorInstance;
|
|
1185
|
-
}
|
|
1186
|
-
/**
|
|
1187
|
-
* Creates a new ShellExecutor instance with optional configuration.
|
|
1188
|
-
* Use this when you need a separate instance from the singleton.
|
|
1189
|
-
*
|
|
1190
|
-
* @param config - Optional configuration options
|
|
1191
|
-
* @returns A new ShellExecutor instance
|
|
1192
|
-
*/
|
|
1193
|
-
export function createShellExecutor(config) {
|
|
1194
|
-
const executor = new ShellExecutor();
|
|
1195
|
-
if (config) {
|
|
1196
|
-
executor.configure(config);
|
|
1197
|
-
}
|
|
1198
|
-
return executor;
|
|
1199
|
-
}
|
|
1200
|
-
export { ShellExecutor };
|
|
1201
|
-
//# sourceMappingURL=shell-executor.js.map
|