@crewx/sdk 0.8.0-rc.79 → 0.8.0-rc.82

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 (292) hide show
  1. package/dist/__tests__/adapter/context-builder.test.d.ts +1 -0
  2. package/dist/__tests__/adapter/plugin-helper.test.d.ts +1 -0
  3. package/dist/__tests__/adapter/registration-integration.test.d.ts +1 -0
  4. package/dist/__tests__/adapter/scoped-store.test.d.ts +1 -0
  5. package/dist/__tests__/plugins/conversation.test.d.ts +1 -0
  6. package/dist/__tests__/testing/createMockContext.test.d.ts +1 -0
  7. package/dist/adapter/context-builder.d.ts +0 -9
  8. package/dist/adapter/index.d.ts +0 -1
  9. package/dist/adapter/plugin-helper.d.ts +0 -7
  10. package/dist/adapter/scoped-store.d.ts +0 -10
  11. package/dist/adapter/types.d.ts +0 -7
  12. package/dist/agent/resolver.d.ts +0 -13
  13. package/dist/boxing/box-storage.interface.d.ts +0 -4
  14. package/dist/boxing/box.service.d.ts +0 -4
  15. package/dist/boxing/box.types.d.ts +0 -4
  16. package/dist/boxing/context-builder.d.ts +0 -4
  17. package/dist/client/CrewxClient.d.ts +0 -32
  18. package/dist/client/index.d.ts +0 -1
  19. package/dist/client/index.js +1 -6
  20. package/dist/config/loader.browser.d.ts +0 -8
  21. package/dist/config/loader.d.ts +0 -12
  22. package/dist/conversation/__tests__/sqlite-provider.test.d.ts +1 -0
  23. package/dist/conversation/__tests__/to-task-reader.test.d.ts +1 -0
  24. package/dist/conversation/index.d.ts +0 -1
  25. package/dist/conversation/sqlite-provider.d.ts +0 -9
  26. package/dist/conversation/to-task-reader.d.ts +0 -11
  27. package/dist/conversation/to-template-messages.d.ts +0 -13
  28. package/dist/conversation/types.d.ts +0 -58
  29. package/dist/esm/client/index.js +1 -2
  30. package/dist/esm/hooks/index.js +7 -6
  31. package/dist/esm/index.js +79 -60
  32. package/dist/esm/plugins/index.js +52 -0
  33. package/dist/esm/testing/index.js +1 -0
  34. package/dist/esm/tools/node/index.js +36 -54
  35. package/dist/events/TypedEventEmitter.d.ts +0 -24
  36. package/dist/events/types.d.ts +0 -43
  37. package/dist/facade/Crewx.browser.d.ts +0 -40
  38. package/dist/facade/Crewx.d.ts +0 -163
  39. package/dist/hooks/define.d.ts +0 -1
  40. package/dist/hooks/dispatch.d.ts +0 -12
  41. package/dist/hooks/index.d.ts +0 -1
  42. package/dist/hooks/index.js +7 -24
  43. package/dist/hooks/observer.d.ts +0 -1
  44. package/dist/hooks/plugin.d.ts +0 -1
  45. package/dist/hooks/tool-normalize.d.ts +0 -26
  46. package/dist/hooks/types.d.ts +0 -1
  47. package/dist/hooks/yaml-plugin.d.ts +0 -1
  48. package/dist/index.browser.d.ts +0 -7
  49. package/dist/index.browser.js +2 -25
  50. package/dist/index.d.ts +0 -4
  51. package/dist/index.js +79 -151
  52. package/dist/layout/loader.d.ts +0 -20
  53. package/dist/layout/props-validator.d.ts +0 -6
  54. package/dist/layout/renderer.d.ts +0 -24
  55. package/dist/layout/types.d.ts +0 -42
  56. package/dist/parallel/agent-runtime.d.ts +0 -11
  57. package/dist/parallel/helpers.d.ts +0 -1
  58. package/dist/parallel/index.d.ts +0 -1
  59. package/dist/parallel/parallel-runner.d.ts +0 -8
  60. package/dist/parallel/types.d.ts +0 -24
  61. package/dist/parsers/agent-call.util.d.ts +0 -3
  62. package/dist/parsers/claude.parser.d.ts +0 -8
  63. package/dist/parsers/codex.parser.d.ts +0 -8
  64. package/dist/parsers/copilot.parser.d.ts +0 -9
  65. package/dist/parsers/gemini.parser.d.ts +0 -10
  66. package/dist/parsers/opencode.parser.d.ts +0 -10
  67. package/dist/parsers/router.d.ts +0 -5
  68. package/dist/paths.d.ts +1 -0
  69. package/dist/platform/BrowserFsAdapter.d.ts +0 -20
  70. package/dist/platform/IFsAdapter.d.ts +0 -23
  71. package/dist/platform/NodeFsAdapter.d.ts +0 -8
  72. package/dist/plugin/plugin-provider.d.ts +0 -22
  73. package/dist/plugin/types.d.ts +0 -31
  74. package/dist/plugin.d.ts +0 -27
  75. package/dist/plugins/conversation.d.ts +0 -2
  76. package/dist/plugins/file-logger.d.ts +0 -13
  77. package/dist/plugins/index.d.ts +0 -10
  78. package/dist/plugins/index.js +52 -19
  79. package/dist/plugins/sqlite-tracing.d.ts +0 -13
  80. package/dist/plugins/sqlite-tracing.spec.d.ts +1 -0
  81. package/dist/provider/bridge.browser.d.ts +0 -20
  82. package/dist/provider/bridge.d.ts +0 -47
  83. package/dist/provider/parse-usage.d.ts +0 -14
  84. package/dist/provider/register-api.d.ts +0 -7
  85. package/dist/provider/vercel-runtime.d.ts +0 -29
  86. package/dist/remote/index.d.ts +0 -6
  87. package/dist/remote/remote-agent-manager.d.ts +0 -31
  88. package/dist/remote/remote-provider.d.ts +0 -15
  89. package/dist/remote/remote-transport.d.ts +0 -17
  90. package/dist/remote/types.d.ts +0 -59
  91. package/dist/server/auth.d.ts +0 -16
  92. package/dist/server/handler.d.ts +0 -17
  93. package/dist/server/index.d.ts +0 -4
  94. package/dist/server/tool-adapter.d.ts +0 -16
  95. package/dist/template/engine.d.ts +0 -19
  96. package/dist/template/helpers/exec.browser.d.ts +0 -7
  97. package/dist/template/helpers/exec.d.ts +0 -45
  98. package/dist/template/helpers/fenced_code.d.ts +0 -16
  99. package/dist/template/helpers/format-conversation.d.ts +0 -22
  100. package/dist/template/helpers/include.d.ts +0 -15
  101. package/dist/template/helpers/p1p2.d.ts +0 -32
  102. package/dist/template/loader/DocumentLoader.d.ts +0 -30
  103. package/dist/template/types.d.ts +0 -30
  104. package/dist/testing/index.d.ts +0 -1
  105. package/dist/testing/index.js +1 -16
  106. package/dist/testing/mock-audit.d.ts +0 -1
  107. package/dist/testing/mock-context.d.ts +0 -1
  108. package/dist/testing/mock-logger.d.ts +0 -1
  109. package/dist/testing/mock-router.d.ts +0 -1
  110. package/dist/testing/mock-storage.d.ts +0 -1
  111. package/dist/testing/mock-store.d.ts +0 -1
  112. package/dist/tools/delegate.d.ts +0 -7
  113. package/dist/tools/index.d.ts +0 -4
  114. package/dist/tools/node/builtin.d.ts +0 -16
  115. package/dist/tools/node/index.d.ts +0 -20
  116. package/dist/tools/node/index.js +36 -59
  117. package/dist/types/index.d.ts +0 -20
  118. package/dist/types/task-log.types.d.ts +0 -4
  119. package/dist/utils/env-defaults.d.ts +0 -16
  120. package/dist/utils/glob-match.d.ts +0 -16
  121. package/dist/utils/id.d.ts +0 -15
  122. package/dist/utils/timestamp.d.ts +0 -1
  123. package/dist/utils/workspace.d.ts +0 -4
  124. package/package.json +24 -25
  125. package/dist/adapter/context-builder.js +0 -87
  126. package/dist/adapter/index.js +0 -21
  127. package/dist/adapter/plugin-helper.js +0 -45
  128. package/dist/adapter/scoped-store.js +0 -43
  129. package/dist/adapter/types.js +0 -23
  130. package/dist/agent/resolver.js +0 -46
  131. package/dist/boxing/box-storage.interface.js +0 -6
  132. package/dist/boxing/box.service.js +0 -73
  133. package/dist/boxing/box.types.js +0 -6
  134. package/dist/boxing/context-builder.js +0 -79
  135. package/dist/client/CrewxClient.js +0 -86
  136. package/dist/config/loader.browser.js +0 -59
  137. package/dist/config/loader.js +0 -95
  138. package/dist/conversation/index.js +0 -25
  139. package/dist/conversation/sqlite-provider.js +0 -178
  140. package/dist/conversation/to-task-reader.js +0 -28
  141. package/dist/conversation/to-template-messages.js +0 -34
  142. package/dist/conversation/types.js +0 -10
  143. package/dist/esm/agent/resolver.js +0 -41
  144. package/dist/esm/boxing/box-storage.interface.js +0 -5
  145. package/dist/esm/boxing/box.service.js +0 -69
  146. package/dist/esm/boxing/box.types.js +0 -5
  147. package/dist/esm/boxing/context-builder.js +0 -76
  148. package/dist/esm/client/CrewxClient.js +0 -82
  149. package/dist/esm/config/loader.browser.js +0 -54
  150. package/dist/esm/config/loader.js +0 -77
  151. package/dist/esm/events/TypedEventEmitter.js +0 -61
  152. package/dist/esm/events/types.js +0 -8
  153. package/dist/esm/facade/Crewx.browser.js +0 -310
  154. package/dist/esm/facade/Crewx.js +0 -941
  155. package/dist/esm/hooks/define.js +0 -10
  156. package/dist/esm/hooks/dispatch.js +0 -76
  157. package/dist/esm/hooks/observer.js +0 -56
  158. package/dist/esm/hooks/plugin.js +0 -12
  159. package/dist/esm/hooks/types.js +0 -9
  160. package/dist/esm/index.browser.js +0 -15
  161. package/dist/esm/layout/loader.js +0 -268
  162. package/dist/esm/layout/props-validator.js +0 -297
  163. package/dist/esm/layout/renderer.js +0 -180
  164. package/dist/esm/layout/types.js +0 -31
  165. package/dist/esm/parallel/agent-runtime.js +0 -21
  166. package/dist/esm/parallel/helpers.js +0 -214
  167. package/dist/esm/parallel/index.js +0 -5
  168. package/dist/esm/parallel/parallel-runner.js +0 -221
  169. package/dist/esm/parallel/types.js +0 -5
  170. package/dist/esm/parsers/agent-call.util.js +0 -15
  171. package/dist/esm/parsers/claude.parser.js +0 -64
  172. package/dist/esm/parsers/codex.parser.js +0 -97
  173. package/dist/esm/parsers/copilot.parser.js +0 -63
  174. package/dist/esm/parsers/gemini.parser.js +0 -43
  175. package/dist/esm/parsers/opencode.parser.js +0 -73
  176. package/dist/esm/parsers/router.js +0 -53
  177. package/dist/esm/platform/BrowserFsAdapter.js +0 -80
  178. package/dist/esm/platform/IFsAdapter.js +0 -2
  179. package/dist/esm/platform/NodeFsAdapter.js +0 -34
  180. package/dist/esm/plugin/plugin-provider.js +0 -202
  181. package/dist/esm/plugin/types.js +0 -8
  182. package/dist/esm/plugin.js +0 -25
  183. package/dist/esm/provider/bridge.browser.js +0 -43
  184. package/dist/esm/provider/bridge.js +0 -373
  185. package/dist/esm/provider/parse-usage.js +0 -80
  186. package/dist/esm/provider/register-api.js +0 -21
  187. package/dist/esm/provider/vercel-runtime.js +0 -310
  188. package/dist/esm/remote/index.js +0 -10
  189. package/dist/esm/remote/remote-agent-manager.js +0 -194
  190. package/dist/esm/remote/remote-provider.js +0 -98
  191. package/dist/esm/remote/remote-transport.js +0 -79
  192. package/dist/esm/remote/types.js +0 -8
  193. package/dist/esm/server/auth.js +0 -31
  194. package/dist/esm/server/handler.js +0 -72
  195. package/dist/esm/server/index.js +0 -5
  196. package/dist/esm/server/tool-adapter.js +0 -92
  197. package/dist/esm/template/engine.js +0 -100
  198. package/dist/esm/template/helpers/exec.browser.js +0 -31
  199. package/dist/esm/template/helpers/exec.js +0 -220
  200. package/dist/esm/template/helpers/fenced_code.js +0 -17
  201. package/dist/esm/template/helpers/include.js +0 -20
  202. package/dist/esm/template/helpers/p1p2.js +0 -83
  203. package/dist/esm/template/loader/DocumentLoader.js +0 -124
  204. package/dist/esm/template/types.js +0 -5
  205. package/dist/esm/tools/delegate.js +0 -57
  206. package/dist/esm/tools/index.js +0 -5
  207. package/dist/esm/tools/node/builtin.js +0 -541
  208. package/dist/esm/types/index.js +0 -27
  209. package/dist/esm/types/task-log.types.js +0 -5
  210. package/dist/esm/utils/env-defaults.js +0 -23
  211. package/dist/esm/utils/glob-match.js +0 -38
  212. package/dist/esm/utils/id.js +0 -46
  213. package/dist/esm/utils/workspace.js +0 -21
  214. package/dist/events/TypedEventEmitter.js +0 -65
  215. package/dist/events/types.js +0 -9
  216. package/dist/facade/Crewx.browser.js +0 -314
  217. package/dist/facade/Crewx.js +0 -1299
  218. package/dist/hooks/define.js +0 -13
  219. package/dist/hooks/dispatch.js +0 -147
  220. package/dist/hooks/observer.js +0 -60
  221. package/dist/hooks/plugin.js +0 -17
  222. package/dist/hooks/tool-normalize.js +0 -110
  223. package/dist/hooks/types.js +0 -12
  224. package/dist/hooks/yaml-plugin.js +0 -356
  225. package/dist/layout/loader.js +0 -305
  226. package/dist/layout/props-validator.js +0 -301
  227. package/dist/layout/renderer.js +0 -193
  228. package/dist/layout/types.js +0 -36
  229. package/dist/parallel/agent-runtime.js +0 -25
  230. package/dist/parallel/helpers.js +0 -219
  231. package/dist/parallel/index.js +0 -13
  232. package/dist/parallel/parallel-runner.js +0 -226
  233. package/dist/parallel/types.js +0 -6
  234. package/dist/parsers/agent-call.util.js +0 -19
  235. package/dist/parsers/api.parser.d.ts +0 -10
  236. package/dist/parsers/api.parser.js +0 -26
  237. package/dist/parsers/claude.parser.js +0 -67
  238. package/dist/parsers/codex.parser.js +0 -100
  239. package/dist/parsers/copilot.parser.js +0 -66
  240. package/dist/parsers/gemini.parser.js +0 -46
  241. package/dist/parsers/opencode.parser.js +0 -76
  242. package/dist/parsers/router.js +0 -56
  243. package/dist/platform/BrowserFsAdapter.js +0 -84
  244. package/dist/platform/IFsAdapter.js +0 -3
  245. package/dist/platform/NodeFsAdapter.js +0 -38
  246. package/dist/plugin/plugin-provider.js +0 -207
  247. package/dist/plugin/types.js +0 -9
  248. package/dist/plugin.js +0 -29
  249. package/dist/plugins/conversation.js +0 -59
  250. package/dist/plugins/file-logger.js +0 -87
  251. package/dist/plugins/sqlite-tracing.js +0 -112
  252. package/dist/provider/bridge.browser.js +0 -49
  253. package/dist/provider/bridge.js +0 -381
  254. package/dist/provider/mastra-runtime.d.ts +0 -45
  255. package/dist/provider/mastra-runtime.js +0 -208
  256. package/dist/provider/parse-usage.js +0 -83
  257. package/dist/provider/register-api.js +0 -24
  258. package/dist/provider/vercel-runtime.js +0 -347
  259. package/dist/remote/index.js +0 -32
  260. package/dist/remote/remote-agent-manager.js +0 -198
  261. package/dist/remote/remote-provider.js +0 -141
  262. package/dist/remote/remote-transport.js +0 -83
  263. package/dist/remote/types.js +0 -9
  264. package/dist/server/auth.js +0 -35
  265. package/dist/server/handler.js +0 -75
  266. package/dist/server/index.js +0 -9
  267. package/dist/server/tool-adapter.js +0 -95
  268. package/dist/template/engine.js +0 -137
  269. package/dist/template/helpers/exec.browser.js +0 -41
  270. package/dist/template/helpers/exec.js +0 -230
  271. package/dist/template/helpers/fenced_code.js +0 -20
  272. package/dist/template/helpers/format-conversation.js +0 -53
  273. package/dist/template/helpers/include.js +0 -23
  274. package/dist/template/helpers/p1p2.js +0 -90
  275. package/dist/template/loader/DocumentLoader.js +0 -128
  276. package/dist/template/types.js +0 -6
  277. package/dist/testing/mock-audit.js +0 -13
  278. package/dist/testing/mock-context.js +0 -68
  279. package/dist/testing/mock-logger.js +0 -27
  280. package/dist/testing/mock-router.js +0 -67
  281. package/dist/testing/mock-storage.js +0 -21
  282. package/dist/testing/mock-store.js +0 -8
  283. package/dist/tools/delegate.js +0 -60
  284. package/dist/tools/index.js +0 -9
  285. package/dist/tools/node/builtin.js +0 -547
  286. package/dist/types/index.js +0 -32
  287. package/dist/types/task-log.types.js +0 -6
  288. package/dist/utils/env-defaults.js +0 -27
  289. package/dist/utils/glob-match.js +0 -42
  290. package/dist/utils/id.js +0 -50
  291. package/dist/utils/timestamp.js +0 -13
  292. package/dist/utils/workspace.js +0 -58
@@ -1,21 +0,0 @@
1
- /**
2
- * Workspace path normalization and hashing utilities.
3
- */
4
- import * as path from 'path';
5
- import { createHash } from 'crypto';
6
- export function normalizeWorkspacePath(workspacePath) {
7
- let resolved = path.resolve(workspacePath);
8
- if (process.platform === 'win32') {
9
- resolved = resolved.replace(/\\/g, '/');
10
- resolved = resolved.replace(/^([A-Z]):/, (_match, drive) => `${drive.toLowerCase()}:`);
11
- }
12
- if (resolved.length > 1 && !/^[a-zA-Z]:\/$/.test(resolved)) {
13
- resolved = resolved.replace(/\/+$/, '');
14
- }
15
- return resolved;
16
- }
17
- export function hashWorkspaceId(workspacePath) {
18
- const normalizedPath = normalizeWorkspacePath(workspacePath);
19
- return createHash('sha256').update(normalizedPath).digest('hex');
20
- }
21
- //# sourceMappingURL=workspace.js.map
@@ -1,65 +0,0 @@
1
- "use strict";
2
- /**
3
- * TypedEventEmitter — typed wrapper around Node's EventEmitter.
4
- *
5
- * Design:
6
- * - `on` / `once` are public (callers subscribe)
7
- * - `emit` is protected (only subclasses like Crewx can emit)
8
- * - Async listeners are supported (fire-and-forget, errors isolated)
9
- * - Returns an UnsubscribeFn from on/once for easy cleanup
10
- */
11
- Object.defineProperty(exports, "__esModule", { value: true });
12
- exports.TypedEventEmitter = void 0;
13
- const events_1 = require("events");
14
- /**
15
- * Wraps a listener to isolate errors and support async fire-and-forget.
16
- */
17
- function makeSafeListener(event, listener) {
18
- return (payload) => {
19
- try {
20
- const result = listener(payload);
21
- if (result instanceof Promise) {
22
- result.catch((err) => {
23
- // Fire-and-forget: isolate async listener errors
24
- console.error(`[crewx] event listener error (${event}): ${err instanceof Error ? err.message : String(err)}`);
25
- });
26
- }
27
- }
28
- catch (err) {
29
- // Synchronous listener error — log and continue
30
- console.error(`[crewx] event listener error (${event}): ${err instanceof Error ? err.message : String(err)}`);
31
- }
32
- };
33
- }
34
- class TypedEventEmitter {
35
- _emitter = new events_1.EventEmitter();
36
- /**
37
- * Subscribe to an event. Returns an unsubscribe function.
38
- *
39
- * @example
40
- * const unsub = crewx.on('task:start', (e) => console.log(e.agentRef));
41
- * // later:
42
- * unsub();
43
- */
44
- on(event, listener) {
45
- const safeListener = makeSafeListener(event, listener);
46
- this._emitter.on(event, safeListener);
47
- return () => this._emitter.off(event, safeListener);
48
- }
49
- /**
50
- * Subscribe to an event exactly once.
51
- */
52
- once(event, listener) {
53
- const safeListener = makeSafeListener(event, listener);
54
- this._emitter.once(event, safeListener);
55
- return () => this._emitter.off(event, safeListener);
56
- }
57
- /**
58
- * Emit an event with payload. Only accessible to subclasses.
59
- */
60
- emit(event, payload) {
61
- this._emitter.emit(event, payload);
62
- }
63
- }
64
- exports.TypedEventEmitter = TypedEventEmitter;
65
- //# sourceMappingURL=TypedEventEmitter.js.map
@@ -1,9 +0,0 @@
1
- "use strict";
2
- /**
3
- * Event types for the CrewX SDK event system.
4
- *
5
- * SDK emits events; callers (CLI, users) subscribe to persist or react.
6
- * No DB dependencies in the SDK — storage is the caller's responsibility.
7
- */
8
- Object.defineProperty(exports, "__esModule", { value: true });
9
- //# sourceMappingURL=types.js.map
@@ -1,314 +0,0 @@
1
- "use strict";
2
- /**
3
- * Browser-safe Crewx facade.
4
- *
5
- * Stripped of all Node.js dependencies (path, fs, child_process, crypto, events).
6
- * Supports: fromConfig(), query(), execute(), registerTool(), agents, tools.
7
- *
8
- * Built-in providers (e.g. api/webllm) are auto-initialised when detected
9
- * in the agents list — no manual registerProviderFactory required.
10
- */
11
- Object.defineProperty(exports, "__esModule", { value: true });
12
- exports.Crewx = void 0;
13
- const resolver_js_1 = require("../agent/resolver.js");
14
- const bridge_browser_js_1 = require("../provider/bridge.browser.js");
15
- /** Dynamic import that bypasses TypeScript module resolution for CDN URLs. */
16
- const _cdnImport = new Function('u', 'return import(u)');
17
- class Crewx {
18
- _agents;
19
- _config;
20
- _tools = new Map();
21
- _apiProviders = new Map();
22
- constructor(agents, config) {
23
- this._agents = new Map(agents.map(a => [a.id, a]));
24
- this._config = config;
25
- }
26
- /**
27
- * Create a Crewx instance from an already-parsed config object.
28
- *
29
- * Built-in browser providers (api/webllm, api/openrouter) are auto-initialised
30
- * when detected in the agents list — no manual registerProviderFactory required.
31
- */
32
- static async fromConfig(config, options) {
33
- const instance = new Crewx(config.agents ?? [], config);
34
- const agents = config.agents ?? [];
35
- const providerOf = (a) => Array.isArray(a.provider) ? a.provider[0] : a.provider;
36
- const webllmAgents = agents.filter(a => providerOf(a) === 'api/webllm');
37
- const openrouterAgents = agents.filter(a => providerOf(a) === 'api/openrouter');
38
- if (webllmAgents.length > 0) {
39
- await instance._initWebLLM(webllmAgents, options?.onProgress);
40
- }
41
- if (openrouterAgents.length > 0) {
42
- if (!options?.openrouterApiKey) {
43
- throw new Error('openrouterApiKey is required when using api/openrouter provider');
44
- }
45
- instance._initOpenRouter(openrouterAgents, options.openrouterApiKey);
46
- }
47
- // Register unified api factory dispatching to initialised sub-providers
48
- if (instance._apiProviders.size > 0) {
49
- (0, bridge_browser_js_1.registerProviderFactory)('api', (id, providerStr) => {
50
- const provider = instance._apiProviders.get(id);
51
- if (!provider) {
52
- throw new bridge_browser_js_1.ProviderError(`Unknown api provider: ${id}`, providerStr);
53
- }
54
- return provider;
55
- });
56
- }
57
- return instance;
58
- }
59
- // ── web-llm auto-init ──────────────────────────────────────────────────────
60
- /**
61
- * Load web-llm from CDN, create the inference engine, and store
62
- * the provider runtime. Called automatically by fromConfig().
63
- */
64
- async _initWebLLM(agents, onProgress) {
65
- if (typeof navigator === 'undefined' || !navigator.gpu) {
66
- throw new Error('WebGPU is not available. Chrome 113+ or Edge 113+ required.');
67
- }
68
- const webllm = await _cdnImport('https://esm.run/@mlc-ai/web-llm');
69
- const modelId = agents[0]?.inline?.model ?? 'gemma-2-2b-it-q4f16_1-MLC';
70
- const engine = await webllm.CreateMLCEngine(modelId, {
71
- initProgressCallback: onProgress
72
- ? (report) => onProgress(report)
73
- : undefined,
74
- });
75
- const history = [];
76
- this._apiProviders.set('webllm', {
77
- async query(message, options) {
78
- const messages = [];
79
- if (options?.systemPrompt) {
80
- messages.push({ role: 'system', content: options.systemPrompt });
81
- }
82
- messages.push(...history);
83
- messages.push({ role: 'user', content: message });
84
- let fullReply = '';
85
- const stream = await engine.chat.completions.create({
86
- messages,
87
- stream: true,
88
- temperature: 0.7,
89
- max_tokens: 4096,
90
- });
91
- for await (const chunk of stream) {
92
- const delta = chunk.choices?.[0]?.delta?.content ?? '';
93
- fullReply += delta;
94
- if (options?.onOutput) {
95
- options.onOutput(fullReply, 'stdout');
96
- }
97
- }
98
- history.push({ role: 'user', content: message });
99
- history.push({ role: 'assistant', content: fullReply });
100
- return fullReply;
101
- },
102
- async execute(message, options) {
103
- return this.query(message, options);
104
- },
105
- });
106
- }
107
- /**
108
- * Initialise the OpenRouter API provider.
109
- * Uses fetch + SSE streaming against the OpenAI-compatible endpoint.
110
- */
111
- _initOpenRouter(agents, apiKey) {
112
- const defaultModel = agents[0]?.inline?.model ?? 'google/gemma-2-2b-it';
113
- const history = [];
114
- this._apiProviders.set('openrouter', {
115
- async query(message, options) {
116
- const messages = [];
117
- if (options?.systemPrompt) {
118
- messages.push({ role: 'system', content: options.systemPrompt });
119
- }
120
- messages.push(...history);
121
- messages.push({ role: 'user', content: message });
122
- const response = await fetch('https://openrouter.ai/api/v1/chat/completions', {
123
- method: 'POST',
124
- headers: {
125
- 'Authorization': `Bearer ${apiKey}`,
126
- 'Content-Type': 'application/json',
127
- },
128
- body: JSON.stringify({
129
- model: options?.model || defaultModel,
130
- messages,
131
- stream: true,
132
- }),
133
- });
134
- if (!response.ok) {
135
- const errorBody = await response.text();
136
- throw new Error(`OpenRouter API error (${response.status}): ${errorBody}`);
137
- }
138
- const reader = response.body.getReader();
139
- const decoder = new TextDecoder();
140
- let fullReply = '';
141
- let buffer = '';
142
- while (true) {
143
- const { done, value } = await reader.read();
144
- if (done)
145
- break;
146
- buffer += decoder.decode(value, { stream: true });
147
- const lines = buffer.split('\n');
148
- buffer = lines.pop();
149
- for (const line of lines) {
150
- const trimmed = line.trim();
151
- if (!trimmed || !trimmed.startsWith('data: '))
152
- continue;
153
- const data = trimmed.slice(6);
154
- if (data === '[DONE]')
155
- continue;
156
- try {
157
- const parsed = JSON.parse(data);
158
- const delta = parsed.choices?.[0]?.delta?.content ?? '';
159
- fullReply += delta;
160
- if (delta && options?.onOutput) {
161
- options.onOutput(fullReply, 'stdout');
162
- }
163
- }
164
- catch {
165
- // skip malformed SSE chunks
166
- }
167
- }
168
- }
169
- history.push({ role: 'user', content: message });
170
- history.push({ role: 'assistant', content: fullReply });
171
- return fullReply;
172
- },
173
- async execute(message, options) {
174
- return this.query(message, options);
175
- },
176
- });
177
- }
178
- get agents() {
179
- return this._agents;
180
- }
181
- get config() {
182
- return this._config;
183
- }
184
- get tools() {
185
- return this._tools;
186
- }
187
- registerTool(name, definition) {
188
- this._tools.set(name, { name, ...definition });
189
- }
190
- /**
191
- * Query an agent with a message.
192
- * Browser version — delegates directly to the registered provider factory.
193
- * Passes onOutput through for streaming support.
194
- */
195
- async query(agentRef, message, options) {
196
- const startMs = Date.now();
197
- let agent;
198
- try {
199
- agent = (0, resolver_js_1.resolveAgent)(agentRef, Array.from(this._agents.values()));
200
- }
201
- catch (err) {
202
- if (err instanceof resolver_js_1.AgentNotFoundError) {
203
- return {
204
- ok: false,
205
- data: '',
206
- error: { code: 'AGENT_NOT_FOUND', message: err.message },
207
- meta: { agentId: agentRef.replace(/^@/, ''), provider: '', durationMs: Date.now() - startMs },
208
- };
209
- }
210
- throw err;
211
- }
212
- const providerStr = Array.isArray(agent.provider)
213
- ? agent.provider[0] ?? 'api/default'
214
- : agent.provider;
215
- const effectiveProviderStr = options?.provider ?? providerStr;
216
- const effectiveModel = options?.model ?? agent.inline?.model;
217
- let provider;
218
- try {
219
- provider = (0, bridge_browser_js_1.createProvider)(effectiveProviderStr);
220
- }
221
- catch (err) {
222
- return {
223
- ok: false,
224
- data: '',
225
- error: { code: 'PROVIDER_ERROR', message: err.message },
226
- meta: { agentId: agent.id, provider: effectiveProviderStr, model: effectiveModel, durationMs: Date.now() - startMs },
227
- };
228
- }
229
- try {
230
- const response = await provider.query(message, {
231
- model: effectiveModel,
232
- context: options?.context,
233
- systemPrompt: agent.inline?.system_prompt ?? agent.inline?.prompt,
234
- onOutput: options?.onOutput
235
- ? (line) => options.onOutput(line)
236
- : undefined,
237
- });
238
- return {
239
- ok: true,
240
- data: response,
241
- meta: { agentId: agent.id, provider: effectiveProviderStr, model: effectiveModel, durationMs: Date.now() - startMs },
242
- };
243
- }
244
- catch (err) {
245
- return {
246
- ok: false,
247
- data: '',
248
- error: { code: 'QUERY_FAILED', message: err.message },
249
- meta: { agentId: agent.id, provider: effectiveProviderStr, model: effectiveModel, durationMs: Date.now() - startMs },
250
- };
251
- }
252
- }
253
- /**
254
- * Execute a task with an agent.
255
- * Browser version — same delegation pattern as query().
256
- */
257
- async execute(agentRef, message, options) {
258
- const startMs = Date.now();
259
- let agent;
260
- try {
261
- agent = (0, resolver_js_1.resolveAgent)(agentRef, Array.from(this._agents.values()));
262
- }
263
- catch (err) {
264
- if (err instanceof resolver_js_1.AgentNotFoundError) {
265
- return {
266
- ok: false,
267
- data: '',
268
- error: { code: 'AGENT_NOT_FOUND', message: err.message },
269
- meta: { agentId: agentRef.replace(/^@/, ''), provider: '', durationMs: Date.now() - startMs },
270
- };
271
- }
272
- throw err;
273
- }
274
- const providerStr = Array.isArray(agent.provider)
275
- ? agent.provider[0] ?? 'api/default'
276
- : agent.provider;
277
- const effectiveProviderStr = options?.provider ?? providerStr;
278
- const effectiveModel = options?.model ?? agent.inline?.model;
279
- let provider;
280
- try {
281
- provider = (0, bridge_browser_js_1.createProvider)(effectiveProviderStr);
282
- }
283
- catch (err) {
284
- return {
285
- ok: false,
286
- data: '',
287
- error: { code: 'PROVIDER_ERROR', message: err.message },
288
- meta: { agentId: agent.id, provider: effectiveProviderStr, model: effectiveModel, durationMs: Date.now() - startMs },
289
- };
290
- }
291
- try {
292
- const response = await provider.execute(message, {
293
- model: effectiveModel,
294
- context: options?.context,
295
- systemPrompt: agent.inline?.system_prompt ?? agent.inline?.prompt,
296
- });
297
- return {
298
- ok: true,
299
- data: response,
300
- meta: { agentId: agent.id, provider: effectiveProviderStr, model: effectiveModel, durationMs: Date.now() - startMs },
301
- };
302
- }
303
- catch (err) {
304
- return {
305
- ok: false,
306
- data: '',
307
- error: { code: 'EXECUTE_FAILED', message: err.message },
308
- meta: { agentId: agent.id, provider: effectiveProviderStr, model: effectiveModel, durationMs: Date.now() - startMs },
309
- };
310
- }
311
- }
312
- }
313
- exports.Crewx = Crewx;
314
- //# sourceMappingURL=Crewx.browser.js.map