@finalai/agents 0.11.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.
Files changed (185) 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 +52 -3
  7. package/dist/modules/agent-client/channels.mjs +71 -10
  8. package/dist/modules/agent-client/channels.mjs.map +2 -2
  9. package/dist/modules/agent-client/client.d.mts +85 -20
  10. package/dist/modules/agent-client/client.mjs +74 -21
  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 +85 -0
  15. package/dist/modules/agent-client/conversation-resources.mjs +150 -0
  16. package/dist/modules/agent-client/conversation-resources.mjs.map +7 -0
  17. package/dist/modules/agent-client/conversations.d.mts +116 -38
  18. package/dist/modules/agent-client/conversations.mjs +379 -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 +43 -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 +65 -0
  75. package/dist/modules/agent-client/sandboxes.mjs +130 -0
  76. package/dist/modules/agent-client/sandboxes.mjs.map +7 -0
  77. package/dist/modules/agent-client/schedules.d.mts +24 -0
  78. package/dist/modules/agent-client/schedules.mjs +56 -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 +42 -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/index.d.mts +0 -1
  133. package/dist/modules/authoring/index.mjs +0 -2
  134. package/dist/modules/authoring/index.mjs.map +0 -7
  135. package/dist/modules/authoring/instructions.d.mts +0 -1
  136. package/dist/modules/authoring/instructions.mjs +0 -2
  137. package/dist/modules/authoring/instructions.mjs.map +0 -7
  138. package/dist/modules/authoring/providers.d.mts +0 -2
  139. package/dist/modules/authoring/providers.mjs +0 -1
  140. package/dist/modules/authoring/providers.mjs.map +0 -7
  141. package/dist/modules/cli/build.d.mts +0 -22
  142. package/dist/modules/cli/build.mjs +0 -77
  143. package/dist/modules/cli/build.mjs.map +0 -7
  144. package/dist/modules/cli/channel-install.d.mts +0 -12
  145. package/dist/modules/cli/channel-install.mjs +0 -25
  146. package/dist/modules/cli/channel-install.mjs.map +0 -7
  147. package/dist/modules/cli/channel-socket.d.mts +0 -9
  148. package/dist/modules/cli/channel-socket.mjs +0 -114
  149. package/dist/modules/cli/channel-socket.mjs.map +0 -7
  150. package/dist/modules/cli/dev.d.mts +0 -26
  151. package/dist/modules/cli/dev.mjs +0 -311
  152. package/dist/modules/cli/dev.mjs.map +0 -7
  153. package/dist/modules/cli/files.d.mts +0 -18
  154. package/dist/modules/cli/files.mjs +0 -66
  155. package/dist/modules/cli/files.mjs.map +0 -7
  156. package/dist/modules/cli/harness-descriptions.d.mts +0 -20
  157. package/dist/modules/cli/harness-descriptions.mjs +0 -70
  158. package/dist/modules/cli/harness-descriptions.mjs.map +0 -7
  159. package/dist/modules/cli/publish.d.mts +0 -15
  160. package/dist/modules/cli/publish.mjs +0 -92
  161. package/dist/modules/cli/publish.mjs.map +0 -7
  162. package/dist/modules/compile.d.mts +0 -3
  163. package/dist/modules/compile.mjs +0 -58
  164. package/dist/modules/compile.mjs.map +0 -7
  165. package/dist/modules/index.browser.d.mts +0 -4
  166. package/dist/modules/index.browser.mjs +0 -8
  167. package/dist/modules/index.browser.mjs.map +0 -7
  168. package/examples/custom-harness/README.md +0 -16
  169. package/examples/custom-harness/agent.ts +0 -154
  170. package/examples/custom-sandbox/README.md +0 -12
  171. package/examples/custom-sandbox/agent.ts +0 -14
  172. package/examples/custom-sandbox/sandbox.ts +0 -24
  173. package/examples/release-scout/agent/agent.ts +0 -22
  174. package/examples/release-scout/agent/channels/github-signature.ts +0 -27
  175. package/examples/release-scout/agent/channels/github.ts +0 -32
  176. package/examples/release-scout/agent/connections/linear.ts +0 -9
  177. package/examples/release-scout/agent/hooks/audit.ts +0 -24
  178. package/examples/release-scout/agent/instructions/org-context.ts +0 -26
  179. package/examples/release-scout/agent/instructions.md +0 -2
  180. package/examples/release-scout/agent/sandbox.ts +0 -20
  181. package/examples/release-scout/agent/schedules/daily-digest.md +0 -7
  182. package/examples/release-scout/agent/skills/triage/SKILL.md +0 -8
  183. package/examples/release-scout/agent/skills/triage/checklist.md +0 -3
  184. package/examples/release-scout/agent/tools/lookup_release_notes.ts +0 -24
  185. package/examples/release-scout/client.ts +0 -122
@@ -0,0 +1,200 @@
1
+ import { DEFAULT_CAPABILITY_ACCESS } from "@finalai/agent-protocol";
2
+ import {
3
+ CodeLineType,
4
+ serveInProcessCode
5
+ } from "@finalai/agent-provider/code-host";
6
+ import { sandboxGrantFor } from "@finalai/agent-provider/sandbox/grant";
7
+ import { serveSandboxHandle } from "@finalai/agent-provider/sandbox/server";
8
+ import {
9
+ createHostPeer,
10
+ LOCAL_HOST_PROTOCOL_VERSION,
11
+ localHostCodeRunParamsSchema,
12
+ localHostHelloResultSchema,
13
+ LocalHostMethod,
14
+ localHostSecretResultSchema,
15
+ localHostPath,
16
+ splitLocalHostChannel
17
+ } from "./local-host-protocol.mjs";
18
+ const runToCompletion = async (args) => {
19
+ const invocation = localHostCodeRunParamsSchema.safeParse(args.params);
20
+ if (!invocation.success)
21
+ return { type: CodeLineType.Error, message: `invalid invocation: ${invocation.error.message}` };
22
+ for await (const line of args.run(invocation.data, {
23
+ signal: args.signal,
24
+ secrets: args.secrets
25
+ })) {
26
+ if (line.type === CodeLineType.Progress) {
27
+ args.onProgress(line.label == null ? { data: line.data } : line);
28
+ continue;
29
+ }
30
+ return line;
31
+ }
32
+ return { type: CodeLineType.Error, message: "the code ended without a result" };
33
+ };
34
+ const untilAborted = (promise, signal) => {
35
+ if (signal == null) return promise;
36
+ return new Promise((resolve, reject) => {
37
+ const onAbort = () => reject(abortReason(signal));
38
+ if (signal.aborted) {
39
+ onAbort();
40
+ return;
41
+ }
42
+ signal.addEventListener("abort", onAbort, { once: true });
43
+ promise.then(resolve, reject).finally(() => signal.removeEventListener("abort", onAbort));
44
+ });
45
+ };
46
+ const abortReason = (signal) => signal.reason instanceof Error ? signal.reason : new Error("local host opening was aborted");
47
+ const keepAliveHolds = (keepAlive) => {
48
+ let holds = 0;
49
+ return () => {
50
+ if (holds === 0) keepAlive?.ref();
51
+ holds += 1;
52
+ let released = false;
53
+ return () => {
54
+ if (released) return;
55
+ released = true;
56
+ holds -= 1;
57
+ if (holds === 0) keepAlive?.unref();
58
+ };
59
+ };
60
+ };
61
+ const holdingWhileBusy = (sandbox, hold) => new Proxy(sandbox, {
62
+ get: (target, property) => {
63
+ const value = Reflect.get(target, property);
64
+ if (typeof value !== "function") return value;
65
+ return (...args) => {
66
+ const release = hold();
67
+ let result;
68
+ try {
69
+ result = Reflect.apply(value, target, args);
70
+ } catch (cause) {
71
+ release();
72
+ throw cause;
73
+ }
74
+ void Promise.resolve(result).then((settled) => {
75
+ if (property !== "spawn" || typeof settled !== "object" || settled == null) return;
76
+ const wait = Reflect.get(settled, "wait");
77
+ if (typeof wait === "function") return Reflect.apply(wait, settled, []);
78
+ }).catch(() => void 0).finally(release);
79
+ return result;
80
+ };
81
+ }
82
+ });
83
+ const openLocalHost = async (args) => {
84
+ const signal = args.signal;
85
+ signal?.throwIfAborted();
86
+ const dialing = args.dial(localHostPath(args.projectId), signal);
87
+ const socket = await untilAborted(dialing, signal).catch((cause) => {
88
+ void dialing.then(
89
+ (late) => late.close(1e3, "aborted"),
90
+ () => void 0
91
+ );
92
+ throw cause;
93
+ });
94
+ const hold = keepAliveHolds(socket.keepAlive);
95
+ const starting = hold();
96
+ let sandbox = null;
97
+ let stopping = null;
98
+ const stopSandbox = () => stopping ??= sandbox?.stop().catch(() => void 0) ?? Promise.resolve();
99
+ try {
100
+ const channels = splitLocalHostChannel(socket);
101
+ const code = args.agent.code;
102
+ const document = args.agent.document;
103
+ const run = code == null ? null : serveInProcessCode(code, { openSandbox: args.compute.openSandbox });
104
+ if (args.capabilities.length > 0) {
105
+ const served = await args.compute.sandbox();
106
+ sandbox = served;
107
+ signal?.throwIfAborted();
108
+ const grant = sandboxGrantFor({
109
+ capabilities: args.capabilities,
110
+ required: {
111
+ ...Object.fromEntries(
112
+ args.capabilities.map((capability) => [
113
+ capability,
114
+ { access: DEFAULT_CAPABILITY_ACCESS[capability] }
115
+ ])
116
+ ),
117
+ ...args.agent.document.require.compute
118
+ }
119
+ });
120
+ serveSandboxHandle({
121
+ sandbox: holdingWhileBusy(served, hold),
122
+ authorize: async () => ({ expiresAt: null }),
123
+ access: { grant, lifecycle: false }
124
+ }).attach(channels.sandbox);
125
+ }
126
+ const peer = createHostPeer({
127
+ channel: channels.host,
128
+ onRequest: async (method, context) => {
129
+ if (method !== LocalHostMethod.CodeRun || run == null)
130
+ throw new Error(`this process does not answer ${method}`);
131
+ const release = hold();
132
+ try {
133
+ return await runToCompletion({
134
+ run,
135
+ params: context.params,
136
+ signal: context.signal,
137
+ // Asked of the platform for this call; only names the agent lists.
138
+ secrets: {
139
+ get: async (name) => {
140
+ if (!document.secrets.includes(name))
141
+ throw new Error(`${name} is not one of the secrets this agent lists`);
142
+ return localHostSecretResultSchema.parse(
143
+ await peer.request(LocalHostMethod.CodeSecret, { requestId: context.id, name })
144
+ ).value;
145
+ }
146
+ },
147
+ onProgress: (progress) => peer.notify(LocalHostMethod.CodeProgress, {
148
+ requestId: context.id,
149
+ data: JSON.parse(JSON.stringify(progress.data ?? null)),
150
+ ...progress.label == null ? {} : { label: progress.label }
151
+ })
152
+ });
153
+ } finally {
154
+ release();
155
+ }
156
+ }
157
+ });
158
+ void peer.closed.then(stopSandbox);
159
+ const hello = localHostHelloResultSchema.safeParse(
160
+ await untilAborted(
161
+ peer.request(LocalHostMethod.Hello, {
162
+ protocolVersion: LOCAL_HOST_PROTOCOL_VERSION,
163
+ owner: { kind: args.owner.kind, ...args.owner.id == null ? {} : { id: args.owner.id } },
164
+ agent: args.agent.hash,
165
+ capabilities: args.capabilities,
166
+ tools: code == null ? [] : Object.keys(code.tools),
167
+ hooks: code == null ? [] : Object.keys(code.hooks),
168
+ approvals: code == null ? [] : Object.keys(code.approvals).filter((name) => document.tools[name] != null)
169
+ }),
170
+ signal
171
+ )
172
+ );
173
+ if (!hello.success) {
174
+ peer.close(1002, "bad hello");
175
+ throw new Error(
176
+ `The platform answered the local host hello unexpectedly: ${hello.error.message}`
177
+ );
178
+ }
179
+ if (args.capabilities.length > 0 && hello.data.sandboxId == null) {
180
+ peer.close(1002, "no sandbox id");
181
+ throw new Error("The platform did not name the sandbox this process serves");
182
+ }
183
+ return {
184
+ hostId: hello.data.hostId,
185
+ ownerId: hello.data.owner.id,
186
+ sandboxId: hello.data.sandboxId,
187
+ closed: peer.closed,
188
+ close: () => peer.close(1e3, "client closed"),
189
+ established: starting
190
+ };
191
+ } catch (cause) {
192
+ socket.close(1e3, "local host failed to open");
193
+ void stopSandbox();
194
+ throw cause;
195
+ }
196
+ };
197
+ export {
198
+ openLocalHost
199
+ };
200
+ //# sourceMappingURL=local-host.mjs.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../../../../src/agent-client/local-host.ts"],
4
+ "sourcesContent": ["import { DEFAULT_CAPABILITY_ACCESS, type Capability } from '@finalai/agent-protocol';\nimport {\n CodeLineType,\n serveInProcessCode,\n type CodeRunIface,\n type CodeSandboxEndpointIface,\n type CodeSecretsIface,\n} from '@finalai/agent-provider/code-host';\nimport type { SandboxClientIface } from '@finalai/agent-provider/sandbox/client';\nimport { sandboxGrantFor } from '@finalai/agent-provider/sandbox/grant';\nimport { serveSandboxHandle } from '@finalai/agent-provider/sandbox/server';\nimport type { NetworkSandboxSessionIface } from '@finalai/agent-provider/sandbox/types';\nimport type { FrameChannelIface } from '@finalai/agent-provider/sandbox/wire';\nimport type { ResolvedAgentIface } from \"./agent-input.mjs\";\nimport {\n createHostPeer,\n LOCAL_HOST_PROTOCOL_VERSION,\n localHostCodeRunParamsSchema,\n localHostHelloResultSchema,\n LocalHostMethod,\n localHostSecretResultSchema,\n localHostPath,\n splitLocalHostChannel,\n type LocalHostCodeResultIface,\n type LocalHostOwnerIface,\n} from \"./local-host-protocol.mjs\";\n\n// The client's side of a local host connection (local-host-protocol.ts): it\n// serves the agent's `files` and `shell` from this process and answers the\n// platform's calls to the agent's in-process code. When the connection ends\n// the session carries on; the platform reports this process's tools and\n// compute as unavailable until a connection resumes them.\n\nexport interface LocalComputeIface {\n /** The sandbox this process serves `files` and `shell` from. */\n sandbox: () => Promise<NetworkSandboxSessionIface>;\n /** Connects `ctx.sandbox(capability)` in in-process code to a sandbox endpoint. */\n openSandbox: (endpoint: CodeSandboxEndpointIface) => Promise<SandboxClientIface>;\n}\n\n/**\n * Whether the socket keeps this Node process alive. The connection holds it\n * while it starts and while the platform is using it (a code call, a sandbox\n * operation, a running command), and lets an idle script exit.\n */\nexport interface LocalHostKeepAliveIface {\n ref: () => void;\n unref: () => void;\n}\n\nexport interface LocalHostSocketIface extends FrameChannelIface {\n /** Absent: the socket's lifetime is not this process's concern. */\n keepAlive?: LocalHostKeepAliveIface;\n}\n\nexport interface OpenLocalHostArgsIface {\n /** Opens the socket at an API path (`/v1/projects/:id/local-hosts`), referenced. */\n dial: (path: string, signal?: AbortSignal) => Promise<LocalHostSocketIface>;\n projectId: string;\n owner: LocalHostOwnerIface;\n agent: ResolvedAgentIface;\n /** Capabilities served from this process; may be empty. */\n capabilities: Capability[];\n compute: LocalComputeIface;\n /** Abandons opening: the connection closes and whatever it started stops. */\n signal?: AbortSignal;\n}\n\nexport interface LocalHostIface {\n hostId: string;\n /** The session or conversation id the platform reserved or confirmed. */\n ownerId: string;\n /** What names this process's compute in `provide.compute`; null when it serves none. */\n sandboxId: string | null;\n closed: Promise<{ code: number; reason: string }>;\n close: () => void;\n /**\n * The session or conversation it serves exists: the socket stops keeping\n * the process alive while nothing uses it.\n */\n established: () => void;\n}\n\nconst runToCompletion = async (args: {\n run: CodeRunIface;\n params: unknown;\n signal: AbortSignal;\n secrets: CodeSecretsIface;\n onProgress: (progress: { data: unknown; label?: string }) => void;\n}): Promise<LocalHostCodeResultIface> => {\n const invocation = localHostCodeRunParamsSchema.safeParse(args.params);\n if (!invocation.success)\n return { type: CodeLineType.Error, message: `invalid invocation: ${invocation.error.message}` };\n for await (const line of args.run(invocation.data, {\n signal: args.signal,\n secrets: args.secrets,\n })) {\n if (line.type === CodeLineType.Progress) {\n args.onProgress(line.label == null ? { data: line.data } : line);\n continue;\n }\n return line;\n }\n return { type: CodeLineType.Error, message: 'the code ended without a result' };\n};\n\n// `promise`, or the signal's reason once it aborts first.\nconst untilAborted = <T>(promise: Promise<T>, signal: AbortSignal | undefined): Promise<T> => {\n if (signal == null) return promise;\n return new Promise<T>((resolve, reject) => {\n const onAbort = () => reject(abortReason(signal));\n if (signal.aborted) {\n onAbort();\n return;\n }\n signal.addEventListener('abort', onAbort, { once: true });\n promise.then(resolve, reject).finally(() => signal.removeEventListener('abort', onAbort));\n });\n};\n\nconst abortReason = (signal: AbortSignal): Error =>\n signal.reason instanceof Error ? signal.reason : new Error('local host opening was aborted');\n\n// Counts what needs the process alive; the socket is referenced while any does.\nconst keepAliveHolds = (keepAlive: LocalHostKeepAliveIface | undefined) => {\n let holds = 0;\n return (): (() => void) => {\n if (holds === 0) keepAlive?.ref();\n holds += 1;\n let released = false;\n return () => {\n if (released) return;\n released = true;\n holds -= 1;\n if (holds === 0) keepAlive?.unref();\n };\n };\n};\n\n// The served sandbox, holding the process alive while an operation runs and,\n// for a spawned command, until it exits.\nconst holdingWhileBusy = <T extends object>(sandbox: T, hold: () => () => void): T =>\n new Proxy(sandbox, {\n get: (target, property) => {\n const value: unknown = Reflect.get(target, property);\n if (typeof value !== 'function') return value;\n return (...args: unknown[]): unknown => {\n const release = hold();\n let result: unknown;\n try {\n result = Reflect.apply(value, target, args);\n } catch (cause) {\n release();\n throw cause;\n }\n void Promise.resolve(result)\n .then((settled) => {\n if (property !== 'spawn' || typeof settled !== 'object' || settled == null) return;\n const wait = Reflect.get(settled, 'wait');\n if (typeof wait === 'function') return Reflect.apply(wait, settled, []);\n })\n .catch(() => undefined)\n .finally(release);\n return result;\n };\n },\n });\n\nexport const openLocalHost = async (args: OpenLocalHostArgsIface): Promise<LocalHostIface> => {\n const signal = args.signal;\n signal?.throwIfAborted();\n const dialing = args.dial(localHostPath(args.projectId), signal);\n const socket = await untilAborted(dialing, signal).catch((cause: unknown) => {\n // A dial that ignores the signal still connects; close what it opens.\n void dialing.then(\n (late) => late.close(1000, 'aborted'),\n () => undefined,\n );\n throw cause;\n });\n\n // Until the hello succeeds, a failure or an abort closes the socket and\n // stops the sandbox; afterwards the sandbox stops when the socket closes.\n const hold = keepAliveHolds(socket.keepAlive);\n // Released once the caller has created what the host serves.\n const starting = hold();\n let sandbox: NetworkSandboxSessionIface | null = null;\n let stopping: Promise<void> | null = null;\n const stopSandbox = (): Promise<void> =>\n (stopping ??= sandbox?.stop().catch(() => undefined) ?? Promise.resolve());\n try {\n const channels = splitLocalHostChannel(socket);\n const code = args.agent.code;\n const document = args.agent.document;\n const run =\n code == null ? null : serveInProcessCode(code, { openSandbox: args.compute.openSandbox });\n\n if (args.capabilities.length > 0) {\n const served = await args.compute.sandbox();\n sandbox = served;\n signal?.throwIfAborted();\n // The agent's own access on what it requires; a capability served only\n // so a native harness can run here (`shell`, to launch it) gets the\n // access that takes.\n const grant = sandboxGrantFor({\n capabilities: args.capabilities,\n required: {\n ...Object.fromEntries(\n args.capabilities.map((capability) => [\n capability,\n { access: DEFAULT_CAPABILITY_ACCESS[capability] },\n ]),\n ),\n ...args.agent.document.require.compute,\n },\n });\n // The socket itself is authenticated; every call on it is the platform's.\n serveSandboxHandle({\n sandbox: holdingWhileBusy(served, hold),\n authorize: async () => ({ expiresAt: null }),\n access: { grant, lifecycle: false },\n }).attach(channels.sandbox);\n }\n\n const peer = createHostPeer({\n channel: channels.host,\n onRequest: async (method, context) => {\n if (method !== LocalHostMethod.CodeRun || run == null)\n throw new Error(`this process does not answer ${method}`);\n const release = hold();\n try {\n return await runToCompletion({\n run,\n params: context.params,\n signal: context.signal,\n // Asked of the platform for this call; only names the agent lists.\n secrets: {\n get: async (name) => {\n if (!document.secrets.includes(name))\n throw new Error(`${name} is not one of the secrets this agent lists`);\n return localHostSecretResultSchema.parse(\n await peer.request(LocalHostMethod.CodeSecret, { requestId: context.id, name }),\n ).value;\n },\n },\n onProgress: (progress) =>\n peer.notify(LocalHostMethod.CodeProgress, {\n requestId: context.id,\n data: JSON.parse(JSON.stringify(progress.data ?? null)),\n ...(progress.label == null ? {} : { label: progress.label }),\n }),\n });\n } finally {\n release();\n }\n },\n });\n // Processes the model started here end with the connection; the session carries on.\n void peer.closed.then(stopSandbox);\n\n const hello = localHostHelloResultSchema.safeParse(\n await untilAborted(\n peer.request(LocalHostMethod.Hello, {\n protocolVersion: LOCAL_HOST_PROTOCOL_VERSION,\n owner: { kind: args.owner.kind, ...(args.owner.id == null ? {} : { id: args.owner.id }) },\n agent: args.agent.hash,\n capabilities: args.capabilities,\n tools: code == null ? [] : Object.keys(code.tools),\n hooks: code == null ? [] : Object.keys(code.hooks),\n approvals:\n code == null\n ? []\n : Object.keys(code.approvals).filter((name) => document.tools[name] != null),\n }),\n signal,\n ),\n );\n if (!hello.success) {\n peer.close(1002, 'bad hello');\n throw new Error(\n `The platform answered the local host hello unexpectedly: ${hello.error.message}`,\n );\n }\n if (args.capabilities.length > 0 && hello.data.sandboxId == null) {\n peer.close(1002, 'no sandbox id');\n throw new Error('The platform did not name the sandbox this process serves');\n }\n return {\n hostId: hello.data.hostId,\n ownerId: hello.data.owner.id,\n sandboxId: hello.data.sandboxId,\n closed: peer.closed,\n close: () => peer.close(1000, 'client closed'),\n established: starting,\n };\n } catch (cause) {\n // A no-op when a bad hello already closed it.\n socket.close(1000, 'local host failed to open');\n void stopSandbox();\n throw cause;\n }\n};\n"],
5
+ "mappings": "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",
6
+ "names": []
7
+ }
@@ -0,0 +1,36 @@
1
+ import { type CreateOAuthClientRequestIface, type OAuthClientIface, type ReturnOriginListIface } from '@finalai/agent-protocol/agent-platform';
2
+ import { type ClientContextIface, type SignalOptionsIface } from "./context.mjs";
3
+ export interface OAuthClientsApiIface {
4
+ /**
5
+ * Registers a client the project created with an authorization server. An
6
+ * OAuth integration names it with `auth.client`; its secret is a project
7
+ * secret by name.
8
+ */
9
+ create: (args: CreateOAuthClientRequestIface & SignalOptionsIface) => Promise<OAuthClientIface>;
10
+ /** The project's clients and its ancestors'. */
11
+ list: (options?: SignalOptionsIface) => Promise<OAuthClientIface[]>;
12
+ get: (args: {
13
+ id: string;
14
+ } & SignalOptionsIface) => Promise<OAuthClientIface>;
15
+ /** Refused with `in_use` while an integration names it. */
16
+ delete: (args: {
17
+ id: string;
18
+ } & SignalOptionsIface) => Promise<void>;
19
+ }
20
+ export interface SignInReturnOriginsApiIface {
21
+ /** The project's own origins and those it inherits. */
22
+ list: (options?: SignalOptionsIface) => Promise<ReturnOriginListIface['origins']>;
23
+ /**
24
+ * Replaces the project's own origins: `https://host[:port]`,
25
+ * `http://localhost[:port]` or an app scheme (`myapp://`).
26
+ */
27
+ set: (origins: readonly string[], options?: SignalOptionsIface) => Promise<ReturnOriginListIface['origins']>;
28
+ }
29
+ export declare const createOAuthClientsApi: (args: {
30
+ context: ClientContextIface;
31
+ projectId: string;
32
+ }) => OAuthClientsApiIface;
33
+ export declare const createSignInReturnOriginsApi: (args: {
34
+ context: ClientContextIface;
35
+ projectId: string;
36
+ }) => SignInReturnOriginsApiIface;
@@ -0,0 +1,67 @@
1
+ import {
2
+ createOAuthClientRequestSchema,
3
+ oauthClientListSchema,
4
+ oauthClientSchema,
5
+ okResponseSchema,
6
+ putReturnOriginsRequestSchema,
7
+ returnOriginListSchema
8
+ } from "@finalai/agent-protocol/agent-platform";
9
+ import { encodePath } from "./context.mjs";
10
+ import { HttpMethod } from "./http.mjs";
11
+ const createOAuthClientsApi = (args) => {
12
+ const { http } = args.context;
13
+ const path = (suffix = "") => `/v1/projects/${encodePath(args.projectId)}/oauth-clients${suffix}`;
14
+ return {
15
+ create: ({ signal, ...value }) => http.request({
16
+ method: HttpMethod.Post,
17
+ path: path(),
18
+ body: { schema: createOAuthClientRequestSchema, value },
19
+ response: oauthClientSchema,
20
+ signal
21
+ }),
22
+ list: async (options) => (await http.request({
23
+ method: HttpMethod.Get,
24
+ path: path(),
25
+ response: oauthClientListSchema,
26
+ signal: options?.signal
27
+ })).clients,
28
+ get: ({ id, signal }) => http.request({
29
+ method: HttpMethod.Get,
30
+ path: path(`/${encodePath(id)}`),
31
+ response: oauthClientSchema,
32
+ signal
33
+ }),
34
+ delete: async ({ id, signal }) => {
35
+ await http.request({
36
+ method: HttpMethod.Delete,
37
+ path: path(`/${encodePath(id)}`),
38
+ response: okResponseSchema,
39
+ signal
40
+ });
41
+ }
42
+ };
43
+ };
44
+ const createSignInReturnOriginsApi = (args) => {
45
+ const { http } = args.context;
46
+ const path = `/v1/projects/${encodePath(args.projectId)}/sign-in-return-origins`;
47
+ return {
48
+ list: async (options) => (await http.request({
49
+ method: HttpMethod.Get,
50
+ path,
51
+ response: returnOriginListSchema,
52
+ signal: options?.signal
53
+ })).origins,
54
+ set: async (origins, options) => (await http.request({
55
+ method: HttpMethod.Put,
56
+ path,
57
+ body: { schema: putReturnOriginsRequestSchema, value: { origins } },
58
+ response: returnOriginListSchema,
59
+ signal: options?.signal
60
+ })).origins
61
+ };
62
+ };
63
+ export {
64
+ createOAuthClientsApi,
65
+ createSignInReturnOriginsApi
66
+ };
67
+ //# sourceMappingURL=oauth-clients.mjs.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../../../../src/agent-client/oauth-clients.ts"],
4
+ "sourcesContent": ["import {\n createOAuthClientRequestSchema,\n oauthClientListSchema,\n oauthClientSchema,\n okResponseSchema,\n putReturnOriginsRequestSchema,\n returnOriginListSchema,\n type CreateOAuthClientRequestIface,\n type OAuthClientIface,\n type ReturnOriginListIface,\n} from '@finalai/agent-protocol/agent-platform';\nimport { encodePath, type ClientContextIface, type SignalOptionsIface } from \"./context.mjs\";\nimport { HttpMethod } from \"./http.mjs\";\n\n// What a project brings for its integrations' sign-ins: its own OAuth clients,\n// and the origins a sign-in may return a person to.\n\nexport interface OAuthClientsApiIface {\n /**\n * Registers a client the project created with an authorization server. An\n * OAuth integration names it with `auth.client`; its secret is a project\n * secret by name.\n */\n create: (args: CreateOAuthClientRequestIface & SignalOptionsIface) => Promise<OAuthClientIface>;\n /** The project's clients and its ancestors'. */\n list: (options?: SignalOptionsIface) => Promise<OAuthClientIface[]>;\n get: (args: { id: string } & SignalOptionsIface) => Promise<OAuthClientIface>;\n /** Refused with `in_use` while an integration names it. */\n delete: (args: { id: string } & SignalOptionsIface) => Promise<void>;\n}\n\nexport interface SignInReturnOriginsApiIface {\n /** The project's own origins and those it inherits. */\n list: (options?: SignalOptionsIface) => Promise<ReturnOriginListIface['origins']>;\n /**\n * Replaces the project's own origins: `https://host[:port]`,\n * `http://localhost[:port]` or an app scheme (`myapp://`).\n */\n set: (\n origins: readonly string[],\n options?: SignalOptionsIface,\n ) => Promise<ReturnOriginListIface['origins']>;\n}\n\nexport const createOAuthClientsApi = (args: {\n context: ClientContextIface;\n projectId: string;\n}): OAuthClientsApiIface => {\n const { http } = args.context;\n const path = (suffix = ''): string =>\n `/v1/projects/${encodePath(args.projectId)}/oauth-clients${suffix}`;\n return {\n create: ({ signal, ...value }) =>\n http.request({\n method: HttpMethod.Post,\n path: path(),\n body: { schema: createOAuthClientRequestSchema, value },\n response: oauthClientSchema,\n signal,\n }),\n list: async (options) =>\n (\n await http.request({\n method: HttpMethod.Get,\n path: path(),\n response: oauthClientListSchema,\n signal: options?.signal,\n })\n ).clients,\n get: ({ id, signal }) =>\n http.request({\n method: HttpMethod.Get,\n path: path(`/${encodePath(id)}`),\n response: oauthClientSchema,\n signal,\n }),\n delete: 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\nexport const createSignInReturnOriginsApi = (args: {\n context: ClientContextIface;\n projectId: string;\n}): SignInReturnOriginsApiIface => {\n const { http } = args.context;\n const path = `/v1/projects/${encodePath(args.projectId)}/sign-in-return-origins`;\n return {\n list: async (options) =>\n (\n await http.request({\n method: HttpMethod.Get,\n path,\n response: returnOriginListSchema,\n signal: options?.signal,\n })\n ).origins,\n set: async (origins, options) =>\n (\n await http.request({\n method: HttpMethod.Put,\n path,\n body: { schema: putReturnOriginsRequestSchema, value: { origins } },\n response: returnOriginListSchema,\n signal: options?.signal,\n })\n ).origins,\n };\n};\n"],
5
+ "mappings": "AAAA;AAAA,EACE;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,OAIK;AACP,SAAS,kBAAoE;AAC7E,SAAS,kBAAkB;AAgCpB,MAAM,wBAAwB,CAAC,SAGV;AAC1B,QAAM,EAAE,KAAK,IAAI,KAAK;AACtB,QAAM,OAAO,CAAC,SAAS,OACrB,gBAAgB,WAAW,KAAK,SAAS,CAAC,iBAAiB,MAAM;AACnE,SAAO;AAAA,IACL,QAAQ,CAAC,EAAE,QAAQ,GAAG,MAAM,MAC1B,KAAK,QAAQ;AAAA,MACX,QAAQ,WAAW;AAAA,MACnB,MAAM,KAAK;AAAA,MACX,MAAM,EAAE,QAAQ,gCAAgC,MAAM;AAAA,MACtD,UAAU;AAAA,MACV;AAAA,IACF,CAAC;AAAA,IACH,MAAM,OAAO,aAET,MAAM,KAAK,QAAQ;AAAA,MACjB,QAAQ,WAAW;AAAA,MACnB,MAAM,KAAK;AAAA,MACX,UAAU;AAAA,MACV,QAAQ,SAAS;AAAA,IACnB,CAAC,GACD;AAAA,IACJ,KAAK,CAAC,EAAE,IAAI,OAAO,MACjB,KAAK,QAAQ;AAAA,MACX,QAAQ,WAAW;AAAA,MACnB,MAAM,KAAK,IAAI,WAAW,EAAE,CAAC,EAAE;AAAA,MAC/B,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;AAEO,MAAM,+BAA+B,CAAC,SAGV;AACjC,QAAM,EAAE,KAAK,IAAI,KAAK;AACtB,QAAM,OAAO,gBAAgB,WAAW,KAAK,SAAS,CAAC;AACvD,SAAO;AAAA,IACL,MAAM,OAAO,aAET,MAAM,KAAK,QAAQ;AAAA,MACjB,QAAQ,WAAW;AAAA,MACnB;AAAA,MACA,UAAU;AAAA,MACV,QAAQ,SAAS;AAAA,IACnB,CAAC,GACD;AAAA,IACJ,KAAK,OAAO,SAAS,aAEjB,MAAM,KAAK,QAAQ;AAAA,MACjB,QAAQ,WAAW;AAAA,MACnB;AAAA,MACA,MAAM,EAAE,QAAQ,+BAA+B,OAAO,EAAE,QAAQ,EAAE;AAAA,MAClE,UAAU;AAAA,MACV,QAAQ,SAAS;AAAA,IACnB,CAAC,GACD;AAAA,EACN;AACF;",
6
+ "names": []
7
+ }
@@ -0,0 +1,54 @@
1
+ import { type AgentHistoryIface, type AgentInfoIface, type AgentListIface, type DefinitionVisibility, type PublishAgentResponseIface } from '@finalai/agent-protocol/agent-platform';
2
+ import { type AgentInput, type AgentValueCodecIface } from "./agent-input.mjs";
3
+ import { type ClientContextIface, type EnumInput, type SignalOptionsIface } from "./context.mjs";
4
+ export type AgentSelectorIface = {
5
+ name: string;
6
+ } | {
7
+ id: string;
8
+ } | {
9
+ hash: string;
10
+ };
11
+ export interface ProjectAgentsApiIface {
12
+ /**
13
+ * One agent as data: by name, id, or content hash. A bare name resolves in
14
+ * this project and its ancestors; `handle/name` names a publisher's public agent.
15
+ */
16
+ get: (selector: AgentSelectorIface & SignalOptionsIface) => Promise<AgentInfoIface>;
17
+ /** Stores the agent's document by its content hash, naming nothing; returns the hash. */
18
+ store: (args: {
19
+ agent: AgentInput;
20
+ } & SignalOptionsIface) => Promise<{
21
+ hash: string;
22
+ }>;
23
+ /**
24
+ * Stores the agent's document and points `name` at its hash. `visibility:
25
+ * 'public'` also makes the name public under the project's publisher handle.
26
+ */
27
+ publish: (args: {
28
+ agent: AgentInput;
29
+ name: string;
30
+ visibility?: EnumInput<DefinitionVisibility>;
31
+ } & SignalOptionsIface) => Promise<PublishAgentResponseIface>;
32
+ /**
33
+ * Validates a document (the JSON `final-agents print` writes) and returns it
34
+ * as an agent, without calling the platform.
35
+ */
36
+ parse: (document: string | object) => Promise<AgentInfoIface>;
37
+ /** Every hash `name` has pointed at, newest first. */
38
+ history: (args: {
39
+ name: string;
40
+ cursor?: string;
41
+ limit?: number;
42
+ } & SignalOptionsIface) => Promise<AgentHistoryIface>;
43
+ /** The agents published in this project and those it inherits. */
44
+ list: (options?: SignalOptionsIface & {
45
+ cursor?: string;
46
+ limit?: number;
47
+ }) => Promise<AgentListIface>;
48
+ }
49
+ export declare const parseAgentDocument: (input: string | object) => Promise<AgentInfoIface>;
50
+ export declare const createProjectAgentsApi: (args: {
51
+ context: ClientContextIface;
52
+ projectId: string;
53
+ codec: AgentValueCodecIface;
54
+ }) => ProjectAgentsApiIface;
@@ -0,0 +1,111 @@
1
+ import { jsonObjectSchema } from "@finalai/agent-protocol";
2
+ import {
3
+ agentHistorySchema,
4
+ agentInfoSchema,
5
+ agentListSchema,
6
+ agentRequireViewSchema,
7
+ publishAgentRequestSchema,
8
+ publishAgentResponseSchema,
9
+ storeAgentDocumentRequestSchema,
10
+ storeAgentDocumentResponseSchema
11
+ } from "@finalai/agent-protocol/agent-platform";
12
+ import {
13
+ agentDocumentHash,
14
+ agentDocumentSchema,
15
+ inProcessCodeOf
16
+ } from "@finalai/agent-provider/document";
17
+ import { resolveAgentInput } from "./agent-input.mjs";
18
+ import {
19
+ encodePath
20
+ } from "./context.mjs";
21
+ import { clientError, ClientErrorCode } from "./errors.mjs";
22
+ import { HttpMethod } from "./http.mjs";
23
+ const agentsPath = (projectId, suffix) => `/v1/projects/${encodePath(projectId)}/agents${suffix}`;
24
+ const invalidDocument = (message) => clientError({ message, status: 0, code: ClientErrorCode.InvalidRequest });
25
+ const parseAgentDocument = async (input) => {
26
+ let raw = input;
27
+ if (typeof input === "string") {
28
+ try {
29
+ raw = JSON.parse(input);
30
+ } catch {
31
+ throw invalidDocument("The agent document is not JSON");
32
+ }
33
+ }
34
+ const parsed = agentDocumentSchema.safeParse(raw);
35
+ if (!parsed.success)
36
+ throw invalidDocument(`The agent document is not valid: ${parsed.error.message}`);
37
+ const document = parsed.data;
38
+ return agentInfoSchema.parse({
39
+ id: null,
40
+ name: document.identity.name,
41
+ hash: await agentDocumentHash(document),
42
+ document: jsonObjectSchema.parse(JSON.parse(JSON.stringify(document))),
43
+ require: agentRequireViewSchema.parse(document.require),
44
+ inProcess: inProcessCodeOf(document),
45
+ publishedAt: null
46
+ });
47
+ };
48
+ const createProjectAgentsApi = (args) => {
49
+ const { http } = args.context;
50
+ const store = async ({ agent, signal }) => {
51
+ const resolved = await resolveAgentInput(agent, args.codec);
52
+ await http.request({
53
+ method: HttpMethod.Put,
54
+ path: agentsPath(args.projectId, "/documents"),
55
+ body: {
56
+ schema: storeAgentDocumentRequestSchema,
57
+ value: {
58
+ document: jsonObjectSchema.parse(JSON.parse(JSON.stringify(resolved.document))),
59
+ hash: resolved.hash
60
+ }
61
+ },
62
+ response: storeAgentDocumentResponseSchema,
63
+ signal
64
+ });
65
+ return { hash: resolved.hash };
66
+ };
67
+ return {
68
+ get: ({ signal, ...selector }) => http.request({
69
+ method: HttpMethod.Get,
70
+ path: agentsPath(args.projectId, "/lookup"),
71
+ query: {
72
+ name: "name" in selector ? selector.name : void 0,
73
+ id: "id" in selector ? selector.id : void 0,
74
+ hash: "hash" in selector ? selector.hash : void 0
75
+ },
76
+ response: agentInfoSchema,
77
+ signal
78
+ }),
79
+ store,
80
+ publish: async ({ agent, name, visibility, signal }) => {
81
+ const { hash } = await store({ agent, signal });
82
+ return http.request({
83
+ method: HttpMethod.Post,
84
+ path: agentsPath(args.projectId, "/publish"),
85
+ body: { schema: publishAgentRequestSchema, value: { name, hash, visibility } },
86
+ response: publishAgentResponseSchema,
87
+ signal
88
+ });
89
+ },
90
+ parse: parseAgentDocument,
91
+ history: ({ signal, ...query }) => http.request({
92
+ method: HttpMethod.Get,
93
+ path: agentsPath(args.projectId, "/history"),
94
+ query,
95
+ response: agentHistorySchema,
96
+ signal
97
+ }),
98
+ list: (options) => http.request({
99
+ method: HttpMethod.Get,
100
+ path: "/v1/agents",
101
+ query: { projectId: args.projectId, cursor: options?.cursor, limit: options?.limit },
102
+ response: agentListSchema,
103
+ signal: options?.signal
104
+ })
105
+ };
106
+ };
107
+ export {
108
+ createProjectAgentsApi,
109
+ parseAgentDocument
110
+ };
111
+ //# sourceMappingURL=project-agents.mjs.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../../../../src/agent-client/project-agents.ts"],
4
+ "sourcesContent": ["import { jsonObjectSchema } from '@finalai/agent-protocol';\nimport {\n agentHistorySchema,\n agentInfoSchema,\n agentListSchema,\n agentRequireViewSchema,\n publishAgentRequestSchema,\n publishAgentResponseSchema,\n storeAgentDocumentRequestSchema,\n storeAgentDocumentResponseSchema,\n type AgentHistoryIface,\n type AgentInfoIface,\n type AgentListIface,\n type DefinitionVisibility,\n type PublishAgentResponseIface,\n} from '@finalai/agent-protocol/agent-platform';\nimport {\n agentDocumentHash,\n agentDocumentSchema,\n inProcessCodeOf,\n} from '@finalai/agent-provider/document';\nimport { resolveAgentInput, type AgentInput, type AgentValueCodecIface } from \"./agent-input.mjs\";\nimport {\n encodePath,\n type ClientContextIface,\n type EnumInput,\n type SignalOptionsIface,\n} from \"./context.mjs\";\nimport { clientError, ClientErrorCode } from \"./errors.mjs\";\nimport { HttpMethod } from \"./http.mjs\";\n\n// A project's agents: documents stored by content hash, and names pointing at\n// a hash. Nothing is built or deployed.\n\nexport type AgentSelectorIface = { name: string } | { id: string } | { hash: string };\n\nexport interface ProjectAgentsApiIface {\n /**\n * One agent as data: by name, id, or content hash. A bare name resolves in\n * this project and its ancestors; `handle/name` names a publisher's public agent.\n */\n get: (selector: AgentSelectorIface & SignalOptionsIface) => Promise<AgentInfoIface>;\n /** Stores the agent's document by its content hash, naming nothing; returns the hash. */\n store: (args: { agent: AgentInput } & SignalOptionsIface) => Promise<{ hash: string }>;\n /**\n * Stores the agent's document and points `name` at its hash. `visibility:\n * 'public'` also makes the name public under the project's publisher handle.\n */\n publish: (\n args: {\n agent: AgentInput;\n name: string;\n visibility?: EnumInput<DefinitionVisibility>;\n } & SignalOptionsIface,\n ) => Promise<PublishAgentResponseIface>;\n /**\n * Validates a document (the JSON `final-agents print` writes) and returns it\n * as an agent, without calling the platform.\n */\n parse: (document: string | object) => Promise<AgentInfoIface>;\n /** Every hash `name` has pointed at, newest first. */\n history: (\n args: { name: string; cursor?: string; limit?: number } & SignalOptionsIface,\n ) => Promise<AgentHistoryIface>;\n /** The agents published in this project and those it inherits. */\n list: (\n options?: SignalOptionsIface & { cursor?: string; limit?: number },\n ) => Promise<AgentListIface>;\n}\n\nconst agentsPath = (projectId: string, suffix: string): string =>\n `/v1/projects/${encodePath(projectId)}/agents${suffix}`;\n\nconst invalidDocument = (message: string) =>\n clientError({ message, status: 0, code: ClientErrorCode.InvalidRequest });\n\nexport const parseAgentDocument = async (input: string | object): Promise<AgentInfoIface> => {\n let raw: unknown = input;\n if (typeof input === 'string') {\n try {\n raw = JSON.parse(input);\n } catch {\n throw invalidDocument('The agent document is not JSON');\n }\n }\n const parsed = agentDocumentSchema.safeParse(raw);\n if (!parsed.success)\n throw invalidDocument(`The agent document is not valid: ${parsed.error.message}`);\n const document = parsed.data;\n return agentInfoSchema.parse({\n id: null,\n name: document.identity.name,\n hash: await agentDocumentHash(document),\n document: jsonObjectSchema.parse(JSON.parse(JSON.stringify(document))),\n require: agentRequireViewSchema.parse(document.require),\n inProcess: inProcessCodeOf(document),\n publishedAt: null,\n });\n};\n\nexport const createProjectAgentsApi = (args: {\n context: ClientContextIface;\n projectId: string;\n codec: AgentValueCodecIface;\n}): ProjectAgentsApiIface => {\n const { http } = args.context;\n const store: ProjectAgentsApiIface['store'] = async ({ agent, signal }) => {\n const resolved = await resolveAgentInput(agent, args.codec);\n await http.request({\n method: HttpMethod.Put,\n path: agentsPath(args.projectId, '/documents'),\n body: {\n schema: storeAgentDocumentRequestSchema,\n value: {\n document: jsonObjectSchema.parse(JSON.parse(JSON.stringify(resolved.document))),\n hash: resolved.hash,\n },\n },\n response: storeAgentDocumentResponseSchema,\n signal,\n });\n return { hash: resolved.hash };\n };\n return {\n get: ({ signal, ...selector }) =>\n http.request({\n method: HttpMethod.Get,\n path: agentsPath(args.projectId, '/lookup'),\n query: {\n name: 'name' in selector ? selector.name : undefined,\n id: 'id' in selector ? selector.id : undefined,\n hash: 'hash' in selector ? selector.hash : undefined,\n },\n response: agentInfoSchema,\n signal,\n }),\n store,\n publish: async ({ agent, name, visibility, signal }) => {\n const { hash } = await store({ agent, signal });\n return http.request({\n method: HttpMethod.Post,\n path: agentsPath(args.projectId, '/publish'),\n body: { schema: publishAgentRequestSchema, value: { name, hash, visibility } },\n response: publishAgentResponseSchema,\n signal,\n });\n },\n parse: parseAgentDocument,\n history: ({ signal, ...query }) =>\n http.request({\n method: HttpMethod.Get,\n path: agentsPath(args.projectId, '/history'),\n query,\n response: agentHistorySchema,\n signal,\n }),\n list: (options) =>\n http.request({\n method: HttpMethod.Get,\n path: '/v1/agents',\n query: { projectId: args.projectId, cursor: options?.cursor, limit: options?.limit },\n response: agentListSchema,\n signal: options?.signal,\n }),\n };\n};\n"],
5
+ "mappings": "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",
6
+ "names": []
7
+ }
@@ -0,0 +1,43 @@
1
+ import { type ChannelBindingsApiIface, type ChannelSourceOf, type ProjectChannelsApiIface } from "./channels.mjs";
2
+ import { type ClientContextIface } from "./context.mjs";
3
+ import { type ProjectConversationsApiIface } from "./conversations.mjs";
4
+ import { type EventsApiIface, type EventSubscriptionsApiIface } from "./events.mjs";
5
+ import { type AcpAdaptersApiIface, type HarnessesApiIface } from "./harnesses.mjs";
6
+ import { type IntegrationsApiIface } from "./integrations.mjs";
7
+ import { type OAuthClientsApiIface, type SignInReturnOriginsApiIface } from "./oauth-clients.mjs";
8
+ import { type ProjectAgentsApiIface } from "./project-agents.mjs";
9
+ import { type ProjectResourceApiIface } from "./projects.mjs";
10
+ import { type ProjectPublisherApiIface, type PublicNamesApiIface } from "./publishers.mjs";
11
+ import { type SandboxProvidersApiIface } from "./sandbox-providers.mjs";
12
+ import { type SandboxesApiIface, type SandboxSetupsApiIface } from "./sandboxes.mjs";
13
+ import { type ProjectSessionsApiIface } from "./sessions.mjs";
14
+ import type { AgentStartDepsIface } from "./start.mjs";
15
+ export interface ProjectClientIface extends ProjectResourceApiIface {
16
+ readonly id: string;
17
+ sessions: ProjectSessionsApiIface;
18
+ conversations: ProjectConversationsApiIface;
19
+ agents: ProjectAgentsApiIface;
20
+ sandboxes: SandboxesApiIface;
21
+ sandboxSetups: SandboxSetupsApiIface;
22
+ integrations: IntegrationsApiIface;
23
+ harnesses: HarnessesApiIface;
24
+ acpAdapters: AcpAdaptersApiIface;
25
+ channels: ProjectChannelsApiIface & ChannelBindingsApiIface;
26
+ /** The event feed for this project and those below it. */
27
+ events: EventsApiIface;
28
+ /** Pushes this project's feed to a URL (`webhooks:write`, project admin). */
29
+ eventSubscriptions: EventSubscriptionsApiIface;
30
+ sandboxProviders: SandboxProvidersApiIface;
31
+ oauthClients: OAuthClientsApiIface;
32
+ signInReturnOrigins: SignInReturnOriginsApiIface;
33
+ /** The project's publisher handle. */
34
+ publisher: ProjectPublisherApiIface;
35
+ /** Which of the project's names resolve as `handle/name` from any organization. */
36
+ publicNames: PublicNamesApiIface;
37
+ }
38
+ export declare const createProjectClient: (args: {
39
+ context: ClientContextIface;
40
+ start: AgentStartDepsIface;
41
+ channelSourceOf: ChannelSourceOf;
42
+ projectId: string;
43
+ }) => ProjectClientIface;