@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.
- package/dist/__tests__/adapter/context-builder.test.d.ts +1 -0
- package/dist/__tests__/adapter/plugin-helper.test.d.ts +1 -0
- package/dist/__tests__/adapter/registration-integration.test.d.ts +1 -0
- package/dist/__tests__/adapter/scoped-store.test.d.ts +1 -0
- package/dist/__tests__/plugins/conversation.test.d.ts +1 -0
- package/dist/__tests__/testing/createMockContext.test.d.ts +1 -0
- package/dist/adapter/context-builder.d.ts +0 -9
- package/dist/adapter/index.d.ts +0 -1
- package/dist/adapter/plugin-helper.d.ts +0 -7
- package/dist/adapter/scoped-store.d.ts +0 -10
- package/dist/adapter/types.d.ts +0 -7
- package/dist/agent/resolver.d.ts +0 -13
- package/dist/boxing/box-storage.interface.d.ts +0 -4
- package/dist/boxing/box.service.d.ts +0 -4
- package/dist/boxing/box.types.d.ts +0 -4
- package/dist/boxing/context-builder.d.ts +0 -4
- package/dist/client/CrewxClient.d.ts +0 -32
- package/dist/client/index.d.ts +0 -1
- package/dist/client/index.js +1 -6
- package/dist/config/loader.browser.d.ts +0 -8
- package/dist/config/loader.d.ts +0 -12
- package/dist/conversation/__tests__/sqlite-provider.test.d.ts +1 -0
- package/dist/conversation/__tests__/to-task-reader.test.d.ts +1 -0
- package/dist/conversation/index.d.ts +0 -1
- package/dist/conversation/sqlite-provider.d.ts +0 -9
- package/dist/conversation/to-task-reader.d.ts +0 -11
- package/dist/conversation/to-template-messages.d.ts +0 -13
- package/dist/conversation/types.d.ts +0 -58
- package/dist/esm/client/index.js +1 -2
- package/dist/esm/hooks/index.js +7 -6
- package/dist/esm/index.js +79 -60
- package/dist/esm/plugins/index.js +52 -0
- package/dist/esm/testing/index.js +1 -0
- package/dist/esm/tools/node/index.js +36 -54
- package/dist/events/TypedEventEmitter.d.ts +0 -24
- package/dist/events/types.d.ts +0 -43
- package/dist/facade/Crewx.browser.d.ts +0 -40
- package/dist/facade/Crewx.d.ts +0 -163
- package/dist/hooks/define.d.ts +0 -1
- package/dist/hooks/dispatch.d.ts +0 -12
- package/dist/hooks/index.d.ts +0 -1
- package/dist/hooks/index.js +7 -24
- package/dist/hooks/observer.d.ts +0 -1
- package/dist/hooks/plugin.d.ts +0 -1
- package/dist/hooks/tool-normalize.d.ts +0 -26
- package/dist/hooks/types.d.ts +0 -1
- package/dist/hooks/yaml-plugin.d.ts +0 -1
- package/dist/index.browser.d.ts +0 -7
- package/dist/index.browser.js +2 -25
- package/dist/index.d.ts +0 -4
- package/dist/index.js +79 -151
- package/dist/layout/loader.d.ts +0 -20
- package/dist/layout/props-validator.d.ts +0 -6
- package/dist/layout/renderer.d.ts +0 -24
- package/dist/layout/types.d.ts +0 -42
- package/dist/parallel/agent-runtime.d.ts +0 -11
- package/dist/parallel/helpers.d.ts +0 -1
- package/dist/parallel/index.d.ts +0 -1
- package/dist/parallel/parallel-runner.d.ts +0 -8
- package/dist/parallel/types.d.ts +0 -24
- package/dist/parsers/agent-call.util.d.ts +0 -3
- package/dist/parsers/claude.parser.d.ts +0 -8
- package/dist/parsers/codex.parser.d.ts +0 -8
- package/dist/parsers/copilot.parser.d.ts +0 -9
- package/dist/parsers/gemini.parser.d.ts +0 -10
- package/dist/parsers/opencode.parser.d.ts +0 -10
- package/dist/parsers/router.d.ts +0 -5
- package/dist/paths.d.ts +1 -0
- package/dist/platform/BrowserFsAdapter.d.ts +0 -20
- package/dist/platform/IFsAdapter.d.ts +0 -23
- package/dist/platform/NodeFsAdapter.d.ts +0 -8
- package/dist/plugin/plugin-provider.d.ts +0 -22
- package/dist/plugin/types.d.ts +0 -31
- package/dist/plugin.d.ts +0 -27
- package/dist/plugins/conversation.d.ts +0 -2
- package/dist/plugins/file-logger.d.ts +0 -13
- package/dist/plugins/index.d.ts +0 -10
- package/dist/plugins/index.js +52 -19
- package/dist/plugins/sqlite-tracing.d.ts +0 -13
- package/dist/plugins/sqlite-tracing.spec.d.ts +1 -0
- package/dist/provider/bridge.browser.d.ts +0 -20
- package/dist/provider/bridge.d.ts +0 -47
- package/dist/provider/parse-usage.d.ts +0 -14
- package/dist/provider/register-api.d.ts +0 -7
- package/dist/provider/vercel-runtime.d.ts +0 -29
- package/dist/remote/index.d.ts +0 -6
- package/dist/remote/remote-agent-manager.d.ts +0 -31
- package/dist/remote/remote-provider.d.ts +0 -15
- package/dist/remote/remote-transport.d.ts +0 -17
- package/dist/remote/types.d.ts +0 -59
- package/dist/server/auth.d.ts +0 -16
- package/dist/server/handler.d.ts +0 -17
- package/dist/server/index.d.ts +0 -4
- package/dist/server/tool-adapter.d.ts +0 -16
- package/dist/template/engine.d.ts +0 -19
- package/dist/template/helpers/exec.browser.d.ts +0 -7
- package/dist/template/helpers/exec.d.ts +0 -45
- package/dist/template/helpers/fenced_code.d.ts +0 -16
- package/dist/template/helpers/format-conversation.d.ts +0 -22
- package/dist/template/helpers/include.d.ts +0 -15
- package/dist/template/helpers/p1p2.d.ts +0 -32
- package/dist/template/loader/DocumentLoader.d.ts +0 -30
- package/dist/template/types.d.ts +0 -30
- package/dist/testing/index.d.ts +0 -1
- package/dist/testing/index.js +1 -16
- package/dist/testing/mock-audit.d.ts +0 -1
- package/dist/testing/mock-context.d.ts +0 -1
- package/dist/testing/mock-logger.d.ts +0 -1
- package/dist/testing/mock-router.d.ts +0 -1
- package/dist/testing/mock-storage.d.ts +0 -1
- package/dist/testing/mock-store.d.ts +0 -1
- package/dist/tools/delegate.d.ts +0 -7
- package/dist/tools/index.d.ts +0 -4
- package/dist/tools/node/builtin.d.ts +0 -16
- package/dist/tools/node/index.d.ts +0 -20
- package/dist/tools/node/index.js +36 -59
- package/dist/types/index.d.ts +0 -20
- package/dist/types/task-log.types.d.ts +0 -4
- package/dist/utils/env-defaults.d.ts +0 -16
- package/dist/utils/glob-match.d.ts +0 -16
- package/dist/utils/id.d.ts +0 -15
- package/dist/utils/timestamp.d.ts +0 -1
- package/dist/utils/workspace.d.ts +0 -4
- package/package.json +24 -25
- package/dist/adapter/context-builder.js +0 -87
- package/dist/adapter/index.js +0 -21
- package/dist/adapter/plugin-helper.js +0 -45
- package/dist/adapter/scoped-store.js +0 -43
- package/dist/adapter/types.js +0 -23
- package/dist/agent/resolver.js +0 -46
- package/dist/boxing/box-storage.interface.js +0 -6
- package/dist/boxing/box.service.js +0 -73
- package/dist/boxing/box.types.js +0 -6
- package/dist/boxing/context-builder.js +0 -79
- package/dist/client/CrewxClient.js +0 -86
- package/dist/config/loader.browser.js +0 -59
- package/dist/config/loader.js +0 -95
- package/dist/conversation/index.js +0 -25
- package/dist/conversation/sqlite-provider.js +0 -178
- package/dist/conversation/to-task-reader.js +0 -28
- package/dist/conversation/to-template-messages.js +0 -34
- package/dist/conversation/types.js +0 -10
- package/dist/esm/agent/resolver.js +0 -41
- package/dist/esm/boxing/box-storage.interface.js +0 -5
- package/dist/esm/boxing/box.service.js +0 -69
- package/dist/esm/boxing/box.types.js +0 -5
- package/dist/esm/boxing/context-builder.js +0 -76
- package/dist/esm/client/CrewxClient.js +0 -82
- package/dist/esm/config/loader.browser.js +0 -54
- package/dist/esm/config/loader.js +0 -77
- package/dist/esm/events/TypedEventEmitter.js +0 -61
- package/dist/esm/events/types.js +0 -8
- package/dist/esm/facade/Crewx.browser.js +0 -310
- package/dist/esm/facade/Crewx.js +0 -941
- package/dist/esm/hooks/define.js +0 -10
- package/dist/esm/hooks/dispatch.js +0 -76
- package/dist/esm/hooks/observer.js +0 -56
- package/dist/esm/hooks/plugin.js +0 -12
- package/dist/esm/hooks/types.js +0 -9
- package/dist/esm/index.browser.js +0 -15
- package/dist/esm/layout/loader.js +0 -268
- package/dist/esm/layout/props-validator.js +0 -297
- package/dist/esm/layout/renderer.js +0 -180
- package/dist/esm/layout/types.js +0 -31
- package/dist/esm/parallel/agent-runtime.js +0 -21
- package/dist/esm/parallel/helpers.js +0 -214
- package/dist/esm/parallel/index.js +0 -5
- package/dist/esm/parallel/parallel-runner.js +0 -221
- package/dist/esm/parallel/types.js +0 -5
- package/dist/esm/parsers/agent-call.util.js +0 -15
- package/dist/esm/parsers/claude.parser.js +0 -64
- package/dist/esm/parsers/codex.parser.js +0 -97
- package/dist/esm/parsers/copilot.parser.js +0 -63
- package/dist/esm/parsers/gemini.parser.js +0 -43
- package/dist/esm/parsers/opencode.parser.js +0 -73
- package/dist/esm/parsers/router.js +0 -53
- package/dist/esm/platform/BrowserFsAdapter.js +0 -80
- package/dist/esm/platform/IFsAdapter.js +0 -2
- package/dist/esm/platform/NodeFsAdapter.js +0 -34
- package/dist/esm/plugin/plugin-provider.js +0 -202
- package/dist/esm/plugin/types.js +0 -8
- package/dist/esm/plugin.js +0 -25
- package/dist/esm/provider/bridge.browser.js +0 -43
- package/dist/esm/provider/bridge.js +0 -373
- package/dist/esm/provider/parse-usage.js +0 -80
- package/dist/esm/provider/register-api.js +0 -21
- package/dist/esm/provider/vercel-runtime.js +0 -310
- package/dist/esm/remote/index.js +0 -10
- package/dist/esm/remote/remote-agent-manager.js +0 -194
- package/dist/esm/remote/remote-provider.js +0 -98
- package/dist/esm/remote/remote-transport.js +0 -79
- package/dist/esm/remote/types.js +0 -8
- package/dist/esm/server/auth.js +0 -31
- package/dist/esm/server/handler.js +0 -72
- package/dist/esm/server/index.js +0 -5
- package/dist/esm/server/tool-adapter.js +0 -92
- package/dist/esm/template/engine.js +0 -100
- package/dist/esm/template/helpers/exec.browser.js +0 -31
- package/dist/esm/template/helpers/exec.js +0 -220
- package/dist/esm/template/helpers/fenced_code.js +0 -17
- package/dist/esm/template/helpers/include.js +0 -20
- package/dist/esm/template/helpers/p1p2.js +0 -83
- package/dist/esm/template/loader/DocumentLoader.js +0 -124
- package/dist/esm/template/types.js +0 -5
- package/dist/esm/tools/delegate.js +0 -57
- package/dist/esm/tools/index.js +0 -5
- package/dist/esm/tools/node/builtin.js +0 -541
- package/dist/esm/types/index.js +0 -27
- package/dist/esm/types/task-log.types.js +0 -5
- package/dist/esm/utils/env-defaults.js +0 -23
- package/dist/esm/utils/glob-match.js +0 -38
- package/dist/esm/utils/id.js +0 -46
- package/dist/esm/utils/workspace.js +0 -21
- package/dist/events/TypedEventEmitter.js +0 -65
- package/dist/events/types.js +0 -9
- package/dist/facade/Crewx.browser.js +0 -314
- package/dist/facade/Crewx.js +0 -1299
- package/dist/hooks/define.js +0 -13
- package/dist/hooks/dispatch.js +0 -147
- package/dist/hooks/observer.js +0 -60
- package/dist/hooks/plugin.js +0 -17
- package/dist/hooks/tool-normalize.js +0 -110
- package/dist/hooks/types.js +0 -12
- package/dist/hooks/yaml-plugin.js +0 -356
- package/dist/layout/loader.js +0 -305
- package/dist/layout/props-validator.js +0 -301
- package/dist/layout/renderer.js +0 -193
- package/dist/layout/types.js +0 -36
- package/dist/parallel/agent-runtime.js +0 -25
- package/dist/parallel/helpers.js +0 -219
- package/dist/parallel/index.js +0 -13
- package/dist/parallel/parallel-runner.js +0 -226
- package/dist/parallel/types.js +0 -6
- package/dist/parsers/agent-call.util.js +0 -19
- package/dist/parsers/api.parser.d.ts +0 -10
- package/dist/parsers/api.parser.js +0 -26
- package/dist/parsers/claude.parser.js +0 -67
- package/dist/parsers/codex.parser.js +0 -100
- package/dist/parsers/copilot.parser.js +0 -66
- package/dist/parsers/gemini.parser.js +0 -46
- package/dist/parsers/opencode.parser.js +0 -76
- package/dist/parsers/router.js +0 -56
- package/dist/platform/BrowserFsAdapter.js +0 -84
- package/dist/platform/IFsAdapter.js +0 -3
- package/dist/platform/NodeFsAdapter.js +0 -38
- package/dist/plugin/plugin-provider.js +0 -207
- package/dist/plugin/types.js +0 -9
- package/dist/plugin.js +0 -29
- package/dist/plugins/conversation.js +0 -59
- package/dist/plugins/file-logger.js +0 -87
- package/dist/plugins/sqlite-tracing.js +0 -112
- package/dist/provider/bridge.browser.js +0 -49
- package/dist/provider/bridge.js +0 -381
- package/dist/provider/mastra-runtime.d.ts +0 -45
- package/dist/provider/mastra-runtime.js +0 -208
- package/dist/provider/parse-usage.js +0 -83
- package/dist/provider/register-api.js +0 -24
- package/dist/provider/vercel-runtime.js +0 -347
- package/dist/remote/index.js +0 -32
- package/dist/remote/remote-agent-manager.js +0 -198
- package/dist/remote/remote-provider.js +0 -141
- package/dist/remote/remote-transport.js +0 -83
- package/dist/remote/types.js +0 -9
- package/dist/server/auth.js +0 -35
- package/dist/server/handler.js +0 -75
- package/dist/server/index.js +0 -9
- package/dist/server/tool-adapter.js +0 -95
- package/dist/template/engine.js +0 -137
- package/dist/template/helpers/exec.browser.js +0 -41
- package/dist/template/helpers/exec.js +0 -230
- package/dist/template/helpers/fenced_code.js +0 -20
- package/dist/template/helpers/format-conversation.js +0 -53
- package/dist/template/helpers/include.js +0 -23
- package/dist/template/helpers/p1p2.js +0 -90
- package/dist/template/loader/DocumentLoader.js +0 -128
- package/dist/template/types.js +0 -6
- package/dist/testing/mock-audit.js +0 -13
- package/dist/testing/mock-context.js +0 -68
- package/dist/testing/mock-logger.js +0 -27
- package/dist/testing/mock-router.js +0 -67
- package/dist/testing/mock-storage.js +0 -21
- package/dist/testing/mock-store.js +0 -8
- package/dist/tools/delegate.js +0 -60
- package/dist/tools/index.js +0 -9
- package/dist/tools/node/builtin.js +0 -547
- package/dist/types/index.js +0 -32
- package/dist/types/task-log.types.js +0 -6
- package/dist/utils/env-defaults.js +0 -27
- package/dist/utils/glob-match.js +0 -42
- package/dist/utils/id.js +0 -50
- package/dist/utils/timestamp.js +0 -13
- 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
|
package/dist/events/types.js
DELETED
|
@@ -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
|