qlogicagent 2.13.5 → 2.13.6
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 +303 -304
- package/dist/index.js +1268 -15
- package/dist/permissions.js +1 -1
- package/dist/pet-contracts.js +1 -1
- package/dist/types/cli/community-skill-installer.d.ts +2 -0
- package/dist/types/cli/handlers/community-handler.d.ts +6 -0
- package/dist/types/cli/runtime-dependency-catalog.d.ts +38 -12
- package/dist/types/cli/skills-query-service.d.ts +4 -0
- package/dist/types/config/cn-mirror.d.ts +23 -0
- package/dist/types/index.d.ts +1 -0
- package/dist/types/protocol/methods.d.ts +27 -3
- package/dist/types/runtime/community/community-consent-client.d.ts +58 -1
- package/dist/types/runtime/community/community-telemetry-types.d.ts +1 -1
- package/dist/types/runtime/community/package-materialize.d.ts +19 -0
- package/dist/types/runtime/community/ranged-download.d.ts +15 -0
- package/dist/types/runtime/community/registry-signature.d.ts +41 -0
- package/dist/types/runtime/infra/llmrouter-catalog.d.ts +3 -3
- package/dist/types/runtime/infra/model-registry.d.ts +17 -2
- package/dist/types/runtime/pet/pet-community-assets.d.ts +14 -1
- package/package.json +110 -110
- package/dist/agent/agent.d.ts +0 -48
- package/dist/agent/agent.js +0 -197
- package/dist/agent/memory-recall-context.d.ts +0 -18
- package/dist/agent/memory-recall-context.js +0 -139
- package/dist/agent/memory-recall-context.test.d.ts +0 -1
- package/dist/agent/memory-recall-context.test.js +0 -58
- package/dist/agent/memory-recall-injection.d.ts +0 -34
- package/dist/agent/memory-recall-injection.js +0 -66
- package/dist/agent/runtime-vars.d.ts +0 -48
- package/dist/agent/runtime-vars.js +0 -54
- package/dist/agent/tool-access.d.ts +0 -1
- package/dist/agent/tool-access.js +0 -1
- package/dist/agent/tool-loop/artifact-events.d.ts +0 -17
- package/dist/agent/tool-loop/artifact-events.js +0 -75
- package/dist/agent/tool-loop/budget-continuation-policy.d.ts +0 -22
- package/dist/agent/tool-loop/budget-continuation-policy.js +0 -44
- package/dist/agent/tool-loop/completion-action-policy.d.ts +0 -19
- package/dist/agent/tool-loop/completion-action-policy.js +0 -68
- package/dist/agent/tool-loop/completion-action-policy.test.d.ts +0 -1
- package/dist/agent/tool-loop/completion-action-policy.test.js +0 -77
- package/dist/agent/tool-loop/completion-stop-policy.d.ts +0 -19
- package/dist/agent/tool-loop/completion-stop-policy.js +0 -31
- package/dist/agent/tool-loop/compression-pipeline.d.ts +0 -44
- package/dist/agent/tool-loop/compression-pipeline.js +0 -68
- package/dist/agent/tool-loop/loop-helpers.d.ts +0 -15
- package/dist/agent/tool-loop/loop-helpers.js +0 -86
- package/dist/agent/tool-loop/recovery-helpers.d.ts +0 -18
- package/dist/agent/tool-loop/recovery-helpers.js +0 -42
- package/dist/agent/tool-loop/single-round.d.ts +0 -2
- package/dist/agent/tool-loop/single-round.js +0 -43
- package/dist/agent/tool-loop/skill-instruction-policy.d.ts +0 -7
- package/dist/agent/tool-loop/skill-instruction-policy.js +0 -18
- package/dist/agent/tool-loop/stream-error-recovery.d.ts +0 -59
- package/dist/agent/tool-loop/stream-error-recovery.js +0 -93
- package/dist/agent/tool-loop/tool-failure-policy.d.ts +0 -22
- package/dist/agent/tool-loop/tool-failure-policy.js +0 -46
- package/dist/agent/tool-loop/tool-result-events.d.ts +0 -11
- package/dist/agent/tool-loop/tool-result-events.js +0 -59
- package/dist/agent/tool-loop/tool-result-events.test.d.ts +0 -1
- package/dist/agent/tool-loop/tool-result-events.test.js +0 -30
- package/dist/agent/tool-loop.contract.test.d.ts +0 -1
- package/dist/agent/tool-loop.contract.test.js +0 -254
- package/dist/agent/tool-loop.d.ts +0 -121
- package/dist/agent/tool-loop.js +0 -1017
- package/dist/agent/tool-loop.policy-architecture.test.d.ts +0 -1
- package/dist/agent/tool-loop.policy-architecture.test.js +0 -21
- package/dist/agent/tool-loop.states.test.d.ts +0 -1
- package/dist/agent/tool-loop.states.test.js +0 -211
- package/dist/agent/tunable-defaults.d.ts +0 -1
- package/dist/agent/tunable-defaults.js +0 -1
- package/dist/agent/types.d.ts +0 -311
- package/dist/agent/types.js +0 -8
- package/dist/cli/acp-commands.d.ts +0 -32
- package/dist/cli/acp-commands.js +0 -145
- package/dist/cli/acp-commands.test.d.ts +0 -1
- package/dist/cli/acp-commands.test.js +0 -89
- package/dist/cli/acp-extended-handlers.d.ts +0 -69
- package/dist/cli/acp-extended-handlers.js +0 -484
- package/dist/cli/acp-extended-handlers.product-confirm.test.d.ts +0 -1
- package/dist/cli/acp-extended-handlers.product-confirm.test.js +0 -56
- package/dist/cli/acp-extended-handlers.product-project.test.d.ts +0 -1
- package/dist/cli/acp-extended-handlers.product-project.test.js +0 -66
- package/dist/cli/acp-extended-handlers.solo-project.test.d.ts +0 -1
- package/dist/cli/acp-extended-handlers.solo-project.test.js +0 -51
- package/dist/cli/acp-extended-handlers.specchat.test.d.ts +0 -1
- package/dist/cli/acp-extended-handlers.specchat.test.js +0 -62
- package/dist/cli/acp-extended-handlers.workflowchat.test.d.ts +0 -1
- package/dist/cli/acp-extended-handlers.workflowchat.test.js +0 -49
- package/dist/cli/acp-extended-host-adapter.d.ts +0 -29
- package/dist/cli/acp-extended-host-adapter.js +0 -40
- package/dist/cli/acp-extended-host-adapter.test.d.ts +0 -1
- package/dist/cli/acp-extended-host-adapter.test.js +0 -63
- package/dist/cli/acp-message-router.d.ts +0 -8
- package/dist/cli/acp-message-router.js +0 -40
- package/dist/cli/acp-message-router.test.d.ts +0 -1
- package/dist/cli/acp-message-router.test.js +0 -30
- package/dist/cli/acp-session-handlers.d.ts +0 -41
- package/dist/cli/acp-session-handlers.js +0 -304
- package/dist/cli/acp-session-handlers.test.d.ts +0 -1
- package/dist/cli/acp-session-handlers.test.js +0 -346
- package/dist/cli/acp-session-host.d.ts +0 -48
- package/dist/cli/acp-session-host.js +0 -1
- package/dist/cli/agent-config-coordinator.d.ts +0 -16
- package/dist/cli/agent-config-coordinator.js +0 -56
- package/dist/cli/agent-config-coordinator.test.d.ts +0 -1
- package/dist/cli/agent-config-coordinator.test.js +0 -51
- package/dist/cli/agent-config-runtime.d.ts +0 -11
- package/dist/cli/agent-config-runtime.js +0 -4
- package/dist/cli/agent-runner-factory.d.ts +0 -2
- package/dist/cli/agent-runner-factory.js +0 -11
- package/dist/cli/agent-runtime-bootstrap.d.ts +0 -67
- package/dist/cli/agent-runtime-bootstrap.js +0 -104
- package/dist/cli/agent-runtime-ports-adapter.d.ts +0 -2
- package/dist/cli/agent-runtime-ports-adapter.js +0 -22
- package/dist/cli/agent-runtime-session-state.d.ts +0 -24
- package/dist/cli/agent-runtime-session-state.js +0 -51
- package/dist/cli/agent-status-notifier.d.ts +0 -11
- package/dist/cli/agent-status-notifier.js +0 -26
- package/dist/cli/agent-status-notifier.test.d.ts +0 -1
- package/dist/cli/agent-status-notifier.test.js +0 -33
- package/dist/cli/base-tool-bootstrap.d.ts +0 -16
- package/dist/cli/base-tool-bootstrap.js +0 -20
- package/dist/cli/cli-acp-request-handler.d.ts +0 -11
- package/dist/cli/cli-acp-request-handler.js +0 -61
- package/dist/cli/cli-acp-request-handler.test.d.ts +0 -1
- package/dist/cli/cli-acp-request-handler.test.js +0 -58
- package/dist/cli/cli-agent-builder.d.ts +0 -35
- package/dist/cli/cli-agent-builder.js +0 -33
- package/dist/cli/community-resource-installer.d.ts +0 -30
- package/dist/cli/community-resource-installer.js +0 -66
- package/dist/cli/community-resource-installer.test.d.ts +0 -1
- package/dist/cli/community-resource-installer.test.js +0 -175
- package/dist/cli/community-skill-installer.d.ts +0 -12
- package/dist/cli/community-skill-installer.js +0 -220
- package/dist/cli/community-skill-installer.test.d.ts +0 -1
- package/dist/cli/community-skill-installer.test.js +0 -179
- package/dist/cli/community-workflow-installer.d.ts +0 -29
- package/dist/cli/community-workflow-installer.js +0 -69
- package/dist/cli/conversation-context.d.ts +0 -30
- package/dist/cli/conversation-context.js +0 -69
- package/dist/cli/conversation-context.test.d.ts +0 -1
- package/dist/cli/conversation-context.test.js +0 -61
- package/dist/cli/core-tool-coordinator.d.ts +0 -41
- package/dist/cli/core-tool-coordinator.js +0 -55
- package/dist/cli/core-tools/agent-tool-bootstrap.d.ts +0 -12
- package/dist/cli/core-tools/agent-tool-bootstrap.js +0 -5
- package/dist/cli/core-tools/agent-tool-service.background.test.d.ts +0 -1
- package/dist/cli/core-tools/agent-tool-service.background.test.js +0 -212
- package/dist/cli/core-tools/agent-tool-service.d.ts +0 -36
- package/dist/cli/core-tools/agent-tool-service.js +0 -152
- package/dist/cli/core-tools/checkpoint-tool-bootstrap.d.ts +0 -9
- package/dist/cli/core-tools/checkpoint-tool-bootstrap.js +0 -8
- package/dist/cli/core-tools/checkpoint-tool-service.d.ts +0 -7
- package/dist/cli/core-tools/checkpoint-tool-service.js +0 -5
- package/dist/cli/core-tools/config-tool-bootstrap.d.ts +0 -5
- package/dist/cli/core-tools/config-tool-bootstrap.js +0 -5
- package/dist/cli/core-tools/config-tool-service.d.ts +0 -11
- package/dist/cli/core-tools/config-tool-service.js +0 -86
- package/dist/cli/core-tools/config-tool-service.test.d.ts +0 -1
- package/dist/cli/core-tools/config-tool-service.test.js +0 -69
- package/dist/cli/core-tools/cron-tool-bootstrap.d.ts +0 -8
- package/dist/cli/core-tools/cron-tool-bootstrap.js +0 -8
- package/dist/cli/core-tools/cron-workflow-service.d.ts +0 -7
- package/dist/cli/core-tools/cron-workflow-service.js +0 -206
- package/dist/cli/core-tools/cron-workflow-service.test.d.ts +0 -1
- package/dist/cli/core-tools/cron-workflow-service.test.js +0 -78
- package/dist/cli/core-tools/fork-system-prompt.d.ts +0 -45
- package/dist/cli/core-tools/fork-system-prompt.js +0 -66
- package/dist/cli/core-tools/fork-system-prompt.test.d.ts +0 -1
- package/dist/cli/core-tools/fork-system-prompt.test.js +0 -77
- package/dist/cli/core-tools/monitor-tool-bootstrap.d.ts +0 -7
- package/dist/cli/core-tools/monitor-tool-bootstrap.js +0 -8
- package/dist/cli/core-tools/monitor-tool-service.d.ts +0 -6
- package/dist/cli/core-tools/monitor-tool-service.js +0 -74
- package/dist/cli/core-tools/registry.d.ts +0 -8
- package/dist/cli/core-tools/registry.js +0 -60
- package/dist/cli/core-tools/session-tool-manifest.d.ts +0 -12
- package/dist/cli/core-tools/session-tool-manifest.js +0 -19
- package/dist/cli/core-tools/team-registry.d.ts +0 -62
- package/dist/cli/core-tools/team-registry.js +0 -85
- package/dist/cli/core-tools/team-registry.test.d.ts +0 -1
- package/dist/cli/core-tools/team-registry.test.js +0 -79
- package/dist/cli/core-tools/team-tool-bootstrap.d.ts +0 -11
- package/dist/cli/core-tools/team-tool-bootstrap.js +0 -8
- package/dist/cli/core-tools/team-tool-service.d.ts +0 -43
- package/dist/cli/core-tools/team-tool-service.js +0 -326
- package/dist/cli/core-tools/team-tool-service.test.d.ts +0 -1
- package/dist/cli/core-tools/team-tool-service.test.js +0 -48
- package/dist/cli/credential-vault.d.ts +0 -62
- package/dist/cli/credential-vault.js +0 -190
- package/dist/cli/credential-vault.test.d.ts +0 -6
- package/dist/cli/credential-vault.test.js +0 -130
- package/dist/cli/default-project-bootstrap.d.ts +0 -8
- package/dist/cli/default-project-bootstrap.js +0 -39
- package/dist/cli/dev-tool-bootstrap.d.ts +0 -8
- package/dist/cli/dev-tool-bootstrap.js +0 -19
- package/dist/cli/dev-tools/dev-tool-bootstrap-service.d.ts +0 -6
- package/dist/cli/dev-tools/dev-tool-bootstrap-service.js +0 -6
- package/dist/cli/dev-tools/dev-tool-registry.d.ts +0 -6
- package/dist/cli/dev-tools/dev-tool-registry.js +0 -7
- package/dist/cli/dev-tools/lsp-tool-service.d.ts +0 -5
- package/dist/cli/dev-tools/lsp-tool-service.js +0 -30
- package/dist/cli/dev-tools/lsp-tool-service.test.d.ts +0 -1
- package/dist/cli/dev-tools/lsp-tool-service.test.js +0 -14
- package/dist/cli/dream-host-adapter.d.ts +0 -23
- package/dist/cli/dream-host-adapter.js +0 -33
- package/dist/cli/gateway-rpc-connection.d.ts +0 -50
- package/dist/cli/gateway-rpc-connection.js +0 -133
- package/dist/cli/handlers/agents-handler.d.ts +0 -51
- package/dist/cli/handlers/agents-handler.js +0 -769
- package/dist/cli/handlers/community-handler.d.ts +0 -39
- package/dist/cli/handlers/community-handler.js +0 -671
- package/dist/cli/handlers/community-handler.test.d.ts +0 -1
- package/dist/cli/handlers/community-handler.test.js +0 -1602
- package/dist/cli/handlers/config-handler.d.ts +0 -28
- package/dist/cli/handlers/config-handler.js +0 -438
- package/dist/cli/handlers/config-handler.test.d.ts +0 -1
- package/dist/cli/handlers/config-handler.test.js +0 -140
- package/dist/cli/handlers/config-handler.tools-list.test.d.ts +0 -1
- package/dist/cli/handlers/config-handler.tools-list.test.js +0 -93
- package/dist/cli/handlers/control-handler.d.ts +0 -23
- package/dist/cli/handlers/control-handler.js +0 -88
- package/dist/cli/handlers/dream-handler.d.ts +0 -31
- package/dist/cli/handlers/dream-handler.js +0 -235
- package/dist/cli/handlers/files-handler.d.ts +0 -22
- package/dist/cli/handlers/files-handler.instructions.test.d.ts +0 -1
- package/dist/cli/handlers/files-handler.instructions.test.js +0 -127
- package/dist/cli/handlers/files-handler.js +0 -593
- package/dist/cli/handlers/media-handler.d.ts +0 -19
- package/dist/cli/handlers/media-handler.js +0 -212
- package/dist/cli/handlers/media-handler.test.d.ts +0 -1
- package/dist/cli/handlers/media-handler.test.js +0 -107
- package/dist/cli/handlers/memory-handler.d.ts +0 -61
- package/dist/cli/handlers/memory-handler.js +0 -792
- package/dist/cli/handlers/pet-confirm-handler.d.ts +0 -7
- package/dist/cli/handlers/pet-confirm-handler.js +0 -6
- package/dist/cli/handlers/pet-handler.d.ts +0 -47
- package/dist/cli/handlers/pet-handler.js +0 -455
- package/dist/cli/handlers/pet-handler.test.d.ts +0 -1
- package/dist/cli/handlers/pet-handler.test.js +0 -620
- package/dist/cli/handlers/product-handler.d.ts +0 -37
- package/dist/cli/handlers/product-handler.js +0 -393
- package/dist/cli/handlers/project-handler.d.ts +0 -28
- package/dist/cli/handlers/project-handler.js +0 -421
- package/dist/cli/handlers/session-handler.channel.test.d.ts +0 -1
- package/dist/cli/handlers/session-handler.channel.test.js +0 -157
- package/dist/cli/handlers/session-handler.d.ts +0 -58
- package/dist/cli/handlers/session-handler.delete.test.d.ts +0 -1
- package/dist/cli/handlers/session-handler.delete.test.js +0 -38
- package/dist/cli/handlers/session-handler.js +0 -833
- package/dist/cli/handlers/session-handler.resume.test.d.ts +0 -1
- package/dist/cli/handlers/session-handler.resume.test.js +0 -66
- package/dist/cli/handlers/settings-handler.d.ts +0 -19
- package/dist/cli/handlers/settings-handler.js +0 -710
- package/dist/cli/handlers/settings-handler.remote-catalog.test.d.ts +0 -1
- package/dist/cli/handlers/settings-handler.remote-catalog.test.js +0 -1247
- package/dist/cli/handlers/skills-handler.d.ts +0 -29
- package/dist/cli/handlers/skills-handler.js +0 -368
- package/dist/cli/handlers/skills-handler.profile.test.d.ts +0 -1
- package/dist/cli/handlers/skills-handler.profile.test.js +0 -70
- package/dist/cli/handlers/solo-handler.d.ts +0 -38
- package/dist/cli/handlers/solo-handler.js +0 -351
- package/dist/cli/handlers/turn-handler.d.ts +0 -52
- package/dist/cli/handlers/turn-handler.js +0 -574
- package/dist/cli/handlers/turn-handler.test.d.ts +0 -1
- package/dist/cli/handlers/turn-handler.test.js +0 -22
- package/dist/cli/handlers/workflow-handler.d.ts +0 -181
- package/dist/cli/handlers/workflow-handler.events.test.d.ts +0 -1
- package/dist/cli/handlers/workflow-handler.events.test.js +0 -113
- package/dist/cli/handlers/workflow-handler.js +0 -1449
- package/dist/cli/handlers/workflow-handler.multiroot.test.d.ts +0 -12
- package/dist/cli/handlers/workflow-handler.multiroot.test.js +0 -745
- package/dist/cli/idle-dream-coordinator.d.ts +0 -47
- package/dist/cli/idle-dream-coordinator.js +0 -126
- package/dist/cli/idle-dream-coordinator.test.d.ts +0 -1
- package/dist/cli/idle-dream-coordinator.test.js +0 -125
- package/dist/cli/main.d.ts +0 -15
- package/dist/cli/main.js +0 -112
- package/dist/cli/mcp-bootstrap.d.ts +0 -20
- package/dist/cli/mcp-bootstrap.js +0 -66
- package/dist/cli/mcp-plugin-bootstrap.d.ts +0 -2
- package/dist/cli/mcp-plugin-bootstrap.js +0 -2
- package/dist/cli/mcp-plugin-bootstrap.test.d.ts +0 -1
- package/dist/cli/mcp-plugin-bootstrap.test.js +0 -38
- package/dist/cli/mcp-tool-proxy.d.ts +0 -7
- package/dist/cli/mcp-tool-proxy.js +0 -15
- package/dist/cli/media-capability-schema.d.ts +0 -49
- package/dist/cli/media-capability-schema.js +0 -384
- package/dist/cli/media-capability-schema.test.d.ts +0 -1
- package/dist/cli/media-capability-schema.test.js +0 -103
- package/dist/cli/media-file-api-service.d.ts +0 -73
- package/dist/cli/media-file-api-service.js +0 -143
- package/dist/cli/media-file-api-service.test.d.ts +0 -1
- package/dist/cli/media-file-api-service.test.js +0 -119
- package/dist/cli/media-file-tool-service.d.ts +0 -13
- package/dist/cli/media-file-tool-service.js +0 -63
- package/dist/cli/media-runtime-capability.test.d.ts +0 -1
- package/dist/cli/media-runtime-capability.test.js +0 -106
- package/dist/cli/media-runtime-facade.d.ts +0 -51
- package/dist/cli/media-runtime-facade.js +0 -389
- package/dist/cli/media-runtime-facade.test.d.ts +0 -1
- package/dist/cli/media-runtime-facade.test.js +0 -42
- package/dist/cli/memory-candidate-service.d.ts +0 -83
- package/dist/cli/memory-candidate-service.js +0 -341
- package/dist/cli/memory-coordinator.d.ts +0 -37
- package/dist/cli/memory-coordinator.js +0 -85
- package/dist/cli/memory-coordinator.test.d.ts +0 -1
- package/dist/cli/memory-coordinator.test.js +0 -78
- package/dist/cli/memory-multimodal.test.d.ts +0 -1
- package/dist/cli/memory-multimodal.test.js +0 -137
- package/dist/cli/model-client-resolver.d.ts +0 -31
- package/dist/cli/model-client-resolver.js +0 -173
- package/dist/cli/model-client-resolver.test.d.ts +0 -1
- package/dist/cli/model-client-resolver.test.js +0 -105
- package/dist/cli/multi-agent-handler-host.d.ts +0 -27
- package/dist/cli/multi-agent-handler-host.js +0 -55
- package/dist/cli/multi-agent-handler-host.test.d.ts +0 -1
- package/dist/cli/multi-agent-handler-host.test.js +0 -63
- package/dist/cli/multi-agent-state-coordinator.d.ts +0 -11
- package/dist/cli/multi-agent-state-coordinator.js +0 -7
- package/dist/cli/permission-approval-bridge.d.ts +0 -15
- package/dist/cli/permission-approval-bridge.js +0 -66
- package/dist/cli/permission-approval-bridge.test.d.ts +0 -1
- package/dist/cli/permission-approval-bridge.test.js +0 -100
- package/dist/cli/permission-bootstrap.d.ts +0 -40
- package/dist/cli/permission-bootstrap.js +0 -58
- package/dist/cli/permission-bootstrap.test.d.ts +0 -1
- package/dist/cli/permission-bootstrap.test.js +0 -129
- package/dist/cli/permission-runtime-service.d.ts +0 -9
- package/dist/cli/permission-runtime-service.js +0 -11
- package/dist/cli/permission-settings-store.d.ts +0 -1
- package/dist/cli/permission-settings-store.js +0 -3
- package/dist/cli/permission-settings-store.test.d.ts +0 -1
- package/dist/cli/permission-settings-store.test.js +0 -65
- package/dist/cli/pet-confirm-coordinator.d.ts +0 -20
- package/dist/cli/pet-confirm-coordinator.js +0 -32
- package/dist/cli/pet-confirm-coordinator.test.d.ts +0 -1
- package/dist/cli/pet-confirm-coordinator.test.js +0 -34
- package/dist/cli/pet-runtime.d.ts +0 -55
- package/dist/cli/pet-runtime.js +0 -220
- package/dist/cli/pet-runtime.test.d.ts +0 -1
- package/dist/cli/pet-runtime.test.js +0 -46
- package/dist/cli/plugin-bootstrap.d.ts +0 -15
- package/dist/cli/plugin-bootstrap.js +0 -63
- package/dist/cli/product-coordinator.d.ts +0 -34
- package/dist/cli/product-coordinator.js +0 -124
- package/dist/cli/product-coordinator.test.d.ts +0 -1
- package/dist/cli/product-coordinator.test.js +0 -51
- package/dist/cli/project-command-service.d.ts +0 -28
- package/dist/cli/project-command-service.js +0 -99
- package/dist/cli/project-context.d.ts +0 -1
- package/dist/cli/project-context.js +0 -4
- package/dist/cli/project-memory-store-factory.d.ts +0 -2
- package/dist/cli/project-memory-store-factory.js +0 -11
- package/dist/cli/project-template-seeder.d.ts +0 -5
- package/dist/cli/project-template-seeder.js +0 -43
- package/dist/cli/provider-core-facade.d.ts +0 -31
- package/dist/cli/provider-core-facade.js +0 -51
- package/dist/cli/provider-core-facade.test.d.ts +0 -1
- package/dist/cli/provider-core-facade.test.js +0 -9
- package/dist/cli/resolved-agent-cache.d.ts +0 -47
- package/dist/cli/resolved-agent-cache.js +0 -38
- package/dist/cli/rpc-registry.community.test.d.ts +0 -1
- package/dist/cli/rpc-registry.community.test.js +0 -45
- package/dist/cli/rpc-registry.d.ts +0 -62
- package/dist/cli/rpc-registry.js +0 -243
- package/dist/cli/runtime-dependency-catalog.d.ts +0 -56
- package/dist/cli/runtime-dependency-catalog.js +0 -110
- package/dist/cli/runtime-hook-bootstrap.d.ts +0 -38
- package/dist/cli/runtime-hook-bootstrap.js +0 -71
- package/dist/cli/runtime-watcher-bootstrap.d.ts +0 -15
- package/dist/cli/runtime-watcher-bootstrap.js +0 -30
- package/dist/cli/session-context.d.ts +0 -32
- package/dist/cli/session-context.js +0 -15
- package/dist/cli/session-coordinator.d.ts +0 -22
- package/dist/cli/session-coordinator.js +0 -47
- package/dist/cli/session-coordinator.test.d.ts +0 -1
- package/dist/cli/session-coordinator.test.js +0 -61
- package/dist/cli/session-history-coordinator.d.ts +0 -8
- package/dist/cli/session-history-coordinator.js +0 -57
- package/dist/cli/session-history-coordinator.test.d.ts +0 -1
- package/dist/cli/session-history-coordinator.test.js +0 -39
- package/dist/cli/session-query-service.d.ts +0 -24
- package/dist/cli/session-query-service.js +0 -57
- package/dist/cli/skill-meta-subturn-service.d.ts +0 -26
- package/dist/cli/skill-meta-subturn-service.js +0 -93
- package/dist/cli/skill-meta-tool-bootstrap.d.ts +0 -34
- package/dist/cli/skill-meta-tool-bootstrap.js +0 -295
- package/dist/cli/skill-meta-tool-bootstrap.test.d.ts +0 -1
- package/dist/cli/skill-meta-tool-bootstrap.test.js +0 -42
- package/dist/cli/skill-supporting-file.test.d.ts +0 -1
- package/dist/cli/skill-supporting-file.test.js +0 -97
- package/dist/cli/skills-query-service.d.ts +0 -29
- package/dist/cli/skills-query-service.js +0 -38
- package/dist/cli/stdio-acp-protocol-coordinator.d.ts +0 -18
- package/dist/cli/stdio-acp-protocol-coordinator.js +0 -33
- package/dist/cli/stdio-acp-request-host.d.ts +0 -28
- package/dist/cli/stdio-acp-request-host.js +0 -82
- package/dist/cli/stdio-acp-request-host.test.d.ts +0 -1
- package/dist/cli/stdio-acp-request-host.test.js +0 -61
- package/dist/cli/stdio-agent-session-bootstrap.d.ts +0 -80
- package/dist/cli/stdio-agent-session-bootstrap.js +0 -74
- package/dist/cli/stdio-rpc-handler-hosts.d.ts +0 -50
- package/dist/cli/stdio-rpc-handler-hosts.js +0 -135
- package/dist/cli/stdio-rpc-handler-hosts.test.d.ts +0 -1
- package/dist/cli/stdio-rpc-handler-hosts.test.js +0 -10
- package/dist/cli/stdio-runtime-bootstrap.d.ts +0 -16
- package/dist/cli/stdio-runtime-bootstrap.js +0 -17
- package/dist/cli/stdio-runtime-services.d.ts +0 -36
- package/dist/cli/stdio-runtime-services.js +0 -53
- package/dist/cli/stdio-server.architecture.test.d.ts +0 -1
- package/dist/cli/stdio-server.architecture.test.js +0 -18
- package/dist/cli/stdio-server.contract.test.d.ts +0 -1
- package/dist/cli/stdio-server.contract.test.js +0 -96
- package/dist/cli/stdio-server.d.ts +0 -211
- package/dist/cli/stdio-server.js +0 -731
- package/dist/cli/stdio-session-runtime-coordinator.d.ts +0 -19
- package/dist/cli/stdio-session-runtime-coordinator.js +0 -21
- package/dist/cli/test-support/tool-catalog-fixture.d.ts +0 -3
- package/dist/cli/test-support/tool-catalog-fixture.js +0 -98
- package/dist/cli/tool-bootstrap-core-registration.d.ts +0 -30
- package/dist/cli/tool-bootstrap-core-registration.js +0 -555
- package/dist/cli/tool-bootstrap-media-registration.d.ts +0 -8
- package/dist/cli/tool-bootstrap-media-registration.js +0 -348
- package/dist/cli/tool-bootstrap-paths.d.ts +0 -7
- package/dist/cli/tool-bootstrap-paths.js +0 -17
- package/dist/cli/tool-bootstrap-providers.d.ts +0 -3
- package/dist/cli/tool-bootstrap-providers.js +0 -10
- package/dist/cli/tool-bootstrap-web-registration.d.ts +0 -13
- package/dist/cli/tool-bootstrap-web-registration.js +0 -144
- package/dist/cli/tool-bootstrap-workflow-registration.d.ts +0 -7
- package/dist/cli/tool-bootstrap-workflow-registration.js +0 -65
- package/dist/cli/tool-bootstrap.background-exec.test.d.ts +0 -1
- package/dist/cli/tool-bootstrap.background-exec.test.js +0 -83
- package/dist/cli/tool-bootstrap.cwd.test.d.ts +0 -1
- package/dist/cli/tool-bootstrap.cwd.test.js +0 -37
- package/dist/cli/tool-bootstrap.d.ts +0 -63
- package/dist/cli/tool-bootstrap.instructions.test.d.ts +0 -1
- package/dist/cli/tool-bootstrap.instructions.test.js +0 -37
- package/dist/cli/tool-bootstrap.js +0 -255
- package/dist/cli/tool-bootstrap.media-provider-alias.test.d.ts +0 -1
- package/dist/cli/tool-bootstrap.media-provider-alias.test.js +0 -90
- package/dist/cli/tool-bootstrap.test.d.ts +0 -1
- package/dist/cli/tool-bootstrap.test.js +0 -94
- package/dist/cli/tool-catalog.d.ts +0 -4
- package/dist/cli/tool-catalog.js +0 -14
- package/dist/cli/tool-invoker-factory.d.ts +0 -12
- package/dist/cli/tool-invoker-factory.js +0 -45
- package/dist/cli/tool-registration-modules.contract.test.d.ts +0 -1
- package/dist/cli/tool-registration-modules.contract.test.js +0 -75
- package/dist/cli/tool-registry-adapter.d.ts +0 -5
- package/dist/cli/tool-registry-adapter.js +0 -27
- package/dist/cli/tool-result-processor.d.ts +0 -14
- package/dist/cli/tool-result-processor.js +0 -83
- package/dist/cli/tool-result-processor.test.d.ts +0 -1
- package/dist/cli/tool-result-processor.test.js +0 -69
- package/dist/cli/transport.d.ts +0 -30
- package/dist/cli/transport.js +0 -68
- package/dist/cli/tunable-store.d.ts +0 -26
- package/dist/cli/tunable-store.js +0 -105
- package/dist/cli/turn-ask-user-setup.d.ts +0 -24
- package/dist/cli/turn-ask-user-setup.js +0 -46
- package/dist/cli/turn-ask-user-setup.test.d.ts +0 -1
- package/dist/cli/turn-ask-user-setup.test.js +0 -39
- package/dist/cli/turn-core.d.ts +0 -57
- package/dist/cli/turn-core.js +0 -58
- package/dist/cli/turn-event-forwarder.d.ts +0 -10
- package/dist/cli/turn-event-forwarder.js +0 -136
- package/dist/cli/turn-lifecycle.d.ts +0 -19
- package/dist/cli/turn-lifecycle.js +0 -53
- package/dist/cli/turn-lifecycle.test.d.ts +0 -1
- package/dist/cli/turn-lifecycle.test.js +0 -32
- package/dist/cli/turn-media-setup.d.ts +0 -19
- package/dist/cli/turn-media-setup.js +0 -71
- package/dist/cli/turn-media-setup.test.d.ts +0 -1
- package/dist/cli/turn-media-setup.test.js +0 -280
- package/dist/cli/turn-permission-sync.d.ts +0 -6
- package/dist/cli/turn-permission-sync.js +0 -7
- package/dist/cli/turn-permission-sync.test.d.ts +0 -1
- package/dist/cli/turn-permission-sync.test.js +0 -20
- package/dist/cli/turn-project-router.d.ts +0 -22
- package/dist/cli/turn-project-router.js +0 -141
- package/dist/cli/turn-project-router.test.d.ts +0 -1
- package/dist/cli/turn-project-router.test.js +0 -79
- package/dist/cli/turn-skill-autopersist.d.ts +0 -47
- package/dist/cli/turn-skill-autopersist.js +0 -262
- package/dist/cli/turn-skill-autopersist.test.d.ts +0 -1
- package/dist/cli/turn-skill-autopersist.test.js +0 -222
- package/dist/cli/turn-suggestion-generator.d.ts +0 -15
- package/dist/cli/turn-suggestion-generator.js +0 -34
- package/dist/cli/workflow-host-adapter.d.ts +0 -29
- package/dist/cli/workflow-host-adapter.js +0 -15
- package/dist/cli/workflow-host-adapter.test.d.ts +0 -1
- package/dist/cli/workflow-host-adapter.test.js +0 -35
- package/dist/config/config.d.ts +0 -17
- package/dist/config/config.js +0 -21
- package/dist/contracts/fire-hook.d.ts +0 -14
- package/dist/contracts/fire-hook.js +0 -14
- package/dist/contracts/fire-hook.test.d.ts +0 -1
- package/dist/contracts/fire-hook.test.js +0 -34
- package/dist/contracts/hooks.d.ts +0 -186
- package/dist/contracts/hooks.js +0 -7
- package/dist/contracts/index.d.ts +0 -4
- package/dist/contracts/index.js +0 -4
- package/dist/index.d.ts +0 -15
- package/dist/orchestration/agent-instance.d.ts +0 -84
- package/dist/orchestration/agent-instance.js +0 -535
- package/dist/orchestration/context/context-collapse.d.ts +0 -58
- package/dist/orchestration/context/context-collapse.js +0 -134
- package/dist/orchestration/context/reactive-compact.d.ts +0 -73
- package/dist/orchestration/context/reactive-compact.js +0 -78
- package/dist/orchestration/context/turn-loop-guard.d.ts +0 -86
- package/dist/orchestration/context/turn-loop-guard.js +0 -100
- package/dist/orchestration/dag-scheduler.d.ts +0 -167
- package/dist/orchestration/dag-scheduler.js +0 -546
- package/dist/orchestration/error-handling/error-classification.d.ts +0 -3
- package/dist/orchestration/error-handling/error-classification.js +0 -35
- package/dist/orchestration/error-handling/failover-classification.d.ts +0 -8
- package/dist/orchestration/error-handling/failover-classification.js +0 -381
- package/dist/orchestration/error-handling/retry-loop.d.ts +0 -69
- package/dist/orchestration/error-handling/retry-loop.js +0 -96
- package/dist/orchestration/index.d.ts +0 -15
- package/dist/orchestration/index.js +0 -18
- package/dist/orchestration/product-budget.d.ts +0 -56
- package/dist/orchestration/product-budget.js +0 -112
- package/dist/orchestration/product-checkpoint.d.ts +0 -46
- package/dist/orchestration/product-checkpoint.js +0 -74
- package/dist/orchestration/product-dag-mutation-applier.d.ts +0 -10
- package/dist/orchestration/product-dag-mutation-applier.js +0 -91
- package/dist/orchestration/product-persistence.d.ts +0 -35
- package/dist/orchestration/product-persistence.js +0 -55
- package/dist/orchestration/product-planner.d.ts +0 -146
- package/dist/orchestration/product-planner.js +0 -379
- package/dist/orchestration/product-run-coordinator.d.ts +0 -31
- package/dist/orchestration/product-run-coordinator.js +0 -31
- package/dist/orchestration/product-worktree.d.ts +0 -12
- package/dist/orchestration/product-worktree.js +0 -69
- package/dist/orchestration/skill-improvement.d.ts +0 -129
- package/dist/orchestration/skill-improvement.js +0 -243
- package/dist/orchestration/solo-evaluator.d.ts +0 -124
- package/dist/orchestration/solo-evaluator.js +0 -611
- package/dist/orchestration/solo-persistence.d.ts +0 -48
- package/dist/orchestration/solo-persistence.js +0 -67
- package/dist/orchestration/solo-spec-builder.d.ts +0 -48
- package/dist/orchestration/solo-spec-builder.js +0 -139
- package/dist/orchestration/subagent/agent-registry.d.ts +0 -46
- package/dist/orchestration/subagent/agent-registry.js +0 -129
- package/dist/orchestration/subagent/fork-subagent.d.ts +0 -100
- package/dist/orchestration/subagent/fork-subagent.js +0 -101
- package/dist/orchestration/subagent/task-types.d.ts +0 -1
- package/dist/orchestration/subagent/task-types.js +0 -1
- package/dist/orchestration/tool-cascade.d.ts +0 -49
- package/dist/orchestration/tool-cascade.js +0 -86
- package/dist/orchestration/tool-loop/conversation-repair.d.ts +0 -61
- package/dist/orchestration/tool-loop/conversation-repair.js +0 -429
- package/dist/orchestration/tool-loop/tool-choice-policy.d.ts +0 -54
- package/dist/orchestration/tool-loop/tool-choice-policy.js +0 -164
- package/dist/orchestration/tool-loop/tool-loop-state.d.ts +0 -50
- package/dist/orchestration/tool-loop/tool-loop-state.js +0 -133
- package/dist/orchestration/tool-loop/tool-schema.d.ts +0 -46
- package/dist/orchestration/tool-loop/tool-schema.js +0 -208
- package/dist/orchestration/workflow/budget-permission-gate.d.ts +0 -85
- package/dist/orchestration/workflow/budget-permission-gate.js +0 -134
- package/dist/orchestration/workflow/builtin-executors.d.ts +0 -18
- package/dist/orchestration/workflow/builtin-executors.js +0 -191
- package/dist/orchestration/workflow/capability-catalog.d.ts +0 -64
- package/dist/orchestration/workflow/capability-catalog.js +0 -166
- package/dist/orchestration/workflow/cron-schedule.d.ts +0 -37
- package/dist/orchestration/workflow/cron-schedule.js +0 -199
- package/dist/orchestration/workflow/data-item.d.ts +0 -39
- package/dist/orchestration/workflow/data-item.js +0 -52
- package/dist/orchestration/workflow/expression.d.ts +0 -60
- package/dist/orchestration/workflow/expression.js +0 -474
- package/dist/orchestration/workflow/host-executors.d.ts +0 -15
- package/dist/orchestration/workflow/host-executors.js +0 -207
- package/dist/orchestration/workflow/n8n-expression.d.ts +0 -48
- package/dist/orchestration/workflow/n8n-expression.js +0 -95
- package/dist/orchestration/workflow/n8n-import.d.ts +0 -68
- package/dist/orchestration/workflow/n8n-import.js +0 -319
- package/dist/orchestration/workflow/node-registry.d.ts +0 -19
- package/dist/orchestration/workflow/node-registry.js +0 -45
- package/dist/orchestration/workflow/node-schema.d.ts +0 -232
- package/dist/orchestration/workflow/node-schema.js +0 -29
- package/dist/orchestration/workflow/qla-executor-host.d.ts +0 -77
- package/dist/orchestration/workflow/qla-executor-host.js +0 -124
- package/dist/orchestration/workflow/run-checkpoint-store.d.ts +0 -53
- package/dist/orchestration/workflow/run-checkpoint-store.js +0 -59
- package/dist/orchestration/workflow/run-history-store.d.ts +0 -65
- package/dist/orchestration/workflow/run-history-store.js +0 -104
- package/dist/orchestration/workflow/trigger-validation.d.ts +0 -22
- package/dist/orchestration/workflow/trigger-validation.js +0 -241
- package/dist/orchestration/workflow/workflow-audit-store.d.ts +0 -31
- package/dist/orchestration/workflow/workflow-audit-store.js +0 -55
- package/dist/orchestration/workflow/workflow-bundle.d.ts +0 -65
- package/dist/orchestration/workflow/workflow-bundle.js +0 -168
- package/dist/orchestration/workflow/workflow-controller.d.ts +0 -219
- package/dist/orchestration/workflow/workflow-controller.js +0 -522
- package/dist/orchestration/workflow/workflow-patch.d.ts +0 -116
- package/dist/orchestration/workflow/workflow-patch.js +0 -369
- package/dist/orchestration/workflow/workflow-render.d.ts +0 -41
- package/dist/orchestration/workflow/workflow-render.js +0 -108
- package/dist/orchestration/workflow/workflow-runtime.d.ts +0 -171
- package/dist/orchestration/workflow/workflow-runtime.js +0 -474
- package/dist/orchestration/workflow/workflow-scheduler.d.ts +0 -111
- package/dist/orchestration/workflow/workflow-scheduler.js +0 -230
- package/dist/orchestration/workflow/workflow-service.d.ts +0 -14
- package/dist/orchestration/workflow/workflow-service.js +0 -18
- package/dist/orchestration/workflow/workflow-store.d.ts +0 -81
- package/dist/orchestration/workflow/workflow-store.js +0 -123
- package/dist/orchestration/workflow/workflow-trigger.d.ts +0 -35
- package/dist/orchestration/workflow/workflow-trigger.js +0 -1
- package/dist/orchestration/workflow-chat-builder.d.ts +0 -57
- package/dist/orchestration/workflow-chat-builder.js +0 -202
- package/dist/permissions.d.ts +0 -2
- package/dist/permissions.public-api.test.d.ts +0 -1
- package/dist/permissions.public-api.test.js +0 -32
- package/dist/pet-contracts.d.ts +0 -1
- package/dist/protocol/index.d.ts +0 -7
- package/dist/protocol/index.js +0 -7
- package/dist/protocol/methods.d.ts +0 -1190
- package/dist/protocol/methods.js +0 -110
- package/dist/protocol/notifications.d.ts +0 -9
- package/dist/protocol/notifications.js +0 -9
- package/dist/protocol/wire/acp-agent-management.d.ts +0 -456
- package/dist/protocol/wire/acp-agent-management.js +0 -7
- package/dist/protocol/wire/acp-protocol.d.ts +0 -369
- package/dist/protocol/wire/acp-protocol.js +0 -120
- package/dist/protocol/wire/agent-events.d.ts +0 -32
- package/dist/protocol/wire/agent-events.js +0 -113
- package/dist/protocol/wire/agent-methods.d.ts +0 -564
- package/dist/protocol/wire/agent-methods.js +0 -11
- package/dist/protocol/wire/agent-rpc.d.ts +0 -100
- package/dist/protocol/wire/agent-rpc.js +0 -72
- package/dist/protocol/wire/capability-manifest.d.ts +0 -112
- package/dist/protocol/wire/capability-manifest.js +0 -149
- package/dist/protocol/wire/capability-transport.d.ts +0 -207
- package/dist/protocol/wire/capability-transport.js +0 -1
- package/dist/protocol/wire/channel-ingress.d.ts +0 -29
- package/dist/protocol/wire/channel-ingress.js +0 -1
- package/dist/protocol/wire/channel.d.ts +0 -89
- package/dist/protocol/wire/channel.js +0 -1
- package/dist/protocol/wire/chat-types.d.ts +0 -106
- package/dist/protocol/wire/chat-types.js +0 -7
- package/dist/protocol/wire/checkpoint-runtime.d.ts +0 -61
- package/dist/protocol/wire/checkpoint-runtime.js +0 -499
- package/dist/protocol/wire/checkpoint.d.ts +0 -72
- package/dist/protocol/wire/checkpoint.js +0 -12
- package/dist/protocol/wire/execution.d.ts +0 -391
- package/dist/protocol/wire/execution.js +0 -1
- package/dist/protocol/wire/gateway-contract.d.ts +0 -61
- package/dist/protocol/wire/gateway-contract.js +0 -236
- package/dist/protocol/wire/gateway-contract.test.d.ts +0 -1
- package/dist/protocol/wire/gateway-contract.test.js +0 -123
- package/dist/protocol/wire/gateway-rpc.d.ts +0 -652
- package/dist/protocol/wire/gateway-rpc.js +0 -58
- package/dist/protocol/wire/gateway.d.ts +0 -62
- package/dist/protocol/wire/gateway.js +0 -1
- package/dist/protocol/wire/hook-protocol.d.ts +0 -37
- package/dist/protocol/wire/hook-protocol.js +0 -2
- package/dist/protocol/wire/index.d.ts +0 -28
- package/dist/protocol/wire/index.js +0 -27
- package/dist/protocol/wire/memory-provider-lifecycle.d.ts +0 -82
- package/dist/protocol/wire/memory-provider-lifecycle.js +0 -24
- package/dist/protocol/wire/notification-payloads.d.ts +0 -918
- package/dist/protocol/wire/notification-payloads.js +0 -13
- package/dist/protocol/wire/pet-contracts.d.ts +0 -76
- package/dist/protocol/wire/pet-contracts.js +0 -23
- package/dist/protocol/wire/provider-runtime-contract.d.ts +0 -66
- package/dist/protocol/wire/provider-runtime-contract.js +0 -23
- package/dist/protocol/wire/provider-runtime-core.d.ts +0 -147
- package/dist/protocol/wire/provider-runtime-core.js +0 -488
- package/dist/protocol/wire/provider-runtime-io.d.ts +0 -20
- package/dist/protocol/wire/provider-runtime-io.js +0 -57
- package/dist/protocol/wire/resource-manifest.d.ts +0 -68
- package/dist/protocol/wire/resource-manifest.js +0 -174
- package/dist/protocol/wire/session.d.ts +0 -32
- package/dist/protocol/wire/session.js +0 -1
- package/dist/protocol/wire/thread-protocol.d.ts +0 -145
- package/dist/protocol/wire/thread-protocol.js +0 -13
- package/dist/protocol/wire/transport.d.ts +0 -57
- package/dist/protocol/wire/transport.js +0 -1
- package/dist/protocol/wire/turn.d.ts +0 -208
- package/dist/protocol/wire/turn.js +0 -1
- package/dist/protocol/wire/web-capability.d.ts +0 -54
- package/dist/protocol/wire/web-capability.js +0 -52
- package/dist/runtime/community/community-consent-client.d.ts +0 -142
- package/dist/runtime/community/community-consent-client.js +0 -381
- package/dist/runtime/community/community-consent-client.test.d.ts +0 -1
- package/dist/runtime/community/community-consent-client.test.js +0 -491
- package/dist/runtime/community/community-desensitization-red-team-cli.d.ts +0 -7
- package/dist/runtime/community/community-desensitization-red-team-cli.js +0 -43
- package/dist/runtime/community/community-desensitization-red-team-cli.test.d.ts +0 -1
- package/dist/runtime/community/community-desensitization-red-team-cli.test.js +0 -23
- package/dist/runtime/community/community-desensitization.d.ts +0 -29
- package/dist/runtime/community/community-desensitization.js +0 -81
- package/dist/runtime/community/community-desensitization.test.d.ts +0 -1
- package/dist/runtime/community/community-desensitization.test.js +0 -43
- package/dist/runtime/community/community-discovery-cache.d.ts +0 -24
- package/dist/runtime/community/community-discovery-cache.js +0 -52
- package/dist/runtime/community/community-discovery-coordinator.d.ts +0 -33
- package/dist/runtime/community/community-discovery-coordinator.js +0 -84
- package/dist/runtime/community/community-discovery-coordinator.test.d.ts +0 -1
- package/dist/runtime/community/community-discovery-coordinator.test.js +0 -97
- package/dist/runtime/community/community-pet-publisher.d.ts +0 -30
- package/dist/runtime/community/community-pet-publisher.js +0 -53
- package/dist/runtime/community/community-pet-publisher.test.d.ts +0 -1
- package/dist/runtime/community/community-pet-publisher.test.js +0 -53
- package/dist/runtime/community/community-signal-reporter.d.ts +0 -33
- package/dist/runtime/community/community-signal-reporter.js +0 -85
- package/dist/runtime/community/community-signal-reporter.test.d.ts +0 -1
- package/dist/runtime/community/community-signal-reporter.test.js +0 -100
- package/dist/runtime/community/community-telemetry-metadata.d.ts +0 -4
- package/dist/runtime/community/community-telemetry-metadata.js +0 -42
- package/dist/runtime/community/community-telemetry-recorder.d.ts +0 -6
- package/dist/runtime/community/community-telemetry-recorder.js +0 -31
- package/dist/runtime/community/community-telemetry-types.d.ts +0 -1
- package/dist/runtime/community/community-telemetry-types.js +0 -1
- package/dist/runtime/config/tunable-defaults.d.ts +0 -255
- package/dist/runtime/config/tunable-defaults.js +0 -293
- package/dist/runtime/context/context-compression-strategies.d.ts +0 -301
- package/dist/runtime/context/context-compression-strategies.js +0 -860
- package/dist/runtime/execution/dream-agent.d.ts +0 -260
- package/dist/runtime/execution/dream-agent.js +0 -974
- package/dist/runtime/execution/dream-category-context.d.ts +0 -47
- package/dist/runtime/execution/dream-category-context.js +0 -226
- package/dist/runtime/execution/dream-lock.test.d.ts +0 -1
- package/dist/runtime/execution/dream-lock.test.js +0 -54
- package/dist/runtime/execution/fork-context.d.ts +0 -14
- package/dist/runtime/execution/fork-context.js +0 -20
- package/dist/runtime/execution/fork-context.test.d.ts +0 -1
- package/dist/runtime/execution/fork-context.test.js +0 -101
- package/dist/runtime/execution/forked-agent.d.ts +0 -111
- package/dist/runtime/execution/forked-agent.js +0 -172
- package/dist/runtime/execution/index.d.ts +0 -7
- package/dist/runtime/execution/index.js +0 -8
- package/dist/runtime/execution/memory-decay.d.ts +0 -69
- package/dist/runtime/execution/memory-decay.js +0 -80
- package/dist/runtime/execution/progress-tracker.d.ts +0 -78
- package/dist/runtime/execution/progress-tracker.js +0 -107
- package/dist/runtime/execution/streaming-tool-executor.d.ts +0 -102
- package/dist/runtime/execution/streaming-tool-executor.js +0 -345
- package/dist/runtime/execution/streaming-tool-executor.test.d.ts +0 -1
- package/dist/runtime/execution/streaming-tool-executor.test.js +0 -49
- package/dist/runtime/execution/tool-eligibility.d.ts +0 -36
- package/dist/runtime/execution/tool-eligibility.js +0 -94
- package/dist/runtime/execution/tool-eligibility.test.d.ts +0 -1
- package/dist/runtime/execution/tool-eligibility.test.js +0 -96
- package/dist/runtime/execution/tool-result-storage.d.ts +0 -87
- package/dist/runtime/execution/tool-result-storage.js +0 -274
- package/dist/runtime/hooks/context-compression.d.ts +0 -61
- package/dist/runtime/hooks/context-compression.js +0 -334
- package/dist/runtime/hooks/hook-registry.d.ts +0 -12
- package/dist/runtime/hooks/hook-registry.js +0 -61
- package/dist/runtime/hooks/hook-registry.test.d.ts +0 -1
- package/dist/runtime/hooks/hook-registry.test.js +0 -51
- package/dist/runtime/hooks/index.d.ts +0 -4
- package/dist/runtime/hooks/index.js +0 -5
- package/dist/runtime/hooks/memory-hooks.d.ts +0 -75
- package/dist/runtime/hooks/memory-hooks.js +0 -356
- package/dist/runtime/hooks/skill-recall-hooks.d.ts +0 -37
- package/dist/runtime/hooks/skill-recall-hooks.js +0 -263
- package/dist/runtime/hooks/skill-recall-hooks.test.d.ts +0 -1
- package/dist/runtime/hooks/skill-recall-hooks.test.js +0 -52
- package/dist/runtime/index.d.ts +0 -5
- package/dist/runtime/index.js +0 -13
- package/dist/runtime/infra/acp-detector.d.ts +0 -133
- package/dist/runtime/infra/acp-detector.js +0 -862
- package/dist/runtime/infra/acp-detector.test.d.ts +0 -1
- package/dist/runtime/infra/acp-detector.test.js +0 -164
- package/dist/runtime/infra/acp-host-handler.d.ts +0 -31
- package/dist/runtime/infra/acp-host-handler.js +0 -123
- package/dist/runtime/infra/acp-host-handler.test.d.ts +0 -1
- package/dist/runtime/infra/acp-host-handler.test.js +0 -64
- package/dist/runtime/infra/acp-protocol-adapter.d.ts +0 -146
- package/dist/runtime/infra/acp-protocol-adapter.js +0 -382
- package/dist/runtime/infra/acp-protocol-adapter.test.d.ts +0 -1
- package/dist/runtime/infra/acp-protocol-adapter.test.js +0 -180
- package/dist/runtime/infra/acp-usage-tracker.d.ts +0 -46
- package/dist/runtime/infra/acp-usage-tracker.js +0 -92
- package/dist/runtime/infra/agent-catalog.test.d.ts +0 -1
- package/dist/runtime/infra/agent-catalog.test.js +0 -174
- package/dist/runtime/infra/agent-config-store.d.ts +0 -30
- package/dist/runtime/infra/agent-config-store.js +0 -115
- package/dist/runtime/infra/agent-install-runner.d.ts +0 -57
- package/dist/runtime/infra/agent-install-runner.js +0 -123
- package/dist/runtime/infra/agent-install-runner.test.d.ts +0 -1
- package/dist/runtime/infra/agent-install-runner.test.js +0 -103
- package/dist/runtime/infra/agent-paths.d.ts +0 -67
- package/dist/runtime/infra/agent-paths.js +0 -167
- package/dist/runtime/infra/agent-paths.test.d.ts +0 -1
- package/dist/runtime/infra/agent-paths.test.js +0 -49
- package/dist/runtime/infra/agent-process.d.ts +0 -299
- package/dist/runtime/infra/agent-process.js +0 -1318
- package/dist/runtime/infra/background-tasks.d.ts +0 -115
- package/dist/runtime/infra/background-tasks.js +0 -249
- package/dist/runtime/infra/background-tasks.test.d.ts +0 -1
- package/dist/runtime/infra/background-tasks.test.js +0 -242
- package/dist/runtime/infra/checkpoint-backend.d.ts +0 -8
- package/dist/runtime/infra/checkpoint-backend.js +0 -110
- package/dist/runtime/infra/cleanup-registry.d.ts +0 -23
- package/dist/runtime/infra/cleanup-registry.js +0 -34
- package/dist/runtime/infra/default-path-service.d.ts +0 -33
- package/dist/runtime/infra/default-path-service.js +0 -76
- package/dist/runtime/infra/default-path-service.test.d.ts +0 -1
- package/dist/runtime/infra/default-path-service.test.js +0 -31
- package/dist/runtime/infra/disk-storage.d.ts +0 -20
- package/dist/runtime/infra/disk-storage.js +0 -64
- package/dist/runtime/infra/external-agent-approvals.d.ts +0 -41
- package/dist/runtime/infra/external-agent-approvals.js +0 -101
- package/dist/runtime/infra/external-agent-approvals.test.d.ts +0 -1
- package/dist/runtime/infra/external-agent-approvals.test.js +0 -99
- package/dist/runtime/infra/external-agent-pool.d.ts +0 -54
- package/dist/runtime/infra/external-agent-pool.js +0 -0
- package/dist/runtime/infra/external-agent-pool.test.d.ts +0 -1
- package/dist/runtime/infra/external-agent-pool.test.js +0 -102
- package/dist/runtime/infra/file-watcher.d.ts +0 -72
- package/dist/runtime/infra/file-watcher.js +0 -154
- package/dist/runtime/infra/index.d.ts +0 -19
- package/dist/runtime/infra/index.js +0 -19
- package/dist/runtime/infra/key-injection.test.d.ts +0 -1
- package/dist/runtime/infra/key-injection.test.js +0 -88
- package/dist/runtime/infra/key-pool.d.ts +0 -122
- package/dist/runtime/infra/key-pool.js +0 -378
- package/dist/runtime/infra/key-pool.test.d.ts +0 -1
- package/dist/runtime/infra/key-pool.test.js +0 -36
- package/dist/runtime/infra/llmrouter-catalog.d.ts +0 -84
- package/dist/runtime/infra/llmrouter-catalog.js +0 -287
- package/dist/runtime/infra/llmrouter-catalog.test.d.ts +0 -1
- package/dist/runtime/infra/llmrouter-catalog.test.js +0 -80
- package/dist/runtime/infra/llmrouter-zero-config.test.d.ts +0 -1
- package/dist/runtime/infra/llmrouter-zero-config.test.js +0 -64
- package/dist/runtime/infra/mcp-bridge.d.ts +0 -166
- package/dist/runtime/infra/mcp-bridge.js +0 -161
- package/dist/runtime/infra/media-persistence.d.ts +0 -87
- package/dist/runtime/infra/media-persistence.js +0 -278
- package/dist/runtime/infra/migrate-project-skills.d.ts +0 -21
- package/dist/runtime/infra/migrate-project-skills.js +0 -131
- package/dist/runtime/infra/migrate-project-skills.test.d.ts +0 -1
- package/dist/runtime/infra/migrate-project-skills.test.js +0 -69
- package/dist/runtime/infra/model-id-translator.d.ts +0 -22
- package/dist/runtime/infra/model-id-translator.js +0 -74
- package/dist/runtime/infra/model-registry.d.ts +0 -148
- package/dist/runtime/infra/model-registry.js +0 -529
- package/dist/runtime/infra/model-registry.test.d.ts +0 -1
- package/dist/runtime/infra/model-registry.test.js +0 -253
- package/dist/runtime/infra/process-config-port.d.ts +0 -2
- package/dist/runtime/infra/process-config-port.js +0 -5
- package/dist/runtime/infra/profile-storage.test.d.ts +0 -1
- package/dist/runtime/infra/profile-storage.test.js +0 -41
- package/dist/runtime/infra/project-instructions-store.d.ts +0 -30
- package/dist/runtime/infra/project-instructions-store.js +0 -124
- package/dist/runtime/infra/project-skill-manifest.d.ts +0 -32
- package/dist/runtime/infra/project-skill-manifest.js +0 -160
- package/dist/runtime/infra/project-skill-manifest.test.d.ts +0 -1
- package/dist/runtime/infra/project-skill-manifest.test.js +0 -42
- package/dist/runtime/infra/project-store.d.ts +0 -48
- package/dist/runtime/infra/project-store.js +0 -284
- package/dist/runtime/infra/secure-storage.d.ts +0 -81
- package/dist/runtime/infra/secure-storage.js +0 -117
- package/dist/runtime/infra/skill-injector.d.ts +0 -59
- package/dist/runtime/infra/skill-injector.js +0 -155
- package/dist/runtime/infra/skill-injector.test.d.ts +0 -1
- package/dist/runtime/infra/skill-injector.test.js +0 -9
- package/dist/runtime/infra/skill-resolver.d.ts +0 -51
- package/dist/runtime/infra/skill-resolver.js +0 -109
- package/dist/runtime/infra/skill-resolver.test.d.ts +0 -1
- package/dist/runtime/infra/skill-resolver.test.js +0 -72
- package/dist/runtime/infra/task-runtime.d.ts +0 -71
- package/dist/runtime/infra/task-runtime.js +0 -181
- package/dist/runtime/infra/token-budget.d.ts +0 -92
- package/dist/runtime/infra/token-budget.js +0 -170
- package/dist/runtime/infra/worktree-backend.d.ts +0 -86
- package/dist/runtime/infra/worktree-backend.js +0 -522
- package/dist/runtime/memory/categories.d.ts +0 -5
- package/dist/runtime/memory/categories.js +0 -4
- package/dist/runtime/memory/find-relevant-memories.d.ts +0 -70
- package/dist/runtime/memory/find-relevant-memories.js +0 -270
- package/dist/runtime/memory/implicit-extraction.d.ts +0 -58
- package/dist/runtime/memory/implicit-extraction.js +0 -187
- package/dist/runtime/memory/recall-category-filter.d.ts +0 -54
- package/dist/runtime/memory/recall-category-filter.js +0 -215
- package/dist/runtime/permission-model.d.ts +0 -19
- package/dist/runtime/permission-model.js +0 -24
- package/dist/runtime/permission-model.test.d.ts +0 -1
- package/dist/runtime/permission-model.test.js +0 -32
- package/dist/runtime/pet/hatch-pet-runner.d.ts +0 -18
- package/dist/runtime/pet/hatch-pet-runner.js +0 -120
- package/dist/runtime/pet/hatch-pet-runner.test.d.ts +0 -1
- package/dist/runtime/pet/hatch-pet-runner.test.js +0 -28
- package/dist/runtime/pet/index.d.ts +0 -18
- package/dist/runtime/pet/index.js +0 -9
- package/dist/runtime/pet/pet-community-assets.d.ts +0 -13
- package/dist/runtime/pet/pet-community-assets.js +0 -106
- package/dist/runtime/pet/pet-file-loader.d.ts +0 -5
- package/dist/runtime/pet/pet-file-loader.js +0 -11
- package/dist/runtime/pet/pet-growth-engine.d.ts +0 -2
- package/dist/runtime/pet/pet-growth-engine.js +0 -1
- package/dist/runtime/pet/pet-profile-service.d.ts +0 -91
- package/dist/runtime/pet/pet-profile-service.js +0 -296
- package/dist/runtime/pet/pet-profile-service.test.d.ts +0 -1
- package/dist/runtime/pet/pet-profile-service.test.js +0 -171
- package/dist/runtime/pet/pet-reaction-engine.d.ts +0 -11
- package/dist/runtime/pet/pet-reaction-engine.js +0 -11
- package/dist/runtime/pet/pet-reaction-engine.test.d.ts +0 -1
- package/dist/runtime/pet/pet-reaction-engine.test.js +0 -12
- package/dist/runtime/pet/pet-soul-service.d.ts +0 -21
- package/dist/runtime/pet/pet-soul-service.js +0 -63
- package/dist/runtime/pet/pet-soul-service.test.d.ts +0 -1
- package/dist/runtime/pet/pet-soul-service.test.js +0 -115
- package/dist/runtime/pet/pet-types.d.ts +0 -1
- package/dist/runtime/pet/pet-types.js +0 -1
- package/dist/runtime/pet/petdex-asset.d.ts +0 -32
- package/dist/runtime/pet/petdex-asset.js +0 -242
- package/dist/runtime/pet/petdex-asset.test.d.ts +0 -1
- package/dist/runtime/pet/petdex-asset.test.js +0 -257
- package/dist/runtime/pet/petdex-forge-service.d.ts +0 -19
- package/dist/runtime/pet/petdex-forge-service.js +0 -820
- package/dist/runtime/pet/petdex-forge-service.test.d.ts +0 -1
- package/dist/runtime/pet/petdex-forge-service.test.js +0 -142
- package/dist/runtime/ports/agent-execution-contracts.d.ts +0 -182
- package/dist/runtime/ports/agent-execution-contracts.js +0 -1
- package/dist/runtime/ports/agent-runtime-ports.d.ts +0 -76
- package/dist/runtime/ports/agent-runtime-ports.js +0 -1
- package/dist/runtime/ports/checkpoint-contracts.d.ts +0 -19
- package/dist/runtime/ports/checkpoint-contracts.js +0 -1
- package/dist/runtime/ports/config-port.d.ts +0 -4
- package/dist/runtime/ports/config-port.js +0 -5
- package/dist/runtime/ports/index.d.ts +0 -19
- package/dist/runtime/ports/index.js +0 -5
- package/dist/runtime/ports/memory-provider.d.ts +0 -181
- package/dist/runtime/ports/memory-provider.js +0 -1
- package/dist/runtime/ports/memory-recall-source.d.ts +0 -3
- package/dist/runtime/ports/memory-recall-source.js +0 -1
- package/dist/runtime/ports/memory-writer.d.ts +0 -21
- package/dist/runtime/ports/memory-writer.js +0 -1
- package/dist/runtime/ports/model-transport-contracts.d.ts +0 -125
- package/dist/runtime/ports/model-transport-contracts.js +0 -9
- package/dist/runtime/ports/path-service.d.ts +0 -31
- package/dist/runtime/ports/path-service.js +0 -1
- package/dist/runtime/ports/permission-contracts.d.ts +0 -128
- package/dist/runtime/ports/permission-contracts.js +0 -5
- package/dist/runtime/ports/project-memory-store.d.ts +0 -44
- package/dist/runtime/ports/project-memory-store.js +0 -1
- package/dist/runtime/ports/source-provider.d.ts +0 -39
- package/dist/runtime/ports/source-provider.js +0 -4
- package/dist/runtime/ports/tool-call-contracts.d.ts +0 -16
- package/dist/runtime/ports/tool-call-contracts.js +0 -13
- package/dist/runtime/ports/tool-contracts.d.ts +0 -87
- package/dist/runtime/ports/tool-contracts.js +0 -3
- package/dist/runtime/ports/tool-risk.d.ts +0 -7
- package/dist/runtime/ports/tool-risk.js +0 -16
- package/dist/runtime/ports/web-search-contracts.d.ts +0 -21
- package/dist/runtime/ports/web-search-contracts.js +0 -1
- package/dist/runtime/ports/worktree-contracts.d.ts +0 -22
- package/dist/runtime/ports/worktree-contracts.js +0 -1
- package/dist/runtime/prompt/environment-context.d.ts +0 -60
- package/dist/runtime/prompt/environment-context.js +0 -410
- package/dist/runtime/prompt/environment-context.test.d.ts +0 -1
- package/dist/runtime/prompt/environment-context.test.js +0 -75
- package/dist/runtime/prompt/fresh-workspace-evidence.d.ts +0 -21
- package/dist/runtime/prompt/fresh-workspace-evidence.js +0 -224
- package/dist/runtime/prompt/fresh-workspace-evidence.test.d.ts +0 -1
- package/dist/runtime/prompt/fresh-workspace-evidence.test.js +0 -163
- package/dist/runtime/prompt/index.d.ts +0 -5
- package/dist/runtime/prompt/index.js +0 -6
- package/dist/runtime/prompt/instruction-loader.d.ts +0 -70
- package/dist/runtime/prompt/instruction-loader.js +0 -515
- package/dist/runtime/prompt/instruction-loader.test.d.ts +0 -1
- package/dist/runtime/prompt/instruction-loader.test.js +0 -64
- package/dist/runtime/prompt/prompt-policy.d.ts +0 -12
- package/dist/runtime/prompt/prompt-policy.js +0 -40
- package/dist/runtime/prompt/system-prompt-sections.d.ts +0 -65
- package/dist/runtime/prompt/system-prompt-sections.js +0 -93
- package/dist/runtime/prompt/task-domain.d.ts +0 -82
- package/dist/runtime/prompt/task-domain.js +0 -248
- package/dist/runtime/sandbox/index.d.ts +0 -2
- package/dist/runtime/sandbox/index.js +0 -2
- package/dist/runtime/sandbox/skill-sandbox.d.ts +0 -53
- package/dist/runtime/sandbox/skill-sandbox.js +0 -93
- package/dist/runtime/sandbox/skill-sandbox.test.d.ts +0 -1
- package/dist/runtime/sandbox/skill-sandbox.test.js +0 -172
- package/dist/runtime/sandbox/windows-skill-sandbox.d.ts +0 -78
- package/dist/runtime/sandbox/windows-skill-sandbox.js +0 -128
- package/dist/runtime/session/group-session-split.d.ts +0 -38
- package/dist/runtime/session/group-session-split.js +0 -99
- package/dist/runtime/session/index.d.ts +0 -4
- package/dist/runtime/session/index.js +0 -5
- package/dist/runtime/session/session-catalog.d.ts +0 -4
- package/dist/runtime/session/session-catalog.js +0 -59
- package/dist/runtime/session/session-locator.d.ts +0 -26
- package/dist/runtime/session/session-locator.js +0 -91
- package/dist/runtime/session/session-locator.test.d.ts +0 -1
- package/dist/runtime/session/session-locator.test.js +0 -59
- package/dist/runtime/session/session-metadata-store.d.ts +0 -8
- package/dist/runtime/session/session-metadata-store.js +0 -167
- package/dist/runtime/session/session-paths.d.ts +0 -9
- package/dist/runtime/session/session-paths.js +0 -27
- package/dist/runtime/session/session-persistence.d.ts +0 -16
- package/dist/runtime/session/session-persistence.js +0 -16
- package/dist/runtime/session/session-persistence.test.d.ts +0 -1
- package/dist/runtime/session/session-persistence.test.js +0 -237
- package/dist/runtime/session/session-resume.d.ts +0 -4
- package/dist/runtime/session/session-resume.js +0 -60
- package/dist/runtime/session/session-schema.d.ts +0 -10
- package/dist/runtime/session/session-schema.js +0 -35
- package/dist/runtime/session/session-state.d.ts +0 -96
- package/dist/runtime/session/session-state.js +0 -180
- package/dist/runtime/session/session-summary.d.ts +0 -5
- package/dist/runtime/session/session-summary.js +0 -67
- package/dist/runtime/session/session-transcript-store.d.ts +0 -13
- package/dist/runtime/session/session-transcript-store.js +0 -109
- package/dist/runtime/session/session-types.d.ts +0 -77
- package/dist/runtime/session/session-types.js +0 -1
- package/dist/runtime/session/session-write-queue.d.ts +0 -2
- package/dist/runtime/session/session-write-queue.js +0 -48
- package/dist/runtime/tasks/task-types.d.ts +0 -166
- package/dist/runtime/tasks/task-types.js +0 -64
- package/dist/server/search-svc.d.ts +0 -1
- package/dist/server/search-svc.js +0 -113
- package/dist/skills/index.d.ts +0 -6
- package/dist/skills/index.js +0 -5
- package/dist/skills/mcp/index.d.ts +0 -1
- package/dist/skills/mcp/index.js +0 -3
- package/dist/skills/mcp/mcp-manager.d.ts +0 -75
- package/dist/skills/mcp/mcp-manager.js +0 -358
- package/dist/skills/mcp/mcp-tool-metadata.d.ts +0 -18
- package/dist/skills/mcp/mcp-tool-metadata.js +0 -48
- package/dist/skills/memory/categories.d.ts +0 -1
- package/dist/skills/memory/categories.js +0 -1
- package/dist/skills/memory/find-relevant-memories.d.ts +0 -1
- package/dist/skills/memory/find-relevant-memories.js +0 -1
- package/dist/skills/memory/implicit-extraction.d.ts +0 -1
- package/dist/skills/memory/implicit-extraction.js +0 -1
- package/dist/skills/memory/local-embedding.d.ts +0 -80
- package/dist/skills/memory/local-embedding.js +0 -210
- package/dist/skills/memory/local-memory-provider.d.ts +0 -257
- package/dist/skills/memory/local-memory-provider.js +0 -486
- package/dist/skills/memory/local-store-records.d.ts +0 -184
- package/dist/skills/memory/local-store-records.js +0 -1
- package/dist/skills/memory/local-store.d.ts +0 -479
- package/dist/skills/memory/local-store.js +0 -1022
- package/dist/skills/memory/memdir.d.ts +0 -93
- package/dist/skills/memory/memdir.js +0 -530
- package/dist/skills/memory/memory-attachment-store.d.ts +0 -62
- package/dist/skills/memory/memory-attachment-store.js +0 -0
- package/dist/skills/memory/memory-consolidation.d.ts +0 -43
- package/dist/skills/memory/memory-consolidation.js +0 -462
- package/dist/skills/memory/memory-db-path.d.ts +0 -13
- package/dist/skills/memory/memory-db-path.js +0 -27
- package/dist/skills/memory/memory-embedding-config.d.ts +0 -31
- package/dist/skills/memory/memory-embedding-config.js +0 -66
- package/dist/skills/memory/memory-provider-factory.d.ts +0 -33
- package/dist/skills/memory/memory-provider-factory.js +0 -79
- package/dist/skills/memory/memory-tool.d.ts +0 -85
- package/dist/skills/memory/memory-tool.js +0 -326
- package/dist/skills/memory/memory-vector-utils.d.ts +0 -2
- package/dist/skills/memory/memory-vector-utils.js +0 -19
- package/dist/skills/memory/recall-category-filter.d.ts +0 -1
- package/dist/skills/memory/recall-category-filter.js +0 -1
- package/dist/skills/memory/sqlite-memory-mappers.d.ts +0 -6
- package/dist/skills/memory/sqlite-memory-mappers.js +0 -104
- package/dist/skills/memory/sqlite-memory-schema.d.ts +0 -3
- package/dist/skills/memory/sqlite-memory-schema.js +0 -152
- package/dist/skills/permissions/bash-classifier.d.ts +0 -30
- package/dist/skills/permissions/bash-classifier.js +0 -174
- package/dist/skills/permissions/classifier-cache.d.ts +0 -51
- package/dist/skills/permissions/classifier-cache.js +0 -103
- package/dist/skills/permissions/community-sandbox-policy.d.ts +0 -3
- package/dist/skills/permissions/community-sandbox-policy.js +0 -233
- package/dist/skills/permissions/community-sandbox-red-team-cli.d.ts +0 -7
- package/dist/skills/permissions/community-sandbox-red-team-cli.js +0 -43
- package/dist/skills/permissions/community-sandbox-red-team.d.ts +0 -32
- package/dist/skills/permissions/community-sandbox-red-team.js +0 -221
- package/dist/skills/permissions/denial-audit-log.d.ts +0 -52
- package/dist/skills/permissions/denial-audit-log.js +0 -80
- package/dist/skills/permissions/denial-tracking.d.ts +0 -42
- package/dist/skills/permissions/denial-tracking.js +0 -60
- package/dist/skills/permissions/group-security-policy.d.ts +0 -15
- package/dist/skills/permissions/group-security-policy.js +0 -60
- package/dist/skills/permissions/hook-runner.d.ts +0 -120
- package/dist/skills/permissions/hook-runner.js +0 -545
- package/dist/skills/permissions/index.d.ts +0 -13
- package/dist/skills/permissions/index.js +0 -8
- package/dist/skills/permissions/operation-classifier.d.ts +0 -43
- package/dist/skills/permissions/operation-classifier.js +0 -251
- package/dist/skills/permissions/permission-classifier.d.ts +0 -41
- package/dist/skills/permissions/permission-classifier.js +0 -186
- package/dist/skills/permissions/rule-engine.d.ts +0 -49
- package/dist/skills/permissions/rule-engine.js +0 -285
- package/dist/skills/permissions/settings-watcher.d.ts +0 -19
- package/dist/skills/permissions/settings-watcher.js +0 -121
- package/dist/skills/permissions/types.d.ts +0 -2
- package/dist/skills/permissions/types.js +0 -1
- package/dist/skills/plugins/index.d.ts +0 -2
- package/dist/skills/plugins/index.js +0 -3
- package/dist/skills/plugins/plugin-api.d.ts +0 -38
- package/dist/skills/plugins/plugin-api.js +0 -18
- package/dist/skills/plugins/plugin-loader.d.ts +0 -57
- package/dist/skills/plugins/plugin-loader.js +0 -254
- package/dist/skills/plugins/plugin-marketplace.d.ts +0 -61
- package/dist/skills/plugins/plugin-marketplace.js +0 -229
- package/dist/skills/portable-tool.d.ts +0 -165
- package/dist/skills/portable-tool.js +0 -34
- package/dist/skills/skill-system/skill-frontmatter.d.ts +0 -19
- package/dist/skills/skill-system/skill-frontmatter.js +0 -344
- package/dist/skills/skill-system/skill-guard.d.ts +0 -23
- package/dist/skills/skill-system/skill-guard.js +0 -229
- package/dist/skills/skill-system/skill-lifecycle.d.ts +0 -93
- package/dist/skills/skill-system/skill-lifecycle.js +0 -236
- package/dist/skills/skill-system/skill-source.d.ts +0 -38
- package/dist/skills/skill-system/skill-source.js +0 -75
- package/dist/skills/skill-system/skill-types.d.ts +0 -140
- package/dist/skills/skill-system/skill-types.js +0 -6
- package/dist/skills/skill-system/skill-validation.d.ts +0 -29
- package/dist/skills/skill-system/skill-validation.js +0 -154
- package/dist/skills/tool-access.d.ts +0 -30
- package/dist/skills/tool-access.js +0 -58
- package/dist/skills/tools/agent-tool.d.ts +0 -102
- package/dist/skills/tools/agent-tool.js +0 -159
- package/dist/skills/tools/ask-user-tool.d.ts +0 -80
- package/dist/skills/tools/ask-user-tool.js +0 -121
- package/dist/skills/tools/brief-tool.d.ts +0 -74
- package/dist/skills/tools/brief-tool.js +0 -95
- package/dist/skills/tools/browser-tool.d.ts +0 -114
- package/dist/skills/tools/browser-tool.js +0 -160
- package/dist/skills/tools/checkpoint-tool.d.ts +0 -66
- package/dist/skills/tools/checkpoint-tool.js +0 -102
- package/dist/skills/tools/config-tool.d.ts +0 -61
- package/dist/skills/tools/config-tool.js +0 -123
- package/dist/skills/tools/cron-tool.d.ts +0 -96
- package/dist/skills/tools/cron-tool.js +0 -165
- package/dist/skills/tools/edit-tool.d.ts +0 -43
- package/dist/skills/tools/edit-tool.js +0 -72
- package/dist/skills/tools/exec-tool.d.ts +0 -117
- package/dist/skills/tools/exec-tool.js +0 -354
- package/dist/skills/tools/file-management-tool.d.ts +0 -90
- package/dist/skills/tools/file-management-tool.js +0 -166
- package/dist/skills/tools/image-generate-tool.d.ts +0 -74
- package/dist/skills/tools/image-generate-tool.js +0 -91
- package/dist/skills/tools/instructions-tool.d.ts +0 -65
- package/dist/skills/tools/instructions-tool.js +0 -209
- package/dist/skills/tools/lsp-tool.d.ts +0 -153
- package/dist/skills/tools/lsp-tool.js +0 -230
- package/dist/skills/tools/media-cancel-tool.d.ts +0 -30
- package/dist/skills/tools/media-cancel-tool.js +0 -46
- package/dist/skills/tools/monitor-tool.d.ts +0 -113
- package/dist/skills/tools/monitor-tool.js +0 -129
- package/dist/skills/tools/music-generate-tool.d.ts +0 -80
- package/dist/skills/tools/music-generate-tool.js +0 -98
- package/dist/skills/tools/notebook-edit-tool.d.ts +0 -15
- package/dist/skills/tools/notebook-edit-tool.js +0 -206
- package/dist/skills/tools/patch-tool.d.ts +0 -52
- package/dist/skills/tools/patch-tool.js +0 -556
- package/dist/skills/tools/petdex-create-tool.d.ts +0 -47
- package/dist/skills/tools/petdex-create-tool.js +0 -95
- package/dist/skills/tools/plan-mode-tool.d.ts +0 -98
- package/dist/skills/tools/plan-mode-tool.js +0 -164
- package/dist/skills/tools/read-tool.d.ts +0 -51
- package/dist/skills/tools/read-tool.js +0 -88
- package/dist/skills/tools/search-tool.d.ts +0 -112
- package/dist/skills/tools/search-tool.js +0 -226
- package/dist/skills/tools/shell/bash-provider.d.ts +0 -26
- package/dist/skills/tools/shell/bash-provider.js +0 -125
- package/dist/skills/tools/shell/command-classification.d.ts +0 -44
- package/dist/skills/tools/shell/command-classification.js +0 -119
- package/dist/skills/tools/shell/command-semantics.d.ts +0 -14
- package/dist/skills/tools/shell/command-semantics.js +0 -87
- package/dist/skills/tools/shell/destructive-command-warning.d.ts +0 -10
- package/dist/skills/tools/shell/destructive-command-warning.js +0 -80
- package/dist/skills/tools/shell/exec-permissions.d.ts +0 -52
- package/dist/skills/tools/shell/exec-permissions.js +0 -277
- package/dist/skills/tools/shell/index.d.ts +0 -18
- package/dist/skills/tools/shell/index.js +0 -18
- package/dist/skills/tools/shell/powershell-provider.d.ts +0 -15
- package/dist/skills/tools/shell/powershell-provider.js +0 -80
- package/dist/skills/tools/shell/sandbox/helper-resolver.d.ts +0 -7
- package/dist/skills/tools/shell/sandbox/helper-resolver.js +0 -20
- package/dist/skills/tools/shell/sandbox/landlock-argv.d.ts +0 -6
- package/dist/skills/tools/shell/sandbox/landlock-argv.js +0 -13
- package/dist/skills/tools/shell/sandbox/platform.d.ts +0 -3
- package/dist/skills/tools/shell/sandbox/platform.js +0 -13
- package/dist/skills/tools/shell/sandbox/sandbox-launcher.d.ts +0 -15
- package/dist/skills/tools/shell/sandbox/sandbox-launcher.js +0 -59
- package/dist/skills/tools/shell/sandbox/sandbox-scope.d.ts +0 -6
- package/dist/skills/tools/shell/sandbox/sandbox-scope.js +0 -17
- package/dist/skills/tools/shell/sandbox/sandbox-types.d.ts +0 -47
- package/dist/skills/tools/shell/sandbox/sandbox-types.js +0 -1
- package/dist/skills/tools/shell/sandbox/seatbelt-profile.d.ts +0 -6
- package/dist/skills/tools/shell/sandbox/seatbelt-profile.js +0 -28
- package/dist/skills/tools/shell/shell-command.d.ts +0 -54
- package/dist/skills/tools/shell/shell-command.js +0 -347
- package/dist/skills/tools/shell/shell-exec.d.ts +0 -38
- package/dist/skills/tools/shell/shell-exec.js +0 -202
- package/dist/skills/tools/shell/shell-provider.d.ts +0 -85
- package/dist/skills/tools/shell/shell-provider.js +0 -38
- package/dist/skills/tools/shell/subprocess-env.d.ts +0 -6
- package/dist/skills/tools/shell/subprocess-env.js +0 -87
- package/dist/skills/tools/shell/task-output.d.ts +0 -44
- package/dist/skills/tools/shell/task-output.js +0 -137
- package/dist/skills/tools/skill-tool.d.ts +0 -106
- package/dist/skills/tools/skill-tool.js +0 -265
- package/dist/skills/tools/sleep-tool.d.ts +0 -49
- package/dist/skills/tools/sleep-tool.js +0 -81
- package/dist/skills/tools/structured-output-tool.d.ts +0 -116
- package/dist/skills/tools/structured-output-tool.js +0 -176
- package/dist/skills/tools/stt-tool.d.ts +0 -33
- package/dist/skills/tools/stt-tool.js +0 -58
- package/dist/skills/tools/task-tool.d.ts +0 -125
- package/dist/skills/tools/task-tool.js +0 -390
- package/dist/skills/tools/team-tool.d.ts +0 -156
- package/dist/skills/tools/team-tool.js +0 -173
- package/dist/skills/tools/three-d-generate-tool.d.ts +0 -46
- package/dist/skills/tools/three-d-generate-tool.js +0 -66
- package/dist/skills/tools/tool-search-tool.d.ts +0 -62
- package/dist/skills/tools/tool-search-tool.js +0 -187
- package/dist/skills/tools/tts-tool.d.ts +0 -50
- package/dist/skills/tools/tts-tool.js +0 -58
- package/dist/skills/tools/video-edit-tool.d.ts +0 -72
- package/dist/skills/tools/video-edit-tool.js +0 -84
- package/dist/skills/tools/video-generate-tool.d.ts +0 -162
- package/dist/skills/tools/video-generate-tool.js +0 -178
- package/dist/skills/tools/video-merge-tool.d.ts +0 -105
- package/dist/skills/tools/video-merge-tool.js +0 -95
- package/dist/skills/tools/video-upscale-tool.d.ts +0 -45
- package/dist/skills/tools/video-upscale-tool.js +0 -57
- package/dist/skills/tools/voice-clone-tool.d.ts +0 -40
- package/dist/skills/tools/voice-clone-tool.js +0 -58
- package/dist/skills/tools/web-answer-tool.d.ts +0 -27
- package/dist/skills/tools/web-answer-tool.js +0 -124
- package/dist/skills/tools/web-fetch-tool.d.ts +0 -80
- package/dist/skills/tools/web-fetch-tool.js +0 -95
- package/dist/skills/tools/web-research-tool.d.ts +0 -48
- package/dist/skills/tools/web-research-tool.js +0 -254
- package/dist/skills/tools/web-search-tool.d.ts +0 -46
- package/dist/skills/tools/web-search-tool.js +0 -95
- package/dist/skills/tools/workflow-tool.d.ts +0 -45
- package/dist/skills/tools/workflow-tool.js +0 -113
- package/dist/skills/tools/worktree-tool.d.ts +0 -69
- package/dist/skills/tools/worktree-tool.js +0 -147
- package/dist/skills/tools/write-tool.d.ts +0 -45
- package/dist/skills/tools/write-tool.js +0 -83
- package/dist/skills/tools.d.ts +0 -45
- package/dist/skills/tools.js +0 -165
- package/dist/skills/web-search/brave-source.d.ts +0 -2
- package/dist/skills/web-search/brave-source.js +0 -36
- package/dist/skills/web-search/crawl4ai-extractor.d.ts +0 -15
- package/dist/skills/web-search/crawl4ai-extractor.js +0 -92
- package/dist/skills/web-search/embedding-rerank.d.ts +0 -13
- package/dist/skills/web-search/embedding-rerank.js +0 -44
- package/dist/skills/web-search/exa-source.d.ts +0 -2
- package/dist/skills/web-search/exa-source.js +0 -43
- package/dist/skills/web-search/multi-source-backend.d.ts +0 -23
- package/dist/skills/web-search/multi-source-backend.js +0 -99
- package/dist/skills/web-search/redis-source-cache.d.ts +0 -6
- package/dist/skills/web-search/redis-source-cache.js +0 -44
- package/dist/skills/web-search/search-svc-source.d.ts +0 -4
- package/dist/skills/web-search/search-svc-source.js +0 -64
- package/dist/skills/web-search/searxng-source.d.ts +0 -2
- package/dist/skills/web-search/searxng-source.js +0 -91
- package/dist/skills/web-search/serper-source.d.ts +0 -2
- package/dist/skills/web-search/serper-source.js +0 -33
- package/dist/skills/web-search/source-factory.d.ts +0 -5
- package/dist/skills/web-search/source-factory.js +0 -15
- package/dist/skills/web-search/stability.d.ts +0 -26
- package/dist/skills/web-search/stability.js +0 -57
- package/dist/transport/acp-event-emitter.d.ts +0 -21
- package/dist/transport/acp-event-emitter.js +0 -142
- package/dist/transport/acp-event-emitter.test.d.ts +0 -1
- package/dist/transport/acp-event-emitter.test.js +0 -87
- package/dist/transport/acp-server.d.ts +0 -169
- package/dist/transport/acp-server.js +0 -480
- package/dist/transport/acp-server.test.d.ts +0 -1
- package/dist/transport/acp-server.test.js +0 -230
- package/dist/transport/index.d.ts +0 -7
- package/dist/transport/index.js +0 -5
- package/dist/transport/io-transport.d.ts +0 -19
- package/dist/transport/io-transport.js +0 -8
|
@@ -1,1449 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Workflow mode handlers — ACP surface for the automation workflow engine (plan M2 接入).
|
|
3
|
-
* Exposes workflow.create/get/describe/patch/run/setActive/list/delete over the same RPC host
|
|
4
|
-
* as product/solo. The engine (WorkflowController) lives in qlogicagent (D12); triggers live in
|
|
5
|
-
* the gateway (D7/B) and drive `workflow.run` over ACP.
|
|
6
|
-
*
|
|
7
|
-
* fail-loud throughout (plan §1.5): unknown id / illegal patch / missing capability all throw.
|
|
8
|
-
*/
|
|
9
|
-
import * as fs from "node:fs";
|
|
10
|
-
import * as path from "node:path";
|
|
11
|
-
import { randomUUID } from "node:crypto";
|
|
12
|
-
import { gzipSync } from "node:zlib";
|
|
13
|
-
import { AgentProcessManager } from "../../runtime/infra/agent-process.js";
|
|
14
|
-
import { getUserAgentHome } from "../../runtime/infra/agent-paths.js";
|
|
15
|
-
import * as projectStore from "../../runtime/infra/project-store.js";
|
|
16
|
-
import { AGENT_RPC_ERROR_CODES } from "../../protocol/wire/index.js";
|
|
17
|
-
import { WorkflowController, defaultRuntimeFactory } from "../../orchestration/workflow/workflow-controller.js";
|
|
18
|
-
import { WorkflowStore } from "../../orchestration/workflow/workflow-store.js";
|
|
19
|
-
import { WorkflowRunHistoryStore } from "../../orchestration/workflow/run-history-store.js";
|
|
20
|
-
import { FileRunCheckpoint } from "../../orchestration/workflow/run-checkpoint-store.js";
|
|
21
|
-
import { NodeRegistry } from "../../orchestration/workflow/node-registry.js";
|
|
22
|
-
import { hostExecutors } from "../../orchestration/workflow/host-executors.js";
|
|
23
|
-
import { createQlaExecutorHost } from "../../orchestration/workflow/qla-executor-host.js";
|
|
24
|
-
import { setWorkflowController } from "../../orchestration/workflow/workflow-service.js";
|
|
25
|
-
import { WorkflowScheduler } from "../../orchestration/workflow/workflow-scheduler.js";
|
|
26
|
-
import { toWorkflowBundle, fromWorkflowBundle } from "../../orchestration/workflow/workflow-bundle.js";
|
|
27
|
-
import { WorkflowAuditStore } from "../../orchestration/workflow/workflow-audit-store.js";
|
|
28
|
-
import { workflowsDir } from "../../orchestration/workflow/workflow-store.js";
|
|
29
|
-
import { resolveActiveOwnerUserId } from "../../runtime/infra/agent-paths.js";
|
|
30
|
-
import { convertN8nWorkflow } from "../../orchestration/workflow/n8n-import.js";
|
|
31
|
-
import { buildCapabilityCatalog } from "../../orchestration/workflow/capability-catalog.js";
|
|
32
|
-
import { item } from "../../orchestration/workflow/data-item.js";
|
|
33
|
-
import { Memdir } from "../../skills/memory/memdir.js";
|
|
34
|
-
import { CredentialVault, credentialToHeaders } from "../credential-vault.js";
|
|
35
|
-
import { SENSITIVE_KINDS } from "../../orchestration/workflow/budget-permission-gate.js";
|
|
36
|
-
import { classifyOperation } from "../../skills/permissions/operation-classifier.js";
|
|
37
|
-
import { createDefaultCommunityConsentClient } from "../../runtime/community/community-consent-client.js";
|
|
38
|
-
import { createFileCommunityConsentStore, hasMethodSharingConsent, METHOD_CONSENT_REQUIRED_MESSAGE } from "./community-handler.js";
|
|
39
|
-
/** D15: per-run node-execution hard cap (plan §1.5 / D15 "循环硬上限 1000"). */
|
|
40
|
-
const MAX_NODE_EXECUTIONS = 1000;
|
|
41
|
-
/**
|
|
42
|
-
* Resolve the project root an RPC addresses. `projectId` routes to that project's workspace
|
|
43
|
-
* (fail-loud on unknown ids); without it the active project root is used — the legitimate
|
|
44
|
-
* path for agent-tool/chat-built workflows in the current project (not a compat shim).
|
|
45
|
-
*/
|
|
46
|
-
function resolveWorkflowTarget(p) {
|
|
47
|
-
if (p.projectId !== undefined && p.projectId !== null && p.projectId !== "") {
|
|
48
|
-
const project = projectStore.getProjectById(String(p.projectId));
|
|
49
|
-
if (!project)
|
|
50
|
-
throw new Error(`workflow: unknown projectId "${String(p.projectId)}"`);
|
|
51
|
-
return { cwd: project.workspaceDir, projectId: project.id };
|
|
52
|
-
}
|
|
53
|
-
const active = projectStore.getActiveProject();
|
|
54
|
-
return { cwd: this.getActiveProjectRoot(), projectId: active?.id };
|
|
55
|
-
}
|
|
56
|
-
/** Build (or fetch) the engine bundle for one project root, wired to real capabilities (§1.5). */
|
|
57
|
-
export function ensureWorkflowRoot(target) {
|
|
58
|
-
if (!this.workflowRoots)
|
|
59
|
-
this.workflowRoots = new Map();
|
|
60
|
-
const key = path.resolve(target.cwd);
|
|
61
|
-
const existing = this.workflowRoots.get(key);
|
|
62
|
-
if (existing) {
|
|
63
|
-
// Project ids are stable per dir; backfill when a later call learns it.
|
|
64
|
-
if (!existing.projectId && target.projectId)
|
|
65
|
-
existing.projectId = target.projectId;
|
|
66
|
-
return existing;
|
|
67
|
-
}
|
|
68
|
-
const cwd = target.cwd;
|
|
69
|
-
const store = new WorkflowStore(cwd);
|
|
70
|
-
const pm = new AgentProcessManager({
|
|
71
|
-
log: {
|
|
72
|
-
info: (msg) => process.stderr.write(`[workflow:pm] ${msg}\n`),
|
|
73
|
-
warn: (msg) => process.stderr.write(`[workflow:pm] WARN ${msg}\n`),
|
|
74
|
-
},
|
|
75
|
-
onMcpToolCall: (memberId, tool, args) => this.handleMcpToolCall(memberId, tool, args),
|
|
76
|
-
sessionDir: path.join(getUserAgentHome(), "agent-logs"),
|
|
77
|
-
});
|
|
78
|
-
const execHost = createQlaExecutorHost({
|
|
79
|
-
findTool: (name) => this.toolCatalog.findTool(name),
|
|
80
|
-
// R5 multi-root:tool 节点(exec)钉在本根工作区,不跟随进程级活动项目 cwd。
|
|
81
|
-
workspaceCwd: cwd,
|
|
82
|
-
// D29: vault credential → headers, decrypted at execution time only (owner-scoped vault).
|
|
83
|
-
resolveCredentialHeaders: (credentialId) => {
|
|
84
|
-
const { summary, data } = new CredentialVault().get(credentialId);
|
|
85
|
-
return credentialToHeaders(summary.type, data);
|
|
86
|
-
},
|
|
87
|
-
// IT-7b 无人值守细粒度审计:统一权限引擎的 operation-classifier。D30 的授予是"种类级"
|
|
88
|
-
// (允许 tool 这一类),这里在"操作级"补刀 —— 破坏性 shell / 递归删除 / 写出工作区外,
|
|
89
|
-
// 即使种类被授予也一律拒(无人在场不冒这险;改 attended 跑或拆步骤)。
|
|
90
|
-
auditUnattendedTool: ({ tool, args }) => {
|
|
91
|
-
const c = classifyOperation({ toolName: tool, arguments: args }, { workspaceRoot: cwd });
|
|
92
|
-
if (c.isDestructive || c.isRecursiveDelete) {
|
|
93
|
-
throw new Error(`无人值守运行拒绝破坏性操作:工具「${tool}」被判定为破坏性(递归删除/危险 shell)。请改为手动/口令/表单触发执行,或拆掉该步骤。`);
|
|
94
|
-
}
|
|
95
|
-
if (c.crossWorkspace) {
|
|
96
|
-
throw new Error(`无人值守运行拒绝越界操作:工具「${tool}」的目标路径在项目工作区之外(${c.targetPaths.slice(0, 3).join("、")})。无人值守只允许操作本项目目录。`);
|
|
97
|
-
}
|
|
98
|
-
},
|
|
99
|
-
runAgent: async ({ agentId, prompt, signal }) => {
|
|
100
|
-
// Missing / "self" → run on 小智(qlogicagent)本体:buildExternalDescriptor("qlogicagent")
|
|
101
|
-
// 返回 self-descriptor(R1 自供给路径,从 owner profile 自解析模型),无需配置外部 agent。
|
|
102
|
-
const id = (!agentId || agentId === "self") ? "qlogicagent" : agentId;
|
|
103
|
-
const descriptor = this.acpDetector.buildExternalDescriptor(id);
|
|
104
|
-
if (!descriptor)
|
|
105
|
-
throw new Error(`workflow agent node: agent "${id}" is not available`);
|
|
106
|
-
const memberId = `workflow-agent-${randomUUID().slice(0, 8)}`;
|
|
107
|
-
if (signal?.aborted)
|
|
108
|
-
throw new Error("workflow agent node aborted before dispatch");
|
|
109
|
-
// Agent nodes execute inside the owning project's workspace (automation 产物归项目).
|
|
110
|
-
await pm.spawn({ memberId, name: `workflow-${id}`, cwd, prompt, external: descriptor });
|
|
111
|
-
try {
|
|
112
|
-
const result = await pm.sendTask(memberId, prompt);
|
|
113
|
-
// The reply payload is {content, stopReason} — downstream nodes want the TEXT,
|
|
114
|
-
// not a double-encoded JSON string (the old shape made `.json.text` undefined).
|
|
115
|
-
if (typeof result === "string")
|
|
116
|
-
return result;
|
|
117
|
-
const content = result?.content;
|
|
118
|
-
return typeof content === "string" ? content : JSON.stringify(result);
|
|
119
|
-
}
|
|
120
|
-
finally {
|
|
121
|
-
// fail-loud cleanup: surface (not swallow) unexpected teardown errors (§1.5).
|
|
122
|
-
try {
|
|
123
|
-
pm.kill(memberId);
|
|
124
|
-
pm.remove(memberId);
|
|
125
|
-
}
|
|
126
|
-
catch (e) {
|
|
127
|
-
process.stderr.write(`[workflow:pm] WARN cleanup of ${memberId} failed: ${e instanceof Error ? e.message : String(e)}\n`);
|
|
128
|
-
}
|
|
129
|
-
}
|
|
130
|
-
},
|
|
131
|
-
invokeMcp: ({ server, tool, args }) => this.handleMcpToolCall(`workflow-mcp:${server}`, tool, args),
|
|
132
|
-
// Channel send is fire-and-forget (plan §2.1 A): emit a one-way notification; the openclaw
|
|
133
|
-
// gateway (onLifecycleNotification) delivers via the channel layer. Many IM platforms have no
|
|
134
|
-
// delivery receipt, so the node does not wait for one — returns {queued} immediately.
|
|
135
|
-
sendChannel: async ({ channel, target: to, payload }) => {
|
|
136
|
-
this.sendNotification("workflow.channel.send", { channel, target: to, payload });
|
|
137
|
-
return { queued: true };
|
|
138
|
-
},
|
|
139
|
-
// D34 subworkflow:跨根可调;同步调用栈防环(A→B→A 立即拒,深度上限 8)。
|
|
140
|
-
// 顶层 run 不经此处,所以把 CALLER 也补入链 —— 否则 A↔B 的第二次 run(A) 会卡在
|
|
141
|
-
// controller 并发槽排队(死锁),而不是被守卫立即拒绝。
|
|
142
|
-
runSubworkflow: async ({ workflowId, callerWorkflowId, projectId, payload, signal }) => {
|
|
143
|
-
const target = projectId
|
|
144
|
-
? ensureWorkflowRoot.call(this, resolveWorkflowTarget.call(this, { projectId }))
|
|
145
|
-
: bundle;
|
|
146
|
-
const callerFrame = callerWorkflowId ? `${path.resolve(bundle.cwd)}::${callerWorkflowId}` : null;
|
|
147
|
-
const addedCallerFrame = callerFrame !== null && !subworkflowStack.has(callerFrame);
|
|
148
|
-
if (addedCallerFrame)
|
|
149
|
-
subworkflowStack.add(callerFrame);
|
|
150
|
-
const frame = `${path.resolve(target.cwd)}::${workflowId}`;
|
|
151
|
-
try {
|
|
152
|
-
if (subworkflowStack.has(frame)) {
|
|
153
|
-
throw new Error(`subworkflow cycle detected: "${workflowId}" is already running in this call chain`);
|
|
154
|
-
}
|
|
155
|
-
if (subworkflowStack.size >= 8) {
|
|
156
|
-
throw new Error(`subworkflow depth limit (8) exceeded`);
|
|
157
|
-
}
|
|
158
|
-
subworkflowStack.add(frame);
|
|
159
|
-
try {
|
|
160
|
-
if (signal?.aborted)
|
|
161
|
-
throw new Error("subworkflow aborted before dispatch");
|
|
162
|
-
const outcome = await target.controller.run(workflowId, { type: "manual", payload });
|
|
163
|
-
if (outcome.status !== "completed") {
|
|
164
|
-
throw new Error(`subworkflow "${workflowId}" ended with status "${outcome.status}"`);
|
|
165
|
-
}
|
|
166
|
-
const outputs = {};
|
|
167
|
-
for (const [nodeId, portMap] of Object.entries(outcome.result?.outputs ?? {})) {
|
|
168
|
-
outputs[nodeId] = Object.fromEntries(Object.entries(portMap).map(([port, items]) => [port, items.map((i) => i.json)]));
|
|
169
|
-
}
|
|
170
|
-
return [item({ status: outcome.status, runId: outcome.runId ?? null, outputs })];
|
|
171
|
-
}
|
|
172
|
-
finally {
|
|
173
|
-
subworkflowStack.delete(frame);
|
|
174
|
-
}
|
|
175
|
-
}
|
|
176
|
-
finally {
|
|
177
|
-
if (addedCallerFrame)
|
|
178
|
-
subworkflowStack.delete(callerFrame);
|
|
179
|
-
}
|
|
180
|
-
},
|
|
181
|
-
// D34 human-in-the-loop:通知 owner 并在内存中等待决定(run 保持 running)。
|
|
182
|
-
// 登记表带元数据,workflow.approvals 可随时拉取 —— 推送是快路径,拉取保证刷新/重连后仍可见。
|
|
183
|
-
// R2-E 跨重启:挂起同时持久登记到 pending-approvals.json;决定/超时/取消即删。重启后
|
|
184
|
-
// ensureWorkflowRoot 发现遗留 → 通知 owner「重启中断,重新运行即恢复(前置节点
|
|
185
|
-
// checkpoint 缓存命中秒过,审批会重新弹)」—— 恢复语义复用既有重放机制,无第二轨。
|
|
186
|
-
approval: ({ nodeId, workflowId, prompt, timeoutMs, signal }) => {
|
|
187
|
-
return new Promise((resolve, reject) => {
|
|
188
|
-
const key = randomUUID();
|
|
189
|
-
const meta = {
|
|
190
|
-
approvalId: key,
|
|
191
|
-
workflowId: workflowId ?? "",
|
|
192
|
-
nodeId,
|
|
193
|
-
prompt: prompt ?? "继续执行?",
|
|
194
|
-
requestedAt: new Date().toISOString(),
|
|
195
|
-
...projectTag(bundle),
|
|
196
|
-
};
|
|
197
|
-
persistPendingSuspension(cwd, { kind: "approval", ...meta });
|
|
198
|
-
const settle = () => removePendingSuspension(cwd, key);
|
|
199
|
-
const deadline = setTimeout(() => {
|
|
200
|
-
pendingApprovals.delete(key);
|
|
201
|
-
settle();
|
|
202
|
-
resolve({ approved: false, decidedAt: new Date().toISOString(), note: "超时未审批,自动拒绝" });
|
|
203
|
-
}, timeoutMs ?? 24 * 3600_000);
|
|
204
|
-
const onAbort = () => {
|
|
205
|
-
clearTimeout(deadline);
|
|
206
|
-
pendingApprovals.delete(key);
|
|
207
|
-
settle();
|
|
208
|
-
reject(new Error("approval wait canceled"));
|
|
209
|
-
};
|
|
210
|
-
signal?.addEventListener("abort", onAbort, { once: true });
|
|
211
|
-
pendingApprovals.set(key, {
|
|
212
|
-
meta,
|
|
213
|
-
resolve: (approved, note) => {
|
|
214
|
-
clearTimeout(deadline);
|
|
215
|
-
signal?.removeEventListener("abort", onAbort);
|
|
216
|
-
pendingApprovals.delete(key);
|
|
217
|
-
settle();
|
|
218
|
-
resolve({ approved, decidedAt: new Date().toISOString(), ...(note ? { note } : {}) });
|
|
219
|
-
},
|
|
220
|
-
});
|
|
221
|
-
this.sendNotification("workflow.approvalRequested", meta);
|
|
222
|
-
});
|
|
223
|
-
},
|
|
224
|
-
// D34 wait-until-webhook:挂起分支直到 path 被调用(approval 同款 await-in-memory 单轨;
|
|
225
|
-
// 持久登记同 R2-E,重启遗留同样提示重放恢复)。唤醒在 handleWorkflowOnWebhook。
|
|
226
|
-
waitWebhook: ({ path: hookPath, nodeId, workflowId, timeoutMs, signal }) => {
|
|
227
|
-
return new Promise((resolve, reject) => {
|
|
228
|
-
const key = randomUUID();
|
|
229
|
-
persistPendingSuspension(cwd, {
|
|
230
|
-
kind: "webhook-wait", approvalId: key, workflowId: workflowId ?? "", nodeId,
|
|
231
|
-
prompt: `等待 Webhook ${hookPath}`, requestedAt: new Date().toISOString(), ...projectTag(bundle),
|
|
232
|
-
});
|
|
233
|
-
const settle = () => removePendingSuspension(cwd, key);
|
|
234
|
-
const deadline = setTimeout(() => {
|
|
235
|
-
dropWebhookWaiter(hookPath, key);
|
|
236
|
-
settle();
|
|
237
|
-
reject(new Error(`wait(until=webhook) 超时:${hookPath} 在限期内未被调用`));
|
|
238
|
-
}, timeoutMs ?? 24 * 3600_000);
|
|
239
|
-
const onAbort = () => {
|
|
240
|
-
clearTimeout(deadline);
|
|
241
|
-
dropWebhookWaiter(hookPath, key);
|
|
242
|
-
settle();
|
|
243
|
-
reject(new Error("webhook wait canceled"));
|
|
244
|
-
};
|
|
245
|
-
signal?.addEventListener("abort", onAbort, { once: true });
|
|
246
|
-
const waiters = pendingWebhookWaits.get(hookPath) ?? new Map();
|
|
247
|
-
waiters.set(key, (payload) => {
|
|
248
|
-
clearTimeout(deadline);
|
|
249
|
-
signal?.removeEventListener("abort", onAbort);
|
|
250
|
-
dropWebhookWaiter(hookPath, key);
|
|
251
|
-
settle();
|
|
252
|
-
resolve(payload);
|
|
253
|
-
});
|
|
254
|
-
pendingWebhookWaits.set(hookPath, waiters);
|
|
255
|
-
});
|
|
256
|
-
},
|
|
257
|
-
// Project-scoped memdir backend for `memory` nodes (spec D25): the owning project's
|
|
258
|
-
// .qlogicagent/memory. Real store, fail-loud on op errors (§1.5). Topic keys are
|
|
259
|
-
// normalized to memdir's `.md` naming (storage detail users shouldn't have to know).
|
|
260
|
-
memory: async ({ op, key, value, query }) => {
|
|
261
|
-
const memdir = new Memdir(cwd);
|
|
262
|
-
memdir.ensureInitialized();
|
|
263
|
-
const fileKey = key && !key.endsWith(".md") ? `${key}.md` : key;
|
|
264
|
-
if (op === "read") {
|
|
265
|
-
if (fileKey) {
|
|
266
|
-
const r = await memdir.readFile(fileKey);
|
|
267
|
-
if (!r.ok)
|
|
268
|
-
throw new Error(`memory read "${fileKey}": ${r.message}`);
|
|
269
|
-
return [item({ key: fileKey, content: r.content ?? "" })];
|
|
270
|
-
}
|
|
271
|
-
return [item({ key: "INDEX", content: memdir.getIndexRaw() })];
|
|
272
|
-
}
|
|
273
|
-
if (op === "write") {
|
|
274
|
-
const text = typeof value === "string" ? value : value !== undefined ? JSON.stringify(value) : "";
|
|
275
|
-
if (!text)
|
|
276
|
-
throw new Error(`memory write: empty value (provide params.value or upstream input)`);
|
|
277
|
-
const r = fileKey ? await memdir.writeFile(fileKey, text) : await memdir.addToIndex(text);
|
|
278
|
-
if (!r.ok)
|
|
279
|
-
throw new Error(`memory write${fileKey ? ` "${fileKey}"` : ""}: ${r.message}`);
|
|
280
|
-
return [item({ ok: true, key: fileKey ?? "INDEX", bytes: text.length })];
|
|
281
|
-
}
|
|
282
|
-
if (!query)
|
|
283
|
-
throw new Error(`memory search requires "query"`);
|
|
284
|
-
const hits = await memdir.searchLocal(query);
|
|
285
|
-
return [item({ hits: hits })];
|
|
286
|
-
},
|
|
287
|
-
});
|
|
288
|
-
const registry = new NodeRegistry();
|
|
289
|
-
for (const [kind, exec] of Object.entries(hostExecutors)) {
|
|
290
|
-
registry.register(kind, exec);
|
|
291
|
-
}
|
|
292
|
-
const bundle = {
|
|
293
|
-
cwd,
|
|
294
|
-
projectId: target.projectId,
|
|
295
|
-
store,
|
|
296
|
-
pm,
|
|
297
|
-
runHistory: new WorkflowRunHistoryStore(cwd),
|
|
298
|
-
audit: new WorkflowAuditStore(workflowsDir(cwd)),
|
|
299
|
-
// controller/scheduler assigned below (need the bundle reference for projectId-tagged events).
|
|
300
|
-
controller: undefined,
|
|
301
|
-
scheduler: undefined,
|
|
302
|
-
};
|
|
303
|
-
const runtimeFactory = defaultRuntimeFactory({
|
|
304
|
-
registry,
|
|
305
|
-
host: execHost,
|
|
306
|
-
budget: { maxNodeExecutions: MAX_NODE_EXECUTIONS },
|
|
307
|
-
checkpoint: (workflowId, runId) => new FileRunCheckpoint(cwd, workflowId, runId),
|
|
308
|
-
// Per-node live status → canvas coloring (gateway auto-forwards via ALL_WS_EVENT_NAMES).
|
|
309
|
-
emitNodeStatus: (workflowId, nodeId, status) => this.sendNotification("workflow.nodeStatus", { workflowId, nodeId, status, ...projectTag(bundle) }),
|
|
310
|
-
});
|
|
311
|
-
bundle.controller = new WorkflowController(store, runtimeFactory, bundle.runHistory);
|
|
312
|
-
// Trigger layer (M3): reuse the tested scheduler in-process. The gateway owns activation
|
|
313
|
-
// (workflow.setActive) + IM/webhook sources; cron timing fires here via the existing scheduler.
|
|
314
|
-
bundle.scheduler = new WorkflowScheduler({
|
|
315
|
-
controller: bundle.controller,
|
|
316
|
-
onError: (err, workflowId) => {
|
|
317
|
-
// fail-loud: a timer-driven (cron) run has no caller to throw back to (§1.5).
|
|
318
|
-
const message = err instanceof Error ? err.message : String(err);
|
|
319
|
-
process.stderr.write(`[workflow:scheduler] run error for ${workflowId}: ${message}\n`);
|
|
320
|
-
},
|
|
321
|
-
onRunStarted: (workflowId, triggerType) => this.sendNotification("workflow.runStarted", { workflowId, triggerType, ...projectTag(bundle) }),
|
|
322
|
-
onRunCompleted: (outcome, triggerType) => emitWorkflowRunCompleted.call(this, bundle, outcome, triggerType),
|
|
323
|
-
onRunFailed: (workflowId, triggerType, err) => this.sendNotification("workflow.runFailed", { workflowId, triggerType, error: errorMessage(err), ...projectTag(bundle) }),
|
|
324
|
-
// D32 防洪:同一工作流的无人值守触发(webhook/IM/cron)最小间隔(生产装配点显式开)。
|
|
325
|
-
minTriggerIntervalMs: 5_000,
|
|
326
|
-
// D32 防洪死信:被限流丢弃的触发必须可见(通知 + stderr),绝不静默丢。
|
|
327
|
-
onTriggerDropped: (workflowId, triggerType, detail) => {
|
|
328
|
-
process.stderr.write(`[workflow:scheduler] trigger dropped (rate-limit) wf=${workflowId} type=${triggerType} sinceLast=${detail.sinceLastMs}ms\n`);
|
|
329
|
-
this.sendNotification("workflow.triggerDropped", { workflowId, triggerType, ...detail, ...projectTag(bundle) });
|
|
330
|
-
},
|
|
331
|
-
});
|
|
332
|
-
this.workflowRoots.set(key, bundle);
|
|
333
|
-
// The agent-facing `workflow` tool operates on the ACTIVE project (single-track sharing):
|
|
334
|
-
// publish (and re-publish on later active-root ensures) only that root's controller.
|
|
335
|
-
if (path.resolve(this.getActiveProjectRoot()) === key) {
|
|
336
|
-
setWorkflowController(bundle.controller);
|
|
337
|
-
}
|
|
338
|
-
// Arm active workflows (spec §B4 restart re-registration). fail-loud on startup failure.
|
|
339
|
-
bundle.scheduler.start().catch(e => {
|
|
340
|
-
process.stderr.write(`[workflow:scheduler] start failed for ${cwd}: ${e instanceof Error ? e.message : String(e)}\n`);
|
|
341
|
-
});
|
|
342
|
-
// R2-E 重启遗留:上个进程留下的挂起(审批/等 webhook)等待者已死——告警引导重放恢复
|
|
343
|
-
// (重新运行时 checkpoint 让已完成节点缓存命中秒过,审批/等待会重新发起),并留审计痕。
|
|
344
|
-
const lost = readPendingSuspensions(cwd);
|
|
345
|
-
if (lost.length > 0) {
|
|
346
|
-
for (const rec of lost) {
|
|
347
|
-
this.sendNotification("workflow.alert", {
|
|
348
|
-
workflowId: rec.workflowId,
|
|
349
|
-
kind: "suspension-lost-on-restart",
|
|
350
|
-
suspensionKind: rec.kind,
|
|
351
|
-
nodeId: rec.nodeId,
|
|
352
|
-
prompt: rec.prompt,
|
|
353
|
-
...projectTag(bundle),
|
|
354
|
-
});
|
|
355
|
-
bundle.audit.append({
|
|
356
|
-
ts: new Date().toISOString(),
|
|
357
|
-
actor: "system",
|
|
358
|
-
action: "suspensionLostOnRestart",
|
|
359
|
-
workflowId: rec.workflowId,
|
|
360
|
-
detail: { kind: rec.kind, nodeId: rec.nodeId, requestedAt: rec.requestedAt },
|
|
361
|
-
});
|
|
362
|
-
}
|
|
363
|
-
writePendingSuspensions(cwd, []);
|
|
364
|
-
}
|
|
365
|
-
return bundle;
|
|
366
|
-
}
|
|
367
|
-
/**
|
|
368
|
-
* Ensure engine roots for the active project AND every automation project (spec D21).
|
|
369
|
-
* Called by aggregate surfaces (list / IM / webhook): the gateway's arm-on-connect
|
|
370
|
-
* workflow.list therefore arms cron triggers across ALL automation projects (§B4).
|
|
371
|
-
*/
|
|
372
|
-
function ensureAllWorkflowRoots() {
|
|
373
|
-
const bundles = new Map();
|
|
374
|
-
const active = ensureWorkflowRoot.call(this, resolveWorkflowTarget.call(this, {}));
|
|
375
|
-
bundles.set(path.resolve(active.cwd), active);
|
|
376
|
-
for (const project of projectStore.listProjects()) {
|
|
377
|
-
if (project.type !== "automation")
|
|
378
|
-
continue;
|
|
379
|
-
const bundle = ensureWorkflowRoot.call(this, { cwd: project.workspaceDir, projectId: project.id });
|
|
380
|
-
bundles.set(path.resolve(bundle.cwd), bundle);
|
|
381
|
-
}
|
|
382
|
-
return [...bundles.values()];
|
|
383
|
-
}
|
|
384
|
-
/** Notification tag: which project a workflow event belongs to (multi-root routing for the UI). */
|
|
385
|
-
/** D38 audit helper: stamp WHO (active owner) did WHAT to WHICH workflow. */
|
|
386
|
-
function audit(bundle, action, workflowId, detail) {
|
|
387
|
-
bundle.audit.append({
|
|
388
|
-
ts: new Date().toISOString(),
|
|
389
|
-
actor: resolveActiveOwnerUserId(),
|
|
390
|
-
action,
|
|
391
|
-
workflowId,
|
|
392
|
-
...(detail ? { detail } : {}),
|
|
393
|
-
});
|
|
394
|
-
}
|
|
395
|
-
function projectTag(bundle) {
|
|
396
|
-
return bundle.projectId ? { projectId: bundle.projectId } : {};
|
|
397
|
-
}
|
|
398
|
-
function params(msg) {
|
|
399
|
-
return msg.params ?? {};
|
|
400
|
-
}
|
|
401
|
-
function fail(msg, message) {
|
|
402
|
-
if (msg.id !== undefined) {
|
|
403
|
-
this.sendResponse(msg.id, undefined, { code: AGENT_RPC_ERROR_CODES.INVALID_PARAMS, message });
|
|
404
|
-
}
|
|
405
|
-
}
|
|
406
|
-
/** Resolve target root for an RPC, surfacing bad projectIds as INVALID_PARAMS (fail-loud). */
|
|
407
|
-
function targetBundle(msg, p) {
|
|
408
|
-
try {
|
|
409
|
-
return ensureWorkflowRoot.call(this, resolveWorkflowTarget.call(this, p));
|
|
410
|
-
}
|
|
411
|
-
catch (err) {
|
|
412
|
-
fail.call(this, msg, errorMessage(err));
|
|
413
|
-
return undefined;
|
|
414
|
-
}
|
|
415
|
-
}
|
|
416
|
-
function workflowSnapshot(record, bundle) {
|
|
417
|
-
return {
|
|
418
|
-
id: record.id,
|
|
419
|
-
name: record.name,
|
|
420
|
-
...(record.owner ? { owner: record.owner } : {}),
|
|
421
|
-
active: record.active,
|
|
422
|
-
concurrency: record.concurrency,
|
|
423
|
-
rev: record.rev,
|
|
424
|
-
createdAt: record.createdAt,
|
|
425
|
-
updatedAt: record.updatedAt,
|
|
426
|
-
...(record.trigger !== undefined ? { trigger: record.trigger } : {}),
|
|
427
|
-
...(record.permissionScope !== undefined ? { permissionScope: record.permissionScope } : {}),
|
|
428
|
-
...(bundle?.projectId ? { projectId: bundle.projectId } : {}),
|
|
429
|
-
// D31 versioning: status is DERIVED (single truth = publishedDef/active/archived fields).
|
|
430
|
-
status: record.archived ? "archived" : record.active ? "active" : record.publishedDef ? "paused" : "draft",
|
|
431
|
-
...(record.publishedRev !== undefined ? { publishedRev: record.publishedRev } : {}),
|
|
432
|
-
draftAhead: record.publishedRev !== undefined ? record.rev > record.publishedRev : record.publishedDef == null,
|
|
433
|
-
def: record.def,
|
|
434
|
-
};
|
|
435
|
-
}
|
|
436
|
-
function emitWorkflowRecord(method, record, bundle) {
|
|
437
|
-
this.sendNotification(method, { workflow: workflowSnapshot(record, bundle), ...projectTag(bundle) });
|
|
438
|
-
}
|
|
439
|
-
/** D33 连败告警:同一工作流连续失败计数(成功清零);阈值即告警(loud,经 inbox/活动日志可见)。 */
|
|
440
|
-
const CONSECUTIVE_FAILURE_ALERT_THRESHOLD = 3;
|
|
441
|
-
const consecutiveFailures = new Map();
|
|
442
|
-
/** D34 子流程同步调用栈(防环/限深;同进程内跨根共享)。 */
|
|
443
|
-
const subworkflowStack = new Set();
|
|
444
|
-
/** D34 审批挂起表:approvalId → resolver + 展示元数据(workflow.approve 消费;重启即丢=run fail loud)。 */
|
|
445
|
-
const pendingApprovals = new Map();
|
|
446
|
-
/** D34 wait-until-webhook 唤醒表:path → (suspensionId → wake(payload))。 */
|
|
447
|
-
const pendingWebhookWaits = new Map();
|
|
448
|
-
function dropWebhookWaiter(hookPath, id) {
|
|
449
|
-
const waiters = pendingWebhookWaits.get(hookPath);
|
|
450
|
-
waiters?.delete(id);
|
|
451
|
-
if (waiters && waiters.size === 0)
|
|
452
|
-
pendingWebhookWaits.delete(hookPath);
|
|
453
|
-
}
|
|
454
|
-
function pendingSuspensionsFile(cwd) {
|
|
455
|
-
return path.join(workflowsDir(cwd), "pending-suspensions.json");
|
|
456
|
-
}
|
|
457
|
-
function readPendingSuspensions(cwd) {
|
|
458
|
-
try {
|
|
459
|
-
const raw = JSON.parse(fs.readFileSync(pendingSuspensionsFile(cwd), "utf8"));
|
|
460
|
-
return Array.isArray(raw) ? raw : [];
|
|
461
|
-
}
|
|
462
|
-
catch {
|
|
463
|
-
return [];
|
|
464
|
-
}
|
|
465
|
-
}
|
|
466
|
-
function writePendingSuspensions(cwd, list) {
|
|
467
|
-
try {
|
|
468
|
-
const file = pendingSuspensionsFile(cwd);
|
|
469
|
-
fs.mkdirSync(path.dirname(file), { recursive: true });
|
|
470
|
-
fs.writeFileSync(file, JSON.stringify(list, null, 2), "utf8");
|
|
471
|
-
}
|
|
472
|
-
catch (err) {
|
|
473
|
-
process.stderr.write(`[workflow:suspension] WRITE FAILED: ${err instanceof Error ? err.message : String(err)}\n`);
|
|
474
|
-
}
|
|
475
|
-
}
|
|
476
|
-
function persistPendingSuspension(cwd, rec) {
|
|
477
|
-
writePendingSuspensions(cwd, [...readPendingSuspensions(cwd), rec]);
|
|
478
|
-
}
|
|
479
|
-
function removePendingSuspension(cwd, approvalId) {
|
|
480
|
-
writePendingSuspensions(cwd, readPendingSuspensions(cwd).filter((r) => r.approvalId !== approvalId));
|
|
481
|
-
}
|
|
482
|
-
/** `workflow.approvals` — 列出全部挂起审批(刷新/重连后的拉取恢复路径;推送通知是快路径)。 */
|
|
483
|
-
export async function handleWorkflowApprovals(msg) {
|
|
484
|
-
if (msg.id !== undefined) {
|
|
485
|
-
this.sendResponse(msg.id, { approvals: [...pendingApprovals.values()].map((p) => p.meta) });
|
|
486
|
-
}
|
|
487
|
-
}
|
|
488
|
-
/** `workflow.approve` — 人工审批决定(approved=false 即拒绝);未知/过期 id fail-loud。 */
|
|
489
|
-
export async function handleWorkflowApprove(msg) {
|
|
490
|
-
const p = params(msg);
|
|
491
|
-
if (typeof p.approvalId !== "string" || typeof p.approved !== "boolean") {
|
|
492
|
-
return fail.call(this, msg, "workflow.approve requires `approvalId` and boolean `approved`");
|
|
493
|
-
}
|
|
494
|
-
const pending = pendingApprovals.get(p.approvalId);
|
|
495
|
-
if (!pending)
|
|
496
|
-
return fail.call(this, msg, `approval "${p.approvalId}" not found (已决定/超时/重启丢失)`);
|
|
497
|
-
pending.resolve(p.approved, typeof p.note === "string" && p.note ? p.note : undefined);
|
|
498
|
-
if (msg.id !== undefined)
|
|
499
|
-
this.sendResponse(msg.id, { ok: true });
|
|
500
|
-
}
|
|
501
|
-
/**
|
|
502
|
-
* `workflow.onForm` — form 触发(D34):校验活跃 form 触发 + 必填字段,以表单值为 $trigger 起 run。
|
|
503
|
-
* attended(用户亲手填表提交)。
|
|
504
|
-
*/
|
|
505
|
-
export async function handleWorkflowOnForm(msg) {
|
|
506
|
-
const p = params(msg);
|
|
507
|
-
if (!p.workflowId || typeof p.values !== "object" || p.values === null) {
|
|
508
|
-
return fail.call(this, msg, "workflow.onForm requires `workflowId` and `values` object");
|
|
509
|
-
}
|
|
510
|
-
const bundle = targetBundle.call(this, msg, p);
|
|
511
|
-
if (!bundle)
|
|
512
|
-
return;
|
|
513
|
-
const workflowId = String(p.workflowId);
|
|
514
|
-
const record = await bundle.controller.get(workflowId);
|
|
515
|
-
// attended(用户亲手填表)= 跑草稿(D31),所以不要求 active —— 只要求表单定义在。
|
|
516
|
-
if (record.trigger?.type !== "form") {
|
|
517
|
-
return fail.call(this, msg, `workflow "${workflowId}" has no form trigger`);
|
|
518
|
-
}
|
|
519
|
-
const values = p.values;
|
|
520
|
-
for (const field of record.trigger.fields) {
|
|
521
|
-
if (field.required && (values[field.key] === undefined || values[field.key] === "")) {
|
|
522
|
-
return fail.call(this, msg, `表单缺少必填项「${field.label ?? field.key}」`);
|
|
523
|
-
}
|
|
524
|
-
}
|
|
525
|
-
this.sendNotification("workflow.runStarted", { workflowId, triggerType: "form", ...projectTag(bundle) });
|
|
526
|
-
let outcome;
|
|
527
|
-
try {
|
|
528
|
-
outcome = await bundle.controller.run(workflowId, { type: "form", payload: { type: "form", ...values } });
|
|
529
|
-
emitWorkflowRunCompleted.call(this, bundle, outcome, "form");
|
|
530
|
-
}
|
|
531
|
-
catch (err) {
|
|
532
|
-
this.sendNotification("workflow.runFailed", { workflowId, triggerType: "form", error: errorMessage(err), ...projectTag(bundle) });
|
|
533
|
-
throw err;
|
|
534
|
-
}
|
|
535
|
-
if (msg.id !== undefined)
|
|
536
|
-
this.sendResponse(msg.id, outcome);
|
|
537
|
-
}
|
|
538
|
-
function emitWorkflowRunCompleted(bundle, outcome, triggerType) {
|
|
539
|
-
if (outcome.status === "failed" || outcome.status === "canceled") {
|
|
540
|
-
this.sendNotification("workflow.runFailed", {
|
|
541
|
-
workflowId: outcome.workflowId,
|
|
542
|
-
triggerType,
|
|
543
|
-
error: outcome.status === "canceled" ? "Workflow run canceled" : "Workflow run failed",
|
|
544
|
-
outcome,
|
|
545
|
-
...projectTag(bundle),
|
|
546
|
-
});
|
|
547
|
-
if (outcome.status === "failed") {
|
|
548
|
-
const n = (consecutiveFailures.get(outcome.workflowId) ?? 0) + 1;
|
|
549
|
-
consecutiveFailures.set(outcome.workflowId, n);
|
|
550
|
-
if (n >= CONSECUTIVE_FAILURE_ALERT_THRESHOLD) {
|
|
551
|
-
process.stderr.write(`[workflow:alert] "${outcome.workflowId}" failed ${n} consecutive runs\n`);
|
|
552
|
-
this.sendNotification("workflow.alert", {
|
|
553
|
-
workflowId: outcome.workflowId,
|
|
554
|
-
kind: "consecutive-failures",
|
|
555
|
-
count: n,
|
|
556
|
-
triggerType,
|
|
557
|
-
...projectTag(bundle),
|
|
558
|
-
});
|
|
559
|
-
}
|
|
560
|
-
}
|
|
561
|
-
return;
|
|
562
|
-
}
|
|
563
|
-
consecutiveFailures.delete(outcome.workflowId);
|
|
564
|
-
this.sendNotification("workflow.runCompleted", {
|
|
565
|
-
workflowId: outcome.workflowId,
|
|
566
|
-
status: outcome.status,
|
|
567
|
-
triggerType,
|
|
568
|
-
outcome,
|
|
569
|
-
...projectTag(bundle),
|
|
570
|
-
});
|
|
571
|
-
}
|
|
572
|
-
function errorMessage(err) {
|
|
573
|
-
return err instanceof Error ? err.message : String(err);
|
|
574
|
-
}
|
|
575
|
-
export async function handleWorkflowCreate(msg) {
|
|
576
|
-
const p = params(msg);
|
|
577
|
-
if (!p.def)
|
|
578
|
-
return fail.call(this, msg, "workflow.create requires `def`");
|
|
579
|
-
const bundle = targetBundle.call(this, msg, p);
|
|
580
|
-
if (!bundle)
|
|
581
|
-
return;
|
|
582
|
-
const id = String(p.id ?? `wf_${randomUUID().slice(0, 8)}`);
|
|
583
|
-
const record = await bundle.controller.create({
|
|
584
|
-
id,
|
|
585
|
-
name: String(p.name ?? id),
|
|
586
|
-
owner: resolveActiveOwnerUserId(),
|
|
587
|
-
def: p.def,
|
|
588
|
-
concurrency: p.concurrency,
|
|
589
|
-
active: p.active === true,
|
|
590
|
-
});
|
|
591
|
-
if (record.active)
|
|
592
|
-
await bundle.scheduler.refresh(record.id);
|
|
593
|
-
audit(bundle, "created", record.id, { name: record.name });
|
|
594
|
-
emitWorkflowRecord.call(this, "workflow.created", record, bundle);
|
|
595
|
-
if (msg.id !== undefined)
|
|
596
|
-
this.sendResponse(msg.id, workflowSnapshot(record, bundle));
|
|
597
|
-
}
|
|
598
|
-
export async function handleWorkflowGet(msg) {
|
|
599
|
-
const p = params(msg);
|
|
600
|
-
if (!p.id)
|
|
601
|
-
return fail.call(this, msg, "workflow.get requires `id`");
|
|
602
|
-
const bundle = targetBundle.call(this, msg, p);
|
|
603
|
-
if (!bundle)
|
|
604
|
-
return;
|
|
605
|
-
const record = await bundle.controller.get(String(p.id));
|
|
606
|
-
const snap = workflowSnapshot(record, bundle);
|
|
607
|
-
// D31: the published snapshot is opt-in (diff preview) — list/update payloads stay lean.
|
|
608
|
-
if (p.includePublished === true && record.publishedDef)
|
|
609
|
-
snap.publishedDef = record.publishedDef;
|
|
610
|
-
if (msg.id !== undefined)
|
|
611
|
-
this.sendResponse(msg.id, snap);
|
|
612
|
-
}
|
|
613
|
-
export async function handleWorkflowDescribe(msg) {
|
|
614
|
-
const p = params(msg);
|
|
615
|
-
if (!p.id)
|
|
616
|
-
return fail.call(this, msg, "workflow.describe requires `id`");
|
|
617
|
-
const bundle = targetBundle.call(this, msg, p);
|
|
618
|
-
if (!bundle)
|
|
619
|
-
return;
|
|
620
|
-
const rendered = await bundle.controller.describe(String(p.id));
|
|
621
|
-
if (msg.id !== undefined)
|
|
622
|
-
this.sendResponse(msg.id, { rendered });
|
|
623
|
-
}
|
|
624
|
-
export async function handleWorkflowPatch(msg) {
|
|
625
|
-
const p = params(msg);
|
|
626
|
-
if (!p.id || !p.patch)
|
|
627
|
-
return fail.call(this, msg, "workflow.patch requires `id` and `patch`");
|
|
628
|
-
const bundle = targetBundle.call(this, msg, p);
|
|
629
|
-
if (!bundle)
|
|
630
|
-
return;
|
|
631
|
-
const env = {
|
|
632
|
-
patch: p.patch,
|
|
633
|
-
baseRev: p.baseRev,
|
|
634
|
-
scope: p.scope,
|
|
635
|
-
};
|
|
636
|
-
const outcome = await bundle.controller.patch(String(p.id), env);
|
|
637
|
-
// A patch may set/clear the trigger or activation → re-arm the scheduler.
|
|
638
|
-
await bundle.scheduler.refresh(String(p.id));
|
|
639
|
-
if (outcome.ok) {
|
|
640
|
-
audit(bundle, "patched", String(p.id), { ops: (env.patch ?? []).map((op) => op.op) });
|
|
641
|
-
emitWorkflowRecord.call(this, "workflow.updated", await bundle.controller.get(String(p.id)), bundle);
|
|
642
|
-
}
|
|
643
|
-
if (msg.id !== undefined)
|
|
644
|
-
this.sendResponse(msg.id, outcome);
|
|
645
|
-
}
|
|
646
|
-
export async function handleWorkflowRun(msg) {
|
|
647
|
-
const p = params(msg);
|
|
648
|
-
if (!p.id)
|
|
649
|
-
return fail.call(this, msg, "workflow.run requires `id`");
|
|
650
|
-
const bundle = targetBundle.call(this, msg, p);
|
|
651
|
-
if (!bundle)
|
|
652
|
-
return;
|
|
653
|
-
const trigger = p.trigger ?? { type: "manual" };
|
|
654
|
-
const workflowId = String(p.id);
|
|
655
|
-
this.sendNotification("workflow.runStarted", { workflowId, triggerType: trigger.type, ...projectTag(bundle) });
|
|
656
|
-
let outcome;
|
|
657
|
-
try {
|
|
658
|
-
// R5 reuseCache(D44):工作室画布显式跨 run 缓存(改参数只重跑下游);默认关。
|
|
659
|
-
outcome = await bundle.controller.run(workflowId, trigger, { reuseCache: p.reuseCache === true });
|
|
660
|
-
emitWorkflowRunCompleted.call(this, bundle, outcome, trigger.type);
|
|
661
|
-
}
|
|
662
|
-
catch (err) {
|
|
663
|
-
this.sendNotification("workflow.runFailed", { workflowId, triggerType: trigger.type, error: errorMessage(err), ...projectTag(bundle) });
|
|
664
|
-
throw err;
|
|
665
|
-
}
|
|
666
|
-
if (msg.id !== undefined)
|
|
667
|
-
this.sendResponse(msg.id, outcome);
|
|
668
|
-
}
|
|
669
|
-
/**
|
|
670
|
-
* `workflow.update` — record-level meta/def update (rename, whole-def replacement from the
|
|
671
|
-
* chat builder, concurrency). Graph micro-edits stay on workflow.patch; trigger stays a
|
|
672
|
-
* set_trigger patch op (single track each).
|
|
673
|
-
*/
|
|
674
|
-
export async function handleWorkflowUpdate(msg) {
|
|
675
|
-
const p = params(msg);
|
|
676
|
-
if (!p.id)
|
|
677
|
-
return fail.call(this, msg, "workflow.update requires `id`");
|
|
678
|
-
if (p.name === undefined && p.def === undefined && p.concurrency === undefined) {
|
|
679
|
-
return fail.call(this, msg, "workflow.update requires at least one of `name`/`def`/`concurrency`");
|
|
680
|
-
}
|
|
681
|
-
const bundle = targetBundle.call(this, msg, p);
|
|
682
|
-
if (!bundle)
|
|
683
|
-
return;
|
|
684
|
-
const record = await bundle.controller.update(String(p.id), {
|
|
685
|
-
...(p.name !== undefined ? { name: String(p.name) } : {}),
|
|
686
|
-
...(p.def !== undefined ? { def: p.def } : {}),
|
|
687
|
-
...(p.concurrency !== undefined ? { concurrency: p.concurrency } : {}),
|
|
688
|
-
});
|
|
689
|
-
await bundle.scheduler.refresh(record.id);
|
|
690
|
-
audit(bundle, "updated", record.id, { fields: ["name", "def", "concurrency"].filter((f) => p[f] !== undefined) });
|
|
691
|
-
emitWorkflowRecord.call(this, "workflow.updated", record, bundle);
|
|
692
|
-
if (msg.id !== undefined)
|
|
693
|
-
this.sendResponse(msg.id, workflowSnapshot(record, bundle));
|
|
694
|
-
}
|
|
695
|
-
export async function handleWorkflowSetActive(msg) {
|
|
696
|
-
const p = params(msg);
|
|
697
|
-
if (!p.id || typeof p.active !== "boolean")
|
|
698
|
-
return fail.call(this, msg, "workflow.setActive requires `id` and boolean `active`");
|
|
699
|
-
const bundle = targetBundle.call(this, msg, p);
|
|
700
|
-
if (!bundle)
|
|
701
|
-
return;
|
|
702
|
-
let record;
|
|
703
|
-
try {
|
|
704
|
-
record = await bundle.controller.setActive(String(p.id), p.active);
|
|
705
|
-
}
|
|
706
|
-
catch (err) {
|
|
707
|
-
// D31 lifecycle refusals (unpublished/archived) are caller-fixable → error response, not a crash.
|
|
708
|
-
return fail.call(this, msg, errorMessage(err));
|
|
709
|
-
}
|
|
710
|
-
await bundle.scheduler.refresh(record.id);
|
|
711
|
-
audit(bundle, p.active ? "activated" : "deactivated", record.id);
|
|
712
|
-
emitWorkflowRecord.call(this, "workflow.updated", record, bundle);
|
|
713
|
-
if (msg.id !== undefined)
|
|
714
|
-
this.sendResponse(msg.id, workflowSnapshot(record, bundle));
|
|
715
|
-
}
|
|
716
|
-
export async function handleWorkflowList(msg) {
|
|
717
|
-
const p = params(msg);
|
|
718
|
-
if (p.projectId) {
|
|
719
|
-
const bundle = targetBundle.call(this, msg, p);
|
|
720
|
-
if (!bundle)
|
|
721
|
-
return;
|
|
722
|
-
const records = await bundle.store.list();
|
|
723
|
-
if (msg.id !== undefined)
|
|
724
|
-
this.sendResponse(msg.id, { workflows: records.map(r => workflowSnapshot(r, bundle)) });
|
|
725
|
-
return;
|
|
726
|
-
}
|
|
727
|
-
// Aggregate across the active root + every automation project (spec D21). The gateway's
|
|
728
|
-
// arm-on-connect workflow.list lands here, which also arms every root's scheduler (§B4).
|
|
729
|
-
const bundles = ensureAllWorkflowRoots.call(this);
|
|
730
|
-
const workflows = [];
|
|
731
|
-
for (const bundle of bundles) {
|
|
732
|
-
const records = await bundle.store.list();
|
|
733
|
-
workflows.push(...records.map(r => workflowSnapshot(r, bundle)));
|
|
734
|
-
}
|
|
735
|
-
if (msg.id !== undefined)
|
|
736
|
-
this.sendResponse(msg.id, { workflows });
|
|
737
|
-
}
|
|
738
|
-
export async function handleWorkflowDelete(msg) {
|
|
739
|
-
const p = params(msg);
|
|
740
|
-
if (!p.id)
|
|
741
|
-
return fail.call(this, msg, "workflow.delete requires `id`");
|
|
742
|
-
const bundle = targetBundle.call(this, msg, p);
|
|
743
|
-
if (!bundle)
|
|
744
|
-
return;
|
|
745
|
-
await bundle.controller.delete(String(p.id));
|
|
746
|
-
await bundle.scheduler.refresh(String(p.id)); // drop any armed trigger for the deleted workflow
|
|
747
|
-
audit(bundle, "deleted", String(p.id));
|
|
748
|
-
this.sendNotification("workflow.deleted", { workflowId: String(p.id), ...projectTag(bundle) });
|
|
749
|
-
if (msg.id !== undefined)
|
|
750
|
-
this.sendResponse(msg.id, { ok: true });
|
|
751
|
-
}
|
|
752
|
-
/**
|
|
753
|
-
* `workflow.cancelRun` — stop an in-flight run (D32; engine support landed with the teammate's
|
|
754
|
-
* runId/AbortController work, this exposes it on the RPC face + a UI stop button). Cancels the
|
|
755
|
-
* newest active run when runId is omitted. fail-loud when nothing is running.
|
|
756
|
-
*/
|
|
757
|
-
export async function handleWorkflowCancelRun(msg) {
|
|
758
|
-
const p = params(msg);
|
|
759
|
-
if (!p.id)
|
|
760
|
-
return fail.call(this, msg, "workflow.cancelRun requires `id`");
|
|
761
|
-
const bundle = targetBundle.call(this, msg, p);
|
|
762
|
-
if (!bundle)
|
|
763
|
-
return;
|
|
764
|
-
let outcome;
|
|
765
|
-
try {
|
|
766
|
-
outcome = await bundle.controller.cancelRun(String(p.id), {
|
|
767
|
-
...(typeof p.runId === "string" && p.runId ? { runId: p.runId } : {}),
|
|
768
|
-
reason: typeof p.reason === "string" && p.reason ? p.reason : "用户停止了运行",
|
|
769
|
-
});
|
|
770
|
-
}
|
|
771
|
-
catch (err) {
|
|
772
|
-
return fail.call(this, msg, errorMessage(err));
|
|
773
|
-
}
|
|
774
|
-
emitWorkflowRunCompleted.call(this, bundle, outcome, "manual");
|
|
775
|
-
if (msg.id !== undefined)
|
|
776
|
-
this.sendResponse(msg.id, outcome);
|
|
777
|
-
}
|
|
778
|
-
// ── Observability (spec D33/D36, IT-9) ─────────────────────────────────────────
|
|
779
|
-
/**
|
|
780
|
-
* `workflow.dryRun` — test-run the DRAFT with an optional simulated trigger payload, WITHOUT
|
|
781
|
-
* recording into run history (D36: test runs stay out of production stats). Returns the full
|
|
782
|
-
* outcome incl. per-node trace for inspection.
|
|
783
|
-
*/
|
|
784
|
-
export async function handleWorkflowDryRun(msg) {
|
|
785
|
-
const p = params(msg);
|
|
786
|
-
if (!p.id)
|
|
787
|
-
return fail.call(this, msg, "workflow.dryRun requires `id`");
|
|
788
|
-
const bundle = targetBundle.call(this, msg, p);
|
|
789
|
-
if (!bundle)
|
|
790
|
-
return;
|
|
791
|
-
const workflowId = String(p.id);
|
|
792
|
-
this.sendNotification("workflow.runStarted", { workflowId, triggerType: "manual", ...projectTag(bundle) });
|
|
793
|
-
let outcome;
|
|
794
|
-
try {
|
|
795
|
-
outcome = await bundle.controller.run(workflowId, { type: "manual", payload: p.payload }, { recordHistory: false });
|
|
796
|
-
emitWorkflowRunCompleted.call(this, bundle, outcome, "manual");
|
|
797
|
-
}
|
|
798
|
-
catch (err) {
|
|
799
|
-
this.sendNotification("workflow.runFailed", { workflowId, triggerType: "manual", error: errorMessage(err), ...projectTag(bundle) });
|
|
800
|
-
return fail.call(this, msg, errorMessage(err));
|
|
801
|
-
}
|
|
802
|
-
if (msg.id !== undefined)
|
|
803
|
-
this.sendResponse(msg.id, { ...outcome, dryRun: true });
|
|
804
|
-
}
|
|
805
|
-
/** `workflow.metrics` — aggregate run history into success-rate/duration/trigger stats (D33). */
|
|
806
|
-
export async function handleWorkflowMetrics(msg) {
|
|
807
|
-
const p = params(msg);
|
|
808
|
-
if (!p.id)
|
|
809
|
-
return fail.call(this, msg, "workflow.metrics requires `id`");
|
|
810
|
-
const bundle = targetBundle.call(this, msg, p);
|
|
811
|
-
if (!bundle)
|
|
812
|
-
return;
|
|
813
|
-
const runs = await bundle.runHistory.list(String(p.id));
|
|
814
|
-
const settled = runs.filter((r) => r.status !== "running");
|
|
815
|
-
const completed = settled.filter((r) => r.status === "completed");
|
|
816
|
-
const failed = settled.filter((r) => r.status === "failed");
|
|
817
|
-
const durations = settled.map((r) => r.durationMs).filter((d) => typeof d === "number");
|
|
818
|
-
let consecutiveFailures = 0;
|
|
819
|
-
for (const r of settled) {
|
|
820
|
-
if (r.status === "failed")
|
|
821
|
-
consecutiveFailures++;
|
|
822
|
-
else
|
|
823
|
-
break;
|
|
824
|
-
}
|
|
825
|
-
const byTrigger = {};
|
|
826
|
-
for (const r of settled)
|
|
827
|
-
byTrigger[r.triggerType] = (byTrigger[r.triggerType] ?? 0) + 1;
|
|
828
|
-
if (msg.id !== undefined) {
|
|
829
|
-
this.sendResponse(msg.id, {
|
|
830
|
-
metrics: {
|
|
831
|
-
totalRuns: settled.length,
|
|
832
|
-
completed: completed.length,
|
|
833
|
-
failed: failed.length,
|
|
834
|
-
canceled: settled.filter((r) => r.status === "canceled").length,
|
|
835
|
-
successRate: settled.length > 0 ? completed.length / settled.length : null,
|
|
836
|
-
avgDurationMs: durations.length > 0 ? Math.round(durations.reduce((a, b) => a + b, 0) / durations.length) : null,
|
|
837
|
-
lastRunAt: settled[0]?.startedAt ?? null,
|
|
838
|
-
consecutiveFailures,
|
|
839
|
-
byTrigger,
|
|
840
|
-
windowSize: runs.length,
|
|
841
|
-
},
|
|
842
|
-
});
|
|
843
|
-
}
|
|
844
|
-
}
|
|
845
|
-
// ── Versioning lifecycle (spec D31, IT-8) ──────────────────────────────────────
|
|
846
|
-
/** `workflow.publish` — snapshot the draft as the trigger-run version (D31). */
|
|
847
|
-
export async function handleWorkflowPublish(msg) {
|
|
848
|
-
const p = params(msg);
|
|
849
|
-
if (!p.id)
|
|
850
|
-
return fail.call(this, msg, "workflow.publish requires `id`");
|
|
851
|
-
const bundle = targetBundle.call(this, msg, p);
|
|
852
|
-
if (!bundle)
|
|
853
|
-
return;
|
|
854
|
-
let record;
|
|
855
|
-
try {
|
|
856
|
-
record = await bundle.controller.publish(String(p.id));
|
|
857
|
-
}
|
|
858
|
-
catch (err) {
|
|
859
|
-
return fail.call(this, msg, errorMessage(err));
|
|
860
|
-
}
|
|
861
|
-
audit(bundle, "published", record.id, { rev: record.publishedRev });
|
|
862
|
-
emitWorkflowRecord.call(this, "workflow.updated", record, bundle);
|
|
863
|
-
if (msg.id !== undefined)
|
|
864
|
-
this.sendResponse(msg.id, workflowSnapshot(record, bundle));
|
|
865
|
-
}
|
|
866
|
-
/** `workflow.archive` — keep the data, kill the lifecycle (deactivate + refuse runs). */
|
|
867
|
-
export async function handleWorkflowArchive(msg) {
|
|
868
|
-
const p = params(msg);
|
|
869
|
-
if (!p.id || typeof p.archived !== "boolean")
|
|
870
|
-
return fail.call(this, msg, "workflow.archive requires `id` and boolean `archived`");
|
|
871
|
-
const bundle = targetBundle.call(this, msg, p);
|
|
872
|
-
if (!bundle)
|
|
873
|
-
return;
|
|
874
|
-
const record = await bundle.controller.archive(String(p.id), p.archived);
|
|
875
|
-
await bundle.scheduler.refresh(record.id); // archived ⇒ inactive ⇒ disarm
|
|
876
|
-
audit(bundle, p.archived ? "archived" : "unarchived", record.id);
|
|
877
|
-
emitWorkflowRecord.call(this, "workflow.updated", record, bundle);
|
|
878
|
-
if (msg.id !== undefined)
|
|
879
|
-
this.sendResponse(msg.id, workflowSnapshot(record, bundle));
|
|
880
|
-
}
|
|
881
|
-
// ── Credential vault (spec D29, IT-7) ──────────────────────────────────────────
|
|
882
|
-
// Owner-scoped; list is secret-free; decrypted payloads NEVER cross the RPC face.
|
|
883
|
-
export async function handleCredentialList(msg) {
|
|
884
|
-
const credentials = new CredentialVault().list();
|
|
885
|
-
if (msg.id !== undefined)
|
|
886
|
-
this.sendResponse(msg.id, { credentials });
|
|
887
|
-
}
|
|
888
|
-
export async function handleCredentialCreate(msg) {
|
|
889
|
-
const p = params(msg);
|
|
890
|
-
if (!p.type || !p.label || typeof p.data !== "object" || p.data === null) {
|
|
891
|
-
return fail.call(this, msg, "credential.create requires `type`, `label`, and `data` object");
|
|
892
|
-
}
|
|
893
|
-
try {
|
|
894
|
-
const summary = new CredentialVault().create({
|
|
895
|
-
type: p.type,
|
|
896
|
-
label: String(p.label),
|
|
897
|
-
data: p.data,
|
|
898
|
-
meta: p.meta ?? undefined,
|
|
899
|
-
});
|
|
900
|
-
if (msg.id !== undefined)
|
|
901
|
-
this.sendResponse(msg.id, summary);
|
|
902
|
-
}
|
|
903
|
-
catch (err) {
|
|
904
|
-
return fail.call(this, msg, errorMessage(err));
|
|
905
|
-
}
|
|
906
|
-
}
|
|
907
|
-
export async function handleCredentialDelete(msg) {
|
|
908
|
-
const p = params(msg);
|
|
909
|
-
if (!p.id)
|
|
910
|
-
return fail.call(this, msg, "credential.delete requires `id`");
|
|
911
|
-
const deleted = new CredentialVault().delete(String(p.id));
|
|
912
|
-
if (msg.id !== undefined)
|
|
913
|
-
this.sendResponse(msg.id, { ok: deleted });
|
|
914
|
-
}
|
|
915
|
-
/** Pending OAuth dances keyed by `state` (single-process; entries expire after 10 minutes). */
|
|
916
|
-
const pendingOAuth = new Map();
|
|
917
|
-
/**
|
|
918
|
-
* `credential.oauthStart` — create an oauth2 credential (config persisted, token pending) and
|
|
919
|
-
* return the authorize URL the UI opens in the browser. The gateway's /api/oauth/callback lands
|
|
920
|
-
* the code on credential.oauthComplete.
|
|
921
|
-
*/
|
|
922
|
-
export async function handleCredentialOauthStart(msg) {
|
|
923
|
-
const p = params(msg);
|
|
924
|
-
for (const key of ["label", "authUrl", "tokenUrl", "clientId", "redirectUri"]) {
|
|
925
|
-
if (typeof p[key] !== "string" || !p[key])
|
|
926
|
-
return fail.call(this, msg, `credential.oauthStart requires \`${key}\``);
|
|
927
|
-
}
|
|
928
|
-
try {
|
|
929
|
-
const vault = new CredentialVault();
|
|
930
|
-
const scopes = typeof p.scopes === "string" ? p.scopes : "";
|
|
931
|
-
const summary = vault.create({
|
|
932
|
-
type: "oauth2",
|
|
933
|
-
label: String(p.label),
|
|
934
|
-
data: {
|
|
935
|
-
tokenUrl: String(p.tokenUrl),
|
|
936
|
-
clientId: String(p.clientId),
|
|
937
|
-
...(typeof p.clientSecret === "string" && p.clientSecret ? { clientSecret: p.clientSecret } : {}),
|
|
938
|
-
...(scopes ? { scopes } : {}),
|
|
939
|
-
},
|
|
940
|
-
meta: { ...(scopes ? { scopes } : {}), pending: true },
|
|
941
|
-
});
|
|
942
|
-
const state = randomUUID();
|
|
943
|
-
// Expire stale dances so an abandoned state can't be replayed much later.
|
|
944
|
-
const now = Date.now();
|
|
945
|
-
for (const [s, entry] of pendingOAuth)
|
|
946
|
-
if (entry.expiresAt < now)
|
|
947
|
-
pendingOAuth.delete(s);
|
|
948
|
-
pendingOAuth.set(state, {
|
|
949
|
-
credentialId: summary.id,
|
|
950
|
-
tokenUrl: String(p.tokenUrl),
|
|
951
|
-
clientId: String(p.clientId),
|
|
952
|
-
...(typeof p.clientSecret === "string" && p.clientSecret ? { clientSecret: p.clientSecret } : {}),
|
|
953
|
-
redirectUri: String(p.redirectUri),
|
|
954
|
-
expiresAt: now + 10 * 60_000,
|
|
955
|
-
});
|
|
956
|
-
const u = new URL(String(p.authUrl));
|
|
957
|
-
u.searchParams.set("response_type", "code");
|
|
958
|
-
u.searchParams.set("client_id", String(p.clientId));
|
|
959
|
-
u.searchParams.set("redirect_uri", String(p.redirectUri));
|
|
960
|
-
u.searchParams.set("state", state);
|
|
961
|
-
if (scopes)
|
|
962
|
-
u.searchParams.set("scope", scopes);
|
|
963
|
-
if (msg.id !== undefined)
|
|
964
|
-
this.sendResponse(msg.id, { credentialId: summary.id, authorizeUrl: u.toString(), state });
|
|
965
|
-
}
|
|
966
|
-
catch (err) {
|
|
967
|
-
return fail.call(this, msg, errorMessage(err));
|
|
968
|
-
}
|
|
969
|
-
}
|
|
970
|
-
/** `credential.oauthComplete` — exchange the authorization code and store tokens in the vault. */
|
|
971
|
-
export async function handleCredentialOauthComplete(msg) {
|
|
972
|
-
const p = params(msg);
|
|
973
|
-
if (typeof p.state !== "string" || typeof p.code !== "string" || !p.state || !p.code) {
|
|
974
|
-
return fail.call(this, msg, "credential.oauthComplete requires `state` and `code`");
|
|
975
|
-
}
|
|
976
|
-
const pending = pendingOAuth.get(p.state);
|
|
977
|
-
if (!pending || pending.expiresAt < Date.now()) {
|
|
978
|
-
pendingOAuth.delete(p.state);
|
|
979
|
-
return fail.call(this, msg, "OAuth state unknown or expired — restart the authorization");
|
|
980
|
-
}
|
|
981
|
-
pendingOAuth.delete(p.state);
|
|
982
|
-
try {
|
|
983
|
-
const body = new URLSearchParams({
|
|
984
|
-
grant_type: "authorization_code",
|
|
985
|
-
code: p.code,
|
|
986
|
-
redirect_uri: pending.redirectUri,
|
|
987
|
-
client_id: pending.clientId,
|
|
988
|
-
...(pending.clientSecret ? { client_secret: pending.clientSecret } : {}),
|
|
989
|
-
});
|
|
990
|
-
const res = await fetch(pending.tokenUrl, {
|
|
991
|
-
method: "POST",
|
|
992
|
-
headers: { "Content-Type": "application/x-www-form-urlencoded", Accept: "application/json" },
|
|
993
|
-
body: body.toString(),
|
|
994
|
-
});
|
|
995
|
-
const text = await res.text();
|
|
996
|
-
if (!res.ok)
|
|
997
|
-
throw new Error(`token exchange failed (${res.status}): ${text.slice(0, 200)}`);
|
|
998
|
-
const tok = JSON.parse(text);
|
|
999
|
-
if (!tok.access_token)
|
|
1000
|
-
throw new Error(`token endpoint returned no access_token: ${text.slice(0, 200)}`);
|
|
1001
|
-
const vault = new CredentialVault();
|
|
1002
|
-
const { data } = vault.get(pending.credentialId);
|
|
1003
|
-
vault.updateData(pending.credentialId, {
|
|
1004
|
-
...data,
|
|
1005
|
-
accessToken: tok.access_token,
|
|
1006
|
-
...(tok.refresh_token ? { refreshToken: tok.refresh_token } : {}),
|
|
1007
|
-
...(tok.expires_in ? { expiresAt: new Date(Date.now() + tok.expires_in * 1000).toISOString() } : {}),
|
|
1008
|
-
}, { pending: undefined }); // token 落地 → 不再「待授权」
|
|
1009
|
-
if (msg.id !== undefined)
|
|
1010
|
-
this.sendResponse(msg.id, { ok: true, credentialId: pending.credentialId });
|
|
1011
|
-
}
|
|
1012
|
-
catch (err) {
|
|
1013
|
-
return fail.call(this, msg, errorMessage(err));
|
|
1014
|
-
}
|
|
1015
|
-
}
|
|
1016
|
-
/**
|
|
1017
|
-
* `workflow.setPermissionScope` — the owner's explicit unattended capability grant (D30):
|
|
1018
|
-
* which sensitive kinds this workflow may run under schedule/im/webhook triggers.
|
|
1019
|
-
*/
|
|
1020
|
-
export async function handleWorkflowSetPermissionScope(msg) {
|
|
1021
|
-
const p = params(msg);
|
|
1022
|
-
if (!p.id)
|
|
1023
|
-
return fail.call(this, msg, "workflow.setPermissionScope requires `id`");
|
|
1024
|
-
if (p.allowUnattendedKinds !== null && !Array.isArray(p.allowUnattendedKinds)) {
|
|
1025
|
-
return fail.call(this, msg, "workflow.setPermissionScope requires `allowUnattendedKinds` array (or null to revoke)");
|
|
1026
|
-
}
|
|
1027
|
-
const bundle = targetBundle.call(this, msg, p);
|
|
1028
|
-
if (!bundle)
|
|
1029
|
-
return;
|
|
1030
|
-
const scope = p.allowUnattendedKinds === null
|
|
1031
|
-
? null
|
|
1032
|
-
: {
|
|
1033
|
-
allowUnattendedKinds: p.allowUnattendedKinds.filter((k) => typeof k === "string"),
|
|
1034
|
-
grantedAt: new Date().toISOString(),
|
|
1035
|
-
};
|
|
1036
|
-
const record = await bundle.controller.update(String(p.id), { permissionScope: scope });
|
|
1037
|
-
audit(bundle, scope ? "permissionGranted" : "permissionRevoked", record.id, scope ? { kinds: scope.allowUnattendedKinds } : undefined);
|
|
1038
|
-
emitWorkflowRecord.call(this, "workflow.updated", record, bundle);
|
|
1039
|
-
if (msg.id !== undefined)
|
|
1040
|
-
this.sendResponse(msg.id, workflowSnapshot(record, bundle));
|
|
1041
|
-
}
|
|
1042
|
-
// ── Capability catalog (spec D24, IT-3) ────────────────────────────────────────
|
|
1043
|
-
/**
|
|
1044
|
-
* `workflow.capabilities` — enumerate the real agents/tools/skills/mcp/memory a workflow in the
|
|
1045
|
-
* target project can reference (single source of truth, five consumers: AI builder prompt,
|
|
1046
|
-
* "+" suggestions, advanced node library, config dropdowns, Hub requires checks). Channels are
|
|
1047
|
-
* gateway-owned: the gateway merges its channel registry into this response in ws-server.
|
|
1048
|
-
*/
|
|
1049
|
-
export async function handleWorkflowCapabilities(msg) {
|
|
1050
|
-
const p = params(msg);
|
|
1051
|
-
let projectRoot;
|
|
1052
|
-
try {
|
|
1053
|
-
projectRoot = resolveWorkflowTarget.call(this, p).cwd;
|
|
1054
|
-
}
|
|
1055
|
-
catch (err) {
|
|
1056
|
-
return fail.call(this, msg, errorMessage(err));
|
|
1057
|
-
}
|
|
1058
|
-
const capabilities = buildCapabilityCatalog({
|
|
1059
|
-
getToolManifest: () => this.toolCatalog.getToolManifest(),
|
|
1060
|
-
listAgentIds: () => [
|
|
1061
|
-
{ id: "qlogicagent", name: "小智(默认)" },
|
|
1062
|
-
...this.acpDetector.list().filter((a) => a.status === "available" && a.id !== "qlogicagent").map((a) => ({ id: a.id, name: a.name })),
|
|
1063
|
-
],
|
|
1064
|
-
projectRoot,
|
|
1065
|
-
});
|
|
1066
|
-
if (msg.id !== undefined)
|
|
1067
|
-
this.sendResponse(msg.id, { capabilities });
|
|
1068
|
-
}
|
|
1069
|
-
// ── Portable bundles: export / import / duplicate (spec D23, IT-1) ─────────────
|
|
1070
|
-
/** `workflow.export` — serialize one workflow as a sanitized portable bundle (no credentials). */
|
|
1071
|
-
export async function handleWorkflowExport(msg) {
|
|
1072
|
-
const p = params(msg);
|
|
1073
|
-
if (!p.id)
|
|
1074
|
-
return fail.call(this, msg, "workflow.export requires `id`");
|
|
1075
|
-
const bundle = targetBundle.call(this, msg, p);
|
|
1076
|
-
if (!bundle)
|
|
1077
|
-
return;
|
|
1078
|
-
const record = await bundle.controller.get(String(p.id));
|
|
1079
|
-
const exported = toWorkflowBundle(record);
|
|
1080
|
-
if (msg.id !== undefined)
|
|
1081
|
-
this.sendResponse(msg.id, { bundle: exported });
|
|
1082
|
-
}
|
|
1083
|
-
/** Human trigger summary for the Hub gallery card (mirrors the UI's list summary). */
|
|
1084
|
-
function summarizeTriggerForHub(trigger) {
|
|
1085
|
-
switch (trigger?.type) {
|
|
1086
|
-
case "schedule": return trigger.cron ? `定时 ${trigger.cron}` : "定时";
|
|
1087
|
-
case "intent": return trigger.phrases?.length ? `口令「${trigger.phrases[0]}」` : "口令触发";
|
|
1088
|
-
case "im-message": return trigger.channel ? `IM 消息 · ${trigger.channel}` : "IM 消息";
|
|
1089
|
-
case "webhook": return trigger.path ? `Webhook ${trigger.path}` : "Webhook";
|
|
1090
|
-
case "form": return "表单触发";
|
|
1091
|
-
case "manual": return "手动触发";
|
|
1092
|
-
default: return undefined;
|
|
1093
|
-
}
|
|
1094
|
-
}
|
|
1095
|
-
/**
|
|
1096
|
-
* `workflow.publishHub` — publish a workflow to the community Hub (IT-5, spec D35):
|
|
1097
|
-
* sanitized bundle (D23 — credential values already stripped) becomes the gzip payload;
|
|
1098
|
-
* the WorkflowManifest is DERIVED from the record (trigger summary, node count, sensitive
|
|
1099
|
-
* capability kinds as declaredPermissions, credential/capability requirements), so the
|
|
1100
|
-
* publisher only supplies presentation fields. Same consent + review pipeline as skills.
|
|
1101
|
-
*/
|
|
1102
|
-
export async function handleWorkflowPublishHub(msg) {
|
|
1103
|
-
const p = params(msg);
|
|
1104
|
-
if (!p.id || typeof p.slug !== "string" || !p.slug || typeof p.summary !== "string" || !p.summary.trim()) {
|
|
1105
|
-
return fail.call(this, msg, "workflow.publishHub requires `id`, `slug`, `summary`");
|
|
1106
|
-
}
|
|
1107
|
-
const bundle = targetBundle.call(this, msg, p);
|
|
1108
|
-
if (!bundle)
|
|
1109
|
-
return;
|
|
1110
|
-
const record = await bundle.controller.get(String(p.id));
|
|
1111
|
-
const store = this.resolveCommunityConsentStore?.() ?? createFileCommunityConsentStore();
|
|
1112
|
-
const consent = await store.read();
|
|
1113
|
-
if (!hasMethodSharingConsent(consent)) {
|
|
1114
|
-
return fail.call(this, msg, METHOD_CONSENT_REQUIRED_MESSAGE);
|
|
1115
|
-
}
|
|
1116
|
-
const client = this.resolveCommunityConsentClient ? this.resolveCommunityConsentClient() : createDefaultCommunityConsentClient();
|
|
1117
|
-
if (!client) {
|
|
1118
|
-
return fail.call(this, msg, "Community hub is unavailable (登录后才能发布).");
|
|
1119
|
-
}
|
|
1120
|
-
const exported = toWorkflowBundle(record);
|
|
1121
|
-
const usedKinds = new Set(record.def.nodes.map((n) => n.kind));
|
|
1122
|
-
const manifest = {
|
|
1123
|
-
schema_version: 15,
|
|
1124
|
-
kind: "executable",
|
|
1125
|
-
name: record.name,
|
|
1126
|
-
summary: String(p.summary).trim(),
|
|
1127
|
-
description: typeof p.description === "string" && p.description.trim() ? p.description.trim() : String(p.summary).trim(),
|
|
1128
|
-
entry: "bundle.json",
|
|
1129
|
-
declaredPermissions: [...usedKinds].filter((k) => SENSITIVE_KINDS.has(k)).sort(),
|
|
1130
|
-
...(summarizeTriggerForHub(record.trigger) ? { triggerSummary: summarizeTriggerForHub(record.trigger) } : {}),
|
|
1131
|
-
nodeCount: record.def.nodes.length,
|
|
1132
|
-
...(exported.credentialsRequired.length > 0 ? { credentialsRequired: exported.credentialsRequired.map((c) => c.label) } : {}),
|
|
1133
|
-
...(exported.requires.length > 0 ? { capabilityRequires: exported.requires.map((r) => `${r.category}:${r.ref}`) } : {}),
|
|
1134
|
-
...(Array.isArray(p.tags) && p.tags.length > 0 ? { tags: p.tags.filter((t) => typeof t === "string") } : {}),
|
|
1135
|
-
};
|
|
1136
|
-
try {
|
|
1137
|
-
const result = await client.publishWorkflow({
|
|
1138
|
-
id: String(p.slug),
|
|
1139
|
-
title: record.name,
|
|
1140
|
-
summary: String(p.summary).trim(),
|
|
1141
|
-
visibility: p.visibility === "private" ? "private" : "public",
|
|
1142
|
-
...(typeof p.category === "string" && p.category ? { category: p.category } : {}),
|
|
1143
|
-
...(Array.isArray(p.tags) ? { tags: p.tags.filter((t) => typeof t === "string") } : {}),
|
|
1144
|
-
manifest,
|
|
1145
|
-
version: typeof p.version === "string" && p.version.trim() ? p.version.trim() : "1.0.0",
|
|
1146
|
-
packageGzipBase64: gzipSync(Buffer.from(JSON.stringify(exported), "utf8")).toString("base64"),
|
|
1147
|
-
});
|
|
1148
|
-
audit(bundle, "publishedToHub", record.id, { slug: String(p.slug), visibility: p.visibility === "private" ? "private" : "public" });
|
|
1149
|
-
if (msg.id !== undefined)
|
|
1150
|
-
this.sendResponse(msg.id, { ok: true, ...result });
|
|
1151
|
-
}
|
|
1152
|
-
catch (err) {
|
|
1153
|
-
return fail.call(this, msg, `workflow.publishHub: ${errorMessage(err)}`);
|
|
1154
|
-
}
|
|
1155
|
-
}
|
|
1156
|
-
/**
|
|
1157
|
-
* `workflow.import` — materialize a portable bundle (or raw n8n JSON, format:"n8n") into a target
|
|
1158
|
-
* project. The caller creates/owns the project (frontend: WorkspaceStep → POST /api/projects);
|
|
1159
|
-
* this RPC only lands the workflow. fail-loud on malformed payloads (§1.5).
|
|
1160
|
-
*/
|
|
1161
|
-
export async function handleWorkflowImport(msg) {
|
|
1162
|
-
const p = params(msg);
|
|
1163
|
-
if (!p.payload)
|
|
1164
|
-
return fail.call(this, msg, "workflow.import requires `payload`");
|
|
1165
|
-
const bundle = targetBundle.call(this, msg, p);
|
|
1166
|
-
if (!bundle)
|
|
1167
|
-
return;
|
|
1168
|
-
// targetWorkflowId lands the import ONTO an existing record (an automation project's primary
|
|
1169
|
-
// workflow, seeded empty at project birth) instead of creating a sibling — keeps "one
|
|
1170
|
-
// automation = one project = one primary workflow" (D21) without orphaned empties.
|
|
1171
|
-
const targetWorkflowId = typeof p.targetWorkflowId === "string" && p.targetWorkflowId ? p.targetWorkflowId : undefined;
|
|
1172
|
-
const id = targetWorkflowId ?? String(p.id ?? `wf_${randomUUID().slice(0, 8)}`);
|
|
1173
|
-
let record;
|
|
1174
|
-
// IT-11:n8n 导入产转换报告(完全/部分/需人工,逐项降级明细)随响应返回给导入向导。
|
|
1175
|
-
let n8nReport;
|
|
1176
|
-
// Malformed payloads are caller input → INVALID_PARAMS response, not a dispatcher crash.
|
|
1177
|
-
try {
|
|
1178
|
-
if (p.format === "n8n") {
|
|
1179
|
-
if (targetWorkflowId) {
|
|
1180
|
-
const converted = convertN8nWorkflow(p.payload, id);
|
|
1181
|
-
n8nReport = converted.report;
|
|
1182
|
-
record = await bundle.controller.update(id, { name: String(p.name ?? converted.name), def: converted.def });
|
|
1183
|
-
}
|
|
1184
|
-
else {
|
|
1185
|
-
const imported = await bundle.controller.importN8n(id, p.payload, { owner: resolveActiveOwnerUserId() });
|
|
1186
|
-
record = imported.record;
|
|
1187
|
-
n8nReport = imported.report;
|
|
1188
|
-
if (p.name)
|
|
1189
|
-
record = await bundle.controller.update(id, { name: String(p.name) });
|
|
1190
|
-
}
|
|
1191
|
-
}
|
|
1192
|
-
else {
|
|
1193
|
-
const parsed = fromWorkflowBundle(p.payload);
|
|
1194
|
-
if (targetWorkflowId) {
|
|
1195
|
-
record = await bundle.controller.update(id, {
|
|
1196
|
-
name: String(p.name ?? parsed.name),
|
|
1197
|
-
def: { ...parsed.def, id },
|
|
1198
|
-
...(parsed.concurrency ? { concurrency: parsed.concurrency } : {}),
|
|
1199
|
-
});
|
|
1200
|
-
}
|
|
1201
|
-
else {
|
|
1202
|
-
record = await bundle.controller.create({
|
|
1203
|
-
id,
|
|
1204
|
-
name: String(p.name ?? parsed.name),
|
|
1205
|
-
owner: resolveActiveOwnerUserId(),
|
|
1206
|
-
def: { ...parsed.def, id },
|
|
1207
|
-
concurrency: parsed.concurrency,
|
|
1208
|
-
});
|
|
1209
|
-
}
|
|
1210
|
-
if (parsed.trigger) {
|
|
1211
|
-
const outcome = await bundle.controller.patch(id, { patch: [{ op: "set_trigger", trigger: parsed.trigger }] });
|
|
1212
|
-
if (!outcome.ok)
|
|
1213
|
-
throw new Error(`trigger rejected: ${JSON.stringify("errors" in outcome ? outcome.errors : outcome)}`);
|
|
1214
|
-
record = await bundle.controller.get(id);
|
|
1215
|
-
}
|
|
1216
|
-
}
|
|
1217
|
-
}
|
|
1218
|
-
catch (err) {
|
|
1219
|
-
return fail.call(this, msg, `workflow.import: ${errorMessage(err)}`);
|
|
1220
|
-
}
|
|
1221
|
-
audit(bundle, "imported", record.id, { format: p.format === "n8n" ? "n8n" : "bundle", ...(n8nReport ? { conversion: n8nReport.status } : {}) });
|
|
1222
|
-
emitWorkflowRecord.call(this, targetWorkflowId ? "workflow.updated" : "workflow.created", record, bundle);
|
|
1223
|
-
if (msg.id !== undefined) {
|
|
1224
|
-
this.sendResponse(msg.id, { ...workflowSnapshot(record, bundle), ...(n8nReport ? { conversionReport: n8nReport } : {}) });
|
|
1225
|
-
}
|
|
1226
|
-
}
|
|
1227
|
-
/**
|
|
1228
|
-
* `workflow.duplicate` — copy a workflow (same graph/trigger, fresh id, inactive) into a target
|
|
1229
|
-
* project: export→import in-process (one serialization path, spec D23). 复制/另存为 both land here.
|
|
1230
|
-
*/
|
|
1231
|
-
export async function handleWorkflowDuplicate(msg) {
|
|
1232
|
-
const p = params(msg);
|
|
1233
|
-
if (!p.id)
|
|
1234
|
-
return fail.call(this, msg, "workflow.duplicate requires `id`");
|
|
1235
|
-
const source = targetBundle.call(this, msg, p);
|
|
1236
|
-
if (!source)
|
|
1237
|
-
return;
|
|
1238
|
-
let target;
|
|
1239
|
-
try {
|
|
1240
|
-
target = p.targetProjectId
|
|
1241
|
-
? ensureWorkflowRoot.call(this, resolveWorkflowTarget.call(this, { projectId: p.targetProjectId }))
|
|
1242
|
-
: source;
|
|
1243
|
-
}
|
|
1244
|
-
catch (err) {
|
|
1245
|
-
return fail.call(this, msg, errorMessage(err));
|
|
1246
|
-
}
|
|
1247
|
-
const record = await source.controller.get(String(p.id));
|
|
1248
|
-
const exported = toWorkflowBundle(record);
|
|
1249
|
-
const newId = `wf_${randomUUID().slice(0, 8)}`;
|
|
1250
|
-
let created = await target.controller.create({
|
|
1251
|
-
id: newId,
|
|
1252
|
-
name: String(p.name ?? `${record.name} 副本`),
|
|
1253
|
-
owner: resolveActiveOwnerUserId(),
|
|
1254
|
-
def: { ...exported.def, id: newId },
|
|
1255
|
-
concurrency: record.concurrency,
|
|
1256
|
-
});
|
|
1257
|
-
if (exported.trigger) {
|
|
1258
|
-
const outcome = await target.controller.patch(newId, { patch: [{ op: "set_trigger", trigger: exported.trigger }] });
|
|
1259
|
-
if (!outcome.ok)
|
|
1260
|
-
throw new Error(`workflow.duplicate: trigger rejected: ${JSON.stringify("errors" in outcome ? outcome.errors : outcome)}`);
|
|
1261
|
-
created = await target.controller.get(newId);
|
|
1262
|
-
}
|
|
1263
|
-
audit(target, "duplicated", newId, { sourceWorkflowId: String(p.id) });
|
|
1264
|
-
emitWorkflowRecord.call(this, "workflow.created", created, target);
|
|
1265
|
-
if (msg.id !== undefined)
|
|
1266
|
-
this.sendResponse(msg.id, workflowSnapshot(created, target));
|
|
1267
|
-
}
|
|
1268
|
-
// ── Trigger entry points (M3): driven by the openclaw gateway over ACP (D7/B) ──
|
|
1269
|
-
// The gateway owns the event sources (IM inbound pipeline, webhook HTTP routes) and forwards them
|
|
1270
|
-
// here; every root's scheduler runs its active workflows whose trigger matches (multi-root, D21).
|
|
1271
|
-
// Outcomes are returned for observability (the gateway does not block on them for delivery).
|
|
1272
|
-
export async function handleWorkflowOnImMessage(msg) {
|
|
1273
|
-
const p = params(msg);
|
|
1274
|
-
if (!p.channel || typeof p.text !== "string")
|
|
1275
|
-
return fail.call(this, msg, "workflow.onImMessage requires `channel` and string `text`");
|
|
1276
|
-
const bundles = ensureAllWorkflowRoots.call(this);
|
|
1277
|
-
const outcomes = [];
|
|
1278
|
-
const errors = [];
|
|
1279
|
-
for (const bundle of bundles) {
|
|
1280
|
-
// 单个 run 的失败(权限拒/图错)fail-loud 进响应 errors,绝不挂死整个分发 RPC。
|
|
1281
|
-
try {
|
|
1282
|
-
outcomes.push(...await bundle.scheduler.onImMessage(String(p.channel), p.text, p.payload));
|
|
1283
|
-
}
|
|
1284
|
-
catch (err) {
|
|
1285
|
-
errors.push({ ...projectTag(bundle), error: errorMessage(err) });
|
|
1286
|
-
}
|
|
1287
|
-
}
|
|
1288
|
-
if (msg.id !== undefined)
|
|
1289
|
-
this.sendResponse(msg.id, { outcomes, ...(errors.length > 0 ? { errors } : {}) });
|
|
1290
|
-
}
|
|
1291
|
-
export async function handleWorkflowOnWebhook(msg) {
|
|
1292
|
-
const p = params(msg);
|
|
1293
|
-
if (!p.path)
|
|
1294
|
-
return fail.call(this, msg, "workflow.onWebhook requires `path`");
|
|
1295
|
-
const hookPath = String(p.path).startsWith("/") ? String(p.path) : `/${String(p.path)}`;
|
|
1296
|
-
const payload = p.payload ?? {};
|
|
1297
|
-
// D34 wait-until-webhook:先唤醒挂起的等待分支(同一个 path 既能唤醒在飞 run,也能触发新 run
|
|
1298
|
-
// —— 两个语义并存不冲突;唤醒数随响应返回供观测)。
|
|
1299
|
-
const waiters = pendingWebhookWaits.get(hookPath);
|
|
1300
|
-
const woken = waiters ? waiters.size : 0;
|
|
1301
|
-
if (waiters)
|
|
1302
|
-
for (const wake of [...waiters.values()])
|
|
1303
|
-
wake(payload);
|
|
1304
|
-
const bundles = ensureAllWorkflowRoots.call(this);
|
|
1305
|
-
const outcomes = [];
|
|
1306
|
-
const errors = [];
|
|
1307
|
-
for (const bundle of bundles) {
|
|
1308
|
-
// 单个 run 的失败(IT-7b 权限拒/图错)fail-loud 进响应 errors,绝不挂死整个分发 RPC。
|
|
1309
|
-
try {
|
|
1310
|
-
outcomes.push(...await bundle.scheduler.onWebhook(hookPath, p.payload));
|
|
1311
|
-
}
|
|
1312
|
-
catch (err) {
|
|
1313
|
-
errors.push({ ...projectTag(bundle), error: errorMessage(err) });
|
|
1314
|
-
}
|
|
1315
|
-
}
|
|
1316
|
-
if (msg.id !== undefined) {
|
|
1317
|
-
this.sendResponse(msg.id, { outcomes, ...(errors.length > 0 ? { errors } : {}), ...(woken > 0 ? { wokenWaits: woken } : {}) });
|
|
1318
|
-
}
|
|
1319
|
-
}
|
|
1320
|
-
/**
|
|
1321
|
-
* `workflow.onIntent` — fire an intent-triggered run (spec D22). The MATCH already happened
|
|
1322
|
-
* (deterministic phrases client-side; semantic fallback via x/workflow.matchIntent) and the user
|
|
1323
|
-
* confirmed; this entry point only verifies the workflow really has an ACTIVE intent trigger
|
|
1324
|
-
* (fail-loud otherwise — a stale client must not run a disarmed workflow) and starts the run with
|
|
1325
|
-
* the utterance as `$trigger` payload.
|
|
1326
|
-
*/
|
|
1327
|
-
export async function handleWorkflowOnIntent(msg) {
|
|
1328
|
-
const p = params(msg);
|
|
1329
|
-
if (!p.workflowId || typeof p.text !== "string")
|
|
1330
|
-
return fail.call(this, msg, "workflow.onIntent requires `workflowId` and string `text`");
|
|
1331
|
-
const bundle = targetBundle.call(this, msg, p);
|
|
1332
|
-
if (!bundle)
|
|
1333
|
-
return;
|
|
1334
|
-
const workflowId = String(p.workflowId);
|
|
1335
|
-
const record = await bundle.controller.get(workflowId);
|
|
1336
|
-
if (!record.active || record.trigger?.type !== "intent") {
|
|
1337
|
-
return fail.call(this, msg, `workflow "${workflowId}" has no active intent trigger (active=${record.active}, trigger=${record.trigger?.type ?? "none"})`);
|
|
1338
|
-
}
|
|
1339
|
-
const payload = {
|
|
1340
|
-
type: "intent",
|
|
1341
|
-
text: p.text,
|
|
1342
|
-
...(typeof p.surface === "string" ? { surface: p.surface } : {}),
|
|
1343
|
-
...(typeof p.matchedPhrase === "string" ? { matchedPhrase: p.matchedPhrase } : {}),
|
|
1344
|
-
};
|
|
1345
|
-
this.sendNotification("workflow.runStarted", { workflowId, triggerType: "intent", ...projectTag(bundle) });
|
|
1346
|
-
let outcome;
|
|
1347
|
-
try {
|
|
1348
|
-
outcome = await bundle.controller.run(workflowId, { type: "intent", payload });
|
|
1349
|
-
emitWorkflowRunCompleted.call(this, bundle, outcome, "intent");
|
|
1350
|
-
}
|
|
1351
|
-
catch (err) {
|
|
1352
|
-
this.sendNotification("workflow.runFailed", { workflowId, triggerType: "intent", error: errorMessage(err), ...projectTag(bundle) });
|
|
1353
|
-
throw err;
|
|
1354
|
-
}
|
|
1355
|
-
if (msg.id !== undefined)
|
|
1356
|
-
this.sendResponse(msg.id, outcome);
|
|
1357
|
-
}
|
|
1358
|
-
/** All ACTIVE intent-triggered workflows across the active root + automation projects (D22 索引源). */
|
|
1359
|
-
export async function collectActiveIntentWorkflows() {
|
|
1360
|
-
const bundles = ensureAllWorkflowRoots.call(this);
|
|
1361
|
-
const out = [];
|
|
1362
|
-
for (const bundle of bundles) {
|
|
1363
|
-
for (const rec of await bundle.store.listActive()) {
|
|
1364
|
-
if (rec.trigger?.type === "intent") {
|
|
1365
|
-
out.push({ workflowId: rec.id, projectId: bundle.projectId, name: rec.name, trigger: rec.trigger });
|
|
1366
|
-
}
|
|
1367
|
-
}
|
|
1368
|
-
}
|
|
1369
|
-
return out;
|
|
1370
|
-
}
|
|
1371
|
-
/**
|
|
1372
|
-
* `workflow.intentIndex` — the deterministic-match index the CLIENT consumes (phrases/aliases/
|
|
1373
|
-
* confirm/surfaces per active intent workflow). The frontend matches utterances locally with zero
|
|
1374
|
-
* latency (spec D22); semantic fallback goes through x/workflow.matchIntent.
|
|
1375
|
-
*/
|
|
1376
|
-
export async function handleWorkflowIntentIndex(msg) {
|
|
1377
|
-
const intents = await collectActiveIntentWorkflows.call(this);
|
|
1378
|
-
if (msg.id !== undefined)
|
|
1379
|
-
this.sendResponse(msg.id, { intents });
|
|
1380
|
-
}
|
|
1381
|
-
// ── Revision history + run history (闭环 "察/退" 半场) ──────────────────────
|
|
1382
|
-
/** `workflow.revisions` — newest-first def-revision summaries for the undo/history UI. */
|
|
1383
|
-
export async function handleWorkflowRevisions(msg) {
|
|
1384
|
-
const p = params(msg);
|
|
1385
|
-
if (!p.id)
|
|
1386
|
-
return fail.call(this, msg, "workflow.revisions requires `id`");
|
|
1387
|
-
const bundle = targetBundle.call(this, msg, p);
|
|
1388
|
-
if (!bundle)
|
|
1389
|
-
return;
|
|
1390
|
-
const revisions = await bundle.store.listRevisions(String(p.id));
|
|
1391
|
-
if (msg.id !== undefined)
|
|
1392
|
-
this.sendResponse(msg.id, { revisions });
|
|
1393
|
-
}
|
|
1394
|
-
/** `workflow.revert` — re-apply a stored revision as a NEW rev (git-revert semantics). */
|
|
1395
|
-
export async function handleWorkflowRevert(msg) {
|
|
1396
|
-
const p = params(msg);
|
|
1397
|
-
if (!p.id || typeof p.rev !== "number")
|
|
1398
|
-
return fail.call(this, msg, "workflow.revert requires `id` and numeric `rev`");
|
|
1399
|
-
const bundle = targetBundle.call(this, msg, p);
|
|
1400
|
-
if (!bundle)
|
|
1401
|
-
return;
|
|
1402
|
-
const record = await bundle.controller.revertTo(String(p.id), p.rev);
|
|
1403
|
-
// The reverted snapshot may carry a different trigger/active state → re-arm the scheduler.
|
|
1404
|
-
await bundle.scheduler.refresh(record.id);
|
|
1405
|
-
audit(bundle, "reverted", record.id, { toRev: p.rev });
|
|
1406
|
-
emitWorkflowRecord.call(this, "workflow.updated", record, bundle);
|
|
1407
|
-
if (msg.id !== undefined)
|
|
1408
|
-
this.sendResponse(msg.id, workflowSnapshot(record, bundle));
|
|
1409
|
-
}
|
|
1410
|
-
/**
|
|
1411
|
-
* `workflow.audit` — newest-first config/lifecycle audit entries (D38: who did what when).
|
|
1412
|
-
* Runs are NOT here (runHistory is the run audit); a timeline UI merges both.
|
|
1413
|
-
*/
|
|
1414
|
-
export async function handleWorkflowAudit(msg) {
|
|
1415
|
-
const p = params(msg);
|
|
1416
|
-
const bundle = targetBundle.call(this, msg, p);
|
|
1417
|
-
if (!bundle)
|
|
1418
|
-
return;
|
|
1419
|
-
const limit = typeof p.limit === "number" && p.limit > 0 ? Math.min(p.limit, 500) : 100;
|
|
1420
|
-
const entries = bundle.audit.list(p.id ? String(p.id) : undefined, limit);
|
|
1421
|
-
if (msg.id !== undefined)
|
|
1422
|
-
this.sendResponse(msg.id, { entries });
|
|
1423
|
-
}
|
|
1424
|
-
/** `workflow.runs` — newest-first run summaries (status/trigger/timing; outputs stay behind runDetail). */
|
|
1425
|
-
export async function handleWorkflowRuns(msg) {
|
|
1426
|
-
const p = params(msg);
|
|
1427
|
-
if (!p.id)
|
|
1428
|
-
return fail.call(this, msg, "workflow.runs requires `id`");
|
|
1429
|
-
const bundle = targetBundle.call(this, msg, p);
|
|
1430
|
-
if (!bundle)
|
|
1431
|
-
return;
|
|
1432
|
-
const runs = await bundle.runHistory.list(String(p.id));
|
|
1433
|
-
if (msg.id !== undefined)
|
|
1434
|
-
this.sendResponse(msg.id, { runs });
|
|
1435
|
-
}
|
|
1436
|
-
/** `workflow.runDetail` — one run incl. per-node output previews (画布点节点看产出). */
|
|
1437
|
-
export async function handleWorkflowRunDetail(msg) {
|
|
1438
|
-
const p = params(msg);
|
|
1439
|
-
if (!p.id || !p.runId)
|
|
1440
|
-
return fail.call(this, msg, "workflow.runDetail requires `id` and `runId`");
|
|
1441
|
-
const bundle = targetBundle.call(this, msg, p);
|
|
1442
|
-
if (!bundle)
|
|
1443
|
-
return;
|
|
1444
|
-
const run = await bundle.runHistory.get(String(p.id), String(p.runId));
|
|
1445
|
-
if (!run)
|
|
1446
|
-
return fail.call(this, msg, `run "${String(p.runId)}" not found for workflow "${String(p.id)}"`);
|
|
1447
|
-
if (msg.id !== undefined)
|
|
1448
|
-
this.sendResponse(msg.id, { run });
|
|
1449
|
-
}
|