@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.
- package/HOSTING.md +165 -0
- package/README.md +7 -0
- package/dist/compiler-assets/{chunk-TATN3PYK.ts → chunk-2ZRYQO4Q.ts} +4 -4
- package/dist/compiler-assets/{chunk-HGW4YHAY.ts → chunk-3K4C4SVG.ts} +9 -0
- package/dist/compiler-assets/{chunk-JPY4L2UJ.ts → chunk-3YAKMWV4.ts} +7 -7
- package/dist/compiler-assets/{chunk-CWWRTRWW.ts → chunk-4E5HECVD.ts} +1 -1
- package/dist/compiler-assets/{chunk-7QP2CKPI.ts → chunk-4X2DS5BR.ts} +1 -1
- package/dist/compiler-assets/{chunk-ZDLVA6XF.ts → chunk-5IZTHCGZ.ts} +8 -8
- package/dist/compiler-assets/{chunk-2CZRHOLL.ts → chunk-7XUPKRZU.ts} +1 -1
- package/dist/compiler-assets/{chunk-7VSSVZM4.ts → chunk-BEFBCBUL.ts} +4 -4
- package/dist/compiler-assets/{chunk-HFS4KLEL.ts → chunk-D3SB4CCB.ts} +1 -1
- package/dist/compiler-assets/{chunk-EVQIK62B.ts → chunk-FHKYXT3F.ts} +11 -7
- package/dist/compiler-assets/{chunk-HNPUTP35.ts → chunk-GCFSHHH2.ts} +2 -2
- package/dist/compiler-assets/{chunk-MZMSKIKU.ts → chunk-I6U47R5U.ts} +14 -5
- package/dist/compiler-assets/{chunk-5BK6FVRE.ts → chunk-IF6MR7JF.ts} +2 -2
- package/dist/compiler-assets/{chunk-LUSAAV4L.ts → chunk-IZGOMT7K.ts} +2 -2
- package/dist/compiler-assets/{chunk-GTUZOATD.ts → chunk-JGQ2KAN7.ts} +1 -1
- package/dist/compiler-assets/chunk-JXJPBM5W.ts +61 -0
- package/dist/compiler-assets/{chunk-NYTOYKKF.ts → chunk-K6D7ZK74.ts} +3 -3
- package/dist/compiler-assets/{chunk-WMXMVFHM.ts → chunk-K7V4IMOB.ts} +3 -3
- package/dist/compiler-assets/{chunk-VHXHUU7L.ts → chunk-LHMUAIYJ.ts} +1 -1
- package/dist/compiler-assets/{chunk-SKTNMUO7.ts → chunk-MSE7X5YG.ts} +25 -2
- package/dist/compiler-assets/{chunk-OWC6SFFF.ts → chunk-OO67EO5E.ts} +10 -9
- package/dist/compiler-assets/chunk-PFLSBTJA.ts +39 -0
- package/dist/compiler-assets/{chunk-XHKPWT3G.ts → chunk-QJ26GEUM.ts} +1 -1
- package/dist/compiler-assets/chunk-RMIQJHSL.ts +0 -0
- package/dist/compiler-assets/{chunk-BLB6JGLO.ts → chunk-TCKYMNPM.ts} +27 -24
- package/dist/compiler-assets/{chunk-QMWTDPNT.ts → chunk-TJZS457N.ts} +3 -3
- package/dist/compiler-assets/{chunk-JIPNTA56.ts → chunk-TM36NO3C.ts} +1 -1
- package/dist/compiler-assets/{chunk-QMKWAFVZ.ts → chunk-TS7XNNHN.ts} +3 -3
- package/dist/compiler-assets/chunk-ULI5WWRR.ts +40 -0
- package/dist/compiler-assets/chunk-W6DOJA4W.ts +3763 -0
- package/dist/compiler-assets/src/authoring/agent.ts +4 -4
- package/dist/compiler-assets/src/authoring/approval.ts +7 -7
- package/dist/compiler-assets/src/authoring/brand.ts +3 -3
- package/dist/compiler-assets/src/authoring/channels.ts +6 -6
- package/dist/compiler-assets/src/authoring/connections.ts +14 -4
- package/dist/compiler-assets/src/authoring/credentials.ts +7 -6
- package/dist/compiler-assets/src/authoring/dynamic.ts +9 -4
- package/dist/compiler-assets/src/authoring/harness.ts +9 -9
- package/dist/compiler-assets/src/authoring/hooks.ts +10 -8
- package/dist/compiler-assets/src/authoring/index.ts +33 -26
- package/dist/compiler-assets/src/authoring/instructions.ts +10 -5
- package/dist/compiler-assets/src/authoring/sandbox.ts +10 -10
- package/dist/compiler-assets/src/authoring/schedules.ts +4 -4
- package/dist/compiler-assets/src/authoring/skills.ts +4 -4
- package/dist/compiler-assets/src/authoring/tools.ts +10 -8
- package/dist/compiler-assets/src/compatibility.ts +11 -11
- package/dist/compiler-assets/src/hosted-bindings.ts +15 -0
- package/dist/compiler-assets/src/index.ts +50 -41
- package/dist/compiler-assets/src/manifest.ts +4 -4
- package/dist/compiler-assets/src/resolve.ts +5 -5
- package/dist/compiler-assets/src/runtime/bundle.ts +22 -20
- package/dist/compiler-assets/src/runtime/describe.ts +14 -12
- package/dist/compiler-assets/src/runtime/described.ts +16 -11
- package/dist/compiler-assets/src/runtime/isolate.ts +18 -16
- package/dist/compiler-assets/src/runtime/lower.ts +13 -11
- package/dist/compiler-assets/src/runtime/schema-validation.ts +4 -4
- package/dist/compiler-assets/src/runtime/values.ts +2 -2
- package/dist/modules/authoring/connections.d.mts +5 -0
- package/dist/modules/authoring/connections.mjs +36 -0
- package/dist/modules/authoring/connections.mjs.map +2 -2
- package/dist/modules/authoring/context.d.mts +3 -1
- package/dist/modules/authoring/context.mjs.map +2 -2
- package/dist/modules/authoring/dynamic.d.mts +3 -1
- package/dist/modules/authoring/dynamic.mjs +19 -1
- package/dist/modules/authoring/dynamic.mjs.map +2 -2
- package/dist/modules/authoring/hooks.d.mts +2 -1
- package/dist/modules/authoring/hooks.mjs.map +2 -2
- package/dist/modules/authoring/index.d.mts +4 -2
- package/dist/modules/authoring/index.mjs +4 -1
- package/dist/modules/authoring/index.mjs.map +2 -2
- package/dist/modules/authoring/sandbox.d.mts +2 -1
- package/dist/modules/authoring/sandbox.mjs.map +2 -2
- package/dist/modules/compiler/assemble.mjs +5 -0
- package/dist/modules/compiler/assemble.mjs.map +2 -2
- package/dist/modules/compiler/index.d.mts +2 -1
- package/dist/modules/compiler/index.mjs +18 -0
- package/dist/modules/compiler/index.mjs.map +2 -2
- package/dist/modules/compiler/local-isolate.d.mts +2 -1
- package/dist/modules/compiler/local-isolate.mjs +6 -1
- package/dist/modules/compiler/local-isolate.mjs.map +2 -2
- package/dist/modules/hosted-bindings.d.mts +10 -0
- package/dist/modules/hosted-bindings.mjs +36 -0
- package/dist/modules/hosted-bindings.mjs.map +7 -0
- package/dist/modules/index.d.mts +2 -0
- package/dist/modules/index.mjs +2 -0
- package/dist/modules/index.mjs.map +2 -2
- package/dist/modules/resolve.mjs +4 -0
- package/dist/modules/resolve.mjs.map +2 -2
- package/dist/modules/runtime/describe.mjs +8 -1
- package/dist/modules/runtime/describe.mjs.map +2 -2
- package/dist/modules/runtime/described.d.mts +36 -0
- package/dist/modules/runtime/described.mjs +2 -1
- package/dist/modules/runtime/described.mjs.map +2 -2
- package/dist/modules/runtime/isolate.d.mts +2 -0
- package/dist/modules/runtime/isolate.mjs +7 -4
- package/dist/modules/runtime/isolate.mjs.map +2 -2
- package/dist/modules/runtime/schema-validation.mjs +19 -2
- package/dist/modules/runtime/schema-validation.mjs.map +2 -2
- package/package.json +4 -3
- package/dist/compiler-assets/chunk-GNR7XBPN.ts +0 -3364
- package/dist/compiler-assets/chunk-JNJE72EH.ts +0 -10
- package/dist/compiler-assets/chunk-T6WG4L4M.ts +0 -19
- /package/dist/compiler-assets/{chunk-6WR3PGNF.ts → chunk-CIWWFQHL.ts} +0 -0
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../../../../../src/authoring/index.ts"],
|
|
4
|
-
"sourcesContent": ["export { defineAgent } from \"./agent.mjs\";\nexport type {\n AgentDefinitionInputIface,\n ChannelBindingValueIface,\n HarnessBindingValueIface,\n} from \"./agent.mjs\";\nexport { always, never, whenInput } from \"./approval.mjs\";\nexport type { ApprovalPolicyIface } from \"./approval.mjs\";\nexport {\n DELETE,\n GET,\n POST,\n PUT,\n WS,\n defineChannel,\n defineProviderChannel,\n disableChannel,\n} from \"./channels.mjs\";\nexport type {\n AuthoredChannelDefinitionIface,\n RouteHandler,\n RouteHandlerArgsIface,\n} from \"./channels.mjs\";\nexport { defineMcpClientConnection } from \"./connections.mjs\";\nexport type {
|
|
5
|
-
"mappings": "AAAA,SAAS,mBAAmB;AAM5B,SAAS,QAAQ,OAAO,iBAAiB;AAEzC;AAAA,EACE;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,OACK;AAMP,SAAS,iCAAiC;
|
|
4
|
+
"sourcesContent": ["export { defineAgent } from \"./agent.mjs\";\nexport type {\n AgentDefinitionInputIface,\n ChannelBindingValueIface,\n HarnessBindingValueIface,\n} from \"./agent.mjs\";\nexport { always, never, whenInput } from \"./approval.mjs\";\nexport type { ApprovalPolicyIface } from \"./approval.mjs\";\nexport {\n DELETE,\n GET,\n POST,\n PUT,\n WS,\n defineChannel,\n defineProviderChannel,\n disableChannel,\n} from \"./channels.mjs\";\nexport type {\n AuthoredChannelDefinitionIface,\n RouteHandler,\n RouteHandlerArgsIface,\n} from \"./channels.mjs\";\nexport { defineHostedConnection, defineMcpClientConnection } from \"./connections.mjs\";\nexport type {\n HostedConnectionDefinitionIface,\n McpClientConnectionDefinitionIface,\n McpConnectionAuthIface,\n} from \"./connections.mjs\";\nexport * from \"./context.mjs\";\nexport { requireHostedBinding } from '@finalai/agent-provider';\nexport type { HostedBindingsIface } from '@finalai/agent-provider';\nexport { CredentialOwner, CredentialPayer, credentials } from \"./credentials.mjs\";\nexport type { CredentialNode, CredentialPolicyIface } from \"./credentials.mjs\";\nexport { defineDynamic } from \"./dynamic.mjs\";\nexport type { DynamicDefinitionIface, DynamicEventsIface, DynamicSentinelIface } from \"./dynamic.mjs\";\nexport { completeHarnessDescription, defineHarness } from \"./harness.mjs\";\nexport type {\n AuthoredHarnessCloseContextIface,\n AuthoredHarnessDescriptionIface,\n AuthoredHarnessEndpointIface,\n AuthoredHarnessHealthIface,\n AuthoredHarnessIface,\n AuthoredHarnessOpenArgsIface,\n AuthoredHarnessRefContextIface,\n AuthoredHarnessResumeArgsIface,\n AuthoredHarnessSessionRefIface,\n DefinedAuthoredHarnessIface,\n} from \"./harness.mjs\";\nexport { HookEvent, defineHook } from \"./hooks.mjs\";\nexport type {\n HookContextIface,\n HookDefinitionIface,\n HookEventFor,\n HookEventIface,\n HookEventKey,\n} from \"./hooks.mjs\";\nexport { defineInstructions } from \"./instructions.mjs\";\nexport type { DefinedInstructionsIface, InstructionsDefinitionIface } from \"./instructions.mjs\";\nexport {\n SandboxWire,\n baseTools,\n defineSandbox,\n defineSandboxProvider,\n harnessHost,\n} from \"./sandbox.mjs\";\nexport type {\n BaseToolsValueIface,\n HarnessHostIface,\n SandboxSelector,\n SandboxSelectorContextIface,\n SandboxTargetValue,\n} from \"./sandbox.mjs\";\nexport { defineSchedule } from \"./schedules.mjs\";\nexport type { ScheduleInputIface } from \"./schedules.mjs\";\nexport { defineSkill } from \"./skills.mjs\";\nexport type { SkillDefinitionIface } from \"./skills.mjs\";\nexport { defineTool, toolResultFrom } from \"./tools.mjs\";\nexport type {\n DefinedToolIface,\n StandardSchemaLikeIface,\n ToolCallEventDataIface,\n ToolDefinitionIface,\n ToolInputSchema,\n} from \"./tools.mjs\";\n"],
|
|
5
|
+
"mappings": "AAAA,SAAS,mBAAmB;AAM5B,SAAS,QAAQ,OAAO,iBAAiB;AAEzC;AAAA,EACE;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,OACK;AAMP,SAAS,wBAAwB,iCAAiC;AAMlE,cAAc;AACd,SAAS,4BAA4B;AAErC,SAAS,iBAAiB,iBAAiB,mBAAmB;AAE9D,SAAS,qBAAqB;AAE9B,SAAS,4BAA4B,qBAAqB;AAa1D,SAAS,WAAW,kBAAkB;AAQtC,SAAS,0BAA0B;AAEnC;AAAA,EACE;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,OACK;AAQP,SAAS,sBAAsB;AAE/B,SAAS,mBAAmB;AAE5B,SAAS,YAAY,sBAAsB;",
|
|
6
6
|
"names": []
|
|
7
7
|
}
|
|
@@ -1,10 +1,11 @@
|
|
|
1
|
-
import type { BaseCapability, NetworkSandboxSessionIface, SandboxEnvironmentIface, SandboxOpenRequestIface } from '@finalai/agent-provider';
|
|
1
|
+
import type { BaseCapability, HostedBindingsIface, NetworkSandboxSessionIface, SandboxEnvironmentIface, SandboxOpenRequestIface } from '@finalai/agent-provider';
|
|
2
2
|
import type { AgentSessionInfoIface, SecretsIface } from "./context.mjs";
|
|
3
3
|
import type { DynamicSentinelIface } from "./dynamic.mjs";
|
|
4
4
|
export { defineSandboxProvider, SandboxWire } from '@finalai/agent-provider';
|
|
5
5
|
export interface SandboxSelectorContextIface {
|
|
6
6
|
readonly session: AgentSessionInfoIface;
|
|
7
7
|
readonly secrets: SecretsIface;
|
|
8
|
+
readonly bindings?: HostedBindingsIface;
|
|
8
9
|
open(request: SandboxOpenRequestIface<unknown, unknown>): Promise<NetworkSandboxSessionIface>;
|
|
9
10
|
}
|
|
10
11
|
export type SandboxSelector = (ctx: SandboxSelectorContextIface) => NetworkSandboxSessionIface | SandboxOpenRequestIface<unknown, unknown> | Promise<NetworkSandboxSessionIface | SandboxOpenRequestIface<unknown, unknown>>;
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../../../../../src/authoring/sandbox.ts"],
|
|
4
|
-
"sourcesContent": ["import type {\n BaseCapability,\n NetworkSandboxSessionIface,\n SandboxEnvironmentIface,\n SandboxOpenRequestIface,\n} from '@finalai/agent-provider';\nimport { AuthoredKind, stamp } from \"./brand.mjs\";\nimport type { AgentSessionInfoIface, SecretsIface } from \"./context.mjs\";\nimport type { DynamicSentinelIface } from \"./dynamic.mjs\";\n\nexport { defineSandboxProvider, SandboxWire } from '@finalai/agent-provider';\n\n// sandbox.ts: named exports are sandbox targets (an\n// environment such as `computerSetupGuide({...})`, or a defineDynamic resolving\n// to one); the default export is the default target, either an environment\n// or a selector that opens it per session.\n\nexport interface SandboxSelectorContextIface {\n readonly session: AgentSessionInfoIface;\n readonly secrets: SecretsIface;\n // Starts (or reattaches to) the requested environment and returns the live\n // session, so a selector can prepare it before the agent uses it.\n open(request: SandboxOpenRequestIface<unknown, unknown>): Promise<NetworkSandboxSessionIface>;\n}\n\nexport type SandboxSelector = (\n ctx: SandboxSelectorContextIface,\n) =>\n | NetworkSandboxSessionIface\n | SandboxOpenRequestIface<unknown, unknown>\n | Promise<NetworkSandboxSessionIface | SandboxOpenRequestIface<unknown, unknown>>;\n\n// The harness's own host as a base-tool binding: the capability is the\n// harness's native one where it runs, with no sandbox target. Only\n// harnesses that provide it natively (host-disableable, host-fixed) can serve it.\nexport interface HarnessHostIface {\n readonly harnessHost: true;\n}\n\nexport const harnessHost: HarnessHostIface = stamp({ harnessHost: true }, AuthoredKind.HarnessHost);\n\nexport type SandboxTargetValue =\n | HarnessHostIface\n | SandboxEnvironmentIface<unknown, unknown>\n | SandboxOpenRequestIface<unknown, unknown>\n | DynamicSentinelIface\n | SandboxSelector\n // A target name, for targets that are not imported (Build forms).\n | string;\n\nexport const defineSandbox = <\n T extends SandboxSelector | SandboxEnvironmentIface<unknown, unknown>,\n>(\n value: T,\n): T => (value instanceof Function ? stamp(value, AuthoredKind.SandboxSelector) : value);\n\nexport type BaseToolsInputIface = Partial<\n Record<BaseCapability | `${BaseCapability}`, SandboxTargetValue>\n>;\n\nexport interface BaseToolsValueIface {\n readonly base: BaseToolsInputIface;\n}\n\n// Declares base tool capabilities, each bound to a sandbox target exported\n// from sandbox.ts or to `harnessHost`. Targets are\n// resolved by identity to their export name at compile time.\nexport const baseTools = (base: BaseToolsInputIface): BaseToolsValueIface =>\n stamp({ base: { ...base } }, AuthoredKind.BaseTools);\n"],
|
|
5
|
-
"mappings": "
|
|
4
|
+
"sourcesContent": ["import type {\n BaseCapability,\n HostedBindingsIface,\n NetworkSandboxSessionIface,\n SandboxEnvironmentIface,\n SandboxOpenRequestIface,\n} from '@finalai/agent-provider';\nimport { AuthoredKind, stamp } from \"./brand.mjs\";\nimport type { AgentSessionInfoIface, SecretsIface } from \"./context.mjs\";\nimport type { DynamicSentinelIface } from \"./dynamic.mjs\";\n\nexport { defineSandboxProvider, SandboxWire } from '@finalai/agent-provider';\n\n// sandbox.ts: named exports are sandbox targets (an\n// environment such as `computerSetupGuide({...})`, or a defineDynamic resolving\n// to one); the default export is the default target, either an environment\n// or a selector that opens it per session.\n\nexport interface SandboxSelectorContextIface {\n readonly session: AgentSessionInfoIface;\n readonly secrets: SecretsIface;\n readonly bindings?: HostedBindingsIface;\n // Starts (or reattaches to) the requested environment and returns the live\n // session, so a selector can prepare it before the agent uses it.\n open(request: SandboxOpenRequestIface<unknown, unknown>): Promise<NetworkSandboxSessionIface>;\n}\n\nexport type SandboxSelector = (\n ctx: SandboxSelectorContextIface,\n) =>\n | NetworkSandboxSessionIface\n | SandboxOpenRequestIface<unknown, unknown>\n | Promise<NetworkSandboxSessionIface | SandboxOpenRequestIface<unknown, unknown>>;\n\n// The harness's own host as a base-tool binding: the capability is the\n// harness's native one where it runs, with no sandbox target. Only\n// harnesses that provide it natively (host-disableable, host-fixed) can serve it.\nexport interface HarnessHostIface {\n readonly harnessHost: true;\n}\n\nexport const harnessHost: HarnessHostIface = stamp({ harnessHost: true }, AuthoredKind.HarnessHost);\n\nexport type SandboxTargetValue =\n | HarnessHostIface\n | SandboxEnvironmentIface<unknown, unknown>\n | SandboxOpenRequestIface<unknown, unknown>\n | DynamicSentinelIface\n | SandboxSelector\n // A target name, for targets that are not imported (Build forms).\n | string;\n\nexport const defineSandbox = <\n T extends SandboxSelector | SandboxEnvironmentIface<unknown, unknown>,\n>(\n value: T,\n): T => (value instanceof Function ? stamp(value, AuthoredKind.SandboxSelector) : value);\n\nexport type BaseToolsInputIface = Partial<\n Record<BaseCapability | `${BaseCapability}`, SandboxTargetValue>\n>;\n\nexport interface BaseToolsValueIface {\n readonly base: BaseToolsInputIface;\n}\n\n// Declares base tool capabilities, each bound to a sandbox target exported\n// from sandbox.ts or to `harnessHost`. Targets are\n// resolved by identity to their export name at compile time.\nexport const baseTools = (base: BaseToolsInputIface): BaseToolsValueIface =>\n stamp({ base: { ...base } }, AuthoredKind.BaseTools);\n"],
|
|
5
|
+
"mappings": "AAOA,SAAS,cAAc,aAAa;AAIpC,SAAS,uBAAuB,mBAAmB;AA8B5C,MAAM,cAAgC,MAAM,EAAE,aAAa,KAAK,GAAG,aAAa,WAAW;AAW3F,MAAM,gBAAgB,CAG3B,UACO,iBAAiB,WAAW,MAAM,OAAO,aAAa,eAAe,IAAI;AAa3E,MAAM,YAAY,CAAC,SACxB,MAAM,EAAE,MAAM,EAAE,GAAG,KAAK,EAAE,GAAG,aAAa,SAAS;",
|
|
6
6
|
"names": []
|
|
7
7
|
}
|
|
@@ -118,6 +118,8 @@ const assemble = (input) => {
|
|
|
118
118
|
const slot = { $dynamic: { resolver, events } };
|
|
119
119
|
if (dynamic.description != null) slot.$dynamic.description = dynamic.description;
|
|
120
120
|
if (dynamic.preview != null) slot.$dynamic.preview = dynamic.preview;
|
|
121
|
+
if ((dynamic.requiredBindings?.length ?? 0) > 0)
|
|
122
|
+
slot.$dynamic.requiredBindings = dynamic.requiredBindings;
|
|
121
123
|
if (dynamic.description == null && dynamic.preview == null) {
|
|
122
124
|
report(
|
|
123
125
|
DiagnosticSeverity.Note,
|
|
@@ -399,6 +401,9 @@ ${text}`;
|
|
|
399
401
|
mcpServers = {
|
|
400
402
|
$dynamic: {
|
|
401
403
|
resolver: COMBINED_MCP_SERVERS_EXPORT,
|
|
404
|
+
requiredBindings: [...ofSlot(SlotKind.Connection), ...ofSlot(SlotKind.Tool)].flatMap(
|
|
405
|
+
(module) => module.value?.type === "dynamic" ? module.value.requiredBindings ?? [] : []
|
|
406
|
+
),
|
|
402
407
|
events: anyTurnStartedServer ? [DynamicEvent.SessionStarted, DynamicEvent.TurnStarted] : [DynamicEvent.SessionStarted],
|
|
403
408
|
description: "Authored tools and connections, including the dynamic ones, resolved when the session starts."
|
|
404
409
|
}
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../../../../../src/compiler/assemble.ts"],
|
|
4
|
-
"sourcesContent": ["import {\n agentManifestSchema,\n BaseCapability,\n bundleRef,\n CredentialNodeKind,\n credentialPolicySchema,\n DynamicEvent,\n findDynamicSlots,\n formatProviderRef,\n httpMcpServerBindingSchema,\n InstructionRole,\n jsonObjectSchema,\n MANIFEST_VERSION,\n McpServerBindingKind,\n packageRef,\n ProviderRefKind,\n providerRefSchema,\n SandboxAccess,\n SandboxAttach,\n ScheduleTarget,\n skillBundleSchema,\n ToolApproval,\n toolDescriptorSchema,\n TurnPolicy,\n type AgentManifestIface,\n type ChannelBindingIface,\n type DynamicSlotIface,\n type HookBindingIface,\n type JsonObject,\n type JsonValue,\n type McpServerBinding,\n type ProviderRef,\n type SandboxBindingIface,\n type ScheduleDefinitionIface,\n type SkillBundleIface,\n type ToolDescriptorIface,\n} from '@finalai/agent-provider';\nimport { Cron } from 'croner';\nimport * as z from 'zod';\nimport { HookEventKeyKind, normalizeHookKey } from \"../authoring/hooks.mjs\";\nimport type {\n DescribedAgentIface,\n DescribedBundleIface,\n DescribedDynamicIface,\n DescribedModuleIface,\n DescribedSandboxIface,\n} from \"../runtime/described.mjs\";\nimport { AUTHORED_SERVER_KEY, COMBINED_MCP_SERVERS_EXPORT, SlotKind } from \"../runtime/layout.mjs\";\nimport { IssueSeverity } from \"../runtime/lower.mjs\";\nimport {\n diagnostic,\n DiagnosticCode,\n DiagnosticSeverity,\n type DiagnosticIface,\n} from \"./diagnostics.mjs\";\nimport { InstructionSourceKind, isModulePath, type DiscoveryIface } from \"./discovery.mjs\";\nimport { preparationFiles } from \"./files.mjs\";\nimport { firstParagraphLine, frontMatterString, parseFrontMatter } from \"./frontmatter.mjs\";\n\nexport interface AssembleInputIface {\n installedSandboxProviders?: Readonly<Record<string, string>>;\n files: Record<string, string>;\n discovery: DiscoveryIface;\n described: DescribedBundleIface | null;\n fallbackName: string;\n bundle: { hash: string; code: string } | null;\n}\n\nexport interface AssembleOutputIface {\n manifest: AgentManifestIface | null;\n // Bundle export \u2192 directory-relative source path, for what the runtime calls.\n modules: Record<string, string>;\n // Target \u2192 bundle export of the sandbox.ts selector that opens it.\n sandboxOpeners: Record<string, string>;\n // Bundle channel export \u2192 its routes, for the public route URLs.\n channelRoutes: Record<string, { method: string; path: string }[]>;\n // Which config fields came from directory files, for the compatibility report.\n directoryFields: { instructions: string[]; skills: string[] };\n diagnostics: DiagnosticIface[];\n}\n\nconst SEVERITY = {\n [IssueSeverity.Error]: DiagnosticSeverity.Error,\n [IssueSeverity.Warning]: DiagnosticSeverity.Warning,\n [IssueSeverity.Note]: DiagnosticSeverity.Note,\n} satisfies Record<IssueSeverity, DiagnosticSeverity>;\n\nconst isObject = (value: JsonValue | undefined): value is JsonObject =>\n jsonObjectSchema.safeParse(value).success;\n\nconst DYNAMIC_EVENTS: ReadonlySet<string> = new Set(Object.values(DynamicEvent));\n\nconst toDynamicEvents = (events: string[]): DynamicEvent[] =>\n Object.values(DynamicEvent).filter((event) => events.includes(event));\n\nconst capabilityOf = (name: string): BaseCapability | null =>\n Object.values(BaseCapability).find((capability) => capability === name) ?? null;\n\nconst apiKeySecretSchema = z.looseObject({\n kind: z.literal(CredentialNodeKind.ApiKey),\n secret: z.string().min(1),\n});\n\n// A secret reference in harness config (`hop: { secretKey }` and every other\n// `final://schemas` secret ref).\nconst secretRefSchema = z.looseObject({ secretKey: z.string().min(1) });\n\n// Secret names a definition references outside authored code: API key\n// credential nodes and secret refs anywhere in the harness config (walked as JSON).\nconst configSecrets = (value: JsonValue): string[] => {\n if (Array.isArray(value)) return value.flatMap(configSecrets);\n if (!isObject(value)) return [];\n const node = apiKeySecretSchema.safeParse(value);\n const ref = secretRefSchema.safeParse(value);\n return [\n ...(node.success ? [node.data.secret] : []),\n ...(ref.success ? [ref.data.secretKey] : []),\n ...Object.values(value).flatMap(configSecrets),\n ];\n};\n\n// The manifest's secret allowlist: declared names plus every secret the\n// definition references by name. Sandbox `variables` are organization\n// variables, not secrets, and stay out.\nconst collectSecrets = (args: {\n declared: string[];\n config: JsonValue;\n mcpServers: AgentManifestIface['mcpServers'];\n reads: string[];\n}): string[] => {\n const names = new Set([...args.declared, ...args.reads]);\n for (const name of configSecrets(args.config)) names.add(name);\n if (Array.isArray(args.mcpServers)) {\n for (const binding of args.mcpServers) {\n if (\n binding.kind === McpServerBindingKind.Http &&\n binding.auth != null &&\n 'secretKey' in binding.auth\n ) {\n names.add(binding.auth.secretKey);\n }\n }\n }\n return [...names].sort();\n};\n\nconst SECRET_READ = /secrets\\s*\\.\\s*get\\(\\s*(?:(['\"`])([^'\"`$\\\\]+)\\1\\s*\\)|(?!\\s*\\)))/g;\n\n// `secrets.get(...)` calls in authored source files, helpers included: a\n// string literal names the secret; any other argument is a computed read the\n// compiler cannot see.\nconst secretReferences = (files: Record<string, string>): { path: string; name: string | null }[] =>\n Object.entries(files)\n .filter(([path]) => isModulePath(path) || /\\.[jt]sx$/.test(path))\n .flatMap(([path, source]) =>\n [...source.matchAll(SECRET_READ)].map((match) => ({ path, name: match[2] ?? null })),\n );\n\nexport const assemble = (input: AssembleInputIface): AssembleOutputIface => {\n const diagnostics: DiagnosticIface[] = [];\n const report = (\n severity: DiagnosticSeverity,\n code: DiagnosticCode,\n message: string,\n path: string | null = null,\n ): void => {\n diagnostics.push(diagnostic({ severity, code, message, path }));\n };\n const modules: Record<string, string> = {};\n const runtimeExport = (name: string, path: string): void => {\n modules[name] = path;\n };\n const described = input.described?.modules ?? [];\n for (const module of described) {\n for (const issue of module.issues)\n report(SEVERITY[issue.severity], DiagnosticCode.Module, issue.message, module.path);\n }\n const ofSlot = (slot: SlotKind): DescribedModuleIface[] =>\n described.filter((module) => module.slot === slot);\n const withDefault = (slot: SlotKind): DescribedModuleIface[] =>\n ofSlot(slot).filter((module) => module.hasDefault && module.value != null);\n\n const dynamicSlotFor = (\n dynamic: DescribedDynamicIface,\n resolver: string,\n path: string,\n slotName: string,\n ): DynamicSlotIface | null => {\n for (const event of dynamic.events) {\n if (!DYNAMIC_EVENTS.has(event)) {\n report(\n DiagnosticSeverity.Error,\n DiagnosticCode.Module,\n `${slotName} resolves on ${event}; dynamic slots support session.started and turn.started (the harness owns steps)`,\n path,\n );\n }\n }\n const events = toDynamicEvents(dynamic.events);\n if (events.length === 0) {\n report(\n DiagnosticSeverity.Error,\n DiagnosticCode.Module,\n `${slotName} defineDynamic has no session.started or turn.started handler`,\n path,\n );\n return null;\n }\n runtimeExport(resolver, path);\n const slot: DynamicSlotIface = { $dynamic: { resolver, events } };\n if (dynamic.description != null) slot.$dynamic.description = dynamic.description;\n if (dynamic.preview != null) slot.$dynamic.preview = dynamic.preview;\n // Build shows \"resolved at <export> on <event>\" without them.\n if (dynamic.description == null && dynamic.preview == null) {\n report(\n DiagnosticSeverity.Note,\n DiagnosticCode.Module,\n `${slotName} is resolved per session; give defineDynamic a description (and a preview) so Build can show what it resolves to`,\n path,\n );\n }\n return slot;\n };\n\n // agent.ts\n const agentModule = ofSlot(SlotKind.Agent)[0] ?? null;\n let agent: DescribedAgentIface | null = null;\n if (agentModule != null) {\n if (!agentModule.hasDefault) {\n report(\n DiagnosticSeverity.Error,\n DiagnosticCode.Module,\n 'agent.ts must export defineAgent({ ... }) as its default export',\n agentModule.path,\n );\n } else if (agentModule.value?.type === 'agent') agent = agentModule.value;\n }\n const agentPath = agentModule?.path ?? 'agent.ts';\n for (const name of input.described?.synthesized ?? []) {\n if (name !== COMBINED_MCP_SERVERS_EXPORT) runtimeExport(name, agentPath);\n }\n\n // Harness binding. Model, reasoning, credentials and permission mode are\n // harness config, never top-level agent fields.\n let harnessRef: ProviderRef | null = null;\n let config: JsonValue = {};\n if (agent?.harness == null) {\n // A missing or invalid default export is reported above.\n if (agentModule == null || agent != null) {\n report(\n DiagnosticSeverity.Error,\n DiagnosticCode.Harness,\n 'agent.ts must name a harness, e.g. defineAgent({ harness: serverlessPi({ model }) })',\n agentPath,\n );\n }\n } else {\n const parsed = providerRefSchema.safeParse(agent.harness.harness);\n if (parsed.success) harnessRef = parsed.data;\n else\n report(\n DiagnosticSeverity.Error,\n DiagnosticCode.Harness,\n 'agent.ts harness has an invalid provider reference',\n agentPath,\n );\n config = agent.harness.config;\n }\n if (harnessRef?.kind === 'bundle') runtimeExport(harnessRef.export, agentPath);\n const credentialPolicies = Object.values(jsonObjectSchema.safeParse(config).data ?? {}).filter(\n (value) => credentialPolicySchema.safeParse(value).success,\n );\n if (harnessRef != null && credentialPolicies.length !== 1) {\n report(\n DiagnosticSeverity.Error,\n DiagnosticCode.Harness,\n 'Declare exactly one credential policy in the harness config; billing policy belongs to this definition.',\n agentPath,\n );\n }\n\n const configObject = isObject(config) ? config : null;\n if (configObject == null && !findDynamicSlots(config).some((slot) => slot.path === '')) {\n report(\n DiagnosticSeverity.Error,\n DiagnosticCode.Harness,\n 'harness config must be an object',\n agentPath,\n );\n }\n\n // Instructions.\n const instructionFragments: JsonValue[] = [];\n const instructionSources: string[] = [];\n const instructionModules = new Map(\n ofSlot(SlotKind.Instructions).map((module) => [module.path, module]),\n );\n for (const source of input.discovery.instructions) {\n if (source.kind === InstructionSourceKind.Markdown) {\n const content = input.files[source.path] ?? '';\n if (content.trim().length === 0) {\n report(\n DiagnosticSeverity.Warning,\n DiagnosticCode.Instructions,\n `${source.path} is empty and was skipped`,\n source.path,\n );\n continue;\n }\n instructionFragments.push({ role: InstructionRole.System, content, source: source.path });\n instructionSources.push(source.path);\n continue;\n }\n const module = instructionModules.get(source.path);\n if (module == null || module.value == null) continue;\n if (module.value.type === 'instructions') {\n instructionFragments.push({\n role: module.value.role,\n content: module.value.content,\n source: source.path,\n });\n instructionSources.push(source.path);\n } else if (module.value.type === 'dynamic') {\n const slot = dynamicSlotFor(module.value, module.base, source.path, source.path);\n if (slot != null) {\n instructionFragments.push(slot);\n instructionSources.push(source.path);\n }\n }\n }\n\n // Skills.\n const skills: JsonValue[] = [];\n const skillSources: string[] = [];\n const skillKeys = new Set<string>();\n const addSkill = (key: string, skill: JsonValue, path: string): void => {\n if (skillKeys.has(key)) {\n report(\n DiagnosticSeverity.Error,\n DiagnosticCode.Skills,\n `skill ${key} is defined more than once`,\n path,\n );\n return;\n }\n skillKeys.add(key);\n skills.push(skill);\n skillSources.push(path);\n };\n for (const directory of input.discovery.skillDirectories) {\n const skillPath = `${directory.directory}/SKILL.md`;\n const text = input.files[skillPath] ?? '';\n const front = parseFrontMatter(text);\n if (front.error != null)\n report(DiagnosticSeverity.Warning, DiagnosticCode.Skills, front.error, skillPath);\n const description =\n frontMatterString(front.data, 'description') ?? firstParagraphLine(front.body);\n const files = [\n { path: 'SKILL.md', content: text },\n ...directory.files\n .filter((file) => file !== skillPath)\n .map((file) => ({\n path: file.slice(directory.directory.length + 1),\n content: input.files[file] ?? '',\n })),\n ];\n const skill: SkillBundleIface = { key: directory.key, files };\n if (description != null) skill.description = description;\n addSkill(directory.key, skill, skillPath);\n }\n for (const flat of input.discovery.skillMarkdown) {\n const text = input.files[flat.path] ?? '';\n const front = parseFrontMatter(text);\n const description =\n frontMatterString(front.data, 'description') ??\n firstParagraphLine(front.body) ??\n `Instructions for the ${flat.key} skill.`;\n const content = text.startsWith('---\\n')\n ? text\n : `---\\nname: ${JSON.stringify(flat.key)}\\ndescription: ${JSON.stringify(description)}\\n---\\n\\n${text}`;\n addSkill(\n flat.key,\n { key: flat.key, description, files: [{ path: 'SKILL.md', content }] },\n flat.path,\n );\n }\n for (const module of withDefault(SlotKind.Skill)) {\n if (module.value?.type === 'skill') {\n const parsed = skillBundleSchema.safeParse(module.value.skill);\n if (parsed.success) addSkill(module.key, parsed.data, module.path);\n } else if (module.value?.type === 'dynamic') {\n const slot = dynamicSlotFor(module.value, module.base, module.path, module.path);\n if (slot != null) addSkill(module.key, slot, module.path);\n }\n }\n\n const directoryFields = { instructions: instructionSources, skills: skillSources };\n if (configObject != null) {\n if (instructionFragments.length > 0) {\n if (configObject['instructions'] != null) {\n report(\n DiagnosticSeverity.Error,\n DiagnosticCode.Conflict,\n 'harness config sets instructions and the directory has instruction files; keep one source',\n agentPath,\n );\n } else configObject['instructions'] = instructionFragments;\n }\n if (skills.length > 0) {\n if (configObject['skills'] != null) {\n report(\n DiagnosticSeverity.Error,\n DiagnosticCode.Conflict,\n 'harness config sets skills and the directory has skills/; keep one source',\n agentPath,\n );\n } else configObject['skills'] = skills;\n }\n } else if (instructionFragments.length > 0 || skills.length > 0) {\n report(\n DiagnosticSeverity.Error,\n DiagnosticCode.Conflict,\n 'harness config is dynamic, so directory instructions and skills cannot be added to it',\n agentPath,\n );\n }\n\n // MCP servers: authored tools and connections.\n const toolPolicy: Record<string, ToolApproval> = {};\n const toolDescriptors: ToolDescriptorIface[] = [];\n const toolApprovals: Record<string, ToolApproval> = {};\n let anyDynamicServer = false;\n let anyTurnStartedServer = false;\n for (const module of ofSlot(SlotKind.Tool)) {\n if (!module.hasDefault || module.value == null) continue;\n if (module.value.type === 'dynamic') {\n anyDynamicServer = true;\n anyTurnStartedServer ||= module.value.events.includes(DynamicEvent.TurnStarted);\n runtimeExport(module.base, module.path);\n continue;\n }\n if (module.value.type !== 'tool') continue;\n const parsed = toolDescriptorSchema.safeParse(module.value.descriptor);\n if (!parsed.success) {\n report(\n DiagnosticSeverity.Error,\n DiagnosticCode.Module,\n `tool ${module.key} has an invalid descriptor`,\n module.path,\n );\n continue;\n }\n toolDescriptors.push(parsed.data);\n const approval =\n module.value.approval === ToolApproval.Ask ? ToolApproval.Ask : ToolApproval.Allow;\n toolApprovals[module.key] = approval;\n if (approval === ToolApproval.Ask && parsed.data.inputApproval == null)\n toolPolicy[`${AUTHORED_SERVER_KEY}/${module.key}`] = ToolApproval.Ask;\n runtimeExport(module.base, module.path);\n }\n const connections: McpServerBinding[] = [];\n const connectionKeys = new Set<string>();\n for (const module of ofSlot(SlotKind.Connection)) {\n if (!module.hasDefault || module.value == null) continue;\n if (module.key === AUTHORED_SERVER_KEY) {\n report(\n DiagnosticSeverity.Error,\n DiagnosticCode.Connections,\n `connection name ${AUTHORED_SERVER_KEY} is reserved for authored tools`,\n module.path,\n );\n continue;\n }\n if (connectionKeys.has(module.key)) {\n report(\n DiagnosticSeverity.Error,\n DiagnosticCode.Connections,\n `connection ${module.key} is defined more than once`,\n module.path,\n );\n continue;\n }\n connectionKeys.add(module.key);\n if (module.value.type === 'dynamic') {\n anyDynamicServer = true;\n anyTurnStartedServer ||= module.value.events.includes(DynamicEvent.TurnStarted);\n runtimeExport(module.base, module.path);\n continue;\n }\n if (module.value.type !== 'connection') continue;\n const parsed = httpMcpServerBindingSchema.safeParse(module.value.binding);\n if (!parsed.success) {\n report(\n DiagnosticSeverity.Error,\n DiagnosticCode.Connections,\n `connection ${module.key} is invalid: ${parsed.error.issues[0]?.message ?? 'invalid'}`,\n module.path,\n );\n continue;\n }\n connections.push(parsed.data);\n if (parsed.data.inputApprovals != null) runtimeExport(module.base, module.path);\n for (const [tool, approval] of Object.entries(parsed.data.approvals ?? {})) {\n if (approval === ToolApproval.Ask && !Object.hasOwn(parsed.data.inputApprovals ?? {}, tool))\n toolPolicy[`${module.key}/${tool}`] = ToolApproval.Ask;\n }\n }\n let mcpServers: AgentManifestIface['mcpServers'];\n if (anyDynamicServer) {\n mcpServers = {\n $dynamic: {\n resolver: COMBINED_MCP_SERVERS_EXPORT,\n events: anyTurnStartedServer\n ? [DynamicEvent.SessionStarted, DynamicEvent.TurnStarted]\n : [DynamicEvent.SessionStarted],\n description:\n 'Authored tools and connections, including the dynamic ones, resolved when the session starts.',\n },\n };\n runtimeExport(COMBINED_MCP_SERVERS_EXPORT, '<synthesized>');\n } else {\n mcpServers = [\n ...(toolDescriptors.length === 0\n ? []\n : [\n {\n key: AUTHORED_SERVER_KEY,\n kind: McpServerBindingKind.Worker,\n tools: toolDescriptors,\n approvals: toolApprovals,\n } satisfies McpServerBinding,\n ]),\n ...connections,\n ];\n }\n for (const [key, policy] of Object.entries(agent?.toolPolicy ?? {})) {\n toolPolicy[key] = policy === 'ask' ? ToolApproval.Ask : ToolApproval.Allow;\n }\n\n // Sandboxes.\n const sandboxModule = ofSlot(SlotKind.Sandbox)[0];\n const sandbox: DescribedSandboxIface | null =\n sandboxModule?.value?.type === 'sandbox' ? sandboxModule.value : null;\n const sandboxPath = sandboxModule?.path ?? 'sandbox.ts';\n const sandboxes: Record<string, SandboxBindingIface> = {};\n const sandboxOpeners: Record<string, string> = {};\n const providerExportByName = new Map(\n Object.entries(sandbox?.providers ?? {}).map(([exportName, name]) => [name, exportName]),\n );\n const duplicateNames = new Set<string>();\n for (const name of Object.values(sandbox?.providers ?? {})) {\n if (duplicateNames.has(name))\n report(\n DiagnosticSeverity.Error,\n DiagnosticCode.Sandbox,\n `sandbox.ts exports multiple providers named ${name}; give each provider a distinct name`,\n sandboxPath,\n );\n duplicateNames.add(name);\n }\n const providerFor = (args: {\n ref: JsonValue | null;\n name: string | null;\n target: string;\n }): ProviderRef | null => {\n if (args.ref != null) {\n const parsed = providerRefSchema.safeParse(args.ref);\n if (parsed.success) return parsed.data;\n }\n if (args.name != null) {\n const exportName = providerExportByName.get(args.name);\n if (exportName != null) {\n runtimeExport(exportName, sandboxPath);\n return bundleRef(exportName);\n }\n report(\n DiagnosticSeverity.Error,\n DiagnosticCode.Sandbox,\n `sandbox target ${args.target} uses provider ${args.name}, which is neither installed nor exported from sandbox.ts`,\n sandboxPath,\n );\n return null;\n }\n report(\n DiagnosticSeverity.Error,\n DiagnosticCode.Sandbox,\n `sandbox target ${args.target} is dynamic and its provider cannot be inferred; give defineDynamic a provider ({ provider: computer, events })`,\n sandboxPath,\n );\n return null;\n };\n // A dynamic target without a provider hint: the\n // provider its resolver returns an environment of is unknown until a session\n // starts, so an installed provider is inferred here (the target's name, or\n // the one installed provider sandbox.ts uses) and checked by reference when\n // the slot resolves. Providers defined in sandbox.ts still need the hint:\n // their environments carry only a name, which cannot be checked.\n const inferredProvider = (target: string): { ref: JsonValue; name: string } | null => {\n if (providerExportByName.size > 0) return null;\n const specifier = Object.hasOwn(input.installedSandboxProviders ?? {}, target)\n ? input.installedSandboxProviders?.[target]\n : undefined;\n if (specifier != null) return { ref: packageRef(specifier), name: target };\n const installed = new Map<string, { ref: JsonValue; name: string }>();\n for (const described of Object.values(sandbox?.targets ?? {})) {\n const environment = described.environment;\n const parsed = providerRefSchema.safeParse(environment?.providerRef);\n if (environment?.providerName == null || !parsed.success) continue;\n if (parsed.data.kind !== ProviderRefKind.Package) continue;\n installed.set(formatProviderRef(parsed.data), {\n ref: environment.providerRef,\n name: environment.providerName,\n });\n }\n return installed.size === 1 ? ([...installed.values()][0] ?? null) : null;\n };\n for (const [target, described] of Object.entries(sandbox?.targets ?? {})) {\n if (described.environment != null) {\n const environment = described.environment;\n const provider = providerFor({\n ref: environment.providerRef,\n name: environment.providerName,\n target,\n });\n if (provider == null) continue;\n const open: JsonValue | undefined = environment.openOptions ?? undefined;\n if (\n open != null &&\n (!isObject(open) || Object.keys(open).some((key) => key !== 'access' && key !== 'attach'))\n ) {\n report(\n DiagnosticSeverity.Error,\n DiagnosticCode.Sandbox,\n `sandbox target ${target} open options support only access and attach`,\n sandboxPath,\n );\n continue;\n }\n const access = isObject(open) ? open['access'] : undefined;\n const attach = isObject(open) ? open['attach'] : undefined;\n if (\n access != null &&\n access !== SandboxAccess.Read &&\n access !== SandboxAccess.Execute &&\n access !== SandboxAccess.Write\n ) {\n report(\n DiagnosticSeverity.Error,\n DiagnosticCode.Sandbox,\n `sandbox target ${target} has invalid access ${String(access)}`,\n sandboxPath,\n );\n continue;\n }\n if (attach != null && attach !== SandboxAttach.OnPrompt && attach !== SandboxAttach.Lazy) {\n report(\n DiagnosticSeverity.Error,\n DiagnosticCode.Sandbox,\n `sandbox target ${target} has invalid attach ${String(attach)}`,\n sandboxPath,\n );\n continue;\n }\n sandboxes[target] = {\n provider,\n environment: environment.options,\n access:\n access === SandboxAccess.Read || access === SandboxAccess.Execute\n ? access\n : SandboxAccess.Write,\n attach: attach === SandboxAttach.OnPrompt ? SandboxAttach.OnPrompt : SandboxAttach.Lazy,\n };\n } else if (described.dynamic != null) {\n const hinted = described.dynamic.provider;\n const inferred = hinted == null ? inferredProvider(target) : null;\n if (inferred != null) {\n report(\n DiagnosticSeverity.Note,\n DiagnosticCode.Sandbox,\n `sandbox target ${target} is dynamic; its provider is ${inferred.name}, and its resolver must return a ${inferred.name} environment`,\n sandboxPath,\n );\n }\n const provider = providerFor({\n ref: hinted?.ref ?? inferred?.ref ?? null,\n name: hinted?.name ?? inferred?.name ?? null,\n target,\n });\n const slot = dynamicSlotFor(\n described.dynamic,\n described.exportName,\n sandboxPath,\n `sandbox target ${target}`,\n );\n if (provider == null || slot == null) continue;\n sandboxes[target] = {\n provider,\n environment: slot,\n access: SandboxAccess.Write,\n attach: SandboxAttach.Lazy,\n };\n }\n }\n if (\n sandbox?.selector === true &&\n sandbox.defaultTarget != null &&\n sandboxes[sandbox.defaultTarget] != null\n ) {\n sandboxOpeners[sandbox.defaultTarget] = 'sandbox';\n runtimeExport('sandbox', sandboxPath);\n report(\n DiagnosticSeverity.Note,\n DiagnosticCode.Sandbox,\n `sandbox.ts default export opens target ${sandbox.defaultTarget} for each session`,\n sandboxPath,\n );\n }\n\n // Base tools.\n const base: AgentManifestIface['tools']['base'] = {};\n if (agent?.tools != null) {\n for (const [name, target] of Object.entries(agent.tools)) {\n const capability = capabilityOf(name);\n if (capability == null) {\n report(\n DiagnosticSeverity.Error,\n DiagnosticCode.BaseTools,\n `baseTools has unknown capability ${name}`,\n agentPath,\n );\n continue;\n }\n if (sandboxes[target] == null) {\n report(\n DiagnosticSeverity.Error,\n DiagnosticCode.BaseTools,\n `baseTools ${name} is bound to ${target}, which is not a sandbox target`,\n agentPath,\n );\n continue;\n }\n base[capability] = { target };\n }\n }\n // Capabilities declared on the harness's own host (`harnessHost`).\n const host: BaseCapability[] = [];\n for (const name of agent?.hostTools ?? []) {\n const capability = capabilityOf(name);\n if (capability == null) {\n report(\n DiagnosticSeverity.Error,\n DiagnosticCode.BaseTools,\n `baseTools has unknown capability ${name}`,\n agentPath,\n );\n continue;\n }\n if (base[capability] != null) {\n report(\n DiagnosticSeverity.Error,\n DiagnosticCode.BaseTools,\n `baseTools ${name} is bound both to a sandbox target and to harnessHost`,\n agentPath,\n );\n continue;\n }\n host.push(capability);\n }\n\n // Channels.\n const channels: ChannelBindingIface[] = [];\n const channelKeys = new Set<string>();\n const channelRoutes: AssembleOutputIface['channelRoutes'] = {};\n const addChannel = (binding: ChannelBindingIface, path: string): void => {\n if (channelKeys.has(binding.key)) {\n report(\n DiagnosticSeverity.Error,\n DiagnosticCode.Channel,\n `channel ${binding.key} is bound more than once`,\n path,\n );\n return;\n }\n channelKeys.add(binding.key);\n channels.push(binding);\n };\n for (const module of withDefault(SlotKind.Channel)) {\n if (module.value?.type !== 'channel') continue;\n const { value } = module;\n if (value.disabled) continue;\n if (\n value.turnPolicy != null &&\n value.turnPolicy !== TurnPolicy.Steer &&\n value.turnPolicy !== TurnPolicy.Queue\n ) {\n report(\n DiagnosticSeverity.Error,\n DiagnosticCode.Channel,\n `channel ${module.key} turnPolicy must be steer or queue`,\n module.path,\n );\n }\n for (const route of value.routes) {\n if (!route.path.startsWith('/')) {\n report(\n DiagnosticSeverity.Error,\n DiagnosticCode.Channel,\n `channel ${module.key} route ${route.path} must start with /`,\n module.path,\n );\n }\n }\n const parsedConfig = jsonObjectSchema.safeParse(value.config);\n const installed = value.installed == null ? null : providerRefSchema.safeParse(value.installed);\n if (installed != null && !installed.success) {\n report(\n DiagnosticSeverity.Error,\n DiagnosticCode.Channel,\n `channel ${module.key} has an invalid installed reference`,\n module.path,\n );\n continue;\n }\n addChannel(\n {\n key: module.key,\n channel: installed == null ? bundleRef(module.base) : installed.data,\n config: parsedConfig.success ? parsedConfig.data : {},\n source: 'authored',\n },\n module.path,\n );\n if (value.installed != null) continue;\n runtimeExport(module.base, module.path);\n channelRoutes[module.base] = value.routes.map((route) => ({\n method: route.method,\n path: route.path,\n }));\n }\n for (const [index, binding] of (agent?.channels ?? []).entries()) {\n const ref = providerRefSchema.safeParse(binding.channel);\n if (!ref.success) {\n report(\n DiagnosticSeverity.Error,\n DiagnosticCode.Channel,\n `agent.ts channels[${index}] has an invalid channel reference`,\n agentPath,\n );\n continue;\n }\n const config = jsonObjectSchema.safeParse(binding.config);\n const key =\n binding.key ??\n (ref.data.kind === 'package'\n ? (ref.data.specifier.split('/').at(-1) ?? ref.data.specifier)\n : ref.data.export);\n addChannel({ key, channel: ref.data, config: config.success ? config.data : {} }, agentPath);\n }\n\n // Hooks.\n const hooks: HookBindingIface[] = [];\n for (const module of withDefault(SlotKind.Hook)) {\n if (module.value?.type !== 'hook') continue;\n const events: string[] = [];\n for (const key of module.value.keys) {\n const normalized = normalizeHookKey(key);\n switch (normalized.kind) {\n case HookEventKeyKind.Unknown:\n report(\n DiagnosticSeverity.Error,\n DiagnosticCode.Hook,\n `hook ${module.key} subscribes to unknown event ${key}`,\n module.path,\n );\n break;\n case HookEventKeyKind.Canonical:\n case HookEventKeyKind.Wildcard:\n events.push(...normalized.events);\n break;\n }\n }\n const unique = [...new Set(events)];\n if (unique.length === 0) {\n report(\n DiagnosticSeverity.Warning,\n DiagnosticCode.Hook,\n `hook ${module.key} subscribes to no events and was left out`,\n module.path,\n );\n continue;\n }\n hooks.push({ slug: module.key, export: module.base, events: unique });\n runtimeExport(module.base, module.path);\n }\n\n // Schedules.\n const schedules: ScheduleDefinitionIface[] = [];\n const addSchedule = (args: {\n key: string;\n path: string;\n cron: string | null;\n timezone: string | null;\n target: string | null;\n prompt: string | null;\n }): void => {\n const { key, path } = args;\n if (args.cron == null) {\n report(\n DiagnosticSeverity.Error,\n DiagnosticCode.Schedule,\n `schedule ${key} needs a cron expression`,\n path,\n );\n return;\n }\n const timezone = args.timezone ?? 'UTC';\n try {\n new Cron(args.cron, { timezone, paused: true }).nextRun();\n } catch (cause) {\n report(\n DiagnosticSeverity.Error,\n DiagnosticCode.Schedule,\n `schedule ${key}: ${cause instanceof Error ? cause.message : String(cause)}`,\n path,\n );\n return;\n }\n const target = Object.values(ScheduleTarget).find(\n (candidate) => candidate === (args.target ?? ScheduleTarget.OwnerDirect),\n );\n if (target == null) {\n report(\n DiagnosticSeverity.Error,\n DiagnosticCode.Schedule,\n `schedule ${key} target must be owner-direct or bound-conversation`,\n path,\n );\n return;\n }\n const prompt = args.prompt?.trim() ?? '';\n if (prompt.length === 0) {\n report(\n DiagnosticSeverity.Error,\n DiagnosticCode.Schedule,\n `schedule ${key} needs a prompt`,\n path,\n );\n return;\n }\n schedules.push({ key, cron: args.cron, timezone, prompt, target });\n };\n for (const item of input.discovery.scheduleMarkdown) {\n const front = parseFrontMatter(input.files[item.path] ?? '');\n if (front.error != null)\n report(DiagnosticSeverity.Error, DiagnosticCode.Schedule, front.error, item.path);\n const field = (name: string): string | null => frontMatterString(front.data, name);\n addSchedule({\n key: item.key,\n path: item.path,\n cron: field('cron'),\n timezone: field('timezone'),\n target: field('target'),\n prompt: front.body,\n });\n }\n for (const module of withDefault(SlotKind.Schedule)) {\n if (module.value?.type !== 'schedule') continue;\n addSchedule({\n key: module.key,\n path: module.path,\n cron: module.value.cron,\n timezone: module.value.timezone,\n target: module.value.target,\n prompt: module.value.markdown,\n });\n }\n const scheduleKeys = new Set<string>();\n for (const schedule of schedules) {\n if (scheduleKeys.has(schedule.key)) {\n report(\n DiagnosticSeverity.Error,\n DiagnosticCode.Schedule,\n `schedule ${schedule.key} is defined more than once`,\n );\n }\n scheduleKeys.add(schedule.key);\n }\n\n for (const rejected of input.discovery.rejected) {\n report(DiagnosticSeverity.Error, DiagnosticCode.RejectedSlot, rejected.message, rejected.path);\n }\n for (const unsupported of input.discovery.unsupported) {\n report(\n DiagnosticSeverity.Warning,\n DiagnosticCode.RejectedSlot,\n unsupported.message,\n unsupported.path,\n );\n }\n\n // Literal `secrets.get('<name>')` reads join the allowlist; a computed name\n // must be declared in agent.ts, or the read fails at run time.\n const references = secretReferences(input.files);\n const secrets = collectSecrets({\n declared: agent?.secrets ?? [],\n config,\n mcpServers: connections,\n reads: references.flatMap((reference) => (reference.name == null ? [] : [reference.name])),\n });\n const computedReads = new Set(\n references.flatMap((reference) => (reference.name == null ? [reference.path] : [])),\n );\n for (const path of computedReads) {\n report(\n DiagnosticSeverity.Note,\n DiagnosticCode.Secrets,\n `${path} reads a secret by a computed name; list it in defineAgent({ secrets: [...] }) or the read fails at run time`,\n path,\n );\n }\n\n if (harnessRef == null) {\n return { manifest: null, modules, sandboxOpeners, channelRoutes, directoryFields, diagnostics };\n }\n const draft: AgentManifestIface = {\n version: MANIFEST_VERSION,\n identity: {\n name: agent?.name ?? input.fallbackName,\n description: agent?.description ?? null,\n avatarUrl: agent?.avatarUrl ?? null,\n },\n harness: { harness: harnessRef, config },\n mcpServers,\n sandboxes,\n tools: host.length === 0 ? { base } : { base, host },\n toolPolicy,\n secrets,\n channels,\n channelSources: Object.fromEntries(\n withDefault(SlotKind.Channel).flatMap((module) =>\n module.value?.type === 'channel'\n ? [\n [\n module.key,\n { path: module.path, source: 'authored', disabled: module.value.disabled },\n ],\n ]\n : [],\n ),\n ),\n hooks,\n schedules,\n bundle: null,\n };\n const resolvers: NonNullable<AgentManifestIface['bundle']>['resolvers'] = {};\n for (const found of findDynamicSlots(draft)) {\n resolvers[found.path] = {\n export: found.slot.$dynamic.resolver,\n events: found.slot.$dynamic.events,\n };\n }\n const hasSandboxes = Object.keys(sandboxes).length > 0;\n if (Object.keys(modules).length > 0 || hasSandboxes) {\n if (input.bundle == null) {\n report(\n DiagnosticSeverity.Error,\n DiagnosticCode.Bundle,\n 'the definition needs a bundle but none was produced',\n );\n } else\n draft.bundle = {\n hash: input.bundle.hash,\n resolvers,\n hasPreparationFiles: Object.keys(preparationFiles(input.files)).length > 0,\n };\n }\n const validated = agentManifestSchema.safeParse(draft);\n if (!validated.success) {\n for (const issue of validated.error.issues) {\n report(\n DiagnosticSeverity.Error,\n DiagnosticCode.Manifest,\n `manifest ${issue.path.join('.')}: ${issue.message}`,\n );\n }\n }\n const failed = diagnostics.some((item) => item.severity === DiagnosticSeverity.Error);\n return {\n manifest: failed || !validated.success ? null : validated.data,\n modules,\n sandboxOpeners,\n channelRoutes,\n directoryFields,\n diagnostics,\n };\n};\n"],
|
|
5
|
-
"mappings": "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",
|
|
4
|
+
"sourcesContent": ["import {\n agentManifestSchema,\n BaseCapability,\n bundleRef,\n CredentialNodeKind,\n credentialPolicySchema,\n DynamicEvent,\n findDynamicSlots,\n formatProviderRef,\n httpMcpServerBindingSchema,\n InstructionRole,\n jsonObjectSchema,\n MANIFEST_VERSION,\n McpServerBindingKind,\n packageRef,\n ProviderRefKind,\n providerRefSchema,\n SandboxAccess,\n SandboxAttach,\n ScheduleTarget,\n skillBundleSchema,\n ToolApproval,\n toolDescriptorSchema,\n TurnPolicy,\n type AgentManifestIface,\n type ChannelBindingIface,\n type DynamicSlotIface,\n type HookBindingIface,\n type JsonObject,\n type JsonValue,\n type McpServerBinding,\n type ProviderRef,\n type SandboxBindingIface,\n type ScheduleDefinitionIface,\n type SkillBundleIface,\n type ToolDescriptorIface,\n} from '@finalai/agent-provider';\nimport { Cron } from 'croner';\nimport * as z from 'zod';\nimport { HookEventKeyKind, normalizeHookKey } from \"../authoring/hooks.mjs\";\nimport type {\n DescribedAgentIface,\n DescribedBundleIface,\n DescribedDynamicIface,\n DescribedModuleIface,\n DescribedSandboxIface,\n} from \"../runtime/described.mjs\";\nimport { AUTHORED_SERVER_KEY, COMBINED_MCP_SERVERS_EXPORT, SlotKind } from \"../runtime/layout.mjs\";\nimport { IssueSeverity } from \"../runtime/lower.mjs\";\nimport {\n diagnostic,\n DiagnosticCode,\n DiagnosticSeverity,\n type DiagnosticIface,\n} from \"./diagnostics.mjs\";\nimport { InstructionSourceKind, isModulePath, type DiscoveryIface } from \"./discovery.mjs\";\nimport { preparationFiles } from \"./files.mjs\";\nimport { firstParagraphLine, frontMatterString, parseFrontMatter } from \"./frontmatter.mjs\";\n\nexport interface AssembleInputIface {\n installedSandboxProviders?: Readonly<Record<string, string>>;\n files: Record<string, string>;\n discovery: DiscoveryIface;\n described: DescribedBundleIface | null;\n fallbackName: string;\n bundle: { hash: string; code: string } | null;\n}\n\nexport interface AssembleOutputIface {\n manifest: AgentManifestIface | null;\n // Bundle export \u2192 directory-relative source path, for what the runtime calls.\n modules: Record<string, string>;\n // Target \u2192 bundle export of the sandbox.ts selector that opens it.\n sandboxOpeners: Record<string, string>;\n // Bundle channel export \u2192 its routes, for the public route URLs.\n channelRoutes: Record<string, { method: string; path: string }[]>;\n // Which config fields came from directory files, for the compatibility report.\n directoryFields: { instructions: string[]; skills: string[] };\n diagnostics: DiagnosticIface[];\n}\n\nconst SEVERITY = {\n [IssueSeverity.Error]: DiagnosticSeverity.Error,\n [IssueSeverity.Warning]: DiagnosticSeverity.Warning,\n [IssueSeverity.Note]: DiagnosticSeverity.Note,\n} satisfies Record<IssueSeverity, DiagnosticSeverity>;\n\nconst isObject = (value: JsonValue | undefined): value is JsonObject =>\n jsonObjectSchema.safeParse(value).success;\n\nconst DYNAMIC_EVENTS: ReadonlySet<string> = new Set(Object.values(DynamicEvent));\n\nconst toDynamicEvents = (events: string[]): DynamicEvent[] =>\n Object.values(DynamicEvent).filter((event) => events.includes(event));\n\nconst capabilityOf = (name: string): BaseCapability | null =>\n Object.values(BaseCapability).find((capability) => capability === name) ?? null;\n\nconst apiKeySecretSchema = z.looseObject({\n kind: z.literal(CredentialNodeKind.ApiKey),\n secret: z.string().min(1),\n});\n\n// A secret reference in harness config (`hop: { secretKey }` and every other\n// `final://schemas` secret ref).\nconst secretRefSchema = z.looseObject({ secretKey: z.string().min(1) });\n\n// Secret names a definition references outside authored code: API key\n// credential nodes and secret refs anywhere in the harness config (walked as JSON).\nconst configSecrets = (value: JsonValue): string[] => {\n if (Array.isArray(value)) return value.flatMap(configSecrets);\n if (!isObject(value)) return [];\n const node = apiKeySecretSchema.safeParse(value);\n const ref = secretRefSchema.safeParse(value);\n return [\n ...(node.success ? [node.data.secret] : []),\n ...(ref.success ? [ref.data.secretKey] : []),\n ...Object.values(value).flatMap(configSecrets),\n ];\n};\n\n// The manifest's secret allowlist: declared names plus every secret the\n// definition references by name. Sandbox `variables` are organization\n// variables, not secrets, and stay out.\nconst collectSecrets = (args: {\n declared: string[];\n config: JsonValue;\n mcpServers: AgentManifestIface['mcpServers'];\n reads: string[];\n}): string[] => {\n const names = new Set([...args.declared, ...args.reads]);\n for (const name of configSecrets(args.config)) names.add(name);\n if (Array.isArray(args.mcpServers)) {\n for (const binding of args.mcpServers) {\n if (\n binding.kind === McpServerBindingKind.Http &&\n binding.auth != null &&\n 'secretKey' in binding.auth\n ) {\n names.add(binding.auth.secretKey);\n }\n }\n }\n return [...names].sort();\n};\n\nconst SECRET_READ = /secrets\\s*\\.\\s*get\\(\\s*(?:(['\"`])([^'\"`$\\\\]+)\\1\\s*\\)|(?!\\s*\\)))/g;\n\n// `secrets.get(...)` calls in authored source files, helpers included: a\n// string literal names the secret; any other argument is a computed read the\n// compiler cannot see.\nconst secretReferences = (files: Record<string, string>): { path: string; name: string | null }[] =>\n Object.entries(files)\n .filter(([path]) => isModulePath(path) || /\\.[jt]sx$/.test(path))\n .flatMap(([path, source]) =>\n [...source.matchAll(SECRET_READ)].map((match) => ({ path, name: match[2] ?? null })),\n );\n\nexport const assemble = (input: AssembleInputIface): AssembleOutputIface => {\n const diagnostics: DiagnosticIface[] = [];\n const report = (\n severity: DiagnosticSeverity,\n code: DiagnosticCode,\n message: string,\n path: string | null = null,\n ): void => {\n diagnostics.push(diagnostic({ severity, code, message, path }));\n };\n const modules: Record<string, string> = {};\n const runtimeExport = (name: string, path: string): void => {\n modules[name] = path;\n };\n const described = input.described?.modules ?? [];\n for (const module of described) {\n for (const issue of module.issues)\n report(SEVERITY[issue.severity], DiagnosticCode.Module, issue.message, module.path);\n }\n const ofSlot = (slot: SlotKind): DescribedModuleIface[] =>\n described.filter((module) => module.slot === slot);\n const withDefault = (slot: SlotKind): DescribedModuleIface[] =>\n ofSlot(slot).filter((module) => module.hasDefault && module.value != null);\n\n const dynamicSlotFor = (\n dynamic: DescribedDynamicIface,\n resolver: string,\n path: string,\n slotName: string,\n ): DynamicSlotIface | null => {\n for (const event of dynamic.events) {\n if (!DYNAMIC_EVENTS.has(event)) {\n report(\n DiagnosticSeverity.Error,\n DiagnosticCode.Module,\n `${slotName} resolves on ${event}; dynamic slots support session.started and turn.started (the harness owns steps)`,\n path,\n );\n }\n }\n const events = toDynamicEvents(dynamic.events);\n if (events.length === 0) {\n report(\n DiagnosticSeverity.Error,\n DiagnosticCode.Module,\n `${slotName} defineDynamic has no session.started or turn.started handler`,\n path,\n );\n return null;\n }\n runtimeExport(resolver, path);\n const slot: DynamicSlotIface = { $dynamic: { resolver, events } };\n if (dynamic.description != null) slot.$dynamic.description = dynamic.description;\n if (dynamic.preview != null) slot.$dynamic.preview = dynamic.preview;\n if ((dynamic.requiredBindings?.length ?? 0) > 0)\n slot.$dynamic.requiredBindings = dynamic.requiredBindings;\n // Build shows \"resolved at <export> on <event>\" without them.\n if (dynamic.description == null && dynamic.preview == null) {\n report(\n DiagnosticSeverity.Note,\n DiagnosticCode.Module,\n `${slotName} is resolved per session; give defineDynamic a description (and a preview) so Build can show what it resolves to`,\n path,\n );\n }\n return slot;\n };\n\n // agent.ts\n const agentModule = ofSlot(SlotKind.Agent)[0] ?? null;\n let agent: DescribedAgentIface | null = null;\n if (agentModule != null) {\n if (!agentModule.hasDefault) {\n report(\n DiagnosticSeverity.Error,\n DiagnosticCode.Module,\n 'agent.ts must export defineAgent({ ... }) as its default export',\n agentModule.path,\n );\n } else if (agentModule.value?.type === 'agent') agent = agentModule.value;\n }\n const agentPath = agentModule?.path ?? 'agent.ts';\n for (const name of input.described?.synthesized ?? []) {\n if (name !== COMBINED_MCP_SERVERS_EXPORT) runtimeExport(name, agentPath);\n }\n\n // Harness binding. Model, reasoning, credentials and permission mode are\n // harness config, never top-level agent fields.\n let harnessRef: ProviderRef | null = null;\n let config: JsonValue = {};\n if (agent?.harness == null) {\n // A missing or invalid default export is reported above.\n if (agentModule == null || agent != null) {\n report(\n DiagnosticSeverity.Error,\n DiagnosticCode.Harness,\n 'agent.ts must name a harness, e.g. defineAgent({ harness: serverlessPi({ model }) })',\n agentPath,\n );\n }\n } else {\n const parsed = providerRefSchema.safeParse(agent.harness.harness);\n if (parsed.success) harnessRef = parsed.data;\n else\n report(\n DiagnosticSeverity.Error,\n DiagnosticCode.Harness,\n 'agent.ts harness has an invalid provider reference',\n agentPath,\n );\n config = agent.harness.config;\n }\n if (harnessRef?.kind === 'bundle') runtimeExport(harnessRef.export, agentPath);\n const credentialPolicies = Object.values(jsonObjectSchema.safeParse(config).data ?? {}).filter(\n (value) => credentialPolicySchema.safeParse(value).success,\n );\n if (harnessRef != null && credentialPolicies.length !== 1) {\n report(\n DiagnosticSeverity.Error,\n DiagnosticCode.Harness,\n 'Declare exactly one credential policy in the harness config; billing policy belongs to this definition.',\n agentPath,\n );\n }\n\n const configObject = isObject(config) ? config : null;\n if (configObject == null && !findDynamicSlots(config).some((slot) => slot.path === '')) {\n report(\n DiagnosticSeverity.Error,\n DiagnosticCode.Harness,\n 'harness config must be an object',\n agentPath,\n );\n }\n\n // Instructions.\n const instructionFragments: JsonValue[] = [];\n const instructionSources: string[] = [];\n const instructionModules = new Map(\n ofSlot(SlotKind.Instructions).map((module) => [module.path, module]),\n );\n for (const source of input.discovery.instructions) {\n if (source.kind === InstructionSourceKind.Markdown) {\n const content = input.files[source.path] ?? '';\n if (content.trim().length === 0) {\n report(\n DiagnosticSeverity.Warning,\n DiagnosticCode.Instructions,\n `${source.path} is empty and was skipped`,\n source.path,\n );\n continue;\n }\n instructionFragments.push({ role: InstructionRole.System, content, source: source.path });\n instructionSources.push(source.path);\n continue;\n }\n const module = instructionModules.get(source.path);\n if (module == null || module.value == null) continue;\n if (module.value.type === 'instructions') {\n instructionFragments.push({\n role: module.value.role,\n content: module.value.content,\n source: source.path,\n });\n instructionSources.push(source.path);\n } else if (module.value.type === 'dynamic') {\n const slot = dynamicSlotFor(module.value, module.base, source.path, source.path);\n if (slot != null) {\n instructionFragments.push(slot);\n instructionSources.push(source.path);\n }\n }\n }\n\n // Skills.\n const skills: JsonValue[] = [];\n const skillSources: string[] = [];\n const skillKeys = new Set<string>();\n const addSkill = (key: string, skill: JsonValue, path: string): void => {\n if (skillKeys.has(key)) {\n report(\n DiagnosticSeverity.Error,\n DiagnosticCode.Skills,\n `skill ${key} is defined more than once`,\n path,\n );\n return;\n }\n skillKeys.add(key);\n skills.push(skill);\n skillSources.push(path);\n };\n for (const directory of input.discovery.skillDirectories) {\n const skillPath = `${directory.directory}/SKILL.md`;\n const text = input.files[skillPath] ?? '';\n const front = parseFrontMatter(text);\n if (front.error != null)\n report(DiagnosticSeverity.Warning, DiagnosticCode.Skills, front.error, skillPath);\n const description =\n frontMatterString(front.data, 'description') ?? firstParagraphLine(front.body);\n const files = [\n { path: 'SKILL.md', content: text },\n ...directory.files\n .filter((file) => file !== skillPath)\n .map((file) => ({\n path: file.slice(directory.directory.length + 1),\n content: input.files[file] ?? '',\n })),\n ];\n const skill: SkillBundleIface = { key: directory.key, files };\n if (description != null) skill.description = description;\n addSkill(directory.key, skill, skillPath);\n }\n for (const flat of input.discovery.skillMarkdown) {\n const text = input.files[flat.path] ?? '';\n const front = parseFrontMatter(text);\n const description =\n frontMatterString(front.data, 'description') ??\n firstParagraphLine(front.body) ??\n `Instructions for the ${flat.key} skill.`;\n const content = text.startsWith('---\\n')\n ? text\n : `---\\nname: ${JSON.stringify(flat.key)}\\ndescription: ${JSON.stringify(description)}\\n---\\n\\n${text}`;\n addSkill(\n flat.key,\n { key: flat.key, description, files: [{ path: 'SKILL.md', content }] },\n flat.path,\n );\n }\n for (const module of withDefault(SlotKind.Skill)) {\n if (module.value?.type === 'skill') {\n const parsed = skillBundleSchema.safeParse(module.value.skill);\n if (parsed.success) addSkill(module.key, parsed.data, module.path);\n } else if (module.value?.type === 'dynamic') {\n const slot = dynamicSlotFor(module.value, module.base, module.path, module.path);\n if (slot != null) addSkill(module.key, slot, module.path);\n }\n }\n\n const directoryFields = { instructions: instructionSources, skills: skillSources };\n if (configObject != null) {\n if (instructionFragments.length > 0) {\n if (configObject['instructions'] != null) {\n report(\n DiagnosticSeverity.Error,\n DiagnosticCode.Conflict,\n 'harness config sets instructions and the directory has instruction files; keep one source',\n agentPath,\n );\n } else configObject['instructions'] = instructionFragments;\n }\n if (skills.length > 0) {\n if (configObject['skills'] != null) {\n report(\n DiagnosticSeverity.Error,\n DiagnosticCode.Conflict,\n 'harness config sets skills and the directory has skills/; keep one source',\n agentPath,\n );\n } else configObject['skills'] = skills;\n }\n } else if (instructionFragments.length > 0 || skills.length > 0) {\n report(\n DiagnosticSeverity.Error,\n DiagnosticCode.Conflict,\n 'harness config is dynamic, so directory instructions and skills cannot be added to it',\n agentPath,\n );\n }\n\n // MCP servers: authored tools and connections.\n const toolPolicy: Record<string, ToolApproval> = {};\n const toolDescriptors: ToolDescriptorIface[] = [];\n const toolApprovals: Record<string, ToolApproval> = {};\n let anyDynamicServer = false;\n let anyTurnStartedServer = false;\n for (const module of ofSlot(SlotKind.Tool)) {\n if (!module.hasDefault || module.value == null) continue;\n if (module.value.type === 'dynamic') {\n anyDynamicServer = true;\n anyTurnStartedServer ||= module.value.events.includes(DynamicEvent.TurnStarted);\n runtimeExport(module.base, module.path);\n continue;\n }\n if (module.value.type !== 'tool') continue;\n const parsed = toolDescriptorSchema.safeParse(module.value.descriptor);\n if (!parsed.success) {\n report(\n DiagnosticSeverity.Error,\n DiagnosticCode.Module,\n `tool ${module.key} has an invalid descriptor`,\n module.path,\n );\n continue;\n }\n toolDescriptors.push(parsed.data);\n const approval =\n module.value.approval === ToolApproval.Ask ? ToolApproval.Ask : ToolApproval.Allow;\n toolApprovals[module.key] = approval;\n if (approval === ToolApproval.Ask && parsed.data.inputApproval == null)\n toolPolicy[`${AUTHORED_SERVER_KEY}/${module.key}`] = ToolApproval.Ask;\n runtimeExport(module.base, module.path);\n }\n const connections: McpServerBinding[] = [];\n const connectionKeys = new Set<string>();\n for (const module of ofSlot(SlotKind.Connection)) {\n if (!module.hasDefault || module.value == null) continue;\n if (module.key === AUTHORED_SERVER_KEY) {\n report(\n DiagnosticSeverity.Error,\n DiagnosticCode.Connections,\n `connection name ${AUTHORED_SERVER_KEY} is reserved for authored tools`,\n module.path,\n );\n continue;\n }\n if (connectionKeys.has(module.key)) {\n report(\n DiagnosticSeverity.Error,\n DiagnosticCode.Connections,\n `connection ${module.key} is defined more than once`,\n module.path,\n );\n continue;\n }\n connectionKeys.add(module.key);\n if (module.value.type === 'dynamic') {\n anyDynamicServer = true;\n anyTurnStartedServer ||= module.value.events.includes(DynamicEvent.TurnStarted);\n runtimeExport(module.base, module.path);\n continue;\n }\n if (module.value.type !== 'connection') continue;\n const parsed = httpMcpServerBindingSchema.safeParse(module.value.binding);\n if (!parsed.success) {\n report(\n DiagnosticSeverity.Error,\n DiagnosticCode.Connections,\n `connection ${module.key} is invalid: ${parsed.error.issues[0]?.message ?? 'invalid'}`,\n module.path,\n );\n continue;\n }\n connections.push(parsed.data);\n if (parsed.data.inputApprovals != null) runtimeExport(module.base, module.path);\n for (const [tool, approval] of Object.entries(parsed.data.approvals ?? {})) {\n if (approval === ToolApproval.Ask && !Object.hasOwn(parsed.data.inputApprovals ?? {}, tool))\n toolPolicy[`${module.key}/${tool}`] = ToolApproval.Ask;\n }\n }\n let mcpServers: AgentManifestIface['mcpServers'];\n if (anyDynamicServer) {\n mcpServers = {\n $dynamic: {\n resolver: COMBINED_MCP_SERVERS_EXPORT,\n requiredBindings: [...ofSlot(SlotKind.Connection), ...ofSlot(SlotKind.Tool)].flatMap(\n (module) =>\n module.value?.type === 'dynamic' ? (module.value.requiredBindings ?? []) : [],\n ),\n events: anyTurnStartedServer\n ? [DynamicEvent.SessionStarted, DynamicEvent.TurnStarted]\n : [DynamicEvent.SessionStarted],\n description:\n 'Authored tools and connections, including the dynamic ones, resolved when the session starts.',\n },\n };\n runtimeExport(COMBINED_MCP_SERVERS_EXPORT, '<synthesized>');\n } else {\n mcpServers = [\n ...(toolDescriptors.length === 0\n ? []\n : [\n {\n key: AUTHORED_SERVER_KEY,\n kind: McpServerBindingKind.Worker,\n tools: toolDescriptors,\n approvals: toolApprovals,\n } satisfies McpServerBinding,\n ]),\n ...connections,\n ];\n }\n for (const [key, policy] of Object.entries(agent?.toolPolicy ?? {})) {\n toolPolicy[key] = policy === 'ask' ? ToolApproval.Ask : ToolApproval.Allow;\n }\n\n // Sandboxes.\n const sandboxModule = ofSlot(SlotKind.Sandbox)[0];\n const sandbox: DescribedSandboxIface | null =\n sandboxModule?.value?.type === 'sandbox' ? sandboxModule.value : null;\n const sandboxPath = sandboxModule?.path ?? 'sandbox.ts';\n const sandboxes: Record<string, SandboxBindingIface> = {};\n const sandboxOpeners: Record<string, string> = {};\n const providerExportByName = new Map(\n Object.entries(sandbox?.providers ?? {}).map(([exportName, name]) => [name, exportName]),\n );\n const duplicateNames = new Set<string>();\n for (const name of Object.values(sandbox?.providers ?? {})) {\n if (duplicateNames.has(name))\n report(\n DiagnosticSeverity.Error,\n DiagnosticCode.Sandbox,\n `sandbox.ts exports multiple providers named ${name}; give each provider a distinct name`,\n sandboxPath,\n );\n duplicateNames.add(name);\n }\n const providerFor = (args: {\n ref: JsonValue | null;\n name: string | null;\n target: string;\n }): ProviderRef | null => {\n if (args.ref != null) {\n const parsed = providerRefSchema.safeParse(args.ref);\n if (parsed.success) return parsed.data;\n }\n if (args.name != null) {\n const exportName = providerExportByName.get(args.name);\n if (exportName != null) {\n runtimeExport(exportName, sandboxPath);\n return bundleRef(exportName);\n }\n report(\n DiagnosticSeverity.Error,\n DiagnosticCode.Sandbox,\n `sandbox target ${args.target} uses provider ${args.name}, which is neither installed nor exported from sandbox.ts`,\n sandboxPath,\n );\n return null;\n }\n report(\n DiagnosticSeverity.Error,\n DiagnosticCode.Sandbox,\n `sandbox target ${args.target} is dynamic and its provider cannot be inferred; give defineDynamic a provider ({ provider: computer, events })`,\n sandboxPath,\n );\n return null;\n };\n // A dynamic target without a provider hint: the\n // provider its resolver returns an environment of is unknown until a session\n // starts, so an installed provider is inferred here (the target's name, or\n // the one installed provider sandbox.ts uses) and checked by reference when\n // the slot resolves. Providers defined in sandbox.ts still need the hint:\n // their environments carry only a name, which cannot be checked.\n const inferredProvider = (target: string): { ref: JsonValue; name: string } | null => {\n if (providerExportByName.size > 0) return null;\n const specifier = Object.hasOwn(input.installedSandboxProviders ?? {}, target)\n ? input.installedSandboxProviders?.[target]\n : undefined;\n if (specifier != null) return { ref: packageRef(specifier), name: target };\n const installed = new Map<string, { ref: JsonValue; name: string }>();\n for (const described of Object.values(sandbox?.targets ?? {})) {\n const environment = described.environment;\n const parsed = providerRefSchema.safeParse(environment?.providerRef);\n if (environment?.providerName == null || !parsed.success) continue;\n if (parsed.data.kind !== ProviderRefKind.Package) continue;\n installed.set(formatProviderRef(parsed.data), {\n ref: environment.providerRef,\n name: environment.providerName,\n });\n }\n return installed.size === 1 ? ([...installed.values()][0] ?? null) : null;\n };\n for (const [target, described] of Object.entries(sandbox?.targets ?? {})) {\n if (described.environment != null) {\n const environment = described.environment;\n const provider = providerFor({\n ref: environment.providerRef,\n name: environment.providerName,\n target,\n });\n if (provider == null) continue;\n const open: JsonValue | undefined = environment.openOptions ?? undefined;\n if (\n open != null &&\n (!isObject(open) || Object.keys(open).some((key) => key !== 'access' && key !== 'attach'))\n ) {\n report(\n DiagnosticSeverity.Error,\n DiagnosticCode.Sandbox,\n `sandbox target ${target} open options support only access and attach`,\n sandboxPath,\n );\n continue;\n }\n const access = isObject(open) ? open['access'] : undefined;\n const attach = isObject(open) ? open['attach'] : undefined;\n if (\n access != null &&\n access !== SandboxAccess.Read &&\n access !== SandboxAccess.Execute &&\n access !== SandboxAccess.Write\n ) {\n report(\n DiagnosticSeverity.Error,\n DiagnosticCode.Sandbox,\n `sandbox target ${target} has invalid access ${String(access)}`,\n sandboxPath,\n );\n continue;\n }\n if (attach != null && attach !== SandboxAttach.OnPrompt && attach !== SandboxAttach.Lazy) {\n report(\n DiagnosticSeverity.Error,\n DiagnosticCode.Sandbox,\n `sandbox target ${target} has invalid attach ${String(attach)}`,\n sandboxPath,\n );\n continue;\n }\n sandboxes[target] = {\n provider,\n environment: environment.options,\n access:\n access === SandboxAccess.Read || access === SandboxAccess.Execute\n ? access\n : SandboxAccess.Write,\n attach: attach === SandboxAttach.OnPrompt ? SandboxAttach.OnPrompt : SandboxAttach.Lazy,\n };\n } else if (described.dynamic != null) {\n const hinted = described.dynamic.provider;\n const inferred = hinted == null ? inferredProvider(target) : null;\n if (inferred != null) {\n report(\n DiagnosticSeverity.Note,\n DiagnosticCode.Sandbox,\n `sandbox target ${target} is dynamic; its provider is ${inferred.name}, and its resolver must return a ${inferred.name} environment`,\n sandboxPath,\n );\n }\n const provider = providerFor({\n ref: hinted?.ref ?? inferred?.ref ?? null,\n name: hinted?.name ?? inferred?.name ?? null,\n target,\n });\n const slot = dynamicSlotFor(\n described.dynamic,\n described.exportName,\n sandboxPath,\n `sandbox target ${target}`,\n );\n if (provider == null || slot == null) continue;\n sandboxes[target] = {\n provider,\n environment: slot,\n access: SandboxAccess.Write,\n attach: SandboxAttach.Lazy,\n };\n }\n }\n if (\n sandbox?.selector === true &&\n sandbox.defaultTarget != null &&\n sandboxes[sandbox.defaultTarget] != null\n ) {\n sandboxOpeners[sandbox.defaultTarget] = 'sandbox';\n runtimeExport('sandbox', sandboxPath);\n report(\n DiagnosticSeverity.Note,\n DiagnosticCode.Sandbox,\n `sandbox.ts default export opens target ${sandbox.defaultTarget} for each session`,\n sandboxPath,\n );\n }\n\n // Base tools.\n const base: AgentManifestIface['tools']['base'] = {};\n if (agent?.tools != null) {\n for (const [name, target] of Object.entries(agent.tools)) {\n const capability = capabilityOf(name);\n if (capability == null) {\n report(\n DiagnosticSeverity.Error,\n DiagnosticCode.BaseTools,\n `baseTools has unknown capability ${name}`,\n agentPath,\n );\n continue;\n }\n if (sandboxes[target] == null) {\n report(\n DiagnosticSeverity.Error,\n DiagnosticCode.BaseTools,\n `baseTools ${name} is bound to ${target}, which is not a sandbox target`,\n agentPath,\n );\n continue;\n }\n base[capability] = { target };\n }\n }\n // Capabilities declared on the harness's own host (`harnessHost`).\n const host: BaseCapability[] = [];\n for (const name of agent?.hostTools ?? []) {\n const capability = capabilityOf(name);\n if (capability == null) {\n report(\n DiagnosticSeverity.Error,\n DiagnosticCode.BaseTools,\n `baseTools has unknown capability ${name}`,\n agentPath,\n );\n continue;\n }\n if (base[capability] != null) {\n report(\n DiagnosticSeverity.Error,\n DiagnosticCode.BaseTools,\n `baseTools ${name} is bound both to a sandbox target and to harnessHost`,\n agentPath,\n );\n continue;\n }\n host.push(capability);\n }\n\n // Channels.\n const channels: ChannelBindingIface[] = [];\n const channelKeys = new Set<string>();\n const channelRoutes: AssembleOutputIface['channelRoutes'] = {};\n const addChannel = (binding: ChannelBindingIface, path: string): void => {\n if (channelKeys.has(binding.key)) {\n report(\n DiagnosticSeverity.Error,\n DiagnosticCode.Channel,\n `channel ${binding.key} is bound more than once`,\n path,\n );\n return;\n }\n channelKeys.add(binding.key);\n channels.push(binding);\n };\n for (const module of withDefault(SlotKind.Channel)) {\n if (module.value?.type !== 'channel') continue;\n const { value } = module;\n if (value.disabled) continue;\n if (\n value.turnPolicy != null &&\n value.turnPolicy !== TurnPolicy.Steer &&\n value.turnPolicy !== TurnPolicy.Queue\n ) {\n report(\n DiagnosticSeverity.Error,\n DiagnosticCode.Channel,\n `channel ${module.key} turnPolicy must be steer or queue`,\n module.path,\n );\n }\n for (const route of value.routes) {\n if (!route.path.startsWith('/')) {\n report(\n DiagnosticSeverity.Error,\n DiagnosticCode.Channel,\n `channel ${module.key} route ${route.path} must start with /`,\n module.path,\n );\n }\n }\n const parsedConfig = jsonObjectSchema.safeParse(value.config);\n const installed = value.installed == null ? null : providerRefSchema.safeParse(value.installed);\n if (installed != null && !installed.success) {\n report(\n DiagnosticSeverity.Error,\n DiagnosticCode.Channel,\n `channel ${module.key} has an invalid installed reference`,\n module.path,\n );\n continue;\n }\n addChannel(\n {\n key: module.key,\n channel: installed == null ? bundleRef(module.base) : installed.data,\n config: parsedConfig.success ? parsedConfig.data : {},\n source: 'authored',\n },\n module.path,\n );\n if (value.installed != null) continue;\n runtimeExport(module.base, module.path);\n channelRoutes[module.base] = value.routes.map((route) => ({\n method: route.method,\n path: route.path,\n }));\n }\n for (const [index, binding] of (agent?.channels ?? []).entries()) {\n const ref = providerRefSchema.safeParse(binding.channel);\n if (!ref.success) {\n report(\n DiagnosticSeverity.Error,\n DiagnosticCode.Channel,\n `agent.ts channels[${index}] has an invalid channel reference`,\n agentPath,\n );\n continue;\n }\n const config = jsonObjectSchema.safeParse(binding.config);\n const key =\n binding.key ??\n (ref.data.kind === 'package'\n ? (ref.data.specifier.split('/').at(-1) ?? ref.data.specifier)\n : ref.data.export);\n addChannel({ key, channel: ref.data, config: config.success ? config.data : {} }, agentPath);\n }\n\n // Hooks.\n const hooks: HookBindingIface[] = [];\n for (const module of withDefault(SlotKind.Hook)) {\n if (module.value?.type !== 'hook') continue;\n const events: string[] = [];\n for (const key of module.value.keys) {\n const normalized = normalizeHookKey(key);\n switch (normalized.kind) {\n case HookEventKeyKind.Unknown:\n report(\n DiagnosticSeverity.Error,\n DiagnosticCode.Hook,\n `hook ${module.key} subscribes to unknown event ${key}`,\n module.path,\n );\n break;\n case HookEventKeyKind.Canonical:\n case HookEventKeyKind.Wildcard:\n events.push(...normalized.events);\n break;\n }\n }\n const unique = [...new Set(events)];\n if (unique.length === 0) {\n report(\n DiagnosticSeverity.Warning,\n DiagnosticCode.Hook,\n `hook ${module.key} subscribes to no events and was left out`,\n module.path,\n );\n continue;\n }\n hooks.push({ slug: module.key, export: module.base, events: unique });\n runtimeExport(module.base, module.path);\n }\n\n // Schedules.\n const schedules: ScheduleDefinitionIface[] = [];\n const addSchedule = (args: {\n key: string;\n path: string;\n cron: string | null;\n timezone: string | null;\n target: string | null;\n prompt: string | null;\n }): void => {\n const { key, path } = args;\n if (args.cron == null) {\n report(\n DiagnosticSeverity.Error,\n DiagnosticCode.Schedule,\n `schedule ${key} needs a cron expression`,\n path,\n );\n return;\n }\n const timezone = args.timezone ?? 'UTC';\n try {\n new Cron(args.cron, { timezone, paused: true }).nextRun();\n } catch (cause) {\n report(\n DiagnosticSeverity.Error,\n DiagnosticCode.Schedule,\n `schedule ${key}: ${cause instanceof Error ? cause.message : String(cause)}`,\n path,\n );\n return;\n }\n const target = Object.values(ScheduleTarget).find(\n (candidate) => candidate === (args.target ?? ScheduleTarget.OwnerDirect),\n );\n if (target == null) {\n report(\n DiagnosticSeverity.Error,\n DiagnosticCode.Schedule,\n `schedule ${key} target must be owner-direct or bound-conversation`,\n path,\n );\n return;\n }\n const prompt = args.prompt?.trim() ?? '';\n if (prompt.length === 0) {\n report(\n DiagnosticSeverity.Error,\n DiagnosticCode.Schedule,\n `schedule ${key} needs a prompt`,\n path,\n );\n return;\n }\n schedules.push({ key, cron: args.cron, timezone, prompt, target });\n };\n for (const item of input.discovery.scheduleMarkdown) {\n const front = parseFrontMatter(input.files[item.path] ?? '');\n if (front.error != null)\n report(DiagnosticSeverity.Error, DiagnosticCode.Schedule, front.error, item.path);\n const field = (name: string): string | null => frontMatterString(front.data, name);\n addSchedule({\n key: item.key,\n path: item.path,\n cron: field('cron'),\n timezone: field('timezone'),\n target: field('target'),\n prompt: front.body,\n });\n }\n for (const module of withDefault(SlotKind.Schedule)) {\n if (module.value?.type !== 'schedule') continue;\n addSchedule({\n key: module.key,\n path: module.path,\n cron: module.value.cron,\n timezone: module.value.timezone,\n target: module.value.target,\n prompt: module.value.markdown,\n });\n }\n const scheduleKeys = new Set<string>();\n for (const schedule of schedules) {\n if (scheduleKeys.has(schedule.key)) {\n report(\n DiagnosticSeverity.Error,\n DiagnosticCode.Schedule,\n `schedule ${schedule.key} is defined more than once`,\n );\n }\n scheduleKeys.add(schedule.key);\n }\n\n for (const rejected of input.discovery.rejected) {\n report(DiagnosticSeverity.Error, DiagnosticCode.RejectedSlot, rejected.message, rejected.path);\n }\n for (const unsupported of input.discovery.unsupported) {\n report(\n DiagnosticSeverity.Warning,\n DiagnosticCode.RejectedSlot,\n unsupported.message,\n unsupported.path,\n );\n }\n\n // Literal `secrets.get('<name>')` reads join the allowlist; a computed name\n // must be declared in agent.ts, or the read fails at run time.\n const references = secretReferences(input.files);\n const secrets = collectSecrets({\n declared: agent?.secrets ?? [],\n config,\n mcpServers: connections,\n reads: references.flatMap((reference) => (reference.name == null ? [] : [reference.name])),\n });\n const computedReads = new Set(\n references.flatMap((reference) => (reference.name == null ? [reference.path] : [])),\n );\n for (const path of computedReads) {\n report(\n DiagnosticSeverity.Note,\n DiagnosticCode.Secrets,\n `${path} reads a secret by a computed name; list it in defineAgent({ secrets: [...] }) or the read fails at run time`,\n path,\n );\n }\n\n if (harnessRef == null) {\n return { manifest: null, modules, sandboxOpeners, channelRoutes, directoryFields, diagnostics };\n }\n const draft: AgentManifestIface = {\n version: MANIFEST_VERSION,\n identity: {\n name: agent?.name ?? input.fallbackName,\n description: agent?.description ?? null,\n avatarUrl: agent?.avatarUrl ?? null,\n },\n harness: { harness: harnessRef, config },\n mcpServers,\n sandboxes,\n tools: host.length === 0 ? { base } : { base, host },\n toolPolicy,\n secrets,\n channels,\n channelSources: Object.fromEntries(\n withDefault(SlotKind.Channel).flatMap((module) =>\n module.value?.type === 'channel'\n ? [\n [\n module.key,\n { path: module.path, source: 'authored', disabled: module.value.disabled },\n ],\n ]\n : [],\n ),\n ),\n hooks,\n schedules,\n bundle: null,\n };\n const resolvers: NonNullable<AgentManifestIface['bundle']>['resolvers'] = {};\n for (const found of findDynamicSlots(draft)) {\n resolvers[found.path] = {\n export: found.slot.$dynamic.resolver,\n events: found.slot.$dynamic.events,\n };\n }\n const hasSandboxes = Object.keys(sandboxes).length > 0;\n if (Object.keys(modules).length > 0 || hasSandboxes) {\n if (input.bundle == null) {\n report(\n DiagnosticSeverity.Error,\n DiagnosticCode.Bundle,\n 'the definition needs a bundle but none was produced',\n );\n } else\n draft.bundle = {\n hash: input.bundle.hash,\n resolvers,\n hasPreparationFiles: Object.keys(preparationFiles(input.files)).length > 0,\n };\n }\n const validated = agentManifestSchema.safeParse(draft);\n if (!validated.success) {\n for (const issue of validated.error.issues) {\n report(\n DiagnosticSeverity.Error,\n DiagnosticCode.Manifest,\n `manifest ${issue.path.join('.')}: ${issue.message}`,\n );\n }\n }\n const failed = diagnostics.some((item) => item.severity === DiagnosticSeverity.Error);\n return {\n manifest: failed || !validated.success ? null : validated.data,\n modules,\n sandboxOpeners,\n channelRoutes,\n directoryFields,\n diagnostics,\n };\n};\n"],
|
|
5
|
+
"mappings": "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",
|
|
6
6
|
"names": ["described", "config"]
|
|
7
7
|
}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { type AgentManifestIface, type HarnessDescriptionIface, type ProviderRef } from '@finalai/agent-provider';
|
|
1
|
+
import { type AgentManifestIface, type HostedBindingsIface, type HarnessDescriptionIface, type ProviderRef } from '@finalai/agent-provider';
|
|
2
2
|
import { type CompatibilityReportIface } from "../compatibility.mjs";
|
|
3
3
|
import { type DiagnosticIface } from "./diagnostics.mjs";
|
|
4
4
|
import { type VendoredPackageIface } from "./packages.mjs";
|
|
@@ -14,6 +14,7 @@ export { parsePackageJson, PLATFORM_PACKAGES, splitSpecifier, workspaceDependenc
|
|
|
14
14
|
export type { VendoredPackageIface, WorkspaceDependencyIface } from "./packages.mjs";
|
|
15
15
|
export interface CompileOptionsIface {
|
|
16
16
|
dir?: string;
|
|
17
|
+
hostedBindings?: HostedBindingsIface;
|
|
17
18
|
files?: Record<string, string>;
|
|
18
19
|
defaultFiles?: Readonly<Record<string, string>>;
|
|
19
20
|
name?: string;
|
|
@@ -6,6 +6,7 @@ import { basename, dirname } from "node:path";
|
|
|
6
6
|
import * as z from "zod";
|
|
7
7
|
import { compatibilityReport } from "../compatibility.mjs";
|
|
8
8
|
import { assemble } from "./assemble.mjs";
|
|
9
|
+
import { validateHostedBindings } from "../hosted-bindings.mjs";
|
|
9
10
|
import { bundleAgent } from "./bundle.mjs";
|
|
10
11
|
import {
|
|
11
12
|
diagnostic,
|
|
@@ -190,6 +191,23 @@ const compile = async (options) => {
|
|
|
190
191
|
}
|
|
191
192
|
diagnostics.push(...assembled.diagnostics);
|
|
192
193
|
const manifest = assembled.manifest;
|
|
194
|
+
if (manifest != null && options.hostedBindings != null) {
|
|
195
|
+
try {
|
|
196
|
+
await validateHostedBindings({
|
|
197
|
+
manifest,
|
|
198
|
+
bindings: options.hostedBindings
|
|
199
|
+
});
|
|
200
|
+
} catch (error) {
|
|
201
|
+
diagnostics.push(
|
|
202
|
+
diagnostic({
|
|
203
|
+
severity: DiagnosticSeverity.Error,
|
|
204
|
+
code: DiagnosticCode.Connections,
|
|
205
|
+
message: error instanceof Error ? error.message : String(error)
|
|
206
|
+
})
|
|
207
|
+
);
|
|
208
|
+
return { manifest: null, bundle: null, diagnostics, report: null };
|
|
209
|
+
}
|
|
210
|
+
}
|
|
193
211
|
const compiledBundle = manifest?.bundle == null || bundle == null ? null : {
|
|
194
212
|
...bundle,
|
|
195
213
|
files: preparationFiles(files),
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../../../../../src/compiler/index.ts"],
|
|
4
|
-
"sourcesContent": ["import {\n jsonValueSchema,\n type AgentManifestIface,\n type HarnessDescriptionIface,\n type JsonSchema,\n type ProviderRef,\n} from '@finalai/agent-provider';\nimport { sandboxPreparationInputs, sandboxSeedFiles } from '@finalai/agent-provider/sandbox';\nimport { basename, dirname } from 'node:path';\nimport * as z from 'zod';\nimport { compatibilityReport, type CompatibilityReportIface } from \"../compatibility.mjs\";\nimport { assemble } from \"./assemble.mjs\";\nimport { bundleAgent } from \"./bundle.mjs\";\nimport {\n diagnostic,\n DiagnosticCode,\n DiagnosticSeverity,\n hasErrors,\n type DiagnosticIface,\n} from \"./diagnostics.mjs\";\nimport { discover } from \"./discovery.mjs\";\nimport { evaluateBundle } from \"./evaluate.mjs\";\nimport { normalizeFiles, preparationFiles, readAgentDirectory } from \"./files.mjs\";\nimport { declaredDependencyDiagnostics, type VendoredPackageIface } from \"./packages.mjs\";\n\nexport type { CompatibilityReportIface } from \"../compatibility.mjs\";\nexport { DiagnosticCode, DiagnosticSeverity, hasErrors } from \"./diagnostics.mjs\";\nexport type { DiagnosticIface } from \"./diagnostics.mjs\";\nexport { discover } from \"./discovery.mjs\";\nexport { loadBundle } from \"./load.mjs\";\nexport type { LoadedBundleIface } from \"./load.mjs\";\nexport { loadBundleInLocalIsolate } from \"./local-isolate.mjs\";\nexport type { LocalIsolateOptionsIface } from \"./local-isolate.mjs\";\nexport {\n parsePackageJson,\n PLATFORM_PACKAGES,\n splitSpecifier,\n workspaceDependencies,\n WorkspaceDependencyKind,\n workspacePackageCandidates,\n workspacePackageGlobs,\n} from \"./packages.mjs\";\nexport type { VendoredPackageIface, WorkspaceDependencyIface } from \"./packages.mjs\";\n\nexport interface CompileOptionsIface {\n // An agent directory on disk (the repository's `agent/` directory)...\n dir?: string;\n // ...or its files, directory-relative (what Build reads from git).\n files?: Record<string, string>;\n // Optional modules supplied by the host when the author did not provide them.\n defaultFiles?: Readonly<Record<string, string>>;\n // Identity name when agent.ts sets none; defaults to the directory name.\n name?: string;\n // Looks up the chosen harness's description for the compatibility report.\n // A bundle harness is described from the bundle being compiled.\n harnessDescriptions?: (\n ref: ProviderRef,\n context: HarnessDescriptionContextIface,\n ) => Promise<HarnessDescriptionIface | null>;\n // This package's installed root, when the compiler runs from a bundle.\n packageRoot?: string;\n // Workspace packages from the agent's repository it imports, by name\n // (packages.ts); the platform passes them since it compiles without installing.\n packages?: Record<string, VendoredPackageIface>;\n // Authoring modules of the provider packages the host installed, by import\n // specifier \u2192 source file (`@finalai/daytona-agent-provider/sandboxes`), which\n // authored code may import though this package does not depend on them. A\n // compile of files without a checkout resolves packages from this package's\n // dependencies only.\n providerModules?: Readonly<Record<string, string>>;\n // Explicit provider defaults used to infer a dynamic sandbox target by name.\n installedSandboxProviders?: Readonly<Record<string, string>>;\n}\n\nexport interface HarnessDescriptionContextIface {\n // The compiled bundle; null when the definition has no authored modules.\n bundle: { hash: string; code: string } | null;\n}\n\nexport interface CompiledBundleIface {\n // Pinned workspace and skill files used by sandbox provider preparation.\n files?: Record<string, string>;\n hash: string;\n // One ESM module for the Worker isolate; exports `modules` and `runtime`.\n code: string;\n // Bundle export \u2192 directory-relative source path, for everything the\n // runtime calls (tools, channels, hooks, resolvers, selectors, providers).\n modules: Record<string, string>;\n // Target \u2192 bundle export of the sandbox.ts selector that opens it.\n sandboxOpeners: Record<string, string>;\n // Bundle channel export ('channels/github') \u2192 its routes, so the platform\n // shows route URLs without running the bundle.\n channelRoutes: Record<string, { method: string; path: string }[]>;\n}\n\nexport interface CompileResultIface {\n // Null when there are errors.\n manifest: AgentManifestIface | null;\n bundle: CompiledBundleIface | null;\n diagnostics: DiagnosticIface[];\n report: CompatibilityReportIface | null;\n}\n\nconst directoryName = (dir: string): string => {\n const name = basename(dir);\n return name === 'agent' ? basename(dirname(dir)) : name;\n};\n\nconst configObjectSchema = z.record(z.string(), jsonValueSchema);\nconst schemaPropertiesSchema = z.object({ properties: z.record(z.string(), jsonValueSchema) });\n\nconst withoutUndeclaredDirectoryFields = (args: {\n manifest: AgentManifestIface;\n configSchema: JsonSchema;\n directoryFields: { instructions: string[]; skills: string[] };\n diagnostics: DiagnosticIface[];\n}): AgentManifestIface => {\n const config = configObjectSchema.safeParse(args.manifest.harness.config);\n if (!config.success) return args.manifest;\n const declared = schemaPropertiesSchema.safeParse(args.configSchema);\n const properties = declared.success ? declared.data.properties : {};\n const next = { ...config.data };\n const fields: ['instructions' | 'skills', string[]][] = [\n ['instructions', args.directoryFields.instructions],\n ['skills', args.directoryFields.skills],\n ];\n for (const [field, sources] of fields) {\n if (sources.length === 0 || field in properties || !(field in next)) continue;\n delete next[field];\n args.diagnostics.push(\n diagnostic({\n severity: DiagnosticSeverity.Warning,\n code: DiagnosticCode.Compatibility,\n message: `the harness has no ${field} field, so ${sources.join(', ')} ${sources.length === 1 ? 'is' : 'are'} unused`,\n }),\n );\n }\n return { ...args.manifest, harness: { ...args.manifest.harness, config: next } };\n};\n\nexport const compile = async (options: CompileOptionsIface): Promise<CompileResultIface> => {\n const diagnostics: DiagnosticIface[] = [];\n const fail = (message: string): CompileResultIface => ({\n manifest: null,\n bundle: null,\n diagnostics: [\n ...diagnostics,\n diagnostic({ severity: DiagnosticSeverity.Error, code: DiagnosticCode.Input, message }),\n ],\n report: null,\n });\n let root: string | null = null;\n let rawFiles: Record<string, string>;\n if (options.dir != null) {\n if (options.files != null) return fail('pass either dir or files, not both');\n try {\n const read = await readAgentDirectory(options.dir);\n root = read.root;\n rawFiles = read.files;\n } catch (cause) {\n return fail(cause instanceof Error ? cause.message : String(cause));\n }\n } else if (options.files != null) rawFiles = options.files;\n else return fail('pass dir or files');\n const normalized = normalizeFiles(rawFiles);\n for (const problem of normalized.problems) {\n diagnostics.push(\n diagnostic({\n severity: DiagnosticSeverity.Error,\n code: DiagnosticCode.Input,\n message: problem.message,\n path: problem.path,\n }),\n );\n }\n const { files } = normalized;\n const defaultModuleKeys = new Set<string>();\n for (const [path, source] of Object.entries(options.defaultFiles ?? {})) {\n const stem = path.replace(/\\.(ts|mts|js|mjs)$/, '');\n if (!Object.keys(files).some((file) => file.replace(/\\.(ts|mts|js|mjs)$/, '') === stem)) {\n files[path] = source;\n defaultModuleKeys.add(stem.replace(/^channels\\//, ''));\n }\n }\n try {\n sandboxSeedFiles(sandboxPreparationInputs(files));\n } catch (cause) {\n return fail(cause instanceof Error ? cause.message : String(cause));\n }\n const packages: Record<string, VendoredPackageIface> = {};\n for (const [name, pkg] of Object.entries(options.packages ?? {})) {\n const vendored = normalizeFiles(pkg.files, { enforceSizeLimits: false });\n for (const problem of vendored.problems) {\n diagnostics.push(\n diagnostic({\n severity: DiagnosticSeverity.Error,\n code: DiagnosticCode.Input,\n message: `${name}: ${problem.message}`,\n path: problem.path,\n }),\n );\n }\n Object.defineProperty(packages, name, {\n value: { ...pkg, files: vendored.files },\n enumerable: true,\n configurable: true,\n writable: true,\n });\n }\n diagnostics.push(\n ...declaredDependencyDiagnostics({\n packageJson: files['package.json'],\n vendored: new Set(Object.keys(packages)),\n local: root != null,\n }),\n );\n const discovery = discover(Object.keys(files));\n\n let bundle: { hash: string; code: string } | null = null;\n let described = null;\n if (discovery.modules.length > 0) {\n const bundled = await bundleAgent({\n files,\n layout: discovery.modules,\n root,\n packageRoot: options.packageRoot,\n packages,\n providerModules: options.providerModules,\n });\n for (const problem of bundled.problems) {\n diagnostics.push(\n diagnostic({\n severity: DiagnosticSeverity.Error,\n code: problem.builtin ? DiagnosticCode.NodeBuiltin : DiagnosticCode.Bundle,\n message: problem.message,\n path: problem.path,\n }),\n );\n }\n if (bundled.code != null && bundled.hash != null) {\n bundle = { hash: bundled.hash, code: bundled.code };\n const evaluated = await evaluateBundle(bundled.code, { packageRoot: options.packageRoot });\n if (evaluated.ok) described = evaluated.described;\n else\n diagnostics.push(\n diagnostic({\n severity: DiagnosticSeverity.Error,\n code: DiagnosticCode.Evaluation,\n message: evaluated.message,\n }),\n );\n }\n }\n if (hasErrors(diagnostics)) return { manifest: null, bundle: null, diagnostics, report: null };\n\n const assembled = assemble({\n files,\n discovery,\n described,\n fallbackName:\n options.name ?? (options.dir == null ? 'agent' : directoryName(root ?? options.dir)),\n bundle,\n installedSandboxProviders: options.installedSandboxProviders,\n });\n if (assembled.manifest != null) {\n for (const key of defaultModuleKeys) {\n const source = assembled.manifest.channelSources?.[key];\n if (source != null) source.source = 'default';\n for (const channel of assembled.manifest.channels)\n if (channel.key === key) channel.source = 'default';\n }\n }\n diagnostics.push(...assembled.diagnostics);\n const manifest = assembled.manifest;\n const compiledBundle: CompiledBundleIface | null =\n manifest?.bundle == null || bundle == null\n ? null\n : {\n ...bundle,\n files: preparationFiles(files),\n modules: assembled.modules,\n sandboxOpeners: assembled.sandboxOpeners,\n channelRoutes: assembled.channelRoutes,\n };\n\n let report: CompatibilityReportIface | null = null;\n let finalManifest = manifest;\n if (manifest != null && options.harnessDescriptions != null) {\n const description = await options.harnessDescriptions(manifest.harness.harness, { bundle });\n if (description == null) {\n diagnostics.push(\n diagnostic({\n severity: DiagnosticSeverity.Warning,\n code: DiagnosticCode.Compatibility,\n message: 'the harness description is unavailable, so there is no compatibility report',\n }),\n );\n } else {\n report = compatibilityReport({\n manifest,\n description,\n directoryFiles: assembled.directoryFields,\n });\n // Directory instructions and skills fill harness config fields\n // only when the harness declares them; otherwise they are reported unused.\n finalManifest = withoutUndeclaredDirectoryFields({\n manifest,\n configSchema: description.configSchema,\n directoryFields: assembled.directoryFields,\n diagnostics,\n });\n }\n }\n return { manifest: finalManifest, bundle: compiledBundle, diagnostics, report };\n};\n"],
|
|
5
|
-
"mappings": "AAAA;AAAA,EACE;AAAA,
|
|
4
|
+
"sourcesContent": ["import {\n jsonValueSchema,\n type AgentManifestIface,\n type HostedBindingsIface,\n type HarnessDescriptionIface,\n type JsonSchema,\n type ProviderRef,\n} from '@finalai/agent-provider';\nimport { sandboxPreparationInputs, sandboxSeedFiles } from '@finalai/agent-provider/sandbox';\nimport { basename, dirname } from 'node:path';\nimport * as z from 'zod';\nimport { compatibilityReport, type CompatibilityReportIface } from \"../compatibility.mjs\";\nimport { assemble } from \"./assemble.mjs\";\nimport { validateHostedBindings } from \"../hosted-bindings.mjs\";\nimport { bundleAgent } from \"./bundle.mjs\";\nimport {\n diagnostic,\n DiagnosticCode,\n DiagnosticSeverity,\n hasErrors,\n type DiagnosticIface,\n} from \"./diagnostics.mjs\";\nimport { discover } from \"./discovery.mjs\";\nimport { evaluateBundle } from \"./evaluate.mjs\";\nimport { normalizeFiles, preparationFiles, readAgentDirectory } from \"./files.mjs\";\nimport { declaredDependencyDiagnostics, type VendoredPackageIface } from \"./packages.mjs\";\n\nexport type { CompatibilityReportIface } from \"../compatibility.mjs\";\nexport { DiagnosticCode, DiagnosticSeverity, hasErrors } from \"./diagnostics.mjs\";\nexport type { DiagnosticIface } from \"./diagnostics.mjs\";\nexport { discover } from \"./discovery.mjs\";\nexport { loadBundle } from \"./load.mjs\";\nexport type { LoadedBundleIface } from \"./load.mjs\";\nexport { loadBundleInLocalIsolate } from \"./local-isolate.mjs\";\nexport type { LocalIsolateOptionsIface } from \"./local-isolate.mjs\";\nexport {\n parsePackageJson,\n PLATFORM_PACKAGES,\n splitSpecifier,\n workspaceDependencies,\n WorkspaceDependencyKind,\n workspacePackageCandidates,\n workspacePackageGlobs,\n} from \"./packages.mjs\";\nexport type { VendoredPackageIface, WorkspaceDependencyIface } from \"./packages.mjs\";\n\nexport interface CompileOptionsIface {\n // An agent directory on disk (the repository's `agent/` directory)...\n dir?: string;\n // When supplied by hosting, validate declared requirements before release.\n hostedBindings?: HostedBindingsIface;\n // ...or its files, directory-relative (what Build reads from git).\n files?: Record<string, string>;\n // Optional modules supplied by the host when the author did not provide them.\n defaultFiles?: Readonly<Record<string, string>>;\n // Identity name when agent.ts sets none; defaults to the directory name.\n name?: string;\n // Looks up the chosen harness's description for the compatibility report.\n // A bundle harness is described from the bundle being compiled.\n harnessDescriptions?: (\n ref: ProviderRef,\n context: HarnessDescriptionContextIface,\n ) => Promise<HarnessDescriptionIface | null>;\n // This package's installed root, when the compiler runs from a bundle.\n packageRoot?: string;\n // Workspace packages from the agent's repository it imports, by name\n // (packages.ts); the platform passes them since it compiles without installing.\n packages?: Record<string, VendoredPackageIface>;\n // Authoring modules of the provider packages the host installed, by import\n // specifier \u2192 source file (`@finalai/daytona-agent-provider/sandboxes`), which\n // authored code may import though this package does not depend on them. A\n // compile of files without a checkout resolves packages from this package's\n // dependencies only.\n providerModules?: Readonly<Record<string, string>>;\n // Explicit provider defaults used to infer a dynamic sandbox target by name.\n installedSandboxProviders?: Readonly<Record<string, string>>;\n}\n\nexport interface HarnessDescriptionContextIface {\n // The compiled bundle; null when the definition has no authored modules.\n bundle: { hash: string; code: string } | null;\n}\n\nexport interface CompiledBundleIface {\n // Pinned workspace and skill files used by sandbox provider preparation.\n files?: Record<string, string>;\n hash: string;\n // One ESM module for the Worker isolate; exports `modules` and `runtime`.\n code: string;\n // Bundle export \u2192 directory-relative source path, for everything the\n // runtime calls (tools, channels, hooks, resolvers, selectors, providers).\n modules: Record<string, string>;\n // Target \u2192 bundle export of the sandbox.ts selector that opens it.\n sandboxOpeners: Record<string, string>;\n // Bundle channel export ('channels/github') \u2192 its routes, so the platform\n // shows route URLs without running the bundle.\n channelRoutes: Record<string, { method: string; path: string }[]>;\n}\n\nexport interface CompileResultIface {\n // Null when there are errors.\n manifest: AgentManifestIface | null;\n bundle: CompiledBundleIface | null;\n diagnostics: DiagnosticIface[];\n report: CompatibilityReportIface | null;\n}\n\nconst directoryName = (dir: string): string => {\n const name = basename(dir);\n return name === 'agent' ? basename(dirname(dir)) : name;\n};\n\nconst configObjectSchema = z.record(z.string(), jsonValueSchema);\nconst schemaPropertiesSchema = z.object({ properties: z.record(z.string(), jsonValueSchema) });\n\nconst withoutUndeclaredDirectoryFields = (args: {\n manifest: AgentManifestIface;\n configSchema: JsonSchema;\n directoryFields: { instructions: string[]; skills: string[] };\n diagnostics: DiagnosticIface[];\n}): AgentManifestIface => {\n const config = configObjectSchema.safeParse(args.manifest.harness.config);\n if (!config.success) return args.manifest;\n const declared = schemaPropertiesSchema.safeParse(args.configSchema);\n const properties = declared.success ? declared.data.properties : {};\n const next = { ...config.data };\n const fields: ['instructions' | 'skills', string[]][] = [\n ['instructions', args.directoryFields.instructions],\n ['skills', args.directoryFields.skills],\n ];\n for (const [field, sources] of fields) {\n if (sources.length === 0 || field in properties || !(field in next)) continue;\n delete next[field];\n args.diagnostics.push(\n diagnostic({\n severity: DiagnosticSeverity.Warning,\n code: DiagnosticCode.Compatibility,\n message: `the harness has no ${field} field, so ${sources.join(', ')} ${sources.length === 1 ? 'is' : 'are'} unused`,\n }),\n );\n }\n return { ...args.manifest, harness: { ...args.manifest.harness, config: next } };\n};\n\nexport const compile = async (options: CompileOptionsIface): Promise<CompileResultIface> => {\n const diagnostics: DiagnosticIface[] = [];\n const fail = (message: string): CompileResultIface => ({\n manifest: null,\n bundle: null,\n diagnostics: [\n ...diagnostics,\n diagnostic({ severity: DiagnosticSeverity.Error, code: DiagnosticCode.Input, message }),\n ],\n report: null,\n });\n let root: string | null = null;\n let rawFiles: Record<string, string>;\n if (options.dir != null) {\n if (options.files != null) return fail('pass either dir or files, not both');\n try {\n const read = await readAgentDirectory(options.dir);\n root = read.root;\n rawFiles = read.files;\n } catch (cause) {\n return fail(cause instanceof Error ? cause.message : String(cause));\n }\n } else if (options.files != null) rawFiles = options.files;\n else return fail('pass dir or files');\n const normalized = normalizeFiles(rawFiles);\n for (const problem of normalized.problems) {\n diagnostics.push(\n diagnostic({\n severity: DiagnosticSeverity.Error,\n code: DiagnosticCode.Input,\n message: problem.message,\n path: problem.path,\n }),\n );\n }\n const { files } = normalized;\n const defaultModuleKeys = new Set<string>();\n for (const [path, source] of Object.entries(options.defaultFiles ?? {})) {\n const stem = path.replace(/\\.(ts|mts|js|mjs)$/, '');\n if (!Object.keys(files).some((file) => file.replace(/\\.(ts|mts|js|mjs)$/, '') === stem)) {\n files[path] = source;\n defaultModuleKeys.add(stem.replace(/^channels\\//, ''));\n }\n }\n try {\n sandboxSeedFiles(sandboxPreparationInputs(files));\n } catch (cause) {\n return fail(cause instanceof Error ? cause.message : String(cause));\n }\n const packages: Record<string, VendoredPackageIface> = {};\n for (const [name, pkg] of Object.entries(options.packages ?? {})) {\n const vendored = normalizeFiles(pkg.files, { enforceSizeLimits: false });\n for (const problem of vendored.problems) {\n diagnostics.push(\n diagnostic({\n severity: DiagnosticSeverity.Error,\n code: DiagnosticCode.Input,\n message: `${name}: ${problem.message}`,\n path: problem.path,\n }),\n );\n }\n Object.defineProperty(packages, name, {\n value: { ...pkg, files: vendored.files },\n enumerable: true,\n configurable: true,\n writable: true,\n });\n }\n diagnostics.push(\n ...declaredDependencyDiagnostics({\n packageJson: files['package.json'],\n vendored: new Set(Object.keys(packages)),\n local: root != null,\n }),\n );\n const discovery = discover(Object.keys(files));\n\n let bundle: { hash: string; code: string } | null = null;\n let described = null;\n if (discovery.modules.length > 0) {\n const bundled = await bundleAgent({\n files,\n layout: discovery.modules,\n root,\n packageRoot: options.packageRoot,\n packages,\n providerModules: options.providerModules,\n });\n for (const problem of bundled.problems) {\n diagnostics.push(\n diagnostic({\n severity: DiagnosticSeverity.Error,\n code: problem.builtin ? DiagnosticCode.NodeBuiltin : DiagnosticCode.Bundle,\n message: problem.message,\n path: problem.path,\n }),\n );\n }\n if (bundled.code != null && bundled.hash != null) {\n bundle = { hash: bundled.hash, code: bundled.code };\n const evaluated = await evaluateBundle(bundled.code, { packageRoot: options.packageRoot });\n if (evaluated.ok) described = evaluated.described;\n else\n diagnostics.push(\n diagnostic({\n severity: DiagnosticSeverity.Error,\n code: DiagnosticCode.Evaluation,\n message: evaluated.message,\n }),\n );\n }\n }\n if (hasErrors(diagnostics)) return { manifest: null, bundle: null, diagnostics, report: null };\n\n const assembled = assemble({\n files,\n discovery,\n described,\n fallbackName:\n options.name ?? (options.dir == null ? 'agent' : directoryName(root ?? options.dir)),\n bundle,\n installedSandboxProviders: options.installedSandboxProviders,\n });\n if (assembled.manifest != null) {\n for (const key of defaultModuleKeys) {\n const source = assembled.manifest.channelSources?.[key];\n if (source != null) source.source = 'default';\n for (const channel of assembled.manifest.channels)\n if (channel.key === key) channel.source = 'default';\n }\n }\n diagnostics.push(...assembled.diagnostics);\n const manifest = assembled.manifest;\n if (manifest != null && options.hostedBindings != null) {\n try {\n await validateHostedBindings({\n manifest,\n bindings: options.hostedBindings,\n });\n } catch (error) {\n diagnostics.push(\n diagnostic({\n severity: DiagnosticSeverity.Error,\n code: DiagnosticCode.Connections,\n message: error instanceof Error ? error.message : String(error),\n }),\n );\n return { manifest: null, bundle: null, diagnostics, report: null };\n }\n }\n const compiledBundle: CompiledBundleIface | null =\n manifest?.bundle == null || bundle == null\n ? null\n : {\n ...bundle,\n files: preparationFiles(files),\n modules: assembled.modules,\n sandboxOpeners: assembled.sandboxOpeners,\n channelRoutes: assembled.channelRoutes,\n };\n\n let report: CompatibilityReportIface | null = null;\n let finalManifest = manifest;\n if (manifest != null && options.harnessDescriptions != null) {\n const description = await options.harnessDescriptions(manifest.harness.harness, { bundle });\n if (description == null) {\n diagnostics.push(\n diagnostic({\n severity: DiagnosticSeverity.Warning,\n code: DiagnosticCode.Compatibility,\n message: 'the harness description is unavailable, so there is no compatibility report',\n }),\n );\n } else {\n report = compatibilityReport({\n manifest,\n description,\n directoryFiles: assembled.directoryFields,\n });\n // Directory instructions and skills fill harness config fields\n // only when the harness declares them; otherwise they are reported unused.\n finalManifest = withoutUndeclaredDirectoryFields({\n manifest,\n configSchema: description.configSchema,\n directoryFields: assembled.directoryFields,\n diagnostics,\n });\n }\n }\n return { manifest: finalManifest, bundle: compiledBundle, diagnostics, report };\n};\n"],
|
|
5
|
+
"mappings": "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",
|
|
6
6
|
"names": ["DiagnosticCode", "DiagnosticSeverity", "hasErrors", "discover"]
|
|
7
7
|
}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { type JsonValue, type SandboxOpener, type SecretReaderIface } from '@finalai/agent-provider';
|
|
1
|
+
import { type HostedBindingsIface, type JsonValue, type SandboxOpener, type SecretReaderIface } from '@finalai/agent-provider';
|
|
2
2
|
import type { AgentSessionInfoIface } from "../authoring/context.mjs";
|
|
3
3
|
import { type LoadedBundleIface } from "./load.mjs";
|
|
4
4
|
export interface LocalIsolateOptionsIface {
|
|
@@ -14,6 +14,7 @@ export interface LocalIsolateBundleIface extends LoadedBundleIface {
|
|
|
14
14
|
exportName: string;
|
|
15
15
|
session: AgentSessionInfoIface;
|
|
16
16
|
secrets: SecretReaderIface;
|
|
17
|
+
bindings?: HostedBindingsIface;
|
|
17
18
|
open: SandboxOpener;
|
|
18
19
|
}): Promise<void>;
|
|
19
20
|
}
|
|
@@ -71,7 +71,12 @@ const loadBundleInLocalIsolate = async (code, options = {}) => {
|
|
|
71
71
|
if (!selector.success) throw new Error(`${args.exportName} is not a sandbox selector`);
|
|
72
72
|
await withSandboxOpener(
|
|
73
73
|
args.open,
|
|
74
|
-
() => selector.data({
|
|
74
|
+
() => selector.data({
|
|
75
|
+
session: args.session,
|
|
76
|
+
secrets: args.secrets,
|
|
77
|
+
bindings: args.bindings,
|
|
78
|
+
open: args.open
|
|
79
|
+
})
|
|
75
80
|
);
|
|
76
81
|
},
|
|
77
82
|
callExportMethod: async (args) => {
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../../../../../src/compiler/local-isolate.ts"],
|
|
4
|
-
"sourcesContent": ["import {\n jsonValueSchema,\n type JsonValue,\n type SandboxOpener,\n type SecretReaderIface,\n} from '@finalai/agent-provider';\nimport {\n installSandboxOpenScope,\n withSandboxOpener,\n} from '@finalai/agent-provider/sandbox/open-scope-node';\nimport { transform } from 'esbuild';\nimport vm from 'node:vm';\nimport * as z from 'zod';\nimport type { AgentSessionInfoIface } from \"../authoring/context.mjs\";\nimport { callableSchema } from \"../runtime/values.mjs\";\nimport { parseLoadedBundle, type LoadedBundleIface } from \"./load.mjs\";\n\n// A local stand-in for the Worker isolate (agent-harness-workers) that runs a\n// compiled bundle for `final agents dev` and `final agents build`: its own\n// realm with only the Web platform globals a Worker has (fetch,\n// Request/Response, crypto, timers, streams), no Node built-ins and no\n// `process`. node:vm is not a security boundary; this runs the author's own\n// code on the author's machine.\n\nconst GLOBAL_NAME = '__finalAgentBundle';\n\nexport interface LocalIsolateOptionsIface {\n // Replaces the realm's fetch (tests, or a proxy for outbound requests).\n fetch?: typeof fetch;\n}\n\nexport interface LocalIsolateBundleIface extends LoadedBundleIface {\n // Calls `<export>.<method>(...args)` inside the realm with JSON arguments\n // and returns its JSON result: a bundle harness's describe, for example.\n callExportMethod(args: {\n exportName: string;\n method: string;\n args: JsonValue[];\n }): Promise<JsonValue>;\n // Runs sandbox.ts's default selector the way the Worker isolate does:\n // `open` (and awaiting an environment's `open(...)` inside it) reaches the\n // target through `args.open`.\n runSandboxSelector(args: {\n exportName: string;\n session: AgentSessionInfoIface;\n secrets: SecretReaderIface;\n open: SandboxOpener;\n }): Promise<void>;\n}\n\nconst workerGlobals = (options: LocalIsolateOptionsIface) => ({\n fetch: options.fetch ?? fetch,\n Request,\n Response,\n Headers,\n FormData,\n Blob,\n File,\n URL,\n URLSearchParams,\n TextEncoder,\n TextDecoder,\n AbortController,\n AbortSignal,\n ReadableStream,\n WritableStream,\n TransformStream,\n EventTarget,\n Event,\n WebSocket,\n crypto,\n performance,\n structuredClone,\n atob,\n btoa,\n queueMicrotask,\n setTimeout,\n clearTimeout,\n setInterval,\n clearInterval,\n console,\n});\n\nconst resultTextSchema = z.string();\n\nexport const loadBundleInLocalIsolate = async (\n code: string,\n options: LocalIsolateOptionsIface = {},\n): Promise<LocalIsolateBundleIface> => {\n const converted = await transform(code, {\n format: 'iife',\n globalName: GLOBAL_NAME,\n loader: 'js',\n target: 'es2024',\n });\n const context = vm.createContext(workerGlobals(options), {\n name: 'final-agent-dev',\n codeGeneration: { strings: false, wasm: false },\n });\n installSandboxOpenScope(context);\n const namespace = z.unknown().parse(\n vm.runInContext(`${converted.code}\\n;${GLOBAL_NAME};`, context, {\n filename: 'agent-bundle.js',\n timeout: 10_000,\n }),\n );\n const loaded = parseLoadedBundle(namespace);\n return {\n ...loaded,\n runSandboxSelector: async (args) => {\n const selector = callableSchema.safeParse(loaded.modules[args.exportName]);\n if (!selector.success) throw new Error(`${args.exportName} is not a sandbox selector`);\n await withSandboxOpener(args.open, () =>\n selector.data({
|
|
5
|
-
"mappings": "AAAA;AAAA,EACE;AAAA,
|
|
4
|
+
"sourcesContent": ["import {\n jsonValueSchema,\n type HostedBindingsIface,\n type JsonValue,\n type SandboxOpener,\n type SecretReaderIface,\n} from '@finalai/agent-provider';\nimport {\n installSandboxOpenScope,\n withSandboxOpener,\n} from '@finalai/agent-provider/sandbox/open-scope-node';\nimport { transform } from 'esbuild';\nimport vm from 'node:vm';\nimport * as z from 'zod';\nimport type { AgentSessionInfoIface } from \"../authoring/context.mjs\";\nimport { callableSchema } from \"../runtime/values.mjs\";\nimport { parseLoadedBundle, type LoadedBundleIface } from \"./load.mjs\";\n\n// A local stand-in for the Worker isolate (agent-harness-workers) that runs a\n// compiled bundle for `final agents dev` and `final agents build`: its own\n// realm with only the Web platform globals a Worker has (fetch,\n// Request/Response, crypto, timers, streams), no Node built-ins and no\n// `process`. node:vm is not a security boundary; this runs the author's own\n// code on the author's machine.\n\nconst GLOBAL_NAME = '__finalAgentBundle';\n\nexport interface LocalIsolateOptionsIface {\n // Replaces the realm's fetch (tests, or a proxy for outbound requests).\n fetch?: typeof fetch;\n}\n\nexport interface LocalIsolateBundleIface extends LoadedBundleIface {\n // Calls `<export>.<method>(...args)` inside the realm with JSON arguments\n // and returns its JSON result: a bundle harness's describe, for example.\n callExportMethod(args: {\n exportName: string;\n method: string;\n args: JsonValue[];\n }): Promise<JsonValue>;\n // Runs sandbox.ts's default selector the way the Worker isolate does:\n // `open` (and awaiting an environment's `open(...)` inside it) reaches the\n // target through `args.open`.\n runSandboxSelector(args: {\n exportName: string;\n session: AgentSessionInfoIface;\n secrets: SecretReaderIface;\n bindings?: HostedBindingsIface;\n open: SandboxOpener;\n }): Promise<void>;\n}\n\nconst workerGlobals = (options: LocalIsolateOptionsIface) => ({\n fetch: options.fetch ?? fetch,\n Request,\n Response,\n Headers,\n FormData,\n Blob,\n File,\n URL,\n URLSearchParams,\n TextEncoder,\n TextDecoder,\n AbortController,\n AbortSignal,\n ReadableStream,\n WritableStream,\n TransformStream,\n EventTarget,\n Event,\n WebSocket,\n crypto,\n performance,\n structuredClone,\n atob,\n btoa,\n queueMicrotask,\n setTimeout,\n clearTimeout,\n setInterval,\n clearInterval,\n console,\n});\n\nconst resultTextSchema = z.string();\n\nexport const loadBundleInLocalIsolate = async (\n code: string,\n options: LocalIsolateOptionsIface = {},\n): Promise<LocalIsolateBundleIface> => {\n const converted = await transform(code, {\n format: 'iife',\n globalName: GLOBAL_NAME,\n loader: 'js',\n target: 'es2024',\n });\n const context = vm.createContext(workerGlobals(options), {\n name: 'final-agent-dev',\n codeGeneration: { strings: false, wasm: false },\n });\n installSandboxOpenScope(context);\n const namespace = z.unknown().parse(\n vm.runInContext(`${converted.code}\\n;${GLOBAL_NAME};`, context, {\n filename: 'agent-bundle.js',\n timeout: 10_000,\n }),\n );\n const loaded = parseLoadedBundle(namespace);\n return {\n ...loaded,\n runSandboxSelector: async (args) => {\n const selector = callableSchema.safeParse(loaded.modules[args.exportName]);\n if (!selector.success) throw new Error(`${args.exportName} is not a sandbox selector`);\n await withSandboxOpener(args.open, () =>\n selector.data({\n session: args.session,\n secrets: args.secrets,\n bindings: args.bindings,\n open: args.open,\n }),\n );\n },\n callExportMethod: async (args) => {\n // The names and arguments are embedded as JSON literals; the call runs in\n // the realm, so authored values never cross into this one.\n const script = `(async () => {\n const target = ${GLOBAL_NAME}.modules[${JSON.stringify(args.exportName)}];\n const method = target == null ? undefined : target[${JSON.stringify(args.method)}];\n if (typeof method !== 'function') throw new Error(${JSON.stringify(`${args.exportName} has no ${args.method}`)});\n return JSON.stringify((await method.apply(target, ${JSON.stringify(args.args)})) ?? null);\n })()`;\n const pending = z.unknown().parse(vm.runInContext(script, context, { timeout: 10_000 }));\n const text = resultTextSchema.parse(await pending);\n return jsonValueSchema.parse(JSON.parse(text));\n },\n };\n};\n"],
|
|
5
|
+
"mappings": "AAAA;AAAA,EACE;AAAA,OAKK;AACP;AAAA,EACE;AAAA,EACA;AAAA,OACK;AACP,SAAS,iBAAiB;AAC1B,OAAO,QAAQ;AACf,YAAY,OAAO;AAEnB,SAAS,sBAAsB;AAC/B,SAAS,yBAAiD;AAS1D,MAAM,cAAc;AA2BpB,MAAM,gBAAgB,CAAC,aAAuC;AAAA,EAC5D,OAAO,QAAQ,SAAS;AAAA,EACxB;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF;AAEA,MAAM,mBAAmB,EAAE,OAAO;AAE3B,MAAM,2BAA2B,OACtC,MACA,UAAoC,CAAC,MACA;AACrC,QAAM,YAAY,MAAM,UAAU,MAAM;AAAA,IACtC,QAAQ;AAAA,IACR,YAAY;AAAA,IACZ,QAAQ;AAAA,IACR,QAAQ;AAAA,EACV,CAAC;AACD,QAAM,UAAU,GAAG,cAAc,cAAc,OAAO,GAAG;AAAA,IACvD,MAAM;AAAA,IACN,gBAAgB,EAAE,SAAS,OAAO,MAAM,MAAM;AAAA,EAChD,CAAC;AACD,0BAAwB,OAAO;AAC/B,QAAM,YAAY,EAAE,QAAQ,EAAE;AAAA,IAC5B,GAAG,aAAa,GAAG,UAAU,IAAI;AAAA,GAAM,WAAW,KAAK,SAAS;AAAA,MAC9D,UAAU;AAAA,MACV,SAAS;AAAA,IACX,CAAC;AAAA,EACH;AACA,QAAM,SAAS,kBAAkB,SAAS;AAC1C,SAAO;AAAA,IACL,GAAG;AAAA,IACH,oBAAoB,OAAO,SAAS;AAClC,YAAM,WAAW,eAAe,UAAU,OAAO,QAAQ,KAAK,UAAU,CAAC;AACzE,UAAI,CAAC,SAAS,QAAS,OAAM,IAAI,MAAM,GAAG,KAAK,UAAU,4BAA4B;AACrF,YAAM;AAAA,QAAkB,KAAK;AAAA,QAAM,MACjC,SAAS,KAAK;AAAA,UACZ,SAAS,KAAK;AAAA,UACd,SAAS,KAAK;AAAA,UACd,UAAU,KAAK;AAAA,UACf,MAAM,KAAK;AAAA,QACb,CAAC;AAAA,MACH;AAAA,IACF;AAAA,IACA,kBAAkB,OAAO,SAAS;AAGhC,YAAM,SAAS;AAAA,yBACI,WAAW,YAAY,KAAK,UAAU,KAAK,UAAU,CAAC;AAAA,6DAClB,KAAK,UAAU,KAAK,MAAM,CAAC;AAAA,4DAC5B,KAAK,UAAU,GAAG,KAAK,UAAU,WAAW,KAAK,MAAM,EAAE,CAAC;AAAA,4DAC1D,KAAK,UAAU,KAAK,IAAI,CAAC;AAAA;AAE/E,YAAM,UAAU,EAAE,QAAQ,EAAE,MAAM,GAAG,aAAa,QAAQ,SAAS,EAAE,SAAS,IAAO,CAAC,CAAC;AACvF,YAAM,OAAO,iBAAiB,MAAM,MAAM,OAAO;AACjD,aAAO,gBAAgB,MAAM,KAAK,MAAM,IAAI,CAAC;AAAA,IAC/C;AAAA,EACF;AACF;",
|
|
6
6
|
"names": []
|
|
7
7
|
}
|