@finalai/agent-definition 0.1.2 → 0.1.3

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 (105) hide show
  1. package/HOSTING.md +165 -0
  2. package/README.md +7 -0
  3. package/dist/compiler-assets/{chunk-TATN3PYK.ts → chunk-2ZRYQO4Q.ts} +4 -4
  4. package/dist/compiler-assets/{chunk-HGW4YHAY.ts → chunk-3K4C4SVG.ts} +9 -0
  5. package/dist/compiler-assets/{chunk-JPY4L2UJ.ts → chunk-3YAKMWV4.ts} +7 -7
  6. package/dist/compiler-assets/{chunk-CWWRTRWW.ts → chunk-4E5HECVD.ts} +1 -1
  7. package/dist/compiler-assets/{chunk-7QP2CKPI.ts → chunk-4X2DS5BR.ts} +1 -1
  8. package/dist/compiler-assets/{chunk-ZDLVA6XF.ts → chunk-5IZTHCGZ.ts} +8 -8
  9. package/dist/compiler-assets/{chunk-2CZRHOLL.ts → chunk-7XUPKRZU.ts} +1 -1
  10. package/dist/compiler-assets/{chunk-7VSSVZM4.ts → chunk-BEFBCBUL.ts} +4 -4
  11. package/dist/compiler-assets/{chunk-HFS4KLEL.ts → chunk-D3SB4CCB.ts} +1 -1
  12. package/dist/compiler-assets/{chunk-EVQIK62B.ts → chunk-FHKYXT3F.ts} +11 -7
  13. package/dist/compiler-assets/{chunk-HNPUTP35.ts → chunk-GCFSHHH2.ts} +2 -2
  14. package/dist/compiler-assets/{chunk-MZMSKIKU.ts → chunk-I6U47R5U.ts} +14 -5
  15. package/dist/compiler-assets/{chunk-5BK6FVRE.ts → chunk-IF6MR7JF.ts} +2 -2
  16. package/dist/compiler-assets/{chunk-LUSAAV4L.ts → chunk-IZGOMT7K.ts} +2 -2
  17. package/dist/compiler-assets/{chunk-GTUZOATD.ts → chunk-JGQ2KAN7.ts} +1 -1
  18. package/dist/compiler-assets/chunk-JXJPBM5W.ts +61 -0
  19. package/dist/compiler-assets/{chunk-NYTOYKKF.ts → chunk-K6D7ZK74.ts} +3 -3
  20. package/dist/compiler-assets/{chunk-WMXMVFHM.ts → chunk-K7V4IMOB.ts} +3 -3
  21. package/dist/compiler-assets/{chunk-VHXHUU7L.ts → chunk-LHMUAIYJ.ts} +1 -1
  22. package/dist/compiler-assets/{chunk-SKTNMUO7.ts → chunk-MSE7X5YG.ts} +25 -2
  23. package/dist/compiler-assets/{chunk-OWC6SFFF.ts → chunk-OO67EO5E.ts} +10 -9
  24. package/dist/compiler-assets/chunk-PFLSBTJA.ts +39 -0
  25. package/dist/compiler-assets/{chunk-XHKPWT3G.ts → chunk-QJ26GEUM.ts} +1 -1
  26. package/dist/compiler-assets/chunk-RMIQJHSL.ts +0 -0
  27. package/dist/compiler-assets/{chunk-BLB6JGLO.ts → chunk-TCKYMNPM.ts} +27 -24
  28. package/dist/compiler-assets/{chunk-QMWTDPNT.ts → chunk-TJZS457N.ts} +3 -3
  29. package/dist/compiler-assets/{chunk-JIPNTA56.ts → chunk-TM36NO3C.ts} +1 -1
  30. package/dist/compiler-assets/{chunk-QMKWAFVZ.ts → chunk-TS7XNNHN.ts} +3 -3
  31. package/dist/compiler-assets/chunk-ULI5WWRR.ts +40 -0
  32. package/dist/compiler-assets/chunk-W6DOJA4W.ts +3763 -0
  33. package/dist/compiler-assets/src/authoring/agent.ts +4 -4
  34. package/dist/compiler-assets/src/authoring/approval.ts +7 -7
  35. package/dist/compiler-assets/src/authoring/brand.ts +3 -3
  36. package/dist/compiler-assets/src/authoring/channels.ts +6 -6
  37. package/dist/compiler-assets/src/authoring/connections.ts +14 -4
  38. package/dist/compiler-assets/src/authoring/credentials.ts +7 -6
  39. package/dist/compiler-assets/src/authoring/dynamic.ts +9 -4
  40. package/dist/compiler-assets/src/authoring/harness.ts +9 -9
  41. package/dist/compiler-assets/src/authoring/hooks.ts +10 -8
  42. package/dist/compiler-assets/src/authoring/index.ts +33 -26
  43. package/dist/compiler-assets/src/authoring/instructions.ts +10 -5
  44. package/dist/compiler-assets/src/authoring/sandbox.ts +10 -10
  45. package/dist/compiler-assets/src/authoring/schedules.ts +4 -4
  46. package/dist/compiler-assets/src/authoring/skills.ts +4 -4
  47. package/dist/compiler-assets/src/authoring/tools.ts +10 -8
  48. package/dist/compiler-assets/src/compatibility.ts +11 -11
  49. package/dist/compiler-assets/src/hosted-bindings.ts +15 -0
  50. package/dist/compiler-assets/src/index.ts +50 -41
  51. package/dist/compiler-assets/src/manifest.ts +4 -4
  52. package/dist/compiler-assets/src/resolve.ts +5 -5
  53. package/dist/compiler-assets/src/runtime/bundle.ts +22 -20
  54. package/dist/compiler-assets/src/runtime/describe.ts +14 -12
  55. package/dist/compiler-assets/src/runtime/described.ts +16 -11
  56. package/dist/compiler-assets/src/runtime/isolate.ts +18 -16
  57. package/dist/compiler-assets/src/runtime/lower.ts +13 -11
  58. package/dist/compiler-assets/src/runtime/schema-validation.ts +4 -4
  59. package/dist/compiler-assets/src/runtime/values.ts +2 -2
  60. package/dist/modules/authoring/connections.d.mts +5 -0
  61. package/dist/modules/authoring/connections.mjs +36 -0
  62. package/dist/modules/authoring/connections.mjs.map +2 -2
  63. package/dist/modules/authoring/context.d.mts +3 -1
  64. package/dist/modules/authoring/context.mjs.map +2 -2
  65. package/dist/modules/authoring/dynamic.d.mts +3 -1
  66. package/dist/modules/authoring/dynamic.mjs +19 -1
  67. package/dist/modules/authoring/dynamic.mjs.map +2 -2
  68. package/dist/modules/authoring/hooks.d.mts +2 -1
  69. package/dist/modules/authoring/hooks.mjs.map +2 -2
  70. package/dist/modules/authoring/index.d.mts +4 -2
  71. package/dist/modules/authoring/index.mjs +4 -1
  72. package/dist/modules/authoring/index.mjs.map +2 -2
  73. package/dist/modules/authoring/sandbox.d.mts +2 -1
  74. package/dist/modules/authoring/sandbox.mjs.map +2 -2
  75. package/dist/modules/compiler/assemble.mjs +5 -0
  76. package/dist/modules/compiler/assemble.mjs.map +2 -2
  77. package/dist/modules/compiler/index.d.mts +2 -1
  78. package/dist/modules/compiler/index.mjs +18 -0
  79. package/dist/modules/compiler/index.mjs.map +2 -2
  80. package/dist/modules/compiler/local-isolate.d.mts +2 -1
  81. package/dist/modules/compiler/local-isolate.mjs +6 -1
  82. package/dist/modules/compiler/local-isolate.mjs.map +2 -2
  83. package/dist/modules/hosted-bindings.d.mts +10 -0
  84. package/dist/modules/hosted-bindings.mjs +36 -0
  85. package/dist/modules/hosted-bindings.mjs.map +7 -0
  86. package/dist/modules/index.d.mts +2 -0
  87. package/dist/modules/index.mjs +2 -0
  88. package/dist/modules/index.mjs.map +2 -2
  89. package/dist/modules/resolve.mjs +4 -0
  90. package/dist/modules/resolve.mjs.map +2 -2
  91. package/dist/modules/runtime/describe.mjs +8 -1
  92. package/dist/modules/runtime/describe.mjs.map +2 -2
  93. package/dist/modules/runtime/described.d.mts +36 -0
  94. package/dist/modules/runtime/described.mjs +2 -1
  95. package/dist/modules/runtime/described.mjs.map +2 -2
  96. package/dist/modules/runtime/isolate.d.mts +2 -0
  97. package/dist/modules/runtime/isolate.mjs +7 -4
  98. package/dist/modules/runtime/isolate.mjs.map +2 -2
  99. package/dist/modules/runtime/schema-validation.mjs +19 -2
  100. package/dist/modules/runtime/schema-validation.mjs.map +2 -2
  101. package/package.json +4 -3
  102. package/dist/compiler-assets/chunk-GNR7XBPN.ts +0 -3364
  103. package/dist/compiler-assets/chunk-JNJE72EH.ts +0 -10
  104. package/dist/compiler-assets/chunk-T6WG4L4M.ts +0 -19
  105. /package/dist/compiler-assets/{chunk-6WR3PGNF.ts → chunk-CIWWFQHL.ts} +0 -0
@@ -0,0 +1,10 @@
1
+ import { type AgentManifestIface, type HostedBindingsIface, type HostedBindingRequirementIface } from '@finalai/agent-provider';
2
+ export interface ValidateHostedBindingsOptionsIface {
3
+ manifest: AgentManifestIface;
4
+ bindings?: HostedBindingsIface;
5
+ }
6
+ export declare const validateHostedBindings: (options: ValidateHostedBindingsOptionsIface) => Promise<void>;
7
+ export declare const validateHostedBindingRequirements: (options: {
8
+ requirements: readonly HostedBindingRequirementIface[];
9
+ bindings?: HostedBindingsIface;
10
+ }) => Promise<void>;
@@ -0,0 +1,36 @@
1
+ import {
2
+ findDynamicSlots,
3
+ requireHostedBinding
4
+ } from "@finalai/agent-provider";
5
+ import { jsonSchemaError } from "./runtime/schema-validation.mjs";
6
+ const validateHostedBindings = async (options) => {
7
+ await validateHostedBindingRequirements({
8
+ requirements: findDynamicSlots(options.manifest).flatMap(
9
+ ({ slot }) => slot.$dynamic.requiredBindings ?? []
10
+ ),
11
+ bindings: options.bindings
12
+ });
13
+ };
14
+ const validateHostedBindingRequirements = async (options) => {
15
+ const values = /* @__PURE__ */ new Map();
16
+ for (const requirement of options.requirements) {
17
+ let value = values.get(requirement.name);
18
+ if (value == null) {
19
+ value = await requireHostedBinding({ bindings: options.bindings, name: requirement.name });
20
+ values.set(requirement.name, value);
21
+ }
22
+ let validationError;
23
+ try {
24
+ validationError = jsonSchemaError(requirement.schema, value);
25
+ } catch {
26
+ throw new Error(`Hosted binding ${requirement.name} has an invalid schema`);
27
+ }
28
+ if (validationError != null)
29
+ throw new Error(`Hosted binding ${requirement.name} has invalid configuration`);
30
+ }
31
+ };
32
+ export {
33
+ validateHostedBindingRequirements,
34
+ validateHostedBindings
35
+ };
36
+ //# sourceMappingURL=hosted-bindings.mjs.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../../../src/hosted-bindings.ts"],
4
+ "sourcesContent": ["import {\n findDynamicSlots,\n requireHostedBinding,\n type AgentManifestIface,\n type HostedBindingsIface,\n type HostedBindingRequirementIface,\n type JsonValue,\n} from '@finalai/agent-provider';\nimport { jsonSchemaError } from \"./runtime/schema-validation.mjs\";\n\nexport interface ValidateHostedBindingsOptionsIface {\n manifest: AgentManifestIface;\n bindings?: HostedBindingsIface;\n}\n\n// Hosts run this before publishing and before starting a new session.\nexport const validateHostedBindings = async (\n options: ValidateHostedBindingsOptionsIface,\n): Promise<void> => {\n await validateHostedBindingRequirements({\n requirements: findDynamicSlots(options.manifest).flatMap(\n ({ slot }) => slot.$dynamic.requiredBindings ?? [],\n ),\n bindings: options.bindings,\n });\n};\n\nexport const validateHostedBindingRequirements = async (options: {\n requirements: readonly HostedBindingRequirementIface[];\n bindings?: HostedBindingsIface;\n}): Promise<void> => {\n const values = new Map<string, JsonValue>();\n for (const requirement of options.requirements) {\n let value = values.get(requirement.name);\n if (value == null) {\n value = await requireHostedBinding({ bindings: options.bindings, name: requirement.name });\n values.set(requirement.name, value);\n }\n let validationError: string | null;\n try {\n validationError = jsonSchemaError(requirement.schema, value);\n } catch {\n throw new Error(`Hosted binding ${requirement.name} has an invalid schema`);\n }\n if (validationError != null)\n throw new Error(`Hosted binding ${requirement.name} has invalid configuration`);\n }\n};\n"],
5
+ "mappings": "AAAA;AAAA,EACE;AAAA,EACA;AAAA,OAKK;AACP,SAAS,uBAAuB;AAQzB,MAAM,yBAAyB,OACpC,YACkB;AAClB,QAAM,kCAAkC;AAAA,IACtC,cAAc,iBAAiB,QAAQ,QAAQ,EAAE;AAAA,MAC/C,CAAC,EAAE,KAAK,MAAM,KAAK,SAAS,oBAAoB,CAAC;AAAA,IACnD;AAAA,IACA,UAAU,QAAQ;AAAA,EACpB,CAAC;AACH;AAEO,MAAM,oCAAoC,OAAO,YAGnC;AACnB,QAAM,SAAS,oBAAI,IAAuB;AAC1C,aAAW,eAAe,QAAQ,cAAc;AAC9C,QAAI,QAAQ,OAAO,IAAI,YAAY,IAAI;AACvC,QAAI,SAAS,MAAM;AACjB,cAAQ,MAAM,qBAAqB,EAAE,UAAU,QAAQ,UAAU,MAAM,YAAY,KAAK,CAAC;AACzF,aAAO,IAAI,YAAY,MAAM,KAAK;AAAA,IACpC;AACA,QAAI;AACJ,QAAI;AACF,wBAAkB,gBAAgB,YAAY,QAAQ,KAAK;AAAA,IAC7D,QAAQ;AACN,YAAM,IAAI,MAAM,kBAAkB,YAAY,IAAI,wBAAwB;AAAA,IAC5E;AACA,QAAI,mBAAmB;AACrB,YAAM,IAAI,MAAM,kBAAkB,YAAY,IAAI,4BAA4B;AAAA,EAClF;AACF;",
6
+ "names": []
7
+ }
@@ -1,5 +1,7 @@
1
1
  export * from "./authoring/index.mjs";
2
2
  export * from "./manifest.mjs";
3
+ export { validateHostedBindings } from "./hosted-bindings.mjs";
4
+ export type { ValidateHostedBindingsOptionsIface } from "./hosted-bindings.mjs";
3
5
  export { SlotValueKind, resolveManifest, resolveManifestDetailed, slotKindOf, validateSlotValue, } from "./resolve.mjs";
4
6
  export type { ResolveManifestArgsIface, ResolveSlot, ResolvedManifestDetailIface } from "./resolve.mjs";
5
7
  export type { AgentBundleIface } from "./runtime/bundle.mjs";
@@ -1,5 +1,6 @@
1
1
  export * from "./authoring/index.mjs";
2
2
  export * from "./manifest.mjs";
3
+ import { validateHostedBindings } from "./hosted-bindings.mjs";
3
4
  import {
4
5
  SlotValueKind,
5
6
  resolveManifest,
@@ -20,6 +21,7 @@ export {
20
21
  resolveManifest,
21
22
  resolveManifestDetailed,
22
23
  slotKindOf,
24
+ validateHostedBindings,
23
25
  validateSlotValue
24
26
  };
25
27
  //# sourceMappingURL=index.mjs.map
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../../../src/index.ts"],
4
- "sourcesContent": ["// Authoring API, the manifest schema and per-session dynamic resolution. The\n// compiler (esbuild, Node) is `@finalai/agent-definition/compiler`; the\n// compatibility report (ajv) is `@finalai/agent-definition/compatibility`.\nexport * from \"./authoring/index.mjs\";\nexport * from \"./manifest.mjs\";\nexport {\n SlotValueKind,\n resolveManifest,\n resolveManifestDetailed,\n slotKindOf,\n validateSlotValue,\n} from \"./resolve.mjs\";\nexport type { ResolveManifestArgsIface, ResolveSlot, ResolvedManifestDetailIface } from \"./resolve.mjs\";\nexport type { AgentBundleIface } from \"./runtime/bundle.mjs\";\nexport type {\n ChannelRouteArgsIface,\n ChannelSocketArgsIface,\n DispatchHookArgsIface,\n IsolateRuntimeIface,\n ResolveDynamicArgsIface,\n RunToolArgsIface,\n RunToolResultIface,\n} from \"./runtime/isolate.mjs\";\nexport {\n AGENT_DYNAMIC_PREFIX,\n AUTHORED_SERVER_KEY,\n COMBINED_MCP_SERVERS_EXPORT,\n} from \"./runtime/layout.mjs\";\n"],
5
- "mappings": "AAGA,cAAc;AACd,cAAc;AACd;AAAA,EACE;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,OACK;AAYP;AAAA,EACE;AAAA,EACA;AAAA,EACA;AAAA,OACK;",
4
+ "sourcesContent": ["// Authoring API, the manifest schema and per-session dynamic resolution. The\n// compiler (esbuild, Node) is `@finalai/agent-definition/compiler`; the\n// compatibility report (ajv) is `@finalai/agent-definition/compatibility`.\nexport * from \"./authoring/index.mjs\";\nexport * from \"./manifest.mjs\";\nexport { validateHostedBindings } from \"./hosted-bindings.mjs\";\nexport type { ValidateHostedBindingsOptionsIface } from \"./hosted-bindings.mjs\";\nexport {\n SlotValueKind,\n resolveManifest,\n resolveManifestDetailed,\n slotKindOf,\n validateSlotValue,\n} from \"./resolve.mjs\";\nexport type { ResolveManifestArgsIface, ResolveSlot, ResolvedManifestDetailIface } from \"./resolve.mjs\";\nexport type { AgentBundleIface } from \"./runtime/bundle.mjs\";\nexport type {\n ChannelRouteArgsIface,\n ChannelSocketArgsIface,\n DispatchHookArgsIface,\n IsolateRuntimeIface,\n ResolveDynamicArgsIface,\n RunToolArgsIface,\n RunToolResultIface,\n} from \"./runtime/isolate.mjs\";\nexport {\n AGENT_DYNAMIC_PREFIX,\n AUTHORED_SERVER_KEY,\n COMBINED_MCP_SERVERS_EXPORT,\n} from \"./runtime/layout.mjs\";\n"],
5
+ "mappings": "AAGA,cAAc;AACd,cAAc;AACd,SAAS,8BAA8B;AAEvC;AAAA,EACE;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,OACK;AAYP;AAAA,EACE;AAAA,EACA;AAAA,EACA;AAAA,OACK;",
6
6
  "names": []
7
7
  }
@@ -145,6 +145,10 @@ const resolveManifestDetailed = async (args) => {
145
145
  for (const found of slots) {
146
146
  const subscribed = found.slot.$dynamic.events.includes(args.event);
147
147
  const raw = subscribed ? await args.resolve(found.slot, found.path) : args.previous?.[found.path] ?? null;
148
+ if ((found.slot.$dynamic.requiredBindings?.length ?? 0) > 0 && raw == null)
149
+ throw new Error(
150
+ `Required hosted bindings for ${found.path} did not resolve: ${found.slot.$dynamic.requiredBindings?.map((item) => item.name).join(", ")}`
151
+ );
148
152
  if (subscribed) checkEnvironmentProvider(args.manifest, found.path, raw);
149
153
  normalized[found.path] = validateSlotValue(found.path, raw) ?? FIELD_DEFAULTS.get(found.path) ?? null;
150
154
  values[found.path] = slotKindOf(found.path) === "sandbox-environment" /* SandboxEnvironment */ ? raw : normalized[found.path] ?? null;
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../../../src/resolve.ts"],
4
- "sourcesContent": ["import {\n findDynamicSlots,\n formatProviderRef,\n instructionFragmentSchema,\n isDynamicSlot,\n jsonObjectSchema,\n jsonValueSchema,\n mcpServerBindingSchema,\n ProviderRefKind,\n providerRefSchema,\n resolvedAgentManifestSchema,\n sandboxBindingSchema,\n skillBundleSchema,\n type AgentManifestIface,\n type DynamicEvent,\n type DynamicSlotIface,\n type JsonValue,\n type ResolvedAgentManifestIface,\n} from '@finalai/agent-provider';\nimport * as z from 'zod';\n\n// Resolves a static manifest's dynamic slots for one session. The session service runs each resolver in the agent's isolate; this\n// helper decides which slots run at a boundary, validates each output against\n// the static field's schema, and splices the results in.\n\nexport type ResolveSlot = (slot: DynamicSlotIface, path: string) => Promise<JsonValue | null>;\n\nexport interface ResolveManifestArgsIface {\n manifest: AgentManifestIface;\n event: DynamicEvent;\n resolve: ResolveSlot;\n // Values from an earlier boundary (session.started values at turn.started),\n // used for slots that do not resolve at this event.\n previous?: Record<string, JsonValue | null>;\n}\n\nexport interface ResolvedManifestDetailIface {\n manifest: ResolvedAgentManifestIface;\n // Slot path \u2192 resolved value, for agent.session_manifests and later boundaries.\n values: Record<string, JsonValue | null>;\n}\n\nexport enum SlotValueKind {\n InstructionFragment = 'instruction-fragment',\n SkillBundle = 'skill-bundle',\n McpServers = 'mcp-servers',\n Sandboxes = 'sandboxes',\n SandboxEnvironment = 'sandbox-environment',\n Opaque = 'opaque',\n}\n\nexport const slotKindOf = (path: string): SlotValueKind => {\n if (/^harness\\.config\\.instructions\\[\\d+\\]$/.test(path)) return SlotValueKind.InstructionFragment;\n if (/^harness\\.config\\.skills\\[\\d+\\]$/.test(path)) return SlotValueKind.SkillBundle;\n if (path === 'mcpServers') return SlotValueKind.McpServers;\n if (path === 'sandboxes') return SlotValueKind.Sandboxes;\n if (/^sandboxes\\.[^.]+\\.environment$/.test(path)) return SlotValueKind.SandboxEnvironment;\n return SlotValueKind.Opaque;\n};\n\nconst resolvedSandboxesSchema = z.record(\n z.string(),\n sandboxBindingSchema.extend({ environment: jsonValueSchema }),\n);\n\nconst issueText = (error: z.ZodError): string =>\n error.issues.map((issue) => `${issue.path.join('.') || 'value'}: ${issue.message}`).join('; ');\n\nconst invalid = (path: string, detail: string): Error =>\n new Error(`dynamic slot ${path} resolved to an invalid value: ${detail}`);\n\nconst parseAs = <T extends z.ZodType>(schema: T, value: JsonValue, path: string): JsonValue => {\n const parsed = schema.safeParse(value);\n if (!parsed.success) throw invalid(path, issueText(parsed.error));\n return jsonValueSchema.parse(parsed.data);\n};\n\nconst isRecord = (value: JsonValue): value is { [key: string]: JsonValue } =>\n jsonObjectSchema.safeParse(value).success;\n\nconst roleless = z.looseObject({ role: z.null().optional() });\nconst environmentResultSchema = z.looseObject({\n providerName: z.string(),\n providerRef: jsonValueSchema.optional(),\n options: jsonValueSchema.optional(),\n openOptions: jsonValueSchema.optional(),\n});\n\n// Instruction results without a role ({ content }) default to system;\n// environment-shaped results normalize to their options.\nexport const validateSlotValue = (\n path: string,\n value: JsonValue | null,\n manifest?: AgentManifestIface,\n): JsonValue | null => {\n if (value == null) return null;\n switch (slotKindOf(path)) {\n case SlotValueKind.InstructionFragment: {\n if (isRecord(value) && roleless.safeParse(value).success) {\n return parseAs(instructionFragmentSchema, { ...value, role: 'system' }, path);\n }\n return parseAs(instructionFragmentSchema, value, path);\n }\n case SlotValueKind.SkillBundle:\n return Array.isArray(value)\n ? parseAs(z.array(skillBundleSchema), value, path)\n : parseAs(skillBundleSchema, value, path);\n case SlotValueKind.McpServers:\n return parseAs(z.array(mcpServerBindingSchema), value, path);\n case SlotValueKind.Sandboxes:\n return parseAs(resolvedSandboxesSchema, value, path);\n case SlotValueKind.SandboxEnvironment:\n if (manifest != null) checkEnvironmentProvider(manifest, path, value);\n const environment = environmentResultSchema.safeParse(value);\n if (environment.success && environment.data.openOptions != null)\n parseAs(\n sandboxBindingSchema.pick({ access: true, attach: true }).partial(),\n environment.data.openOptions,\n path,\n );\n return environment.success ? (environment.data.options ?? null) : value;\n case SlotValueKind.Opaque:\n return value;\n }\n};\n\nconst childPath = (parent: string, key: string | number): string => {\n if (z.number().safeParse(key).success) return `${parent}[${key}]`;\n return parent.length === 0 ? `${key}` : `${parent}.${key}`;\n};\n\n// Like replaceDynamicSlots, except that an array-item slot that resolved to\n// an array (several skills from one resolver) splices all of them in, and an\n// object field that resolved to null is omitted.\nconst splice = (\n value: JsonValue,\n values: Record<string, JsonValue | null>,\n path: string,\n): JsonValue => {\n if (isDynamicSlot(value)) return values[path] ?? null;\n if (Array.isArray(value)) {\n const out: JsonValue[] = [];\n value.forEach((item, index) => {\n const itemPath = childPath(path, index);\n if (isDynamicSlot(item)) {\n const resolved = values[itemPath];\n if (resolved == null) return;\n if (Array.isArray(resolved) && slotKindOf(itemPath) === SlotValueKind.SkillBundle)\n out.push(...resolved);\n else out.push(resolved);\n return;\n }\n out.push(splice(item, values, itemPath));\n });\n return out;\n }\n if (isRecord(value)) {\n const out: { [key: string]: JsonValue } = {};\n for (const [key, item] of Object.entries(value)) {\n const itemPath = childPath(path, key);\n // A config field whose resolver returned null is left out, so the\n // harness applies its own default; required fields keep their value.\n if (isDynamicSlot(item) && values[itemPath] == null && !KEEP_NULL.test(itemPath)) continue;\n out[key] = splice(item, values, itemPath);\n }\n return out;\n }\n return value;\n};\n\nconst KEEP_NULL = /^(sandboxes\\.[^.]+\\.environment)$/;\n\nconst FIELD_DEFAULTS = new Map<string, JsonValue>([\n ['mcpServers', []],\n ['sandboxes', {}],\n ['harness.config', {}],\n]);\n\n// A dynamic sandbox environment must be one of its binding's provider (the\n// compiler may have inferred that provider).\n\nconst checkEnvironmentProvider = (\n manifest: AgentManifestIface,\n path: string,\n value: JsonValue | null,\n): void => {\n if (slotKindOf(path) !== SlotValueKind.SandboxEnvironment || value == null) return;\n const returned = environmentResultSchema.safeParse(value);\n if (!returned.success) return;\n const target = path.slice('sandboxes.'.length, -'.environment'.length);\n const sandboxes = z.record(z.string(), sandboxBindingSchema).safeParse(manifest.sandboxes);\n const provider = sandboxes.success ? sandboxes.data[target]?.provider : undefined;\n if (provider == null) return;\n const returnedRef = providerRefSchema.safeParse(returned.data.providerRef);\n const mismatch = returnedRef.success\n ? formatProviderRef(returnedRef.data) !== formatProviderRef(provider)\n : // A bundle provider's environment carries only its name; installed ones are named for their specifier.\n provider.kind === ProviderRefKind.Package;\n if (mismatch) {\n throw invalid(\n path,\n `returned a ${returned.data.providerName} environment for a ${formatProviderRef(provider)} target`,\n );\n }\n};\n\nexport const resolveManifestDetailed = async (\n args: ResolveManifestArgsIface,\n): Promise<ResolvedManifestDetailIface> => {\n const manifestJson = jsonValueSchema.parse(args.manifest);\n const slots = findDynamicSlots(manifestJson);\n const values: Record<string, JsonValue | null> = {};\n const normalized: Record<string, JsonValue | null> = {};\n for (const found of slots) {\n const subscribed = found.slot.$dynamic.events.includes(args.event);\n const raw = subscribed\n ? await args.resolve(found.slot, found.path)\n : (args.previous?.[found.path] ?? null);\n if (subscribed) checkEnvironmentProvider(args.manifest, found.path, raw);\n normalized[found.path] =\n validateSlotValue(found.path, raw) ?? FIELD_DEFAULTS.get(found.path) ?? null;\n // Retain the descriptor so a later boundary preserves its open options too.\n values[found.path] =\n slotKindOf(found.path) === SlotValueKind.SandboxEnvironment\n ? raw\n : (normalized[found.path] ?? null);\n }\n const spliced = splice(manifestJson, normalized, '');\n const parsed = resolvedAgentManifestSchema.safeParse(spliced);\n if (!parsed.success) throw new Error(`resolved manifest is invalid: ${issueText(parsed.error)}`);\n const openOptionsSchema = sandboxBindingSchema.pick({ access: true, attach: true }).partial();\n for (const [path, raw] of Object.entries(values)) {\n if (slotKindOf(path) !== SlotValueKind.SandboxEnvironment) continue;\n const environment = environmentResultSchema.safeParse(raw);\n if (!environment.success || environment.data.openOptions == null) continue;\n const options = openOptionsSchema.safeParse(environment.data.openOptions);\n if (!options.success) throw invalid(path, issueText(options.error));\n const target = path.slice('sandboxes.'.length, -'.environment'.length);\n const binding = parsed.data.sandboxes[target];\n if (binding != null) parsed.data.sandboxes[target] = { ...binding, ...options.data };\n }\n return { manifest: parsed.data, values };\n};\n\nexport const resolveManifest = async (\n args: ResolveManifestArgsIface,\n): Promise<ResolvedAgentManifestIface> => (await resolveManifestDetailed(args)).manifest;\n"],
5
- "mappings": "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",
4
+ "sourcesContent": ["import {\n findDynamicSlots,\n formatProviderRef,\n instructionFragmentSchema,\n isDynamicSlot,\n jsonObjectSchema,\n jsonValueSchema,\n mcpServerBindingSchema,\n ProviderRefKind,\n providerRefSchema,\n resolvedAgentManifestSchema,\n sandboxBindingSchema,\n skillBundleSchema,\n type AgentManifestIface,\n type DynamicEvent,\n type DynamicSlotIface,\n type JsonValue,\n type ResolvedAgentManifestIface,\n} from '@finalai/agent-provider';\nimport * as z from 'zod';\n\n// Resolves a static manifest's dynamic slots for one session. The session service runs each resolver in the agent's isolate; this\n// helper decides which slots run at a boundary, validates each output against\n// the static field's schema, and splices the results in.\n\nexport type ResolveSlot = (slot: DynamicSlotIface, path: string) => Promise<JsonValue | null>;\n\nexport interface ResolveManifestArgsIface {\n manifest: AgentManifestIface;\n event: DynamicEvent;\n resolve: ResolveSlot;\n // Values from an earlier boundary (session.started values at turn.started),\n // used for slots that do not resolve at this event.\n previous?: Record<string, JsonValue | null>;\n}\n\nexport interface ResolvedManifestDetailIface {\n manifest: ResolvedAgentManifestIface;\n // Slot path \u2192 resolved value, for agent.session_manifests and later boundaries.\n values: Record<string, JsonValue | null>;\n}\n\nexport enum SlotValueKind {\n InstructionFragment = 'instruction-fragment',\n SkillBundle = 'skill-bundle',\n McpServers = 'mcp-servers',\n Sandboxes = 'sandboxes',\n SandboxEnvironment = 'sandbox-environment',\n Opaque = 'opaque',\n}\n\nexport const slotKindOf = (path: string): SlotValueKind => {\n if (/^harness\\.config\\.instructions\\[\\d+\\]$/.test(path)) return SlotValueKind.InstructionFragment;\n if (/^harness\\.config\\.skills\\[\\d+\\]$/.test(path)) return SlotValueKind.SkillBundle;\n if (path === 'mcpServers') return SlotValueKind.McpServers;\n if (path === 'sandboxes') return SlotValueKind.Sandboxes;\n if (/^sandboxes\\.[^.]+\\.environment$/.test(path)) return SlotValueKind.SandboxEnvironment;\n return SlotValueKind.Opaque;\n};\n\nconst resolvedSandboxesSchema = z.record(\n z.string(),\n sandboxBindingSchema.extend({ environment: jsonValueSchema }),\n);\n\nconst issueText = (error: z.ZodError): string =>\n error.issues.map((issue) => `${issue.path.join('.') || 'value'}: ${issue.message}`).join('; ');\n\nconst invalid = (path: string, detail: string): Error =>\n new Error(`dynamic slot ${path} resolved to an invalid value: ${detail}`);\n\nconst parseAs = <T extends z.ZodType>(schema: T, value: JsonValue, path: string): JsonValue => {\n const parsed = schema.safeParse(value);\n if (!parsed.success) throw invalid(path, issueText(parsed.error));\n return jsonValueSchema.parse(parsed.data);\n};\n\nconst isRecord = (value: JsonValue): value is { [key: string]: JsonValue } =>\n jsonObjectSchema.safeParse(value).success;\n\nconst roleless = z.looseObject({ role: z.null().optional() });\nconst environmentResultSchema = z.looseObject({\n providerName: z.string(),\n providerRef: jsonValueSchema.optional(),\n options: jsonValueSchema.optional(),\n openOptions: jsonValueSchema.optional(),\n});\n\n// Instruction results without a role ({ content }) default to system;\n// environment-shaped results normalize to their options.\nexport const validateSlotValue = (\n path: string,\n value: JsonValue | null,\n manifest?: AgentManifestIface,\n): JsonValue | null => {\n if (value == null) return null;\n switch (slotKindOf(path)) {\n case SlotValueKind.InstructionFragment: {\n if (isRecord(value) && roleless.safeParse(value).success) {\n return parseAs(instructionFragmentSchema, { ...value, role: 'system' }, path);\n }\n return parseAs(instructionFragmentSchema, value, path);\n }\n case SlotValueKind.SkillBundle:\n return Array.isArray(value)\n ? parseAs(z.array(skillBundleSchema), value, path)\n : parseAs(skillBundleSchema, value, path);\n case SlotValueKind.McpServers:\n return parseAs(z.array(mcpServerBindingSchema), value, path);\n case SlotValueKind.Sandboxes:\n return parseAs(resolvedSandboxesSchema, value, path);\n case SlotValueKind.SandboxEnvironment:\n if (manifest != null) checkEnvironmentProvider(manifest, path, value);\n const environment = environmentResultSchema.safeParse(value);\n if (environment.success && environment.data.openOptions != null)\n parseAs(\n sandboxBindingSchema.pick({ access: true, attach: true }).partial(),\n environment.data.openOptions,\n path,\n );\n return environment.success ? (environment.data.options ?? null) : value;\n case SlotValueKind.Opaque:\n return value;\n }\n};\n\nconst childPath = (parent: string, key: string | number): string => {\n if (z.number().safeParse(key).success) return `${parent}[${key}]`;\n return parent.length === 0 ? `${key}` : `${parent}.${key}`;\n};\n\n// Like replaceDynamicSlots, except that an array-item slot that resolved to\n// an array (several skills from one resolver) splices all of them in, and an\n// object field that resolved to null is omitted.\nconst splice = (\n value: JsonValue,\n values: Record<string, JsonValue | null>,\n path: string,\n): JsonValue => {\n if (isDynamicSlot(value)) return values[path] ?? null;\n if (Array.isArray(value)) {\n const out: JsonValue[] = [];\n value.forEach((item, index) => {\n const itemPath = childPath(path, index);\n if (isDynamicSlot(item)) {\n const resolved = values[itemPath];\n if (resolved == null) return;\n if (Array.isArray(resolved) && slotKindOf(itemPath) === SlotValueKind.SkillBundle)\n out.push(...resolved);\n else out.push(resolved);\n return;\n }\n out.push(splice(item, values, itemPath));\n });\n return out;\n }\n if (isRecord(value)) {\n const out: { [key: string]: JsonValue } = {};\n for (const [key, item] of Object.entries(value)) {\n const itemPath = childPath(path, key);\n // A config field whose resolver returned null is left out, so the\n // harness applies its own default; required fields keep their value.\n if (isDynamicSlot(item) && values[itemPath] == null && !KEEP_NULL.test(itemPath)) continue;\n out[key] = splice(item, values, itemPath);\n }\n return out;\n }\n return value;\n};\n\nconst KEEP_NULL = /^(sandboxes\\.[^.]+\\.environment)$/;\n\nconst FIELD_DEFAULTS = new Map<string, JsonValue>([\n ['mcpServers', []],\n ['sandboxes', {}],\n ['harness.config', {}],\n]);\n\n// A dynamic sandbox environment must be one of its binding's provider (the\n// compiler may have inferred that provider).\n\nconst checkEnvironmentProvider = (\n manifest: AgentManifestIface,\n path: string,\n value: JsonValue | null,\n): void => {\n if (slotKindOf(path) !== SlotValueKind.SandboxEnvironment || value == null) return;\n const returned = environmentResultSchema.safeParse(value);\n if (!returned.success) return;\n const target = path.slice('sandboxes.'.length, -'.environment'.length);\n const sandboxes = z.record(z.string(), sandboxBindingSchema).safeParse(manifest.sandboxes);\n const provider = sandboxes.success ? sandboxes.data[target]?.provider : undefined;\n if (provider == null) return;\n const returnedRef = providerRefSchema.safeParse(returned.data.providerRef);\n const mismatch = returnedRef.success\n ? formatProviderRef(returnedRef.data) !== formatProviderRef(provider)\n : // A bundle provider's environment carries only its name; installed ones are named for their specifier.\n provider.kind === ProviderRefKind.Package;\n if (mismatch) {\n throw invalid(\n path,\n `returned a ${returned.data.providerName} environment for a ${formatProviderRef(provider)} target`,\n );\n }\n};\n\nexport const resolveManifestDetailed = async (\n args: ResolveManifestArgsIface,\n): Promise<ResolvedManifestDetailIface> => {\n const manifestJson = jsonValueSchema.parse(args.manifest);\n const slots = findDynamicSlots(manifestJson);\n const values: Record<string, JsonValue | null> = {};\n const normalized: Record<string, JsonValue | null> = {};\n for (const found of slots) {\n const subscribed = found.slot.$dynamic.events.includes(args.event);\n const raw = subscribed\n ? await args.resolve(found.slot, found.path)\n : (args.previous?.[found.path] ?? null);\n if ((found.slot.$dynamic.requiredBindings?.length ?? 0) > 0 && raw == null)\n throw new Error(\n `Required hosted bindings for ${found.path} did not resolve: ${found.slot.$dynamic.requiredBindings?.map((item) => item.name).join(', ')}`,\n );\n if (subscribed) checkEnvironmentProvider(args.manifest, found.path, raw);\n normalized[found.path] =\n validateSlotValue(found.path, raw) ?? FIELD_DEFAULTS.get(found.path) ?? null;\n // Retain the descriptor so a later boundary preserves its open options too.\n values[found.path] =\n slotKindOf(found.path) === SlotValueKind.SandboxEnvironment\n ? raw\n : (normalized[found.path] ?? null);\n }\n const spliced = splice(manifestJson, normalized, '');\n const parsed = resolvedAgentManifestSchema.safeParse(spliced);\n if (!parsed.success) throw new Error(`resolved manifest is invalid: ${issueText(parsed.error)}`);\n const openOptionsSchema = sandboxBindingSchema.pick({ access: true, attach: true }).partial();\n for (const [path, raw] of Object.entries(values)) {\n if (slotKindOf(path) !== SlotValueKind.SandboxEnvironment) continue;\n const environment = environmentResultSchema.safeParse(raw);\n if (!environment.success || environment.data.openOptions == null) continue;\n const options = openOptionsSchema.safeParse(environment.data.openOptions);\n if (!options.success) throw invalid(path, issueText(options.error));\n const target = path.slice('sandboxes.'.length, -'.environment'.length);\n const binding = parsed.data.sandboxes[target];\n if (binding != null) parsed.data.sandboxes[target] = { ...binding, ...options.data };\n }\n return { manifest: parsed.data, values };\n};\n\nexport const resolveManifest = async (\n args: ResolveManifestArgsIface,\n): Promise<ResolvedAgentManifestIface> => (await resolveManifestDetailed(args)).manifest;\n"],
5
+ "mappings": "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",
6
6
  "names": ["SlotValueKind"]
7
7
  }
@@ -1,3 +1,7 @@
1
+ import {
2
+ jsonValueSchema,
3
+ hostedBindingRequirementSchema
4
+ } from "@finalai/agent-provider";
1
5
  import * as z from "zod";
2
6
  import {
3
7
  AuthoredKind,
@@ -61,7 +65,8 @@ const describeDynamic = (value) => {
61
65
  events: dynamicEventsOf(value),
62
66
  description: stringOrNull(fieldOf(value, "description")),
63
67
  preview: stringOrNull(fieldOf(value, "preview")),
64
- provider: hint
68
+ provider: hint,
69
+ requiredBindings: z.array(hostedBindingRequirementSchema).parse(fieldOf(value, "requiredBindings") ?? [])
65
70
  };
66
71
  };
67
72
  const collectAgentDynamics = (agent) => {
@@ -88,6 +93,8 @@ const dynamicSlot = (value, path) => {
88
93
  const slot = { resolver: `${AGENT_DYNAMIC_PREFIX}${path}`, events: described.events };
89
94
  if (described.description != null) slot["description"] = described.description;
90
95
  if (described.preview != null) slot["preview"] = described.preview;
96
+ if ((described.requiredBindings?.length ?? 0) > 0)
97
+ slot["requiredBindings"] = jsonValueSchema.parse(described.requiredBindings);
91
98
  return { $dynamic: slot };
92
99
  };
93
100
  const isDefinedHarnessLike = (value) => isCallable(value) && isCallable(fieldOf(value, "describe")) && isCallable(fieldOf(value, "open"));
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../../../../src/runtime/describe.ts"],
4
- "sourcesContent": ["import type { JsonObject, JsonValue } from '@finalai/agent-provider';\nimport * as z from 'zod';\nimport {\n AuthoredKind,\n authoredKindOf,\n pendingEntries,\n pendingExportName,\n} from \"../authoring/brand.mjs\";\nimport type {\n DescribedAgentIface,\n DescribedBundleIface,\n DescribedDynamicIface,\n DescribedModuleIface,\n DescribedSandboxIface,\n DescribedSandboxTargetIface,\n DescribedValue,\n} from \"./described.mjs\";\nimport {\n AGENT_DYNAMIC_PREFIX,\n COMBINED_MCP_SERVERS_EXPORT,\n namedExportName,\n SlotKind,\n type LayoutModuleIface,\n} from \"./layout.mjs\";\nimport {\n childPath,\n dynamicEventsOf,\n error,\n isDynamicSentinel,\n isEnvironmentLike,\n isOpenRequestLike,\n lowerConnection,\n lowerEnvironment,\n lowerInstructions,\n lowerSkill,\n lowerTool,\n note,\n sandboxProviderNameOf,\n toJson,\n type IssueIface,\n} from \"./lower.mjs\";\nimport {\n entriesOf,\n fieldOf,\n isCallable,\n isObjectLike,\n isPlainObject,\n isPromiseLike,\n isString,\n messageOf,\n stringOrNull,\n type AuthoredRecord,\n type AuthoredValue,\n} from \"./values.mjs\";\n\n// Static extraction, run inside the realm that evaluated the bundle. Reads\n// authored values; never calls tool bodies, resolvers or routes, and calls a\n// sandbox selector only to read the request a synchronous one returns.\n\nexport interface NamespaceEntryIface {\n layout: LayoutModuleIface;\n namespace: AuthoredRecord;\n}\n\nexport const describeDynamic = (value: AuthoredValue): DescribedDynamicIface => {\n const provider = fieldOf(value, 'provider');\n let hint: DescribedDynamicIface['provider'] = null;\n if (provider != null) {\n const kind = fieldOf(provider, 'kind');\n const ref = fieldOf(provider, 'providerRef');\n const issues: IssueIface[] = [];\n if ((kind === 'package' || kind === 'bundle') && provider != null) {\n hint = { ref: toJson(provider, { path: 'provider', issues }), name: null };\n } else if (ref != null) {\n hint = { ref: toJson(ref, { path: 'provider', issues }), name: null };\n } else {\n hint = {\n ref: null,\n name:\n stringOrNull(fieldOf(provider, 'name')) ??\n stringOrNull(fieldOf(fieldOf(provider, 'definition'), 'name')),\n };\n }\n }\n return {\n type: 'dynamic',\n events: dynamicEventsOf(value),\n description: stringOrNull(fieldOf(value, 'description')),\n preview: stringOrNull(fieldOf(value, 'preview')),\n provider: hint,\n };\n};\n\n// Dynamic sentinels inside agent.ts's harness config, addressed by their authored path. The bundle exports each as\n// `agent:<path>`.\nexport const collectAgentDynamics = (\n agent: AuthoredValue,\n): { path: string; value: AuthoredValue }[] => {\n const found: { path: string; value: AuthoredValue }[] = [];\n const walk = (value: AuthoredValue, path: string, depth: number): void => {\n if (depth > 32) return;\n if (isDynamicSentinel(value)) {\n found.push({ path, value });\n return;\n }\n if (Array.isArray(value)) {\n value.forEach((item, index) => walk(item, childPath(path, index), depth + 1));\n return;\n }\n if (isPlainObject(value) || authoredKindOf(value) != null) {\n for (const [key, item] of entriesOf(value)) walk(item, childPath(path, key), depth + 1);\n }\n };\n walk(fieldOf(fieldOf(agent, 'harness'), 'config'), 'harness.config', 0);\n return found;\n};\n\nconst dynamicSlot = (value: AuthoredValue, path: string): JsonValue => {\n const described = describeDynamic(value);\n const slot: JsonObject = { resolver: `${AGENT_DYNAMIC_PREFIX}${path}`, events: described.events };\n if (described.description != null) slot['description'] = described.description;\n if (described.preview != null) slot['preview'] = described.preview;\n return { $dynamic: slot };\n};\n\nconst isDefinedHarnessLike = (value: AuthoredValue): boolean =>\n isCallable(value) && isCallable(fieldOf(value, 'describe')) && isCallable(fieldOf(value, 'open'));\n\nconst KNOWN_AGENT_FIELDS: ReadonlySet<string> = new Set([\n 'name',\n 'description',\n 'avatarUrl',\n 'harness',\n 'tools',\n 'toolPolicy',\n 'secrets',\n 'channels',\n]);\n\n// Harness configuration belongs in the harness binding rather than top-level agent fields.\nconst HARNESS_CONFIG_FIELDS: ReadonlySet<string> = new Set([\n 'model',\n 'reasoning',\n 'credentials',\n 'permissions',\n 'permissionMode',\n 'instructions',\n 'skills',\n 'system',\n 'temperature',\n 'providerOptions',\n 'maxSteps',\n 'stopWhen',\n]);\n\nconst unknownAgentField = (key: string): string => {\n if (HARNESS_CONFIG_FIELDS.has(key))\n return `agent.ts field ${key} belongs in harness config (harness: serverlessPi({ ${key}: ... }))`;\n if (key === 'defaultTools')\n return 'agent.ts field defaultTools is not supported: base tools are declared with tools: baseTools({ ... }) and are off by default';\n if (key === 'subagents' || key === 'memory') return `agent.ts field ${key} is not supported yet`;\n return `agent.ts field ${key} is not an agent field (name, description, avatarUrl, harness, tools, toolPolicy, secrets, channels)`;\n};\n\ninterface DescribeContextIface {\n entries: NamespaceEntryIface[];\n sandboxIdentity: Map<AuthoredValue, string>;\n}\n\nconst describeHarness = (\n harness: AuthoredValue,\n ctx: DescribeContextIface,\n issues: IssueIface[],\n): DescribedAgentIface['harness'] => {\n if (harness == null) return null;\n const ref = fieldOf(harness, 'harness');\n if (!isObjectLike(ref)) {\n issues.push(error('agent.ts harness must be a harness binding, e.g. serverlessPi({ ... })'));\n return null;\n }\n let refJson = toJson(ref, { path: 'harness.harness', issues });\n if (fieldOf(ref, 'kind') === 'bundle' && fieldOf(ref, 'export') === '<pending>') {\n const candidates = ctx.entries.flatMap((entry) =>\n Object.entries(entry.namespace)\n .filter(([, value]) => isDefinedHarnessLike(value))\n .map(([name]) => namedExportName(entry.layout.base, name)),\n );\n if (candidates.length === 1 && candidates[0] != null)\n refJson = { kind: 'bundle', export: candidates[0] };\n else\n issues.push(\n error(\n 'the custom harness must come from defineHarness in @finalai/agents, or be exported once',\n ),\n );\n }\n const config = toJson(fieldOf(harness, 'config') ?? {}, {\n path: 'harness.config',\n issues,\n visit: (value, path) => (isDynamicSentinel(value) ? dynamicSlot(value, path) : undefined),\n });\n return { harness: refJson, config };\n};\n\n// Capabilities bound to sandbox targets (by export name) and those declared on\n// the harness's own host (`harnessHost`).\nconst describeBaseTools = (\n tools: AuthoredValue,\n ctx: DescribeContextIface,\n issues: IssueIface[],\n): { targets: Record<string, string>; host: string[] } | null => {\n if (tools == null) return null;\n if (authoredKindOf(tools) !== AuthoredKind.BaseTools) {\n issues.push(error('agent.ts tools must be baseTools({ shell: target, files: target, ... })'));\n return null;\n }\n const base = fieldOf(tools, 'base');\n const out: Record<string, string> = {};\n const host: string[] = [];\n if (!isPlainObject(base)) return { targets: out, host };\n for (const [capability, target] of Object.entries(base)) {\n if (target == null) continue;\n if (authoredKindOf(target) === AuthoredKind.HarnessHost) {\n host.push(capability);\n continue;\n }\n if (isString(target)) {\n out[capability] = target;\n continue;\n }\n const name = ctx.sandboxIdentity.get(target);\n if (name == null) {\n issues.push(\n error(\n `baseTools ${capability} is bound to a value that is not a sandbox target exported from sandbox.ts`,\n ),\n );\n continue;\n }\n out[capability] = name;\n }\n return { targets: out, host };\n};\n\nconst describeSecrets = (value: AuthoredValue, issues: IssueIface[]): string[] | null => {\n if (value == null) return null;\n const parsed = z.array(z.string().min(1)).safeParse(value);\n if (parsed.success) return parsed.data;\n issues.push(error('agent.ts secrets must be a list of secret names'));\n return null;\n};\n\nconst describeAgent = (\n value: AuthoredValue,\n ctx: DescribeContextIface,\n issues: IssueIface[],\n): DescribedAgentIface | null => {\n if (value == null) return null;\n if (!isPlainObject(value)) {\n issues.push(error('agent.ts must export defineAgent({ ... }) as its default export'));\n return null;\n }\n for (const key of Object.keys(value)) {\n if (!KNOWN_AGENT_FIELDS.has(key)) issues.push(error(unknownAgentField(key)));\n }\n const toolPolicyRaw = value['toolPolicy'];\n let toolPolicy: Record<string, string> | null = null;\n if (isPlainObject(toolPolicyRaw)) {\n toolPolicy = {};\n for (const [key, policy] of Object.entries(toolPolicyRaw)) {\n if (policy === 'allow' || policy === 'ask') toolPolicy[key] = policy;\n else issues.push(error(`agent.ts toolPolicy.${key} must be 'allow' or 'ask'`));\n }\n }\n const channelsRaw = value['channels'];\n let channels: DescribedAgentIface['channels'] = null;\n if (Array.isArray(channelsRaw)) {\n channels = channelsRaw.map((binding, index) => ({\n key: stringOrNull(fieldOf(binding, 'key')),\n channel: toJson(fieldOf(binding, 'channel') ?? null, {\n path: `channels[${index}].channel`,\n issues,\n }),\n config: toJson(fieldOf(binding, 'config') ?? {}, {\n path: `channels[${index}].config`,\n issues,\n }),\n }));\n }\n const baseToolsDescription = describeBaseTools(value['tools'], ctx, issues);\n return {\n type: 'agent',\n name: stringOrNull(value['name']),\n description: stringOrNull(value['description']),\n avatarUrl: stringOrNull(value['avatarUrl']),\n harness: describeHarness(value['harness'], ctx, issues),\n tools: baseToolsDescription?.targets ?? null,\n hostTools: baseToolsDescription?.host ?? null,\n toolPolicy,\n secrets: describeSecrets(value['secrets'], issues),\n channels,\n };\n};\n\nconst probeSelector = (selector: AuthoredValue, issues: IssueIface[]): AuthoredValue | null => {\n if (!isCallable(selector)) return null;\n try {\n const result = selector({\n session: null,\n secrets: { get: async () => null },\n open: async () => {\n throw new Error('sandboxes do not open while compiling');\n },\n });\n if (isEnvironmentLike(result) || isOpenRequestLike(result)) return result;\n // An async selector: what it opens is known only at session start.\n if (isPromiseLike(result)) Promise.resolve(result).catch(() => undefined);\n return null;\n } catch (cause) {\n issues.push(\n error(\n `sandbox.ts selector failed during compilation: ${String(cause)}; export its environment when it needs session context`,\n ),\n );\n return null;\n }\n};\n\nconst describeSandbox = (\n namespace: AuthoredRecord,\n issues: IssueIface[],\n): DescribedSandboxIface => {\n const targets: Record<string, DescribedSandboxTargetIface> = {};\n const providers: Record<string, string> = {};\n const describeTarget = (\n value: AuthoredValue,\n exportName: string,\n path: string,\n ): DescribedSandboxTargetIface | null => {\n if (isDynamicSentinel(value))\n return { exportName, environment: null, dynamic: describeDynamic(value) };\n if (isEnvironmentLike(value) || isOpenRequestLike(value)) {\n return { exportName, environment: lowerEnvironment(value, path, issues), dynamic: null };\n }\n return null;\n };\n for (const [name, value] of Object.entries(namespace)) {\n if (name === 'default') continue;\n const exportName = namedExportName('sandbox', name);\n const providerName = sandboxProviderNameOf(value);\n if (providerName != null) {\n providers[exportName] = providerName;\n continue;\n }\n const target = describeTarget(value, exportName, `sandbox.ts ${name}`);\n if (target != null) targets[name] = target;\n }\n const named = Object.keys(targets);\n const fallback = describeTarget(namespace['default'], 'sandbox', 'sandbox.ts default export');\n const selector = authoredKindOf(namespace['default']) === AuthoredKind.SandboxSelector;\n if (fallback != null) targets['default'] = fallback;\n else if (namespace['default'] != null && !selector) {\n issues.push(\n error(\n 'sandbox.ts default export must be defineSandbox(selector), an environment, or defineDynamic(...)',\n ),\n );\n }\n // A selector that opens an environment it creates itself\n // (`defineSandbox(() => computer().open())`) names no export\n // to bind; a synchronous one is called once to read the request it returns,\n // which becomes the default target.\n if (selector && named.length === 0 && fallback == null) {\n const opened = probeSelector(namespace['default'], issues);\n if (opened != null) {\n targets['default'] = {\n exportName: 'sandbox',\n environment: lowerEnvironment(opened, 'sandbox.ts default export', issues),\n dynamic: null,\n };\n }\n }\n let defaultTarget: string | null = null;\n if (targets['default'] != null) defaultTarget = 'default';\n else if (named.length === 1) defaultTarget = named[0] ?? null;\n if (selector && defaultTarget == null) {\n issues.push(\n error(\n named.length === 0\n ? 'sandbox.ts default export opens a sandbox but no environment is exported; export the environment it opens (export const computer = computer({ ... }))'\n : 'sandbox.ts default export opens a sandbox but several environments are exported; the selector needs exactly one',\n ),\n );\n }\n return { type: 'sandbox', targets, providers, selector, defaultTarget };\n};\n\nconst sandboxIdentityOf = (\n namespace: AuthoredRecord | null,\n sandbox: DescribedSandboxIface | null,\n): Map<AuthoredValue, string> => {\n const identity = new Map<AuthoredValue, string>();\n if (namespace == null || sandbox == null) return identity;\n for (const [name, value] of Object.entries(namespace)) {\n if (name === 'default') {\n if (sandbox.defaultTarget != null) identity.set(value, sandbox.defaultTarget);\n } else if (sandbox.targets[name] != null) identity.set(value, name);\n }\n return identity;\n};\n\nconst describeModuleValue = (\n entry: NamespaceEntryIface,\n ctx: DescribeContextIface,\n sandbox: DescribedSandboxIface | null,\n issues: IssueIface[],\n): DescribedValue | null => {\n const { layout, namespace } = entry;\n const value = namespace['default'];\n switch (layout.slot) {\n case SlotKind.Agent:\n return describeAgent(value, ctx, issues);\n case SlotKind.Sandbox:\n return sandbox;\n case SlotKind.Instructions: {\n if (isDynamicSentinel(value)) return describeDynamic(value);\n const fragment = lowerInstructions(value, null);\n if (fragment == null) {\n issues.push(\n error(\n `${layout.path} must export defineInstructions({ content, role }) or defineDynamic(...)`,\n ),\n );\n return null;\n }\n return { type: 'instructions', role: fragment.role, content: fragment.content };\n }\n case SlotKind.Skill: {\n if (isDynamicSentinel(value)) return describeDynamic(value);\n const lowered = lowerSkill({ key: layout.key, value });\n issues.push(...lowered.issues);\n return { type: 'skill', skill: toJson(lowered.skill, { path: layout.path, issues }) };\n }\n case SlotKind.Tool: {\n if (isDynamicSentinel(value)) return describeDynamic(value);\n const lowered = lowerTool({ name: layout.key, exportName: layout.base, value });\n issues.push(...lowered.issues);\n return {\n type: 'tool',\n descriptor: toJson(lowered.descriptor, { path: layout.path, issues }),\n approval: lowered.approval,\n };\n }\n case SlotKind.Connection: {\n if (isDynamicSentinel(value)) return describeDynamic(value);\n const lowered = lowerConnection({ key: layout.key, exportName: layout.base, value });\n issues.push(...lowered.issues);\n return {\n type: 'connection',\n binding: toJson(lowered.binding, { path: layout.path, issues }),\n };\n }\n case SlotKind.Schedule:\n return {\n type: 'schedule',\n cron: stringOrNull(fieldOf(value, 'cron')),\n markdown: stringOrNull(fieldOf(value, 'markdown')),\n timezone: stringOrNull(fieldOf(value, 'timezone')),\n target: stringOrNull(fieldOf(value, 'target')),\n };\n case SlotKind.Hook: {\n const events = fieldOf(value, 'events');\n return {\n type: 'hook',\n keys: entriesOf(events).map(([key]) => key),\n };\n }\n case SlotKind.Channel: {\n const routes = fieldOf(value, 'routes');\n return {\n type: 'channel',\n disabled: fieldOf(value, 'disabled') === true,\n installed: toJson(fieldOf(value, 'installed') ?? null, {\n path: `${layout.path} installed`,\n issues,\n }),\n routes: Array.isArray(routes)\n ? routes.map((route) => ({\n method: String(fieldOf(route, 'method')),\n path: String(fieldOf(route, 'path')),\n }))\n : [],\n turnPolicy: stringOrNull(fieldOf(value, 'turnPolicy')),\n config: toJson(fieldOf(value, 'config') ?? {}, { path: `${layout.path} config`, issues }),\n };\n }\n }\n};\n\nexport const describeBundle = (\n entries: NamespaceEntryIface[],\n synthesized: string[],\n): DescribedBundleIface => {\n const sandboxEntry = entries.find((entry) => entry.layout.slot === SlotKind.Sandbox) ?? null;\n const sandboxIssues: IssueIface[] = [];\n let sandbox: DescribedSandboxIface | null = null;\n if (sandboxEntry != null) {\n try {\n sandbox = describeSandbox(sandboxEntry.namespace, sandboxIssues);\n } catch (cause) {\n sandboxIssues.push(error(`sandbox.ts could not be described: ${messageOf(cause)}`));\n }\n }\n const ctx: DescribeContextIface = {\n entries,\n sandboxIdentity: sandboxIdentityOf(sandboxEntry?.namespace ?? null, sandbox),\n };\n const modules: DescribedModuleIface[] = entries.map((entry) => {\n const issues: IssueIface[] = entry.layout.slot === SlotKind.Sandbox ? sandboxIssues : [];\n const hasDefault = 'default' in entry.namespace && entry.namespace['default'] !== undefined;\n let value: DescribedValue | null = null;\n if (hasDefault || entry.layout.slot === SlotKind.Sandbox) {\n try {\n value = describeModuleValue(entry, ctx, sandbox, issues);\n } catch (cause) {\n issues.push(error(`${entry.layout.path} could not be described: ${messageOf(cause)}`));\n }\n } else if (entry.layout.slot !== SlotKind.Agent) {\n issues.push(note(`${entry.layout.path} has no default export; treated as a helper module`));\n }\n return {\n base: entry.layout.base,\n path: entry.layout.path,\n slot: entry.layout.slot,\n key: entry.layout.key,\n hasDefault,\n issues,\n value,\n };\n });\n return { modules, synthesized };\n};\n\n// Export names the bundle synthesizes, in the order describe and the isolate\n// both compute them.\nexport const synthesizedExports = (\n entries: NamespaceEntryIface[],\n): { name: string; value: AuthoredValue }[] => {\n const out: { name: string; value: AuthoredValue }[] = [];\n for (const entry of entries) {\n if (entry.layout.slot !== SlotKind.Agent) continue;\n for (const found of collectAgentDynamics(entry.namespace['default'])) {\n out.push({ name: `${AGENT_DYNAMIC_PREFIX}${found.path}`, value: found.value });\n }\n }\n for (const pending of pendingEntries())\n out.push({ name: pendingExportName(pending.index), value: pending.value });\n return out;\n};\n\nexport const needsCombinedMcpServers = (entries: NamespaceEntryIface[]): boolean =>\n entries.some(\n (entry) =>\n (entry.layout.slot === SlotKind.Tool || entry.layout.slot === SlotKind.Connection) &&\n isDynamicSentinel(entry.namespace['default']),\n );\n\nexport { COMBINED_MCP_SERVERS_EXPORT };\n"],
5
- "mappings": "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",
4
+ "sourcesContent": ["import {\n jsonValueSchema,\n hostedBindingRequirementSchema,\n type JsonObject,\n type JsonValue,\n} from '@finalai/agent-provider';\nimport * as z from 'zod';\nimport {\n AuthoredKind,\n authoredKindOf,\n pendingEntries,\n pendingExportName,\n} from \"../authoring/brand.mjs\";\nimport type {\n DescribedAgentIface,\n DescribedBundleIface,\n DescribedDynamicIface,\n DescribedModuleIface,\n DescribedSandboxIface,\n DescribedSandboxTargetIface,\n DescribedValue,\n} from \"./described.mjs\";\nimport {\n AGENT_DYNAMIC_PREFIX,\n COMBINED_MCP_SERVERS_EXPORT,\n namedExportName,\n SlotKind,\n type LayoutModuleIface,\n} from \"./layout.mjs\";\nimport {\n childPath,\n dynamicEventsOf,\n error,\n isDynamicSentinel,\n isEnvironmentLike,\n isOpenRequestLike,\n lowerConnection,\n lowerEnvironment,\n lowerInstructions,\n lowerSkill,\n lowerTool,\n note,\n sandboxProviderNameOf,\n toJson,\n type IssueIface,\n} from \"./lower.mjs\";\nimport {\n entriesOf,\n fieldOf,\n isCallable,\n isObjectLike,\n isPlainObject,\n isPromiseLike,\n isString,\n messageOf,\n stringOrNull,\n type AuthoredRecord,\n type AuthoredValue,\n} from \"./values.mjs\";\n\n// Static extraction, run inside the realm that evaluated the bundle. Reads\n// authored values; never calls tool bodies, resolvers or routes, and calls a\n// sandbox selector only to read the request a synchronous one returns.\n\nexport interface NamespaceEntryIface {\n layout: LayoutModuleIface;\n namespace: AuthoredRecord;\n}\n\nexport const describeDynamic = (value: AuthoredValue): DescribedDynamicIface => {\n const provider = fieldOf(value, 'provider');\n let hint: DescribedDynamicIface['provider'] = null;\n if (provider != null) {\n const kind = fieldOf(provider, 'kind');\n const ref = fieldOf(provider, 'providerRef');\n const issues: IssueIface[] = [];\n if ((kind === 'package' || kind === 'bundle') && provider != null) {\n hint = { ref: toJson(provider, { path: 'provider', issues }), name: null };\n } else if (ref != null) {\n hint = { ref: toJson(ref, { path: 'provider', issues }), name: null };\n } else {\n hint = {\n ref: null,\n name:\n stringOrNull(fieldOf(provider, 'name')) ??\n stringOrNull(fieldOf(fieldOf(provider, 'definition'), 'name')),\n };\n }\n }\n return {\n type: 'dynamic',\n events: dynamicEventsOf(value),\n description: stringOrNull(fieldOf(value, 'description')),\n preview: stringOrNull(fieldOf(value, 'preview')),\n provider: hint,\n requiredBindings: z\n .array(hostedBindingRequirementSchema)\n .parse(fieldOf(value, 'requiredBindings') ?? []),\n };\n};\n\n// Dynamic sentinels inside agent.ts's harness config, addressed by their authored path. The bundle exports each as\n// `agent:<path>`.\nexport const collectAgentDynamics = (\n agent: AuthoredValue,\n): { path: string; value: AuthoredValue }[] => {\n const found: { path: string; value: AuthoredValue }[] = [];\n const walk = (value: AuthoredValue, path: string, depth: number): void => {\n if (depth > 32) return;\n if (isDynamicSentinel(value)) {\n found.push({ path, value });\n return;\n }\n if (Array.isArray(value)) {\n value.forEach((item, index) => walk(item, childPath(path, index), depth + 1));\n return;\n }\n if (isPlainObject(value) || authoredKindOf(value) != null) {\n for (const [key, item] of entriesOf(value)) walk(item, childPath(path, key), depth + 1);\n }\n };\n walk(fieldOf(fieldOf(agent, 'harness'), 'config'), 'harness.config', 0);\n return found;\n};\n\nconst dynamicSlot = (value: AuthoredValue, path: string): JsonValue => {\n const described = describeDynamic(value);\n const slot: JsonObject = { resolver: `${AGENT_DYNAMIC_PREFIX}${path}`, events: described.events };\n if (described.description != null) slot['description'] = described.description;\n if (described.preview != null) slot['preview'] = described.preview;\n if ((described.requiredBindings?.length ?? 0) > 0)\n slot['requiredBindings'] = jsonValueSchema.parse(described.requiredBindings);\n return { $dynamic: slot };\n};\n\nconst isDefinedHarnessLike = (value: AuthoredValue): boolean =>\n isCallable(value) && isCallable(fieldOf(value, 'describe')) && isCallable(fieldOf(value, 'open'));\n\nconst KNOWN_AGENT_FIELDS: ReadonlySet<string> = new Set([\n 'name',\n 'description',\n 'avatarUrl',\n 'harness',\n 'tools',\n 'toolPolicy',\n 'secrets',\n 'channels',\n]);\n\n// Harness configuration belongs in the harness binding rather than top-level agent fields.\nconst HARNESS_CONFIG_FIELDS: ReadonlySet<string> = new Set([\n 'model',\n 'reasoning',\n 'credentials',\n 'permissions',\n 'permissionMode',\n 'instructions',\n 'skills',\n 'system',\n 'temperature',\n 'providerOptions',\n 'maxSteps',\n 'stopWhen',\n]);\n\nconst unknownAgentField = (key: string): string => {\n if (HARNESS_CONFIG_FIELDS.has(key))\n return `agent.ts field ${key} belongs in harness config (harness: serverlessPi({ ${key}: ... }))`;\n if (key === 'defaultTools')\n return 'agent.ts field defaultTools is not supported: base tools are declared with tools: baseTools({ ... }) and are off by default';\n if (key === 'subagents' || key === 'memory') return `agent.ts field ${key} is not supported yet`;\n return `agent.ts field ${key} is not an agent field (name, description, avatarUrl, harness, tools, toolPolicy, secrets, channels)`;\n};\n\ninterface DescribeContextIface {\n entries: NamespaceEntryIface[];\n sandboxIdentity: Map<AuthoredValue, string>;\n}\n\nconst describeHarness = (\n harness: AuthoredValue,\n ctx: DescribeContextIface,\n issues: IssueIface[],\n): DescribedAgentIface['harness'] => {\n if (harness == null) return null;\n const ref = fieldOf(harness, 'harness');\n if (!isObjectLike(ref)) {\n issues.push(error('agent.ts harness must be a harness binding, e.g. serverlessPi({ ... })'));\n return null;\n }\n let refJson = toJson(ref, { path: 'harness.harness', issues });\n if (fieldOf(ref, 'kind') === 'bundle' && fieldOf(ref, 'export') === '<pending>') {\n const candidates = ctx.entries.flatMap((entry) =>\n Object.entries(entry.namespace)\n .filter(([, value]) => isDefinedHarnessLike(value))\n .map(([name]) => namedExportName(entry.layout.base, name)),\n );\n if (candidates.length === 1 && candidates[0] != null)\n refJson = { kind: 'bundle', export: candidates[0] };\n else\n issues.push(\n error(\n 'the custom harness must come from defineHarness in @finalai/agents, or be exported once',\n ),\n );\n }\n const config = toJson(fieldOf(harness, 'config') ?? {}, {\n path: 'harness.config',\n issues,\n visit: (value, path) => (isDynamicSentinel(value) ? dynamicSlot(value, path) : undefined),\n });\n return { harness: refJson, config };\n};\n\n// Capabilities bound to sandbox targets (by export name) and those declared on\n// the harness's own host (`harnessHost`).\nconst describeBaseTools = (\n tools: AuthoredValue,\n ctx: DescribeContextIface,\n issues: IssueIface[],\n): { targets: Record<string, string>; host: string[] } | null => {\n if (tools == null) return null;\n if (authoredKindOf(tools) !== AuthoredKind.BaseTools) {\n issues.push(error('agent.ts tools must be baseTools({ shell: target, files: target, ... })'));\n return null;\n }\n const base = fieldOf(tools, 'base');\n const out: Record<string, string> = {};\n const host: string[] = [];\n if (!isPlainObject(base)) return { targets: out, host };\n for (const [capability, target] of Object.entries(base)) {\n if (target == null) continue;\n if (authoredKindOf(target) === AuthoredKind.HarnessHost) {\n host.push(capability);\n continue;\n }\n if (isString(target)) {\n out[capability] = target;\n continue;\n }\n const name = ctx.sandboxIdentity.get(target);\n if (name == null) {\n issues.push(\n error(\n `baseTools ${capability} is bound to a value that is not a sandbox target exported from sandbox.ts`,\n ),\n );\n continue;\n }\n out[capability] = name;\n }\n return { targets: out, host };\n};\n\nconst describeSecrets = (value: AuthoredValue, issues: IssueIface[]): string[] | null => {\n if (value == null) return null;\n const parsed = z.array(z.string().min(1)).safeParse(value);\n if (parsed.success) return parsed.data;\n issues.push(error('agent.ts secrets must be a list of secret names'));\n return null;\n};\n\nconst describeAgent = (\n value: AuthoredValue,\n ctx: DescribeContextIface,\n issues: IssueIface[],\n): DescribedAgentIface | null => {\n if (value == null) return null;\n if (!isPlainObject(value)) {\n issues.push(error('agent.ts must export defineAgent({ ... }) as its default export'));\n return null;\n }\n for (const key of Object.keys(value)) {\n if (!KNOWN_AGENT_FIELDS.has(key)) issues.push(error(unknownAgentField(key)));\n }\n const toolPolicyRaw = value['toolPolicy'];\n let toolPolicy: Record<string, string> | null = null;\n if (isPlainObject(toolPolicyRaw)) {\n toolPolicy = {};\n for (const [key, policy] of Object.entries(toolPolicyRaw)) {\n if (policy === 'allow' || policy === 'ask') toolPolicy[key] = policy;\n else issues.push(error(`agent.ts toolPolicy.${key} must be 'allow' or 'ask'`));\n }\n }\n const channelsRaw = value['channels'];\n let channels: DescribedAgentIface['channels'] = null;\n if (Array.isArray(channelsRaw)) {\n channels = channelsRaw.map((binding, index) => ({\n key: stringOrNull(fieldOf(binding, 'key')),\n channel: toJson(fieldOf(binding, 'channel') ?? null, {\n path: `channels[${index}].channel`,\n issues,\n }),\n config: toJson(fieldOf(binding, 'config') ?? {}, {\n path: `channels[${index}].config`,\n issues,\n }),\n }));\n }\n const baseToolsDescription = describeBaseTools(value['tools'], ctx, issues);\n return {\n type: 'agent',\n name: stringOrNull(value['name']),\n description: stringOrNull(value['description']),\n avatarUrl: stringOrNull(value['avatarUrl']),\n harness: describeHarness(value['harness'], ctx, issues),\n tools: baseToolsDescription?.targets ?? null,\n hostTools: baseToolsDescription?.host ?? null,\n toolPolicy,\n secrets: describeSecrets(value['secrets'], issues),\n channels,\n };\n};\n\nconst probeSelector = (selector: AuthoredValue, issues: IssueIface[]): AuthoredValue | null => {\n if (!isCallable(selector)) return null;\n try {\n const result = selector({\n session: null,\n secrets: { get: async () => null },\n open: async () => {\n throw new Error('sandboxes do not open while compiling');\n },\n });\n if (isEnvironmentLike(result) || isOpenRequestLike(result)) return result;\n // An async selector: what it opens is known only at session start.\n if (isPromiseLike(result)) Promise.resolve(result).catch(() => undefined);\n return null;\n } catch (cause) {\n issues.push(\n error(\n `sandbox.ts selector failed during compilation: ${String(cause)}; export its environment when it needs session context`,\n ),\n );\n return null;\n }\n};\n\nconst describeSandbox = (\n namespace: AuthoredRecord,\n issues: IssueIface[],\n): DescribedSandboxIface => {\n const targets: Record<string, DescribedSandboxTargetIface> = {};\n const providers: Record<string, string> = {};\n const describeTarget = (\n value: AuthoredValue,\n exportName: string,\n path: string,\n ): DescribedSandboxTargetIface | null => {\n if (isDynamicSentinel(value))\n return { exportName, environment: null, dynamic: describeDynamic(value) };\n if (isEnvironmentLike(value) || isOpenRequestLike(value)) {\n return { exportName, environment: lowerEnvironment(value, path, issues), dynamic: null };\n }\n return null;\n };\n for (const [name, value] of Object.entries(namespace)) {\n if (name === 'default') continue;\n const exportName = namedExportName('sandbox', name);\n const providerName = sandboxProviderNameOf(value);\n if (providerName != null) {\n providers[exportName] = providerName;\n continue;\n }\n const target = describeTarget(value, exportName, `sandbox.ts ${name}`);\n if (target != null) targets[name] = target;\n }\n const named = Object.keys(targets);\n const fallback = describeTarget(namespace['default'], 'sandbox', 'sandbox.ts default export');\n const selector = authoredKindOf(namespace['default']) === AuthoredKind.SandboxSelector;\n if (fallback != null) targets['default'] = fallback;\n else if (namespace['default'] != null && !selector) {\n issues.push(\n error(\n 'sandbox.ts default export must be defineSandbox(selector), an environment, or defineDynamic(...)',\n ),\n );\n }\n // A selector that opens an environment it creates itself\n // (`defineSandbox(() => computer().open())`) names no export\n // to bind; a synchronous one is called once to read the request it returns,\n // which becomes the default target.\n if (selector && named.length === 0 && fallback == null) {\n const opened = probeSelector(namespace['default'], issues);\n if (opened != null) {\n targets['default'] = {\n exportName: 'sandbox',\n environment: lowerEnvironment(opened, 'sandbox.ts default export', issues),\n dynamic: null,\n };\n }\n }\n let defaultTarget: string | null = null;\n if (targets['default'] != null) defaultTarget = 'default';\n else if (named.length === 1) defaultTarget = named[0] ?? null;\n if (selector && defaultTarget == null) {\n issues.push(\n error(\n named.length === 0\n ? 'sandbox.ts default export opens a sandbox but no environment is exported; export the environment it opens (export const computer = computer({ ... }))'\n : 'sandbox.ts default export opens a sandbox but several environments are exported; the selector needs exactly one',\n ),\n );\n }\n return { type: 'sandbox', targets, providers, selector, defaultTarget };\n};\n\nconst sandboxIdentityOf = (\n namespace: AuthoredRecord | null,\n sandbox: DescribedSandboxIface | null,\n): Map<AuthoredValue, string> => {\n const identity = new Map<AuthoredValue, string>();\n if (namespace == null || sandbox == null) return identity;\n for (const [name, value] of Object.entries(namespace)) {\n if (name === 'default') {\n if (sandbox.defaultTarget != null) identity.set(value, sandbox.defaultTarget);\n } else if (sandbox.targets[name] != null) identity.set(value, name);\n }\n return identity;\n};\n\nconst describeModuleValue = (\n entry: NamespaceEntryIface,\n ctx: DescribeContextIface,\n sandbox: DescribedSandboxIface | null,\n issues: IssueIface[],\n): DescribedValue | null => {\n const { layout, namespace } = entry;\n const value = namespace['default'];\n switch (layout.slot) {\n case SlotKind.Agent:\n return describeAgent(value, ctx, issues);\n case SlotKind.Sandbox:\n return sandbox;\n case SlotKind.Instructions: {\n if (isDynamicSentinel(value)) return describeDynamic(value);\n const fragment = lowerInstructions(value, null);\n if (fragment == null) {\n issues.push(\n error(\n `${layout.path} must export defineInstructions({ content, role }) or defineDynamic(...)`,\n ),\n );\n return null;\n }\n return { type: 'instructions', role: fragment.role, content: fragment.content };\n }\n case SlotKind.Skill: {\n if (isDynamicSentinel(value)) return describeDynamic(value);\n const lowered = lowerSkill({ key: layout.key, value });\n issues.push(...lowered.issues);\n return { type: 'skill', skill: toJson(lowered.skill, { path: layout.path, issues }) };\n }\n case SlotKind.Tool: {\n if (isDynamicSentinel(value)) return describeDynamic(value);\n const lowered = lowerTool({ name: layout.key, exportName: layout.base, value });\n issues.push(...lowered.issues);\n return {\n type: 'tool',\n descriptor: toJson(lowered.descriptor, { path: layout.path, issues }),\n approval: lowered.approval,\n };\n }\n case SlotKind.Connection: {\n if (isDynamicSentinel(value)) return describeDynamic(value);\n const lowered = lowerConnection({ key: layout.key, exportName: layout.base, value });\n issues.push(...lowered.issues);\n return {\n type: 'connection',\n binding: toJson(lowered.binding, { path: layout.path, issues }),\n };\n }\n case SlotKind.Schedule:\n return {\n type: 'schedule',\n cron: stringOrNull(fieldOf(value, 'cron')),\n markdown: stringOrNull(fieldOf(value, 'markdown')),\n timezone: stringOrNull(fieldOf(value, 'timezone')),\n target: stringOrNull(fieldOf(value, 'target')),\n };\n case SlotKind.Hook: {\n const events = fieldOf(value, 'events');\n return {\n type: 'hook',\n keys: entriesOf(events).map(([key]) => key),\n };\n }\n case SlotKind.Channel: {\n const routes = fieldOf(value, 'routes');\n return {\n type: 'channel',\n disabled: fieldOf(value, 'disabled') === true,\n installed: toJson(fieldOf(value, 'installed') ?? null, {\n path: `${layout.path} installed`,\n issues,\n }),\n routes: Array.isArray(routes)\n ? routes.map((route) => ({\n method: String(fieldOf(route, 'method')),\n path: String(fieldOf(route, 'path')),\n }))\n : [],\n turnPolicy: stringOrNull(fieldOf(value, 'turnPolicy')),\n config: toJson(fieldOf(value, 'config') ?? {}, { path: `${layout.path} config`, issues }),\n };\n }\n }\n};\n\nexport const describeBundle = (\n entries: NamespaceEntryIface[],\n synthesized: string[],\n): DescribedBundleIface => {\n const sandboxEntry = entries.find((entry) => entry.layout.slot === SlotKind.Sandbox) ?? null;\n const sandboxIssues: IssueIface[] = [];\n let sandbox: DescribedSandboxIface | null = null;\n if (sandboxEntry != null) {\n try {\n sandbox = describeSandbox(sandboxEntry.namespace, sandboxIssues);\n } catch (cause) {\n sandboxIssues.push(error(`sandbox.ts could not be described: ${messageOf(cause)}`));\n }\n }\n const ctx: DescribeContextIface = {\n entries,\n sandboxIdentity: sandboxIdentityOf(sandboxEntry?.namespace ?? null, sandbox),\n };\n const modules: DescribedModuleIface[] = entries.map((entry) => {\n const issues: IssueIface[] = entry.layout.slot === SlotKind.Sandbox ? sandboxIssues : [];\n const hasDefault = 'default' in entry.namespace && entry.namespace['default'] !== undefined;\n let value: DescribedValue | null = null;\n if (hasDefault || entry.layout.slot === SlotKind.Sandbox) {\n try {\n value = describeModuleValue(entry, ctx, sandbox, issues);\n } catch (cause) {\n issues.push(error(`${entry.layout.path} could not be described: ${messageOf(cause)}`));\n }\n } else if (entry.layout.slot !== SlotKind.Agent) {\n issues.push(note(`${entry.layout.path} has no default export; treated as a helper module`));\n }\n return {\n base: entry.layout.base,\n path: entry.layout.path,\n slot: entry.layout.slot,\n key: entry.layout.key,\n hasDefault,\n issues,\n value,\n };\n });\n return { modules, synthesized };\n};\n\n// Export names the bundle synthesizes, in the order describe and the isolate\n// both compute them.\nexport const synthesizedExports = (\n entries: NamespaceEntryIface[],\n): { name: string; value: AuthoredValue }[] => {\n const out: { name: string; value: AuthoredValue }[] = [];\n for (const entry of entries) {\n if (entry.layout.slot !== SlotKind.Agent) continue;\n for (const found of collectAgentDynamics(entry.namespace['default'])) {\n out.push({ name: `${AGENT_DYNAMIC_PREFIX}${found.path}`, value: found.value });\n }\n }\n for (const pending of pendingEntries())\n out.push({ name: pendingExportName(pending.index), value: pending.value });\n return out;\n};\n\nexport const needsCombinedMcpServers = (entries: NamespaceEntryIface[]): boolean =>\n entries.some(\n (entry) =>\n (entry.layout.slot === SlotKind.Tool || entry.layout.slot === SlotKind.Connection) &&\n isDynamicSentinel(entry.namespace['default']),\n );\n\nexport { COMBINED_MCP_SERVERS_EXPORT };\n"],
5
+ "mappings": "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",
6
6
  "names": []
7
7
  }
@@ -10,6 +10,10 @@ export declare const describedDynamicSchema: z.ZodObject<{
10
10
  events: z.ZodArray<z.ZodString>;
11
11
  description: z.ZodNullable<z.ZodString>;
12
12
  preview: z.ZodNullable<z.ZodString>;
13
+ requiredBindings: z.ZodOptional<z.ZodArray<z.ZodObject<{
14
+ name: z.ZodString;
15
+ schema: z.ZodType<import("@finalai/agent-provider").JsonObject, unknown, z.core.$ZodTypeInternals<import("@finalai/agent-provider").JsonObject, unknown>>;
16
+ }, z.core.$strip>>>;
13
17
  provider: z.ZodNullable<z.ZodObject<{
14
18
  ref: z.ZodNullable<z.ZodType<import("@finalai/agent-provider").JsonValue, unknown, z.core.$ZodTypeInternals<import("@finalai/agent-provider").JsonValue, unknown>>>;
15
19
  name: z.ZodNullable<z.ZodString>;
@@ -53,6 +57,10 @@ declare const describedSandboxTargetSchema: z.ZodObject<{
53
57
  events: z.ZodArray<z.ZodString>;
54
58
  description: z.ZodNullable<z.ZodString>;
55
59
  preview: z.ZodNullable<z.ZodString>;
60
+ requiredBindings: z.ZodOptional<z.ZodArray<z.ZodObject<{
61
+ name: z.ZodString;
62
+ schema: z.ZodType<import("@finalai/agent-provider").JsonObject, unknown, z.core.$ZodTypeInternals<import("@finalai/agent-provider").JsonObject, unknown>>;
63
+ }, z.core.$strip>>>;
56
64
  provider: z.ZodNullable<z.ZodObject<{
57
65
  ref: z.ZodNullable<z.ZodType<import("@finalai/agent-provider").JsonValue, unknown, z.core.$ZodTypeInternals<import("@finalai/agent-provider").JsonValue, unknown>>>;
58
66
  name: z.ZodNullable<z.ZodString>;
@@ -74,6 +82,10 @@ declare const describedSandboxSchema: z.ZodObject<{
74
82
  events: z.ZodArray<z.ZodString>;
75
83
  description: z.ZodNullable<z.ZodString>;
76
84
  preview: z.ZodNullable<z.ZodString>;
85
+ requiredBindings: z.ZodOptional<z.ZodArray<z.ZodObject<{
86
+ name: z.ZodString;
87
+ schema: z.ZodType<import("@finalai/agent-provider").JsonObject, unknown, z.core.$ZodTypeInternals<import("@finalai/agent-provider").JsonObject, unknown>>;
88
+ }, z.core.$strip>>>;
77
89
  provider: z.ZodNullable<z.ZodObject<{
78
90
  ref: z.ZodNullable<z.ZodType<import("@finalai/agent-provider").JsonValue, unknown, z.core.$ZodTypeInternals<import("@finalai/agent-provider").JsonValue, unknown>>>;
79
91
  name: z.ZodNullable<z.ZodString>;
@@ -107,6 +119,10 @@ export declare const describedValueSchema: z.ZodDiscriminatedUnion<[z.ZodObject<
107
119
  events: z.ZodArray<z.ZodString>;
108
120
  description: z.ZodNullable<z.ZodString>;
109
121
  preview: z.ZodNullable<z.ZodString>;
122
+ requiredBindings: z.ZodOptional<z.ZodArray<z.ZodObject<{
123
+ name: z.ZodString;
124
+ schema: z.ZodType<import("@finalai/agent-provider").JsonObject, unknown, z.core.$ZodTypeInternals<import("@finalai/agent-provider").JsonObject, unknown>>;
125
+ }, z.core.$strip>>>;
110
126
  provider: z.ZodNullable<z.ZodObject<{
111
127
  ref: z.ZodNullable<z.ZodType<import("@finalai/agent-provider").JsonValue, unknown, z.core.$ZodTypeInternals<import("@finalai/agent-provider").JsonValue, unknown>>>;
112
128
  name: z.ZodNullable<z.ZodString>;
@@ -159,6 +175,10 @@ export declare const describedValueSchema: z.ZodDiscriminatedUnion<[z.ZodObject<
159
175
  events: z.ZodArray<z.ZodString>;
160
176
  description: z.ZodNullable<z.ZodString>;
161
177
  preview: z.ZodNullable<z.ZodString>;
178
+ requiredBindings: z.ZodOptional<z.ZodArray<z.ZodObject<{
179
+ name: z.ZodString;
180
+ schema: z.ZodType<import("@finalai/agent-provider").JsonObject, unknown, z.core.$ZodTypeInternals<import("@finalai/agent-provider").JsonObject, unknown>>;
181
+ }, z.core.$strip>>>;
162
182
  provider: z.ZodNullable<z.ZodObject<{
163
183
  ref: z.ZodNullable<z.ZodType<import("@finalai/agent-provider").JsonValue, unknown, z.core.$ZodTypeInternals<import("@finalai/agent-provider").JsonValue, unknown>>>;
164
184
  name: z.ZodNullable<z.ZodString>;
@@ -202,6 +222,10 @@ export declare const describedModuleSchema: z.ZodObject<{
202
222
  events: z.ZodArray<z.ZodString>;
203
223
  description: z.ZodNullable<z.ZodString>;
204
224
  preview: z.ZodNullable<z.ZodString>;
225
+ requiredBindings: z.ZodOptional<z.ZodArray<z.ZodObject<{
226
+ name: z.ZodString;
227
+ schema: z.ZodType<import("@finalai/agent-provider").JsonObject, unknown, z.core.$ZodTypeInternals<import("@finalai/agent-provider").JsonObject, unknown>>;
228
+ }, z.core.$strip>>>;
205
229
  provider: z.ZodNullable<z.ZodObject<{
206
230
  ref: z.ZodNullable<z.ZodType<import("@finalai/agent-provider").JsonValue, unknown, z.core.$ZodTypeInternals<import("@finalai/agent-provider").JsonValue, unknown>>>;
207
231
  name: z.ZodNullable<z.ZodString>;
@@ -254,6 +278,10 @@ export declare const describedModuleSchema: z.ZodObject<{
254
278
  events: z.ZodArray<z.ZodString>;
255
279
  description: z.ZodNullable<z.ZodString>;
256
280
  preview: z.ZodNullable<z.ZodString>;
281
+ requiredBindings: z.ZodOptional<z.ZodArray<z.ZodObject<{
282
+ name: z.ZodString;
283
+ schema: z.ZodType<import("@finalai/agent-provider").JsonObject, unknown, z.core.$ZodTypeInternals<import("@finalai/agent-provider").JsonObject, unknown>>;
284
+ }, z.core.$strip>>>;
257
285
  provider: z.ZodNullable<z.ZodObject<{
258
286
  ref: z.ZodNullable<z.ZodType<import("@finalai/agent-provider").JsonValue, unknown, z.core.$ZodTypeInternals<import("@finalai/agent-provider").JsonValue, unknown>>>;
259
287
  name: z.ZodNullable<z.ZodString>;
@@ -299,6 +327,10 @@ export declare const describedBundleSchema: z.ZodObject<{
299
327
  events: z.ZodArray<z.ZodString>;
300
328
  description: z.ZodNullable<z.ZodString>;
301
329
  preview: z.ZodNullable<z.ZodString>;
330
+ requiredBindings: z.ZodOptional<z.ZodArray<z.ZodObject<{
331
+ name: z.ZodString;
332
+ schema: z.ZodType<import("@finalai/agent-provider").JsonObject, unknown, z.core.$ZodTypeInternals<import("@finalai/agent-provider").JsonObject, unknown>>;
333
+ }, z.core.$strip>>>;
302
334
  provider: z.ZodNullable<z.ZodObject<{
303
335
  ref: z.ZodNullable<z.ZodType<import("@finalai/agent-provider").JsonValue, unknown, z.core.$ZodTypeInternals<import("@finalai/agent-provider").JsonValue, unknown>>>;
304
336
  name: z.ZodNullable<z.ZodString>;
@@ -351,6 +383,10 @@ export declare const describedBundleSchema: z.ZodObject<{
351
383
  events: z.ZodArray<z.ZodString>;
352
384
  description: z.ZodNullable<z.ZodString>;
353
385
  preview: z.ZodNullable<z.ZodString>;
386
+ requiredBindings: z.ZodOptional<z.ZodArray<z.ZodObject<{
387
+ name: z.ZodString;
388
+ schema: z.ZodType<import("@finalai/agent-provider").JsonObject, unknown, z.core.$ZodTypeInternals<import("@finalai/agent-provider").JsonObject, unknown>>;
389
+ }, z.core.$strip>>>;
354
390
  provider: z.ZodNullable<z.ZodObject<{
355
391
  ref: z.ZodNullable<z.ZodType<import("@finalai/agent-provider").JsonValue, unknown, z.core.$ZodTypeInternals<import("@finalai/agent-provider").JsonValue, unknown>>>;
356
392
  name: z.ZodNullable<z.ZodString>;
@@ -1,4 +1,4 @@
1
- import { jsonValueSchema } from "@finalai/agent-provider";
1
+ import { hostedBindingRequirementSchema, jsonValueSchema } from "@finalai/agent-provider";
2
2
  import * as z from "zod";
3
3
  import { SlotKind } from "./layout.mjs";
4
4
  import { IssueSeverity } from "./lower.mjs";
@@ -12,6 +12,7 @@ const describedDynamicSchema = z.object({
12
12
  events: z.array(z.string()),
13
13
  description: z.string().nullable(),
14
14
  preview: z.string().nullable(),
15
+ requiredBindings: z.array(hostedBindingRequirementSchema).optional(),
15
16
  provider: providerHintSchema.nullable()
16
17
  });
17
18
  const describedAgentSchema = z.object({
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../../../../src/runtime/described.ts"],
4
- "sourcesContent": ["import { jsonValueSchema } from '@finalai/agent-provider';\nimport * as z from 'zod';\nimport { SlotKind } from \"./layout.mjs\";\nimport { IssueSeverity } from \"./lower.mjs\";\n\n// The static description of a bundle's authored modules, produced inside the\n// evaluation realm and parsed by the compiler. Everything is JSON.\n\nexport const issueSchema = z.object({ severity: z.nativeEnum(IssueSeverity), message: z.string() });\n\nconst providerHintSchema = z.object({\n ref: jsonValueSchema.nullable(),\n name: z.string().nullable(),\n});\n\nexport const describedDynamicSchema = z.object({\n type: z.literal('dynamic'),\n events: z.array(z.string()),\n description: z.string().nullable(),\n preview: z.string().nullable(),\n provider: providerHintSchema.nullable(),\n});\n\nconst describedAgentSchema = z.object({\n type: z.literal('agent'),\n name: z.string().nullable(),\n description: z.string().nullable(),\n avatarUrl: z.string().nullable(),\n harness: z.object({ harness: jsonValueSchema, config: jsonValueSchema }).nullable(),\n tools: z.record(z.string(), z.string()).nullable(),\n // Capabilities bound to `harnessHost` (the harness's own host, no target).\n hostTools: z.array(z.string()).nullable().default(null),\n toolPolicy: z.record(z.string(), z.string()).nullable(),\n secrets: z.array(z.string()).nullable(),\n channels: z\n .array(\n z.object({ key: z.string().nullable(), channel: jsonValueSchema, config: jsonValueSchema }),\n )\n .nullable(),\n});\n\nconst describedInstructionsSchema = z.object({\n type: z.literal('instructions'),\n role: z.string(),\n content: z.string(),\n});\n\nconst describedSkillSchema = z.object({ type: z.literal('skill'), skill: jsonValueSchema });\n\nconst describedToolSchema = z.object({\n type: z.literal('tool'),\n descriptor: jsonValueSchema,\n approval: z.string(),\n});\n\nconst describedConnectionSchema = z.object({\n type: z.literal('connection'),\n binding: jsonValueSchema,\n});\n\nconst describedScheduleSchema = z.object({\n type: z.literal('schedule'),\n cron: z.string().nullable(),\n markdown: z.string().nullable(),\n timezone: z.string().nullable(),\n target: z.string().nullable(),\n});\n\nconst describedHookSchema = z.object({ type: z.literal('hook'), keys: z.array(z.string()) });\n\nconst describedChannelSchema = z.object({\n type: z.literal('channel'),\n routes: z.array(z.object({ method: z.string(), path: z.string() })),\n turnPolicy: z.string().nullable(),\n config: jsonValueSchema,\n disabled: z.boolean().default(false),\n installed: jsonValueSchema.nullable().default(null),\n});\n\nexport const describedEnvironmentSchema = z.object({\n providerName: z.string(),\n providerRef: jsonValueSchema.nullable(),\n options: jsonValueSchema,\n openOptions: jsonValueSchema.nullable(),\n});\n\nconst describedSandboxTargetSchema = z.object({\n exportName: z.string(),\n environment: describedEnvironmentSchema.nullable(),\n dynamic: describedDynamicSchema.nullable(),\n});\n\nconst describedSandboxSchema = z.object({\n type: z.literal('sandbox'),\n targets: z.record(z.string(), describedSandboxTargetSchema),\n // Bundle export name \u2192 provider name, for providers defined in sandbox.ts.\n providers: z.record(z.string(), z.string()),\n selector: z.boolean(),\n defaultTarget: z.string().nullable(),\n});\n\nexport const describedValueSchema = z.discriminatedUnion('type', [\n describedAgentSchema,\n describedDynamicSchema,\n describedInstructionsSchema,\n describedSkillSchema,\n describedToolSchema,\n describedConnectionSchema,\n describedScheduleSchema,\n describedHookSchema,\n describedChannelSchema,\n describedSandboxSchema,\n]);\n\nexport const describedModuleSchema = z.object({\n base: z.string(),\n path: z.string(),\n slot: z.nativeEnum(SlotKind),\n key: z.string(),\n hasDefault: z.boolean(),\n issues: z.array(issueSchema),\n value: describedValueSchema.nullable(),\n});\n\nexport const describedBundleSchema = z.object({\n modules: z.array(describedModuleSchema),\n // Exports the bundle synthesizes beyond the authored ones.\n synthesized: z.array(z.string()),\n});\n\nexport type DescribedIssueIface = z.infer<typeof issueSchema>;\nexport type DescribedDynamicIface = z.infer<typeof describedDynamicSchema>;\nexport type DescribedAgentIface = z.infer<typeof describedAgentSchema>;\nexport type DescribedSandboxIface = z.infer<typeof describedSandboxSchema>;\nexport type DescribedSandboxTargetIface = z.infer<typeof describedSandboxTargetSchema>;\nexport type DescribedEnvironmentIface = z.infer<typeof describedEnvironmentSchema>;\nexport type DescribedValue = z.infer<typeof describedValueSchema>;\nexport type DescribedModuleIface = z.infer<typeof describedModuleSchema>;\nexport type DescribedBundleIface = z.infer<typeof describedBundleSchema>;\n"],
5
- "mappings": "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",
4
+ "sourcesContent": ["import { hostedBindingRequirementSchema, jsonValueSchema } from '@finalai/agent-provider';\nimport * as z from 'zod';\nimport { SlotKind } from \"./layout.mjs\";\nimport { IssueSeverity } from \"./lower.mjs\";\n\n// The static description of a bundle's authored modules, produced inside the\n// evaluation realm and parsed by the compiler. Everything is JSON.\n\nexport const issueSchema = z.object({ severity: z.nativeEnum(IssueSeverity), message: z.string() });\n\nconst providerHintSchema = z.object({\n ref: jsonValueSchema.nullable(),\n name: z.string().nullable(),\n});\n\nexport const describedDynamicSchema = z.object({\n type: z.literal('dynamic'),\n events: z.array(z.string()),\n description: z.string().nullable(),\n preview: z.string().nullable(),\n requiredBindings: z.array(hostedBindingRequirementSchema).optional(),\n provider: providerHintSchema.nullable(),\n});\n\nconst describedAgentSchema = z.object({\n type: z.literal('agent'),\n name: z.string().nullable(),\n description: z.string().nullable(),\n avatarUrl: z.string().nullable(),\n harness: z.object({ harness: jsonValueSchema, config: jsonValueSchema }).nullable(),\n tools: z.record(z.string(), z.string()).nullable(),\n // Capabilities bound to `harnessHost` (the harness's own host, no target).\n hostTools: z.array(z.string()).nullable().default(null),\n toolPolicy: z.record(z.string(), z.string()).nullable(),\n secrets: z.array(z.string()).nullable(),\n channels: z\n .array(\n z.object({ key: z.string().nullable(), channel: jsonValueSchema, config: jsonValueSchema }),\n )\n .nullable(),\n});\n\nconst describedInstructionsSchema = z.object({\n type: z.literal('instructions'),\n role: z.string(),\n content: z.string(),\n});\n\nconst describedSkillSchema = z.object({ type: z.literal('skill'), skill: jsonValueSchema });\n\nconst describedToolSchema = z.object({\n type: z.literal('tool'),\n descriptor: jsonValueSchema,\n approval: z.string(),\n});\n\nconst describedConnectionSchema = z.object({\n type: z.literal('connection'),\n binding: jsonValueSchema,\n});\n\nconst describedScheduleSchema = z.object({\n type: z.literal('schedule'),\n cron: z.string().nullable(),\n markdown: z.string().nullable(),\n timezone: z.string().nullable(),\n target: z.string().nullable(),\n});\n\nconst describedHookSchema = z.object({ type: z.literal('hook'), keys: z.array(z.string()) });\n\nconst describedChannelSchema = z.object({\n type: z.literal('channel'),\n routes: z.array(z.object({ method: z.string(), path: z.string() })),\n turnPolicy: z.string().nullable(),\n config: jsonValueSchema,\n disabled: z.boolean().default(false),\n installed: jsonValueSchema.nullable().default(null),\n});\n\nexport const describedEnvironmentSchema = z.object({\n providerName: z.string(),\n providerRef: jsonValueSchema.nullable(),\n options: jsonValueSchema,\n openOptions: jsonValueSchema.nullable(),\n});\n\nconst describedSandboxTargetSchema = z.object({\n exportName: z.string(),\n environment: describedEnvironmentSchema.nullable(),\n dynamic: describedDynamicSchema.nullable(),\n});\n\nconst describedSandboxSchema = z.object({\n type: z.literal('sandbox'),\n targets: z.record(z.string(), describedSandboxTargetSchema),\n // Bundle export name \u2192 provider name, for providers defined in sandbox.ts.\n providers: z.record(z.string(), z.string()),\n selector: z.boolean(),\n defaultTarget: z.string().nullable(),\n});\n\nexport const describedValueSchema = z.discriminatedUnion('type', [\n describedAgentSchema,\n describedDynamicSchema,\n describedInstructionsSchema,\n describedSkillSchema,\n describedToolSchema,\n describedConnectionSchema,\n describedScheduleSchema,\n describedHookSchema,\n describedChannelSchema,\n describedSandboxSchema,\n]);\n\nexport const describedModuleSchema = z.object({\n base: z.string(),\n path: z.string(),\n slot: z.nativeEnum(SlotKind),\n key: z.string(),\n hasDefault: z.boolean(),\n issues: z.array(issueSchema),\n value: describedValueSchema.nullable(),\n});\n\nexport const describedBundleSchema = z.object({\n modules: z.array(describedModuleSchema),\n // Exports the bundle synthesizes beyond the authored ones.\n synthesized: z.array(z.string()),\n});\n\nexport type DescribedIssueIface = z.infer<typeof issueSchema>;\nexport type DescribedDynamicIface = z.infer<typeof describedDynamicSchema>;\nexport type DescribedAgentIface = z.infer<typeof describedAgentSchema>;\nexport type DescribedSandboxIface = z.infer<typeof describedSandboxSchema>;\nexport type DescribedSandboxTargetIface = z.infer<typeof describedSandboxTargetSchema>;\nexport type DescribedEnvironmentIface = z.infer<typeof describedEnvironmentSchema>;\nexport type DescribedValue = z.infer<typeof describedValueSchema>;\nexport type DescribedModuleIface = z.infer<typeof describedModuleSchema>;\nexport type DescribedBundleIface = z.infer<typeof describedBundleSchema>;\n"],
5
+ "mappings": "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",
6
6
  "names": []
7
7
  }
@@ -1,3 +1,4 @@
1
+ import type { HostedBindingsIface } from '@finalai/agent-provider';
1
2
  import { DynamicEvent, ToolApproval, type ChannelReceiveResult, type ChannelSocketIface, type InputApprovalIface, type JsonObject, type JsonValue } from '@finalai/agent-provider';
2
3
  import { type DynamicResolveContextIface, type ToolContextIface } from "../authoring/context.mjs";
3
4
  import type { DynamicBoundaryEventIface } from "../authoring/dynamic.mjs";
@@ -45,6 +46,7 @@ export interface ChannelSocketArgsIface extends ChannelRouteArgsIface {
45
46
  export interface IsolateRuntimeIface {
46
47
  evaluateApproval(args: {
47
48
  reference: InputApprovalIface;
49
+ bindings?: HostedBindingsIface;
48
50
  input: AuthoredValue;
49
51
  secrets: {
50
52
  get(name: string): Promise<string | null>;
@@ -289,18 +289,20 @@ const createIsolateRuntime = (modules) => {
289
289
  session: boundary.session,
290
290
  messages: boundary.messages,
291
291
  channel: boundary.channel,
292
- secrets: args.secrets
292
+ secrets: args.secrets,
293
+ bindings: args.bindings
293
294
  });
294
295
  const expected = args.kind === InputApprovalKind.Tool ? AuthoredKind.Tool : AuthoredKind.Connection;
295
296
  return authoredKindOf(result) === expected ? result : fieldOf(result, boundary.name);
296
297
  };
297
298
  return {
298
- evaluateApproval: async ({ reference, input, secrets }) => {
299
+ evaluateApproval: async ({ reference, input, secrets, bindings }) => {
299
300
  const value = await resolveAuthored({
300
301
  exportName: reference.export,
301
302
  dynamic: reference.dynamic,
302
303
  kind: reference.kind,
303
- secrets
304
+ secrets,
305
+ bindings
304
306
  });
305
307
  let policy;
306
308
  let validated = input;
@@ -328,7 +330,8 @@ const createIsolateRuntime = (modules) => {
328
330
  exportName: args.export,
329
331
  dynamic: args.dynamic,
330
332
  kind: InputApprovalKind.Tool,
331
- secrets: args.ctx.secrets
333
+ secrets: args.ctx.secrets,
334
+ bindings: args.ctx.bindings
332
335
  });
333
336
  if (args.dynamic != null)
334
337
  registerToolName(value, dynamicToolBoundarySchema.parse(args.dynamic).name);