@nitrostack/core 1.0.17 → 1.1.0-beta.0
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/core/app-decorator.d.ts +5 -0
- package/dist/core/app-decorator.d.ts.map +1 -1
- package/dist/core/app-decorator.js +2 -1
- package/dist/core/app-decorator.js.map +1 -1
- package/dist/core/builders.d.ts.map +1 -1
- package/dist/core/builders.js +2 -0
- package/dist/core/builders.js.map +1 -1
- package/dist/core/decorators.d.ts +11 -0
- package/dist/core/decorators.d.ts.map +1 -1
- package/dist/core/decorators.js.map +1 -1
- package/dist/core/health/health-checks.resource.d.ts +4 -3
- package/dist/core/health/health-checks.resource.d.ts.map +1 -1
- package/dist/core/health/health-checks.resource.js +35 -8
- package/dist/core/health/health-checks.resource.js.map +1 -1
- package/dist/core/health/health.interface.d.ts +40 -0
- package/dist/core/health/health.interface.d.ts.map +1 -0
- package/dist/core/health/health.interface.js +2 -0
- package/dist/core/health/health.interface.js.map +1 -0
- package/dist/core/index.d.ts +11 -2
- package/dist/core/index.d.ts.map +1 -1
- package/dist/core/index.js +9 -1
- package/dist/core/index.js.map +1 -1
- package/dist/core/interceptors/data-spillover.interceptor.d.ts +30 -0
- package/dist/core/interceptors/data-spillover.interceptor.d.ts.map +1 -0
- package/dist/core/interceptors/data-spillover.interceptor.js +174 -0
- package/dist/core/interceptors/data-spillover.interceptor.js.map +1 -0
- package/dist/core/interceptors/interceptor.decorator.d.ts +17 -8
- package/dist/core/interceptors/interceptor.decorator.d.ts.map +1 -1
- package/dist/core/interceptors/interceptor.decorator.js +36 -11
- package/dist/core/interceptors/interceptor.decorator.js.map +1 -1
- package/dist/core/interceptors/interceptor.interface.d.ts +4 -0
- package/dist/core/interceptors/interceptor.interface.d.ts.map +1 -1
- package/dist/core/interceptors/spillover/fs-spillover.store.d.ts +54 -0
- package/dist/core/interceptors/spillover/fs-spillover.store.d.ts.map +1 -0
- package/dist/core/interceptors/spillover/fs-spillover.store.js +302 -0
- package/dist/core/interceptors/spillover/fs-spillover.store.js.map +1 -0
- package/dist/core/interceptors/spillover/index.d.ts +6 -0
- package/dist/core/interceptors/spillover/index.d.ts.map +1 -0
- package/dist/core/interceptors/spillover/index.js +6 -0
- package/dist/core/interceptors/spillover/index.js.map +1 -0
- package/dist/core/interceptors/spillover/memory-spillover.store.d.ts +25 -0
- package/dist/core/interceptors/spillover/memory-spillover.store.d.ts.map +1 -0
- package/dist/core/interceptors/spillover/memory-spillover.store.js +115 -0
- package/dist/core/interceptors/spillover/memory-spillover.store.js.map +1 -0
- package/dist/core/interceptors/spillover/preview-generator.d.ts +7 -0
- package/dist/core/interceptors/spillover/preview-generator.d.ts.map +1 -0
- package/dist/core/interceptors/spillover/preview-generator.js +79 -0
- package/dist/core/interceptors/spillover/preview-generator.js.map +1 -0
- package/dist/core/interceptors/spillover/spillover-store.interface.d.ts +20 -0
- package/dist/core/interceptors/spillover/spillover-store.interface.d.ts.map +1 -0
- package/dist/core/interceptors/spillover/spillover-store.interface.js +2 -0
- package/dist/core/interceptors/spillover/spillover-store.interface.js.map +1 -0
- package/dist/core/interceptors/spillover/types.d.ts +71 -0
- package/dist/core/interceptors/spillover/types.d.ts.map +1 -0
- package/dist/core/interceptors/spillover/types.js +12 -0
- package/dist/core/interceptors/spillover/types.js.map +1 -0
- package/dist/core/protocol/adapter.d.ts +7 -1
- package/dist/core/protocol/adapter.d.ts.map +1 -1
- package/dist/core/protocol/modern-v2.adapter.d.ts +95 -2
- package/dist/core/protocol/modern-v2.adapter.d.ts.map +1 -1
- package/dist/core/protocol/modern-v2.adapter.js +688 -157
- package/dist/core/protocol/modern-v2.adapter.js.map +1 -1
- package/dist/core/server.d.ts +104 -4
- package/dist/core/server.d.ts.map +1 -1
- package/dist/core/server.js +450 -44
- package/dist/core/server.js.map +1 -1
- package/dist/core/task.d.ts.map +1 -1
- package/dist/core/task.js +8 -7
- package/dist/core/task.js.map +1 -1
- package/dist/core/tool.d.ts +12 -3
- package/dist/core/tool.d.ts.map +1 -1
- package/dist/core/tool.js +21 -3
- package/dist/core/tool.js.map +1 -1
- package/dist/core/transforms/catalog.transform.d.ts +40 -0
- package/dist/core/transforms/catalog.transform.d.ts.map +1 -0
- package/dist/core/transforms/catalog.transform.js +52 -0
- package/dist/core/transforms/catalog.transform.js.map +1 -0
- package/dist/core/transforms/code-mode/code-mode.transform.d.ts +75 -0
- package/dist/core/transforms/code-mode/code-mode.transform.d.ts.map +1 -0
- package/dist/core/transforms/code-mode/code-mode.transform.js +226 -0
- package/dist/core/transforms/code-mode/code-mode.transform.js.map +1 -0
- package/dist/core/transforms/code-mode/destructive-guard.d.ts +7 -0
- package/dist/core/transforms/code-mode/destructive-guard.d.ts.map +1 -0
- package/dist/core/transforms/code-mode/destructive-guard.js +18 -0
- package/dist/core/transforms/code-mode/destructive-guard.js.map +1 -0
- package/dist/core/transforms/code-mode/guest-evaluator.d.ts +17 -0
- package/dist/core/transforms/code-mode/guest-evaluator.d.ts.map +1 -0
- package/dist/core/transforms/code-mode/guest-evaluator.js +277 -0
- package/dist/core/transforms/code-mode/guest-evaluator.js.map +1 -0
- package/dist/core/transforms/code-mode/index.d.ts +11 -0
- package/dist/core/transforms/code-mode/index.d.ts.map +1 -0
- package/dist/core/transforms/code-mode/index.js +11 -0
- package/dist/core/transforms/code-mode/index.js.map +1 -0
- package/dist/core/transforms/code-mode/ipc-messages.d.ts +31 -0
- package/dist/core/transforms/code-mode/ipc-messages.d.ts.map +1 -0
- package/dist/core/transforms/code-mode/ipc-messages.js +2 -0
- package/dist/core/transforms/code-mode/ipc-messages.js.map +1 -0
- package/dist/core/transforms/code-mode/legible-error.d.ts +8 -0
- package/dist/core/transforms/code-mode/legible-error.d.ts.map +1 -0
- package/dist/core/transforms/code-mode/legible-error.js +17 -0
- package/dist/core/transforms/code-mode/legible-error.js.map +1 -0
- package/dist/core/transforms/code-mode/quickjs-wasm.provider.d.ts +25 -0
- package/dist/core/transforms/code-mode/quickjs-wasm.provider.d.ts.map +1 -0
- package/dist/core/transforms/code-mode/quickjs-wasm.provider.js +31 -0
- package/dist/core/transforms/code-mode/quickjs-wasm.provider.js.map +1 -0
- package/dist/core/transforms/code-mode/sandbox.interface.d.ts +10 -0
- package/dist/core/transforms/code-mode/sandbox.interface.d.ts.map +1 -0
- package/dist/core/transforms/code-mode/sandbox.interface.js +2 -0
- package/dist/core/transforms/code-mode/sandbox.interface.js.map +1 -0
- package/dist/core/transforms/code-mode/sandbox.worker.d.ts +2 -0
- package/dist/core/transforms/code-mode/sandbox.worker.d.ts.map +1 -0
- package/dist/core/transforms/code-mode/sandbox.worker.js +69 -0
- package/dist/core/transforms/code-mode/sandbox.worker.js.map +1 -0
- package/dist/core/transforms/code-mode/synthetic-tools.d.ts +23 -0
- package/dist/core/transforms/code-mode/synthetic-tools.d.ts.map +1 -0
- package/dist/core/transforms/code-mode/synthetic-tools.js +112 -0
- package/dist/core/transforms/code-mode/synthetic-tools.js.map +1 -0
- package/dist/core/transforms/code-mode/types.d.ts +32 -0
- package/dist/core/transforms/code-mode/types.d.ts.map +1 -0
- package/dist/core/transforms/code-mode/types.js +2 -0
- package/dist/core/transforms/code-mode/types.js.map +1 -0
- package/dist/core/transforms/code-mode/worker-pool.d.ts +71 -0
- package/dist/core/transforms/code-mode/worker-pool.d.ts.map +1 -0
- package/dist/core/transforms/code-mode/worker-pool.js +435 -0
- package/dist/core/transforms/code-mode/worker-pool.js.map +1 -0
- package/dist/core/transforms/index.d.ts +6 -0
- package/dist/core/transforms/index.d.ts.map +1 -0
- package/dist/core/transforms/index.js +6 -0
- package/dist/core/transforms/index.js.map +1 -0
- package/dist/core/transforms/search/base-search.transform.d.ts +59 -0
- package/dist/core/transforms/search/base-search.transform.d.ts.map +1 -0
- package/dist/core/transforms/search/base-search.transform.js +166 -0
- package/dist/core/transforms/search/base-search.transform.js.map +1 -0
- package/dist/core/transforms/search/bm25-search.transform.d.ts +27 -0
- package/dist/core/transforms/search/bm25-search.transform.d.ts.map +1 -0
- package/dist/core/transforms/search/bm25-search.transform.js +37 -0
- package/dist/core/transforms/search/bm25-search.transform.js.map +1 -0
- package/dist/core/transforms/search/bm25.engine.d.ts +46 -0
- package/dist/core/transforms/search/bm25.engine.d.ts.map +1 -0
- package/dist/core/transforms/search/bm25.engine.js +160 -0
- package/dist/core/transforms/search/bm25.engine.js.map +1 -0
- package/dist/core/transforms/search/index.d.ts +9 -0
- package/dist/core/transforms/search/index.d.ts.map +1 -0
- package/dist/core/transforms/search/index.js +9 -0
- package/dist/core/transforms/search/index.js.map +1 -0
- package/dist/core/transforms/search/regex-match.worker.d.ts +2 -0
- package/dist/core/transforms/search/regex-match.worker.d.ts.map +1 -0
- package/dist/core/transforms/search/regex-match.worker.js +19 -0
- package/dist/core/transforms/search/regex-match.worker.js.map +1 -0
- package/dist/core/transforms/search/regex-search.transform.d.ts +41 -0
- package/dist/core/transforms/search/regex-search.transform.d.ts.map +1 -0
- package/dist/core/transforms/search/regex-search.transform.js +237 -0
- package/dist/core/transforms/search/regex-search.transform.js.map +1 -0
- package/dist/core/transforms/search/synthetic-tools.d.ts +11 -0
- package/dist/core/transforms/search/synthetic-tools.d.ts.map +1 -0
- package/dist/core/transforms/search/synthetic-tools.js +76 -0
- package/dist/core/transforms/search/synthetic-tools.js.map +1 -0
- package/dist/core/transforms/search/tokenizer.d.ts +11 -0
- package/dist/core/transforms/search/tokenizer.d.ts.map +1 -0
- package/dist/core/transforms/search/tokenizer.js +38 -0
- package/dist/core/transforms/search/tokenizer.js.map +1 -0
- package/dist/core/transforms/search/tool-serializer.d.ts +6 -0
- package/dist/core/transforms/search/tool-serializer.d.ts.map +1 -0
- package/dist/core/transforms/search/tool-serializer.js +41 -0
- package/dist/core/transforms/search/tool-serializer.js.map +1 -0
- package/dist/core/transforms/search/types.d.ts +36 -0
- package/dist/core/transforms/search/types.d.ts.map +1 -0
- package/dist/core/transforms/search/types.js +2 -0
- package/dist/core/transforms/search/types.js.map +1 -0
- package/dist/core/transforms/tool-cache-key.d.ts +15 -0
- package/dist/core/transforms/tool-cache-key.d.ts.map +1 -0
- package/dist/core/transforms/tool-cache-key.js +61 -0
- package/dist/core/transforms/tool-cache-key.js.map +1 -0
- package/dist/core/transforms/transform.interface.d.ts +34 -0
- package/dist/core/transforms/transform.interface.d.ts.map +1 -0
- package/dist/core/transforms/transform.interface.js +2 -0
- package/dist/core/transforms/transform.interface.js.map +1 -0
- package/dist/core/transforms/validate-tool-arguments.d.ts +10 -0
- package/dist/core/transforms/validate-tool-arguments.d.ts.map +1 -0
- package/dist/core/transforms/validate-tool-arguments.js +62 -0
- package/dist/core/transforms/validate-tool-arguments.js.map +1 -0
- package/dist/core/transforms/visibility/index.d.ts +3 -0
- package/dist/core/transforms/visibility/index.d.ts.map +1 -0
- package/dist/core/transforms/visibility/index.js +3 -0
- package/dist/core/transforms/visibility/index.js.map +1 -0
- package/dist/core/transforms/visibility/session-store.d.ts +132 -0
- package/dist/core/transforms/visibility/session-store.d.ts.map +1 -0
- package/dist/core/transforms/visibility/session-store.js +330 -0
- package/dist/core/transforms/visibility/session-store.js.map +1 -0
- package/dist/core/transforms/visibility/visibility.transform.d.ts +42 -0
- package/dist/core/transforms/visibility/visibility.transform.d.ts.map +1 -0
- package/dist/core/transforms/visibility/visibility.transform.js +109 -0
- package/dist/core/transforms/visibility/visibility.transform.js.map +1 -0
- package/dist/core/types.d.ts +60 -0
- package/dist/core/types.d.ts.map +1 -1
- package/dist/testing/index.d.ts.map +1 -1
- package/dist/testing/index.js +3 -0
- package/dist/testing/index.js.map +1 -1
- package/package.json +8 -2
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
import { Tool } from '../tool.js';
|
|
2
|
+
import { ExecutionContext } from '../types.js';
|
|
3
|
+
import { McpTransform, NextToolHandler } from './transform.interface.js';
|
|
4
|
+
export declare abstract class CatalogTransform implements McpTransform {
|
|
5
|
+
abstract readonly name: string;
|
|
6
|
+
private static readonly bypassStorage;
|
|
7
|
+
/**
|
|
8
|
+
* Catalog reshape (search, code mode) skips itself inside `withBypass` so a
|
|
9
|
+
* tool can list tools without rebuilding the catalog. Authorization
|
|
10
|
+
* transforms override this and still filter.
|
|
11
|
+
*/
|
|
12
|
+
protected honorsBypass(): boolean;
|
|
13
|
+
/**
|
|
14
|
+
* Intercepts transformTools. Bypass skips transforms that opt in via
|
|
15
|
+
* `honorsBypass`. Visibility keeps filtering so a re-entrant list cannot
|
|
16
|
+
* see hidden tools.
|
|
17
|
+
*/
|
|
18
|
+
transformTools(tools: Tool[], context?: ExecutionContext): Promise<Tool[]>;
|
|
19
|
+
/**
|
|
20
|
+
* Returns true if the current execution context is inside a bypass scope.
|
|
21
|
+
*/
|
|
22
|
+
static isBypassed(): boolean;
|
|
23
|
+
/**
|
|
24
|
+
* Executes an asynchronous or synchronous action with transform bypass enabled.
|
|
25
|
+
* Handles nested bypass calls idempotently.
|
|
26
|
+
*/
|
|
27
|
+
static withBypass<T>(fn: () => Promise<T> | T): Promise<T>;
|
|
28
|
+
/**
|
|
29
|
+
* Concrete subclass implementation of the transformation logic.
|
|
30
|
+
*/
|
|
31
|
+
protected abstract applyTransform(tools: Tool[], context?: ExecutionContext): Promise<Tool[]>;
|
|
32
|
+
resolveTool(name: string, next: NextToolHandler, context?: ExecutionContext): Promise<Tool | undefined>;
|
|
33
|
+
}
|
|
34
|
+
/** Runs async work one-at-a-time for a single transform instance. */
|
|
35
|
+
export declare class RebuildQueue {
|
|
36
|
+
private tail;
|
|
37
|
+
enqueue<T>(fn: () => Promise<T>): Promise<T>;
|
|
38
|
+
drain(): Promise<void>;
|
|
39
|
+
}
|
|
40
|
+
//# sourceMappingURL=catalog.transform.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"catalog.transform.d.ts","sourceRoot":"","sources":["../../../src/core/transforms/catalog.transform.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,IAAI,EAAE,MAAM,YAAY,CAAC;AAClC,OAAO,EAAE,gBAAgB,EAAE,MAAM,aAAa,CAAC;AAC/C,OAAO,EAAE,YAAY,EAAE,eAAe,EAAE,MAAM,0BAA0B,CAAC;AAEzE,8BAAsB,gBAAiB,YAAW,YAAY;IAC5D,QAAQ,CAAC,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IAC/B,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC,aAAa,CAAoC;IAEzE;;;;OAIG;IACH,SAAS,CAAC,YAAY,IAAI,OAAO;IAIjC;;;;OAIG;IACG,cAAc,CAAC,KAAK,EAAE,IAAI,EAAE,EAAE,OAAO,CAAC,EAAE,gBAAgB,GAAG,OAAO,CAAC,IAAI,EAAE,CAAC;IAOhF;;OAEG;IACH,MAAM,CAAC,UAAU,IAAI,OAAO;IAI5B;;;OAGG;WACU,UAAU,CAAC,CAAC,EAAE,EAAE,EAAE,MAAM,OAAO,CAAC,CAAC,CAAC,GAAG,CAAC,GAAG,OAAO,CAAC,CAAC,CAAC;IAIhE;;OAEG;IACH,SAAS,CAAC,QAAQ,CAAC,cAAc,CAC/B,KAAK,EAAE,IAAI,EAAE,EACb,OAAO,CAAC,EAAE,gBAAgB,GACzB,OAAO,CAAC,IAAI,EAAE,CAAC;IAEZ,WAAW,CACf,IAAI,EAAE,MAAM,EACZ,IAAI,EAAE,eAAe,EACrB,OAAO,CAAC,EAAE,gBAAgB,GACzB,OAAO,CAAC,IAAI,GAAG,SAAS,CAAC;CAG7B;AAED,qEAAqE;AACrE,qBAAa,YAAY;IACvB,OAAO,CAAC,IAAI,CAAuC;IAEnD,OAAO,CAAC,CAAC,EAAE,EAAE,EAAE,MAAM,OAAO,CAAC,CAAC,CAAC,GAAG,OAAO,CAAC,CAAC,CAAC;IAS5C,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;CAMvB"}
|
|
@@ -0,0 +1,52 @@
|
|
|
1
|
+
import { AsyncLocalStorage } from 'node:async_hooks';
|
|
2
|
+
export class CatalogTransform {
|
|
3
|
+
static bypassStorage = new AsyncLocalStorage();
|
|
4
|
+
/**
|
|
5
|
+
* Catalog reshape (search, code mode) skips itself inside `withBypass` so a
|
|
6
|
+
* tool can list tools without rebuilding the catalog. Authorization
|
|
7
|
+
* transforms override this and still filter.
|
|
8
|
+
*/
|
|
9
|
+
honorsBypass() {
|
|
10
|
+
return true;
|
|
11
|
+
}
|
|
12
|
+
/**
|
|
13
|
+
* Intercepts transformTools. Bypass skips transforms that opt in via
|
|
14
|
+
* `honorsBypass`. Visibility keeps filtering so a re-entrant list cannot
|
|
15
|
+
* see hidden tools.
|
|
16
|
+
*/
|
|
17
|
+
async transformTools(tools, context) {
|
|
18
|
+
if (CatalogTransform.isBypassed() && this.honorsBypass()) {
|
|
19
|
+
return tools;
|
|
20
|
+
}
|
|
21
|
+
return this.applyTransform(tools, context);
|
|
22
|
+
}
|
|
23
|
+
/**
|
|
24
|
+
* Returns true if the current execution context is inside a bypass scope.
|
|
25
|
+
*/
|
|
26
|
+
static isBypassed() {
|
|
27
|
+
return CatalogTransform.bypassStorage.getStore() === true;
|
|
28
|
+
}
|
|
29
|
+
/**
|
|
30
|
+
* Executes an asynchronous or synchronous action with transform bypass enabled.
|
|
31
|
+
* Handles nested bypass calls idempotently.
|
|
32
|
+
*/
|
|
33
|
+
static async withBypass(fn) {
|
|
34
|
+
return CatalogTransform.bypassStorage.run(true, async () => fn());
|
|
35
|
+
}
|
|
36
|
+
async resolveTool(name, next, context) {
|
|
37
|
+
return next(name, context);
|
|
38
|
+
}
|
|
39
|
+
}
|
|
40
|
+
/** Runs async work one-at-a-time for a single transform instance. */
|
|
41
|
+
export class RebuildQueue {
|
|
42
|
+
tail = Promise.resolve();
|
|
43
|
+
enqueue(fn) {
|
|
44
|
+
const run = this.tail.then(fn);
|
|
45
|
+
this.tail = run.then(() => undefined, () => undefined);
|
|
46
|
+
return run;
|
|
47
|
+
}
|
|
48
|
+
drain() {
|
|
49
|
+
return this.tail.then(() => undefined, () => undefined);
|
|
50
|
+
}
|
|
51
|
+
}
|
|
52
|
+
//# sourceMappingURL=catalog.transform.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"catalog.transform.js","sourceRoot":"","sources":["../../../src/core/transforms/catalog.transform.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,iBAAiB,EAAE,MAAM,kBAAkB,CAAC;AAKrD,MAAM,OAAgB,gBAAgB;IAE5B,MAAM,CAAU,aAAa,GAAG,IAAI,iBAAiB,EAAW,CAAC;IAEzE;;;;OAIG;IACO,YAAY;QACpB,OAAO,IAAI,CAAC;IACd,CAAC;IAED;;;;OAIG;IACH,KAAK,CAAC,cAAc,CAAC,KAAa,EAAE,OAA0B;QAC5D,IAAI,gBAAgB,CAAC,UAAU,EAAE,IAAI,IAAI,CAAC,YAAY,EAAE,EAAE,CAAC;YACzD,OAAO,KAAK,CAAC;QACf,CAAC;QACD,OAAO,IAAI,CAAC,cAAc,CAAC,KAAK,EAAE,OAAO,CAAC,CAAC;IAC7C,CAAC;IAED;;OAEG;IACH,MAAM,CAAC,UAAU;QACf,OAAO,gBAAgB,CAAC,aAAa,CAAC,QAAQ,EAAE,KAAK,IAAI,CAAC;IAC5D,CAAC;IAED;;;OAGG;IACH,MAAM,CAAC,KAAK,CAAC,UAAU,CAAI,EAAwB;QACjD,OAAO,gBAAgB,CAAC,aAAa,CAAC,GAAG,CAAC,IAAI,EAAE,KAAK,IAAI,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC;IACpE,CAAC;IAUD,KAAK,CAAC,WAAW,CACf,IAAY,EACZ,IAAqB,EACrB,OAA0B;QAE1B,OAAO,IAAI,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC;IAC7B,CAAC;;AAGH,qEAAqE;AACrE,MAAM,OAAO,YAAY;IACf,IAAI,GAAqB,OAAO,CAAC,OAAO,EAAE,CAAC;IAEnD,OAAO,CAAI,EAAoB;QAC7B,MAAM,GAAG,GAAG,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QAC/B,IAAI,CAAC,IAAI,GAAG,GAAG,CAAC,IAAI,CAClB,GAAG,EAAE,CAAC,SAAS,EACf,GAAG,EAAE,CAAC,SAAS,CAChB,CAAC;QACF,OAAO,GAAG,CAAC;IACb,CAAC;IAED,KAAK;QACH,OAAO,IAAI,CAAC,IAAI,CAAC,IAAI,CACnB,GAAG,EAAE,CAAC,SAAS,EACf,GAAG,EAAE,CAAC,SAAS,CAChB,CAAC;IACJ,CAAC;CACF"}
|
|
@@ -0,0 +1,75 @@
|
|
|
1
|
+
import { CatalogTransform } from '../catalog.transform.js';
|
|
2
|
+
import { NextToolHandler, TransformRegistry } from '../transform.interface.js';
|
|
3
|
+
import { Tool } from '../../tool.js';
|
|
4
|
+
import { ExecutionContext } from '../../types.js';
|
|
5
|
+
import { WorkerPool } from './worker-pool.js';
|
|
6
|
+
import { CodeModeTransformOptions, SandboxExecutionResult } from './types.js';
|
|
7
|
+
/**
|
|
8
|
+
* CodeModeTransform transforms the MCP server tool catalog by substituting raw tools
|
|
9
|
+
* with 3 synthetic meta-tools (search, get_schema, execute).
|
|
10
|
+
*
|
|
11
|
+
* This reduces context token usage by up to 98% and enables client LLMs to write and execute
|
|
12
|
+
* multi-step orchestration scripts locally inside an isolated WebAssembly sandbox.
|
|
13
|
+
*/
|
|
14
|
+
export declare class CodeModeTransform extends CatalogTransform {
|
|
15
|
+
readonly name = "code-mode";
|
|
16
|
+
private readonly options;
|
|
17
|
+
private rawTools;
|
|
18
|
+
private readonly bm25Engine;
|
|
19
|
+
private workerPool;
|
|
20
|
+
private cachedTransformedList;
|
|
21
|
+
private lastCatalogHash;
|
|
22
|
+
private registry;
|
|
23
|
+
private syntheticTools;
|
|
24
|
+
private readonly rebuilds;
|
|
25
|
+
private disposed;
|
|
26
|
+
constructor(options?: CodeModeTransformOptions);
|
|
27
|
+
onRegister(registry: TransformRegistry): void;
|
|
28
|
+
/**
|
|
29
|
+
* Resolves a tool for sandbox dispatch and for the search/get_schema meta-tools.
|
|
30
|
+
*
|
|
31
|
+
* Goes through the server's resolution chain so downstream authorization transforms
|
|
32
|
+
* still apply. When no server is attached (standalone use), there is no chain to
|
|
33
|
+
* consult and the locally indexed catalog is the complete picture.
|
|
34
|
+
*/
|
|
35
|
+
private isMetaTool;
|
|
36
|
+
private readonly resolveForSandbox;
|
|
37
|
+
/**
|
|
38
|
+
* Returns the subset of `names` the caller is allowed to see, preserving order.
|
|
39
|
+
* Tools denied by an authorization transform are dropped rather than surfaced.
|
|
40
|
+
*/
|
|
41
|
+
private filterAuthorized;
|
|
42
|
+
/**
|
|
43
|
+
* Transforms raw catalog tools into Code Mode meta-tools plus any alwaysVisible tools.
|
|
44
|
+
*/
|
|
45
|
+
protected applyTransform(tools: Tool[], context?: ExecutionContext): Promise<Tool[]>;
|
|
46
|
+
private rebuildCatalog;
|
|
47
|
+
/**
|
|
48
|
+
* Resolves this transform's own meta-tools (search, get_schema, execute).
|
|
49
|
+
*
|
|
50
|
+
* There is deliberately no fallback to `rawTools`: re-resolving a tool the chain
|
|
51
|
+
* declined would let a caller reach tools a downstream authorization transform
|
|
52
|
+
* filtered out. Sandbox dispatch uses {@link resolveForSandbox}, which walks this
|
|
53
|
+
* same chain.
|
|
54
|
+
*/
|
|
55
|
+
resolveTool(name: string, next: NextToolHandler, context?: ExecutionContext): Promise<Tool | undefined>;
|
|
56
|
+
/**
|
|
57
|
+
* Directly executes a JavaScript code snippet inside the worker pool sandbox.
|
|
58
|
+
* Throws an error if execution fails.
|
|
59
|
+
*/
|
|
60
|
+
execute(code: string, context?: ExecutionContext): Promise<SandboxExecutionResult>;
|
|
61
|
+
private ensurePool;
|
|
62
|
+
/**
|
|
63
|
+
* Disposes the underlying worker pool.
|
|
64
|
+
*/
|
|
65
|
+
dispose(): Promise<void>;
|
|
66
|
+
/**
|
|
67
|
+
* Diagnostic access to the worker pool.
|
|
68
|
+
*/
|
|
69
|
+
getWorkerPool(): WorkerPool | null;
|
|
70
|
+
/**
|
|
71
|
+
* Diagnostic access to indexed raw tools.
|
|
72
|
+
*/
|
|
73
|
+
getRawTools(): Map<string, Tool>;
|
|
74
|
+
}
|
|
75
|
+
//# sourceMappingURL=code-mode.transform.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"code-mode.transform.d.ts","sourceRoot":"","sources":["../../../../src/core/transforms/code-mode/code-mode.transform.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,gBAAgB,EAAgB,MAAM,yBAAyB,CAAC;AACzE,OAAO,EAAE,eAAe,EAAE,iBAAiB,EAAE,MAAM,2BAA2B,CAAC;AAC/E,OAAO,EAAE,IAAI,EAAE,MAAM,eAAe,CAAC;AACrC,OAAO,EAAE,gBAAgB,EAAE,MAAM,gBAAgB,CAAC;AAElD,OAAO,EAAuB,UAAU,EAAE,MAAM,kBAAkB,CAAC;AAEnE,OAAO,EAAE,wBAAwB,EAAmB,sBAAsB,EAAE,MAAM,YAAY,CAAC;AAI/F;;;;;;GAMG;AACH,qBAAa,iBAAkB,SAAQ,gBAAgB;IACrD,QAAQ,CAAC,IAAI,eAAe;IAC5B,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAqC;IAC7D,OAAO,CAAC,QAAQ,CAAgC;IAChD,OAAO,CAAC,QAAQ,CAAC,UAAU,CAAsC;IACjE,OAAO,CAAC,UAAU,CAA2B;IAC7C,OAAO,CAAC,qBAAqB,CAAuB;IACpD,OAAO,CAAC,eAAe,CAAc;IACrC,OAAO,CAAC,QAAQ,CAAkC;IAClD,OAAO,CAAC,cAAc,CAAgC;IACtD,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAsB;IAC/C,OAAO,CAAC,QAAQ,CAAS;gBAEb,OAAO,GAAE,wBAA6B;IAkBlD,UAAU,CAAC,QAAQ,EAAE,iBAAiB,GAAG,IAAI;IAI7C;;;;;;OAMG;IACH,OAAO,CAAC,UAAU;IAQlB,OAAO,CAAC,QAAQ,CAAC,iBAAiB,CAUhC;IAEF;;;OAGG;YACW,gBAAgB;IAa9B;;OAEG;cACa,cAAc,CAAC,KAAK,EAAE,IAAI,EAAE,EAAE,OAAO,CAAC,EAAE,gBAAgB,GAAG,OAAO,CAAC,IAAI,EAAE,CAAC;YAO5E,cAAc;IAqE5B;;;;;;;OAOG;IACG,WAAW,CACf,IAAI,EAAE,MAAM,EACZ,IAAI,EAAE,eAAe,EACrB,OAAO,CAAC,EAAE,gBAAgB,GACzB,OAAO,CAAC,IAAI,GAAG,SAAS,CAAC;IAkB5B;;;OAGG;IACG,OAAO,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,gBAAgB,GAAG,OAAO,CAAC,sBAAsB,CAAC;YAiB1E,UAAU;IA2BxB;;OAEG;IACG,OAAO,IAAI,OAAO,CAAC,IAAI,CAAC;IAS9B;;OAEG;IACH,aAAa,IAAI,UAAU,GAAG,IAAI;IAIlC;;OAEG;IACH,WAAW,IAAI,GAAG,CAAC,MAAM,EAAE,IAAI,CAAC;CAGjC"}
|
|
@@ -0,0 +1,226 @@
|
|
|
1
|
+
import { CatalogTransform, RebuildQueue } from '../catalog.transform.js';
|
|
2
|
+
import { BM25Engine } from '../search/bm25.engine.js';
|
|
3
|
+
import { WorkerPool } from './worker-pool.js';
|
|
4
|
+
import { buildCodeModeTools } from './synthetic-tools.js';
|
|
5
|
+
import { catalogCacheKey } from '../tool-cache-key.js';
|
|
6
|
+
/**
|
|
7
|
+
* CodeModeTransform transforms the MCP server tool catalog by substituting raw tools
|
|
8
|
+
* with 3 synthetic meta-tools (search, get_schema, execute).
|
|
9
|
+
*
|
|
10
|
+
* This reduces context token usage by up to 98% and enables client LLMs to write and execute
|
|
11
|
+
* multi-step orchestration scripts locally inside an isolated WebAssembly sandbox.
|
|
12
|
+
*/
|
|
13
|
+
export class CodeModeTransform extends CatalogTransform {
|
|
14
|
+
name = 'code-mode';
|
|
15
|
+
options;
|
|
16
|
+
rawTools = new Map();
|
|
17
|
+
bm25Engine = new BM25Engine();
|
|
18
|
+
workerPool = null;
|
|
19
|
+
cachedTransformedList = null;
|
|
20
|
+
lastCatalogHash = '';
|
|
21
|
+
registry = null;
|
|
22
|
+
syntheticTools = new Map();
|
|
23
|
+
rebuilds = new RebuildQueue();
|
|
24
|
+
disposed = false;
|
|
25
|
+
constructor(options = {}) {
|
|
26
|
+
super();
|
|
27
|
+
this.options = {
|
|
28
|
+
workerPoolSize: options.workerPoolSize ?? 4,
|
|
29
|
+
memoryLimitMb: options.memoryLimitMb ?? 100,
|
|
30
|
+
timeoutMs: options.timeoutMs ??
|
|
31
|
+
options.executionTimeoutMs ??
|
|
32
|
+
30000,
|
|
33
|
+
maxToolCalls: options.maxToolCalls ?? 50,
|
|
34
|
+
allowDestructive: options.allowDestructive ?? false,
|
|
35
|
+
alwaysVisible: options.alwaysVisible ?? [],
|
|
36
|
+
searchToolName: options.searchToolName ?? 'search',
|
|
37
|
+
getSchemaToolName: options.getSchemaToolName ?? 'get_schema',
|
|
38
|
+
executeToolName: options.executeToolName ?? 'execute',
|
|
39
|
+
};
|
|
40
|
+
}
|
|
41
|
+
onRegister(registry) {
|
|
42
|
+
this.registry = registry;
|
|
43
|
+
}
|
|
44
|
+
/**
|
|
45
|
+
* Resolves a tool for sandbox dispatch and for the search/get_schema meta-tools.
|
|
46
|
+
*
|
|
47
|
+
* Goes through the server's resolution chain so downstream authorization transforms
|
|
48
|
+
* still apply. When no server is attached (standalone use), there is no chain to
|
|
49
|
+
* consult and the locally indexed catalog is the complete picture.
|
|
50
|
+
*/
|
|
51
|
+
isMetaTool(name) {
|
|
52
|
+
return (name === this.options.searchToolName ||
|
|
53
|
+
name === this.options.getSchemaToolName ||
|
|
54
|
+
name === this.options.executeToolName);
|
|
55
|
+
}
|
|
56
|
+
resolveForSandbox = async (name, context) => {
|
|
57
|
+
// Nested execute/search/get_schema calls queue another job on this same pool
|
|
58
|
+
// and deadlock every worker until the watchdog fires.
|
|
59
|
+
if (this.isMetaTool(name)) {
|
|
60
|
+
throw new Error(`callTool('${name}') cannot invoke Code Mode meta-tools`);
|
|
61
|
+
}
|
|
62
|
+
if (this.registry) {
|
|
63
|
+
return this.registry.resolveTool(name, context);
|
|
64
|
+
}
|
|
65
|
+
return this.rawTools.get(name);
|
|
66
|
+
};
|
|
67
|
+
/**
|
|
68
|
+
* Returns the subset of `names` the caller is allowed to see, preserving order.
|
|
69
|
+
* Tools denied by an authorization transform are dropped rather than surfaced.
|
|
70
|
+
*/
|
|
71
|
+
async filterAuthorized(names, context) {
|
|
72
|
+
const authorized = [];
|
|
73
|
+
for (const name of names) {
|
|
74
|
+
try {
|
|
75
|
+
const tool = await this.resolveForSandbox(name, context);
|
|
76
|
+
if (tool)
|
|
77
|
+
authorized.push(tool);
|
|
78
|
+
}
|
|
79
|
+
catch {
|
|
80
|
+
// Denied for this session; omit from results.
|
|
81
|
+
}
|
|
82
|
+
}
|
|
83
|
+
return authorized;
|
|
84
|
+
}
|
|
85
|
+
/**
|
|
86
|
+
* Transforms raw catalog tools into Code Mode meta-tools plus any alwaysVisible tools.
|
|
87
|
+
*/
|
|
88
|
+
async applyTransform(tools, context) {
|
|
89
|
+
if (this.disposed) {
|
|
90
|
+
throw new Error('CodeModeTransform is disposed');
|
|
91
|
+
}
|
|
92
|
+
return this.rebuilds.enqueue(() => this.rebuildCatalog(tools, context));
|
|
93
|
+
}
|
|
94
|
+
async rebuildCatalog(tools, _context) {
|
|
95
|
+
if (this.disposed) {
|
|
96
|
+
throw new Error('CodeModeTransform is disposed');
|
|
97
|
+
}
|
|
98
|
+
// Index the server's full catalog rather than this session's filtered view, so the
|
|
99
|
+
// index does not depend on whichever session most recently listed tools. Access
|
|
100
|
+
// control happens at query time via filterAuthorized, not by omitting from the index.
|
|
101
|
+
const indexable = this.registry ? [...this.registry.getTools().values()] : tools;
|
|
102
|
+
// Preserve tools designated as alwaysVisible or visible
|
|
103
|
+
const alwaysVisibleSet = new Set(this.options.alwaysVisible);
|
|
104
|
+
const visibleTools = tools.filter((t) => alwaysVisibleSet.has(t.name) ||
|
|
105
|
+
t.visibility === 'visible' ||
|
|
106
|
+
t.annotations?.alwaysVisible === true);
|
|
107
|
+
// Cache key spans both the indexed catalog and this session's passthrough set,
|
|
108
|
+
// so a list computed for one session is never replayed to another.
|
|
109
|
+
const currentHash = catalogCacheKey([...indexable].sort((a, b) => a.name.localeCompare(b.name)), visibleTools.map((t) => t.name).sort());
|
|
110
|
+
if (this.cachedTransformedList && this.lastCatalogHash === currentHash) {
|
|
111
|
+
return this.cachedTransformedList;
|
|
112
|
+
}
|
|
113
|
+
const nextRaw = new Map();
|
|
114
|
+
for (const t of indexable) {
|
|
115
|
+
nextRaw.set(t.name, t);
|
|
116
|
+
}
|
|
117
|
+
this.rawTools = nextRaw;
|
|
118
|
+
// Index tools into BM25 search engine
|
|
119
|
+
this.bm25Engine.indexTools(indexable, currentHash);
|
|
120
|
+
const pool = await this.ensurePool();
|
|
121
|
+
const limits = {
|
|
122
|
+
timeoutMs: this.options.timeoutMs,
|
|
123
|
+
memoryLimitMb: this.options.memoryLimitMb,
|
|
124
|
+
maxToolCalls: this.options.maxToolCalls,
|
|
125
|
+
allowDestructive: this.options.allowDestructive,
|
|
126
|
+
};
|
|
127
|
+
const { searchTool, getSchemaTool, executeTool } = buildCodeModeTools(this.bm25Engine, this.rawTools, pool, limits, {
|
|
128
|
+
searchToolName: this.options.searchToolName,
|
|
129
|
+
getSchemaToolName: this.options.getSchemaToolName,
|
|
130
|
+
executeToolName: this.options.executeToolName,
|
|
131
|
+
}, (names, ctx) => this.filterAuthorized(names, ctx));
|
|
132
|
+
this.syntheticTools = new Map([searchTool, getSchemaTool, executeTool].map((t) => [t.name, t]));
|
|
133
|
+
this.lastCatalogHash = currentHash;
|
|
134
|
+
this.cachedTransformedList = [searchTool, getSchemaTool, executeTool, ...visibleTools];
|
|
135
|
+
return this.cachedTransformedList;
|
|
136
|
+
}
|
|
137
|
+
/**
|
|
138
|
+
* Resolves this transform's own meta-tools (search, get_schema, execute).
|
|
139
|
+
*
|
|
140
|
+
* There is deliberately no fallback to `rawTools`: re-resolving a tool the chain
|
|
141
|
+
* declined would let a caller reach tools a downstream authorization transform
|
|
142
|
+
* filtered out. Sandbox dispatch uses {@link resolveForSandbox}, which walks this
|
|
143
|
+
* same chain.
|
|
144
|
+
*/
|
|
145
|
+
async resolveTool(name, next, context) {
|
|
146
|
+
// A business tool named execute/search/get_schema must not shadow the
|
|
147
|
+
// sandbox meta-tool. Build the catalog once if tools/call arrives first.
|
|
148
|
+
if (this.isMetaTool(name)) {
|
|
149
|
+
if (!this.syntheticTools.has(name) && this.registry) {
|
|
150
|
+
await this.applyTransform([...this.registry.getTools().values()], context);
|
|
151
|
+
}
|
|
152
|
+
const synthetic = this.syntheticTools.get(name);
|
|
153
|
+
if (synthetic)
|
|
154
|
+
return synthetic;
|
|
155
|
+
}
|
|
156
|
+
// Downstream transforms get first refusal, so their guards always run.
|
|
157
|
+
const resolved = await next(name, context);
|
|
158
|
+
if (resolved)
|
|
159
|
+
return resolved;
|
|
160
|
+
return this.syntheticTools.get(name);
|
|
161
|
+
}
|
|
162
|
+
/**
|
|
163
|
+
* Directly executes a JavaScript code snippet inside the worker pool sandbox.
|
|
164
|
+
* Throws an error if execution fails.
|
|
165
|
+
*/
|
|
166
|
+
async execute(code, context) {
|
|
167
|
+
const pool = await this.rebuilds.enqueue(() => this.ensurePool());
|
|
168
|
+
const limits = {
|
|
169
|
+
timeoutMs: this.options.timeoutMs,
|
|
170
|
+
memoryLimitMb: this.options.memoryLimitMb,
|
|
171
|
+
maxToolCalls: this.options.maxToolCalls,
|
|
172
|
+
allowDestructive: this.options.allowDestructive,
|
|
173
|
+
};
|
|
174
|
+
const result = await pool.executeScript(code, limits, context);
|
|
175
|
+
if (!result.success) {
|
|
176
|
+
throw new Error(result.error || 'Script execution failed');
|
|
177
|
+
}
|
|
178
|
+
return result;
|
|
179
|
+
}
|
|
180
|
+
async ensurePool() {
|
|
181
|
+
if (this.disposed) {
|
|
182
|
+
throw new Error('CodeModeTransform is disposed');
|
|
183
|
+
}
|
|
184
|
+
if (!this.workerPool) {
|
|
185
|
+
const pool = new WorkerPool(this.options.workerPoolSize, this.resolveForSandbox, undefined, this.options.memoryLimitMb);
|
|
186
|
+
await pool.initialize();
|
|
187
|
+
if (this.disposed || this.workerPool) {
|
|
188
|
+
await pool.dispose();
|
|
189
|
+
if (this.disposed) {
|
|
190
|
+
throw new Error('CodeModeTransform is disposed');
|
|
191
|
+
}
|
|
192
|
+
}
|
|
193
|
+
else {
|
|
194
|
+
this.workerPool = pool;
|
|
195
|
+
}
|
|
196
|
+
}
|
|
197
|
+
if (!this.workerPool) {
|
|
198
|
+
throw new Error('CodeModeTransform is disposed');
|
|
199
|
+
}
|
|
200
|
+
return this.workerPool;
|
|
201
|
+
}
|
|
202
|
+
/**
|
|
203
|
+
* Disposes the underlying worker pool.
|
|
204
|
+
*/
|
|
205
|
+
async dispose() {
|
|
206
|
+
this.disposed = true;
|
|
207
|
+
await this.rebuilds.drain();
|
|
208
|
+
if (this.workerPool) {
|
|
209
|
+
await this.workerPool.dispose();
|
|
210
|
+
this.workerPool = null;
|
|
211
|
+
}
|
|
212
|
+
}
|
|
213
|
+
/**
|
|
214
|
+
* Diagnostic access to the worker pool.
|
|
215
|
+
*/
|
|
216
|
+
getWorkerPool() {
|
|
217
|
+
return this.workerPool;
|
|
218
|
+
}
|
|
219
|
+
/**
|
|
220
|
+
* Diagnostic access to indexed raw tools.
|
|
221
|
+
*/
|
|
222
|
+
getRawTools() {
|
|
223
|
+
return new Map(this.rawTools);
|
|
224
|
+
}
|
|
225
|
+
}
|
|
226
|
+
//# sourceMappingURL=code-mode.transform.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"code-mode.transform.js","sourceRoot":"","sources":["../../../../src/core/transforms/code-mode/code-mode.transform.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
import { Tool } from '../../tool.js';
|
|
2
|
+
/**
|
|
3
|
+
* Asserts that a target tool is permitted to execute according to safety policies.
|
|
4
|
+
* Throws a model-legible safety error if a destructive tool is invoked while allowDestructive is false.
|
|
5
|
+
*/
|
|
6
|
+
export declare function assertToolAllowed(tool: Tool, allowDestructive: boolean): void;
|
|
7
|
+
//# sourceMappingURL=destructive-guard.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"destructive-guard.d.ts","sourceRoot":"","sources":["../../../../src/core/transforms/code-mode/destructive-guard.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAE,MAAM,eAAe,CAAC;AAErC;;;GAGG;AACH,wBAAgB,iBAAiB,CAAC,IAAI,EAAE,IAAI,EAAE,gBAAgB,EAAE,OAAO,GAAG,IAAI,CAe7E"}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Asserts that a target tool is permitted to execute according to safety policies.
|
|
3
|
+
* Throws a model-legible safety error if a destructive tool is invoked while allowDestructive is false.
|
|
4
|
+
*/
|
|
5
|
+
export function assertToolAllowed(tool, allowDestructive) {
|
|
6
|
+
if (allowDestructive)
|
|
7
|
+
return;
|
|
8
|
+
// MCP default: omitted destructiveHint means the tool may destroy state.
|
|
9
|
+
// readOnlyHint opts out. destructiveHint: false opts out explicitly.
|
|
10
|
+
const legacyDestructive = Boolean(tool.destructive);
|
|
11
|
+
const hint = tool.annotations?.destructiveHint;
|
|
12
|
+
const readOnly = tool.annotations?.readOnlyHint === true;
|
|
13
|
+
const isDestructive = legacyDestructive || hint === true || (hint === undefined && !readOnly);
|
|
14
|
+
if (isDestructive) {
|
|
15
|
+
throw new Error(`callTool('${tool.name}') rejected: destructive operations are disabled in Code Mode batch scripts. Set allowDestructive: true to enable.`);
|
|
16
|
+
}
|
|
17
|
+
}
|
|
18
|
+
//# sourceMappingURL=destructive-guard.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"destructive-guard.js","sourceRoot":"","sources":["../../../../src/core/transforms/code-mode/destructive-guard.ts"],"names":[],"mappings":"AAEA;;;GAGG;AACH,MAAM,UAAU,iBAAiB,CAAC,IAAU,EAAE,gBAAyB;IACrE,IAAI,gBAAgB;QAAE,OAAO;IAE7B,yEAAyE;IACzE,qEAAqE;IACrE,MAAM,iBAAiB,GAAG,OAAO,CAAE,IAAkC,CAAC,WAAW,CAAC,CAAC;IACnF,MAAM,IAAI,GAAG,IAAI,CAAC,WAAW,EAAE,eAAe,CAAC;IAC/C,MAAM,QAAQ,GAAG,IAAI,CAAC,WAAW,EAAE,YAAY,KAAK,IAAI,CAAC;IACzD,MAAM,aAAa,GAAG,iBAAiB,IAAI,IAAI,KAAK,IAAI,IAAI,CAAC,IAAI,KAAK,SAAS,IAAI,CAAC,QAAQ,CAAC,CAAC;IAE9F,IAAI,aAAa,EAAE,CAAC;QAClB,MAAM,IAAI,KAAK,CACb,aAAa,IAAI,CAAC,IAAI,oHAAoH,CAC3I,CAAC;IACJ,CAAC;AACH,CAAC"}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
import { ExecutionLimits, SandboxExecutionResult } from './types.js';
|
|
2
|
+
/**
|
|
3
|
+
* Memory used by a QuickJS runtime, in megabytes.
|
|
4
|
+
* Prefers a numeric reading. The text dump is the fallback, and a format
|
|
5
|
+
* change or a missing API reports 0 rather than failing the script.
|
|
6
|
+
*/
|
|
7
|
+
export declare function memoryUsedMb(runtime: {
|
|
8
|
+
computeMemoryUsage?: () => unknown;
|
|
9
|
+
dumpMemoryUsage?: () => string;
|
|
10
|
+
}): number;
|
|
11
|
+
/**
|
|
12
|
+
* Evaluates JavaScript guest code inside an isolated QuickJS WebAssembly sandbox.
|
|
13
|
+
* Supports async callTool bridging across IPC/host dispatcher, microtask pumping,
|
|
14
|
+
* console capturing, circuit breaker enforcement, and 2-tier timeout protection.
|
|
15
|
+
*/
|
|
16
|
+
export declare function evaluateGuestScript(code: string, limits: ExecutionLimits, ipcToolDispatcher: (name: string, args: Record<string, unknown>) => Promise<unknown>): Promise<SandboxExecutionResult>;
|
|
17
|
+
//# sourceMappingURL=guest-evaluator.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"guest-evaluator.d.ts","sourceRoot":"","sources":["../../../../src/core/transforms/code-mode/guest-evaluator.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,eAAe,EAAE,sBAAsB,EAAmB,MAAM,YAAY,CAAC;AAmEtF;;;;GAIG;AACH,wBAAgB,YAAY,CAAC,OAAO,EAAE;IACpC,kBAAkB,CAAC,EAAE,MAAM,OAAO,CAAC;IACnC,eAAe,CAAC,EAAE,MAAM,MAAM,CAAC;CAChC,GAAG,MAAM,CA2BT;AAID;;;;GAIG;AACH,wBAAsB,mBAAmB,CACvC,IAAI,EAAE,MAAM,EACZ,MAAM,EAAE,eAAe,EACvB,iBAAiB,EAAE,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,KAAK,OAAO,CAAC,OAAO,CAAC,GACnF,OAAO,CAAC,sBAAsB,CAAC,CAmLjC"}
|