@finalai/agents 0.11.0 → 0.13.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (188) hide show
  1. package/HOSTING.md +334 -245
  2. package/README.md +214 -29
  3. package/dist/modules/agent-client/agent-input.d.mts +24 -0
  4. package/dist/modules/agent-client/agent-input.mjs +46 -0
  5. package/dist/modules/agent-client/agent-input.mjs.map +7 -0
  6. package/dist/modules/agent-client/channels.d.mts +128 -16
  7. package/dist/modules/agent-client/channels.mjs +216 -33
  8. package/dist/modules/agent-client/channels.mjs.map +2 -2
  9. package/dist/modules/agent-client/client.d.mts +91 -21
  10. package/dist/modules/agent-client/client.mjs +79 -24
  11. package/dist/modules/agent-client/client.mjs.map +2 -2
  12. package/dist/modules/agent-client/config-options.mjs +1 -2
  13. package/dist/modules/agent-client/config-options.mjs.map +2 -2
  14. package/dist/modules/agent-client/conversation-resources.d.mts +102 -0
  15. package/dist/modules/agent-client/conversation-resources.mjs +178 -0
  16. package/dist/modules/agent-client/conversation-resources.mjs.map +7 -0
  17. package/dist/modules/agent-client/conversations.d.mts +120 -38
  18. package/dist/modules/agent-client/conversations.mjs +386 -71
  19. package/dist/modules/agent-client/conversations.mjs.map +2 -2
  20. package/dist/modules/agent-client/defaults.d.mts +8 -0
  21. package/dist/modules/agent-client/defaults.mjs +77 -0
  22. package/dist/modules/agent-client/defaults.mjs.map +7 -0
  23. package/dist/modules/agent-client/errors.d.mts +22 -2
  24. package/dist/modules/agent-client/errors.mjs +19 -0
  25. package/dist/modules/agent-client/errors.mjs.map +2 -2
  26. package/dist/modules/agent-client/events.d.mts +62 -0
  27. package/dist/modules/agent-client/events.mjs +107 -0
  28. package/dist/modules/agent-client/events.mjs.map +7 -0
  29. package/dist/modules/agent-client/harnesses.d.mts +66 -0
  30. package/dist/modules/agent-client/harnesses.mjs +156 -0
  31. package/dist/modules/agent-client/harnesses.mjs.map +7 -0
  32. package/dist/modules/agent-client/http.d.mts +2 -1
  33. package/dist/modules/agent-client/http.mjs +21 -2
  34. package/dist/modules/agent-client/http.mjs.map +2 -2
  35. package/dist/modules/agent-client/index.d.mts +21 -6
  36. package/dist/modules/agent-client/index.mjs +26 -0
  37. package/dist/modules/agent-client/index.mjs.map +2 -2
  38. package/dist/modules/agent-client/integrations.d.mts +40 -0
  39. package/dist/modules/agent-client/integrations.mjs +92 -0
  40. package/dist/modules/agent-client/integrations.mjs.map +7 -0
  41. package/dist/modules/agent-client/local-host-protocol.d.mts +156 -0
  42. package/dist/modules/agent-client/local-host-protocol.mjs +258 -0
  43. package/dist/modules/agent-client/local-host-protocol.mjs.map +7 -0
  44. package/dist/modules/agent-client/local-host.d.mts +56 -0
  45. package/dist/modules/agent-client/local-host.mjs +200 -0
  46. package/dist/modules/agent-client/local-host.mjs.map +7 -0
  47. package/dist/modules/agent-client/oauth-clients.d.mts +36 -0
  48. package/dist/modules/agent-client/oauth-clients.mjs +67 -0
  49. package/dist/modules/agent-client/oauth-clients.mjs.map +7 -0
  50. package/dist/modules/agent-client/project-agents.d.mts +54 -0
  51. package/dist/modules/agent-client/project-agents.mjs +111 -0
  52. package/dist/modules/agent-client/project-agents.mjs.map +7 -0
  53. package/dist/modules/agent-client/project.d.mts +48 -0
  54. package/dist/modules/agent-client/project.mjs +66 -0
  55. package/dist/modules/agent-client/project.mjs.map +7 -0
  56. package/dist/modules/agent-client/projects.d.mts +61 -0
  57. package/dist/modules/agent-client/projects.mjs +145 -0
  58. package/dist/modules/agent-client/projects.mjs.map +7 -0
  59. package/dist/modules/agent-client/provide.d.mts +41 -0
  60. package/dist/modules/agent-client/provide.mjs +90 -0
  61. package/dist/modules/agent-client/provide.mjs.map +7 -0
  62. package/dist/modules/agent-client/publishers.d.mts +57 -0
  63. package/dist/modules/agent-client/publishers.mjs +109 -0
  64. package/dist/modules/agent-client/publishers.mjs.map +7 -0
  65. package/dist/modules/agent-client/requirements.d.mts +60 -0
  66. package/dist/modules/agent-client/requirements.mjs +83 -0
  67. package/dist/modules/agent-client/requirements.mjs.map +7 -0
  68. package/dist/modules/agent-client/sandbox-providers.d.mts +34 -0
  69. package/dist/modules/agent-client/sandbox-providers.mjs +75 -0
  70. package/dist/modules/agent-client/sandbox-providers.mjs.map +7 -0
  71. package/dist/modules/agent-client/sandbox-uri.d.mts +1 -1
  72. package/dist/modules/agent-client/sandbox-uri.mjs +4 -4
  73. package/dist/modules/agent-client/sandbox-uri.mjs.map +1 -1
  74. package/dist/modules/agent-client/sandboxes.d.mts +72 -0
  75. package/dist/modules/agent-client/sandboxes.mjs +138 -0
  76. package/dist/modules/agent-client/sandboxes.mjs.map +7 -0
  77. package/dist/modules/agent-client/schedules.d.mts +9 -0
  78. package/dist/modules/agent-client/schedules.mjs +17 -0
  79. package/dist/modules/agent-client/schedules.mjs.map +7 -0
  80. package/dist/modules/agent-client/sessions.d.mts +46 -8
  81. package/dist/modules/agent-client/sessions.mjs +91 -29
  82. package/dist/modules/agent-client/sessions.mjs.map +2 -2
  83. package/dist/modules/agent-client/start.d.mts +101 -0
  84. package/dist/modules/agent-client/start.mjs +260 -0
  85. package/dist/modules/agent-client/start.mjs.map +7 -0
  86. package/dist/modules/agent-client/test-fakes.d.mts +1 -0
  87. package/dist/modules/agent-client/test-fakes.mjs +3 -1
  88. package/dist/modules/agent-client/test-fakes.mjs.map +2 -2
  89. package/dist/modules/cli/agent-module.d.mts +39 -0
  90. package/dist/modules/cli/agent-module.mjs +89 -0
  91. package/dist/modules/cli/agent-module.mjs.map +7 -0
  92. package/dist/modules/cli/cli.d.mts +6 -6
  93. package/dist/modules/cli/cli.mjs +94 -120
  94. package/dist/modules/cli/cli.mjs.map +2 -2
  95. package/dist/modules/cli/conformance.d.mts +2 -6
  96. package/dist/modules/cli/conformance.mjs +5 -8
  97. package/dist/modules/cli/conformance.mjs.map +2 -2
  98. package/dist/modules/cli/main.mjs.map +1 -1
  99. package/dist/modules/cli/output.d.mts +0 -9
  100. package/dist/modules/cli/output.mjs +7 -85
  101. package/dist/modules/cli/output.mjs.map +2 -2
  102. package/dist/modules/harnesses.mjs.map +2 -2
  103. package/dist/modules/index.d.mts +0 -2
  104. package/dist/modules/index.mjs +0 -4
  105. package/dist/modules/index.mjs.map +2 -2
  106. package/dist/modules/integrations.d.mts +24 -0
  107. package/dist/modules/integrations.mjs +30 -0
  108. package/dist/modules/integrations.mjs.map +7 -0
  109. package/dist/modules/public.d.mts +10 -10
  110. package/dist/modules/public.mjs +29 -78
  111. package/dist/modules/public.mjs.map +2 -2
  112. package/dist/modules/sandboxes.d.mts +2 -0
  113. package/dist/modules/sandboxes.mjs +4 -0
  114. package/dist/modules/sandboxes.mjs.map +2 -2
  115. package/dist/modules/verify.d.mts +1 -0
  116. package/dist/modules/verify.mjs +2 -0
  117. package/dist/modules/verify.mjs.map +7 -0
  118. package/dist/modules/webhooks.d.mts +37 -0
  119. package/dist/modules/webhooks.mjs +100 -0
  120. package/dist/modules/webhooks.mjs.map +7 -0
  121. package/examples/release-scout/README.md +18 -10
  122. package/examples/release-scout/agent.ts +41 -0
  123. package/examples/release-scout/by-name.ts +43 -0
  124. package/examples/release-scout/db.ts +6 -0
  125. package/examples/release-scout/instructions.md +5 -0
  126. package/examples/release-scout/run-on-a-computer.ts +49 -0
  127. package/examples/release-scout/run.ts +38 -0
  128. package/package.json +37 -28
  129. package/dist/modules/agent-client/build.d.mts +0 -110
  130. package/dist/modules/agent-client/build.mjs +0 -213
  131. package/dist/modules/agent-client/build.mjs.map +0 -7
  132. package/dist/modules/authoring/final-channel.d.mts +0 -1
  133. package/dist/modules/authoring/final-channel.mjs +0 -2
  134. package/dist/modules/authoring/final-channel.mjs.map +0 -7
  135. package/dist/modules/authoring/index.d.mts +0 -1
  136. package/dist/modules/authoring/index.mjs +0 -2
  137. package/dist/modules/authoring/index.mjs.map +0 -7
  138. package/dist/modules/authoring/instructions.d.mts +0 -1
  139. package/dist/modules/authoring/instructions.mjs +0 -2
  140. package/dist/modules/authoring/instructions.mjs.map +0 -7
  141. package/dist/modules/authoring/providers.d.mts +0 -2
  142. package/dist/modules/authoring/providers.mjs +0 -1
  143. package/dist/modules/authoring/providers.mjs.map +0 -7
  144. package/dist/modules/cli/build.d.mts +0 -22
  145. package/dist/modules/cli/build.mjs +0 -77
  146. package/dist/modules/cli/build.mjs.map +0 -7
  147. package/dist/modules/cli/channel-install.d.mts +0 -12
  148. package/dist/modules/cli/channel-install.mjs +0 -25
  149. package/dist/modules/cli/channel-install.mjs.map +0 -7
  150. package/dist/modules/cli/channel-socket.d.mts +0 -9
  151. package/dist/modules/cli/channel-socket.mjs +0 -114
  152. package/dist/modules/cli/channel-socket.mjs.map +0 -7
  153. package/dist/modules/cli/dev.d.mts +0 -26
  154. package/dist/modules/cli/dev.mjs +0 -311
  155. package/dist/modules/cli/dev.mjs.map +0 -7
  156. package/dist/modules/cli/files.d.mts +0 -18
  157. package/dist/modules/cli/files.mjs +0 -66
  158. package/dist/modules/cli/files.mjs.map +0 -7
  159. package/dist/modules/cli/harness-descriptions.d.mts +0 -20
  160. package/dist/modules/cli/harness-descriptions.mjs +0 -70
  161. package/dist/modules/cli/harness-descriptions.mjs.map +0 -7
  162. package/dist/modules/cli/publish.d.mts +0 -15
  163. package/dist/modules/cli/publish.mjs +0 -92
  164. package/dist/modules/cli/publish.mjs.map +0 -7
  165. package/dist/modules/compile.d.mts +0 -3
  166. package/dist/modules/compile.mjs +0 -58
  167. package/dist/modules/compile.mjs.map +0 -7
  168. package/dist/modules/index.browser.d.mts +0 -4
  169. package/dist/modules/index.browser.mjs +0 -8
  170. package/dist/modules/index.browser.mjs.map +0 -7
  171. package/examples/custom-harness/README.md +0 -16
  172. package/examples/custom-harness/agent.ts +0 -154
  173. package/examples/custom-sandbox/README.md +0 -12
  174. package/examples/custom-sandbox/agent.ts +0 -14
  175. package/examples/custom-sandbox/sandbox.ts +0 -24
  176. package/examples/release-scout/agent/agent.ts +0 -22
  177. package/examples/release-scout/agent/channels/github-signature.ts +0 -27
  178. package/examples/release-scout/agent/channels/github.ts +0 -32
  179. package/examples/release-scout/agent/connections/linear.ts +0 -9
  180. package/examples/release-scout/agent/hooks/audit.ts +0 -24
  181. package/examples/release-scout/agent/instructions/org-context.ts +0 -26
  182. package/examples/release-scout/agent/instructions.md +0 -2
  183. package/examples/release-scout/agent/sandbox.ts +0 -20
  184. package/examples/release-scout/agent/schedules/daily-digest.md +0 -7
  185. package/examples/release-scout/agent/skills/triage/SKILL.md +0 -8
  186. package/examples/release-scout/agent/skills/triage/checklist.md +0 -3
  187. package/examples/release-scout/agent/tools/lookup_release_notes.ts +0 -24
  188. package/examples/release-scout/client.ts +0 -122
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../../../../src/agent-client/publishers.ts"],
4
+ "sourcesContent": ["import {\n acpAdapterDefinitionListSchema,\n agentListSchema,\n channelListSchema,\n claimPublisherRequestSchema,\n harnessDefinitionListSchema,\n okResponseSchema,\n publicNameSchema,\n publisherSchema,\n publishNameRequestSchema,\n type AcpAdapterDefinitionSummaryIface,\n type AgentListIface,\n type ChannelIface,\n type HarnessDefinitionSummaryIface,\n type PublicNameIface,\n type PublicNameKind,\n type PublisherIface,\n} from '@finalai/agent-protocol/agent-platform';\nimport {\n encodePath,\n type ClientContextIface,\n type EnumInput,\n type SignalOptionsIface,\n} from \"./context.mjs\";\nimport { HttpMethod } from \"./http.mjs\";\n\n// Publishers: a project's one handle, under which the names it makes public\n// resolve as `handle/name` from any organization.\n\nexport interface ProjectPublisherApiIface {\n /** Claims the project's handle: first come, once per project, never changed. */\n claim: (args: { handle: string } & SignalOptionsIface) => Promise<PublisherIface>;\n /** The project's handle; fails with `not_found` before one is claimed. */\n get: (options?: SignalOptionsIface) => Promise<PublisherIface>;\n}\n\nexport interface PublicNamesApiIface {\n /**\n * Makes a name the project published resolvable as `handle/name`; every later\n * publication under it is public too. Needs the project's publisher handle.\n */\n publish: (\n args: { kind: EnumInput<PublicNameKind>; name: string } & SignalOptionsIface,\n ) => Promise<PublicNameIface>;\n /** Withdraws a public name; `handle/name` stops resolving. */\n withdraw: (\n args: { kind: EnumInput<PublicNameKind>; name: string } & SignalOptionsIface,\n ) => Promise<void>;\n}\n\nexport interface PublisherHandleIface {\n readonly handle: string;\n info: (options?: SignalOptionsIface) => Promise<PublisherIface>;\n agents: {\n list: (\n options?: SignalOptionsIface & { cursor?: string; limit?: number },\n ) => Promise<AgentListIface>;\n };\n channels: { list: (options?: SignalOptionsIface) => Promise<ChannelIface[]> };\n harnesses: { list: (options?: SignalOptionsIface) => Promise<HarnessDefinitionSummaryIface[]> };\n adapters: {\n list: (options?: SignalOptionsIface) => Promise<AcpAdapterDefinitionSummaryIface[]>;\n };\n}\n\nexport interface PublishersApiIface {\n /** A publisher's public names (I/O-free handle). */\n get: (handle: string) => PublisherHandleIface;\n}\n\nexport const createProjectPublisherApi = (args: {\n context: ClientContextIface;\n projectId: string;\n}): ProjectPublisherApiIface => {\n const { http } = args.context;\n const path = `/v1/projects/${encodePath(args.projectId)}/publisher`;\n return {\n claim: ({ handle, signal }) =>\n http.request({\n method: HttpMethod.Put,\n path,\n body: { schema: claimPublisherRequestSchema, value: { handle } },\n response: publisherSchema,\n signal,\n }),\n get: (options) =>\n http.request({\n method: HttpMethod.Get,\n path,\n response: publisherSchema,\n signal: options?.signal,\n }),\n };\n};\n\nexport const createPublicNamesApi = (args: {\n context: ClientContextIface;\n projectId: string;\n}): PublicNamesApiIface => {\n const { http } = args.context;\n const path = (kind: string, name: string): string =>\n `/v1/projects/${encodePath(args.projectId)}/public-names/${encodePath(kind)}/${encodePath(name)}`;\n return {\n publish: ({ kind, name, signal }) =>\n http.request({\n method: HttpMethod.Put,\n path: path(kind, name),\n body: { schema: publishNameRequestSchema, value: {} },\n response: publicNameSchema,\n signal,\n }),\n withdraw: async ({ kind, name, signal }) => {\n await http.request({\n method: HttpMethod.Delete,\n path: path(kind, name),\n response: okResponseSchema,\n signal,\n });\n },\n };\n};\n\nexport const createPublishersApi = (context: ClientContextIface): PublishersApiIface => ({\n get: (handle) => {\n const { http } = context;\n const path = (suffix = ''): string => `/v1/publishers/${encodePath(handle)}${suffix}`;\n return {\n handle,\n info: (options) =>\n http.request({\n method: HttpMethod.Get,\n path: path(),\n response: publisherSchema,\n signal: options?.signal,\n }),\n agents: {\n list: (options) =>\n http.request({\n method: HttpMethod.Get,\n path: path('/agents'),\n query: { cursor: options?.cursor, limit: options?.limit },\n response: agentListSchema,\n signal: options?.signal,\n }),\n },\n channels: {\n list: async (options) =>\n (\n await http.request({\n method: HttpMethod.Get,\n path: path('/channels'),\n response: channelListSchema,\n signal: options?.signal,\n })\n ).channels,\n },\n harnesses: {\n list: async (options) =>\n (\n await http.request({\n method: HttpMethod.Get,\n path: path('/harnesses'),\n response: harnessDefinitionListSchema,\n signal: options?.signal,\n })\n ).harnesses,\n },\n adapters: {\n list: async (options) =>\n (\n await http.request({\n method: HttpMethod.Get,\n path: path('/acp-adapters'),\n response: acpAdapterDefinitionListSchema,\n signal: options?.signal,\n })\n ).adapters,\n },\n };\n },\n});\n"],
5
+ "mappings": "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",
6
+ "names": []
7
+ }
@@ -0,0 +1,60 @@
1
+ import { Capability } from '@finalai/agent-protocol';
2
+ import { PermissionLevel, type HarnessCheckResponseIface, type ProvideDocumentIface, type UnmetRequirementIface } from '@finalai/agent-protocol/agent-platform';
3
+ import type { ResolvedAgentIface } from "./agent-input.mjs";
4
+ export interface LocalCheckArgsIface {
5
+ agent: ResolvedAgentIface;
6
+ provide: ProvideDocumentIface;
7
+ /** The platform's verdict on the harness settings, when the SDK asked for one. */
8
+ harness?: HarnessCheckResponseIface | null;
9
+ /** Whether this process will answer the agent's in-process code over its connection. */
10
+ servesCode: boolean;
11
+ }
12
+ export declare const parseProvide: (provide: ProvideDocumentIface) => {
13
+ harness?: {
14
+ harness: string;
15
+ configuration: {
16
+ [x: string]: unknown;
17
+ model?: string | undefined;
18
+ reasoning?: string | undefined;
19
+ inference?: ({
20
+ source: import("@finalai/agent-provider").InferenceSourceKind.Subscription;
21
+ credential: import("@finalai/agent-provider").CredentialScope;
22
+ vendor?: string | undefined;
23
+ } | {
24
+ source: import("@finalai/agent-provider").InferenceSourceKind.ApiKey;
25
+ secret: string;
26
+ baseUrl?: string | undefined;
27
+ vendor?: string | undefined;
28
+ } | {
29
+ source: import("@finalai/agent-provider").InferenceSourceKind.Final;
30
+ billTo: import("@finalai/agent-provider").InferenceBillTo;
31
+ budget?: string | undefined;
32
+ } | {
33
+ source: import("@finalai/agent-provider").InferenceSourceKind.Harness;
34
+ })[] | undefined;
35
+ permissionMode?: PermissionLevel | undefined;
36
+ };
37
+ adapter?: string | undefined;
38
+ environment?: string | {
39
+ url: string;
40
+ hop?: string | undefined;
41
+ } | undefined;
42
+ } | undefined;
43
+ compute?: Partial<Record<Capability, string>> | undefined;
44
+ integrations?: Record<string, string> | undefined;
45
+ };
46
+ export declare const localUnmetRequirements: (args: LocalCheckArgsIface) => UnmetRequirementIface[];
47
+ /** Throws `requirements_unmet` when anything is missing. */
48
+ export declare const assertRequirementsMet: (args: LocalCheckArgsIface) => void;
49
+ /**
50
+ * The capabilities this process can provide for the agent from its own
51
+ * process: the files and shell it requires that the caller left out and the
52
+ * harness does not serve where it runs. A harness that uses them natively and
53
+ * names no environment runs where `shell` is provided, so this process serves
54
+ * it and becomes that harness's environment.
55
+ */
56
+ export declare const capabilitiesToServeLocally: (args: {
57
+ agent: ResolvedAgentIface;
58
+ provide: ProvideDocumentIface;
59
+ harness: HarnessCheckResponseIface | null;
60
+ }) => Capability[];
@@ -0,0 +1,83 @@
1
+ import {
2
+ Capability,
3
+ DEFAULT_CAPABILITY_ACCESS,
4
+ PROCESS_CAPABILITIES
5
+ } from "@finalai/agent-protocol";
6
+ import {
7
+ AgentApiErrorCode,
8
+ HarnessComputeStatus,
9
+ isUrlEnvironment,
10
+ PermissionLevel,
11
+ provideDocumentSchema
12
+ } from "@finalai/agent-protocol/agent-platform";
13
+ import { computeRequirementsOf, HarnessFeature } from "@finalai/agent-provider/document";
14
+ import { unmetRequirements } from "@finalai/agent-provider/requirements-check";
15
+ import { clientError, ClientErrorCode, requirementsUnmetError } from "./errors.mjs";
16
+ const ALL_FEATURES = Object.values(HarnessFeature);
17
+ const parseProvide = (provide) => {
18
+ const parsed = provideDocumentSchema.safeParse(provide);
19
+ if (!parsed.success)
20
+ throw clientError({
21
+ message: `Invalid provide: ${parsed.error.message}`,
22
+ status: 0,
23
+ code: ClientErrorCode.InvalidRequest
24
+ });
25
+ return parsed.data;
26
+ };
27
+ const localUnmetRequirements = (args) => {
28
+ const provide = parseProvide(args.provide);
29
+ const compute = {};
30
+ for (const [capability, status] of Object.entries(args.harness?.compute ?? {})) {
31
+ const known = Object.values(Capability).find((value) => value === capability);
32
+ const served = Object.values(HarnessComputeStatus).find((value) => value === status.status);
33
+ if (known != null && served != null) compute[known] = served;
34
+ }
35
+ const settings = provide.harness?.environment;
36
+ const environment = isUrlEnvironment(settings) ? null : args.harness?.environment ?? settings ?? provide.compute?.[Capability.Shell] ?? provide.compute?.[Capability.Files] ?? null;
37
+ const unmet = unmetRequirements({
38
+ document: args.agent.document,
39
+ provide,
40
+ harness: provide.harness == null ? null : { supports: ALL_FEATURES, lowestPermission: PermissionLevel.Ask, compute, environment },
41
+ sandbox: () => ({ capabilities: DEFAULT_CAPABILITY_ACCESS }),
42
+ integrationExists: () => true,
43
+ inProcessCodeAvailable: args.servesCode || args.agent.inProcess.length === 0
44
+ });
45
+ return [
46
+ ...unmet.map((item) => ({ ...item })),
47
+ ...args.harness == null || args.harness.suitable ? [] : args.harness.problems
48
+ ];
49
+ };
50
+ const assertRequirementsMet = (args) => {
51
+ const unmet = localUnmetRequirements(args);
52
+ if (unmet.length === 0) return;
53
+ throw requirementsUnmetError({
54
+ status: 0,
55
+ code: AgentApiErrorCode.RequirementsUnmet,
56
+ agent: args.agent.hash,
57
+ requirements: unmet
58
+ });
59
+ };
60
+ const capabilitiesToServeLocally = (args) => {
61
+ const provided = args.provide.compute ?? {};
62
+ if (PROCESS_CAPABILITIES.some((capability) => provided[capability] != null)) return [];
63
+ const awaitsEnvironment = args.harness != null && args.harness.environment == null && args.provide.harness?.environment == null && PROCESS_CAPABILITIES.some(
64
+ (capability) => args.harness?.compute[capability]?.status === HarnessComputeStatus.Harness
65
+ );
66
+ const serve = [];
67
+ for (const [capability] of computeRequirementsOf(args.agent.document)) {
68
+ if (!PROCESS_CAPABILITIES.includes(capability)) continue;
69
+ const status = args.harness?.compute[capability]?.status;
70
+ if (status === HarnessComputeStatus.Unavailable) continue;
71
+ if (status === HarnessComputeStatus.Harness && !awaitsEnvironment) continue;
72
+ serve.push(capability);
73
+ }
74
+ if (awaitsEnvironment && !serve.includes(Capability.Shell)) serve.push(Capability.Shell);
75
+ return serve;
76
+ };
77
+ export {
78
+ assertRequirementsMet,
79
+ capabilitiesToServeLocally,
80
+ localUnmetRequirements,
81
+ parseProvide
82
+ };
83
+ //# sourceMappingURL=requirements.mjs.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../../../../src/agent-client/requirements.ts"],
4
+ "sourcesContent": ["import {\n Capability,\n DEFAULT_CAPABILITY_ACCESS,\n PROCESS_CAPABILITIES,\n} from '@finalai/agent-protocol';\nimport {\n AgentApiErrorCode,\n HarnessComputeStatus,\n isUrlEnvironment,\n PermissionLevel,\n provideDocumentSchema,\n type HarnessCheckResponseIface,\n type ProvideDocumentIface,\n type UnmetRequirementIface,\n} from '@finalai/agent-protocol/agent-platform';\nimport { computeRequirementsOf, HarnessFeature } from '@finalai/agent-provider/document';\nimport { unmetRequirements } from '@finalai/agent-provider/requirements-check';\nimport { clientError, ClientErrorCode, requirementsUnmetError } from \"./errors.mjs\";\nimport type { ResolvedAgentIface } from \"./agent-input.mjs\";\n\n// The SDK runs the platform's requirements check before sending, with what it\n// knows: what was provided, and whether this process holds the agent's\n// in-process code. What only the platform can judge (whether an id exists,\n// what a sandbox grants, whether a harness suits the agent) is assumed met\n// here and checked there.\n\nexport interface LocalCheckArgsIface {\n agent: ResolvedAgentIface;\n provide: ProvideDocumentIface;\n /** The platform's verdict on the harness settings, when the SDK asked for one. */\n harness?: HarnessCheckResponseIface | null;\n /** Whether this process will answer the agent's in-process code over its connection. */\n servesCode: boolean;\n}\n\nconst ALL_FEATURES = Object.values(HarnessFeature);\n\nexport const parseProvide = (provide: ProvideDocumentIface) => {\n const parsed = provideDocumentSchema.safeParse(provide);\n if (!parsed.success)\n throw clientError({\n message: `Invalid provide: ${parsed.error.message}`,\n status: 0,\n code: ClientErrorCode.InvalidRequest,\n });\n return parsed.data;\n};\n\nexport const localUnmetRequirements = (args: LocalCheckArgsIface): UnmetRequirementIface[] => {\n const provide = parseProvide(args.provide);\n const compute: Partial<Record<Capability, HarnessComputeStatus>> = {};\n for (const [capability, status] of Object.entries(args.harness?.compute ?? {})) {\n const known = Object.values(Capability).find((value) => value === capability);\n const served = Object.values(HarnessComputeStatus).find((value) => value === status.status);\n if (known != null && served != null) compute[known] = served;\n }\n // Native capabilities are the environment's: the platform's answer, else\n // the settings', else (placed by `shell`) the sandbox provided for it.\n const settings = provide.harness?.environment;\n const environment = isUrlEnvironment(settings)\n ? null\n : (args.harness?.environment ??\n settings ??\n provide.compute?.[Capability.Shell] ??\n provide.compute?.[Capability.Files] ??\n null);\n const unmet = unmetRequirements({\n document: args.agent.document,\n provide,\n harness:\n provide.harness == null\n ? null\n : { supports: ALL_FEATURES, lowestPermission: PermissionLevel.Ask, compute, environment },\n sandbox: () => ({ capabilities: DEFAULT_CAPABILITY_ACCESS }),\n integrationExists: () => true,\n inProcessCodeAvailable: args.servesCode || args.agent.inProcess.length === 0,\n });\n return [\n ...unmet.map((item) => ({ ...item })),\n ...(args.harness == null || args.harness.suitable ? [] : args.harness.problems),\n ];\n};\n\n/** Throws `requirements_unmet` when anything is missing. */\nexport const assertRequirementsMet = (args: LocalCheckArgsIface): void => {\n const unmet = localUnmetRequirements(args);\n if (unmet.length === 0) return;\n throw requirementsUnmetError({\n status: 0,\n code: AgentApiErrorCode.RequirementsUnmet,\n agent: args.agent.hash,\n requirements: unmet,\n });\n};\n\n/**\n * The capabilities this process can provide for the agent from its own\n * process: the files and shell it requires that the caller left out and the\n * harness does not serve where it runs. A harness that uses them natively and\n * names no environment runs where `shell` is provided, so this process serves\n * it and becomes that harness's environment.\n */\nexport const capabilitiesToServeLocally = (args: {\n agent: ResolvedAgentIface;\n provide: ProvideDocumentIface;\n harness: HarnessCheckResponseIface | null;\n}): Capability[] => {\n const provided = args.provide.compute ?? {};\n // `files` and `shell` share one sandbox: once the caller named one for\n // either, this process serves neither.\n if (PROCESS_CAPABILITIES.some((capability) => provided[capability] != null)) return [];\n const awaitsEnvironment =\n args.harness != null &&\n args.harness.environment == null &&\n args.provide.harness?.environment == null &&\n PROCESS_CAPABILITIES.some(\n (capability) => args.harness?.compute[capability]?.status === HarnessComputeStatus.Harness,\n );\n const serve: Capability[] = [];\n for (const [capability] of computeRequirementsOf(args.agent.document)) {\n if (!PROCESS_CAPABILITIES.includes(capability)) continue;\n const status = args.harness?.compute[capability]?.status;\n if (status === HarnessComputeStatus.Unavailable) continue;\n if (status === HarnessComputeStatus.Harness && !awaitsEnvironment) continue;\n serve.push(capability);\n }\n if (awaitsEnvironment && !serve.includes(Capability.Shell)) serve.push(Capability.Shell);\n return serve;\n};\n"],
5
+ "mappings": "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",
6
+ "names": []
7
+ }
@@ -0,0 +1,34 @@
1
+ import { type RegisterSandboxProviderRequestIface, type SandboxProviderInfoIface, type UpdateSandboxProviderRequestIface } from '@finalai/agent-protocol/agent-platform';
2
+ import { type ClientContextIface, type SignalOptionsIface } from "./context.mjs";
3
+ export interface SandboxProvidersApiIface {
4
+ /**
5
+ * Registers a provider served at `url` (see `serveSandboxProvider` in
6
+ * `@finalai/agent-provider/sandbox/remote`). The platform reads its discovery
7
+ * document first. `grants` lets it obtain assertions for those backends.
8
+ */
9
+ register: (args: RegisterSandboxProviderRequestIface & SignalOptionsIface) => Promise<SandboxProviderInfoIface>;
10
+ /** This project's registrations and its ancestors', the nearest per name. */
11
+ list: (options?: SignalOptionsIface) => Promise<SandboxProviderInfoIface[]>;
12
+ /** By id, or the registration `name` resolves to here. */
13
+ get: (selector: ({
14
+ id: string;
15
+ } | {
16
+ name: string;
17
+ }) & SignalOptionsIface) => Promise<SandboxProviderInfoIface>;
18
+ /** `grants` replaces the set. */
19
+ update: (args: {
20
+ id: string;
21
+ } & UpdateSandboxProviderRequestIface & SignalOptionsIface) => Promise<SandboxProviderInfoIface>;
22
+ /** Reads the provider's discovery document again. */
23
+ refresh: (args: {
24
+ id: string;
25
+ } & SignalOptionsIface) => Promise<SandboxProviderInfoIface>;
26
+ /** Refused with `in_use` while a sandbox that has not ended uses it. */
27
+ remove: (args: {
28
+ id: string;
29
+ } & SignalOptionsIface) => Promise<void>;
30
+ }
31
+ export declare const createSandboxProvidersApi: (args: {
32
+ context: ClientContextIface;
33
+ projectId: string;
34
+ }) => SandboxProvidersApiIface;
@@ -0,0 +1,75 @@
1
+ import {
2
+ okResponseSchema,
3
+ registerSandboxProviderRequestSchema,
4
+ sandboxProviderInfoListSchema,
5
+ sandboxProviderInfoSchema,
6
+ updateSandboxProviderRequestSchema
7
+ } from "@finalai/agent-protocol/agent-platform";
8
+ import * as z from "zod";
9
+ import { encodePath } from "./context.mjs";
10
+ import { clientError, ClientErrorCode } from "./errors.mjs";
11
+ import { HttpMethod } from "./http.mjs";
12
+ const emptyBodySchema = z.strictObject({});
13
+ const createSandboxProvidersApi = (args) => {
14
+ const { http } = args.context;
15
+ const path = (suffix = "") => `/v1/projects/${encodePath(args.projectId)}/sandbox-providers${suffix}`;
16
+ const list = async (options) => (await http.request({
17
+ method: HttpMethod.Get,
18
+ path: path(),
19
+ response: sandboxProviderInfoListSchema,
20
+ signal: options?.signal
21
+ })).providers;
22
+ return {
23
+ register: ({ signal, ...value }) => http.request({
24
+ method: HttpMethod.Post,
25
+ path: path(),
26
+ body: { schema: registerSandboxProviderRequestSchema, value },
27
+ response: sandboxProviderInfoSchema,
28
+ signal
29
+ }),
30
+ list,
31
+ get: async ({ signal, ...selector }) => {
32
+ if ("id" in selector)
33
+ return http.request({
34
+ method: HttpMethod.Get,
35
+ path: path(`/${encodePath(selector.id)}`),
36
+ response: sandboxProviderInfoSchema,
37
+ signal
38
+ });
39
+ const found = (await list({ signal })).find((provider) => provider.name === selector.name);
40
+ if (found == null)
41
+ throw clientError({
42
+ message: `No sandbox provider named ${selector.name} in this project or above it`,
43
+ status: 404,
44
+ code: ClientErrorCode.NotFound
45
+ });
46
+ return found;
47
+ },
48
+ update: ({ id, signal, ...value }) => http.request({
49
+ method: HttpMethod.Patch,
50
+ path: path(`/${encodePath(id)}`),
51
+ body: { schema: updateSandboxProviderRequestSchema, value },
52
+ response: sandboxProviderInfoSchema,
53
+ signal
54
+ }),
55
+ refresh: ({ id, signal }) => http.request({
56
+ method: HttpMethod.Post,
57
+ path: path(`/${encodePath(id)}/refresh`),
58
+ body: { schema: emptyBodySchema, value: {} },
59
+ response: sandboxProviderInfoSchema,
60
+ signal
61
+ }),
62
+ remove: async ({ id, signal }) => {
63
+ await http.request({
64
+ method: HttpMethod.Delete,
65
+ path: path(`/${encodePath(id)}`),
66
+ response: okResponseSchema,
67
+ signal
68
+ });
69
+ }
70
+ };
71
+ };
72
+ export {
73
+ createSandboxProvidersApi
74
+ };
75
+ //# sourceMappingURL=sandbox-providers.mjs.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../../../../src/agent-client/sandbox-providers.ts"],
4
+ "sourcesContent": ["import {\n okResponseSchema,\n registerSandboxProviderRequestSchema,\n sandboxProviderInfoListSchema,\n sandboxProviderInfoSchema,\n updateSandboxProviderRequestSchema,\n type RegisterSandboxProviderRequestIface,\n type SandboxProviderInfoIface,\n type UpdateSandboxProviderRequestIface,\n} from '@finalai/agent-protocol/agent-platform';\nimport * as z from 'zod';\nimport { encodePath, type ClientContextIface, type SignalOptionsIface } from \"./context.mjs\";\nimport { clientError, ClientErrorCode } from \"./errors.mjs\";\nimport { HttpMethod } from \"./http.mjs\";\n\n// Sandbox providers registered on a project by URL. A project resolves a\n// provider by name through its own registrations and its ancestors', nearest\n// first.\n\nexport interface SandboxProvidersApiIface {\n /**\n * Registers a provider served at `url` (see `serveSandboxProvider` in\n * `@finalai/agent-provider/sandbox/remote`). The platform reads its discovery\n * document first. `grants` lets it obtain assertions for those backends.\n */\n register: (\n args: RegisterSandboxProviderRequestIface & SignalOptionsIface,\n ) => Promise<SandboxProviderInfoIface>;\n /** This project's registrations and its ancestors', the nearest per name. */\n list: (options?: SignalOptionsIface) => Promise<SandboxProviderInfoIface[]>;\n /** By id, or the registration `name` resolves to here. */\n get: (\n selector: ({ id: string } | { name: string }) & SignalOptionsIface,\n ) => Promise<SandboxProviderInfoIface>;\n /** `grants` replaces the set. */\n update: (\n args: { id: string } & UpdateSandboxProviderRequestIface & SignalOptionsIface,\n ) => Promise<SandboxProviderInfoIface>;\n /** Reads the provider's discovery document again. */\n refresh: (args: { id: string } & SignalOptionsIface) => Promise<SandboxProviderInfoIface>;\n /** Refused with `in_use` while a sandbox that has not ended uses it. */\n remove: (args: { id: string } & SignalOptionsIface) => Promise<void>;\n}\n\nconst emptyBodySchema = z.strictObject({});\n\nexport const createSandboxProvidersApi = (args: {\n context: ClientContextIface;\n projectId: string;\n}): SandboxProvidersApiIface => {\n const { http } = args.context;\n const path = (suffix = ''): string =>\n `/v1/projects/${encodePath(args.projectId)}/sandbox-providers${suffix}`;\n const list: SandboxProvidersApiIface['list'] = async (options) =>\n (\n await http.request({\n method: HttpMethod.Get,\n path: path(),\n response: sandboxProviderInfoListSchema,\n signal: options?.signal,\n })\n ).providers;\n return {\n register: ({ signal, ...value }) =>\n http.request({\n method: HttpMethod.Post,\n path: path(),\n body: { schema: registerSandboxProviderRequestSchema, value },\n response: sandboxProviderInfoSchema,\n signal,\n }),\n list,\n get: async ({ signal, ...selector }) => {\n if ('id' in selector)\n return http.request({\n method: HttpMethod.Get,\n path: path(`/${encodePath(selector.id)}`),\n response: sandboxProviderInfoSchema,\n signal,\n });\n const found = (await list({ signal })).find((provider) => provider.name === selector.name);\n if (found == null)\n throw clientError({\n message: `No sandbox provider named ${selector.name} in this project or above it`,\n status: 404,\n code: ClientErrorCode.NotFound,\n });\n return found;\n },\n update: ({ id, signal, ...value }) =>\n http.request({\n method: HttpMethod.Patch,\n path: path(`/${encodePath(id)}`),\n body: { schema: updateSandboxProviderRequestSchema, value },\n response: sandboxProviderInfoSchema,\n signal,\n }),\n refresh: ({ id, signal }) =>\n http.request({\n method: HttpMethod.Post,\n path: path(`/${encodePath(id)}/refresh`),\n body: { schema: emptyBodySchema, value: {} },\n response: sandboxProviderInfoSchema,\n signal,\n }),\n remove: async ({ id, signal }) => {\n await http.request({\n method: HttpMethod.Delete,\n path: path(`/${encodePath(id)}`),\n response: okResponseSchema,\n signal,\n });\n },\n };\n};\n"],
5
+ "mappings": "AAAA;AAAA,EACE;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,OAIK;AACP,YAAY,OAAO;AACnB,SAAS,kBAAoE;AAC7E,SAAS,aAAa,uBAAuB;AAC7C,SAAS,kBAAkB;AA+B3B,MAAM,kBAAkB,EAAE,aAAa,CAAC,CAAC;AAElC,MAAM,4BAA4B,CAAC,SAGV;AAC9B,QAAM,EAAE,KAAK,IAAI,KAAK;AACtB,QAAM,OAAO,CAAC,SAAS,OACrB,gBAAgB,WAAW,KAAK,SAAS,CAAC,qBAAqB,MAAM;AACvE,QAAM,OAAyC,OAAO,aAElD,MAAM,KAAK,QAAQ;AAAA,IACjB,QAAQ,WAAW;AAAA,IACnB,MAAM,KAAK;AAAA,IACX,UAAU;AAAA,IACV,QAAQ,SAAS;AAAA,EACnB,CAAC,GACD;AACJ,SAAO;AAAA,IACL,UAAU,CAAC,EAAE,QAAQ,GAAG,MAAM,MAC5B,KAAK,QAAQ;AAAA,MACX,QAAQ,WAAW;AAAA,MACnB,MAAM,KAAK;AAAA,MACX,MAAM,EAAE,QAAQ,sCAAsC,MAAM;AAAA,MAC5D,UAAU;AAAA,MACV;AAAA,IACF,CAAC;AAAA,IACH;AAAA,IACA,KAAK,OAAO,EAAE,QAAQ,GAAG,SAAS,MAAM;AACtC,UAAI,QAAQ;AACV,eAAO,KAAK,QAAQ;AAAA,UAClB,QAAQ,WAAW;AAAA,UACnB,MAAM,KAAK,IAAI,WAAW,SAAS,EAAE,CAAC,EAAE;AAAA,UACxC,UAAU;AAAA,UACV;AAAA,QACF,CAAC;AACH,YAAM,SAAS,MAAM,KAAK,EAAE,OAAO,CAAC,GAAG,KAAK,CAAC,aAAa,SAAS,SAAS,SAAS,IAAI;AACzF,UAAI,SAAS;AACX,cAAM,YAAY;AAAA,UAChB,SAAS,6BAA6B,SAAS,IAAI;AAAA,UACnD,QAAQ;AAAA,UACR,MAAM,gBAAgB;AAAA,QACxB,CAAC;AACH,aAAO;AAAA,IACT;AAAA,IACA,QAAQ,CAAC,EAAE,IAAI,QAAQ,GAAG,MAAM,MAC9B,KAAK,QAAQ;AAAA,MACX,QAAQ,WAAW;AAAA,MACnB,MAAM,KAAK,IAAI,WAAW,EAAE,CAAC,EAAE;AAAA,MAC/B,MAAM,EAAE,QAAQ,oCAAoC,MAAM;AAAA,MAC1D,UAAU;AAAA,MACV;AAAA,IACF,CAAC;AAAA,IACH,SAAS,CAAC,EAAE,IAAI,OAAO,MACrB,KAAK,QAAQ;AAAA,MACX,QAAQ,WAAW;AAAA,MACnB,MAAM,KAAK,IAAI,WAAW,EAAE,CAAC,UAAU;AAAA,MACvC,MAAM,EAAE,QAAQ,iBAAiB,OAAO,CAAC,EAAE;AAAA,MAC3C,UAAU;AAAA,MACV;AAAA,IACF,CAAC;AAAA,IACH,QAAQ,OAAO,EAAE,IAAI,OAAO,MAAM;AAChC,YAAM,KAAK,QAAQ;AAAA,QACjB,QAAQ,WAAW;AAAA,QACnB,MAAM,KAAK,IAAI,WAAW,EAAE,CAAC,EAAE;AAAA,QAC/B,UAAU;AAAA,QACV;AAAA,MACF,CAAC;AAAA,IACH;AAAA,EACF;AACF;",
6
+ "names": []
7
+ }
@@ -7,7 +7,7 @@ type ResultIface<T> = {
7
7
  };
8
8
  export interface SandboxFileTargetIface {
9
9
  conversationId: string;
10
- bindingId: string;
10
+ sandboxId: string;
11
11
  }
12
12
  export interface SandboxFileUriIface {
13
13
  target: SandboxFileTargetIface;
@@ -12,19 +12,19 @@ const wireIdValid = (prefix, value) => {
12
12
  return false;
13
13
  }
14
14
  };
15
- const targetValid = (target) => wireIdValid("conv", target.conversationId) && wireIdValid("sbnd", target.bindingId);
15
+ const targetValid = (target) => wireIdValid("conv", target.conversationId) && wireIdValid("asbx", target.sandboxId);
16
16
  const pathValid = (path) => path.length > 0 && path.length <= 4096 && !path.includes("\0");
17
17
  const createSandboxFileUri = (location) => {
18
18
  if (!targetValid(location.target) || !pathValid(location.path))
19
19
  throw new Error("Invalid sandbox file location");
20
20
  const query = new URLSearchParams({ path: location.path });
21
- return `final-sandbox://${location.target.conversationId}/${location.target.bindingId}?${query}`;
21
+ return `final-sandbox://${location.target.conversationId}/${location.target.sandboxId}?${query}`;
22
22
  };
23
23
  const parseSandboxFileUri = (value) => {
24
24
  try {
25
25
  const uri = new URL(value);
26
- const bindingId = uri.pathname.slice(1);
27
- const target = { conversationId: uri.hostname, bindingId };
26
+ const sandboxId = uri.pathname.slice(1);
27
+ const target = { conversationId: uri.hostname, sandboxId };
28
28
  const paths = uri.searchParams.getAll("path");
29
29
  if (uri.protocol !== SANDBOX_FILE_URI_SCHEME || uri.username.length > 0 || uri.password.length > 0 || uri.port.length > 0 || uri.hash.length > 0 || !targetValid(target) || paths.length !== 1 || [...uri.searchParams.keys()].some((key) => key !== "path"))
30
30
  return err("Invalid sandbox file URI");
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../../../../src/agent-client/sandbox-uri.ts"],
4
- "sourcesContent": ["import { base58Decode } from '@finalai/agent-protocol/base58';\ntype ResultIface<T> = { ok: true; data: T } | { ok: false; error: string };\nconst err = (error: string): { ok: false; error: string } => ({ ok: false, error });\nconst ok = <T>(data: T): { ok: true; data: T } => ({ ok: true, data });\n\nexport interface SandboxFileTargetIface {\n conversationId: string;\n bindingId: string;\n}\n\nexport interface SandboxFileUriIface {\n target: SandboxFileTargetIface;\n path: string;\n}\n\nexport const SANDBOX_FILE_URI_SCHEME = 'final-sandbox:';\n\nconst wireIdValid = (prefix: string, value: string): boolean => {\n if (!value.startsWith(prefix + '_')) return false;\n const body = value.slice(prefix.length + 1);\n if (body.length === 0 || body.length > 22) return false;\n try {\n return base58Decode(body).length === 16;\n } catch {\n return false;\n }\n};\n\nconst targetValid = (target: SandboxFileTargetIface): boolean =>\n wireIdValid('conv', target.conversationId) && wireIdValid('sbnd', target.bindingId);\n\nconst pathValid = (path: string): boolean =>\n path.length > 0 && path.length <= 4096 && !path.includes('\\0');\n\nexport const createSandboxFileUri = (location: SandboxFileUriIface): string => {\n if (!targetValid(location.target) || !pathValid(location.path))\n throw new Error('Invalid sandbox file location');\n const query = new URLSearchParams({ path: location.path });\n return `final-sandbox://${location.target.conversationId}/${location.target.bindingId}?${query}`;\n};\n\nexport const parseSandboxFileUri = (value: string): ResultIface<SandboxFileUriIface> => {\n try {\n const uri = new URL(value);\n const bindingId = uri.pathname.slice(1);\n const target = { conversationId: uri.hostname, bindingId };\n const paths = uri.searchParams.getAll('path');\n if (\n uri.protocol !== SANDBOX_FILE_URI_SCHEME ||\n uri.username.length > 0 ||\n uri.password.length > 0 ||\n uri.port.length > 0 ||\n uri.hash.length > 0 ||\n !targetValid(target) ||\n paths.length !== 1 ||\n [...uri.searchParams.keys()].some((key) => key !== 'path')\n )\n return err('Invalid sandbox file URI');\n const path = paths[0];\n if (path == null || !pathValid(path)) return err('Invalid sandbox file path');\n return ok({ target, path });\n } catch {\n return err('Invalid sandbox file URI');\n }\n};\n"],
4
+ "sourcesContent": ["import { base58Decode } from '@finalai/agent-protocol/base58';\ntype ResultIface<T> = { ok: true; data: T } | { ok: false; error: string };\nconst err = (error: string): { ok: false; error: string } => ({ ok: false, error });\nconst ok = <T>(data: T): { ok: true; data: T } => ({ ok: true, data });\n\nexport interface SandboxFileTargetIface {\n conversationId: string;\n sandboxId: string;\n}\n\nexport interface SandboxFileUriIface {\n target: SandboxFileTargetIface;\n path: string;\n}\n\nexport const SANDBOX_FILE_URI_SCHEME = 'final-sandbox:';\n\nconst wireIdValid = (prefix: string, value: string): boolean => {\n if (!value.startsWith(prefix + '_')) return false;\n const body = value.slice(prefix.length + 1);\n if (body.length === 0 || body.length > 22) return false;\n try {\n return base58Decode(body).length === 16;\n } catch {\n return false;\n }\n};\n\nconst targetValid = (target: SandboxFileTargetIface): boolean =>\n wireIdValid('conv', target.conversationId) && wireIdValid('asbx', target.sandboxId);\n\nconst pathValid = (path: string): boolean =>\n path.length > 0 && path.length <= 4096 && !path.includes('\\0');\n\nexport const createSandboxFileUri = (location: SandboxFileUriIface): string => {\n if (!targetValid(location.target) || !pathValid(location.path))\n throw new Error('Invalid sandbox file location');\n const query = new URLSearchParams({ path: location.path });\n return `final-sandbox://${location.target.conversationId}/${location.target.sandboxId}?${query}`;\n};\n\nexport const parseSandboxFileUri = (value: string): ResultIface<SandboxFileUriIface> => {\n try {\n const uri = new URL(value);\n const sandboxId = uri.pathname.slice(1);\n const target = { conversationId: uri.hostname, sandboxId };\n const paths = uri.searchParams.getAll('path');\n if (\n uri.protocol !== SANDBOX_FILE_URI_SCHEME ||\n uri.username.length > 0 ||\n uri.password.length > 0 ||\n uri.port.length > 0 ||\n uri.hash.length > 0 ||\n !targetValid(target) ||\n paths.length !== 1 ||\n [...uri.searchParams.keys()].some((key) => key !== 'path')\n )\n return err('Invalid sandbox file URI');\n const path = paths[0];\n if (path == null || !pathValid(path)) return err('Invalid sandbox file path');\n return ok({ target, path });\n } catch {\n return err('Invalid sandbox file URI');\n }\n};\n"],
5
5
  "mappings": "AAAA,SAAS,oBAAoB;AAE7B,MAAM,MAAM,CAAC,WAAiD,EAAE,IAAI,OAAO,MAAM;AACjF,MAAM,KAAK,CAAI,UAAoC,EAAE,IAAI,MAAM,KAAK;AAY7D,MAAM,0BAA0B;AAEvC,MAAM,cAAc,CAAC,QAAgB,UAA2B;AAC9D,MAAI,CAAC,MAAM,WAAW,SAAS,GAAG,EAAG,QAAO;AAC5C,QAAM,OAAO,MAAM,MAAM,OAAO,SAAS,CAAC;AAC1C,MAAI,KAAK,WAAW,KAAK,KAAK,SAAS,GAAI,QAAO;AAClD,MAAI;AACF,WAAO,aAAa,IAAI,EAAE,WAAW;AAAA,EACvC,QAAQ;AACN,WAAO;AAAA,EACT;AACF;AAEA,MAAM,cAAc,CAAC,WACnB,YAAY,QAAQ,OAAO,cAAc,KAAK,YAAY,QAAQ,OAAO,SAAS;AAEpF,MAAM,YAAY,CAAC,SACjB,KAAK,SAAS,KAAK,KAAK,UAAU,QAAQ,CAAC,KAAK,SAAS,IAAI;AAExD,MAAM,uBAAuB,CAAC,aAA0C;AAC7E,MAAI,CAAC,YAAY,SAAS,MAAM,KAAK,CAAC,UAAU,SAAS,IAAI;AAC3D,UAAM,IAAI,MAAM,+BAA+B;AACjD,QAAM,QAAQ,IAAI,gBAAgB,EAAE,MAAM,SAAS,KAAK,CAAC;AACzD,SAAO,mBAAmB,SAAS,OAAO,cAAc,IAAI,SAAS,OAAO,SAAS,IAAI,KAAK;AAChG;AAEO,MAAM,sBAAsB,CAAC,UAAoD;AACtF,MAAI;AACF,UAAM,MAAM,IAAI,IAAI,KAAK;AACzB,UAAM,YAAY,IAAI,SAAS,MAAM,CAAC;AACtC,UAAM,SAAS,EAAE,gBAAgB,IAAI,UAAU,UAAU;AACzD,UAAM,QAAQ,IAAI,aAAa,OAAO,MAAM;AAC5C,QACE,IAAI,aAAa,2BACjB,IAAI,SAAS,SAAS,KACtB,IAAI,SAAS,SAAS,KACtB,IAAI,KAAK,SAAS,KAClB,IAAI,KAAK,SAAS,KAClB,CAAC,YAAY,MAAM,KACnB,MAAM,WAAW,KACjB,CAAC,GAAG,IAAI,aAAa,KAAK,CAAC,EAAE,KAAK,CAAC,QAAQ,QAAQ,MAAM;AAEzD,aAAO,IAAI,0BAA0B;AACvC,UAAM,OAAO,MAAM,CAAC;AACpB,QAAI,QAAQ,QAAQ,CAAC,UAAU,IAAI,EAAG,QAAO,IAAI,2BAA2B;AAC5E,WAAO,GAAG,EAAE,QAAQ,KAAK,CAAC;AAAA,EAC5B,QAAQ;AACN,WAAO,IAAI,0BAA0B;AAAA,EACvC;AACF;",
6
6
  "names": []
7
7
  }
@@ -0,0 +1,72 @@
1
+ import type { SandboxEnvironmentValueIface } from '@finalai/agent-provider/sandbox/types';
2
+ import { type PublishSandboxSetupResponseIface, type RunSandboxCommandRequestIface, type RunSandboxCommandResponseIface, type SandboxDescriptionIface, type SandboxListIface, type SandboxProviderIface, type SandboxResourceIface, type SandboxSetupInputIface, type SandboxSetupRefInputIface, type SandboxSetupResourceIface } from '@finalai/agent-protocol/agent-platform';
3
+ import { type ClientContextIface, type SignalOptionsIface } from "./context.mjs";
4
+ export type { SandboxEnvironmentValueIface };
5
+ /** A published sandbox setup at a version, or `latest` (resolved once, at creation). */
6
+ export type SandboxSetupRefIface = SandboxSetupRefInputIface;
7
+ /** Who a sandbox belongs to; it is deleted with its owner. */
8
+ export type SandboxOwnerIface = {
9
+ conversation: string;
10
+ } | {
11
+ session: string;
12
+ };
13
+ export interface CreateSandboxOptionsIface extends SignalOptionsIface {
14
+ /** What should be on the machine: `defineSandboxSetup(...)`, or a published setup. */
15
+ setup?: SandboxSetupInputIface | SandboxSetupRefIface;
16
+ ownedBy?: SandboxOwnerIface;
17
+ /** A retry with the same key returns the sandbox the first call created. */
18
+ idempotencyKey?: string;
19
+ }
20
+ export interface SandboxHandleIface {
21
+ readonly id: string;
22
+ /** The sandbox as it was when this handle was made. */
23
+ readonly resource: SandboxResourceIface;
24
+ get: (options?: SignalOptionsIface) => Promise<SandboxResourceIface>;
25
+ /** Runs one command to completion, booting the sandbox if needed. */
26
+ run: (args: RunSandboxCommandRequestIface & SignalOptionsIface) => Promise<RunSandboxCommandResponseIface>;
27
+ /** What is known about the machine: checkouts, services, commands, notes. */
28
+ description: (options?: SignalOptionsIface) => Promise<SandboxDescriptionIface>;
29
+ /**
30
+ * Sends the sandbox's outbound traffic through an integration's egress exit (`intg_...`),
31
+ * or straight out with `null`.
32
+ */
33
+ setEgressExit: (args: {
34
+ integration: string | null;
35
+ } & SignalOptionsIface) => Promise<SandboxResourceIface>;
36
+ delete: (options?: SignalOptionsIface) => Promise<void>;
37
+ }
38
+ export interface SandboxesApiIface {
39
+ create: (environment: SandboxEnvironmentValueIface, options?: CreateSandboxOptionsIface) => Promise<SandboxHandleIface>;
40
+ get: (sandboxId: string, options?: SignalOptionsIface) => Promise<SandboxHandleIface>;
41
+ list: (options?: SignalOptionsIface & {
42
+ conversation?: string;
43
+ session?: string;
44
+ cursor?: string;
45
+ limit?: number;
46
+ }) => Promise<SandboxListIface>;
47
+ /** The providers this project can create sandboxes on. */
48
+ providers: (options?: SignalOptionsIface) => Promise<SandboxProviderIface[]>;
49
+ }
50
+ export interface SandboxSetupsApiIface {
51
+ /** Publishes the next version of `name`. */
52
+ publish: (args: {
53
+ name: string;
54
+ setup: SandboxSetupInputIface;
55
+ } & SignalOptionsIface) => Promise<PublishSandboxSetupResponseIface>;
56
+ get: (args: {
57
+ id: string;
58
+ version?: number;
59
+ } & SignalOptionsIface) => Promise<SandboxSetupResourceIface>;
60
+ list: (options?: SignalOptionsIface & {
61
+ cursor?: string;
62
+ limit?: number;
63
+ }) => Promise<SandboxSetupResourceIface[]>;
64
+ }
65
+ export declare const createSandboxesApi: (args: {
66
+ context: ClientContextIface;
67
+ projectId: string;
68
+ }) => SandboxesApiIface;
69
+ export declare const createSandboxSetupsApi: (args: {
70
+ context: ClientContextIface;
71
+ projectId: string;
72
+ }) => SandboxSetupsApiIface;
@@ -0,0 +1,138 @@
1
+ import { jsonObjectSchema } from "@finalai/agent-protocol";
2
+ import {
3
+ createSandboxRequestSchema,
4
+ okResponseSchema,
5
+ publishSandboxSetupRequestSchema,
6
+ publishSandboxSetupResponseSchema,
7
+ runSandboxCommandRequestSchema,
8
+ runSandboxCommandResponseSchema,
9
+ sandboxDescriptionSchema,
10
+ sandboxListSchema,
11
+ sandboxProviderListSchema,
12
+ sandboxResourceSchema,
13
+ sandboxSetupListSchema,
14
+ sandboxSetupResourceSchema,
15
+ setSandboxEgressExitRequestSchema
16
+ } from "@finalai/agent-protocol/agent-platform";
17
+ import { encodePath } from "./context.mjs";
18
+ import { HttpMethod } from "./http.mjs";
19
+ const projectPath = (projectId, suffix) => `/v1/projects/${encodePath(projectId)}${suffix}`;
20
+ const createSandboxesApi = (args) => {
21
+ const { http } = args.context;
22
+ const sandboxPath = (sandboxId, suffix = "") => projectPath(args.projectId, `/sandboxes/${encodePath(sandboxId)}${suffix}`);
23
+ const handle = (resource) => ({
24
+ id: resource.id,
25
+ resource,
26
+ get: (options) => http.request({
27
+ method: HttpMethod.Get,
28
+ path: sandboxPath(resource.id),
29
+ response: sandboxResourceSchema,
30
+ signal: options?.signal
31
+ }),
32
+ run: ({ signal, ...value }) => http.request({
33
+ method: HttpMethod.Post,
34
+ path: sandboxPath(resource.id, "/run"),
35
+ body: { schema: runSandboxCommandRequestSchema, value },
36
+ response: runSandboxCommandResponseSchema,
37
+ signal
38
+ }),
39
+ description: (options) => http.request({
40
+ method: HttpMethod.Get,
41
+ path: sandboxPath(resource.id, "/description"),
42
+ response: sandboxDescriptionSchema,
43
+ signal: options?.signal
44
+ }),
45
+ setEgressExit: ({ signal, ...value }) => http.request({
46
+ method: HttpMethod.Put,
47
+ path: sandboxPath(resource.id, "/egress-exit"),
48
+ body: { schema: setSandboxEgressExitRequestSchema, value },
49
+ response: sandboxResourceSchema,
50
+ signal
51
+ }),
52
+ delete: async (options) => {
53
+ await http.request({
54
+ method: HttpMethod.Delete,
55
+ path: sandboxPath(resource.id),
56
+ response: okResponseSchema,
57
+ signal: options?.signal
58
+ });
59
+ }
60
+ });
61
+ return {
62
+ create: async (environment, options) => handle(
63
+ await http.request({
64
+ method: HttpMethod.Post,
65
+ path: projectPath(args.projectId, "/sandboxes"),
66
+ body: {
67
+ schema: createSandboxRequestSchema,
68
+ value: {
69
+ provider: environment.provider,
70
+ environment: jsonObjectSchema.parse(environment.environment ?? {}),
71
+ setup: options?.setup,
72
+ ownedBy: options?.ownedBy,
73
+ idempotencyKey: options?.idempotencyKey
74
+ }
75
+ },
76
+ response: sandboxResourceSchema,
77
+ signal: options?.signal
78
+ })
79
+ ),
80
+ get: async (sandboxId, options) => handle(
81
+ await http.request({
82
+ method: HttpMethod.Get,
83
+ path: sandboxPath(sandboxId),
84
+ response: sandboxResourceSchema,
85
+ signal: options?.signal
86
+ })
87
+ ),
88
+ list: (options) => http.request({
89
+ method: HttpMethod.Get,
90
+ path: projectPath(args.projectId, "/sandboxes"),
91
+ query: {
92
+ conversation: options?.conversation,
93
+ session: options?.session,
94
+ cursor: options?.cursor,
95
+ limit: options?.limit
96
+ },
97
+ response: sandboxListSchema,
98
+ signal: options?.signal
99
+ }),
100
+ providers: async (options) => (await http.request({
101
+ method: HttpMethod.Get,
102
+ path: projectPath(args.projectId, "/sandbox-providers"),
103
+ response: sandboxProviderListSchema,
104
+ signal: options?.signal
105
+ })).providers
106
+ };
107
+ };
108
+ const createSandboxSetupsApi = (args) => {
109
+ const { http } = args.context;
110
+ return {
111
+ publish: ({ signal, ...value }) => http.request({
112
+ method: HttpMethod.Post,
113
+ path: projectPath(args.projectId, "/sandbox-setups"),
114
+ body: { schema: publishSandboxSetupRequestSchema, value },
115
+ response: publishSandboxSetupResponseSchema,
116
+ signal
117
+ }),
118
+ get: ({ id, version, signal }) => http.request({
119
+ method: HttpMethod.Get,
120
+ path: projectPath(args.projectId, `/sandbox-setups/${encodePath(id)}`),
121
+ query: { version },
122
+ response: sandboxSetupResourceSchema,
123
+ signal
124
+ }),
125
+ list: async (options) => (await http.request({
126
+ method: HttpMethod.Get,
127
+ path: projectPath(args.projectId, "/sandbox-setups"),
128
+ query: { cursor: options?.cursor, limit: options?.limit },
129
+ response: sandboxSetupListSchema,
130
+ signal: options?.signal
131
+ })).setups
132
+ };
133
+ };
134
+ export {
135
+ createSandboxSetupsApi,
136
+ createSandboxesApi
137
+ };
138
+ //# sourceMappingURL=sandboxes.mjs.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../../../../src/agent-client/sandboxes.ts"],
4
+ "sourcesContent": ["import { jsonObjectSchema } from '@finalai/agent-protocol';\nimport type { SandboxEnvironmentValueIface } from '@finalai/agent-provider/sandbox/types';\nimport {\n createSandboxRequestSchema,\n okResponseSchema,\n publishSandboxSetupRequestSchema,\n publishSandboxSetupResponseSchema,\n runSandboxCommandRequestSchema,\n runSandboxCommandResponseSchema,\n sandboxDescriptionSchema,\n sandboxListSchema,\n sandboxProviderListSchema,\n sandboxResourceSchema,\n sandboxSetupListSchema,\n sandboxSetupResourceSchema,\n setSandboxEgressExitRequestSchema,\n type PublishSandboxSetupResponseIface,\n type RunSandboxCommandRequestIface,\n type RunSandboxCommandResponseIface,\n type SandboxDescriptionIface,\n type SandboxListIface,\n type SandboxProviderIface,\n type SandboxResourceIface,\n type SandboxSetupInputIface,\n type SandboxSetupRefInputIface,\n type SandboxSetupResourceIface,\n} from '@finalai/agent-protocol/agent-platform';\nimport { encodePath, type ClientContextIface, type SignalOptionsIface } from \"./context.mjs\";\nimport { HttpMethod } from \"./http.mjs\";\n\nexport type { SandboxEnvironmentValueIface };\n\n// Sandboxes are project resources: a machine and its disk from a provider,\n// provided to an agent per capability by id. Creating one boots nothing.\n\n/** A published sandbox setup at a version, or `latest` (resolved once, at creation). */\nexport type SandboxSetupRefIface = SandboxSetupRefInputIface;\n\n/** Who a sandbox belongs to; it is deleted with its owner. */\nexport type SandboxOwnerIface = { conversation: string } | { session: string };\n\nexport interface CreateSandboxOptionsIface extends SignalOptionsIface {\n /** What should be on the machine: `defineSandboxSetup(...)`, or a published setup. */\n setup?: SandboxSetupInputIface | SandboxSetupRefIface;\n ownedBy?: SandboxOwnerIface;\n /** A retry with the same key returns the sandbox the first call created. */\n idempotencyKey?: string;\n}\n\nexport interface SandboxHandleIface {\n readonly id: string;\n /** The sandbox as it was when this handle was made. */\n readonly resource: SandboxResourceIface;\n get: (options?: SignalOptionsIface) => Promise<SandboxResourceIface>;\n /** Runs one command to completion, booting the sandbox if needed. */\n run: (\n args: RunSandboxCommandRequestIface & SignalOptionsIface,\n ) => Promise<RunSandboxCommandResponseIface>;\n /** What is known about the machine: checkouts, services, commands, notes. */\n description: (options?: SignalOptionsIface) => Promise<SandboxDescriptionIface>;\n /**\n * Sends the sandbox's outbound traffic through an integration's egress exit (`intg_...`),\n * or straight out with `null`.\n */\n setEgressExit: (\n args: { integration: string | null } & SignalOptionsIface,\n ) => Promise<SandboxResourceIface>;\n delete: (options?: SignalOptionsIface) => Promise<void>;\n}\n\nexport interface SandboxesApiIface {\n create: (\n environment: SandboxEnvironmentValueIface,\n options?: CreateSandboxOptionsIface,\n ) => Promise<SandboxHandleIface>;\n get: (sandboxId: string, options?: SignalOptionsIface) => Promise<SandboxHandleIface>;\n list: (\n options?: SignalOptionsIface & {\n conversation?: string;\n session?: string;\n cursor?: string;\n limit?: number;\n },\n ) => Promise<SandboxListIface>;\n /** The providers this project can create sandboxes on. */\n providers: (options?: SignalOptionsIface) => Promise<SandboxProviderIface[]>;\n}\n\nexport interface SandboxSetupsApiIface {\n /** Publishes the next version of `name`. */\n publish: (\n args: { name: string; setup: SandboxSetupInputIface } & SignalOptionsIface,\n ) => Promise<PublishSandboxSetupResponseIface>;\n get: (\n args: { id: string; version?: number } & SignalOptionsIface,\n ) => Promise<SandboxSetupResourceIface>;\n list: (\n options?: SignalOptionsIface & { cursor?: string; limit?: number },\n ) => Promise<SandboxSetupResourceIface[]>;\n}\n\nconst projectPath = (projectId: string, suffix: string): string =>\n `/v1/projects/${encodePath(projectId)}${suffix}`;\n\nexport const createSandboxesApi = (args: {\n context: ClientContextIface;\n projectId: string;\n}): SandboxesApiIface => {\n const { http } = args.context;\n const sandboxPath = (sandboxId: string, suffix = '') =>\n projectPath(args.projectId, `/sandboxes/${encodePath(sandboxId)}${suffix}`);\n const handle = (resource: SandboxResourceIface): SandboxHandleIface => ({\n id: resource.id,\n resource,\n get: (options) =>\n http.request({\n method: HttpMethod.Get,\n path: sandboxPath(resource.id),\n response: sandboxResourceSchema,\n signal: options?.signal,\n }),\n run: ({ signal, ...value }) =>\n http.request({\n method: HttpMethod.Post,\n path: sandboxPath(resource.id, '/run'),\n body: { schema: runSandboxCommandRequestSchema, value },\n response: runSandboxCommandResponseSchema,\n signal,\n }),\n description: (options) =>\n http.request({\n method: HttpMethod.Get,\n path: sandboxPath(resource.id, '/description'),\n response: sandboxDescriptionSchema,\n signal: options?.signal,\n }),\n setEgressExit: ({ signal, ...value }) =>\n http.request({\n method: HttpMethod.Put,\n path: sandboxPath(resource.id, '/egress-exit'),\n body: { schema: setSandboxEgressExitRequestSchema, value },\n response: sandboxResourceSchema,\n signal,\n }),\n delete: async (options) => {\n await http.request({\n method: HttpMethod.Delete,\n path: sandboxPath(resource.id),\n response: okResponseSchema,\n signal: options?.signal,\n });\n },\n });\n return {\n create: async (environment, options) =>\n handle(\n await http.request({\n method: HttpMethod.Post,\n path: projectPath(args.projectId, '/sandboxes'),\n body: {\n schema: createSandboxRequestSchema,\n value: {\n provider: environment.provider,\n environment: jsonObjectSchema.parse(environment.environment ?? {}),\n setup: options?.setup,\n ownedBy: options?.ownedBy,\n idempotencyKey: options?.idempotencyKey,\n },\n },\n response: sandboxResourceSchema,\n signal: options?.signal,\n }),\n ),\n get: async (sandboxId, options) =>\n handle(\n await http.request({\n method: HttpMethod.Get,\n path: sandboxPath(sandboxId),\n response: sandboxResourceSchema,\n signal: options?.signal,\n }),\n ),\n list: (options) =>\n http.request({\n method: HttpMethod.Get,\n path: projectPath(args.projectId, '/sandboxes'),\n query: {\n conversation: options?.conversation,\n session: options?.session,\n cursor: options?.cursor,\n limit: options?.limit,\n },\n response: sandboxListSchema,\n signal: options?.signal,\n }),\n providers: async (options) =>\n (\n await http.request({\n method: HttpMethod.Get,\n path: projectPath(args.projectId, '/sandbox-providers'),\n response: sandboxProviderListSchema,\n signal: options?.signal,\n })\n ).providers,\n };\n};\n\nexport const createSandboxSetupsApi = (args: {\n context: ClientContextIface;\n projectId: string;\n}): SandboxSetupsApiIface => {\n const { http } = args.context;\n return {\n publish: ({ signal, ...value }) =>\n http.request({\n method: HttpMethod.Post,\n path: projectPath(args.projectId, '/sandbox-setups'),\n body: { schema: publishSandboxSetupRequestSchema, value },\n response: publishSandboxSetupResponseSchema,\n signal,\n }),\n get: ({ id, version, signal }) =>\n http.request({\n method: HttpMethod.Get,\n path: projectPath(args.projectId, `/sandbox-setups/${encodePath(id)}`),\n query: { version },\n response: sandboxSetupResourceSchema,\n signal,\n }),\n list: async (options) =>\n (\n await http.request({\n method: HttpMethod.Get,\n path: projectPath(args.projectId, '/sandbox-setups'),\n query: { cursor: options?.cursor, limit: options?.limit },\n response: sandboxSetupListSchema,\n signal: options?.signal,\n })\n ).setups,\n };\n};\n"],
5
+ "mappings": "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",
6
+ "names": []
7
+ }
@@ -0,0 +1,9 @@
1
+ import { type ConversationScheduleIface } from '@finalai/agent-protocol/agent-platform';
2
+ import { type ClientContextIface, type SignalOptionsIface } from "./context.mjs";
3
+ export interface ProjectSchedulesApiIface {
4
+ list: (options?: SignalOptionsIface) => Promise<ConversationScheduleIface[]>;
5
+ }
6
+ export declare const createProjectSchedulesApi: (args: {
7
+ context: ClientContextIface;
8
+ projectId: string;
9
+ }) => ProjectSchedulesApiIface;