@tangle-network/agent-runtime 0.317.0 → 0.318.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.
Files changed (62) hide show
  1. package/dist/{activation-CvdE2HIU.js → activation-CRG-tjnR.js} +2 -2
  2. package/dist/{activation-CvdE2HIU.js.map → activation-CRG-tjnR.js.map} +1 -1
  3. package/dist/{activation-BFDmjaKP.d.ts → activation-RExX9RDm.d.ts} +2 -2
  4. package/dist/agent.d.ts +1 -1
  5. package/dist/agent.js +2 -2
  6. package/dist/{coordination-driver-DGhN8GO9.js → coordination-driver-DK3pI_HB.js} +2 -2
  7. package/dist/{coordination-driver-DGhN8GO9.js.map → coordination-driver-DK3pI_HB.js.map} +1 -1
  8. package/dist/{delegate-B5pmSbQa.js → delegate-Co9vJIgE.js} +2 -2
  9. package/dist/{delegate-B5pmSbQa.js.map → delegate-Co9vJIgE.js.map} +1 -1
  10. package/dist/durable.d.ts +1 -1
  11. package/dist/durable.js +2 -2
  12. package/dist/{graph-G0j1ysqe.js → graph-DYBCYZjg.js} +5 -5
  13. package/dist/{graph-G0j1ysqe.js.map → graph-DYBCYZjg.js.map} +1 -1
  14. package/dist/{improvement-cycle-D7yR6GC2.js → improvement-cycle-jp80l_ZQ.js} +4 -4
  15. package/dist/{improvement-cycle-D7yR6GC2.js.map → improvement-cycle-jp80l_ZQ.js.map} +1 -1
  16. package/dist/{index-CUh40yUJ.d.ts → index-CHlWvoo5.d.ts} +85 -52
  17. package/dist/index.d.ts +4 -4
  18. package/dist/index.js +8 -8
  19. package/dist/intelligence.d.ts +2 -2
  20. package/dist/intelligence.js +3 -3
  21. package/dist/kernel.d.ts +2 -2
  22. package/dist/kernel.js +10 -10
  23. package/dist/{loop-runner-bin-DQKLUt0l.d.ts → loop-runner-bin-C-QaaVE2.d.ts} +2 -2
  24. package/dist/{loop-runner-bin-CFVX4oi0.js → loop-runner-bin-C8jLr2gR.js} +3 -3
  25. package/dist/{loop-runner-bin-CFVX4oi0.js.map → loop-runner-bin-C8jLr2gR.js.map} +1 -1
  26. package/dist/loop-runner-bin.d.ts +1 -1
  27. package/dist/loop-runner-bin.js +1 -1
  28. package/dist/mcp/bin.js +3 -3
  29. package/dist/mcp/index.d.ts +2 -2
  30. package/dist/mcp/index.js +5 -5
  31. package/dist/{model-policy-DhvyZ8-O.js → model-policy-B-rOb8Nj.js} +37 -2
  32. package/dist/model-policy-B-rOb8Nj.js.map +1 -0
  33. package/dist/{openai-tools-u3gWBi3x.d.ts → openai-tools-BuJB3JQH.d.ts} +2 -2
  34. package/dist/profiles.d.ts +1 -1
  35. package/dist/profiles.js +1 -1
  36. package/dist/{provision-supervisor-BQLLrUtn.js → provision-supervisor-CunKnayY.js} +4 -4
  37. package/dist/{provision-supervisor-BQLLrUtn.js.map → provision-supervisor-CunKnayY.js.map} +1 -1
  38. package/dist/{runtime-B9BOFyEp.js → runtime-UG5tV_yf.js} +231 -288
  39. package/dist/runtime-UG5tV_yf.js.map +1 -0
  40. package/dist/{search-executor-B5ZVFsDV.js → search-executor-DMX6tCY4.js} +3 -3
  41. package/dist/{search-executor-B5ZVFsDV.js.map → search-executor-DMX6tCY4.js.map} +1 -1
  42. package/dist/{server-TwpH9aik.js → server-fSBvPPLH.js} +3 -3
  43. package/dist/{server-TwpH9aik.js.map → server-fSBvPPLH.js.map} +1 -1
  44. package/dist/{supervise-CU6AuxWY.js → supervise-C41ywfFd.js} +4 -4
  45. package/dist/{supervise-CU6AuxWY.js.map → supervise-C41ywfFd.js.map} +1 -1
  46. package/dist/{supervisor-CbFyf48U.js → supervisor-BXEL_Fxe.js} +480 -50
  47. package/dist/supervisor-BXEL_Fxe.js.map +1 -0
  48. package/dist/testing.d.ts +1 -1
  49. package/dist/testing.js +12 -12
  50. package/dist/tool-loop.d.ts +5 -1
  51. package/dist/tool-loop.js +4 -3
  52. package/dist/tool-loop.js.map +1 -1
  53. package/dist/tui/index.d.ts +1 -1
  54. package/dist/tui/index.js +1 -1
  55. package/package.json +3 -2
  56. package/skills/agent-graphs/references/authoring.md +7 -0
  57. package/skills/codemode/SKILL.md +6 -4
  58. package/skills/codemode/references/runtime-execution.md +56 -11
  59. package/skills/profile-authoring/SKILL.md +17 -15
  60. package/dist/model-policy-DhvyZ8-O.js.map +0 -1
  61. package/dist/runtime-B9BOFyEp.js.map +0 -1
  62. package/dist/supervisor-CbFyf48U.js.map +0 -1
@@ -1,16 +1,16 @@
1
- import { $i as executableAgentSpecSnapshot, Bn as InMemoryResultBlobStore, Cn as readPromptOptions, Hn as insideCursorNamespace, It as createWorktreeCliExecutor, Jn as readCommittedJsonLines, Mr as contentAddress, Nt as createExecutor, Ot as verdictFromJudgeScore, Pt as createExecutorRegistry, Qi as executableAgentProfileSnapshot, Qn as isTraceAnalysisStore, Sn as assertBoxlessPromptOptions, Tn as runBrainLoop, Vn as InMemorySpawnJournal, Yn as writeAllBytes, _n as runAgentRounds, ea as detachedFrozen, fa as notifySandboxEventObserver, hn as defaultSelectWinner, ht as mapExecutorResult, j as settledToIteration, mt as gateOnDeliverable, pt as rollingDispatch, qn as prepareJsonlAppend, r as createSupervisor, ta as detachedSnapshot, v as withDriverExecutor, vn as createSandboxLineage, vt as CheckUnavailableError, wn as routerBrain } from "./supervisor-CbFyf48U.js";
1
+ import { Bn as InMemoryResultBlobStore, Cn as readPromptOptions, Hn as insideCursorNamespace, It as createWorktreeCliExecutor, Jn as readCommittedJsonLines, Mr as contentAddress, Nt as createExecutor, Ot as verdictFromJudgeScore, Pt as createExecutorRegistry, Qn as isTraceAnalysisStore, Sn as assertBoxlessPromptOptions, Tn as runBrainLoop, Vn as InMemorySpawnJournal, Yn as writeAllBytes, _n as runAgentRounds, ha as notifySandboxEventObserver, hn as defaultSelectWinner, ht as mapExecutorResult, ia as detachedSnapshot, j as settledToIteration, mt as gateOnDeliverable, na as executableAgentSpecSnapshot, pt as rollingDispatch, qn as prepareJsonlAppend, r as createSupervisor, ra as detachedFrozen, ta as executableAgentProfileSnapshot, v as withDriverExecutor, vn as createSandboxLineage, vt as CheckUnavailableError, wn as routerBrain } from "./supervisor-BXEL_Fxe.js";
2
2
  import { i as ConfigError, m as ValidationError, n as AnalystError, s as PlannerError } from "./errors-DodWX-cb.js";
3
- import { B as runAgentic, G as observe, K as renderReport, U as ObservationError, V as sample, X as strategyAuthorMethod, a as reconcileInterruptedSearchCalls, c as searchExecutor, q as profileChatClient, r as dedicatedLane, x as runtimeShipDecision, z as refine } from "./search-executor-B5ZVFsDV.js";
3
+ import { B as runAgentic, G as observe, K as renderReport, U as ObservationError, V as sample, X as strategyAuthorMethod, a as reconcileInterruptedSearchCalls, c as searchExecutor, q as profileChatClient, r as dedicatedLane, x as runtimeShipDecision, z as refine } from "./search-executor-DMX6tCY4.js";
4
4
  import { $ as randomSuffix, B as addSpend, H as chargedTokens, I as immutableCandidateValue, J as hasCompleteCacheBreakdown, K as errorMessage, M as canonicalCandidateDigest$1, R as sha256Bytes$1, U as cloneSpend, X as isAsyncIterable, Y as isAbortError, bt as armDeadlineTimer, ct as zeroSpend, k as markPutStreamVerified, nt as sleep, q as fnv1a32Hex, rt as stringifySafe, v as WorkspaceScanLimitError, x as captureMaterializedWorkspace } from "./workspace-streams-DkijayqX.js";
5
- import { c as profileModelExecutionSettings, i as concreteModelId, l as profileProviderModel, o as enforceTokenLimits, p as canonicalObservedModelParts, t as assertExecutableAgentProfile } from "./model-policy-DhvyZ8-O.js";
5
+ import { c as profileModelExecutionSettings, i as concreteModelId, l as profileProviderModel, o as enforceTokenLimits, p as canonicalObservedModelParts, t as assertExecutableAgentProfile } from "./model-policy-B-rOb8Nj.js";
6
6
  import { i as notifyRuntimeHookEvent } from "./runtime-hooks-tXpAarhW.js";
7
7
  import { i as redactProtectedValue, r as redactProtectedReason } from "./protected-redaction-DylCC_ot.js";
8
- import { C as createInMemoryRunContext, E as foldCoordinationRecords } from "./coordination-driver-DGhN8GO9.js";
9
- import { r as supervise } from "./supervise-CU6AuxWY.js";
8
+ import { C as createInMemoryRunContext, E as foldCoordinationRecords } from "./coordination-driver-DK3pI_HB.js";
9
+ import { r as supervise } from "./supervise-C41ywfFd.js";
10
10
  import "./run-layout-DSCWdbX2.js";
11
- import "./provision-supervisor-BQLLrUtn.js";
12
- import "./delegate-B5pmSbQa.js";
13
- import "./graph-G0j1ysqe.js";
11
+ import "./provision-supervisor-CunKnayY.js";
12
+ import "./delegate-Co9vJIgE.js";
13
+ import "./graph-DYBCYZjg.js";
14
14
  import { agentProfileSchema, canonicalAgentProfileDigest, canonicalCandidateDigest, sha256Bytes, validateAgentProfileSecurity } from "@tangle-network/agent-interface";
15
15
  import { CODING_HARNESSES, DEFAULT_TRACE_ANALYST_KINDS, InMemoryTraceStore, OUTPUT_VALUE, benjaminiHochberg, buildTrajectory, computeFindingId as computeFindingId$1, confidenceInterval, createTraceAnalyst, expandProfileAxes, makeFinding as makeFinding$1, pairedBootstrap, paretoFrontier, wilcoxonSignedRank, wilson } from "@tangle-network/agent-eval";
16
16
  import { createAgentRunOutcomeTracker } from "@tangle-network/sandbox/runtime";
@@ -29,7 +29,6 @@ import { defineEvaluationClaim, summarizeEvaluationUnits } from "@tangle-network
29
29
  import { createInterface } from "node:readline";
30
30
  import { pathToFileURL } from "node:url";
31
31
  import { gzipSync } from "node:zlib";
32
- import { createContext, runInContext } from "node:vm";
33
32
  import { stuckLoopView, toolWasteView } from "@tangle-network/agent-eval/pipelines";
34
33
  //#region src/runtime/tangle-sandbox-exact-process-provider.ts
35
34
  const exactProcessProviderMarker = "agent-runtime.exact-process-provider";
@@ -393,6 +392,165 @@ async function afterAbortCheck(signal, operation) {
393
392
  return result;
394
393
  }
395
394
  //#endregion
395
+ //#region src/runtime/http-mcp-client.ts
396
+ /**
397
+ * `connectHttpMcp` — the remote (streamable HTTP) MCP client, sibling of
398
+ * `connectStdioMcp`. Same connection contract (`tools`, `callTool`, `close`),
399
+ * same error semantics (a JSON-RPC error / `isError` result is the agent's
400
+ * `ERROR: …` outcome; a transport fault or timeout throws), no child process —
401
+ * which is the point: this is the MCP path for environments that cannot spawn
402
+ * stdio servers (Workers, browser-context agents, locked-down sandboxes) and
403
+ * for servers that only exist as endpoints (a remote Hindsight, a hosted MCP).
404
+ *
405
+ * Transport: MCP "streamable HTTP" (protocol 2025-03-26 / 2025-06-18). Every
406
+ * request is a POST with `Accept: application/json, text/event-stream`; the
407
+ * server may answer either shape, so both are parsed. A server-assigned
408
+ * `Mcp-Session-Id` response header is captured and replayed on every later
409
+ * request (and the DELETE on close) — stateful servers refuse without it,
410
+ * stateless ones simply never send it.
411
+ *
412
+ * Auth headers can be protected values: they are sent to the server but never
413
+ * allowed back out — error messages and tool results are redacted against the
414
+ * exact protected values, mirroring `connectStdioMcp`'s protectedEnv handling.
415
+ */
416
+ const HTTP_MCP_PROTOCOL_VERSION = "2025-06-18";
417
+ /** A remote MCP endpoint refused the connection before the handshake completed. */
418
+ var McpConnectFault = class extends Error {
419
+ status;
420
+ constructor(message, status) {
421
+ super(message);
422
+ this.status = status;
423
+ this.name = "McpConnectFault";
424
+ }
425
+ };
426
+ const SSE_DATA_LINE = /^data:\s?(.*)$/s;
427
+ function parseSseBody(body, wantId) {
428
+ for (const chunk of body.split(/\r?\n\r?\n/)) for (const line of chunk.split(/\r?\n/)) {
429
+ const match = SSE_DATA_LINE.exec(line);
430
+ if (!match) continue;
431
+ try {
432
+ const parsed = JSON.parse(match[1] ?? "");
433
+ if (parsed.id === wantId) return parsed;
434
+ } catch {}
435
+ }
436
+ }
437
+ function redactValuesFrom(text, values) {
438
+ let out = text;
439
+ for (const value of values) if (value.length > 0) out = out.split(value).join("[redacted]");
440
+ return out;
441
+ }
442
+ /** Connect to a remote MCP endpoint: initialize, list tools, return the live connection. */
443
+ async function connectHttpMcp(spec) {
444
+ let endpoint;
445
+ try {
446
+ endpoint = new URL(spec.url);
447
+ } catch {
448
+ throw new ValidationError(`connectHttpMcp: invalid MCP endpoint URL: ${spec.url}`);
449
+ }
450
+ if (endpoint.protocol !== "https:" && endpoint.hostname !== "localhost" && endpoint.hostname !== "127.0.0.1") throw new ValidationError(`connectHttpMcp: refusing non-HTTPS MCP endpoint ${endpoint.origin} (localhost excepted) — a bearer or api key on plain HTTP would cross the network in the clear`);
451
+ const fetchImpl = spec.fetchImpl ?? fetch;
452
+ const timeoutMs = spec.timeoutMs ?? 3e4;
453
+ const protectedValues = Object.values(spec.protectedHeaders ?? {});
454
+ const redact = (text) => redactValuesFrom(text, protectedValues);
455
+ let sessionId;
456
+ let nextId = 1;
457
+ let closed = false;
458
+ const post = async (path, body, method = "POST") => fetchImpl(`${endpoint.origin}${endpoint.pathname}${endpoint.search}${path}`, {
459
+ method,
460
+ headers: {
461
+ accept: "application/json, text/event-stream",
462
+ ...body !== void 0 ? { "content-type": "application/json" } : {},
463
+ ...sessionId !== void 0 ? { "mcp-session-id": sessionId } : {},
464
+ ...body !== void 0 ? { "x-request-id": String(nextId) } : {},
465
+ ...spec.headers ?? {},
466
+ ...spec.protectedHeaders ?? {}
467
+ },
468
+ ...body !== void 0 ? { body: JSON.stringify(body) } : {}
469
+ });
470
+ const request = async (method, params) => {
471
+ if (closed) throw new Error("HTTP MCP connection closed");
472
+ const id = nextId++;
473
+ const controller = new AbortController();
474
+ const timer = setTimeout(() => controller.abort(), timeoutMs);
475
+ try {
476
+ const res = await post("", {
477
+ jsonrpc: "2.0",
478
+ id,
479
+ method,
480
+ params
481
+ }, "POST");
482
+ const sessionHeader = res.headers.get("mcp-session-id");
483
+ if (sessionHeader) sessionId = sessionHeader;
484
+ if (!res.ok) {
485
+ const text = redact((await res.text()).slice(0, 500));
486
+ throw new McpConnectFault(`HTTP MCP ${method} failed (${res.status} ${res.statusText}): ${text}`, res.status);
487
+ }
488
+ if ((res.headers.get("content-type") ?? "").includes("text/event-stream")) {
489
+ const parsed = parseSseBody(await res.text(), id);
490
+ if (!parsed) throw new Error(`HTTP MCP ${method}: SSE response carried no JSON-RPC message for request ${id}`);
491
+ return parsed;
492
+ }
493
+ return JSON.parse(await res.text());
494
+ } catch (error) {
495
+ if (error instanceof McpConnectFault) throw error;
496
+ const reason = error instanceof Error ? error.message : String(error);
497
+ throw new Error(redact(`HTTP MCP ${method} transport failed: ${reason}`));
498
+ } finally {
499
+ clearTimeout(timer);
500
+ }
501
+ };
502
+ `${endpoint.origin}${endpoint.pathname}${timeoutMs}`;
503
+ try {
504
+ const init = await request("initialize", {
505
+ protocolVersion: HTTP_MCP_PROTOCOL_VERSION,
506
+ capabilities: {},
507
+ clientInfo: {
508
+ name: "agent-runtime-http-mcp",
509
+ version: "0"
510
+ }
511
+ });
512
+ if (init.error) throw new McpConnectFault(redact(`initialize errored: ${JSON.stringify(init.error)}`), void 0);
513
+ await post("", {
514
+ jsonrpc: "2.0",
515
+ method: "notifications/initialized"
516
+ }, "POST").catch(() => void 0);
517
+ const list = await request("tools/list", void 0);
518
+ if (list.error) throw new Error(redact(`tools/list errored: ${JSON.stringify(list.error)}`));
519
+ const rawTools = list.result?.tools;
520
+ if (!Array.isArray(rawTools)) throw new Error("tools/list result has no tools array");
521
+ const tools = JSON.parse(redact(JSON.stringify(rawTools)));
522
+ const callTool = async (name, args) => {
523
+ const res = await request("tools/call", {
524
+ name,
525
+ arguments: args
526
+ });
527
+ if (res.error) return `ERROR: ${redact(JSON.stringify(res.error)).slice(0, 300)}`;
528
+ const result = res.result;
529
+ const chunks = result?.content?.map((c) => c.text ?? "");
530
+ const joined = chunks?.join("\n") ?? JSON.stringify(result ?? null);
531
+ const collapsed = chunks?.join("");
532
+ let text = joined;
533
+ if (collapsed !== void 0) {
534
+ const collapsedRedacted = redact(collapsed);
535
+ if (collapsedRedacted !== collapsed) text = collapsedRedacted;
536
+ }
537
+ return redact(result?.isError ? `ERROR: ${text}` : text);
538
+ };
539
+ const close = async () => {
540
+ if (closed) return;
541
+ closed = true;
542
+ await post("", void 0, "DELETE").catch(() => void 0);
543
+ };
544
+ return {
545
+ tools,
546
+ callTool,
547
+ close
548
+ };
549
+ } catch (error) {
550
+ throw error instanceof Error ? error : new Error(String(error));
551
+ }
552
+ }
553
+ //#endregion
396
554
  //#region src/runtime/key-provider.ts
397
555
  /** The env-backed provider: reads the (dotenvx-loaded) process env. Empty /
398
556
  * whitespace-only values count as absent — fail loud, not with a blank key. */
@@ -793,6 +951,34 @@ async function connectStdioMcp(spec) {
793
951
  * child and expose its tools under `<server>__<tool>` names. The default policy
794
952
  * refuses local processes. A profile with no MCP surface returns zero tools.
795
953
  */
954
+ /** Resolve a remote server's `url` + `headers` profile config values into the
955
+ * plain strings + protected headers an HTTP connection needs. Same fail-closed
956
+ * contract as `resolveMcpServerLaunch`: no KeyProvider for a declared secret, or
957
+ * a missing key, aborts the materialization naming the KEY only. */
958
+ async function resolveRemoteMcpHeaders(server, keys, label) {
959
+ if (typeof server.url !== "string" || server.url.trim().length === 0) throw new ValidationError(`${label}: a remote (http/sse) server requires url`);
960
+ const headers = {};
961
+ const protectedHeaders = {};
962
+ for (const [name, value] of Object.entries(server.headers ?? {})) if (value.kind === "public") headers[name] = value.value ?? "";
963
+ else {
964
+ if (!keys) throw new ValidationError(`${label}: header ${name} is a secret-ref but no KeyProvider was supplied — refusing to connect a remote server with unresolvable auth`);
965
+ const secret = await keys.get(value.key ?? "");
966
+ if (secret === void 0) throw new ValidationError(`${label}: the KeyProvider holds no value for '${value.key}' (wanted for header ${name}) — provision the key or drop the header`);
967
+ protectedHeaders[name] = value.format === "bearer" ? `Bearer ${secret}` : secret;
968
+ }
969
+ return {
970
+ url: server.url,
971
+ ...Object.keys(headers).length > 0 ? { headers } : {},
972
+ ...Object.keys(protectedHeaders).length > 0 ? { protectedHeaders } : {}
973
+ };
974
+ }
975
+ /**
976
+ * Spawn every enabled stdio server in `profile.mcp` and expose their tools as
977
+ * `<server>__<tool>` behind one route and close facade.
978
+ *
979
+ * Fails closed: a declared server that cannot boot throws, so a profile is never
980
+ * scored as if it had no MCP surface.
981
+ */
796
982
  async function materializeLocalMcp(profile, opts = {}) {
797
983
  const security = validateAgentProfileSecurity(profile, opts.profileSecurityPolicy);
798
984
  if (!security.ok) throw new ValidationError(`materializeLocalMcp: profile host execution refused: ${security.issues.filter((issue) => issue.level === "error").map((issue) => issue.message).join("; ")}`);
@@ -807,7 +993,35 @@ async function materializeLocalMcp(profile, opts = {}) {
807
993
  for (const [key, server] of Object.entries(profile.mcp ?? {})) {
808
994
  if (server.enabled === false) continue;
809
995
  const transport = server.transport ?? "stdio";
810
- if (transport !== "stdio") throw new ValidationError(`materializeLocalMcp: profile.mcp['${key}'] has transport '${transport}' — the same-host client only spawns stdio servers; a remote (http/sse) server needs an http MCP client (not yet built here) or the sandbox backend. Failing loud: scoring this profile without its declared server would fake the with/without ablation`);
996
+ if (transport === "http" || transport === "sse") {
997
+ const { url, headers, protectedHeaders } = await resolveRemoteMcpHeaders(server, opts.keys, `materializeLocalMcp: profile.mcp['${key}']`);
998
+ const conn = await connectHttpMcp({
999
+ url,
1000
+ ...headers !== void 0 ? { headers } : {},
1001
+ ...protectedHeaders !== void 0 ? { protectedHeaders } : {},
1002
+ ...opts.timeoutMs !== void 0 ? { timeoutMs: opts.timeoutMs } : {}
1003
+ });
1004
+ connections.push(conn);
1005
+ const prefix = key.replace(/[^a-zA-Z0-9_-]/g, "_");
1006
+ for (const t of conn.tools) {
1007
+ const name = `${prefix}__${t.name.replace(/[^a-zA-Z0-9_-]/g, "_")}`;
1008
+ if (routes.has(name)) throw new ValidationError(`materializeLocalMcp: namespaced tool '${name}' collides across servers — rename the profile.mcp keys`);
1009
+ routes.set(name, {
1010
+ conn,
1011
+ tool: t.name
1012
+ });
1013
+ tools.push({
1014
+ type: "function",
1015
+ function: {
1016
+ name,
1017
+ description: (t.description ?? "").slice(0, 1e3),
1018
+ parameters: sanitizeMcpToolSchema(t.inputSchema)
1019
+ }
1020
+ });
1021
+ }
1022
+ continue;
1023
+ }
1024
+ if (transport !== "stdio") throw new ValidationError(`materializeLocalMcp: profile.mcp['${key}'] has unsupported transport '${transport}'`);
811
1025
  if (!server.command || server.command.trim().length === 0) throw new ValidationError(`materializeLocalMcp: profile.mcp['${key}'] declares a stdio server with no command`);
812
1026
  const launch = await resolveMcpServerLaunch(server, opts.keys, `materializeLocalMcp: profile.mcp['${key}']`);
813
1027
  const conn = await connectStdioMcp({
@@ -2745,6 +2959,8 @@ function localSandboxClient(opts) {
2745
2959
  const r = await runBrainLoop({
2746
2960
  chat,
2747
2961
  tools: mcp.tools,
2962
+ ...opts.codeMode ? { codeMode: opts.codeMode } : {},
2963
+ ...popts?.signal ? { signal: popts.signal } : {},
2748
2964
  execute: (name, args) => mcp.call(name, args),
2749
2965
  initialMessages: [...system ? [{
2750
2966
  role: "system",
@@ -2760,7 +2976,7 @@ function localSandboxClient(opts) {
2760
2976
  type: "llm_call",
2761
2977
  data: {
2762
2978
  model,
2763
- tools: mcp.tools.map((t) => t.function.name),
2979
+ tools: r.modelToolNames ?? mcp.tools.map((t) => t.function.name),
2764
2980
  ...r.tokensKnown === false ? { tokensKnown: false } : {
2765
2981
  tokensIn: r.usage.input,
2766
2982
  tokensOut: r.usage.output
@@ -5953,9 +6169,8 @@ function hashText(value) {
5953
6169
  /**
5954
6170
  * The ONE lint over model-authored source.
5955
6171
  *
5956
- * Two features have a model write code the runtime then runs: `authorStrategy` (an authored
5957
- * optimization strategy, since 0.60) and code mode's `execute` (a program over the coordination
5958
- * verbs). Both need the same refusals; this module is the single copy both import.
6172
+ * Authored optimization strategies use this static contract lint. General Runtime code-mode
6173
+ * scripts execute in the isolated QuickJS/WASM engine instead of relying on source lint.
5959
6174
  *
5960
6175
  * A LINT, NOT A SANDBOX — it reads text and cannot constrain what running code does, and trivial
5961
6176
  * concatenation defeats any token match. Its only job is refusing the obvious escapes so a typo or
@@ -6901,278 +7116,6 @@ function chatWorkerSeam(opts) {
6901
7116
  };
6902
7117
  }
6903
7118
  //#endregion
6904
- //#region src/runtime/supervise/code-mode.ts
6905
- /**
6906
- * Code mode — the pattern Cloudflare ("Code Mode") and Anthropic ("code execution with MCP")
6907
- * define, over this runtime's coordination verbs: generate a typed API from the tools' schemas,
6908
- * expose exactly two tools (`search`, `execute`), and run model-written code whose only intended
6909
- * capability is the API bindings. One model turn where the tool-calling loop pays one round trip
6910
- * per call; intermediates live in the program, not the context window.
6911
- *
6912
- * WHAT THIS RUNTIME OWNS AND THE SOURCES' CENTRAL PROPERTY — read this before choosing a runner.
6913
- * The sources isolate execution in a REAL boundary: Cloudflare runs the code in a V8 isolate with
6914
- * a separate heap; Anthropic runs it out of process. That is not a detail — it is the whole reason
6915
- * "let the model write code" is safe. This runtime does NOT ship an isolate, so `execute`'s
6916
- * execution boundary is a SEAM you must fill: `codeModeSupervisorTools(runner)` REQUIRES a
6917
- * `CodeModeRunner`, and there is no default. For untrusted model output, supply a jailed runner
6918
- * (a sub-sandbox, a worker isolate). {@link unsafeInProcessRunner} is provided for TRUSTED output
6919
- * only — your own eval harness, an offline test, a model you control — and is named for what it is:
6920
- * `node:vm` shares the host realm, so host code is reachable from inside it and it is not a
6921
- * security boundary. Choosing it for a hostile model is remote code execution, by construction.
6922
- *
6923
- * WHAT IS GENUINELY THIS RUNTIME'S CONTRIBUTION, and survives audit: every call the program makes
6924
- * crosses the IDENTICAL kernel path an MCP verb crosses. Bindings dispatch through `context.verbs`
6925
- * → the live coordination descriptor's own handler → authorization, the conserved pool, the
6926
- * journal ("there is no second spawn path"). The model authors a workflow as code at runtime and
6927
- * the kernel still meters and records every edge of it — a dynamic workflow system, not a bypass.
6928
- * Verb RESULTS are detached (JSON round-trip) before they re-enter the program, so in-code calls
6929
- * cannot mutate live coordination state the MCP transport would have copied.
6930
- *
6931
- * WHAT STAYS THE MODEL'S: `submit_result`, `stop`, `ask_parent` are never in the API — a program
6932
- * that could settle the run would be a second brain. `search` names them and says why. Code does
6933
- * the mechanics; the model keeps the judgment, the same split the sources draw.
6934
- *
6935
- * THE GRANT CANNOT DRIFT FROM THE DOCS: `search` renders from `context.coordinationTools()`, the
6936
- * same descriptor objects the verbs are served from — never prose written beside them.
6937
- */
6938
- /** The coordination verbs callable in code, and the `context.verbs` member each maps to. */
6939
- const CODE_CALLABLE_VERBS = {
6940
- spawn_worker: "spawnAgent",
6941
- await_settlement: "awaitSettlement",
6942
- steer_agent: "steerAgent",
6943
- observe_agent: "observeAgent",
6944
- list_questions: "listQuestions",
6945
- answer_question: "answerQuestion",
6946
- run_analyst: "runAnalyst",
6947
- read_journal: "readJournal",
6948
- define_analyst: "defineAnalyst"
6949
- };
6950
- /** A program that spawns may join what it spawned. Not an MCP tool: a manager waits by ending its
6951
- * turn, and only code inside one call needs to wait in place. */
6952
- const AWAIT_SETTLEMENT_FACE = Object.freeze({
6953
- name: "await_settlement",
6954
- description: "Wait until at least one of the named workers has settled; returns { settled: [ids] }. Read each output with observe_agent. Takes nothing from your inbox, so you still hear of each settlement when you are woken.",
6955
- inputSchema: {
6956
- type: "object",
6957
- properties: { workerIds: {
6958
- type: "array",
6959
- items: { type: "string" }
6960
- } },
6961
- required: ["workerIds"]
6962
- }
6963
- });
6964
- /** The manager's own lifecycle verbs — never callable from code; `search` names them and why. */
6965
- const LIFECYCLE_VERBS = [
6966
- "submit_result",
6967
- "stop",
6968
- "ask_parent"
6969
- ];
6970
- /** Render a JSON Schema as TypeScript type text. Bounded and structural: enough for tool input
6971
- * schemas (objects, enums, arrays, unions); anything unrecognized renders `unknown`, never a
6972
- * guess. Module-level (not root) export: consumed by `renderCodeModeApi` and its tests only. */
6973
- function renderJsonSchemaType(schema, depth = 0) {
6974
- if (depth > 6 || typeof schema !== "object" || schema === null) return "unknown";
6975
- const node = schema;
6976
- if (node.const !== void 0) return JSON.stringify(node.const);
6977
- if (Array.isArray(node.enum)) return node.enum.map((value) => JSON.stringify(value)).join(" | ");
6978
- const variants = node.anyOf ?? node.oneOf;
6979
- if (Array.isArray(variants)) return variants.map((variant) => renderJsonSchemaType(variant, depth + 1)).join(" | ");
6980
- const type = Array.isArray(node.type) ? node.type : [node.type];
6981
- if (type.includes("object") || node.type === void 0 && node.properties !== void 0) {
6982
- const properties = node.properties ?? {};
6983
- const required = new Set(Array.isArray(node.required) ? node.required : []);
6984
- const fields = Object.entries(properties).map(([name, property]) => {
6985
- const doc = describeSchema(property);
6986
- const optional = required.has(name) ? "" : "?";
6987
- return `${doc}${JSON.stringify(name).slice(1, -1)}${optional}: ${renderJsonSchemaType(property, depth + 1)}`;
6988
- });
6989
- if (fields.length === 0) return "Record<string, unknown>";
6990
- const indent = " ".repeat(depth + 1);
6991
- return `{\n${fields.map((field) => `${indent}${field}`).join("\n")}\n${" ".repeat(depth)}}`;
6992
- }
6993
- if (type.includes("array")) return `Array<${renderJsonSchemaType(node.items, depth + 1)}>`;
6994
- const primitives = type.map((entry) => entry === "integer" ? "number" : typeof entry === "string" ? entry : void 0).filter((entry) => entry === "string" || entry === "number" || entry === "boolean" || entry === "null");
6995
- return primitives.length > 0 ? primitives.join(" | ") : "unknown";
6996
- }
6997
- function describeSchema(schema) {
6998
- const description = typeof schema === "object" && schema !== null ? schema.description : void 0;
6999
- if (typeof description !== "string" || description.length === 0) return "";
7000
- const first = description.split("\n")[0] ?? "";
7001
- return `/** ${first.length > 140 ? `${first.slice(0, 140)}…` : first} */ `;
7002
- }
7003
- /** Render the callable API from tool faces — `declare function` per tool, doc from its own
7004
- * description. This is the text `search` answers; generated, never hand-written. Module-level
7005
- * export for tests. */
7006
- function renderCodeModeApi(tools, query) {
7007
- const needle = query?.trim().toLowerCase();
7008
- const blocks = tools.filter((tool) => !needle || tool.name.toLowerCase().includes(needle) || (tool.description ?? "").toLowerCase().includes(needle)).map((tool) => {
7009
- const doc = (tool.description ?? "").split("\n")[0] ?? "";
7010
- const args = tool.inputSchema === void 0 ? "unknown" : renderJsonSchemaType(tool.inputSchema);
7011
- return `/** ${doc} */\ndeclare function ${tool.name}(args: ${args}): Promise<unknown>`;
7012
- });
7013
- const header = [
7014
- "// Call these as `api.<name>(args)` from code passed to `execute`.",
7015
- "// Results are the same JSON the tools return. Intermediates stay in your program;",
7016
- "// return only what the next decision needs.",
7017
- `// NOT callable from code: ${LIFECYCLE_VERBS.join(", ")} — those are your own tools,`,
7018
- "// because a program that could settle the run would be a second brain."
7019
- ].join("\n");
7020
- if (blocks.length === 0) return `${header}\n\n// No API member matches ${JSON.stringify(query ?? "")}. Call search with no query for the full API.`;
7021
- return `${header}\n\n${blocks.join("\n\n")}`;
7022
- }
7023
- /**
7024
- * An in-process runner for TRUSTED model output ONLY. NOT a security boundary.
7025
- *
7026
- * It runs the program in a `node:vm` context whose globals are the bindings (`api`) and a
7027
- * capturing `console`, with code generation disabled and inherited properties stripped. Those are
7028
- * capability discipline, not containment: `node:vm` shares the host realm, and a host function's
7029
- * `.constructor` is the host `Function`, so code that WANTS out can get out
7030
- * (`api.<binding>.constructor('return process')()`). Use this for your own eval harness, offline
7031
- * tests, or a model you trust; for untrusted output supply a jailed `CodeModeRunner` instead.
7032
- */
7033
- function unsafeInProcessRunner() {
7034
- return { async run({ code, bindings, signal }) {
7035
- const logs = [];
7036
- const capture = (level) => (...args) => {
7037
- const line = args.map((value) => typeof value === "string" ? value : safeJson(value)).join(" ");
7038
- if (logs.length < 200) logs.push(level === "log" ? line : `[${level}] ${line}`);
7039
- };
7040
- const target = Object.create(null);
7041
- for (const [name, fn] of Object.entries(bindings)) target[name] = fn;
7042
- const sandbox = Object.create(null);
7043
- sandbox.api = new Proxy(Object.freeze(target), { get(owned, member) {
7044
- if (typeof member !== "string") return void 0;
7045
- if (Object.hasOwn(owned, member)) return owned[member];
7046
- throw new ValidationError(LIFECYCLE_VERBS.includes(member) ? `code mode: api.${member} is not callable from code — it is the manager's own lifecycle verb; return from your program and call it as a tool` : `code mode: api.${member} is not in the granted API — call search to see what is`);
7047
- } });
7048
- sandbox.console = Object.freeze({
7049
- log: capture("log"),
7050
- warn: capture("warn"),
7051
- error: capture("error")
7052
- });
7053
- const context = createContext(sandbox, { codeGeneration: {
7054
- strings: false,
7055
- wasm: false
7056
- } });
7057
- const program = runInContext(`(async () => {\n${code}\n})()`, context);
7058
- const aborted = new Promise((_resolve, reject) => {
7059
- if (signal.aborted) reject(abortReason(signal));
7060
- else signal.addEventListener("abort", () => reject(abortReason(signal)), { once: true });
7061
- });
7062
- return {
7063
- result: await Promise.race([program, aborted]) ?? null,
7064
- logs
7065
- };
7066
- } };
7067
- }
7068
- function abortReason(signal) {
7069
- const reason = signal.reason;
7070
- return reason instanceof Error ? reason : new ValidationError("code mode: program aborted");
7071
- }
7072
- function safeJson(value) {
7073
- try {
7074
- return JSON.stringify(value) ?? String(value);
7075
- } catch {
7076
- return String(value);
7077
- }
7078
- }
7079
- /** Detach a verb result before it re-enters the program — the deep copy the MCP transport makes,
7080
- * so in-code calls cannot mutate live coordination state. Matches the MCP path exactly (both
7081
- * JSON round-trip); a non-serializable result degrades to a marker rather than leaking a live
7082
- * reference. */
7083
- function detach(value) {
7084
- if (value === void 0) return void 0;
7085
- try {
7086
- return JSON.parse(JSON.stringify(value));
7087
- } catch {
7088
- return { nonSerializable: true };
7089
- }
7090
- }
7091
- /**
7092
- * Put a supervisor in code mode: its product tool surface becomes exactly `search` and `execute`.
7093
- *
7094
- * `runner` is REQUIRED and has no default — this runtime ships no isolate, so the execution
7095
- * boundary is the caller's explicit choice (see the module doc). Use {@link unsafeInProcessRunner}
7096
- * for trusted output; a jailed runner for untrusted models.
7097
- *
7098
- * Pass the result as `SuperviseOptions.resolveSupervisorTools` (which `runGraph` forwards to its
7099
- * root supervisor). The graph engine's `supervisorKind` does not accept it yet, so a graph
7100
- * supervisor node cannot be put in code mode through node config today.
7101
- */
7102
- function codeModeSupervisorTools(runner, options = {}) {
7103
- if (runner === void 0 || typeof runner.run !== "function") throw new ValidationError("codeModeSupervisorTools: a CodeModeRunner is required (no default) — pass unsafeInProcessRunner() for trusted output, or a jailed runner for untrusted models");
7104
- const timeoutMs = options.timeoutMs ?? null;
7105
- if (timeoutMs !== null && (!Number.isSafeInteger(timeoutMs) || timeoutMs <= 0)) throw new ValidationError("codeModeSupervisorTools: timeoutMs must be a positive safe integer or null");
7106
- const faces = (context) => {
7107
- const granted = context.coordinationTools().filter((tool) => CODE_CALLABLE_VERBS[tool.name] !== void 0);
7108
- return granted.some((tool) => tool.name === "spawn_worker") ? [...granted, AWAIT_SETTLEMENT_FACE] : granted;
7109
- };
7110
- return () => [{
7111
- name: "search",
7112
- description: "Search the callable API. Returns TypeScript declarations for the operations your code may call, generated from the live grant. Optional `query` filters by name or description; omit it for the full API.",
7113
- inputSchema: {
7114
- type: "object",
7115
- properties: { query: {
7116
- type: "string",
7117
- description: "Substring filter over names and descriptions."
7118
- } }
7119
- },
7120
- handler: async (raw, context) => {
7121
- const query = typeof raw === "object" && raw !== null ? raw.query : void 0;
7122
- return renderCodeModeApi(faces(context), typeof query === "string" ? query : void 0);
7123
- }
7124
- }, {
7125
- name: "execute",
7126
- description: "Run JavaScript against the API from `search`. Write the BODY of an async function: call `api.<name>(args)` (await each call), use loops and Promise.all for fan-out, keep intermediates in variables, `return` only what the next decision needs. `console.log` lines come back beside the result. No imports, no network, no filesystem — the API is the intended capability.",
7127
- inputSchema: {
7128
- type: "object",
7129
- properties: { code: {
7130
- type: "string",
7131
- description: "The async function body to run."
7132
- } },
7133
- required: ["code"]
7134
- },
7135
- handler: async (raw, context) => {
7136
- const code = typeof raw === "object" && raw !== null ? raw.code : void 0;
7137
- if (typeof code !== "string" || code.trim().length === 0) throw new ValidationError("code mode: execute needs { code: string }");
7138
- assertAuthoredCode(code, { context: `code mode (${context.nodeId})` });
7139
- const execution = new AbortController();
7140
- let timedOut = false;
7141
- const onScopeAbort = () => execution.abort(abortReason(context.signal));
7142
- const clearTimer = timeoutMs === null ? void 0 : armDeadlineTimer(timeoutMs, () => {
7143
- if (!execution.signal.aborted) {
7144
- timedOut = true;
7145
- execution.abort(new ValidationError(`code mode: program timed out after ${timeoutMs}ms`));
7146
- }
7147
- }, true);
7148
- if (context.signal.aborted) execution.abort(abortReason(context.signal));
7149
- else context.signal.addEventListener("abort", onScopeAbort, { once: true });
7150
- const bindings = {};
7151
- for (const face of faces(context)) {
7152
- const member = CODE_CALLABLE_VERBS[face.name];
7153
- if (member === void 0) continue;
7154
- bindings[face.name] = async (args) => {
7155
- if (execution.signal.aborted) {
7156
- if (!timedOut) throw abortReason(execution.signal);
7157
- throw new ValidationError(`code mode: the execute deadline passed; api.${face.name} is refused so no work outlives the call`);
7158
- }
7159
- return detach(await context.verbs[member](args));
7160
- };
7161
- }
7162
- try {
7163
- return await runner.run({
7164
- code,
7165
- bindings,
7166
- signal: execution.signal
7167
- });
7168
- } finally {
7169
- clearTimer?.();
7170
- context.signal.removeEventListener("abort", onScopeAbort);
7171
- }
7172
- }
7173
- }];
7174
- }
7175
- //#endregion
7176
7119
  //#region src/runtime/supervise/patch-checks.ts
7177
7120
  const DEFAULT_MAX_DIFF_LINES = 400;
7178
7121
  /**
@@ -8587,6 +8530,6 @@ function tail(s) {
8587
8530
  return s.slice(-400);
8588
8531
  }
8589
8532
  //#endregion
8590
- export { renderCorpusToInstructions as $, chatWorkerSeam as A, completionAuthorizes as At, createS3PrivateCasStore as B, SqlRunOwnershipError as Bt, analyzeTrace as C, assertDeclaredCheck as Ct, codeModeSupervisorTools as D, declaredCheckJudge as Dt, runCoderChecks as E, declaredCheckDigest as Et, authorStrategy as F, pairwiseSignificance as Ft, trajectoryReport as G, createMcpEnvironment as Gt, runBenchmark as H, McpSpawnFault as Ht, strategyAuthorContract as I, renderLeaderboardHtml as It, builtinShapes as J, mcpSecretEnvMetadataKey as Jt, definePersona as K, sanitizeMcpToolSchema as Kt, strategyAuthorSystemPrompt as L, renderLeaderboardMarkdown as Lt, runStrategyEvolution as M, sentinelCompletion as Mt, strategyTournament as N, stopSentinel as Nt, unsafeInProcessRunner as O, readDeclaredCheck as Ot, assertStrategyContract as P, leaderboard as Pt, InMemoryCorpus as Q, createTangleSandboxExactProcessProvider as Qt, SandboxRunAbortError as R, renderLeaderboardSvg as Rt, withUntrackedArtifacts as S, superviseDispatch as St, patchDelivered as T, declaredCheckDeliverable as Tt, createPrivateCasArtifactPort as U, connectStdioMcp as Ut, printBenchmarkReport as V, openSqlRunStore as Vt, equalKOnCost as W, materializeLocalMcp as Wt, registerShape as X, resolveSecretEnv as Xt, createShapeRegistry as Y, resolveMcpServerLaunch as Yt, FileCorpus as Z, secretEnvOfMcpServer as Zt, VERIFY_TAIL_CHARS as _, resolveSandboxClient as _t, localShell as a, selectValidWinner as at, settledWorkerOut as b, loopCampaignDispatch as bt, createVerifierEnvironment as c, assertTraceDerivedFindings as ct, harvestSurfaceDiffs as d, registryScopeAnalyst as dt, fanout as et, analystsFromRegistry as f, observationFromRegistry as ft, NOTE_MAX_CHARS as g, defineLeaderboard as gt, EVIDENCE_MAX_CHARS as h, harvestCorpus as ht, jjWorkspace as i, pipeline as it, createChatSessionStore as j, deterministicCompletion as jt, chatTransportExecutor as k, runIsolatedCheck as kt, boxSurfaceReader as l, buildSteerContext as lt, worktreeFanout as m, HarvestError as mt, makeFinding$1 as n, loopUntil as nt, runInWorkspace as o, verify as ot, failuresAnalyst as p, inProcessSandboxClient as pt, runPersonified as q, envKeyProvider as qt, gitWorkspace as r, panel as rt, createWaterfallCollector as s, widen as st, computeFindingId$1 as t, flatWidenGate as tt, fsSurfaceReader as u, createScopeAnalyst as ut, closingWorkerNote as v, localSandboxClient as vt, createFencedSqlRunContext as w, checkProgramDigest as wt, copyUntrackedIntoClone as x, loopDispatch as xt, composeWorkerEvidence as y, inlineSandboxClient as yt, openSandboxRun as z, renderPairwiseMarkdown as zt };
8533
+ export { flatWidenGate as $, runStrategyEvolution as A, sentinelCompletion as At, runBenchmark as B, McpSpawnFault as Bt, analyzeTrace as C, declaredCheckDeliverable as Ct, chatTransportExecutor as D, runIsolatedCheck as Dt, runCoderChecks as E, readDeclaredCheck as Et, strategyAuthorSystemPrompt as F, renderLeaderboardMarkdown as Ft, runPersonified as G, envKeyProvider as Gt, equalKOnCost as H, materializeLocalMcp as Ht, SandboxRunAbortError as I, renderLeaderboardSvg as It, registerShape as J, resolveSecretEnv as Jt, builtinShapes as K, mcpSecretEnvMetadataKey as Kt, openSandboxRun as L, renderPairwiseMarkdown as Lt, assertStrategyContract as M, leaderboard as Mt, authorStrategy as N, pairwiseSignificance as Nt, chatWorkerSeam as O, completionAuthorizes as Ot, strategyAuthorContract as P, renderLeaderboardHtml as Pt, fanout as Q, createS3PrivateCasStore as R, SqlRunOwnershipError as Rt, withUntrackedArtifacts as S, checkProgramDigest as St, patchDelivered as T, declaredCheckJudge as Tt, trajectoryReport as U, createMcpEnvironment as Ut, createPrivateCasArtifactPort as V, connectStdioMcp as Vt, definePersona as W, sanitizeMcpToolSchema as Wt, InMemoryCorpus as X, createTangleSandboxExactProcessProvider as Xt, FileCorpus as Y, secretEnvOfMcpServer as Yt, renderCorpusToInstructions as Z, VERIFY_TAIL_CHARS as _, inlineSandboxClient as _t, localShell as a, widen as at, settledWorkerOut as b, superviseDispatch as bt, createVerifierEnvironment as c, createScopeAnalyst as ct, harvestSurfaceDiffs as d, inProcessSandboxClient as dt, loopUntil as et, analystsFromRegistry as f, HarvestError as ft, NOTE_MAX_CHARS as g, localSandboxClient as gt, EVIDENCE_MAX_CHARS as h, resolveSandboxClient as ht, jjWorkspace as i, verify as it, strategyTournament as j, stopSentinel as jt, createChatSessionStore as k, deterministicCompletion as kt, boxSurfaceReader as l, registryScopeAnalyst as lt, worktreeFanout as m, defineLeaderboard as mt, makeFinding$1 as n, pipeline as nt, runInWorkspace as o, assertTraceDerivedFindings as ot, failuresAnalyst as p, harvestCorpus as pt, createShapeRegistry as q, resolveMcpServerLaunch as qt, gitWorkspace as r, selectValidWinner as rt, createWaterfallCollector as s, buildSteerContext as st, computeFindingId$1 as t, panel as tt, fsSurfaceReader as u, observationFromRegistry as ut, closingWorkerNote as v, loopCampaignDispatch as vt, createFencedSqlRunContext as w, declaredCheckDigest as wt, copyUntrackedIntoClone as x, assertDeclaredCheck as xt, composeWorkerEvidence as y, loopDispatch as yt, printBenchmarkReport as z, openSqlRunStore as zt };
8591
8534
 
8592
- //# sourceMappingURL=runtime-B9BOFyEp.js.map
8535
+ //# sourceMappingURL=runtime-UG5tV_yf.js.map