melchizedek-agents 0.16.2 → 0.17.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 (82) hide show
  1. package/.env.example +17 -0
  2. package/AGENT_SETUP.md +2 -1
  3. package/CHANGELOG.md +142 -0
  4. package/DOCUMENTATION.md +237 -7
  5. package/QUICKSTART.md +2 -2
  6. package/README.md +125 -149
  7. package/config/agents/examples/harness.yaml +135 -0
  8. package/config/agents/examples/model_zoo.yaml +23 -9
  9. package/config/agents/examples/pipeline.yaml +120 -0
  10. package/config/agents/examples/specs/open-meteo-forecast.json +77 -0
  11. package/config/agents/examples/specs/open-meteo-geocoding.json +53 -0
  12. package/config/agents/examples/weather.yaml +59 -0
  13. package/config/agents/syndicateSchema.yaml +112 -1
  14. package/db/migrations/0011_erase_expired.sql +198 -0
  15. package/dist/lib/a2a/app.d.ts +7 -0
  16. package/dist/lib/a2a/app.js +7 -1
  17. package/dist/lib/a2a/executor.js +41 -0
  18. package/dist/lib/compile.d.ts +40 -1
  19. package/dist/lib/compile.js +132 -14
  20. package/dist/lib/config.d.ts +17 -0
  21. package/dist/lib/config.js +17 -0
  22. package/dist/lib/doctor.js +17 -4
  23. package/dist/lib/index.d.ts +2 -0
  24. package/dist/lib/index.js +1 -0
  25. package/dist/lib/loadSyndicate.d.ts +46 -0
  26. package/dist/lib/loadSyndicate.js +19 -3
  27. package/dist/lib/memory/erase.d.ts +5 -0
  28. package/dist/lib/memory/erase.js +5 -0
  29. package/dist/lib/models/capabilities.js +10 -0
  30. package/dist/lib/models/endpoints.d.ts +1 -1
  31. package/dist/lib/models/endpoints.js +4 -1
  32. package/dist/lib/models/gateway.d.ts +2 -2
  33. package/dist/lib/models/gateway.js +4 -4
  34. package/dist/lib/models/kimiLlm.d.ts +123 -0
  35. package/dist/lib/models/kimiLlm.js +171 -0
  36. package/dist/lib/models/providerMap.d.ts +2 -2
  37. package/dist/lib/models/providerMap.js +4 -1
  38. package/dist/lib/models/registry.d.ts +1 -1
  39. package/dist/lib/models/registry.js +11 -3
  40. package/dist/lib/net/redirects.d.ts +14 -0
  41. package/dist/lib/net/redirects.js +94 -0
  42. package/dist/lib/observability/tracer.d.ts +1 -1
  43. package/dist/lib/persistence/supabaseProvider.d.ts +2 -6
  44. package/dist/lib/persistence/supabaseProvider.js +2 -31
  45. package/dist/lib/runtime/questions.d.ts +55 -0
  46. package/dist/lib/runtime/questions.js +107 -0
  47. package/dist/lib/runtime/syndicateTurn.d.ts +42 -4
  48. package/dist/lib/runtime/syndicateTurn.js +162 -16
  49. package/dist/lib/storage/postgres/index.d.ts +6 -0
  50. package/dist/lib/storage/postgres/index.js +11 -0
  51. package/dist/lib/storage/rlsStatus.d.ts +45 -0
  52. package/dist/lib/storage/rlsStatus.js +69 -0
  53. package/dist/lib/syndicateSchema.d.ts +169 -0
  54. package/dist/lib/syndicateSchema.js +327 -2
  55. package/dist/lib/toolRegistry.js +9 -0
  56. package/dist/lib/tools/openapiTools.d.ts +46 -0
  57. package/dist/lib/tools/openapiTools.js +195 -0
  58. package/dist/lib/tools/skillToolset.d.ts +135 -0
  59. package/dist/lib/tools/skillToolset.js +247 -0
  60. package/dist/lib/tools/urlContextTool.d.ts +29 -0
  61. package/dist/lib/tools/urlContextTool.js +39 -0
  62. package/dist/lib/workflow.d.ts +72 -0
  63. package/dist/lib/workflow.js +180 -0
  64. package/dist/lib/workflowConfig.d.ts +95 -0
  65. package/dist/lib/workflowConfig.js +93 -0
  66. package/dist/scripts/syndicate_chat.js +39 -5
  67. package/package.json +4 -1
  68. package/skills/briefs/_shared.md +1 -1
  69. package/skills/briefs/melchizedek-author.md +8 -4
  70. package/skills/briefs/melchizedek-memory.md +1 -1
  71. package/skills/briefs/melchizedek-models.md +1 -1
  72. package/skills/briefs/melchizedek-scribe.md +4 -4
  73. package/skills/briefs/melchizedek-serve.md +1 -1
  74. package/skills/briefs/melchizedek.md +4 -1
  75. package/skills/melchizedek/SKILL.md +4 -1
  76. package/skills/melchizedek-author/SKILL.md +7 -3
  77. package/skills/melchizedek-memory/SKILL.md +1 -1
  78. package/skills/melchizedek-models/SKILL.md +1 -1
  79. package/skills/melchizedek-scribe/SKILL.md +3 -3
  80. package/skills/melchizedek-serve/SKILL.md +1 -1
  81. /package/skills/melchizedek-author/{templates → assets}/minimal.yaml +0 -0
  82. /package/skills/melchizedek-scribe/{templates → assets}/brief.md +0 -0
@@ -19,6 +19,7 @@ import { PostgresSessionService } from './sessionService.js';
19
19
  import { PostgresTaskStore, reapExpiredTasks, renewTaskLeases } from './taskStore.js';
20
20
  import { postgresTaskBackend } from './taskQueue.js';
21
21
  import { searchPathOption } from '../schema.js';
22
+ import { POSTGRES_RLS_QUERY, evaluatePostgresRls } from '../rlsStatus.js';
22
23
  import { createHash, randomUUID } from 'node:crypto';
23
24
  import { hostname } from 'node:os';
24
25
  export { PostgresSessionService } from './sessionService.js';
@@ -121,6 +122,16 @@ export function postgresStorage(options) {
121
122
  throw err;
122
123
  }
123
124
  },
125
+ async rlsHardening() {
126
+ try {
127
+ const r = await pool.query(POSTGRES_RLS_QUERY);
128
+ const row = r.rows[0];
129
+ return evaluatePostgresRls({ apiRoles: row.api_roles, schema: row.schema, rows: row.rows });
130
+ }
131
+ catch (err) {
132
+ return { applied: false, detail: `hardening check failed: ${err instanceof Error ? err.message : String(err)}` };
133
+ }
134
+ },
124
135
  async erase(scopeKey, eraseOptions = {}) {
125
136
  if (!scopeKey?.trim())
126
137
  throw new Error('erase: a scope key is required');
@@ -0,0 +1,45 @@
1
+ /**
2
+ * lib/storage/rlsStatus.ts — is db/hardening.sql in force? One set of rules
3
+ * for both storage paths.
4
+ *
5
+ * WHY: a Supabase project exposes the tables in `public` through its REST
6
+ * API, readable and writable with the published anon key wherever row-level
7
+ * security is off. The server refuses to start on a public deployment
8
+ * without the hardening (ADR 0021). The supabase-js path asked
9
+ * melchizedek_rls_status(); the DATABASE_URL path asked nothing, so a
10
+ * deployment that followed the recommended setup never had the check.
11
+ *
12
+ * Both paths now read the same rows and judge them here:
13
+ * - adk_memory_facts and adk_sessions must have RLS on;
14
+ * - adk_agent_registry, where it exists, must too (anon write access there
15
+ * is agent takeover);
16
+ * - adk_telemetry without RLS is reported but does not fail the check.
17
+ */
18
+ export interface RlsHardeningStatus {
19
+ /** true when db/hardening.sql is in force, or when nothing exposes the tables. */
20
+ applied: boolean;
21
+ /** Human-readable explanation for logs. */
22
+ detail: string;
23
+ }
24
+ export interface RlsRow {
25
+ table_name: string;
26
+ rls_enabled: boolean;
27
+ }
28
+ /** Judge the RLS flags of the shipped tables. */
29
+ export declare function evaluateRlsRows(rows: RlsRow[]): RlsHardeningStatus;
30
+ /** What a direct Postgres connection sees: the API roles, the schema, and the flags. */
31
+ export interface PostgresRlsFacts {
32
+ /** True when the Supabase API roles (anon, authenticated) exist. */
33
+ apiRoles: boolean;
34
+ /** The schema the tables live in (first on the search_path). */
35
+ schema: string;
36
+ rows: RlsRow[];
37
+ }
38
+ /**
39
+ * The DATABASE_URL path's judgment. Without the API roles nothing serves the
40
+ * tables over HTTP; in a schema other than `public` the Supabase REST API
41
+ * does not expose them unless someone adds that schema to it.
42
+ */
43
+ export declare function evaluatePostgresRls(facts: PostgresRlsFacts): RlsHardeningStatus;
44
+ /** The query evaluatePostgresRls reads. */
45
+ export declare const POSTGRES_RLS_QUERY = "\n SELECT\n EXISTS (SELECT 1 FROM pg_roles WHERE rolname IN ('anon', 'authenticated')) AS api_roles,\n current_schema() AS schema,\n coalesce(\n (SELECT json_agg(json_build_object('table_name', c.relname, 'rls_enabled', c.relrowsecurity))\n FROM pg_class c JOIN pg_namespace n ON n.oid = c.relnamespace\n WHERE n.nspname = current_schema()\n AND c.relname IN ('adk_memory_facts', 'adk_sessions', 'adk_agent_registry', 'adk_telemetry')),\n '[]'::json\n ) AS rows";
@@ -0,0 +1,69 @@
1
+ /**
2
+ * lib/storage/rlsStatus.ts — is db/hardening.sql in force? One set of rules
3
+ * for both storage paths.
4
+ *
5
+ * WHY: a Supabase project exposes the tables in `public` through its REST
6
+ * API, readable and writable with the published anon key wherever row-level
7
+ * security is off. The server refuses to start on a public deployment
8
+ * without the hardening (ADR 0021). The supabase-js path asked
9
+ * melchizedek_rls_status(); the DATABASE_URL path asked nothing, so a
10
+ * deployment that followed the recommended setup never had the check.
11
+ *
12
+ * Both paths now read the same rows and judge them here:
13
+ * - adk_memory_facts and adk_sessions must have RLS on;
14
+ * - adk_agent_registry, where it exists, must too (anon write access there
15
+ * is agent takeover);
16
+ * - adk_telemetry without RLS is reported but does not fail the check.
17
+ */
18
+ /** Judge the RLS flags of the shipped tables. */
19
+ export function evaluateRlsRows(rows) {
20
+ const unprotected = ['adk_memory_facts', 'adk_sessions'].filter((t) => !rows.some((r) => r.table_name === t && r.rls_enabled));
21
+ if (unprotected.length > 0) {
22
+ return { applied: false, detail: `RLS is disabled on: ${unprotected.join(', ')}` };
23
+ }
24
+ const registryRow = rows.find((r) => r.table_name === 'adk_agent_registry');
25
+ if (registryRow && !registryRow.rls_enabled) {
26
+ return {
27
+ applied: false,
28
+ detail: 'RLS is disabled on: adk_agent_registry (agent definitions are '
29
+ + 'writable with the anon key) — re-run db/hardening.sql',
30
+ };
31
+ }
32
+ const telemetryRow = rows.find((r) => r.table_name === 'adk_telemetry');
33
+ if (telemetryRow && !telemetryRow.rls_enabled) {
34
+ return {
35
+ applied: true,
36
+ detail: 'RLS enabled on adk_memory_facts and adk_sessions — but NOT on adk_telemetry; re-run db/hardening.sql',
37
+ };
38
+ }
39
+ return { applied: true, detail: 'RLS enabled on adk_memory_facts and adk_sessions' };
40
+ }
41
+ /**
42
+ * The DATABASE_URL path's judgment. Without the API roles nothing serves the
43
+ * tables over HTTP; in a schema other than `public` the Supabase REST API
44
+ * does not expose them unless someone adds that schema to it.
45
+ */
46
+ export function evaluatePostgresRls(facts) {
47
+ if (!facts.apiRoles) {
48
+ return { applied: true, detail: 'no anon or authenticated role in this database, so no API exposes the tables' };
49
+ }
50
+ if (facts.schema !== 'public') {
51
+ return {
52
+ applied: true,
53
+ detail: `tables live in schema "${facts.schema}", which the Supabase API does not expose unless it is added to the exposed schemas`,
54
+ };
55
+ }
56
+ return evaluateRlsRows(facts.rows);
57
+ }
58
+ /** The query evaluatePostgresRls reads. */
59
+ export const POSTGRES_RLS_QUERY = `
60
+ SELECT
61
+ EXISTS (SELECT 1 FROM pg_roles WHERE rolname IN ('anon', 'authenticated')) AS api_roles,
62
+ current_schema() AS schema,
63
+ coalesce(
64
+ (SELECT json_agg(json_build_object('table_name', c.relname, 'rls_enabled', c.relrowsecurity))
65
+ FROM pg_class c JOIN pg_namespace n ON n.oid = c.relnamespace
66
+ WHERE n.nspname = current_schema()
67
+ AND c.relname IN ('adk_memory_facts', 'adk_sessions', 'adk_agent_registry', 'adk_telemetry')),
68
+ '[]'::json
69
+ ) AS rows`;
@@ -24,6 +24,7 @@
24
24
  import { z } from 'zod';
25
25
  import type { SyndicateYamlConfig } from './loadSyndicate.ts';
26
26
  export declare const MEMORY_SYSTEMS: readonly ['internal-only', 'session-only', 'long-term'];
27
+ export declare const SKILL_SCRIPT_MODES: readonly ['none', 'local'];
27
28
  export declare const agentSchema: z.ZodObject<{
28
29
  name: z.ZodString;
29
30
  description: z.ZodOptional<z.ZodString>;
@@ -61,6 +62,42 @@ export declare const agentSchema: z.ZodObject<{
61
62
  }, z.core.$loose>>;
62
63
  outputSchema: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodUnknown>>;
63
64
  mcp_server_url: z.ZodOptional<z.ZodString>;
65
+ skills: z.ZodOptional<z.ZodObject<{
66
+ dir: z.ZodString;
67
+ scripts: z.ZodOptional<z.ZodEnum<{
68
+ local: "local";
69
+ none: "none";
70
+ }>>;
71
+ tools: z.ZodOptional<z.ZodArray<z.ZodString>>;
72
+ }, z.core.$strict>>;
73
+ openapi: z.ZodOptional<z.ZodArray<z.ZodObject<{
74
+ spec: z.ZodString;
75
+ operations: z.ZodOptional<z.ZodArray<z.ZodString>>;
76
+ base_url: z.ZodOptional<z.ZodString>;
77
+ prefix: z.ZodOptional<z.ZodString>;
78
+ auth: z.ZodOptional<z.ZodObject<{
79
+ bearer_env: z.ZodOptional<z.ZodString>;
80
+ api_key: z.ZodOptional<z.ZodObject<{
81
+ env: z.ZodString;
82
+ in: z.ZodEnum<{
83
+ header: "header";
84
+ query: "query";
85
+ }>;
86
+ name: z.ZodString;
87
+ }, z.core.$strict>>;
88
+ }, z.core.$strict>>;
89
+ }, z.core.$strict>>>;
90
+ code_execution: z.ZodOptional<z.ZodLiteral<"gemini">>;
91
+ context: z.ZodOptional<z.ZodObject<{
92
+ compact_after_tokens: z.ZodNumber;
93
+ keep_recent_events: z.ZodOptional<z.ZodNumber>;
94
+ summary_model: z.ZodOptional<z.ZodString>;
95
+ }, z.core.$strict>>;
96
+ examples: z.ZodOptional<z.ZodArray<z.ZodObject<{
97
+ input: z.ZodString;
98
+ output: z.ZodString;
99
+ }, z.core.$strict>>>;
100
+ mode: z.ZodOptional<z.ZodLiteral<"task">>;
64
101
  orchestration: z.ZodOptional<z.ZodObject<{
65
102
  role: z.ZodOptional<z.ZodEnum<{
66
103
  primary: "primary";
@@ -109,6 +146,42 @@ export declare const subagentSchema: z.ZodObject<{
109
146
  }, z.core.$loose>>;
110
147
  outputSchema: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodUnknown>>;
111
148
  mcp_server_url: z.ZodOptional<z.ZodString>;
149
+ skills: z.ZodOptional<z.ZodObject<{
150
+ dir: z.ZodString;
151
+ scripts: z.ZodOptional<z.ZodEnum<{
152
+ local: "local";
153
+ none: "none";
154
+ }>>;
155
+ tools: z.ZodOptional<z.ZodArray<z.ZodString>>;
156
+ }, z.core.$strict>>;
157
+ openapi: z.ZodOptional<z.ZodArray<z.ZodObject<{
158
+ spec: z.ZodString;
159
+ operations: z.ZodOptional<z.ZodArray<z.ZodString>>;
160
+ base_url: z.ZodOptional<z.ZodString>;
161
+ prefix: z.ZodOptional<z.ZodString>;
162
+ auth: z.ZodOptional<z.ZodObject<{
163
+ bearer_env: z.ZodOptional<z.ZodString>;
164
+ api_key: z.ZodOptional<z.ZodObject<{
165
+ env: z.ZodString;
166
+ in: z.ZodEnum<{
167
+ header: "header";
168
+ query: "query";
169
+ }>;
170
+ name: z.ZodString;
171
+ }, z.core.$strict>>;
172
+ }, z.core.$strict>>;
173
+ }, z.core.$strict>>>;
174
+ code_execution: z.ZodOptional<z.ZodLiteral<"gemini">>;
175
+ context: z.ZodOptional<z.ZodObject<{
176
+ compact_after_tokens: z.ZodNumber;
177
+ keep_recent_events: z.ZodOptional<z.ZodNumber>;
178
+ summary_model: z.ZodOptional<z.ZodString>;
179
+ }, z.core.$strict>>;
180
+ examples: z.ZodOptional<z.ZodArray<z.ZodObject<{
181
+ input: z.ZodString;
182
+ output: z.ZodString;
183
+ }, z.core.$strict>>>;
184
+ mode: z.ZodOptional<z.ZodLiteral<"task">>;
112
185
  orchestration: z.ZodOptional<z.ZodObject<{
113
186
  role: z.ZodOptional<z.ZodEnum<{
114
187
  primary: "primary";
@@ -161,6 +234,42 @@ export declare const syndicateSchema: z.ZodObject<{
161
234
  }, z.core.$loose>>;
162
235
  outputSchema: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodUnknown>>;
163
236
  mcp_server_url: z.ZodOptional<z.ZodString>;
237
+ skills: z.ZodOptional<z.ZodObject<{
238
+ dir: z.ZodString;
239
+ scripts: z.ZodOptional<z.ZodEnum<{
240
+ local: "local";
241
+ none: "none";
242
+ }>>;
243
+ tools: z.ZodOptional<z.ZodArray<z.ZodString>>;
244
+ }, z.core.$strict>>;
245
+ openapi: z.ZodOptional<z.ZodArray<z.ZodObject<{
246
+ spec: z.ZodString;
247
+ operations: z.ZodOptional<z.ZodArray<z.ZodString>>;
248
+ base_url: z.ZodOptional<z.ZodString>;
249
+ prefix: z.ZodOptional<z.ZodString>;
250
+ auth: z.ZodOptional<z.ZodObject<{
251
+ bearer_env: z.ZodOptional<z.ZodString>;
252
+ api_key: z.ZodOptional<z.ZodObject<{
253
+ env: z.ZodString;
254
+ in: z.ZodEnum<{
255
+ header: "header";
256
+ query: "query";
257
+ }>;
258
+ name: z.ZodString;
259
+ }, z.core.$strict>>;
260
+ }, z.core.$strict>>;
261
+ }, z.core.$strict>>>;
262
+ code_execution: z.ZodOptional<z.ZodLiteral<"gemini">>;
263
+ context: z.ZodOptional<z.ZodObject<{
264
+ compact_after_tokens: z.ZodNumber;
265
+ keep_recent_events: z.ZodOptional<z.ZodNumber>;
266
+ summary_model: z.ZodOptional<z.ZodString>;
267
+ }, z.core.$strict>>;
268
+ examples: z.ZodOptional<z.ZodArray<z.ZodObject<{
269
+ input: z.ZodString;
270
+ output: z.ZodString;
271
+ }, z.core.$strict>>>;
272
+ mode: z.ZodOptional<z.ZodLiteral<"task">>;
164
273
  orchestration: z.ZodOptional<z.ZodObject<{
165
274
  role: z.ZodOptional<z.ZodEnum<{
166
275
  primary: "primary";
@@ -203,6 +312,42 @@ export declare const syndicateSchema: z.ZodObject<{
203
312
  }, z.core.$loose>>;
204
313
  outputSchema: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodUnknown>>;
205
314
  mcp_server_url: z.ZodOptional<z.ZodString>;
315
+ skills: z.ZodOptional<z.ZodObject<{
316
+ dir: z.ZodString;
317
+ scripts: z.ZodOptional<z.ZodEnum<{
318
+ local: "local";
319
+ none: "none";
320
+ }>>;
321
+ tools: z.ZodOptional<z.ZodArray<z.ZodString>>;
322
+ }, z.core.$strict>>;
323
+ openapi: z.ZodOptional<z.ZodArray<z.ZodObject<{
324
+ spec: z.ZodString;
325
+ operations: z.ZodOptional<z.ZodArray<z.ZodString>>;
326
+ base_url: z.ZodOptional<z.ZodString>;
327
+ prefix: z.ZodOptional<z.ZodString>;
328
+ auth: z.ZodOptional<z.ZodObject<{
329
+ bearer_env: z.ZodOptional<z.ZodString>;
330
+ api_key: z.ZodOptional<z.ZodObject<{
331
+ env: z.ZodString;
332
+ in: z.ZodEnum<{
333
+ header: "header";
334
+ query: "query";
335
+ }>;
336
+ name: z.ZodString;
337
+ }, z.core.$strict>>;
338
+ }, z.core.$strict>>;
339
+ }, z.core.$strict>>>;
340
+ code_execution: z.ZodOptional<z.ZodLiteral<"gemini">>;
341
+ context: z.ZodOptional<z.ZodObject<{
342
+ compact_after_tokens: z.ZodNumber;
343
+ keep_recent_events: z.ZodOptional<z.ZodNumber>;
344
+ summary_model: z.ZodOptional<z.ZodString>;
345
+ }, z.core.$strict>>;
346
+ examples: z.ZodOptional<z.ZodArray<z.ZodObject<{
347
+ input: z.ZodString;
348
+ output: z.ZodString;
349
+ }, z.core.$strict>>>;
350
+ mode: z.ZodOptional<z.ZodLiteral<"task">>;
206
351
  orchestration: z.ZodOptional<z.ZodObject<{
207
352
  role: z.ZodOptional<z.ZodEnum<{
208
353
  primary: "primary";
@@ -227,6 +372,30 @@ export declare const syndicateSchema: z.ZodObject<{
227
372
  reason: z.ZodOptional<z.ZodString>;
228
373
  }, z.core.$strict>>>;
229
374
  }, z.core.$strict>>;
375
+ workflow: z.ZodOptional<z.ZodObject<{
376
+ edges: z.ZodArray<z.ZodArray<z.ZodUnion<readonly [z.ZodString, z.ZodArray<z.ZodString>, z.ZodRecord<z.ZodString, z.ZodUnion<readonly [z.ZodString, z.ZodArray<z.ZodString>]>>]>>>;
377
+ nodes: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodObject<{
378
+ ask_user: z.ZodOptional<z.ZodString>;
379
+ schema: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodUnknown>>;
380
+ join: z.ZodOptional<z.ZodLiteral<true>>;
381
+ map: z.ZodOptional<z.ZodString>;
382
+ max_parallel: z.ZodOptional<z.ZodNumber>;
383
+ tool: z.ZodOptional<z.ZodString>;
384
+ route_key: z.ZodOptional<z.ZodString>;
385
+ retry: z.ZodOptional<z.ZodObject<{
386
+ max_attempts: z.ZodOptional<z.ZodNumber>;
387
+ initial_delay: z.ZodOptional<z.ZodNumber>;
388
+ max_delay: z.ZodOptional<z.ZodNumber>;
389
+ backoff_factor: z.ZodOptional<z.ZodNumber>;
390
+ }, z.core.$strict>>;
391
+ timeout: z.ZodOptional<z.ZodNumber>;
392
+ }, z.core.$strict>>>;
393
+ max_concurrency: z.ZodOptional<z.ZodNumber>;
394
+ }, z.core.$strict>>;
395
+ retries: z.ZodOptional<z.ZodObject<{
396
+ model_errors: z.ZodOptional<z.ZodNumber>;
397
+ tool_errors: z.ZodOptional<z.ZodNumber>;
398
+ }, z.core.$strict>>;
230
399
  variables: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodUnion<readonly [z.ZodString, z.ZodNumber, z.ZodBoolean]>>>;
231
400
  memory_system: z.ZodOptional<z.ZodEnum<{
232
401
  "internal-only": "internal-only";