@finalai/agent-definition 0.5.1 → 0.6.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 (90) hide show
  1. package/HOSTING.md +4 -4
  2. package/THIRD_PARTY_NOTICES.md +1 -1
  3. package/dist/compiler-assets/{chunk-FU5VHNO4.ts → chunk-3R7MNW5L.ts} +1 -1
  4. package/dist/compiler-assets/{chunk-7KPWSOMK.ts → chunk-3SDZJK7K.ts} +1 -1
  5. package/dist/compiler-assets/{chunk-KTXTYIF4.ts → chunk-4A4EQHYK.ts} +57 -20
  6. package/dist/compiler-assets/{chunk-LZSLGWS7.ts → chunk-4MJF3ALN.ts} +5 -5
  7. package/dist/compiler-assets/{chunk-QVHDGZAN.ts → chunk-4T2URCJZ.ts} +2 -2
  8. package/dist/compiler-assets/{chunk-7MDGEPFT.ts → chunk-6K3WO73F.ts} +1 -1
  9. package/dist/compiler-assets/{chunk-KMBQVNAJ.ts → chunk-AMYJRTAC.ts} +3 -3
  10. package/dist/compiler-assets/{chunk-4T2XPIPH.ts → chunk-BHNF7BEJ.ts} +86 -17
  11. package/dist/compiler-assets/{chunk-U3MFLFVF.ts → chunk-CORCFNEY.ts} +3 -3
  12. package/dist/compiler-assets/{chunk-4ERFBLH7.ts → chunk-DRHDNSCQ.ts} +4 -4
  13. package/dist/compiler-assets/{chunk-O3JKMLDP.ts → chunk-EKR4AEM5.ts} +3 -3
  14. package/dist/compiler-assets/{chunk-MBX6PIN7.ts → chunk-FE7PIPSW.ts} +57 -10
  15. package/dist/compiler-assets/{chunk-YEKSPL76.ts → chunk-FFI2K5IJ.ts} +4 -4
  16. package/dist/compiler-assets/{chunk-36MVFRMA.ts → chunk-IZJMGIAH.ts} +2 -2
  17. package/dist/compiler-assets/{chunk-KTBNDKGJ.ts → chunk-JZTF36V2.ts} +2 -1
  18. package/dist/compiler-assets/{chunk-XJNO7EHQ.ts → chunk-KNYB36DW.ts} +2 -2
  19. package/dist/compiler-assets/{chunk-O2JWY454.ts → chunk-L7YJCQVB.ts} +4 -4
  20. package/dist/compiler-assets/{chunk-WJPAUIVM.ts → chunk-LGGJ6S3U.ts} +1 -1
  21. package/dist/compiler-assets/{chunk-BMX2HP6G.ts → chunk-LIRONA4O.ts} +6 -6
  22. package/dist/compiler-assets/{chunk-GIRUQ7QF.ts → chunk-MM4JCZSK.ts} +7 -7
  23. package/dist/compiler-assets/{chunk-VI5WBWUX.ts → chunk-MPZMRU56.ts} +4 -4
  24. package/dist/compiler-assets/chunk-PLQKTBKO.ts +27 -0
  25. package/dist/compiler-assets/{chunk-EAEQQT33.ts → chunk-Q26ZPNVB.ts} +25 -9
  26. package/dist/compiler-assets/{chunk-Z7HGOUC2.ts → chunk-RTC7AJBS.ts} +1 -1
  27. package/dist/compiler-assets/{chunk-OX46N5EP.ts → chunk-TCXQ4GLM.ts} +1 -1
  28. package/dist/compiler-assets/{chunk-R4IHPPTB.ts → chunk-UUQAHJRT.ts} +2 -2
  29. package/dist/compiler-assets/{chunk-KNFPKVUS.ts → chunk-XCX6VAK7.ts} +1 -1
  30. package/dist/compiler-assets/{chunk-OBFQTLWC.ts → chunk-Y73DOSSB.ts} +3 -3
  31. package/dist/compiler-assets/{chunk-VRW24MOJ.ts → chunk-YAO6DUQO.ts} +4 -4
  32. package/dist/compiler-assets/src/authoring/agent.ts +4 -4
  33. package/dist/compiler-assets/src/authoring/approval.ts +7 -7
  34. package/dist/compiler-assets/src/authoring/brand.ts +3 -3
  35. package/dist/compiler-assets/src/authoring/channels.ts +6 -8
  36. package/dist/compiler-assets/src/authoring/connections.ts +11 -11
  37. package/dist/compiler-assets/src/authoring/credentials.ts +7 -7
  38. package/dist/compiler-assets/src/authoring/dynamic.ts +8 -8
  39. package/dist/compiler-assets/src/authoring/harness.ts +9 -9
  40. package/dist/compiler-assets/src/authoring/hooks.ts +10 -10
  41. package/dist/compiler-assets/src/authoring/index.ts +27 -26
  42. package/dist/compiler-assets/src/authoring/instructions.ts +9 -9
  43. package/dist/compiler-assets/src/authoring/sandbox.ts +11 -11
  44. package/dist/compiler-assets/src/authoring/schedules.ts +4 -4
  45. package/dist/compiler-assets/src/authoring/skills.ts +4 -4
  46. package/dist/compiler-assets/src/authoring/tools.ts +9 -9
  47. package/dist/compiler-assets/src/compatibility.ts +6 -6
  48. package/dist/compiler-assets/src/hosted-bindings.ts +6 -6
  49. package/dist/compiler-assets/src/index.ts +28 -27
  50. package/dist/compiler-assets/src/manifest.ts +4 -4
  51. package/dist/compiler-assets/src/resolve.ts +5 -5
  52. package/dist/compiler-assets/src/runtime/bundle.ts +17 -18
  53. package/dist/compiler-assets/src/runtime/describe.ts +14 -14
  54. package/dist/compiler-assets/src/runtime/described.ts +28 -16
  55. package/dist/compiler-assets/src/runtime/isolate.ts +16 -17
  56. package/dist/compiler-assets/src/runtime/lower.ts +13 -13
  57. package/dist/compiler-assets/src/runtime/schema-validation.ts +4 -4
  58. package/dist/compiler-assets/src/runtime/values.ts +2 -2
  59. package/dist/modules/authoring/agent.d.mts +25 -1
  60. package/dist/modules/authoring/agent.mjs.map +2 -2
  61. package/dist/modules/authoring/brand.d.mts +1 -0
  62. package/dist/modules/authoring/brand.mjs +1 -0
  63. package/dist/modules/authoring/brand.mjs.map +2 -2
  64. package/dist/modules/authoring/channels.d.mts +13 -96
  65. package/dist/modules/authoring/channels.mjs +6 -52
  66. package/dist/modules/authoring/channels.mjs.map +3 -3
  67. package/dist/modules/authoring/index.d.mts +1 -1
  68. package/dist/modules/authoring/index.mjs +2 -0
  69. package/dist/modules/authoring/index.mjs.map +2 -2
  70. package/dist/modules/compiler/assemble.d.mts +0 -4
  71. package/dist/modules/compiler/assemble.mjs +55 -23
  72. package/dist/modules/compiler/assemble.mjs.map +2 -2
  73. package/dist/modules/compiler/bundle.mjs.map +1 -1
  74. package/dist/modules/compiler/index.d.mts +1 -4
  75. package/dist/modules/compiler/index.mjs +4 -3
  76. package/dist/modules/compiler/index.mjs.map +2 -2
  77. package/dist/modules/runtime/describe.mjs +49 -2
  78. package/dist/modules/runtime/describe.mjs.map +2 -2
  79. package/dist/modules/runtime/described.d.mts +94 -3
  80. package/dist/modules/runtime/described.mjs +14 -2
  81. package/dist/modules/runtime/described.mjs.map +2 -2
  82. package/dist/modules/runtime/isolate.d.mts +3 -2
  83. package/dist/modules/runtime/isolate.mjs +2 -0
  84. package/dist/modules/runtime/isolate.mjs.map +2 -2
  85. package/fixtures/release-scout/agent/channels/github.ts +2 -38
  86. package/fixtures/release-scout/agent/hooks/audit.ts +1 -1
  87. package/fixtures/release-scout/agent/instructions/org-context.ts +1 -1
  88. package/package.json +4 -4
  89. package/dist/compiler-assets/chunk-ISYIPH2T.ts +0 -120
  90. package/dist/compiler-assets/chunk-JRKGCYWA.ts +0 -87
@@ -20,8 +20,7 @@ import {
20
20
  ScheduleTarget,
21
21
  skillBundleSchema,
22
22
  ToolApproval,
23
- toolDescriptorSchema,
24
- TurnPolicy
23
+ toolDescriptorSchema
25
24
  } from "@finalai/agent-provider";
26
25
  import { Cron } from "croner";
27
26
  import * as z from "zod";
@@ -73,7 +72,7 @@ const collectSecrets = (args) => {
73
72
  }
74
73
  return [...names].sort();
75
74
  };
76
- const SECRET_READ = /secrets\s*\.\s*get\(\s*(?:(['"`])([^'"`$\\]+)\1\s*\)|(?!\s*\)))/g;
75
+ const SECRET_READ = /(?:secrets\s*\.\s*get|credentials\s*\.\s*secret)\(\s*(?:(['"`])([^'"`$\\]+)\1\s*\)|(?!\s*\)))/g;
77
76
  const secretReferences = (files) => Object.entries(files).filter(([path]) => isModulePath(path) || /\.[jt]sx$/.test(path)).flatMap(
78
77
  ([path, source]) => [...source.matchAll(SECRET_READ)].map((match) => ({ path, name: match[2] ?? null }))
79
78
  );
@@ -623,8 +622,8 @@ ${text}`;
623
622
  host.push(capability);
624
623
  }
625
624
  const channels = [];
625
+ let roomSurface;
626
626
  const channelKeys = /* @__PURE__ */ new Set();
627
- const channelRoutes = {};
628
627
  const addChannel = (binding, path) => {
629
628
  if (channelKeys.has(binding.key)) {
630
629
  report(
@@ -642,13 +641,14 @@ ${text}`;
642
641
  if (module.value?.type !== "channel") continue;
643
642
  const { value } = module;
644
643
  if (value.disabled) continue;
645
- if (value.turnPolicy != null && value.turnPolicy !== TurnPolicy.Steer && value.turnPolicy !== TurnPolicy.Queue) {
644
+ if (value.invalidFields.length > 0) {
646
645
  report(
647
646
  DiagnosticSeverity.Error,
648
647
  DiagnosticCode.Channel,
649
- `channel ${module.key} turnPolicy must be steer or queue`,
648
+ `channel ${module.key} requires valid ${value.invalidFields.join(", ")}`,
650
649
  module.path
651
650
  );
651
+ continue;
652
652
  }
653
653
  for (const route of value.routes) {
654
654
  if (!route.path.startsWith("/")) {
@@ -671,21 +671,31 @@ ${text}`;
671
671
  );
672
672
  continue;
673
673
  }
674
- addChannel(
675
- {
676
- key: module.key,
677
- channel: installed == null ? bundleRef(module.base) : installed.data,
678
- config: parsedConfig.success ? parsedConfig.data : {},
679
- source: "authored"
680
- },
681
- module.path
682
- );
674
+ const channel = installed == null ? bundleRef(module.base) : installed.data;
675
+ const config2 = parsedConfig.success ? parsedConfig.data : {};
676
+ if (value.room) {
677
+ if (module.key !== "final")
678
+ report(
679
+ DiagnosticSeverity.Error,
680
+ DiagnosticCode.Channel,
681
+ "The Final room surface must be channels/final.ts",
682
+ module.path
683
+ );
684
+ roomSurface = { channel, config: config2, source: "authored" };
685
+ } else
686
+ addChannel(
687
+ {
688
+ key: module.key,
689
+ channel,
690
+ config: config2,
691
+ source: "authored",
692
+ credentials: value.credentials ?? { app: null },
693
+ surface: value.surface
694
+ },
695
+ module.path
696
+ );
683
697
  if (value.installed != null) continue;
684
698
  runtimeExport(module.base, module.path);
685
- channelRoutes[module.base] = value.routes.map((route) => ({
686
- method: route.method,
687
- path: route.path
688
- }));
689
699
  }
690
700
  for (const [index, binding] of (agent?.channels ?? []).entries()) {
691
701
  const ref = providerRefSchema.safeParse(binding.channel);
@@ -698,9 +708,28 @@ ${text}`;
698
708
  );
699
709
  continue;
700
710
  }
711
+ if (binding.credentials == null || binding.surface == null) {
712
+ report(
713
+ DiagnosticSeverity.Error,
714
+ DiagnosticCode.Channel,
715
+ `agent.ts channels[${index}] must use a channel factory or declare its credentials and surface`,
716
+ agentPath
717
+ );
718
+ continue;
719
+ }
701
720
  const config2 = jsonObjectSchema.safeParse(binding.config);
702
721
  const key = binding.key ?? (ref.data.kind === "package" ? ref.data.specifier.split("/").at(-1) ?? ref.data.specifier : ref.data.export);
703
- addChannel({ key, channel: ref.data, config: config2.success ? config2.data : {} }, agentPath);
722
+ addChannel(
723
+ {
724
+ key,
725
+ channel: ref.data,
726
+ config: config2.success ? config2.data : {},
727
+ credentials: binding.credentials,
728
+ surface: binding.surface,
729
+ ...binding.install == null ? {} : { install: binding.install }
730
+ },
731
+ agentPath
732
+ );
704
733
  }
705
734
  const hooks = [];
706
735
  for (const module of withDefault(SlotKind.Hook)) {
@@ -833,7 +862,10 @@ ${text}`;
833
862
  }
834
863
  const references = secretReferences(input.files);
835
864
  const secrets = collectSecrets({
836
- declared: agent?.secrets ?? [],
865
+ declared: [
866
+ ...agent?.secrets ?? [],
867
+ ...channels.flatMap((channel) => channel.credentials.secrets ?? [])
868
+ ],
837
869
  config,
838
870
  mcpServers: connections,
839
871
  reads: references.flatMap((reference) => reference.name == null ? [] : [reference.name])
@@ -850,7 +882,7 @@ ${text}`;
850
882
  );
851
883
  }
852
884
  if (harnessRef == null) {
853
- return { manifest: null, modules, sandboxOpeners, channelRoutes, directoryFields, diagnostics };
885
+ return { manifest: null, modules, sandboxOpeners, directoryFields, diagnostics };
854
886
  }
855
887
  const draft = {
856
888
  version: MANIFEST_VERSION,
@@ -866,6 +898,7 @@ ${text}`;
866
898
  toolPolicy,
867
899
  secrets,
868
900
  channels,
901
+ roomSurface,
869
902
  channelSources: Object.fromEntries(
870
903
  withDefault(SlotKind.Channel).flatMap(
871
904
  (module) => module.value?.type === "channel" ? [
@@ -917,7 +950,6 @@ ${text}`;
917
950
  manifest: failed || !validated.success ? null : validated.data,
918
951
  modules,
919
952
  sandboxOpeners,
920
- channelRoutes,
921
953
  directoryFields,
922
954
  diagnostics
923
955
  };
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../../../../src/compiler/assemble.ts"],
4
- "sourcesContent": ["import {\n agentManifestSchema,\n BaseCapability,\n bundleRef,\n CredentialNodeKind,\n credentialPolicySchema,\n DynamicEvent,\n findDynamicSlots,\n formatProviderRef,\n httpMcpServerBindingSchema,\n InstructionRole,\n jsonObjectSchema,\n MANIFEST_VERSION,\n McpServerBindingKind,\n packageRef,\n ProviderRefKind,\n providerRefSchema,\n SandboxAccess,\n SandboxAttach,\n ScheduleTarget,\n skillBundleSchema,\n ToolApproval,\n toolDescriptorSchema,\n TurnPolicy,\n type AgentManifestIface,\n type ChannelBindingIface,\n type DynamicSlotIface,\n type HookBindingIface,\n type JsonObject,\n type JsonValue,\n type McpServerBinding,\n type ProviderRef,\n type SandboxBindingIface,\n type ScheduleDefinitionIface,\n type SkillBundleIface,\n type ToolDescriptorIface,\n} from '@finalai/agent-provider';\nimport { Cron } from 'croner';\nimport * as z from 'zod';\nimport { HookEventKeyKind, normalizeHookKey } from \"../authoring/hooks.mjs\";\nimport type {\n DescribedAgentIface,\n DescribedBundleIface,\n DescribedDynamicIface,\n DescribedModuleIface,\n DescribedSandboxIface,\n} from \"../runtime/described.mjs\";\nimport { AUTHORED_SERVER_KEY, COMBINED_MCP_SERVERS_EXPORT, SlotKind } from \"../runtime/layout.mjs\";\nimport { IssueSeverity } from \"../runtime/lower.mjs\";\nimport {\n diagnostic,\n DiagnosticCode,\n DiagnosticSeverity,\n type DiagnosticIface,\n} from \"./diagnostics.mjs\";\nimport { InstructionSourceKind, isModulePath, type DiscoveryIface } from \"./discovery.mjs\";\nimport { preparationFiles } from \"./files.mjs\";\nimport { firstParagraphLine, frontMatterString, parseFrontMatter } from \"./frontmatter.mjs\";\n\nexport interface AssembleInputIface {\n installedSandboxProviders?: Readonly<Record<string, string>>;\n files: Record<string, string>;\n discovery: DiscoveryIface;\n described: DescribedBundleIface | null;\n fallbackName: string;\n bundle: { hash: string; code: string } | null;\n}\n\nexport interface AssembleOutputIface {\n manifest: AgentManifestIface | null;\n // Bundle export \u2192 directory-relative source path, for what the runtime calls.\n modules: Record<string, string>;\n // Target \u2192 bundle export of the sandbox.ts selector that opens it.\n sandboxOpeners: Record<string, string>;\n // Bundle channel export \u2192 its routes, for the public route URLs.\n channelRoutes: Record<string, { method: string; path: string }[]>;\n // Which config fields came from directory files, for the compatibility report.\n directoryFields: { instructions: string[]; skills: string[] };\n diagnostics: DiagnosticIface[];\n}\n\nconst SEVERITY = {\n [IssueSeverity.Error]: DiagnosticSeverity.Error,\n [IssueSeverity.Warning]: DiagnosticSeverity.Warning,\n [IssueSeverity.Note]: DiagnosticSeverity.Note,\n} satisfies Record<IssueSeverity, DiagnosticSeverity>;\n\nconst isObject = (value: JsonValue | undefined): value is JsonObject =>\n jsonObjectSchema.safeParse(value).success;\n\nconst DYNAMIC_EVENTS: ReadonlySet<string> = new Set(Object.values(DynamicEvent));\n\nconst toDynamicEvents = (events: string[]): DynamicEvent[] =>\n Object.values(DynamicEvent).filter((event) => events.includes(event));\n\nconst capabilityOf = (name: string): BaseCapability | null =>\n Object.values(BaseCapability).find((capability) => capability === name) ?? null;\n\nconst apiKeySecretSchema = z.looseObject({\n kind: z.literal(CredentialNodeKind.ApiKey),\n secret: z.string().min(1),\n});\n\n// A secret reference in harness config (`hop: { secretKey }` and every other\n// `final://schemas` secret ref).\nconst secretRefSchema = z.looseObject({ secretKey: z.string().min(1) });\n\n// Secret names a definition references outside authored code: API key\n// credential nodes and secret refs anywhere in the harness config (walked as JSON).\nconst configSecrets = (value: JsonValue): string[] => {\n if (Array.isArray(value)) return value.flatMap(configSecrets);\n if (!isObject(value)) return [];\n const node = apiKeySecretSchema.safeParse(value);\n const ref = secretRefSchema.safeParse(value);\n return [\n ...(node.success ? [node.data.secret] : []),\n ...(ref.success ? [ref.data.secretKey] : []),\n ...Object.values(value).flatMap(configSecrets),\n ];\n};\n\n// The manifest's secret allowlist: declared names plus every secret the\n// definition references by name. Sandbox `variables` are organization\n// variables, not secrets, and stay out.\nconst collectSecrets = (args: {\n declared: string[];\n config: JsonValue;\n mcpServers: AgentManifestIface['mcpServers'];\n reads: string[];\n}): string[] => {\n const names = new Set([...args.declared, ...args.reads]);\n for (const name of configSecrets(args.config)) names.add(name);\n if (Array.isArray(args.mcpServers)) {\n for (const binding of args.mcpServers) {\n if (\n binding.kind === McpServerBindingKind.Http &&\n binding.auth != null &&\n 'secretKey' in binding.auth\n ) {\n names.add(binding.auth.secretKey);\n }\n }\n }\n return [...names].sort();\n};\n\nconst SECRET_READ = /secrets\\s*\\.\\s*get\\(\\s*(?:(['\"`])([^'\"`$\\\\]+)\\1\\s*\\)|(?!\\s*\\)))/g;\n\n// `secrets.get(...)` calls in authored source files, helpers included: a\n// string literal names the secret; any other argument is a computed read the\n// compiler cannot see.\nconst secretReferences = (files: Record<string, string>): { path: string; name: string | null }[] =>\n Object.entries(files)\n .filter(([path]) => isModulePath(path) || /\\.[jt]sx$/.test(path))\n .flatMap(([path, source]) =>\n [...source.matchAll(SECRET_READ)].map((match) => ({ path, name: match[2] ?? null })),\n );\n\nexport const assemble = (input: AssembleInputIface): AssembleOutputIface => {\n const diagnostics: DiagnosticIface[] = [];\n const report = (\n severity: DiagnosticSeverity,\n code: DiagnosticCode,\n message: string,\n path: string | null = null,\n ): void => {\n diagnostics.push(diagnostic({ severity, code, message, path }));\n };\n const modules: Record<string, string> = {};\n const runtimeExport = (name: string, path: string): void => {\n modules[name] = path;\n };\n const described = input.described?.modules ?? [];\n for (const module of described) {\n for (const issue of module.issues)\n report(SEVERITY[issue.severity], DiagnosticCode.Module, issue.message, module.path);\n }\n const ofSlot = (slot: SlotKind): DescribedModuleIface[] =>\n described.filter((module) => module.slot === slot);\n const withDefault = (slot: SlotKind): DescribedModuleIface[] =>\n ofSlot(slot).filter((module) => module.hasDefault && module.value != null);\n\n const dynamicSlotFor = (\n dynamic: DescribedDynamicIface,\n resolver: string,\n path: string,\n slotName: string,\n ): DynamicSlotIface | null => {\n for (const event of dynamic.events) {\n if (!DYNAMIC_EVENTS.has(event)) {\n report(\n DiagnosticSeverity.Error,\n DiagnosticCode.Module,\n `${slotName} resolves on ${event}; dynamic slots support session.started and turn.started (the harness owns steps)`,\n path,\n );\n }\n }\n const events = toDynamicEvents(dynamic.events);\n if (events.length === 0) {\n report(\n DiagnosticSeverity.Error,\n DiagnosticCode.Module,\n `${slotName} defineDynamic has no session.started or turn.started handler`,\n path,\n );\n return null;\n }\n runtimeExport(resolver, path);\n const slot: DynamicSlotIface = { $dynamic: { resolver, events } };\n if (dynamic.description != null) slot.$dynamic.description = dynamic.description;\n if (dynamic.preview != null) slot.$dynamic.preview = dynamic.preview;\n if ((dynamic.requiredBindings?.length ?? 0) > 0)\n slot.$dynamic.requiredBindings = dynamic.requiredBindings;\n // Build shows \"resolved at <export> on <event>\" without them.\n if (dynamic.description == null && dynamic.preview == null) {\n report(\n DiagnosticSeverity.Note,\n DiagnosticCode.Module,\n `${slotName} is resolved per session; give defineDynamic a description (and a preview) so Build can show what it resolves to`,\n path,\n );\n }\n return slot;\n };\n\n // agent.ts\n const agentModule = ofSlot(SlotKind.Agent)[0] ?? null;\n let agent: DescribedAgentIface | null = null;\n if (agentModule != null) {\n if (!agentModule.hasDefault) {\n report(\n DiagnosticSeverity.Error,\n DiagnosticCode.Module,\n 'agent.ts must export defineAgent({ ... }) as its default export',\n agentModule.path,\n );\n } else if (agentModule.value?.type === 'agent') agent = agentModule.value;\n }\n const agentPath = agentModule?.path ?? 'agent.ts';\n for (const name of input.described?.synthesized ?? []) {\n if (name !== COMBINED_MCP_SERVERS_EXPORT) runtimeExport(name, agentPath);\n }\n\n // Harness binding. Model, reasoning, credentials and permission mode are\n // harness config, never top-level agent fields.\n let harnessRef: ProviderRef | null = null;\n let config: JsonValue = {};\n if (agent?.harness == null) {\n // A missing or invalid default export is reported above.\n if (agentModule == null || agent != null) {\n report(\n DiagnosticSeverity.Error,\n DiagnosticCode.Harness,\n 'agent.ts must name a harness, e.g. defineAgent({ harness: serverlessPi({ model }) })',\n agentPath,\n );\n }\n } else {\n const parsed = providerRefSchema.safeParse(agent.harness.harness);\n if (parsed.success) harnessRef = parsed.data;\n else\n report(\n DiagnosticSeverity.Error,\n DiagnosticCode.Harness,\n 'agent.ts harness has an invalid provider reference',\n agentPath,\n );\n config = agent.harness.config;\n }\n if (harnessRef?.kind === 'bundle') runtimeExport(harnessRef.export, agentPath);\n const credentialPolicies = Object.values(jsonObjectSchema.safeParse(config).data ?? {}).filter(\n (value) => credentialPolicySchema.safeParse(value).success,\n );\n if (harnessRef != null && credentialPolicies.length !== 1) {\n report(\n DiagnosticSeverity.Error,\n DiagnosticCode.Harness,\n 'Declare exactly one credential policy in the harness config; billing policy belongs to this definition.',\n agentPath,\n );\n }\n\n const configObject = isObject(config) ? config : null;\n if (configObject == null && !findDynamicSlots(config).some((slot) => slot.path === '')) {\n report(\n DiagnosticSeverity.Error,\n DiagnosticCode.Harness,\n 'harness config must be an object',\n agentPath,\n );\n }\n\n // Instructions.\n const instructionFragments: JsonValue[] = [];\n const instructionSources: string[] = [];\n const instructionModules = new Map(\n ofSlot(SlotKind.Instructions).map((module) => [module.path, module]),\n );\n for (const source of input.discovery.instructions) {\n if (source.kind === InstructionSourceKind.Markdown) {\n const content = input.files[source.path] ?? '';\n if (content.trim().length === 0) {\n report(\n DiagnosticSeverity.Warning,\n DiagnosticCode.Instructions,\n `${source.path} is empty and was skipped`,\n source.path,\n );\n continue;\n }\n instructionFragments.push({ role: InstructionRole.System, content, source: source.path });\n instructionSources.push(source.path);\n continue;\n }\n const module = instructionModules.get(source.path);\n if (module == null || module.value == null) continue;\n if (module.value.type === 'instructions') {\n instructionFragments.push({\n role: module.value.role,\n content: module.value.content,\n source: source.path,\n });\n instructionSources.push(source.path);\n } else if (module.value.type === 'dynamic') {\n const slot = dynamicSlotFor(module.value, module.base, source.path, source.path);\n if (slot != null) {\n instructionFragments.push(slot);\n instructionSources.push(source.path);\n }\n }\n }\n\n // Skills.\n const skills: JsonValue[] = [];\n const skillSources: string[] = [];\n const skillKeys = new Set<string>();\n const addSkill = (key: string, skill: JsonValue, path: string): void => {\n if (skillKeys.has(key)) {\n report(\n DiagnosticSeverity.Error,\n DiagnosticCode.Skills,\n `skill ${key} is defined more than once`,\n path,\n );\n return;\n }\n skillKeys.add(key);\n skills.push(skill);\n skillSources.push(path);\n };\n for (const directory of input.discovery.skillDirectories) {\n const skillPath = `${directory.directory}/SKILL.md`;\n const text = input.files[skillPath] ?? '';\n const front = parseFrontMatter(text);\n if (front.error != null)\n report(DiagnosticSeverity.Warning, DiagnosticCode.Skills, front.error, skillPath);\n const description =\n frontMatterString(front.data, 'description') ?? firstParagraphLine(front.body);\n const files = [\n { path: 'SKILL.md', content: text },\n ...directory.files\n .filter((file) => file !== skillPath)\n .map((file) => ({\n path: file.slice(directory.directory.length + 1),\n content: input.files[file] ?? '',\n })),\n ];\n const skill: SkillBundleIface = { key: directory.key, files };\n if (description != null) skill.description = description;\n addSkill(directory.key, skill, skillPath);\n }\n for (const flat of input.discovery.skillMarkdown) {\n const text = input.files[flat.path] ?? '';\n const front = parseFrontMatter(text);\n const description =\n frontMatterString(front.data, 'description') ??\n firstParagraphLine(front.body) ??\n `Instructions for the ${flat.key} skill.`;\n const content = text.startsWith('---\\n')\n ? text\n : `---\\nname: ${JSON.stringify(flat.key)}\\ndescription: ${JSON.stringify(description)}\\n---\\n\\n${text}`;\n addSkill(\n flat.key,\n { key: flat.key, description, files: [{ path: 'SKILL.md', content }] },\n flat.path,\n );\n }\n for (const module of withDefault(SlotKind.Skill)) {\n if (module.value?.type === 'skill') {\n const parsed = skillBundleSchema.safeParse(module.value.skill);\n if (parsed.success) addSkill(module.key, parsed.data, module.path);\n } else if (module.value?.type === 'dynamic') {\n const slot = dynamicSlotFor(module.value, module.base, module.path, module.path);\n if (slot != null) addSkill(module.key, slot, module.path);\n }\n }\n\n const directoryFields = { instructions: instructionSources, skills: skillSources };\n if (configObject != null) {\n if (instructionFragments.length > 0) {\n if (configObject['instructions'] != null) {\n report(\n DiagnosticSeverity.Error,\n DiagnosticCode.Conflict,\n 'harness config sets instructions and the directory has instruction files; keep one source',\n agentPath,\n );\n } else configObject['instructions'] = instructionFragments;\n }\n if (skills.length > 0) {\n if (configObject['skills'] != null) {\n report(\n DiagnosticSeverity.Error,\n DiagnosticCode.Conflict,\n 'harness config sets skills and the directory has skills/; keep one source',\n agentPath,\n );\n } else configObject['skills'] = skills;\n }\n } else if (instructionFragments.length > 0 || skills.length > 0) {\n report(\n DiagnosticSeverity.Error,\n DiagnosticCode.Conflict,\n 'harness config is dynamic, so directory instructions and skills cannot be added to it',\n agentPath,\n );\n }\n\n // MCP servers: authored tools and connections.\n const toolPolicy: Record<string, ToolApproval> = {};\n const toolDescriptors: ToolDescriptorIface[] = [];\n const toolApprovals: Record<string, ToolApproval> = {};\n let anyDynamicServer = false;\n let anyTurnStartedServer = false;\n for (const module of ofSlot(SlotKind.Tool)) {\n if (!module.hasDefault || module.value == null) continue;\n if (module.value.type === 'dynamic') {\n anyDynamicServer = true;\n anyTurnStartedServer ||= module.value.events.includes(DynamicEvent.TurnStarted);\n runtimeExport(module.base, module.path);\n continue;\n }\n if (module.value.type !== 'tool') continue;\n const parsed = toolDescriptorSchema.safeParse(module.value.descriptor);\n if (!parsed.success) {\n report(\n DiagnosticSeverity.Error,\n DiagnosticCode.Module,\n `tool ${module.key} has an invalid descriptor`,\n module.path,\n );\n continue;\n }\n toolDescriptors.push(parsed.data);\n const approval =\n module.value.approval === ToolApproval.Ask ? ToolApproval.Ask : ToolApproval.Allow;\n toolApprovals[module.key] = approval;\n if (approval === ToolApproval.Ask && parsed.data.inputApproval == null)\n toolPolicy[`${AUTHORED_SERVER_KEY}/${module.key}`] = ToolApproval.Ask;\n runtimeExport(module.base, module.path);\n }\n const connections: McpServerBinding[] = [];\n const connectionKeys = new Set<string>();\n for (const module of ofSlot(SlotKind.Connection)) {\n if (!module.hasDefault || module.value == null) continue;\n if (module.key === AUTHORED_SERVER_KEY) {\n report(\n DiagnosticSeverity.Error,\n DiagnosticCode.Connections,\n `connection name ${AUTHORED_SERVER_KEY} is reserved for authored tools`,\n module.path,\n );\n continue;\n }\n if (connectionKeys.has(module.key)) {\n report(\n DiagnosticSeverity.Error,\n DiagnosticCode.Connections,\n `connection ${module.key} is defined more than once`,\n module.path,\n );\n continue;\n }\n connectionKeys.add(module.key);\n if (module.value.type === 'dynamic') {\n anyDynamicServer = true;\n anyTurnStartedServer ||= module.value.events.includes(DynamicEvent.TurnStarted);\n runtimeExport(module.base, module.path);\n continue;\n }\n if (module.value.type !== 'connection') continue;\n const parsed = httpMcpServerBindingSchema.safeParse(module.value.binding);\n if (!parsed.success) {\n report(\n DiagnosticSeverity.Error,\n DiagnosticCode.Connections,\n `connection ${module.key} is invalid: ${parsed.error.issues[0]?.message ?? 'invalid'}`,\n module.path,\n );\n continue;\n }\n connections.push(parsed.data);\n if (parsed.data.inputApprovals != null) runtimeExport(module.base, module.path);\n for (const [tool, approval] of Object.entries(parsed.data.approvals ?? {})) {\n if (approval === ToolApproval.Ask && !Object.hasOwn(parsed.data.inputApprovals ?? {}, tool))\n toolPolicy[`${module.key}/${tool}`] = ToolApproval.Ask;\n }\n }\n let mcpServers: AgentManifestIface['mcpServers'];\n if (anyDynamicServer) {\n mcpServers = {\n $dynamic: {\n resolver: COMBINED_MCP_SERVERS_EXPORT,\n requiredBindings: [...ofSlot(SlotKind.Connection), ...ofSlot(SlotKind.Tool)].flatMap(\n (module) =>\n module.value?.type === 'dynamic' ? (module.value.requiredBindings ?? []) : [],\n ),\n events: anyTurnStartedServer\n ? [DynamicEvent.SessionStarted, DynamicEvent.TurnStarted]\n : [DynamicEvent.SessionStarted],\n description:\n 'Authored tools and connections, including the dynamic ones, resolved when the session starts.',\n },\n };\n runtimeExport(COMBINED_MCP_SERVERS_EXPORT, '<synthesized>');\n } else {\n mcpServers = [\n ...(toolDescriptors.length === 0\n ? []\n : [\n {\n key: AUTHORED_SERVER_KEY,\n kind: McpServerBindingKind.Worker,\n tools: toolDescriptors,\n approvals: toolApprovals,\n } satisfies McpServerBinding,\n ]),\n ...connections,\n ];\n }\n for (const [key, policy] of Object.entries(agent?.toolPolicy ?? {})) {\n toolPolicy[key] = policy === 'ask' ? ToolApproval.Ask : ToolApproval.Allow;\n }\n\n // Sandboxes.\n const sandboxModule = ofSlot(SlotKind.Sandbox)[0];\n const sandbox: DescribedSandboxIface | null =\n sandboxModule?.value?.type === 'sandbox' ? sandboxModule.value : null;\n const sandboxPath = sandboxModule?.path ?? 'sandbox.ts';\n const sandboxes: Record<string, SandboxBindingIface> = {};\n const sandboxOpeners: Record<string, string> = {};\n const providerExportByName = new Map(\n Object.entries(sandbox?.providers ?? {}).map(([exportName, name]) => [name, exportName]),\n );\n const duplicateNames = new Set<string>();\n for (const name of Object.values(sandbox?.providers ?? {})) {\n if (duplicateNames.has(name))\n report(\n DiagnosticSeverity.Error,\n DiagnosticCode.Sandbox,\n `sandbox.ts exports multiple providers named ${name}; give each provider a distinct name`,\n sandboxPath,\n );\n duplicateNames.add(name);\n }\n const providerFor = (args: {\n ref: JsonValue | null;\n name: string | null;\n target: string;\n }): ProviderRef | null => {\n if (args.ref != null) {\n const parsed = providerRefSchema.safeParse(args.ref);\n if (parsed.success) return parsed.data;\n }\n if (args.name != null) {\n const exportName = providerExportByName.get(args.name);\n if (exportName != null) {\n runtimeExport(exportName, sandboxPath);\n return bundleRef(exportName);\n }\n report(\n DiagnosticSeverity.Error,\n DiagnosticCode.Sandbox,\n `sandbox target ${args.target} uses provider ${args.name}, which is neither installed nor exported from sandbox.ts`,\n sandboxPath,\n );\n return null;\n }\n report(\n DiagnosticSeverity.Error,\n DiagnosticCode.Sandbox,\n `sandbox target ${args.target} is dynamic and its provider cannot be inferred; give defineDynamic a provider ({ provider: computer, events })`,\n sandboxPath,\n );\n return null;\n };\n // A dynamic target without a provider hint: the\n // provider its resolver returns an environment of is unknown until a session\n // starts, so an installed provider is inferred here (the target's name, or\n // the one installed provider sandbox.ts uses) and checked by reference when\n // the slot resolves. Providers defined in sandbox.ts still need the hint:\n // their environments carry only a name, which cannot be checked.\n const inferredProvider = (target: string): { ref: JsonValue; name: string } | null => {\n if (providerExportByName.size > 0) return null;\n const specifier = Object.hasOwn(input.installedSandboxProviders ?? {}, target)\n ? input.installedSandboxProviders?.[target]\n : undefined;\n if (specifier != null) return { ref: packageRef(specifier), name: target };\n const installed = new Map<string, { ref: JsonValue; name: string }>();\n for (const described of Object.values(sandbox?.targets ?? {})) {\n const environment = described.environment;\n const parsed = providerRefSchema.safeParse(environment?.providerRef);\n if (environment?.providerName == null || !parsed.success) continue;\n if (parsed.data.kind !== ProviderRefKind.Package) continue;\n installed.set(formatProviderRef(parsed.data), {\n ref: environment.providerRef,\n name: environment.providerName,\n });\n }\n return installed.size === 1 ? ([...installed.values()][0] ?? null) : null;\n };\n for (const [target, described] of Object.entries(sandbox?.targets ?? {})) {\n if (described.environment != null) {\n const environment = described.environment;\n const provider = providerFor({\n ref: environment.providerRef,\n name: environment.providerName,\n target,\n });\n if (provider == null) continue;\n const open: JsonValue | undefined = environment.openOptions ?? undefined;\n if (\n open != null &&\n (!isObject(open) || Object.keys(open).some((key) => key !== 'access' && key !== 'attach'))\n ) {\n report(\n DiagnosticSeverity.Error,\n DiagnosticCode.Sandbox,\n `sandbox target ${target} open options support only access and attach`,\n sandboxPath,\n );\n continue;\n }\n const access = isObject(open) ? open['access'] : undefined;\n const attach = isObject(open) ? open['attach'] : undefined;\n if (\n access != null &&\n access !== SandboxAccess.Read &&\n access !== SandboxAccess.Execute &&\n access !== SandboxAccess.Write\n ) {\n report(\n DiagnosticSeverity.Error,\n DiagnosticCode.Sandbox,\n `sandbox target ${target} has invalid access ${String(access)}`,\n sandboxPath,\n );\n continue;\n }\n if (attach != null && attach !== SandboxAttach.OnPrompt && attach !== SandboxAttach.Lazy) {\n report(\n DiagnosticSeverity.Error,\n DiagnosticCode.Sandbox,\n `sandbox target ${target} has invalid attach ${String(attach)}`,\n sandboxPath,\n );\n continue;\n }\n sandboxes[target] = {\n provider,\n environment: environment.options,\n access:\n access === SandboxAccess.Read || access === SandboxAccess.Execute\n ? access\n : SandboxAccess.Write,\n attach: attach === SandboxAttach.OnPrompt ? SandboxAttach.OnPrompt : SandboxAttach.Lazy,\n };\n } else if (described.dynamic != null) {\n const hinted = described.dynamic.provider;\n const inferred = hinted == null ? inferredProvider(target) : null;\n if (inferred != null) {\n report(\n DiagnosticSeverity.Note,\n DiagnosticCode.Sandbox,\n `sandbox target ${target} is dynamic; its provider is ${inferred.name}, and its resolver must return a ${inferred.name} environment`,\n sandboxPath,\n );\n }\n const provider = providerFor({\n ref: hinted?.ref ?? inferred?.ref ?? null,\n name: hinted?.name ?? inferred?.name ?? null,\n target,\n });\n const slot = dynamicSlotFor(\n described.dynamic,\n described.exportName,\n sandboxPath,\n `sandbox target ${target}`,\n );\n if (provider == null || slot == null) continue;\n sandboxes[target] = {\n provider,\n environment: slot,\n access: SandboxAccess.Write,\n attach: SandboxAttach.Lazy,\n };\n }\n }\n if (\n sandbox?.selector === true &&\n sandbox.defaultTarget != null &&\n sandboxes[sandbox.defaultTarget] != null\n ) {\n sandboxOpeners[sandbox.defaultTarget] = 'sandbox';\n runtimeExport('sandbox', sandboxPath);\n report(\n DiagnosticSeverity.Note,\n DiagnosticCode.Sandbox,\n `sandbox.ts default export opens target ${sandbox.defaultTarget} for each session`,\n sandboxPath,\n );\n }\n\n // Base tools.\n const base: AgentManifestIface['tools']['base'] = {};\n if (agent?.tools != null) {\n for (const [name, target] of Object.entries(agent.tools)) {\n const capability = capabilityOf(name);\n if (capability == null) {\n report(\n DiagnosticSeverity.Error,\n DiagnosticCode.BaseTools,\n `baseTools has unknown capability ${name}`,\n agentPath,\n );\n continue;\n }\n if (sandboxes[target] == null) {\n report(\n DiagnosticSeverity.Error,\n DiagnosticCode.BaseTools,\n `baseTools ${name} is bound to ${target}, which is not a sandbox target`,\n agentPath,\n );\n continue;\n }\n base[capability] = { target };\n }\n }\n // Capabilities declared on the harness's own host (`harnessHost`).\n const host: BaseCapability[] = [];\n for (const name of agent?.hostTools ?? []) {\n const capability = capabilityOf(name);\n if (capability == null) {\n report(\n DiagnosticSeverity.Error,\n DiagnosticCode.BaseTools,\n `baseTools has unknown capability ${name}`,\n agentPath,\n );\n continue;\n }\n if (base[capability] != null) {\n report(\n DiagnosticSeverity.Error,\n DiagnosticCode.BaseTools,\n `baseTools ${name} is bound both to a sandbox target and to harnessHost`,\n agentPath,\n );\n continue;\n }\n host.push(capability);\n }\n\n // Channels.\n const channels: ChannelBindingIface[] = [];\n const channelKeys = new Set<string>();\n const channelRoutes: AssembleOutputIface['channelRoutes'] = {};\n const addChannel = (binding: ChannelBindingIface, path: string): void => {\n if (channelKeys.has(binding.key)) {\n report(\n DiagnosticSeverity.Error,\n DiagnosticCode.Channel,\n `channel ${binding.key} is bound more than once`,\n path,\n );\n return;\n }\n channelKeys.add(binding.key);\n channels.push(binding);\n };\n for (const module of withDefault(SlotKind.Channel)) {\n if (module.value?.type !== 'channel') continue;\n const { value } = module;\n if (value.disabled) continue;\n if (\n value.turnPolicy != null &&\n value.turnPolicy !== TurnPolicy.Steer &&\n value.turnPolicy !== TurnPolicy.Queue\n ) {\n report(\n DiagnosticSeverity.Error,\n DiagnosticCode.Channel,\n `channel ${module.key} turnPolicy must be steer or queue`,\n module.path,\n );\n }\n for (const route of value.routes) {\n if (!route.path.startsWith('/')) {\n report(\n DiagnosticSeverity.Error,\n DiagnosticCode.Channel,\n `channel ${module.key} route ${route.path} must start with /`,\n module.path,\n );\n }\n }\n const parsedConfig = jsonObjectSchema.safeParse(value.config);\n const installed = value.installed == null ? null : providerRefSchema.safeParse(value.installed);\n if (installed != null && !installed.success) {\n report(\n DiagnosticSeverity.Error,\n DiagnosticCode.Channel,\n `channel ${module.key} has an invalid installed reference`,\n module.path,\n );\n continue;\n }\n addChannel(\n {\n key: module.key,\n channel: installed == null ? bundleRef(module.base) : installed.data,\n config: parsedConfig.success ? parsedConfig.data : {},\n source: 'authored',\n },\n module.path,\n );\n if (value.installed != null) continue;\n runtimeExport(module.base, module.path);\n channelRoutes[module.base] = value.routes.map((route) => ({\n method: route.method,\n path: route.path,\n }));\n }\n for (const [index, binding] of (agent?.channels ?? []).entries()) {\n const ref = providerRefSchema.safeParse(binding.channel);\n if (!ref.success) {\n report(\n DiagnosticSeverity.Error,\n DiagnosticCode.Channel,\n `agent.ts channels[${index}] has an invalid channel reference`,\n agentPath,\n );\n continue;\n }\n const config = jsonObjectSchema.safeParse(binding.config);\n const key =\n binding.key ??\n (ref.data.kind === 'package'\n ? (ref.data.specifier.split('/').at(-1) ?? ref.data.specifier)\n : ref.data.export);\n addChannel({ key, channel: ref.data, config: config.success ? config.data : {} }, agentPath);\n }\n\n // Hooks.\n const hooks: HookBindingIface[] = [];\n for (const module of withDefault(SlotKind.Hook)) {\n if (module.value?.type !== 'hook') continue;\n const events: string[] = [];\n for (const key of module.value.keys) {\n const normalized = normalizeHookKey(key);\n switch (normalized.kind) {\n case HookEventKeyKind.Unknown:\n report(\n DiagnosticSeverity.Error,\n DiagnosticCode.Hook,\n `hook ${module.key} subscribes to unknown event ${key}`,\n module.path,\n );\n break;\n case HookEventKeyKind.Canonical:\n case HookEventKeyKind.Wildcard:\n events.push(...normalized.events);\n break;\n }\n }\n const unique = [...new Set(events)];\n if (unique.length === 0) {\n report(\n DiagnosticSeverity.Warning,\n DiagnosticCode.Hook,\n `hook ${module.key} subscribes to no events and was left out`,\n module.path,\n );\n continue;\n }\n hooks.push({ slug: module.key, export: module.base, events: unique });\n runtimeExport(module.base, module.path);\n }\n\n // Schedules.\n const schedules: ScheduleDefinitionIface[] = [];\n const addSchedule = (args: {\n key: string;\n path: string;\n cron: string | null;\n timezone: string | null;\n target: string | null;\n prompt: string | null;\n }): void => {\n const { key, path } = args;\n if (args.cron == null) {\n report(\n DiagnosticSeverity.Error,\n DiagnosticCode.Schedule,\n `schedule ${key} needs a cron expression`,\n path,\n );\n return;\n }\n const timezone = args.timezone ?? 'UTC';\n try {\n new Cron(args.cron, { timezone, paused: true }).nextRun();\n } catch (cause) {\n report(\n DiagnosticSeverity.Error,\n DiagnosticCode.Schedule,\n `schedule ${key}: ${cause instanceof Error ? cause.message : String(cause)}`,\n path,\n );\n return;\n }\n const target = Object.values(ScheduleTarget).find(\n (candidate) => candidate === (args.target ?? ScheduleTarget.OwnerDirect),\n );\n if (target == null) {\n report(\n DiagnosticSeverity.Error,\n DiagnosticCode.Schedule,\n `schedule ${key} target must be owner-direct or bound-conversation`,\n path,\n );\n return;\n }\n const prompt = args.prompt?.trim() ?? '';\n if (prompt.length === 0) {\n report(\n DiagnosticSeverity.Error,\n DiagnosticCode.Schedule,\n `schedule ${key} needs a prompt`,\n path,\n );\n return;\n }\n schedules.push({ key, cron: args.cron, timezone, prompt, target });\n };\n for (const item of input.discovery.scheduleMarkdown) {\n const front = parseFrontMatter(input.files[item.path] ?? '');\n if (front.error != null)\n report(DiagnosticSeverity.Error, DiagnosticCode.Schedule, front.error, item.path);\n const field = (name: string): string | null => frontMatterString(front.data, name);\n addSchedule({\n key: item.key,\n path: item.path,\n cron: field('cron'),\n timezone: field('timezone'),\n target: field('target'),\n prompt: front.body,\n });\n }\n for (const module of withDefault(SlotKind.Schedule)) {\n if (module.value?.type !== 'schedule') continue;\n addSchedule({\n key: module.key,\n path: module.path,\n cron: module.value.cron,\n timezone: module.value.timezone,\n target: module.value.target,\n prompt: module.value.markdown,\n });\n }\n const scheduleKeys = new Set<string>();\n for (const schedule of schedules) {\n if (scheduleKeys.has(schedule.key)) {\n report(\n DiagnosticSeverity.Error,\n DiagnosticCode.Schedule,\n `schedule ${schedule.key} is defined more than once`,\n );\n }\n scheduleKeys.add(schedule.key);\n }\n\n for (const rejected of input.discovery.rejected) {\n report(DiagnosticSeverity.Error, DiagnosticCode.RejectedSlot, rejected.message, rejected.path);\n }\n for (const unsupported of input.discovery.unsupported) {\n report(\n DiagnosticSeverity.Warning,\n DiagnosticCode.RejectedSlot,\n unsupported.message,\n unsupported.path,\n );\n }\n\n // Literal `secrets.get('<name>')` reads join the allowlist; a computed name\n // must be declared in agent.ts, or the read fails at run time.\n const references = secretReferences(input.files);\n const secrets = collectSecrets({\n declared: agent?.secrets ?? [],\n config,\n mcpServers: connections,\n reads: references.flatMap((reference) => (reference.name == null ? [] : [reference.name])),\n });\n const computedReads = new Set(\n references.flatMap((reference) => (reference.name == null ? [reference.path] : [])),\n );\n for (const path of computedReads) {\n report(\n DiagnosticSeverity.Note,\n DiagnosticCode.Secrets,\n `${path} reads a secret by a computed name; list it in defineAgent({ secrets: [...] }) or the read fails at run time`,\n path,\n );\n }\n\n if (harnessRef == null) {\n return { manifest: null, modules, sandboxOpeners, channelRoutes, directoryFields, diagnostics };\n }\n const draft: AgentManifestIface = {\n version: MANIFEST_VERSION,\n identity: {\n name: agent?.name ?? input.fallbackName,\n description: agent?.description ?? null,\n ...(agent?.avatar == null ? {} : { avatar: agent.avatar }),\n },\n harness: { harness: harnessRef, config },\n mcpServers,\n sandboxes,\n tools: host.length === 0 ? { base } : { base, host },\n toolPolicy,\n secrets,\n channels,\n channelSources: Object.fromEntries(\n withDefault(SlotKind.Channel).flatMap((module) =>\n module.value?.type === 'channel'\n ? [\n [\n module.key,\n { path: module.path, source: 'authored', disabled: module.value.disabled },\n ],\n ]\n : [],\n ),\n ),\n hooks,\n schedules,\n bundle: null,\n };\n const resolvers: NonNullable<AgentManifestIface['bundle']>['resolvers'] = {};\n for (const found of findDynamicSlots(draft)) {\n resolvers[found.path] = {\n export: found.slot.$dynamic.resolver,\n events: found.slot.$dynamic.events,\n };\n }\n const hasSandboxes = Object.keys(sandboxes).length > 0;\n if (Object.keys(modules).length > 0 || hasSandboxes) {\n if (input.bundle == null) {\n report(\n DiagnosticSeverity.Error,\n DiagnosticCode.Bundle,\n 'the definition needs a bundle but none was produced',\n );\n } else\n draft.bundle = {\n hash: input.bundle.hash,\n resolvers,\n hasPreparationFiles: Object.keys(preparationFiles(input.files)).length > 0,\n };\n }\n const validated = agentManifestSchema.safeParse(draft);\n if (!validated.success) {\n for (const issue of validated.error.issues) {\n report(\n DiagnosticSeverity.Error,\n DiagnosticCode.Manifest,\n `manifest ${issue.path.join('.')}: ${issue.message}`,\n );\n }\n }\n const failed = diagnostics.some((item) => item.severity === DiagnosticSeverity.Error);\n return {\n manifest: failed || !validated.success ? null : validated.data,\n modules,\n sandboxOpeners,\n channelRoutes,\n directoryFields,\n diagnostics,\n };\n};\n"],
5
- "mappings": "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",
4
+ "sourcesContent": ["import {\n agentManifestSchema,\n BaseCapability,\n bundleRef,\n CredentialNodeKind,\n credentialPolicySchema,\n DynamicEvent,\n findDynamicSlots,\n formatProviderRef,\n httpMcpServerBindingSchema,\n InstructionRole,\n jsonObjectSchema,\n MANIFEST_VERSION,\n McpServerBindingKind,\n packageRef,\n ProviderRefKind,\n providerRefSchema,\n SandboxAccess,\n SandboxAttach,\n ScheduleTarget,\n skillBundleSchema,\n ToolApproval,\n toolDescriptorSchema,\n type AgentManifestIface,\n type ChannelBindingIface,\n type DynamicSlotIface,\n type HookBindingIface,\n type JsonObject,\n type JsonValue,\n type McpServerBinding,\n type ProviderRef,\n type SandboxBindingIface,\n type ScheduleDefinitionIface,\n type SkillBundleIface,\n type ToolDescriptorIface,\n} from '@finalai/agent-provider';\nimport { Cron } from 'croner';\nimport * as z from 'zod';\nimport { HookEventKeyKind, normalizeHookKey } from \"../authoring/hooks.mjs\";\nimport type {\n DescribedAgentIface,\n DescribedBundleIface,\n DescribedDynamicIface,\n DescribedModuleIface,\n DescribedSandboxIface,\n} from \"../runtime/described.mjs\";\nimport { AUTHORED_SERVER_KEY, COMBINED_MCP_SERVERS_EXPORT, SlotKind } from \"../runtime/layout.mjs\";\nimport { IssueSeverity } from \"../runtime/lower.mjs\";\nimport {\n diagnostic,\n DiagnosticCode,\n DiagnosticSeverity,\n type DiagnosticIface,\n} from \"./diagnostics.mjs\";\nimport { InstructionSourceKind, isModulePath, type DiscoveryIface } from \"./discovery.mjs\";\nimport { preparationFiles } from \"./files.mjs\";\nimport { firstParagraphLine, frontMatterString, parseFrontMatter } from \"./frontmatter.mjs\";\n\nexport interface AssembleInputIface {\n installedSandboxProviders?: Readonly<Record<string, string>>;\n files: Record<string, string>;\n discovery: DiscoveryIface;\n described: DescribedBundleIface | null;\n fallbackName: string;\n bundle: { hash: string; code: string } | null;\n}\n\nexport interface AssembleOutputIface {\n manifest: AgentManifestIface | null;\n // Bundle export \u2192 directory-relative source path, for what the runtime calls.\n modules: Record<string, string>;\n // Target \u2192 bundle export of the sandbox.ts selector that opens it.\n sandboxOpeners: Record<string, string>;\n // Which config fields came from directory files, for the compatibility report.\n directoryFields: { instructions: string[]; skills: string[] };\n diagnostics: DiagnosticIface[];\n}\n\nconst SEVERITY = {\n [IssueSeverity.Error]: DiagnosticSeverity.Error,\n [IssueSeverity.Warning]: DiagnosticSeverity.Warning,\n [IssueSeverity.Note]: DiagnosticSeverity.Note,\n} satisfies Record<IssueSeverity, DiagnosticSeverity>;\n\nconst isObject = (value: JsonValue | undefined): value is JsonObject =>\n jsonObjectSchema.safeParse(value).success;\n\nconst DYNAMIC_EVENTS: ReadonlySet<string> = new Set(Object.values(DynamicEvent));\n\nconst toDynamicEvents = (events: string[]): DynamicEvent[] =>\n Object.values(DynamicEvent).filter((event) => events.includes(event));\n\nconst capabilityOf = (name: string): BaseCapability | null =>\n Object.values(BaseCapability).find((capability) => capability === name) ?? null;\n\nconst apiKeySecretSchema = z.looseObject({\n kind: z.literal(CredentialNodeKind.ApiKey),\n secret: z.string().min(1),\n});\n\n// A secret reference in harness config (`hop: { secretKey }` and every other\n// `final://schemas` secret ref).\nconst secretRefSchema = z.looseObject({ secretKey: z.string().min(1) });\n\n// Secret names a definition references outside authored code: API key\n// credential nodes and secret refs anywhere in the harness config (walked as JSON).\nconst configSecrets = (value: JsonValue): string[] => {\n if (Array.isArray(value)) return value.flatMap(configSecrets);\n if (!isObject(value)) return [];\n const node = apiKeySecretSchema.safeParse(value);\n const ref = secretRefSchema.safeParse(value);\n return [\n ...(node.success ? [node.data.secret] : []),\n ...(ref.success ? [ref.data.secretKey] : []),\n ...Object.values(value).flatMap(configSecrets),\n ];\n};\n\n// The manifest's secret allowlist: declared names plus every secret the\n// definition references by name. Sandbox `variables` are organization\n// variables, not secrets, and stay out.\nconst collectSecrets = (args: {\n declared: string[];\n config: JsonValue;\n mcpServers: AgentManifestIface['mcpServers'];\n reads: string[];\n}): string[] => {\n const names = new Set([...args.declared, ...args.reads]);\n for (const name of configSecrets(args.config)) names.add(name);\n if (Array.isArray(args.mcpServers)) {\n for (const binding of args.mcpServers) {\n if (\n binding.kind === McpServerBindingKind.Http &&\n binding.auth != null &&\n 'secretKey' in binding.auth\n ) {\n names.add(binding.auth.secretKey);\n }\n }\n }\n return [...names].sort();\n};\n\nconst SECRET_READ =\n /(?:secrets\\s*\\.\\s*get|credentials\\s*\\.\\s*secret)\\(\\s*(?:(['\"`])([^'\"`$\\\\]+)\\1\\s*\\)|(?!\\s*\\)))/g;\n\n// `secrets.get(...)` calls in authored source files, helpers included: a\n// string literal names the secret; any other argument is a computed read the\n// compiler cannot see.\nconst secretReferences = (files: Record<string, string>): { path: string; name: string | null }[] =>\n Object.entries(files)\n .filter(([path]) => isModulePath(path) || /\\.[jt]sx$/.test(path))\n .flatMap(([path, source]) =>\n [...source.matchAll(SECRET_READ)].map((match) => ({ path, name: match[2] ?? null })),\n );\n\nexport const assemble = (input: AssembleInputIface): AssembleOutputIface => {\n const diagnostics: DiagnosticIface[] = [];\n const report = (\n severity: DiagnosticSeverity,\n code: DiagnosticCode,\n message: string,\n path: string | null = null,\n ): void => {\n diagnostics.push(diagnostic({ severity, code, message, path }));\n };\n const modules: Record<string, string> = {};\n const runtimeExport = (name: string, path: string): void => {\n modules[name] = path;\n };\n const described = input.described?.modules ?? [];\n for (const module of described) {\n for (const issue of module.issues)\n report(SEVERITY[issue.severity], DiagnosticCode.Module, issue.message, module.path);\n }\n const ofSlot = (slot: SlotKind): DescribedModuleIface[] =>\n described.filter((module) => module.slot === slot);\n const withDefault = (slot: SlotKind): DescribedModuleIface[] =>\n ofSlot(slot).filter((module) => module.hasDefault && module.value != null);\n\n const dynamicSlotFor = (\n dynamic: DescribedDynamicIface,\n resolver: string,\n path: string,\n slotName: string,\n ): DynamicSlotIface | null => {\n for (const event of dynamic.events) {\n if (!DYNAMIC_EVENTS.has(event)) {\n report(\n DiagnosticSeverity.Error,\n DiagnosticCode.Module,\n `${slotName} resolves on ${event}; dynamic slots support session.started and turn.started (the harness owns steps)`,\n path,\n );\n }\n }\n const events = toDynamicEvents(dynamic.events);\n if (events.length === 0) {\n report(\n DiagnosticSeverity.Error,\n DiagnosticCode.Module,\n `${slotName} defineDynamic has no session.started or turn.started handler`,\n path,\n );\n return null;\n }\n runtimeExport(resolver, path);\n const slot: DynamicSlotIface = { $dynamic: { resolver, events } };\n if (dynamic.description != null) slot.$dynamic.description = dynamic.description;\n if (dynamic.preview != null) slot.$dynamic.preview = dynamic.preview;\n if ((dynamic.requiredBindings?.length ?? 0) > 0)\n slot.$dynamic.requiredBindings = dynamic.requiredBindings;\n // Build shows \"resolved at <export> on <event>\" without them.\n if (dynamic.description == null && dynamic.preview == null) {\n report(\n DiagnosticSeverity.Note,\n DiagnosticCode.Module,\n `${slotName} is resolved per session; give defineDynamic a description (and a preview) so Build can show what it resolves to`,\n path,\n );\n }\n return slot;\n };\n\n // agent.ts\n const agentModule = ofSlot(SlotKind.Agent)[0] ?? null;\n let agent: DescribedAgentIface | null = null;\n if (agentModule != null) {\n if (!agentModule.hasDefault) {\n report(\n DiagnosticSeverity.Error,\n DiagnosticCode.Module,\n 'agent.ts must export defineAgent({ ... }) as its default export',\n agentModule.path,\n );\n } else if (agentModule.value?.type === 'agent') agent = agentModule.value;\n }\n const agentPath = agentModule?.path ?? 'agent.ts';\n for (const name of input.described?.synthesized ?? []) {\n if (name !== COMBINED_MCP_SERVERS_EXPORT) runtimeExport(name, agentPath);\n }\n\n // Harness binding. Model, reasoning, credentials and permission mode are\n // harness config, never top-level agent fields.\n let harnessRef: ProviderRef | null = null;\n let config: JsonValue = {};\n if (agent?.harness == null) {\n // A missing or invalid default export is reported above.\n if (agentModule == null || agent != null) {\n report(\n DiagnosticSeverity.Error,\n DiagnosticCode.Harness,\n 'agent.ts must name a harness, e.g. defineAgent({ harness: serverlessPi({ model }) })',\n agentPath,\n );\n }\n } else {\n const parsed = providerRefSchema.safeParse(agent.harness.harness);\n if (parsed.success) harnessRef = parsed.data;\n else\n report(\n DiagnosticSeverity.Error,\n DiagnosticCode.Harness,\n 'agent.ts harness has an invalid provider reference',\n agentPath,\n );\n config = agent.harness.config;\n }\n if (harnessRef?.kind === 'bundle') runtimeExport(harnessRef.export, agentPath);\n const credentialPolicies = Object.values(jsonObjectSchema.safeParse(config).data ?? {}).filter(\n (value) => credentialPolicySchema.safeParse(value).success,\n );\n if (harnessRef != null && credentialPolicies.length !== 1) {\n report(\n DiagnosticSeverity.Error,\n DiagnosticCode.Harness,\n 'Declare exactly one credential policy in the harness config; billing policy belongs to this definition.',\n agentPath,\n );\n }\n\n const configObject = isObject(config) ? config : null;\n if (configObject == null && !findDynamicSlots(config).some((slot) => slot.path === '')) {\n report(\n DiagnosticSeverity.Error,\n DiagnosticCode.Harness,\n 'harness config must be an object',\n agentPath,\n );\n }\n\n // Instructions.\n const instructionFragments: JsonValue[] = [];\n const instructionSources: string[] = [];\n const instructionModules = new Map(\n ofSlot(SlotKind.Instructions).map((module) => [module.path, module]),\n );\n for (const source of input.discovery.instructions) {\n if (source.kind === InstructionSourceKind.Markdown) {\n const content = input.files[source.path] ?? '';\n if (content.trim().length === 0) {\n report(\n DiagnosticSeverity.Warning,\n DiagnosticCode.Instructions,\n `${source.path} is empty and was skipped`,\n source.path,\n );\n continue;\n }\n instructionFragments.push({ role: InstructionRole.System, content, source: source.path });\n instructionSources.push(source.path);\n continue;\n }\n const module = instructionModules.get(source.path);\n if (module == null || module.value == null) continue;\n if (module.value.type === 'instructions') {\n instructionFragments.push({\n role: module.value.role,\n content: module.value.content,\n source: source.path,\n });\n instructionSources.push(source.path);\n } else if (module.value.type === 'dynamic') {\n const slot = dynamicSlotFor(module.value, module.base, source.path, source.path);\n if (slot != null) {\n instructionFragments.push(slot);\n instructionSources.push(source.path);\n }\n }\n }\n\n // Skills.\n const skills: JsonValue[] = [];\n const skillSources: string[] = [];\n const skillKeys = new Set<string>();\n const addSkill = (key: string, skill: JsonValue, path: string): void => {\n if (skillKeys.has(key)) {\n report(\n DiagnosticSeverity.Error,\n DiagnosticCode.Skills,\n `skill ${key} is defined more than once`,\n path,\n );\n return;\n }\n skillKeys.add(key);\n skills.push(skill);\n skillSources.push(path);\n };\n for (const directory of input.discovery.skillDirectories) {\n const skillPath = `${directory.directory}/SKILL.md`;\n const text = input.files[skillPath] ?? '';\n const front = parseFrontMatter(text);\n if (front.error != null)\n report(DiagnosticSeverity.Warning, DiagnosticCode.Skills, front.error, skillPath);\n const description =\n frontMatterString(front.data, 'description') ?? firstParagraphLine(front.body);\n const files = [\n { path: 'SKILL.md', content: text },\n ...directory.files\n .filter((file) => file !== skillPath)\n .map((file) => ({\n path: file.slice(directory.directory.length + 1),\n content: input.files[file] ?? '',\n })),\n ];\n const skill: SkillBundleIface = { key: directory.key, files };\n if (description != null) skill.description = description;\n addSkill(directory.key, skill, skillPath);\n }\n for (const flat of input.discovery.skillMarkdown) {\n const text = input.files[flat.path] ?? '';\n const front = parseFrontMatter(text);\n const description =\n frontMatterString(front.data, 'description') ??\n firstParagraphLine(front.body) ??\n `Instructions for the ${flat.key} skill.`;\n const content = text.startsWith('---\\n')\n ? text\n : `---\\nname: ${JSON.stringify(flat.key)}\\ndescription: ${JSON.stringify(description)}\\n---\\n\\n${text}`;\n addSkill(\n flat.key,\n { key: flat.key, description, files: [{ path: 'SKILL.md', content }] },\n flat.path,\n );\n }\n for (const module of withDefault(SlotKind.Skill)) {\n if (module.value?.type === 'skill') {\n const parsed = skillBundleSchema.safeParse(module.value.skill);\n if (parsed.success) addSkill(module.key, parsed.data, module.path);\n } else if (module.value?.type === 'dynamic') {\n const slot = dynamicSlotFor(module.value, module.base, module.path, module.path);\n if (slot != null) addSkill(module.key, slot, module.path);\n }\n }\n\n const directoryFields = { instructions: instructionSources, skills: skillSources };\n if (configObject != null) {\n if (instructionFragments.length > 0) {\n if (configObject['instructions'] != null) {\n report(\n DiagnosticSeverity.Error,\n DiagnosticCode.Conflict,\n 'harness config sets instructions and the directory has instruction files; keep one source',\n agentPath,\n );\n } else configObject['instructions'] = instructionFragments;\n }\n if (skills.length > 0) {\n if (configObject['skills'] != null) {\n report(\n DiagnosticSeverity.Error,\n DiagnosticCode.Conflict,\n 'harness config sets skills and the directory has skills/; keep one source',\n agentPath,\n );\n } else configObject['skills'] = skills;\n }\n } else if (instructionFragments.length > 0 || skills.length > 0) {\n report(\n DiagnosticSeverity.Error,\n DiagnosticCode.Conflict,\n 'harness config is dynamic, so directory instructions and skills cannot be added to it',\n agentPath,\n );\n }\n\n // MCP servers: authored tools and connections.\n const toolPolicy: Record<string, ToolApproval> = {};\n const toolDescriptors: ToolDescriptorIface[] = [];\n const toolApprovals: Record<string, ToolApproval> = {};\n let anyDynamicServer = false;\n let anyTurnStartedServer = false;\n for (const module of ofSlot(SlotKind.Tool)) {\n if (!module.hasDefault || module.value == null) continue;\n if (module.value.type === 'dynamic') {\n anyDynamicServer = true;\n anyTurnStartedServer ||= module.value.events.includes(DynamicEvent.TurnStarted);\n runtimeExport(module.base, module.path);\n continue;\n }\n if (module.value.type !== 'tool') continue;\n const parsed = toolDescriptorSchema.safeParse(module.value.descriptor);\n if (!parsed.success) {\n report(\n DiagnosticSeverity.Error,\n DiagnosticCode.Module,\n `tool ${module.key} has an invalid descriptor`,\n module.path,\n );\n continue;\n }\n toolDescriptors.push(parsed.data);\n const approval =\n module.value.approval === ToolApproval.Ask ? ToolApproval.Ask : ToolApproval.Allow;\n toolApprovals[module.key] = approval;\n if (approval === ToolApproval.Ask && parsed.data.inputApproval == null)\n toolPolicy[`${AUTHORED_SERVER_KEY}/${module.key}`] = ToolApproval.Ask;\n runtimeExport(module.base, module.path);\n }\n const connections: McpServerBinding[] = [];\n const connectionKeys = new Set<string>();\n for (const module of ofSlot(SlotKind.Connection)) {\n if (!module.hasDefault || module.value == null) continue;\n if (module.key === AUTHORED_SERVER_KEY) {\n report(\n DiagnosticSeverity.Error,\n DiagnosticCode.Connections,\n `connection name ${AUTHORED_SERVER_KEY} is reserved for authored tools`,\n module.path,\n );\n continue;\n }\n if (connectionKeys.has(module.key)) {\n report(\n DiagnosticSeverity.Error,\n DiagnosticCode.Connections,\n `connection ${module.key} is defined more than once`,\n module.path,\n );\n continue;\n }\n connectionKeys.add(module.key);\n if (module.value.type === 'dynamic') {\n anyDynamicServer = true;\n anyTurnStartedServer ||= module.value.events.includes(DynamicEvent.TurnStarted);\n runtimeExport(module.base, module.path);\n continue;\n }\n if (module.value.type !== 'connection') continue;\n const parsed = httpMcpServerBindingSchema.safeParse(module.value.binding);\n if (!parsed.success) {\n report(\n DiagnosticSeverity.Error,\n DiagnosticCode.Connections,\n `connection ${module.key} is invalid: ${parsed.error.issues[0]?.message ?? 'invalid'}`,\n module.path,\n );\n continue;\n }\n connections.push(parsed.data);\n if (parsed.data.inputApprovals != null) runtimeExport(module.base, module.path);\n for (const [tool, approval] of Object.entries(parsed.data.approvals ?? {})) {\n if (approval === ToolApproval.Ask && !Object.hasOwn(parsed.data.inputApprovals ?? {}, tool))\n toolPolicy[`${module.key}/${tool}`] = ToolApproval.Ask;\n }\n }\n let mcpServers: AgentManifestIface['mcpServers'];\n if (anyDynamicServer) {\n mcpServers = {\n $dynamic: {\n resolver: COMBINED_MCP_SERVERS_EXPORT,\n requiredBindings: [...ofSlot(SlotKind.Connection), ...ofSlot(SlotKind.Tool)].flatMap(\n (module) =>\n module.value?.type === 'dynamic' ? (module.value.requiredBindings ?? []) : [],\n ),\n events: anyTurnStartedServer\n ? [DynamicEvent.SessionStarted, DynamicEvent.TurnStarted]\n : [DynamicEvent.SessionStarted],\n description:\n 'Authored tools and connections, including the dynamic ones, resolved when the session starts.',\n },\n };\n runtimeExport(COMBINED_MCP_SERVERS_EXPORT, '<synthesized>');\n } else {\n mcpServers = [\n ...(toolDescriptors.length === 0\n ? []\n : [\n {\n key: AUTHORED_SERVER_KEY,\n kind: McpServerBindingKind.Worker,\n tools: toolDescriptors,\n approvals: toolApprovals,\n } satisfies McpServerBinding,\n ]),\n ...connections,\n ];\n }\n for (const [key, policy] of Object.entries(agent?.toolPolicy ?? {})) {\n toolPolicy[key] = policy === 'ask' ? ToolApproval.Ask : ToolApproval.Allow;\n }\n\n // Sandboxes.\n const sandboxModule = ofSlot(SlotKind.Sandbox)[0];\n const sandbox: DescribedSandboxIface | null =\n sandboxModule?.value?.type === 'sandbox' ? sandboxModule.value : null;\n const sandboxPath = sandboxModule?.path ?? 'sandbox.ts';\n const sandboxes: Record<string, SandboxBindingIface> = {};\n const sandboxOpeners: Record<string, string> = {};\n const providerExportByName = new Map(\n Object.entries(sandbox?.providers ?? {}).map(([exportName, name]) => [name, exportName]),\n );\n const duplicateNames = new Set<string>();\n for (const name of Object.values(sandbox?.providers ?? {})) {\n if (duplicateNames.has(name))\n report(\n DiagnosticSeverity.Error,\n DiagnosticCode.Sandbox,\n `sandbox.ts exports multiple providers named ${name}; give each provider a distinct name`,\n sandboxPath,\n );\n duplicateNames.add(name);\n }\n const providerFor = (args: {\n ref: JsonValue | null;\n name: string | null;\n target: string;\n }): ProviderRef | null => {\n if (args.ref != null) {\n const parsed = providerRefSchema.safeParse(args.ref);\n if (parsed.success) return parsed.data;\n }\n if (args.name != null) {\n const exportName = providerExportByName.get(args.name);\n if (exportName != null) {\n runtimeExport(exportName, sandboxPath);\n return bundleRef(exportName);\n }\n report(\n DiagnosticSeverity.Error,\n DiagnosticCode.Sandbox,\n `sandbox target ${args.target} uses provider ${args.name}, which is neither installed nor exported from sandbox.ts`,\n sandboxPath,\n );\n return null;\n }\n report(\n DiagnosticSeverity.Error,\n DiagnosticCode.Sandbox,\n `sandbox target ${args.target} is dynamic and its provider cannot be inferred; give defineDynamic a provider ({ provider: computer, events })`,\n sandboxPath,\n );\n return null;\n };\n // A dynamic target without a provider hint: the\n // provider its resolver returns an environment of is unknown until a session\n // starts, so an installed provider is inferred here (the target's name, or\n // the one installed provider sandbox.ts uses) and checked by reference when\n // the slot resolves. Providers defined in sandbox.ts still need the hint:\n // their environments carry only a name, which cannot be checked.\n const inferredProvider = (target: string): { ref: JsonValue; name: string } | null => {\n if (providerExportByName.size > 0) return null;\n const specifier = Object.hasOwn(input.installedSandboxProviders ?? {}, target)\n ? input.installedSandboxProviders?.[target]\n : undefined;\n if (specifier != null) return { ref: packageRef(specifier), name: target };\n const installed = new Map<string, { ref: JsonValue; name: string }>();\n for (const described of Object.values(sandbox?.targets ?? {})) {\n const environment = described.environment;\n const parsed = providerRefSchema.safeParse(environment?.providerRef);\n if (environment?.providerName == null || !parsed.success) continue;\n if (parsed.data.kind !== ProviderRefKind.Package) continue;\n installed.set(formatProviderRef(parsed.data), {\n ref: environment.providerRef,\n name: environment.providerName,\n });\n }\n return installed.size === 1 ? ([...installed.values()][0] ?? null) : null;\n };\n for (const [target, described] of Object.entries(sandbox?.targets ?? {})) {\n if (described.environment != null) {\n const environment = described.environment;\n const provider = providerFor({\n ref: environment.providerRef,\n name: environment.providerName,\n target,\n });\n if (provider == null) continue;\n const open: JsonValue | undefined = environment.openOptions ?? undefined;\n if (\n open != null &&\n (!isObject(open) || Object.keys(open).some((key) => key !== 'access' && key !== 'attach'))\n ) {\n report(\n DiagnosticSeverity.Error,\n DiagnosticCode.Sandbox,\n `sandbox target ${target} open options support only access and attach`,\n sandboxPath,\n );\n continue;\n }\n const access = isObject(open) ? open['access'] : undefined;\n const attach = isObject(open) ? open['attach'] : undefined;\n if (\n access != null &&\n access !== SandboxAccess.Read &&\n access !== SandboxAccess.Execute &&\n access !== SandboxAccess.Write\n ) {\n report(\n DiagnosticSeverity.Error,\n DiagnosticCode.Sandbox,\n `sandbox target ${target} has invalid access ${String(access)}`,\n sandboxPath,\n );\n continue;\n }\n if (attach != null && attach !== SandboxAttach.OnPrompt && attach !== SandboxAttach.Lazy) {\n report(\n DiagnosticSeverity.Error,\n DiagnosticCode.Sandbox,\n `sandbox target ${target} has invalid attach ${String(attach)}`,\n sandboxPath,\n );\n continue;\n }\n sandboxes[target] = {\n provider,\n environment: environment.options,\n access:\n access === SandboxAccess.Read || access === SandboxAccess.Execute\n ? access\n : SandboxAccess.Write,\n attach: attach === SandboxAttach.OnPrompt ? SandboxAttach.OnPrompt : SandboxAttach.Lazy,\n };\n } else if (described.dynamic != null) {\n const hinted = described.dynamic.provider;\n const inferred = hinted == null ? inferredProvider(target) : null;\n if (inferred != null) {\n report(\n DiagnosticSeverity.Note,\n DiagnosticCode.Sandbox,\n `sandbox target ${target} is dynamic; its provider is ${inferred.name}, and its resolver must return a ${inferred.name} environment`,\n sandboxPath,\n );\n }\n const provider = providerFor({\n ref: hinted?.ref ?? inferred?.ref ?? null,\n name: hinted?.name ?? inferred?.name ?? null,\n target,\n });\n const slot = dynamicSlotFor(\n described.dynamic,\n described.exportName,\n sandboxPath,\n `sandbox target ${target}`,\n );\n if (provider == null || slot == null) continue;\n sandboxes[target] = {\n provider,\n environment: slot,\n access: SandboxAccess.Write,\n attach: SandboxAttach.Lazy,\n };\n }\n }\n if (\n sandbox?.selector === true &&\n sandbox.defaultTarget != null &&\n sandboxes[sandbox.defaultTarget] != null\n ) {\n sandboxOpeners[sandbox.defaultTarget] = 'sandbox';\n runtimeExport('sandbox', sandboxPath);\n report(\n DiagnosticSeverity.Note,\n DiagnosticCode.Sandbox,\n `sandbox.ts default export opens target ${sandbox.defaultTarget} for each session`,\n sandboxPath,\n );\n }\n\n // Base tools.\n const base: AgentManifestIface['tools']['base'] = {};\n if (agent?.tools != null) {\n for (const [name, target] of Object.entries(agent.tools)) {\n const capability = capabilityOf(name);\n if (capability == null) {\n report(\n DiagnosticSeverity.Error,\n DiagnosticCode.BaseTools,\n `baseTools has unknown capability ${name}`,\n agentPath,\n );\n continue;\n }\n if (sandboxes[target] == null) {\n report(\n DiagnosticSeverity.Error,\n DiagnosticCode.BaseTools,\n `baseTools ${name} is bound to ${target}, which is not a sandbox target`,\n agentPath,\n );\n continue;\n }\n base[capability] = { target };\n }\n }\n // Capabilities declared on the harness's own host (`harnessHost`).\n const host: BaseCapability[] = [];\n for (const name of agent?.hostTools ?? []) {\n const capability = capabilityOf(name);\n if (capability == null) {\n report(\n DiagnosticSeverity.Error,\n DiagnosticCode.BaseTools,\n `baseTools has unknown capability ${name}`,\n agentPath,\n );\n continue;\n }\n if (base[capability] != null) {\n report(\n DiagnosticSeverity.Error,\n DiagnosticCode.BaseTools,\n `baseTools ${name} is bound both to a sandbox target and to harnessHost`,\n agentPath,\n );\n continue;\n }\n host.push(capability);\n }\n\n // Channels.\n const channels: ChannelBindingIface[] = [];\n let roomSurface: AgentManifestIface['roomSurface'];\n const channelKeys = new Set<string>();\n const addChannel = (binding: ChannelBindingIface, path: string): void => {\n if (channelKeys.has(binding.key)) {\n report(\n DiagnosticSeverity.Error,\n DiagnosticCode.Channel,\n `channel ${binding.key} is bound more than once`,\n path,\n );\n return;\n }\n channelKeys.add(binding.key);\n channels.push(binding);\n };\n for (const module of withDefault(SlotKind.Channel)) {\n if (module.value?.type !== 'channel') continue;\n const { value } = module;\n if (value.disabled) continue;\n if (value.invalidFields.length > 0) {\n report(\n DiagnosticSeverity.Error,\n DiagnosticCode.Channel,\n `channel ${module.key} requires valid ${value.invalidFields.join(', ')}`,\n module.path,\n );\n continue;\n }\n for (const route of value.routes) {\n if (!route.path.startsWith('/')) {\n report(\n DiagnosticSeverity.Error,\n DiagnosticCode.Channel,\n `channel ${module.key} route ${route.path} must start with /`,\n module.path,\n );\n }\n }\n const parsedConfig = jsonObjectSchema.safeParse(value.config);\n const installed = value.installed == null ? null : providerRefSchema.safeParse(value.installed);\n if (installed != null && !installed.success) {\n report(\n DiagnosticSeverity.Error,\n DiagnosticCode.Channel,\n `channel ${module.key} has an invalid installed reference`,\n module.path,\n );\n continue;\n }\n const channel = installed == null ? bundleRef(module.base) : installed.data;\n const config = parsedConfig.success ? parsedConfig.data : {};\n if (value.room) {\n if (module.key !== 'final')\n report(\n DiagnosticSeverity.Error,\n DiagnosticCode.Channel,\n 'The Final room surface must be channels/final.ts',\n module.path,\n );\n roomSurface = { channel, config, source: 'authored' };\n } else\n addChannel(\n {\n key: module.key,\n channel,\n config,\n source: 'authored',\n credentials: value.credentials ?? { app: null },\n surface: value.surface,\n },\n module.path,\n );\n if (value.installed != null) continue;\n runtimeExport(module.base, module.path);\n }\n for (const [index, binding] of (agent?.channels ?? []).entries()) {\n const ref = providerRefSchema.safeParse(binding.channel);\n if (!ref.success) {\n report(\n DiagnosticSeverity.Error,\n DiagnosticCode.Channel,\n `agent.ts channels[${index}] has an invalid channel reference`,\n agentPath,\n );\n continue;\n }\n if (binding.credentials == null || binding.surface == null) {\n report(\n DiagnosticSeverity.Error,\n DiagnosticCode.Channel,\n `agent.ts channels[${index}] must use a channel factory or declare its credentials and surface`,\n agentPath,\n );\n continue;\n }\n const config = jsonObjectSchema.safeParse(binding.config);\n const key =\n binding.key ??\n (ref.data.kind === 'package'\n ? (ref.data.specifier.split('/').at(-1) ?? ref.data.specifier)\n : ref.data.export);\n addChannel(\n {\n key,\n channel: ref.data,\n config: config.success ? config.data : {},\n credentials: binding.credentials,\n surface: binding.surface,\n ...(binding.install == null ? {} : { install: binding.install }),\n },\n agentPath,\n );\n }\n\n // Hooks.\n const hooks: HookBindingIface[] = [];\n for (const module of withDefault(SlotKind.Hook)) {\n if (module.value?.type !== 'hook') continue;\n const events: string[] = [];\n for (const key of module.value.keys) {\n const normalized = normalizeHookKey(key);\n switch (normalized.kind) {\n case HookEventKeyKind.Unknown:\n report(\n DiagnosticSeverity.Error,\n DiagnosticCode.Hook,\n `hook ${module.key} subscribes to unknown event ${key}`,\n module.path,\n );\n break;\n case HookEventKeyKind.Canonical:\n case HookEventKeyKind.Wildcard:\n events.push(...normalized.events);\n break;\n }\n }\n const unique = [...new Set(events)];\n if (unique.length === 0) {\n report(\n DiagnosticSeverity.Warning,\n DiagnosticCode.Hook,\n `hook ${module.key} subscribes to no events and was left out`,\n module.path,\n );\n continue;\n }\n hooks.push({ slug: module.key, export: module.base, events: unique });\n runtimeExport(module.base, module.path);\n }\n\n // Schedules.\n const schedules: ScheduleDefinitionIface[] = [];\n const addSchedule = (args: {\n key: string;\n path: string;\n cron: string | null;\n timezone: string | null;\n target: string | null;\n prompt: string | null;\n }): void => {\n const { key, path } = args;\n if (args.cron == null) {\n report(\n DiagnosticSeverity.Error,\n DiagnosticCode.Schedule,\n `schedule ${key} needs a cron expression`,\n path,\n );\n return;\n }\n const timezone = args.timezone ?? 'UTC';\n try {\n new Cron(args.cron, { timezone, paused: true }).nextRun();\n } catch (cause) {\n report(\n DiagnosticSeverity.Error,\n DiagnosticCode.Schedule,\n `schedule ${key}: ${cause instanceof Error ? cause.message : String(cause)}`,\n path,\n );\n return;\n }\n const target = Object.values(ScheduleTarget).find(\n (candidate) => candidate === (args.target ?? ScheduleTarget.OwnerDirect),\n );\n if (target == null) {\n report(\n DiagnosticSeverity.Error,\n DiagnosticCode.Schedule,\n `schedule ${key} target must be owner-direct or bound-conversation`,\n path,\n );\n return;\n }\n const prompt = args.prompt?.trim() ?? '';\n if (prompt.length === 0) {\n report(\n DiagnosticSeverity.Error,\n DiagnosticCode.Schedule,\n `schedule ${key} needs a prompt`,\n path,\n );\n return;\n }\n schedules.push({ key, cron: args.cron, timezone, prompt, target });\n };\n for (const item of input.discovery.scheduleMarkdown) {\n const front = parseFrontMatter(input.files[item.path] ?? '');\n if (front.error != null)\n report(DiagnosticSeverity.Error, DiagnosticCode.Schedule, front.error, item.path);\n const field = (name: string): string | null => frontMatterString(front.data, name);\n addSchedule({\n key: item.key,\n path: item.path,\n cron: field('cron'),\n timezone: field('timezone'),\n target: field('target'),\n prompt: front.body,\n });\n }\n for (const module of withDefault(SlotKind.Schedule)) {\n if (module.value?.type !== 'schedule') continue;\n addSchedule({\n key: module.key,\n path: module.path,\n cron: module.value.cron,\n timezone: module.value.timezone,\n target: module.value.target,\n prompt: module.value.markdown,\n });\n }\n const scheduleKeys = new Set<string>();\n for (const schedule of schedules) {\n if (scheduleKeys.has(schedule.key)) {\n report(\n DiagnosticSeverity.Error,\n DiagnosticCode.Schedule,\n `schedule ${schedule.key} is defined more than once`,\n );\n }\n scheduleKeys.add(schedule.key);\n }\n\n for (const rejected of input.discovery.rejected) {\n report(DiagnosticSeverity.Error, DiagnosticCode.RejectedSlot, rejected.message, rejected.path);\n }\n for (const unsupported of input.discovery.unsupported) {\n report(\n DiagnosticSeverity.Warning,\n DiagnosticCode.RejectedSlot,\n unsupported.message,\n unsupported.path,\n );\n }\n\n // Literal `secrets.get('<name>')` reads join the allowlist; a computed name\n // must be declared in agent.ts, or the read fails at run time.\n const references = secretReferences(input.files);\n const secrets = collectSecrets({\n declared: [\n ...(agent?.secrets ?? []),\n ...channels.flatMap((channel) => channel.credentials.secrets ?? []),\n ],\n config,\n mcpServers: connections,\n reads: references.flatMap((reference) => (reference.name == null ? [] : [reference.name])),\n });\n const computedReads = new Set(\n references.flatMap((reference) => (reference.name == null ? [reference.path] : [])),\n );\n for (const path of computedReads) {\n report(\n DiagnosticSeverity.Note,\n DiagnosticCode.Secrets,\n `${path} reads a secret by a computed name; list it in defineAgent({ secrets: [...] }) or the read fails at run time`,\n path,\n );\n }\n\n if (harnessRef == null) {\n return { manifest: null, modules, sandboxOpeners, directoryFields, diagnostics };\n }\n const draft: AgentManifestIface = {\n version: MANIFEST_VERSION,\n identity: {\n name: agent?.name ?? input.fallbackName,\n description: agent?.description ?? null,\n ...(agent?.avatar == null ? {} : { avatar: agent.avatar }),\n },\n harness: { harness: harnessRef, config },\n mcpServers,\n sandboxes,\n tools: host.length === 0 ? { base } : { base, host },\n toolPolicy,\n secrets,\n channels,\n roomSurface,\n channelSources: Object.fromEntries(\n withDefault(SlotKind.Channel).flatMap((module) =>\n module.value?.type === 'channel'\n ? [\n [\n module.key,\n { path: module.path, source: 'authored', disabled: module.value.disabled },\n ],\n ]\n : [],\n ),\n ),\n hooks,\n schedules,\n bundle: null,\n };\n const resolvers: NonNullable<AgentManifestIface['bundle']>['resolvers'] = {};\n for (const found of findDynamicSlots(draft)) {\n resolvers[found.path] = {\n export: found.slot.$dynamic.resolver,\n events: found.slot.$dynamic.events,\n };\n }\n const hasSandboxes = Object.keys(sandboxes).length > 0;\n if (Object.keys(modules).length > 0 || hasSandboxes) {\n if (input.bundle == null) {\n report(\n DiagnosticSeverity.Error,\n DiagnosticCode.Bundle,\n 'the definition needs a bundle but none was produced',\n );\n } else\n draft.bundle = {\n hash: input.bundle.hash,\n resolvers,\n hasPreparationFiles: Object.keys(preparationFiles(input.files)).length > 0,\n };\n }\n const validated = agentManifestSchema.safeParse(draft);\n if (!validated.success) {\n for (const issue of validated.error.issues) {\n report(\n DiagnosticSeverity.Error,\n DiagnosticCode.Manifest,\n `manifest ${issue.path.join('.')}: ${issue.message}`,\n );\n }\n }\n const failed = diagnostics.some((item) => item.severity === DiagnosticSeverity.Error);\n return {\n manifest: failed || !validated.success ? null : validated.data,\n modules,\n sandboxOpeners,\n directoryFields,\n diagnostics,\n };\n};\n"],
5
+ "mappings": "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",
6
6
  "names": ["described", "config"]
7
7
  }
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../../../../src/compiler/bundle.ts"],
4
- "sourcesContent": ["import { build, transform, type Loader, type Message, type Plugin } from 'esbuild';\nimport { createHash } from 'node:crypto';\nimport { existsSync } from 'node:fs';\nimport { readFile, realpath } from 'node:fs/promises';\nimport { isBuiltin } from 'node:module';\nimport { dirname, isAbsolute, posix, relative, resolve } from 'node:path';\nimport * as z from 'zod';\nimport type { LayoutModuleIface } from \"../runtime/layout.mjs\";\nimport { MAX_FILE_BYTES, preparationFiles } from \"./files.mjs\";\nimport {\n packageEntry,\n packageImportTarget,\n splitSpecifier,\n type VendoredPackageIface,\n} from \"./packages.mjs\";\n\n// Where this package's sources live. The compiler bundles authored code against\n// the authoring modules as source, so a host that runs the compiler from a\n// bundle (agent-session-service) passes the installed package's root.\nconst packedAssets = resolve(import.meta.dirname, '..', '..', 'compiler-assets');\nexport const DEFAULT_packageRoot = existsSync(packedAssets)\n ? packedAssets\n : resolve(import.meta.dirname, '..', '..');\n\ninterface CompilerAssetsIface {\n packageRoot: string;\n bundleRuntime: string;\n // Import specifiers authored code uses for the authoring API.\n aliases: Map<string, string>;\n}\n\nconst compilerAssets = (packageRoot: string): CompilerAssetsIface => {\n const src = resolve(packageRoot, 'src');\n const authoring = resolve(src, 'authoring');\n return {\n packageRoot,\n bundleRuntime: resolve(src, 'runtime', 'bundle.ts'),\n aliases: new Map<string, string>(\n Object.entries({\n '@finalai/agents': resolve(authoring, 'index.ts'),\n '@finalai/agents/instructions': resolve(authoring, 'instructions.ts'),\n '@finalai/agents/approval': resolve(authoring, 'approval.ts'),\n '@finalai/agents/hooks': resolve(authoring, 'hooks.ts'),\n '@finalai/agents/tools': resolve(authoring, 'tools.ts'),\n '@finalai/agents/channels': resolve(authoring, 'channels.ts'),\n // Final's sandbox helpers are pure, so authored code bundles the provider\n // package's own module (as it does a vendor package's), never a copy.\n '@finalai/agent-definition': resolve(src, 'index.ts'),\n '@finalai/agent-definition/authoring': resolve(authoring, 'index.ts'),\n '@finalai/agent-definition/instructions': resolve(authoring, 'instructions.ts'),\n '@finalai/agent-definition/approval': resolve(authoring, 'approval.ts'),\n '@finalai/agent-definition/hooks': resolve(authoring, 'hooks.ts'),\n '@finalai/agent-definition/tools': resolve(authoring, 'tools.ts'),\n '@finalai/agent-definition/channels': resolve(authoring, 'channels.ts'),\n '@finalai/agent-definition/manifest': resolve(src, 'manifest.ts'),\n }),\n ),\n };\n};\n\nconst SOURCE_NAMESPACE = 'agent-source';\nconst SOURCE_PREFIX = `${SOURCE_NAMESPACE}:`;\n// Vendored workspace packages: `<package name>:<package-relative path>`.\nconst PACKAGE_NAMESPACE = 'agent-package';\n\nconst packagePath = (name: string, file: string): string => `${name}:${file}`;\n\ninterface PackageFileIface {\n name: string;\n file: string;\n}\n\nconst splitPackagePath = (path: string): PackageFileIface => {\n const index = path.indexOf(':');\n return { name: path.slice(0, index), file: path.slice(index + 1) };\n};\n\nconst LOADERS = new Map<string, Loader>(\n Object.entries({\n '.ts': 'ts',\n '.mts': 'ts',\n '.cts': 'ts',\n '.tsx': 'tsx',\n '.js': 'js',\n '.mjs': 'js',\n '.cjs': 'js',\n '.jsx': 'jsx',\n '.json': 'json',\n '.md': 'text',\n '.txt': 'text',\n }),\n);\n\n// esbuild rejects a failed build with its messages attached.\nconst buildFailureSchema = z.object({\n errors: z.array(z.custom<Message>((value) => value instanceof Object)),\n});\n\nconst RESOLVE_EXTENSIONS = [\n '',\n '.ts',\n '.tsx',\n '.mts',\n '.cts',\n '.js',\n '.jsx',\n '.mjs',\n '.cjs',\n '.json',\n '/index.ts',\n '/index.tsx',\n '/index.mts',\n '/index.cts',\n '/index.js',\n '/index.jsx',\n '/index.mjs',\n '/index.cjs',\n];\n\nexport interface BundleInputIface {\n files: Record<string, string>;\n layout: LayoutModuleIface[];\n // Real directory of the sources, for resolving packages they import; null\n // for file maps (packages then resolve from this package's dependencies).\n root: string | null;\n // This package's installed root; defaults to the source checkout.\n packageRoot?: string;\n // Workspace packages the agent imports, by package name (packages.ts).\n packages?: Record<string, VendoredPackageIface>;\n // Authoring modules of provider packages the host installed, by import\n // specifier (CompileOptionsIface.providerModules).\n providerModules?: Readonly<Record<string, string>>;\n}\n\nexport interface BundleProblemIface {\n path: string | null;\n message: string;\n builtin: boolean;\n}\n\nexport interface BundleOutputIface {\n code: string | null;\n hash: string | null;\n problems: BundleProblemIface[];\n}\n\nconst resolveVirtual = (\n files: Record<string, string>,\n fromDir: string,\n specifier: string,\n): string | null => {\n const joined = posix.normalize(posix.join(fromDir, specifier));\n if (joined === '..' || joined.startsWith('../') || joined.startsWith('/')) return null;\n const candidates = [joined];\n // TypeScript's convention: `./x.js` names `x.ts` (`.mjs` \u2192 `.mts`, `.cjs` \u2192 `.cts`).\n if (/\\.jsx?$/.test(joined)) {\n const stem = joined.replace(/\\.jsx?$/, '');\n candidates.push(`${stem}.ts`, `${stem}.tsx`);\n } else if (joined.endsWith('.mjs')) candidates.push(joined.replace(/\\.mjs$/, '.mts'));\n else if (joined.endsWith('.cjs')) candidates.push(joined.replace(/\\.cjs$/, '.cts'));\n for (const candidate of candidates) {\n for (const extension of RESOLVE_EXTENSIONS) {\n const path = `${candidate}${extension}`;\n if (Object.hasOwn(files, path)) return path;\n }\n }\n return null;\n};\n\nconst escapes = (fromDir: string, specifier: string): boolean => {\n const joined = posix.normalize(posix.join(fromDir, specifier));\n return joined === '..' || joined.startsWith('../');\n};\n\nconst withinDependency = async (args: {\n specifier: string;\n path: string;\n resolveDir: string;\n packageRoot: string;\n}): Promise<boolean> => {\n const segments = args.specifier.split('/');\n const name = segments[0]?.startsWith('@') ? segments.slice(0, 2).join('/') : segments[0];\n if (name == null || name.length === 0) return false;\n const candidates = [resolve(args.packageRoot, 'node_modules', name)];\n let directory = args.resolveDir;\n for (;;) {\n candidates.push(resolve(directory, 'node_modules', name));\n // Node also resolves a package's own name from inside that package.\n const self = await readFile(resolve(directory, 'package.json'), 'utf8')\n .then((text) => z.object({ name: z.string() }).parse(JSON.parse(text)))\n .catch(() => null);\n if (self?.name === name) candidates.push(directory);\n const parent = dirname(directory);\n if (parent === directory) break;\n directory = parent;\n }\n const path = await realpath(args.path).catch(() => null);\n if (path == null) return false;\n for (const candidate of candidates) {\n // pnpm workspace dependencies resolve to their source directory through a symlink.\n const root = await realpath(candidate).catch(() => null);\n if (root == null) continue;\n const distance = relative(root, path);\n if (!isAbsolute(distance) && distance !== '..' && !distance.startsWith('../')) return true;\n }\n return false;\n};\n\nconst entrySource = (layout: LayoutModuleIface[], bundleRuntime: string): string => {\n const imports = layout.map(\n (entry, index) =>\n `import * as m${index} from ${JSON.stringify(`${SOURCE_PREFIX}${entry.path}`)};`,\n );\n return [\n ...imports,\n `import { createAgentBundle } from ${JSON.stringify(bundleRuntime)};`,\n `const bundle = createAgentBundle({ layout: ${JSON.stringify(layout)}, namespaces: [${layout.map((_, index) => `m${index}`).join(', ')}] });`,\n 'export const modules = bundle.modules;',\n 'export const runtime = bundle.runtime;',\n 'export const __describe = bundle.describe;',\n ].join('\\n');\n};\n\nconst formatMessage = (message: Message): BundleProblemIface => {\n const location = message.location;\n const file = location?.file ?? null;\n const path =\n file == null ? null : file.startsWith(SOURCE_PREFIX) ? file.slice(SOURCE_PREFIX.length) : file;\n const text = message.text;\n return {\n path,\n message: location == null ? text : `${text} (${path ?? 'bundle'}:${location.line})`,\n builtin: false,\n };\n};\n\n// Bundles every authored module, the authoring API and the bundle runtime\n// into one ESM module for the Worker isolate. Node built-ins are rejected.\nexport const bundleAgent = async (input: BundleInputIface): Promise<BundleOutputIface> => {\n const assets = compilerAssets(input.packageRoot ?? DEFAULT_packageRoot);\n const packageRoot = assets.packageRoot;\n const builtinImports: { importer: string; path: string }[] = [];\n const outsideImports: string[] = [];\n const sourcePlugin: Plugin = {\n name: 'agent-sources',\n setup: (api) => {\n api.onResolve({ filter: /.*/ }, async (args) => {\n const specifier = args.path;\n if (args.pluginData === 'final-resolving') return null;\n if (specifier.startsWith(SOURCE_PREFIX)) {\n return { path: specifier.slice(SOURCE_PREFIX.length), namespace: SOURCE_NAMESPACE };\n }\n const fromSource = args.namespace === SOURCE_NAMESPACE;\n const importer =\n fromSource || args.namespace === PACKAGE_NAMESPACE\n ? args.importer\n : posix.relative(packageRoot, args.importer);\n if (isBuiltin(specifier)) {\n builtinImports.push({ importer, path: specifier });\n return { path: specifier, external: true };\n }\n const alias =\n (Object.hasOwn(input.providerModules ?? {}, specifier)\n ? input.providerModules?.[specifier]\n : undefined) ?? assets.aliases.get(specifier);\n // A re-exporting authoring module reaches the provider's canonical package.\n if (alias != null && alias !== args.importer) return { path: alias };\n const fromPackage = args.namespace === PACKAGE_NAMESPACE;\n if (!fromSource && !fromPackage) return null;\n const owner = fromPackage ? splitPackagePath(args.importer) : null;\n const fromDir = posix.dirname(owner?.file ?? args.importer);\n if (specifier.startsWith('#')) {\n const files = owner == null ? input.files : (input.packages?.[owner.name]?.files ?? {});\n const target = packageImportTarget({\n packageJson: files['package.json'],\n specifier: specifier,\n require: args.kind === 'require-call' || args.kind === 'require-resolve',\n });\n if (target == null || !target.startsWith('./') || escapes('', target))\n return {\n errors: [\n {\n text: `Could not resolve package import ${specifier} from ${args.importer}; imports must name source files inside the package`,\n },\n ],\n };\n const resolved = resolveVirtual(files, '', target);\n return resolved == null\n ? {\n errors: [\n { text: `Missing source for package import ${specifier} from ${args.importer}` },\n ],\n }\n : owner == null\n ? { path: resolved, namespace: SOURCE_NAMESPACE }\n : { path: packagePath(owner.name, resolved), namespace: PACKAGE_NAMESPACE };\n }\n if (specifier.startsWith('.') || specifier.startsWith('/')) {\n if (specifier.startsWith('/') || escapes(fromDir, specifier)) {\n outsideImports.push(`${args.importer} imports ${specifier}`);\n return { path: specifier, external: true };\n }\n const ownFiles =\n owner == null ? input.files : (input.packages?.[owner.name]?.files ?? {});\n const resolved = resolveVirtual(ownFiles, fromDir, specifier);\n if (resolved == null) {\n return {\n errors: [\n { text: `Could not resolve ${JSON.stringify(specifier)} from ${args.importer}` },\n ],\n };\n }\n return owner == null\n ? { path: resolved, namespace: SOURCE_NAMESPACE }\n : { path: packagePath(owner.name, resolved), namespace: PACKAGE_NAMESPACE };\n }\n const split = splitSpecifier(specifier);\n const vendored =\n split == null || !Object.hasOwn(input.packages ?? {}, split.name)\n ? undefined\n : input.packages?.[split.name];\n if (split != null && vendored != null && !specifier.split('/').includes('..')) {\n if (vendored.loadError != null) return { errors: [{ text: vendored.loadError }] };\n const entry = packageEntry({\n pkg: vendored,\n subpath: split.subpath,\n require: args.kind === 'require-call' || args.kind === 'require-resolve',\n resolve: (path) => resolveVirtual(vendored.files, '', `./${path}`),\n });\n if (entry.path == null) {\n return {\n errors: [\n {\n text: entry.exported\n ? `${JSON.stringify(specifier)} resolves to ${entry.wanted}, which is not in the repository; workspace packages are compiled from source, so point the package's exports at source files`\n : `${JSON.stringify(specifier)} is not exported by ${split.name} for Workers (its exports name no workerd, worker, browser, import, require or default target)`,\n },\n ],\n };\n }\n return { path: packagePath(split.name, entry.path), namespace: PACKAGE_NAMESPACE };\n }\n if (specifier.includes('\\\\') || specifier.split('/').includes('..')) {\n outsideImports.push(`${args.importer} imports ${specifier}`);\n return { path: specifier, external: true };\n }\n const resolveDir =\n input.root == null || fromPackage ? packageRoot : resolve(input.root, fromDir);\n let result = await api.resolve(specifier, {\n resolveDir,\n kind: args.kind,\n pluginData: 'final-resolving',\n });\n if (result.errors.length > 0 && input.root != null) {\n result = await api.resolve(specifier, {\n resolveDir: packageRoot,\n kind: args.kind,\n pluginData: 'final-resolving',\n });\n }\n if (\n result.errors.length === 0 &&\n !(await withinDependency({\n specifier: specifier,\n path: result.path,\n resolveDir,\n packageRoot,\n }))\n ) {\n outsideImports.push(`${args.importer} imports ${specifier}`);\n return { path: specifier, external: true };\n }\n return result;\n });\n api.onLoad({ filter: /.*/, namespace: PACKAGE_NAMESPACE }, (args) => {\n const { name, file } = splitPackagePath(args.path);\n const contents = input.packages?.[name]?.files[file];\n if (contents == null) return { errors: [{ text: `Missing source ${args.path}` }] };\n if (Buffer.byteLength(contents) > MAX_FILE_BYTES)\n return { errors: [{ text: `${name}/${file} is larger than ${MAX_FILE_BYTES} bytes` }] };\n return {\n contents,\n loader: LOADERS.get(posix.extname(file)) ?? 'text',\n resolveDir: packageRoot,\n };\n });\n api.onLoad({ filter: /.*/, namespace: SOURCE_NAMESPACE }, (args) => {\n const contents = input.files[args.path];\n if (contents == null) return { errors: [{ text: `Missing source ${args.path}` }] };\n if (Buffer.byteLength(contents) > MAX_FILE_BYTES)\n return { errors: [{ text: `${args.path} is larger than ${MAX_FILE_BYTES} bytes` }] };\n const extension = posix.extname(args.path);\n return {\n contents,\n loader: LOADERS.get(extension) ?? 'text',\n resolveDir:\n input.root == null ? packageRoot : resolve(input.root, posix.dirname(args.path)),\n };\n });\n },\n };\n let output;\n try {\n output = await build({\n stdin: {\n contents: entrySource(input.layout, assets.bundleRuntime),\n resolveDir: packageRoot,\n loader: 'ts',\n sourcefile: 'agent-bundle-entry.ts',\n },\n bundle: true,\n write: false,\n format: 'esm',\n platform: 'neutral',\n target: 'es2024',\n mainFields: ['module', 'main'],\n conditions: ['workerd', 'worker', 'browser', 'module'],\n nodePaths: [resolve(packageRoot, 'node_modules')],\n metafile: true,\n minifyWhitespace: true,\n minifySyntax: true,\n legalComments: 'none',\n charset: 'utf8',\n logLevel: 'silent',\n plugins: [sourcePlugin],\n });\n } catch (cause) {\n const failure = buildFailureSchema.safeParse(cause);\n const errors: Message[] = failure.success ? failure.data.errors : [];\n const problems =\n errors.length > 0\n ? errors.map(formatMessage)\n : [\n {\n path: null,\n message: cause instanceof Error ? cause.message : String(cause),\n builtin: false,\n },\n ];\n return { code: null, hash: null, problems };\n }\n const problems: BundleProblemIface[] = outsideImports.map((message) => ({\n path: message.split(' ')[0] ?? null,\n message: `${message}: authored imports must stay inside the agent directory (share code as a package)`,\n builtin: false,\n }));\n const surviving = new Set(\n Object.values(output.metafile.outputs)\n .flatMap((file) => file.imports)\n .filter((entry) => entry.external)\n .map((entry) => entry.path),\n );\n for (const item of builtinImports) {\n if (!surviving.has(item.path)) continue;\n problems.push({\n path: item.importer,\n message: `${item.importer} imports the Node built-in ${item.path}; authored code runs in a Worker isolate (use a sandbox tool for host work)`,\n builtin: true,\n });\n }\n const file = output.outputFiles[0];\n if (file == null)\n return {\n code: null,\n hash: null,\n problems: [\n ...problems,\n { path: null, message: 'esbuild produced no output', builtin: false },\n ],\n };\n // Assign identifiers after graph discovery so concurrent builds produce the same names.\n const minified = await transform(file.text, {\n format: 'esm',\n target: 'es2024',\n minify: true,\n legalComments: 'none',\n charset: 'utf8',\n });\n // Seed resources affect immutable identity even when no runtime code imports them.\n const resources = Object.entries(preparationFiles(input.files)).toSorted(([a], [b]) =>\n a < b ? -1 : a > b ? 1 : 0,\n );\n const sourceHash = createHash('sha256').update(JSON.stringify(resources)).digest('hex');\n const code =\n resources.length === 0\n ? minified.code\n : `${minified.code}\\n// final:sandbox-inputs:${sourceHash}\\n`;\n return {\n code,\n hash: `sha256:${createHash('sha256').update(code).digest('hex')}`,\n problems,\n };\n};\n"],
4
+ "sourcesContent": ["import { build, transform, type Loader, type Message, type Plugin } from 'esbuild';\nimport { createHash } from 'node:crypto';\nimport { existsSync } from 'node:fs';\nimport { readFile, realpath } from 'node:fs/promises';\nimport { isBuiltin } from 'node:module';\nimport { dirname, isAbsolute, posix, relative, resolve } from 'node:path';\nimport * as z from 'zod';\nimport type { LayoutModuleIface } from \"../runtime/layout.mjs\";\nimport { MAX_FILE_BYTES, preparationFiles } from \"./files.mjs\";\nimport {\n packageEntry,\n packageImportTarget,\n splitSpecifier,\n type VendoredPackageIface,\n} from \"./packages.mjs\";\n\n// Where this package's sources live. The compiler bundles authored code against\n// the authoring modules as source, so a host that runs the compiler from a\n// bundle passes the installed package's root.\nconst packedAssets = resolve(import.meta.dirname, '..', '..', 'compiler-assets');\nexport const DEFAULT_packageRoot = existsSync(packedAssets)\n ? packedAssets\n : resolve(import.meta.dirname, '..', '..');\n\ninterface CompilerAssetsIface {\n packageRoot: string;\n bundleRuntime: string;\n // Import specifiers authored code uses for the authoring API.\n aliases: Map<string, string>;\n}\n\nconst compilerAssets = (packageRoot: string): CompilerAssetsIface => {\n const src = resolve(packageRoot, 'src');\n const authoring = resolve(src, 'authoring');\n return {\n packageRoot,\n bundleRuntime: resolve(src, 'runtime', 'bundle.ts'),\n aliases: new Map<string, string>(\n Object.entries({\n '@finalai/agents': resolve(authoring, 'index.ts'),\n '@finalai/agents/instructions': resolve(authoring, 'instructions.ts'),\n '@finalai/agents/approval': resolve(authoring, 'approval.ts'),\n '@finalai/agents/hooks': resolve(authoring, 'hooks.ts'),\n '@finalai/agents/tools': resolve(authoring, 'tools.ts'),\n '@finalai/agents/channels': resolve(authoring, 'channels.ts'),\n // Final's sandbox helpers are pure, so authored code bundles the provider\n // package's own module (as it does a vendor package's), never a copy.\n '@finalai/agent-definition': resolve(src, 'index.ts'),\n '@finalai/agent-definition/authoring': resolve(authoring, 'index.ts'),\n '@finalai/agent-definition/instructions': resolve(authoring, 'instructions.ts'),\n '@finalai/agent-definition/approval': resolve(authoring, 'approval.ts'),\n '@finalai/agent-definition/hooks': resolve(authoring, 'hooks.ts'),\n '@finalai/agent-definition/tools': resolve(authoring, 'tools.ts'),\n '@finalai/agent-definition/channels': resolve(authoring, 'channels.ts'),\n '@finalai/agent-definition/manifest': resolve(src, 'manifest.ts'),\n }),\n ),\n };\n};\n\nconst SOURCE_NAMESPACE = 'agent-source';\nconst SOURCE_PREFIX = `${SOURCE_NAMESPACE}:`;\n// Vendored workspace packages: `<package name>:<package-relative path>`.\nconst PACKAGE_NAMESPACE = 'agent-package';\n\nconst packagePath = (name: string, file: string): string => `${name}:${file}`;\n\ninterface PackageFileIface {\n name: string;\n file: string;\n}\n\nconst splitPackagePath = (path: string): PackageFileIface => {\n const index = path.indexOf(':');\n return { name: path.slice(0, index), file: path.slice(index + 1) };\n};\n\nconst LOADERS = new Map<string, Loader>(\n Object.entries({\n '.ts': 'ts',\n '.mts': 'ts',\n '.cts': 'ts',\n '.tsx': 'tsx',\n '.js': 'js',\n '.mjs': 'js',\n '.cjs': 'js',\n '.jsx': 'jsx',\n '.json': 'json',\n '.md': 'text',\n '.txt': 'text',\n }),\n);\n\n// esbuild rejects a failed build with its messages attached.\nconst buildFailureSchema = z.object({\n errors: z.array(z.custom<Message>((value) => value instanceof Object)),\n});\n\nconst RESOLVE_EXTENSIONS = [\n '',\n '.ts',\n '.tsx',\n '.mts',\n '.cts',\n '.js',\n '.jsx',\n '.mjs',\n '.cjs',\n '.json',\n '/index.ts',\n '/index.tsx',\n '/index.mts',\n '/index.cts',\n '/index.js',\n '/index.jsx',\n '/index.mjs',\n '/index.cjs',\n];\n\nexport interface BundleInputIface {\n files: Record<string, string>;\n layout: LayoutModuleIface[];\n // Real directory of the sources, for resolving packages they import; null\n // for file maps (packages then resolve from this package's dependencies).\n root: string | null;\n // This package's installed root; defaults to the source checkout.\n packageRoot?: string;\n // Workspace packages the agent imports, by package name (packages.ts).\n packages?: Record<string, VendoredPackageIface>;\n // Authoring modules of provider packages the host installed, by import\n // specifier (CompileOptionsIface.providerModules).\n providerModules?: Readonly<Record<string, string>>;\n}\n\nexport interface BundleProblemIface {\n path: string | null;\n message: string;\n builtin: boolean;\n}\n\nexport interface BundleOutputIface {\n code: string | null;\n hash: string | null;\n problems: BundleProblemIface[];\n}\n\nconst resolveVirtual = (\n files: Record<string, string>,\n fromDir: string,\n specifier: string,\n): string | null => {\n const joined = posix.normalize(posix.join(fromDir, specifier));\n if (joined === '..' || joined.startsWith('../') || joined.startsWith('/')) return null;\n const candidates = [joined];\n // TypeScript's convention: `./x.js` names `x.ts` (`.mjs` \u2192 `.mts`, `.cjs` \u2192 `.cts`).\n if (/\\.jsx?$/.test(joined)) {\n const stem = joined.replace(/\\.jsx?$/, '');\n candidates.push(`${stem}.ts`, `${stem}.tsx`);\n } else if (joined.endsWith('.mjs')) candidates.push(joined.replace(/\\.mjs$/, '.mts'));\n else if (joined.endsWith('.cjs')) candidates.push(joined.replace(/\\.cjs$/, '.cts'));\n for (const candidate of candidates) {\n for (const extension of RESOLVE_EXTENSIONS) {\n const path = `${candidate}${extension}`;\n if (Object.hasOwn(files, path)) return path;\n }\n }\n return null;\n};\n\nconst escapes = (fromDir: string, specifier: string): boolean => {\n const joined = posix.normalize(posix.join(fromDir, specifier));\n return joined === '..' || joined.startsWith('../');\n};\n\nconst withinDependency = async (args: {\n specifier: string;\n path: string;\n resolveDir: string;\n packageRoot: string;\n}): Promise<boolean> => {\n const segments = args.specifier.split('/');\n const name = segments[0]?.startsWith('@') ? segments.slice(0, 2).join('/') : segments[0];\n if (name == null || name.length === 0) return false;\n const candidates = [resolve(args.packageRoot, 'node_modules', name)];\n let directory = args.resolveDir;\n for (;;) {\n candidates.push(resolve(directory, 'node_modules', name));\n // Node also resolves a package's own name from inside that package.\n const self = await readFile(resolve(directory, 'package.json'), 'utf8')\n .then((text) => z.object({ name: z.string() }).parse(JSON.parse(text)))\n .catch(() => null);\n if (self?.name === name) candidates.push(directory);\n const parent = dirname(directory);\n if (parent === directory) break;\n directory = parent;\n }\n const path = await realpath(args.path).catch(() => null);\n if (path == null) return false;\n for (const candidate of candidates) {\n // pnpm workspace dependencies resolve to their source directory through a symlink.\n const root = await realpath(candidate).catch(() => null);\n if (root == null) continue;\n const distance = relative(root, path);\n if (!isAbsolute(distance) && distance !== '..' && !distance.startsWith('../')) return true;\n }\n return false;\n};\n\nconst entrySource = (layout: LayoutModuleIface[], bundleRuntime: string): string => {\n const imports = layout.map(\n (entry, index) =>\n `import * as m${index} from ${JSON.stringify(`${SOURCE_PREFIX}${entry.path}`)};`,\n );\n return [\n ...imports,\n `import { createAgentBundle } from ${JSON.stringify(bundleRuntime)};`,\n `const bundle = createAgentBundle({ layout: ${JSON.stringify(layout)}, namespaces: [${layout.map((_, index) => `m${index}`).join(', ')}] });`,\n 'export const modules = bundle.modules;',\n 'export const runtime = bundle.runtime;',\n 'export const __describe = bundle.describe;',\n ].join('\\n');\n};\n\nconst formatMessage = (message: Message): BundleProblemIface => {\n const location = message.location;\n const file = location?.file ?? null;\n const path =\n file == null ? null : file.startsWith(SOURCE_PREFIX) ? file.slice(SOURCE_PREFIX.length) : file;\n const text = message.text;\n return {\n path,\n message: location == null ? text : `${text} (${path ?? 'bundle'}:${location.line})`,\n builtin: false,\n };\n};\n\n// Bundles every authored module, the authoring API and the bundle runtime\n// into one ESM module for the Worker isolate. Node built-ins are rejected.\nexport const bundleAgent = async (input: BundleInputIface): Promise<BundleOutputIface> => {\n const assets = compilerAssets(input.packageRoot ?? DEFAULT_packageRoot);\n const packageRoot = assets.packageRoot;\n const builtinImports: { importer: string; path: string }[] = [];\n const outsideImports: string[] = [];\n const sourcePlugin: Plugin = {\n name: 'agent-sources',\n setup: (api) => {\n api.onResolve({ filter: /.*/ }, async (args) => {\n const specifier = args.path;\n if (args.pluginData === 'final-resolving') return null;\n if (specifier.startsWith(SOURCE_PREFIX)) {\n return { path: specifier.slice(SOURCE_PREFIX.length), namespace: SOURCE_NAMESPACE };\n }\n const fromSource = args.namespace === SOURCE_NAMESPACE;\n const importer =\n fromSource || args.namespace === PACKAGE_NAMESPACE\n ? args.importer\n : posix.relative(packageRoot, args.importer);\n if (isBuiltin(specifier)) {\n builtinImports.push({ importer, path: specifier });\n return { path: specifier, external: true };\n }\n const alias =\n (Object.hasOwn(input.providerModules ?? {}, specifier)\n ? input.providerModules?.[specifier]\n : undefined) ?? assets.aliases.get(specifier);\n // A re-exporting authoring module reaches the provider's canonical package.\n if (alias != null && alias !== args.importer) return { path: alias };\n const fromPackage = args.namespace === PACKAGE_NAMESPACE;\n if (!fromSource && !fromPackage) return null;\n const owner = fromPackage ? splitPackagePath(args.importer) : null;\n const fromDir = posix.dirname(owner?.file ?? args.importer);\n if (specifier.startsWith('#')) {\n const files = owner == null ? input.files : (input.packages?.[owner.name]?.files ?? {});\n const target = packageImportTarget({\n packageJson: files['package.json'],\n specifier: specifier,\n require: args.kind === 'require-call' || args.kind === 'require-resolve',\n });\n if (target == null || !target.startsWith('./') || escapes('', target))\n return {\n errors: [\n {\n text: `Could not resolve package import ${specifier} from ${args.importer}; imports must name source files inside the package`,\n },\n ],\n };\n const resolved = resolveVirtual(files, '', target);\n return resolved == null\n ? {\n errors: [\n { text: `Missing source for package import ${specifier} from ${args.importer}` },\n ],\n }\n : owner == null\n ? { path: resolved, namespace: SOURCE_NAMESPACE }\n : { path: packagePath(owner.name, resolved), namespace: PACKAGE_NAMESPACE };\n }\n if (specifier.startsWith('.') || specifier.startsWith('/')) {\n if (specifier.startsWith('/') || escapes(fromDir, specifier)) {\n outsideImports.push(`${args.importer} imports ${specifier}`);\n return { path: specifier, external: true };\n }\n const ownFiles =\n owner == null ? input.files : (input.packages?.[owner.name]?.files ?? {});\n const resolved = resolveVirtual(ownFiles, fromDir, specifier);\n if (resolved == null) {\n return {\n errors: [\n { text: `Could not resolve ${JSON.stringify(specifier)} from ${args.importer}` },\n ],\n };\n }\n return owner == null\n ? { path: resolved, namespace: SOURCE_NAMESPACE }\n : { path: packagePath(owner.name, resolved), namespace: PACKAGE_NAMESPACE };\n }\n const split = splitSpecifier(specifier);\n const vendored =\n split == null || !Object.hasOwn(input.packages ?? {}, split.name)\n ? undefined\n : input.packages?.[split.name];\n if (split != null && vendored != null && !specifier.split('/').includes('..')) {\n if (vendored.loadError != null) return { errors: [{ text: vendored.loadError }] };\n const entry = packageEntry({\n pkg: vendored,\n subpath: split.subpath,\n require: args.kind === 'require-call' || args.kind === 'require-resolve',\n resolve: (path) => resolveVirtual(vendored.files, '', `./${path}`),\n });\n if (entry.path == null) {\n return {\n errors: [\n {\n text: entry.exported\n ? `${JSON.stringify(specifier)} resolves to ${entry.wanted}, which is not in the repository; workspace packages are compiled from source, so point the package's exports at source files`\n : `${JSON.stringify(specifier)} is not exported by ${split.name} for Workers (its exports name no workerd, worker, browser, import, require or default target)`,\n },\n ],\n };\n }\n return { path: packagePath(split.name, entry.path), namespace: PACKAGE_NAMESPACE };\n }\n if (specifier.includes('\\\\') || specifier.split('/').includes('..')) {\n outsideImports.push(`${args.importer} imports ${specifier}`);\n return { path: specifier, external: true };\n }\n const resolveDir =\n input.root == null || fromPackage ? packageRoot : resolve(input.root, fromDir);\n let result = await api.resolve(specifier, {\n resolveDir,\n kind: args.kind,\n pluginData: 'final-resolving',\n });\n if (result.errors.length > 0 && input.root != null) {\n result = await api.resolve(specifier, {\n resolveDir: packageRoot,\n kind: args.kind,\n pluginData: 'final-resolving',\n });\n }\n if (\n result.errors.length === 0 &&\n !(await withinDependency({\n specifier: specifier,\n path: result.path,\n resolveDir,\n packageRoot,\n }))\n ) {\n outsideImports.push(`${args.importer} imports ${specifier}`);\n return { path: specifier, external: true };\n }\n return result;\n });\n api.onLoad({ filter: /.*/, namespace: PACKAGE_NAMESPACE }, (args) => {\n const { name, file } = splitPackagePath(args.path);\n const contents = input.packages?.[name]?.files[file];\n if (contents == null) return { errors: [{ text: `Missing source ${args.path}` }] };\n if (Buffer.byteLength(contents) > MAX_FILE_BYTES)\n return { errors: [{ text: `${name}/${file} is larger than ${MAX_FILE_BYTES} bytes` }] };\n return {\n contents,\n loader: LOADERS.get(posix.extname(file)) ?? 'text',\n resolveDir: packageRoot,\n };\n });\n api.onLoad({ filter: /.*/, namespace: SOURCE_NAMESPACE }, (args) => {\n const contents = input.files[args.path];\n if (contents == null) return { errors: [{ text: `Missing source ${args.path}` }] };\n if (Buffer.byteLength(contents) > MAX_FILE_BYTES)\n return { errors: [{ text: `${args.path} is larger than ${MAX_FILE_BYTES} bytes` }] };\n const extension = posix.extname(args.path);\n return {\n contents,\n loader: LOADERS.get(extension) ?? 'text',\n resolveDir:\n input.root == null ? packageRoot : resolve(input.root, posix.dirname(args.path)),\n };\n });\n },\n };\n let output;\n try {\n output = await build({\n stdin: {\n contents: entrySource(input.layout, assets.bundleRuntime),\n resolveDir: packageRoot,\n loader: 'ts',\n sourcefile: 'agent-bundle-entry.ts',\n },\n bundle: true,\n write: false,\n format: 'esm',\n platform: 'neutral',\n target: 'es2024',\n mainFields: ['module', 'main'],\n conditions: ['workerd', 'worker', 'browser', 'module'],\n nodePaths: [resolve(packageRoot, 'node_modules')],\n metafile: true,\n minifyWhitespace: true,\n minifySyntax: true,\n legalComments: 'none',\n charset: 'utf8',\n logLevel: 'silent',\n plugins: [sourcePlugin],\n });\n } catch (cause) {\n const failure = buildFailureSchema.safeParse(cause);\n const errors: Message[] = failure.success ? failure.data.errors : [];\n const problems =\n errors.length > 0\n ? errors.map(formatMessage)\n : [\n {\n path: null,\n message: cause instanceof Error ? cause.message : String(cause),\n builtin: false,\n },\n ];\n return { code: null, hash: null, problems };\n }\n const problems: BundleProblemIface[] = outsideImports.map((message) => ({\n path: message.split(' ')[0] ?? null,\n message: `${message}: authored imports must stay inside the agent directory (share code as a package)`,\n builtin: false,\n }));\n const surviving = new Set(\n Object.values(output.metafile.outputs)\n .flatMap((file) => file.imports)\n .filter((entry) => entry.external)\n .map((entry) => entry.path),\n );\n for (const item of builtinImports) {\n if (!surviving.has(item.path)) continue;\n problems.push({\n path: item.importer,\n message: `${item.importer} imports the Node built-in ${item.path}; authored code runs in a Worker isolate (use a sandbox tool for host work)`,\n builtin: true,\n });\n }\n const file = output.outputFiles[0];\n if (file == null)\n return {\n code: null,\n hash: null,\n problems: [\n ...problems,\n { path: null, message: 'esbuild produced no output', builtin: false },\n ],\n };\n // Assign identifiers after graph discovery so concurrent builds produce the same names.\n const minified = await transform(file.text, {\n format: 'esm',\n target: 'es2024',\n minify: true,\n legalComments: 'none',\n charset: 'utf8',\n });\n // Seed resources affect immutable identity even when no runtime code imports them.\n const resources = Object.entries(preparationFiles(input.files)).toSorted(([a], [b]) =>\n a < b ? -1 : a > b ? 1 : 0,\n );\n const sourceHash = createHash('sha256').update(JSON.stringify(resources)).digest('hex');\n const code =\n resources.length === 0\n ? minified.code\n : `${minified.code}\\n// final:sandbox-inputs:${sourceHash}\\n`;\n return {\n code,\n hash: `sha256:${createHash('sha256').update(code).digest('hex')}`,\n problems,\n };\n};\n"],
5
5
  "mappings": "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",
6
6
  "names": ["file", "problems"]
7
7
  }
@@ -13,6 +13,7 @@ export type { LocalIsolateOptionsIface } from "./local-isolate.mjs";
13
13
  export { parsePackageJson, PLATFORM_PACKAGES, splitSpecifier, workspaceDependencies, WorkspaceDependencyKind, workspacePackageCandidates, workspacePackageGlobs, } from "./packages.mjs";
14
14
  export type { VendoredPackageIface, WorkspaceDependencyIface } from "./packages.mjs";
15
15
  export interface CompileOptionsIface {
16
+ previewBundle?: boolean;
16
17
  dir?: string;
17
18
  hostedBindings?: HostedBindingsIface;
18
19
  files?: Record<string, string>;
@@ -36,10 +37,6 @@ export interface CompiledBundleIface {
36
37
  code: string;
37
38
  modules: Record<string, string>;
38
39
  sandboxOpeners: Record<string, string>;
39
- channelRoutes: Record<string, {
40
- method: string;
41
- path: string;
42
- }[]>;
43
40
  }
44
41
  export interface CompileResultIface {
45
42
  manifest: AgentManifestIface | null;