@finalai/agents 0.1.2 → 0.1.4

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/HOSTING.md ADDED
@@ -0,0 +1,234 @@
1
+ # Portable agent definitions and hosted bindings
2
+
3
+ An agent declares behavior and logical resources. Hosting supplies endpoints,
4
+ resource identifiers, and credential references. The same compiled source can
5
+ resolve against dev and production configuration without source edits.
6
+
7
+ ## Selecting a deployment
8
+
9
+ ```sh
10
+ export FINAL_API_HOST=https://agent-session.primary-dev.final.ai/api
11
+ export FINAL_API_KEY=<dev-organization-key>
12
+ pnpm exec final-agents build ./agent
13
+ pnpm exec final-agents publish ./agent --agent my-agent
14
+ ```
15
+
16
+ Choose production by changing the host and organization key. `--host` overrides
17
+ `FINAL_API_HOST`; without either, the existing production default remains. Build
18
+ compiles locally and optionally checks installed-harness compatibility. Publish
19
+ compiles again and sends source/release requests to the selected deployment.
20
+ Neither rewrites authored URLs. A GitHub-backed definition uses remote source;
21
+ push edits before explicitly publishing a ref. Caller API keys never become agent
22
+ credentials merely because they were used to publish.
23
+
24
+ ## Hosted connections
25
+
26
+ ```ts
27
+ import { defineHostedConnection } from '@finalai/agents';
28
+
29
+ export default defineHostedConnection({
30
+ binding: 'issue-tracker',
31
+ tools: { allow: ['read_issue'], deny: ['delete_issue'] },
32
+ });
33
+ ```
34
+
35
+ `issue-tracker` is an example configuration name, not a built-in service.
36
+ Hosting configures it with non-secret JSON:
37
+
38
+ ```json
39
+ {
40
+ "url": "https://issues.dev.example/mcp",
41
+ "auth": { "secretKey": "ISSUE_TRACKER_TOKEN", "headerName": null },
42
+ "headers": { "X-Workspace": "development" }
43
+ }
44
+ ```
45
+
46
+ Production supplies another value under the same name. The helper uses an ordinary
47
+ `defineDynamic` connection at `session.started`, then the usual HTTP MCP lowering,
48
+ validation, permissions, and credential broker. Hosting supplies transport settings,
49
+ not tool policies. URL, authentication references, transport headers belong to hosting; the hosted helper does
50
+ not accept authored overrides for these fields. Referenced secrets still need the agent's secret allowlist and normal
51
+ authorization. Actual tokens must not be returned in configuration headers.
52
+
53
+ Final uses the same generic helper:
54
+
55
+ ```ts
56
+ import { defineFinalConnection } from '@finalai/agents';
57
+
58
+ export default defineFinalConnection({
59
+ tools: { deny: ['create_agent_session'] },
60
+ });
61
+ ```
62
+
63
+ This resolves the `final` binding. Hosting supplies its URL and
64
+ `auth: { kind: 'final-session' }`, just as it supplies authentication for any
65
+ other hosted connection. `binding`
66
+ selects another name. Existing explicit `url` calls remain static and compatible;
67
+ they always point at that URL. There is no Final-specific compiler rewrite.
68
+
69
+ ## Connection tool policy
70
+
71
+ `tools.allow`, `tools.deny` and `tools.approval` keys are tool names or `*`
72
+ patterns, so a definition can scope a connection whose tool list it does not know:
73
+
74
+ ```ts
75
+ export default defineFinalConnection({
76
+ tools: {
77
+ allow: ['github.*', 'list_goals'],
78
+ deny: ['github.delete_repo'],
79
+ approval: { 'github.delete_*': always() },
80
+ },
81
+ });
82
+ ```
83
+
84
+ `*` matches any run of characters; everything else matches literally. `deny` wins
85
+ over `allow`. The most specific key governs a tool: an exact name, else the matching
86
+ pattern with the most literal characters, with ties resolved toward `ask`. Hosts
87
+ enforce this through `isToolExposed` and `toolApprovalOf` from
88
+ `@finalai/agent-provider`, and look up a tool's input-approval predicate under the
89
+ key `resolveToolApprovalKey` returns.
90
+
91
+ ## Loaded and searchable tools
92
+
93
+ A connection that can expose many tools, such as Final's with every service the
94
+ person has connected, can name the ones the harness should list up front:
95
+
96
+ ```ts
97
+ export default defineFinalConnection({
98
+ tools: { load: ['list_goals', 'get_goal', 'draft_goal', 'notify_user'] },
99
+ });
100
+ ```
101
+
102
+ Without `load`, the harness lists every exposed tool, as before. With it, the host
103
+ lists only the loaded tools and must keep every other exposed tool reachable: it
104
+ serves a search over the connection's remaining exposed tools (name, description,
105
+ input schema) and a call that runs a found tool by its real name, with the same
106
+ exposure and approval checks as a direct call. A host may instead add a found tool
107
+ to the list and send `notifications/tools/list_changed`; harnesses that ignore that
108
+ notification still need the call path. `load: []` leaves every tool to search.
109
+ Entries are tool names or `*` patterns. `isToolLoaded` from `@finalai/agent-provider`
110
+ applies the rule after exposure.
111
+
112
+ ## Selecting tools by annotation
113
+
114
+ `tools.allow` and `tools.deny` entries can be MCP annotation selectors as well as
115
+ tool names, so a definition can scope tools it cannot name in advance:
116
+
117
+ ```ts
118
+ export default defineFinalConnection({
119
+ tools: {
120
+ allow: ['list_goals', 'draft_goal', { readOnlyHint: true }],
121
+ deny: [{ destructiveHint: true, readOnlyHint: false }],
122
+ },
123
+ });
124
+ ```
125
+
126
+ A selector matches when every hint it sets equals the tool's hint, reading hints the
127
+ tool omits as the MCP spec's defaults (not read-only, destructive, not idempotent,
128
+ open world). The annotations come from the connection's server, so select on them
129
+ only for servers trusted to classify their own tools.
130
+
131
+ Selectors lower to `allowAnnotations` (each with the connection default approval and
132
+ input predicate) and `denyAnnotations`. A host exposes a tool when nothing in `deny`
133
+ or `denyAnnotations` matches it and either an `approvals` key (name or pattern)
134
+ governs it, `approvals` is null, or `toolAnnotationRuleFor` finds a rule; a tool an
135
+ `approvals` key governs keeps that approval, otherwise it runs under the rule's. `tools.approval` overrides apply only to
136
+ named tools.
137
+
138
+ ## Resources and provider packages
139
+
140
+ `HostedBindingsIface` is the shared `@finalai/agent-provider` contract. Hosting
141
+ implements `get(name)` to return scoped JSON or null. `requireHostedBinding` rejects
142
+ missing hosting, absent names, and invalid JSON without an environment fallback.
143
+ Names are configuration keys, not global permissions or inferred URLs.
144
+
145
+ Tools, hooks, dynamic resolvers, sandbox selectors, and harness/sandbox/channel
146
+ provider contexts expose an optional `bindings` reader. A third-party resolver can
147
+ use the same reader for model or resource configuration:
148
+
149
+ ```ts
150
+ import { defineDynamic, requireHostedBinding } from '@finalai/agents';
151
+
152
+ export const model = defineDynamic({
153
+ requiredBindings: [{ name: 'primary-model', schema: { type: 'string', minLength: 1 } }],
154
+ description: 'The deployment model',
155
+ preview: 'Resolved from primary-model',
156
+ events: {
157
+ 'session.started': async (_event, ctx) =>
158
+ requireHostedBinding({ bindings: ctx.bindings, name: 'primary-model' }),
159
+ },
160
+ });
161
+ ```
162
+
163
+ Use that value in a harness configuration supporting dynamic models. A resource
164
+ binding can similarly contain a repository, guide slug, device ID, or non-secret
165
+ SDK base URL; the consumer validates the resource-specific schema. Literal IDs,
166
+ custom URLs, and external credential choices are never silently rewritten.
167
+
168
+ Installed providers already accept factory configuration injected by hosting.
169
+ Keep supplying deployment service URLs there. Computer/WebSocket clients retain
170
+ explicit configuration; a hosted provider can obtain it through this shared reader.
171
+ Package versions stay pinned. Packages do not read a global DEV/PROD flag.
172
+
173
+ ## Declared requirements and user experience
174
+
175
+ `defineHostedConnection` declares its binding name and JSON configuration schema
176
+ in the compiled dynamic slot automatically. Other dynamic consumers declare
177
+ `requiredBindings` as in the model example. Hosts can inspect these requirements
178
+ without running authored resolvers. Repeated names must satisfy every declared
179
+ schema; names are looked up once per preflight.
180
+
181
+ Before accepting a release, hosting calls
182
+ `validateHostedBindings({ manifest, bindings })` with a reader scoped to the
183
+ selected deployment, organization, and agent. Hosts compiling source can instead
184
+ pass `hostedBindings` to `compile`; failed preflight returns error diagnostics and
185
+ no manifest or bundle. An offline build can still compile and expose requirements
186
+ without accessing deployment configuration. The CLI does not yet fetch binding
187
+ configuration itself: server-side publication must enable this preflight.
188
+
189
+ When dev is selected, lookups use only dev configuration. A missing dev binding
190
+ fails even if production has the same name; never retry against production or
191
+ substitute a production default. Changing the CLI host selects where to publish;
192
+ the runtime reader comes from that deployment, not from the author's environment.
193
+ Explicit authored URLs retain their literal destination.
194
+
195
+ Authors keep one source definition. Operators configure its named connections
196
+ and resources once in each deployment. End users start the agent as usual; an
197
+ unconfigured required resource produces a configuration failure instead of a
198
+ session silently missing tools. Dynamic handlers validate declared requirements
199
+ before running. Shared manifest resolution rejects null results for required slots,
200
+ even if a host catches a resolver exception and returns null. Hosts must propagate
201
+ that failure to startup. Session-started values stay pinned across turns and resume.
202
+
203
+ This PR adds no configuration UI. A host can use the compiled requirements to show
204
+ which names need configuration and return an actionable deployment-specific error.
205
+
206
+ ## Host integration
207
+
208
+ These packages implement contracts and authored runtime behavior, not a deployment
209
+ configuration store or RPC service. Existing hosting needs to:
210
+
211
+ 1. Resolve names within the authorized deployment, organization, and agent; never
212
+ expose the process environment or an unrestricted cross-tenant registry.
213
+ 2. Inject `bindings` into lifecycle resolution and the tool/hook/selector/provider
214
+ contexts using it. Dynamic approval evaluation and tool reconstruction after
215
+ isolate eviction need the same reader. Readers and tokens are not persisted in
216
+ boundary snapshots.
217
+ 3. Configure `final` with that deployment's approved MCP endpoint. The ordinary
218
+ broker continues restricting `final-session` grants to that endpoint.
219
+ 4. Return non-secret configuration and credential references, with normal provider,
220
+ secret, resource, and organization authorization.
221
+ 5. Run the release preflight above and validate again before starting a new
222
+ session. Treat failed required-binding resolution as a startup/configuration error, not
223
+ an omitted connection or a fallback to production. Preserve existing runtime
224
+ revisions when publication fails.
225
+ 6. Retain session-started resolved values across turns/resume; resolve new sessions
226
+ against their own deployment.
227
+
228
+ Optional readers preserve source compatibility with existing hosts. Definitions
229
+ requesting bindings fail clearly if hosting does not provide them. Installing these
230
+ packages alone does not change Final's deployed service wiring or provision secrets.
231
+
232
+ New compiles emit manifest version 3, so older hosts reject them rather than
233
+ stripping required-binding metadata. Updated readers still accept persisted
234
+ version 2 revisions. Upgrade hosting before publishing newly compiled agents.
package/README.md CHANGED
@@ -28,3 +28,10 @@ For custom provider implementations, import contracts from `@finalai/agent-provi
28
28
  sandbox adapters from `@finalai/agent-provider/sandbox`, and conformance tools from
29
29
  `@finalai/agent-provider/conformance`. Run a harness check with
30
30
  `final-agents conformance ./harness.ts`.
31
+
32
+ Use `FINAL_API_HOST` with `FINAL_API_KEY` to select a deployment once for build and
33
+ publish; an explicit `--host` overrides it. Use `defineHostedConnection` for a named
34
+ connection resolved by hosting at session start. `defineFinalConnection()` uses
35
+ the same path with the `final` binding. Explicit URL declarations remain static.
36
+ See the repository's [hosting guide](HOSTING.md) for provider contexts,
37
+ resource lookup, and the required hosting integration.
@@ -19,7 +19,7 @@ const USAGE = [
19
19
  " conformance <module> run the harness conformance kit against a harness the module exports",
20
20
  "",
21
21
  "options:",
22
- " --host <url> agent platform API (default " + DEFAULT_AGENTS_HOST + ")",
22
+ " --host <url> agent platform API (overrides FINAL_API_HOST; default " + DEFAULT_AGENTS_HOST + ")",
23
23
  " --agent <slug> publish: the agent definition (slug or id)",
24
24
  " --ref <ref> publish: the ref to publish (GitHub-backed agents)",
25
25
  " --message <text> publish: commit message",
@@ -31,9 +31,13 @@ const USAGE = [
31
31
  " --json conformance: print the report as JSON",
32
32
  "",
33
33
  "FINAL_API_KEY authenticates (an organization API key). build checks compatibility only with it.",
34
+ "FINAL_API_HOST selects the deployment for build and publish; it does not rewrite authored URLs.",
34
35
  `dev reads route secrets from AGENT_LOCAL_SECRETS_JSON ({"name": "value"}), limited to the manifest's secrets.`
35
36
  ].join("\n");
36
- const envSchema = z.object({ FINAL_API_KEY: z.string().min(1).optional() });
37
+ const envSchema = z.object({
38
+ FINAL_API_KEY: z.string().min(1).optional(),
39
+ FINAL_API_HOST: z.string().url().optional()
40
+ });
37
41
  const optionsConfig = {
38
42
  host: { type: "string" },
39
43
  agent: { type: "string" },
@@ -74,10 +78,16 @@ const runAgentsCommand = async (deps) => {
74
78
  return 2;
75
79
  }
76
80
  const env = envSchema.safeParse(deps.env);
81
+ if (!env.success) {
82
+ output.stderr(
83
+ "error: FINAL_API_KEY must be nonempty and FINAL_API_HOST must be an absolute URL"
84
+ );
85
+ return 2;
86
+ }
77
87
  const apiKey = env.success ? env.data.FINAL_API_KEY ?? null : null;
78
88
  const dir = resolve(deps.cwd, dirArg ?? ".");
79
89
  const client = (key) => createClient({
80
- host: values.host ?? DEFAULT_AGENTS_HOST,
90
+ host: values.host ?? env.data.FINAL_API_HOST ?? DEFAULT_AGENTS_HOST,
81
91
  auth: { apiKey: key },
82
92
  fetch: deps.fetch
83
93
  });
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../../../../src/cli/cli.ts"],
4
- "sourcesContent": ["import { resolve } from 'node:path';\nimport { parseArgs } from 'node:util';\nimport * as z from 'zod';\nimport { createClient, type AgentClientIface } from \"../agent-client/client.mjs\";\nimport type { FetchIface } from \"../agent-client/http.mjs\";\nimport { runBuild } from \"./build.mjs\";\nimport { runConformance, type ImportModule } from \"./conformance.mjs\";\nimport { DEFAULT_DEV_PORT, runDev } from \"./dev.mjs\";\nimport { gitListFiles, type ListFiles } from \"./files.mjs\";\nimport type { OutputIface } from \"./output.mjs\";\nimport { runPublish } from \"./publish.mjs\";\n\n// Agent CLI commands:\n// `build` and `publish`, plus `dev` and `conformance`. Shipped as the `final-agents` bin until a general\n// `final` CLI exists; `runAgentsCommand` is what `final agents` would mount.\n\n// console-server's proxy to the agent platform API.\n// The session service accepts organization API keys; console-server's proxy is\n// for signed-in users only.\nexport const DEFAULT_AGENTS_HOST = 'https://agent-session.final.ai/api';\n\nconst DEFAULT_COMMIT_MESSAGE = 'Publish with final agents publish';\n\nconst USAGE = [\n 'usage: final-agents <command> [options]',\n '',\n 'commands:',\n ' build [dir] compile the agent directory and report on its harness',\n ' dev [dir] serve its channel routes at http://localhost:<port>/<channel><path>',\n ' publish [dir] --agent <slug> commit the checkout to the agent and publish it',\n ' conformance <module> run the harness conformance kit against a harness the module exports',\n '',\n 'options:',\n ' --host <url> agent platform API (default ' + DEFAULT_AGENTS_HOST + ')',\n ' --agent <slug> publish: the agent definition (slug or id)',\n ' --ref <ref> publish: the ref to publish (GitHub-backed agents)',\n ' --message <text> publish: commit message',\n ' --note <text> publish: revision note',\n ` --port <port> dev: port to listen on (default ${DEFAULT_DEV_PORT})`,\n ' --export <name> conformance: the export to test (default \"default\"): a HarnessIface or { harness, dial }',\n ' --profile <name> conformance: final (default) or plain-acp-v2',\n ' --timeout <ms> conformance: per-case timeout',\n ' --json conformance: print the report as JSON',\n '',\n 'FINAL_API_KEY authenticates (an organization API key). build checks compatibility only with it.',\n 'dev reads route secrets from AGENT_LOCAL_SECRETS_JSON ({\"name\": \"value\"}), limited to the manifest\\'s secrets.',\n].join('\\n');\n\nconst envSchema = z.object({ FINAL_API_KEY: z.string().min(1).optional() });\n\nexport interface AgentsCliDepsIface {\n argv: string[];\n env: Record<string, string | undefined>;\n cwd: string;\n output: OutputIface;\n // Seams: API requests and the checkout's file listing.\n fetch?: FetchIface;\n listFiles?: ListFiles;\n // Ends long-running commands (dev); main.ts aborts it on SIGINT and SIGTERM.\n signal?: AbortSignal;\n // Seam: loads the conformance module (dynamic import by file URL).\n importModule?: ImportModule;\n}\n\nconst optionsConfig = {\n host: { type: 'string' },\n agent: { type: 'string' },\n ref: { type: 'string' },\n message: { type: 'string' },\n note: { type: 'string' },\n port: { type: 'string' },\n export: { type: 'string' },\n profile: { type: 'string' },\n timeout: { type: 'string' },\n json: { type: 'boolean' },\n help: { type: 'boolean', short: 'h' },\n} as const;\n\nconst parseCommandLine = (argv: string[]) =>\n parseArgs({ args: argv, options: optionsConfig, allowPositionals: true });\n\ntype ParsedResult =\n | { ok: true; parsed: ReturnType<typeof parseCommandLine> }\n | { ok: false; message: string };\n\nconst parse = (argv: string[]): ParsedResult => {\n try {\n return { ok: true, parsed: parseCommandLine(argv) };\n } catch (cause) {\n return { ok: false, message: cause instanceof Error ? cause.message : String(cause) };\n }\n};\n\nexport const runAgentsCommand = async (deps: AgentsCliDepsIface): Promise<number> => {\n const { output } = deps;\n const parsedArgs = parse(deps.argv);\n if (!parsedArgs.ok) {\n output.stderr(`error: ${parsedArgs.message}`);\n output.stderr(USAGE);\n return 2;\n }\n const { values, positionals } = parsedArgs.parsed;\n const [command, dirArg, ...extra] = positionals;\n if (values.help === true || command == null || command === 'help') {\n (command == null && values.help !== true ? output.stderr : output.stdout)(USAGE);\n return command == null && values.help !== true ? 2 : 0;\n }\n if (extra.length > 0) {\n output.stderr(`error: unexpected arguments: ${extra.join(' ')}`);\n return 2;\n }\n const env = envSchema.safeParse(deps.env);\n const apiKey = env.success ? (env.data.FINAL_API_KEY ?? null) : null;\n const dir = resolve(deps.cwd, dirArg ?? '.');\n const client = (key: string): AgentClientIface =>\n createClient({\n host: values.host ?? DEFAULT_AGENTS_HOST,\n auth: { apiKey: key },\n fetch: deps.fetch,\n });\n\n if (command === 'build') {\n return runBuild({ dir, client: apiKey == null ? null : client(apiKey), output });\n }\n if (command === 'dev') {\n const port = values.port == null ? DEFAULT_DEV_PORT : Number(values.port);\n if (!Number.isInteger(port) || port < 0 || port > 65_535) {\n output.stderr(`error: --port must be a port number`);\n return 2;\n }\n return runDev({\n dir,\n port,\n env: deps.env,\n output,\n signal: deps.signal ?? new AbortController().signal,\n });\n }\n if (command === 'publish') {\n if (values.agent == null) {\n output.stderr('error: publish needs --agent <slug>');\n return 2;\n }\n if (apiKey == null) {\n output.stderr('error: set FINAL_API_KEY to an organization API key');\n return 2;\n }\n return runPublish({\n dir,\n agent: values.agent,\n ref: values.ref ?? null,\n message: values.message ?? DEFAULT_COMMIT_MESSAGE,\n note: values.note ?? null,\n client: client(apiKey),\n listFiles: deps.listFiles ?? gitListFiles,\n output,\n });\n }\n if (command === 'conformance') {\n if (dirArg == null) {\n output.stderr('error: conformance needs <module>');\n return 2;\n }\n const timeoutMs = values.timeout == null ? null : Number(values.timeout);\n if (timeoutMs != null && (!Number.isInteger(timeoutMs) || timeoutMs <= 0)) {\n output.stderr('error: --timeout must be a positive number of milliseconds');\n return 2;\n }\n return runConformance({\n module: dirArg,\n exportName: values.export ?? 'default',\n profile: values.profile ?? 'final',\n timeoutMs,\n json: values.json === true,\n cwd: deps.cwd,\n output,\n importModule: deps.importModule,\n signal: deps.signal,\n });\n }\n output.stderr(`error: unknown command ${command}`);\n output.stderr(USAGE);\n return 2;\n};\n"],
5
- "mappings": "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",
4
+ "sourcesContent": ["import { resolve } from 'node:path';\nimport { parseArgs } from 'node:util';\nimport * as z from 'zod';\nimport { createClient, type AgentClientIface } from \"../agent-client/client.mjs\";\nimport type { FetchIface } from \"../agent-client/http.mjs\";\nimport { runBuild } from \"./build.mjs\";\nimport { runConformance, type ImportModule } from \"./conformance.mjs\";\nimport { DEFAULT_DEV_PORT, runDev } from \"./dev.mjs\";\nimport { gitListFiles, type ListFiles } from \"./files.mjs\";\nimport type { OutputIface } from \"./output.mjs\";\nimport { runPublish } from \"./publish.mjs\";\n\n// Agent CLI commands:\n// `build` and `publish`, plus `dev` and `conformance`. Shipped as the `final-agents` bin until a general\n// `final` CLI exists; `runAgentsCommand` is what `final agents` would mount.\n\n// console-server's proxy to the agent platform API.\n// The session service accepts organization API keys; console-server's proxy is\n// for signed-in users only.\nexport const DEFAULT_AGENTS_HOST = 'https://agent-session.final.ai/api';\n\nconst DEFAULT_COMMIT_MESSAGE = 'Publish with final agents publish';\n\nconst USAGE = [\n 'usage: final-agents <command> [options]',\n '',\n 'commands:',\n ' build [dir] compile the agent directory and report on its harness',\n ' dev [dir] serve its channel routes at http://localhost:<port>/<channel><path>',\n ' publish [dir] --agent <slug> commit the checkout to the agent and publish it',\n ' conformance <module> run the harness conformance kit against a harness the module exports',\n '',\n 'options:',\n ' --host <url> agent platform API (overrides FINAL_API_HOST; default ' +\n DEFAULT_AGENTS_HOST +\n ')',\n ' --agent <slug> publish: the agent definition (slug or id)',\n ' --ref <ref> publish: the ref to publish (GitHub-backed agents)',\n ' --message <text> publish: commit message',\n ' --note <text> publish: revision note',\n ` --port <port> dev: port to listen on (default ${DEFAULT_DEV_PORT})`,\n ' --export <name> conformance: the export to test (default \"default\"): a HarnessIface or { harness, dial }',\n ' --profile <name> conformance: final (default) or plain-acp-v2',\n ' --timeout <ms> conformance: per-case timeout',\n ' --json conformance: print the report as JSON',\n '',\n 'FINAL_API_KEY authenticates (an organization API key). build checks compatibility only with it.',\n 'FINAL_API_HOST selects the deployment for build and publish; it does not rewrite authored URLs.',\n 'dev reads route secrets from AGENT_LOCAL_SECRETS_JSON ({\"name\": \"value\"}), limited to the manifest\\'s secrets.',\n].join('\\n');\n\nconst envSchema = z.object({\n FINAL_API_KEY: z.string().min(1).optional(),\n FINAL_API_HOST: z.string().url().optional(),\n});\n\nexport interface AgentsCliDepsIface {\n argv: string[];\n env: Record<string, string | undefined>;\n cwd: string;\n output: OutputIface;\n // Seams: API requests and the checkout's file listing.\n fetch?: FetchIface;\n listFiles?: ListFiles;\n // Ends long-running commands (dev); main.ts aborts it on SIGINT and SIGTERM.\n signal?: AbortSignal;\n // Seam: loads the conformance module (dynamic import by file URL).\n importModule?: ImportModule;\n}\n\nconst optionsConfig = {\n host: { type: 'string' },\n agent: { type: 'string' },\n ref: { type: 'string' },\n message: { type: 'string' },\n note: { type: 'string' },\n port: { type: 'string' },\n export: { type: 'string' },\n profile: { type: 'string' },\n timeout: { type: 'string' },\n json: { type: 'boolean' },\n help: { type: 'boolean', short: 'h' },\n} as const;\n\nconst parseCommandLine = (argv: string[]) =>\n parseArgs({ args: argv, options: optionsConfig, allowPositionals: true });\n\ntype ParsedResult =\n | { ok: true; parsed: ReturnType<typeof parseCommandLine> }\n | { ok: false; message: string };\n\nconst parse = (argv: string[]): ParsedResult => {\n try {\n return { ok: true, parsed: parseCommandLine(argv) };\n } catch (cause) {\n return { ok: false, message: cause instanceof Error ? cause.message : String(cause) };\n }\n};\n\nexport const runAgentsCommand = async (deps: AgentsCliDepsIface): Promise<number> => {\n const { output } = deps;\n const parsedArgs = parse(deps.argv);\n if (!parsedArgs.ok) {\n output.stderr(`error: ${parsedArgs.message}`);\n output.stderr(USAGE);\n return 2;\n }\n const { values, positionals } = parsedArgs.parsed;\n const [command, dirArg, ...extra] = positionals;\n if (values.help === true || command == null || command === 'help') {\n (command == null && values.help !== true ? output.stderr : output.stdout)(USAGE);\n return command == null && values.help !== true ? 2 : 0;\n }\n if (extra.length > 0) {\n output.stderr(`error: unexpected arguments: ${extra.join(' ')}`);\n return 2;\n }\n const env = envSchema.safeParse(deps.env);\n if (!env.success) {\n output.stderr(\n 'error: FINAL_API_KEY must be nonempty and FINAL_API_HOST must be an absolute URL',\n );\n return 2;\n }\n const apiKey = env.success ? (env.data.FINAL_API_KEY ?? null) : null;\n const dir = resolve(deps.cwd, dirArg ?? '.');\n const client = (key: string): AgentClientIface =>\n createClient({\n host: values.host ?? env.data.FINAL_API_HOST ?? DEFAULT_AGENTS_HOST,\n auth: { apiKey: key },\n fetch: deps.fetch,\n });\n\n if (command === 'build') {\n return runBuild({ dir, client: apiKey == null ? null : client(apiKey), output });\n }\n if (command === 'dev') {\n const port = values.port == null ? DEFAULT_DEV_PORT : Number(values.port);\n if (!Number.isInteger(port) || port < 0 || port > 65_535) {\n output.stderr(`error: --port must be a port number`);\n return 2;\n }\n return runDev({\n dir,\n port,\n env: deps.env,\n output,\n signal: deps.signal ?? new AbortController().signal,\n });\n }\n if (command === 'publish') {\n if (values.agent == null) {\n output.stderr('error: publish needs --agent <slug>');\n return 2;\n }\n if (apiKey == null) {\n output.stderr('error: set FINAL_API_KEY to an organization API key');\n return 2;\n }\n return runPublish({\n dir,\n agent: values.agent,\n ref: values.ref ?? null,\n message: values.message ?? DEFAULT_COMMIT_MESSAGE,\n note: values.note ?? null,\n client: client(apiKey),\n listFiles: deps.listFiles ?? gitListFiles,\n output,\n });\n }\n if (command === 'conformance') {\n if (dirArg == null) {\n output.stderr('error: conformance needs <module>');\n return 2;\n }\n const timeoutMs = values.timeout == null ? null : Number(values.timeout);\n if (timeoutMs != null && (!Number.isInteger(timeoutMs) || timeoutMs <= 0)) {\n output.stderr('error: --timeout must be a positive number of milliseconds');\n return 2;\n }\n return runConformance({\n module: dirArg,\n exportName: values.export ?? 'default',\n profile: values.profile ?? 'final',\n timeoutMs,\n json: values.json === true,\n cwd: deps.cwd,\n output,\n importModule: deps.importModule,\n signal: deps.signal,\n });\n }\n output.stderr(`error: unknown command ${command}`);\n output.stderr(USAGE);\n return 2;\n};\n"],
5
+ "mappings": "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",
6
6
  "names": []
7
7
  }
@@ -1,6 +1,9 @@
1
- export { CredentialOwner, CredentialPayer, DELETE, GET, HookEvent, POST, PUT, SandboxWire, WS, always, baseTools, credentials, defineAgent, defineChannel, disableChannel, defineProviderChannel, defineDynamic, defineHarness, defineHook, defineInstructions, defineMcpClientConnection, defineSandbox, defineSandboxProvider, defineSchedule, defineSkill, defineTool, harnessHost, never, toolResultFrom, whenInput, } from "./authoring/index.mjs";
2
- export type { AgentDefinitionInputIface, AgentSessionInfoIface, ApprovalPolicyIface, AuthoredChannelDefinitionIface, AuthoredHarnessCloseContextIface, AuthoredHarnessDescriptionIface, AuthoredHarnessEndpointIface, AuthoredHarnessHealthIface, AuthoredHarnessIface, AuthoredHarnessOpenArgsIface, AuthoredHarnessRefContextIface, AuthoredHarnessResumeArgsIface, BaseToolsValueIface, ConversationInfoIface, CredentialNode, CredentialPolicyIface, DefinedAuthoredHarnessIface, DefinedToolIface, DynamicDefinitionIface, DynamicResolveContextIface, DynamicSentinelIface, FinalPlatformClientIface, HarnessHostIface, HookContextIface, HookDefinitionIface, HookEventIface, McpClientConnectionDefinitionIface, SandboxSelectorContextIface, ScheduleInputIface, SkillDefinitionIface, ToolContextIface, ToolDefinitionIface, } from "./authoring/index.mjs";
1
+ export { CredentialOwner, CredentialPayer, DELETE, GET, HookEvent, POST, PUT, SandboxWire, WS, always, baseTools, credentials, defineAgent, defineChannel, disableChannel, defineProviderChannel, defineDynamic, defineHarness, defineHostedConnection, defineHook, defineInstructions, defineMcpClientConnection, defineSandbox, defineSandboxProvider, defineSchedule, defineSkill, defineTool, harnessHost, never, toolResultFrom, whenInput, } from "./authoring/index.mjs";
2
+ export type { AgentDefinitionInputIface, AgentSessionInfoIface, ApprovalPolicyIface, AuthoredChannelDefinitionIface, AuthoredHarnessCloseContextIface, AuthoredHarnessDescriptionIface, AuthoredHarnessEndpointIface, AuthoredHarnessHealthIface, AuthoredHarnessIface, AuthoredHarnessOpenArgsIface, AuthoredHarnessRefContextIface, AuthoredHarnessResumeArgsIface, BaseToolsValueIface, ConversationInfoIface, CredentialNode, CredentialPolicyIface, DefinedAuthoredHarnessIface, DefinedToolIface, DynamicDefinitionIface, DynamicResolveContextIface, DynamicSentinelIface, FinalPlatformClientIface, HarnessHostIface, HookContextIface, HookDefinitionIface, HookEventIface, HostedConnectionDefinitionIface, McpClientConnectionDefinitionIface, SandboxSelectorContextIface, ScheduleInputIface, SkillDefinitionIface, ToolContextIface, ToolDefinitionIface, } from "./authoring/index.mjs";
3
3
  export * from "./authoring/providers.mjs";
4
- export type { AgentManifestIface, ChannelDefinitionIface, ChannelPlatformIface, ChannelSocketIface, HarnessDescriptionIface, HarnessEndpointIface, HarnessIface, HarnessSessionRefIface, McpChannelIface, NetworkSandboxSessionIface, ResolvedAgentManifestIface, RouteDefinitionIface, SandboxMcpEndpoint, SandboxPrepareContextIface, SandboxProcessIface, SandboxProviderHandleIface, SandboxProviderIface, SandboxProviderImplementationIface, SandboxSessionIface, SandboxStartContextIface, ScreenSessionIface, } from '@finalai/agent-provider';
4
+ export type { AgentAvatarIface, AvatarMedia, AvatarState, AgentManifestIface, ChannelDefinitionIface, ChannelPlatformIface, ChannelSocketIface, HarnessDescriptionIface, HarnessEndpointIface, HarnessIface, HarnessSessionRefIface, HostedBindingsIface, McpChannelIface, NetworkSandboxSessionIface, ResolvedAgentManifestIface, RouteDefinitionIface, SandboxMcpEndpoint, SandboxPrepareContextIface, SandboxProcessIface, SandboxProviderHandleIface, SandboxProviderIface, SandboxProviderImplementationIface, SandboxSessionIface, SandboxStartContextIface, ScreenSessionIface, } from '@finalai/agent-provider';
5
+ export { requireHostedBinding } from '@finalai/agent-provider';
6
+ export { validateHostedBindings } from '@finalai/agent-definition';
7
+ export type { HostedBindingRequirementIface } from '@finalai/agent-provider';
5
8
  export { defineFinalConnection } from '@finalai/final-agent-provider/connections';
6
- export type { FinalConnectionDefinitionIface } from '@finalai/final-agent-provider/connections';
9
+ export type { FinalConnectionDefinitionIface, FinalHostedConnectionDefinitionIface, } from '@finalai/final-agent-provider/connections';
@@ -17,6 +17,7 @@ import {
17
17
  defineProviderChannel,
18
18
  defineDynamic,
19
19
  defineHarness,
20
+ defineHostedConnection,
20
21
  defineHook,
21
22
  defineInstructions,
22
23
  defineMcpClientConnection,
@@ -31,6 +32,8 @@ import {
31
32
  whenInput
32
33
  } from "./authoring/index.mjs";
33
34
  export * from "./authoring/providers.mjs";
35
+ import { requireHostedBinding } from "@finalai/agent-provider";
36
+ import { validateHostedBindings } from "@finalai/agent-definition";
34
37
  import { defineFinalConnection } from "@finalai/final-agent-provider/connections";
35
38
  export {
36
39
  CredentialOwner,
@@ -51,6 +54,7 @@ export {
51
54
  defineFinalConnection,
52
55
  defineHarness,
53
56
  defineHook,
57
+ defineHostedConnection,
54
58
  defineInstructions,
55
59
  defineMcpClientConnection,
56
60
  defineProviderChannel,
@@ -62,7 +66,9 @@ export {
62
66
  disableChannel,
63
67
  harnessHost,
64
68
  never,
69
+ requireHostedBinding,
65
70
  toolResultFrom,
71
+ validateHostedBindings,
66
72
  whenInput
67
73
  };
68
74
  //# sourceMappingURL=public.mjs.map
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../../../src/public.ts"],
4
- "sourcesContent": ["// Agent authoring.\nexport {\n CredentialOwner,\n CredentialPayer,\n DELETE,\n GET,\n HookEvent,\n POST,\n PUT,\n SandboxWire,\n WS,\n always,\n baseTools,\n credentials,\n defineAgent,\n defineChannel,\n disableChannel,\n defineProviderChannel,\n defineDynamic,\n defineHarness,\n defineHook,\n defineInstructions,\n defineMcpClientConnection,\n defineSandbox,\n defineSandboxProvider,\n defineSchedule,\n defineSkill,\n defineTool,\n harnessHost,\n never,\n toolResultFrom,\n whenInput,\n} from \"./authoring/index.mjs\";\nexport type {\n AgentDefinitionInputIface,\n AgentSessionInfoIface,\n ApprovalPolicyIface,\n AuthoredChannelDefinitionIface,\n AuthoredHarnessCloseContextIface,\n AuthoredHarnessDescriptionIface,\n AuthoredHarnessEndpointIface,\n AuthoredHarnessHealthIface,\n AuthoredHarnessIface,\n AuthoredHarnessOpenArgsIface,\n AuthoredHarnessRefContextIface,\n AuthoredHarnessResumeArgsIface,\n BaseToolsValueIface,\n ConversationInfoIface,\n CredentialNode,\n CredentialPolicyIface,\n DefinedAuthoredHarnessIface,\n DefinedToolIface,\n DynamicDefinitionIface,\n DynamicResolveContextIface,\n DynamicSentinelIface,\n FinalPlatformClientIface,\n HarnessHostIface,\n HookContextIface,\n HookDefinitionIface,\n HookEventIface,\n McpClientConnectionDefinitionIface,\n SandboxSelectorContextIface,\n ScheduleInputIface,\n SkillDefinitionIface,\n ToolContextIface,\n ToolDefinitionIface,\n} from \"./authoring/index.mjs\";\nexport * from \"./authoring/providers.mjs\";\n\nexport type {\n AgentManifestIface,\n ChannelDefinitionIface,\n ChannelPlatformIface,\n ChannelSocketIface,\n HarnessDescriptionIface,\n HarnessEndpointIface,\n HarnessIface,\n HarnessSessionRefIface,\n McpChannelIface,\n NetworkSandboxSessionIface,\n ResolvedAgentManifestIface,\n RouteDefinitionIface,\n SandboxMcpEndpoint,\n SandboxPrepareContextIface,\n SandboxProcessIface,\n SandboxProviderHandleIface,\n SandboxProviderIface,\n SandboxProviderImplementationIface,\n SandboxSessionIface,\n SandboxStartContextIface,\n ScreenSessionIface,\n} from '@finalai/agent-provider';\n\nexport { defineFinalConnection } from '@finalai/final-agent-provider/connections';\nexport type { FinalConnectionDefinitionIface } from '@finalai/final-agent-provider/connections';\n"],
5
- "mappings": "AACA;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,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,OACK;AAmCP,cAAc;AA0Bd,SAAS,6BAA6B;",
4
+ "sourcesContent": ["// Agent authoring.\nexport {\n CredentialOwner,\n CredentialPayer,\n DELETE,\n GET,\n HookEvent,\n POST,\n PUT,\n SandboxWire,\n WS,\n always,\n baseTools,\n credentials,\n defineAgent,\n defineChannel,\n disableChannel,\n defineProviderChannel,\n defineDynamic,\n defineHarness,\n defineHostedConnection,\n defineHook,\n defineInstructions,\n defineMcpClientConnection,\n defineSandbox,\n defineSandboxProvider,\n defineSchedule,\n defineSkill,\n defineTool,\n harnessHost,\n never,\n toolResultFrom,\n whenInput,\n} from \"./authoring/index.mjs\";\nexport type {\n AgentDefinitionInputIface,\n AgentSessionInfoIface,\n ApprovalPolicyIface,\n AuthoredChannelDefinitionIface,\n AuthoredHarnessCloseContextIface,\n AuthoredHarnessDescriptionIface,\n AuthoredHarnessEndpointIface,\n AuthoredHarnessHealthIface,\n AuthoredHarnessIface,\n AuthoredHarnessOpenArgsIface,\n AuthoredHarnessRefContextIface,\n AuthoredHarnessResumeArgsIface,\n BaseToolsValueIface,\n ConversationInfoIface,\n CredentialNode,\n CredentialPolicyIface,\n DefinedAuthoredHarnessIface,\n DefinedToolIface,\n DynamicDefinitionIface,\n DynamicResolveContextIface,\n DynamicSentinelIface,\n FinalPlatformClientIface,\n HarnessHostIface,\n HookContextIface,\n HookDefinitionIface,\n HookEventIface,\n HostedConnectionDefinitionIface,\n McpClientConnectionDefinitionIface,\n SandboxSelectorContextIface,\n ScheduleInputIface,\n SkillDefinitionIface,\n ToolContextIface,\n ToolDefinitionIface,\n} from \"./authoring/index.mjs\";\nexport * from \"./authoring/providers.mjs\";\n\nexport type {\n AgentAvatarIface,\n AvatarMedia,\n AvatarState,\n AgentManifestIface,\n ChannelDefinitionIface,\n ChannelPlatformIface,\n ChannelSocketIface,\n HarnessDescriptionIface,\n HarnessEndpointIface,\n HarnessIface,\n HarnessSessionRefIface,\n HostedBindingsIface,\n McpChannelIface,\n NetworkSandboxSessionIface,\n ResolvedAgentManifestIface,\n RouteDefinitionIface,\n SandboxMcpEndpoint,\n SandboxPrepareContextIface,\n SandboxProcessIface,\n SandboxProviderHandleIface,\n SandboxProviderIface,\n SandboxProviderImplementationIface,\n SandboxSessionIface,\n SandboxStartContextIface,\n ScreenSessionIface,\n} from '@finalai/agent-provider';\n\nexport { requireHostedBinding } from '@finalai/agent-provider';\nexport { validateHostedBindings } from '@finalai/agent-definition';\nexport type { HostedBindingRequirementIface } from '@finalai/agent-provider';\n\nexport { defineFinalConnection } from '@finalai/final-agent-provider/connections';\nexport type {\n FinalConnectionDefinitionIface,\n FinalHostedConnectionDefinitionIface,\n} from '@finalai/final-agent-provider/connections';\n"],
5
+ "mappings": "AACA;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,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,OACK;AAoCP,cAAc;AA8Bd,SAAS,4BAA4B;AACrC,SAAS,8BAA8B;AAGvC,SAAS,6BAA6B;",
6
6
  "names": []
7
7
  }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@finalai/agents",
3
- "version": "0.1.2",
3
+ "version": "0.1.4",
4
4
  "private": false,
5
5
  "description": "Agent authoring, client APIs, and CLI.",
6
6
  "license": "Apache-2.0",
@@ -13,6 +13,7 @@
13
13
  "README.md",
14
14
  "LICENSE",
15
15
  "NOTICE",
16
+ "HOSTING.md",
16
17
  "THIRD_PARTY_NOTICES.md"
17
18
  ],
18
19
  "type": "module",
@@ -109,11 +110,11 @@
109
110
  },
110
111
  "dependencies": {
111
112
  "@agentclientprotocol/sdk": "1.8.0",
112
- "@finalai/agent-definition": "0.1.2",
113
- "@finalai/agent-protocol": "0.1.2",
114
- "@finalai/agent-provider": "0.1.2",
115
- "@finalai/final-agent-provider": "0.1.2",
116
- "@finalai/websockets": "0.1.2",
113
+ "@finalai/agent-definition": "0.1.4",
114
+ "@finalai/agent-protocol": "0.1.4",
115
+ "@finalai/agent-provider": "0.1.4",
116
+ "@finalai/final-agent-provider": "0.1.4",
117
+ "@finalai/websockets": "0.1.4",
117
118
  "ws": "^8.21.3",
118
119
  "zod": "4.6.5"
119
120
  },