@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,373 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Provider bridge: creates a runtime that can invoke AI providers.
|
|
3
|
+
*
|
|
4
|
+
* Supports a registry pattern — built-in cli/* providers are registered by default,
|
|
5
|
+
* and additional namespaces (e.g. api/*, webllm/*) can be added via registerProviderFactory().
|
|
6
|
+
*/
|
|
7
|
+
import { spawn } from 'child_process';
|
|
8
|
+
export class ProviderError extends Error {
|
|
9
|
+
providerStr;
|
|
10
|
+
constructor(message, providerStr) {
|
|
11
|
+
super(message);
|
|
12
|
+
this.providerStr = providerStr;
|
|
13
|
+
this.name = 'ProviderError';
|
|
14
|
+
}
|
|
15
|
+
}
|
|
16
|
+
/**
|
|
17
|
+
* Thrown by VercelProviderRuntime when generateText() encounters a tool without
|
|
18
|
+
* an execute function (client tool). The caller should return requires_action
|
|
19
|
+
* to the client, collect the tool result, and call continueWithToolResults().
|
|
20
|
+
*/
|
|
21
|
+
export class ClientToolCallRequiredError extends Error {
|
|
22
|
+
toolCall;
|
|
23
|
+
continuationState;
|
|
24
|
+
name = 'ClientToolCallRequiredError';
|
|
25
|
+
constructor(toolCall, continuationState) {
|
|
26
|
+
super(`Client tool call required: ${toolCall.toolName}`);
|
|
27
|
+
this.toolCall = toolCall;
|
|
28
|
+
this.continuationState = continuationState;
|
|
29
|
+
}
|
|
30
|
+
}
|
|
31
|
+
// ── Provider factory registry ───────────────────────────────────────────────
|
|
32
|
+
const _providerFactories = new Map();
|
|
33
|
+
/**
|
|
34
|
+
* Register a provider factory for a given namespace.
|
|
35
|
+
*
|
|
36
|
+
* @example
|
|
37
|
+
* // Register an API-based provider namespace
|
|
38
|
+
* registerProviderFactory('api', (id, providerStr) => new MyApiProvider(id));
|
|
39
|
+
*
|
|
40
|
+
* // Now createProvider('api/claude') works
|
|
41
|
+
* const provider = createProvider('api/claude');
|
|
42
|
+
*/
|
|
43
|
+
export function registerProviderFactory(namespace, factory) {
|
|
44
|
+
_providerFactories.set(namespace, factory);
|
|
45
|
+
}
|
|
46
|
+
// CLI command mapping for each supported provider id
|
|
47
|
+
const CLI_COMMANDS = {
|
|
48
|
+
claude: 'claude',
|
|
49
|
+
gemini: 'gemini',
|
|
50
|
+
copilot: 'copilot', // GitHub Copilot CLI (standalone binary)
|
|
51
|
+
codex: 'codex',
|
|
52
|
+
opencode: 'opencode', // OpenCode CLI (--format json stream)
|
|
53
|
+
};
|
|
54
|
+
/**
|
|
55
|
+
* Create a provider runtime for the given provider string.
|
|
56
|
+
*
|
|
57
|
+
* Looks up the namespace in the provider registry first.
|
|
58
|
+
* Falls back to built-in cli/* providers for backward compatibility.
|
|
59
|
+
*
|
|
60
|
+
* @param providerStr - Provider string in namespace/id format (e.g., 'cli/claude', 'api/claude')
|
|
61
|
+
* @throws ProviderError for unknown or unsupported providers
|
|
62
|
+
*/
|
|
63
|
+
export function createProvider(providerStr) {
|
|
64
|
+
const parts = providerStr.split('/');
|
|
65
|
+
if (parts.length !== 2) {
|
|
66
|
+
throw new ProviderError(`Invalid provider format: "${providerStr}". Expected namespace/id (e.g., cli/claude)`, providerStr);
|
|
67
|
+
}
|
|
68
|
+
const [namespace, id] = parts;
|
|
69
|
+
// Check registry first (covers both user-registered and built-in cli namespace)
|
|
70
|
+
const factory = _providerFactories.get(namespace);
|
|
71
|
+
if (factory) {
|
|
72
|
+
return factory(id, providerStr);
|
|
73
|
+
}
|
|
74
|
+
// Built-in cli/* fallback (for backward compatibility when cli factory is not explicitly registered)
|
|
75
|
+
if (namespace === 'cli') {
|
|
76
|
+
const cliCommand = CLI_COMMANDS[id];
|
|
77
|
+
if (!cliCommand) {
|
|
78
|
+
throw new ProviderError(`Unknown CLI provider id: "${id}". Supported: ${Object.keys(CLI_COMMANDS).join(', ')}`, providerStr);
|
|
79
|
+
}
|
|
80
|
+
return new CliProviderRuntime(id, cliCommand, providerStr);
|
|
81
|
+
}
|
|
82
|
+
throw new ProviderError(`Unsupported provider namespace: "${namespace}". Register a factory with registerProviderFactory('${namespace}', factory).`, providerStr);
|
|
83
|
+
}
|
|
84
|
+
/**
|
|
85
|
+
* Provider runtime that spawns a CLI process and collects its output.
|
|
86
|
+
*/
|
|
87
|
+
class CliProviderRuntime {
|
|
88
|
+
providerId;
|
|
89
|
+
cliCommand;
|
|
90
|
+
providerStr;
|
|
91
|
+
constructor(providerId, cliCommand, providerStr) {
|
|
92
|
+
this.providerId = providerId;
|
|
93
|
+
this.cliCommand = cliCommand;
|
|
94
|
+
this.providerStr = providerStr;
|
|
95
|
+
}
|
|
96
|
+
async execute(message, options) {
|
|
97
|
+
const { args, stdinMessage } = this.buildArgs(message, options, true);
|
|
98
|
+
options?.onCommand?.(`${this.cliCommand} ${args.join(' ')}`);
|
|
99
|
+
return this.runProcess(args, options, stdinMessage);
|
|
100
|
+
}
|
|
101
|
+
async query(message, options) {
|
|
102
|
+
const { args, stdinMessage } = this.buildArgs(message, options);
|
|
103
|
+
options?.onCommand?.(`${this.cliCommand} ${args.join(' ')}`);
|
|
104
|
+
return this.runProcess(args, options, stdinMessage);
|
|
105
|
+
}
|
|
106
|
+
runProcess(args, options, stdinMessage) {
|
|
107
|
+
return new Promise((resolve, reject) => {
|
|
108
|
+
const proc = spawn(this.cliCommand, args, {
|
|
109
|
+
env: { ...process.env, ...(options?.env ?? {}) },
|
|
110
|
+
stdio: ['pipe', 'pipe', 'pipe'],
|
|
111
|
+
});
|
|
112
|
+
// Write message to stdin for providers that read prompt from stdin (e.g. codex)
|
|
113
|
+
// Always close stdin afterwards — some CLIs (e.g. opencode) hang waiting for
|
|
114
|
+
// input otherwise, even when the prompt was passed via argv.
|
|
115
|
+
if (stdinMessage !== undefined) {
|
|
116
|
+
proc.stdin.write(stdinMessage);
|
|
117
|
+
}
|
|
118
|
+
proc.stdin.end();
|
|
119
|
+
// Report child PID immediately after spawn
|
|
120
|
+
if (proc.pid !== undefined) {
|
|
121
|
+
options?.onPid?.(proc.pid);
|
|
122
|
+
}
|
|
123
|
+
let stdout = '';
|
|
124
|
+
let stderr = '';
|
|
125
|
+
let stdoutBuf = '';
|
|
126
|
+
let stderrBuf = '';
|
|
127
|
+
proc.stdout.on('data', (chunk) => {
|
|
128
|
+
const str = chunk.toString();
|
|
129
|
+
stdout += str;
|
|
130
|
+
stdoutBuf += str;
|
|
131
|
+
const lines = stdoutBuf.split('\n');
|
|
132
|
+
stdoutBuf = lines.pop() ?? '';
|
|
133
|
+
for (const line of lines) {
|
|
134
|
+
if (line.trim())
|
|
135
|
+
options?.onOutput?.(line, 'stdout');
|
|
136
|
+
}
|
|
137
|
+
});
|
|
138
|
+
proc.stderr.on('data', (chunk) => {
|
|
139
|
+
const str = chunk.toString();
|
|
140
|
+
stderr += str;
|
|
141
|
+
stderrBuf += str;
|
|
142
|
+
const lines = stderrBuf.split('\n');
|
|
143
|
+
stderrBuf = lines.pop() ?? '';
|
|
144
|
+
for (const line of lines) {
|
|
145
|
+
if (line.trim())
|
|
146
|
+
options?.onOutput?.(line, 'stderr');
|
|
147
|
+
}
|
|
148
|
+
});
|
|
149
|
+
proc.on('error', (err) => {
|
|
150
|
+
if (err.code === 'ENOENT') {
|
|
151
|
+
reject(new ProviderError(`CLI command "${this.cliCommand}" not found. Is ${this.providerStr} installed?`, this.providerStr));
|
|
152
|
+
}
|
|
153
|
+
else {
|
|
154
|
+
reject(new ProviderError(`Spawn error: ${err.message}`, this.providerStr));
|
|
155
|
+
}
|
|
156
|
+
});
|
|
157
|
+
proc.on('close', (code) => {
|
|
158
|
+
// Flush any residual buffered content (no trailing newline)
|
|
159
|
+
if (stdoutBuf.trim())
|
|
160
|
+
options?.onOutput?.(stdoutBuf, 'stdout');
|
|
161
|
+
if (stderrBuf.trim())
|
|
162
|
+
options?.onOutput?.(stderrBuf, 'stderr');
|
|
163
|
+
const exitCode = code ?? 0;
|
|
164
|
+
options?.onExitCode?.(exitCode);
|
|
165
|
+
if (code !== 0) {
|
|
166
|
+
reject(new ProviderError(`Process exited with code ${code}: ${stderr.slice(0, 500)}`, this.providerStr));
|
|
167
|
+
return;
|
|
168
|
+
}
|
|
169
|
+
// Extract usage and model from stream-json result event before resolving
|
|
170
|
+
const { usage, model } = this.parseResultEvent(stdout);
|
|
171
|
+
if (usage && options?.onUsage) {
|
|
172
|
+
options.onUsage(usage);
|
|
173
|
+
}
|
|
174
|
+
// OpenCode stream doesn't emit model info in events; fall back to configured model
|
|
175
|
+
const effectiveModel = model ?? (this.providerId === 'opencode' ? (options?.model ?? null) : null);
|
|
176
|
+
if (effectiveModel && options?.onModel) {
|
|
177
|
+
options.onModel(effectiveModel);
|
|
178
|
+
}
|
|
179
|
+
const parsed = this.parseOutput(stdout);
|
|
180
|
+
resolve(parsed);
|
|
181
|
+
});
|
|
182
|
+
});
|
|
183
|
+
}
|
|
184
|
+
buildArgs(message, options, isExecute = false) {
|
|
185
|
+
// HOTFIX: compose systemPrompt into the outgoing message for all CLI providers.
|
|
186
|
+
// CLI providers don't have a common --system-prompt flag, and agent-rendered
|
|
187
|
+
// prompts (persona, rules, inline.prompt, builtin_tools, skills) were being
|
|
188
|
+
// dropped entirely before this fix. Provider-native system-prompt flags
|
|
189
|
+
// (e.g. claude --append-system-prompt) should be adopted per-provider later
|
|
190
|
+
// for proper system/user separation + prompt caching.
|
|
191
|
+
const effectiveMessage = options?.systemPrompt
|
|
192
|
+
? `${options.systemPrompt}\n\n---\n\n${message}`
|
|
193
|
+
: message;
|
|
194
|
+
// Copilot uses standalone `copilot` binary with prompt via stdin
|
|
195
|
+
// (matching pre-refactoring CopilotProvider behavior)
|
|
196
|
+
if (this.providerId === 'copilot') {
|
|
197
|
+
const args = options?.additionalArgs ? [...options.additionalArgs] : [];
|
|
198
|
+
if (options?.model)
|
|
199
|
+
args.push('--model', options.model);
|
|
200
|
+
return { args, stdinMessage: effectiveMessage };
|
|
201
|
+
}
|
|
202
|
+
// OpenCode: prompt is a positional arg appended last; --format json is system-forced.
|
|
203
|
+
// Security flags (e.g. --dangerously-skip-permissions) come from options.additionalArgs
|
|
204
|
+
// so operators can control them via crewx.yaml.
|
|
205
|
+
if (this.providerId === 'opencode') {
|
|
206
|
+
const additionalArgs = options?.additionalArgs;
|
|
207
|
+
const args = additionalArgs !== undefined ? [...additionalArgs] : ['run'];
|
|
208
|
+
// System guarantee: --format json must be present for stream-json parsing
|
|
209
|
+
if (!args.includes('--format')) {
|
|
210
|
+
args.push('--format', 'json');
|
|
211
|
+
}
|
|
212
|
+
if (options?.model)
|
|
213
|
+
args.push('--model', options.model);
|
|
214
|
+
args.push(effectiveMessage);
|
|
215
|
+
return { args };
|
|
216
|
+
}
|
|
217
|
+
// If agent config provides explicit CLI options, use them directly
|
|
218
|
+
if (options?.additionalArgs !== undefined) {
|
|
219
|
+
const args = [...options.additionalArgs];
|
|
220
|
+
const pIdx = args.indexOf('-p');
|
|
221
|
+
if (pIdx !== -1) {
|
|
222
|
+
// -p flag present: insert message as its value
|
|
223
|
+
args.splice(pIdx + 1, 0, effectiveMessage);
|
|
224
|
+
if (options.model)
|
|
225
|
+
args.push('--model', options.model);
|
|
226
|
+
return { args };
|
|
227
|
+
}
|
|
228
|
+
else {
|
|
229
|
+
// No -p flag: provider reads prompt from stdin (e.g. codex)
|
|
230
|
+
if (options.model)
|
|
231
|
+
args.push('--model', options.model);
|
|
232
|
+
return { args, stdinMessage: effectiveMessage };
|
|
233
|
+
}
|
|
234
|
+
}
|
|
235
|
+
// Default fallback: claude/gemini stream-json format
|
|
236
|
+
const args = ['-p', effectiveMessage, '--output-format', 'stream-json', '--verbose'];
|
|
237
|
+
if (isExecute) {
|
|
238
|
+
args.push('--dangerously-skip-permissions');
|
|
239
|
+
}
|
|
240
|
+
if (options?.model) {
|
|
241
|
+
args.push('--model', options.model);
|
|
242
|
+
}
|
|
243
|
+
return { args };
|
|
244
|
+
}
|
|
245
|
+
/**
|
|
246
|
+
* Parse JSONL stream output and extract assistant text.
|
|
247
|
+
* Falls back to raw stdout if parsing fails.
|
|
248
|
+
*/
|
|
249
|
+
parseOutput(raw) {
|
|
250
|
+
const lines = raw.split('\n').filter(l => l.trim());
|
|
251
|
+
const assistantTexts = [];
|
|
252
|
+
const geminiDeltaTokens = [];
|
|
253
|
+
const copilotTexts = [];
|
|
254
|
+
const codexTexts = [];
|
|
255
|
+
const opencodeTexts = [];
|
|
256
|
+
let resultText = null;
|
|
257
|
+
for (const line of lines) {
|
|
258
|
+
try {
|
|
259
|
+
const parsed = JSON.parse(line);
|
|
260
|
+
// Claude format: { type: 'assistant', message: { content: [...] } }
|
|
261
|
+
if (parsed.type === 'assistant' && Array.isArray(parsed.message?.content)) {
|
|
262
|
+
for (const block of parsed.message.content) {
|
|
263
|
+
if (block.type === 'text' && typeof block.text === 'string' && block.text.trim()) {
|
|
264
|
+
assistantTexts.push(block.text.trim());
|
|
265
|
+
}
|
|
266
|
+
}
|
|
267
|
+
}
|
|
268
|
+
// Gemini format: { type: 'message', role: 'assistant', delta: true, content: '...' }
|
|
269
|
+
if (parsed.type === 'message' &&
|
|
270
|
+
parsed.role === 'assistant' &&
|
|
271
|
+
parsed.delta === true &&
|
|
272
|
+
typeof parsed.content === 'string') {
|
|
273
|
+
geminiDeltaTokens.push(parsed.content);
|
|
274
|
+
}
|
|
275
|
+
// Copilot format: { type: 'assistant.message', data: { content: '...' } }
|
|
276
|
+
if (parsed.type === 'assistant.message' &&
|
|
277
|
+
typeof parsed.data?.content === 'string') {
|
|
278
|
+
const content = parsed.data.content;
|
|
279
|
+
if (content.trim())
|
|
280
|
+
copilotTexts.push(content.trim());
|
|
281
|
+
}
|
|
282
|
+
// Codex format: { type: 'item.completed', item: { type: 'message', text: '...' } }
|
|
283
|
+
if (parsed.type === 'item.completed' &&
|
|
284
|
+
parsed.item?.type === 'message' &&
|
|
285
|
+
typeof parsed.item?.text === 'string') {
|
|
286
|
+
const text = parsed.item.text;
|
|
287
|
+
if (text.trim())
|
|
288
|
+
codexTexts.push(text.trim());
|
|
289
|
+
}
|
|
290
|
+
// OpenCode format: { type: 'text', part: { text: '...' } }
|
|
291
|
+
if (parsed.type === 'text' && typeof parsed.part?.text === 'string') {
|
|
292
|
+
const text = parsed.part.text;
|
|
293
|
+
if (text.trim())
|
|
294
|
+
opencodeTexts.push(text.trim());
|
|
295
|
+
}
|
|
296
|
+
if (parsed.type === 'result' && typeof parsed.result === 'string') {
|
|
297
|
+
resultText = parsed.result;
|
|
298
|
+
}
|
|
299
|
+
}
|
|
300
|
+
catch {
|
|
301
|
+
// Not valid JSON line — skip
|
|
302
|
+
}
|
|
303
|
+
}
|
|
304
|
+
if (assistantTexts.length > 0)
|
|
305
|
+
return assistantTexts.join('\n\n');
|
|
306
|
+
if (geminiDeltaTokens.length > 0)
|
|
307
|
+
return geminiDeltaTokens.join('');
|
|
308
|
+
if (copilotTexts.length > 0)
|
|
309
|
+
return copilotTexts.join('\n\n');
|
|
310
|
+
if (codexTexts.length > 0)
|
|
311
|
+
return codexTexts.join('\n\n');
|
|
312
|
+
if (opencodeTexts.length > 0)
|
|
313
|
+
return opencodeTexts.join('');
|
|
314
|
+
if (resultText)
|
|
315
|
+
return resultText;
|
|
316
|
+
// Plain text fallback
|
|
317
|
+
return raw.trim();
|
|
318
|
+
}
|
|
319
|
+
/**
|
|
320
|
+
* Extract token usage, cost, and model from the stream-json result event.
|
|
321
|
+
* Claude CLI emits: { type: "result", usage: {...}, total_cost_usd: ..., modelUsage: {...} }
|
|
322
|
+
* OpenCode CLI emits: { type: "step_finish", part: { tokens: { input, output, cache: { read, write } }, cost: 0 } }
|
|
323
|
+
*/
|
|
324
|
+
parseResultEvent(raw) {
|
|
325
|
+
const lines = raw.split('\n');
|
|
326
|
+
let opencodeUsage = null;
|
|
327
|
+
for (const line of lines) {
|
|
328
|
+
if (!line.trim())
|
|
329
|
+
continue;
|
|
330
|
+
try {
|
|
331
|
+
const parsed = JSON.parse(line);
|
|
332
|
+
// OpenCode step_finish — use last-match semantics (same as parseUsage)
|
|
333
|
+
if (parsed.type === 'step_finish') {
|
|
334
|
+
const part = parsed.part;
|
|
335
|
+
const tokens = part?.['tokens'];
|
|
336
|
+
if (tokens) {
|
|
337
|
+
const inputRaw = Number(tokens['input'] ?? 0);
|
|
338
|
+
const outputTokens = Number(tokens['output'] ?? 0);
|
|
339
|
+
const cache = tokens['cache'];
|
|
340
|
+
const cacheRead = cache ? Number(cache['read'] ?? 0) : 0;
|
|
341
|
+
opencodeUsage = {
|
|
342
|
+
inputTokens: inputRaw + cacheRead,
|
|
343
|
+
outputTokens,
|
|
344
|
+
cachedInputTokens: cacheRead,
|
|
345
|
+
costUsd: 0, // cost collection is Phase 2 scope
|
|
346
|
+
};
|
|
347
|
+
}
|
|
348
|
+
}
|
|
349
|
+
if (parsed.type === 'result') {
|
|
350
|
+
const usageRaw = parsed.usage;
|
|
351
|
+
const usage = usageRaw
|
|
352
|
+
? {
|
|
353
|
+
inputTokens: Number(usageRaw['input_tokens'] ?? 0),
|
|
354
|
+
outputTokens: Number(usageRaw['output_tokens'] ?? 0),
|
|
355
|
+
cachedInputTokens: Number(usageRaw['cache_read_input_tokens'] ?? 0),
|
|
356
|
+
costUsd: Number(parsed['total_cost_usd'] ?? 0),
|
|
357
|
+
}
|
|
358
|
+
: null;
|
|
359
|
+
// Extract model from modelUsage keys (e.g. { "claude-opus-4-6": {...} })
|
|
360
|
+
const modelUsage = parsed.modelUsage;
|
|
361
|
+
const model = modelUsage ? Object.keys(modelUsage)[0] ?? null : null;
|
|
362
|
+
return { usage, model };
|
|
363
|
+
}
|
|
364
|
+
}
|
|
365
|
+
catch {
|
|
366
|
+
// Not JSON — skip
|
|
367
|
+
}
|
|
368
|
+
}
|
|
369
|
+
// Return OpenCode usage if found (no `result` event in OpenCode stream)
|
|
370
|
+
return { usage: opencodeUsage, model: null };
|
|
371
|
+
}
|
|
372
|
+
}
|
|
373
|
+
//# sourceMappingURL=bridge.js.map
|
|
@@ -0,0 +1,80 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Pure function to extract token usage from provider CLI stdout.
|
|
3
|
+
* Supports Claude / Codex / Gemini / Copilot / OpenCode JSONL formats.
|
|
4
|
+
* Uses last-match semantics: if multiple usage events are found, the last one wins.
|
|
5
|
+
*/
|
|
6
|
+
function extractFromFlat(obj) {
|
|
7
|
+
// Pattern: { type: "usage", input_tokens, output_tokens, [cache_read_input_tokens], [cached_input_tokens] }
|
|
8
|
+
if (obj['type'] !== 'usage' || !('input_tokens' in obj))
|
|
9
|
+
return null;
|
|
10
|
+
const inputRaw = Number(obj['input_tokens'] ?? 0);
|
|
11
|
+
const outputTokens = Number(obj['output_tokens'] ?? 0);
|
|
12
|
+
// cache_read_input_tokens takes precedence over cached_input_tokens
|
|
13
|
+
const hasCacheRead = 'cache_read_input_tokens' in obj;
|
|
14
|
+
const cacheRead = hasCacheRead ? Number(obj['cache_read_input_tokens']) : undefined;
|
|
15
|
+
const cachedInput = 'cached_input_tokens' in obj ? Number(obj['cached_input_tokens']) : undefined;
|
|
16
|
+
const cachedInputTokens = cacheRead !== undefined ? cacheRead : (cachedInput ?? 0);
|
|
17
|
+
// For cache_read_input_tokens: normalize — input_tokens represents fresh-only, total = input + cache_read
|
|
18
|
+
const inputTokens = cacheRead !== undefined ? inputRaw + cacheRead : inputRaw;
|
|
19
|
+
return { inputTokens, outputTokens, cachedInputTokens };
|
|
20
|
+
}
|
|
21
|
+
function extractFromNested(obj) {
|
|
22
|
+
// Pattern: { usage: { input_tokens, output_tokens, [cache_read_input_tokens], [cached_input_tokens] } }
|
|
23
|
+
const usageRaw = obj['usage'];
|
|
24
|
+
if (!usageRaw || typeof usageRaw !== 'object' || Array.isArray(usageRaw))
|
|
25
|
+
return null;
|
|
26
|
+
const usage = usageRaw;
|
|
27
|
+
if (!('input_tokens' in usage))
|
|
28
|
+
return null;
|
|
29
|
+
const inputRaw = Number(usage['input_tokens'] ?? 0);
|
|
30
|
+
const outputTokens = Number(usage['output_tokens'] ?? 0);
|
|
31
|
+
const hasCacheRead = 'cache_read_input_tokens' in usage;
|
|
32
|
+
const cacheRead = hasCacheRead ? Number(usage['cache_read_input_tokens']) : undefined;
|
|
33
|
+
const cachedInput = 'cached_input_tokens' in usage ? Number(usage['cached_input_tokens']) : undefined;
|
|
34
|
+
const cachedInputTokens = cacheRead !== undefined ? cacheRead : (cachedInput ?? 0);
|
|
35
|
+
const inputTokens = cacheRead !== undefined ? inputRaw + cacheRead : inputRaw;
|
|
36
|
+
return { inputTokens, outputTokens, cachedInputTokens };
|
|
37
|
+
}
|
|
38
|
+
function extractFromOpencode(obj) {
|
|
39
|
+
// Pattern: { type: "step_finish", part: { tokens: { input, output, cache: { read, write } } } }
|
|
40
|
+
if (obj['type'] !== 'step_finish')
|
|
41
|
+
return null;
|
|
42
|
+
const part = obj['part'];
|
|
43
|
+
const tokens = part?.['tokens'];
|
|
44
|
+
if (!tokens)
|
|
45
|
+
return null;
|
|
46
|
+
const inputRaw = Number(tokens['input'] ?? 0);
|
|
47
|
+
const outputTokens = Number(tokens['output'] ?? 0);
|
|
48
|
+
const cache = tokens['cache'];
|
|
49
|
+
const cacheRead = cache ? Number(cache['read'] ?? 0) : 0;
|
|
50
|
+
// normalize: cached tokens are included in input total (same as claude cache_read handling)
|
|
51
|
+
const inputTokens = inputRaw + cacheRead;
|
|
52
|
+
return { inputTokens, outputTokens, cachedInputTokens: cacheRead };
|
|
53
|
+
}
|
|
54
|
+
/**
|
|
55
|
+
* Parse token usage from a provider CLI stdout string.
|
|
56
|
+
*
|
|
57
|
+
* Accepts JSONL (one JSON object per line) or a single JSON document.
|
|
58
|
+
* Returns the **last** usage found (last-match semantics).
|
|
59
|
+
* Returns `undefined` if no usage data is present.
|
|
60
|
+
*/
|
|
61
|
+
export function parseUsage(stdout) {
|
|
62
|
+
if (!stdout || !stdout.trim())
|
|
63
|
+
return undefined;
|
|
64
|
+
let last = null;
|
|
65
|
+
for (const line of stdout.split('\n')) {
|
|
66
|
+
if (!line.trim())
|
|
67
|
+
continue;
|
|
68
|
+
try {
|
|
69
|
+
const obj = JSON.parse(line);
|
|
70
|
+
const result = extractFromFlat(obj) ?? extractFromNested(obj) ?? extractFromOpencode(obj);
|
|
71
|
+
if (result)
|
|
72
|
+
last = result;
|
|
73
|
+
}
|
|
74
|
+
catch {
|
|
75
|
+
// non-JSON line — skip
|
|
76
|
+
}
|
|
77
|
+
}
|
|
78
|
+
return last ?? undefined;
|
|
79
|
+
}
|
|
80
|
+
//# sourceMappingURL=parse-usage.js.map
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* api/* namespace를 provider registry에 등록.
|
|
3
|
+
*
|
|
4
|
+
* crewx.yaml에서 provider: api/openrouter 등을 쓰면
|
|
5
|
+
* createProvider('api/openrouter') → VercelProviderRuntime 반환.
|
|
6
|
+
*/
|
|
7
|
+
import { registerProviderFactory } from './bridge';
|
|
8
|
+
import { VercelProviderRuntime } from './vercel-runtime';
|
|
9
|
+
export function registerApiProviders(globalConfig) {
|
|
10
|
+
registerProviderFactory('api', (id, providerStr) => {
|
|
11
|
+
const apiKey = globalConfig?.apiKeys?.[id];
|
|
12
|
+
return new VercelProviderRuntime({
|
|
13
|
+
provider: providerStr,
|
|
14
|
+
model: '', // query() 호출 시 options.model로 override
|
|
15
|
+
apiKey,
|
|
16
|
+
maxSteps: globalConfig?.defaults?.maxSteps,
|
|
17
|
+
temperature: globalConfig?.defaults?.temperature,
|
|
18
|
+
});
|
|
19
|
+
});
|
|
20
|
+
}
|
|
21
|
+
//# sourceMappingURL=register-api.js.map
|