@finalai/agents 0.10.0 → 0.12.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.
- package/HOSTING.md +334 -245
- package/README.md +214 -29
- package/dist/modules/agent-client/agent-input.d.mts +24 -0
- package/dist/modules/agent-client/agent-input.mjs +46 -0
- package/dist/modules/agent-client/agent-input.mjs.map +7 -0
- package/dist/modules/agent-client/channels.d.mts +52 -3
- package/dist/modules/agent-client/channels.mjs +71 -10
- package/dist/modules/agent-client/channels.mjs.map +2 -2
- package/dist/modules/agent-client/client.d.mts +85 -20
- package/dist/modules/agent-client/client.mjs +74 -21
- package/dist/modules/agent-client/client.mjs.map +2 -2
- package/dist/modules/agent-client/config-options.mjs +1 -2
- package/dist/modules/agent-client/config-options.mjs.map +2 -2
- package/dist/modules/agent-client/conversation-resources.d.mts +85 -0
- package/dist/modules/agent-client/conversation-resources.mjs +150 -0
- package/dist/modules/agent-client/conversation-resources.mjs.map +7 -0
- package/dist/modules/agent-client/conversations.d.mts +116 -38
- package/dist/modules/agent-client/conversations.mjs +379 -71
- package/dist/modules/agent-client/conversations.mjs.map +2 -2
- package/dist/modules/agent-client/defaults.d.mts +8 -0
- package/dist/modules/agent-client/defaults.mjs +77 -0
- package/dist/modules/agent-client/defaults.mjs.map +7 -0
- package/dist/modules/agent-client/errors.d.mts +22 -2
- package/dist/modules/agent-client/errors.mjs +19 -0
- package/dist/modules/agent-client/errors.mjs.map +2 -2
- package/dist/modules/agent-client/events.d.mts +62 -0
- package/dist/modules/agent-client/events.mjs +107 -0
- package/dist/modules/agent-client/events.mjs.map +7 -0
- package/dist/modules/agent-client/harnesses.d.mts +66 -0
- package/dist/modules/agent-client/harnesses.mjs +156 -0
- package/dist/modules/agent-client/harnesses.mjs.map +7 -0
- package/dist/modules/agent-client/http.d.mts +2 -1
- package/dist/modules/agent-client/http.mjs +21 -2
- package/dist/modules/agent-client/http.mjs.map +2 -2
- package/dist/modules/agent-client/index.d.mts +21 -6
- package/dist/modules/agent-client/index.mjs +26 -0
- package/dist/modules/agent-client/index.mjs.map +2 -2
- package/dist/modules/agent-client/integrations.d.mts +40 -0
- package/dist/modules/agent-client/integrations.mjs +92 -0
- package/dist/modules/agent-client/integrations.mjs.map +7 -0
- package/dist/modules/agent-client/local-host-protocol.d.mts +156 -0
- package/dist/modules/agent-client/local-host-protocol.mjs +258 -0
- package/dist/modules/agent-client/local-host-protocol.mjs.map +7 -0
- package/dist/modules/agent-client/local-host.d.mts +56 -0
- package/dist/modules/agent-client/local-host.mjs +200 -0
- package/dist/modules/agent-client/local-host.mjs.map +7 -0
- package/dist/modules/agent-client/oauth-clients.d.mts +36 -0
- package/dist/modules/agent-client/oauth-clients.mjs +67 -0
- package/dist/modules/agent-client/oauth-clients.mjs.map +7 -0
- package/dist/modules/agent-client/project-agents.d.mts +54 -0
- package/dist/modules/agent-client/project-agents.mjs +111 -0
- package/dist/modules/agent-client/project-agents.mjs.map +7 -0
- package/dist/modules/agent-client/project.d.mts +43 -0
- package/dist/modules/agent-client/project.mjs +66 -0
- package/dist/modules/agent-client/project.mjs.map +7 -0
- package/dist/modules/agent-client/projects.d.mts +61 -0
- package/dist/modules/agent-client/projects.mjs +145 -0
- package/dist/modules/agent-client/projects.mjs.map +7 -0
- package/dist/modules/agent-client/provide.d.mts +41 -0
- package/dist/modules/agent-client/provide.mjs +90 -0
- package/dist/modules/agent-client/provide.mjs.map +7 -0
- package/dist/modules/agent-client/publishers.d.mts +57 -0
- package/dist/modules/agent-client/publishers.mjs +109 -0
- package/dist/modules/agent-client/publishers.mjs.map +7 -0
- package/dist/modules/agent-client/requirements.d.mts +60 -0
- package/dist/modules/agent-client/requirements.mjs +83 -0
- package/dist/modules/agent-client/requirements.mjs.map +7 -0
- package/dist/modules/agent-client/sandbox-providers.d.mts +34 -0
- package/dist/modules/agent-client/sandbox-providers.mjs +75 -0
- package/dist/modules/agent-client/sandbox-providers.mjs.map +7 -0
- package/dist/modules/agent-client/sandbox-uri.d.mts +1 -1
- package/dist/modules/agent-client/sandbox-uri.mjs +4 -4
- package/dist/modules/agent-client/sandbox-uri.mjs.map +1 -1
- package/dist/modules/agent-client/sandboxes.d.mts +65 -0
- package/dist/modules/agent-client/sandboxes.mjs +130 -0
- package/dist/modules/agent-client/sandboxes.mjs.map +7 -0
- package/dist/modules/agent-client/schedules.d.mts +24 -0
- package/dist/modules/agent-client/schedules.mjs +56 -0
- package/dist/modules/agent-client/schedules.mjs.map +7 -0
- package/dist/modules/agent-client/sessions.d.mts +46 -8
- package/dist/modules/agent-client/sessions.mjs +91 -29
- package/dist/modules/agent-client/sessions.mjs.map +2 -2
- package/dist/modules/agent-client/start.d.mts +101 -0
- package/dist/modules/agent-client/start.mjs +260 -0
- package/dist/modules/agent-client/start.mjs.map +7 -0
- package/dist/modules/agent-client/test-fakes.d.mts +1 -0
- package/dist/modules/agent-client/test-fakes.mjs +3 -1
- package/dist/modules/agent-client/test-fakes.mjs.map +2 -2
- package/dist/modules/cli/agent-module.d.mts +39 -0
- package/dist/modules/cli/agent-module.mjs +89 -0
- package/dist/modules/cli/agent-module.mjs.map +7 -0
- package/dist/modules/cli/cli.d.mts +6 -6
- package/dist/modules/cli/cli.mjs +94 -120
- package/dist/modules/cli/cli.mjs.map +2 -2
- package/dist/modules/cli/conformance.d.mts +2 -6
- package/dist/modules/cli/conformance.mjs +5 -8
- package/dist/modules/cli/conformance.mjs.map +2 -2
- package/dist/modules/cli/main.mjs.map +1 -1
- package/dist/modules/cli/output.d.mts +0 -9
- package/dist/modules/cli/output.mjs +7 -85
- package/dist/modules/cli/output.mjs.map +2 -2
- package/dist/modules/harnesses.mjs.map +2 -2
- package/dist/modules/index.d.mts +0 -2
- package/dist/modules/index.mjs +0 -4
- package/dist/modules/index.mjs.map +2 -2
- package/dist/modules/integrations.d.mts +24 -0
- package/dist/modules/integrations.mjs +30 -0
- package/dist/modules/integrations.mjs.map +7 -0
- package/dist/modules/public.d.mts +10 -10
- package/dist/modules/public.mjs +29 -78
- package/dist/modules/public.mjs.map +2 -2
- package/dist/modules/sandboxes.d.mts +2 -0
- package/dist/modules/sandboxes.mjs +4 -0
- package/dist/modules/sandboxes.mjs.map +2 -2
- package/dist/modules/verify.d.mts +1 -0
- package/dist/modules/verify.mjs +2 -0
- package/dist/modules/verify.mjs.map +7 -0
- package/dist/modules/webhooks.d.mts +37 -0
- package/dist/modules/webhooks.mjs +100 -0
- package/dist/modules/webhooks.mjs.map +7 -0
- package/examples/release-scout/README.md +18 -10
- package/examples/release-scout/agent.ts +41 -0
- package/examples/release-scout/by-name.ts +43 -0
- package/examples/release-scout/db.ts +6 -0
- package/examples/release-scout/instructions.md +5 -0
- package/examples/release-scout/run-on-a-computer.ts +49 -0
- package/examples/release-scout/run.ts +38 -0
- package/package.json +42 -28
- package/dist/modules/agent-client/build.d.mts +0 -110
- package/dist/modules/agent-client/build.mjs +0 -213
- package/dist/modules/agent-client/build.mjs.map +0 -7
- package/dist/modules/authoring/index.d.mts +0 -1
- package/dist/modules/authoring/index.mjs +0 -2
- package/dist/modules/authoring/index.mjs.map +0 -7
- package/dist/modules/authoring/instructions.d.mts +0 -1
- package/dist/modules/authoring/instructions.mjs +0 -2
- package/dist/modules/authoring/instructions.mjs.map +0 -7
- package/dist/modules/authoring/providers.d.mts +0 -2
- package/dist/modules/authoring/providers.mjs +0 -1
- package/dist/modules/authoring/providers.mjs.map +0 -7
- package/dist/modules/cli/build.d.mts +0 -22
- package/dist/modules/cli/build.mjs +0 -77
- package/dist/modules/cli/build.mjs.map +0 -7
- package/dist/modules/cli/channel-install.d.mts +0 -12
- package/dist/modules/cli/channel-install.mjs +0 -25
- package/dist/modules/cli/channel-install.mjs.map +0 -7
- package/dist/modules/cli/channel-socket.d.mts +0 -9
- package/dist/modules/cli/channel-socket.mjs +0 -114
- package/dist/modules/cli/channel-socket.mjs.map +0 -7
- package/dist/modules/cli/dev.d.mts +0 -26
- package/dist/modules/cli/dev.mjs +0 -311
- package/dist/modules/cli/dev.mjs.map +0 -7
- package/dist/modules/cli/files.d.mts +0 -18
- package/dist/modules/cli/files.mjs +0 -66
- package/dist/modules/cli/files.mjs.map +0 -7
- package/dist/modules/cli/harness-descriptions.d.mts +0 -20
- package/dist/modules/cli/harness-descriptions.mjs +0 -70
- package/dist/modules/cli/harness-descriptions.mjs.map +0 -7
- package/dist/modules/cli/publish.d.mts +0 -15
- package/dist/modules/cli/publish.mjs +0 -92
- package/dist/modules/cli/publish.mjs.map +0 -7
- package/dist/modules/compile.d.mts +0 -3
- package/dist/modules/compile.mjs +0 -58
- package/dist/modules/compile.mjs.map +0 -7
- package/dist/modules/index.browser.d.mts +0 -4
- package/dist/modules/index.browser.mjs +0 -8
- package/dist/modules/index.browser.mjs.map +0 -7
- package/examples/custom-harness/README.md +0 -16
- package/examples/custom-harness/agent.ts +0 -154
- package/examples/custom-sandbox/README.md +0 -12
- package/examples/custom-sandbox/agent.ts +0 -14
- package/examples/custom-sandbox/sandbox.ts +0 -24
- package/examples/release-scout/agent/agent.ts +0 -22
- package/examples/release-scout/agent/channels/github-signature.ts +0 -27
- package/examples/release-scout/agent/channels/github.ts +0 -32
- package/examples/release-scout/agent/connections/linear.ts +0 -9
- package/examples/release-scout/agent/hooks/audit.ts +0 -24
- package/examples/release-scout/agent/instructions/org-context.ts +0 -26
- package/examples/release-scout/agent/instructions.md +0 -2
- package/examples/release-scout/agent/sandbox.ts +0 -20
- package/examples/release-scout/agent/schedules/daily-digest.md +0 -7
- package/examples/release-scout/agent/skills/triage/SKILL.md +0 -8
- package/examples/release-scout/agent/skills/triage/checklist.md +0 -3
- package/examples/release-scout/agent/tools/lookup_release_notes.ts +0 -24
- 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
|
+
}
|
|
@@ -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("
|
|
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.
|
|
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
|
|
27
|
-
const target = { conversationId: uri.hostname,
|
|
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
|
|
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,65 @@
|
|
|
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
|
+
delete: (options?: SignalOptionsIface) => Promise<void>;
|
|
30
|
+
}
|
|
31
|
+
export interface SandboxesApiIface {
|
|
32
|
+
create: (environment: SandboxEnvironmentValueIface, options?: CreateSandboxOptionsIface) => Promise<SandboxHandleIface>;
|
|
33
|
+
get: (sandboxId: string, options?: SignalOptionsIface) => Promise<SandboxHandleIface>;
|
|
34
|
+
list: (options?: SignalOptionsIface & {
|
|
35
|
+
conversation?: string;
|
|
36
|
+
session?: string;
|
|
37
|
+
cursor?: string;
|
|
38
|
+
limit?: number;
|
|
39
|
+
}) => Promise<SandboxListIface>;
|
|
40
|
+
/** The providers this project can create sandboxes on. */
|
|
41
|
+
providers: (options?: SignalOptionsIface) => Promise<SandboxProviderIface[]>;
|
|
42
|
+
}
|
|
43
|
+
export interface SandboxSetupsApiIface {
|
|
44
|
+
/** Publishes the next version of `name`. */
|
|
45
|
+
publish: (args: {
|
|
46
|
+
name: string;
|
|
47
|
+
setup: SandboxSetupInputIface;
|
|
48
|
+
} & SignalOptionsIface) => Promise<PublishSandboxSetupResponseIface>;
|
|
49
|
+
get: (args: {
|
|
50
|
+
id: string;
|
|
51
|
+
version?: number;
|
|
52
|
+
} & SignalOptionsIface) => Promise<SandboxSetupResourceIface>;
|
|
53
|
+
list: (options?: SignalOptionsIface & {
|
|
54
|
+
cursor?: string;
|
|
55
|
+
limit?: number;
|
|
56
|
+
}) => Promise<SandboxSetupResourceIface[]>;
|
|
57
|
+
}
|
|
58
|
+
export declare const createSandboxesApi: (args: {
|
|
59
|
+
context: ClientContextIface;
|
|
60
|
+
projectId: string;
|
|
61
|
+
}) => SandboxesApiIface;
|
|
62
|
+
export declare const createSandboxSetupsApi: (args: {
|
|
63
|
+
context: ClientContextIface;
|
|
64
|
+
projectId: string;
|
|
65
|
+
}) => SandboxSetupsApiIface;
|
|
@@ -0,0 +1,130 @@
|
|
|
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
|
+
} from "@finalai/agent-protocol/agent-platform";
|
|
16
|
+
import { encodePath } from "./context.mjs";
|
|
17
|
+
import { HttpMethod } from "./http.mjs";
|
|
18
|
+
const projectPath = (projectId, suffix) => `/v1/projects/${encodePath(projectId)}${suffix}`;
|
|
19
|
+
const createSandboxesApi = (args) => {
|
|
20
|
+
const { http } = args.context;
|
|
21
|
+
const sandboxPath = (sandboxId, suffix = "") => projectPath(args.projectId, `/sandboxes/${encodePath(sandboxId)}${suffix}`);
|
|
22
|
+
const handle = (resource) => ({
|
|
23
|
+
id: resource.id,
|
|
24
|
+
resource,
|
|
25
|
+
get: (options) => http.request({
|
|
26
|
+
method: HttpMethod.Get,
|
|
27
|
+
path: sandboxPath(resource.id),
|
|
28
|
+
response: sandboxResourceSchema,
|
|
29
|
+
signal: options?.signal
|
|
30
|
+
}),
|
|
31
|
+
run: ({ signal, ...value }) => http.request({
|
|
32
|
+
method: HttpMethod.Post,
|
|
33
|
+
path: sandboxPath(resource.id, "/run"),
|
|
34
|
+
body: { schema: runSandboxCommandRequestSchema, value },
|
|
35
|
+
response: runSandboxCommandResponseSchema,
|
|
36
|
+
signal
|
|
37
|
+
}),
|
|
38
|
+
description: (options) => http.request({
|
|
39
|
+
method: HttpMethod.Get,
|
|
40
|
+
path: sandboxPath(resource.id, "/description"),
|
|
41
|
+
response: sandboxDescriptionSchema,
|
|
42
|
+
signal: options?.signal
|
|
43
|
+
}),
|
|
44
|
+
delete: async (options) => {
|
|
45
|
+
await http.request({
|
|
46
|
+
method: HttpMethod.Delete,
|
|
47
|
+
path: sandboxPath(resource.id),
|
|
48
|
+
response: okResponseSchema,
|
|
49
|
+
signal: options?.signal
|
|
50
|
+
});
|
|
51
|
+
}
|
|
52
|
+
});
|
|
53
|
+
return {
|
|
54
|
+
create: async (environment, options) => handle(
|
|
55
|
+
await http.request({
|
|
56
|
+
method: HttpMethod.Post,
|
|
57
|
+
path: projectPath(args.projectId, "/sandboxes"),
|
|
58
|
+
body: {
|
|
59
|
+
schema: createSandboxRequestSchema,
|
|
60
|
+
value: {
|
|
61
|
+
provider: environment.provider,
|
|
62
|
+
environment: jsonObjectSchema.parse(environment.environment ?? {}),
|
|
63
|
+
setup: options?.setup,
|
|
64
|
+
ownedBy: options?.ownedBy,
|
|
65
|
+
idempotencyKey: options?.idempotencyKey
|
|
66
|
+
}
|
|
67
|
+
},
|
|
68
|
+
response: sandboxResourceSchema,
|
|
69
|
+
signal: options?.signal
|
|
70
|
+
})
|
|
71
|
+
),
|
|
72
|
+
get: async (sandboxId, options) => handle(
|
|
73
|
+
await http.request({
|
|
74
|
+
method: HttpMethod.Get,
|
|
75
|
+
path: sandboxPath(sandboxId),
|
|
76
|
+
response: sandboxResourceSchema,
|
|
77
|
+
signal: options?.signal
|
|
78
|
+
})
|
|
79
|
+
),
|
|
80
|
+
list: (options) => http.request({
|
|
81
|
+
method: HttpMethod.Get,
|
|
82
|
+
path: projectPath(args.projectId, "/sandboxes"),
|
|
83
|
+
query: {
|
|
84
|
+
conversation: options?.conversation,
|
|
85
|
+
session: options?.session,
|
|
86
|
+
cursor: options?.cursor,
|
|
87
|
+
limit: options?.limit
|
|
88
|
+
},
|
|
89
|
+
response: sandboxListSchema,
|
|
90
|
+
signal: options?.signal
|
|
91
|
+
}),
|
|
92
|
+
providers: async (options) => (await http.request({
|
|
93
|
+
method: HttpMethod.Get,
|
|
94
|
+
path: projectPath(args.projectId, "/sandbox-providers"),
|
|
95
|
+
response: sandboxProviderListSchema,
|
|
96
|
+
signal: options?.signal
|
|
97
|
+
})).providers
|
|
98
|
+
};
|
|
99
|
+
};
|
|
100
|
+
const createSandboxSetupsApi = (args) => {
|
|
101
|
+
const { http } = args.context;
|
|
102
|
+
return {
|
|
103
|
+
publish: ({ signal, ...value }) => http.request({
|
|
104
|
+
method: HttpMethod.Post,
|
|
105
|
+
path: projectPath(args.projectId, "/sandbox-setups"),
|
|
106
|
+
body: { schema: publishSandboxSetupRequestSchema, value },
|
|
107
|
+
response: publishSandboxSetupResponseSchema,
|
|
108
|
+
signal
|
|
109
|
+
}),
|
|
110
|
+
get: ({ id, version, signal }) => http.request({
|
|
111
|
+
method: HttpMethod.Get,
|
|
112
|
+
path: projectPath(args.projectId, `/sandbox-setups/${encodePath(id)}`),
|
|
113
|
+
query: { version },
|
|
114
|
+
response: sandboxSetupResourceSchema,
|
|
115
|
+
signal
|
|
116
|
+
}),
|
|
117
|
+
list: async (options) => (await http.request({
|
|
118
|
+
method: HttpMethod.Get,
|
|
119
|
+
path: projectPath(args.projectId, "/sandbox-setups"),
|
|
120
|
+
query: { cursor: options?.cursor, limit: options?.limit },
|
|
121
|
+
response: sandboxSetupListSchema,
|
|
122
|
+
signal: options?.signal
|
|
123
|
+
})).setups
|
|
124
|
+
};
|
|
125
|
+
};
|
|
126
|
+
export {
|
|
127
|
+
createSandboxSetupsApi,
|
|
128
|
+
createSandboxesApi
|
|
129
|
+
};
|
|
130
|
+
//# 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 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 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 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,24 @@
|
|
|
1
|
+
import { type ScheduleIface, type ScheduleRunResultIface, type UpdateScheduleRequestIface } from '@finalai/agent-protocol/agent-platform';
|
|
2
|
+
import { type ClientContextIface, type SignalOptionsIface } from "./context.mjs";
|
|
3
|
+
import { type ProvideIface } from "./provide.mjs";
|
|
4
|
+
export type ScheduleRef = {
|
|
5
|
+
scheduleId: string;
|
|
6
|
+
} | {
|
|
7
|
+
agent: string;
|
|
8
|
+
key: string;
|
|
9
|
+
};
|
|
10
|
+
export interface ScheduleUpdateIface extends Omit<UpdateScheduleRequestIface, 'provide'> {
|
|
11
|
+
/** What its runs start with; fails with `requirements_unmet` unless it meets the agent's requirements. */
|
|
12
|
+
provide?: ProvideIface;
|
|
13
|
+
}
|
|
14
|
+
export interface SchedulesApiIface {
|
|
15
|
+
/** `agent` narrows to one agent's schedules, by its id. */
|
|
16
|
+
list: (options?: SignalOptionsIface & {
|
|
17
|
+
agent?: string;
|
|
18
|
+
}) => Promise<ScheduleIface[]>;
|
|
19
|
+
runNow: (args: ScheduleRef & SignalOptionsIface) => Promise<ScheduleRunResultIface>;
|
|
20
|
+
update: (args: {
|
|
21
|
+
scheduleId: string;
|
|
22
|
+
} & ScheduleUpdateIface & SignalOptionsIface) => Promise<ScheduleIface>;
|
|
23
|
+
}
|
|
24
|
+
export declare const createSchedulesApi: ({ http }: ClientContextIface) => SchedulesApiIface;
|