@finalai/agents 0.11.0 → 0.13.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (188) hide show
  1. package/HOSTING.md +334 -245
  2. package/README.md +214 -29
  3. package/dist/modules/agent-client/agent-input.d.mts +24 -0
  4. package/dist/modules/agent-client/agent-input.mjs +46 -0
  5. package/dist/modules/agent-client/agent-input.mjs.map +7 -0
  6. package/dist/modules/agent-client/channels.d.mts +128 -16
  7. package/dist/modules/agent-client/channels.mjs +216 -33
  8. package/dist/modules/agent-client/channels.mjs.map +2 -2
  9. package/dist/modules/agent-client/client.d.mts +91 -21
  10. package/dist/modules/agent-client/client.mjs +79 -24
  11. package/dist/modules/agent-client/client.mjs.map +2 -2
  12. package/dist/modules/agent-client/config-options.mjs +1 -2
  13. package/dist/modules/agent-client/config-options.mjs.map +2 -2
  14. package/dist/modules/agent-client/conversation-resources.d.mts +102 -0
  15. package/dist/modules/agent-client/conversation-resources.mjs +178 -0
  16. package/dist/modules/agent-client/conversation-resources.mjs.map +7 -0
  17. package/dist/modules/agent-client/conversations.d.mts +120 -38
  18. package/dist/modules/agent-client/conversations.mjs +386 -71
  19. package/dist/modules/agent-client/conversations.mjs.map +2 -2
  20. package/dist/modules/agent-client/defaults.d.mts +8 -0
  21. package/dist/modules/agent-client/defaults.mjs +77 -0
  22. package/dist/modules/agent-client/defaults.mjs.map +7 -0
  23. package/dist/modules/agent-client/errors.d.mts +22 -2
  24. package/dist/modules/agent-client/errors.mjs +19 -0
  25. package/dist/modules/agent-client/errors.mjs.map +2 -2
  26. package/dist/modules/agent-client/events.d.mts +62 -0
  27. package/dist/modules/agent-client/events.mjs +107 -0
  28. package/dist/modules/agent-client/events.mjs.map +7 -0
  29. package/dist/modules/agent-client/harnesses.d.mts +66 -0
  30. package/dist/modules/agent-client/harnesses.mjs +156 -0
  31. package/dist/modules/agent-client/harnesses.mjs.map +7 -0
  32. package/dist/modules/agent-client/http.d.mts +2 -1
  33. package/dist/modules/agent-client/http.mjs +21 -2
  34. package/dist/modules/agent-client/http.mjs.map +2 -2
  35. package/dist/modules/agent-client/index.d.mts +21 -6
  36. package/dist/modules/agent-client/index.mjs +26 -0
  37. package/dist/modules/agent-client/index.mjs.map +2 -2
  38. package/dist/modules/agent-client/integrations.d.mts +40 -0
  39. package/dist/modules/agent-client/integrations.mjs +92 -0
  40. package/dist/modules/agent-client/integrations.mjs.map +7 -0
  41. package/dist/modules/agent-client/local-host-protocol.d.mts +156 -0
  42. package/dist/modules/agent-client/local-host-protocol.mjs +258 -0
  43. package/dist/modules/agent-client/local-host-protocol.mjs.map +7 -0
  44. package/dist/modules/agent-client/local-host.d.mts +56 -0
  45. package/dist/modules/agent-client/local-host.mjs +200 -0
  46. package/dist/modules/agent-client/local-host.mjs.map +7 -0
  47. package/dist/modules/agent-client/oauth-clients.d.mts +36 -0
  48. package/dist/modules/agent-client/oauth-clients.mjs +67 -0
  49. package/dist/modules/agent-client/oauth-clients.mjs.map +7 -0
  50. package/dist/modules/agent-client/project-agents.d.mts +54 -0
  51. package/dist/modules/agent-client/project-agents.mjs +111 -0
  52. package/dist/modules/agent-client/project-agents.mjs.map +7 -0
  53. package/dist/modules/agent-client/project.d.mts +48 -0
  54. package/dist/modules/agent-client/project.mjs +66 -0
  55. package/dist/modules/agent-client/project.mjs.map +7 -0
  56. package/dist/modules/agent-client/projects.d.mts +61 -0
  57. package/dist/modules/agent-client/projects.mjs +145 -0
  58. package/dist/modules/agent-client/projects.mjs.map +7 -0
  59. package/dist/modules/agent-client/provide.d.mts +41 -0
  60. package/dist/modules/agent-client/provide.mjs +90 -0
  61. package/dist/modules/agent-client/provide.mjs.map +7 -0
  62. package/dist/modules/agent-client/publishers.d.mts +57 -0
  63. package/dist/modules/agent-client/publishers.mjs +109 -0
  64. package/dist/modules/agent-client/publishers.mjs.map +7 -0
  65. package/dist/modules/agent-client/requirements.d.mts +60 -0
  66. package/dist/modules/agent-client/requirements.mjs +83 -0
  67. package/dist/modules/agent-client/requirements.mjs.map +7 -0
  68. package/dist/modules/agent-client/sandbox-providers.d.mts +34 -0
  69. package/dist/modules/agent-client/sandbox-providers.mjs +75 -0
  70. package/dist/modules/agent-client/sandbox-providers.mjs.map +7 -0
  71. package/dist/modules/agent-client/sandbox-uri.d.mts +1 -1
  72. package/dist/modules/agent-client/sandbox-uri.mjs +4 -4
  73. package/dist/modules/agent-client/sandbox-uri.mjs.map +1 -1
  74. package/dist/modules/agent-client/sandboxes.d.mts +72 -0
  75. package/dist/modules/agent-client/sandboxes.mjs +138 -0
  76. package/dist/modules/agent-client/sandboxes.mjs.map +7 -0
  77. package/dist/modules/agent-client/schedules.d.mts +9 -0
  78. package/dist/modules/agent-client/schedules.mjs +17 -0
  79. package/dist/modules/agent-client/schedules.mjs.map +7 -0
  80. package/dist/modules/agent-client/sessions.d.mts +46 -8
  81. package/dist/modules/agent-client/sessions.mjs +91 -29
  82. package/dist/modules/agent-client/sessions.mjs.map +2 -2
  83. package/dist/modules/agent-client/start.d.mts +101 -0
  84. package/dist/modules/agent-client/start.mjs +260 -0
  85. package/dist/modules/agent-client/start.mjs.map +7 -0
  86. package/dist/modules/agent-client/test-fakes.d.mts +1 -0
  87. package/dist/modules/agent-client/test-fakes.mjs +3 -1
  88. package/dist/modules/agent-client/test-fakes.mjs.map +2 -2
  89. package/dist/modules/cli/agent-module.d.mts +39 -0
  90. package/dist/modules/cli/agent-module.mjs +89 -0
  91. package/dist/modules/cli/agent-module.mjs.map +7 -0
  92. package/dist/modules/cli/cli.d.mts +6 -6
  93. package/dist/modules/cli/cli.mjs +94 -120
  94. package/dist/modules/cli/cli.mjs.map +2 -2
  95. package/dist/modules/cli/conformance.d.mts +2 -6
  96. package/dist/modules/cli/conformance.mjs +5 -8
  97. package/dist/modules/cli/conformance.mjs.map +2 -2
  98. package/dist/modules/cli/main.mjs.map +1 -1
  99. package/dist/modules/cli/output.d.mts +0 -9
  100. package/dist/modules/cli/output.mjs +7 -85
  101. package/dist/modules/cli/output.mjs.map +2 -2
  102. package/dist/modules/harnesses.mjs.map +2 -2
  103. package/dist/modules/index.d.mts +0 -2
  104. package/dist/modules/index.mjs +0 -4
  105. package/dist/modules/index.mjs.map +2 -2
  106. package/dist/modules/integrations.d.mts +24 -0
  107. package/dist/modules/integrations.mjs +30 -0
  108. package/dist/modules/integrations.mjs.map +7 -0
  109. package/dist/modules/public.d.mts +10 -10
  110. package/dist/modules/public.mjs +29 -78
  111. package/dist/modules/public.mjs.map +2 -2
  112. package/dist/modules/sandboxes.d.mts +2 -0
  113. package/dist/modules/sandboxes.mjs +4 -0
  114. package/dist/modules/sandboxes.mjs.map +2 -2
  115. package/dist/modules/verify.d.mts +1 -0
  116. package/dist/modules/verify.mjs +2 -0
  117. package/dist/modules/verify.mjs.map +7 -0
  118. package/dist/modules/webhooks.d.mts +37 -0
  119. package/dist/modules/webhooks.mjs +100 -0
  120. package/dist/modules/webhooks.mjs.map +7 -0
  121. package/examples/release-scout/README.md +18 -10
  122. package/examples/release-scout/agent.ts +41 -0
  123. package/examples/release-scout/by-name.ts +43 -0
  124. package/examples/release-scout/db.ts +6 -0
  125. package/examples/release-scout/instructions.md +5 -0
  126. package/examples/release-scout/run-on-a-computer.ts +49 -0
  127. package/examples/release-scout/run.ts +38 -0
  128. package/package.json +37 -28
  129. package/dist/modules/agent-client/build.d.mts +0 -110
  130. package/dist/modules/agent-client/build.mjs +0 -213
  131. package/dist/modules/agent-client/build.mjs.map +0 -7
  132. package/dist/modules/authoring/final-channel.d.mts +0 -1
  133. package/dist/modules/authoring/final-channel.mjs +0 -2
  134. package/dist/modules/authoring/final-channel.mjs.map +0 -7
  135. package/dist/modules/authoring/index.d.mts +0 -1
  136. package/dist/modules/authoring/index.mjs +0 -2
  137. package/dist/modules/authoring/index.mjs.map +0 -7
  138. package/dist/modules/authoring/instructions.d.mts +0 -1
  139. package/dist/modules/authoring/instructions.mjs +0 -2
  140. package/dist/modules/authoring/instructions.mjs.map +0 -7
  141. package/dist/modules/authoring/providers.d.mts +0 -2
  142. package/dist/modules/authoring/providers.mjs +0 -1
  143. package/dist/modules/authoring/providers.mjs.map +0 -7
  144. package/dist/modules/cli/build.d.mts +0 -22
  145. package/dist/modules/cli/build.mjs +0 -77
  146. package/dist/modules/cli/build.mjs.map +0 -7
  147. package/dist/modules/cli/channel-install.d.mts +0 -12
  148. package/dist/modules/cli/channel-install.mjs +0 -25
  149. package/dist/modules/cli/channel-install.mjs.map +0 -7
  150. package/dist/modules/cli/channel-socket.d.mts +0 -9
  151. package/dist/modules/cli/channel-socket.mjs +0 -114
  152. package/dist/modules/cli/channel-socket.mjs.map +0 -7
  153. package/dist/modules/cli/dev.d.mts +0 -26
  154. package/dist/modules/cli/dev.mjs +0 -311
  155. package/dist/modules/cli/dev.mjs.map +0 -7
  156. package/dist/modules/cli/files.d.mts +0 -18
  157. package/dist/modules/cli/files.mjs +0 -66
  158. package/dist/modules/cli/files.mjs.map +0 -7
  159. package/dist/modules/cli/harness-descriptions.d.mts +0 -20
  160. package/dist/modules/cli/harness-descriptions.mjs +0 -70
  161. package/dist/modules/cli/harness-descriptions.mjs.map +0 -7
  162. package/dist/modules/cli/publish.d.mts +0 -15
  163. package/dist/modules/cli/publish.mjs +0 -92
  164. package/dist/modules/cli/publish.mjs.map +0 -7
  165. package/dist/modules/compile.d.mts +0 -3
  166. package/dist/modules/compile.mjs +0 -58
  167. package/dist/modules/compile.mjs.map +0 -7
  168. package/dist/modules/index.browser.d.mts +0 -4
  169. package/dist/modules/index.browser.mjs +0 -8
  170. package/dist/modules/index.browser.mjs.map +0 -7
  171. package/examples/custom-harness/README.md +0 -16
  172. package/examples/custom-harness/agent.ts +0 -154
  173. package/examples/custom-sandbox/README.md +0 -12
  174. package/examples/custom-sandbox/agent.ts +0 -14
  175. package/examples/custom-sandbox/sandbox.ts +0 -24
  176. package/examples/release-scout/agent/agent.ts +0 -22
  177. package/examples/release-scout/agent/channels/github-signature.ts +0 -27
  178. package/examples/release-scout/agent/channels/github.ts +0 -32
  179. package/examples/release-scout/agent/connections/linear.ts +0 -9
  180. package/examples/release-scout/agent/hooks/audit.ts +0 -24
  181. package/examples/release-scout/agent/instructions/org-context.ts +0 -26
  182. package/examples/release-scout/agent/instructions.md +0 -2
  183. package/examples/release-scout/agent/sandbox.ts +0 -20
  184. package/examples/release-scout/agent/schedules/daily-digest.md +0 -7
  185. package/examples/release-scout/agent/skills/triage/SKILL.md +0 -8
  186. package/examples/release-scout/agent/skills/triage/checklist.md +0 -3
  187. package/examples/release-scout/agent/tools/lookup_release_notes.ts +0 -24
  188. package/examples/release-scout/client.ts +0 -122
@@ -0,0 +1,156 @@
1
+ import { jsonObjectSchema } from "@finalai/agent-protocol";
2
+ import {
3
+ acpAdapterDefinitionInfoSchema,
4
+ acpAdapterDefinitionListSchema,
5
+ allowSubscriptionsRequestSchema,
6
+ definitionPublicationSchema,
7
+ harnessDefinitionInfoSchema,
8
+ harnessDefinitionListSchema,
9
+ okResponseSchema,
10
+ publishDefinitionRequestSchema,
11
+ subscriptionAllowanceListSchema,
12
+ subscriptionAllowanceSchema
13
+ } from "@finalai/agent-protocol/agent-platform";
14
+ import {
15
+ acpAdapterDefinitionHash,
16
+ acpAdapterDefinitionSchema,
17
+ harnessDefinitionHash,
18
+ harnessDefinitionSchema
19
+ } from "@finalai/agent-provider/harness-definition";
20
+ import {
21
+ encodePath
22
+ } from "./context.mjs";
23
+ import { clientError, ClientErrorCode } from "./errors.mjs";
24
+ import { HttpMethod } from "./http.mjs";
25
+ import { checkHarness } from "./start.mjs";
26
+ const projectPath = (projectId, suffix) => `/v1/projects/${encodePath(projectId)}${suffix}`;
27
+ const prepared = async (args) => {
28
+ const parsed = args.schema.safeParse(args.value);
29
+ if (!parsed.success)
30
+ throw clientError({
31
+ message: `Invalid ${args.what}: ${parsed.error.message}`,
32
+ status: 0,
33
+ code: ClientErrorCode.InvalidRequest
34
+ });
35
+ return {
36
+ definition: jsonObjectSchema.parse(JSON.parse(JSON.stringify(parsed.data))),
37
+ hash: await args.hash(parsed.data)
38
+ };
39
+ };
40
+ const lookupQuery = (selector) => ({
41
+ name: "name" in selector ? selector.name : void 0,
42
+ hash: "hash" in selector ? selector.hash : void 0
43
+ });
44
+ const createHarnessesApi = (args) => {
45
+ const { http } = args.context;
46
+ const path = (suffix) => projectPath(args.projectId, suffix);
47
+ const allowancePath = (harness) => path(`/subscription-allowances/${encodePath(harness)}`);
48
+ return {
49
+ check: async ({ agent, harness, compute, signal }) => checkHarness({
50
+ context: args.context,
51
+ projectId: args.projectId,
52
+ hash: typeof agent === "string" ? agent : await args.store(agent, signal),
53
+ harness,
54
+ compute,
55
+ signal
56
+ }),
57
+ publish: async ({ harness, name, visibility, signal }) => http.request({
58
+ method: HttpMethod.Post,
59
+ path: path("/harnesses/publish"),
60
+ body: {
61
+ schema: publishDefinitionRequestSchema,
62
+ value: {
63
+ name,
64
+ visibility,
65
+ ...await prepared({
66
+ schema: harnessDefinitionSchema,
67
+ value: harness,
68
+ hash: harnessDefinitionHash,
69
+ what: "harness definition"
70
+ })
71
+ }
72
+ },
73
+ response: definitionPublicationSchema,
74
+ signal
75
+ }),
76
+ get: ({ signal, ...selector }) => http.request({
77
+ method: HttpMethod.Get,
78
+ path: path("/harnesses/lookup"),
79
+ query: lookupQuery(selector),
80
+ response: harnessDefinitionInfoSchema,
81
+ signal
82
+ }),
83
+ list: async (options) => (await http.request({
84
+ method: HttpMethod.Get,
85
+ path: path("/harnesses"),
86
+ response: harnessDefinitionListSchema,
87
+ signal: options?.signal
88
+ })).harnesses,
89
+ allowances: {
90
+ list: async (options) => (await http.request({
91
+ method: HttpMethod.Get,
92
+ path: path("/subscription-allowances"),
93
+ response: subscriptionAllowanceListSchema,
94
+ signal: options?.signal
95
+ })).allowances,
96
+ allow: ({ harness, signal }) => http.request({
97
+ method: HttpMethod.Put,
98
+ path: allowancePath(harness),
99
+ body: { schema: allowSubscriptionsRequestSchema, value: {} },
100
+ response: subscriptionAllowanceSchema,
101
+ signal
102
+ }),
103
+ revoke: async ({ harness, signal }) => {
104
+ await http.request({
105
+ method: HttpMethod.Delete,
106
+ path: allowancePath(harness),
107
+ response: okResponseSchema,
108
+ signal
109
+ });
110
+ }
111
+ }
112
+ };
113
+ };
114
+ const createAcpAdaptersApi = (args) => {
115
+ const { http } = args.context;
116
+ const path = (suffix) => projectPath(args.projectId, suffix);
117
+ return {
118
+ publish: async ({ adapter, name, visibility, signal }) => http.request({
119
+ method: HttpMethod.Post,
120
+ path: path("/acp-adapters/publish"),
121
+ body: {
122
+ schema: publishDefinitionRequestSchema,
123
+ value: {
124
+ name,
125
+ visibility,
126
+ ...await prepared({
127
+ schema: acpAdapterDefinitionSchema,
128
+ value: adapter,
129
+ hash: acpAdapterDefinitionHash,
130
+ what: "ACP adapter definition"
131
+ })
132
+ }
133
+ },
134
+ response: definitionPublicationSchema,
135
+ signal
136
+ }),
137
+ get: ({ signal, ...selector }) => http.request({
138
+ method: HttpMethod.Get,
139
+ path: path("/acp-adapters/lookup"),
140
+ query: lookupQuery(selector),
141
+ response: acpAdapterDefinitionInfoSchema,
142
+ signal
143
+ }),
144
+ list: async (options) => (await http.request({
145
+ method: HttpMethod.Get,
146
+ path: path("/acp-adapters"),
147
+ response: acpAdapterDefinitionListSchema,
148
+ signal: options?.signal
149
+ })).adapters
150
+ };
151
+ };
152
+ export {
153
+ createAcpAdaptersApi,
154
+ createHarnessesApi
155
+ };
156
+ //# sourceMappingURL=harnesses.mjs.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../../../../src/agent-client/harnesses.ts"],
4
+ "sourcesContent": ["import { jsonObjectSchema, type Capability } from '@finalai/agent-protocol';\nimport {\n acpAdapterDefinitionInfoSchema,\n acpAdapterDefinitionListSchema,\n allowSubscriptionsRequestSchema,\n definitionPublicationSchema,\n harnessDefinitionInfoSchema,\n harnessDefinitionListSchema,\n okResponseSchema,\n publishDefinitionRequestSchema,\n subscriptionAllowanceListSchema,\n subscriptionAllowanceSchema,\n type AcpAdapterDefinitionInfoIface,\n type AcpAdapterDefinitionSummaryIface,\n type DefinitionPublicationIface,\n type DefinitionVisibility,\n type HarnessCheckResponseIface,\n type HarnessDefinitionInfoIface,\n type HarnessDefinitionSummaryIface,\n type HarnessSettingsIface,\n type SubscriptionAllowanceIface,\n} from '@finalai/agent-protocol/agent-platform';\nimport {\n acpAdapterDefinitionHash,\n acpAdapterDefinitionSchema,\n harnessDefinitionHash,\n harnessDefinitionSchema,\n type AcpAdapterDefinitionInputIface,\n type HarnessDefinitionInputIface,\n} from '@finalai/agent-provider/harness-definition';\nimport type * as z from 'zod';\nimport type { AgentInput } 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\";\nimport { checkHarness } from \"./start.mjs\";\n\n// A project's harness and ACP adapter definitions (data, published by name),\n// the check of harness settings against an agent, and which harnesses\n// subscriptions may reach.\n\nexport type DefinitionSelectorIface = { name: string } | { hash: string };\n\nexport interface SubscriptionAllowancesApiIface {\n /** The harnesses subscriptions may reach in this project, the catalog's included. */\n list: (options?: SignalOptionsIface) => Promise<SubscriptionAllowanceIface[]>;\n /** Lets personal and shared subscriptions reach `harness`. */\n allow: (args: { harness: string } & SignalOptionsIface) => Promise<SubscriptionAllowanceIface>;\n revoke: (args: { harness: string } & SignalOptionsIface) => Promise<void>;\n}\n\nexport interface HarnessesApiIface {\n /**\n * Whether harness settings suit an agent, where the harness would run, and\n * which of its compute that environment covers. `agent` is the agent or its\n * content hash; `compute` places a harness that names no environment.\n */\n check: (\n args: {\n agent: string | AgentInput;\n harness: HarnessSettingsIface;\n compute?: Partial<Record<Capability, string>>;\n } & SignalOptionsIface,\n ) => Promise<HarnessCheckResponseIface>;\n /**\n * Stores a harness definition and points `name` at it. `visibility: 'public'`\n * also makes the name public under the project's publisher handle.\n */\n publish: (\n args: {\n harness: HarnessDefinitionInputIface;\n name: string;\n visibility?: EnumInput<DefinitionVisibility>;\n } & SignalOptionsIface,\n ) => Promise<DefinitionPublicationIface>;\n get: (\n selector: DefinitionSelectorIface & SignalOptionsIface,\n ) => Promise<HarnessDefinitionInfoIface>;\n /** The harnesses this project can name by bare name: its own and its ancestors'. */\n list: (options?: SignalOptionsIface) => Promise<HarnessDefinitionSummaryIface[]>;\n allowances: SubscriptionAllowancesApiIface;\n}\n\nexport interface AcpAdaptersApiIface {\n /** Stores an ACP adapter definition and points `name` at it; see `harnesses.publish` for `visibility`. */\n publish: (\n args: {\n adapter: AcpAdapterDefinitionInputIface;\n name: string;\n visibility?: EnumInput<DefinitionVisibility>;\n } & SignalOptionsIface,\n ) => Promise<DefinitionPublicationIface>;\n get: (\n selector: DefinitionSelectorIface & SignalOptionsIface,\n ) => Promise<AcpAdapterDefinitionInfoIface>;\n list: (options?: SignalOptionsIface) => Promise<AcpAdapterDefinitionSummaryIface[]>;\n}\n\nconst projectPath = (projectId: string, suffix: string): string =>\n `/v1/projects/${encodePath(projectId)}${suffix}`;\n\n// The definition as sent, validated and hashed here first so a bad one fails\n// before any request.\nconst prepared = async <Schema extends z.ZodType>(args: {\n schema: Schema;\n value: unknown;\n hash: (definition: z.output<Schema>) => Promise<string>;\n what: string;\n}) => {\n const parsed = args.schema.safeParse(args.value);\n if (!parsed.success)\n throw clientError({\n message: `Invalid ${args.what}: ${parsed.error.message}`,\n status: 0,\n code: ClientErrorCode.InvalidRequest,\n });\n return {\n definition: jsonObjectSchema.parse(JSON.parse(JSON.stringify(parsed.data))),\n hash: await args.hash(parsed.data),\n };\n};\n\nconst lookupQuery = (selector: DefinitionSelectorIface) => ({\n name: 'name' in selector ? selector.name : undefined,\n hash: 'hash' in selector ? selector.hash : undefined,\n});\n\nexport const createHarnessesApi = (args: {\n context: ClientContextIface;\n projectId: string;\n /** Stores an agent's document so the platform can check against it; returns its hash. */\n store: (agent: AgentInput, signal?: AbortSignal) => Promise<string>;\n}): HarnessesApiIface => {\n const { http } = args.context;\n const path = (suffix: string) => projectPath(args.projectId, suffix);\n const allowancePath = (harness: string) =>\n path(`/subscription-allowances/${encodePath(harness)}`);\n return {\n check: async ({ agent, harness, compute, signal }) =>\n checkHarness({\n context: args.context,\n projectId: args.projectId,\n hash: typeof agent === 'string' ? agent : await args.store(agent, signal),\n harness,\n compute,\n signal,\n }),\n publish: async ({ harness, name, visibility, signal }) =>\n http.request({\n method: HttpMethod.Post,\n path: path('/harnesses/publish'),\n body: {\n schema: publishDefinitionRequestSchema,\n value: {\n name,\n visibility,\n ...(await prepared({\n schema: harnessDefinitionSchema,\n value: harness,\n hash: harnessDefinitionHash,\n what: 'harness definition',\n })),\n },\n },\n response: definitionPublicationSchema,\n signal,\n }),\n get: ({ signal, ...selector }) =>\n http.request({\n method: HttpMethod.Get,\n path: path('/harnesses/lookup'),\n query: lookupQuery(selector),\n response: harnessDefinitionInfoSchema,\n signal,\n }),\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 allowances: {\n list: async (options) =>\n (\n await http.request({\n method: HttpMethod.Get,\n path: path('/subscription-allowances'),\n response: subscriptionAllowanceListSchema,\n signal: options?.signal,\n })\n ).allowances,\n allow: ({ harness, signal }) =>\n http.request({\n method: HttpMethod.Put,\n path: allowancePath(harness),\n body: { schema: allowSubscriptionsRequestSchema, value: {} },\n response: subscriptionAllowanceSchema,\n signal,\n }),\n revoke: async ({ harness, signal }) => {\n await http.request({\n method: HttpMethod.Delete,\n path: allowancePath(harness),\n response: okResponseSchema,\n signal,\n });\n },\n },\n };\n};\n\nexport const createAcpAdaptersApi = (args: {\n context: ClientContextIface;\n projectId: string;\n}): AcpAdaptersApiIface => {\n const { http } = args.context;\n const path = (suffix: string) => projectPath(args.projectId, suffix);\n return {\n publish: async ({ adapter, name, visibility, signal }) =>\n http.request({\n method: HttpMethod.Post,\n path: path('/acp-adapters/publish'),\n body: {\n schema: publishDefinitionRequestSchema,\n value: {\n name,\n visibility,\n ...(await prepared({\n schema: acpAdapterDefinitionSchema,\n value: adapter,\n hash: acpAdapterDefinitionHash,\n what: 'ACP adapter definition',\n })),\n },\n },\n response: definitionPublicationSchema,\n signal,\n }),\n get: ({ signal, ...selector }) =>\n http.request({\n method: HttpMethod.Get,\n path: path('/acp-adapters/lookup'),\n query: lookupQuery(selector),\n response: acpAdapterDefinitionInfoSchema,\n signal,\n }),\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"],
5
+ "mappings": "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",
6
+ "names": []
7
+ }
@@ -20,7 +20,8 @@ export declare enum HttpMethod {
20
20
  Put = "PUT",
21
21
  Delete = "DELETE"
22
22
  }
23
- export type QueryValue = string | number | boolean | undefined;
23
+ /** An array repeats the parameter once per value. */
24
+ export type QueryValue = string | number | boolean | readonly string[] | undefined;
24
25
  export interface HttpBodyIface {
25
26
  /** The strict client-to-server schema the body must satisfy. */
26
27
  schema: z.ZodType;
@@ -1,10 +1,15 @@
1
1
  import { jsonValueSchema } from "@finalai/agent-protocol";
2
- import { AgentApiErrorCode, apiErrorResponseSchema } from "@finalai/agent-protocol/agent-platform";
2
+ import {
3
+ AgentApiErrorCode,
4
+ apiErrorResponseSchema,
5
+ requirementsUnmetDetailsSchema
6
+ } from "@finalai/agent-protocol/agent-platform";
3
7
  import {
4
8
  clientError,
5
9
  ClientErrorCode,
6
10
  decisionError,
7
11
  DecisionErrorReason,
12
+ requirementsUnmetError,
8
13
  turnRejectedError
9
14
  } from "./errors.mjs";
10
15
  var HttpMethod = /* @__PURE__ */ ((HttpMethod2) => {
@@ -54,6 +59,17 @@ const errorFromResponse = (args) => {
54
59
  state: detail.state
55
60
  });
56
61
  }
62
+ if (detail.code === AgentApiErrorCode.RequirementsUnmet || detail.code === AgentApiErrorCode.HarnessUnsuitable) {
63
+ const details = requirementsUnmetDetailsSchema.safeParse(detail.details ?? {});
64
+ return requirementsUnmetError({
65
+ message,
66
+ status: args.status,
67
+ code: detail.code,
68
+ body,
69
+ agent: details.success ? details.data.agent : null,
70
+ requirements: details.success ? details.data.requirements : []
71
+ });
72
+ }
57
73
  const reason = decisionReasonByCode.get(detail.code);
58
74
  if (reason != null) {
59
75
  return decisionError({
@@ -96,7 +112,10 @@ const createHttp = (options) => {
96
112
  const request = async (args) => {
97
113
  const target = url(args.path);
98
114
  for (const [key, value] of Object.entries(args.query ?? {})) {
99
- if (value !== void 0) target.searchParams.set(key, String(value));
115
+ if (value === void 0) continue;
116
+ if (typeof value === "object") {
117
+ for (const item of value) target.searchParams.append(key, item);
118
+ } else target.searchParams.set(key, String(value));
100
119
  }
101
120
  let body;
102
121
  if (args.body != null) {
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../../../../src/agent-client/http.ts"],
4
- "sourcesContent": ["import { jsonValueSchema, type JsonValue } from '@finalai/agent-protocol';\nimport { AgentApiErrorCode, apiErrorResponseSchema } from '@finalai/agent-protocol/agent-platform';\nimport type * as z from 'zod';\nimport {\n clientError,\n ClientErrorCode,\n decisionError,\n DecisionErrorReason,\n turnRejectedError,\n type AgentClientError,\n} from \"./errors.mjs\";\n\nexport type FetchIface = (input: string, init: RequestInit) => Promise<Response>;\n\n/** API key (`fk_...`), a bearer source (console access token, service grant), or the browser's console cookie. */\nexport type AgentClientAuth =\n | { anonymous: true }\n | { apiKey: string }\n | { bearer: () => Promise<string> | string }\n | { cookies: true };\n\n/** Extra headers per request (client identity, request source). */\nexport type HeadersOption = () => Record<string, string> | Promise<Record<string, string>>;\n\nexport enum HttpMethod {\n Get = 'GET',\n Post = 'POST',\n Patch = 'PATCH',\n Put = 'PUT',\n Delete = 'DELETE',\n}\n\nexport type QueryValue = string | number | boolean | undefined;\n\nexport interface HttpBodyIface {\n /** The strict client-to-server schema the body must satisfy. */\n schema: z.ZodType;\n value: unknown;\n}\n\nexport interface HttpRequestArgsIface<Output> {\n method: HttpMethod;\n path: string;\n query?: Record<string, QueryValue>;\n body?: HttpBodyIface;\n response: z.ZodType<Output>;\n signal?: AbortSignal;\n keepalive?: boolean;\n /** Ids the error mapping attaches to DecisionError / TurnRejectedError. */\n context?: { decisionId?: string; sessionId?: string };\n}\n\nexport interface HttpIface {\n request: <Output>(args: HttpRequestArgsIface<Output>) => Promise<Output>;\n /** Auth and caller headers for non-fetch transports (ACP WebSocket). */\n headers: () => Promise<Record<string, string>>;\n url: (path: string) => URL;\n fetch: FetchIface;\n usesCookies: boolean;\n}\n\nexport interface CreateHttpOptionsIface {\n host: string;\n auth: AgentClientAuth;\n headers?: HeadersOption;\n fetch?: FetchIface;\n}\n\nconst decisionReasonByCode = new Map<string, DecisionErrorReason>([\n [AgentApiErrorCode.DecisionNotFound, DecisionErrorReason.NotFound],\n [AgentApiErrorCode.DecisionNotInAudience, DecisionErrorReason.NotInAudience],\n [AgentApiErrorCode.DecisionAlreadyResolved, DecisionErrorReason.AlreadyResolved],\n [AgentApiErrorCode.DecisionExpired, DecisionErrorReason.Expired],\n]);\n\nconst parseJson = (text: string): { ok: true; value: JsonValue } | { ok: false } => {\n if (text.trim().length === 0) return { ok: true, value: {} };\n try {\n const parsed = jsonValueSchema.safeParse(JSON.parse(text));\n return parsed.success ? { ok: true, value: parsed.data } : { ok: false };\n } catch {\n return { ok: false };\n }\n};\n\ninterface ErrorResponseArgsIface {\n status: number;\n text: string;\n context: HttpRequestArgsIface<unknown>['context'];\n}\n\n/** Maps a non-2xx response to the SDK error family. */\nexport const errorFromResponse = (args: ErrorResponseArgsIface): AgentClientError => {\n const json = parseJson(args.text);\n const body = json.ok ? json.value : args.text.length > 0 ? args.text : null;\n const parsed = apiErrorResponseSchema.safeParse(body);\n if (!parsed.success) {\n return clientError({\n message: `Request failed with status ${args.status}`,\n status: args.status,\n code: ClientErrorCode.Unknown,\n body,\n });\n }\n const detail = parsed.data.error;\n const message = detail.message.length > 0 ? detail.message : detail.code;\n if (detail.code === AgentApiErrorCode.TurnRejected) {\n return turnRejectedError({\n message,\n status: args.status,\n code: detail.code,\n body,\n sessionId: detail.sessionId ?? args.context?.sessionId ?? null,\n state: detail.state,\n });\n }\n const reason = decisionReasonByCode.get(detail.code);\n if (reason != null) {\n return decisionError({\n message,\n status: args.status,\n code: detail.code,\n body,\n decisionId: detail.decisionId ?? args.context?.decisionId ?? null,\n reason,\n });\n }\n return clientError({ message, status: args.status, code: detail.code, body });\n};\n\nconst resolveHeaders = async (option: HeadersOption | undefined): Promise<Record<string, string>> =>\n option == null ? {} : await option();\n\nconst authHeaders = async (auth: AgentClientAuth): Promise<Record<string, string>> => {\n if ('apiKey' in auth) return { authorization: `Bearer ${auth.apiKey}` };\n if ('bearer' in auth) return { authorization: `Bearer ${await auth.bearer()}` };\n return {};\n};\n\nconst isAbort = (signal: AbortSignal | undefined): boolean => signal?.aborted === true;\n\n/** Where the session service mounts its API routes when `host` is a bare origin. */\nexport const DEFAULT_API_PREFIX = '/api';\n\n// Preserve a custom API base path when joining absolute route paths.\nexport const joinHostPath = (host: string, path: string): URL => {\n const base = new URL(host);\n const trimmed = base.pathname.replace(/\\/+$/, '');\n const prefix = trimmed.length === 0 ? DEFAULT_API_PREFIX : trimmed;\n const [pathname, search] = path.split('?', 2);\n const target = new URL(base.origin);\n target.pathname = `${prefix}${pathname?.startsWith('/') ? '' : '/'}${pathname ?? ''}`;\n if (search != null) target.search = search;\n return target;\n};\n\nexport const createHttp = (options: CreateHttpOptionsIface): HttpIface => {\n const fetchImpl: FetchIface = options.fetch ?? ((input, init) => globalThis.fetch(input, init));\n const usesCookies = 'cookies' in options.auth;\n\n const headers = async (): Promise<Record<string, string>> => ({\n ...(await resolveHeaders(options.headers)),\n ...(await authHeaders(options.auth)),\n });\n\n const url = (path: string): URL => joinHostPath(options.host, path);\n\n const request = async <Output>(args: HttpRequestArgsIface<Output>): Promise<Output> => {\n const target = url(args.path);\n for (const [key, value] of Object.entries(args.query ?? {})) {\n if (value !== undefined) target.searchParams.set(key, String(value));\n }\n let body: string | undefined;\n if (args.body != null) {\n const validated = args.body.schema.safeParse(args.body.value);\n if (!validated.success) {\n throw clientError({\n message: `Invalid request for ${args.method} ${args.path}: ${validated.error.message}`,\n status: 0,\n code: ClientErrorCode.InvalidRequest,\n });\n }\n body = JSON.stringify(validated.data);\n }\n const baseHeaders = { accept: 'application/json', ...(await headers()) };\n const requestHeaders =\n body === undefined ? baseHeaders : { ...baseHeaders, 'content-type': 'application/json' };\n\n let response: Response;\n let text: string;\n try {\n response = await fetchImpl(target.toString(), {\n method: args.method,\n headers: requestHeaders,\n body,\n signal: args.signal,\n credentials: 'anonymous' in options.auth ? 'omit' : usesCookies ? 'include' : undefined,\n keepalive: args.keepalive,\n });\n // Read failures are network failures too.\n text = await response.text();\n } catch (cause) {\n if (isAbort(args.signal)) throw cause;\n throw clientError({\n message: `Network request to ${target.pathname} failed`,\n status: 0,\n code: ClientErrorCode.Network,\n cause,\n });\n }\n // Read text first so proxy and CDN error bodies survive non-JSON responses.\n if (!response.ok) {\n throw errorFromResponse({ status: response.status, text, context: args.context });\n }\n const json = parseJson(text);\n if (!json.ok) {\n throw clientError({\n message: `Response from ${args.method} ${args.path} was not JSON`,\n status: response.status,\n code: ClientErrorCode.InvalidResponse,\n body: text,\n });\n }\n const parsed = args.response.safeParse(json.value);\n if (!parsed.success) {\n throw clientError({\n message: `Unexpected response from ${args.method} ${args.path}: ${parsed.error.message}`,\n status: response.status,\n code: ClientErrorCode.InvalidResponse,\n body: json.value,\n });\n }\n return parsed.data;\n };\n\n return { request, headers, url, fetch: fetchImpl, usesCookies };\n};\n"],
5
- "mappings": "AAAA,SAAS,uBAAuC;AAChD,SAAS,mBAAmB,8BAA8B;AAE1D;AAAA,EACE;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,OAEK;AAcA,IAAK,aAAL,kBAAKA,gBAAL;AACL,EAAAA,YAAA,SAAM;AACN,EAAAA,YAAA,UAAO;AACP,EAAAA,YAAA,WAAQ;AACR,EAAAA,YAAA,SAAM;AACN,EAAAA,YAAA,YAAS;AALC,SAAAA;AAAA,GAAA;AA4CZ,MAAM,uBAAuB,oBAAI,IAAiC;AAAA,EAChE,CAAC,kBAAkB,kBAAkB,oBAAoB,QAAQ;AAAA,EACjE,CAAC,kBAAkB,uBAAuB,oBAAoB,aAAa;AAAA,EAC3E,CAAC,kBAAkB,yBAAyB,oBAAoB,eAAe;AAAA,EAC/E,CAAC,kBAAkB,iBAAiB,oBAAoB,OAAO;AACjE,CAAC;AAED,MAAM,YAAY,CAAC,SAAiE;AAClF,MAAI,KAAK,KAAK,EAAE,WAAW,EAAG,QAAO,EAAE,IAAI,MAAM,OAAO,CAAC,EAAE;AAC3D,MAAI;AACF,UAAM,SAAS,gBAAgB,UAAU,KAAK,MAAM,IAAI,CAAC;AACzD,WAAO,OAAO,UAAU,EAAE,IAAI,MAAM,OAAO,OAAO,KAAK,IAAI,EAAE,IAAI,MAAM;AAAA,EACzE,QAAQ;AACN,WAAO,EAAE,IAAI,MAAM;AAAA,EACrB;AACF;AASO,MAAM,oBAAoB,CAAC,SAAmD;AACnF,QAAM,OAAO,UAAU,KAAK,IAAI;AAChC,QAAM,OAAO,KAAK,KAAK,KAAK,QAAQ,KAAK,KAAK,SAAS,IAAI,KAAK,OAAO;AACvE,QAAM,SAAS,uBAAuB,UAAU,IAAI;AACpD,MAAI,CAAC,OAAO,SAAS;AACnB,WAAO,YAAY;AAAA,MACjB,SAAS,8BAA8B,KAAK,MAAM;AAAA,MAClD,QAAQ,KAAK;AAAA,MACb,MAAM,gBAAgB;AAAA,MACtB;AAAA,IACF,CAAC;AAAA,EACH;AACA,QAAM,SAAS,OAAO,KAAK;AAC3B,QAAM,UAAU,OAAO,QAAQ,SAAS,IAAI,OAAO,UAAU,OAAO;AACpE,MAAI,OAAO,SAAS,kBAAkB,cAAc;AAClD,WAAO,kBAAkB;AAAA,MACvB;AAAA,MACA,QAAQ,KAAK;AAAA,MACb,MAAM,OAAO;AAAA,MACb;AAAA,MACA,WAAW,OAAO,aAAa,KAAK,SAAS,aAAa;AAAA,MAC1D,OAAO,OAAO;AAAA,IAChB,CAAC;AAAA,EACH;AACA,QAAM,SAAS,qBAAqB,IAAI,OAAO,IAAI;AACnD,MAAI,UAAU,MAAM;AAClB,WAAO,cAAc;AAAA,MACnB;AAAA,MACA,QAAQ,KAAK;AAAA,MACb,MAAM,OAAO;AAAA,MACb;AAAA,MACA,YAAY,OAAO,cAAc,KAAK,SAAS,cAAc;AAAA,MAC7D;AAAA,IACF,CAAC;AAAA,EACH;AACA,SAAO,YAAY,EAAE,SAAS,QAAQ,KAAK,QAAQ,MAAM,OAAO,MAAM,KAAK,CAAC;AAC9E;AAEA,MAAM,iBAAiB,OAAO,WAC5B,UAAU,OAAO,CAAC,IAAI,MAAM,OAAO;AAErC,MAAM,cAAc,OAAO,SAA2D;AACpF,MAAI,YAAY,KAAM,QAAO,EAAE,eAAe,UAAU,KAAK,MAAM,GAAG;AACtE,MAAI,YAAY,KAAM,QAAO,EAAE,eAAe,UAAU,MAAM,KAAK,OAAO,CAAC,GAAG;AAC9E,SAAO,CAAC;AACV;AAEA,MAAM,UAAU,CAAC,WAA6C,QAAQ,YAAY;AAG3E,MAAM,qBAAqB;AAG3B,MAAM,eAAe,CAAC,MAAc,SAAsB;AAC/D,QAAM,OAAO,IAAI,IAAI,IAAI;AACzB,QAAM,UAAU,KAAK,SAAS,QAAQ,QAAQ,EAAE;AAChD,QAAM,SAAS,QAAQ,WAAW,IAAI,qBAAqB;AAC3D,QAAM,CAAC,UAAU,MAAM,IAAI,KAAK,MAAM,KAAK,CAAC;AAC5C,QAAM,SAAS,IAAI,IAAI,KAAK,MAAM;AAClC,SAAO,WAAW,GAAG,MAAM,GAAG,UAAU,WAAW,GAAG,IAAI,KAAK,GAAG,GAAG,YAAY,EAAE;AACnF,MAAI,UAAU,KAAM,QAAO,SAAS;AACpC,SAAO;AACT;AAEO,MAAM,aAAa,CAAC,YAA+C;AACxE,QAAM,YAAwB,QAAQ,UAAU,CAAC,OAAO,SAAS,WAAW,MAAM,OAAO,IAAI;AAC7F,QAAM,cAAc,aAAa,QAAQ;AAEzC,QAAM,UAAU,aAA8C;AAAA,IAC5D,GAAI,MAAM,eAAe,QAAQ,OAAO;AAAA,IACxC,GAAI,MAAM,YAAY,QAAQ,IAAI;AAAA,EACpC;AAEA,QAAM,MAAM,CAAC,SAAsB,aAAa,QAAQ,MAAM,IAAI;AAElE,QAAM,UAAU,OAAe,SAAwD;AACrF,UAAM,SAAS,IAAI,KAAK,IAAI;AAC5B,eAAW,CAAC,KAAK,KAAK,KAAK,OAAO,QAAQ,KAAK,SAAS,CAAC,CAAC,GAAG;AAC3D,UAAI,UAAU,OAAW,QAAO,aAAa,IAAI,KAAK,OAAO,KAAK,CAAC;AAAA,IACrE;AACA,QAAI;AACJ,QAAI,KAAK,QAAQ,MAAM;AACrB,YAAM,YAAY,KAAK,KAAK,OAAO,UAAU,KAAK,KAAK,KAAK;AAC5D,UAAI,CAAC,UAAU,SAAS;AACtB,cAAM,YAAY;AAAA,UAChB,SAAS,uBAAuB,KAAK,MAAM,IAAI,KAAK,IAAI,KAAK,UAAU,MAAM,OAAO;AAAA,UACpF,QAAQ;AAAA,UACR,MAAM,gBAAgB;AAAA,QACxB,CAAC;AAAA,MACH;AACA,aAAO,KAAK,UAAU,UAAU,IAAI;AAAA,IACtC;AACA,UAAM,cAAc,EAAE,QAAQ,oBAAoB,GAAI,MAAM,QAAQ,EAAG;AACvE,UAAM,iBACJ,SAAS,SAAY,cAAc,EAAE,GAAG,aAAa,gBAAgB,mBAAmB;AAE1F,QAAI;AACJ,QAAI;AACJ,QAAI;AACF,iBAAW,MAAM,UAAU,OAAO,SAAS,GAAG;AAAA,QAC5C,QAAQ,KAAK;AAAA,QACb,SAAS;AAAA,QACT;AAAA,QACA,QAAQ,KAAK;AAAA,QACb,aAAa,eAAe,QAAQ,OAAO,SAAS,cAAc,YAAY;AAAA,QAC9E,WAAW,KAAK;AAAA,MAClB,CAAC;AAED,aAAO,MAAM,SAAS,KAAK;AAAA,IAC7B,SAAS,OAAO;AACd,UAAI,QAAQ,KAAK,MAAM,EAAG,OAAM;AAChC,YAAM,YAAY;AAAA,QAChB,SAAS,sBAAsB,OAAO,QAAQ;AAAA,QAC9C,QAAQ;AAAA,QACR,MAAM,gBAAgB;AAAA,QACtB;AAAA,MACF,CAAC;AAAA,IACH;AAEA,QAAI,CAAC,SAAS,IAAI;AAChB,YAAM,kBAAkB,EAAE,QAAQ,SAAS,QAAQ,MAAM,SAAS,KAAK,QAAQ,CAAC;AAAA,IAClF;AACA,UAAM,OAAO,UAAU,IAAI;AAC3B,QAAI,CAAC,KAAK,IAAI;AACZ,YAAM,YAAY;AAAA,QAChB,SAAS,iBAAiB,KAAK,MAAM,IAAI,KAAK,IAAI;AAAA,QAClD,QAAQ,SAAS;AAAA,QACjB,MAAM,gBAAgB;AAAA,QACtB,MAAM;AAAA,MACR,CAAC;AAAA,IACH;AACA,UAAM,SAAS,KAAK,SAAS,UAAU,KAAK,KAAK;AACjD,QAAI,CAAC,OAAO,SAAS;AACnB,YAAM,YAAY;AAAA,QAChB,SAAS,4BAA4B,KAAK,MAAM,IAAI,KAAK,IAAI,KAAK,OAAO,MAAM,OAAO;AAAA,QACtF,QAAQ,SAAS;AAAA,QACjB,MAAM,gBAAgB;AAAA,QACtB,MAAM,KAAK;AAAA,MACb,CAAC;AAAA,IACH;AACA,WAAO,OAAO;AAAA,EAChB;AAEA,SAAO,EAAE,SAAS,SAAS,KAAK,OAAO,WAAW,YAAY;AAChE;",
4
+ "sourcesContent": ["import { jsonValueSchema, type JsonValue } from '@finalai/agent-protocol';\nimport {\n AgentApiErrorCode,\n apiErrorResponseSchema,\n requirementsUnmetDetailsSchema,\n} from '@finalai/agent-protocol/agent-platform';\nimport type * as z from 'zod';\nimport {\n clientError,\n ClientErrorCode,\n decisionError,\n DecisionErrorReason,\n requirementsUnmetError,\n turnRejectedError,\n type AgentClientError,\n} from \"./errors.mjs\";\n\nexport type FetchIface = (input: string, init: RequestInit) => Promise<Response>;\n\n/** API key (`fk_...`), a bearer source (console access token, service grant), or the browser's console cookie. */\nexport type AgentClientAuth =\n | { anonymous: true }\n | { apiKey: string }\n | { bearer: () => Promise<string> | string }\n | { cookies: true };\n\n/** Extra headers per request (client identity, request source). */\nexport type HeadersOption = () => Record<string, string> | Promise<Record<string, string>>;\n\nexport enum HttpMethod {\n Get = 'GET',\n Post = 'POST',\n Patch = 'PATCH',\n Put = 'PUT',\n Delete = 'DELETE',\n}\n\n/** An array repeats the parameter once per value. */\nexport type QueryValue = string | number | boolean | readonly string[] | undefined;\n\nexport interface HttpBodyIface {\n /** The strict client-to-server schema the body must satisfy. */\n schema: z.ZodType;\n value: unknown;\n}\n\nexport interface HttpRequestArgsIface<Output> {\n method: HttpMethod;\n path: string;\n query?: Record<string, QueryValue>;\n body?: HttpBodyIface;\n response: z.ZodType<Output>;\n signal?: AbortSignal;\n keepalive?: boolean;\n /** Ids the error mapping attaches to DecisionError / TurnRejectedError. */\n context?: { decisionId?: string; sessionId?: string };\n}\n\nexport interface HttpIface {\n request: <Output>(args: HttpRequestArgsIface<Output>) => Promise<Output>;\n /** Auth and caller headers for non-fetch transports (ACP WebSocket). */\n headers: () => Promise<Record<string, string>>;\n url: (path: string) => URL;\n fetch: FetchIface;\n usesCookies: boolean;\n}\n\nexport interface CreateHttpOptionsIface {\n host: string;\n auth: AgentClientAuth;\n headers?: HeadersOption;\n fetch?: FetchIface;\n}\n\nconst decisionReasonByCode = new Map<string, DecisionErrorReason>([\n [AgentApiErrorCode.DecisionNotFound, DecisionErrorReason.NotFound],\n [AgentApiErrorCode.DecisionNotInAudience, DecisionErrorReason.NotInAudience],\n [AgentApiErrorCode.DecisionAlreadyResolved, DecisionErrorReason.AlreadyResolved],\n [AgentApiErrorCode.DecisionExpired, DecisionErrorReason.Expired],\n]);\n\nconst parseJson = (text: string): { ok: true; value: JsonValue } | { ok: false } => {\n if (text.trim().length === 0) return { ok: true, value: {} };\n try {\n const parsed = jsonValueSchema.safeParse(JSON.parse(text));\n return parsed.success ? { ok: true, value: parsed.data } : { ok: false };\n } catch {\n return { ok: false };\n }\n};\n\ninterface ErrorResponseArgsIface {\n status: number;\n text: string;\n context: HttpRequestArgsIface<unknown>['context'];\n}\n\n/** Maps a non-2xx response to the SDK error family. */\nexport const errorFromResponse = (args: ErrorResponseArgsIface): AgentClientError => {\n const json = parseJson(args.text);\n const body = json.ok ? json.value : args.text.length > 0 ? args.text : null;\n const parsed = apiErrorResponseSchema.safeParse(body);\n if (!parsed.success) {\n return clientError({\n message: `Request failed with status ${args.status}`,\n status: args.status,\n code: ClientErrorCode.Unknown,\n body,\n });\n }\n const detail = parsed.data.error;\n const message = detail.message.length > 0 ? detail.message : detail.code;\n if (detail.code === AgentApiErrorCode.TurnRejected) {\n return turnRejectedError({\n message,\n status: args.status,\n code: detail.code,\n body,\n sessionId: detail.sessionId ?? args.context?.sessionId ?? null,\n state: detail.state,\n });\n }\n if (\n detail.code === AgentApiErrorCode.RequirementsUnmet ||\n detail.code === AgentApiErrorCode.HarnessUnsuitable\n ) {\n const details = requirementsUnmetDetailsSchema.safeParse(detail.details ?? {});\n return requirementsUnmetError({\n message,\n status: args.status,\n code: detail.code,\n body,\n agent: details.success ? details.data.agent : null,\n requirements: details.success ? details.data.requirements : [],\n });\n }\n const reason = decisionReasonByCode.get(detail.code);\n if (reason != null) {\n return decisionError({\n message,\n status: args.status,\n code: detail.code,\n body,\n decisionId: detail.decisionId ?? args.context?.decisionId ?? null,\n reason,\n });\n }\n return clientError({ message, status: args.status, code: detail.code, body });\n};\n\nconst resolveHeaders = async (option: HeadersOption | undefined): Promise<Record<string, string>> =>\n option == null ? {} : await option();\n\nconst authHeaders = async (auth: AgentClientAuth): Promise<Record<string, string>> => {\n if ('apiKey' in auth) return { authorization: `Bearer ${auth.apiKey}` };\n if ('bearer' in auth) return { authorization: `Bearer ${await auth.bearer()}` };\n return {};\n};\n\nconst isAbort = (signal: AbortSignal | undefined): boolean => signal?.aborted === true;\n\n/** Where the session service mounts its API routes when `host` is a bare origin. */\nexport const DEFAULT_API_PREFIX = '/api';\n\n// Preserve a custom API base path when joining absolute route paths.\nexport const joinHostPath = (host: string, path: string): URL => {\n const base = new URL(host);\n const trimmed = base.pathname.replace(/\\/+$/, '');\n const prefix = trimmed.length === 0 ? DEFAULT_API_PREFIX : trimmed;\n const [pathname, search] = path.split('?', 2);\n const target = new URL(base.origin);\n target.pathname = `${prefix}${pathname?.startsWith('/') ? '' : '/'}${pathname ?? ''}`;\n if (search != null) target.search = search;\n return target;\n};\n\nexport const createHttp = (options: CreateHttpOptionsIface): HttpIface => {\n const fetchImpl: FetchIface = options.fetch ?? ((input, init) => globalThis.fetch(input, init));\n const usesCookies = 'cookies' in options.auth;\n\n const headers = async (): Promise<Record<string, string>> => ({\n ...(await resolveHeaders(options.headers)),\n ...(await authHeaders(options.auth)),\n });\n\n const url = (path: string): URL => joinHostPath(options.host, path);\n\n const request = async <Output>(args: HttpRequestArgsIface<Output>): Promise<Output> => {\n const target = url(args.path);\n for (const [key, value] of Object.entries(args.query ?? {})) {\n if (value === undefined) continue;\n if (typeof value === 'object') {\n for (const item of value) target.searchParams.append(key, item);\n } else target.searchParams.set(key, String(value));\n }\n let body: string | undefined;\n if (args.body != null) {\n const validated = args.body.schema.safeParse(args.body.value);\n if (!validated.success) {\n throw clientError({\n message: `Invalid request for ${args.method} ${args.path}: ${validated.error.message}`,\n status: 0,\n code: ClientErrorCode.InvalidRequest,\n });\n }\n body = JSON.stringify(validated.data);\n }\n const baseHeaders = { accept: 'application/json', ...(await headers()) };\n const requestHeaders =\n body === undefined ? baseHeaders : { ...baseHeaders, 'content-type': 'application/json' };\n\n let response: Response;\n let text: string;\n try {\n response = await fetchImpl(target.toString(), {\n method: args.method,\n headers: requestHeaders,\n body,\n signal: args.signal,\n credentials: 'anonymous' in options.auth ? 'omit' : usesCookies ? 'include' : undefined,\n keepalive: args.keepalive,\n });\n // Read failures are network failures too.\n text = await response.text();\n } catch (cause) {\n if (isAbort(args.signal)) throw cause;\n throw clientError({\n message: `Network request to ${target.pathname} failed`,\n status: 0,\n code: ClientErrorCode.Network,\n cause,\n });\n }\n // Read text first so proxy and CDN error bodies survive non-JSON responses.\n if (!response.ok) {\n throw errorFromResponse({ status: response.status, text, context: args.context });\n }\n const json = parseJson(text);\n if (!json.ok) {\n throw clientError({\n message: `Response from ${args.method} ${args.path} was not JSON`,\n status: response.status,\n code: ClientErrorCode.InvalidResponse,\n body: text,\n });\n }\n const parsed = args.response.safeParse(json.value);\n if (!parsed.success) {\n throw clientError({\n message: `Unexpected response from ${args.method} ${args.path}: ${parsed.error.message}`,\n status: response.status,\n code: ClientErrorCode.InvalidResponse,\n body: json.value,\n });\n }\n return parsed.data;\n };\n\n return { request, headers, url, fetch: fetchImpl, usesCookies };\n};\n"],
5
+ "mappings": "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",
6
6
  "names": ["HttpMethod"]
7
7
  }
@@ -1,18 +1,33 @@
1
1
  export * from '@finalai/agent-protocol/agent-platform';
2
+ export { Capability, FilesAccess, ScreenAccess, ShellAccess, type CapabilityAccess, } from '@finalai/agent-protocol';
2
3
  export { AcpAuthMode, type AcpApiIface, type AcpConnectArgsIface } from "./acp.mjs";
3
4
  export { createTextCollector, isUserMessageFor, sessionUpdateOf, textOf, turnEndOf, type AcpSessionUpdateIface, type TurnEndIface, } from "./acp-frames.mjs";
4
- export type { ComputerSetupGuidesApiIface, DefinitionRefIface, DefinitionsApiIface, ProvidersApiIface, ScheduleRef, SchedulesApiIface, } from "./build.mjs";
5
- export { createClient, type AgentClientIface, type AgentHandleIface, type AgentsApiIface, type CreateClientOptionsIface, type PeopleApiIface, type RealtimeApiIface, } from "./client.mjs";
5
+ export type { AgentInput, AgentValue, AgentValueCodecIface } from "./agent-input.mjs";
6
+ export type { ActorOptionIface, ChannelAppsApiIface, ChannelBindingsApiIface, ChannelSourceIface, ChannelSourceOf, ChannelTicketsApiIface, IdentityLinksApiIface, InstallChannelArgsIface, ProjectChannelsApiIface, PublishChannelArgsIface, UpdateChannelBindingArgsIface, } from "./channels.mjs";
7
+ export { DEFAULT_AGENTS_HOST, createClient, type AgentClientIface, type AgentsApiIface, type AppApiIface, type CreateClientOptionsIface, type DecisionsApiIface, type InferenceApiIface, type PeopleApiIface, type PlatformIdentityApiIface, type RealtimeApiIface, } from "./client.mjs";
6
8
  export { CollectionEventKind, CollectionResyncReason, type CollectionEvent, type CollectionEventsOptionsIface, type CollectionResyncEventIface, } from "./collection-events.mjs";
7
9
  export { ConfigOptionCategory, configSelectFor, configSelectsOf, type ConfigSelectChoiceIface, type ConfigSelectIface, type SessionConfigOptionIface, } from "./config-options.mjs";
8
10
  export type { EnumInput, SignalOptionsIface } from "./context.mjs";
11
+ export type { ConversationChannelRoutesApiIface, ConversationContextApiIface, ConversationContextEntryInputIface, ConversationDecisionsApiIface, ConversationInputsApiIface, ConversationLabelsApiIface, ConversationReadGrantsApiIface, ConversationResourcesIface, ResourceSubscriptionsApiIface, SendInputArgsIface, } from "./conversation-resources.mjs";
9
12
  export { TURN_OPEN_SESSION_STATES, isNewerMessageVersion, messageVersionOf, type MessageVersionIface, } from "./conversations.mjs";
10
- export type { ConversationAgentTurnIface, ConversationEvent, ConversationEventMetaIface, ConversationEventsOptionsIface, ConversationHandleIface, ConversationsApiIface, CreateConversationArgsIface, ListMessagesOptionsIface, OpenedConversationIface, ParticipantCreateInput, SandboxFileContentArgsIface, SandboxFileContentRequestIface, SendMessageOptionsIface, SentMessageIface, UploadAttachmentArgsIface, } from "./conversations.mjs";
11
- export { AgentClientErrorName, ClientErrorCode, DecisionErrorReason, clientError, decisionError, isClientError, isDecisionError, isRealtimeSubscriptionError, isTerminalRealtimeError, isTurnRejectedError, realtimeSubscriptionError, turnRejectedError, type AgentClientError, type ClientErrorIface, type DecisionErrorIface, type RealtimeSubscriptionErrorIface, type TurnRejectedErrorIface, } from "./errors.mjs";
13
+ export type { ConversationAgentTurnIface, ConversationEvent, ConversationEventMetaIface, ConversationEventsOptionsIface, ConversationHandleIface, ConversationsApiIface, CreateConversationArgsIface, ListMessagesOptionsIface, OpenedConversationIface, ParticipantCreateInput, ParticipantsApiIface, ProjectConversationsApiIface, SandboxFileContentArgsIface, SandboxFileContentRequestIface, SendMessageOptionsIface, SentMessageIface, UploadAttachmentArgsIface, } from "./conversations.mjs";
14
+ export { AgentClientErrorName, ClientErrorCode, DecisionErrorReason, clientError, decisionError, isClientError, isDecisionError, isRealtimeSubscriptionError, isRequirementsUnmetError, isTerminalRealtimeError, isTurnRejectedError, realtimeSubscriptionError, requirementsUnmetError, turnRejectedError, type AgentClientError, type ClientErrorIface, type DecisionErrorIface, type RealtimeSubscriptionErrorIface, type RequirementsUnmetErrorIface, type TurnRejectedErrorIface, } from "./errors.mjs";
15
+ export { EVENTS_POLL_INTERVAL_MS, type EventsApiIface, type EventSubscriptionsApiIface, type ListEventsOptionsIface, type StreamEventsOptionsIface, } from "./events.mjs";
12
16
  export { defaultStreamTiming, type StreamTimingIface } from "./frame-stream.mjs";
13
17
  export type { AgentClientAuth, FetchIface, HeadersOption } from "./http.mjs";
18
+ export type { AcpAdaptersApiIface, DefinitionSelectorIface, HarnessesApiIface, SubscriptionAllowancesApiIface, } from "./harnesses.mjs";
19
+ export type { IntegrationsApiIface } from "./integrations.mjs";
14
20
  export { SessionLiveEventKind, type SessionLiveEvent } from "./live-stream.mjs";
21
+ export type { LocalComputeIface } from "./local-host.mjs";
22
+ export type { OAuthClientsApiIface, SignInReturnOriginsApiIface } from "./oauth-clients.mjs";
23
+ export type { ProjectClientIface } from "./project.mjs";
24
+ export type { AgentSelectorIface, ProjectAgentsApiIface } from "./project-agents.mjs";
25
+ export type { ProjectApiKeysApiIface, ProjectMembersApiIface, ProjectResourceApiIface, ProjectsApiIface, } from "./projects.mjs";
26
+ export type { ProjectPublisherApiIface, PublicNamesApiIface, PublisherHandleIface, PublishersApiIface, } from "./publishers.mjs";
27
+ export { provideDocumentOf, resourceIdOf, type ProvideIface, type ProvidePatchIface, type ResourceRef, type ResourceRefIface, } from "./provide.mjs";
15
28
  export { createGatewayRealtimeTransport, type GatewayConnect, type GatewayConnectionIface, type GatewayRealtimeTransportOptionsIface, type RealtimeSubscribeOptionsIface, type RealtimeTransportFrameIface, type RealtimeTransportIface, } from "./realtime.mjs";
16
29
  export { SANDBOX_FILE_URI_SCHEME, createSandboxFileUri, parseSandboxFileUri, type SandboxFileTargetIface, } from "./sandbox-uri.mjs";
17
- export type { CreateSessionArgsIface, CreatedSessionIface, ForkSessionOptionsIface, RespondArgs, SendOptionsIface, SessionHandleIface, SessionsApiIface, StreamOptionsIface, TurnHandleIface, TurnResultIface, } from "./sessions.mjs";
18
- export type { ChannelBindingsApiIface } from "./channels.mjs";
30
+ export type { SandboxProvidersApiIface } from "./sandbox-providers.mjs";
31
+ export type { CreateSandboxOptionsIface, SandboxEnvironmentValueIface, SandboxHandleIface, SandboxOwnerIface, SandboxSetupRefIface, SandboxSetupsApiIface, SandboxesApiIface, } from "./sandboxes.mjs";
32
+ export type { ProjectSchedulesApiIface } from "./schedules.mjs";
33
+ export type { CreateSessionArgsIface, CreatedSessionIface, ForkSessionOptionsIface, ProjectSessionsApiIface, RespondArgs, SendOptionsIface, SessionHandleIface, SessionsApiIface, StreamOptionsIface, TurnHandleIface, TurnResultIface, } from "./sessions.mjs";
@@ -1,4 +1,10 @@
1
1
  export * from "@finalai/agent-protocol/agent-platform";
2
+ import {
3
+ Capability,
4
+ FilesAccess,
5
+ ScreenAccess,
6
+ ShellAccess
7
+ } from "@finalai/agent-protocol";
2
8
  import { AcpAuthMode } from "./acp.mjs";
3
9
  import {
4
10
  createTextCollector,
@@ -8,6 +14,7 @@ import {
8
14
  turnEndOf
9
15
  } from "./acp-frames.mjs";
10
16
  import {
17
+ DEFAULT_AGENTS_HOST,
11
18
  createClient
12
19
  } from "./client.mjs";
13
20
  import {
@@ -33,13 +40,22 @@ import {
33
40
  isClientError,
34
41
  isDecisionError,
35
42
  isRealtimeSubscriptionError,
43
+ isRequirementsUnmetError,
36
44
  isTerminalRealtimeError,
37
45
  isTurnRejectedError,
38
46
  realtimeSubscriptionError,
47
+ requirementsUnmetError,
39
48
  turnRejectedError
40
49
  } from "./errors.mjs";
50
+ import {
51
+ EVENTS_POLL_INTERVAL_MS
52
+ } from "./events.mjs";
41
53
  import { defaultStreamTiming } from "./frame-stream.mjs";
42
54
  import { SessionLiveEventKind } from "./live-stream.mjs";
55
+ import {
56
+ provideDocumentOf,
57
+ resourceIdOf
58
+ } from "./provide.mjs";
43
59
  import {
44
60
  createGatewayRealtimeTransport
45
61
  } from "./realtime.mjs";
@@ -51,13 +67,19 @@ import {
51
67
  export {
52
68
  AcpAuthMode,
53
69
  AgentClientErrorName,
70
+ Capability,
54
71
  ClientErrorCode,
55
72
  CollectionEventKind,
56
73
  CollectionResyncReason,
57
74
  ConfigOptionCategory,
75
+ DEFAULT_AGENTS_HOST,
58
76
  DecisionErrorReason,
77
+ EVENTS_POLL_INTERVAL_MS,
78
+ FilesAccess,
59
79
  SANDBOX_FILE_URI_SCHEME,
80
+ ScreenAccess,
60
81
  SessionLiveEventKind,
82
+ ShellAccess,
61
83
  TURN_OPEN_SESSION_STATES,
62
84
  clientError,
63
85
  configSelectFor,
@@ -72,12 +94,16 @@ export {
72
94
  isDecisionError,
73
95
  isNewerMessageVersion,
74
96
  isRealtimeSubscriptionError,
97
+ isRequirementsUnmetError,
75
98
  isTerminalRealtimeError,
76
99
  isTurnRejectedError,
77
100
  isUserMessageFor,
78
101
  messageVersionOf,
79
102
  parseSandboxFileUri,
103
+ provideDocumentOf,
80
104
  realtimeSubscriptionError,
105
+ requirementsUnmetError,
106
+ resourceIdOf,
81
107
  sessionUpdateOf,
82
108
  textOf,
83
109
  turnEndOf,
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../../../../src/agent-client/index.ts"],
4
- "sourcesContent": ["// `@finalai/agents/client`: the agent platform client SDK.\n// Wire types come from `@finalai/agent-protocol/agent-platform`, re-exported\n// here so consumers need one import.\n\nexport * from '@finalai/agent-protocol/agent-platform';\nexport { AcpAuthMode, type AcpApiIface, type AcpConnectArgsIface } from \"./acp.mjs\";\nexport {\n createTextCollector,\n isUserMessageFor,\n sessionUpdateOf,\n textOf,\n turnEndOf,\n type AcpSessionUpdateIface,\n type TurnEndIface,\n} from \"./acp-frames.mjs\";\nexport type {\n ComputerSetupGuidesApiIface,\n DefinitionRefIface,\n DefinitionsApiIface,\n ProvidersApiIface,\n ScheduleRef,\n SchedulesApiIface,\n} from \"./build.mjs\";\nexport {\n createClient,\n type AgentClientIface,\n type AgentHandleIface,\n type AgentsApiIface,\n type CreateClientOptionsIface,\n type PeopleApiIface,\n type RealtimeApiIface,\n} from \"./client.mjs\";\nexport {\n CollectionEventKind,\n CollectionResyncReason,\n type CollectionEvent,\n type CollectionEventsOptionsIface,\n type CollectionResyncEventIface,\n} from \"./collection-events.mjs\";\nexport {\n ConfigOptionCategory,\n configSelectFor,\n configSelectsOf,\n type ConfigSelectChoiceIface,\n type ConfigSelectIface,\n type SessionConfigOptionIface,\n} from \"./config-options.mjs\";\nexport type { EnumInput, SignalOptionsIface } from \"./context.mjs\";\nexport {\n TURN_OPEN_SESSION_STATES,\n isNewerMessageVersion,\n messageVersionOf,\n type MessageVersionIface,\n} from \"./conversations.mjs\";\nexport type {\n ConversationAgentTurnIface,\n ConversationEvent,\n ConversationEventMetaIface,\n ConversationEventsOptionsIface,\n ConversationHandleIface,\n ConversationsApiIface,\n CreateConversationArgsIface,\n ListMessagesOptionsIface,\n OpenedConversationIface,\n ParticipantCreateInput,\n SandboxFileContentArgsIface,\n SandboxFileContentRequestIface,\n SendMessageOptionsIface,\n SentMessageIface,\n UploadAttachmentArgsIface,\n} from \"./conversations.mjs\";\nexport {\n AgentClientErrorName,\n ClientErrorCode,\n DecisionErrorReason,\n clientError,\n decisionError,\n isClientError,\n isDecisionError,\n isRealtimeSubscriptionError,\n isTerminalRealtimeError,\n isTurnRejectedError,\n realtimeSubscriptionError,\n turnRejectedError,\n type AgentClientError,\n type ClientErrorIface,\n type DecisionErrorIface,\n type RealtimeSubscriptionErrorIface,\n type TurnRejectedErrorIface,\n} from \"./errors.mjs\";\nexport { defaultStreamTiming, type StreamTimingIface } from \"./frame-stream.mjs\";\nexport type { AgentClientAuth, FetchIface, HeadersOption } from \"./http.mjs\";\nexport { SessionLiveEventKind, type SessionLiveEvent } from \"./live-stream.mjs\";\nexport {\n createGatewayRealtimeTransport,\n type GatewayConnect,\n type GatewayConnectionIface,\n type GatewayRealtimeTransportOptionsIface,\n type RealtimeSubscribeOptionsIface,\n type RealtimeTransportFrameIface,\n type RealtimeTransportIface,\n} from \"./realtime.mjs\";\nexport {\n SANDBOX_FILE_URI_SCHEME,\n createSandboxFileUri,\n parseSandboxFileUri,\n type SandboxFileTargetIface,\n} from \"./sandbox-uri.mjs\";\nexport type {\n CreateSessionArgsIface,\n CreatedSessionIface,\n ForkSessionOptionsIface,\n RespondArgs,\n SendOptionsIface,\n SessionHandleIface,\n SessionsApiIface,\n StreamOptionsIface,\n TurnHandleIface,\n TurnResultIface,\n} from \"./sessions.mjs\";\nexport type { ChannelBindingsApiIface } from \"./channels.mjs\";\n"],
5
- "mappings": "AAIA,cAAc;AACd,SAAS,mBAA+D;AACxE;AAAA,EACE;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,OAGK;AASP;AAAA,EACE;AAAA,OAOK;AACP;AAAA,EACE;AAAA,EACA;AAAA,OAIK;AACP;AAAA,EACE;AAAA,EACA;AAAA,EACA;AAAA,OAIK;AAEP;AAAA,EACE;AAAA,EACA;AAAA,EACA;AAAA,OAEK;AAkBP;AAAA,EACE;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,OAMK;AACP,SAAS,2BAAmD;AAE5D,SAAS,4BAAmD;AAC5D;AAAA,EACE;AAAA,OAOK;AACP;AAAA,EACE;AAAA,EACA;AAAA,EACA;AAAA,OAEK;",
4
+ "sourcesContent": ["// `@finalai/agents/client`: the agent platform client SDK.\n// Wire types come from `@finalai/agent-protocol/agent-platform`, re-exported\n// here so consumers need one import.\n\nexport * from '@finalai/agent-protocol/agent-platform';\nexport {\n Capability,\n FilesAccess,\n ScreenAccess,\n ShellAccess,\n type CapabilityAccess,\n} from '@finalai/agent-protocol';\nexport { AcpAuthMode, type AcpApiIface, type AcpConnectArgsIface } from \"./acp.mjs\";\nexport {\n createTextCollector,\n isUserMessageFor,\n sessionUpdateOf,\n textOf,\n turnEndOf,\n type AcpSessionUpdateIface,\n type TurnEndIface,\n} from \"./acp-frames.mjs\";\nexport type { AgentInput, AgentValue, AgentValueCodecIface } from \"./agent-input.mjs\";\nexport type {\n ActorOptionIface,\n ChannelAppsApiIface,\n ChannelBindingsApiIface,\n ChannelSourceIface,\n ChannelSourceOf,\n ChannelTicketsApiIface,\n IdentityLinksApiIface,\n InstallChannelArgsIface,\n ProjectChannelsApiIface,\n PublishChannelArgsIface,\n UpdateChannelBindingArgsIface,\n} from \"./channels.mjs\";\nexport {\n DEFAULT_AGENTS_HOST,\n createClient,\n type AgentClientIface,\n type AgentsApiIface,\n type AppApiIface,\n type CreateClientOptionsIface,\n type DecisionsApiIface,\n type InferenceApiIface,\n type PeopleApiIface,\n type PlatformIdentityApiIface,\n type RealtimeApiIface,\n} from \"./client.mjs\";\nexport {\n CollectionEventKind,\n CollectionResyncReason,\n type CollectionEvent,\n type CollectionEventsOptionsIface,\n type CollectionResyncEventIface,\n} from \"./collection-events.mjs\";\nexport {\n ConfigOptionCategory,\n configSelectFor,\n configSelectsOf,\n type ConfigSelectChoiceIface,\n type ConfigSelectIface,\n type SessionConfigOptionIface,\n} from \"./config-options.mjs\";\nexport type { EnumInput, SignalOptionsIface } from \"./context.mjs\";\nexport type {\n ConversationChannelRoutesApiIface,\n ConversationContextApiIface,\n ConversationContextEntryInputIface,\n ConversationDecisionsApiIface,\n ConversationInputsApiIface,\n ConversationLabelsApiIface,\n ConversationReadGrantsApiIface,\n ConversationResourcesIface,\n ResourceSubscriptionsApiIface,\n SendInputArgsIface,\n} from \"./conversation-resources.mjs\";\nexport {\n TURN_OPEN_SESSION_STATES,\n isNewerMessageVersion,\n messageVersionOf,\n type MessageVersionIface,\n} from \"./conversations.mjs\";\nexport type {\n ConversationAgentTurnIface,\n ConversationEvent,\n ConversationEventMetaIface,\n ConversationEventsOptionsIface,\n ConversationHandleIface,\n ConversationsApiIface,\n CreateConversationArgsIface,\n ListMessagesOptionsIface,\n OpenedConversationIface,\n ParticipantCreateInput,\n ParticipantsApiIface,\n ProjectConversationsApiIface,\n SandboxFileContentArgsIface,\n SandboxFileContentRequestIface,\n SendMessageOptionsIface,\n SentMessageIface,\n UploadAttachmentArgsIface,\n} from \"./conversations.mjs\";\nexport {\n AgentClientErrorName,\n ClientErrorCode,\n DecisionErrorReason,\n clientError,\n decisionError,\n isClientError,\n isDecisionError,\n isRealtimeSubscriptionError,\n isRequirementsUnmetError,\n isTerminalRealtimeError,\n isTurnRejectedError,\n realtimeSubscriptionError,\n requirementsUnmetError,\n turnRejectedError,\n type AgentClientError,\n type ClientErrorIface,\n type DecisionErrorIface,\n type RealtimeSubscriptionErrorIface,\n type RequirementsUnmetErrorIface,\n type TurnRejectedErrorIface,\n} from \"./errors.mjs\";\nexport {\n EVENTS_POLL_INTERVAL_MS,\n type EventsApiIface,\n type EventSubscriptionsApiIface,\n type ListEventsOptionsIface,\n type StreamEventsOptionsIface,\n} from \"./events.mjs\";\nexport { defaultStreamTiming, type StreamTimingIface } from \"./frame-stream.mjs\";\nexport type { AgentClientAuth, FetchIface, HeadersOption } from \"./http.mjs\";\nexport type {\n AcpAdaptersApiIface,\n DefinitionSelectorIface,\n HarnessesApiIface,\n SubscriptionAllowancesApiIface,\n} from \"./harnesses.mjs\";\nexport type { IntegrationsApiIface } from \"./integrations.mjs\";\nexport { SessionLiveEventKind, type SessionLiveEvent } from \"./live-stream.mjs\";\nexport type { LocalComputeIface } from \"./local-host.mjs\";\nexport type { OAuthClientsApiIface, SignInReturnOriginsApiIface } from \"./oauth-clients.mjs\";\nexport type { ProjectClientIface } from \"./project.mjs\";\nexport type { AgentSelectorIface, ProjectAgentsApiIface } from \"./project-agents.mjs\";\nexport type {\n ProjectApiKeysApiIface,\n ProjectMembersApiIface,\n ProjectResourceApiIface,\n ProjectsApiIface,\n} from \"./projects.mjs\";\nexport type {\n ProjectPublisherApiIface,\n PublicNamesApiIface,\n PublisherHandleIface,\n PublishersApiIface,\n} from \"./publishers.mjs\";\nexport {\n provideDocumentOf,\n resourceIdOf,\n type ProvideIface,\n type ProvidePatchIface,\n type ResourceRef,\n type ResourceRefIface,\n} from \"./provide.mjs\";\nexport {\n createGatewayRealtimeTransport,\n type GatewayConnect,\n type GatewayConnectionIface,\n type GatewayRealtimeTransportOptionsIface,\n type RealtimeSubscribeOptionsIface,\n type RealtimeTransportFrameIface,\n type RealtimeTransportIface,\n} from \"./realtime.mjs\";\nexport {\n SANDBOX_FILE_URI_SCHEME,\n createSandboxFileUri,\n parseSandboxFileUri,\n type SandboxFileTargetIface,\n} from \"./sandbox-uri.mjs\";\nexport type { SandboxProvidersApiIface } from \"./sandbox-providers.mjs\";\nexport type {\n CreateSandboxOptionsIface,\n SandboxEnvironmentValueIface,\n SandboxHandleIface,\n SandboxOwnerIface,\n SandboxSetupRefIface,\n SandboxSetupsApiIface,\n SandboxesApiIface,\n} from \"./sandboxes.mjs\";\nexport type { ProjectSchedulesApiIface } from \"./schedules.mjs\";\nexport type {\n CreateSessionArgsIface,\n CreatedSessionIface,\n ForkSessionOptionsIface,\n ProjectSessionsApiIface,\n RespondArgs,\n SendOptionsIface,\n SessionHandleIface,\n SessionsApiIface,\n StreamOptionsIface,\n TurnHandleIface,\n TurnResultIface,\n} from \"./sessions.mjs\";\n"],
5
+ "mappings": "AAIA,cAAc;AACd;AAAA,EACE;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,OAEK;AACP,SAAS,mBAA+D;AACxE;AAAA,EACE;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,OAGK;AAeP;AAAA,EACE;AAAA,EACA;AAAA,OAUK;AACP;AAAA,EACE;AAAA,EACA;AAAA,OAIK;AACP;AAAA,EACE;AAAA,EACA;AAAA,EACA;AAAA,OAIK;AAcP;AAAA,EACE;AAAA,EACA;AAAA,EACA;AAAA,OAEK;AAoBP;AAAA,EACE;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,OAOK;AACP;AAAA,EACE;AAAA,OAKK;AACP,SAAS,2BAAmD;AAS5D,SAAS,4BAAmD;AAiB5D;AAAA,EACE;AAAA,EACA;AAAA,OAKK;AACP;AAAA,EACE;AAAA,OAOK;AACP;AAAA,EACE;AAAA,EACA;AAAA,EACA;AAAA,OAEK;",
6
6
  "names": []
7
7
  }
@@ -0,0 +1,40 @@
1
+ import { type CompleteSignInResponseIface, type CreateIntegrationRequestIface, type IntegrationIface, type IntegrationListIface, type StartSignInResponseIface } from '@finalai/agent-protocol/agent-platform';
2
+ import { type ClientContextIface, type SignalOptionsIface } from "./context.mjs";
3
+ export interface IntegrationsApiIface {
4
+ /** Names are unique in a project. Returns the integration; pass it in `provide.integrations`. */
5
+ create: (args: CreateIntegrationRequestIface & SignalOptionsIface) => Promise<IntegrationIface>;
6
+ get: (selector: ({
7
+ name: string;
8
+ } | {
9
+ id: string;
10
+ }) & SignalOptionsIface) => Promise<IntegrationIface>;
11
+ list: (options?: SignalOptionsIface & {
12
+ cursor?: string;
13
+ limit?: number;
14
+ }) => Promise<IntegrationListIface>;
15
+ delete: (args: {
16
+ id: string;
17
+ } & SignalOptionsIface) => Promise<void>;
18
+ /**
19
+ * Starts the caller's own sign-in: an authorization URL to open. Pass the
20
+ * sign-in decision's id to resolve it when the sign-in completes.
21
+ */
22
+ signIn: (args: {
23
+ id: string;
24
+ returnUrl?: string;
25
+ decisionId?: string;
26
+ } & SignalOptionsIface) => Promise<StartSignInResponseIface>;
27
+ /** Activates a sign-in with the `state` and `code` the provider redirected with. */
28
+ completeSignIn: (args: {
29
+ state: string;
30
+ code: string;
31
+ } & SignalOptionsIface) => Promise<CompleteSignInResponseIface>;
32
+ /** Forgets the caller's own sign-in. */
33
+ signOut: (args: {
34
+ id: string;
35
+ } & SignalOptionsIface) => Promise<void>;
36
+ }
37
+ export declare const createIntegrationsApi: (args: {
38
+ context: ClientContextIface;
39
+ projectId: string;
40
+ }) => IntegrationsApiIface;
@@ -0,0 +1,92 @@
1
+ import {
2
+ completeSignInRequestSchema,
3
+ completeSignInResponseSchema,
4
+ createIntegrationRequestSchema,
5
+ integrationListSchema,
6
+ integrationSchema,
7
+ okResponseSchema,
8
+ startSignInRequestSchema,
9
+ startSignInResponseSchema
10
+ } from "@finalai/agent-protocol/agent-platform";
11
+ import { encodePath } from "./context.mjs";
12
+ import { clientError, ClientErrorCode } from "./errors.mjs";
13
+ import { HttpMethod } from "./http.mjs";
14
+ const projectPath = (projectId, suffix) => `/v1/projects/${encodePath(projectId)}${suffix}`;
15
+ const createIntegrationsApi = (args) => {
16
+ const { http } = args.context;
17
+ const integrationPath = (id, suffix = "") => projectPath(args.projectId, `/integrations/${encodePath(id)}${suffix}`);
18
+ return {
19
+ create: ({ signal, ...value }) => http.request({
20
+ method: HttpMethod.Post,
21
+ path: projectPath(args.projectId, "/integrations"),
22
+ body: { schema: createIntegrationRequestSchema, value },
23
+ response: integrationSchema,
24
+ signal
25
+ }),
26
+ get: async ({ signal, ...selector }) => {
27
+ if ("id" in selector)
28
+ return http.request({
29
+ method: HttpMethod.Get,
30
+ path: integrationPath(selector.id),
31
+ response: integrationSchema,
32
+ signal
33
+ });
34
+ const { integrations } = await http.request({
35
+ method: HttpMethod.Get,
36
+ path: projectPath(args.projectId, "/integrations"),
37
+ query: { name: selector.name },
38
+ response: integrationListSchema,
39
+ signal
40
+ });
41
+ const found = integrations.find((integration) => integration.name === selector.name);
42
+ if (found == null)
43
+ throw clientError({
44
+ message: `No integration named ${selector.name} in this project`,
45
+ status: 404,
46
+ code: ClientErrorCode.NotFound
47
+ });
48
+ return found;
49
+ },
50
+ list: (options) => http.request({
51
+ method: HttpMethod.Get,
52
+ path: projectPath(args.projectId, "/integrations"),
53
+ query: { cursor: options?.cursor, limit: options?.limit },
54
+ response: integrationListSchema,
55
+ signal: options?.signal
56
+ }),
57
+ delete: async ({ id, signal }) => {
58
+ await http.request({
59
+ method: HttpMethod.Delete,
60
+ path: integrationPath(id),
61
+ response: okResponseSchema,
62
+ signal
63
+ });
64
+ },
65
+ signIn: ({ id, signal, ...value }) => http.request({
66
+ method: HttpMethod.Post,
67
+ path: integrationPath(id, "/sign-in"),
68
+ body: { schema: startSignInRequestSchema, value },
69
+ response: startSignInResponseSchema,
70
+ signal
71
+ }),
72
+ completeSignIn: ({ signal, ...value }) => http.request({
73
+ method: HttpMethod.Post,
74
+ path: "/v1/sign-ins/complete",
75
+ body: { schema: completeSignInRequestSchema, value },
76
+ response: completeSignInResponseSchema,
77
+ signal
78
+ }),
79
+ signOut: async ({ id, signal }) => {
80
+ await http.request({
81
+ method: HttpMethod.Delete,
82
+ path: integrationPath(id, "/sign-in"),
83
+ response: okResponseSchema,
84
+ signal
85
+ });
86
+ }
87
+ };
88
+ };
89
+ export {
90
+ createIntegrationsApi
91
+ };
92
+ //# sourceMappingURL=integrations.mjs.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../../../../src/agent-client/integrations.ts"],
4
+ "sourcesContent": ["import {\n completeSignInRequestSchema,\n completeSignInResponseSchema,\n createIntegrationRequestSchema,\n integrationListSchema,\n integrationSchema,\n okResponseSchema,\n startSignInRequestSchema,\n startSignInResponseSchema,\n type CompleteSignInResponseIface,\n type CreateIntegrationRequestIface,\n type IntegrationIface,\n type IntegrationListIface,\n type StartSignInResponseIface,\n} from '@finalai/agent-protocol/agent-platform';\nimport { encodePath, type ClientContextIface, type SignalOptionsIface } from \"./context.mjs\";\nimport { clientError, ClientErrorCode } from \"./errors.mjs\";\nimport { HttpMethod } from \"./http.mjs\";\n\n// Integrations (sources of tools: MCP servers, Final's gateway among them),\n// scoped to one project.\n\nexport interface IntegrationsApiIface {\n /** Names are unique in a project. Returns the integration; pass it in `provide.integrations`. */\n create: (args: CreateIntegrationRequestIface & SignalOptionsIface) => Promise<IntegrationIface>;\n get: (\n selector: ({ name: string } | { id: string }) & SignalOptionsIface,\n ) => Promise<IntegrationIface>;\n list: (\n options?: SignalOptionsIface & { cursor?: string; limit?: number },\n ) => Promise<IntegrationListIface>;\n delete: (args: { id: string } & SignalOptionsIface) => Promise<void>;\n /**\n * Starts the caller's own sign-in: an authorization URL to open. Pass the\n * sign-in decision's id to resolve it when the sign-in completes.\n */\n signIn: (\n args: { id: string; returnUrl?: string; decisionId?: string } & SignalOptionsIface,\n ) => Promise<StartSignInResponseIface>;\n /** Activates a sign-in with the `state` and `code` the provider redirected with. */\n completeSignIn: (\n args: { state: string; code: string } & SignalOptionsIface,\n ) => Promise<CompleteSignInResponseIface>;\n /** Forgets the caller's own sign-in. */\n signOut: (args: { id: string } & SignalOptionsIface) => Promise<void>;\n}\n\nconst projectPath = (projectId: string, suffix: string): string =>\n `/v1/projects/${encodePath(projectId)}${suffix}`;\n\nexport const createIntegrationsApi = (args: {\n context: ClientContextIface;\n projectId: string;\n}): IntegrationsApiIface => {\n const { http } = args.context;\n const integrationPath = (id: string, suffix = '') =>\n projectPath(args.projectId, `/integrations/${encodePath(id)}${suffix}`);\n return {\n create: ({ signal, ...value }) =>\n http.request({\n method: HttpMethod.Post,\n path: projectPath(args.projectId, '/integrations'),\n body: { schema: createIntegrationRequestSchema, value },\n response: integrationSchema,\n signal,\n }),\n get: async ({ signal, ...selector }) => {\n if ('id' in selector)\n return http.request({\n method: HttpMethod.Get,\n path: integrationPath(selector.id),\n response: integrationSchema,\n signal,\n });\n const { integrations } = await http.request({\n method: HttpMethod.Get,\n path: projectPath(args.projectId, '/integrations'),\n query: { name: selector.name },\n response: integrationListSchema,\n signal,\n });\n const found = integrations.find((integration) => integration.name === selector.name);\n if (found == null)\n throw clientError({\n message: `No integration named ${selector.name} in this project`,\n status: 404,\n code: ClientErrorCode.NotFound,\n });\n return found;\n },\n list: (options) =>\n http.request({\n method: HttpMethod.Get,\n path: projectPath(args.projectId, '/integrations'),\n query: { cursor: options?.cursor, limit: options?.limit },\n response: integrationListSchema,\n signal: options?.signal,\n }),\n delete: async ({ id, signal }) => {\n await http.request({\n method: HttpMethod.Delete,\n path: integrationPath(id),\n response: okResponseSchema,\n signal,\n });\n },\n signIn: ({ id, signal, ...value }) =>\n http.request({\n method: HttpMethod.Post,\n path: integrationPath(id, '/sign-in'),\n body: { schema: startSignInRequestSchema, value },\n response: startSignInResponseSchema,\n signal,\n }),\n completeSignIn: ({ signal, ...value }) =>\n http.request({\n method: HttpMethod.Post,\n path: '/v1/sign-ins/complete',\n body: { schema: completeSignInRequestSchema, value },\n response: completeSignInResponseSchema,\n signal,\n }),\n signOut: async ({ id, signal }) => {\n await http.request({\n method: HttpMethod.Delete,\n path: integrationPath(id, '/sign-in'),\n response: okResponseSchema,\n signal,\n });\n },\n };\n};\n"],
5
+ "mappings": "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",
6
+ "names": []
7
+ }