@crewx/sdk 0.8.0-rc.72 → 0.8.0-rc.74
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/README.md +380 -818
- package/dist/adapter/context-builder.d.ts +35 -0
- package/dist/adapter/context-builder.js +87 -0
- package/dist/adapter/index.d.ts +5 -0
- package/dist/{core/remote → adapter}/index.js +3 -2
- package/dist/adapter/plugin-helper.d.ts +19 -0
- package/dist/adapter/plugin-helper.js +45 -0
- package/dist/adapter/scoped-store.d.ts +12 -0
- package/dist/adapter/scoped-store.js +43 -0
- package/dist/adapter/types.d.ts +264 -0
- package/dist/adapter/types.js +23 -0
- package/dist/agent/resolver.d.ts +18 -0
- package/dist/agent/resolver.js +46 -0
- package/dist/boxing/box-storage.interface.d.ts +12 -0
- package/dist/boxing/box-storage.interface.js +3 -0
- package/dist/boxing/box.service.d.ts +4 -0
- package/dist/boxing/box.service.js +5 -1
- package/dist/boxing/box.types.d.ts +4 -0
- package/dist/boxing/box.types.js +3 -0
- package/dist/boxing/context-builder.d.ts +6 -7
- package/dist/boxing/context-builder.js +3 -0
- package/dist/client/CrewxClient.d.ts +65 -0
- package/dist/client/CrewxClient.js +86 -0
- package/dist/client/index.d.ts +3 -0
- package/dist/client/index.js +6 -0
- package/dist/config/loader.browser.d.ts +14 -0
- package/dist/config/loader.browser.js +59 -0
- package/dist/config/loader.d.ts +19 -0
- package/dist/config/loader.js +95 -0
- package/dist/conversation/index.d.ts +5 -3
- package/dist/conversation/index.js +8 -3
- package/dist/conversation/sqlite-provider.d.ts +21 -0
- package/dist/conversation/sqlite-provider.js +178 -0
- package/dist/conversation/to-task-reader.d.ts +14 -0
- package/dist/conversation/to-task-reader.js +28 -0
- package/dist/conversation/to-template-messages.d.ts +15 -0
- package/dist/conversation/to-template-messages.js +34 -0
- package/dist/conversation/types.d.ts +101 -0
- package/dist/conversation/types.js +10 -0
- package/dist/esm/agent/resolver.js +41 -0
- package/dist/esm/boxing/box-storage.interface.js +5 -0
- package/dist/esm/boxing/box.service.js +69 -0
- package/dist/esm/boxing/box.types.js +5 -0
- package/dist/esm/boxing/context-builder.js +76 -0
- package/dist/esm/client/CrewxClient.js +82 -0
- package/dist/esm/client/index.js +2 -0
- package/dist/esm/config/loader.browser.js +54 -0
- package/dist/esm/config/loader.js +77 -0
- package/dist/esm/events/TypedEventEmitter.js +61 -0
- package/dist/esm/events/types.js +8 -0
- package/dist/esm/facade/Crewx.browser.js +310 -0
- package/dist/esm/facade/Crewx.js +941 -0
- package/dist/esm/hooks/define.js +10 -0
- package/dist/esm/hooks/dispatch.js +76 -0
- package/dist/esm/hooks/index.js +6 -0
- package/dist/esm/hooks/observer.js +56 -0
- package/dist/esm/hooks/plugin.js +12 -0
- package/dist/esm/hooks/types.js +9 -0
- package/dist/esm/index.browser.js +15 -0
- package/dist/esm/index.js +60 -0
- package/dist/esm/layout/loader.js +268 -0
- package/dist/esm/layout/props-validator.js +297 -0
- package/dist/esm/layout/renderer.js +180 -0
- package/dist/esm/layout/types.js +31 -0
- package/dist/esm/parallel/agent-runtime.js +21 -0
- package/dist/esm/parallel/helpers.js +214 -0
- package/dist/esm/parallel/index.js +5 -0
- package/dist/esm/parallel/parallel-runner.js +221 -0
- package/dist/esm/parallel/types.js +5 -0
- package/dist/esm/parsers/agent-call.util.js +15 -0
- package/dist/esm/parsers/claude.parser.js +64 -0
- package/dist/esm/parsers/codex.parser.js +97 -0
- package/dist/esm/parsers/copilot.parser.js +63 -0
- package/dist/esm/parsers/gemini.parser.js +43 -0
- package/dist/esm/parsers/opencode.parser.js +73 -0
- package/dist/esm/parsers/router.js +53 -0
- package/dist/esm/platform/BrowserFsAdapter.js +80 -0
- package/dist/esm/platform/IFsAdapter.js +2 -0
- package/dist/esm/platform/NodeFsAdapter.js +34 -0
- package/dist/esm/plugin/plugin-provider.js +202 -0
- package/dist/esm/plugin/types.js +8 -0
- package/dist/esm/plugin.js +25 -0
- package/dist/esm/provider/bridge.browser.js +43 -0
- package/dist/esm/provider/bridge.js +373 -0
- package/dist/esm/provider/parse-usage.js +80 -0
- package/dist/esm/provider/register-api.js +21 -0
- package/dist/esm/provider/vercel-runtime.js +310 -0
- package/dist/esm/remote/index.js +10 -0
- package/dist/esm/remote/remote-agent-manager.js +194 -0
- package/dist/esm/remote/remote-provider.js +98 -0
- package/dist/esm/remote/remote-transport.js +79 -0
- package/dist/esm/remote/types.js +8 -0
- package/dist/esm/server/auth.js +31 -0
- package/dist/esm/server/handler.js +72 -0
- package/dist/esm/server/index.js +5 -0
- package/dist/esm/server/tool-adapter.js +92 -0
- package/dist/esm/template/engine.js +100 -0
- package/dist/esm/template/helpers/exec.browser.js +31 -0
- package/dist/esm/template/helpers/exec.js +220 -0
- package/dist/esm/template/helpers/fenced_code.js +17 -0
- package/dist/esm/template/helpers/include.js +20 -0
- package/dist/esm/template/helpers/p1p2.js +83 -0
- package/dist/esm/template/loader/DocumentLoader.js +124 -0
- package/dist/esm/template/types.js +5 -0
- package/dist/esm/tools/delegate.js +57 -0
- package/dist/esm/tools/index.js +5 -0
- package/dist/esm/tools/node/builtin.js +541 -0
- package/dist/esm/tools/node/index.js +54 -0
- package/dist/esm/types/index.js +27 -0
- package/dist/esm/types/task-log.types.js +5 -0
- package/dist/esm/utils/env-defaults.js +23 -0
- package/dist/esm/utils/glob-match.js +38 -0
- package/dist/esm/utils/id.js +46 -0
- package/dist/esm/utils/workspace.js +21 -0
- package/dist/events/TypedEventEmitter.d.ts +31 -0
- package/dist/events/TypedEventEmitter.js +65 -0
- package/dist/events/types.d.ts +139 -0
- package/dist/events/types.js +9 -0
- package/dist/facade/Crewx.browser.d.ts +73 -0
- package/dist/facade/Crewx.browser.js +314 -0
- package/dist/facade/Crewx.d.ts +267 -0
- package/dist/facade/Crewx.js +1299 -0
- package/dist/hooks/define.d.ts +10 -0
- package/dist/hooks/define.js +13 -0
- package/dist/hooks/dispatch.d.ts +61 -0
- package/dist/hooks/dispatch.js +147 -0
- package/dist/hooks/index.d.ts +13 -0
- package/dist/hooks/index.js +24 -0
- package/dist/hooks/observer.d.ts +20 -0
- package/dist/hooks/observer.js +60 -0
- package/dist/hooks/plugin.d.ts +19 -0
- package/dist/hooks/plugin.js +17 -0
- package/dist/hooks/tool-normalize.d.ts +29 -0
- package/dist/hooks/tool-normalize.js +110 -0
- package/dist/hooks/types.d.ts +79 -0
- package/dist/hooks/types.js +12 -0
- package/dist/hooks/yaml-plugin.d.ts +29 -0
- package/dist/hooks/yaml-plugin.js +356 -0
- package/dist/index.browser.d.ts +15 -0
- package/dist/index.browser.js +25 -0
- package/dist/index.d.ts +70 -58
- package/dist/index.js +144 -133
- package/dist/{services/layout-loader.service.d.ts → layout/loader.d.ts} +24 -4
- package/dist/{services/layout-loader.service.js → layout/loader.js} +103 -73
- package/dist/{services/props-validator.service.d.ts → layout/props-validator.d.ts} +7 -1
- package/dist/{services/props-validator.service.js → layout/props-validator.js} +28 -59
- package/dist/{services/layout-renderer.service.d.ts → layout/renderer.d.ts} +28 -14
- package/dist/layout/renderer.js +193 -0
- package/dist/{types/layout.types.d.ts → layout/types.d.ts} +47 -1
- package/dist/{types/layout.types.js → layout/types.js} +15 -1
- package/dist/parallel/agent-runtime.d.ts +31 -0
- package/dist/parallel/agent-runtime.js +25 -0
- package/dist/{core/parallel → parallel}/helpers.d.ts +2 -1
- package/dist/{core/parallel → parallel}/helpers.js +55 -88
- package/dist/parallel/index.d.ts +8 -0
- package/dist/{core/parallel → parallel}/index.js +5 -3
- package/dist/{core/parallel → parallel}/parallel-runner.d.ts +8 -1
- package/dist/{core/parallel → parallel}/parallel-runner.js +53 -57
- package/dist/parallel/types.d.ts +65 -0
- package/dist/parallel/types.js +6 -0
- package/dist/parsers/agent-call.util.d.ts +3 -0
- package/dist/parsers/agent-call.util.js +2 -0
- package/dist/parsers/api.parser.d.ts +10 -0
- package/dist/parsers/api.parser.js +26 -0
- package/dist/parsers/claude.parser.d.ts +8 -0
- package/dist/parsers/claude.parser.js +22 -1
- package/dist/parsers/codex.parser.d.ts +8 -0
- package/dist/parsers/codex.parser.js +11 -0
- package/dist/parsers/copilot.parser.d.ts +9 -0
- package/dist/parsers/copilot.parser.js +8 -0
- package/dist/parsers/gemini.parser.d.ts +10 -0
- package/dist/parsers/gemini.parser.js +10 -0
- package/dist/parsers/opencode.parser.d.ts +12 -0
- package/dist/parsers/opencode.parser.js +76 -0
- package/dist/parsers/router.d.ts +7 -0
- package/dist/parsers/router.js +56 -0
- package/dist/platform/BrowserFsAdapter.d.ts +37 -0
- package/dist/platform/BrowserFsAdapter.js +84 -0
- package/dist/platform/IFsAdapter.d.ts +29 -0
- package/dist/{core/remote/types.js → platform/IFsAdapter.js} +1 -1
- package/dist/platform/NodeFsAdapter.d.ts +16 -0
- package/dist/platform/NodeFsAdapter.js +38 -0
- package/dist/plugin/plugin-provider.d.ts +33 -0
- package/dist/plugin/plugin-provider.js +207 -0
- package/dist/plugin/types.d.ts +53 -0
- package/dist/plugin/types.js +9 -0
- package/dist/plugin.d.ts +33 -0
- package/dist/plugin.js +29 -0
- package/dist/plugins/conversation.d.ts +18 -0
- package/dist/plugins/conversation.js +59 -0
- package/dist/plugins/file-logger.d.ts +29 -0
- package/dist/plugins/file-logger.js +87 -0
- package/dist/plugins/index.d.ts +16 -0
- package/dist/plugins/index.js +19 -0
- package/dist/plugins/sqlite-tracing.d.ts +29 -0
- package/dist/plugins/sqlite-tracing.js +112 -0
- package/dist/provider/bridge.browser.d.ts +49 -0
- package/dist/provider/bridge.browser.js +49 -0
- package/dist/provider/bridge.d.ts +106 -0
- package/dist/provider/bridge.js +380 -0
- package/dist/provider/mastra-runtime.d.ts +45 -0
- package/dist/provider/mastra-runtime.js +208 -0
- package/dist/provider/parse-usage.d.ts +20 -0
- package/dist/provider/parse-usage.js +83 -0
- package/dist/provider/register-api.d.ts +14 -0
- package/dist/provider/register-api.js +24 -0
- package/dist/provider/vercel-runtime.d.ts +54 -0
- package/dist/provider/vercel-runtime.js +347 -0
- package/dist/remote/index.d.ts +13 -0
- package/dist/remote/index.js +32 -0
- package/dist/remote/remote-agent-manager.d.ts +54 -0
- package/dist/{core/remote → remote}/remote-agent-manager.js +100 -97
- package/dist/remote/remote-provider.d.ts +47 -0
- package/dist/remote/remote-provider.js +141 -0
- package/dist/remote/remote-transport.d.ts +32 -0
- package/dist/remote/remote-transport.js +83 -0
- package/dist/remote/types.d.ts +147 -0
- package/dist/remote/types.js +9 -0
- package/dist/server/auth.d.ts +21 -0
- package/dist/server/auth.js +35 -0
- package/dist/server/handler.d.ts +24 -0
- package/dist/server/handler.js +75 -0
- package/dist/server/index.d.ts +7 -0
- package/dist/server/index.js +9 -0
- package/dist/server/tool-adapter.d.ts +19 -0
- package/dist/server/tool-adapter.js +95 -0
- package/dist/template/engine.d.ts +28 -0
- package/dist/template/engine.js +137 -0
- package/dist/template/helpers/exec.browser.d.ts +22 -0
- package/dist/template/helpers/exec.browser.js +41 -0
- package/dist/template/helpers/exec.d.ts +60 -0
- package/dist/template/helpers/exec.js +230 -0
- package/dist/template/helpers/fenced_code.d.ts +22 -0
- package/dist/template/helpers/fenced_code.js +20 -0
- package/dist/template/helpers/format-conversation.d.ts +30 -0
- package/dist/template/helpers/format-conversation.js +53 -0
- package/dist/template/helpers/include.d.ts +16 -0
- package/dist/template/helpers/include.js +23 -0
- package/dist/template/helpers/p1p2.d.ts +37 -0
- package/dist/template/helpers/p1p2.js +90 -0
- package/dist/template/loader/DocumentLoader.d.ts +48 -0
- package/dist/template/loader/DocumentLoader.js +128 -0
- package/dist/template/types.d.ts +51 -0
- package/dist/template/types.js +6 -0
- package/dist/testing/index.d.ts +12 -0
- package/dist/testing/index.js +16 -0
- package/dist/testing/mock-audit.d.ts +10 -0
- package/dist/testing/mock-audit.js +13 -0
- package/dist/testing/mock-context.d.ts +27 -0
- package/dist/testing/mock-context.js +68 -0
- package/dist/testing/mock-logger.d.ts +15 -0
- package/dist/testing/mock-logger.js +27 -0
- package/dist/testing/mock-router.d.ts +16 -0
- package/dist/testing/mock-router.js +67 -0
- package/dist/testing/mock-storage.d.ts +9 -0
- package/dist/testing/mock-storage.js +21 -0
- package/dist/testing/mock-store.d.ts +3 -0
- package/dist/testing/mock-store.js +8 -0
- package/dist/tools/delegate.d.ts +10 -0
- package/dist/tools/delegate.js +60 -0
- package/dist/tools/index.d.ts +5 -12
- package/dist/tools/index.js +6 -37
- package/dist/tools/node/builtin.d.ts +23 -0
- package/dist/tools/node/builtin.js +547 -0
- package/dist/tools/node/index.d.ts +23 -0
- package/dist/tools/node/index.js +59 -0
- package/dist/types/index.d.ts +804 -6
- package/dist/types/index.js +29 -20
- package/dist/types/task-log.types.d.ts +4 -0
- package/dist/types/task-log.types.js +3 -0
- package/dist/utils/env-defaults.d.ts +18 -0
- package/dist/utils/env-defaults.js +27 -0
- package/dist/utils/glob-match.d.ts +18 -0
- package/dist/utils/glob-match.js +42 -0
- package/dist/{core → utils}/id.d.ts +15 -0
- package/dist/utils/id.js +50 -0
- package/dist/utils/timestamp.d.ts +2 -0
- package/dist/utils/timestamp.js +13 -0
- package/dist/{core → utils}/workspace.d.ts +4 -0
- package/dist/{core → utils}/workspace.js +3 -0
- package/package.json +67 -102
- package/src/schemas/hooks.schema.json +59 -0
- package/templates/agents/default.yaml +490 -0
- package/templates/agents/minimal.yaml +16 -0
- package/LICENSE +0 -201
- package/dist/adapters/MastraToolAdapter.d.ts +0 -9
- package/dist/adapters/MastraToolAdapter.js +0 -66
- package/dist/adapters/MastraToolAdapter.js.map +0 -1
- package/dist/api/index.d.ts +0 -2
- package/dist/api/index.js +0 -8
- package/dist/api/index.js.map +0 -1
- package/dist/boxing/box-storage.interface.js.map +0 -1
- package/dist/boxing/box.service.js.map +0 -1
- package/dist/boxing/box.types.js.map +0 -1
- package/dist/boxing/context-builder.js.map +0 -1
- package/dist/boxing/index.d.ts +0 -6
- package/dist/boxing/index.js +0 -11
- package/dist/boxing/index.js.map +0 -1
- package/dist/boxing/tokenizer.d.ts +0 -3
- package/dist/boxing/tokenizer.js +0 -11
- package/dist/boxing/tokenizer.js.map +0 -1
- package/dist/config/api-provider-parser.d.ts +0 -58
- package/dist/config/api-provider-parser.js +0 -212
- package/dist/config/api-provider-parser.js.map +0 -1
- package/dist/config/index.d.ts +0 -3
- package/dist/config/index.js +0 -20
- package/dist/config/index.js.map +0 -1
- package/dist/config/log.config.d.ts +0 -7
- package/dist/config/log.config.js +0 -20
- package/dist/config/log.config.js.map +0 -1
- package/dist/config/pricing.d.ts +0 -11
- package/dist/config/pricing.js +0 -53
- package/dist/config/pricing.js.map +0 -1
- package/dist/config/timeout.config.d.ts +0 -14
- package/dist/config/timeout.config.js +0 -34
- package/dist/config/timeout.config.js.map +0 -1
- package/dist/config/yaml-loader.d.ts +0 -8
- package/dist/config/yaml-loader.js +0 -155
- package/dist/config/yaml-loader.js.map +0 -1
- package/dist/constants/index.d.ts +0 -4
- package/dist/constants/index.js +0 -8
- package/dist/constants/index.js.map +0 -1
- package/dist/constants.d.ts +0 -1
- package/dist/constants.js +0 -18
- package/dist/constants.js.map +0 -1
- package/dist/conversation/conversation-config.d.ts +0 -9
- package/dist/conversation/conversation-config.js +0 -22
- package/dist/conversation/conversation-config.js.map +0 -1
- package/dist/conversation/conversation-history.interface.d.ts +0 -36
- package/dist/conversation/conversation-history.interface.js +0 -3
- package/dist/conversation/conversation-history.interface.js.map +0 -1
- package/dist/conversation/conversation-storage.service.d.ts +0 -16
- package/dist/conversation/conversation-storage.service.js +0 -213
- package/dist/conversation/conversation-storage.service.js.map +0 -1
- package/dist/conversation/index.js.map +0 -1
- package/dist/core/__tests__/id.test.d.ts +0 -1
- package/dist/core/__tests__/id.test.js +0 -115
- package/dist/core/__tests__/id.test.js.map +0 -1
- package/dist/core/agent/agent-factory.d.ts +0 -37
- package/dist/core/agent/agent-factory.js +0 -68
- package/dist/core/agent/agent-factory.js.map +0 -1
- package/dist/core/agent/agent-runtime.d.ts +0 -52
- package/dist/core/agent/agent-runtime.js +0 -206
- package/dist/core/agent/agent-runtime.js.map +0 -1
- package/dist/core/agent/event-bus.d.ts +0 -44
- package/dist/core/agent/event-bus.js +0 -43
- package/dist/core/agent/event-bus.js.map +0 -1
- package/dist/core/agent/index.d.ts +0 -3
- package/dist/core/agent/index.js +0 -13
- package/dist/core/agent/index.js.map +0 -1
- package/dist/core/env-defaults.d.ts +0 -1
- package/dist/core/env-defaults.js +0 -7
- package/dist/core/env-defaults.js.map +0 -1
- package/dist/core/id.js +0 -27
- package/dist/core/id.js.map +0 -1
- package/dist/core/parallel/helpers.js.map +0 -1
- package/dist/core/parallel/index.d.ts +0 -4
- package/dist/core/parallel/index.js.map +0 -1
- package/dist/core/parallel/parallel-runner.js.map +0 -1
- package/dist/core/parallel/types.d.ts +0 -41
- package/dist/core/parallel/types.js +0 -3
- package/dist/core/parallel/types.js.map +0 -1
- package/dist/core/providers/MastraAPIProvider.d.ts +0 -31
- package/dist/core/providers/MastraAPIProvider.js +0 -365
- package/dist/core/providers/MastraAPIProvider.js.map +0 -1
- package/dist/core/providers/ai-provider.interface.d.ts +0 -79
- package/dist/core/providers/ai-provider.interface.js +0 -23
- package/dist/core/providers/ai-provider.interface.js.map +0 -1
- package/dist/core/providers/base-ai.provider.d.ts +0 -84
- package/dist/core/providers/base-ai.provider.js +0 -1237
- package/dist/core/providers/base-ai.provider.js.map +0 -1
- package/dist/core/providers/base-ai.types.d.ts +0 -26
- package/dist/core/providers/base-ai.types.js +0 -3
- package/dist/core/providers/base-ai.types.js.map +0 -1
- package/dist/core/providers/claude.provider.d.ts +0 -19
- package/dist/core/providers/claude.provider.js +0 -170
- package/dist/core/providers/claude.provider.js.map +0 -1
- package/dist/core/providers/codex.provider.d.ts +0 -21
- package/dist/core/providers/codex.provider.js +0 -134
- package/dist/core/providers/codex.provider.js.map +0 -1
- package/dist/core/providers/copilot.provider.d.ts +0 -25
- package/dist/core/providers/copilot.provider.js +0 -146
- package/dist/core/providers/copilot.provider.js.map +0 -1
- package/dist/core/providers/dynamic-provider.factory.d.ts +0 -74
- package/dist/core/providers/dynamic-provider.factory.js +0 -645
- package/dist/core/providers/dynamic-provider.factory.js.map +0 -1
- package/dist/core/providers/gemini.provider.d.ts +0 -16
- package/dist/core/providers/gemini.provider.js +0 -101
- package/dist/core/providers/gemini.provider.js.map +0 -1
- package/dist/core/providers/index.d.ts +0 -8
- package/dist/core/providers/index.js +0 -20
- package/dist/core/providers/index.js.map +0 -1
- package/dist/core/providers/mock.provider.d.ts +0 -13
- package/dist/core/providers/mock.provider.js +0 -55
- package/dist/core/providers/mock.provider.js.map +0 -1
- package/dist/core/providers/provider-factory.d.ts +0 -3
- package/dist/core/providers/provider-factory.js +0 -65
- package/dist/core/providers/provider-factory.js.map +0 -1
- package/dist/core/providers/tool-call.types.d.ts +0 -39
- package/dist/core/providers/tool-call.types.js +0 -3
- package/dist/core/providers/tool-call.types.js.map +0 -1
- package/dist/core/remote/index.d.ts +0 -3
- package/dist/core/remote/index.js.map +0 -1
- package/dist/core/remote/remote-agent-manager.d.ts +0 -24
- package/dist/core/remote/remote-agent-manager.js.map +0 -1
- package/dist/core/remote/remote-transport.d.ts +0 -15
- package/dist/core/remote/remote-transport.js +0 -70
- package/dist/core/remote/remote-transport.js.map +0 -1
- package/dist/core/remote/types.d.ts +0 -79
- package/dist/core/remote/types.js.map +0 -1
- package/dist/core/workspace.js.map +0 -1
- package/dist/index.js.map +0 -1
- package/dist/internal/index.d.ts +0 -1
- package/dist/internal/index.js +0 -6
- package/dist/internal/index.js.map +0 -1
- package/dist/knowledge/DocumentManager.d.ts +0 -4
- package/dist/knowledge/DocumentManager.js +0 -119
- package/dist/knowledge/DocumentManager.js.map +0 -1
- package/dist/knowledge/index.d.ts +0 -1
- package/dist/knowledge/index.js +0 -18
- package/dist/knowledge/index.js.map +0 -1
- package/dist/parsers/agent-call.util.js.map +0 -1
- package/dist/parsers/claude.parser.js.map +0 -1
- package/dist/parsers/codex.parser.js.map +0 -1
- package/dist/parsers/copilot.parser.js.map +0 -1
- package/dist/parsers/gemini.parser.js.map +0 -1
- package/dist/parsers/index.d.ts +0 -7
- package/dist/parsers/index.js +0 -45
- package/dist/parsers/index.js.map +0 -1
- package/dist/schema/skills-parser.d.ts +0 -8
- package/dist/schema/skills-parser.js +0 -438
- package/dist/schema/skills-parser.js.map +0 -1
- package/dist/schema/skills.types.d.ts +0 -158
- package/dist/schema/skills.types.js +0 -41
- package/dist/schema/skills.types.js.map +0 -1
- package/dist/schemas/api-provider.schema.d.ts +0 -432
- package/dist/schemas/api-provider.schema.js +0 -50
- package/dist/schemas/api-provider.schema.js.map +0 -1
- package/dist/services/index.d.ts +0 -2
- package/dist/services/index.js +0 -19
- package/dist/services/index.js.map +0 -1
- package/dist/services/layout-loader.service.js.map +0 -1
- package/dist/services/layout-renderer.service.js +0 -325
- package/dist/services/layout-renderer.service.js.map +0 -1
- package/dist/services/props-validator.service.js.map +0 -1
- package/dist/skills/adapter/claude-skill-adapter.d.ts +0 -11
- package/dist/skills/adapter/claude-skill-adapter.js +0 -222
- package/dist/skills/adapter/claude-skill-adapter.js.map +0 -1
- package/dist/skills/index.d.ts +0 -6
- package/dist/skills/index.js +0 -31
- package/dist/skills/index.js.map +0 -1
- package/dist/skills/runtime/progressive-loader.d.ts +0 -27
- package/dist/skills/runtime/progressive-loader.js +0 -186
- package/dist/skills/runtime/progressive-loader.js.map +0 -1
- package/dist/skills/runtime/runtime-requirements-validator.d.ts +0 -23
- package/dist/skills/runtime/runtime-requirements-validator.js +0 -248
- package/dist/skills/runtime/runtime-requirements-validator.js.map +0 -1
- package/dist/skills/runtime/skill-runtime.service.d.ts +0 -42
- package/dist/skills/runtime/skill-runtime.service.js +0 -434
- package/dist/skills/runtime/skill-runtime.service.js.map +0 -1
- package/dist/tools/file-system.service.d.ts +0 -10
- package/dist/tools/file-system.service.js +0 -33
- package/dist/tools/file-system.service.js.map +0 -1
- package/dist/tools/find.tool.d.ts +0 -21
- package/dist/tools/find.tool.js +0 -139
- package/dist/tools/find.tool.js.map +0 -1
- package/dist/tools/glob.tool.d.ts +0 -24
- package/dist/tools/glob.tool.js +0 -153
- package/dist/tools/glob.tool.js.map +0 -1
- package/dist/tools/grep.tool.d.ts +0 -1
- package/dist/tools/grep.tool.js +0 -137
- package/dist/tools/grep.tool.js.map +0 -1
- package/dist/tools/index.js.map +0 -1
- package/dist/tools/ls.tool.d.ts +0 -1
- package/dist/tools/ls.tool.js +0 -94
- package/dist/tools/ls.tool.js.map +0 -1
- package/dist/tools/read-file.tool.d.ts +0 -1
- package/dist/tools/read-file.tool.js +0 -69
- package/dist/tools/read-file.tool.js.map +0 -1
- package/dist/tools/replace.tool.d.ts +0 -1
- package/dist/tools/replace.tool.js +0 -68
- package/dist/tools/replace.tool.js.map +0 -1
- package/dist/tools/run-shell-command.tool.d.ts +0 -1
- package/dist/tools/run-shell-command.tool.js +0 -64
- package/dist/tools/run-shell-command.tool.js.map +0 -1
- package/dist/tools/tree.tool.d.ts +0 -1
- package/dist/tools/tree.tool.js +0 -109
- package/dist/tools/tree.tool.js.map +0 -1
- package/dist/tools/types.d.ts +0 -42
- package/dist/tools/types.js +0 -13
- package/dist/tools/types.js.map +0 -1
- package/dist/tools/utils/file-utils.d.ts +0 -5
- package/dist/tools/utils/file-utils.js +0 -221
- package/dist/tools/utils/file-utils.js.map +0 -1
- package/dist/tools/write-file.tool.d.ts +0 -1
- package/dist/tools/write-file.tool.js +0 -55
- package/dist/tools/write-file.tool.js.map +0 -1
- package/dist/types/agent.types.d.ts +0 -134
- package/dist/types/agent.types.js +0 -16
- package/dist/types/agent.types.js.map +0 -1
- package/dist/types/api-provider.types.d.ts +0 -85
- package/dist/types/api-provider.types.js +0 -65
- package/dist/types/api-provider.types.js.map +0 -1
- package/dist/types/index.js.map +0 -1
- package/dist/types/layout.types.js.map +0 -1
- package/dist/types/provider.types.d.ts +0 -12
- package/dist/types/provider.types.js +0 -3
- package/dist/types/provider.types.js.map +0 -1
- package/dist/types/skill-runtime.types.d.ts +0 -244
- package/dist/types/skill-runtime.types.js +0 -44
- package/dist/types/skill-runtime.types.js.map +0 -1
- package/dist/types/structured-payload.types.d.ts +0 -46
- package/dist/types/structured-payload.types.js +0 -65
- package/dist/types/structured-payload.types.js.map +0 -1
- package/dist/types/task-log.types.js.map +0 -1
- package/dist/types/template.types.d.ts +0 -38
- package/dist/types/template.types.js +0 -3
- package/dist/types/template.types.js.map +0 -1
- package/dist/types.d.ts +0 -1
- package/dist/types.js +0 -18
- package/dist/types.js.map +0 -1
- package/dist/utils/api-provider-normalizer.d.ts +0 -16
- package/dist/utils/api-provider-normalizer.js +0 -135
- package/dist/utils/api-provider-normalizer.js.map +0 -1
- package/dist/utils/base-message-formatter.d.ts +0 -32
- package/dist/utils/base-message-formatter.js +0 -170
- package/dist/utils/base-message-formatter.js.map +0 -1
- package/dist/utils/error-utils.d.ts +0 -3
- package/dist/utils/error-utils.js +0 -27
- package/dist/utils/error-utils.js.map +0 -1
- package/dist/utils/index.d.ts +0 -4
- package/dist/utils/index.js +0 -21
- package/dist/utils/index.js.map +0 -1
- package/dist/utils/math-utils.d.ts +0 -3
- package/dist/utils/math-utils.js +0 -10
- package/dist/utils/math-utils.js.map +0 -1
- package/dist/utils/mention-parser.d.ts +0 -18
- package/dist/utils/mention-parser.js +0 -136
- package/dist/utils/mention-parser.js.map +0 -1
- package/dist/utils/string-utils.d.ts +0 -1
- package/dist/utils/string-utils.js +0 -10
- package/dist/utils/string-utils.js.map +0 -1
- package/dist/utils.d.ts +0 -3
- package/dist/utils.js +0 -20
- package/dist/utils.js.map +0 -1
- package/schema/api-provider-config.json +0 -138
- package/schema/crewx-config.json +0 -224
- package/schema/skills-config.json +0 -306
|
@@ -0,0 +1,941 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Crewx facade — main entry point for the CrewX SDK.
|
|
3
|
+
* Provides loadYaml(), fromConfig(), query(), execute(), renderAgentPromptFull(),
|
|
4
|
+
* and registerLayout() methods.
|
|
5
|
+
*/
|
|
6
|
+
import { dirname, join } from 'path';
|
|
7
|
+
import { matchesPattern } from '../utils/glob-match';
|
|
8
|
+
import { loadYamlFile } from '../config/loader';
|
|
9
|
+
import { resolveAgent, AgentNotFoundError } from '../agent/resolver';
|
|
10
|
+
import { createProvider, ClientToolCallRequiredError, registerProviderFactory } from '../provider/bridge';
|
|
11
|
+
import { TemplateEngine } from '../template/engine';
|
|
12
|
+
import { DocumentLoader } from '../template/loader/DocumentLoader';
|
|
13
|
+
import { LayoutLoader } from '../layout/loader';
|
|
14
|
+
import { LayoutRenderer } from '../layout/renderer';
|
|
15
|
+
import { generateId } from '../utils/id';
|
|
16
|
+
import { TypedEventEmitter } from '../events/TypedEventEmitter';
|
|
17
|
+
import { parseStdoutEvent } from '../parsers/router';
|
|
18
|
+
import { createHandler } from '../server/handler';
|
|
19
|
+
/**
|
|
20
|
+
* Extract exec policy from config.settings.template.exec if present.
|
|
21
|
+
*/
|
|
22
|
+
function extractExecPolicyFromConfig(config) {
|
|
23
|
+
if (!config)
|
|
24
|
+
return undefined;
|
|
25
|
+
const settings = config.settings;
|
|
26
|
+
const templateSettings = settings?.['template'];
|
|
27
|
+
const exec = templateSettings?.['exec'];
|
|
28
|
+
return exec;
|
|
29
|
+
}
|
|
30
|
+
/**
|
|
31
|
+
* Generate a random security key (16-char hex, same as global crewx).
|
|
32
|
+
* Uses crypto.getRandomValues (browser-safe) with Node crypto.randomBytes fallback.
|
|
33
|
+
*/
|
|
34
|
+
function generateSecurityKey() {
|
|
35
|
+
try {
|
|
36
|
+
// Works in both browser (globalThis.crypto) and Node 19+ (globalThis.crypto)
|
|
37
|
+
const bytes = new Uint8Array(8);
|
|
38
|
+
globalThis.crypto.getRandomValues(bytes);
|
|
39
|
+
return Array.from(bytes, b => b.toString(16).padStart(2, '0')).join('');
|
|
40
|
+
}
|
|
41
|
+
catch {
|
|
42
|
+
// Fallback: Node.js crypto module
|
|
43
|
+
// eslint-disable-next-line @typescript-eslint/no-require-imports
|
|
44
|
+
const { randomBytes } = require('crypto');
|
|
45
|
+
return randomBytes(8).toString('hex');
|
|
46
|
+
}
|
|
47
|
+
}
|
|
48
|
+
/**
|
|
49
|
+
* Build the default SDK templates path.
|
|
50
|
+
*/
|
|
51
|
+
const SDK_TEMPLATES_PATH = join(__dirname, '../../templates/agents');
|
|
52
|
+
export class Crewx extends TypedEventEmitter {
|
|
53
|
+
_agents;
|
|
54
|
+
_templateEngine;
|
|
55
|
+
_documentLoader;
|
|
56
|
+
_layoutLoader;
|
|
57
|
+
_layoutRenderer;
|
|
58
|
+
_config;
|
|
59
|
+
_plugins = [];
|
|
60
|
+
_tools = new Map();
|
|
61
|
+
_pendingThreads = new Map();
|
|
62
|
+
constructor(agents, options = {}, config, documentLoader) {
|
|
63
|
+
super();
|
|
64
|
+
this._agents = new Map(agents.map(a => [a.id, a]));
|
|
65
|
+
this._config = config;
|
|
66
|
+
const settingsPolicy = extractExecPolicyFromConfig(config);
|
|
67
|
+
this._templateEngine = new TemplateEngine({
|
|
68
|
+
execPolicy: options.execPolicy ?? settingsPolicy,
|
|
69
|
+
});
|
|
70
|
+
this._documentLoader = documentLoader ?? new DocumentLoader();
|
|
71
|
+
this._layoutLoader = new LayoutLoader({ templatesPath: SDK_TEMPLATES_PATH });
|
|
72
|
+
this._layoutRenderer = new LayoutRenderer();
|
|
73
|
+
}
|
|
74
|
+
/**
|
|
75
|
+
* Load crewx.yaml from the given file path and create a Crewx instance.
|
|
76
|
+
*/
|
|
77
|
+
static async loadYaml(path, options, fsAdapter) {
|
|
78
|
+
const config = loadYamlFile(path);
|
|
79
|
+
const projectRoot = dirname(path);
|
|
80
|
+
const loader = new DocumentLoader(fsAdapter);
|
|
81
|
+
await loader.load(config.documents, projectRoot);
|
|
82
|
+
// Auto-register api/* provider factory if any agent uses api/ namespace
|
|
83
|
+
const agents = config.agents ?? [];
|
|
84
|
+
const hasApiProvider = agents.some((a) => {
|
|
85
|
+
const providers = Array.isArray(a.provider) ? a.provider : [a.provider];
|
|
86
|
+
return providers.some(p => p.startsWith('api/'));
|
|
87
|
+
});
|
|
88
|
+
if (hasApiProvider) {
|
|
89
|
+
const { registerApiProviders } = await import('../provider/register-api.js');
|
|
90
|
+
registerApiProviders(options?.api);
|
|
91
|
+
}
|
|
92
|
+
// Auto-register remote/* provider factory if any agent uses remote/ namespace
|
|
93
|
+
registerRemoteProvidersIfNeeded(agents, config);
|
|
94
|
+
// Auto-register plugin/* provider factory if any agent uses plugin/ namespace
|
|
95
|
+
registerPluginProvidersIfNeeded(agents, config);
|
|
96
|
+
return new Crewx(agents, options ?? {}, config, loader);
|
|
97
|
+
}
|
|
98
|
+
/**
|
|
99
|
+
* Create a Crewx instance from an already-parsed config object.
|
|
100
|
+
*/
|
|
101
|
+
static async fromConfig(config, options, projectRoot, fsAdapter) {
|
|
102
|
+
const loader = new DocumentLoader(fsAdapter);
|
|
103
|
+
await loader.load(config.documents, projectRoot ?? (typeof process !== 'undefined' ? process.cwd() : '/'));
|
|
104
|
+
// Auto-register remote/* provider factory
|
|
105
|
+
registerRemoteProvidersIfNeeded(config.agents ?? [], config);
|
|
106
|
+
// Auto-register plugin/* provider factory
|
|
107
|
+
registerPluginProvidersIfNeeded(config.agents ?? [], config);
|
|
108
|
+
return new Crewx(config.agents ?? [], options ?? {}, config, loader);
|
|
109
|
+
}
|
|
110
|
+
/** All loaded agents, keyed by agent id. */
|
|
111
|
+
get agents() {
|
|
112
|
+
return this._agents;
|
|
113
|
+
}
|
|
114
|
+
/** The raw project config (includes providers, settings, etc.). */
|
|
115
|
+
get config() {
|
|
116
|
+
return this._config;
|
|
117
|
+
}
|
|
118
|
+
/** All registered plugins. */
|
|
119
|
+
get plugins() {
|
|
120
|
+
return this._plugins;
|
|
121
|
+
}
|
|
122
|
+
/** All registered custom tools. */
|
|
123
|
+
get tools() {
|
|
124
|
+
return this._tools;
|
|
125
|
+
}
|
|
126
|
+
/**
|
|
127
|
+
* Register a custom tool for use in agent prompts.
|
|
128
|
+
*
|
|
129
|
+
* Registered tools are included in the `tools` context of renderAgentPromptFull(),
|
|
130
|
+
* and can be invoked programmatically (e.g. in browser environments with API providers).
|
|
131
|
+
*
|
|
132
|
+
* @param name - Unique tool name (overwrites if already registered)
|
|
133
|
+
* @param definition - Tool definition with description, parameters, and execute function
|
|
134
|
+
*/
|
|
135
|
+
registerTool(name, definition) {
|
|
136
|
+
this._tools.set(name, { name, ...definition });
|
|
137
|
+
}
|
|
138
|
+
/**
|
|
139
|
+
* Register a plugin and immediately call attach().
|
|
140
|
+
* Same instance registered twice is silently ignored (by reference).
|
|
141
|
+
*/
|
|
142
|
+
async use(plugin) {
|
|
143
|
+
if (this._plugins.includes(plugin))
|
|
144
|
+
return;
|
|
145
|
+
await plugin.attach(this);
|
|
146
|
+
this._plugins.push(plugin);
|
|
147
|
+
}
|
|
148
|
+
/**
|
|
149
|
+
* Create a Web Standard MCP HTTP handler for exposing agents over the network.
|
|
150
|
+
*
|
|
151
|
+
* @param options - Handler config. `agents` list is required for security.
|
|
152
|
+
* @returns `(req: Request) => Promise<Response>` handler
|
|
153
|
+
*/
|
|
154
|
+
handler(options) {
|
|
155
|
+
return createHandler(this, options);
|
|
156
|
+
}
|
|
157
|
+
/**
|
|
158
|
+
* Detach all plugins in LIFO order and release resources.
|
|
159
|
+
* Call before process exit for clean shutdown.
|
|
160
|
+
*/
|
|
161
|
+
async close() {
|
|
162
|
+
const reversed = [...this._plugins].reverse();
|
|
163
|
+
for (const plugin of reversed) {
|
|
164
|
+
try {
|
|
165
|
+
await plugin.detach(this);
|
|
166
|
+
}
|
|
167
|
+
catch (err) {
|
|
168
|
+
console.error(`[crewx] plugin ${plugin.name} detach error: ${err instanceof Error ? err.message : String(err)}`);
|
|
169
|
+
}
|
|
170
|
+
}
|
|
171
|
+
this._plugins.length = 0;
|
|
172
|
+
}
|
|
173
|
+
/**
|
|
174
|
+
* Filter agents by role, team, and/or provider.
|
|
175
|
+
*/
|
|
176
|
+
filterAgents(filters) {
|
|
177
|
+
const parseFilter = (value) => value ? value.split(',').map(v => v.trim().toLowerCase()).filter(Boolean) : undefined;
|
|
178
|
+
const roleFilter = parseFilter(filters.role);
|
|
179
|
+
const teamFilter = parseFilter(filters.team);
|
|
180
|
+
const providerFilter = parseFilter(filters.provider);
|
|
181
|
+
let result = Array.from(this._agents.values());
|
|
182
|
+
if (roleFilter) {
|
|
183
|
+
result = result.filter(a => a.role && roleFilter.some(f => matchesPattern(a.role.toLowerCase(), f)));
|
|
184
|
+
}
|
|
185
|
+
if (teamFilter) {
|
|
186
|
+
result = result.filter(a => a.team && teamFilter.some(f => matchesPattern(a.team.toLowerCase(), f)));
|
|
187
|
+
}
|
|
188
|
+
if (providerFilter) {
|
|
189
|
+
result = result.filter(a => {
|
|
190
|
+
const providers = Array.isArray(a.provider) ? a.provider : [a.provider];
|
|
191
|
+
return providers.some(pv => providerFilter.some(f => matchesPattern(pv.toLowerCase(), f)));
|
|
192
|
+
});
|
|
193
|
+
}
|
|
194
|
+
return result;
|
|
195
|
+
}
|
|
196
|
+
/**
|
|
197
|
+
* Return the raw system prompt for the given agent (no template expansion, no layout).
|
|
198
|
+
* @throws AgentNotFoundError if agentId is not found
|
|
199
|
+
*/
|
|
200
|
+
renderAgentPrompt(agentId) {
|
|
201
|
+
const id = agentId.startsWith('@') ? agentId.slice(1) : agentId;
|
|
202
|
+
const agent = this._agents.get(id);
|
|
203
|
+
if (!agent) {
|
|
204
|
+
throw new AgentNotFoundError(id, Array.from(this._agents.keys()));
|
|
205
|
+
}
|
|
206
|
+
return (agent.inline?.prompt ??
|
|
207
|
+
agent.inline?.system_prompt ??
|
|
208
|
+
agent.description ??
|
|
209
|
+
`You are an expert ${id}.`);
|
|
210
|
+
}
|
|
211
|
+
/**
|
|
212
|
+
* Render a Handlebars template string with the given context.
|
|
213
|
+
* Documents from crewx.yaml are automatically merged into context.documents.
|
|
214
|
+
*/
|
|
215
|
+
async renderPrompt(template, context) {
|
|
216
|
+
const loaderDocs = await this._documentLoader.buildContext();
|
|
217
|
+
const mergedDocs = { ...loaderDocs, ...(context?.documents ?? {}) };
|
|
218
|
+
const mergedContext = { ...context, documents: mergedDocs };
|
|
219
|
+
return this._templateEngine.render(template, mergedContext);
|
|
220
|
+
}
|
|
221
|
+
/**
|
|
222
|
+
* Register a custom layout template at runtime.
|
|
223
|
+
*
|
|
224
|
+
* @param name - Layout identifier (used as-is, no forced namespace)
|
|
225
|
+
* @param template - Handlebars template string or CustomLayoutDefinition
|
|
226
|
+
*/
|
|
227
|
+
registerLayout(name, template) {
|
|
228
|
+
this._layoutLoader.registerLayout(name, template);
|
|
229
|
+
}
|
|
230
|
+
/**
|
|
231
|
+
* Render the full agent prompt using the layout system.
|
|
232
|
+
*
|
|
233
|
+
* Resolution priority (first match wins):
|
|
234
|
+
* 1. options.layout (call-site override)
|
|
235
|
+
* 2. agent.inline.layout (agent YAML definition)
|
|
236
|
+
* 3. config.layouts.default (project-level default)
|
|
237
|
+
* 4. SDK built-in default (crewx/default)
|
|
238
|
+
*
|
|
239
|
+
* @param agentId - Agent ID (with or without leading '@')
|
|
240
|
+
* @param options - Optional layout/session/env/vars overrides
|
|
241
|
+
* @throws AgentNotFoundError if agentId is not found
|
|
242
|
+
*/
|
|
243
|
+
async renderAgentPromptFull(agentId, options) {
|
|
244
|
+
const id = agentId.startsWith('@') ? agentId.slice(1) : agentId;
|
|
245
|
+
const agent = this._agents.get(id);
|
|
246
|
+
if (!agent) {
|
|
247
|
+
throw new AgentNotFoundError(id, Array.from(this._agents.keys()));
|
|
248
|
+
}
|
|
249
|
+
// ── Step 1: Resolve layout spec ─────────────────────────────────────────
|
|
250
|
+
const layoutSpec = this._resolveLayoutSpec(agent, options?.layout);
|
|
251
|
+
const layoutId = this._extractLayoutId(layoutSpec);
|
|
252
|
+
const layoutProps = this._extractLayoutProps(agent, layoutSpec, options?.layout);
|
|
253
|
+
// ── Step 2: Load layout definition ──────────────────────────────────────
|
|
254
|
+
const layout = this._layoutLoader.load(layoutId, layoutProps);
|
|
255
|
+
// ── Step 3: Pre-render agent.inline.prompt through TemplateEngine ────────
|
|
256
|
+
// (expands exec, documents, env vars inside the prompt template)
|
|
257
|
+
const rawPrompt = agent.inline?.prompt ??
|
|
258
|
+
agent.inline?.system_prompt ??
|
|
259
|
+
agent.description ??
|
|
260
|
+
`You are an expert ${id}.`;
|
|
261
|
+
const loaderDocs = await this._documentLoader.buildContext();
|
|
262
|
+
const env = options?.env ?? (typeof process !== 'undefined' ? process.env : {});
|
|
263
|
+
const security_key = options?.vars?.['security_key'] ?? generateSecurityKey();
|
|
264
|
+
const preRenderCtx = {
|
|
265
|
+
...(options?.vars ?? {}), // make vars available as top-level template variables
|
|
266
|
+
documents: loaderDocs,
|
|
267
|
+
env,
|
|
268
|
+
agent: { id: agent.id },
|
|
269
|
+
};
|
|
270
|
+
const renderedPrompt = await this._templateEngine.render(rawPrompt, preRenderCtx);
|
|
271
|
+
// ── Step 4: Build full RenderContext ─────────────────────────────────────
|
|
272
|
+
const session = {
|
|
273
|
+
mode: options?.session?.mode ?? 'query',
|
|
274
|
+
platform: options?.session?.platform ?? 'cli',
|
|
275
|
+
options: options?.session?.options ?? [],
|
|
276
|
+
};
|
|
277
|
+
const providerRaw = agent.provider;
|
|
278
|
+
const providerList = Array.isArray(providerRaw)
|
|
279
|
+
? providerRaw
|
|
280
|
+
: typeof providerRaw === 'string' && providerRaw.length > 0
|
|
281
|
+
? [providerRaw]
|
|
282
|
+
: [];
|
|
283
|
+
const providerDisplay = providerList.join(', ') || (typeof providerRaw === 'string' ? providerRaw : '');
|
|
284
|
+
const agentOptions = agent.options;
|
|
285
|
+
const optionsByMode = !Array.isArray(agentOptions) && typeof agentOptions === 'object' && agentOptions !== null
|
|
286
|
+
? agentOptions
|
|
287
|
+
: undefined;
|
|
288
|
+
const optionsArray = Array.isArray(agentOptions) ? agentOptions : undefined;
|
|
289
|
+
// Build document context for layout (with toc/path metadata)
|
|
290
|
+
const documents = {};
|
|
291
|
+
for (const [k, v] of Object.entries(loaderDocs)) {
|
|
292
|
+
documents[k] = {
|
|
293
|
+
content: v.content ?? '',
|
|
294
|
+
toc: v.toc,
|
|
295
|
+
summary: v.summary,
|
|
296
|
+
path: v.path,
|
|
297
|
+
};
|
|
298
|
+
}
|
|
299
|
+
const renderContext = {
|
|
300
|
+
agent: {
|
|
301
|
+
id: agent.id,
|
|
302
|
+
name: agent.name ?? agent.id,
|
|
303
|
+
role: agent.role ?? '',
|
|
304
|
+
team: agent.team ?? '',
|
|
305
|
+
description: agent.description ?? '',
|
|
306
|
+
provider: providerDisplay,
|
|
307
|
+
providerList,
|
|
308
|
+
model: agent.inline?.model,
|
|
309
|
+
workingDirectory: agent.working_directory ?? agent.workingDirectory ?? '.',
|
|
310
|
+
inline: {
|
|
311
|
+
...(agent.inline ?? {}),
|
|
312
|
+
prompt: renderedPrompt, // pre-rendered (exec expanded)
|
|
313
|
+
},
|
|
314
|
+
specialties: agent.specialties ?? [],
|
|
315
|
+
capabilities: agent.capabilities ?? [],
|
|
316
|
+
remote: agent.remote ?? null,
|
|
317
|
+
optionsByMode,
|
|
318
|
+
optionsArray,
|
|
319
|
+
},
|
|
320
|
+
agentMetadata: {
|
|
321
|
+
specialties: agent.specialties ?? [],
|
|
322
|
+
capabilities: agent.capabilities ?? [],
|
|
323
|
+
description: agent.description ?? '',
|
|
324
|
+
},
|
|
325
|
+
documents,
|
|
326
|
+
skills: options?.skills ?? [],
|
|
327
|
+
session,
|
|
328
|
+
env,
|
|
329
|
+
vars: {
|
|
330
|
+
security_key,
|
|
331
|
+
...(options?.vars ?? {}),
|
|
332
|
+
},
|
|
333
|
+
props: layoutProps ?? {},
|
|
334
|
+
platform: session.platform,
|
|
335
|
+
mode: session.mode,
|
|
336
|
+
messages: [],
|
|
337
|
+
tools: this._tools.size > 0
|
|
338
|
+
? {
|
|
339
|
+
list: Array.from(this._tools.values()).map(t => ({
|
|
340
|
+
name: t.name,
|
|
341
|
+
description: t.description,
|
|
342
|
+
parameters: t.parameters,
|
|
343
|
+
})),
|
|
344
|
+
json: JSON.stringify(Array.from(this._tools.values()).map(t => ({
|
|
345
|
+
name: t.name,
|
|
346
|
+
description: t.description,
|
|
347
|
+
parameters: t.parameters,
|
|
348
|
+
})), null, 2),
|
|
349
|
+
count: this._tools.size,
|
|
350
|
+
}
|
|
351
|
+
: null,
|
|
352
|
+
metadata: {},
|
|
353
|
+
};
|
|
354
|
+
// ── Step 5: Render layout ────────────────────────────────────────────────
|
|
355
|
+
return this._layoutRenderer.render(layout, renderContext);
|
|
356
|
+
}
|
|
357
|
+
// ── Private helpers ─────────────────────────────────────────────────────────
|
|
358
|
+
/**
|
|
359
|
+
* Filter tools by allowed names from agent options (query/execute mode).
|
|
360
|
+
* If allowedNames is undefined, return all registered tools.
|
|
361
|
+
*/
|
|
362
|
+
_filterToolsByMode(allowedNames) {
|
|
363
|
+
if (!allowedNames) {
|
|
364
|
+
return Array.from(this._tools.values());
|
|
365
|
+
}
|
|
366
|
+
return allowedNames
|
|
367
|
+
.map(name => this._tools.get(name))
|
|
368
|
+
.filter((t) => t !== undefined);
|
|
369
|
+
}
|
|
370
|
+
/**
|
|
371
|
+
* Resolve layout spec following the priority order.
|
|
372
|
+
*/
|
|
373
|
+
_resolveLayoutSpec(agent, callLayout) {
|
|
374
|
+
// Priority 1: call-site options
|
|
375
|
+
if (callLayout !== undefined)
|
|
376
|
+
return callLayout;
|
|
377
|
+
// Priority 2: agent.inline.layout
|
|
378
|
+
const inlineLayout = agent.inline?.layout;
|
|
379
|
+
if (inlineLayout !== undefined)
|
|
380
|
+
return inlineLayout;
|
|
381
|
+
// Priority 3: project config layouts.default
|
|
382
|
+
const projectDefault = this._config?.layouts?.['default'];
|
|
383
|
+
if (typeof projectDefault === 'string' && projectDefault)
|
|
384
|
+
return projectDefault;
|
|
385
|
+
// Priority 4: SDK built-in default
|
|
386
|
+
return 'crewx/default';
|
|
387
|
+
}
|
|
388
|
+
/** Extract the layout ID string from a LayoutSpec. */
|
|
389
|
+
_extractLayoutId(spec) {
|
|
390
|
+
if (typeof spec === 'string')
|
|
391
|
+
return spec;
|
|
392
|
+
if ('id' in spec)
|
|
393
|
+
return spec.id;
|
|
394
|
+
// Inline template — register it temporarily and return its ID
|
|
395
|
+
const tempId = `crewx/__inline_${Date.now()}`;
|
|
396
|
+
this._layoutLoader.registerLayout(tempId, spec.template);
|
|
397
|
+
return tempId;
|
|
398
|
+
}
|
|
399
|
+
/** Extract layout props overrides from agent inline.layout and call-site options. */
|
|
400
|
+
_extractLayoutProps(agent, _resolvedSpec, callLayout) {
|
|
401
|
+
// Props from agent.inline.layout
|
|
402
|
+
const inlineLayout = agent.inline?.layout;
|
|
403
|
+
const agentProps = inlineLayout && typeof inlineLayout === 'object' && 'props' in inlineLayout
|
|
404
|
+
? inlineLayout.props
|
|
405
|
+
: undefined;
|
|
406
|
+
// Props from call-site options
|
|
407
|
+
const callProps = callLayout && typeof callLayout === 'object' && 'id' in callLayout
|
|
408
|
+
? callLayout.props
|
|
409
|
+
: undefined;
|
|
410
|
+
// Merge: call-site overrides agent props
|
|
411
|
+
if (agentProps || callProps) {
|
|
412
|
+
return { ...(agentProps ?? {}), ...(callProps ?? {}) };
|
|
413
|
+
}
|
|
414
|
+
return undefined;
|
|
415
|
+
}
|
|
416
|
+
emitToolEvents(traceId, agentRef, provider, line, agentId, threadId, sessionId) {
|
|
417
|
+
try {
|
|
418
|
+
const entries = parseStdoutEvent(new Date().toISOString(), line);
|
|
419
|
+
for (const entry of entries) {
|
|
420
|
+
if (entry.type === 'tool_use' && entry.toolName) {
|
|
421
|
+
this.emit('tool:observed:before', {
|
|
422
|
+
traceId,
|
|
423
|
+
timestamp: new Date(),
|
|
424
|
+
agentRef,
|
|
425
|
+
agentId,
|
|
426
|
+
threadId,
|
|
427
|
+
sessionId,
|
|
428
|
+
provider,
|
|
429
|
+
tool: {
|
|
430
|
+
name: entry.toolName,
|
|
431
|
+
rawName: entry.toolName,
|
|
432
|
+
input: entry.toolInput ? this.tryParseJson(entry.toolInput) : undefined,
|
|
433
|
+
toolUseId: entry.toolUseId,
|
|
434
|
+
},
|
|
435
|
+
});
|
|
436
|
+
}
|
|
437
|
+
if (entry.type === 'tool_result') {
|
|
438
|
+
this.emit('tool:observed:after', {
|
|
439
|
+
traceId,
|
|
440
|
+
timestamp: new Date(),
|
|
441
|
+
agentRef,
|
|
442
|
+
agentId,
|
|
443
|
+
threadId,
|
|
444
|
+
sessionId,
|
|
445
|
+
provider,
|
|
446
|
+
tool: {
|
|
447
|
+
name: entry.toolName ?? 'unknown',
|
|
448
|
+
rawName: entry.toolName ?? 'unknown',
|
|
449
|
+
toolUseId: entry.toolUseId,
|
|
450
|
+
result: entry.resultPreview,
|
|
451
|
+
isError: entry.isError,
|
|
452
|
+
},
|
|
453
|
+
});
|
|
454
|
+
}
|
|
455
|
+
}
|
|
456
|
+
}
|
|
457
|
+
catch {
|
|
458
|
+
// non-fatal: parsing failure must not block the main process
|
|
459
|
+
}
|
|
460
|
+
}
|
|
461
|
+
tryParseJson(s) {
|
|
462
|
+
try {
|
|
463
|
+
return JSON.parse(s);
|
|
464
|
+
}
|
|
465
|
+
catch {
|
|
466
|
+
return s;
|
|
467
|
+
}
|
|
468
|
+
}
|
|
469
|
+
/**
|
|
470
|
+
* Query an agent with a message.
|
|
471
|
+
*
|
|
472
|
+
* Emits task:start (with child pid when available) then task:output per
|
|
473
|
+
* stdout/stderr line, then task:end on completion or error.
|
|
474
|
+
*/
|
|
475
|
+
async query(agentRef, message, options) {
|
|
476
|
+
const startMs = Date.now();
|
|
477
|
+
const traceId = generateId('tsk');
|
|
478
|
+
const timestamp = new Date();
|
|
479
|
+
let agent;
|
|
480
|
+
try {
|
|
481
|
+
agent = resolveAgent(agentRef, Array.from(this._agents.values()));
|
|
482
|
+
}
|
|
483
|
+
catch (err) {
|
|
484
|
+
if (err instanceof AgentNotFoundError) {
|
|
485
|
+
this.emit('task:start', { traceId, timestamp, agentRef, message: message, mode: 'query', metadata: { ...(options?.metadata ?? {}) } });
|
|
486
|
+
const durationMs = Date.now() - startMs;
|
|
487
|
+
const error = { code: 'AGENT_NOT_FOUND', message: err.message };
|
|
488
|
+
this.emit('task:end', { traceId, timestamp: new Date(), agentRef, mode: 'query', durationMs, error, metadata: options?.metadata ? { ...options.metadata } : undefined });
|
|
489
|
+
return {
|
|
490
|
+
ok: false,
|
|
491
|
+
data: '',
|
|
492
|
+
error,
|
|
493
|
+
meta: { agentId: agentRef.replace(/^@/, ''), provider: '', durationMs },
|
|
494
|
+
};
|
|
495
|
+
}
|
|
496
|
+
throw err;
|
|
497
|
+
}
|
|
498
|
+
const providerStr = Array.isArray(agent.provider)
|
|
499
|
+
? agent.provider[0] ?? 'cli/claude'
|
|
500
|
+
: agent.provider;
|
|
501
|
+
const effectiveProviderStr = options?.provider ?? providerStr;
|
|
502
|
+
const effectiveModel = options?.model ?? agent.inline?.model;
|
|
503
|
+
let provider;
|
|
504
|
+
try {
|
|
505
|
+
provider = createProvider(effectiveProviderStr);
|
|
506
|
+
}
|
|
507
|
+
catch (err) {
|
|
508
|
+
this.emit('task:start', { traceId, timestamp, agentRef, message: message, mode: 'query', metadata: { ...(options?.metadata ?? {}) } });
|
|
509
|
+
const durationMs = Date.now() - startMs;
|
|
510
|
+
const error = { code: 'PROVIDER_ERROR', message: err.message };
|
|
511
|
+
this.emit('task:end', { traceId, timestamp: new Date(), agentRef, mode: 'query', durationMs, error, metadata: options?.metadata ? { ...options.metadata } : undefined });
|
|
512
|
+
return {
|
|
513
|
+
ok: false,
|
|
514
|
+
data: '',
|
|
515
|
+
error,
|
|
516
|
+
meta: { agentId: agent.id, provider: effectiveProviderStr, model: effectiveModel, durationMs },
|
|
517
|
+
};
|
|
518
|
+
}
|
|
519
|
+
// Render agent prompt for tracing (non-fatal if it fails)
|
|
520
|
+
let renderedPrompt;
|
|
521
|
+
try {
|
|
522
|
+
renderedPrompt = await this.renderAgentPromptFull(agentRef, { session: { mode: 'query' } });
|
|
523
|
+
}
|
|
524
|
+
catch {
|
|
525
|
+
// Prompt rendering is best-effort; do not block the query
|
|
526
|
+
}
|
|
527
|
+
let codingAgentCommand;
|
|
528
|
+
let providerUsage;
|
|
529
|
+
let exitCode;
|
|
530
|
+
let resolvedModel = effectiveModel;
|
|
531
|
+
let taskStartEmitted = false;
|
|
532
|
+
const emitStartIfNeeded = (pid) => {
|
|
533
|
+
if (!taskStartEmitted) {
|
|
534
|
+
taskStartEmitted = true;
|
|
535
|
+
this.emit('task:start', {
|
|
536
|
+
traceId, timestamp, agentRef, message: message, mode: 'query', pid,
|
|
537
|
+
model: resolvedModel,
|
|
538
|
+
provider: effectiveProviderStr,
|
|
539
|
+
codingAgentCommand,
|
|
540
|
+
renderedPrompt,
|
|
541
|
+
metadata: { ...(options?.metadata ?? {}), provider: effectiveProviderStr },
|
|
542
|
+
threadId: options?.threadId,
|
|
543
|
+
});
|
|
544
|
+
}
|
|
545
|
+
};
|
|
546
|
+
const agentCliOpts = agent.options;
|
|
547
|
+
// Filter tools for query mode
|
|
548
|
+
const queryToolNames = Array.isArray(agentCliOpts?.query?.tools)
|
|
549
|
+
? agentCliOpts.query.tools
|
|
550
|
+
: undefined;
|
|
551
|
+
const filteredTools = this._tools.size > 0
|
|
552
|
+
? this._filterToolsByMode(queryToolNames)
|
|
553
|
+
: [];
|
|
554
|
+
// maxSteps from agent inline config
|
|
555
|
+
const maxSteps = agent.inline?.max_steps;
|
|
556
|
+
// api/* providers don't emit pid — emit task:start early so plugins (FileLogger) can log tool calls
|
|
557
|
+
if (effectiveProviderStr.startsWith('api/')) {
|
|
558
|
+
emitStartIfNeeded();
|
|
559
|
+
}
|
|
560
|
+
try {
|
|
561
|
+
const response = await provider.query(message, {
|
|
562
|
+
model: effectiveModel,
|
|
563
|
+
context: options?.context,
|
|
564
|
+
systemPrompt: renderedPrompt ?? agent.inline?.system_prompt ?? agent.inline?.prompt,
|
|
565
|
+
additionalArgs: Array.isArray(agentCliOpts?.query) ? agentCliOpts.query : undefined,
|
|
566
|
+
tools: filteredTools.length > 0 ? filteredTools : undefined,
|
|
567
|
+
maxSteps,
|
|
568
|
+
env: {
|
|
569
|
+
CREWX_AGENT_ID: agent.id,
|
|
570
|
+
CREWX_USER_ID: process.env.USER || process.env.USERNAME || 'unknown',
|
|
571
|
+
CREWX_TRACE_ID: traceId,
|
|
572
|
+
CREWX_PARENT_TASK_ID: traceId,
|
|
573
|
+
CREWX_CALLER_AGENT_ID: process.env.CREWX_AGENT_ID ?? '',
|
|
574
|
+
CREWX_THREAD_ID: options?.threadId ?? '',
|
|
575
|
+
CREWX_PROVIDER: effectiveProviderStr,
|
|
576
|
+
CREWX_SESSION_ID: '',
|
|
577
|
+
},
|
|
578
|
+
onPid: (pid) => emitStartIfNeeded(pid),
|
|
579
|
+
onOutput: (line, level) => {
|
|
580
|
+
this.emit('task:output', { traceId, timestamp: new Date(), agentRef, output: line, level });
|
|
581
|
+
if (level === 'stdout') {
|
|
582
|
+
this.emitToolEvents(traceId, agentRef, effectiveProviderStr, line, agent.id, options?.threadId ?? '', '');
|
|
583
|
+
}
|
|
584
|
+
},
|
|
585
|
+
onCommand: (cmd) => { codingAgentCommand = cmd; },
|
|
586
|
+
onUsage: (u) => { providerUsage = u; },
|
|
587
|
+
onExitCode: (code) => { exitCode = code; },
|
|
588
|
+
onModel: (m) => { if (!resolvedModel)
|
|
589
|
+
resolvedModel = m; },
|
|
590
|
+
});
|
|
591
|
+
emitStartIfNeeded();
|
|
592
|
+
const durationMs = Date.now() - startMs;
|
|
593
|
+
this.emit('task:end', {
|
|
594
|
+
traceId, timestamp: new Date(), agentRef, mode: 'query', result: response, durationMs,
|
|
595
|
+
exitCode,
|
|
596
|
+
inputTokens: providerUsage?.inputTokens,
|
|
597
|
+
outputTokens: providerUsage?.outputTokens,
|
|
598
|
+
cachedInputTokens: providerUsage?.cachedInputTokens,
|
|
599
|
+
costUsd: providerUsage?.costUsd,
|
|
600
|
+
model: resolvedModel,
|
|
601
|
+
metadata: options?.metadata ? { ...options.metadata } : undefined,
|
|
602
|
+
});
|
|
603
|
+
return {
|
|
604
|
+
ok: true,
|
|
605
|
+
data: response,
|
|
606
|
+
meta: { agentId: agent.id, provider: effectiveProviderStr, model: effectiveModel, durationMs },
|
|
607
|
+
};
|
|
608
|
+
}
|
|
609
|
+
catch (err) {
|
|
610
|
+
// Client tool call required — return requires_action with thread state
|
|
611
|
+
if (err instanceof ClientToolCallRequiredError) {
|
|
612
|
+
const threadId = generateId('thd');
|
|
613
|
+
this._pendingThreads.set(threadId, {
|
|
614
|
+
agentRef: agent.id,
|
|
615
|
+
providerStr: effectiveProviderStr,
|
|
616
|
+
continuationState: err.continuationState,
|
|
617
|
+
toolCall: err.toolCall,
|
|
618
|
+
traceId,
|
|
619
|
+
startMs,
|
|
620
|
+
model: effectiveModel,
|
|
621
|
+
});
|
|
622
|
+
return {
|
|
623
|
+
ok: true,
|
|
624
|
+
status: 'requires_action',
|
|
625
|
+
data: '',
|
|
626
|
+
toolCall: err.toolCall,
|
|
627
|
+
threadId,
|
|
628
|
+
meta: { agentId: agent.id, provider: effectiveProviderStr, model: effectiveModel, durationMs: Date.now() - startMs },
|
|
629
|
+
};
|
|
630
|
+
}
|
|
631
|
+
emitStartIfNeeded();
|
|
632
|
+
const durationMs = Date.now() - startMs;
|
|
633
|
+
const error = { code: 'QUERY_FAILED', message: err.message };
|
|
634
|
+
this.emit('task:end', {
|
|
635
|
+
traceId, timestamp: new Date(), agentRef, mode: 'query', durationMs, error,
|
|
636
|
+
exitCode,
|
|
637
|
+
inputTokens: providerUsage?.inputTokens,
|
|
638
|
+
outputTokens: providerUsage?.outputTokens,
|
|
639
|
+
cachedInputTokens: providerUsage?.cachedInputTokens,
|
|
640
|
+
costUsd: providerUsage?.costUsd,
|
|
641
|
+
model: resolvedModel,
|
|
642
|
+
metadata: options?.metadata ? { ...options.metadata } : undefined,
|
|
643
|
+
});
|
|
644
|
+
return {
|
|
645
|
+
ok: false,
|
|
646
|
+
data: '',
|
|
647
|
+
error,
|
|
648
|
+
meta: { agentId: agent.id, provider: effectiveProviderStr, model: effectiveModel, durationMs },
|
|
649
|
+
};
|
|
650
|
+
}
|
|
651
|
+
}
|
|
652
|
+
/**
|
|
653
|
+
* Continue a conversation after providing client-side tool results.
|
|
654
|
+
*
|
|
655
|
+
* Called when a previous query() returned status: 'requires_action'.
|
|
656
|
+
* Feeds the tool result back to the agent and resumes generation.
|
|
657
|
+
* May return 'requires_action' again if the agent calls another client tool.
|
|
658
|
+
*/
|
|
659
|
+
async continueQuery(threadId, toolResults) {
|
|
660
|
+
const state = this._pendingThreads.get(threadId);
|
|
661
|
+
if (!state) {
|
|
662
|
+
return {
|
|
663
|
+
ok: false,
|
|
664
|
+
data: '',
|
|
665
|
+
error: { code: 'THREAD_NOT_FOUND', message: `No pending thread: ${threadId}` },
|
|
666
|
+
meta: { agentId: '', provider: '', durationMs: 0 },
|
|
667
|
+
};
|
|
668
|
+
}
|
|
669
|
+
this._pendingThreads.delete(threadId);
|
|
670
|
+
const provider = createProvider(state.providerStr);
|
|
671
|
+
if (!provider.continueWithToolResults) {
|
|
672
|
+
return {
|
|
673
|
+
ok: false,
|
|
674
|
+
data: '',
|
|
675
|
+
error: { code: 'UNSUPPORTED', message: 'Provider does not support client tool continuation' },
|
|
676
|
+
meta: { agentId: state.agentRef, provider: state.providerStr, durationMs: 0 },
|
|
677
|
+
};
|
|
678
|
+
}
|
|
679
|
+
// Enrich toolResults with toolName (looked up from stored toolCall by toolCallId)
|
|
680
|
+
const enrichedToolResults = toolResults.map(tr => ({
|
|
681
|
+
...tr,
|
|
682
|
+
toolName: state.toolCall.toolCallId === tr.toolCallId
|
|
683
|
+
? state.toolCall.toolName
|
|
684
|
+
: tr.toolCallId,
|
|
685
|
+
}));
|
|
686
|
+
try {
|
|
687
|
+
const response = await provider.continueWithToolResults(state.continuationState, enrichedToolResults);
|
|
688
|
+
const durationMs = Date.now() - state.startMs;
|
|
689
|
+
this.emit('task:end', {
|
|
690
|
+
traceId: state.traceId, timestamp: new Date(), agentRef: state.agentRef,
|
|
691
|
+
mode: 'query', result: response, durationMs,
|
|
692
|
+
});
|
|
693
|
+
return {
|
|
694
|
+
ok: true,
|
|
695
|
+
status: 'complete',
|
|
696
|
+
data: response,
|
|
697
|
+
meta: { agentId: state.agentRef, provider: state.providerStr, model: state.model, durationMs },
|
|
698
|
+
};
|
|
699
|
+
}
|
|
700
|
+
catch (err) {
|
|
701
|
+
if (err instanceof ClientToolCallRequiredError) {
|
|
702
|
+
// Another client tool needed — re-store thread state
|
|
703
|
+
this._pendingThreads.set(threadId, {
|
|
704
|
+
...state,
|
|
705
|
+
continuationState: err.continuationState,
|
|
706
|
+
toolCall: err.toolCall,
|
|
707
|
+
});
|
|
708
|
+
return {
|
|
709
|
+
ok: true,
|
|
710
|
+
status: 'requires_action',
|
|
711
|
+
data: '',
|
|
712
|
+
toolCall: err.toolCall,
|
|
713
|
+
threadId,
|
|
714
|
+
meta: { agentId: state.agentRef, provider: state.providerStr, model: state.model, durationMs: Date.now() - state.startMs },
|
|
715
|
+
};
|
|
716
|
+
}
|
|
717
|
+
const durationMs = Date.now() - state.startMs;
|
|
718
|
+
return {
|
|
719
|
+
ok: false,
|
|
720
|
+
data: '',
|
|
721
|
+
error: { code: 'CONTINUE_FAILED', message: err.message },
|
|
722
|
+
meta: { agentId: state.agentRef, provider: state.providerStr, model: state.model, durationMs },
|
|
723
|
+
};
|
|
724
|
+
}
|
|
725
|
+
}
|
|
726
|
+
/**
|
|
727
|
+
* Execute a task with an agent.
|
|
728
|
+
*
|
|
729
|
+
* Emits task:start (with child pid when available) then task:output per
|
|
730
|
+
* stdout/stderr line, then task:end on completion or error.
|
|
731
|
+
*/
|
|
732
|
+
async execute(agentRef, message, options) {
|
|
733
|
+
const startMs = Date.now();
|
|
734
|
+
const traceId = generateId('tsk');
|
|
735
|
+
const timestamp = new Date();
|
|
736
|
+
let agent;
|
|
737
|
+
try {
|
|
738
|
+
agent = resolveAgent(agentRef, Array.from(this._agents.values()));
|
|
739
|
+
}
|
|
740
|
+
catch (err) {
|
|
741
|
+
if (err instanceof AgentNotFoundError) {
|
|
742
|
+
this.emit('task:start', { traceId, timestamp, agentRef, message: message, mode: 'execute', metadata: { ...(options?.metadata ?? {}) } });
|
|
743
|
+
const durationMs = Date.now() - startMs;
|
|
744
|
+
const error = { code: 'AGENT_NOT_FOUND', message: err.message };
|
|
745
|
+
this.emit('task:end', { traceId, timestamp: new Date(), agentRef, mode: 'execute', durationMs, error, metadata: options?.metadata ? { ...options.metadata } : undefined });
|
|
746
|
+
return {
|
|
747
|
+
ok: false,
|
|
748
|
+
data: '',
|
|
749
|
+
error,
|
|
750
|
+
meta: { agentId: agentRef.replace(/^@/, ''), provider: '', durationMs },
|
|
751
|
+
};
|
|
752
|
+
}
|
|
753
|
+
throw err;
|
|
754
|
+
}
|
|
755
|
+
const providerStr = Array.isArray(agent.provider)
|
|
756
|
+
? agent.provider[0] ?? 'cli/claude'
|
|
757
|
+
: agent.provider;
|
|
758
|
+
const effectiveProviderStr = options?.provider ?? providerStr;
|
|
759
|
+
const effectiveModel = options?.model ?? agent.inline?.model;
|
|
760
|
+
let provider;
|
|
761
|
+
try {
|
|
762
|
+
provider = createProvider(effectiveProviderStr);
|
|
763
|
+
}
|
|
764
|
+
catch (err) {
|
|
765
|
+
this.emit('task:start', { traceId, timestamp, agentRef, message: message, mode: 'execute', metadata: { ...(options?.metadata ?? {}) } });
|
|
766
|
+
const durationMs = Date.now() - startMs;
|
|
767
|
+
const error = { code: 'PROVIDER_ERROR', message: err.message };
|
|
768
|
+
this.emit('task:end', { traceId, timestamp: new Date(), agentRef, mode: 'execute', durationMs, error, metadata: options?.metadata ? { ...options.metadata } : undefined });
|
|
769
|
+
return {
|
|
770
|
+
ok: false,
|
|
771
|
+
data: '',
|
|
772
|
+
error,
|
|
773
|
+
meta: { agentId: agent.id, provider: effectiveProviderStr, model: effectiveModel, durationMs },
|
|
774
|
+
};
|
|
775
|
+
}
|
|
776
|
+
// Render agent prompt for tracing (non-fatal if it fails)
|
|
777
|
+
let renderedPrompt;
|
|
778
|
+
try {
|
|
779
|
+
renderedPrompt = await this.renderAgentPromptFull(agentRef, { session: { mode: 'execute' } });
|
|
780
|
+
}
|
|
781
|
+
catch {
|
|
782
|
+
// Prompt rendering is best-effort; do not block the execute
|
|
783
|
+
}
|
|
784
|
+
let codingAgentCommand;
|
|
785
|
+
let providerUsage;
|
|
786
|
+
let exitCode;
|
|
787
|
+
let resolvedModel = effectiveModel;
|
|
788
|
+
let taskStartEmitted = false;
|
|
789
|
+
const emitStartIfNeeded = (pid) => {
|
|
790
|
+
if (!taskStartEmitted) {
|
|
791
|
+
taskStartEmitted = true;
|
|
792
|
+
this.emit('task:start', {
|
|
793
|
+
traceId, timestamp, agentRef, message: message, mode: 'execute', pid,
|
|
794
|
+
model: resolvedModel,
|
|
795
|
+
provider: effectiveProviderStr,
|
|
796
|
+
codingAgentCommand,
|
|
797
|
+
renderedPrompt,
|
|
798
|
+
metadata: { ...(options?.metadata ?? {}), provider: effectiveProviderStr },
|
|
799
|
+
threadId: options?.threadId,
|
|
800
|
+
});
|
|
801
|
+
}
|
|
802
|
+
};
|
|
803
|
+
const agentCliOpts = agent.options;
|
|
804
|
+
// Filter tools for execute mode
|
|
805
|
+
const executeToolNames = Array.isArray(agentCliOpts?.execute?.tools)
|
|
806
|
+
? agentCliOpts.execute.tools
|
|
807
|
+
: undefined;
|
|
808
|
+
const filteredTools = this._tools.size > 0
|
|
809
|
+
? this._filterToolsByMode(executeToolNames)
|
|
810
|
+
: [];
|
|
811
|
+
// maxSteps from agent inline config
|
|
812
|
+
const maxSteps = agent.inline?.max_steps;
|
|
813
|
+
// api/* providers don't emit pid — emit task:start early so plugins (FileLogger) can log tool calls
|
|
814
|
+
if (effectiveProviderStr.startsWith('api/')) {
|
|
815
|
+
emitStartIfNeeded();
|
|
816
|
+
}
|
|
817
|
+
try {
|
|
818
|
+
const response = await provider.execute(message, {
|
|
819
|
+
model: effectiveModel,
|
|
820
|
+
context: options?.context,
|
|
821
|
+
systemPrompt: renderedPrompt ?? agent.inline?.system_prompt ?? agent.inline?.prompt,
|
|
822
|
+
additionalArgs: Array.isArray(agentCliOpts?.execute) ? agentCliOpts.execute : undefined,
|
|
823
|
+
tools: filteredTools.length > 0 ? filteredTools : undefined,
|
|
824
|
+
maxSteps,
|
|
825
|
+
env: {
|
|
826
|
+
CREWX_AGENT_ID: agent.id,
|
|
827
|
+
CREWX_USER_ID: process.env.USER || process.env.USERNAME || 'unknown',
|
|
828
|
+
CREWX_TRACE_ID: traceId,
|
|
829
|
+
CREWX_PARENT_TASK_ID: traceId,
|
|
830
|
+
CREWX_CALLER_AGENT_ID: process.env.CREWX_AGENT_ID ?? '',
|
|
831
|
+
CREWX_THREAD_ID: options?.threadId ?? '',
|
|
832
|
+
CREWX_PROVIDER: effectiveProviderStr,
|
|
833
|
+
CREWX_SESSION_ID: '',
|
|
834
|
+
},
|
|
835
|
+
onPid: (pid) => emitStartIfNeeded(pid),
|
|
836
|
+
onOutput: (line, level) => {
|
|
837
|
+
this.emit('task:output', { traceId, timestamp: new Date(), agentRef, output: line, level });
|
|
838
|
+
if (level === 'stdout') {
|
|
839
|
+
this.emitToolEvents(traceId, agentRef, effectiveProviderStr, line, agent.id, options?.threadId ?? '', '');
|
|
840
|
+
}
|
|
841
|
+
},
|
|
842
|
+
onCommand: (cmd) => { codingAgentCommand = cmd; },
|
|
843
|
+
onUsage: (u) => { providerUsage = u; },
|
|
844
|
+
onExitCode: (code) => { exitCode = code; },
|
|
845
|
+
onModel: (m) => { if (!resolvedModel)
|
|
846
|
+
resolvedModel = m; },
|
|
847
|
+
});
|
|
848
|
+
emitStartIfNeeded();
|
|
849
|
+
const durationMs = Date.now() - startMs;
|
|
850
|
+
this.emit('task:end', {
|
|
851
|
+
traceId, timestamp: new Date(), agentRef, mode: 'execute', result: response, durationMs,
|
|
852
|
+
exitCode,
|
|
853
|
+
inputTokens: providerUsage?.inputTokens,
|
|
854
|
+
outputTokens: providerUsage?.outputTokens,
|
|
855
|
+
cachedInputTokens: providerUsage?.cachedInputTokens,
|
|
856
|
+
costUsd: providerUsage?.costUsd,
|
|
857
|
+
model: resolvedModel,
|
|
858
|
+
metadata: options?.metadata ? { ...options.metadata } : undefined,
|
|
859
|
+
});
|
|
860
|
+
return {
|
|
861
|
+
ok: true,
|
|
862
|
+
data: response,
|
|
863
|
+
meta: { agentId: agent.id, provider: effectiveProviderStr, model: effectiveModel, durationMs },
|
|
864
|
+
};
|
|
865
|
+
}
|
|
866
|
+
catch (err) {
|
|
867
|
+
emitStartIfNeeded();
|
|
868
|
+
const durationMs = Date.now() - startMs;
|
|
869
|
+
const error = { code: 'EXECUTE_FAILED', message: err.message };
|
|
870
|
+
this.emit('task:end', {
|
|
871
|
+
traceId, timestamp: new Date(), agentRef, mode: 'execute', durationMs, error,
|
|
872
|
+
exitCode,
|
|
873
|
+
inputTokens: providerUsage?.inputTokens,
|
|
874
|
+
outputTokens: providerUsage?.outputTokens,
|
|
875
|
+
cachedInputTokens: providerUsage?.cachedInputTokens,
|
|
876
|
+
costUsd: providerUsage?.costUsd,
|
|
877
|
+
model: resolvedModel,
|
|
878
|
+
metadata: options?.metadata ? { ...options.metadata } : undefined,
|
|
879
|
+
});
|
|
880
|
+
return {
|
|
881
|
+
ok: false,
|
|
882
|
+
data: '',
|
|
883
|
+
error,
|
|
884
|
+
meta: { agentId: agent.id, provider: effectiveProviderStr, model: effectiveModel, durationMs },
|
|
885
|
+
};
|
|
886
|
+
}
|
|
887
|
+
}
|
|
888
|
+
}
|
|
889
|
+
// ── Module-level helper ─────────────────────────────────────────────────────
|
|
890
|
+
/**
|
|
891
|
+
* Auto-register the `remote` provider factory if any agent uses `remote/*` namespace.
|
|
892
|
+
* Reads remote provider configs from crewx.yaml `providers:` section.
|
|
893
|
+
*/
|
|
894
|
+
function registerRemoteProvidersIfNeeded(agents, config) {
|
|
895
|
+
const hasRemoteProvider = agents.some(a => {
|
|
896
|
+
const providers = Array.isArray(a.provider) ? a.provider : [a.provider];
|
|
897
|
+
return providers.some(p => p.startsWith('remote/'));
|
|
898
|
+
});
|
|
899
|
+
if (!hasRemoteProvider)
|
|
900
|
+
return;
|
|
901
|
+
// Read remote provider configs from crewx.yaml `providers:` array
|
|
902
|
+
const providersRaw = config.providers;
|
|
903
|
+
if (!Array.isArray(providersRaw))
|
|
904
|
+
return;
|
|
905
|
+
const { createRemoteProviderFactory } = require('../remote/remote-provider.js');
|
|
906
|
+
const remoteConfigs = new Map();
|
|
907
|
+
for (const entry of providersRaw) {
|
|
908
|
+
if (entry.type === 'remote' && typeof entry.id === 'string') {
|
|
909
|
+
remoteConfigs.set(entry.id, entry);
|
|
910
|
+
}
|
|
911
|
+
}
|
|
912
|
+
if (remoteConfigs.size > 0) {
|
|
913
|
+
registerProviderFactory('remote', createRemoteProviderFactory(remoteConfigs));
|
|
914
|
+
}
|
|
915
|
+
}
|
|
916
|
+
/**
|
|
917
|
+
* Auto-register the `plugin` provider factory if any agent uses `plugin/*` namespace.
|
|
918
|
+
* Reads plugin provider configs from crewx.yaml `providers:` section.
|
|
919
|
+
*/
|
|
920
|
+
function registerPluginProvidersIfNeeded(agents, config) {
|
|
921
|
+
const hasPluginProvider = agents.some(a => {
|
|
922
|
+
const providers = Array.isArray(a.provider) ? a.provider : [a.provider];
|
|
923
|
+
return providers.some(p => p.startsWith('plugin/'));
|
|
924
|
+
});
|
|
925
|
+
if (!hasPluginProvider)
|
|
926
|
+
return;
|
|
927
|
+
const providersRaw = config.providers;
|
|
928
|
+
if (!Array.isArray(providersRaw))
|
|
929
|
+
return;
|
|
930
|
+
const { createPluginProviderFactory } = require('../plugin/plugin-provider.js');
|
|
931
|
+
const pluginConfigs = new Map();
|
|
932
|
+
for (const entry of providersRaw) {
|
|
933
|
+
if (entry.type === 'plugin' && typeof entry.id === 'string') {
|
|
934
|
+
pluginConfigs.set(entry.id, entry);
|
|
935
|
+
}
|
|
936
|
+
}
|
|
937
|
+
if (pluginConfigs.size > 0) {
|
|
938
|
+
registerProviderFactory('plugin', createPluginProviderFactory(pluginConfigs));
|
|
939
|
+
}
|
|
940
|
+
}
|
|
941
|
+
//# sourceMappingURL=Crewx.js.map
|