@otto-code/protocol 0.7.5 → 0.8.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/agent-attention-notification.d.ts +2 -0
- package/dist/agent-attention-notification.js +2 -1
- package/dist/agent-deep-link.d.ts +8 -0
- package/dist/agent-deep-link.js +49 -0
- package/dist/agent-labels.js +4 -4
- package/dist/agent-personalities.d.ts +2 -2
- package/dist/agent-personalities.js +17 -17
- package/dist/agent-teams.d.ts +4 -4
- package/dist/agent-teams.js +5 -5
- package/dist/agent-types.d.ts +12 -10
- package/dist/agent-types.js +1 -1
- package/dist/artifacts/rpc-schemas.js +4 -4
- package/dist/artifacts/types.js +3 -3
- package/dist/binary-frames/file-transfer.d.ts +1 -0
- package/dist/binary-frames/file-transfer.js +1 -0
- package/dist/browser-automation/rpc-schemas.js +1 -1
- package/dist/client-capabilities.d.ts +3 -0
- package/dist/client-capabilities.js +9 -0
- package/dist/daemon-endpoints.d.ts +1 -1
- package/dist/default-personalities.js +11 -11
- package/dist/effort.d.ts +1 -1
- package/dist/effort.js +2 -2
- package/dist/forge-manifest.d.ts +66 -0
- package/dist/forge-manifest.js +92 -0
- package/dist/generated/validation/ws-outbound.aot.js +77653 -51519
- package/dist/git-hosting.js +3 -3
- package/dist/git-remote.d.ts +17 -0
- package/dist/git-remote.js +23 -2
- package/dist/judge-verdict.d.ts +1 -1
- package/dist/judge-verdict.js +2 -2
- package/dist/messages.d.ts +10634 -135
- package/dist/messages.js +1744 -193
- package/dist/model-tiers.d.ts +3 -3
- package/dist/model-tiers.js +4 -4
- package/dist/observed-subagent-title.d.ts +2 -2
- package/dist/observed-subagent-title.js +4 -4
- package/dist/orchestration.d.ts +3 -3
- package/dist/orchestration.js +32 -32
- package/dist/otto-config-schema.d.ts +21 -0
- package/dist/otto-config-schema.js +23 -1
- package/dist/provider-config.d.ts +92 -3
- package/dist/provider-config.js +58 -6
- package/dist/provider-manifest.d.ts +11 -1
- package/dist/provider-manifest.js +53 -5
- package/dist/schedule/cadence.d.ts +6 -0
- package/dist/schedule/cadence.js +28 -0
- package/dist/schedule/rpc-schemas.d.ts +4 -4
- package/dist/schedule/rpc-schemas.js +1 -1
- package/dist/schedule/types.d.ts +1 -1
- package/dist/schedule/types.js +3 -3
- package/dist/tool-call-display.d.ts +1 -1
- package/dist/tool-call-display.js +3 -3
- package/dist/tool-name-normalization.d.ts +2 -2
- package/dist/tool-name-normalization.js +2 -2
- package/dist/validation/ws-outbound-schema-metadata.d.ts +1950 -52
- package/dist/widgets/bridge.d.ts +5 -5
- package/dist/widgets/bridge.js +5 -5
- package/dist/widgets/document.d.ts +1 -1
- package/dist/widgets/document.js +4 -4
- package/dist/widgets/icons.d.ts +1 -1
- package/dist/widgets/icons.js +1 -1
- package/dist/widgets/theme.d.ts +2 -2
- package/dist/widgets/theme.js +2 -2
- package/dist/widgets/types.d.ts +5 -5
- package/dist/widgets/types.js +5 -5
- package/package.json +1 -1
package/dist/model-tiers.d.ts
CHANGED
|
@@ -1,12 +1,12 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* Model → tier classification, shared by the daemon (stamps `model.tier` at
|
|
3
|
-
* ingest) and the app (reads `model.tier`). Pure and dependency-free
|
|
3
|
+
* ingest) and the app (reads `model.tier`). Pure and dependency-free - no zod,
|
|
4
4
|
* no I/O.
|
|
5
5
|
*
|
|
6
6
|
* Deliberately NO name-pattern guessing: the official model ids are public
|
|
7
7
|
* record, so we classify what we KNOW (the shipped catalog) and leave everything
|
|
8
8
|
* else `undefined` = "Unknown". Size-in-the-name heuristics are unreliable
|
|
9
|
-
* (a Qwen-32B coder ≠ a Qwen-32B instruct), so we don't pretend
|
|
9
|
+
* (a Qwen-32B coder ≠ a Qwen-32B instruct), so we don't pretend - the user tags
|
|
10
10
|
* an Unknown model with an override and that's it.
|
|
11
11
|
*
|
|
12
12
|
* Resolution order for a single model:
|
|
@@ -21,7 +21,7 @@ export declare const KNOWN_MODEL_TIERS: Readonly<Record<string, ModelTier>>;
|
|
|
21
21
|
export declare function catalogTier(modelId: string): ModelTier | undefined;
|
|
22
22
|
/**
|
|
23
23
|
* Infer a model's tier from the shipped catalog alone (no guessing). Undefined
|
|
24
|
-
* for models we don't ship an id for
|
|
24
|
+
* for models we don't ship an id for - those read as "Unknown" until the user
|
|
25
25
|
* tags one.
|
|
26
26
|
*/
|
|
27
27
|
export declare function inferModelTier(model: Pick<AgentModelDefinition, "id">): ModelTier | undefined;
|
package/dist/model-tiers.js
CHANGED
|
@@ -1,12 +1,12 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* Model → tier classification, shared by the daemon (stamps `model.tier` at
|
|
3
|
-
* ingest) and the app (reads `model.tier`). Pure and dependency-free
|
|
3
|
+
* ingest) and the app (reads `model.tier`). Pure and dependency-free - no zod,
|
|
4
4
|
* no I/O.
|
|
5
5
|
*
|
|
6
6
|
* Deliberately NO name-pattern guessing: the official model ids are public
|
|
7
7
|
* record, so we classify what we KNOW (the shipped catalog) and leave everything
|
|
8
8
|
* else `undefined` = "Unknown". Size-in-the-name heuristics are unreliable
|
|
9
|
-
* (a Qwen-32B coder ≠ a Qwen-32B instruct), so we don't pretend
|
|
9
|
+
* (a Qwen-32B coder ≠ a Qwen-32B instruct), so we don't pretend - the user tags
|
|
10
10
|
* an Unknown model with an override and that's it.
|
|
11
11
|
*
|
|
12
12
|
* Resolution order for a single model:
|
|
@@ -20,7 +20,7 @@
|
|
|
20
20
|
// case-insensitively against the exact model id; decorated ids that miss here
|
|
21
21
|
// fall through to patterns.
|
|
22
22
|
export const KNOWN_MODEL_TIERS = {
|
|
23
|
-
// Anthropic (Claude)
|
|
23
|
+
// Anthropic (Claude) - the full Claude Code manifest. Tiering rule: 1M-context
|
|
24
24
|
// Opus variants are "deep", non-1M Opus and Sonnet are "standard", Haiku is
|
|
25
25
|
// "fast". Fable (1M, most powerful) is "deep".
|
|
26
26
|
"claude-fable-5": "deep",
|
|
@@ -84,7 +84,7 @@ export function catalogTier(modelId) {
|
|
|
84
84
|
}
|
|
85
85
|
/**
|
|
86
86
|
* Infer a model's tier from the shipped catalog alone (no guessing). Undefined
|
|
87
|
-
* for models we don't ship an id for
|
|
87
|
+
* for models we don't ship an id for - those read as "Unknown" until the user
|
|
88
88
|
* tags one.
|
|
89
89
|
*/
|
|
90
90
|
export function inferModelTier(model) {
|
|
@@ -4,7 +4,7 @@ export declare function normalizeObservedTitleSource(value: string | undefined |
|
|
|
4
4
|
export declare function normalizeObservedSubagentType(value: string | undefined | null): string | null;
|
|
5
5
|
/**
|
|
6
6
|
* Derive the frozen row name for an observed subagent. Prefer the stable
|
|
7
|
-
* `subAgentType` (e.g. "code-explorer") over the description
|
|
7
|
+
* `subAgentType` (e.g. "code-explorer") over the description - a
|
|
8
8
|
* `task_progress` description is the ever-changing AI summary, which must
|
|
9
9
|
* never become the label. Generic catch-all types ("general-purpose") are
|
|
10
10
|
* skipped in favor of the description. Callers freeze the result at the first
|
|
@@ -16,7 +16,7 @@ export declare function deriveObservedSubagentTitle(update: {
|
|
|
16
16
|
}): string;
|
|
17
17
|
/**
|
|
18
18
|
* True when this update carries a real name source we can freeze the title on.
|
|
19
|
-
* A generic catch-all type alone doesn't count
|
|
19
|
+
* A generic catch-all type alone doesn't count - freezing "general-purpose"
|
|
20
20
|
* would lock out the description a later update may carry.
|
|
21
21
|
*/
|
|
22
22
|
export declare function observedUpdateHasTitleSource(update: {
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
// Shared naming rule for provider-managed (observed) subagents. This is the
|
|
2
|
-
// single source of truth for how an observed subagent is titled
|
|
2
|
+
// single source of truth for how an observed subagent is titled - the daemon
|
|
3
3
|
// uses it to freeze the track-row label (agent-projections.ts), and the app's
|
|
4
4
|
// visualizer uses it so page-side child labels (subagent_dispatch/return
|
|
5
5
|
// particles ride an edge keyed by child NAME) resolve to exactly the same
|
|
@@ -9,7 +9,7 @@
|
|
|
9
9
|
/** Hard cap so no provider summary can produce a wall-of-text label. */
|
|
10
10
|
export const OBSERVED_SUBAGENT_TITLE_MAX = 60;
|
|
11
11
|
/**
|
|
12
|
-
* Catch-all subagent types that make lousy row labels
|
|
12
|
+
* Catch-all subagent types that make lousy row labels - Claude's default Task
|
|
13
13
|
* runs as "general-purpose". These never become the title; the task
|
|
14
14
|
* description names the row instead (user-locked).
|
|
15
15
|
*/
|
|
@@ -36,7 +36,7 @@ export function normalizeObservedSubagentType(value) {
|
|
|
36
36
|
}
|
|
37
37
|
/**
|
|
38
38
|
* Derive the frozen row name for an observed subagent. Prefer the stable
|
|
39
|
-
* `subAgentType` (e.g. "code-explorer") over the description
|
|
39
|
+
* `subAgentType` (e.g. "code-explorer") over the description - a
|
|
40
40
|
* `task_progress` description is the ever-changing AI summary, which must
|
|
41
41
|
* never become the label. Generic catch-all types ("general-purpose") are
|
|
42
42
|
* skipped in favor of the description. Callers freeze the result at the first
|
|
@@ -53,7 +53,7 @@ export function deriveObservedSubagentTitle(update) {
|
|
|
53
53
|
}
|
|
54
54
|
/**
|
|
55
55
|
* True when this update carries a real name source we can freeze the title on.
|
|
56
|
-
* A generic catch-all type alone doesn't count
|
|
56
|
+
* A generic catch-all type alone doesn't count - freezing "general-purpose"
|
|
57
57
|
* would lock out the description a later update may carry.
|
|
58
58
|
*/
|
|
59
59
|
export function observedUpdateHasTitleSource(update) {
|
package/dist/orchestration.d.ts
CHANGED
|
@@ -10,9 +10,9 @@ export declare const RUN_STATUSES: readonly ["draft", "pending", "running", "pau
|
|
|
10
10
|
export type RunStatus = (typeof RUN_STATUSES)[number];
|
|
11
11
|
export declare function isRunPhaseStatus(value: string): value is RunPhaseStatus;
|
|
12
12
|
export declare function isRunStatus(value: string): value is RunStatus;
|
|
13
|
-
/** Terminal run statuses
|
|
13
|
+
/** Terminal run statuses - no further phases will run. */
|
|
14
14
|
export declare function isTerminalRunStatus(value: string): boolean;
|
|
15
|
-
/** Terminal phase statuses
|
|
15
|
+
/** Terminal phase statuses - the phase will not change again on its own. */
|
|
16
16
|
export declare function isTerminalPhaseStatus(value: string): boolean;
|
|
17
17
|
export declare const RunPhaseJudgeSpecSchema: z.ZodObject<{
|
|
18
18
|
role: z.ZodOptional<z.ZodString>;
|
|
@@ -412,7 +412,7 @@ export declare function validateOrchestrationGraph(graph: OrchestrationGraph): s
|
|
|
412
412
|
/**
|
|
413
413
|
* Advisory findings: things that are almost certainly authoring mistakes but
|
|
414
414
|
* leave the graph executable. Separate from `validateOrchestrationGraph`
|
|
415
|
-
* because that one is the daemon's hard gate
|
|
415
|
+
* because that one is the daemon's hard gate - anything it returns stops a run,
|
|
416
416
|
* and none of these should.
|
|
417
417
|
*
|
|
418
418
|
* Expression *syntax* is not checked here: the JSONata parser is daemon-side,
|
package/dist/orchestration.js
CHANGED
|
@@ -1,12 +1,12 @@
|
|
|
1
1
|
import { z } from "zod";
|
|
2
2
|
import { JudgeVerdictSchema } from "./judge-verdict.js";
|
|
3
|
-
// The orchestration data model
|
|
3
|
+
// The orchestration data model - a daemon-owned "Run": one execution of a
|
|
4
4
|
// declared multi-agent plan, and its observable/resumable projection to clients.
|
|
5
5
|
// See projects/agent-orchestration/agent-orchestration.md. This is Otto's
|
|
6
6
|
// provider-agnostic answer to a harness "Workflow": the conductor (an
|
|
7
7
|
// orchestrator-role agent) DECLARES the shape (typed phases, assignments, the
|
|
8
|
-
// loop target) via `start_run`, and the daemon runtime drives control flow
|
|
9
|
-
// fan-out, gather-barrier, gate, loop
|
|
8
|
+
// loop target) via `start_run`, and the daemon runtime drives control flow -
|
|
9
|
+
// fan-out, gather-barrier, gate, loop - in code, so orchestrating is cheaper
|
|
10
10
|
// than hand-tracking N agent ids across async notifications.
|
|
11
11
|
//
|
|
12
12
|
// Wire-forward-compat, per the protocol contract: every open vocabulary (phase
|
|
@@ -32,7 +32,7 @@ const PHASE_TYPE_SET = new Set(RUN_PHASE_TYPES);
|
|
|
32
32
|
export function isRunPhaseType(value) {
|
|
33
33
|
return PHASE_TYPE_SET.has(value);
|
|
34
34
|
}
|
|
35
|
-
// The default role that fills each phase type. `gate` has no role
|
|
35
|
+
// The default role that fills each phase type. `gate` has no role - it's a human
|
|
36
36
|
// approval point. `deliver` defaults to coder (a writer may cover small text
|
|
37
37
|
// deliverables; the conductor can override per phase).
|
|
38
38
|
const PHASE_TYPE_DEFAULT_ROLE = {
|
|
@@ -75,11 +75,11 @@ export function isRunPhaseStatus(value) {
|
|
|
75
75
|
export function isRunStatus(value) {
|
|
76
76
|
return RUN_STATUS_SET.has(value);
|
|
77
77
|
}
|
|
78
|
-
/** Terminal run statuses
|
|
78
|
+
/** Terminal run statuses - no further phases will run. */
|
|
79
79
|
export function isTerminalRunStatus(value) {
|
|
80
80
|
return value === "done" || value === "failed" || value === "canceled";
|
|
81
81
|
}
|
|
82
|
-
/** Terminal phase statuses
|
|
82
|
+
/** Terminal phase statuses - the phase will not change again on its own. */
|
|
83
83
|
export function isTerminalPhaseStatus(value) {
|
|
84
84
|
return value === "done" || value === "failed" || value === "skipped";
|
|
85
85
|
}
|
|
@@ -120,7 +120,7 @@ export const RunPhaseDeclarationSchema = z
|
|
|
120
120
|
export const RunPlanSchema = z
|
|
121
121
|
.object({
|
|
122
122
|
title: z.string().min(1),
|
|
123
|
-
// Immutable acceptance criteria
|
|
123
|
+
// Immutable acceptance criteria - the run is "not done until every one is
|
|
124
124
|
// met." Carried onto the Run and shown at gates.
|
|
125
125
|
requirements: z.array(z.string().min(1)).optional(),
|
|
126
126
|
// Attended by default: the run pauses at `gate` phases for the user.
|
|
@@ -138,11 +138,11 @@ export const RunPhaseCandidateSchema = z
|
|
|
138
138
|
// The personality that filled the role for this candidate, if resolved.
|
|
139
139
|
personalityId: z.string().min(1).optional(),
|
|
140
140
|
verdict: JudgeVerdictSchema.optional(),
|
|
141
|
-
// The candidate's final message (synthesis input); may be large
|
|
141
|
+
// The candidate's final message (synthesis input); may be large - clients
|
|
142
142
|
// truncate for display.
|
|
143
143
|
summary: z.string().optional(),
|
|
144
144
|
// Validated output fields, when the node declared them (GraphNode.output).
|
|
145
|
-
// Values only
|
|
145
|
+
// Values only - anything large belongs in a file the next node reads.
|
|
146
146
|
outputFields: z.record(z.string(), z.unknown()).optional(),
|
|
147
147
|
})
|
|
148
148
|
.passthrough();
|
|
@@ -162,7 +162,7 @@ export const RunPhaseSchema = z
|
|
|
162
162
|
candidates: z.array(RunPhaseCandidateSchema).optional(),
|
|
163
163
|
// Free-text runtime notes (why it blocked, which cap tripped, gap named).
|
|
164
164
|
notes: z.string().optional(),
|
|
165
|
-
// Machine-readable reason a phase is "skipped"
|
|
165
|
+
// Machine-readable reason a phase is "skipped" - the human sentence stays in
|
|
166
166
|
// `notes`. Absent on a skipped phase means an older daemon wrote it (read it
|
|
167
167
|
// as "upstream-failed", the only skip that existed then). Open vocabulary,
|
|
168
168
|
// plain string on the wire; known values in GRAPH_SKIP_REASONS.
|
|
@@ -170,7 +170,7 @@ export const RunPhaseSchema = z
|
|
|
170
170
|
// How many extra attempts a node's retry policy spent (0/absent = none).
|
|
171
171
|
retryAttempts: z.number().int().min(0).optional(),
|
|
172
172
|
// True when the phase's last attempt ended at its time limit rather than
|
|
173
|
-
// by failing on its own
|
|
173
|
+
// by failing on its own - a different diagnosis, so a different flag.
|
|
174
174
|
timedOut: z.boolean().optional(),
|
|
175
175
|
startedAt: z.string().optional(),
|
|
176
176
|
completedAt: z.string().optional(),
|
|
@@ -222,7 +222,7 @@ export const RunSchema = z
|
|
|
222
222
|
// or runs without the run-summary feature.
|
|
223
223
|
summary: z.string().optional(),
|
|
224
224
|
summaryStatus: z.string().optional(),
|
|
225
|
-
// Total child agents this run spawned (makers + judgers)
|
|
225
|
+
// Total child agents this run spawned (makers + judgers) - a complexity
|
|
226
226
|
// signal surfaced in the Runs display. Grows as the run executes.
|
|
227
227
|
agentCount: z.number().int().min(0).optional(),
|
|
228
228
|
createdAt: z.string().optional(),
|
|
@@ -232,7 +232,7 @@ export const RunSchema = z
|
|
|
232
232
|
// Summary generation lifecycle (plain-string on the wire; see RunSchema.summaryStatus).
|
|
233
233
|
export const RUN_SUMMARY_STATUSES = ["pending", "ready", "failed"];
|
|
234
234
|
// ── Orchestration graphs (user orchestrations) ──────────────────────────────
|
|
235
|
-
// The reusable template a User orchestration executes
|
|
235
|
+
// The reusable template a User orchestration executes - authored in the graph
|
|
236
236
|
// designer, stored host-level, parameterized by declared inputs. Executing a
|
|
237
237
|
// graph starts an orchestration (a Run with kind "graph"). See
|
|
238
238
|
// projects/orchestration-graphs. Same wire-forward-compat posture as the Run
|
|
@@ -253,7 +253,7 @@ export const GraphInputSchema = z
|
|
|
253
253
|
// ── Prompt templates ────────────────────────────────────────────────────────
|
|
254
254
|
// Host-level reusable prompts, stored like Graphs. A template with
|
|
255
255
|
// `snippet: true` is meant to be included by other templates rather than bound
|
|
256
|
-
// to a node directly
|
|
256
|
+
// to a node directly - the shared "how to submit your output" block is the
|
|
257
257
|
// motivating case, since repeating it in every node is both duplication and
|
|
258
258
|
// tokens on every dispatch.
|
|
259
259
|
export const PromptTemplateSchema = z
|
|
@@ -261,7 +261,7 @@ export const PromptTemplateSchema = z
|
|
|
261
261
|
id: z.string().min(1),
|
|
262
262
|
name: z.string().min(1),
|
|
263
263
|
description: z.string().optional(),
|
|
264
|
-
// EJS source. Rendered with HTML escaping disabled
|
|
264
|
+
// EJS source. Rendered with HTML escaping disabled - these are prompts,
|
|
265
265
|
// not markup, and characters like & must survive verbatim.
|
|
266
266
|
content: z.string(),
|
|
267
267
|
// Variables the template expects, so the designer can render a binding
|
|
@@ -282,10 +282,10 @@ export const NodePromptTemplateRefSchema = z
|
|
|
282
282
|
variables: z.record(z.string(), z.string()).optional(),
|
|
283
283
|
})
|
|
284
284
|
.passthrough();
|
|
285
|
-
// Node kinds (open vocabulary): "orchestrator"
|
|
286
|
-
// the orchestration chat and anchors the Visualizer; "agent"
|
|
285
|
+
// Node kinds (open vocabulary): "orchestrator" - the single root that hosts
|
|
286
|
+
// the orchestration chat and anchors the Visualizer; "agent" - a worker node.
|
|
287
287
|
export const GRAPH_NODE_KINDS = ["orchestrator", "agent"];
|
|
288
|
-
// Loop annotation
|
|
288
|
+
// Loop annotation - exactly one of `times` (fixed repeat) or `until` (bounded
|
|
289
289
|
// retry graded by a structured judge between iterations; self-grading is not
|
|
290
290
|
// an exit test). `max` is a hard cap in both readings.
|
|
291
291
|
export const GraphNodeLoopSchema = z
|
|
@@ -305,7 +305,7 @@ export const GraphNodeLoopSchema = z
|
|
|
305
305
|
.passthrough();
|
|
306
306
|
// ── Output fields (the value plane) ─────────────────────────────────────────
|
|
307
307
|
// What a node declares it will produce. Plain JSON descriptors, never a
|
|
308
|
-
// serialized Zod schema: they have to be three things at once
|
|
308
|
+
// serialized Zod schema: they have to be three things at once - wire-safe, a
|
|
309
309
|
// form the designer can render, and compilable to both Zod (validation) and
|
|
310
310
|
// JSON Schema (the submit_output tool's input). `type` is an open string
|
|
311
311
|
// vocabulary so a new type can never break an old parser.
|
|
@@ -314,7 +314,7 @@ export const GraphOutputFieldSchema = z
|
|
|
314
314
|
.object({
|
|
315
315
|
key: z.string().min(1),
|
|
316
316
|
type: z.string().min(1),
|
|
317
|
-
// Shown to the node's agent as the field's description
|
|
317
|
+
// Shown to the node's agent as the field's description - this is the whole
|
|
318
318
|
// instruction it gets about what to put here, so it earns its place.
|
|
319
319
|
description: z.string().optional(),
|
|
320
320
|
// Absent ⇒ required. You declared the field; producing it is the contract.
|
|
@@ -331,7 +331,7 @@ export const GraphNodeOutputSchema = z
|
|
|
331
331
|
// be given exactly the lookup it needs instead of the whole workspace.
|
|
332
332
|
//
|
|
333
333
|
// Three kinds, all read-only by construction:
|
|
334
|
-
// command argv array only
|
|
334
|
+
// command argv array only - no shell, so no operators and no injection
|
|
335
335
|
// surface. A pipeline belongs in a script the tool points at.
|
|
336
336
|
// http-get GET only, no author-supplied headers (credentials can't leak
|
|
337
337
|
// into a graph template).
|
|
@@ -348,7 +348,7 @@ export const GraphQueryToolSchema = z
|
|
|
348
348
|
parameters: z.array(GraphOutputFieldSchema).optional(),
|
|
349
349
|
// kind "command": the executable plus its arguments, each argument a
|
|
350
350
|
// separate entry. `{{param}}` substitutes a declared parameter's value as
|
|
351
|
-
// one argument
|
|
351
|
+
// one argument - never as a fragment the shell could re-split.
|
|
352
352
|
command: z.array(z.string()).optional(),
|
|
353
353
|
// kind "http-get": the URL, with `{{param}}` substitution (encoded).
|
|
354
354
|
url: z.string().optional(),
|
|
@@ -393,14 +393,14 @@ export const GraphNodeSchema = z
|
|
|
393
393
|
// How much of the workspace this node's agent may touch: "none" (no
|
|
394
394
|
// filesystem), "read", or "write". Absent ⇒ "write", today's behaviour.
|
|
395
395
|
//
|
|
396
|
-
// Enforced by withholding tools at spawn, never by asking the model
|
|
396
|
+
// Enforced by withholding tools at spawn, never by asking the model - and a
|
|
397
397
|
// provider that can't enforce it refuses the node at compile time rather
|
|
398
398
|
// than running it with full access. Open string vocabulary; known values in
|
|
399
399
|
// WORKSPACE_ACCESS_LEVELS (protocol/agent-types).
|
|
400
400
|
access: z.string().optional(),
|
|
401
401
|
// Per-node Otto tool allowlist, by group (see OTTO_TOOL_GROUPS). Absent ⇒
|
|
402
402
|
// whatever the node's tool policy already allows. Present ⇒ only these
|
|
403
|
-
// groups, intersected with that policy and the daemon-wide allowlist
|
|
403
|
+
// groups, intersected with that policy and the daemon-wide allowlist - a
|
|
404
404
|
// node can narrow its own authority, never widen it.
|
|
405
405
|
//
|
|
406
406
|
// Narrowing is a cost lever as much as a safety one: the tool catalog is
|
|
@@ -413,7 +413,7 @@ export const GraphNodeSchema = z
|
|
|
413
413
|
// quality iteration: a loop re-runs work that succeeded but wasn't good
|
|
414
414
|
// enough; a retry re-runs work that never completed. Retry wraps the whole
|
|
415
415
|
// node including its loop, and every attempt is charged to the run's agent
|
|
416
|
-
// cap
|
|
416
|
+
// cap - a retry is never a private allowance.
|
|
417
417
|
retry: GraphNodeRetrySchema.optional(),
|
|
418
418
|
// Wall-clock ceiling for one attempt of this node. On expiry the agent is
|
|
419
419
|
// really cancelled (not merely stopped being awaited) and the node fails,
|
|
@@ -433,7 +433,7 @@ export const GraphEdgeConditionSchema = z
|
|
|
433
433
|
})
|
|
434
434
|
.passthrough();
|
|
435
435
|
// A directed edge: `from`'s final output becomes labeled input material for
|
|
436
|
-
// `to`. Fan-in is an all-inputs barrier held by the daemon
|
|
436
|
+
// `to`. Fan-in is an all-inputs barrier held by the daemon - agents never know
|
|
437
437
|
// about waiting.
|
|
438
438
|
export const GraphEdgeSchema = z
|
|
439
439
|
.object({
|
|
@@ -455,7 +455,7 @@ export const GraphEdgeSchema = z
|
|
|
455
455
|
// always delivers, which is every edge today.
|
|
456
456
|
//
|
|
457
457
|
// The condition lives on the edge rather than inside a node so the branch
|
|
458
|
-
// is visible as a labelled wire
|
|
458
|
+
// is visible as a labelled wire - the graph shows its own control flow.
|
|
459
459
|
when: GraphEdgeConditionSchema.optional(),
|
|
460
460
|
// Which of the upstream node's output fields this edge carries. Absent ⇒
|
|
461
461
|
// all of them. Selection only, never renaming: downstream is a prompt, not
|
|
@@ -520,7 +520,7 @@ function validateGraphEdges(graph, nodeIds) {
|
|
|
520
520
|
if (edge.from === edge.to)
|
|
521
521
|
problems.push(`Node "${edge.from}" connects to itself.`);
|
|
522
522
|
// Edges INTO the orchestrator are passive answer-delivery, not execution
|
|
523
|
-
// dependencies
|
|
523
|
+
// dependencies - excluding them here keeps "root kicks off A, A delivers
|
|
524
524
|
// back to root" from reading as a cycle.
|
|
525
525
|
if (edge.to === rootId)
|
|
526
526
|
continue;
|
|
@@ -535,7 +535,7 @@ function validateGraphEdges(graph, nodeIds) {
|
|
|
535
535
|
/**
|
|
536
536
|
* Advisory findings: things that are almost certainly authoring mistakes but
|
|
537
537
|
* leave the graph executable. Separate from `validateOrchestrationGraph`
|
|
538
|
-
* because that one is the daemon's hard gate
|
|
538
|
+
* because that one is the daemon's hard gate - anything it returns stops a run,
|
|
539
539
|
* and none of these should.
|
|
540
540
|
*
|
|
541
541
|
* Expression *syntax* is not checked here: the JSONata parser is daemon-side,
|
|
@@ -549,7 +549,7 @@ export function reviewOrchestrationGraph(graph) {
|
|
|
549
549
|
}
|
|
550
550
|
const source = graph.nodes.find((node) => node.id === edge.from);
|
|
551
551
|
if (source && !source.output?.fields?.length) {
|
|
552
|
-
warnings.push(`The edge from "${source.title}" has a condition, but "${source.title}" declares no output fields
|
|
552
|
+
warnings.push(`The edge from "${source.title}" has a condition, but "${source.title}" declares no output fields - the condition can only test its prose as \`output\`.`);
|
|
553
553
|
}
|
|
554
554
|
}
|
|
555
555
|
return warnings;
|
|
@@ -580,7 +580,7 @@ function validateGraphNode(node, declaredInputs) {
|
|
|
580
580
|
return []; // unknown kinds pass through
|
|
581
581
|
const problems = [];
|
|
582
582
|
// Autonomous nodes may feed results onward via edges; what they must not
|
|
583
|
-
// do is orchestrate deterministic children
|
|
583
|
+
// do is orchestrate deterministic children - which edges don't express, so
|
|
584
584
|
// autonomy is allowed on any node except the root.
|
|
585
585
|
if (node.autonomous && isRoot) {
|
|
586
586
|
problems.push("The Orchestrator node can't be autonomous.");
|
|
@@ -626,7 +626,7 @@ function validateGraphNodeLoop(node) {
|
|
|
626
626
|
return [`Node "${node.title}" has a loop with neither "times" nor "until".`];
|
|
627
627
|
}
|
|
628
628
|
if (node.loop.times !== undefined && node.loop.until !== undefined) {
|
|
629
|
-
return [`Node "${node.title}" has both loop forms
|
|
629
|
+
return [`Node "${node.title}" has both loop forms - pick "times" or "until".`];
|
|
630
630
|
}
|
|
631
631
|
return [];
|
|
632
632
|
}
|
|
@@ -1,4 +1,9 @@
|
|
|
1
1
|
import { z } from "zod";
|
|
2
|
+
export declare const OttoServicePortAllocationSchema: z.ZodObject<{
|
|
3
|
+
range: z.ZodOptional<z.ZodString>;
|
|
4
|
+
portScript: z.ZodOptional<z.ZodString>;
|
|
5
|
+
}, z.core.$strict>;
|
|
6
|
+
export type OttoServicePortAllocation = z.infer<typeof OttoServicePortAllocationSchema>;
|
|
2
7
|
export declare function normalizeLifecycleCommands(commands: unknown): string[];
|
|
3
8
|
export declare const OttoLifecycleCommandRawSchema: z.ZodUnion<readonly [z.ZodString, z.ZodArray<z.ZodString>]>;
|
|
4
9
|
export declare const OttoScriptEntryRawSchema: z.ZodObject<{
|
|
@@ -10,6 +15,10 @@ export declare const OttoWorktreeConfigRawSchema: z.ZodObject<{
|
|
|
10
15
|
setup: z.ZodOptional<z.ZodUnion<readonly [z.ZodString, z.ZodArray<z.ZodString>]>>;
|
|
11
16
|
teardown: z.ZodOptional<z.ZodUnion<readonly [z.ZodString, z.ZodArray<z.ZodString>]>>;
|
|
12
17
|
terminals: z.ZodOptional<z.ZodUnknown>;
|
|
18
|
+
servicePorts: z.ZodOptional<z.ZodObject<{
|
|
19
|
+
range: z.ZodOptional<z.ZodString>;
|
|
20
|
+
portScript: z.ZodOptional<z.ZodString>;
|
|
21
|
+
}, z.core.$strict>>;
|
|
13
22
|
}, z.core.$loose>;
|
|
14
23
|
export declare const OttoMetadataGenerationEntrySchema: z.ZodCatch<z.ZodObject<{
|
|
15
24
|
instructions: z.ZodOptional<z.ZodString>;
|
|
@@ -42,6 +51,10 @@ export declare const OttoConfigRawSchema: z.ZodObject<{
|
|
|
42
51
|
setup: z.ZodOptional<z.ZodUnion<readonly [z.ZodString, z.ZodArray<z.ZodString>]>>;
|
|
43
52
|
teardown: z.ZodOptional<z.ZodUnion<readonly [z.ZodString, z.ZodArray<z.ZodString>]>>;
|
|
44
53
|
terminals: z.ZodOptional<z.ZodUnknown>;
|
|
54
|
+
servicePorts: z.ZodOptional<z.ZodObject<{
|
|
55
|
+
range: z.ZodOptional<z.ZodString>;
|
|
56
|
+
portScript: z.ZodOptional<z.ZodString>;
|
|
57
|
+
}, z.core.$strict>>;
|
|
45
58
|
}, z.core.$loose>>;
|
|
46
59
|
scripts: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodObject<{
|
|
47
60
|
type: z.ZodOptional<z.ZodUnknown>;
|
|
@@ -68,6 +81,10 @@ export declare const OttoConfigRawSchema: z.ZodObject<{
|
|
|
68
81
|
}, z.core.$loose>;
|
|
69
82
|
export declare const WorktreeConfigSchema: z.ZodCatch<z.ZodObject<{
|
|
70
83
|
terminals: z.ZodOptional<z.ZodUnknown>;
|
|
84
|
+
servicePorts: z.ZodOptional<z.ZodObject<{
|
|
85
|
+
range: z.ZodOptional<z.ZodString>;
|
|
86
|
+
portScript: z.ZodOptional<z.ZodString>;
|
|
87
|
+
}, z.core.$strict>>;
|
|
71
88
|
setup: z.ZodPipe<z.ZodOptional<z.ZodUnknown>, z.ZodTransform<string[], unknown>>;
|
|
72
89
|
teardown: z.ZodPipe<z.ZodOptional<z.ZodUnknown>, z.ZodTransform<string[], unknown>>;
|
|
73
90
|
}, z.core.$loose>>;
|
|
@@ -79,6 +96,10 @@ export declare const ScriptEntrySchema: z.ZodCatch<z.ZodObject<{
|
|
|
79
96
|
export declare const OttoConfigSchema: z.ZodCatch<z.ZodObject<{
|
|
80
97
|
worktree: z.ZodOptional<z.ZodCatch<z.ZodObject<{
|
|
81
98
|
terminals: z.ZodOptional<z.ZodUnknown>;
|
|
99
|
+
servicePorts: z.ZodOptional<z.ZodObject<{
|
|
100
|
+
range: z.ZodOptional<z.ZodString>;
|
|
101
|
+
portScript: z.ZodOptional<z.ZodString>;
|
|
102
|
+
}, z.core.$strict>>;
|
|
82
103
|
setup: z.ZodPipe<z.ZodOptional<z.ZodUnknown>, z.ZodTransform<string[], unknown>>;
|
|
83
104
|
teardown: z.ZodPipe<z.ZodOptional<z.ZodUnknown>, z.ZodTransform<string[], unknown>>;
|
|
84
105
|
}, z.core.$loose>>>;
|
|
@@ -1,5 +1,26 @@
|
|
|
1
1
|
import { z } from "zod";
|
|
2
2
|
import { GitHostingProviderIdSchema } from "./git-hosting.js";
|
|
3
|
+
const TCP_PORT_RANGE_PATTERN = /^(\d{1,5})-(\d{1,5})$/;
|
|
4
|
+
// Declared ahead of OttoWorktreeConfigRawSchema because that schema references
|
|
5
|
+
// it: a zod schema is a value, so a later `const` would be in its temporal dead
|
|
6
|
+
// zone at module-evaluation time.
|
|
7
|
+
export const OttoServicePortAllocationSchema = z
|
|
8
|
+
.object({
|
|
9
|
+
range: z.string().trim().regex(TCP_PORT_RANGE_PATTERN).optional(),
|
|
10
|
+
portScript: z.string().trim().min(1).optional(),
|
|
11
|
+
})
|
|
12
|
+
.strict()
|
|
13
|
+
.refine((value) => value.range !== undefined || value.portScript !== undefined, "Expected range or portScript")
|
|
14
|
+
.refine((value) => {
|
|
15
|
+
if (!value.range)
|
|
16
|
+
return true;
|
|
17
|
+
const match = TCP_PORT_RANGE_PATTERN.exec(value.range);
|
|
18
|
+
if (!match)
|
|
19
|
+
return false;
|
|
20
|
+
const start = Number(match[1]);
|
|
21
|
+
const end = Number(match[2]);
|
|
22
|
+
return start >= 1 && end <= 65535 && start <= end;
|
|
23
|
+
}, "Expected an inclusive TCP port range from 1-65535");
|
|
3
24
|
export function normalizeLifecycleCommands(commands) {
|
|
4
25
|
if (typeof commands === "string") {
|
|
5
26
|
return commands.trim().length > 0 ? [commands] : [];
|
|
@@ -24,6 +45,7 @@ export const OttoWorktreeConfigRawSchema = z
|
|
|
24
45
|
setup: OttoLifecycleCommandRawSchema.optional(),
|
|
25
46
|
teardown: OttoLifecycleCommandRawSchema.optional(),
|
|
26
47
|
terminals: z.unknown().optional(),
|
|
48
|
+
servicePorts: OttoServicePortAllocationSchema.optional(),
|
|
27
49
|
})
|
|
28
50
|
.passthrough();
|
|
29
51
|
export const OttoMetadataGenerationEntrySchema = z
|
|
@@ -44,7 +66,7 @@ export const OttoMetadataGenerationSchema = z
|
|
|
44
66
|
.passthrough()
|
|
45
67
|
.catch({});
|
|
46
68
|
// Which git hosting provider this project's PR/issue features use. Committed
|
|
47
|
-
// with the repo (team-shared); credentials never live here
|
|
69
|
+
// with the repo (team-shared); credentials never live here - they belong to
|
|
48
70
|
// the daemon's private config, keyed by project.
|
|
49
71
|
export const OttoGitHostingConfigRawSchema = z
|
|
50
72
|
.object({
|
|
@@ -38,7 +38,7 @@ export declare const ProviderProfileModelSchema: z.ZodObject<{
|
|
|
38
38
|
* Coarse categories for Otto's agent-facing tool catalog. Providers that receive
|
|
39
39
|
* Otto tools natively (see the openai-compat provider) can be scoped to a subset
|
|
40
40
|
* of these groups; omitting the selection means all groups. Kept deliberately
|
|
41
|
-
* coarse
|
|
41
|
+
* coarse - users pick groups, not individual tools.
|
|
42
42
|
*/
|
|
43
43
|
export declare const OTTO_TOOL_GROUPS: readonly ["preview", "browser", "web", "agents", "terminals", "schedules", "artifacts", "widgets", "workspace"];
|
|
44
44
|
export type OttoToolGroup = (typeof OTTO_TOOL_GROUPS)[number];
|
|
@@ -51,7 +51,7 @@ export declare function ottoToolGroupForName(name: string): OttoToolGroup;
|
|
|
51
51
|
/**
|
|
52
52
|
* Canonical MCP server config. Shared by AgentSessionConfig (per-agent servers
|
|
53
53
|
* sent at create time) and ProviderOverride (provider-level servers in the
|
|
54
|
-
* daemon config). stdio entries execute arbitrary commands as the daemon user
|
|
54
|
+
* daemon config). stdio entries execute arbitrary commands as the daemon user -
|
|
55
55
|
* both sources sit behind existing trust boundaries (daemon-side config file,
|
|
56
56
|
* authenticated agent-create RPC).
|
|
57
57
|
*/
|
|
@@ -72,6 +72,58 @@ export declare const McpServerConfigSchema: z.ZodDiscriminatedUnion<[z.ZodObject
|
|
|
72
72
|
headers: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodString>>;
|
|
73
73
|
alwaysLoad: z.ZodOptional<z.ZodBoolean>;
|
|
74
74
|
}, z.core.$strip>], "type">;
|
|
75
|
+
/**
|
|
76
|
+
* OAuth tokens held for a connector whose MCP server authenticates over OAuth
|
|
77
|
+
* 2.1 (the "log in, don't paste a token" path). Mirrors the SDK's OAuthTokens
|
|
78
|
+
* shape. Secret-bearing, so it is host-owned like every other credential in
|
|
79
|
+
* daemon config and is redacted before the config is sent to a client.
|
|
80
|
+
*
|
|
81
|
+
* `expiresAt` is absolute epoch MILLISECONDS, not the `expires_in` duration the
|
|
82
|
+
* token endpoint returns: a duration is only meaningful next to the instant it
|
|
83
|
+
* was issued, and that instant is not on the wire.
|
|
84
|
+
*/
|
|
85
|
+
export declare const ConnectorOAuthTokensSchema: z.ZodObject<{
|
|
86
|
+
accessToken: z.ZodString;
|
|
87
|
+
tokenType: z.ZodOptional<z.ZodString>;
|
|
88
|
+
refreshToken: z.ZodOptional<z.ZodString>;
|
|
89
|
+
scope: z.ZodOptional<z.ZodString>;
|
|
90
|
+
expiresAt: z.ZodOptional<z.ZodNumber>;
|
|
91
|
+
}, z.core.$strip>;
|
|
92
|
+
/**
|
|
93
|
+
* The OAuth client identity this daemon registered with a connector's
|
|
94
|
+
* authorization server, kept so a second login reuses the registration instead
|
|
95
|
+
* of re-running dynamic client registration. Keyed alongside the redirect URI it
|
|
96
|
+
* was registered against: if the loopback port moves, the registration is stale
|
|
97
|
+
* and must be redone.
|
|
98
|
+
*/
|
|
99
|
+
export declare const ConnectorOAuthClientSchema: z.ZodObject<{
|
|
100
|
+
clientId: z.ZodString;
|
|
101
|
+
clientSecret: z.ZodOptional<z.ZodString>;
|
|
102
|
+
redirectUri: z.ZodString;
|
|
103
|
+
}, z.core.$strip>;
|
|
104
|
+
/**
|
|
105
|
+
* Everything the daemon persists about a connector's authorization. Absent means
|
|
106
|
+
* the connector either needs no credential or carries a static token in its
|
|
107
|
+
* transport (env var for stdio, Authorization header for http/sse) - this block
|
|
108
|
+
* is only for the interactive OAuth path.
|
|
109
|
+
*/
|
|
110
|
+
export declare const ConnectorAuthStateSchema: z.ZodObject<{
|
|
111
|
+
kind: z.ZodLiteral<"oauth">;
|
|
112
|
+
tokens: z.ZodOptional<z.ZodObject<{
|
|
113
|
+
accessToken: z.ZodString;
|
|
114
|
+
tokenType: z.ZodOptional<z.ZodString>;
|
|
115
|
+
refreshToken: z.ZodOptional<z.ZodString>;
|
|
116
|
+
scope: z.ZodOptional<z.ZodString>;
|
|
117
|
+
expiresAt: z.ZodOptional<z.ZodNumber>;
|
|
118
|
+
}, z.core.$strip>>;
|
|
119
|
+
client: z.ZodOptional<z.ZodObject<{
|
|
120
|
+
clientId: z.ZodString;
|
|
121
|
+
clientSecret: z.ZodOptional<z.ZodString>;
|
|
122
|
+
redirectUri: z.ZodString;
|
|
123
|
+
}, z.core.$strip>>;
|
|
124
|
+
account: z.ZodOptional<z.ZodString>;
|
|
125
|
+
authorizedAt: z.ZodOptional<z.ZodNumber>;
|
|
126
|
+
}, z.core.$strip>;
|
|
75
127
|
/**
|
|
76
128
|
* Per-workspace state for a connector, keyed by workspace cwd in
|
|
77
129
|
* ConnectorConfig.workspaces. Phase 1 leaves this inert (the daemon does not
|
|
@@ -112,6 +164,23 @@ export declare const ConnectorConfigSchema: z.ZodObject<{
|
|
|
112
164
|
}, z.core.$strip>], "type">;
|
|
113
165
|
enabled: z.ZodOptional<z.ZodBoolean>;
|
|
114
166
|
disabledTools: z.ZodOptional<z.ZodArray<z.ZodString>>;
|
|
167
|
+
auth: z.ZodOptional<z.ZodObject<{
|
|
168
|
+
kind: z.ZodLiteral<"oauth">;
|
|
169
|
+
tokens: z.ZodOptional<z.ZodObject<{
|
|
170
|
+
accessToken: z.ZodString;
|
|
171
|
+
tokenType: z.ZodOptional<z.ZodString>;
|
|
172
|
+
refreshToken: z.ZodOptional<z.ZodString>;
|
|
173
|
+
scope: z.ZodOptional<z.ZodString>;
|
|
174
|
+
expiresAt: z.ZodOptional<z.ZodNumber>;
|
|
175
|
+
}, z.core.$strip>>;
|
|
176
|
+
client: z.ZodOptional<z.ZodObject<{
|
|
177
|
+
clientId: z.ZodString;
|
|
178
|
+
clientSecret: z.ZodOptional<z.ZodString>;
|
|
179
|
+
redirectUri: z.ZodString;
|
|
180
|
+
}, z.core.$strip>>;
|
|
181
|
+
account: z.ZodOptional<z.ZodString>;
|
|
182
|
+
authorizedAt: z.ZodOptional<z.ZodNumber>;
|
|
183
|
+
}, z.core.$strip>>;
|
|
115
184
|
workspaces: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodObject<{
|
|
116
185
|
enabled: z.ZodOptional<z.ZodBoolean>;
|
|
117
186
|
}, z.core.$strip>>>;
|
|
@@ -144,6 +213,23 @@ export declare const ConnectorsConfigSchema: z.ZodObject<{
|
|
|
144
213
|
}, z.core.$strip>], "type">;
|
|
145
214
|
enabled: z.ZodOptional<z.ZodBoolean>;
|
|
146
215
|
disabledTools: z.ZodOptional<z.ZodArray<z.ZodString>>;
|
|
216
|
+
auth: z.ZodOptional<z.ZodObject<{
|
|
217
|
+
kind: z.ZodLiteral<"oauth">;
|
|
218
|
+
tokens: z.ZodOptional<z.ZodObject<{
|
|
219
|
+
accessToken: z.ZodString;
|
|
220
|
+
tokenType: z.ZodOptional<z.ZodString>;
|
|
221
|
+
refreshToken: z.ZodOptional<z.ZodString>;
|
|
222
|
+
scope: z.ZodOptional<z.ZodString>;
|
|
223
|
+
expiresAt: z.ZodOptional<z.ZodNumber>;
|
|
224
|
+
}, z.core.$strip>>;
|
|
225
|
+
client: z.ZodOptional<z.ZodObject<{
|
|
226
|
+
clientId: z.ZodString;
|
|
227
|
+
clientSecret: z.ZodOptional<z.ZodString>;
|
|
228
|
+
redirectUri: z.ZodString;
|
|
229
|
+
}, z.core.$strip>>;
|
|
230
|
+
account: z.ZodOptional<z.ZodString>;
|
|
231
|
+
authorizedAt: z.ZodOptional<z.ZodNumber>;
|
|
232
|
+
}, z.core.$strip>>;
|
|
147
233
|
workspaces: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodObject<{
|
|
148
234
|
enabled: z.ZodOptional<z.ZodBoolean>;
|
|
149
235
|
}, z.core.$strip>>>;
|
|
@@ -167,7 +253,7 @@ export declare const COMPACTION_THRESHOLD_PERCENTS: readonly [50, 60, 70, 80, 90
|
|
|
167
253
|
/**
|
|
168
254
|
* Max model→tool→model rounds per turn for providers whose tool loop the
|
|
169
255
|
* daemon owns (openai-compat). The turn stops with an error after this many
|
|
170
|
-
* rounds without a final answer
|
|
256
|
+
* rounds without a final answer - a runaway-loop safety valve, most often hit
|
|
171
257
|
* by smaller local models that keep calling tools instead of converging.
|
|
172
258
|
* Bounds keep the setting a sane guard rail rather than an off switch.
|
|
173
259
|
*/
|
|
@@ -348,6 +434,9 @@ export declare const AgentProviderRuntimeSettingsMapSchema: z.ZodRecord<z.ZodStr
|
|
|
348
434
|
disallowedTools: z.ZodOptional<z.ZodArray<z.ZodString>>;
|
|
349
435
|
}, z.core.$strip>>;
|
|
350
436
|
export type McpServerConfig = z.infer<typeof McpServerConfigSchema>;
|
|
437
|
+
export type ConnectorOAuthTokens = z.infer<typeof ConnectorOAuthTokensSchema>;
|
|
438
|
+
export type ConnectorOAuthClient = z.infer<typeof ConnectorOAuthClientSchema>;
|
|
439
|
+
export type ConnectorAuthState = z.infer<typeof ConnectorAuthStateSchema>;
|
|
351
440
|
export type ConnectorWorkspaceState = z.infer<typeof ConnectorWorkspaceStateSchema>;
|
|
352
441
|
export type ConnectorConfig = z.infer<typeof ConnectorConfigSchema>;
|
|
353
442
|
export type ConnectorsConfig = z.infer<typeof ConnectorsConfigSchema>;
|