@otto-code/protocol 0.8.12 → 0.8.13

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 (37) hide show
  1. package/dist/agent-labels.d.ts +3 -0
  2. package/dist/agent-labels.js +10 -0
  3. package/dist/agent-personalities.d.ts +4 -3
  4. package/dist/agent-personalities.js +13 -20
  5. package/dist/agent-types.d.ts +24 -4
  6. package/dist/binary-frames/terminal.d.ts +4 -0
  7. package/dist/binary-frames/terminal.js +1 -0
  8. package/dist/brain.d.ts +91 -0
  9. package/dist/brain.js +19 -1
  10. package/dist/chat/rpc-schemas.js +1 -0
  11. package/dist/chat/types.js +1 -0
  12. package/dist/client-capabilities.d.ts +1 -0
  13. package/dist/client-capabilities.js +4 -0
  14. package/dist/daemon-config.d.ts +6 -0
  15. package/dist/daemon-config.js +6 -0
  16. package/dist/generated/validation/ws-outbound.aot.js +64093 -60274
  17. package/dist/loop/rpc-schemas.js +1 -0
  18. package/dist/messages.d.ts +3546 -422
  19. package/dist/messages.js +445 -13
  20. package/dist/provider-manifest.js +7 -0
  21. package/dist/provider-snapshot-codec.d.ts +18 -0
  22. package/dist/provider-snapshot-codec.js +71 -0
  23. package/dist/schedule/rpc-schemas.d.ts +8 -64
  24. package/dist/schedule/types.d.ts +3 -24
  25. package/dist/schedule/types.js +1 -11
  26. package/dist/search/text-match.d.ts +55 -0
  27. package/dist/search/text-match.js +262 -0
  28. package/dist/suggested-tasks.js +1 -1
  29. package/dist/terminal-input-mode.d.ts +4 -0
  30. package/dist/terminal-input-mode.js +35 -6
  31. package/dist/terminal-key-input.js +15 -6
  32. package/dist/terminal-profiles.d.ts +35 -0
  33. package/dist/terminal-profiles.js +246 -4
  34. package/dist/tool-call-display.d.ts +2 -2
  35. package/dist/tool-call-display.js +6 -6
  36. package/dist/validation/ws-outbound-schema-metadata.d.ts +587 -77
  37. package/package.json +1 -1
@@ -1,4 +1,6 @@
1
1
  export declare const PARENT_AGENT_ID_LABEL = "otto.parent-agent-id";
2
+ export declare function getOpenAgentTabLabel(clientId: string): string;
3
+ export declare function isOpenAgentTabLabel(label: string): boolean;
2
4
  export interface AgentLabelSource {
3
5
  labels?: Record<string, unknown> | null;
4
6
  }
@@ -30,4 +32,5 @@ export interface OrchestrationQueryToolLabel {
30
32
  path?: string;
31
33
  }
32
34
  export declare function getQueryToolsFromLabels(labels: Record<string, unknown> | null | undefined): OrchestrationQueryToolLabel[] | null;
35
+ export declare function hasOpenAgentTab(labels: Record<string, unknown> | null | undefined): boolean;
33
36
  //# sourceMappingURL=agent-labels.d.ts.map
@@ -1,4 +1,11 @@
1
1
  export const PARENT_AGENT_ID_LABEL = "otto.parent-agent-id";
2
+ const OPEN_AGENT_TAB_LABEL_PREFIX = "otto.open-agent-tab.";
3
+ export function getOpenAgentTabLabel(clientId) {
4
+ return `${OPEN_AGENT_TAB_LABEL_PREFIX}${clientId}`;
5
+ }
6
+ export function isOpenAgentTabLabel(label) {
7
+ return label.startsWith(OPEN_AGENT_TAB_LABEL_PREFIX);
8
+ }
2
9
  export function getParentAgentIdFromLabels(labels) {
3
10
  const parentAgentId = labels?.[PARENT_AGENT_ID_LABEL];
4
11
  return typeof parentAgentId === "string" && parentAgentId.trim().length > 0
@@ -90,4 +97,7 @@ function parseJsonArrayLabel(labels, key, isValid) {
90
97
  });
91
98
  return entries.length > 0 ? entries : null;
92
99
  }
100
+ export function hasOpenAgentTab(labels) {
101
+ return Object.entries(labels ?? {}).some(([label, value]) => isOpenAgentTabLabel(label) && value === "true");
102
+ }
93
103
  //# sourceMappingURL=agent-labels.js.map
@@ -3,8 +3,8 @@ export declare function isPersonalityRole(value: string): value is PersonalityRo
3
3
  /**
4
4
  * Filter an arbitrary role array (roles ride the wire as plain strings) down to
5
5
  * the known set, deduped and returned in canonical `PERSONALITY_ROLES` order.
6
- * Retired role names are mapped through `LEGACY_ROLE_ALIASES`; anything else
7
- * unknown (e.g. a role from a newer peer) is dropped rather than trusted.
6
+ * Unknown roles (for example, a role from a newer peer) are dropped rather
7
+ * than trusted.
8
8
  */
9
9
  export declare function normalizePersonalityRoles(roles: readonly string[] | undefined): PersonalityRole[];
10
10
  export declare function personalityHasRole(personality: Pick<AgentPersonality, "roles">, role: PersonalityRole): boolean;
@@ -34,11 +34,12 @@ export interface PersonalitySelectionSummary {
34
34
  * deciding agent can pick the right teammate from the list alone.
35
35
  */
36
36
  export declare function summarizePersonalityForSelection(personality: Pick<AgentPersonality, "roles">): PersonalitySelectionSummary;
37
+ export declare const OTTO_WORK_VOCABULARY_DIRECTIVE = "Otto work vocabulary: a suggested task is deferred work for the user and does not start work; a chat is an active Otto chat session; a child chat is created by another chat; a personality profile is a reusable provider, model, mode, effort, and behavior template; an orchestration coordinates multiple chats; a schedule starts a background chat when due; a heartbeat sends a reminder or prompt and does not start a chat. Use suggest_task for concrete work to preserve for later, create_chat to start one chat now, and start_orchestration only for managed multi-chat coordination. Use list_personalities, optionally filtered by roles, before choosing a personality profile. Never substitute a harness-native agent-spawn tool for suggest_task, and when a user names an Otto tool exactly, use that exact Otto tool.";
37
38
  export declare const ORCHESTRATOR_METHOD_DIRECTIVE: string;
38
39
  /**
39
40
  * The in-context "role directive" injected into a personality's system prompt at
40
41
  * spawn. The orchestrator gets the full conductor method; other coordinators
41
- * (chatter/artificer/scheduler) get a lighter delegate nudge; focused workers
42
+ * (chatter/artificer/scheduler) get a lighter delegate nudge; focused personalities
42
43
  * are told to stay on the task someone is waiting on. Roleless spawns get
43
44
  * nothing. This is guidance, not a gate - the tools stay available either way.
44
45
  */
@@ -4,22 +4,14 @@ import { PERSONALITY_ROLES } from "./messages.js";
4
4
  // resolution is NOT here - it needs the model's advertised thinking options and
5
5
  // lives with the daemon's effort resolver; availability does not depend on it.
6
6
  const ROLE_SET = new Set(PERSONALITY_ROLES);
7
- // Retired role names, mapped to their canonical replacement. "worker" was split
8
- // into "writer" (fast small-text generation) and "coder" (sub-agent coding); a
9
- // personality that still carries the old tag resolves to "coder", the closer
10
- // heir of what a worker did. Normalization applies these before filtering so
11
- // personalities persisted before the split keep a real role.
12
- const LEGACY_ROLE_ALIASES = {
13
- worker: "coder",
14
- };
15
7
  export function isPersonalityRole(value) {
16
8
  return ROLE_SET.has(value);
17
9
  }
18
10
  /**
19
11
  * Filter an arbitrary role array (roles ride the wire as plain strings) down to
20
12
  * the known set, deduped and returned in canonical `PERSONALITY_ROLES` order.
21
- * Retired role names are mapped through `LEGACY_ROLE_ALIASES`; anything else
22
- * unknown (e.g. a role from a newer peer) is dropped rather than trusted.
13
+ * Unknown roles (for example, a role from a newer peer) are dropped rather
14
+ * than trusted.
23
15
  */
24
16
  export function normalizePersonalityRoles(roles) {
25
17
  if (!roles || roles.length === 0) {
@@ -27,7 +19,7 @@ export function normalizePersonalityRoles(roles) {
27
19
  }
28
20
  const present = new Set();
29
21
  for (const raw of roles) {
30
- const canonical = LEGACY_ROLE_ALIASES[raw] ?? (isPersonalityRole(raw) ? raw : null);
22
+ const canonical = isPersonalityRole(raw) ? raw : null;
31
23
  if (canonical) {
32
24
  present.add(canonical);
33
25
  }
@@ -51,7 +43,7 @@ export const PERSONALITY_ROLE_INFO = {
51
43
  tier: "coordinator",
52
44
  guidance: "Creates and manages schedules; may orchestrate recurring or multi-step jobs. Pick for scheduling.",
53
45
  },
54
- // ── Thinking workers (read-only, structured findings) ─────────────────────
46
+ // ── Thinking specialists (read-only, structured findings) ────────────────
55
47
  researcher: {
56
48
  tier: "focused",
57
49
  guidance: "Read-only surveyor - maps the code or domain and reports files, types, patterns, and gotchas. Pick to gather facts; proposes no solutions and edits nothing.",
@@ -68,7 +60,7 @@ export const PERSONALITY_ROLE_INFO = {
68
60
  tier: "focused",
69
61
  guidance: "Read-only second opinion - weighs the trade-offs and returns one recommendation. Pick for advice; never edits and does not fan out.",
70
62
  },
71
- // ── Making workers (produce code, design, or text) ────────────────────────
63
+ // ── Making specialists (produce code, design, or text) ───────────────────
72
64
  coder: {
73
65
  tier: "focused",
74
66
  guidance: "Focused implementer - writes code for one sub-task others are waiting on. Pick to get a coding job done; stays on task.",
@@ -84,7 +76,7 @@ export const PERSONALITY_ROLE_INFO = {
84
76
  // ── Conductor ─────────────────────────────────────────────────────────────
85
77
  orchestrator: {
86
78
  tier: "coordinator",
87
- guidance: "The sole conductor - plans team-shaped work, dispatches typed tasks to the right teammates, gathers, and synthesizes. Pick to run a multi-agent workflow.",
79
+ guidance: "The sole conductor - plans team-shaped work, dispatches typed tasks to the right teammates, gathers, and synthesizes. Pick to coordinate a multi-chat workflow.",
88
80
  },
89
81
  };
90
82
  /**
@@ -113,17 +105,18 @@ export function summarizePersonalityForSelection(personality) {
113
105
  }
114
106
  // The conductor's standing directive - the distilled `/epic` method taught to
115
107
  // the sole orchestrator role at spawn. It chooses direct work, a dedicated
116
- // worker, a follow-up task, or a Run by the task's actual needs rather than
108
+ // chat, a suggested task, or an orchestration by the task's actual needs rather than
117
109
  // treating orchestration as the default. Kept here as one exported constant so
118
110
  // the wording is testable and shared. See projects/agent-orchestration/agent-orchestration.md.
111
+ export const OTTO_WORK_VOCABULARY_DIRECTIVE = "Otto work vocabulary: a suggested task is deferred work for the user and does not start work; a chat is an active Otto chat session; a child chat is created by another chat; a personality profile is a reusable provider, model, mode, effort, and behavior template; an orchestration coordinates multiple chats; a schedule starts a background chat when due; a heartbeat sends a reminder or prompt and does not start a chat. Use suggest_task for concrete work to preserve for later, create_chat to start one chat now, and start_orchestration only for managed multi-chat coordination. Use list_personalities, optionally filtered by roles, before choosing a personality profile. Never substitute a harness-native agent-spawn tool for suggest_task, and when a user names an Otto tool exactly, use that exact Otto tool.";
119
112
  export const ORCHESTRATOR_METHOD_DIRECTIVE = "You are the orchestrator - the team's sole conductor. Choose tools because the task needs their specific capability, never because a tool is available or named. " +
120
- "Do a small, self-contained task directly. Use create_agent only for an independently executable piece of active work that benefits from a dedicated worker. Use spawn_task only to preserve a concrete, out-of-scope follow-up for later. Use start_run only when the active work needs a declared multi-agent plan with daemon-managed fan-out, gathering, judging, loops, or approval gates. " +
121
- "For work that genuinely needs orchestration: (1) if the shape is unclear, dispatch a researcher to survey and a planner to draft a typed plan; (2) declare that plan as a Run with start_run - phases typed research/plan/implement/design/verify/gate/deliver, fanning out candidates where several angles help and attaching a judger to grade them, looping until enough pass; (3) put a gate before irreversible or costly steps so the user approves; (4) synthesize the passing results into the deliverable. " +
113
+ "Do a small, self-contained task directly. Use create_chat only for an independently executable piece of active work that benefits from its own chat. Use suggest_task only to preserve a concrete, out-of-scope follow-up for later. Use start_orchestration only when the active work needs a declared multi-chat plan with daemon-managed fan-out, gathering, judging, loops, or approval gates. " +
114
+ "For work that genuinely needs orchestration: (1) if the shape is unclear, dispatch research and planning chats; (2) declare the plan with start_orchestration - phases typed research/plan/implement/design/verify/gate/deliver, fanning out where several angles help and attaching a judger to grade them, looping until enough pass; (3) put a gate before irreversible or costly steps so the user approves; (4) synthesize the passing results into the deliverable. " +
122
115
  "Every phase maps to a teammate's role; if the active team lacks a role a phase needs, say so plainly and stop rather than papering over the gap.";
123
116
  /**
124
117
  * The in-context "role directive" injected into a personality's system prompt at
125
118
  * spawn. The orchestrator gets the full conductor method; other coordinators
126
- * (chatter/artificer/scheduler) get a lighter delegate nudge; focused workers
119
+ * (chatter/artificer/scheduler) get a lighter delegate nudge; focused personalities
127
120
  * are told to stay on the task someone is waiting on. Roleless spawns get
128
121
  * nothing. This is guidance, not a gate - the tools stay available either way.
129
122
  */
@@ -137,9 +130,9 @@ export function composeRoleFocusDirective(roles) {
137
130
  return `${ORCHESTRATOR_METHOD_DIRECTIVE} (Your roles: ${roleList}.)`;
138
131
  }
139
132
  if (normalized.some((role) => PERSONALITY_ROLE_INFO[role].tier === "coordinator")) {
140
- return `You are a coordinator personality (roles: ${roleList}). You front interactive work and may delegate when the task benefits from it: use list_personalities to see who else is available, then either do the work directly, spawn a dedicated worker for an independent active piece, or hand off genuinely multi-agent work to the team's orchestrator.`;
133
+ return `You are a coordinator personality (roles: ${roleList}). You front interactive work and may delegate when the task benefits from it: use list_personalities to see who else is available, then either do the work directly, create a child chat for an independent active piece, or hand off genuinely multi-chat work to the team's orchestrator.`;
141
134
  }
142
- return `You are a focused worker personality (roles: ${roleList}). Someone is waiting on this specific task - stay on it and finish it. You can still call list_personalities to see the roster, but don't spawn sub-agents or start side workflows unless it is genuinely essential to completing this job.`;
135
+ return `You are a focused personality (roles: ${roleList}). Someone is waiting on this specific task - stay on it and finish it. You can still call list_personalities to see the roster, but don't create child chats or start side workflows unless it is genuinely essential to completing this job.`;
143
136
  }
144
137
  /**
145
138
  * Decide whether a personality is usable against a provider's current snapshot.
@@ -77,6 +77,8 @@ export type ModelTier = "deep" | "standard" | "fast";
77
77
  export interface AgentModelDefinition {
78
78
  provider: AgentProvider;
79
79
  id: string;
80
+ aliases?: string[];
81
+ isSelectable?: boolean;
80
82
  label: string;
81
83
  description?: string;
82
84
  /** Catalog-owned model-family identity, currently emitted by Otto Brain only. */
@@ -372,6 +374,13 @@ export interface CompactionTimelineItem {
372
374
  preTokens?: number;
373
375
  postTokens?: number;
374
376
  }
377
+ export interface AgentTaskItem {
378
+ text: string;
379
+ completed: boolean;
380
+ id?: string;
381
+ status?: "pending" | "in_progress" | "completed";
382
+ activeForm?: string;
383
+ }
375
384
  export type AgentTimelineItem = {
376
385
  type: "user_message";
377
386
  text: string;
@@ -386,10 +395,7 @@ export type AgentTimelineItem = {
386
395
  text: string;
387
396
  } | ToolCallTimelineItem | {
388
397
  type: "todo";
389
- items: {
390
- text: string;
391
- completed: boolean;
392
- }[];
398
+ items: AgentTaskItem[];
393
399
  } | {
394
400
  type: "error";
395
401
  message: string;
@@ -581,6 +587,18 @@ export interface AgentRunResult {
581
587
  export declare const WORKSPACE_ACCESS_LEVELS: readonly ["none", "read", "write"];
582
588
  export type WorkspaceAccess = (typeof WORKSPACE_ACCESS_LEVELS)[number];
583
589
  export declare function isWorkspaceAccess(value: unknown): value is WorkspaceAccess;
590
+ export type JsonValue = null | boolean | number | string | JsonValue[] | {
591
+ [key: string]: JsonValue;
592
+ };
593
+ export type ProviderOptions = Record<string, JsonValue>;
594
+ export interface McpToolRef {
595
+ kind: "mcp";
596
+ server: string;
597
+ tool: string;
598
+ }
599
+ export interface ToolPolicy {
600
+ preapproved: McpToolRef[];
601
+ }
584
602
  export interface AgentSessionConfig {
585
603
  provider: AgentProvider;
586
604
  cwd: string;
@@ -609,6 +627,8 @@ export interface AgentSessionConfig {
609
627
  codex?: AgentMetadata;
610
628
  claude?: AgentMetadata;
611
629
  };
630
+ providerOptions?: ProviderOptions;
631
+ toolPolicy?: ToolPolicy;
612
632
  mcpServers?: Record<string, McpServerConfig>;
613
633
  /**
614
634
  * Internal agents are hidden from listings and don't trigger notifications.
@@ -3,6 +3,10 @@ import { TerminalStateSchema } from "../messages.js";
3
3
  export declare const TerminalStreamResizeSchema: z.ZodObject<{
4
4
  rows: z.ZodNumber;
5
5
  cols: z.ZodNumber;
6
+ intent: z.ZodOptional<z.ZodEnum<{
7
+ claim: "claim";
8
+ update: "update";
9
+ }>>;
6
10
  }, z.core.$strip>;
7
11
  export declare const TerminalStreamOpcode: {
8
12
  readonly Output: 1;
@@ -3,6 +3,7 @@ import { TerminalStateSchema } from "../messages.js";
3
3
  export const TerminalStreamResizeSchema = z.object({
4
4
  rows: z.number().int().positive(),
5
5
  cols: z.number().int().positive(),
6
+ intent: z.enum(["claim", "update"]).optional(),
6
7
  });
7
8
  export const TerminalStreamOpcode = {
8
9
  Output: 0x01,
package/dist/brain.d.ts CHANGED
@@ -95,12 +95,14 @@ export declare const BrainCapabilitiesSchema: z.ZodObject<{
95
95
  writable: z.ZodDefault<z.ZodBoolean>;
96
96
  jobs: z.ZodDefault<z.ZodBoolean>;
97
97
  restart: z.ZodDefault<z.ZodBoolean>;
98
+ processPool: z.ZodDefault<z.ZodBoolean>;
98
99
  }, z.core.$loose>;
99
100
  export type BrainCapabilities = z.infer<typeof BrainCapabilitiesSchema>;
100
101
  export declare const BrainHostStatusSchema: z.ZodObject<{
101
102
  running: z.ZodBoolean;
102
103
  pid: z.ZodOptional<z.ZodNullable<z.ZodNumber>>;
103
104
  version: z.ZodOptional<z.ZodNullable<z.ZodString>>;
105
+ runtime: z.ZodOptional<z.ZodNullable<z.ZodString>>;
104
106
  apiVersion: z.ZodOptional<z.ZodNullable<z.ZodNumber>>;
105
107
  host: z.ZodOptional<z.ZodNullable<z.ZodString>>;
106
108
  port: z.ZodOptional<z.ZodNullable<z.ZodNumber>>;
@@ -109,6 +111,14 @@ export declare const BrainHostStatusSchema: z.ZodObject<{
109
111
  state: z.ZodOptional<z.ZodNullable<z.ZodString>>;
110
112
  model: z.ZodOptional<z.ZodNullable<z.ZodString>>;
111
113
  modelId: z.ZodOptional<z.ZodNullable<z.ZodString>>;
114
+ residents: z.ZodOptional<z.ZodArray<z.ZodObject<{
115
+ state: z.ZodString;
116
+ model: z.ZodOptional<z.ZodNullable<z.ZodString>>;
117
+ modelId: z.ZodOptional<z.ZodNullable<z.ZodString>>;
118
+ pid: z.ZodOptional<z.ZodNullable<z.ZodNumber>>;
119
+ upstream: z.ZodOptional<z.ZodNullable<z.ZodString>>;
120
+ vramBytes: z.ZodOptional<z.ZodNullable<z.ZodNumber>>;
121
+ }, z.core.$loose>>>;
112
122
  vramBytes: z.ZodOptional<z.ZodNullable<z.ZodNumber>>;
113
123
  loadSeconds: z.ZodOptional<z.ZodNullable<z.ZodNumber>>;
114
124
  startedAt: z.ZodOptional<z.ZodNullable<z.ZodString>>;
@@ -130,6 +140,7 @@ export declare const BrainHostStatusSchema: z.ZodObject<{
130
140
  writable: z.ZodDefault<z.ZodBoolean>;
131
141
  jobs: z.ZodDefault<z.ZodBoolean>;
132
142
  restart: z.ZodDefault<z.ZodBoolean>;
143
+ processPool: z.ZodDefault<z.ZodBoolean>;
133
144
  }, z.core.$loose>>>;
134
145
  resources: z.ZodOptional<z.ZodNullable<z.ZodRecord<z.ZodString, z.ZodUnknown>>>;
135
146
  logLineCount: z.ZodOptional<z.ZodNullable<z.ZodNumber>>;
@@ -173,6 +184,7 @@ export declare const BrainHostStatusResultSchema: z.ZodObject<{
173
184
  running: z.ZodBoolean;
174
185
  pid: z.ZodOptional<z.ZodNullable<z.ZodNumber>>;
175
186
  version: z.ZodOptional<z.ZodNullable<z.ZodString>>;
187
+ runtime: z.ZodOptional<z.ZodNullable<z.ZodString>>;
176
188
  apiVersion: z.ZodOptional<z.ZodNullable<z.ZodNumber>>;
177
189
  host: z.ZodOptional<z.ZodNullable<z.ZodString>>;
178
190
  port: z.ZodOptional<z.ZodNullable<z.ZodNumber>>;
@@ -181,6 +193,14 @@ export declare const BrainHostStatusResultSchema: z.ZodObject<{
181
193
  state: z.ZodOptional<z.ZodNullable<z.ZodString>>;
182
194
  model: z.ZodOptional<z.ZodNullable<z.ZodString>>;
183
195
  modelId: z.ZodOptional<z.ZodNullable<z.ZodString>>;
196
+ residents: z.ZodOptional<z.ZodArray<z.ZodObject<{
197
+ state: z.ZodString;
198
+ model: z.ZodOptional<z.ZodNullable<z.ZodString>>;
199
+ modelId: z.ZodOptional<z.ZodNullable<z.ZodString>>;
200
+ pid: z.ZodOptional<z.ZodNullable<z.ZodNumber>>;
201
+ upstream: z.ZodOptional<z.ZodNullable<z.ZodString>>;
202
+ vramBytes: z.ZodOptional<z.ZodNullable<z.ZodNumber>>;
203
+ }, z.core.$loose>>>;
184
204
  vramBytes: z.ZodOptional<z.ZodNullable<z.ZodNumber>>;
185
205
  loadSeconds: z.ZodOptional<z.ZodNullable<z.ZodNumber>>;
186
206
  startedAt: z.ZodOptional<z.ZodNullable<z.ZodString>>;
@@ -202,6 +222,7 @@ export declare const BrainHostStatusResultSchema: z.ZodObject<{
202
222
  writable: z.ZodDefault<z.ZodBoolean>;
203
223
  jobs: z.ZodDefault<z.ZodBoolean>;
204
224
  restart: z.ZodDefault<z.ZodBoolean>;
225
+ processPool: z.ZodDefault<z.ZodBoolean>;
205
226
  }, z.core.$loose>>>;
206
227
  resources: z.ZodOptional<z.ZodNullable<z.ZodRecord<z.ZodString, z.ZodUnknown>>>;
207
228
  logLineCount: z.ZodOptional<z.ZodNullable<z.ZodNumber>>;
@@ -254,6 +275,7 @@ export declare const BrainHostStatusResponseSchema: z.ZodObject<{
254
275
  running: z.ZodBoolean;
255
276
  pid: z.ZodOptional<z.ZodNullable<z.ZodNumber>>;
256
277
  version: z.ZodOptional<z.ZodNullable<z.ZodString>>;
278
+ runtime: z.ZodOptional<z.ZodNullable<z.ZodString>>;
257
279
  apiVersion: z.ZodOptional<z.ZodNullable<z.ZodNumber>>;
258
280
  host: z.ZodOptional<z.ZodNullable<z.ZodString>>;
259
281
  port: z.ZodOptional<z.ZodNullable<z.ZodNumber>>;
@@ -262,6 +284,14 @@ export declare const BrainHostStatusResponseSchema: z.ZodObject<{
262
284
  state: z.ZodOptional<z.ZodNullable<z.ZodString>>;
263
285
  model: z.ZodOptional<z.ZodNullable<z.ZodString>>;
264
286
  modelId: z.ZodOptional<z.ZodNullable<z.ZodString>>;
287
+ residents: z.ZodOptional<z.ZodArray<z.ZodObject<{
288
+ state: z.ZodString;
289
+ model: z.ZodOptional<z.ZodNullable<z.ZodString>>;
290
+ modelId: z.ZodOptional<z.ZodNullable<z.ZodString>>;
291
+ pid: z.ZodOptional<z.ZodNullable<z.ZodNumber>>;
292
+ upstream: z.ZodOptional<z.ZodNullable<z.ZodString>>;
293
+ vramBytes: z.ZodOptional<z.ZodNullable<z.ZodNumber>>;
294
+ }, z.core.$loose>>>;
265
295
  vramBytes: z.ZodOptional<z.ZodNullable<z.ZodNumber>>;
266
296
  loadSeconds: z.ZodOptional<z.ZodNullable<z.ZodNumber>>;
267
297
  startedAt: z.ZodOptional<z.ZodNullable<z.ZodString>>;
@@ -283,6 +313,7 @@ export declare const BrainHostStatusResponseSchema: z.ZodObject<{
283
313
  writable: z.ZodDefault<z.ZodBoolean>;
284
314
  jobs: z.ZodDefault<z.ZodBoolean>;
285
315
  restart: z.ZodDefault<z.ZodBoolean>;
316
+ processPool: z.ZodDefault<z.ZodBoolean>;
286
317
  }, z.core.$loose>>>;
287
318
  resources: z.ZodOptional<z.ZodNullable<z.ZodRecord<z.ZodString, z.ZodUnknown>>>;
288
319
  logLineCount: z.ZodOptional<z.ZodNullable<z.ZodNumber>>;
@@ -336,6 +367,7 @@ export declare const BrainHostStartResponseSchema: z.ZodObject<{
336
367
  running: z.ZodBoolean;
337
368
  pid: z.ZodOptional<z.ZodNullable<z.ZodNumber>>;
338
369
  version: z.ZodOptional<z.ZodNullable<z.ZodString>>;
370
+ runtime: z.ZodOptional<z.ZodNullable<z.ZodString>>;
339
371
  apiVersion: z.ZodOptional<z.ZodNullable<z.ZodNumber>>;
340
372
  host: z.ZodOptional<z.ZodNullable<z.ZodString>>;
341
373
  port: z.ZodOptional<z.ZodNullable<z.ZodNumber>>;
@@ -344,6 +376,14 @@ export declare const BrainHostStartResponseSchema: z.ZodObject<{
344
376
  state: z.ZodOptional<z.ZodNullable<z.ZodString>>;
345
377
  model: z.ZodOptional<z.ZodNullable<z.ZodString>>;
346
378
  modelId: z.ZodOptional<z.ZodNullable<z.ZodString>>;
379
+ residents: z.ZodOptional<z.ZodArray<z.ZodObject<{
380
+ state: z.ZodString;
381
+ model: z.ZodOptional<z.ZodNullable<z.ZodString>>;
382
+ modelId: z.ZodOptional<z.ZodNullable<z.ZodString>>;
383
+ pid: z.ZodOptional<z.ZodNullable<z.ZodNumber>>;
384
+ upstream: z.ZodOptional<z.ZodNullable<z.ZodString>>;
385
+ vramBytes: z.ZodOptional<z.ZodNullable<z.ZodNumber>>;
386
+ }, z.core.$loose>>>;
347
387
  vramBytes: z.ZodOptional<z.ZodNullable<z.ZodNumber>>;
348
388
  loadSeconds: z.ZodOptional<z.ZodNullable<z.ZodNumber>>;
349
389
  startedAt: z.ZodOptional<z.ZodNullable<z.ZodString>>;
@@ -365,6 +405,7 @@ export declare const BrainHostStartResponseSchema: z.ZodObject<{
365
405
  writable: z.ZodDefault<z.ZodBoolean>;
366
406
  jobs: z.ZodDefault<z.ZodBoolean>;
367
407
  restart: z.ZodDefault<z.ZodBoolean>;
408
+ processPool: z.ZodDefault<z.ZodBoolean>;
368
409
  }, z.core.$loose>>>;
369
410
  resources: z.ZodOptional<z.ZodNullable<z.ZodRecord<z.ZodString, z.ZodUnknown>>>;
370
411
  logLineCount: z.ZodOptional<z.ZodNullable<z.ZodNumber>>;
@@ -417,6 +458,7 @@ export declare const BrainHostStopResponseSchema: z.ZodObject<{
417
458
  running: z.ZodBoolean;
418
459
  pid: z.ZodOptional<z.ZodNullable<z.ZodNumber>>;
419
460
  version: z.ZodOptional<z.ZodNullable<z.ZodString>>;
461
+ runtime: z.ZodOptional<z.ZodNullable<z.ZodString>>;
420
462
  apiVersion: z.ZodOptional<z.ZodNullable<z.ZodNumber>>;
421
463
  host: z.ZodOptional<z.ZodNullable<z.ZodString>>;
422
464
  port: z.ZodOptional<z.ZodNullable<z.ZodNumber>>;
@@ -425,6 +467,14 @@ export declare const BrainHostStopResponseSchema: z.ZodObject<{
425
467
  state: z.ZodOptional<z.ZodNullable<z.ZodString>>;
426
468
  model: z.ZodOptional<z.ZodNullable<z.ZodString>>;
427
469
  modelId: z.ZodOptional<z.ZodNullable<z.ZodString>>;
470
+ residents: z.ZodOptional<z.ZodArray<z.ZodObject<{
471
+ state: z.ZodString;
472
+ model: z.ZodOptional<z.ZodNullable<z.ZodString>>;
473
+ modelId: z.ZodOptional<z.ZodNullable<z.ZodString>>;
474
+ pid: z.ZodOptional<z.ZodNullable<z.ZodNumber>>;
475
+ upstream: z.ZodOptional<z.ZodNullable<z.ZodString>>;
476
+ vramBytes: z.ZodOptional<z.ZodNullable<z.ZodNumber>>;
477
+ }, z.core.$loose>>>;
428
478
  vramBytes: z.ZodOptional<z.ZodNullable<z.ZodNumber>>;
429
479
  loadSeconds: z.ZodOptional<z.ZodNullable<z.ZodNumber>>;
430
480
  startedAt: z.ZodOptional<z.ZodNullable<z.ZodString>>;
@@ -446,6 +496,7 @@ export declare const BrainHostStopResponseSchema: z.ZodObject<{
446
496
  writable: z.ZodDefault<z.ZodBoolean>;
447
497
  jobs: z.ZodDefault<z.ZodBoolean>;
448
498
  restart: z.ZodDefault<z.ZodBoolean>;
499
+ processPool: z.ZodDefault<z.ZodBoolean>;
449
500
  }, z.core.$loose>>>;
450
501
  resources: z.ZodOptional<z.ZodNullable<z.ZodRecord<z.ZodString, z.ZodUnknown>>>;
451
502
  logLineCount: z.ZodOptional<z.ZodNullable<z.ZodNumber>>;
@@ -499,6 +550,7 @@ export declare const BrainHostRestartResponseSchema: z.ZodObject<{
499
550
  running: z.ZodBoolean;
500
551
  pid: z.ZodOptional<z.ZodNullable<z.ZodNumber>>;
501
552
  version: z.ZodOptional<z.ZodNullable<z.ZodString>>;
553
+ runtime: z.ZodOptional<z.ZodNullable<z.ZodString>>;
502
554
  apiVersion: z.ZodOptional<z.ZodNullable<z.ZodNumber>>;
503
555
  host: z.ZodOptional<z.ZodNullable<z.ZodString>>;
504
556
  port: z.ZodOptional<z.ZodNullable<z.ZodNumber>>;
@@ -507,6 +559,14 @@ export declare const BrainHostRestartResponseSchema: z.ZodObject<{
507
559
  state: z.ZodOptional<z.ZodNullable<z.ZodString>>;
508
560
  model: z.ZodOptional<z.ZodNullable<z.ZodString>>;
509
561
  modelId: z.ZodOptional<z.ZodNullable<z.ZodString>>;
562
+ residents: z.ZodOptional<z.ZodArray<z.ZodObject<{
563
+ state: z.ZodString;
564
+ model: z.ZodOptional<z.ZodNullable<z.ZodString>>;
565
+ modelId: z.ZodOptional<z.ZodNullable<z.ZodString>>;
566
+ pid: z.ZodOptional<z.ZodNullable<z.ZodNumber>>;
567
+ upstream: z.ZodOptional<z.ZodNullable<z.ZodString>>;
568
+ vramBytes: z.ZodOptional<z.ZodNullable<z.ZodNumber>>;
569
+ }, z.core.$loose>>>;
510
570
  vramBytes: z.ZodOptional<z.ZodNullable<z.ZodNumber>>;
511
571
  loadSeconds: z.ZodOptional<z.ZodNullable<z.ZodNumber>>;
512
572
  startedAt: z.ZodOptional<z.ZodNullable<z.ZodString>>;
@@ -528,6 +588,7 @@ export declare const BrainHostRestartResponseSchema: z.ZodObject<{
528
588
  writable: z.ZodDefault<z.ZodBoolean>;
529
589
  jobs: z.ZodDefault<z.ZodBoolean>;
530
590
  restart: z.ZodDefault<z.ZodBoolean>;
591
+ processPool: z.ZodDefault<z.ZodBoolean>;
531
592
  }, z.core.$loose>>>;
532
593
  resources: z.ZodOptional<z.ZodNullable<z.ZodRecord<z.ZodString, z.ZodUnknown>>>;
533
594
  logLineCount: z.ZodOptional<z.ZodNullable<z.ZodNumber>>;
@@ -1886,6 +1947,7 @@ export declare const BrainModelLoadResponseSchema: z.ZodObject<{
1886
1947
  running: z.ZodBoolean;
1887
1948
  pid: z.ZodOptional<z.ZodNullable<z.ZodNumber>>;
1888
1949
  version: z.ZodOptional<z.ZodNullable<z.ZodString>>;
1950
+ runtime: z.ZodOptional<z.ZodNullable<z.ZodString>>;
1889
1951
  apiVersion: z.ZodOptional<z.ZodNullable<z.ZodNumber>>;
1890
1952
  host: z.ZodOptional<z.ZodNullable<z.ZodString>>;
1891
1953
  port: z.ZodOptional<z.ZodNullable<z.ZodNumber>>;
@@ -1894,6 +1956,14 @@ export declare const BrainModelLoadResponseSchema: z.ZodObject<{
1894
1956
  state: z.ZodOptional<z.ZodNullable<z.ZodString>>;
1895
1957
  model: z.ZodOptional<z.ZodNullable<z.ZodString>>;
1896
1958
  modelId: z.ZodOptional<z.ZodNullable<z.ZodString>>;
1959
+ residents: z.ZodOptional<z.ZodArray<z.ZodObject<{
1960
+ state: z.ZodString;
1961
+ model: z.ZodOptional<z.ZodNullable<z.ZodString>>;
1962
+ modelId: z.ZodOptional<z.ZodNullable<z.ZodString>>;
1963
+ pid: z.ZodOptional<z.ZodNullable<z.ZodNumber>>;
1964
+ upstream: z.ZodOptional<z.ZodNullable<z.ZodString>>;
1965
+ vramBytes: z.ZodOptional<z.ZodNullable<z.ZodNumber>>;
1966
+ }, z.core.$loose>>>;
1897
1967
  vramBytes: z.ZodOptional<z.ZodNullable<z.ZodNumber>>;
1898
1968
  loadSeconds: z.ZodOptional<z.ZodNullable<z.ZodNumber>>;
1899
1969
  startedAt: z.ZodOptional<z.ZodNullable<z.ZodString>>;
@@ -1915,6 +1985,7 @@ export declare const BrainModelLoadResponseSchema: z.ZodObject<{
1915
1985
  writable: z.ZodDefault<z.ZodBoolean>;
1916
1986
  jobs: z.ZodDefault<z.ZodBoolean>;
1917
1987
  restart: z.ZodDefault<z.ZodBoolean>;
1988
+ processPool: z.ZodDefault<z.ZodBoolean>;
1918
1989
  }, z.core.$loose>>>;
1919
1990
  resources: z.ZodOptional<z.ZodNullable<z.ZodRecord<z.ZodString, z.ZodUnknown>>>;
1920
1991
  logLineCount: z.ZodOptional<z.ZodNullable<z.ZodNumber>>;
@@ -1994,6 +2065,7 @@ export declare const BrainModelUnloadResponseSchema: z.ZodObject<{
1994
2065
  running: z.ZodBoolean;
1995
2066
  pid: z.ZodOptional<z.ZodNullable<z.ZodNumber>>;
1996
2067
  version: z.ZodOptional<z.ZodNullable<z.ZodString>>;
2068
+ runtime: z.ZodOptional<z.ZodNullable<z.ZodString>>;
1997
2069
  apiVersion: z.ZodOptional<z.ZodNullable<z.ZodNumber>>;
1998
2070
  host: z.ZodOptional<z.ZodNullable<z.ZodString>>;
1999
2071
  port: z.ZodOptional<z.ZodNullable<z.ZodNumber>>;
@@ -2002,6 +2074,14 @@ export declare const BrainModelUnloadResponseSchema: z.ZodObject<{
2002
2074
  state: z.ZodOptional<z.ZodNullable<z.ZodString>>;
2003
2075
  model: z.ZodOptional<z.ZodNullable<z.ZodString>>;
2004
2076
  modelId: z.ZodOptional<z.ZodNullable<z.ZodString>>;
2077
+ residents: z.ZodOptional<z.ZodArray<z.ZodObject<{
2078
+ state: z.ZodString;
2079
+ model: z.ZodOptional<z.ZodNullable<z.ZodString>>;
2080
+ modelId: z.ZodOptional<z.ZodNullable<z.ZodString>>;
2081
+ pid: z.ZodOptional<z.ZodNullable<z.ZodNumber>>;
2082
+ upstream: z.ZodOptional<z.ZodNullable<z.ZodString>>;
2083
+ vramBytes: z.ZodOptional<z.ZodNullable<z.ZodNumber>>;
2084
+ }, z.core.$loose>>>;
2005
2085
  vramBytes: z.ZodOptional<z.ZodNullable<z.ZodNumber>>;
2006
2086
  loadSeconds: z.ZodOptional<z.ZodNullable<z.ZodNumber>>;
2007
2087
  startedAt: z.ZodOptional<z.ZodNullable<z.ZodString>>;
@@ -2023,6 +2103,7 @@ export declare const BrainModelUnloadResponseSchema: z.ZodObject<{
2023
2103
  writable: z.ZodDefault<z.ZodBoolean>;
2024
2104
  jobs: z.ZodDefault<z.ZodBoolean>;
2025
2105
  restart: z.ZodDefault<z.ZodBoolean>;
2106
+ processPool: z.ZodDefault<z.ZodBoolean>;
2026
2107
  }, z.core.$loose>>>;
2027
2108
  resources: z.ZodOptional<z.ZodNullable<z.ZodRecord<z.ZodString, z.ZodUnknown>>>;
2028
2109
  logLineCount: z.ZodOptional<z.ZodNullable<z.ZodNumber>>;
@@ -2180,6 +2261,7 @@ export declare const BrainStatusChangedStatusPayloadSchema: z.ZodObject<{
2180
2261
  running: z.ZodBoolean;
2181
2262
  pid: z.ZodOptional<z.ZodNullable<z.ZodNumber>>;
2182
2263
  version: z.ZodOptional<z.ZodNullable<z.ZodString>>;
2264
+ runtime: z.ZodOptional<z.ZodNullable<z.ZodString>>;
2183
2265
  apiVersion: z.ZodOptional<z.ZodNullable<z.ZodNumber>>;
2184
2266
  host: z.ZodOptional<z.ZodNullable<z.ZodString>>;
2185
2267
  port: z.ZodOptional<z.ZodNullable<z.ZodNumber>>;
@@ -2188,6 +2270,14 @@ export declare const BrainStatusChangedStatusPayloadSchema: z.ZodObject<{
2188
2270
  state: z.ZodOptional<z.ZodNullable<z.ZodString>>;
2189
2271
  model: z.ZodOptional<z.ZodNullable<z.ZodString>>;
2190
2272
  modelId: z.ZodOptional<z.ZodNullable<z.ZodString>>;
2273
+ residents: z.ZodOptional<z.ZodArray<z.ZodObject<{
2274
+ state: z.ZodString;
2275
+ model: z.ZodOptional<z.ZodNullable<z.ZodString>>;
2276
+ modelId: z.ZodOptional<z.ZodNullable<z.ZodString>>;
2277
+ pid: z.ZodOptional<z.ZodNullable<z.ZodNumber>>;
2278
+ upstream: z.ZodOptional<z.ZodNullable<z.ZodString>>;
2279
+ vramBytes: z.ZodOptional<z.ZodNullable<z.ZodNumber>>;
2280
+ }, z.core.$loose>>>;
2191
2281
  vramBytes: z.ZodOptional<z.ZodNullable<z.ZodNumber>>;
2192
2282
  loadSeconds: z.ZodOptional<z.ZodNullable<z.ZodNumber>>;
2193
2283
  startedAt: z.ZodOptional<z.ZodNullable<z.ZodString>>;
@@ -2209,6 +2299,7 @@ export declare const BrainStatusChangedStatusPayloadSchema: z.ZodObject<{
2209
2299
  writable: z.ZodDefault<z.ZodBoolean>;
2210
2300
  jobs: z.ZodDefault<z.ZodBoolean>;
2211
2301
  restart: z.ZodDefault<z.ZodBoolean>;
2302
+ processPool: z.ZodDefault<z.ZodBoolean>;
2212
2303
  }, z.core.$loose>>>;
2213
2304
  resources: z.ZodOptional<z.ZodNullable<z.ZodRecord<z.ZodString, z.ZodUnknown>>>;
2214
2305
  logLineCount: z.ZodOptional<z.ZodNullable<z.ZodNumber>>;
package/dist/brain.js CHANGED
@@ -143,6 +143,8 @@ export const BrainCapabilitiesSchema = z
143
143
  jobs: z.boolean().default(false),
144
144
  /** The brain can ask its owning daemon to restart it. */
145
145
  restart: z.boolean().default(false),
146
+ /** The host can keep multiple independently supervised model processes resident. */
147
+ processPool: z.boolean().default(false),
146
148
  })
147
149
  .passthrough();
148
150
  // The brain's host status, as the daemon derives it: liveness plus the fields
@@ -153,6 +155,8 @@ export const BrainHostStatusSchema = z
153
155
  running: z.boolean(),
154
156
  pid: z.number().nullable().optional(),
155
157
  version: z.string().nullable().optional(),
158
+ /** The llama.cpp runtime resolved by the Brain host, or "not installed". */
159
+ runtime: z.string().nullable().optional(),
156
160
  /**
157
161
  * Which generation of the brain's management contract the far side speaks.
158
162
  *
@@ -168,6 +172,19 @@ export const BrainHostStatusSchema = z
168
172
  state: z.string().nullable().optional(),
169
173
  model: z.string().nullable().optional(),
170
174
  modelId: z.string().nullable().optional(),
175
+ /** Every independently hosted resident model process. */
176
+ residents: z
177
+ .array(z
178
+ .object({
179
+ state: z.string(),
180
+ model: z.string().nullable().optional(),
181
+ modelId: z.string().nullable().optional(),
182
+ pid: z.number().nullable().optional(),
183
+ upstream: z.string().nullable().optional(),
184
+ vramBytes: z.number().nullable().optional(),
185
+ })
186
+ .passthrough())
187
+ .optional(),
171
188
  vramBytes: z.number().nullable().optional(),
172
189
  loadSeconds: z.number().nullable().optional(),
173
190
  startedAt: z.string().nullable().optional(),
@@ -380,7 +397,8 @@ export const BrainModelsListResponseSchema = z.object({
380
397
  });
381
398
  // Read/write a *remote* brain's own config (its /__host/config). Only valid in
382
399
  // brain.mode "remote"; the config is the remote brain's effective config with
383
- // secrets redacted. Editable fields are model-related (defaultModel, lockModel);
400
+ // secrets redacted. Editable fields are model-related (defaultModel,
401
+ // maxLoadedModels, lockedModels, lockModel);
384
402
  // network/TLS/auth stay host-owned. Gated by features.brainRemote.
385
403
  export const BrainRemoteConfigSchema = z.record(z.string(), z.unknown());
386
404
  export const BrainRemoteConfigGetRequestSchema = z.object({
@@ -1,5 +1,6 @@
1
1
  import { z } from "zod";
2
2
  import { ChatMessageSchema, ChatRoomDetailSchema } from "./types.js";
3
+ // COMPAT(chatRooms): retained after the v0.3.0 feature removal; remove after 2027-02-09 when mixed-version peers no longer send legacy messages.
3
4
  export const ChatCreateRequestSchema = z.object({
4
5
  type: z.literal("chat/create"),
5
6
  requestId: z.string(),
@@ -1,4 +1,5 @@
1
1
  import { z } from "zod";
2
+ // COMPAT(chatRooms): retained after the v0.3.0 feature removal; remove after 2027-02-09 when mixed-version peers no longer send legacy messages.
2
3
  export const ChatRoomSchema = z.object({
3
4
  id: z.string(),
4
5
  name: z.string(),
@@ -7,6 +7,7 @@ export declare const CLIENT_CAPS: {
7
7
  readonly projectUpdates: "project_updates";
8
8
  readonly communicationsPresenceUpdates: "communications_presence_updates";
9
9
  readonly brainLogWatch: "brain_log_watch";
10
+ readonly compactProviderSnapshots: "compact_provider_snapshots";
10
11
  readonly browserHost: "browser_host";
11
12
  };
12
13
  export type ClientCapability = (typeof CLIENT_CAPS)[keyof typeof CLIENT_CAPS];
@@ -30,6 +30,10 @@ export const CLIENT_CAPS = {
30
30
  // Logs tab opens; a client without it keeps the old unconditional feed,
31
31
  // because it has no way to ask and would otherwise lose live logs entirely.
32
32
  brainLogWatch: "brain_log_watch",
33
+ // COMPAT(compactProviderSnapshots): added in v0.2.X. Capable clients receive
34
+ // provider catalogs with shared thinking sets and may revalidate by content hash.
35
+ // Remove the legacy snapshot encoding after 2027-02-04.
36
+ compactProviderSnapshots: "compact_provider_snapshots",
33
37
  browserHost: "browser_host",
34
38
  };
35
39
  //# sourceMappingURL=client-capabilities.js.map
@@ -222,6 +222,8 @@ export declare const MutableBrainConfigSchema: z.ZodObject<{
222
222
  port: z.ZodDefault<z.ZodNumber>;
223
223
  }, z.core.$loose>>;
224
224
  defaultModel: z.ZodDefault<z.ZodNullable<z.ZodString>>;
225
+ maxLoadedModels: z.ZodDefault<z.ZodNumber>;
226
+ lockedModels: z.ZodDefault<z.ZodArray<z.ZodString>>;
225
227
  runtime: z.ZodDefault<z.ZodObject<{
226
228
  source: z.ZodDefault<z.ZodEnum<{
227
229
  auto: "auto";
@@ -297,6 +299,8 @@ export declare const MutableBrainConfigPatchSchema: z.ZodObject<{
297
299
  port: z.ZodOptional<z.ZodNumber>;
298
300
  }, z.core.$loose>>;
299
301
  defaultModel: z.ZodOptional<z.ZodNullable<z.ZodString>>;
302
+ maxLoadedModels: z.ZodOptional<z.ZodNumber>;
303
+ lockedModels: z.ZodOptional<z.ZodArray<z.ZodString>>;
300
304
  runtime: z.ZodOptional<z.ZodObject<{
301
305
  source: z.ZodOptional<z.ZodEnum<{
302
306
  auto: "auto";
@@ -344,6 +348,8 @@ export declare const DEFAULT_MUTABLE_BRAIN_CONFIG: {
344
348
  port: number;
345
349
  };
346
350
  defaultModel: null;
351
+ maxLoadedModels: number;
352
+ lockedModels: never[];
347
353
  runtime: {
348
354
  source: "auto";
349
355
  path: null;