@pellux/goodvibes-tui 0.18.10 → 0.18.12
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/CHANGELOG.md +56 -0
- package/README.md +1 -1
- package/docs/foundation-artifacts/operator-contract.json +1 -1
- package/package.json +2 -2
- package/src/core/conversation-rendering.ts +2 -2
- package/src/core/conversation.ts +5 -5
- package/src/core/orchestrator.ts +13 -11
- package/src/daemon/facade-composition.ts +8 -8
- package/src/daemon/facade.ts +8 -8
- package/src/daemon/types.ts +3 -3
- package/src/input/command-registry.ts +3 -3
- package/src/input/commands/session-content.ts +2 -2
- package/src/input/commands/session-workflow.ts +1 -1
- package/src/input/handler-feed.ts +1 -1
- package/src/input/session-picker-modal.ts +1 -1
- package/src/panels/builtin/agent.ts +1 -0
- package/src/panels/builtin/operations.ts +1 -0
- package/src/panels/builtin/session.ts +1 -1
- package/src/panels/builtin/shared.ts +2 -2
- package/src/panels/context-visualizer-panel.ts +4 -1
- package/src/panels/provider-health-domains.ts +5 -1
- package/src/panels/provider-health-panel.ts +5 -1
- package/src/panels/session-browser-panel.ts +1 -1
- package/src/panels/token-budget-panel.ts +6 -2
- package/src/plugins/loader.ts +2 -2
- package/src/runtime/bootstrap-command-context.ts +3 -3
- package/src/runtime/bootstrap-command-parts.ts +3 -3
- package/src/runtime/bootstrap-core.ts +2 -2
- package/src/runtime/bootstrap-hook-bridge.ts +1 -1
- package/src/runtime/bootstrap-shell.ts +1 -1
- package/src/runtime/bootstrap.ts +5 -4
- package/src/runtime/services.ts +2 -2
- package/src/runtime/ui-read-models-observability-security.ts +2 -2
- package/src/runtime/ui-read-models-observability-system.ts +1 -1
- package/src/runtime/ui-service-queries.ts +1 -1
- package/src/tools/index.ts +1 -1
- package/src/version.ts +1 -1
- package/src/acp/connection.ts +0 -447
- package/src/acp/index.ts +0 -7
- package/src/acp/manager.ts +0 -1
- package/src/adapters/bluebubbles/index.ts +0 -127
- package/src/adapters/discord/index.ts +0 -297
- package/src/adapters/github/index.ts +0 -73
- package/src/adapters/google-chat/index.ts +0 -119
- package/src/adapters/imessage/index.ts +0 -92
- package/src/adapters/index.ts +0 -15
- package/src/adapters/matrix/index.ts +0 -116
- package/src/adapters/mattermost/index.ts +0 -151
- package/src/adapters/msteams/index.ts +0 -180
- package/src/adapters/ntfy/index.ts +0 -118
- package/src/adapters/signal/index.ts +0 -92
- package/src/adapters/slack/index.ts +0 -323
- package/src/adapters/telegram/index.ts +0 -160
- package/src/adapters/types.ts +0 -97
- package/src/adapters/webhook/index.ts +0 -178
- package/src/adapters/whatsapp/index.ts +0 -135
- package/src/agents/message-bus-core.ts +0 -312
- package/src/agents/message-bus.ts +0 -2
- package/src/agents/orchestrator-prompts.ts +0 -351
- package/src/agents/orchestrator-runner.ts +0 -668
- package/src/agents/orchestrator.ts +0 -438
- package/src/agents/session.ts +0 -108
- package/src/agents/worktree.ts +0 -153
- package/src/agents/wrfc-config.ts +0 -47
- package/src/agents/wrfc-controller.ts +0 -747
- package/src/agents/wrfc-gate-runtime.ts +0 -75
- package/src/agents/wrfc-reporting.ts +0 -284
- package/src/agents/wrfc-runtime-events.ts +0 -150
- package/src/agents/wrfc-types.ts +0 -67
- package/src/automation/delivery-manager.ts +0 -368
- package/src/automation/index.ts +0 -72
- package/src/automation/manager-runtime-delivery.ts +0 -139
- package/src/automation/manager-runtime-events.ts +0 -131
- package/src/automation/manager-runtime-execution.ts +0 -511
- package/src/automation/manager-runtime-helpers.ts +0 -433
- package/src/automation/manager-runtime-job-mutations.ts +0 -175
- package/src/automation/manager-runtime-reconcile.ts +0 -148
- package/src/automation/manager-runtime-scheduling.ts +0 -189
- package/src/automation/manager-runtime-sync.ts +0 -54
- package/src/automation/manager-runtime.ts +0 -721
- package/src/automation/manager.ts +0 -10
- package/src/automation/service.ts +0 -242
- package/src/channels/builtin/account-actions.ts +0 -490
- package/src/channels/builtin/accounts.ts +0 -433
- package/src/channels/builtin/contracts.ts +0 -405
- package/src/channels/builtin/plugins.ts +0 -308
- package/src/channels/builtin/rendering.ts +0 -174
- package/src/channels/builtin/setup-schema.ts +0 -504
- package/src/channels/builtin/shared.ts +0 -96
- package/src/channels/builtin/surfaces.ts +0 -57
- package/src/channels/builtin/targets.ts +0 -693
- package/src/channels/builtin-runtime.ts +0 -443
- package/src/channels/delivery/shared.ts +0 -199
- package/src/channels/delivery/strategies-bridge.ts +0 -246
- package/src/channels/delivery/strategies-core.ts +0 -299
- package/src/channels/delivery/strategies-enterprise.ts +0 -178
- package/src/channels/delivery/types.ts +0 -59
- package/src/channels/delivery-router.ts +0 -127
- package/src/channels/index.ts +0 -77
- package/src/channels/plugin-registry.ts +0 -551
- package/src/channels/provider-runtime.ts +0 -330
- package/src/channels/reply-pipeline.ts +0 -522
- package/src/channels/route-manager.ts +0 -340
- package/src/channels/surface-registry.ts +0 -186
- package/src/config/helper-model.ts +0 -1
- package/src/config/manager.ts +0 -8
- package/src/config/subscription-auth.ts +0 -31
- package/src/config/tool-llm.ts +0 -110
- package/src/control-plane/approval-broker.ts +0 -351
- package/src/control-plane/gateway.ts +0 -1
- package/src/control-plane/index.ts +0 -54
- package/src/control-plane/media-contract-schemas.ts +0 -1
- package/src/control-plane/method-catalog-admin.ts +0 -1
- package/src/control-plane/method-catalog-channels.ts +0 -1
- package/src/control-plane/method-catalog-control-automation.ts +0 -1
- package/src/control-plane/method-catalog-control-core.ts +0 -1
- package/src/control-plane/method-catalog-control.ts +0 -1
- package/src/control-plane/method-catalog-events.ts +0 -1
- package/src/control-plane/method-catalog-knowledge.ts +0 -1
- package/src/control-plane/method-catalog-media.ts +0 -1
- package/src/control-plane/method-catalog-runtime.ts +0 -1
- package/src/control-plane/method-catalog-shared.ts +0 -1
- package/src/control-plane/method-catalog.ts +0 -1
- package/src/control-plane/operator-contract-schemas-admin.ts +0 -1
- package/src/control-plane/operator-contract-schemas-channels.ts +0 -1
- package/src/control-plane/operator-contract-schemas-control.ts +0 -1
- package/src/control-plane/operator-contract-schemas-domains.ts +0 -1
- package/src/control-plane/operator-contract-schemas-knowledge.ts +0 -1
- package/src/control-plane/operator-contract-schemas-media.ts +0 -1
- package/src/control-plane/operator-contract-schemas-permissions.ts +0 -1
- package/src/control-plane/operator-contract-schemas-remote.ts +0 -1
- package/src/control-plane/operator-contract-schemas-runtime.ts +0 -1
- package/src/control-plane/operator-contract-schemas-shared.ts +0 -1
- package/src/control-plane/operator-contract-schemas-telemetry.ts +0 -1
- package/src/control-plane/operator-contract-schemas.ts +0 -1
- package/src/control-plane/operator-contract.ts +0 -165
- package/src/control-plane/session-broker.ts +0 -780
- package/src/core/compaction-sections.ts +0 -492
- package/src/core/compaction-types.ts +0 -147
- package/src/core/context-compaction.ts +0 -542
- package/src/core/conversation-compaction.ts +0 -68
- package/src/core/conversation-diff.ts +0 -55
- package/src/core/conversation-utils.ts +0 -72
- package/src/core/event-replay.ts +0 -287
- package/src/core/orchestrator-context-runtime.ts +0 -407
- package/src/core/orchestrator-follow-up-runtime.ts +0 -134
- package/src/core/orchestrator-runtime.ts +0 -132
- package/src/core/orchestrator-tool-runtime.ts +0 -468
- package/src/core/orchestrator-turn-helpers.ts +0 -355
- package/src/core/orchestrator-turn-loop.ts +0 -443
- package/src/core/plan-command-handler.ts +0 -169
- package/src/core/transcript-events/classify.ts +0 -95
- package/src/core/transcript-events/index.ts +0 -15
- package/src/daemon/control-plane.ts +0 -522
- package/src/daemon/helpers.ts +0 -74
- package/src/daemon/http/router-route-contexts.ts +0 -370
- package/src/daemon/http/router.ts +0 -531
- package/src/daemon/http-listener.ts +0 -301
- package/src/daemon/index.ts +0 -1
- package/src/daemon/server.ts +0 -1
- package/src/daemon/service-manager.ts +0 -413
- package/src/daemon/surface-actions.ts +0 -183
- package/src/daemon/surface-delivery.ts +0 -530
- package/src/daemon/transport-events.ts +0 -110
- package/src/export/markdown.ts +0 -213
- package/src/export/session-export.ts +0 -1
- package/src/git/index.ts +0 -1
- package/src/git/service.ts +0 -414
- package/src/hooks/chain-engine.ts +0 -414
- package/src/hooks/dispatcher.ts +0 -414
- package/src/hooks/hook-api.ts +0 -170
- package/src/hooks/index.ts +0 -48
- package/src/hooks/runners/agent.ts +0 -93
- package/src/hooks/runners/prompt.ts +0 -69
- package/src/hooks/workbench.ts +0 -360
- package/src/integrations/index.ts +0 -42
- package/src/integrations/notifier.ts +0 -206
- package/src/integrations/webhooks.ts +0 -1
- package/src/knowledge/consolidation.ts +0 -346
- package/src/knowledge/graphql.ts +0 -324
- package/src/knowledge/index.ts +0 -60
- package/src/knowledge/ingest-compile.ts +0 -386
- package/src/knowledge/ingest-context.ts +0 -18
- package/src/knowledge/ingest-inputs.ts +0 -387
- package/src/knowledge/ingest.ts +0 -1
- package/src/knowledge/internal.ts +0 -257
- package/src/knowledge/knowledge-api.ts +0 -432
- package/src/knowledge/lint.ts +0 -121
- package/src/knowledge/memory-sync.ts +0 -62
- package/src/knowledge/packet.ts +0 -370
- package/src/knowledge/scheduling.ts +0 -283
- package/src/knowledge/service.ts +0 -715
- package/src/mcp/client.ts +0 -383
- package/src/mcp/index.ts +0 -12
- package/src/mcp/mcp-api.ts +0 -90
- package/src/mcp/registry.ts +0 -1
- package/src/media/builtin-image-understanding.ts +0 -303
- package/src/media/builtin-providers.ts +0 -26
- package/src/media/index.ts +0 -18
- package/src/multimodal/index.ts +0 -13
- package/src/multimodal/service.ts +0 -492
- package/src/permissions/briefs/build.ts +0 -88
- package/src/permissions/manager.ts +0 -1
- package/src/plugins/api.ts +0 -383
- package/src/plugins/manager.ts +0 -481
- package/src/profiles/shape.ts +0 -58
- package/src/providers/amazon-bedrock-mantle.ts +0 -50
- package/src/providers/amazon-bedrock.ts +0 -61
- package/src/providers/anthropic-compat.ts +0 -373
- package/src/providers/anthropic-sdk-provider.ts +0 -230
- package/src/providers/anthropic-vertex.ts +0 -59
- package/src/providers/anthropic.ts +0 -469
- package/src/providers/auto-register.ts +0 -417
- package/src/providers/builtin-catalog.ts +0 -326
- package/src/providers/builtin-registry.ts +0 -575
- package/src/providers/cache-planner.ts +0 -258
- package/src/providers/capabilities.ts +0 -1
- package/src/providers/custom-loader.ts +0 -425
- package/src/providers/discovered-compat.ts +0 -7
- package/src/providers/discovered-factory.ts +0 -61
- package/src/providers/discovered-traits.ts +0 -138
- package/src/providers/gemini.ts +0 -462
- package/src/providers/github-copilot.ts +0 -254
- package/src/providers/index.ts +0 -1
- package/src/providers/interface.ts +0 -185
- package/src/providers/llama-cpp.ts +0 -402
- package/src/providers/lm-studio-helpers.ts +0 -367
- package/src/providers/lm-studio.ts +0 -484
- package/src/providers/model-catalog-cache.ts +0 -221
- package/src/providers/model-catalog-notifications.ts +0 -97
- package/src/providers/model-catalog-synthetic.ts +0 -202
- package/src/providers/model-catalog.ts +0 -211
- package/src/providers/model-limits.ts +0 -1
- package/src/providers/ollama.ts +0 -469
- package/src/providers/openai-codex.ts +0 -472
- package/src/providers/openai-compat.ts +0 -615
- package/src/providers/openai.ts +0 -231
- package/src/providers/optimizer.ts +0 -1
- package/src/providers/provider-api.ts +0 -1
- package/src/providers/registry-helpers.ts +0 -34
- package/src/providers/registry-models.ts +0 -77
- package/src/providers/registry-types.ts +0 -67
- package/src/providers/registry.ts +0 -1
- package/src/providers/runtime-metadata.ts +0 -149
- package/src/providers/runtime-snapshot.ts +0 -130
- package/src/providers/synthetic.ts +0 -561
- package/src/providers/tier-prompts.ts +0 -84
- package/src/providers/tool-formats.ts +0 -414
- package/src/runtime/auth/inspection.ts +0 -125
- package/src/runtime/bootstrap-background.ts +0 -157
- package/src/runtime/bootstrap-helpers.ts +0 -88
- package/src/runtime/bootstrap-runtime-events.ts +0 -254
- package/src/runtime/bootstrap-services.ts +0 -197
- package/src/runtime/compaction/index.ts +0 -1
- package/src/runtime/compaction/lifecycle.ts +0 -1
- package/src/runtime/compaction/manager.ts +0 -474
- package/src/runtime/compaction/quality-score.ts +0 -1
- package/src/runtime/compaction/resume-repair.ts +0 -1
- package/src/runtime/compaction/strategies/autocompact.ts +0 -1
- package/src/runtime/compaction/strategies/boundary-commit.ts +0 -1
- package/src/runtime/compaction/strategies/collapse.ts +0 -1
- package/src/runtime/compaction/strategies/index.ts +0 -1
- package/src/runtime/compaction/strategies/microcompact.ts +0 -1
- package/src/runtime/compaction/strategies/reactive.ts +0 -1
- package/src/runtime/compaction/types.ts +0 -1
- package/src/runtime/ecosystem/recommendations.ts +0 -117
- package/src/runtime/emitters/agents.ts +0 -96
- package/src/runtime/emitters/automation.ts +0 -112
- package/src/runtime/emitters/communication.ts +0 -53
- package/src/runtime/emitters/compaction.ts +0 -161
- package/src/runtime/emitters/control-plane.ts +0 -65
- package/src/runtime/emitters/deliveries.ts +0 -65
- package/src/runtime/emitters/forensics.ts +0 -17
- package/src/runtime/emitters/index.ts +0 -59
- package/src/runtime/emitters/knowledge.ts +0 -129
- package/src/runtime/emitters/mcp.ts +0 -95
- package/src/runtime/emitters/ops.ts +0 -163
- package/src/runtime/emitters/orchestration.ts +0 -87
- package/src/runtime/emitters/permissions.ts +0 -98
- package/src/runtime/emitters/planner.ts +0 -23
- package/src/runtime/emitters/plugins.ts +0 -78
- package/src/runtime/emitters/providers.ts +0 -30
- package/src/runtime/emitters/routes.ts +0 -57
- package/src/runtime/emitters/security.ts +0 -53
- package/src/runtime/emitters/session.ts +0 -93
- package/src/runtime/emitters/surfaces.ts +0 -57
- package/src/runtime/emitters/tasks.ts +0 -69
- package/src/runtime/emitters/tools.ts +0 -140
- package/src/runtime/emitters/transport.ts +0 -78
- package/src/runtime/emitters/turn.ts +0 -155
- package/src/runtime/emitters/ui.ts +0 -57
- package/src/runtime/emitters/watchers.ts +0 -57
- package/src/runtime/emitters/workflows.ts +0 -79
- package/src/runtime/eval/index.ts +0 -48
- package/src/runtime/eval/runner.ts +0 -163
- package/src/runtime/eval/suites.ts +0 -264
- package/src/runtime/events/domain-map.ts +0 -148
- package/src/runtime/events/index.ts +0 -1
- package/src/runtime/events/turn.ts +0 -1
- package/src/runtime/events/workflows.ts +0 -1
- package/src/runtime/forensics/collector.ts +0 -693
- package/src/runtime/forensics/index.ts +0 -23
- package/src/runtime/foundation-clients.ts +0 -78
- package/src/runtime/foundation-services.ts +0 -96
- package/src/runtime/guidance.ts +0 -183
- package/src/runtime/health/effect-handlers.ts +0 -189
- package/src/runtime/health/index.ts +0 -70
- package/src/runtime/health/wiring.ts +0 -115
- package/src/runtime/integration/helpers.ts +0 -640
- package/src/runtime/lifecycle.ts +0 -107
- package/src/runtime/mcp/index.ts +0 -68
- package/src/runtime/mcp/manager.ts +0 -513
- package/src/runtime/network/inbound.ts +0 -131
- package/src/runtime/network/index.ts +0 -30
- package/src/runtime/network/outbound.ts +0 -292
- package/src/runtime/network/shared.ts +0 -82
- package/src/runtime/operator-client.ts +0 -235
- package/src/runtime/ops/control-plane.ts +0 -363
- package/src/runtime/ops/index.ts +0 -122
- package/src/runtime/ops/playbooks/index.ts +0 -10
- package/src/runtime/ops/playbooks/session-unrecoverable.ts +0 -196
- package/src/runtime/ops/playbooks/stuck-turn.ts +0 -197
- package/src/runtime/ops/runtime-context.ts +0 -100
- package/src/runtime/ops-api.ts +0 -27
- package/src/runtime/orchestration/spawn-policy.ts +0 -83
- package/src/runtime/peer-client.ts +0 -404
- package/src/runtime/perf/index.ts +0 -57
- package/src/runtime/perf/slo-collector.ts +0 -375
- package/src/runtime/permissions/index.ts +0 -190
- package/src/runtime/permissions/policy-runtime.ts +0 -1
- package/src/runtime/permissions/preflight.ts +0 -101
- package/src/runtime/permissions/rule-suggestions.ts +0 -36
- package/src/runtime/plugins/hot-reload.ts +0 -221
- package/src/runtime/plugins/index.ts +0 -84
- package/src/runtime/plugins/lifecycle.ts +0 -95
- package/src/runtime/plugins/manager.ts +0 -474
- package/src/runtime/plugins/manifest.ts +0 -167
- package/src/runtime/plugins/quarantine.ts +0 -202
- package/src/runtime/plugins/trust.ts +0 -291
- package/src/runtime/plugins/types.ts +0 -205
- package/src/runtime/provider-accounts/registry.ts +0 -326
- package/src/runtime/remote/distributed-runtime-contract-schemas.ts +0 -386
- package/src/runtime/remote/index.ts +0 -488
- package/src/runtime/remote/runner-registry.ts +0 -438
- package/src/runtime/remote/supervisor.ts +0 -70
- package/src/runtime/runtime-hook-api.ts +0 -5
- package/src/runtime/runtime-knowledge-api.ts +0 -14
- package/src/runtime/runtime-mcp-api.ts +0 -5
- package/src/runtime/runtime-ops-api.ts +0 -86
- package/src/runtime/runtime-provider-api.ts +0 -18
- package/src/runtime/session-maintenance.ts +0 -188
- package/src/runtime/session-persistence.ts +0 -288
- package/src/runtime/session-return-context.ts +0 -195
- package/src/runtime/settings/control-plane-store.ts +0 -258
- package/src/runtime/settings/control-plane.ts +0 -599
- package/src/runtime/shell-command-extensions.ts +0 -54
- package/src/runtime/shell-command-ops.ts +0 -207
- package/src/runtime/shell-command-platform.ts +0 -47
- package/src/runtime/shell-command-services.ts +0 -143
- package/src/runtime/shell-command-workspace.ts +0 -31
- package/src/runtime/tasks/adapters/acp-adapter.ts +0 -211
- package/src/runtime/tasks/adapters/agent-adapter.ts +0 -208
- package/src/runtime/tasks/adapters/index.ts +0 -16
- package/src/runtime/tasks/adapters/process-adapter.ts +0 -214
- package/src/runtime/tasks/adapters/scheduler-adapter.ts +0 -193
- package/src/runtime/tasks/index.ts +0 -68
- package/src/runtime/tasks/manager.ts +0 -415
- package/src/runtime/telemetry/api-helpers.ts +0 -517
- package/src/runtime/telemetry/api.ts +0 -768
- package/src/runtime/telemetry/index.ts +0 -178
- package/src/runtime/telemetry/instrumentation/domain-bridge-agent-session.ts +0 -440
- package/src/runtime/telemetry/instrumentation/domain-bridge-plugin-mcp.ts +0 -200
- package/src/runtime/telemetry/instrumentation/domain-bridge-shared.ts +0 -18
- package/src/runtime/telemetry/instrumentation/domain-bridge-transport-task.ts +0 -204
- package/src/runtime/telemetry/instrumentation/domain-bridge.ts +0 -125
- package/src/runtime/telemetry/instrumentation/index.ts +0 -67
- package/src/runtime/tools/context.ts +0 -114
- package/src/runtime/tools/index.ts +0 -46
- package/src/runtime/tools/phased-executor.ts +0 -448
- package/src/runtime/tools/phases/budget.ts +0 -130
- package/src/runtime/tools/phases/execute.ts +0 -69
- package/src/runtime/tools/phases/index.ts +0 -13
- package/src/runtime/tools/phases/map-output.ts +0 -98
- package/src/runtime/tools/phases/permission.ts +0 -133
- package/src/runtime/tools/phases/posthook.ts +0 -57
- package/src/runtime/tools/phases/prehook.ts +0 -68
- package/src/runtime/tools/phases/validate.ts +0 -53
- package/src/runtime/transports/direct.ts +0 -73
- package/src/runtime/transports/http-helpers.ts +0 -218
- package/src/runtime/transports/http-types.ts +0 -364
- package/src/runtime/transports/http.ts +0 -629
- package/src/runtime/transports/realtime.ts +0 -50
- package/src/runtime/transports/remote-events.ts +0 -16
- package/src/runtime/transports/shared.ts +0 -39
- package/src/runtime/transports/ui-runtime-events.ts +0 -35
- package/src/runtime/ui-events.ts +0 -46
- package/src/runtime/worktree/registry.ts +0 -252
- package/src/sessions/manager.ts +0 -14
- package/src/state/file-watcher.ts +0 -294
- package/src/state/index.ts +0 -56
- package/src/state/knowledge-injection.ts +0 -214
- package/src/state/memory-embedding-http.ts +0 -642
- package/src/state/memory-embeddings.ts +0 -312
- package/src/state/memory-ingest.ts +0 -132
- package/src/state/memory-registry.ts +0 -111
- package/src/state/memory-store-helpers.ts +0 -160
- package/src/state/memory-store.ts +0 -728
- package/src/state/memory-vector-store.ts +0 -418
- package/src/templates/manager.ts +0 -187
- package/src/tools/agent/index.ts +0 -610
- package/src/tools/agent/manager.ts +0 -476
- package/src/tools/analyze/git-modes.ts +0 -380
- package/src/tools/analyze/index.ts +0 -128
- package/src/tools/channel/agent-tools.ts +0 -16
- package/src/tools/channel/index.ts +0 -268
- package/src/tools/control/index.ts +0 -90
- package/src/tools/edit/core.ts +0 -619
- package/src/tools/edit/index.ts +0 -4
- package/src/tools/edit/phased.ts +0 -33
- package/src/tools/fetch/index.ts +0 -3
- package/src/tools/fetch/phased.ts +0 -34
- package/src/tools/fetch/runtime.ts +0 -499
- package/src/tools/mcp/index.ts +0 -190
- package/src/tools/remote-trigger/index.ts +0 -130
- package/src/tools/shared/auto-heal.ts +0 -282
- package/src/tools/state/index.ts +0 -688
- package/src/tools/web-search/index.ts +0 -38
- package/src/tools/write/index.ts +0 -604
- package/src/tools/write/phased.ts +0 -41
- package/src/types/generated/foundation-client-types.ts +0 -22
- package/src/watchers/index.ts +0 -11
- package/src/watchers/registry.ts +0 -517
- package/src/web-search/index.ts +0 -26
- package/src/web-search/provider-registry.ts +0 -64
- package/src/web-search/providers/brave.ts +0 -100
- package/src/web-search/providers/duckduckgo.ts +0 -270
- package/src/web-search/providers/exa.ts +0 -77
- package/src/web-search/providers/firecrawl.ts +0 -90
- package/src/web-search/providers/perplexity.ts +0 -86
- package/src/web-search/providers/searxng.ts +0 -88
- package/src/web-search/providers/shared.ts +0 -249
- package/src/web-search/providers/tavily.ts +0 -90
- package/src/web-search/service.ts +0 -142
package/src/tools/edit/core.ts
DELETED
|
@@ -1,619 +0,0 @@
|
|
|
1
|
-
import { readFileSync, writeFileSync } from 'node:fs';
|
|
2
|
-
import { relative } from 'node:path';
|
|
3
|
-
import type { Tool, ToolDefinition } from '@pellux/goodvibes-sdk/platform/types/tools';
|
|
4
|
-
import { logger } from '@pellux/goodvibes-sdk/platform/utils/logger';
|
|
5
|
-
import type { SessionChangeTracker } from '@pellux/goodvibes-sdk/platform/sessions/change-tracker';
|
|
6
|
-
import { FileUndoManager } from '@pellux/goodvibes-sdk/platform/state/file-undo';
|
|
7
|
-
import { FileStateCache, unifiedDiff } from '@pellux/goodvibes-sdk/platform/state/file-cache';
|
|
8
|
-
import type { ConfigManager } from '@pellux/goodvibes-sdk/platform/config/manager';
|
|
9
|
-
import type { ToolLLM } from '@pellux/goodvibes-sdk/platform/config/tool-llm';
|
|
10
|
-
import { resolveAndValidatePath } from '@pellux/goodvibes-sdk/platform/utils/path-safety';
|
|
11
|
-
import { editSchema } from '@pellux/goodvibes-sdk/platform/tools/edit/schema';
|
|
12
|
-
import { AutoHealer } from '@pellux/goodvibes-sdk/platform/tools/shared/auto-heal';
|
|
13
|
-
import { ImportGraph } from '@pellux/goodvibes-sdk/platform/intelligence/index';
|
|
14
|
-
import {
|
|
15
|
-
buildFailedEditResult,
|
|
16
|
-
classifyEditFailure,
|
|
17
|
-
computeAstEdit,
|
|
18
|
-
computeAstPatternEdit,
|
|
19
|
-
computeSingleEdit,
|
|
20
|
-
} from '@pellux/goodvibes-sdk/platform/tools/edit/match';
|
|
21
|
-
import type {
|
|
22
|
-
EditInput,
|
|
23
|
-
EditItem,
|
|
24
|
-
EditResult,
|
|
25
|
-
EditResultStatus,
|
|
26
|
-
ValidatorName,
|
|
27
|
-
} from '@pellux/goodvibes-sdk/platform/tools/edit/types';
|
|
28
|
-
import { executeNotebookEdit } from '@pellux/goodvibes-sdk/platform/tools/edit/notebook';
|
|
29
|
-
import { summarizeError } from '@pellux/goodvibes-sdk/platform/utils/error-display';
|
|
30
|
-
|
|
31
|
-
const DIFF_TRUNCATE_THRESHOLD = 5000;
|
|
32
|
-
const DIFF_PREVIEW_LENGTH = 500;
|
|
33
|
-
const VALIDATOR_COMMANDS: Record<ValidatorName, string[]> = {
|
|
34
|
-
typecheck: ['npx', 'tsc', '--noEmit'],
|
|
35
|
-
lint: ['npx', 'eslint', '--no-error-on-unmatched-pattern'],
|
|
36
|
-
test: ['bun', 'test'],
|
|
37
|
-
build: ['bun', 'run', 'build'],
|
|
38
|
-
};
|
|
39
|
-
|
|
40
|
-
interface ValidatorResult {
|
|
41
|
-
validator: ValidatorName;
|
|
42
|
-
passed: boolean;
|
|
43
|
-
stdout: string;
|
|
44
|
-
stderr: string;
|
|
45
|
-
exitCode: number;
|
|
46
|
-
}
|
|
47
|
-
|
|
48
|
-
async function runValidator(name: ValidatorName, cwd: string): Promise<ValidatorResult> {
|
|
49
|
-
const cmd = VALIDATOR_COMMANDS[name];
|
|
50
|
-
const TIMEOUT_MS = 30_000;
|
|
51
|
-
const proc = Bun.spawn(cmd, { cwd, stdout: 'pipe', stderr: 'pipe' });
|
|
52
|
-
let timedOut = false;
|
|
53
|
-
const timeoutHandle = setTimeout(() => {
|
|
54
|
-
timedOut = true;
|
|
55
|
-
proc.kill();
|
|
56
|
-
}, TIMEOUT_MS);
|
|
57
|
-
|
|
58
|
-
const [exitCode, stdoutBuf, stderrBuf] = await Promise.all([
|
|
59
|
-
proc.exited,
|
|
60
|
-
new Response(proc.stdout).text(),
|
|
61
|
-
new Response(proc.stderr).text(),
|
|
62
|
-
]);
|
|
63
|
-
|
|
64
|
-
clearTimeout(timeoutHandle);
|
|
65
|
-
|
|
66
|
-
if (timedOut) {
|
|
67
|
-
return {
|
|
68
|
-
validator: name,
|
|
69
|
-
passed: false,
|
|
70
|
-
stdout: '',
|
|
71
|
-
stderr: `Validator '${name}' timed out after ${TIMEOUT_MS}ms`,
|
|
72
|
-
exitCode: -1,
|
|
73
|
-
};
|
|
74
|
-
}
|
|
75
|
-
|
|
76
|
-
return { validator: name, passed: exitCode === 0, stdout: stdoutBuf, stderr: stderrBuf, exitCode };
|
|
77
|
-
}
|
|
78
|
-
|
|
79
|
-
async function runValidators(validators: ValidatorName[], cwd: string): Promise<ValidatorResult | null> {
|
|
80
|
-
for (const name of validators) {
|
|
81
|
-
const result = await runValidator(name, cwd);
|
|
82
|
-
if (!result.passed) return result;
|
|
83
|
-
}
|
|
84
|
-
return null;
|
|
85
|
-
}
|
|
86
|
-
|
|
87
|
-
function formatValidatorFailure(result: ValidatorResult): string {
|
|
88
|
-
const parts = [`Validator '${result.validator}' failed (exit ${result.exitCode}):`];
|
|
89
|
-
if (result.stderr.trim()) parts.push(result.stderr.trim());
|
|
90
|
-
if (result.stdout.trim()) parts.push(result.stdout.trim());
|
|
91
|
-
return parts.join('\n');
|
|
92
|
-
}
|
|
93
|
-
|
|
94
|
-
interface EditExecutionContext {
|
|
95
|
-
fileCache: FileStateCache;
|
|
96
|
-
cwd: string;
|
|
97
|
-
fileUndoManager?: FileUndoManager;
|
|
98
|
-
configManager?: Pick<ConfigManager, 'get' | 'getWorkingDirectory'>;
|
|
99
|
-
toolLLM?: Pick<ToolLLM, 'chat'>;
|
|
100
|
-
changeTracker?: Pick<SessionChangeTracker, 'recordChange'>;
|
|
101
|
-
}
|
|
102
|
-
|
|
103
|
-
interface ResolvedTextEditInput {
|
|
104
|
-
resolvedPaths: Map<string, string>;
|
|
105
|
-
fileContents: Map<string, string>;
|
|
106
|
-
fileReadErrors: Map<string, string>;
|
|
107
|
-
workingContents: Map<string, string>;
|
|
108
|
-
}
|
|
109
|
-
|
|
110
|
-
interface PostValidationRepairResult {
|
|
111
|
-
healed: boolean;
|
|
112
|
-
}
|
|
113
|
-
|
|
114
|
-
function prepareTextEditInput(
|
|
115
|
-
input: EditInput,
|
|
116
|
-
env: EditExecutionContext,
|
|
117
|
-
transactionMode: 'atomic' | 'partial' | 'none',
|
|
118
|
-
): ResolvedTextEditInput | { error: string } {
|
|
119
|
-
const resolvedPaths: Map<string, string> = new Map();
|
|
120
|
-
for (const item of input.edits!) {
|
|
121
|
-
if (resolvedPaths.has(item.path)) continue;
|
|
122
|
-
try {
|
|
123
|
-
resolvedPaths.set(item.path, resolveAndValidatePath(item.path, env.cwd));
|
|
124
|
-
} catch (err) {
|
|
125
|
-
const msg = summarizeError(err);
|
|
126
|
-
if (transactionMode === 'atomic') {
|
|
127
|
-
return { error: `Path error for '${item.path}': ${msg}` };
|
|
128
|
-
}
|
|
129
|
-
}
|
|
130
|
-
}
|
|
131
|
-
|
|
132
|
-
const uniquePaths = new Set(input.edits!.map((e) => resolvedPaths.get(e.path) ?? e.path));
|
|
133
|
-
const fileContents: Map<string, string> = new Map();
|
|
134
|
-
const fileReadErrors: Map<string, string> = new Map();
|
|
135
|
-
|
|
136
|
-
for (const resolvedPath of uniquePaths) {
|
|
137
|
-
const cacheResult = env.fileCache.lookup(resolvedPath);
|
|
138
|
-
if (cacheResult.status === 'modified') {
|
|
139
|
-
const msg = `OCC conflict: '${resolvedPath}' was modified externally since last read`;
|
|
140
|
-
if (transactionMode === 'atomic') {
|
|
141
|
-
return { error: msg };
|
|
142
|
-
}
|
|
143
|
-
fileReadErrors.set(resolvedPath, msg);
|
|
144
|
-
continue;
|
|
145
|
-
}
|
|
146
|
-
|
|
147
|
-
try {
|
|
148
|
-
const content = readFileSync(resolvedPath, 'utf-8');
|
|
149
|
-
fileContents.set(resolvedPath, content);
|
|
150
|
-
} catch {
|
|
151
|
-
const msg = `File not found or unreadable: '${resolvedPath}'`;
|
|
152
|
-
if (transactionMode === 'atomic') {
|
|
153
|
-
return { error: msg };
|
|
154
|
-
}
|
|
155
|
-
fileReadErrors.set(resolvedPath, msg);
|
|
156
|
-
}
|
|
157
|
-
}
|
|
158
|
-
|
|
159
|
-
return {
|
|
160
|
-
resolvedPaths,
|
|
161
|
-
fileContents,
|
|
162
|
-
fileReadErrors,
|
|
163
|
-
workingContents: new Map(fileContents),
|
|
164
|
-
};
|
|
165
|
-
}
|
|
166
|
-
|
|
167
|
-
function writeSuccessfulTextEdits(
|
|
168
|
-
results: EditResult[],
|
|
169
|
-
resolvedPaths: Map<string, string>,
|
|
170
|
-
workingContents: Map<string, string>,
|
|
171
|
-
fileContents: Map<string, string>,
|
|
172
|
-
env: EditExecutionContext,
|
|
173
|
-
writtenPaths: Set<string>,
|
|
174
|
-
): void {
|
|
175
|
-
for (const r of results) {
|
|
176
|
-
if (!r.success) continue;
|
|
177
|
-
const resolvedPath = resolvedPaths.get(r.path);
|
|
178
|
-
if (!resolvedPath || writtenPaths.has(resolvedPath)) continue;
|
|
179
|
-
|
|
180
|
-
const newContent = workingContents.get(resolvedPath);
|
|
181
|
-
if (newContent === undefined) continue;
|
|
182
|
-
|
|
183
|
-
try {
|
|
184
|
-
writeFileSync(resolvedPath, newContent, 'utf-8');
|
|
185
|
-
env.fileCache.update(resolvedPath, newContent);
|
|
186
|
-
writtenPaths.add(resolvedPath);
|
|
187
|
-
if (env.fileUndoManager) {
|
|
188
|
-
try {
|
|
189
|
-
const originalContent = fileContents.get(resolvedPath) ?? null;
|
|
190
|
-
env.fileUndoManager.snapshot({
|
|
191
|
-
path: resolvedPath,
|
|
192
|
-
beforeContent: originalContent,
|
|
193
|
-
afterContent: newContent,
|
|
194
|
-
tool: 'edit',
|
|
195
|
-
});
|
|
196
|
-
} catch {
|
|
197
|
-
// Non-fatal
|
|
198
|
-
}
|
|
199
|
-
}
|
|
200
|
-
env.changeTracker?.recordChange(resolvedPath);
|
|
201
|
-
} catch (err) {
|
|
202
|
-
const msg = `Write failed for '${resolvedPath}': ${summarizeError(err)}`;
|
|
203
|
-
for (const res of results) {
|
|
204
|
-
if (res.path === r.path) {
|
|
205
|
-
res.success = false;
|
|
206
|
-
res.error = msg;
|
|
207
|
-
}
|
|
208
|
-
}
|
|
209
|
-
}
|
|
210
|
-
}
|
|
211
|
-
}
|
|
212
|
-
|
|
213
|
-
async function buildImportGraphWarning(cwd: string, writtenPaths: Set<string>): Promise<string | undefined> {
|
|
214
|
-
try {
|
|
215
|
-
const graph = new ImportGraph();
|
|
216
|
-
graph.markDirty();
|
|
217
|
-
await graph.build(cwd);
|
|
218
|
-
|
|
219
|
-
const editedAbsPaths = [...writtenPaths];
|
|
220
|
-
const affectedSet = new Set<string>();
|
|
221
|
-
for (const edited of editedAbsPaths) {
|
|
222
|
-
for (const dep of graph.findTransitiveDependents(edited)) {
|
|
223
|
-
affectedSet.add(dep);
|
|
224
|
-
}
|
|
225
|
-
}
|
|
226
|
-
for (const edited of editedAbsPaths) {
|
|
227
|
-
affectedSet.delete(edited);
|
|
228
|
-
}
|
|
229
|
-
|
|
230
|
-
if (affectedSet.size === 0) return undefined;
|
|
231
|
-
|
|
232
|
-
const affectedList = Array.from(affectedSet);
|
|
233
|
-
const proc = Bun.spawn(['/bin/sh', '-c', `npx tsc --noEmit ${affectedList.join(' ')}`], {
|
|
234
|
-
cwd,
|
|
235
|
-
stdout: 'pipe',
|
|
236
|
-
stderr: 'pipe',
|
|
237
|
-
});
|
|
238
|
-
const [exitCode, stdoutText, stderrText] = await Promise.all([
|
|
239
|
-
proc.exited,
|
|
240
|
-
new Response(proc.stdout).text(),
|
|
241
|
-
new Response(proc.stderr).text(),
|
|
242
|
-
]);
|
|
243
|
-
if (exitCode === 0) return undefined;
|
|
244
|
-
|
|
245
|
-
const relAffected = affectedList.map((f) => relative(cwd, f));
|
|
246
|
-
const outputLines = (stderrText + '\n' + stdoutText)
|
|
247
|
-
.split('\n')
|
|
248
|
-
.filter((line) => relAffected.some((rel) => line.includes(rel)));
|
|
249
|
-
if (outputLines.length > 0) {
|
|
250
|
-
return `\n⚠ Import graph: ${affectedSet.size} transitive dependent(s) affected by this edit — type errors detected in downstream files:\n${outputLines.join('\n')}`;
|
|
251
|
-
}
|
|
252
|
-
return `\n⚠ Import graph: ${affectedSet.size} transitive dependent(s) affected. tsc reported errors outside the affected set — check unrelated files.`;
|
|
253
|
-
} catch (err) {
|
|
254
|
-
logger.warn('[import-graph] Import graph tracing failed', { error: summarizeError(err) });
|
|
255
|
-
return undefined;
|
|
256
|
-
}
|
|
257
|
-
}
|
|
258
|
-
|
|
259
|
-
function restoreOriginalContents(fileContents: Map<string, string>, env: EditExecutionContext): void {
|
|
260
|
-
for (const [resolvedPath, originalContent] of fileContents) {
|
|
261
|
-
try {
|
|
262
|
-
writeFileSync(resolvedPath, originalContent, 'utf-8');
|
|
263
|
-
env.fileCache.update(resolvedPath, originalContent);
|
|
264
|
-
} catch {
|
|
265
|
-
// Best-effort rollback
|
|
266
|
-
}
|
|
267
|
-
}
|
|
268
|
-
}
|
|
269
|
-
|
|
270
|
-
async function repairAfterValidationFailure(
|
|
271
|
-
fileContents: Map<string, string>,
|
|
272
|
-
workingContents: Map<string, string>,
|
|
273
|
-
failureMessages: string[],
|
|
274
|
-
env: EditExecutionContext,
|
|
275
|
-
): Promise<PostValidationRepairResult> {
|
|
276
|
-
let healed = false;
|
|
277
|
-
for (const [resolvedPath, originalContent] of fileContents) {
|
|
278
|
-
const newContent = workingContents.get(resolvedPath);
|
|
279
|
-
if (newContent === undefined || newContent === originalContent) continue;
|
|
280
|
-
const healResult = env.configManager && env.toolLLM
|
|
281
|
-
? await new AutoHealer(env.configManager, env.toolLLM).heal(resolvedPath, newContent, failureMessages)
|
|
282
|
-
: { healed: false, content: newContent };
|
|
283
|
-
if (healResult.healed) {
|
|
284
|
-
try {
|
|
285
|
-
writeFileSync(resolvedPath, healResult.content, 'utf-8');
|
|
286
|
-
env.fileCache.update(resolvedPath, healResult.content);
|
|
287
|
-
healed = true;
|
|
288
|
-
} catch {
|
|
289
|
-
// Best-effort heal write
|
|
290
|
-
}
|
|
291
|
-
}
|
|
292
|
-
}
|
|
293
|
-
return { healed };
|
|
294
|
-
}
|
|
295
|
-
|
|
296
|
-
async function validateAfterTextEdits(
|
|
297
|
-
validators: ValidatorName[],
|
|
298
|
-
cwd: string,
|
|
299
|
-
transactionMode: 'atomic' | 'partial' | 'none',
|
|
300
|
-
fileContents: Map<string, string>,
|
|
301
|
-
workingContents: Map<string, string>,
|
|
302
|
-
env: EditExecutionContext,
|
|
303
|
-
): Promise<{ error?: string }> {
|
|
304
|
-
const failure = await runValidators(validators, cwd);
|
|
305
|
-
if (!failure) return {};
|
|
306
|
-
|
|
307
|
-
const failureMessages = [formatValidatorFailure(failure)];
|
|
308
|
-
const repair = await repairAfterValidationFailure(fileContents, workingContents, failureMessages, env);
|
|
309
|
-
if (repair.healed) {
|
|
310
|
-
const healFailure = await runValidators(validators, cwd);
|
|
311
|
-
if (!healFailure) {
|
|
312
|
-
return {};
|
|
313
|
-
}
|
|
314
|
-
}
|
|
315
|
-
|
|
316
|
-
if (transactionMode === 'atomic') {
|
|
317
|
-
restoreOriginalContents(fileContents, env);
|
|
318
|
-
}
|
|
319
|
-
return {
|
|
320
|
-
error: `Post-edit validation failed${transactionMode === 'atomic' ? ' — edits rolled back' : ''}. ${formatValidatorFailure(failure)}`,
|
|
321
|
-
};
|
|
322
|
-
}
|
|
323
|
-
|
|
324
|
-
function formatOutput(results: EditResult[], format: 'count_only' | 'minimal' | 'with_diff' | 'verbose', dryRun: boolean): string {
|
|
325
|
-
const totalApplied = results.filter((r) => r.success).length;
|
|
326
|
-
const totalFailed = results.filter((r) => !r.success).length;
|
|
327
|
-
const dryTag = dryRun ? ' (dry run)' : '';
|
|
328
|
-
|
|
329
|
-
if (format === 'count_only') {
|
|
330
|
-
return JSON.stringify({ applied: totalApplied, failed: totalFailed, dry_run: dryRun });
|
|
331
|
-
}
|
|
332
|
-
|
|
333
|
-
const lines: string[] = [];
|
|
334
|
-
lines.push(`Edits applied: ${totalApplied}, failed: ${totalFailed}${dryTag}`);
|
|
335
|
-
|
|
336
|
-
if (format === 'minimal') {
|
|
337
|
-
for (const r of results) {
|
|
338
|
-
if (r.success) {
|
|
339
|
-
const id = r.id ? ` [${r.id}]` : '';
|
|
340
|
-
const statusTag = r.status ? ` [${r.status}]` : '';
|
|
341
|
-
lines.push(` OK${statusTag}${id}: ${r.path} (${r.occurrencesReplaced} replacement(s))`);
|
|
342
|
-
if (r.warning) {
|
|
343
|
-
lines.push(` WARN: ${r.warning}`);
|
|
344
|
-
}
|
|
345
|
-
} else {
|
|
346
|
-
const id = r.id ? ` [${r.id}]` : '';
|
|
347
|
-
const statusTag = r.status ? ` [${r.status}]` : '';
|
|
348
|
-
lines.push(` FAIL${statusTag}${id}: ${r.path} — ${r.error}`);
|
|
349
|
-
if (r.hint) {
|
|
350
|
-
lines.push(` HINT: ${r.hint}`);
|
|
351
|
-
}
|
|
352
|
-
}
|
|
353
|
-
}
|
|
354
|
-
return lines.join('\n');
|
|
355
|
-
}
|
|
356
|
-
|
|
357
|
-
for (const r of results) {
|
|
358
|
-
const id = r.id ? ` [${r.id}]` : '';
|
|
359
|
-
if (r.success) {
|
|
360
|
-
const statusTag = r.status ? ` [${r.status}]` : '';
|
|
361
|
-
lines.push(`\n--- ${r.path}${id}${statusTag} (${r.occurrencesReplaced} replacement(s))${dryTag} ---`);
|
|
362
|
-
if (r.diff) {
|
|
363
|
-
if (r.diff_truncated) {
|
|
364
|
-
lines.push(`[diff truncated — showing first ${DIFF_PREVIEW_LENGTH} chars]`);
|
|
365
|
-
lines.push(r.diff_preview ?? r.diff.slice(0, DIFF_PREVIEW_LENGTH));
|
|
366
|
-
} else {
|
|
367
|
-
lines.push(r.diff);
|
|
368
|
-
}
|
|
369
|
-
}
|
|
370
|
-
if (r.warning) {
|
|
371
|
-
lines.push(` WARN: ${r.warning}`);
|
|
372
|
-
}
|
|
373
|
-
} else {
|
|
374
|
-
const statusTag = r.status ? ` [${r.status}]` : '';
|
|
375
|
-
lines.push(`\n--- ${r.path}${id}${statusTag} FAILED ---`);
|
|
376
|
-
lines.push(` Error: ${r.error}`);
|
|
377
|
-
if (r.hint) {
|
|
378
|
-
lines.push(` Hint: ${r.hint}`);
|
|
379
|
-
}
|
|
380
|
-
}
|
|
381
|
-
}
|
|
382
|
-
return lines.join('\n');
|
|
383
|
-
}
|
|
384
|
-
|
|
385
|
-
async function executeTextEdits(
|
|
386
|
-
input: EditInput,
|
|
387
|
-
env: EditExecutionContext,
|
|
388
|
-
): Promise<{ success: boolean; output?: string; error?: string }> {
|
|
389
|
-
const matchMode = input.match?.mode ?? 'exact';
|
|
390
|
-
const caseSensitive = input.match?.case_sensitive ?? true;
|
|
391
|
-
const whitespaceSensitive = input.match?.whitespace_sensitive ?? true;
|
|
392
|
-
const multiline = input.match?.multiline ?? false;
|
|
393
|
-
const transactionMode = input.transaction?.mode ?? 'atomic';
|
|
394
|
-
const outputFormat = input.output?.format ?? 'minimal';
|
|
395
|
-
const diffContext = input.output?.diff_context ?? 3;
|
|
396
|
-
const dryRun = input.dry_run ?? false;
|
|
397
|
-
const validateBefore = input.validate?.before ?? [];
|
|
398
|
-
const validateAfter = input.validate?.after ?? [];
|
|
399
|
-
const cwd = env.cwd;
|
|
400
|
-
|
|
401
|
-
if (!dryRun && validateBefore.length > 0) {
|
|
402
|
-
const failure = await runValidators(validateBefore, cwd);
|
|
403
|
-
if (failure) {
|
|
404
|
-
return { success: false, error: `Pre-edit validation failed. ${formatValidatorFailure(failure)}` };
|
|
405
|
-
}
|
|
406
|
-
}
|
|
407
|
-
|
|
408
|
-
const prepResult = prepareTextEditInput(input, env, transactionMode);
|
|
409
|
-
if ('error' in prepResult) {
|
|
410
|
-
return { success: false, error: prepResult.error };
|
|
411
|
-
}
|
|
412
|
-
|
|
413
|
-
const { resolvedPaths, fileContents, fileReadErrors, workingContents } = prepResult;
|
|
414
|
-
const results: EditResult[] = [];
|
|
415
|
-
let atomicFailed = false;
|
|
416
|
-
let atomicFailError = '';
|
|
417
|
-
|
|
418
|
-
for (const item of input.edits!) {
|
|
419
|
-
const resolvedPath = resolvedPaths.get(item.path);
|
|
420
|
-
|
|
421
|
-
if (!resolvedPath) {
|
|
422
|
-
results.push(buildFailedEditResult(item, `Path resolution failed for '${item.path}'`, 'failed'));
|
|
423
|
-
if (transactionMode === 'atomic') {
|
|
424
|
-
atomicFailed = true;
|
|
425
|
-
atomicFailError = `Path resolution failed for '${item.path}'`;
|
|
426
|
-
break;
|
|
427
|
-
}
|
|
428
|
-
continue;
|
|
429
|
-
}
|
|
430
|
-
|
|
431
|
-
if (fileReadErrors.has(resolvedPath)) {
|
|
432
|
-
const readErrMsg = fileReadErrors.get(resolvedPath)!;
|
|
433
|
-
results.push(buildFailedEditResult(item, readErrMsg, classifyEditFailure(readErrMsg)));
|
|
434
|
-
if (transactionMode === 'atomic') {
|
|
435
|
-
atomicFailed = true;
|
|
436
|
-
atomicFailError = readErrMsg;
|
|
437
|
-
break;
|
|
438
|
-
}
|
|
439
|
-
continue;
|
|
440
|
-
}
|
|
441
|
-
|
|
442
|
-
const currentContent = workingContents.get(resolvedPath);
|
|
443
|
-
if (currentContent === undefined) {
|
|
444
|
-
results.push(buildFailedEditResult(item, `No content available for '${resolvedPath}'`, 'failed'));
|
|
445
|
-
if (transactionMode === 'atomic') {
|
|
446
|
-
atomicFailed = true;
|
|
447
|
-
atomicFailError = `No content available for '${resolvedPath}'`;
|
|
448
|
-
break;
|
|
449
|
-
}
|
|
450
|
-
continue;
|
|
451
|
-
}
|
|
452
|
-
|
|
453
|
-
let editResult: { newContent: string; occurrencesReplaced: number; warning?: string } | { error: string; hint?: string };
|
|
454
|
-
if (matchMode === 'ast_pattern') {
|
|
455
|
-
editResult = await computeAstPatternEdit(currentContent, item, resolvedPath);
|
|
456
|
-
} else if (matchMode === 'ast') {
|
|
457
|
-
editResult = await computeAstEdit(currentContent, item, resolvedPath);
|
|
458
|
-
} else {
|
|
459
|
-
editResult = computeSingleEdit(currentContent, item, matchMode, caseSensitive, whitespaceSensitive, multiline);
|
|
460
|
-
}
|
|
461
|
-
|
|
462
|
-
if ('error' in editResult) {
|
|
463
|
-
const errMsg = editResult.error;
|
|
464
|
-
results.push({
|
|
465
|
-
...buildFailedEditResult(item, errMsg, classifyEditFailure(errMsg)),
|
|
466
|
-
hint: 'hint' in editResult ? editResult.hint : undefined,
|
|
467
|
-
});
|
|
468
|
-
if (transactionMode === 'atomic') {
|
|
469
|
-
atomicFailed = true;
|
|
470
|
-
atomicFailError = errMsg;
|
|
471
|
-
break;
|
|
472
|
-
}
|
|
473
|
-
continue;
|
|
474
|
-
}
|
|
475
|
-
|
|
476
|
-
const oldContent = currentContent;
|
|
477
|
-
workingContents.set(resolvedPath, editResult.newContent);
|
|
478
|
-
|
|
479
|
-
let diff: string | undefined;
|
|
480
|
-
let diffTruncated: boolean | undefined;
|
|
481
|
-
let diffPreview: string | undefined;
|
|
482
|
-
if (outputFormat === 'with_diff' || outputFormat === 'verbose' || dryRun) {
|
|
483
|
-
const rawDiff = unifiedDiff(oldContent, editResult.newContent, resolvedPath, diffContext);
|
|
484
|
-
if (rawDiff.length > DIFF_TRUNCATE_THRESHOLD) {
|
|
485
|
-
diffTruncated = true;
|
|
486
|
-
diffPreview = rawDiff.slice(0, DIFF_PREVIEW_LENGTH);
|
|
487
|
-
diff = diffPreview;
|
|
488
|
-
} else {
|
|
489
|
-
diff = rawDiff;
|
|
490
|
-
}
|
|
491
|
-
}
|
|
492
|
-
results.push({
|
|
493
|
-
id: item.id,
|
|
494
|
-
path: item.path,
|
|
495
|
-
success: true,
|
|
496
|
-
status: 'applied',
|
|
497
|
-
occurrencesReplaced: editResult.occurrencesReplaced,
|
|
498
|
-
diff,
|
|
499
|
-
diff_truncated: diffTruncated,
|
|
500
|
-
diff_preview: diffPreview,
|
|
501
|
-
warning: editResult.warning,
|
|
502
|
-
});
|
|
503
|
-
}
|
|
504
|
-
|
|
505
|
-
if (transactionMode === 'atomic' && atomicFailed) {
|
|
506
|
-
const atomicResults: EditResult[] = input.edits!.map((item, idx) => {
|
|
507
|
-
const r = results[idx];
|
|
508
|
-
if (r && !r.success) return r;
|
|
509
|
-
return {
|
|
510
|
-
id: item.id,
|
|
511
|
-
path: item.path,
|
|
512
|
-
success: false,
|
|
513
|
-
status: 'failed',
|
|
514
|
-
error: r?.success ? 'Rolled back due to atomic transaction failure' : (r?.error ?? atomicFailError),
|
|
515
|
-
};
|
|
516
|
-
});
|
|
517
|
-
return {
|
|
518
|
-
success: false,
|
|
519
|
-
error: `Atomic transaction failed: ${atomicFailError}`,
|
|
520
|
-
output: formatOutput(atomicResults, outputFormat, dryRun),
|
|
521
|
-
};
|
|
522
|
-
}
|
|
523
|
-
|
|
524
|
-
const writtenPaths = new Set<string>();
|
|
525
|
-
if (!dryRun) {
|
|
526
|
-
writeSuccessfulTextEdits(results, resolvedPaths, workingContents, fileContents, env, writtenPaths);
|
|
527
|
-
}
|
|
528
|
-
|
|
529
|
-
const anySuccess = results.some((r) => r.success);
|
|
530
|
-
|
|
531
|
-
let importGraphWarning: string | undefined;
|
|
532
|
-
if (!dryRun && anySuccess) {
|
|
533
|
-
importGraphWarning = await buildImportGraphWarning(cwd, writtenPaths);
|
|
534
|
-
}
|
|
535
|
-
|
|
536
|
-
if (!dryRun && anySuccess && validateAfter.length > 0) {
|
|
537
|
-
const validationResult = await validateAfterTextEdits(
|
|
538
|
-
validateAfter,
|
|
539
|
-
cwd,
|
|
540
|
-
transactionMode,
|
|
541
|
-
fileContents,
|
|
542
|
-
workingContents,
|
|
543
|
-
env,
|
|
544
|
-
);
|
|
545
|
-
if (validationResult.error) {
|
|
546
|
-
return { success: false, error: validationResult.error };
|
|
547
|
-
}
|
|
548
|
-
}
|
|
549
|
-
|
|
550
|
-
return {
|
|
551
|
-
success: anySuccess,
|
|
552
|
-
output: formatOutput(results, outputFormat, dryRun) + (importGraphWarning ?? ''),
|
|
553
|
-
};
|
|
554
|
-
}
|
|
555
|
-
|
|
556
|
-
export interface EditToolOptions {
|
|
557
|
-
cwd?: string;
|
|
558
|
-
fileUndoManager?: FileUndoManager;
|
|
559
|
-
configManager?: Pick<ConfigManager, 'get' | 'getWorkingDirectory'>;
|
|
560
|
-
toolLLM?: Pick<ToolLLM, 'chat'>;
|
|
561
|
-
changeTracker?: Pick<SessionChangeTracker, 'recordChange'>;
|
|
562
|
-
}
|
|
563
|
-
|
|
564
|
-
function resolveEditCwd(options?: EditToolOptions): string {
|
|
565
|
-
if (options?.cwd && options.cwd.trim().length > 0) {
|
|
566
|
-
return options.cwd;
|
|
567
|
-
}
|
|
568
|
-
const workingDirectory = options?.configManager?.getWorkingDirectory();
|
|
569
|
-
if (workingDirectory && workingDirectory.trim().length > 0) {
|
|
570
|
-
return workingDirectory;
|
|
571
|
-
}
|
|
572
|
-
throw new Error('createEditTool requires an explicit cwd or configManager.getWorkingDirectory()');
|
|
573
|
-
}
|
|
574
|
-
|
|
575
|
-
export function createEditTool(fileCache: FileStateCache, options?: EditToolOptions): Tool {
|
|
576
|
-
const cwd = resolveEditCwd(options);
|
|
577
|
-
const definition: ToolDefinition = {
|
|
578
|
-
name: 'edit',
|
|
579
|
-
description:
|
|
580
|
-
'Edit files by finding and replacing text. Supports exact, fuzzy, and regex matching. ' +
|
|
581
|
-
'Handles multiple edits in one call with atomic or partial transaction semantics. ' +
|
|
582
|
-
'Detects OCC conflicts when files have been modified externally. ' +
|
|
583
|
-
'Also supports Jupyter notebook (.ipynb) cell operations via notebook_operations field.',
|
|
584
|
-
parameters: editSchema as unknown as Record<string, unknown>,
|
|
585
|
-
sideEffects: ['write_fs'],
|
|
586
|
-
concurrency: 'serial',
|
|
587
|
-
supportsProgress: true,
|
|
588
|
-
};
|
|
589
|
-
|
|
590
|
-
async function execute(args: Record<string, unknown>): Promise<{ success: boolean; output?: string; error?: string }> {
|
|
591
|
-
try {
|
|
592
|
-
const input = args as EditInput;
|
|
593
|
-
if (!input.edits && !input.notebook_operations) {
|
|
594
|
-
return { success: false, error: 'Either edits or notebook_operations must be provided' };
|
|
595
|
-
}
|
|
596
|
-
if (input.edits && input.notebook_operations) {
|
|
597
|
-
return { success: false, error: 'Provide either edits or notebook_operations, not both' };
|
|
598
|
-
}
|
|
599
|
-
|
|
600
|
-
const env: EditExecutionContext = {
|
|
601
|
-
fileCache,
|
|
602
|
-
cwd,
|
|
603
|
-
fileUndoManager: options?.fileUndoManager,
|
|
604
|
-
configManager: options?.configManager,
|
|
605
|
-
toolLLM: options?.toolLLM,
|
|
606
|
-
changeTracker: options?.changeTracker,
|
|
607
|
-
};
|
|
608
|
-
|
|
609
|
-
if (input.notebook_operations) {
|
|
610
|
-
return await executeNotebookEdit(input, env);
|
|
611
|
-
}
|
|
612
|
-
return await executeTextEdits(input, env);
|
|
613
|
-
} catch (err) {
|
|
614
|
-
return { success: false, error: `Unexpected error: ${summarizeError(err)}` };
|
|
615
|
-
}
|
|
616
|
-
}
|
|
617
|
-
|
|
618
|
-
return { definition, execute };
|
|
619
|
-
}
|
package/src/tools/edit/index.ts
DELETED
package/src/tools/edit/phased.ts
DELETED
|
@@ -1,33 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Phased wrapper for the edit tool.
|
|
3
|
-
*
|
|
4
|
-
* Delegates entirely to the existing `createEditTool` implementation and adds
|
|
5
|
-
* the PhasedTool metadata required by the phased executor.
|
|
6
|
-
*/
|
|
7
|
-
import { asPhasedTool } from '@pellux/goodvibes-sdk/platform/runtime/tools/adapter';
|
|
8
|
-
import { createEditTool } from '@pellux/goodvibes-sdk/platform/tools/edit/index';
|
|
9
|
-
import type { EditToolOptions } from '@pellux/goodvibes-sdk/platform/tools/edit/index';
|
|
10
|
-
import type { FileStateCache } from '@pellux/goodvibes-sdk/platform/state/file-cache';
|
|
11
|
-
|
|
12
|
-
// ---------------------------------------------------------------------------
|
|
13
|
-
// Factory
|
|
14
|
-
// ---------------------------------------------------------------------------
|
|
15
|
-
|
|
16
|
-
/**
|
|
17
|
-
* Create a phased edit tool.
|
|
18
|
-
*
|
|
19
|
-
* Category : `write` — edit operations mutate files on disk.
|
|
20
|
-
* Cancellable: `false` — mid-flight edits could corrupt open transactions;
|
|
21
|
-
* the executor waits for completion before processing cancellation.
|
|
22
|
-
*
|
|
23
|
-
* @param fileCache - Shared FileStateCache instance for OCC conflict detection.
|
|
24
|
-
* @param options - Optional edit tool configuration (cwd, fileUndoManager).
|
|
25
|
-
* @returns A PhasedTool that delegates execution to `createEditTool`.
|
|
26
|
-
*/
|
|
27
|
-
export function createPhasedEditTool(
|
|
28
|
-
fileCache: FileStateCache,
|
|
29
|
-
options?: EditToolOptions,
|
|
30
|
-
) {
|
|
31
|
-
const inner = createEditTool(fileCache, options);
|
|
32
|
-
return asPhasedTool(inner, { category: 'write', cancellable: false });
|
|
33
|
-
}
|
package/src/tools/fetch/index.ts
DELETED
|
@@ -1,3 +0,0 @@
|
|
|
1
|
-
export type { FetchUrlResult, FetchOutput } from '@pellux/goodvibes-sdk/platform/tools/fetch/types';
|
|
2
|
-
export type { FetchRuntimeDeps } from '@pellux/goodvibes-sdk/platform/tools/fetch/runtime';
|
|
3
|
-
export { createFetchTool, executeFetchInput, FetchRuntimeService } from '@pellux/goodvibes-sdk/platform/tools/fetch/runtime';
|
|
@@ -1,34 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Phased wrapper for the fetch tool.
|
|
3
|
-
*
|
|
4
|
-
* Delegates to a freshly constructed fetch tool instance and adds the
|
|
5
|
-
* PhasedTool metadata required by the phased executor.
|
|
6
|
-
*/
|
|
7
|
-
import { asPhasedTool } from '@pellux/goodvibes-sdk/platform/runtime/tools/adapter';
|
|
8
|
-
import { createFetchTool } from '@pellux/goodvibes-sdk/platform/tools/fetch/index';
|
|
9
|
-
|
|
10
|
-
// ---------------------------------------------------------------------------
|
|
11
|
-
// Constants
|
|
12
|
-
// ---------------------------------------------------------------------------
|
|
13
|
-
|
|
14
|
-
/** Default network timeout for the executing phase (30 seconds). */
|
|
15
|
-
const NETWORK_EXECUTE_TIMEOUT_MS = 30_000;
|
|
16
|
-
|
|
17
|
-
// ---------------------------------------------------------------------------
|
|
18
|
-
// Factory
|
|
19
|
-
// ---------------------------------------------------------------------------
|
|
20
|
-
|
|
21
|
-
/**
|
|
22
|
-
* Create a phased fetch tool.
|
|
23
|
-
*
|
|
24
|
-
* Category : `network` — routes to the network concurrency pool.
|
|
25
|
-
* Cancellable : `true` — HTTP requests can be interrupted mid-flight by
|
|
26
|
-
* closing the underlying socket; the executor passes an AbortSignal.
|
|
27
|
-
* phaseTimeouts : `{ executing: 30000 }` — overrides the default timeout for
|
|
28
|
-
* the executing phase to allow for slow network responses.
|
|
29
|
-
*
|
|
30
|
-
* @returns A PhasedTool that delegates execution to an owned fetch tool instance.
|
|
31
|
-
*/
|
|
32
|
-
export function createPhasedFetchTool() {
|
|
33
|
-
return asPhasedTool(createFetchTool(), { category: 'network', cancellable: true, phaseTimeouts: { executing: NETWORK_EXECUTE_TIMEOUT_MS } });
|
|
34
|
-
}
|