@ai-sdk/code-mode 0.0.1 → 1.0.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/LICENSE +13 -0
- package/README.md +99 -0
- package/dist/code-mode-tool.js +40 -0
- package/dist/code-mode-tool.js.map +1 -0
- package/dist/errors.js +192 -0
- package/dist/errors.js.map +1 -0
- package/dist/index.d.ts +179 -2
- package/dist/index.js +32 -1
- package/dist/index.js.map +1 -1
- package/dist/run-code-mode.js +8 -0
- package/dist/run-code-mode.js.map +1 -0
- package/dist/runtime/guest-sources.js +260 -0
- package/dist/runtime/guest-sources.js.map +1 -0
- package/dist/runtime/manager.js +414 -0
- package/dist/runtime/manager.js.map +1 -0
- package/dist/runtime/max-workers.js +40 -0
- package/dist/runtime/max-workers.js.map +1 -0
- package/dist/runtime/protocol.js +1 -0
- package/dist/runtime/protocol.js.map +1 -0
- package/dist/runtime/worker-source.d.ts +11 -0
- package/dist/runtime/worker-source.js +2 -0
- package/dist/tool-invocation.js +129 -0
- package/dist/tool-invocation.js.map +1 -0
- package/dist/tool-prompt.js +440 -0
- package/dist/tool-prompt.js.map +1 -0
- package/dist/types.js +1 -0
- package/dist/types.js.map +1 -0
- package/dist/utils/options.js +76 -0
- package/dist/utils/options.js.map +1 -0
- package/dist/utils/serialization.js +49 -0
- package/dist/utils/serialization.js.map +1 -0
- package/dist/utils/source-cache.js +77 -0
- package/dist/utils/source-cache.js.map +1 -0
- package/package.json +57 -16
- package/src/code-mode-tool.ts +60 -0
- package/src/errors.ts +267 -0
- package/src/index.ts +26 -0
- package/src/run-code-mode.ts +15 -0
- package/src/runtime/guest-sources.ts +260 -0
- package/src/runtime/manager.ts +498 -0
- package/src/runtime/max-workers.ts +65 -0
- package/src/runtime/protocol.ts +52 -0
- package/src/runtime/worker-source.ts +10 -0
- package/src/runtime/worker.ts +497 -0
- package/src/tool-invocation.ts +181 -0
- package/src/tool-prompt.ts +585 -0
- package/src/tsconfig.json +11 -0
- package/src/types.ts +111 -0
- package/src/utils/options.ts +83 -0
- package/src/utils/serialization.ts +66 -0
- package/src/utils/source-cache.ts +91 -0
- package/dist/index.d.ts.map +0 -1
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../src/runtime/manager.ts"],"sourcesContent":["import { AsyncResource } from 'node:async_hooks';\nimport { Buffer } from 'node:buffer';\nimport { Worker } from 'node:worker_threads';\nimport {\n CodeModeAbortedError,\n CodeModeBridgeLimitError,\n CodeModeConcurrencyError,\n CodeModeDetachedBridgeRequestError,\n CodeModeProtocolError,\n CodeModeTimeoutError,\n deserializeError,\n serializeBridgeErrorForGuest,\n} from '../errors.js';\nimport { invokeHostTool } from '../tool-invocation.js';\nimport { normalizeOptions } from '../utils/options.js';\nimport { assertSourceSize, transformSource } from '../utils/source-cache.js';\nimport type {\n CodeModeToolExecutionOptions,\n NormalizedCodeModeOptions,\n RunCodeModeInput,\n} from '../types.js';\nimport { getMaxWorkers } from './max-workers.js';\nimport type {\n MainToWorkerMessage,\n WorkerBridgeResponse,\n WorkerReadyMessage,\n WorkerResultMessage,\n WorkerToolRequest,\n WorkerToMainMessage,\n} from './protocol.js';\nimport { INLINE_CODE_MODE_WORKER_SOURCE } from './worker-source.js';\n\ninterface PooledWorker {\n worker: Worker;\n destroyed: boolean;\n}\n\ninterface ManagedWorkerRun {\n result: Promise<unknown>;\n}\n\nlet invocationCounter = 0;\nlet activeInvocations = 0;\nlet inlineWorkerUrl: URL | undefined;\nconst idleWorkers: PooledWorker[] = [];\n\nexport async function runManagedCodeMode(\n input: RunCodeModeInput,\n): Promise<unknown> {\n const normalizedOptions = normalizeOptions(input.options);\n const maxWorkers = getMaxWorkers({\n memoryLimitBytes: normalizedOptions.memoryLimitBytes,\n activeWorkers: activeInvocations,\n });\n if (activeInvocations >= maxWorkers) {\n throw new CodeModeConcurrencyError(maxWorkers);\n }\n\n activeInvocations++;\n try {\n if (input.toolExecutionOptions?.abortSignal?.aborted) {\n throw new CodeModeAbortedError();\n }\n\n assertSourceSize(input.js, normalizedOptions.maxSourceBytes);\n const run = startWorkerRun({\n ...input,\n js: transformSource(input.js),\n normalizedOptions,\n maxWorkers,\n });\n return await run.result;\n } finally {\n releaseInvocationSlot(normalizedOptions.memoryLimitBytes);\n }\n}\n\nfunction startWorkerRun({\n js,\n tools,\n toolExecutionOptions,\n normalizedOptions,\n maxWorkers,\n}: RunCodeModeInput & {\n normalizedOptions: NormalizedCodeModeOptions;\n maxWorkers: number;\n}): ManagedWorkerRun {\n const invocationId = `code-mode-${++invocationCounter}`;\n const pooledWorker = acquireWorker(maxWorkers);\n const worker = pooledWorker.worker;\n const invocationContext = new AsyncResource('ai-sdk-code-mode:invocation');\n const bindInvocationContext = <Args extends unknown[]>(\n handler: (...args: Args) => void,\n ): ((...args: Args) => void) => {\n return (...args: Args): void => {\n invocationContext.runInAsyncScope(handler, undefined, ...args);\n };\n };\n\n const outerAbortSignal = toolExecutionOptions?.abortSignal;\n const invocationAbortController = new AbortController();\n const forwardedContext =\n toolExecutionOptions?.context ?? toolExecutionOptions?.experimental_context;\n const forwardedExperimentalContext =\n toolExecutionOptions?.experimental_context ?? toolExecutionOptions?.context;\n const baseExecutionOptions: CodeModeToolExecutionOptions = {\n toolCallId: toolExecutionOptions?.toolCallId ?? invocationId,\n messages: toolExecutionOptions?.messages ?? [],\n abortSignal: invocationAbortController.signal,\n ...(forwardedExperimentalContext !== undefined\n ? { experimental_context: forwardedExperimentalContext }\n : {}),\n ...(forwardedContext !== undefined ? { context: forwardedContext } : {}),\n };\n\n let resultMessage: WorkerResultMessage | undefined;\n let callerSettled = false;\n let terminalReached = false;\n let workerCleanedUp = false;\n let totalBridgeRequests = 0;\n let inFlightBridgeRequests = 0;\n const seenWorkerRequestIds = new Set<string>();\n\n let resolveResult!: (value: unknown) => void;\n let rejectResult!: (reason?: unknown) => void;\n const result = new Promise<unknown>((resolve, reject) => {\n resolveResult = resolve;\n rejectResult = reject;\n });\n\n const abortInvocation = (reason: unknown) => {\n if (!invocationAbortController.signal.aborted) {\n invocationAbortController.abort(reason);\n }\n };\n\n const cleanupWorker = (reuseWorker: boolean) => {\n if (workerCleanedUp) {\n return;\n }\n workerCleanedUp = true;\n clearTimeout(timeoutHandle);\n outerAbortSignal?.removeEventListener('abort', onAbort);\n worker.off('message', onMessage);\n worker.off('error', onError);\n worker.off('exit', onExit);\n invocationContext.emitDestroy();\n if (reuseWorker) {\n releaseWorker(pooledWorker);\n } else {\n destroyWorker(pooledWorker);\n }\n };\n\n const settleCaller = (settle: () => void) => {\n if (callerSettled) {\n return;\n }\n callerSettled = true;\n try {\n settle();\n } catch (error) {\n rejectResult(error);\n }\n };\n\n const failTerminal = (error: unknown) => {\n if (terminalReached) {\n return;\n }\n terminalReached = true;\n abortInvocation(error);\n cleanupWorker(false);\n settleCaller(() => rejectResult(error));\n };\n\n const onAbort = bindInvocationContext(() => {\n failTerminal(new CodeModeAbortedError());\n });\n\n const timeoutHandle = setTimeout(\n bindInvocationContext(() => {\n failTerminal(new CodeModeTimeoutError(normalizedOptions.timeoutMs));\n }),\n normalizedOptions.timeoutMs,\n );\n\n const onMessage = bindInvocationContext((message: WorkerToMainMessage) => {\n if (message.invocationId !== invocationId) {\n failTerminal(\n new CodeModeProtocolError(\n `Worker message invocationId mismatch: expected ${invocationId}, received ${message.invocationId}.`,\n {\n expectedInvocationId: invocationId,\n receivedInvocationId: message.invocationId,\n messageType: message.type,\n },\n ),\n );\n return;\n }\n\n if (message.type === 'result') {\n if (resultMessage !== undefined) {\n failTerminal(\n new CodeModeProtocolError(\n `Worker sent duplicate result for invocation ${invocationId}.`,\n { invocationId },\n ),\n );\n return;\n }\n resultMessage = message;\n return;\n }\n\n if (message.type === 'ready') {\n handleReadyMessage(message);\n return;\n }\n\n const bridgeIndex = markWorkerRequest(message);\n if (bridgeIndex !== undefined) {\n void handleToolRequest(message, bridgeIndex);\n }\n });\n\n const onError = bindInvocationContext((error: Error) => {\n failTerminal(error);\n });\n\n const onExit = bindInvocationContext((code: number) => {\n if (!terminalReached) {\n failTerminal(\n new Error(\n `Code mode worker exited before completion with code ${code}.`,\n ),\n );\n }\n });\n\n worker.on('message', onMessage);\n worker.on('error', onError);\n worker.on('exit', onExit);\n outerAbortSignal?.addEventListener('abort', onAbort, { once: true });\n if (outerAbortSignal?.aborted) {\n onAbort();\n }\n\n const runMessage: MainToWorkerMessage = {\n type: 'run',\n invocationId,\n js,\n options: {\n timeoutMs: normalizedOptions.timeoutMs,\n memoryLimitBytes: normalizedOptions.memoryLimitBytes,\n maxStackSizeBytes: normalizedOptions.maxStackSizeBytes,\n maxResultBytes: normalizedOptions.maxResultBytes,\n maxConsoleOutputBytes: normalizedOptions.maxConsoleOutputBytes,\n },\n };\n\n if (!terminalReached) {\n try {\n // eslint-disable-next-line unicorn/require-post-message-target-origin -- Node.js Worker has no targetOrigin parameter.\n worker.postMessage(runMessage);\n } catch (error) {\n failTerminal(error);\n }\n }\n\n return { result };\n\n function markWorkerRequest(message: WorkerToolRequest): number | undefined {\n if (terminalReached) {\n return undefined;\n }\n if (seenWorkerRequestIds.has(message.requestId)) {\n failTerminal(\n new CodeModeProtocolError(\n `Worker sent duplicate requestId ${message.requestId}.`,\n { invocationId, requestId: message.requestId },\n ),\n );\n return undefined;\n }\n seenWorkerRequestIds.add(message.requestId);\n\n if (totalBridgeRequests >= normalizedOptions.maxBridgeRequests) {\n failTerminal(\n new CodeModeBridgeLimitError(\n `Code mode exceeded the ${normalizedOptions.maxBridgeRequests} bridge request limit.`,\n {\n invocationId,\n maxBridgeRequests: normalizedOptions.maxBridgeRequests,\n },\n ),\n );\n return undefined;\n }\n if (inFlightBridgeRequests >= normalizedOptions.maxInFlightBridgeRequests) {\n failTerminal(\n new CodeModeBridgeLimitError(\n `Code mode exceeded the ${normalizedOptions.maxInFlightBridgeRequests} in-flight bridge request limit.`,\n {\n invocationId,\n maxInFlightBridgeRequests:\n normalizedOptions.maxInFlightBridgeRequests,\n },\n ),\n );\n return undefined;\n }\n\n totalBridgeRequests++;\n inFlightBridgeRequests++;\n return totalBridgeRequests;\n }\n\n async function handleToolRequest(\n message: WorkerToolRequest,\n bridgeIndex: number,\n ): Promise<void> {\n try {\n const valueJson = await invokeHostTool({\n toolName: message.toolName,\n inputJson: message.inputJson,\n tools,\n baseExecutionOptions,\n maxToolInputBytes: normalizedOptions.maxToolInputBytes,\n maxToolOutputBytes: normalizedOptions.maxToolOutputBytes,\n toolCallId: `${baseExecutionOptions.toolCallId}:tool-${bridgeIndex}`,\n });\n postBridgeResponse({\n type: 'bridge-response',\n invocationId,\n requestId: message.requestId,\n success: true,\n valueJson,\n });\n } catch (error) {\n postBridgeResponse({\n type: 'bridge-response',\n invocationId,\n requestId: message.requestId,\n success: false,\n error: serializeBridgeErrorForGuest(error, 'tool'),\n });\n } finally {\n inFlightBridgeRequests--;\n }\n }\n\n function postBridgeResponse(message: WorkerBridgeResponse): void {\n if (terminalReached) {\n return;\n }\n try {\n // eslint-disable-next-line unicorn/require-post-message-target-origin -- Node.js Worker has no targetOrigin parameter.\n worker.postMessage(message);\n } catch (error) {\n failTerminal(error);\n }\n }\n\n function handleReadyMessage(message: WorkerReadyMessage): void {\n if (terminalReached) {\n return;\n }\n if (resultMessage === undefined) {\n failTerminal(\n new CodeModeProtocolError(\n `Code mode worker became ready without a result for ${message.invocationId}.`,\n { invocationId: message.invocationId },\n ),\n );\n return;\n }\n\n terminalReached = true;\n const finalResultMessage = resultMessage;\n if (inFlightBridgeRequests > 0) {\n const error = finalResultMessage.success\n ? new CodeModeDetachedBridgeRequestError(\n `Code mode returned while ${inFlightBridgeRequests} bridge request(s) were still in flight.`,\n {\n invocationId,\n inFlightBridgeRequests,\n totalBridgeRequests,\n },\n )\n : deserializeResultError(finalResultMessage);\n abortInvocation(error);\n cleanupWorker(false);\n settleCaller(() => rejectResult(error));\n return;\n }\n\n cleanupWorker(true);\n settleCaller(() =>\n settleWithResultMessage(finalResultMessage, resolveResult, rejectResult),\n );\n }\n}\n\nfunction acquireWorker(maxPoolSize: number): PooledWorker {\n let pooledWorker = idleWorkers.pop();\n while (pooledWorker?.destroyed) {\n pooledWorker = idleWorkers.pop();\n }\n pooledWorker ??= createWorker();\n pooledWorker.worker.removeAllListeners('exit');\n pooledWorker.worker.ref();\n trimIdleWorkers(Math.max(0, maxPoolSize - activeInvocations));\n return pooledWorker;\n}\n\nfunction createWorker(): PooledWorker {\n return {\n worker: new Worker(getInlineWorkerUrl(), { execArgv: [] }),\n destroyed: false,\n };\n}\n\nfunction getInlineWorkerUrl(): URL {\n inlineWorkerUrl ??= new URL(\n `data:text/javascript;base64,${Buffer.from(INLINE_CODE_MODE_WORKER_SOURCE).toString('base64')}`,\n );\n return inlineWorkerUrl;\n}\n\nfunction releaseWorker(pooledWorker: PooledWorker): void {\n if (pooledWorker.destroyed) {\n return;\n }\n pooledWorker.worker.once('exit', () => {\n pooledWorker.destroyed = true;\n const index = idleWorkers.indexOf(pooledWorker);\n if (index !== -1) {\n idleWorkers.splice(index, 1);\n }\n });\n pooledWorker.worker.unref();\n idleWorkers.push(pooledWorker);\n}\n\nfunction destroyWorker(pooledWorker: PooledWorker): void {\n if (pooledWorker.destroyed) {\n return;\n }\n pooledWorker.destroyed = true;\n pooledWorker.worker.removeAllListeners();\n void pooledWorker.worker.terminate();\n}\n\nfunction trimIdleWorkers(maxIdleWorkers: number): void {\n while (idleWorkers.length > maxIdleWorkers) {\n const pooledWorker = idleWorkers.pop();\n if (pooledWorker !== undefined) {\n destroyWorker(pooledWorker);\n }\n }\n}\n\nfunction releaseInvocationSlot(memoryLimitBytes: number): void {\n activeInvocations = Math.max(0, activeInvocations - 1);\n const maxWorkers = getMaxWorkers({\n memoryLimitBytes,\n activeWorkers: activeInvocations,\n });\n trimIdleWorkers(Math.max(0, maxWorkers - activeInvocations));\n}\n\nfunction settleWithResultMessage(\n message: WorkerResultMessage,\n resolve: (value: unknown) => void,\n reject: (reason?: unknown) => void,\n): void {\n if (!message.success) {\n reject(deserializeResultError(message));\n return;\n }\n resolve(\n message.valueJson === '' || message.valueJson === undefined\n ? undefined\n : JSON.parse(message.valueJson),\n );\n}\n\nfunction deserializeResultError(message: WorkerResultMessage): Error {\n if (message.error === undefined) {\n return new CodeModeProtocolError(\n `Code mode worker failed without an error for ${message.invocationId}.`,\n { invocationId: message.invocationId },\n );\n }\n return deserializeError(message.error);\n}\n"],"mappings":"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","names":[]}
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
import os from "node:os";
|
|
2
|
+
const DEFAULT_MAX_WORKERS_CAP = 32;
|
|
3
|
+
const DEFAULT_WORKER_OVERHEAD_BYTES = 48 * 1024 * 1024;
|
|
4
|
+
let configuredMaxWorkers;
|
|
5
|
+
function setMaxWorkers(maxWorkers) {
|
|
6
|
+
if (maxWorkers === void 0) {
|
|
7
|
+
configuredMaxWorkers = void 0;
|
|
8
|
+
return;
|
|
9
|
+
}
|
|
10
|
+
if (!Number.isInteger(maxWorkers) || maxWorkers <= 0) {
|
|
11
|
+
throw new TypeError("maxWorkers must be a positive integer.");
|
|
12
|
+
}
|
|
13
|
+
configuredMaxWorkers = maxWorkers;
|
|
14
|
+
}
|
|
15
|
+
function getMaxWorkers({
|
|
16
|
+
memoryLimitBytes,
|
|
17
|
+
activeWorkers
|
|
18
|
+
}) {
|
|
19
|
+
if (configuredMaxWorkers !== void 0) {
|
|
20
|
+
return configuredMaxWorkers;
|
|
21
|
+
}
|
|
22
|
+
const estimatedBytesPerWorker = memoryLimitBytes + DEFAULT_WORKER_OVERHEAD_BYTES;
|
|
23
|
+
const additionalWorkers = Math.floor(
|
|
24
|
+
availableMemory() / estimatedBytesPerWorker
|
|
25
|
+
);
|
|
26
|
+
return Math.max(
|
|
27
|
+
1,
|
|
28
|
+
Math.min(DEFAULT_MAX_WORKERS_CAP, activeWorkers + additionalWorkers)
|
|
29
|
+
);
|
|
30
|
+
}
|
|
31
|
+
function availableMemory() {
|
|
32
|
+
const processWithAvailableMemory = process;
|
|
33
|
+
const bytes = typeof processWithAvailableMemory.availableMemory === "function" ? processWithAvailableMemory.availableMemory() : os.freemem();
|
|
34
|
+
return Number.isFinite(bytes) && bytes > 0 ? bytes : 0;
|
|
35
|
+
}
|
|
36
|
+
export {
|
|
37
|
+
getMaxWorkers,
|
|
38
|
+
setMaxWorkers
|
|
39
|
+
};
|
|
40
|
+
//# sourceMappingURL=max-workers.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../src/runtime/max-workers.ts"],"sourcesContent":["import os from 'node:os';\n\nconst DEFAULT_MAX_WORKERS_CAP = 32;\nconst DEFAULT_WORKER_OVERHEAD_BYTES = 48 * 1024 * 1024;\n\nlet configuredMaxWorkers: number | undefined;\n\n/**\n * Sets the process-global maximum number of active code-mode workers.\n *\n * Pass `undefined` or call without an argument to restore the dynamic\n * memory-based default. The default admits at least one invocation and admits\n * additional workers only when available memory can cover another worker.\n *\n * @param maxWorkers - Positive integer worker cap, or `undefined` to reset.\n */\nexport function setMaxWorkers(maxWorkers?: number): void {\n if (maxWorkers === undefined) {\n configuredMaxWorkers = undefined;\n return;\n }\n if (!Number.isInteger(maxWorkers) || maxWorkers <= 0) {\n throw new TypeError('maxWorkers must be a positive integer.');\n }\n configuredMaxWorkers = maxWorkers;\n}\n\n/**\n * Returns the currently effective worker cap.\n *\n * @internal\n */\nexport function getMaxWorkers({\n memoryLimitBytes,\n activeWorkers,\n}: {\n memoryLimitBytes: number;\n activeWorkers: number;\n}): number {\n if (configuredMaxWorkers !== undefined) {\n return configuredMaxWorkers;\n }\n\n const estimatedBytesPerWorker =\n memoryLimitBytes + DEFAULT_WORKER_OVERHEAD_BYTES;\n const additionalWorkers = Math.floor(\n availableMemory() / estimatedBytesPerWorker,\n );\n\n return Math.max(\n 1,\n Math.min(DEFAULT_MAX_WORKERS_CAP, activeWorkers + additionalWorkers),\n );\n}\n\nfunction availableMemory(): number {\n const processWithAvailableMemory = process as typeof process & {\n availableMemory?: () => number;\n };\n const bytes =\n typeof processWithAvailableMemory.availableMemory === 'function'\n ? processWithAvailableMemory.availableMemory()\n : os.freemem();\n return Number.isFinite(bytes) && bytes > 0 ? bytes : 0;\n}\n"],"mappings":"AAAA,OAAO,QAAQ;AAEf,MAAM,0BAA0B;AAChC,MAAM,gCAAgC,KAAK,OAAO;AAElD,IAAI;AAWG,SAAS,cAAc,YAA2B;AACvD,MAAI,eAAe,QAAW;AAC5B,2BAAuB;AACvB;AAAA,EACF;AACA,MAAI,CAAC,OAAO,UAAU,UAAU,KAAK,cAAc,GAAG;AACpD,UAAM,IAAI,UAAU,wCAAwC;AAAA,EAC9D;AACA,yBAAuB;AACzB;AAOO,SAAS,cAAc;AAAA,EAC5B;AAAA,EACA;AACF,GAGW;AACT,MAAI,yBAAyB,QAAW;AACtC,WAAO;AAAA,EACT;AAEA,QAAM,0BACJ,mBAAmB;AACrB,QAAM,oBAAoB,KAAK;AAAA,IAC7B,gBAAgB,IAAI;AAAA,EACtB;AAEA,SAAO,KAAK;AAAA,IACV;AAAA,IACA,KAAK,IAAI,yBAAyB,gBAAgB,iBAAiB;AAAA,EACrE;AACF;AAEA,SAAS,kBAA0B;AACjC,QAAM,6BAA6B;AAGnC,QAAM,QACJ,OAAO,2BAA2B,oBAAoB,aAClD,2BAA2B,gBAAgB,IAC3C,GAAG,QAAQ;AACjB,SAAO,OAAO,SAAS,KAAK,KAAK,QAAQ,IAAI,QAAQ;AACvD;","names":[]}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
//# sourceMappingURL=protocol.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":[],"sourcesContent":[],"mappings":"","names":[]}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Inline worker source generated into `dist/runtime/worker-source.js` during
|
|
3
|
+
* package builds.
|
|
4
|
+
*
|
|
5
|
+
* The source placeholder is intentionally unusable before the build step so a
|
|
6
|
+
* broken package build fails loudly instead of trying to run an empty worker.
|
|
7
|
+
*
|
|
8
|
+
*/
|
|
9
|
+
declare const INLINE_CODE_MODE_WORKER_SOURCE = "throw new Error(\"Code mode inline worker source was not generated.\");";
|
|
10
|
+
|
|
11
|
+
export { INLINE_CODE_MODE_WORKER_SOURCE };
|