@rubytech/create-maxy-code 0.1.51 → 0.1.58
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/__tests__/platform-port-stamp.test.js +24 -0
- package/dist/index.js +5 -2
- package/dist/port-resolution.js +2 -0
- package/package.json +1 -1
- package/payload/platform/lib/require-port-env/dist/index.d.ts +31 -0
- package/payload/platform/lib/require-port-env/dist/index.d.ts.map +1 -0
- package/payload/platform/lib/require-port-env/dist/index.js +52 -0
- package/payload/platform/lib/require-port-env/dist/index.js.map +1 -0
- package/payload/platform/lib/require-port-env/src/index.ts +56 -0
- package/payload/platform/lib/require-port-env/tsconfig.json +8 -0
- package/payload/platform/package-lock.json +0 -1
- package/payload/platform/package.json +2 -3
- package/payload/platform/plugins/admin/PLUGIN.md +16 -3
- package/payload/platform/plugins/admin/hooks/__tests__/turn-completed-graph-write.test.sh +183 -144
- package/payload/platform/plugins/admin/hooks/turn-completed-graph-write.sh +180 -99
- package/payload/platform/plugins/admin/mcp/dist/index.js +20 -12
- package/payload/platform/plugins/admin/mcp/dist/index.js.map +1 -1
- package/payload/platform/plugins/brochures/PLUGIN.md +2 -0
- package/payload/platform/plugins/brochures/skills/property-market-report/SKILL.md +100 -0
- package/payload/platform/plugins/brochures/skills/property-market-report/references/render.py +267 -0
- package/payload/platform/plugins/brochures/skills/property-market-report/references/template.html +266 -0
- package/payload/platform/plugins/brochures/skills/property-socials/SKILL.md +141 -0
- package/payload/platform/plugins/cloudflare/mcp/dist/lib/setup-orchestrator.d.ts.map +1 -1
- package/payload/platform/plugins/cloudflare/mcp/dist/lib/setup-orchestrator.js +2 -1
- package/payload/platform/plugins/cloudflare/mcp/dist/lib/setup-orchestrator.js.map +1 -1
- package/payload/platform/plugins/docs/references/admin-session.md +33 -3
- package/payload/platform/plugins/docs/references/deployment.md +25 -0
- package/payload/platform/plugins/docs/references/internals.md +26 -0
- package/payload/platform/plugins/docs/references/platform.md +3 -1
- package/payload/platform/plugins/docs/references/plugins-guide.md +1 -1
- package/payload/platform/plugins/docs/references/troubleshooting.md +1 -1
- package/payload/platform/plugins/email/mcp/dist/lib/claude-bridge.d.ts.map +1 -1
- package/payload/platform/plugins/email/mcp/dist/lib/claude-bridge.js +2 -1
- package/payload/platform/plugins/email/mcp/dist/lib/claude-bridge.js.map +1 -1
- package/payload/platform/plugins/memory/.claude-plugin/plugin.json +1 -1
- package/payload/platform/plugins/memory/PLUGIN.md +1 -1
- package/payload/platform/plugins/memory/mcp/dist/index.js +6 -1
- package/payload/platform/plugins/memory/mcp/dist/index.js.map +1 -1
- package/payload/platform/plugins/memory/mcp/dist/tools/__tests__/memory-search-fields.test.d.ts +2 -0
- package/payload/platform/plugins/memory/mcp/dist/tools/__tests__/memory-search-fields.test.d.ts.map +1 -0
- package/payload/platform/plugins/memory/mcp/dist/tools/__tests__/memory-search-fields.test.js +107 -0
- package/payload/platform/plugins/memory/mcp/dist/tools/__tests__/memory-search-fields.test.js.map +1 -0
- package/payload/platform/plugins/memory/mcp/dist/tools/memory-search.d.ts +4 -2
- package/payload/platform/plugins/memory/mcp/dist/tools/memory-search.d.ts.map +1 -1
- package/payload/platform/plugins/memory/mcp/dist/tools/memory-search.js +22 -13
- package/payload/platform/plugins/memory/mcp/dist/tools/memory-search.js.map +1 -1
- package/payload/platform/plugins/memory/references/graph-primitives.md +42 -0
- package/payload/platform/plugins/memory/skills/concept-synthesis/SKILL.md +1 -1
- package/payload/platform/plugins/memory/skills/conversation-archive-enrich/SKILL.md +2 -2
- package/payload/platform/plugins/memory/skills/document-ingest/SKILL.md +1 -1
- package/payload/platform/plugins/property-data/.claude-plugin/plugin.json +17 -0
- package/payload/platform/plugins/property-data/PLUGIN.md +100 -0
- package/payload/platform/plugins/property-data/mcp/dist/index.d.ts +2 -0
- package/payload/platform/plugins/property-data/mcp/dist/index.d.ts.map +1 -0
- package/payload/platform/plugins/property-data/mcp/dist/index.js +153 -0
- package/payload/platform/plugins/property-data/mcp/dist/index.js.map +1 -0
- package/payload/platform/plugins/property-data/mcp/dist/lib/crypto.d.ts +3 -0
- package/payload/platform/plugins/property-data/mcp/dist/lib/crypto.d.ts.map +1 -0
- package/payload/platform/plugins/property-data/mcp/dist/lib/crypto.js +72 -0
- package/payload/platform/plugins/property-data/mcp/dist/lib/crypto.js.map +1 -0
- package/payload/platform/plugins/property-data/mcp/dist/lib/neo4j.d.ts +5 -0
- package/payload/platform/plugins/property-data/mcp/dist/lib/neo4j.d.ts.map +1 -0
- package/payload/platform/plugins/property-data/mcp/dist/lib/neo4j.js +38 -0
- package/payload/platform/plugins/property-data/mcp/dist/lib/neo4j.js.map +1 -0
- package/payload/platform/plugins/property-data/mcp/dist/lib/propertydata-api.d.ts +29 -0
- package/payload/platform/plugins/property-data/mcp/dist/lib/propertydata-api.d.ts.map +1 -0
- package/payload/platform/plugins/property-data/mcp/dist/lib/propertydata-api.js +112 -0
- package/payload/platform/plugins/property-data/mcp/dist/lib/propertydata-api.js.map +1 -0
- package/payload/platform/plugins/property-data/mcp/dist/tools/endpoints.d.ts +14 -0
- package/payload/platform/plugins/property-data/mcp/dist/tools/endpoints.d.ts.map +1 -0
- package/payload/platform/plugins/property-data/mcp/dist/tools/endpoints.js +20 -0
- package/payload/platform/plugins/property-data/mcp/dist/tools/endpoints.js.map +1 -0
- package/payload/platform/plugins/property-data/mcp/dist/tools/key-deregister.d.ts +4 -0
- package/payload/platform/plugins/property-data/mcp/dist/tools/key-deregister.d.ts.map +1 -0
- package/payload/platform/plugins/property-data/mcp/dist/tools/key-deregister.js +19 -0
- package/payload/platform/plugins/property-data/mcp/dist/tools/key-deregister.js.map +1 -0
- package/payload/platform/plugins/property-data/mcp/dist/tools/key-list.d.ts +4 -0
- package/payload/platform/plugins/property-data/mcp/dist/tools/key-list.d.ts.map +1 -0
- package/payload/platform/plugins/property-data/mcp/dist/tools/key-list.js +10 -0
- package/payload/platform/plugins/property-data/mcp/dist/tools/key-list.js.map +1 -0
- package/payload/platform/plugins/property-data/mcp/dist/tools/key-register.d.ts +5 -0
- package/payload/platform/plugins/property-data/mcp/dist/tools/key-register.d.ts.map +1 -0
- package/payload/platform/plugins/property-data/mcp/dist/tools/key-register.js +43 -0
- package/payload/platform/plugins/property-data/mcp/dist/tools/key-register.js.map +1 -0
- package/payload/platform/plugins/property-data/mcp/package-lock.json +2566 -0
- package/payload/platform/plugins/property-data/mcp/package.json +21 -0
- package/payload/platform/plugins/property-data/mcp/src/__tests__/key-roundtrip.test.ts +107 -0
- package/payload/platform/plugins/property-data/mcp/src/__tests__/propertydata-api.test.ts +184 -0
- package/payload/platform/plugins/property-data/mcp/src/__tests__/schema-parity.test.ts +48 -0
- package/payload/platform/plugins/property-data/mcp/src/index.ts +249 -0
- package/payload/platform/plugins/property-data/mcp/src/lib/crypto.ts +79 -0
- package/payload/platform/plugins/property-data/mcp/src/lib/neo4j.ts +47 -0
- package/payload/platform/plugins/property-data/mcp/src/lib/propertydata-api.ts +135 -0
- package/payload/platform/plugins/property-data/mcp/src/tools/endpoints.ts +27 -0
- package/payload/platform/plugins/property-data/mcp/src/tools/key-deregister.ts +21 -0
- package/payload/platform/plugins/property-data/mcp/src/tools/key-list.ts +10 -0
- package/payload/platform/plugins/property-data/mcp/src/tools/key-register.ts +58 -0
- package/payload/platform/plugins/property-data/mcp/tsconfig.json +20 -0
- package/payload/platform/plugins/property-data/mcp/vitest.config.ts +8 -0
- package/payload/platform/plugins/property-data/skills/property-data/SKILL.md +58 -0
- package/payload/platform/plugins/waitlist/PLUGIN.md +6 -8
- package/payload/platform/plugins/waitlist/mcp/dist/index.js +33 -0
- package/payload/platform/plugins/waitlist/mcp/dist/index.js.map +1 -1
- package/payload/platform/plugins/waitlist/mcp/dist/lib/admin-model.d.ts +16 -0
- package/payload/platform/plugins/waitlist/mcp/dist/lib/admin-model.d.ts.map +1 -0
- package/payload/platform/plugins/waitlist/mcp/dist/lib/admin-model.js +58 -0
- package/payload/platform/plugins/waitlist/mcp/dist/lib/admin-model.js.map +1 -0
- package/payload/platform/plugins/waitlist/mcp/dist/tools/waitlist-extract.d.ts +34 -0
- package/payload/platform/plugins/waitlist/mcp/dist/tools/waitlist-extract.d.ts.map +1 -0
- package/payload/platform/plugins/waitlist/mcp/dist/tools/waitlist-extract.js +129 -0
- package/payload/platform/plugins/waitlist/mcp/dist/tools/waitlist-extract.js.map +1 -0
- package/payload/platform/plugins/waitlist/mcp/dist/tools/waitlist-heal.d.ts +12 -18
- package/payload/platform/plugins/waitlist/mcp/dist/tools/waitlist-heal.d.ts.map +1 -1
- package/payload/platform/plugins/waitlist/mcp/dist/tools/waitlist-heal.js +89 -86
- package/payload/platform/plugins/waitlist/mcp/dist/tools/waitlist-heal.js.map +1 -1
- package/payload/platform/plugins/waitlist/mcp/dist/tools/waitlist-setup.d.ts.map +1 -1
- package/payload/platform/plugins/waitlist/mcp/dist/tools/waitlist-setup.js +15 -53
- package/payload/platform/plugins/waitlist/mcp/dist/tools/waitlist-setup.js.map +1 -1
- package/payload/platform/plugins/whatsapp/PLUGIN.md +1 -0
- package/payload/platform/plugins/whatsapp/mcp/dist/index.js +5 -5
- package/payload/platform/plugins/whatsapp/mcp/dist/index.js.map +1 -1
- package/payload/platform/plugins/workflows/PLUGIN.md +10 -176
- package/payload/platform/plugins/workflows/mcp/dist/index.js +14 -142
- package/payload/platform/plugins/workflows/mcp/dist/index.js.map +1 -1
- package/payload/platform/plugins/workflows/mcp/dist/lib/step-resolver.d.ts +1 -88
- package/payload/platform/plugins/workflows/mcp/dist/lib/step-resolver.d.ts.map +1 -1
- package/payload/platform/plugins/workflows/mcp/dist/lib/step-resolver.js +0 -86
- package/payload/platform/plugins/workflows/mcp/dist/lib/step-resolver.js.map +1 -1
- package/payload/platform/plugins/workflows/mcp/dist/lib/validate-capabilities.d.ts +5 -12
- package/payload/platform/plugins/workflows/mcp/dist/lib/validate-capabilities.d.ts.map +1 -1
- package/payload/platform/plugins/workflows/mcp/dist/lib/validate-capabilities.js +5 -46
- package/payload/platform/plugins/workflows/mcp/dist/lib/validate-capabilities.js.map +1 -1
- package/payload/platform/plugins/workflows/mcp/dist/tools/workflow-create.d.ts +1 -16
- package/payload/platform/plugins/workflows/mcp/dist/tools/workflow-create.d.ts.map +1 -1
- package/payload/platform/plugins/workflows/mcp/dist/tools/workflow-create.js +39 -75
- package/payload/platform/plugins/workflows/mcp/dist/tools/workflow-create.js.map +1 -1
- package/payload/platform/plugins/workflows/mcp/dist/tools/workflow-execute.d.ts +8 -21
- package/payload/platform/plugins/workflows/mcp/dist/tools/workflow-execute.d.ts.map +1 -1
- package/payload/platform/plugins/workflows/mcp/dist/tools/workflow-execute.js +39 -266
- package/payload/platform/plugins/workflows/mcp/dist/tools/workflow-execute.js.map +1 -1
- package/payload/platform/plugins/workflows/mcp/dist/tools/workflow-get.d.ts +3 -8
- package/payload/platform/plugins/workflows/mcp/dist/tools/workflow-get.d.ts.map +1 -1
- package/payload/platform/plugins/workflows/mcp/dist/tools/workflow-get.js +3 -10
- package/payload/platform/plugins/workflows/mcp/dist/tools/workflow-get.js.map +1 -1
- package/payload/platform/plugins/workflows/mcp/dist/tools/workflow-update.d.ts.map +1 -1
- package/payload/platform/plugins/workflows/mcp/dist/tools/workflow-update.js +38 -86
- package/payload/platform/plugins/workflows/mcp/dist/tools/workflow-update.js.map +1 -1
- package/payload/platform/plugins/workflows/mcp/dist/tools/workflow-validate.d.ts.map +1 -1
- package/payload/platform/plugins/workflows/mcp/dist/tools/workflow-validate.js +8 -26
- package/payload/platform/plugins/workflows/mcp/dist/tools/workflow-validate.js.map +1 -1
- package/payload/platform/services/claude-session-manager/dist/fs-watcher.d.ts.map +1 -1
- package/payload/platform/services/claude-session-manager/dist/fs-watcher.js +1 -2
- package/payload/platform/services/claude-session-manager/dist/fs-watcher.js.map +1 -1
- package/payload/platform/services/claude-session-manager/dist/http-server.d.ts.map +1 -1
- package/payload/platform/services/claude-session-manager/dist/http-server.js +204 -23
- package/payload/platform/services/claude-session-manager/dist/http-server.js.map +1 -1
- package/payload/platform/services/claude-session-manager/dist/pty-spawner.d.ts +39 -1
- package/payload/platform/services/claude-session-manager/dist/pty-spawner.d.ts.map +1 -1
- package/payload/platform/services/claude-session-manager/dist/pty-spawner.js +109 -10
- package/payload/platform/services/claude-session-manager/dist/pty-spawner.js.map +1 -1
- package/payload/platform/services/claude-session-manager/dist/reaper.d.ts.map +1 -1
- package/payload/platform/services/claude-session-manager/dist/reaper.js +11 -0
- package/payload/platform/services/claude-session-manager/dist/reaper.js.map +1 -1
- package/payload/platform/services/claude-session-manager/dist/session-store.d.ts +21 -0
- package/payload/platform/services/claude-session-manager/dist/session-store.d.ts.map +1 -1
- package/payload/platform/services/claude-session-manager/dist/session-store.js.map +1 -1
- package/payload/platform/services/claude-session-manager/vitest.config.ts +14 -0
- package/payload/platform/templates/agents/admin/IDENTITY.md +2 -0
- package/payload/platform/templates/agents/admin/SOUL.md +3 -1
- package/payload/premium-plugins/real-agent/BUNDLE.md +5 -3
- package/payload/premium-plugins/real-agent/agents/negotiator.md +1 -1
- package/payload/premium-plugins/real-agent/agents/valuer.md +1 -1
- package/payload/premium-plugins/real-agent/plugins/.claude-plugin/marketplace.json +5 -0
- package/payload/premium-plugins/real-agent/plugins/brochures/PLUGIN.md +2 -0
- package/payload/premium-plugins/real-agent/plugins/brochures/skills/property-market-report/SKILL.md +100 -0
- package/payload/premium-plugins/real-agent/plugins/brochures/skills/property-market-report/references/render.py +267 -0
- package/payload/premium-plugins/real-agent/plugins/brochures/skills/property-market-report/references/template.html +266 -0
- package/payload/premium-plugins/real-agent/plugins/brochures/skills/property-socials/SKILL.md +141 -0
- package/payload/premium-plugins/real-agent/plugins/property-data/.claude-plugin/plugin.json +17 -0
- package/payload/premium-plugins/real-agent/plugins/property-data/PLUGIN.md +100 -0
- package/payload/premium-plugins/real-agent/plugins/property-data/mcp/dist/index.d.ts +2 -0
- package/payload/premium-plugins/real-agent/plugins/property-data/mcp/dist/index.d.ts.map +1 -0
- package/payload/premium-plugins/real-agent/plugins/property-data/mcp/dist/index.js +153 -0
- package/payload/premium-plugins/real-agent/plugins/property-data/mcp/dist/index.js.map +1 -0
- package/payload/premium-plugins/real-agent/plugins/property-data/mcp/dist/lib/crypto.d.ts +3 -0
- package/payload/premium-plugins/real-agent/plugins/property-data/mcp/dist/lib/crypto.d.ts.map +1 -0
- package/payload/premium-plugins/real-agent/plugins/property-data/mcp/dist/lib/crypto.js +72 -0
- package/payload/premium-plugins/real-agent/plugins/property-data/mcp/dist/lib/crypto.js.map +1 -0
- package/payload/premium-plugins/real-agent/plugins/property-data/mcp/dist/lib/neo4j.d.ts +5 -0
- package/payload/premium-plugins/real-agent/plugins/property-data/mcp/dist/lib/neo4j.d.ts.map +1 -0
- package/payload/premium-plugins/real-agent/plugins/property-data/mcp/dist/lib/neo4j.js +38 -0
- package/payload/premium-plugins/real-agent/plugins/property-data/mcp/dist/lib/neo4j.js.map +1 -0
- package/payload/premium-plugins/real-agent/plugins/property-data/mcp/dist/lib/propertydata-api.d.ts +29 -0
- package/payload/premium-plugins/real-agent/plugins/property-data/mcp/dist/lib/propertydata-api.d.ts.map +1 -0
- package/payload/premium-plugins/real-agent/plugins/property-data/mcp/dist/lib/propertydata-api.js +112 -0
- package/payload/premium-plugins/real-agent/plugins/property-data/mcp/dist/lib/propertydata-api.js.map +1 -0
- package/payload/premium-plugins/real-agent/plugins/property-data/mcp/dist/tools/endpoints.d.ts +14 -0
- package/payload/premium-plugins/real-agent/plugins/property-data/mcp/dist/tools/endpoints.d.ts.map +1 -0
- package/payload/premium-plugins/real-agent/plugins/property-data/mcp/dist/tools/endpoints.js +20 -0
- package/payload/premium-plugins/real-agent/plugins/property-data/mcp/dist/tools/endpoints.js.map +1 -0
- package/payload/premium-plugins/real-agent/plugins/property-data/mcp/dist/tools/key-deregister.d.ts +4 -0
- package/payload/premium-plugins/real-agent/plugins/property-data/mcp/dist/tools/key-deregister.d.ts.map +1 -0
- package/payload/premium-plugins/real-agent/plugins/property-data/mcp/dist/tools/key-deregister.js +19 -0
- package/payload/premium-plugins/real-agent/plugins/property-data/mcp/dist/tools/key-deregister.js.map +1 -0
- package/payload/premium-plugins/real-agent/plugins/property-data/mcp/dist/tools/key-list.d.ts +4 -0
- package/payload/premium-plugins/real-agent/plugins/property-data/mcp/dist/tools/key-list.d.ts.map +1 -0
- package/payload/premium-plugins/real-agent/plugins/property-data/mcp/dist/tools/key-list.js +10 -0
- package/payload/premium-plugins/real-agent/plugins/property-data/mcp/dist/tools/key-list.js.map +1 -0
- package/payload/premium-plugins/real-agent/plugins/property-data/mcp/dist/tools/key-register.d.ts +5 -0
- package/payload/premium-plugins/real-agent/plugins/property-data/mcp/dist/tools/key-register.d.ts.map +1 -0
- package/payload/premium-plugins/real-agent/plugins/property-data/mcp/dist/tools/key-register.js +43 -0
- package/payload/premium-plugins/real-agent/plugins/property-data/mcp/dist/tools/key-register.js.map +1 -0
- package/payload/premium-plugins/real-agent/plugins/property-data/mcp/package-lock.json +2566 -0
- package/payload/premium-plugins/real-agent/plugins/property-data/mcp/package.json +21 -0
- package/payload/premium-plugins/real-agent/plugins/property-data/mcp/src/__tests__/key-roundtrip.test.ts +107 -0
- package/payload/premium-plugins/real-agent/plugins/property-data/mcp/src/__tests__/propertydata-api.test.ts +184 -0
- package/payload/premium-plugins/real-agent/plugins/property-data/mcp/src/__tests__/schema-parity.test.ts +48 -0
- package/payload/premium-plugins/real-agent/plugins/property-data/mcp/src/index.ts +249 -0
- package/payload/premium-plugins/real-agent/plugins/property-data/mcp/src/lib/crypto.ts +79 -0
- package/payload/premium-plugins/real-agent/plugins/property-data/mcp/src/lib/neo4j.ts +47 -0
- package/payload/premium-plugins/real-agent/plugins/property-data/mcp/src/lib/propertydata-api.ts +135 -0
- package/payload/premium-plugins/real-agent/plugins/property-data/mcp/src/tools/endpoints.ts +27 -0
- package/payload/premium-plugins/real-agent/plugins/property-data/mcp/src/tools/key-deregister.ts +21 -0
- package/payload/premium-plugins/real-agent/plugins/property-data/mcp/src/tools/key-list.ts +10 -0
- package/payload/premium-plugins/real-agent/plugins/property-data/mcp/src/tools/key-register.ts +58 -0
- package/payload/premium-plugins/real-agent/plugins/property-data/mcp/tsconfig.json +20 -0
- package/payload/premium-plugins/real-agent/plugins/property-data/mcp/vitest.config.ts +8 -0
- package/payload/premium-plugins/real-agent/plugins/property-data/skills/property-data/SKILL.md +58 -0
- package/payload/server/{chunk-CWI7NOWK.js → chunk-2IKQERHN.js} +32 -4
- package/payload/server/maxy-edge.js +53 -25
- package/payload/server/public/assets/admin-2ZJmzJ_g.js +216 -0
- package/payload/server/public/assets/{architectureDiagram-Q4EWVU46-DGHlapUl.js → architectureDiagram-Q4EWVU46-DgfgldJT.js} +1 -1
- package/payload/server/public/assets/{blockDiagram-DXYQGD6D-Dgnf9J14.js → blockDiagram-DXYQGD6D-agu8GDzA.js} +1 -1
- package/payload/server/public/assets/{brand-CtilcX3W.css → brand-BDASZqMG.css} +1 -1
- package/payload/server/public/assets/{c4Diagram-AHTNJAMY-GBVmghhJ.js → c4Diagram-AHTNJAMY-CmNsUmAe.js} +1 -1
- package/payload/server/public/assets/channel-DXGOX55q.js +1 -0
- package/payload/server/public/assets/{chunk-336JU56O-CSVC_J3A.js → chunk-336JU56O-D9Uts7k9.js} +2 -2
- package/payload/server/public/assets/{chunk-426QAEUC-CK1Z0942.js → chunk-426QAEUC-D4ABqXMn.js} +1 -1
- package/payload/server/public/assets/{chunk-4TB4RGXK-CaqJYLxL.js → chunk-4TB4RGXK-D1KE4OAX.js} +1 -1
- package/payload/server/public/assets/{chunk-5FUZZQ4R-57BmPy_B.js → chunk-5FUZZQ4R-CAh0GXe2.js} +1 -1
- package/payload/server/public/assets/{chunk-5PVQY5BW-Ud03uYx_.js → chunk-5PVQY5BW-DBHa6HOv.js} +1 -1
- package/payload/server/public/assets/{chunk-EDXVE4YY-p5KO0PoG.js → chunk-EDXVE4YY-BDC-6mL3.js} +1 -1
- package/payload/server/public/assets/{chunk-ENJZ2VHE-CkxgLujt.js → chunk-ENJZ2VHE-CH3uROkW.js} +1 -1
- package/payload/server/public/assets/{chunk-ICPOFSXX-DwMkY8p7.js → chunk-ICPOFSXX-BzZf0nAw.js} +1 -1
- package/payload/server/public/assets/{chunk-OYMX7WX6-CyYOUKBw.js → chunk-OYMX7WX6-BrLHrI6O.js} +1 -1
- package/payload/server/public/assets/{chunk-U2HBQHQK-Dk5rfJM6.js → chunk-U2HBQHQK-Bw4UkLe_.js} +1 -1
- package/payload/server/public/assets/{chunk-X2U36JSP-D0qCg9Nq.js → chunk-X2U36JSP-23xgdk05.js} +1 -1
- package/payload/server/public/assets/{chunk-YZCP3GAM-C0uFHrdT.js → chunk-YZCP3GAM-BA8iGgRa.js} +1 -1
- package/payload/server/public/assets/{chunk-ZZ45TVLE-C7lSyGRs.js → chunk-ZZ45TVLE-B-ol4EgR.js} +1 -1
- package/payload/server/public/assets/classDiagram-6PBFFD2Q-DTuuDxpK.js +1 -0
- package/payload/server/public/assets/classDiagram-v2-HSJHXN6E-CIw8RU0q.js +1 -0
- package/payload/server/public/assets/clone-O4ZyuvYl.js +1 -0
- package/payload/server/public/assets/{dagre-BWZ4wr8y.js → dagre--kXszEIb.js} +1 -1
- package/payload/server/public/assets/{dagre-KV5264BT-C7mpqRpw.js → dagre-KV5264BT-amN1uU2d.js} +1 -1
- package/payload/server/public/assets/data-DlmoKxmN.js +1 -0
- package/payload/server/public/assets/{device-url-actions-347cMDY4.js → device-url-actions-CPoz5fqz.js} +1 -1
- package/payload/server/public/assets/{diagram-5BDNPKRD-BcQRB7_3.js → diagram-5BDNPKRD-Cwizs9tP.js} +1 -1
- package/payload/server/public/assets/{diagram-G4DWMVQ6-BLSGUKbc.js → diagram-G4DWMVQ6-BpSu5Uao.js} +1 -1
- package/payload/server/public/assets/{diagram-MMDJMWI5-Ra1VvGJh.js → diagram-MMDJMWI5-DiArtkto.js} +1 -1
- package/payload/server/public/assets/{diagram-TYMM5635-Bx_r1USn.js → diagram-TYMM5635-_tygK58Y.js} +1 -1
- package/payload/server/public/assets/{erDiagram-SMLLAGMA-CJhoN8dG.js → erDiagram-SMLLAGMA-CBV6LWYA.js} +1 -1
- package/payload/server/public/assets/{flowDiagram-DWJPFMVM-Bd5CZIoq.js → flowDiagram-DWJPFMVM-CHZFrtOU.js} +1 -1
- package/payload/server/public/assets/{ganttDiagram-T4ZO3ILL-BNQJqJFh.js → ganttDiagram-T4ZO3ILL-B3vKq5ov.js} +1 -1
- package/payload/server/public/assets/{gitGraphDiagram-UUTBAWPF-DoE1AFmA.js → gitGraphDiagram-UUTBAWPF-dnJPjbtj.js} +1 -1
- package/payload/server/public/assets/graph-BVvcFSEQ.js +1 -0
- package/payload/server/public/assets/graph-labels-cCvgu38Y.js +1 -0
- package/payload/server/public/assets/{graphlib-D7JFfLSw.js → graphlib-CNXtnega.js} +1 -1
- package/payload/server/public/assets/{infoDiagram-42DDH7IO-BtsKRO-J.js → infoDiagram-42DDH7IO-D8DYwVAF.js} +1 -1
- package/payload/server/public/assets/{ishikawaDiagram-UXIWVN3A-DapnDR0V.js → ishikawaDiagram-UXIWVN3A-CfEVY2Ud.js} +1 -1
- package/payload/server/public/assets/{journeyDiagram-VCZTEJTY-BLqfwMMu.js → journeyDiagram-VCZTEJTY-FmoBq7Kh.js} +1 -1
- package/payload/server/public/assets/{kanban-definition-6JOO6SKY-DqiSbvUW.js → kanban-definition-6JOO6SKY-B-Q9qk99.js} +1 -1
- package/payload/server/public/assets/{line-DcwBbbhp.js → line-DZwbJENP.js} +1 -1
- package/payload/server/public/assets/{mermaid-parser.core-BZwNRInp.js → mermaid-parser.core-C3ahKykw.js} +1 -1
- package/payload/server/public/assets/{mermaid.core-DnsyVInc.js → mermaid.core-B8OFZIE8.js} +3 -3
- package/payload/server/public/assets/{mindmap-definition-QFDTVHPH-MPPO8aDx.js → mindmap-definition-QFDTVHPH-CqhkfbWa.js} +1 -1
- package/payload/server/public/assets/{page-Cz_pVOv_.js → page-BnAxPkmg.js} +1 -1
- package/payload/server/public/assets/{page-pXt2BdOS.js → page-BnaN3u86.js} +1 -1
- package/payload/server/public/assets/{pieDiagram-DEJITSTG-BKzbjD_5.js → pieDiagram-DEJITSTG-CJqQ6u3-.js} +1 -1
- package/payload/server/public/assets/{public-C-0V5aC8.js → public-rWe9ADCS.js} +3 -3
- package/payload/server/public/assets/{quadrantDiagram-34T5L4WZ-CvvvRvae.js → quadrantDiagram-34T5L4WZ-BtEqOXQM.js} +1 -1
- package/payload/server/public/assets/{requirementDiagram-MS252O5E-BxXZA7z2.js → requirementDiagram-MS252O5E-DPHWUtE6.js} +1 -1
- package/payload/server/public/assets/{sankeyDiagram-XADWPNL6-BRRFjjao.js → sankeyDiagram-XADWPNL6-FBmc3wHT.js} +1 -1
- package/payload/server/public/assets/{sequenceDiagram-FGHM5R23-DOy_E8xe.js → sequenceDiagram-FGHM5R23-BMSd2-1M.js} +1 -1
- package/payload/server/public/assets/{stateDiagram-FHFEXIEX-CDqat01p.js → stateDiagram-FHFEXIEX-DqFbU-LT.js} +1 -1
- package/payload/server/public/assets/stateDiagram-v2-QKLJ7IA2-CXTnsHGq.js +1 -0
- package/payload/server/public/assets/{timeline-definition-GMOUNBTQ-AK1yuR8Z.js → timeline-definition-GMOUNBTQ-DsfvHVK8.js} +1 -1
- package/payload/server/public/assets/{vennDiagram-DHZGUBPP-CCKJ7H16.js → vennDiagram-DHZGUBPP-kHU05mqC.js} +1 -1
- package/payload/server/public/assets/{wardleyDiagram-NUSXRM2D-CKHKJnG_.js → wardleyDiagram-NUSXRM2D-C696Mez_.js} +1 -1
- package/payload/server/public/assets/{xychartDiagram-5P7HB3ND-BBD35k9e.js → xychartDiagram-5P7HB3ND-yht-JyXJ.js} +1 -1
- package/payload/server/public/data.html +5 -5
- package/payload/server/public/graph.html +5 -5
- package/payload/server/public/index.html +7 -7
- package/payload/server/public/public.html +4 -4
- package/payload/server/server.js +211 -178
- package/payload/server/public/assets/admin-BbcN8otj.js +0 -216
- package/payload/server/public/assets/channel-p5ZCfK_I.js +0 -1
- package/payload/server/public/assets/classDiagram-6PBFFD2Q-DqDM1D4-.js +0 -1
- package/payload/server/public/assets/classDiagram-v2-HSJHXN6E-DeYvPD8H.js +0 -1
- package/payload/server/public/assets/clone-60k82qeh.js +0 -1
- package/payload/server/public/assets/data-oXs84UW6.js +0 -1
- package/payload/server/public/assets/graph-DcpqWbSs.js +0 -1
- package/payload/server/public/assets/graph-labels-DJvuUODB.js +0 -1
- package/payload/server/public/assets/stateDiagram-v2-QKLJ7IA2-DHckg-aj.js +0 -1
- /package/payload/server/public/assets/{brand-B6pMzF6h.js → brand-BWCtpG7_.js} +0 -0
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"workflow-create.js","sourceRoot":"","sources":["../../src/tools/workflow-create.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AACzC,OAAO,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAC;AAC7C,OAAO,EAAE,KAAK,EAAE,MAAM,sBAAsB,CAAC;AAC7C,OAAO,EAAE,oBAAoB,EAAE,MAAM,iCAAiC,CAAC;AACvE,OAAO,EAAE,YAAY,EAAE,MAAM,yBAAyB,CAAC;AAEvD,OAAO,EACL,kBAAkB,GAGnB,MAAM,8CAA8C,CAAC;
|
|
1
|
+
{"version":3,"file":"workflow-create.js","sourceRoot":"","sources":["../../src/tools/workflow-create.ts"],"names":[],"mappings":"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"}
|
|
@@ -2,22 +2,16 @@
|
|
|
2
2
|
* Workflow execution engine.
|
|
3
3
|
*
|
|
4
4
|
* Loads a workflow's structured steps, resolves their dependency order,
|
|
5
|
-
* executes each step
|
|
6
|
-
* variables, and records the
|
|
5
|
+
* executes each step by spawning the target plugin's MCP server, passes
|
|
6
|
+
* outputs between steps via named template variables, and records the run
|
|
7
|
+
* as WorkflowRun + StepResult nodes.
|
|
7
8
|
*
|
|
8
|
-
*
|
|
9
|
-
*
|
|
10
|
-
* type: "llm" — spawns Claude Code subprocess (handles its own OAuth)
|
|
9
|
+
* After task 127 the engine handles only `type:'tool'` steps. Plugins that
|
|
10
|
+
* want LLM reasoning own their own SDK call (see waitlist-extract).
|
|
11
11
|
*
|
|
12
12
|
* LOAD WORKFLOW + STEPS
|
|
13
13
|
* │
|
|
14
14
|
* v
|
|
15
|
-
* PRE-FLIGHT LLM GATE (Task 74)
|
|
16
|
-
* │ Only runs if the workflow has ≥1 llm step.
|
|
17
|
-
* ├─ probeLlmHealth("pong") ok → llmAvailable = true
|
|
18
|
-
* └─ probe fails → llmAvailable = false, probeError captured
|
|
19
|
-
* │
|
|
20
|
-
* v
|
|
21
15
|
* CREATE WorkflowRun (status: running)
|
|
22
16
|
* │
|
|
23
17
|
* v
|
|
@@ -25,23 +19,16 @@
|
|
|
25
19
|
* │
|
|
26
20
|
* v
|
|
27
21
|
* FOR EACH STEP:
|
|
28
|
-
* ├─
|
|
29
|
-
* │ resolve {{templates}} in params → spawn MCP server → call tool
|
|
30
|
-
* ├─ type: "llm" + llm available
|
|
31
|
-
* │ resolve {{templates}} in prompt → spawn Claude Code → capture text
|
|
32
|
-
* │ └─ spawn fails + fallbackMode "raw" → render fallback (degraded)
|
|
33
|
-
* ├─ type: "llm" + llm NOT available
|
|
34
|
-
* │ ├─ fallbackMode "raw" → render fallback (degraded), continue
|
|
35
|
-
* │ └─ fallbackMode "fail" → onFailure policy, retry short-circuited
|
|
22
|
+
* ├─ resolve {{templates}} in params → spawn MCP server → call tool
|
|
36
23
|
* ├─ parse output (JSON or _raw fallback, strips markdown fences)
|
|
37
24
|
* ├─ store output under step's outputKey
|
|
38
|
-
* ├─ create StepResult node (status: completed |
|
|
25
|
+
* ├─ create StepResult node (status: completed | skipped | failed)
|
|
39
26
|
* └─ on failure: abort | skip | retry (per step config)
|
|
40
27
|
* │
|
|
41
28
|
* v
|
|
42
29
|
* UPDATE WorkflowRun status:
|
|
43
30
|
* any failed → "failed"
|
|
44
|
-
* any
|
|
31
|
+
* any skipped → "partial"
|
|
45
32
|
* else → "completed"
|
|
46
33
|
*/
|
|
47
34
|
export interface WorkflowExecuteParams {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"workflow-execute.d.ts","sourceRoot":"","sources":["../../src/tools/workflow-execute.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"workflow-execute.d.ts","sourceRoot":"","sources":["../../src/tools/workflow-execute.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAgCG;AAmBH,MAAM,WAAW,qBAAqB;IACpC,UAAU,EAAE,MAAM,CAAC;IACnB,SAAS,EAAE,MAAM,CAAC;IAClB,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAClC,OAAO,CAAC,EAAE,gBAAgB,GAAG,UAAU,GAAG,QAAQ,CAAC;CACpD;AAED,MAAM,WAAW,qBAAqB;IACpC,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,WAAW,GAAG,SAAS,GAAG,QAAQ,CAAC;IAC3C,cAAc,EAAE,MAAM,CAAC;IACvB,aAAa,EAAE,MAAM,CAAC;IACtB,YAAY,EAAE,MAAM,CAAC;IACrB,WAAW,EAAE,MAAM,CAAC;IACpB,UAAU,EAAE,MAAM,CAAC;IACnB,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAiGD,wBAAsB,eAAe,CACnC,MAAM,EAAE,qBAAqB,GAC5B,OAAO,CAAC,qBAAqB,CAAC,CA4IhC"}
|
|
@@ -2,22 +2,16 @@
|
|
|
2
2
|
* Workflow execution engine.
|
|
3
3
|
*
|
|
4
4
|
* Loads a workflow's structured steps, resolves their dependency order,
|
|
5
|
-
* executes each step
|
|
6
|
-
* variables, and records the
|
|
5
|
+
* executes each step by spawning the target plugin's MCP server, passes
|
|
6
|
+
* outputs between steps via named template variables, and records the run
|
|
7
|
+
* as WorkflowRun + StepResult nodes.
|
|
7
8
|
*
|
|
8
|
-
*
|
|
9
|
-
*
|
|
10
|
-
* type: "llm" — spawns Claude Code subprocess (handles its own OAuth)
|
|
9
|
+
* After task 127 the engine handles only `type:'tool'` steps. Plugins that
|
|
10
|
+
* want LLM reasoning own their own SDK call (see waitlist-extract).
|
|
11
11
|
*
|
|
12
12
|
* LOAD WORKFLOW + STEPS
|
|
13
13
|
* │
|
|
14
14
|
* v
|
|
15
|
-
* PRE-FLIGHT LLM GATE (Task 74)
|
|
16
|
-
* │ Only runs if the workflow has ≥1 llm step.
|
|
17
|
-
* ├─ probeLlmHealth("pong") ok → llmAvailable = true
|
|
18
|
-
* └─ probe fails → llmAvailable = false, probeError captured
|
|
19
|
-
* │
|
|
20
|
-
* v
|
|
21
15
|
* CREATE WorkflowRun (status: running)
|
|
22
16
|
* │
|
|
23
17
|
* v
|
|
@@ -25,41 +19,32 @@
|
|
|
25
19
|
* │
|
|
26
20
|
* v
|
|
27
21
|
* FOR EACH STEP:
|
|
28
|
-
* ├─
|
|
29
|
-
* │ resolve {{templates}} in params → spawn MCP server → call tool
|
|
30
|
-
* ├─ type: "llm" + llm available
|
|
31
|
-
* │ resolve {{templates}} in prompt → spawn Claude Code → capture text
|
|
32
|
-
* │ └─ spawn fails + fallbackMode "raw" → render fallback (degraded)
|
|
33
|
-
* ├─ type: "llm" + llm NOT available
|
|
34
|
-
* │ ├─ fallbackMode "raw" → render fallback (degraded), continue
|
|
35
|
-
* │ └─ fallbackMode "fail" → onFailure policy, retry short-circuited
|
|
22
|
+
* ├─ resolve {{templates}} in params → spawn MCP server → call tool
|
|
36
23
|
* ├─ parse output (JSON or _raw fallback, strips markdown fences)
|
|
37
24
|
* ├─ store output under step's outputKey
|
|
38
|
-
* ├─ create StepResult node (status: completed |
|
|
25
|
+
* ├─ create StepResult node (status: completed | skipped | failed)
|
|
39
26
|
* └─ on failure: abort | skip | retry (per step config)
|
|
40
27
|
* │
|
|
41
28
|
* v
|
|
42
29
|
* UPDATE WorkflowRun status:
|
|
43
30
|
* any failed → "failed"
|
|
44
|
-
* any
|
|
31
|
+
* any skipped → "partial"
|
|
45
32
|
* else → "completed"
|
|
46
33
|
*/
|
|
47
34
|
import { randomUUID } from "node:crypto";
|
|
48
35
|
import { existsSync } from "node:fs";
|
|
49
36
|
import { resolve } from "node:path";
|
|
50
37
|
import { getSession } from "../lib/neo4j.js";
|
|
51
|
-
import { resolveOrder, resolveTemplates,
|
|
52
|
-
import { executeLlmCall, probeLlmHealth, readAdminModel } from "../lib/llm-call.js";
|
|
38
|
+
import { resolveOrder, resolveTemplates, parseStepOutput, } from "../lib/step-resolver.js";
|
|
53
39
|
import { markRunActive, markRunComplete, terminalTransitionFailed } from "../lib/active-runs.js";
|
|
54
40
|
import { notTrashed } from "../../../../../lib/graph-trash/dist/index.js";
|
|
55
41
|
// ─────────────────────────────────────────────────────────────
|
|
56
42
|
// Constants
|
|
57
43
|
// ─────────────────────────────────────────────────────────────
|
|
58
44
|
const DEFAULT_TOOL_TIMEOUT_S = 30;
|
|
59
|
-
const DEFAULT_LLM_TIMEOUT_S = 60;
|
|
60
45
|
const MAX_OUTPUT_SIZE = 10_240; // 10KB cap on stored step output
|
|
61
46
|
// ─────────────────────────────────────────────────────────────
|
|
62
|
-
// MCP tool dispatch
|
|
47
|
+
// MCP tool dispatch
|
|
63
48
|
// ─────────────────────────────────────────────────────────────
|
|
64
49
|
async function dispatchStep(plugin, tool, args, stepAccountId, timeoutMs) {
|
|
65
50
|
const platformRoot = process.env.PLATFORM_ROOT;
|
|
@@ -72,10 +57,8 @@ async function dispatchStep(plugin, tool, args, stepAccountId, timeoutMs) {
|
|
|
72
57
|
if (!existsSync(serverPath)) {
|
|
73
58
|
throw new Error(`MCP server not found: ${serverPath}`);
|
|
74
59
|
}
|
|
75
|
-
// Dynamic import — MCP SDK Client only needed at dispatch time
|
|
76
60
|
const { Client } = await import("@modelcontextprotocol/sdk/client/index.js");
|
|
77
61
|
const { StdioClientTransport } = await import("@modelcontextprotocol/sdk/client/stdio.js");
|
|
78
|
-
// Inherit parent env + set ACCOUNT_ID for the child process
|
|
79
62
|
const env = {};
|
|
80
63
|
for (const [k, v] of Object.entries(process.env)) {
|
|
81
64
|
if (v !== undefined)
|
|
@@ -89,7 +72,6 @@ async function dispatchStep(plugin, tool, args, stepAccountId, timeoutMs) {
|
|
|
89
72
|
env,
|
|
90
73
|
stderr: "pipe",
|
|
91
74
|
});
|
|
92
|
-
// Capture child stderr for diagnostics
|
|
93
75
|
let childStderr = "";
|
|
94
76
|
const stderrStream = transport.stderr;
|
|
95
77
|
if (stderrStream) {
|
|
@@ -125,9 +107,6 @@ async function dispatchStep(plugin, tool, args, stepAccountId, timeoutMs) {
|
|
|
125
107
|
}
|
|
126
108
|
finally {
|
|
127
109
|
clearTimeout(timeout);
|
|
128
|
-
// Always attempt cleanup — including when timed out.
|
|
129
|
-
// The timeout callback's client.close() is fire-and-forget;
|
|
130
|
-
// this ensures we also try from the finally block.
|
|
131
110
|
try {
|
|
132
111
|
await client.close();
|
|
133
112
|
}
|
|
@@ -135,7 +114,7 @@ async function dispatchStep(plugin, tool, args, stepAccountId, timeoutMs) {
|
|
|
135
114
|
}
|
|
136
115
|
}
|
|
137
116
|
// ─────────────────────────────────────────────────────────────
|
|
138
|
-
// Main execution
|
|
117
|
+
// Main execution
|
|
139
118
|
// ─────────────────────────────────────────────────────────────
|
|
140
119
|
export async function workflowExecute(params) {
|
|
141
120
|
const { workflowId, accountId, context: inputContext, trigger = "conversational" } = params;
|
|
@@ -168,7 +147,12 @@ export async function workflowExecute(params) {
|
|
|
168
147
|
}
|
|
169
148
|
steps = stepsRaw.map((s) => {
|
|
170
149
|
const stepType = s.properties.type;
|
|
171
|
-
|
|
150
|
+
if (stepType !== "tool") {
|
|
151
|
+
throw new Error(`Workflow "${workflowName}" has a legacy step of type "${stepType}". ` +
|
|
152
|
+
`As of task 127 only type:"tool" steps are supported. ` +
|
|
153
|
+
`Run the plugin's heal tool to migrate (e.g. waitlist-heal).`);
|
|
154
|
+
}
|
|
155
|
+
return {
|
|
172
156
|
stepId: s.properties.stepId,
|
|
173
157
|
dependsOn: s.properties.dependsOn
|
|
174
158
|
? JSON.parse(s.properties.dependsOn)
|
|
@@ -179,24 +163,6 @@ export async function workflowExecute(params) {
|
|
|
179
163
|
timeout: s.properties.timeout ?? undefined,
|
|
180
164
|
position: s.properties.position ?? 0,
|
|
181
165
|
label: s.properties.label,
|
|
182
|
-
};
|
|
183
|
-
if (stepType === "llm") {
|
|
184
|
-
return {
|
|
185
|
-
...base,
|
|
186
|
-
type: "llm",
|
|
187
|
-
prompt: s.properties.prompt,
|
|
188
|
-
model: s.properties.model ?? undefined,
|
|
189
|
-
maxTokens: s.properties.maxTokens ?? undefined,
|
|
190
|
-
mcpServers: s.properties.mcpServers
|
|
191
|
-
? JSON.parse(s.properties.mcpServers)
|
|
192
|
-
: undefined,
|
|
193
|
-
maxTurns: s.properties.maxTurns ?? undefined,
|
|
194
|
-
fallbackMode: s.properties.fallbackMode ?? undefined,
|
|
195
|
-
fallbackTemplate: s.properties.fallbackTemplate ?? undefined,
|
|
196
|
-
};
|
|
197
|
-
}
|
|
198
|
-
return {
|
|
199
|
-
...base,
|
|
200
166
|
type: "tool",
|
|
201
167
|
plugin: s.properties.plugin,
|
|
202
168
|
tool: s.properties.tool,
|
|
@@ -209,67 +175,12 @@ export async function workflowExecute(params) {
|
|
|
209
175
|
finally {
|
|
210
176
|
await session.close();
|
|
211
177
|
}
|
|
212
|
-
// ── Resolve execution order ──────────────────────────────
|
|
213
178
|
const ordered = resolveOrder(steps);
|
|
214
|
-
// ── Pre-flight LLM health gate (Task 74) ─────────────────
|
|
215
|
-
// If the workflow contains at least one LLM step, probe once before
|
|
216
|
-
// running any tool steps. A failed probe does NOT abort the workflow —
|
|
217
|
-
// it flips the llmAvailable flag so LLM steps with fallbackMode="raw"
|
|
218
|
-
// emit a degraded output instead of burning tool steps first.
|
|
219
|
-
//
|
|
220
|
-
// KNOWN LIMITATION: only the first LLM step's resolved model is probed.
|
|
221
|
-
// Heterogeneous-model workflows where different LLM steps use different
|
|
222
|
-
// explicit models still get correct per-step behaviour via the
|
|
223
|
-
// spawn-failure convergence arm in the step loop — the only regression
|
|
224
|
-
// is that tool-step work isn't saved upfront for non-first-model steps.
|
|
225
|
-
let llmAvailable = true;
|
|
226
|
-
let probeError;
|
|
227
|
-
const llmStep = ordered.find((s) => s.type === "llm");
|
|
228
|
-
if (llmStep) {
|
|
229
|
-
let probeModel = llmStep.model;
|
|
230
|
-
const probeModelSource = probeModel ? "step override" : "adminModel";
|
|
231
|
-
let adminModelResolution;
|
|
232
|
-
if (!probeModel) {
|
|
233
|
-
adminModelResolution = readAdminModel(platformRoot, accountId);
|
|
234
|
-
probeModel = adminModelResolution.model ?? undefined;
|
|
235
|
-
}
|
|
236
|
-
if (probeModel) {
|
|
237
|
-
console.error(`[llm-call] model resolved: ${probeModel} (source: ${probeModelSource})`);
|
|
238
|
-
}
|
|
239
|
-
if (!probeModel) {
|
|
240
|
-
// No resolvable model is itself a form of LLM unavailability —
|
|
241
|
-
// treat as probe failure so fallbackMode="raw" engages and
|
|
242
|
-
// fallbackMode="fail" short-circuits. Otherwise the "no model"
|
|
243
|
-
// throw would escape the inner spawn-catch and bypass the
|
|
244
|
-
// documented degradation guarantee.
|
|
245
|
-
llmAvailable = false;
|
|
246
|
-
// cite the exact reason from readAdminModel so the
|
|
247
|
-
// persisted WorkflowRun.error and the stderr log agree, and the
|
|
248
|
-
// admin agent knows whether the file, permissions, or content is
|
|
249
|
-
// at fault.
|
|
250
|
-
probeError = adminModelResolution
|
|
251
|
-
? `No model configured: step override absent and readAdminModel returned null (reason=${adminModelResolution.reason}, path=${adminModelResolution.path}) — see stderr for details`
|
|
252
|
-
: "No model configured (step override absent and readAdminModel was not invoked)";
|
|
253
|
-
console.error(`[llm-probe] FAILED: ${probeError}`);
|
|
254
|
-
}
|
|
255
|
-
else {
|
|
256
|
-
const probe = await probeLlmHealth({ model: probeModel });
|
|
257
|
-
llmAvailable = probe.ok;
|
|
258
|
-
if (!probe.ok) {
|
|
259
|
-
probeError = probe.error;
|
|
260
|
-
}
|
|
261
|
-
}
|
|
262
|
-
}
|
|
263
179
|
// ── Create WorkflowRun node ──────────────────────────────
|
|
264
180
|
const runId = randomUUID();
|
|
265
181
|
const startedAt = new Date().toISOString();
|
|
266
182
|
const runSession = getSession();
|
|
267
183
|
try {
|
|
268
|
-
// Defensive: a race where the Workflow was trashed between the initial
|
|
269
|
-
// load (line ~204) and this CREATE would otherwise silently produce an
|
|
270
|
-
// orphaned WorkflowRun with no RUN_OF edge, because the trashed Workflow
|
|
271
|
-
// has a null workflowId so the inner MATCH returns zero rows. Count the
|
|
272
|
-
// matched workflow and abort if zero.
|
|
273
184
|
const runCreate = await runSession.run(`CREATE (r:WorkflowRun $props)
|
|
274
185
|
WITH r
|
|
275
186
|
MATCH (w:Workflow {workflowId: $workflowId})
|
|
@@ -298,20 +209,14 @@ export async function workflowExecute(params) {
|
|
|
298
209
|
finally {
|
|
299
210
|
await runSession.close();
|
|
300
211
|
}
|
|
301
|
-
// Register the run as active so a SIGTERM handler (index.ts) or an
|
|
302
|
-
// unhandled exception below can terminal-transition it instead of
|
|
303
|
-
// leaving a zombie at status=running.
|
|
304
212
|
markRunActive(runId);
|
|
305
213
|
try {
|
|
306
214
|
return await executeSteps({
|
|
307
215
|
runId,
|
|
308
216
|
startedAt,
|
|
309
|
-
platformRoot,
|
|
310
217
|
accountId,
|
|
311
218
|
ordered,
|
|
312
219
|
inputContext,
|
|
313
|
-
llmAvailable,
|
|
314
|
-
probeError,
|
|
315
220
|
});
|
|
316
221
|
}
|
|
317
222
|
catch (err) {
|
|
@@ -331,18 +236,8 @@ export async function workflowExecute(params) {
|
|
|
331
236
|
}
|
|
332
237
|
}
|
|
333
238
|
async function executeSteps(args) {
|
|
334
|
-
const { runId, startedAt,
|
|
335
|
-
// ── Execute steps ────────────────────────────────────────
|
|
336
|
-
// Context accumulates outputs from prior steps keyed by outputKey
|
|
239
|
+
const { runId, startedAt, accountId, ordered, inputContext } = args;
|
|
337
240
|
const outputContext = {};
|
|
338
|
-
// Track which keys in outputContext came from seeded inputContext vs.
|
|
339
|
-
// from step outputs. The fallback renderer excludes seeded input keys
|
|
340
|
-
// to avoid leaking potentially-sensitive workflow invocation context
|
|
341
|
-
// (credentials, tokens, trigger metadata) into a delivered degraded
|
|
342
|
-
// output. Only step outputs are dumped into the fallback template's
|
|
343
|
-
// {{_priorOutputs}} substitution.
|
|
344
|
-
const seededInputKeys = new Set();
|
|
345
|
-
// Seed context with any input variables
|
|
346
241
|
if (inputContext) {
|
|
347
242
|
for (const [k, v] of Object.entries(inputContext)) {
|
|
348
243
|
if (typeof v === "object" && v !== null && !Array.isArray(v)) {
|
|
@@ -351,13 +246,11 @@ async function executeSteps(args) {
|
|
|
351
246
|
else {
|
|
352
247
|
outputContext[k] = { _raw: String(v) };
|
|
353
248
|
}
|
|
354
|
-
seededInputKeys.add(k);
|
|
355
249
|
}
|
|
356
250
|
}
|
|
357
251
|
let stepsCompleted = 0;
|
|
358
252
|
let stepsSkipped = 0;
|
|
359
253
|
let stepsFailed = 0;
|
|
360
|
-
let stepsDegraded = 0;
|
|
361
254
|
let lastError;
|
|
362
255
|
let aborted = false;
|
|
363
256
|
for (const step of ordered) {
|
|
@@ -365,160 +258,46 @@ async function executeSteps(args) {
|
|
|
365
258
|
break;
|
|
366
259
|
const stepStartedAt = new Date().toISOString();
|
|
367
260
|
let attempt = 0;
|
|
368
|
-
|
|
369
|
-
// retryLimit=2 → 1 initial + 2 retries = 3 total attempts
|
|
370
|
-
let maxAttempts = step.onFailure === "retry" ? 1 + (step.retryLimit ?? 1) : 1;
|
|
261
|
+
const maxAttempts = step.onFailure === "retry" ? 1 + (step.retryLimit ?? 1) : 1;
|
|
371
262
|
let stepSuccess = false;
|
|
372
263
|
let stepOutput = "";
|
|
373
264
|
let stepError = "";
|
|
374
|
-
|
|
375
|
-
const stepLabel = step.type === "tool"
|
|
376
|
-
? `${step.label} → ${step.plugin}/${step.tool}`
|
|
377
|
-
: `${step.label} → llm${step.model ? ` (${step.model})` : ""}${step.mcpServers ? ` [agentic: ${Object.keys(step.mcpServers).join(",")}]` : ""}`;
|
|
265
|
+
const stepLabel = `${step.label} → ${step.plugin}/${step.tool}`;
|
|
378
266
|
console.error(`[workflow-execute] step ${step.position + 1}/${ordered.length}: ${stepLabel}`);
|
|
379
|
-
// ── Pre-flight degradation shortcut (Task 74) ──────────
|
|
380
|
-
// If the pre-flight probe failed and this is an LLM step with
|
|
381
|
-
// fallbackMode="raw", skip the spawn entirely and render a
|
|
382
|
-
// degraded output. For fallbackMode="fail" we short-circuit
|
|
383
|
-
// retries since we already know the call will fail.
|
|
384
|
-
if (step.type === "llm" && !llmAvailable) {
|
|
385
|
-
if (step.fallbackMode === "raw") {
|
|
386
|
-
stepOutput = renderFallbackTemplate({
|
|
387
|
-
template: step.fallbackTemplate,
|
|
388
|
-
outputContext,
|
|
389
|
-
error: probeError ?? "LLM unavailable",
|
|
390
|
-
excludeFromPriorOutputs: seededInputKeys,
|
|
391
|
-
});
|
|
392
|
-
stepDegraded = true;
|
|
393
|
-
stepSuccess = true;
|
|
394
|
-
// attempt = 1 reflects the implicit attempt made before short-
|
|
395
|
-
// circuiting — keeps StepResult.attempt semantically meaningful
|
|
396
|
-
// instead of the misleading 0 that "never tried" would imply.
|
|
397
|
-
attempt = 1;
|
|
398
|
-
if (step.outputKey) {
|
|
399
|
-
outputContext[step.outputKey] = { _raw: stepOutput };
|
|
400
|
-
}
|
|
401
|
-
console.error(`[workflow-execute] step ${step.position + 1} DEGRADED: ${probeError} (fallbackMode=raw, pre-flight)`);
|
|
402
|
-
}
|
|
403
|
-
else {
|
|
404
|
-
// fallbackMode "fail" (default) — short-circuit retries
|
|
405
|
-
stepError = `LLM unavailable: ${probeError ?? "unknown"}`;
|
|
406
|
-
maxAttempts = 0;
|
|
407
|
-
attempt = 1;
|
|
408
|
-
if (step.retryLimit !== undefined && step.onFailure === "retry") {
|
|
409
|
-
console.error(`[workflow-execute] step ${step.position + 1} retry short-circuited — probe already confirmed LLM unavailable`);
|
|
410
|
-
}
|
|
411
|
-
}
|
|
412
|
-
}
|
|
413
267
|
while (attempt < maxAttempts && !stepSuccess) {
|
|
414
268
|
attempt++;
|
|
415
269
|
try {
|
|
416
|
-
|
|
417
|
-
|
|
418
|
-
|
|
419
|
-
|
|
420
|
-
|
|
421
|
-
|
|
422
|
-
|
|
423
|
-
if (result.isError) {
|
|
424
|
-
throw new Error(`Tool returned error: ${result.text}`);
|
|
425
|
-
}
|
|
426
|
-
stepOutput = result.text;
|
|
427
|
-
}
|
|
428
|
-
else {
|
|
429
|
-
// ── LLM step: resolve prompt, spawn Claude Code ──
|
|
430
|
-
const resolvedPrompt = resolveStringTemplate(step.prompt, outputContext);
|
|
431
|
-
if (typeof resolvedPrompt !== "string") {
|
|
432
|
-
throw new Error("LLM prompt resolved to a non-string value — prompt templates must resolve to text");
|
|
433
|
-
}
|
|
434
|
-
// Resolve model: step-level override → account adminModel → throw
|
|
435
|
-
let model = step.model;
|
|
436
|
-
const modelSource = model ? "step override" : "adminModel";
|
|
437
|
-
let stepAdminResolution;
|
|
438
|
-
if (!model) {
|
|
439
|
-
stepAdminResolution = readAdminModel(platformRoot, accountId);
|
|
440
|
-
model = stepAdminResolution.model ?? undefined;
|
|
441
|
-
}
|
|
442
|
-
if (!model) {
|
|
443
|
-
// cite reason + path so the persisted error matches
|
|
444
|
-
// the stderr log instead of a pre-written assumption.
|
|
445
|
-
throw new Error(stepAdminResolution
|
|
446
|
-
? `No model specified on LLM step and readAdminModel returned null (reason=${stepAdminResolution.reason}, path=${stepAdminResolution.path}) — see stderr for details`
|
|
447
|
-
: "No model specified on LLM step and readAdminModel was not invoked");
|
|
448
|
-
}
|
|
449
|
-
console.error(`[llm-call] model resolved: ${model} (source: ${modelSource})`);
|
|
450
|
-
const stepTimeoutMs = (step.timeout ?? DEFAULT_LLM_TIMEOUT_S) * 1000;
|
|
451
|
-
try {
|
|
452
|
-
stepOutput = await executeLlmCall({
|
|
453
|
-
prompt: resolvedPrompt,
|
|
454
|
-
model,
|
|
455
|
-
maxTokens: step.maxTokens,
|
|
456
|
-
timeoutMs: stepTimeoutMs,
|
|
457
|
-
mcpServers: step.mcpServers,
|
|
458
|
-
maxTurns: step.maxTurns,
|
|
459
|
-
});
|
|
460
|
-
}
|
|
461
|
-
catch (spawnErr) {
|
|
462
|
-
// Spawn-time failure convergence — probe passed but the
|
|
463
|
-
// real call failed (rate limit, network partition,
|
|
464
|
-
// mid-run token expiry). fallbackMode="raw" degrades.
|
|
465
|
-
if (step.fallbackMode === "raw") {
|
|
466
|
-
const errSummary = spawnErr instanceof Error ? spawnErr.message : String(spawnErr);
|
|
467
|
-
const oneLine = errSummary.replace(/\s*\n\s*/g, " — ");
|
|
468
|
-
stepOutput = renderFallbackTemplate({
|
|
469
|
-
template: step.fallbackTemplate,
|
|
470
|
-
outputContext,
|
|
471
|
-
error: oneLine,
|
|
472
|
-
excludeFromPriorOutputs: seededInputKeys,
|
|
473
|
-
});
|
|
474
|
-
stepDegraded = true;
|
|
475
|
-
console.error(`[workflow-execute] step ${step.position + 1} DEGRADED: ${oneLine} (fallbackMode=raw, spawn)`);
|
|
476
|
-
}
|
|
477
|
-
else {
|
|
478
|
-
throw spawnErr;
|
|
479
|
-
}
|
|
480
|
-
}
|
|
270
|
+
const resolvedParams = step.params
|
|
271
|
+
? resolveTemplates(step.params, outputContext)
|
|
272
|
+
: {};
|
|
273
|
+
const stepTimeoutMs = (step.timeout ?? DEFAULT_TOOL_TIMEOUT_S) * 1000;
|
|
274
|
+
const result = await dispatchStep(step.plugin, step.tool, resolvedParams, accountId, stepTimeoutMs);
|
|
275
|
+
if (result.isError) {
|
|
276
|
+
throw new Error(`Tool returned error: ${result.text}`);
|
|
481
277
|
}
|
|
278
|
+
stepOutput = result.text;
|
|
482
279
|
stepSuccess = true;
|
|
483
|
-
// Store output under outputKey for subsequent steps.
|
|
484
|
-
// Degraded LLM steps bypass parseStepOutput and are stored
|
|
485
|
-
// verbatim as {_raw: ...} so downstream {{step._raw}} refs
|
|
486
|
-
// consume the fallback text directly.
|
|
487
280
|
if (step.outputKey) {
|
|
488
|
-
|
|
489
|
-
outputContext[step.outputKey] = { _raw: stepOutput };
|
|
490
|
-
}
|
|
491
|
-
else {
|
|
492
|
-
outputContext[step.outputKey] = parseStepOutput(stepOutput);
|
|
493
|
-
}
|
|
281
|
+
outputContext[step.outputKey] = parseStepOutput(stepOutput);
|
|
494
282
|
}
|
|
495
|
-
console.error(`[workflow-execute] step ${step.position + 1}
|
|
283
|
+
console.error(`[workflow-execute] step ${step.position + 1} completed in attempt ${attempt}`);
|
|
496
284
|
}
|
|
497
285
|
catch (err) {
|
|
498
286
|
stepError = err instanceof Error ? err.message : String(err);
|
|
499
287
|
console.error(`[workflow-execute] step ${step.position + 1} FAILED (attempt ${attempt}/${maxAttempts}): ${stepError}`);
|
|
500
288
|
}
|
|
501
289
|
}
|
|
502
|
-
// Record StepResult
|
|
503
290
|
const stepCompletedAt = new Date().toISOString();
|
|
504
|
-
const stepStatus =
|
|
505
|
-
? "
|
|
506
|
-
:
|
|
507
|
-
? "
|
|
508
|
-
:
|
|
509
|
-
? "skipped"
|
|
510
|
-
: "failed";
|
|
511
|
-
// Truncate output for storage
|
|
291
|
+
const stepStatus = stepSuccess
|
|
292
|
+
? "completed"
|
|
293
|
+
: step.onFailure === "skip"
|
|
294
|
+
? "skipped"
|
|
295
|
+
: "failed";
|
|
512
296
|
const storedOutput = stepOutput.length > MAX_OUTPUT_SIZE
|
|
513
297
|
? stepOutput.slice(0, MAX_OUTPUT_SIZE) + "\n[truncated]"
|
|
514
298
|
: stepOutput;
|
|
515
299
|
const resultSession = getSession();
|
|
516
300
|
try {
|
|
517
|
-
// Write doctrine: the MATCH-then-CREATE pattern is already
|
|
518
|
-
// atomic — if the WorkflowRun doesn't exist, 0 rows match and no
|
|
519
|
-
// StepResult is created (no orphan). Before this change, that drop
|
|
520
|
-
// was silent; now we inspect the counters and log loudly so operators
|
|
521
|
-
// can see a run that lost its step history.
|
|
522
301
|
const res = await resultSession.run(`MATCH (r:WorkflowRun {runId: $runId})
|
|
523
302
|
CREATE (r)-[:HAS_RESULT]->(sr:StepResult $props)
|
|
524
303
|
SET sr.createdBySource = 'workflow-execute',
|
|
@@ -542,11 +321,7 @@ async function executeSteps(args) {
|
|
|
542
321
|
finally {
|
|
543
322
|
await resultSession.close();
|
|
544
323
|
}
|
|
545
|
-
|
|
546
|
-
if (stepDegraded) {
|
|
547
|
-
stepsDegraded++;
|
|
548
|
-
}
|
|
549
|
-
else if (stepSuccess) {
|
|
324
|
+
if (stepSuccess) {
|
|
550
325
|
stepsCompleted++;
|
|
551
326
|
}
|
|
552
327
|
else if (step.onFailure === "skip") {
|
|
@@ -560,18 +335,16 @@ async function executeSteps(args) {
|
|
|
560
335
|
console.error(`[workflow-execute] step ${step.position + 1} failed — aborting workflow`);
|
|
561
336
|
}
|
|
562
337
|
}
|
|
563
|
-
// ── Determine final run status ───────────────────────────
|
|
564
338
|
let runStatus;
|
|
565
339
|
if (stepsFailed > 0) {
|
|
566
340
|
runStatus = "failed";
|
|
567
341
|
}
|
|
568
|
-
else if (
|
|
342
|
+
else if (stepsSkipped > 0) {
|
|
569
343
|
runStatus = "partial";
|
|
570
344
|
}
|
|
571
345
|
else {
|
|
572
346
|
runStatus = "completed";
|
|
573
347
|
}
|
|
574
|
-
// ── Update WorkflowRun ──────────────────────────────────
|
|
575
348
|
const completedAt = new Date().toISOString();
|
|
576
349
|
const finalSession = getSession();
|
|
577
350
|
try {
|
|
@@ -590,12 +363,12 @@ async function executeSteps(args) {
|
|
|
590
363
|
}
|
|
591
364
|
const duration = new Date(completedAt).getTime() - new Date(startedAt).getTime();
|
|
592
365
|
console.error(`[workflow-execute] run complete: ${runStatus}, ${duration}ms, ` +
|
|
593
|
-
`${stepsCompleted} completed, ${
|
|
366
|
+
`${stepsCompleted} completed, ${stepsSkipped} skipped, ${stepsFailed} failed`);
|
|
594
367
|
return {
|
|
595
368
|
runId,
|
|
596
369
|
status: runStatus,
|
|
597
370
|
stepsCompleted,
|
|
598
|
-
stepsDegraded,
|
|
371
|
+
stepsDegraded: 0,
|
|
599
372
|
stepsSkipped,
|
|
600
373
|
stepsFailed,
|
|
601
374
|
stepsTotal: ordered.length,
|