@crewx/sdk 0.8.0-rc.73 → 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.
Files changed (548) hide show
  1. package/README.md +380 -818
  2. package/dist/adapter/context-builder.d.ts +35 -0
  3. package/dist/adapter/context-builder.js +87 -0
  4. package/dist/adapter/index.d.ts +5 -0
  5. package/dist/{core/remote → adapter}/index.js +3 -2
  6. package/dist/adapter/plugin-helper.d.ts +19 -0
  7. package/dist/adapter/plugin-helper.js +45 -0
  8. package/dist/adapter/scoped-store.d.ts +12 -0
  9. package/dist/adapter/scoped-store.js +43 -0
  10. package/dist/adapter/types.d.ts +264 -0
  11. package/dist/adapter/types.js +23 -0
  12. package/dist/agent/resolver.d.ts +18 -0
  13. package/dist/agent/resolver.js +46 -0
  14. package/dist/boxing/box-storage.interface.d.ts +12 -0
  15. package/dist/boxing/box-storage.interface.js +3 -0
  16. package/dist/boxing/box.service.d.ts +4 -0
  17. package/dist/boxing/box.service.js +5 -1
  18. package/dist/boxing/box.types.d.ts +4 -0
  19. package/dist/boxing/box.types.js +3 -0
  20. package/dist/boxing/context-builder.d.ts +6 -7
  21. package/dist/boxing/context-builder.js +3 -0
  22. package/dist/client/CrewxClient.d.ts +65 -0
  23. package/dist/client/CrewxClient.js +86 -0
  24. package/dist/client/index.d.ts +3 -0
  25. package/dist/client/index.js +6 -0
  26. package/dist/config/loader.browser.d.ts +14 -0
  27. package/dist/config/loader.browser.js +59 -0
  28. package/dist/config/loader.d.ts +19 -0
  29. package/dist/config/loader.js +95 -0
  30. package/dist/conversation/index.d.ts +5 -3
  31. package/dist/conversation/index.js +8 -3
  32. package/dist/conversation/sqlite-provider.d.ts +21 -0
  33. package/dist/conversation/sqlite-provider.js +178 -0
  34. package/dist/conversation/to-task-reader.d.ts +14 -0
  35. package/dist/conversation/to-task-reader.js +28 -0
  36. package/dist/conversation/to-template-messages.d.ts +15 -0
  37. package/dist/conversation/to-template-messages.js +34 -0
  38. package/dist/conversation/types.d.ts +101 -0
  39. package/dist/conversation/types.js +10 -0
  40. package/dist/esm/agent/resolver.js +41 -0
  41. package/dist/esm/boxing/box-storage.interface.js +5 -0
  42. package/dist/esm/boxing/box.service.js +69 -0
  43. package/dist/esm/boxing/box.types.js +5 -0
  44. package/dist/esm/boxing/context-builder.js +76 -0
  45. package/dist/esm/client/CrewxClient.js +82 -0
  46. package/dist/esm/client/index.js +2 -0
  47. package/dist/esm/config/loader.browser.js +54 -0
  48. package/dist/esm/config/loader.js +77 -0
  49. package/dist/esm/events/TypedEventEmitter.js +61 -0
  50. package/dist/esm/events/types.js +8 -0
  51. package/dist/esm/facade/Crewx.browser.js +310 -0
  52. package/dist/esm/facade/Crewx.js +941 -0
  53. package/dist/esm/hooks/define.js +10 -0
  54. package/dist/esm/hooks/dispatch.js +76 -0
  55. package/dist/esm/hooks/index.js +6 -0
  56. package/dist/esm/hooks/observer.js +56 -0
  57. package/dist/esm/hooks/plugin.js +12 -0
  58. package/dist/esm/hooks/types.js +9 -0
  59. package/dist/esm/index.browser.js +15 -0
  60. package/dist/esm/index.js +60 -0
  61. package/dist/esm/layout/loader.js +268 -0
  62. package/dist/esm/layout/props-validator.js +297 -0
  63. package/dist/esm/layout/renderer.js +180 -0
  64. package/dist/esm/layout/types.js +31 -0
  65. package/dist/esm/parallel/agent-runtime.js +21 -0
  66. package/dist/esm/parallel/helpers.js +214 -0
  67. package/dist/esm/parallel/index.js +5 -0
  68. package/dist/esm/parallel/parallel-runner.js +221 -0
  69. package/dist/esm/parallel/types.js +5 -0
  70. package/dist/esm/parsers/agent-call.util.js +15 -0
  71. package/dist/esm/parsers/claude.parser.js +64 -0
  72. package/dist/esm/parsers/codex.parser.js +97 -0
  73. package/dist/esm/parsers/copilot.parser.js +63 -0
  74. package/dist/esm/parsers/gemini.parser.js +43 -0
  75. package/dist/esm/parsers/opencode.parser.js +73 -0
  76. package/dist/esm/parsers/router.js +53 -0
  77. package/dist/esm/platform/BrowserFsAdapter.js +80 -0
  78. package/dist/esm/platform/IFsAdapter.js +2 -0
  79. package/dist/esm/platform/NodeFsAdapter.js +34 -0
  80. package/dist/esm/plugin/plugin-provider.js +202 -0
  81. package/dist/esm/plugin/types.js +8 -0
  82. package/dist/esm/plugin.js +25 -0
  83. package/dist/esm/provider/bridge.browser.js +43 -0
  84. package/dist/esm/provider/bridge.js +373 -0
  85. package/dist/esm/provider/parse-usage.js +80 -0
  86. package/dist/esm/provider/register-api.js +21 -0
  87. package/dist/esm/provider/vercel-runtime.js +310 -0
  88. package/dist/esm/remote/index.js +10 -0
  89. package/dist/esm/remote/remote-agent-manager.js +194 -0
  90. package/dist/esm/remote/remote-provider.js +98 -0
  91. package/dist/esm/remote/remote-transport.js +79 -0
  92. package/dist/esm/remote/types.js +8 -0
  93. package/dist/esm/server/auth.js +31 -0
  94. package/dist/esm/server/handler.js +72 -0
  95. package/dist/esm/server/index.js +5 -0
  96. package/dist/esm/server/tool-adapter.js +92 -0
  97. package/dist/esm/template/engine.js +100 -0
  98. package/dist/esm/template/helpers/exec.browser.js +31 -0
  99. package/dist/esm/template/helpers/exec.js +220 -0
  100. package/dist/esm/template/helpers/fenced_code.js +17 -0
  101. package/dist/esm/template/helpers/include.js +20 -0
  102. package/dist/esm/template/helpers/p1p2.js +83 -0
  103. package/dist/esm/template/loader/DocumentLoader.js +124 -0
  104. package/dist/esm/template/types.js +5 -0
  105. package/dist/esm/tools/delegate.js +57 -0
  106. package/dist/esm/tools/index.js +5 -0
  107. package/dist/esm/tools/node/builtin.js +541 -0
  108. package/dist/esm/tools/node/index.js +54 -0
  109. package/dist/esm/types/index.js +27 -0
  110. package/dist/esm/types/task-log.types.js +5 -0
  111. package/dist/esm/utils/env-defaults.js +23 -0
  112. package/dist/esm/utils/glob-match.js +38 -0
  113. package/dist/esm/utils/id.js +46 -0
  114. package/dist/esm/utils/workspace.js +21 -0
  115. package/dist/events/TypedEventEmitter.d.ts +31 -0
  116. package/dist/events/TypedEventEmitter.js +65 -0
  117. package/dist/events/types.d.ts +139 -0
  118. package/dist/events/types.js +9 -0
  119. package/dist/facade/Crewx.browser.d.ts +73 -0
  120. package/dist/facade/Crewx.browser.js +314 -0
  121. package/dist/facade/Crewx.d.ts +267 -0
  122. package/dist/facade/Crewx.js +1299 -0
  123. package/dist/hooks/define.d.ts +10 -0
  124. package/dist/hooks/define.js +13 -0
  125. package/dist/hooks/dispatch.d.ts +61 -0
  126. package/dist/hooks/dispatch.js +147 -0
  127. package/dist/hooks/index.d.ts +13 -0
  128. package/dist/hooks/index.js +24 -0
  129. package/dist/hooks/observer.d.ts +20 -0
  130. package/dist/hooks/observer.js +60 -0
  131. package/dist/hooks/plugin.d.ts +19 -0
  132. package/dist/hooks/plugin.js +17 -0
  133. package/dist/hooks/tool-normalize.d.ts +29 -0
  134. package/dist/hooks/tool-normalize.js +110 -0
  135. package/dist/hooks/types.d.ts +79 -0
  136. package/dist/hooks/types.js +12 -0
  137. package/dist/hooks/yaml-plugin.d.ts +29 -0
  138. package/dist/hooks/yaml-plugin.js +356 -0
  139. package/dist/index.browser.d.ts +15 -0
  140. package/dist/index.browser.js +25 -0
  141. package/dist/index.d.ts +70 -58
  142. package/dist/index.js +144 -133
  143. package/dist/{services/layout-loader.service.d.ts → layout/loader.d.ts} +24 -4
  144. package/dist/{services/layout-loader.service.js → layout/loader.js} +103 -73
  145. package/dist/{services/props-validator.service.d.ts → layout/props-validator.d.ts} +7 -1
  146. package/dist/{services/props-validator.service.js → layout/props-validator.js} +28 -59
  147. package/dist/{services/layout-renderer.service.d.ts → layout/renderer.d.ts} +28 -14
  148. package/dist/layout/renderer.js +193 -0
  149. package/dist/{types/layout.types.d.ts → layout/types.d.ts} +47 -1
  150. package/dist/{types/layout.types.js → layout/types.js} +15 -1
  151. package/dist/parallel/agent-runtime.d.ts +31 -0
  152. package/dist/parallel/agent-runtime.js +25 -0
  153. package/dist/{core/parallel → parallel}/helpers.d.ts +2 -1
  154. package/dist/{core/parallel → parallel}/helpers.js +55 -88
  155. package/dist/parallel/index.d.ts +8 -0
  156. package/dist/{core/parallel → parallel}/index.js +5 -3
  157. package/dist/{core/parallel → parallel}/parallel-runner.d.ts +8 -1
  158. package/dist/{core/parallel → parallel}/parallel-runner.js +53 -57
  159. package/dist/parallel/types.d.ts +65 -0
  160. package/dist/parallel/types.js +6 -0
  161. package/dist/parsers/agent-call.util.d.ts +3 -0
  162. package/dist/parsers/agent-call.util.js +2 -0
  163. package/dist/parsers/api.parser.d.ts +10 -0
  164. package/dist/parsers/api.parser.js +26 -0
  165. package/dist/parsers/claude.parser.d.ts +8 -0
  166. package/dist/parsers/claude.parser.js +22 -1
  167. package/dist/parsers/codex.parser.d.ts +8 -0
  168. package/dist/parsers/codex.parser.js +11 -0
  169. package/dist/parsers/copilot.parser.d.ts +9 -0
  170. package/dist/parsers/copilot.parser.js +8 -0
  171. package/dist/parsers/gemini.parser.d.ts +10 -0
  172. package/dist/parsers/gemini.parser.js +10 -0
  173. package/dist/parsers/opencode.parser.d.ts +12 -0
  174. package/dist/parsers/opencode.parser.js +76 -0
  175. package/dist/parsers/router.d.ts +7 -0
  176. package/dist/parsers/router.js +56 -0
  177. package/dist/platform/BrowserFsAdapter.d.ts +37 -0
  178. package/dist/platform/BrowserFsAdapter.js +84 -0
  179. package/dist/platform/IFsAdapter.d.ts +29 -0
  180. package/dist/{core/remote/types.js → platform/IFsAdapter.js} +1 -1
  181. package/dist/platform/NodeFsAdapter.d.ts +16 -0
  182. package/dist/platform/NodeFsAdapter.js +38 -0
  183. package/dist/plugin/plugin-provider.d.ts +33 -0
  184. package/dist/plugin/plugin-provider.js +207 -0
  185. package/dist/plugin/types.d.ts +53 -0
  186. package/dist/plugin/types.js +9 -0
  187. package/dist/plugin.d.ts +33 -0
  188. package/dist/plugin.js +29 -0
  189. package/dist/plugins/conversation.d.ts +18 -0
  190. package/dist/plugins/conversation.js +59 -0
  191. package/dist/plugins/file-logger.d.ts +29 -0
  192. package/dist/plugins/file-logger.js +87 -0
  193. package/dist/plugins/index.d.ts +16 -0
  194. package/dist/plugins/index.js +19 -0
  195. package/dist/plugins/sqlite-tracing.d.ts +29 -0
  196. package/dist/plugins/sqlite-tracing.js +112 -0
  197. package/dist/provider/bridge.browser.d.ts +49 -0
  198. package/dist/provider/bridge.browser.js +49 -0
  199. package/dist/provider/bridge.d.ts +106 -0
  200. package/dist/provider/bridge.js +380 -0
  201. package/dist/provider/mastra-runtime.d.ts +45 -0
  202. package/dist/provider/mastra-runtime.js +208 -0
  203. package/dist/provider/parse-usage.d.ts +20 -0
  204. package/dist/provider/parse-usage.js +83 -0
  205. package/dist/provider/register-api.d.ts +14 -0
  206. package/dist/provider/register-api.js +24 -0
  207. package/dist/provider/vercel-runtime.d.ts +54 -0
  208. package/dist/provider/vercel-runtime.js +347 -0
  209. package/dist/remote/index.d.ts +13 -0
  210. package/dist/remote/index.js +32 -0
  211. package/dist/remote/remote-agent-manager.d.ts +54 -0
  212. package/dist/{core/remote → remote}/remote-agent-manager.js +100 -97
  213. package/dist/remote/remote-provider.d.ts +47 -0
  214. package/dist/remote/remote-provider.js +141 -0
  215. package/dist/remote/remote-transport.d.ts +32 -0
  216. package/dist/remote/remote-transport.js +83 -0
  217. package/dist/remote/types.d.ts +147 -0
  218. package/dist/remote/types.js +9 -0
  219. package/dist/server/auth.d.ts +21 -0
  220. package/dist/server/auth.js +35 -0
  221. package/dist/server/handler.d.ts +24 -0
  222. package/dist/server/handler.js +75 -0
  223. package/dist/server/index.d.ts +7 -0
  224. package/dist/server/index.js +9 -0
  225. package/dist/server/tool-adapter.d.ts +19 -0
  226. package/dist/server/tool-adapter.js +95 -0
  227. package/dist/template/engine.d.ts +28 -0
  228. package/dist/template/engine.js +137 -0
  229. package/dist/template/helpers/exec.browser.d.ts +22 -0
  230. package/dist/template/helpers/exec.browser.js +41 -0
  231. package/dist/template/helpers/exec.d.ts +60 -0
  232. package/dist/template/helpers/exec.js +230 -0
  233. package/dist/template/helpers/fenced_code.d.ts +22 -0
  234. package/dist/template/helpers/fenced_code.js +20 -0
  235. package/dist/template/helpers/format-conversation.d.ts +30 -0
  236. package/dist/template/helpers/format-conversation.js +53 -0
  237. package/dist/template/helpers/include.d.ts +16 -0
  238. package/dist/template/helpers/include.js +23 -0
  239. package/dist/template/helpers/p1p2.d.ts +37 -0
  240. package/dist/template/helpers/p1p2.js +90 -0
  241. package/dist/template/loader/DocumentLoader.d.ts +48 -0
  242. package/dist/template/loader/DocumentLoader.js +128 -0
  243. package/dist/template/types.d.ts +51 -0
  244. package/dist/template/types.js +6 -0
  245. package/dist/testing/index.d.ts +12 -0
  246. package/dist/testing/index.js +16 -0
  247. package/dist/testing/mock-audit.d.ts +10 -0
  248. package/dist/testing/mock-audit.js +13 -0
  249. package/dist/testing/mock-context.d.ts +27 -0
  250. package/dist/testing/mock-context.js +68 -0
  251. package/dist/testing/mock-logger.d.ts +15 -0
  252. package/dist/testing/mock-logger.js +27 -0
  253. package/dist/testing/mock-router.d.ts +16 -0
  254. package/dist/testing/mock-router.js +67 -0
  255. package/dist/testing/mock-storage.d.ts +9 -0
  256. package/dist/testing/mock-storage.js +21 -0
  257. package/dist/testing/mock-store.d.ts +3 -0
  258. package/dist/testing/mock-store.js +8 -0
  259. package/dist/tools/delegate.d.ts +10 -0
  260. package/dist/tools/delegate.js +60 -0
  261. package/dist/tools/index.d.ts +5 -12
  262. package/dist/tools/index.js +6 -37
  263. package/dist/tools/node/builtin.d.ts +23 -0
  264. package/dist/tools/node/builtin.js +547 -0
  265. package/dist/tools/node/index.d.ts +23 -0
  266. package/dist/tools/node/index.js +59 -0
  267. package/dist/types/index.d.ts +804 -6
  268. package/dist/types/index.js +29 -20
  269. package/dist/types/task-log.types.d.ts +4 -0
  270. package/dist/types/task-log.types.js +3 -0
  271. package/dist/utils/env-defaults.d.ts +18 -0
  272. package/dist/utils/env-defaults.js +27 -0
  273. package/dist/utils/glob-match.d.ts +18 -0
  274. package/dist/utils/glob-match.js +42 -0
  275. package/dist/{core → utils}/id.d.ts +15 -0
  276. package/dist/utils/id.js +50 -0
  277. package/dist/utils/timestamp.d.ts +2 -0
  278. package/dist/utils/timestamp.js +13 -0
  279. package/dist/{core → utils}/workspace.d.ts +4 -0
  280. package/dist/{core → utils}/workspace.js +3 -0
  281. package/package.json +67 -102
  282. package/src/schemas/hooks.schema.json +59 -0
  283. package/templates/agents/default.yaml +490 -0
  284. package/templates/agents/minimal.yaml +16 -0
  285. package/LICENSE +0 -201
  286. package/dist/adapters/MastraToolAdapter.d.ts +0 -9
  287. package/dist/adapters/MastraToolAdapter.js +0 -66
  288. package/dist/adapters/MastraToolAdapter.js.map +0 -1
  289. package/dist/api/index.d.ts +0 -2
  290. package/dist/api/index.js +0 -8
  291. package/dist/api/index.js.map +0 -1
  292. package/dist/boxing/box-storage.interface.js.map +0 -1
  293. package/dist/boxing/box.service.js.map +0 -1
  294. package/dist/boxing/box.types.js.map +0 -1
  295. package/dist/boxing/context-builder.js.map +0 -1
  296. package/dist/boxing/index.d.ts +0 -6
  297. package/dist/boxing/index.js +0 -11
  298. package/dist/boxing/index.js.map +0 -1
  299. package/dist/boxing/tokenizer.d.ts +0 -3
  300. package/dist/boxing/tokenizer.js +0 -11
  301. package/dist/boxing/tokenizer.js.map +0 -1
  302. package/dist/config/api-provider-parser.d.ts +0 -58
  303. package/dist/config/api-provider-parser.js +0 -212
  304. package/dist/config/api-provider-parser.js.map +0 -1
  305. package/dist/config/index.d.ts +0 -3
  306. package/dist/config/index.js +0 -20
  307. package/dist/config/index.js.map +0 -1
  308. package/dist/config/log.config.d.ts +0 -7
  309. package/dist/config/log.config.js +0 -20
  310. package/dist/config/log.config.js.map +0 -1
  311. package/dist/config/pricing.d.ts +0 -11
  312. package/dist/config/pricing.js +0 -53
  313. package/dist/config/pricing.js.map +0 -1
  314. package/dist/config/timeout.config.d.ts +0 -14
  315. package/dist/config/timeout.config.js +0 -34
  316. package/dist/config/timeout.config.js.map +0 -1
  317. package/dist/config/yaml-loader.d.ts +0 -8
  318. package/dist/config/yaml-loader.js +0 -155
  319. package/dist/config/yaml-loader.js.map +0 -1
  320. package/dist/constants/index.d.ts +0 -4
  321. package/dist/constants/index.js +0 -8
  322. package/dist/constants/index.js.map +0 -1
  323. package/dist/constants.d.ts +0 -1
  324. package/dist/constants.js +0 -18
  325. package/dist/constants.js.map +0 -1
  326. package/dist/conversation/conversation-config.d.ts +0 -9
  327. package/dist/conversation/conversation-config.js +0 -22
  328. package/dist/conversation/conversation-config.js.map +0 -1
  329. package/dist/conversation/conversation-history.interface.d.ts +0 -36
  330. package/dist/conversation/conversation-history.interface.js +0 -3
  331. package/dist/conversation/conversation-history.interface.js.map +0 -1
  332. package/dist/conversation/conversation-storage.service.d.ts +0 -16
  333. package/dist/conversation/conversation-storage.service.js +0 -213
  334. package/dist/conversation/conversation-storage.service.js.map +0 -1
  335. package/dist/conversation/index.js.map +0 -1
  336. package/dist/core/__tests__/id.test.d.ts +0 -1
  337. package/dist/core/__tests__/id.test.js +0 -115
  338. package/dist/core/__tests__/id.test.js.map +0 -1
  339. package/dist/core/agent/agent-factory.d.ts +0 -37
  340. package/dist/core/agent/agent-factory.js +0 -68
  341. package/dist/core/agent/agent-factory.js.map +0 -1
  342. package/dist/core/agent/agent-runtime.d.ts +0 -52
  343. package/dist/core/agent/agent-runtime.js +0 -206
  344. package/dist/core/agent/agent-runtime.js.map +0 -1
  345. package/dist/core/agent/event-bus.d.ts +0 -44
  346. package/dist/core/agent/event-bus.js +0 -43
  347. package/dist/core/agent/event-bus.js.map +0 -1
  348. package/dist/core/agent/index.d.ts +0 -3
  349. package/dist/core/agent/index.js +0 -13
  350. package/dist/core/agent/index.js.map +0 -1
  351. package/dist/core/env-defaults.d.ts +0 -1
  352. package/dist/core/env-defaults.js +0 -7
  353. package/dist/core/env-defaults.js.map +0 -1
  354. package/dist/core/id.js +0 -27
  355. package/dist/core/id.js.map +0 -1
  356. package/dist/core/parallel/helpers.js.map +0 -1
  357. package/dist/core/parallel/index.d.ts +0 -4
  358. package/dist/core/parallel/index.js.map +0 -1
  359. package/dist/core/parallel/parallel-runner.js.map +0 -1
  360. package/dist/core/parallel/types.d.ts +0 -41
  361. package/dist/core/parallel/types.js +0 -3
  362. package/dist/core/parallel/types.js.map +0 -1
  363. package/dist/core/providers/MastraAPIProvider.d.ts +0 -31
  364. package/dist/core/providers/MastraAPIProvider.js +0 -365
  365. package/dist/core/providers/MastraAPIProvider.js.map +0 -1
  366. package/dist/core/providers/ai-provider.interface.d.ts +0 -79
  367. package/dist/core/providers/ai-provider.interface.js +0 -23
  368. package/dist/core/providers/ai-provider.interface.js.map +0 -1
  369. package/dist/core/providers/base-ai.provider.d.ts +0 -84
  370. package/dist/core/providers/base-ai.provider.js +0 -1237
  371. package/dist/core/providers/base-ai.provider.js.map +0 -1
  372. package/dist/core/providers/base-ai.types.d.ts +0 -26
  373. package/dist/core/providers/base-ai.types.js +0 -3
  374. package/dist/core/providers/base-ai.types.js.map +0 -1
  375. package/dist/core/providers/claude.provider.d.ts +0 -19
  376. package/dist/core/providers/claude.provider.js +0 -170
  377. package/dist/core/providers/claude.provider.js.map +0 -1
  378. package/dist/core/providers/codex.provider.d.ts +0 -21
  379. package/dist/core/providers/codex.provider.js +0 -134
  380. package/dist/core/providers/codex.provider.js.map +0 -1
  381. package/dist/core/providers/copilot.provider.d.ts +0 -25
  382. package/dist/core/providers/copilot.provider.js +0 -146
  383. package/dist/core/providers/copilot.provider.js.map +0 -1
  384. package/dist/core/providers/dynamic-provider.factory.d.ts +0 -74
  385. package/dist/core/providers/dynamic-provider.factory.js +0 -645
  386. package/dist/core/providers/dynamic-provider.factory.js.map +0 -1
  387. package/dist/core/providers/gemini.provider.d.ts +0 -16
  388. package/dist/core/providers/gemini.provider.js +0 -101
  389. package/dist/core/providers/gemini.provider.js.map +0 -1
  390. package/dist/core/providers/index.d.ts +0 -8
  391. package/dist/core/providers/index.js +0 -20
  392. package/dist/core/providers/index.js.map +0 -1
  393. package/dist/core/providers/mock.provider.d.ts +0 -13
  394. package/dist/core/providers/mock.provider.js +0 -55
  395. package/dist/core/providers/mock.provider.js.map +0 -1
  396. package/dist/core/providers/provider-factory.d.ts +0 -3
  397. package/dist/core/providers/provider-factory.js +0 -65
  398. package/dist/core/providers/provider-factory.js.map +0 -1
  399. package/dist/core/providers/tool-call.types.d.ts +0 -39
  400. package/dist/core/providers/tool-call.types.js +0 -3
  401. package/dist/core/providers/tool-call.types.js.map +0 -1
  402. package/dist/core/remote/index.d.ts +0 -3
  403. package/dist/core/remote/index.js.map +0 -1
  404. package/dist/core/remote/remote-agent-manager.d.ts +0 -24
  405. package/dist/core/remote/remote-agent-manager.js.map +0 -1
  406. package/dist/core/remote/remote-transport.d.ts +0 -15
  407. package/dist/core/remote/remote-transport.js +0 -70
  408. package/dist/core/remote/remote-transport.js.map +0 -1
  409. package/dist/core/remote/types.d.ts +0 -79
  410. package/dist/core/remote/types.js.map +0 -1
  411. package/dist/core/workspace.js.map +0 -1
  412. package/dist/index.js.map +0 -1
  413. package/dist/internal/index.d.ts +0 -1
  414. package/dist/internal/index.js +0 -6
  415. package/dist/internal/index.js.map +0 -1
  416. package/dist/knowledge/DocumentManager.d.ts +0 -4
  417. package/dist/knowledge/DocumentManager.js +0 -119
  418. package/dist/knowledge/DocumentManager.js.map +0 -1
  419. package/dist/knowledge/index.d.ts +0 -1
  420. package/dist/knowledge/index.js +0 -18
  421. package/dist/knowledge/index.js.map +0 -1
  422. package/dist/parsers/agent-call.util.js.map +0 -1
  423. package/dist/parsers/claude.parser.js.map +0 -1
  424. package/dist/parsers/codex.parser.js.map +0 -1
  425. package/dist/parsers/copilot.parser.js.map +0 -1
  426. package/dist/parsers/gemini.parser.js.map +0 -1
  427. package/dist/parsers/index.d.ts +0 -7
  428. package/dist/parsers/index.js +0 -45
  429. package/dist/parsers/index.js.map +0 -1
  430. package/dist/schema/skills-parser.d.ts +0 -8
  431. package/dist/schema/skills-parser.js +0 -438
  432. package/dist/schema/skills-parser.js.map +0 -1
  433. package/dist/schema/skills.types.d.ts +0 -158
  434. package/dist/schema/skills.types.js +0 -41
  435. package/dist/schema/skills.types.js.map +0 -1
  436. package/dist/schemas/api-provider.schema.d.ts +0 -432
  437. package/dist/schemas/api-provider.schema.js +0 -50
  438. package/dist/schemas/api-provider.schema.js.map +0 -1
  439. package/dist/services/index.d.ts +0 -2
  440. package/dist/services/index.js +0 -19
  441. package/dist/services/index.js.map +0 -1
  442. package/dist/services/layout-loader.service.js.map +0 -1
  443. package/dist/services/layout-renderer.service.js +0 -325
  444. package/dist/services/layout-renderer.service.js.map +0 -1
  445. package/dist/services/props-validator.service.js.map +0 -1
  446. package/dist/skills/adapter/claude-skill-adapter.d.ts +0 -11
  447. package/dist/skills/adapter/claude-skill-adapter.js +0 -222
  448. package/dist/skills/adapter/claude-skill-adapter.js.map +0 -1
  449. package/dist/skills/index.d.ts +0 -6
  450. package/dist/skills/index.js +0 -31
  451. package/dist/skills/index.js.map +0 -1
  452. package/dist/skills/runtime/progressive-loader.d.ts +0 -27
  453. package/dist/skills/runtime/progressive-loader.js +0 -186
  454. package/dist/skills/runtime/progressive-loader.js.map +0 -1
  455. package/dist/skills/runtime/runtime-requirements-validator.d.ts +0 -23
  456. package/dist/skills/runtime/runtime-requirements-validator.js +0 -248
  457. package/dist/skills/runtime/runtime-requirements-validator.js.map +0 -1
  458. package/dist/skills/runtime/skill-runtime.service.d.ts +0 -42
  459. package/dist/skills/runtime/skill-runtime.service.js +0 -434
  460. package/dist/skills/runtime/skill-runtime.service.js.map +0 -1
  461. package/dist/tools/file-system.service.d.ts +0 -10
  462. package/dist/tools/file-system.service.js +0 -33
  463. package/dist/tools/file-system.service.js.map +0 -1
  464. package/dist/tools/find.tool.d.ts +0 -21
  465. package/dist/tools/find.tool.js +0 -139
  466. package/dist/tools/find.tool.js.map +0 -1
  467. package/dist/tools/glob.tool.d.ts +0 -24
  468. package/dist/tools/glob.tool.js +0 -153
  469. package/dist/tools/glob.tool.js.map +0 -1
  470. package/dist/tools/grep.tool.d.ts +0 -1
  471. package/dist/tools/grep.tool.js +0 -137
  472. package/dist/tools/grep.tool.js.map +0 -1
  473. package/dist/tools/index.js.map +0 -1
  474. package/dist/tools/ls.tool.d.ts +0 -1
  475. package/dist/tools/ls.tool.js +0 -94
  476. package/dist/tools/ls.tool.js.map +0 -1
  477. package/dist/tools/read-file.tool.d.ts +0 -1
  478. package/dist/tools/read-file.tool.js +0 -69
  479. package/dist/tools/read-file.tool.js.map +0 -1
  480. package/dist/tools/replace.tool.d.ts +0 -1
  481. package/dist/tools/replace.tool.js +0 -68
  482. package/dist/tools/replace.tool.js.map +0 -1
  483. package/dist/tools/run-shell-command.tool.d.ts +0 -1
  484. package/dist/tools/run-shell-command.tool.js +0 -64
  485. package/dist/tools/run-shell-command.tool.js.map +0 -1
  486. package/dist/tools/tree.tool.d.ts +0 -1
  487. package/dist/tools/tree.tool.js +0 -109
  488. package/dist/tools/tree.tool.js.map +0 -1
  489. package/dist/tools/types.d.ts +0 -42
  490. package/dist/tools/types.js +0 -13
  491. package/dist/tools/types.js.map +0 -1
  492. package/dist/tools/utils/file-utils.d.ts +0 -5
  493. package/dist/tools/utils/file-utils.js +0 -221
  494. package/dist/tools/utils/file-utils.js.map +0 -1
  495. package/dist/tools/write-file.tool.d.ts +0 -1
  496. package/dist/tools/write-file.tool.js +0 -55
  497. package/dist/tools/write-file.tool.js.map +0 -1
  498. package/dist/types/agent.types.d.ts +0 -134
  499. package/dist/types/agent.types.js +0 -16
  500. package/dist/types/agent.types.js.map +0 -1
  501. package/dist/types/api-provider.types.d.ts +0 -85
  502. package/dist/types/api-provider.types.js +0 -65
  503. package/dist/types/api-provider.types.js.map +0 -1
  504. package/dist/types/index.js.map +0 -1
  505. package/dist/types/layout.types.js.map +0 -1
  506. package/dist/types/provider.types.d.ts +0 -12
  507. package/dist/types/provider.types.js +0 -3
  508. package/dist/types/provider.types.js.map +0 -1
  509. package/dist/types/skill-runtime.types.d.ts +0 -244
  510. package/dist/types/skill-runtime.types.js +0 -44
  511. package/dist/types/skill-runtime.types.js.map +0 -1
  512. package/dist/types/structured-payload.types.d.ts +0 -46
  513. package/dist/types/structured-payload.types.js +0 -65
  514. package/dist/types/structured-payload.types.js.map +0 -1
  515. package/dist/types/task-log.types.js.map +0 -1
  516. package/dist/types/template.types.d.ts +0 -38
  517. package/dist/types/template.types.js +0 -3
  518. package/dist/types/template.types.js.map +0 -1
  519. package/dist/types.d.ts +0 -1
  520. package/dist/types.js +0 -18
  521. package/dist/types.js.map +0 -1
  522. package/dist/utils/api-provider-normalizer.d.ts +0 -16
  523. package/dist/utils/api-provider-normalizer.js +0 -135
  524. package/dist/utils/api-provider-normalizer.js.map +0 -1
  525. package/dist/utils/base-message-formatter.d.ts +0 -32
  526. package/dist/utils/base-message-formatter.js +0 -170
  527. package/dist/utils/base-message-formatter.js.map +0 -1
  528. package/dist/utils/error-utils.d.ts +0 -3
  529. package/dist/utils/error-utils.js +0 -27
  530. package/dist/utils/error-utils.js.map +0 -1
  531. package/dist/utils/index.d.ts +0 -4
  532. package/dist/utils/index.js +0 -21
  533. package/dist/utils/index.js.map +0 -1
  534. package/dist/utils/math-utils.d.ts +0 -3
  535. package/dist/utils/math-utils.js +0 -10
  536. package/dist/utils/math-utils.js.map +0 -1
  537. package/dist/utils/mention-parser.d.ts +0 -18
  538. package/dist/utils/mention-parser.js +0 -136
  539. package/dist/utils/mention-parser.js.map +0 -1
  540. package/dist/utils/string-utils.d.ts +0 -1
  541. package/dist/utils/string-utils.js +0 -10
  542. package/dist/utils/string-utils.js.map +0 -1
  543. package/dist/utils.d.ts +0 -3
  544. package/dist/utils.js +0 -20
  545. package/dist/utils.js.map +0 -1
  546. package/schema/api-provider-config.json +0 -138
  547. package/schema/crewx-config.json +0 -224
  548. 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