@darkiceinteractive/mcp-conductor 1.1.0 → 3.0.0-beta.1

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 (293) hide show
  1. package/README.md +35 -5
  2. package/dist/bin/cli.d.ts +20 -0
  3. package/dist/bin/cli.d.ts.map +1 -0
  4. package/dist/bin/cli.js +260 -0
  5. package/dist/bin/cli.js.map +1 -0
  6. package/dist/bridge/http-server.d.ts +65 -1
  7. package/dist/bridge/http-server.d.ts.map +1 -1
  8. package/dist/bridge/http-server.js +192 -7
  9. package/dist/bridge/http-server.js.map +1 -1
  10. package/dist/bridge/index.d.ts +1 -0
  11. package/dist/bridge/index.d.ts.map +1 -1
  12. package/dist/bridge/index.js +1 -0
  13. package/dist/bridge/index.js.map +1 -1
  14. package/dist/bridge/pool.d.ts +95 -0
  15. package/dist/bridge/pool.d.ts.map +1 -0
  16. package/dist/bridge/pool.js +384 -0
  17. package/dist/bridge/pool.js.map +1 -0
  18. package/dist/bridge/session-registry.d.ts +64 -0
  19. package/dist/bridge/session-registry.d.ts.map +1 -0
  20. package/dist/bridge/session-registry.js +124 -0
  21. package/dist/bridge/session-registry.js.map +1 -0
  22. package/dist/cache/cache.d.ts +43 -0
  23. package/dist/cache/cache.d.ts.map +1 -0
  24. package/dist/cache/cache.js +167 -0
  25. package/dist/cache/cache.js.map +1 -0
  26. package/dist/cache/delta.d.ts +32 -0
  27. package/dist/cache/delta.d.ts.map +1 -0
  28. package/dist/cache/delta.js +131 -0
  29. package/dist/cache/delta.js.map +1 -0
  30. package/dist/cache/disk.d.ts +65 -0
  31. package/dist/cache/disk.d.ts.map +1 -0
  32. package/dist/cache/disk.js +238 -0
  33. package/dist/cache/disk.js.map +1 -0
  34. package/dist/cache/index.d.ts +53 -0
  35. package/dist/cache/index.d.ts.map +1 -0
  36. package/dist/cache/index.js +12 -0
  37. package/dist/cache/index.js.map +1 -0
  38. package/dist/cache/key.d.ts +44 -0
  39. package/dist/cache/key.d.ts.map +1 -0
  40. package/dist/cache/key.js +83 -0
  41. package/dist/cache/key.js.map +1 -0
  42. package/dist/cache/lru.d.ts +57 -0
  43. package/dist/cache/lru.d.ts.map +1 -0
  44. package/dist/cache/lru.js +112 -0
  45. package/dist/cache/lru.js.map +1 -0
  46. package/dist/cache/policy.d.ts +34 -0
  47. package/dist/cache/policy.d.ts.map +1 -0
  48. package/dist/cache/policy.js +95 -0
  49. package/dist/cache/policy.js.map +1 -0
  50. package/dist/cli/commands/doctor.d.ts +33 -0
  51. package/dist/cli/commands/doctor.d.ts.map +1 -0
  52. package/dist/cli/commands/doctor.js +135 -0
  53. package/dist/cli/commands/doctor.js.map +1 -0
  54. package/dist/cli/commands/export-servers.d.ts +22 -0
  55. package/dist/cli/commands/export-servers.d.ts.map +1 -0
  56. package/dist/cli/commands/export-servers.js +45 -0
  57. package/dist/cli/commands/export-servers.js.map +1 -0
  58. package/dist/cli/commands/import-servers.d.ts +57 -0
  59. package/dist/cli/commands/import-servers.d.ts.map +1 -0
  60. package/dist/cli/commands/import-servers.js +137 -0
  61. package/dist/cli/commands/import-servers.js.map +1 -0
  62. package/dist/cli/commands/routing.d.ts +34 -0
  63. package/dist/cli/commands/routing.d.ts.map +1 -0
  64. package/dist/cli/commands/routing.js +60 -0
  65. package/dist/cli/commands/routing.js.map +1 -0
  66. package/dist/cli/commands/test-server.d.ts +34 -0
  67. package/dist/cli/commands/test-server.d.ts.map +1 -0
  68. package/dist/cli/commands/test-server.js +86 -0
  69. package/dist/cli/commands/test-server.js.map +1 -0
  70. package/dist/cli/daemon.d.ts +60 -0
  71. package/dist/cli/daemon.d.ts.map +1 -0
  72. package/dist/cli/daemon.js +244 -0
  73. package/dist/cli/daemon.js.map +1 -0
  74. package/dist/cli/replay.d.ts +16 -0
  75. package/dist/cli/replay.d.ts.map +1 -0
  76. package/dist/cli/replay.js +89 -0
  77. package/dist/cli/replay.js.map +1 -0
  78. package/dist/cli/wizard/setup.d.ts +12 -0
  79. package/dist/cli/wizard/setup.d.ts.map +1 -0
  80. package/dist/cli/wizard/setup.js +71 -0
  81. package/dist/cli/wizard/setup.js.map +1 -0
  82. package/dist/config/defaults.d.ts +10 -0
  83. package/dist/config/defaults.d.ts.map +1 -1
  84. package/dist/config/defaults.js +14 -1
  85. package/dist/config/defaults.js.map +1 -1
  86. package/dist/config/schema.d.ts +34 -0
  87. package/dist/config/schema.d.ts.map +1 -1
  88. package/dist/daemon/client.d.ts +97 -0
  89. package/dist/daemon/client.d.ts.map +1 -0
  90. package/dist/daemon/client.js +279 -0
  91. package/dist/daemon/client.js.map +1 -0
  92. package/dist/daemon/discovery.d.ts +50 -0
  93. package/dist/daemon/discovery.d.ts.map +1 -0
  94. package/dist/daemon/discovery.js +104 -0
  95. package/dist/daemon/discovery.js.map +1 -0
  96. package/dist/daemon/index.d.ts +16 -0
  97. package/dist/daemon/index.d.ts.map +1 -0
  98. package/dist/daemon/index.js +11 -0
  99. package/dist/daemon/index.js.map +1 -0
  100. package/dist/daemon/sandbox-api.d.ts +45 -0
  101. package/dist/daemon/sandbox-api.d.ts.map +1 -0
  102. package/dist/daemon/sandbox-api.js +74 -0
  103. package/dist/daemon/sandbox-api.js.map +1 -0
  104. package/dist/daemon/server.d.ts +65 -0
  105. package/dist/daemon/server.d.ts.map +1 -0
  106. package/dist/daemon/server.js +351 -0
  107. package/dist/daemon/server.js.map +1 -0
  108. package/dist/daemon/shared-kv.d.ts +81 -0
  109. package/dist/daemon/shared-kv.d.ts.map +1 -0
  110. package/dist/daemon/shared-kv.js +215 -0
  111. package/dist/daemon/shared-kv.js.map +1 -0
  112. package/dist/daemon/shared-lock.d.ts +71 -0
  113. package/dist/daemon/shared-lock.d.ts.map +1 -0
  114. package/dist/daemon/shared-lock.js +119 -0
  115. package/dist/daemon/shared-lock.js.map +1 -0
  116. package/dist/hub/mcp-hub.d.ts +23 -0
  117. package/dist/hub/mcp-hub.d.ts.map +1 -1
  118. package/dist/hub/mcp-hub.js +34 -1
  119. package/dist/hub/mcp-hub.js.map +1 -1
  120. package/dist/index.js +19 -0
  121. package/dist/index.js.map +1 -1
  122. package/dist/observability/anomaly.d.ts +67 -0
  123. package/dist/observability/anomaly.d.ts.map +1 -0
  124. package/dist/observability/anomaly.js +141 -0
  125. package/dist/observability/anomaly.js.map +1 -0
  126. package/dist/observability/cost-predictor.d.ts +49 -0
  127. package/dist/observability/cost-predictor.d.ts.map +1 -0
  128. package/dist/observability/cost-predictor.js +145 -0
  129. package/dist/observability/cost-predictor.js.map +1 -0
  130. package/dist/observability/hot-path.d.ts +49 -0
  131. package/dist/observability/hot-path.d.ts.map +1 -0
  132. package/dist/observability/hot-path.js +125 -0
  133. package/dist/observability/hot-path.js.map +1 -0
  134. package/dist/observability/index.d.ts +10 -0
  135. package/dist/observability/index.d.ts.map +1 -0
  136. package/dist/observability/index.js +10 -0
  137. package/dist/observability/index.js.map +1 -0
  138. package/dist/observability/replay.d.ts +104 -0
  139. package/dist/observability/replay.d.ts.map +1 -0
  140. package/dist/observability/replay.js +239 -0
  141. package/dist/observability/replay.js.map +1 -0
  142. package/dist/registry/built-in-recommendations.d.ts +54 -0
  143. package/dist/registry/built-in-recommendations.d.ts.map +1 -0
  144. package/dist/registry/built-in-recommendations.js +65 -0
  145. package/dist/registry/built-in-recommendations.js.map +1 -0
  146. package/dist/registry/events.d.ts +26 -0
  147. package/dist/registry/events.d.ts.map +1 -0
  148. package/dist/registry/events.js +22 -0
  149. package/dist/registry/events.js.map +1 -0
  150. package/dist/registry/index.d.ts +159 -0
  151. package/dist/registry/index.d.ts.map +1 -0
  152. package/dist/registry/index.js +12 -0
  153. package/dist/registry/index.js.map +1 -0
  154. package/dist/registry/registry.d.ts +87 -0
  155. package/dist/registry/registry.d.ts.map +1 -0
  156. package/dist/registry/registry.js +294 -0
  157. package/dist/registry/registry.js.map +1 -0
  158. package/dist/registry/snapshot.d.ts +42 -0
  159. package/dist/registry/snapshot.d.ts.map +1 -0
  160. package/dist/registry/snapshot.js +71 -0
  161. package/dist/registry/snapshot.js.map +1 -0
  162. package/dist/registry/typegen.d.ts +48 -0
  163. package/dist/registry/typegen.d.ts.map +1 -0
  164. package/dist/registry/typegen.js +200 -0
  165. package/dist/registry/typegen.js.map +1 -0
  166. package/dist/registry/validator.d.ts +23 -0
  167. package/dist/registry/validator.d.ts.map +1 -0
  168. package/dist/registry/validator.js +50 -0
  169. package/dist/registry/validator.js.map +1 -0
  170. package/dist/reliability/breaker.d.ts +57 -0
  171. package/dist/reliability/breaker.d.ts.map +1 -0
  172. package/dist/reliability/breaker.js +130 -0
  173. package/dist/reliability/breaker.js.map +1 -0
  174. package/dist/reliability/errors.d.ts +78 -0
  175. package/dist/reliability/errors.d.ts.map +1 -0
  176. package/dist/reliability/errors.js +160 -0
  177. package/dist/reliability/errors.js.map +1 -0
  178. package/dist/reliability/gateway.d.ts +88 -0
  179. package/dist/reliability/gateway.d.ts.map +1 -0
  180. package/dist/reliability/gateway.js +180 -0
  181. package/dist/reliability/gateway.js.map +1 -0
  182. package/dist/reliability/index.d.ts +20 -0
  183. package/dist/reliability/index.d.ts.map +1 -0
  184. package/dist/reliability/index.js +16 -0
  185. package/dist/reliability/index.js.map +1 -0
  186. package/dist/reliability/profile.d.ts +49 -0
  187. package/dist/reliability/profile.d.ts.map +1 -0
  188. package/dist/reliability/profile.js +58 -0
  189. package/dist/reliability/profile.js.map +1 -0
  190. package/dist/reliability/retry.d.ts +39 -0
  191. package/dist/reliability/retry.d.ts.map +1 -0
  192. package/dist/reliability/retry.js +51 -0
  193. package/dist/reliability/retry.js.map +1 -0
  194. package/dist/reliability/timeout.d.ts +34 -0
  195. package/dist/reliability/timeout.d.ts.map +1 -0
  196. package/dist/reliability/timeout.js +53 -0
  197. package/dist/reliability/timeout.js.map +1 -0
  198. package/dist/runtime/executor.d.ts +12 -0
  199. package/dist/runtime/executor.d.ts.map +1 -1
  200. package/dist/runtime/executor.js +148 -16
  201. package/dist/runtime/executor.js.map +1 -1
  202. package/dist/runtime/findtool/embed.d.ts +28 -0
  203. package/dist/runtime/findtool/embed.d.ts.map +1 -0
  204. package/dist/runtime/findtool/embed.js +85 -0
  205. package/dist/runtime/findtool/embed.js.map +1 -0
  206. package/dist/runtime/findtool/index.d.ts +52 -0
  207. package/dist/runtime/findtool/index.d.ts.map +1 -0
  208. package/dist/runtime/findtool/index.js +78 -0
  209. package/dist/runtime/findtool/index.js.map +1 -0
  210. package/dist/runtime/findtool/vector-index.d.ts +53 -0
  211. package/dist/runtime/findtool/vector-index.d.ts.map +1 -0
  212. package/dist/runtime/findtool/vector-index.js +71 -0
  213. package/dist/runtime/findtool/vector-index.js.map +1 -0
  214. package/dist/runtime/helpers/budget.d.ts +27 -0
  215. package/dist/runtime/helpers/budget.d.ts.map +1 -0
  216. package/dist/runtime/helpers/budget.js +103 -0
  217. package/dist/runtime/helpers/budget.js.map +1 -0
  218. package/dist/runtime/helpers/compact.d.ts +32 -0
  219. package/dist/runtime/helpers/compact.d.ts.map +1 -0
  220. package/dist/runtime/helpers/compact.js +93 -0
  221. package/dist/runtime/helpers/compact.js.map +1 -0
  222. package/dist/runtime/helpers/delta.d.ts +45 -0
  223. package/dist/runtime/helpers/delta.d.ts.map +1 -0
  224. package/dist/runtime/helpers/delta.js +116 -0
  225. package/dist/runtime/helpers/delta.js.map +1 -0
  226. package/dist/runtime/helpers/index.d.ts +16 -0
  227. package/dist/runtime/helpers/index.d.ts.map +1 -0
  228. package/dist/runtime/helpers/index.js +13 -0
  229. package/dist/runtime/helpers/index.js.map +1 -0
  230. package/dist/runtime/helpers/summarize.d.ts +24 -0
  231. package/dist/runtime/helpers/summarize.d.ts.map +1 -0
  232. package/dist/runtime/helpers/summarize.js +124 -0
  233. package/dist/runtime/helpers/summarize.js.map +1 -0
  234. package/dist/runtime/helpers/worker-preload.d.ts +25 -0
  235. package/dist/runtime/helpers/worker-preload.d.ts.map +1 -0
  236. package/dist/runtime/helpers/worker-preload.js +223 -0
  237. package/dist/runtime/helpers/worker-preload.js.map +1 -0
  238. package/dist/runtime/index.d.ts +1 -0
  239. package/dist/runtime/index.d.ts.map +1 -1
  240. package/dist/runtime/index.js +1 -0
  241. package/dist/runtime/index.js.map +1 -1
  242. package/dist/runtime/pool/index.d.ts +11 -0
  243. package/dist/runtime/pool/index.d.ts.map +1 -0
  244. package/dist/runtime/pool/index.js +8 -0
  245. package/dist/runtime/pool/index.js.map +1 -0
  246. package/dist/runtime/pool/recycle.d.ts +44 -0
  247. package/dist/runtime/pool/recycle.d.ts.map +1 -0
  248. package/dist/runtime/pool/recycle.js +50 -0
  249. package/dist/runtime/pool/recycle.js.map +1 -0
  250. package/dist/runtime/pool/worker-pool.d.ts +77 -0
  251. package/dist/runtime/pool/worker-pool.d.ts.map +1 -0
  252. package/dist/runtime/pool/worker-pool.js +216 -0
  253. package/dist/runtime/pool/worker-pool.js.map +1 -0
  254. package/dist/runtime/pool/worker.d.ts +80 -0
  255. package/dist/runtime/pool/worker.d.ts.map +1 -0
  256. package/dist/runtime/pool/worker.js +324 -0
  257. package/dist/runtime/pool/worker.js.map +1 -0
  258. package/dist/server/mcp-server.d.ts +6 -0
  259. package/dist/server/mcp-server.d.ts.map +1 -1
  260. package/dist/server/mcp-server.js +610 -45
  261. package/dist/server/mcp-server.js.map +1 -1
  262. package/dist/server/passthrough-registrar.d.ts +73 -0
  263. package/dist/server/passthrough-registrar.d.ts.map +1 -0
  264. package/dist/server/passthrough-registrar.js +110 -0
  265. package/dist/server/passthrough-registrar.js.map +1 -0
  266. package/dist/skills/skills-engine.d.ts +9 -1
  267. package/dist/skills/skills-engine.d.ts.map +1 -1
  268. package/dist/skills/skills-engine.js +20 -3
  269. package/dist/skills/skills-engine.js.map +1 -1
  270. package/dist/utils/index.d.ts +3 -0
  271. package/dist/utils/index.d.ts.map +1 -1
  272. package/dist/utils/index.js +3 -0
  273. package/dist/utils/index.js.map +1 -1
  274. package/dist/utils/logger.d.ts.map +1 -1
  275. package/dist/utils/logger.js +5 -1
  276. package/dist/utils/logger.js.map +1 -1
  277. package/dist/utils/orphan-watch.d.ts +34 -0
  278. package/dist/utils/orphan-watch.d.ts.map +1 -0
  279. package/dist/utils/orphan-watch.js +54 -0
  280. package/dist/utils/orphan-watch.js.map +1 -0
  281. package/dist/utils/redact.d.ts +15 -0
  282. package/dist/utils/redact.d.ts.map +1 -0
  283. package/dist/utils/redact.js +48 -0
  284. package/dist/utils/redact.js.map +1 -0
  285. package/dist/utils/tokenize.d.ts +55 -0
  286. package/dist/utils/tokenize.d.ts.map +1 -0
  287. package/dist/utils/tokenize.js +205 -0
  288. package/dist/utils/tokenize.js.map +1 -0
  289. package/dist/version.d.ts +3 -3
  290. package/dist/version.d.ts.map +1 -1
  291. package/dist/version.js +3 -3
  292. package/dist/version.js.map +1 -1
  293. package/package.json +13 -3
@@ -0,0 +1,93 @@
1
+ /**
2
+ * mcp.compact — Field selection and data trimming helper
3
+ *
4
+ * Zero-roundtrip sandbox helper. Reduces large data objects to only the
5
+ * fields the caller cares about, truncates arrays, clips strings, and
6
+ * limits nesting depth. All operations are synchronous and in-process.
7
+ *
8
+ * @module runtime/helpers/compact
9
+ */
10
+ // ─────────────────────────────────────────────────────────────────────────────
11
+ // Internal helpers
12
+ // ─────────────────────────────────────────────────────────────────────────────
13
+ /**
14
+ * Parse a dot-path like "labels.name" into a nested selector tree.
15
+ * { labels: { name: true }, id: true }
16
+ */
17
+ function buildSelectorTree(fields) {
18
+ const tree = {};
19
+ for (const field of fields) {
20
+ const parts = field.split('.');
21
+ let node = tree;
22
+ for (let i = 0; i < parts.length; i++) {
23
+ const part = parts[i] ?? '';
24
+ if (i === parts.length - 1) {
25
+ node[part] = true;
26
+ }
27
+ else {
28
+ if (typeof node[part] !== 'object' || node[part] === null) {
29
+ node[part] = {};
30
+ }
31
+ node = node[part];
32
+ }
33
+ }
34
+ }
35
+ return tree;
36
+ }
37
+ function trimValue(value, selector, opts, depth) {
38
+ const maxDepth = opts.maxDepth ?? Infinity;
39
+ if (depth > maxDepth) {
40
+ return typeof value === 'object' && value !== null ? '[truncated]' : value;
41
+ }
42
+ if (typeof value === 'string') {
43
+ const max = opts.maxStringLength;
44
+ if (max !== undefined && value.length > max) {
45
+ return value.slice(0, max) + '…';
46
+ }
47
+ return value;
48
+ }
49
+ if (Array.isArray(value)) {
50
+ const maxItems = opts.maxItems;
51
+ const arr = maxItems !== undefined ? value.slice(0, maxItems) : value;
52
+ return arr.map((item) => trimValue(item, selector, opts, depth + 1));
53
+ }
54
+ if (typeof value === 'object' && value !== null) {
55
+ const obj = value;
56
+ const result = {};
57
+ if (selector && Object.keys(selector).length > 0) {
58
+ // Only keep selected keys
59
+ for (const key of Object.keys(selector)) {
60
+ if (Object.prototype.hasOwnProperty.call(obj, key)) {
61
+ const childSelector = selector[key];
62
+ const nextSelector = childSelector === true ? null : childSelector;
63
+ result[key] = trimValue(obj[key], nextSelector, opts, depth + 1);
64
+ }
65
+ }
66
+ }
67
+ else {
68
+ // No field filter — apply structural limits only
69
+ for (const key of Object.keys(obj)) {
70
+ result[key] = trimValue(obj[key], null, opts, depth + 1);
71
+ }
72
+ }
73
+ return result;
74
+ }
75
+ return value;
76
+ }
77
+ // ─────────────────────────────────────────────────────────────────────────────
78
+ // Public API
79
+ // ─────────────────────────────────────────────────────────────────────────────
80
+ /**
81
+ * Compact a data value by selecting fields, truncating arrays, clipping
82
+ * strings, and limiting nesting depth.
83
+ *
84
+ * @example
85
+ * const lean = compact(issues, { fields: ['id', 'title', 'labels.name'], maxItems: 20 });
86
+ */
87
+ export function compact(data, options = {}) {
88
+ const selector = options.fields && options.fields.length > 0
89
+ ? buildSelectorTree(options.fields)
90
+ : null;
91
+ return trimValue(data, selector, options, 0);
92
+ }
93
+ //# sourceMappingURL=compact.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"compact.js","sourceRoot":"","sources":["../../../src/runtime/helpers/compact.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,45 @@
1
+ /**
2
+ * mcp.delta — Cross-call diff wrapper
3
+ *
4
+ * Wraps cache.delta from Phase 2 (when available) to return only the
5
+ * changed portions of a tool result relative to the previous call.
6
+ * This file designs the API surface so it works once Phase 2 cache
7
+ * lands; for now it performs a structural diff in-process.
8
+ *
9
+ * @module runtime/helpers/delta
10
+ */
11
+ export interface DeltaResult<T> {
12
+ /** Whether data changed relative to the previous snapshot */
13
+ changed: boolean;
14
+ /** The delta payload (full object if no previous snapshot) */
15
+ delta: Partial<T> | T;
16
+ /** Keys that changed (for objects) or null for primitives/arrays */
17
+ changedKeys?: string[];
18
+ /** Number of items added (arrays only) */
19
+ added?: number;
20
+ /** Number of items removed (arrays only) */
21
+ removed?: number;
22
+ }
23
+ export interface CacheDeltaBridge {
24
+ delta<T>(server: string, tool: string, args: unknown, current: T): Promise<DeltaResult<T>>;
25
+ }
26
+ /**
27
+ * Register the Phase 2 cache bridge. Called during system initialisation
28
+ * once the cache layer is available.
29
+ */
30
+ export declare function registerCacheBridge(bridge: CacheDeltaBridge): void;
31
+ /**
32
+ * Compute the delta for a tool result relative to the previous call.
33
+ * Delegates to Phase 2 cache.delta when registered; falls back to
34
+ * in-process structural differ.
35
+ *
36
+ * @example
37
+ * const d = await delta('github', 'list_issues', { repo: 'foo' }, issues);
38
+ * if (d.changed) console.log('Changed keys:', d.changedKeys);
39
+ */
40
+ export declare function delta<T>(server: string, tool: string, args: unknown, current: T): Promise<DeltaResult<T>>;
41
+ /**
42
+ * Clear all in-process snapshots (useful in tests).
43
+ */
44
+ export declare function clearSnapshots(): void;
45
+ //# sourceMappingURL=delta.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"delta.d.ts","sourceRoot":"","sources":["../../../src/runtime/helpers/delta.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAEH,MAAM,WAAW,WAAW,CAAC,CAAC;IAC5B,6DAA6D;IAC7D,OAAO,EAAE,OAAO,CAAC;IACjB,8DAA8D;IAC9D,KAAK,EAAE,OAAO,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC;IACtB,oEAAoE;IACpE,WAAW,CAAC,EAAE,MAAM,EAAE,CAAC;IACvB,0CAA0C;IAC1C,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,4CAA4C;IAC5C,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAMD,MAAM,WAAW,gBAAgB;IAC/B,KAAK,CAAC,CAAC,EACL,MAAM,EAAE,MAAM,EACd,IAAI,EAAE,MAAM,EACZ,IAAI,EAAE,OAAO,EACb,OAAO,EAAE,CAAC,GACT,OAAO,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC,CAAC;CAC5B;AAID;;;GAGG;AACH,wBAAgB,mBAAmB,CAAC,MAAM,EAAE,gBAAgB,GAAG,IAAI,CAElE;AAsDD;;;;;;;;GAQG;AACH,wBAAsB,KAAK,CAAC,CAAC,EAC3B,MAAM,EAAE,MAAM,EACd,IAAI,EAAE,MAAM,EACZ,IAAI,EAAE,OAAO,EACb,OAAO,EAAE,CAAC,GACT,OAAO,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC,CAkDzB;AAED;;GAEG;AACH,wBAAgB,cAAc,IAAI,IAAI,CAErC"}
@@ -0,0 +1,116 @@
1
+ /**
2
+ * mcp.delta — Cross-call diff wrapper
3
+ *
4
+ * Wraps cache.delta from Phase 2 (when available) to return only the
5
+ * changed portions of a tool result relative to the previous call.
6
+ * This file designs the API surface so it works once Phase 2 cache
7
+ * lands; for now it performs a structural diff in-process.
8
+ *
9
+ * @module runtime/helpers/delta
10
+ */
11
+ let _cacheBridge = null;
12
+ /**
13
+ * Register the Phase 2 cache bridge. Called during system initialisation
14
+ * once the cache layer is available.
15
+ */
16
+ export function registerCacheBridge(bridge) {
17
+ _cacheBridge = bridge;
18
+ }
19
+ // ─────────────────────────────────────────────────────────────────────────────
20
+ // In-process structural differ (fallback when Phase 2 is not present)
21
+ // ─────────────────────────────────────────────────────────────────────────────
22
+ // In-memory snapshot store keyed by "server::tool::argsHash"
23
+ const _snapshots = new Map();
24
+ function hashArgs(args) {
25
+ try {
26
+ return JSON.stringify(args) ?? 'null';
27
+ }
28
+ catch {
29
+ return String(args);
30
+ }
31
+ }
32
+ function snapshotKey(server, tool, args) {
33
+ return `${server}::${tool}::${hashArgs(args)}`;
34
+ }
35
+ function diffObjects(prev, curr) {
36
+ const delta = {};
37
+ const changedKeys = [];
38
+ const allKeys = new Set([...Object.keys(prev), ...Object.keys(curr)]);
39
+ for (const key of allKeys) {
40
+ const prevVal = JSON.stringify(prev[key]);
41
+ const currVal = JSON.stringify(curr[key]);
42
+ if (prevVal !== currVal) {
43
+ delta[key] = curr[key];
44
+ changedKeys.push(key);
45
+ }
46
+ }
47
+ return { delta, changedKeys };
48
+ }
49
+ function diffArrays(prev, curr) {
50
+ const prevLen = prev.length;
51
+ const currLen = curr.length;
52
+ const added = Math.max(0, currLen - prevLen);
53
+ const removed = Math.max(0, prevLen - currLen);
54
+ const changed = JSON.stringify(prev) !== JSON.stringify(curr);
55
+ return { changed, added, removed };
56
+ }
57
+ // ─────────────────────────────────────────────────────────────────────────────
58
+ // Public API
59
+ // ─────────────────────────────────────────────────────────────────────────────
60
+ /**
61
+ * Compute the delta for a tool result relative to the previous call.
62
+ * Delegates to Phase 2 cache.delta when registered; falls back to
63
+ * in-process structural differ.
64
+ *
65
+ * @example
66
+ * const d = await delta('github', 'list_issues', { repo: 'foo' }, issues);
67
+ * if (d.changed) console.log('Changed keys:', d.changedKeys);
68
+ */
69
+ export async function delta(server, tool, args, current) {
70
+ // Prefer Phase 2 cache bridge if available
71
+ if (_cacheBridge) {
72
+ return _cacheBridge.delta(server, tool, args, current);
73
+ }
74
+ // Fallback: in-process structural differ
75
+ const key = snapshotKey(server, tool, args);
76
+ const previous = _snapshots.get(key);
77
+ _snapshots.set(key, current);
78
+ if (previous === undefined) {
79
+ // No previous snapshot — return full result
80
+ return { changed: true, delta: current };
81
+ }
82
+ // Array diff
83
+ if (Array.isArray(current) && Array.isArray(previous)) {
84
+ const { changed, added, removed } = diffArrays(previous, current);
85
+ return {
86
+ changed,
87
+ delta: changed ? current : [],
88
+ added,
89
+ removed,
90
+ };
91
+ }
92
+ // Object diff
93
+ if (typeof current === 'object' &&
94
+ current !== null &&
95
+ typeof previous === 'object' &&
96
+ previous !== null &&
97
+ !Array.isArray(current)) {
98
+ const { delta: objectDelta, changedKeys } = diffObjects(previous, current);
99
+ const changed = changedKeys.length > 0;
100
+ return {
101
+ changed,
102
+ delta: changed ? objectDelta : {},
103
+ changedKeys,
104
+ };
105
+ }
106
+ // Primitive diff
107
+ const changed = JSON.stringify(previous) !== JSON.stringify(current);
108
+ return { changed, delta: changed ? current : undefined };
109
+ }
110
+ /**
111
+ * Clear all in-process snapshots (useful in tests).
112
+ */
113
+ export function clearSnapshots() {
114
+ _snapshots.clear();
115
+ }
116
+ //# sourceMappingURL=delta.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"delta.js","sourceRoot":"","sources":["../../../src/runtime/helpers/delta.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AA4BH,IAAI,YAAY,GAA4B,IAAI,CAAC;AAEjD;;;GAGG;AACH,MAAM,UAAU,mBAAmB,CAAC,MAAwB;IAC1D,YAAY,GAAG,MAAM,CAAC;AACxB,CAAC;AAED,gFAAgF;AAChF,sEAAsE;AACtE,gFAAgF;AAEhF,6DAA6D;AAC7D,MAAM,UAAU,GAAG,IAAI,GAAG,EAAmB,CAAC;AAE9C,SAAS,QAAQ,CAAC,IAAa;IAC7B,IAAI,CAAC;QACH,OAAO,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,IAAI,MAAM,CAAC;IACxC,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,MAAM,CAAC,IAAI,CAAC,CAAC;IACtB,CAAC;AACH,CAAC;AAED,SAAS,WAAW,CAAC,MAAc,EAAE,IAAY,EAAE,IAAa;IAC9D,OAAO,GAAG,MAAM,KAAK,IAAI,KAAK,QAAQ,CAAC,IAAI,CAAC,EAAE,CAAC;AACjD,CAAC;AAED,SAAS,WAAW,CAClB,IAAO,EACP,IAAO;IAEP,MAAM,KAAK,GAAe,EAAE,CAAC;IAC7B,MAAM,WAAW,GAAa,EAAE,CAAC;IAEjC,MAAM,OAAO,GAAG,IAAI,GAAG,CAAC,CAAC,GAAG,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,GAAG,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IACtE,KAAK,MAAM,GAAG,IAAI,OAAO,EAAE,CAAC;QAC1B,MAAM,OAAO,GAAG,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC;QAC1C,MAAM,OAAO,GAAG,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC;QAC1C,IAAI,OAAO,KAAK,OAAO,EAAE,CAAC;YACxB,KAAK,CAAC,GAAc,CAAC,GAAG,IAAI,CAAC,GAAG,CAAe,CAAC;YAChD,WAAW,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;QACxB,CAAC;IACH,CAAC;IAED,OAAO,EAAE,KAAK,EAAE,WAAW,EAAE,CAAC;AAChC,CAAC;AAED,SAAS,UAAU,CAAI,IAAS,EAAE,IAAS;IACzC,MAAM,OAAO,GAAG,IAAI,CAAC,MAAM,CAAC;IAC5B,MAAM,OAAO,GAAG,IAAI,CAAC,MAAM,CAAC;IAC5B,MAAM,KAAK,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,OAAO,GAAG,OAAO,CAAC,CAAC;IAC7C,MAAM,OAAO,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,OAAO,GAAG,OAAO,CAAC,CAAC;IAC/C,MAAM,OAAO,GAAG,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,KAAK,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC;IAC9D,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,OAAO,EAAE,CAAC;AACrC,CAAC;AAED,gFAAgF;AAChF,aAAa;AACb,gFAAgF;AAEhF;;;;;;;;GAQG;AACH,MAAM,CAAC,KAAK,UAAU,KAAK,CACzB,MAAc,EACd,IAAY,EACZ,IAAa,EACb,OAAU;IAEV,2CAA2C;IAC3C,IAAI,YAAY,EAAE,CAAC;QACjB,OAAO,YAAY,CAAC,KAAK,CAAC,MAAM,EAAE,IAAI,EAAE,IAAI,EAAE,OAAO,CAAC,CAAC;IACzD,CAAC;IAED,yCAAyC;IACzC,MAAM,GAAG,GAAG,WAAW,CAAC,MAAM,EAAE,IAAI,EAAE,IAAI,CAAC,CAAC;IAC5C,MAAM,QAAQ,GAAG,UAAU,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;IACrC,UAAU,CAAC,GAAG,CAAC,GAAG,EAAE,OAAO,CAAC,CAAC;IAE7B,IAAI,QAAQ,KAAK,SAAS,EAAE,CAAC;QAC3B,4CAA4C;QAC5C,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,KAAK,EAAE,OAAO,EAAE,CAAC;IAC3C,CAAC;IAED,aAAa;IACb,IAAI,KAAK,CAAC,OAAO,CAAC,OAAO,CAAC,IAAI,KAAK,CAAC,OAAO,CAAC,QAAQ,CAAC,EAAE,CAAC;QACtD,MAAM,EAAE,OAAO,EAAE,KAAK,EAAE,OAAO,EAAE,GAAG,UAAU,CAAC,QAAqB,EAAE,OAAoB,CAAC,CAAC;QAC5F,OAAO;YACL,OAAO;YACP,KAAK,EAAE,OAAO,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAE,EAAmB;YAC/C,KAAK;YACL,OAAO;SACR,CAAC;IACJ,CAAC;IAED,cAAc;IACd,IACE,OAAO,OAAO,KAAK,QAAQ;QAC3B,OAAO,KAAK,IAAI;QAChB,OAAO,QAAQ,KAAK,QAAQ;QAC5B,QAAQ,KAAK,IAAI;QACjB,CAAC,KAAK,CAAC,OAAO,CAAC,OAAO,CAAC,EACvB,CAAC;QACD,MAAM,EAAE,KAAK,EAAE,WAAW,EAAE,WAAW,EAAE,GAAG,WAAW,CACrD,QAAmC,EACnC,OAA6C,CAC9C,CAAC;QACF,MAAM,OAAO,GAAG,WAAW,CAAC,MAAM,GAAG,CAAC,CAAC;QACvC,OAAO;YACL,OAAO;YACP,KAAK,EAAE,OAAO,CAAC,CAAC,CAAE,WAA0B,CAAC,CAAC,CAAE,EAAiB;YACjE,WAAW;SACZ,CAAC;IACJ,CAAC;IAED,iBAAiB;IACjB,MAAM,OAAO,GAAG,IAAI,CAAC,SAAS,CAAC,QAAQ,CAAC,KAAK,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC,CAAC;IACrE,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,OAAO,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAE,SAA0B,EAAE,CAAC;AAC7E,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,cAAc;IAC5B,UAAU,CAAC,KAAK,EAAE,CAAC;AACrB,CAAC"}
@@ -0,0 +1,16 @@
1
+ /**
2
+ * Sandbox helper exports
3
+ *
4
+ * These are the zero-roundtrip helpers injected into the execute_code sandbox
5
+ * via the mcp global. All functions run in-process with no external calls.
6
+ *
7
+ * @module runtime/helpers
8
+ */
9
+ export { compact } from './compact.js';
10
+ export type { CompactOptions } from './compact.js';
11
+ export { summarize } from './summarize.js';
12
+ export type { SummarizeOptions, SummarizeStyle } from './summarize.js';
13
+ export { delta, clearSnapshots, registerCacheBridge } from './delta.js';
14
+ export type { DeltaResult, CacheDeltaBridge } from './delta.js';
15
+ export { budget, BudgetExceededError, estimateTokens } from './budget.js';
16
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/runtime/helpers/index.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,OAAO,EAAE,OAAO,EAAE,MAAM,cAAc,CAAC;AACvC,YAAY,EAAE,cAAc,EAAE,MAAM,cAAc,CAAC;AAEnD,OAAO,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAC;AAC3C,YAAY,EAAE,gBAAgB,EAAE,cAAc,EAAE,MAAM,gBAAgB,CAAC;AAEvE,OAAO,EAAE,KAAK,EAAE,cAAc,EAAE,mBAAmB,EAAE,MAAM,YAAY,CAAC;AACxE,YAAY,EAAE,WAAW,EAAE,gBAAgB,EAAE,MAAM,YAAY,CAAC;AAEhE,OAAO,EAAE,MAAM,EAAE,mBAAmB,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC"}
@@ -0,0 +1,13 @@
1
+ /**
2
+ * Sandbox helper exports
3
+ *
4
+ * These are the zero-roundtrip helpers injected into the execute_code sandbox
5
+ * via the mcp global. All functions run in-process with no external calls.
6
+ *
7
+ * @module runtime/helpers
8
+ */
9
+ export { compact } from './compact.js';
10
+ export { summarize } from './summarize.js';
11
+ export { delta, clearSnapshots, registerCacheBridge } from './delta.js';
12
+ export { budget, BudgetExceededError, estimateTokens } from './budget.js';
13
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/runtime/helpers/index.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,OAAO,EAAE,OAAO,EAAE,MAAM,cAAc,CAAC;AAGvC,OAAO,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAC;AAG3C,OAAO,EAAE,KAAK,EAAE,cAAc,EAAE,mBAAmB,EAAE,MAAM,YAAY,CAAC;AAGxE,OAAO,EAAE,MAAM,EAAE,mBAAmB,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC"}
@@ -0,0 +1,24 @@
1
+ /**
2
+ * mcp.summarize — Heuristic summarization helper
3
+ *
4
+ * Converts arbitrary data into a compact string representation that fits
5
+ * within a token budget. Uses a simple heuristic: 1 token ≈ 4 characters.
6
+ * No LLM calls — fully in-process and zero-roundtrip.
7
+ *
8
+ * @module runtime/helpers/summarize
9
+ */
10
+ export type SummarizeStyle = 'list' | 'paragraph' | 'json';
11
+ export interface SummarizeOptions {
12
+ /** Target token budget. Output will not exceed this. */
13
+ maxTokens: number;
14
+ /** Output format. Defaults to 'list'. */
15
+ style?: SummarizeStyle;
16
+ }
17
+ /**
18
+ * Summarize arbitrary data into a string that fits within `maxTokens`.
19
+ *
20
+ * @example
21
+ * const summary = summarize(issues, { maxTokens: 200, style: 'list' });
22
+ */
23
+ export declare function summarize(data: unknown, options: SummarizeOptions): string;
24
+ //# sourceMappingURL=summarize.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"summarize.d.ts","sourceRoot":"","sources":["../../../src/runtime/helpers/summarize.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,MAAM,MAAM,cAAc,GAAG,MAAM,GAAG,WAAW,GAAG,MAAM,CAAC;AAE3D,MAAM,WAAW,gBAAgB;IAC/B,wDAAwD;IACxD,SAAS,EAAE,MAAM,CAAC;IAClB,yCAAyC;IACzC,KAAK,CAAC,EAAE,cAAc,CAAC;CACxB;AAwGD;;;;;GAKG;AACH,wBAAgB,SAAS,CAAC,IAAI,EAAE,OAAO,EAAE,OAAO,EAAE,gBAAgB,GAAG,MAAM,CAa1E"}
@@ -0,0 +1,124 @@
1
+ /**
2
+ * mcp.summarize — Heuristic summarization helper
3
+ *
4
+ * Converts arbitrary data into a compact string representation that fits
5
+ * within a token budget. Uses a simple heuristic: 1 token ≈ 4 characters.
6
+ * No LLM calls — fully in-process and zero-roundtrip.
7
+ *
8
+ * @module runtime/helpers/summarize
9
+ */
10
+ // Characters per token (conservative heuristic)
11
+ const CHARS_PER_TOKEN = 4;
12
+ function tokenBudgetToChars(maxTokens) {
13
+ return maxTokens * CHARS_PER_TOKEN;
14
+ }
15
+ function clip(text, maxChars) {
16
+ if (text.length <= maxChars)
17
+ return text;
18
+ return text.slice(0, Math.max(0, maxChars - 1)) + '…';
19
+ }
20
+ // ─────────────────────────────────────────────────────────────────────────────
21
+ // Style renderers
22
+ // ─────────────────────────────────────────────────────────────────────────────
23
+ function renderJson(data, maxChars) {
24
+ try {
25
+ const full = JSON.stringify(data, null, 2);
26
+ return clip(full, maxChars);
27
+ }
28
+ catch {
29
+ return clip(String(data), maxChars);
30
+ }
31
+ }
32
+ function renderList(data, maxChars) {
33
+ const lines = [];
34
+ if (Array.isArray(data)) {
35
+ for (const item of data) {
36
+ if (typeof item === 'object' && item !== null) {
37
+ const pairs = Object.entries(item)
38
+ .slice(0, 4)
39
+ .map(([k, v]) => `${k}=${JSON.stringify(v)}`)
40
+ .join(', ');
41
+ lines.push(`• ${pairs}`);
42
+ }
43
+ else {
44
+ lines.push(`• ${String(item)}`);
45
+ }
46
+ }
47
+ }
48
+ else if (typeof data === 'object' && data !== null) {
49
+ for (const [key, value] of Object.entries(data)) {
50
+ lines.push(`${key}: ${typeof value === 'object' ? JSON.stringify(value) : String(value)}`);
51
+ }
52
+ }
53
+ else {
54
+ lines.push(String(data));
55
+ }
56
+ // Build output within budget, line by line
57
+ const budget = maxChars;
58
+ let result = '';
59
+ for (const line of lines) {
60
+ const candidate = result ? result + '\n' + line : line;
61
+ if (candidate.length > budget) {
62
+ // Try to fit partial line
63
+ const remaining = budget - result.length - 1; // 1 for newline
64
+ if (remaining > 4) {
65
+ result += (result ? '\n' : '') + clip(line, remaining);
66
+ }
67
+ break;
68
+ }
69
+ result = candidate;
70
+ }
71
+ return result || clip(String(data), budget);
72
+ }
73
+ function renderParagraph(data, maxChars) {
74
+ let text;
75
+ if (typeof data === 'string') {
76
+ text = data;
77
+ }
78
+ else if (Array.isArray(data)) {
79
+ // Summarise array as "N items: first, second, ..."
80
+ const count = data.length;
81
+ const previews = data
82
+ .slice(0, 3)
83
+ .map((x) => typeof x === 'object' && x !== null
84
+ ? JSON.stringify(x).slice(0, 60)
85
+ : String(x).slice(0, 60))
86
+ .join(', ');
87
+ text = `${count} item${count !== 1 ? 's' : ''}: ${previews}${count > 3 ? '...' : ''}`;
88
+ }
89
+ else if (typeof data === 'object' && data !== null) {
90
+ const keys = Object.keys(data);
91
+ const previews = keys
92
+ .slice(0, 5)
93
+ .map((k) => `${k}: ${JSON.stringify(data[k]).slice(0, 30)}`)
94
+ .join('; ');
95
+ text = `Object with ${keys.length} field${keys.length !== 1 ? 's' : ''}: ${previews}`;
96
+ }
97
+ else {
98
+ text = String(data);
99
+ }
100
+ return clip(text, maxChars);
101
+ }
102
+ // ─────────────────────────────────────────────────────────────────────────────
103
+ // Public API
104
+ // ─────────────────────────────────────────────────────────────────────────────
105
+ /**
106
+ * Summarize arbitrary data into a string that fits within `maxTokens`.
107
+ *
108
+ * @example
109
+ * const summary = summarize(issues, { maxTokens: 200, style: 'list' });
110
+ */
111
+ export function summarize(data, options) {
112
+ const maxChars = tokenBudgetToChars(options.maxTokens);
113
+ const style = options.style ?? 'list';
114
+ switch (style) {
115
+ case 'json':
116
+ return renderJson(data, maxChars);
117
+ case 'paragraph':
118
+ return renderParagraph(data, maxChars);
119
+ case 'list':
120
+ default:
121
+ return renderList(data, maxChars);
122
+ }
123
+ }
124
+ //# sourceMappingURL=summarize.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"summarize.js","sourceRoot":"","sources":["../../../src/runtime/helpers/summarize.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,25 @@
1
+ /**
2
+ * Worker preload — inline sandbox helper source
3
+ *
4
+ * Generates the JavaScript source string that is written to a temp file
5
+ * and passed via WorkerOptions.preloadHelpers[] so the Deno worker evaluates
6
+ * it before any user code runs. Injects compact/summarize/delta/budget/findTool
7
+ * onto the mcp global.
8
+ *
9
+ * @module runtime/helpers/worker-preload
10
+ */
11
+ export interface PreloadOptions {
12
+ /** Registry tools to seed findTool (server/tool/description triples) */
13
+ tools?: Array<{
14
+ server: string;
15
+ tool: string;
16
+ description: string;
17
+ }>;
18
+ }
19
+ /**
20
+ * Build a self-contained JS source string for the Deno worker preload.
21
+ * The string is plain JavaScript — no TypeScript-only syntax — because
22
+ * it runs inside the Deno subprocess at runtime.
23
+ */
24
+ export declare function buildHelperPreloadSource(options?: PreloadOptions): string;
25
+ //# sourceMappingURL=worker-preload.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"worker-preload.d.ts","sourceRoot":"","sources":["../../../src/runtime/helpers/worker-preload.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAEH,MAAM,WAAW,cAAc;IAC7B,wEAAwE;IACxE,KAAK,CAAC,EAAE,KAAK,CAAC;QAAE,MAAM,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAC;QAAC,WAAW,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;CACtE;AAED;;;;GAIG;AACH,wBAAgB,wBAAwB,CAAC,OAAO,GAAE,cAAmB,GAAG,MAAM,CAqN7E"}