@otto-code/protocol 0.5.1 → 0.5.2

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/messages.js CHANGED
@@ -198,6 +198,75 @@ const MutableAgentPersonalitiesConfigSchema = z
198
198
  personalities: z.array(AgentPersonalitySchema).default([]),
199
199
  })
200
200
  .passthrough();
201
+ // Patch shape declared explicitly rather than via .partial(): partial() keeps
202
+ // the personalities .default([]), so a patch touching the section without an
203
+ // explicit personalities array would have an empty array injected and
204
+ // deep-merge would wipe the stored roster.
205
+ const MutableAgentPersonalitiesConfigPatchSchema = z
206
+ .object({
207
+ personalities: z.array(AgentPersonalitySchema).optional(),
208
+ })
209
+ .passthrough();
210
+ // A team's avatar. v1 ships only `color` (hex, validated at the editor like
211
+ // spinner colors); `imageId` is reserved for the future themed avatar set —
212
+ // when present it wins over color, and color stays the fallback so an old
213
+ // client that doesn't know `imageId` keeps rendering the swatch. Plain
214
+ // strings for forward compat.
215
+ const AgentTeamAvatarSchema = z
216
+ .object({
217
+ color: z.string().min(1).optional(),
218
+ imageId: z.string().min(1).optional(),
219
+ })
220
+ .passthrough();
221
+ // A named, per-host grouping of agent personalities that acts as an operating
222
+ // template: which personalities are on deck, plus a shared team prompt stacked
223
+ // directly ahead of the member's personality prompt at spawn. `id` is the
224
+ // stable identity everything binds to; `name` is a freely-renamable label.
225
+ // `memberIds` bind personality ids (order = display order) — an entry pointing
226
+ // at a deleted personality is tolerated and ignored everywhere, then pruned on
227
+ // the next save of that team. Membership is many-to-many.
228
+ export const AgentTeamSchema = z
229
+ .object({
230
+ id: z.string().min(1),
231
+ name: z.string().min(1),
232
+ avatar: AgentTeamAvatarSchema.optional(),
233
+ teamPrompt: z.string().optional(),
234
+ memberIds: z.array(z.string().min(1)).optional(),
235
+ })
236
+ .passthrough();
237
+ const MutableAgentTeamsConfigSchema = z
238
+ .object({
239
+ teams: z.array(AgentTeamSchema).default([]),
240
+ // The host's active team id; null/absent = no team active (exactly legacy
241
+ // behavior). Host-scoped daemon config rather than device-local: the team
242
+ // prompt is applied daemon-side at spawn, so headless spawns (MCP
243
+ // create_agent, schedule runs) must see it, and a patch from any client
244
+ // hot-reloads the switch to every connected client.
245
+ activeTeamId: z.string().nullable().optional(),
246
+ })
247
+ .passthrough();
248
+ // Patch shape declared explicitly rather than via .partial(): partial() keeps
249
+ // the teams .default([]), so a patch that only touches activeTeamId would have
250
+ // an empty array injected and deep-merge would wipe the stored teams.
251
+ const MutableAgentTeamsConfigPatchSchema = z
252
+ .object({
253
+ teams: z.array(AgentTeamSchema).optional(),
254
+ activeTeamId: z.string().nullable().optional(),
255
+ })
256
+ .passthrough();
257
+ export const ModelTierSchema = z.enum(["deep", "standard", "fast"]);
258
+ // A user's explicit tier tag for one model of one provider. The daemon stamps
259
+ // `model.tier` at ingest, preferring a matching override here over inference
260
+ // (see model-tiers.ts). Stored as an array (not a nested record) so a patch
261
+ // replaces it wholesale — that's how a tag gets cleared, since deep-merge can't
262
+ // delete a record key.
263
+ export const ModelTierOverrideSchema = z
264
+ .object({
265
+ provider: z.string().min(1),
266
+ modelId: z.string().min(1),
267
+ tier: ModelTierSchema,
268
+ })
269
+ .passthrough();
201
270
  export const MutableDaemonConfigSchema = z
202
271
  .object({
203
272
  mcp: z
@@ -220,6 +289,14 @@ export const MutableDaemonConfigSchema = z
220
289
  // feature; defaults to an empty roster so a new client parsing an old
221
290
  // daemon's config still sees a well-formed section.
222
291
  agentPersonalities: MutableAgentPersonalitiesConfigSchema.default({ personalities: [] }),
292
+ // Per-host agent teams + the active team id. Gated by the agentTeams
293
+ // feature; defaults to an empty section so a new client parsing an old
294
+ // daemon's config still sees a well-formed shape.
295
+ agentTeams: MutableAgentTeamsConfigSchema.default({ teams: [] }),
296
+ // Per-host user overrides of model tiers, keyed by provider + model id.
297
+ // Gated by the modelTierOverrides feature; defaults empty so a new client
298
+ // parsing an old daemon's config still sees a well-formed array.
299
+ modelTierOverrides: z.array(ModelTierOverrideSchema).default([]),
223
300
  })
224
301
  .passthrough();
225
302
  export const MutableDaemonConfigPatchSchema = z
@@ -245,7 +322,14 @@ export const MutableDaemonConfigPatchSchema = z
245
322
  // Gated by server_info features.agentPersonalities. A patch replaces the
246
323
  // full roster (read-modify-write the array), matching how terminalProfiles
247
324
  // and metadataGeneration.providers patch.
248
- agentPersonalities: MutableAgentPersonalitiesConfigSchema.partial().optional(),
325
+ agentPersonalities: MutableAgentPersonalitiesConfigPatchSchema.optional(),
326
+ // Gated by server_info features.agentTeams. A `teams` patch replaces the
327
+ // full array (read-modify-write), matching agentPersonalities;
328
+ // `activeTeamId: null` deactivates the team without touching the array.
329
+ agentTeams: MutableAgentTeamsConfigPatchSchema.optional(),
330
+ // Gated by server_info features.modelTierOverrides. Replaces the full array
331
+ // (read-modify-write), so removing an entry clears that model's tag.
332
+ modelTierOverrides: z.array(ModelTierOverrideSchema).optional(),
249
333
  })
250
334
  .partial()
251
335
  .passthrough();
@@ -308,6 +392,12 @@ const AgentModelDefinitionSchema = z.object({
308
392
  contextWindowMaxTokens: z.number().optional(),
309
393
  thinkingOptions: z.array(AgentSelectOptionSchema).optional(),
310
394
  defaultThinkingOptionId: z.string().optional(),
395
+ // Daemon-stamped capability tier (deep/standard/fast). Optional: absent on old
396
+ // daemons and on models neither classified nor user-tagged.
397
+ tier: ModelTierSchema.optional(),
398
+ // False when the model can't run the provider's "auto" permission mode.
399
+ // Optional: absent on old daemons and when supported/unknown.
400
+ supportsAutoMode: z.boolean().optional(),
311
401
  });
312
402
  export const ProviderSnapshotEntrySchema = z.object({
313
403
  provider: AgentProviderSchema,
@@ -693,6 +783,13 @@ export const AgentSnapshotPayloadSchema = z.object({
693
783
  persistence: AgentPersistenceHandleSchema.nullable(),
694
784
  runtimeInfo: AgentRuntimeInfoSchema.optional(),
695
785
  lastUsage: AgentUsageSchema.optional(),
786
+ // Honest cumulative token total (Σ across the whole run) from the provider,
787
+ // for the subagents-track cost readout — the only currency that works for
788
+ // cost-less local models. Observed subagents source it from the provider's
789
+ // per-task usage.total_tokens (already cumulative-per-subagent). Purely
790
+ // additive; absent ⇒ no readout. Old clients ignore it.
791
+ // See projects/subagents-cleanup/subagents-cleanup.md (Item 3).
792
+ cumulativeTokens: z.number().optional(),
696
793
  lastError: z.string().optional(),
697
794
  title: z.string().nullable(),
698
795
  labels: z.record(z.string(), z.string()).default({}),
@@ -2552,6 +2649,10 @@ export const ServerInfoStatusPayloadSchema = z
2552
2649
  checkoutGitRollback: z.boolean().optional(),
2553
2650
  // COMPAT(checkoutGitLog): added in v0.5.1, drop the gate when daemon floor >= v0.5.1.
2554
2651
  checkoutGitLog: z.boolean().optional(),
2652
+ // COMPAT(agentTeams): added in v0.5.2, drop the gate when daemon floor >= v0.5.2.
2653
+ agentTeams: z.boolean().optional(),
2654
+ // COMPAT(modelTierOverrides): added in v0.5.2, drop the gate when daemon floor >= v0.5.2.
2655
+ modelTierOverrides: z.boolean().optional(),
2555
2656
  })
2556
2657
  .optional(),
2557
2658
  })
@@ -3109,6 +3210,11 @@ export const CancelAgentResponseMessageSchema = z.object({
3109
3210
  requestId: z.string(),
3110
3211
  agentId: z.string(),
3111
3212
  agent: AgentSnapshotPayloadSchema.nullable(),
3213
+ // Whether an in-flight run was actually interrupted. False when the agent
3214
+ // had nothing running (already finished, still initializing), so clients
3215
+ // can say "nothing to stop" instead of silently no-oping. Purely additive;
3216
+ // absent ⇒ unknown (old daemon). See projects/subagents-cleanup/subagents-cleanup.md (Item 2).
3217
+ cancelled: z.boolean().optional(),
3112
3218
  }),
3113
3219
  });
3114
3220
  export const ClearAgentAttentionResponseMessageSchema = z.object({
@@ -0,0 +1,34 @@
1
+ /**
2
+ * Model → tier classification, shared by the daemon (stamps `model.tier` at
3
+ * ingest) and the app (reads `model.tier`). Pure and dependency-free — no zod,
4
+ * no I/O.
5
+ *
6
+ * Deliberately NO name-pattern guessing: the official model ids are public
7
+ * record, so we classify what we KNOW (the shipped catalog) and leave everything
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 — the user tags
10
+ * an Unknown model with an override and that's it.
11
+ *
12
+ * Resolution order for a single model:
13
+ * 1. user override (a per-model tag persisted in host config),
14
+ * 2. the shipped catalog of known models,
15
+ * else undefined ("Unknown"). At generation the consumer's context-window
16
+ * heuristic still fills a slot so a team can bind, but that's a last resort, not
17
+ * a claim about the model's tier.
18
+ */
19
+ import type { AgentModelDefinition, ModelTier } from "./agent-types.js";
20
+ export declare const KNOWN_MODEL_TIERS: Readonly<Record<string, ModelTier>>;
21
+ export declare function catalogTier(modelId: string): ModelTier | undefined;
22
+ /**
23
+ * Infer a model's tier from the shipped catalog alone (no guessing). Undefined
24
+ * for models we don't ship an id for — those read as "Unknown" until the user
25
+ * tags one.
26
+ */
27
+ export declare function inferModelTier(model: Pick<AgentModelDefinition, "id">): ModelTier | undefined;
28
+ /**
29
+ * The tier to stamp on a model at ingest: an explicit user override wins,
30
+ * otherwise the catalog. Undefined ("Unknown") leaves the model tier-less until
31
+ * the user tags it; the consumer's generation heuristic still binds a slot.
32
+ */
33
+ export declare function resolveModelTier(model: Pick<AgentModelDefinition, "id">, override: ModelTier | undefined): ModelTier | undefined;
34
+ //# sourceMappingURL=model-tiers.d.ts.map
@@ -0,0 +1,92 @@
1
+ /**
2
+ * Model → tier classification, shared by the daemon (stamps `model.tier` at
3
+ * ingest) and the app (reads `model.tier`). Pure and dependency-free — no zod,
4
+ * no I/O.
5
+ *
6
+ * Deliberately NO name-pattern guessing: the official model ids are public
7
+ * record, so we classify what we KNOW (the shipped catalog) and leave everything
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 — the user tags
10
+ * an Unknown model with an override and that's it.
11
+ *
12
+ * Resolution order for a single model:
13
+ * 1. user override (a per-model tag persisted in host config),
14
+ * 2. the shipped catalog of known models,
15
+ * else undefined ("Unknown"). At generation the consumer's context-window
16
+ * heuristic still fills a slot so a team can bind, but that's a last resort, not
17
+ * a claim about the model's tier.
18
+ */
19
+ // Shipped catalog of known, official model ids (public record). Matched
20
+ // case-insensitively against the exact model id; decorated ids that miss here
21
+ // fall through to patterns.
22
+ export const KNOWN_MODEL_TIERS = {
23
+ // Anthropic (Claude) — the full Claude Code manifest. Tiering rule: 1M-context
24
+ // Opus variants are "deep", non-1M Opus and Sonnet are "standard", Haiku is
25
+ // "fast". Fable (1M, most powerful) is "deep".
26
+ "claude-fable-5": "deep",
27
+ "claude-opus-4-8[1m]": "deep",
28
+ "claude-opus-4-8": "standard",
29
+ "claude-opus-4-7[1m]": "deep",
30
+ "claude-opus-4-7": "standard",
31
+ "claude-opus-4-6[1m]": "deep",
32
+ "claude-opus-4-6": "standard",
33
+ "claude-sonnet-5": "standard",
34
+ "claude-sonnet-4-6[1m]": "standard",
35
+ "claude-sonnet-4-6": "standard",
36
+ "claude-haiku-4-5": "fast",
37
+ "claude-haiku-4-5-20251001": "fast",
38
+ // OpenAI (GPT / o-series)
39
+ "gpt-5": "deep",
40
+ "gpt-5-mini": "fast",
41
+ "gpt-5-nano": "fast",
42
+ o3: "deep",
43
+ "o3-mini": "fast",
44
+ "o4-mini": "fast",
45
+ "gpt-4.1": "standard",
46
+ "gpt-4.1-mini": "fast",
47
+ "gpt-4o": "standard",
48
+ "gpt-4o-mini": "fast",
49
+ // Google (Gemini)
50
+ "gemini-2.5-pro": "deep",
51
+ "gemini-2.5-flash": "fast",
52
+ "gemini-2.5-flash-lite": "fast",
53
+ "gemini-2.0-flash": "fast",
54
+ // DeepSeek
55
+ "deepseek-r1": "deep",
56
+ "deepseek-v3": "deep",
57
+ "deepseek-chat": "standard",
58
+ "deepseek-reasoner": "deep",
59
+ // Alibaba (Qwen) hosted tiers
60
+ "qwen-max": "deep",
61
+ "qwen-plus": "standard",
62
+ "qwen-turbo": "fast",
63
+ // xAI (Grok)
64
+ "grok-4": "deep",
65
+ "grok-3": "deep",
66
+ "grok-3-mini": "fast",
67
+ // Mistral
68
+ "mistral-large-latest": "deep",
69
+ "mistral-large": "deep",
70
+ "mistral-medium": "standard",
71
+ "mistral-small": "fast",
72
+ };
73
+ export function catalogTier(modelId) {
74
+ return KNOWN_MODEL_TIERS[modelId.toLowerCase()];
75
+ }
76
+ /**
77
+ * Infer a model's tier from the shipped catalog alone (no guessing). Undefined
78
+ * for models we don't ship an id for — those read as "Unknown" until the user
79
+ * tags one.
80
+ */
81
+ export function inferModelTier(model) {
82
+ return catalogTier(model.id);
83
+ }
84
+ /**
85
+ * The tier to stamp on a model at ingest: an explicit user override wins,
86
+ * otherwise the catalog. Undefined ("Unknown") leaves the model tier-less until
87
+ * the user tags it; the consumer's generation heuristic still binds a slot.
88
+ */
89
+ export function resolveModelTier(model, override) {
90
+ return override ?? inferModelTier(model);
91
+ }
92
+ //# sourceMappingURL=model-tiers.js.map
@@ -28,6 +28,17 @@ const CLAUDE_MODES = [
28
28
  icon: "LocalPolice",
29
29
  colorTier: "moderate",
30
30
  },
31
+ {
32
+ id: "dontAsk",
33
+ label: "Don't Ask",
34
+ description: "Runs without prompting — actions not pre-approved are denied",
35
+ // Guarded unattended mode: more dangerous than acceptEdits (edits only) but
36
+ // safer than bypass (deny-by-default vs. run-everything), so it sits at the
37
+ // "moderate" tier alongside Auto.
38
+ icon: "ShieldCheck",
39
+ colorTier: "moderate",
40
+ isUnattended: true,
41
+ },
31
42
  {
32
43
  id: "bypassPermissions",
33
44
  label: "Bypass",
@@ -100,6 +100,7 @@ export declare const ScheduleUpdateRequestSchema: z.ZodObject<{
100
100
  }, z.core.$strip>], "type">>;
101
101
  newAgentConfig: z.ZodOptional<z.ZodObject<{
102
102
  provider: z.ZodOptional<z.ZodString>;
103
+ personality: z.ZodOptional<z.ZodNullable<z.ZodString>>;
103
104
  model: z.ZodOptional<z.ZodNullable<z.ZodString>>;
104
105
  modeId: z.ZodOptional<z.ZodNullable<z.ZodString>>;
105
106
  thinkingOptionId: z.ZodOptional<z.ZodNullable<z.ZodString>>;
@@ -118,6 +119,7 @@ export declare const ScheduleCreateResponseSchema: z.ZodObject<{
118
119
  payload: z.ZodObject<{
119
120
  requestId: z.ZodString;
120
121
  schedule: z.ZodNullable<z.ZodObject<{
122
+ prompt: z.ZodString;
121
123
  name: z.ZodNullable<z.ZodString>;
122
124
  status: z.ZodEnum<{
123
125
  completed: "completed";
@@ -166,7 +168,6 @@ export declare const ScheduleCreateResponseSchema: z.ZodObject<{
166
168
  mcpServers: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodUnknown>>;
167
169
  }, z.core.$strip>;
168
170
  }, z.core.$strip>], "type">;
169
- prompt: z.ZodString;
170
171
  nextRunAt: z.ZodNullable<z.ZodString>;
171
172
  lastRunAt: z.ZodNullable<z.ZodString>;
172
173
  lastRunStatus: z.ZodOptional<z.ZodNullable<z.ZodEnum<{
@@ -186,6 +187,7 @@ export declare const ScheduleListResponseSchema: z.ZodObject<{
186
187
  payload: z.ZodObject<{
187
188
  requestId: z.ZodString;
188
189
  schedules: z.ZodArray<z.ZodObject<{
190
+ prompt: z.ZodString;
189
191
  name: z.ZodNullable<z.ZodString>;
190
192
  status: z.ZodEnum<{
191
193
  completed: "completed";
@@ -234,7 +236,6 @@ export declare const ScheduleListResponseSchema: z.ZodObject<{
234
236
  mcpServers: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodUnknown>>;
235
237
  }, z.core.$strip>;
236
238
  }, z.core.$strip>], "type">;
237
- prompt: z.ZodString;
238
239
  nextRunAt: z.ZodNullable<z.ZodString>;
239
240
  lastRunAt: z.ZodNullable<z.ZodString>;
240
241
  lastRunStatus: z.ZodOptional<z.ZodNullable<z.ZodEnum<{
@@ -359,6 +360,7 @@ export declare const SchedulePauseResponseSchema: z.ZodObject<{
359
360
  payload: z.ZodObject<{
360
361
  requestId: z.ZodString;
361
362
  schedule: z.ZodNullable<z.ZodObject<{
363
+ prompt: z.ZodString;
362
364
  name: z.ZodNullable<z.ZodString>;
363
365
  status: z.ZodEnum<{
364
366
  completed: "completed";
@@ -407,7 +409,6 @@ export declare const SchedulePauseResponseSchema: z.ZodObject<{
407
409
  mcpServers: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodUnknown>>;
408
410
  }, z.core.$strip>;
409
411
  }, z.core.$strip>], "type">;
410
- prompt: z.ZodString;
411
412
  nextRunAt: z.ZodNullable<z.ZodString>;
412
413
  lastRunAt: z.ZodNullable<z.ZodString>;
413
414
  lastRunStatus: z.ZodOptional<z.ZodNullable<z.ZodEnum<{
@@ -427,6 +428,7 @@ export declare const ScheduleResumeResponseSchema: z.ZodObject<{
427
428
  payload: z.ZodObject<{
428
429
  requestId: z.ZodString;
429
430
  schedule: z.ZodNullable<z.ZodObject<{
431
+ prompt: z.ZodString;
430
432
  name: z.ZodNullable<z.ZodString>;
431
433
  status: z.ZodEnum<{
432
434
  completed: "completed";
@@ -475,7 +477,6 @@ export declare const ScheduleResumeResponseSchema: z.ZodObject<{
475
477
  mcpServers: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodUnknown>>;
476
478
  }, z.core.$strip>;
477
479
  }, z.core.$strip>], "type">;
478
- prompt: z.ZodString;
479
480
  nextRunAt: z.ZodNullable<z.ZodString>;
480
481
  lastRunAt: z.ZodNullable<z.ZodString>;
481
482
  lastRunStatus: z.ZodOptional<z.ZodNullable<z.ZodEnum<{
@@ -62,6 +62,9 @@ export const ScheduleRunOnceRequestSchema = z.object({
62
62
  });
63
63
  const ScheduleUpdateNewAgentConfigSchema = z.object({
64
64
  provider: z.string().trim().min(1).optional(),
65
+ // Personality binding by name — or the "@team-scheduler" sentinel. Explicit
66
+ // null clears a stored binding; omission leaves it untouched.
67
+ personality: z.string().trim().min(1).nullable().optional(),
65
68
  model: z.string().trim().min(1).nullable().optional(),
66
69
  modeId: z.string().trim().min(1).nullable().optional(),
67
70
  thinkingOptionId: z.string().trim().min(1).nullable().optional(),
@@ -140,6 +140,7 @@ export declare const StoredScheduleSchema: z.ZodObject<{
140
140
  }, z.core.$strip>;
141
141
  export type StoredSchedule = z.infer<typeof StoredScheduleSchema>;
142
142
  export declare const ScheduleSummarySchema: z.ZodObject<{
143
+ prompt: z.ZodString;
143
144
  name: z.ZodNullable<z.ZodString>;
144
145
  status: z.ZodEnum<{
145
146
  completed: "completed";
@@ -188,7 +189,6 @@ export declare const ScheduleSummarySchema: z.ZodObject<{
188
189
  mcpServers: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodUnknown>>;
189
190
  }, z.core.$strip>;
190
191
  }, z.core.$strip>], "type">;
191
- prompt: z.ZodString;
192
192
  nextRunAt: z.ZodNullable<z.ZodString>;
193
193
  lastRunAt: z.ZodNullable<z.ZodString>;
194
194
  lastRunStatus: z.ZodOptional<z.ZodNullable<z.ZodEnum<{
@@ -389,6 +389,7 @@ export declare const WSOutboundMessageSchema: {
389
389
  persistence: import("zod").ZodNullable<import("zod").ZodType<import("../agent-types.js").AgentPersistenceHandle | null, unknown, import("zod/v4/core").$ZodTypeInternals<import("../agent-types.js").AgentPersistenceHandle | null, unknown>>>;
390
390
  runtimeInfo: import("zod").ZodOptional<import("zod").ZodType<import("../agent-types.js").AgentRuntimeInfo, unknown, import("zod/v4/core").$ZodTypeInternals<import("../agent-types.js").AgentRuntimeInfo, unknown>>>;
391
391
  lastUsage: import("zod").ZodOptional<import("zod").ZodType<import("../agent-types.js").AgentUsage, unknown, import("zod/v4/core").$ZodTypeInternals<import("../agent-types.js").AgentUsage, unknown>>>;
392
+ cumulativeTokens: import("zod").ZodOptional<import("zod").ZodNumber>;
392
393
  lastError: import("zod").ZodOptional<import("zod").ZodString>;
393
394
  title: import("zod").ZodNullable<import("zod").ZodString>;
394
395
  labels: import("zod").ZodDefault<import("zod").ZodRecord<import("zod").ZodString, import("zod").ZodString>>;
@@ -1130,6 +1131,7 @@ export declare const WSOutboundMessageSchema: {
1130
1131
  persistence: import("zod").ZodNullable<import("zod").ZodType<import("../agent-types.js").AgentPersistenceHandle | null, unknown, import("zod/v4/core").$ZodTypeInternals<import("../agent-types.js").AgentPersistenceHandle | null, unknown>>>;
1131
1132
  runtimeInfo: import("zod").ZodOptional<import("zod").ZodType<import("../agent-types.js").AgentRuntimeInfo, unknown, import("zod/v4/core").$ZodTypeInternals<import("../agent-types.js").AgentRuntimeInfo, unknown>>>;
1132
1133
  lastUsage: import("zod").ZodOptional<import("zod").ZodType<import("../agent-types.js").AgentUsage, unknown, import("zod/v4/core").$ZodTypeInternals<import("../agent-types.js").AgentUsage, unknown>>>;
1134
+ cumulativeTokens: import("zod").ZodOptional<import("zod").ZodNumber>;
1133
1135
  lastError: import("zod").ZodOptional<import("zod").ZodString>;
1134
1136
  title: import("zod").ZodNullable<import("zod").ZodString>;
1135
1137
  labels: import("zod").ZodDefault<import("zod").ZodRecord<import("zod").ZodString, import("zod").ZodString>>;
@@ -1209,6 +1211,7 @@ export declare const WSOutboundMessageSchema: {
1209
1211
  persistence: import("zod").ZodNullable<import("zod").ZodType<import("../agent-types.js").AgentPersistenceHandle | null, unknown, import("zod/v4/core").$ZodTypeInternals<import("../agent-types.js").AgentPersistenceHandle | null, unknown>>>;
1210
1212
  runtimeInfo: import("zod").ZodOptional<import("zod").ZodType<import("../agent-types.js").AgentRuntimeInfo, unknown, import("zod/v4/core").$ZodTypeInternals<import("../agent-types.js").AgentRuntimeInfo, unknown>>>;
1211
1213
  lastUsage: import("zod").ZodOptional<import("zod").ZodType<import("../agent-types.js").AgentUsage, unknown, import("zod/v4/core").$ZodTypeInternals<import("../agent-types.js").AgentUsage, unknown>>>;
1214
+ cumulativeTokens: import("zod").ZodOptional<import("zod").ZodNumber>;
1212
1215
  lastError: import("zod").ZodOptional<import("zod").ZodString>;
1213
1216
  title: import("zod").ZodNullable<import("zod").ZodString>;
1214
1217
  labels: import("zod").ZodDefault<import("zod").ZodRecord<import("zod").ZodString, import("zod").ZodString>>;
@@ -1371,6 +1374,7 @@ export declare const WSOutboundMessageSchema: {
1371
1374
  persistence: import("zod").ZodNullable<import("zod").ZodType<import("../agent-types.js").AgentPersistenceHandle | null, unknown, import("zod/v4/core").$ZodTypeInternals<import("../agent-types.js").AgentPersistenceHandle | null, unknown>>>;
1372
1375
  runtimeInfo: import("zod").ZodOptional<import("zod").ZodType<import("../agent-types.js").AgentRuntimeInfo, unknown, import("zod/v4/core").$ZodTypeInternals<import("../agent-types.js").AgentRuntimeInfo, unknown>>>;
1373
1376
  lastUsage: import("zod").ZodOptional<import("zod").ZodType<import("../agent-types.js").AgentUsage, unknown, import("zod/v4/core").$ZodTypeInternals<import("../agent-types.js").AgentUsage, unknown>>>;
1377
+ cumulativeTokens: import("zod").ZodOptional<import("zod").ZodNumber>;
1374
1378
  lastError: import("zod").ZodOptional<import("zod").ZodString>;
1375
1379
  title: import("zod").ZodNullable<import("zod").ZodString>;
1376
1380
  labels: import("zod").ZodDefault<import("zod").ZodRecord<import("zod").ZodString, import("zod").ZodString>>;
@@ -2440,6 +2444,7 @@ export declare const WSOutboundMessageSchema: {
2440
2444
  persistence: import("zod").ZodNullable<import("zod").ZodType<import("../agent-types.js").AgentPersistenceHandle | null, unknown, import("zod/v4/core").$ZodTypeInternals<import("../agent-types.js").AgentPersistenceHandle | null, unknown>>>;
2441
2445
  runtimeInfo: import("zod").ZodOptional<import("zod").ZodType<import("../agent-types.js").AgentRuntimeInfo, unknown, import("zod/v4/core").$ZodTypeInternals<import("../agent-types.js").AgentRuntimeInfo, unknown>>>;
2442
2446
  lastUsage: import("zod").ZodOptional<import("zod").ZodType<import("../agent-types.js").AgentUsage, unknown, import("zod/v4/core").$ZodTypeInternals<import("../agent-types.js").AgentUsage, unknown>>>;
2447
+ cumulativeTokens: import("zod").ZodOptional<import("zod").ZodNumber>;
2443
2448
  lastError: import("zod").ZodOptional<import("zod").ZodString>;
2444
2449
  title: import("zod").ZodNullable<import("zod").ZodString>;
2445
2450
  labels: import("zod").ZodDefault<import("zod").ZodRecord<import("zod").ZodString, import("zod").ZodString>>;
@@ -2597,6 +2602,7 @@ export declare const WSOutboundMessageSchema: {
2597
2602
  persistence: import("zod").ZodNullable<import("zod").ZodType<import("../agent-types.js").AgentPersistenceHandle | null, unknown, import("zod/v4/core").$ZodTypeInternals<import("../agent-types.js").AgentPersistenceHandle | null, unknown>>>;
2598
2603
  runtimeInfo: import("zod").ZodOptional<import("zod").ZodType<import("../agent-types.js").AgentRuntimeInfo, unknown, import("zod/v4/core").$ZodTypeInternals<import("../agent-types.js").AgentRuntimeInfo, unknown>>>;
2599
2604
  lastUsage: import("zod").ZodOptional<import("zod").ZodType<import("../agent-types.js").AgentUsage, unknown, import("zod/v4/core").$ZodTypeInternals<import("../agent-types.js").AgentUsage, unknown>>>;
2605
+ cumulativeTokens: import("zod").ZodOptional<import("zod").ZodNumber>;
2600
2606
  lastError: import("zod").ZodOptional<import("zod").ZodString>;
2601
2607
  title: import("zod").ZodNullable<import("zod").ZodString>;
2602
2608
  labels: import("zod").ZodDefault<import("zod").ZodRecord<import("zod").ZodString, import("zod").ZodString>>;
@@ -2748,6 +2754,7 @@ export declare const WSOutboundMessageSchema: {
2748
2754
  persistence: import("zod").ZodNullable<import("zod").ZodType<import("../agent-types.js").AgentPersistenceHandle | null, unknown, import("zod/v4/core").$ZodTypeInternals<import("../agent-types.js").AgentPersistenceHandle | null, unknown>>>;
2749
2755
  runtimeInfo: import("zod").ZodOptional<import("zod").ZodType<import("../agent-types.js").AgentRuntimeInfo, unknown, import("zod/v4/core").$ZodTypeInternals<import("../agent-types.js").AgentRuntimeInfo, unknown>>>;
2750
2756
  lastUsage: import("zod").ZodOptional<import("zod").ZodType<import("../agent-types.js").AgentUsage, unknown, import("zod/v4/core").$ZodTypeInternals<import("../agent-types.js").AgentUsage, unknown>>>;
2757
+ cumulativeTokens: import("zod").ZodOptional<import("zod").ZodNumber>;
2751
2758
  lastError: import("zod").ZodOptional<import("zod").ZodString>;
2752
2759
  title: import("zod").ZodNullable<import("zod").ZodString>;
2753
2760
  labels: import("zod").ZodDefault<import("zod").ZodRecord<import("zod").ZodString, import("zod").ZodString>>;
@@ -2771,6 +2778,7 @@ export declare const WSOutboundMessageSchema: {
2771
2778
  personalityName: import("zod").ZodOptional<import("zod").ZodString>;
2772
2779
  personalityId: import("zod").ZodOptional<import("zod").ZodString>;
2773
2780
  }, import("zod/v4/core").$strip>>;
2781
+ cancelled: import("zod").ZodOptional<import("zod").ZodBoolean>;
2774
2782
  }, import("zod/v4/core").$strip>;
2775
2783
  }, import("zod/v4/core").$strip>, import("zod").ZodObject<{
2776
2784
  type: import("zod").ZodLiteral<"clear_agent_attention_response">;
@@ -2826,6 +2834,7 @@ export declare const WSOutboundMessageSchema: {
2826
2834
  persistence: import("zod").ZodNullable<import("zod").ZodType<import("../agent-types.js").AgentPersistenceHandle | null, unknown, import("zod/v4/core").$ZodTypeInternals<import("../agent-types.js").AgentPersistenceHandle | null, unknown>>>;
2827
2835
  runtimeInfo: import("zod").ZodOptional<import("zod").ZodType<import("../agent-types.js").AgentRuntimeInfo, unknown, import("zod/v4/core").$ZodTypeInternals<import("../agent-types.js").AgentRuntimeInfo, unknown>>>;
2828
2836
  lastUsage: import("zod").ZodOptional<import("zod").ZodType<import("../agent-types.js").AgentUsage, unknown, import("zod/v4/core").$ZodTypeInternals<import("../agent-types.js").AgentUsage, unknown>>>;
2837
+ cumulativeTokens: import("zod").ZodOptional<import("zod").ZodNumber>;
2829
2838
  lastError: import("zod").ZodOptional<import("zod").ZodString>;
2830
2839
  title: import("zod").ZodNullable<import("zod").ZodString>;
2831
2840
  labels: import("zod").ZodDefault<import("zod").ZodRecord<import("zod").ZodString, import("zod").ZodString>>;
@@ -3438,6 +3447,24 @@ export declare const WSOutboundMessageSchema: {
3438
3447
  }, import("zod/v4/core").$loose>>;
3439
3448
  }, import("zod/v4/core").$loose>>>;
3440
3449
  }, import("zod/v4/core").$loose>>;
3450
+ agentTeams: import("zod").ZodDefault<import("zod").ZodObject<{
3451
+ teams: import("zod").ZodDefault<import("zod").ZodArray<import("zod").ZodObject<{
3452
+ id: import("zod").ZodString;
3453
+ name: import("zod").ZodString;
3454
+ avatar: import("zod").ZodOptional<import("zod").ZodObject<{
3455
+ color: import("zod").ZodOptional<import("zod").ZodString>;
3456
+ imageId: import("zod").ZodOptional<import("zod").ZodString>;
3457
+ }, import("zod/v4/core").$loose>>;
3458
+ teamPrompt: import("zod").ZodOptional<import("zod").ZodString>;
3459
+ memberIds: import("zod").ZodOptional<import("zod").ZodArray<import("zod").ZodString>>;
3460
+ }, import("zod/v4/core").$loose>>>;
3461
+ activeTeamId: import("zod").ZodOptional<import("zod").ZodNullable<import("zod").ZodString>>;
3462
+ }, import("zod/v4/core").$loose>>;
3463
+ modelTierOverrides: import("zod").ZodDefault<import("zod").ZodArray<import("zod").ZodObject<{
3464
+ provider: import("zod").ZodString;
3465
+ modelId: import("zod").ZodString;
3466
+ tier: import("zod").ZodType<import("../agent-types.js").ModelTier, unknown, import("zod/v4/core").$ZodTypeInternals<import("../agent-types.js").ModelTier, unknown>>;
3467
+ }, import("zod/v4/core").$loose>>>;
3441
3468
  }, import("zod/v4/core").$loose>;
3442
3469
  }, import("zod/v4/core").$loose>;
3443
3470
  }, import("zod/v4/core").$strip>, import("zod").ZodObject<{
@@ -3544,6 +3571,24 @@ export declare const WSOutboundMessageSchema: {
3544
3571
  }, import("zod/v4/core").$loose>>;
3545
3572
  }, import("zod/v4/core").$loose>>>;
3546
3573
  }, import("zod/v4/core").$loose>>;
3574
+ agentTeams: import("zod").ZodDefault<import("zod").ZodObject<{
3575
+ teams: import("zod").ZodDefault<import("zod").ZodArray<import("zod").ZodObject<{
3576
+ id: import("zod").ZodString;
3577
+ name: import("zod").ZodString;
3578
+ avatar: import("zod").ZodOptional<import("zod").ZodObject<{
3579
+ color: import("zod").ZodOptional<import("zod").ZodString>;
3580
+ imageId: import("zod").ZodOptional<import("zod").ZodString>;
3581
+ }, import("zod/v4/core").$loose>>;
3582
+ teamPrompt: import("zod").ZodOptional<import("zod").ZodString>;
3583
+ memberIds: import("zod").ZodOptional<import("zod").ZodArray<import("zod").ZodString>>;
3584
+ }, import("zod/v4/core").$loose>>>;
3585
+ activeTeamId: import("zod").ZodOptional<import("zod").ZodNullable<import("zod").ZodString>>;
3586
+ }, import("zod/v4/core").$loose>>;
3587
+ modelTierOverrides: import("zod").ZodDefault<import("zod").ZodArray<import("zod").ZodObject<{
3588
+ provider: import("zod").ZodString;
3589
+ modelId: import("zod").ZodString;
3590
+ tier: import("zod").ZodType<import("../agent-types.js").ModelTier, unknown, import("zod/v4/core").$ZodTypeInternals<import("../agent-types.js").ModelTier, unknown>>;
3591
+ }, import("zod/v4/core").$loose>>>;
3547
3592
  }, import("zod/v4/core").$loose>;
3548
3593
  }, import("zod/v4/core").$loose>;
3549
3594
  }, import("zod/v4/core").$strip>, import("zod").ZodObject<{
@@ -3877,6 +3922,7 @@ export declare const WSOutboundMessageSchema: {
3877
3922
  persistence: import("zod").ZodNullable<import("zod").ZodType<import("../agent-types.js").AgentPersistenceHandle | null, unknown, import("zod/v4/core").$ZodTypeInternals<import("../agent-types.js").AgentPersistenceHandle | null, unknown>>>;
3878
3923
  runtimeInfo: import("zod").ZodOptional<import("zod").ZodType<import("../agent-types.js").AgentRuntimeInfo, unknown, import("zod/v4/core").$ZodTypeInternals<import("../agent-types.js").AgentRuntimeInfo, unknown>>>;
3879
3924
  lastUsage: import("zod").ZodOptional<import("zod").ZodType<import("../agent-types.js").AgentUsage, unknown, import("zod/v4/core").$ZodTypeInternals<import("../agent-types.js").AgentUsage, unknown>>>;
3925
+ cumulativeTokens: import("zod").ZodOptional<import("zod").ZodNumber>;
3880
3926
  lastError: import("zod").ZodOptional<import("zod").ZodString>;
3881
3927
  title: import("zod").ZodNullable<import("zod").ZodString>;
3882
3928
  labels: import("zod").ZodDefault<import("zod").ZodRecord<import("zod").ZodString, import("zod").ZodString>>;
@@ -6095,6 +6141,7 @@ export declare const WSOutboundMessageSchema: {
6095
6141
  payload: import("zod").ZodObject<{
6096
6142
  requestId: import("zod").ZodString;
6097
6143
  schedule: import("zod").ZodNullable<import("zod").ZodObject<{
6144
+ prompt: import("zod").ZodString;
6098
6145
  name: import("zod").ZodNullable<import("zod").ZodString>;
6099
6146
  status: import("zod").ZodEnum<{
6100
6147
  completed: "completed";
@@ -6143,7 +6190,6 @@ export declare const WSOutboundMessageSchema: {
6143
6190
  mcpServers: import("zod").ZodOptional<import("zod").ZodRecord<import("zod").ZodString, import("zod").ZodUnknown>>;
6144
6191
  }, import("zod/v4/core").$strip>;
6145
6192
  }, import("zod/v4/core").$strip>], "type">;
6146
- prompt: import("zod").ZodString;
6147
6193
  nextRunAt: import("zod").ZodNullable<import("zod").ZodString>;
6148
6194
  lastRunAt: import("zod").ZodNullable<import("zod").ZodString>;
6149
6195
  lastRunStatus: import("zod").ZodOptional<import("zod").ZodNullable<import("zod").ZodEnum<{
@@ -6162,6 +6208,7 @@ export declare const WSOutboundMessageSchema: {
6162
6208
  payload: import("zod").ZodObject<{
6163
6209
  requestId: import("zod").ZodString;
6164
6210
  schedules: import("zod").ZodArray<import("zod").ZodObject<{
6211
+ prompt: import("zod").ZodString;
6165
6212
  name: import("zod").ZodNullable<import("zod").ZodString>;
6166
6213
  status: import("zod").ZodEnum<{
6167
6214
  completed: "completed";
@@ -6210,7 +6257,6 @@ export declare const WSOutboundMessageSchema: {
6210
6257
  mcpServers: import("zod").ZodOptional<import("zod").ZodRecord<import("zod").ZodString, import("zod").ZodUnknown>>;
6211
6258
  }, import("zod/v4/core").$strip>;
6212
6259
  }, import("zod/v4/core").$strip>], "type">;
6213
- prompt: import("zod").ZodString;
6214
6260
  nextRunAt: import("zod").ZodNullable<import("zod").ZodString>;
6215
6261
  lastRunAt: import("zod").ZodNullable<import("zod").ZodString>;
6216
6262
  lastRunStatus: import("zod").ZodOptional<import("zod").ZodNullable<import("zod").ZodEnum<{
@@ -6332,6 +6378,7 @@ export declare const WSOutboundMessageSchema: {
6332
6378
  payload: import("zod").ZodObject<{
6333
6379
  requestId: import("zod").ZodString;
6334
6380
  schedule: import("zod").ZodNullable<import("zod").ZodObject<{
6381
+ prompt: import("zod").ZodString;
6335
6382
  name: import("zod").ZodNullable<import("zod").ZodString>;
6336
6383
  status: import("zod").ZodEnum<{
6337
6384
  completed: "completed";
@@ -6380,7 +6427,6 @@ export declare const WSOutboundMessageSchema: {
6380
6427
  mcpServers: import("zod").ZodOptional<import("zod").ZodRecord<import("zod").ZodString, import("zod").ZodUnknown>>;
6381
6428
  }, import("zod/v4/core").$strip>;
6382
6429
  }, import("zod/v4/core").$strip>], "type">;
6383
- prompt: import("zod").ZodString;
6384
6430
  nextRunAt: import("zod").ZodNullable<import("zod").ZodString>;
6385
6431
  lastRunAt: import("zod").ZodNullable<import("zod").ZodString>;
6386
6432
  lastRunStatus: import("zod").ZodOptional<import("zod").ZodNullable<import("zod").ZodEnum<{
@@ -6399,6 +6445,7 @@ export declare const WSOutboundMessageSchema: {
6399
6445
  payload: import("zod").ZodObject<{
6400
6446
  requestId: import("zod").ZodString;
6401
6447
  schedule: import("zod").ZodNullable<import("zod").ZodObject<{
6448
+ prompt: import("zod").ZodString;
6402
6449
  name: import("zod").ZodNullable<import("zod").ZodString>;
6403
6450
  status: import("zod").ZodEnum<{
6404
6451
  completed: "completed";
@@ -6447,7 +6494,6 @@ export declare const WSOutboundMessageSchema: {
6447
6494
  mcpServers: import("zod").ZodOptional<import("zod").ZodRecord<import("zod").ZodString, import("zod").ZodUnknown>>;
6448
6495
  }, import("zod/v4/core").$strip>;
6449
6496
  }, import("zod/v4/core").$strip>], "type">;
6450
- prompt: import("zod").ZodString;
6451
6497
  nextRunAt: import("zod").ZodNullable<import("zod").ZodString>;
6452
6498
  lastRunAt: import("zod").ZodNullable<import("zod").ZodString>;
6453
6499
  lastRunStatus: import("zod").ZodOptional<import("zod").ZodNullable<import("zod").ZodEnum<{
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@otto-code/protocol",
3
- "version": "0.5.1",
3
+ "version": "0.5.2",
4
4
  "description": "Otto shared protocol schemas and wire types",
5
5
  "files": [
6
6
  "dist",