@otto-code/protocol 0.8.12 → 0.8.14

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 (43) 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 → agent-profiles.d.ts} +13 -3
  4. package/dist/{agent-personalities.js → agent-profiles.js} +27 -11
  5. package/dist/agent-teams.d.ts +5 -5
  6. package/dist/agent-teams.js +1 -1
  7. package/dist/agent-types.d.ts +24 -4
  8. package/dist/binary-frames/terminal.d.ts +4 -0
  9. package/dist/binary-frames/terminal.js +1 -0
  10. package/dist/brain.d.ts +91 -0
  11. package/dist/brain.js +19 -1
  12. package/dist/chat/rpc-schemas.js +1 -0
  13. package/dist/chat/types.js +1 -0
  14. package/dist/client-capabilities.d.ts +1 -0
  15. package/dist/client-capabilities.js +4 -0
  16. package/dist/daemon-config.d.ts +10 -0
  17. package/dist/daemon-config.js +6 -0
  18. package/dist/default-personalities.d.ts +2 -2
  19. package/dist/default-personalities.js +2 -2
  20. package/dist/generated/validation/ws-outbound.aot.js +65204 -60319
  21. package/dist/loop/rpc-schemas.js +1 -0
  22. package/dist/messages.d.ts +4146 -316
  23. package/dist/messages.js +483 -2
  24. package/dist/personality-schemas.d.ts +135 -0
  25. package/dist/personality-schemas.js +63 -0
  26. package/dist/provider-manifest.js +7 -0
  27. package/dist/provider-snapshot-codec.d.ts +18 -0
  28. package/dist/provider-snapshot-codec.js +71 -0
  29. package/dist/schedule/rpc-schemas.d.ts +16 -8
  30. package/dist/schedule/types.d.ts +6 -3
  31. package/dist/schedule/types.js +8 -1
  32. package/dist/search/text-match.d.ts +55 -0
  33. package/dist/search/text-match.js +262 -0
  34. package/dist/suggested-tasks.js +1 -1
  35. package/dist/terminal-input-mode.d.ts +4 -0
  36. package/dist/terminal-input-mode.js +35 -6
  37. package/dist/terminal-key-input.js +15 -6
  38. package/dist/terminal-profiles.d.ts +35 -0
  39. package/dist/terminal-profiles.js +246 -4
  40. package/dist/tool-call-display.d.ts +2 -2
  41. package/dist/tool-call-display.js +6 -6
  42. package/dist/validation/ws-outbound-schema-metadata.d.ts +677 -28
  43. package/package.json +1 -1
package/dist/messages.js CHANGED
@@ -1,6 +1,6 @@
1
1
  import { z } from "zod";
2
2
  import { MutableAgentBehaviorsConfigSchema, MutableLspConfigSchema, MutableDotnetSolutionConfigSchema, MutableGitHostingConfigSchema, MutableKanbanConfigSchema, MutableAgentPersonalitiesConfigSchema, MutableAgentPersonalitiesConfigPatchSchema, MutableAgentTeamsConfigSchema, MutableAgentTeamsConfigPatchSchema, MutableBrainConfigSchema, MutableBrainConfigPatchSchema, MutableGitFetchConfigSchema, DEFAULT_MUTABLE_BRAIN_CONFIG, } from "./daemon-config.js";
3
- import { VisualizerVoiceCuesGenerateRequestSchema, VisualizerVoiceCuesGenerateResponseSchema, AgentPersonalitySpinnerSchema, AgentPersonalitiesGetStatsRequestSchema, AgentPersonalitiesGenerateProfileRequestSchema, AgentPersonalitiesGetStatsResponseSchema, AgentPersonalitiesGenerateProfileResponseSchema, PersonalityMemoryListRequestMessageSchema, PersonalityMemoryListResponseMessageSchema, PersonalityMemoryUpdateRequestMessageSchema, PersonalityMemoryUpdateResponseMessageSchema, PersonalityMemoryTransferRequestMessageSchema, PersonalityMemoryTransferResponseMessageSchema, PersonalityMemoryStatsRequestMessageSchema, PersonalityMemoryStatsResponseMessageSchema, } from "./personality-schemas.js";
3
+ import { VisualizerVoiceCuesGenerateRequestSchema, VisualizerVoiceCuesGenerateResponseSchema, AgentPersonalitySpinnerSchema, AgentPersonalityVoiceSchema, AgentPersonalityVoiceCuesSchema, AgentPersonalitiesGetStatsRequestSchema, AgentPersonalitiesGenerateProfileRequestSchema, AgentPersonalitiesGetStatsResponseSchema, AgentPersonalitiesGenerateProfileResponseSchema, AgentProfileStatsRequestSchema, AgentProfileStatsResponseSchema, AgentProfileGeneratePromptRequestSchema, AgentProfileGeneratePromptResponseSchema, AgentProfileGenerateVoiceCuesRequestSchema, AgentProfileGenerateVoiceCuesResponseSchema, PersonalityMemoryListRequestMessageSchema, PersonalityMemoryListResponseMessageSchema, PersonalityMemoryUpdateRequestMessageSchema, PersonalityMemoryUpdateResponseMessageSchema, PersonalityMemoryTransferRequestMessageSchema, PersonalityMemoryTransferResponseMessageSchema, PersonalityMemoryStatsRequestMessageSchema, PersonalityMemoryStatsResponseMessageSchema, ProfileMemoryListRequestMessageSchema, ProfileMemoryListResponseMessageSchema, ProfileMemoryUpdateRequestMessageSchema, ProfileMemoryUpdateResponseMessageSchema, ProfileMemoryTransferRequestMessageSchema, ProfileMemoryTransferResponseMessageSchema, ProfileMemoryStatsRequestMessageSchema, ProfileMemoryStatsResponseMessageSchema, } from "./personality-schemas.js";
4
4
  import { TerminalCompatibilityDiagnosticRequestSchema, TerminalCompatibilityDiagnosticResponseSchema, } from "./terminal-compatibility.js";
5
5
  import { HostingPrAttachmentSchema, HostingIssueAttachmentSchema, HostingSearchRequestSchema, HostingAuthStatusRequestSchema, HostingListRepositoriesRequestSchema, HostingListOwnersRequestSchema, HostingListRepositoriesResponseSchema, HostingListOwnersResponseSchema, HostingAuthStatusResponseSchema, GitHostingCapabilitiesSchema, GitHostingProviderIdWireSchema, } from "./git-hosting.js";
6
6
  import { ProjectKanbanTargetSchema, KanbanProjectTargetSetRequestSchema, KanbanProjectTargetSetResponseSchema, KanbanBoardsListRequestSchema, KanbanBoardsListResponseSchema, KanbanBoardGetRequestSchema, KanbanBoardGetResponseSchema, KanbanCardMoveRequestSchema, KanbanCardMoveResponseSchema, KanbanCardCreateRequestSchema, KanbanCardCreateResponseSchema, KanbanTaskLinkRequestSchema, KanbanTaskLinkResponseSchema, } from "./kanban.js";
@@ -87,6 +87,47 @@ export const TerminalProfileSchema = z
87
87
  icon: z.string().optional(),
88
88
  })
89
89
  .passthrough();
90
+ /**
91
+ * A named launch bundle: a provider plus the agent-config values a client would
92
+ * otherwise set one control at a time. Field names mirror `AgentSessionConfig`
93
+ * so applying a profile is a copy rather than a translation table.
94
+ *
95
+ * There is deliberately no system prompt here. `AgentSessionConfig.systemPrompt`
96
+ * is creation-only, so a profile carrying one would apply when starting a new
97
+ * agent and silently do nothing when applied to a running one.
98
+ */
99
+ export const AgentProfileSchema = z
100
+ .object({
101
+ id: z.string(),
102
+ name: z.string(),
103
+ /** A key into the client's icon registry, not a glyph. Unknown keys draw the default. */
104
+ icon: z.string().optional(),
105
+ /** An identity colour name shared with host badges. Unknown values draw unthemed. */
106
+ color: z.string().optional(),
107
+ provider: z.string(),
108
+ model: z.string().optional(),
109
+ modeId: z.string().optional(),
110
+ thinkingOptionId: z.string().optional(),
111
+ /** Legacy Otto effort alias retained while profile callers converge on thinkingOptionId. */
112
+ effortLevel: z.string().optional(),
113
+ featureValues: z.record(z.string(), z.unknown()).optional(),
114
+ /** Free text, surfaced to orchestrating agents by the `list_profiles` MCP tool. */
115
+ notes: z.string().optional(),
116
+ /** Otto behavior and identity fields. All remain optional for older v0.4 peers. */
117
+ personalityPrompt: z.string().optional(),
118
+ respectGlobalAppendPrompt: z.boolean().optional(),
119
+ roles: z.array(z.string().min(1)).optional(),
120
+ spinner: AgentPersonalitySpinnerSchema.optional(),
121
+ voice: AgentPersonalityVoiceSchema.optional(),
122
+ voiceCues: AgentPersonalityVoiceCuesSchema.optional(),
123
+ memoryEnabled: z.boolean().optional(),
124
+ })
125
+ .passthrough();
126
+ const MutableRelayConfigSchema = z
127
+ .object({
128
+ enabled: z.boolean(),
129
+ })
130
+ .passthrough();
90
131
  const MutableBrowserToolsConfigSchema = z
91
132
  .object({
92
133
  enabled: z.boolean().default(false),
@@ -130,6 +171,8 @@ export const SavedProviderEndpointSchema = z
130
171
  .passthrough();
131
172
  export const MutableDaemonConfigSchema = z
132
173
  .object({
174
+ // COMPAT(relayConfig): added in v0.2.6, remove after 2027-01-31 when old daemons are unsupported.
175
+ relay: MutableRelayConfigSchema.optional(),
133
176
  mcp: z
134
177
  .object({
135
178
  injectIntoAgents: z.boolean(),
@@ -239,10 +282,12 @@ export const MutableDaemonConfigSchema = z
239
282
  // Kanban board surface credentials (provider tokens). Gated by
240
283
  // server_info features.kanbanBoard; absent on older daemons.
241
284
  kanban: MutableKanbanConfigSchema.optional(),
285
+ agentProfiles: z.array(AgentProfileSchema).optional(),
242
286
  })
243
287
  .passthrough();
244
288
  export const MutableDaemonConfigPatchSchema = z
245
289
  .object({
290
+ relay: MutableRelayConfigSchema.partial().optional(),
246
291
  mcp: MutableDaemonConfigSchema.shape.mcp.partial().optional(),
247
292
  browserTools: MutableBrowserToolsConfigSchema.partial().optional(),
248
293
  // Gated by server_info features.agentBehaviorToggles; patches deep-merge.
@@ -304,6 +349,7 @@ export const MutableDaemonConfigPatchSchema = z
304
349
  // (read-modify-write), matching modelTierOverrides/savedProviderEndpoints, so
305
350
  // enabling/disabling a connector or a tool is a whole-array rewrite.
306
351
  connectors: z.array(ConnectorConfigSchema).optional(),
352
+ agentProfiles: z.array(AgentProfileSchema).optional(),
307
353
  })
308
354
  .partial()
309
355
  .passthrough();
@@ -376,6 +422,8 @@ export const AgentFeatureSchema = z.discriminatedUnion("type", [
376
422
  const AgentModelDefinitionSchema = z.object({
377
423
  provider: AgentProviderSchema,
378
424
  id: z.string(),
425
+ aliases: z.array(z.string()).optional(),
426
+ isSelectable: z.boolean().optional(),
379
427
  label: z.string(),
380
428
  description: z.string().optional(),
381
429
  family: z.string().optional(),
@@ -404,6 +452,25 @@ export const ProviderSnapshotEntrySchema = z.object({
404
452
  description: z.string().optional(),
405
453
  defaultModeId: z.string().nullable().optional(),
406
454
  });
455
+ export const CompactProviderSnapshotModelSchema = AgentModelDefinitionSchema.omit({
456
+ provider: true,
457
+ thinkingOptions: true,
458
+ }).extend({
459
+ thinkingSet: z.number().int().nonnegative().optional(),
460
+ });
461
+ export const ProviderSnapshotThinkingSetSchema = z.object({
462
+ options: z.array(AgentSelectOptionSchema),
463
+ defaultOptionId: z.string().optional(),
464
+ });
465
+ export const CompactProviderSnapshotEntrySchema = ProviderSnapshotEntrySchema.omit({
466
+ models: true,
467
+ }).extend({
468
+ models: z.array(CompactProviderSnapshotModelSchema).optional(),
469
+ });
470
+ export const CompactProviderSnapshotSchema = z.object({
471
+ entries: z.array(CompactProviderSnapshotEntrySchema),
472
+ thinkingSets: z.array(ProviderSnapshotThinkingSetSchema),
473
+ });
407
474
  const AgentCapabilityFlagsSchema = z
408
475
  .object({
409
476
  supportsStreaming: z.boolean(),
@@ -453,6 +520,19 @@ const AgentUsageSchema = z.object({
453
520
  // contextComposition; absent ⇒ fall back to the estimate, then to occupancy.
454
521
  contextCategories: z.array(AgentContextCategorySchema).optional(),
455
522
  });
523
+ const ProviderOptionsSchema = z.record(z.string(), z.json());
524
+ const McpToolRefSchema = z
525
+ .object({
526
+ kind: z.literal("mcp"),
527
+ server: z.string().trim().min(1),
528
+ tool: z.string().trim().min(1),
529
+ })
530
+ .strict();
531
+ const ToolPolicySchema = z
532
+ .object({
533
+ preapproved: z.array(McpToolRefSchema),
534
+ })
535
+ .strict();
456
536
  const AgentSessionConfigSchema = z.object({
457
537
  provider: AgentProviderSchema,
458
538
  cwd: z.string(),
@@ -461,6 +541,13 @@ const AgentSessionConfigSchema = z.object({
461
541
  thinkingOptionId: z.string().optional(),
462
542
  featureValues: z.record(z.string(), z.unknown()).optional(),
463
543
  title: z.string().trim().min(1).max(MAX_EXPLICIT_AGENT_TITLE_CHARS).optional().nullable(),
544
+ providerOptions: ProviderOptionsSchema.optional(),
545
+ toolPolicy: ToolPolicySchema.optional(),
546
+ // COMPAT(flatProviderConfigFields): pre-v0.4.0 clients and persisted state carry
547
+ // these flat provider fields instead of providerOptions, and Zod strips unknown
548
+ // keys, so dropping them silently discarded approval/sandbox/network settings.
549
+ // Re-added 2026-08-22; keep accepting until the client floor >= 0.8.13, then
550
+ // drop together with the schedule-target copies (target 2027-02-22).
464
551
  approvalPolicy: z.string().optional(),
465
552
  sandboxMode: z.string().optional(),
466
553
  networkAccess: z.boolean().optional(),
@@ -686,6 +773,9 @@ export const AgentTimelineItemPayloadSchema = z.union([
686
773
  items: z.array(z.object({
687
774
  text: z.string(),
688
775
  completed: z.boolean(),
776
+ id: z.string().optional(),
777
+ status: z.enum(["pending", "in_progress", "completed"]).optional(),
778
+ activeForm: z.string().optional(),
689
779
  })),
690
780
  }),
691
781
  z.object({
@@ -714,15 +804,18 @@ export const AgentStreamEventPayloadSchema = z.discriminatedUnion("type", [
714
804
  z.object({
715
805
  type: z.literal("turn_started"),
716
806
  provider: AgentProviderSchema,
807
+ turnId: z.string().optional(),
717
808
  }),
718
809
  z.object({
719
810
  type: z.literal("turn_completed"),
720
811
  provider: AgentProviderSchema,
812
+ turnId: z.string().optional(),
721
813
  usage: AgentUsageSchema.optional(),
722
814
  }),
723
815
  z.object({
724
816
  type: z.literal("turn_failed"),
725
817
  provider: AgentProviderSchema,
818
+ turnId: z.string().optional(),
726
819
  error: z.string(),
727
820
  code: z.string().optional(),
728
821
  diagnostic: z.string().optional(),
@@ -730,6 +823,7 @@ export const AgentStreamEventPayloadSchema = z.discriminatedUnion("type", [
730
823
  z.object({
731
824
  type: z.literal("turn_canceled"),
732
825
  provider: AgentProviderSchema,
826
+ turnId: z.string().optional(),
733
827
  reason: z.string(),
734
828
  }),
735
829
  z.object({
@@ -833,6 +927,10 @@ export const AgentCumulativeUsageSchema = z.object({
833
927
  */
834
928
  costCoverage: z.enum(["complete", "partial", "none"]).optional(),
835
929
  });
930
+ const AgentActiveTurnPayloadSchema = z.object({
931
+ turnId: z.string(),
932
+ startedAt: z.string().nullable(),
933
+ });
836
934
  export const AgentSnapshotPayloadSchema = z.object({
837
935
  id: z.string(),
838
936
  provider: AgentProviderSchema,
@@ -846,6 +944,7 @@ export const AgentSnapshotPayloadSchema = z.object({
846
944
  updatedAt: z.string(),
847
945
  lastUserMessageAt: z.string().nullable(),
848
946
  status: AgentStatusSchema,
947
+ activeTurn: AgentActiveTurnPayloadSchema.nullable().optional(),
849
948
  capabilities: AgentCapabilityFlagsSchema,
850
949
  currentModeId: z.string().nullable(),
851
950
  availableModes: z.array(AgentModeSchema),
@@ -1020,6 +1119,12 @@ export const UpdateAgentRequestMessageSchema = z.object({
1020
1119
  // correlated request/response; the download runs as a `pull` job. Gated by
1021
1120
  // server_info.features.brainHfSearch. The brain resolves its own HF token (env
1022
1121
  // HF_TOKEN or its config), so no secret crosses this boundary.
1122
+ // The daemon accepts only image bytes chosen or acquired by the client. It must
1123
+ // never fetch a user-provided URL on the host's network.
1124
+ export const ProjectIconSourceSchema = z.discriminatedUnion("type", [
1125
+ z.object({ type: z.literal("automatic") }),
1126
+ z.object({ type: z.literal("upload"), data: z.string() }),
1127
+ ]);
1023
1128
  export const ProjectRenameRequestSchema = z.object({
1024
1129
  type: z.literal("project.rename.request"),
1025
1130
  projectId: z.string(),
@@ -1027,6 +1132,12 @@ export const ProjectRenameRequestSchema = z.object({
1027
1132
  customName: z.string().nullable(),
1028
1133
  requestId: z.string(),
1029
1134
  });
1135
+ export const ProjectIconSetRequestSchema = z.object({
1136
+ type: z.literal("project.icon.set.request"),
1137
+ projectId: z.string(),
1138
+ source: ProjectIconSourceSchema,
1139
+ requestId: z.string(),
1140
+ });
1030
1141
  export const ProjectRemoveRequestSchema = z.object({
1031
1142
  type: z.literal("project.remove.request"),
1032
1143
  projectId: z.string(),
@@ -1264,6 +1375,10 @@ export const FetchAgentHistoryRequestMessageSchema = z.object({
1264
1375
  type: z.literal("fetch_agent_history_request"),
1265
1376
  requestId: z.string(),
1266
1377
  filter: AgentDirectoryFilterSchema.optional(),
1378
+ // A ranked free-text query over agent title, workspace name, branch, and
1379
+ // project name. Present only on history: agent subscriptions filter on
1380
+ // structure, not on relevance. Ranking replaces `sort` when it is set.
1381
+ search: z.string().optional(),
1267
1382
  sort: z
1268
1383
  .array(z.object({
1269
1384
  key: z.enum(["status_priority", "created_at", "updated_at", "title"]),
@@ -1541,6 +1656,8 @@ export const ListAvailableProvidersRequestMessageSchema = z.object({
1541
1656
  export const GetProvidersSnapshotRequestMessageSchema = z.object({
1542
1657
  type: z.literal("get_providers_snapshot_request"),
1543
1658
  cwd: z.string().optional(),
1659
+ // COMPAT(compactProviderSnapshots): old daemons ignore this field and return a full snapshot.
1660
+ ifNoneMatch: z.string().optional(),
1544
1661
  requestId: z.string(),
1545
1662
  });
1546
1663
  export const RefreshProvidersSnapshotRequestMessageSchema = z.object({
@@ -1618,6 +1735,13 @@ export const FetchAgentTimelineRequestMessageSchema = z.object({
1618
1735
  limit: z.number().int().nonnegative().optional(),
1619
1736
  // Default should be projected for app timeline loading.
1620
1737
  projection: z.enum(["projected", "canonical"]).optional(),
1738
+ // Allow the client to merge this bounded page outside its contiguous loaded range.
1739
+ mergeWindow: z.boolean().optional(),
1740
+ });
1741
+ export const AgentTimelineListPromptsRequestMessageSchema = z.object({
1742
+ type: z.literal("agent.timeline.list_prompts.request"),
1743
+ agentId: z.string(),
1744
+ requestId: z.string(),
1621
1745
  });
1622
1746
  export const ProviderSubagentListRequestMessageSchema = z.object({
1623
1747
  type: z.literal("agent.provider_subagents.list.request"),
@@ -1693,6 +1817,33 @@ export const SetAgentFeatureResponseMessageSchema = z.object({
1693
1817
  type: z.literal("set_agent_feature_response"),
1694
1818
  payload: AgentActionResponsePayloadSchema,
1695
1819
  });
1820
+ /**
1821
+ * Every agent-config value a client can change in one shot. Each field is
1822
+ * optional and an omitted field is left alone; `null` on model and thinking
1823
+ * clears them, matching the single-field RPCs above.
1824
+ */
1825
+ export const AgentConfigApplySchema = z.object({
1826
+ modelId: z.string().nullable().optional(),
1827
+ modeId: z.string().optional(),
1828
+ thinkingOptionId: z.string().nullable().optional(),
1829
+ featureValues: z.record(z.string(), z.unknown()).optional(),
1830
+ });
1831
+ /**
1832
+ * Applies a whole config bundle to one agent. The four single-field RPCs above
1833
+ * stay for individual control edits. One request prevents client interruption
1834
+ * and other mutations from interleaving between bundle steps; provider-level
1835
+ * rejection can still leave earlier steps applied.
1836
+ */
1837
+ export const AgentConfigApplyRequestMessageSchema = z.object({
1838
+ type: z.literal("agent.config.apply.request"),
1839
+ agentId: z.string(),
1840
+ config: AgentConfigApplySchema,
1841
+ requestId: z.string(),
1842
+ });
1843
+ export const AgentConfigApplyResponseMessageSchema = z.object({
1844
+ type: z.literal("agent.config.apply.response"),
1845
+ payload: AgentActionResponsePayloadSchema,
1846
+ });
1696
1847
  export const AgentDetachRequestMessageSchema = z.object({
1697
1848
  type: z.literal("agent.detach.request"),
1698
1849
  agentId: z.string(),
@@ -1807,6 +1958,15 @@ export const AgentPersonalitySetResponseMessageSchema = z.object({
1807
1958
  type: z.literal("agent.personality.set.response"),
1808
1959
  payload: AgentActionResponsePayloadSchema,
1809
1960
  });
1961
+ // COMPAT(agentProfileRpcs): added in v0.8.13, drop the legacy pair above when
1962
+ // the daemon floor >= v0.8.13. The profile-named twin of the pair above; see the
1963
+ // block at the end of personality-schemas.ts for why both halves exist.
1964
+ export const AgentProfileSetRequestMessageSchema = AgentPersonalitySetRequestMessageSchema.omit({
1965
+ type: true,
1966
+ }).extend({ type: z.literal("agent.profile.set.request") });
1967
+ export const AgentProfileSetResponseMessageSchema = AgentPersonalitySetResponseMessageSchema.omit({
1968
+ type: true,
1969
+ }).extend({ type: z.literal("agent.profile.set.response") });
1810
1970
  export const AgentRewindModeSchema = z.enum(["conversation", "files", "both"]);
1811
1971
  export const AgentRewindRequestMessageSchema = z.object({
1812
1972
  type: z.literal("agent.rewind.request"),
@@ -1839,6 +1999,15 @@ export const ProjectRenameResponseSchema = z.object({
1839
1999
  type: z.literal("project.rename.response"),
1840
2000
  payload: ProjectRenameResponsePayloadSchema,
1841
2001
  });
2002
+ export const ProjectIconSetResponseSchema = z.object({
2003
+ type: z.literal("project.icon.set.response"),
2004
+ payload: z.object({
2005
+ requestId: z.string(),
2006
+ projectId: z.string(),
2007
+ accepted: z.boolean(),
2008
+ error: z.string().nullable(),
2009
+ }),
2010
+ });
1842
2011
  export const ProjectRemoveResponsePayloadSchema = z.object({
1843
2012
  requestId: z.string(),
1844
2013
  projectId: z.string(),
@@ -2060,6 +2229,12 @@ export const CheckoutGitFetchRequestSchema = z.object({
2060
2229
  cwd: z.string(),
2061
2230
  requestId: z.string(),
2062
2231
  });
2232
+ export const CheckoutDiscardChangesRequestSchema = z.object({
2233
+ type: z.literal("checkout.discard_changes.request"),
2234
+ cwd: z.string(),
2235
+ paths: z.array(z.string()).min(1),
2236
+ requestId: z.string(),
2237
+ });
2063
2238
  export const CheckoutPrCreateRequestSchema = z.object({
2064
2239
  type: z.literal("checkout_pr_create_request"),
2065
2240
  cwd: z.string(),
@@ -2550,6 +2725,8 @@ const DiffHunkSchema = z.object({
2550
2725
  });
2551
2726
  const ParsedDiffFileSchema = z.object({
2552
2727
  path: z.string(),
2728
+ // COMPAT(diffOldPath): added in v0.3.0, remove gate after 2027-02-09.
2729
+ oldPath: z.string().optional(),
2553
2730
  isNew: z.boolean(),
2554
2731
  isDeleted: z.boolean(),
2555
2732
  additions: z.number(),
@@ -2692,11 +2869,43 @@ export const FsFileWriteBinaryRequestSchema = z.object({
2692
2869
  overwrite: z.boolean().optional(),
2693
2870
  requestId: z.string(),
2694
2871
  });
2872
+ export const FileEntryCreateRequestSchema = z.object({
2873
+ type: z.literal("fs.entry.create.request"),
2874
+ cwd: z.string(),
2875
+ parentPath: z.string(),
2876
+ name: z.string(),
2877
+ kind: z.enum(["file", "directory"]),
2878
+ requestId: z.string(),
2879
+ });
2880
+ export const FileEntryRenameRequestSchema = z.object({
2881
+ type: z.literal("fs.entry.rename.request"),
2882
+ cwd: z.string(),
2883
+ path: z.string(),
2884
+ name: z.string(),
2885
+ requestId: z.string(),
2886
+ });
2887
+ export const FileEntryDuplicateRequestSchema = z.object({
2888
+ type: z.literal("fs.entry.duplicate.request"),
2889
+ cwd: z.string(),
2890
+ path: z.string(),
2891
+ requestId: z.string(),
2892
+ });
2893
+ export const FileEntryDeleteRequestSchema = z.object({
2894
+ type: z.literal("fs.entry.delete.request"),
2895
+ cwd: z.string(),
2896
+ path: z.string(),
2897
+ requestId: z.string(),
2898
+ });
2695
2899
  export const ProjectIconRequestSchema = z.object({
2696
2900
  type: z.literal("project_icon_request"),
2697
2901
  cwd: z.string(),
2698
2902
  requestId: z.string(),
2699
2903
  });
2904
+ export const ProjectIconGetRequestSchema = z.object({
2905
+ type: z.literal("project.icon.get.request"),
2906
+ projectId: z.string(),
2907
+ requestId: z.string(),
2908
+ });
2700
2909
  export const FileDownloadTokenRequestSchema = z.object({
2701
2910
  type: z.literal("file_download_token_request"),
2702
2911
  cwd: z.string(),
@@ -2775,6 +2984,17 @@ export const RegisterPushTokenMessageSchema = z.object({
2775
2984
  type: z.literal("register_push_token"),
2776
2985
  token: z.string(),
2777
2986
  });
2987
+ export const PushUnregisterRequestSchema = z.object({
2988
+ type: z.literal("push.unregister.request"),
2989
+ token: z.string(),
2990
+ requestId: z.string(),
2991
+ });
2992
+ export const PushUnregisterResponseSchema = z.object({
2993
+ type: z.literal("push.unregister.response"),
2994
+ payload: z.object({
2995
+ requestId: z.string(),
2996
+ }),
2997
+ });
2778
2998
  // ============================================================================
2779
2999
  // Terminal Messages
2780
3000
  // ============================================================================
@@ -2881,7 +3101,12 @@ export const UnsubscribeTerminalRequestSchema = z.object({
2881
3101
  });
2882
3102
  const TerminalClientMessageSchema = z.discriminatedUnion("type", [
2883
3103
  z.object({ type: z.literal("input"), data: z.string() }),
2884
- z.object({ type: z.literal("resize"), rows: z.number(), cols: z.number() }),
3104
+ z.object({
3105
+ type: z.literal("resize"),
3106
+ rows: z.number(),
3107
+ cols: z.number(),
3108
+ intent: z.enum(["claim", "update"]).optional(),
3109
+ }),
2885
3110
  z.object({
2886
3111
  type: z.literal("mouse"),
2887
3112
  row: z.number(),
@@ -2915,14 +3140,47 @@ export const HubExecutionAgentCreateRequestSchema = z.object({
2915
3140
  provider: z.string(),
2916
3141
  cwd: z.string(),
2917
3142
  prompt: z.string(),
3143
+ // COMPAT(hubExecutionWorkspaceSelection): semantics retired in v0.3.1; remove after 2027-08-08 once the Hub floor no longer sends it.
2918
3144
  workspaceId: z.string().optional(),
2919
3145
  model: z.string().optional(),
2920
3146
  modeId: z.string().optional(),
2921
3147
  thinkingOptionId: z.string().optional(),
2922
3148
  featureValues: z.record(z.string(), z.unknown()).optional(),
3149
+ providerOptions: ProviderOptionsSchema.optional(),
3150
+ toolPolicy: ToolPolicySchema.optional(),
2923
3151
  env: z.record(z.string(), z.string()).optional(),
3152
+ mcpServers: z.record(z.string(), McpServerConfigSchema).optional(),
2924
3153
  worktree: CreateAgentWorktreeTargetSchema.optional(),
2925
3154
  });
3155
+ export const HubExecutionAgentValidateRequestSchema = z.object({
3156
+ type: z.literal("hub.execution.agent.validate.request"),
3157
+ requestId: z.string(),
3158
+ provider: z.string(),
3159
+ model: z.string().optional(),
3160
+ modeId: z.string().optional(),
3161
+ thinkingOptionId: z.string().optional(),
3162
+ providerOptions: ProviderOptionsSchema.optional(),
3163
+ });
3164
+ const HubExecutionAgentCreateErrorSchema = z.discriminatedUnion("code", [
3165
+ z.object({
3166
+ code: z.literal("provider_options_invalid"),
3167
+ provider: z.string(),
3168
+ issues: z.array(z.object({
3169
+ path: z.array(z.union([z.string(), z.number()])),
3170
+ message: z.string(),
3171
+ })),
3172
+ message: z.string(),
3173
+ }),
3174
+ z.object({
3175
+ code: z.literal("tool_policy_unsupported"),
3176
+ provider: z.string(),
3177
+ message: z.string(),
3178
+ }),
3179
+ z.object({
3180
+ code: z.literal("create_failed"),
3181
+ message: z.string(),
3182
+ }),
3183
+ ]);
2926
3184
  export const HubExecutionControlActionSchema = z.enum(["interrupt", "archive"]);
2927
3185
  export const HubExecutionControlRequestSchema = z.object({
2928
3186
  type: z.literal("hub.execution.control.request"),
@@ -2932,6 +3190,7 @@ export const HubExecutionControlRequestSchema = z.object({
2932
3190
  });
2933
3191
  export const SessionInboundMessageSchema = z.discriminatedUnion("type", [
2934
3192
  HubExecutionAgentCreateRequestSchema,
3193
+ HubExecutionAgentValidateRequestSchema,
2935
3194
  HubExecutionControlRequestSchema,
2936
3195
  BrowserAutomationExecuteResponseSchema,
2937
3196
  VoiceAudioChunkMessageSchema,
@@ -2989,6 +3248,7 @@ export const SessionInboundMessageSchema = z.discriminatedUnion("type", [
2989
3248
  UpdateAgentRequestMessageSchema,
2990
3249
  ProjectRenameRequestSchema,
2991
3250
  KanbanProjectTargetSetRequestSchema,
3251
+ ProjectIconSetRequestSchema,
2992
3252
  ProjectRemoveRequestSchema,
2993
3253
  ProjectLinksListRequestSchema,
2994
3254
  ProjectLinksSetRequestSchema,
@@ -3040,6 +3300,11 @@ export const SessionInboundMessageSchema = z.discriminatedUnion("type", [
3040
3300
  VisualizerVoiceCuesGenerateRequestSchema,
3041
3301
  AgentPersonalitiesGetStatsRequestSchema,
3042
3302
  AgentPersonalitiesGenerateProfileRequestSchema,
3303
+ // COMPAT(agentProfileRpcs): added in v0.8.13, drop the legacy names above
3304
+ // when the daemon floor >= v0.8.13.
3305
+ AgentProfileStatsRequestSchema,
3306
+ AgentProfileGeneratePromptRequestSchema,
3307
+ AgentProfileGenerateVoiceCuesRequestSchema,
3043
3308
  ReadProjectConfigRequestMessageSchema,
3044
3309
  WriteProjectConfigRequestMessageSchema,
3045
3310
  DictationStreamStartMessageSchema,
@@ -3073,6 +3338,10 @@ export const SessionInboundMessageSchema = z.discriminatedUnion("type", [
3073
3338
  PersonalityMemoryUpdateRequestMessageSchema,
3074
3339
  PersonalityMemoryTransferRequestMessageSchema,
3075
3340
  PersonalityMemoryStatsRequestMessageSchema,
3341
+ ProfileMemoryListRequestMessageSchema,
3342
+ ProfileMemoryUpdateRequestMessageSchema,
3343
+ ProfileMemoryTransferRequestMessageSchema,
3344
+ ProfileMemoryStatsRequestMessageSchema,
3076
3345
  StatsActivityResetRequestMessageSchema,
3077
3346
  UsageLogGetRequestMessageSchema,
3078
3347
  AgentContextGetUsageRequestMessageSchema,
@@ -3084,6 +3353,7 @@ export const SessionInboundMessageSchema = z.discriminatedUnion("type", [
3084
3353
  RestartServerRequestMessageSchema,
3085
3354
  DaemonUpdateRequestMessageSchema,
3086
3355
  FetchAgentTimelineRequestMessageSchema,
3356
+ AgentTimelineListPromptsRequestMessageSchema,
3087
3357
  ProviderSubagentListRequestMessageSchema,
3088
3358
  ProviderSubagentTimelineRequestMessageSchema,
3089
3359
  SetAgentTimelineSubscriptionRequestMessageSchema,
@@ -3092,6 +3362,7 @@ export const SessionInboundMessageSchema = z.discriminatedUnion("type", [
3092
3362
  SetAgentModelRequestMessageSchema,
3093
3363
  SetAgentThinkingRequestMessageSchema,
3094
3364
  SetAgentFeatureRequestMessageSchema,
3365
+ AgentConfigApplyRequestMessageSchema,
3095
3366
  AgentDetachRequestMessageSchema,
3096
3367
  AgentWorkspaceTransferRequestMessageSchema,
3097
3368
  AgentSubagentStopRequestMessageSchema,
@@ -3100,6 +3371,7 @@ export const SessionInboundMessageSchema = z.discriminatedUnion("type", [
3100
3371
  TasksSuggestedStartRequestMessageSchema,
3101
3372
  TasksSuggestedDismissRequestMessageSchema,
3102
3373
  AgentPersonalitySetRequestMessageSchema,
3374
+ AgentProfileSetRequestMessageSchema,
3103
3375
  AgentRewindRequestMessageSchema,
3104
3376
  AgentQueueRemoveRequestMessageSchema,
3105
3377
  AgentQueueReorderRequestMessageSchema,
@@ -3135,6 +3407,7 @@ export const SessionInboundMessageSchema = z.discriminatedUnion("type", [
3135
3407
  CheckoutPushRequestSchema,
3136
3408
  CheckoutRefreshRequestSchema,
3137
3409
  CheckoutGitFetchRequestSchema,
3410
+ CheckoutDiscardChangesRequestSchema,
3138
3411
  CheckoutPrCreateRequestSchema,
3139
3412
  CheckoutPrMergeRequestSchema,
3140
3413
  CheckoutForgeSetAutoMergeRequestSchema,
@@ -3192,7 +3465,12 @@ export const SessionInboundMessageSchema = z.discriminatedUnion("type", [
3192
3465
  FileUnsubscribeRequestSchema,
3193
3466
  FsFileWriteRequestSchema,
3194
3467
  FsFileWriteBinaryRequestSchema,
3468
+ FileEntryCreateRequestSchema,
3469
+ FileEntryRenameRequestSchema,
3470
+ FileEntryDuplicateRequestSchema,
3471
+ FileEntryDeleteRequestSchema,
3195
3472
  ProjectIconRequestSchema,
3473
+ ProjectIconGetRequestSchema,
3196
3474
  FileDownloadTokenRequestSchema,
3197
3475
  FileUploadRequestSchema,
3198
3476
  FileWriteRequestSchema,
@@ -3225,6 +3503,7 @@ export const SessionInboundMessageSchema = z.discriminatedUnion("type", [
3225
3503
  PingMessageSchema,
3226
3504
  ListCommandsRequestSchema,
3227
3505
  RegisterPushTokenMessageSchema,
3506
+ PushUnregisterRequestSchema,
3228
3507
  ListTerminalsRequestSchema,
3229
3508
  SubscribeTerminalsRequestSchema,
3230
3509
  UnsubscribeTerminalsRequestSchema,
@@ -3425,6 +3704,8 @@ export const ServerInfoStatusPayloadSchema = z
3425
3704
  features: z
3426
3705
  .object({
3427
3706
  providersSnapshot: z.boolean().optional(),
3707
+ // COMPAT(providersSnapshotCwd): added in v0.3.2, remove gate after 2027-02-10.
3708
+ providersSnapshotCwd: z.boolean().optional(),
3428
3709
  // COMPAT(checkoutForgeSetAutoMerge): added in v0.1.106, remove old
3429
3710
  // checkoutGithubSetAutoMerge fallback after 2026-12-28.
3430
3711
  checkoutForgeSetAutoMerge: z.boolean().optional(),
@@ -3437,6 +3718,10 @@ export const ServerInfoStatusPayloadSchema = z
3437
3718
  forgeSearch: z.boolean().optional(),
3438
3719
  // COMPAT(daemonStatusRpc): added in v0.1.76, remove gate after 2026-11-18.
3439
3720
  daemonStatusRpc: z.boolean().optional(),
3721
+ // COMPAT(relayConfig): added in v0.2.6, remove gate after 2027-01-31.
3722
+ relayConfig: z.boolean().optional(),
3723
+ // COMPAT(pushTokenRevocation): added in v0.3.2, remove gate after 2027-02-10.
3724
+ pushTokenRevocation: z.boolean().optional(),
3440
3725
  // COMPAT(terminalRestoreModes): added in v0.1.81, remove gate after 2026-11-23.
3441
3726
  "terminal-restore-modes": z.boolean().optional(),
3442
3727
  // COMPAT(terminalCompatibilityDiagnostic): added in v0.8.9, remove gate after 2027-02-12.
@@ -3444,8 +3729,16 @@ export const ServerInfoStatusPayloadSchema = z
3444
3729
  terminalEmbeddedPresentation: z.boolean().optional(),
3445
3730
  // COMPAT(terminalTitleSettings): added in v0.8.5, remove gate after 2027-02-07.
3446
3731
  terminalTitleSettings: z.boolean().optional(),
3732
+ // COMPAT(terminalInputModeReplay): added in v0.2.6, remove gate after 2027-02-02.
3733
+ "terminal-input-mode-replay": z.boolean().optional(),
3734
+ // COMPAT(terminalSizeOwnership): added in v0.2.6, remove gate after 2027-02-02.
3735
+ "terminal-size-ownership": z.boolean().optional(),
3447
3736
  // COMPAT(rewind): added in v0.1.X, drop the gate when floor >= v0.1.X.
3448
3737
  rewind: z.boolean().optional(),
3738
+ // COMPAT(agentTimelinePromptIndex): added in v0.2.X, drop the gate when floor >= v0.2.X.
3739
+ agentTimelinePromptIndex: z.boolean().optional(),
3740
+ // COMPAT(agentHistorySearch): added in v0.3.0, remove gate after 2027-02-07.
3741
+ agentHistorySearch: z.boolean().optional(),
3449
3742
  // COMPAT(checkoutRefresh): added in v0.1.86, remove gate after 2026-11-29.
3450
3743
  checkoutRefresh: z.boolean().optional(),
3451
3744
  // COMPAT(gitFetchControl): added in v0.8.11, remove gate after 2027-02-14.
@@ -3493,6 +3786,10 @@ export const ServerInfoStatusPayloadSchema = z
3493
3786
  // older daemons, whose Brain config rejects the field.
3494
3787
  // COMPAT(brainRuntimeLogVerbosity): added in v0.8.10, drop the gate when daemon floor >= v0.8.10.
3495
3788
  brainRuntimeLogVerbosity: z.boolean().optional(),
3789
+ // The Brain host can keep multiple independent model processes resident
3790
+ // and exposes maxLoadedModels/lockedModels in local and remote settings.
3791
+ // COMPAT(brainModelProcessPool): added in v0.8.12, remove after 2027-02-21.
3792
+ brainModelProcessPool: z.boolean().optional(),
3496
3793
  // Daemon streams the brain's live status/telemetry via
3497
3794
  // subscribe_brain_status + brain_status_changed, and serves brain.evals.get.
3498
3795
  // Separate from brainControl because status/eval watching can ship after
@@ -3661,6 +3958,12 @@ export const ServerInfoStatusPayloadSchema = z
3661
3958
  ttsSpeak: z.boolean().optional(),
3662
3959
  // COMPAT(visualizerVoiceCues): added in v0.6.3, drop the gate when daemon floor >= v0.6.3.
3663
3960
  visualizerVoiceCues: z.boolean().optional(),
3961
+ // The daemon accepts the profile-named halves of the personality RPCs
3962
+ // (agent.profile.*, profile.memory.*). Purely a rename: the legacy names
3963
+ // keep working, so this gates WHICH literal the client emits, never
3964
+ // whether the feature exists.
3965
+ // COMPAT(agentProfileRpcs): added in v0.8.13, drop the gate when daemon floor >= v0.8.13.
3966
+ agentProfileRpcs: z.boolean().optional(),
3664
3967
  // COMPAT(personalityProfile): added in v0.7.5, drop the gate when daemon floor >= v0.7.5.
3665
3968
  // Host can author a personality profile (the prompt prose) from a name,
3666
3969
  // roles, and spinner colors.
@@ -3930,10 +4233,29 @@ export const ServerInfoStatusPayloadSchema = z
3930
4233
  forgeProviders: z.boolean().optional(),
3931
4234
  // COMPAT(selectiveAgentTimeline): added in v0.1.106, remove after 2027-01-12.
3932
4235
  selectiveAgentTimeline: z.boolean().optional(),
4236
+ // COMPAT(canonicalSubmittedPrompts): added in v0.2.6, remove gate after 2027-01-30.
4237
+ canonicalSubmittedPrompts: z.boolean().optional(),
4238
+ // COMPAT(agentTurnIdentity): accept peers that observed pre-release v0.2.6 through 2027-01-31.
4239
+ agentTurnIdentity: z.boolean().optional(),
3933
4240
  // COMPAT(stableProjectIdentity): added in v0.1.109, remove gate after 2027-01-15.
3934
4241
  stableProjectIdentity: z.boolean().optional(),
3935
4242
  // COMPAT(workspaceScriptManagement): added in v0.1.105, remove gate after 2027-01-10.
3936
4243
  workspaceScriptManagement: z.boolean().optional(),
4244
+ // COMPAT(projectCustomIcon): added in v0.2.0, remove after 2027-01-20.
4245
+ projectCustomIcon: z.boolean().optional(),
4246
+ // COMPAT(fsEntryOps): added in v0.3.0, remove gate after 2027-02-08.
4247
+ fsEntryOps: z.boolean().optional(),
4248
+ // COMPAT(fsEntryDuplicate): added in v0.3.0, remove gate after 2027-02-09.
4249
+ fsEntryDuplicate: z.boolean().optional(),
4250
+ // COMPAT(checkoutDiscardChanges): added in v0.3.0, remove gate after 2027-02-08.
4251
+ checkoutDiscardChanges: z.boolean().optional(),
4252
+ // COMPAT(agentProfiles): added in v0.3.2, remove gate after 2027-02-11.
4253
+ // An older daemon parses its persisted config strictly, so writing
4254
+ // agentProfiles to one is silently dropped. The client hides the feature
4255
+ // rather than letting a save appear to succeed.
4256
+ agentProfiles: z.boolean().optional(),
4257
+ // COMPAT(agentConfigApply): added in v0.3.2, remove gate after 2027-02-11.
4258
+ agentConfigApply: z.boolean().optional(),
3937
4259
  })
3938
4260
  .optional(),
3939
4261
  })
@@ -4226,8 +4548,14 @@ export const WorkspaceDescriptorPayloadSchema = z
4226
4548
  // COMPAT(projectKanbanTarget): added in v0.8.11, drop the optional gate when
4227
4549
  // floor >= v0.8.11.
4228
4550
  projectKanban: ProjectKanbanTargetSchema.nullable().optional(),
4551
+ // Identifies the project's stored custom icon; null means automatic.
4552
+ // COMPAT(projectCustomIcon): added in v0.2.0, remove after 2027-01-20.
4553
+ projectCustomIconRevision: z.string().nullable().optional(),
4229
4554
  projectRootPath: z.string(),
4230
4555
  workspaceDirectory: z.string().optional(),
4556
+ // COMPAT(worktreeSlug): added in v0.2.6, remove optional after 2027-01-31.
4557
+ // Present only for Otto-owned worktrees; this is the basename of their root directory.
4558
+ worktreeSlug: z.string().optional(),
4231
4559
  projectKind: z.enum(["git", "non_git", "directory"]),
4232
4560
  // COMPAT(workspaces): keep the legacy "directory" workspace kind parseable.
4233
4561
  // Persisted registries still carry it and there is no migration, so this
@@ -4328,9 +4656,25 @@ export const AgentListMessageSchema = z.object({
4328
4656
  agents: z.array(AgentSnapshotPayloadSchema),
4329
4657
  }),
4330
4658
  });
4659
+ export const AgentSearchMatchFieldSchema = z.enum(["workspace", "title", "branch", "project"]);
4660
+ export const AgentSearchMatchSchema = z.object({
4661
+ field: AgentSearchMatchFieldSchema,
4662
+ ranges: z.array(z.object({
4663
+ start: z.number().int().nonnegative(),
4664
+ length: z.number().int().positive(),
4665
+ })),
4666
+ });
4331
4667
  const AgentDirectoryResponseEntrySchema = z.object({
4332
4668
  agent: AgentSnapshotPayloadSchema,
4333
4669
  project: ProjectPlacementPayloadSchema,
4670
+ // Relevance of this entry to the request's `search`, lower being better.
4671
+ // Set only when the request carried a query; a client merging results from
4672
+ // several hosts needs it to interleave their separately ranked pages.
4673
+ searchScore: z.number().optional(),
4674
+ // Where the query matched, so the row can mark it. The ranker computes this
4675
+ // anyway; sending it keeps the client from re-deriving a second opinion that
4676
+ // could disagree with the ranking it is explaining.
4677
+ searchMatches: z.array(AgentSearchMatchSchema).optional(),
4334
4678
  });
4335
4679
  const AgentDirectoryPageInfoSchema = z.object({
4336
4680
  nextCursor: z.string().nullable(),
@@ -4352,6 +4696,10 @@ export const FetchAgentHistoryResponseMessageSchema = z.object({
4352
4696
  requestId: z.string(),
4353
4697
  entries: z.array(AgentDirectoryResponseEntrySchema),
4354
4698
  pageInfo: AgentDirectoryPageInfoSchema,
4699
+ // More sessions matched the request's `search` than the page could hold.
4700
+ // Distinct from `pageInfo.hasMore`, which promises a fetchable next page —
4701
+ // a ranked result set has none, and the way on is a narrower query.
4702
+ searchTruncated: z.boolean().optional(),
4355
4703
  }),
4356
4704
  });
4357
4705
  export const FetchRecentProviderSessionsResponseMessageSchema = z.object({
@@ -4378,6 +4726,8 @@ export const WorkspaceProjectDescriptorPayloadSchema = z.object({
4378
4726
  // COMPAT(projectKanbanTarget): added in v0.8.11, drop the optional gate when
4379
4727
  // floor >= v0.8.11.
4380
4728
  projectKanban: ProjectKanbanTargetSchema.nullable().optional(),
4729
+ // COMPAT(projectCustomIcon): added in v0.2.0, remove after 2027-01-20.
4730
+ projectCustomIconRevision: z.string().nullable().optional(),
4381
4731
  projectRootPath: z.string(),
4382
4732
  projectKind: z.enum(["git", "non_git", "directory"]),
4383
4733
  });
@@ -4755,10 +5105,25 @@ export const FetchAgentTimelineResponseMessageSchema = z.object({
4755
5105
  endCursor: AgentTimelineCursorSchema.nullable(),
4756
5106
  hasOlder: z.boolean(),
4757
5107
  hasNewer: z.boolean(),
5108
+ mergeWindow: z.boolean().optional(),
4758
5109
  entries: z.array(AgentTimelineEntryPayloadSchema),
4759
5110
  error: z.string().nullable(),
4760
5111
  }),
4761
5112
  });
5113
+ export const AgentTimelineListPromptsResponseMessageSchema = z.object({
5114
+ type: z.literal("agent.timeline.list_prompts.response"),
5115
+ payload: z.object({
5116
+ requestId: z.string(),
5117
+ agentId: z.string(),
5118
+ epoch: z.string(),
5119
+ prompts: z.array(z.object({
5120
+ seq: z.number().int().nonnegative(),
5121
+ timestamp: z.string(),
5122
+ preview: z.string(),
5123
+ })),
5124
+ error: z.string().nullable(),
5125
+ }),
5126
+ });
4762
5127
  export const ProviderSubagentDescriptorPayloadSchema = z.object({
4763
5128
  id: z.string(),
4764
5129
  parentAgentId: z.string(),
@@ -4770,6 +5135,9 @@ export const ProviderSubagentDescriptorPayloadSchema = z.object({
4770
5135
  updatedAt: z.string(),
4771
5136
  toolCallId: z.string().nullable(),
4772
5137
  cwd: z.string().nullable().optional(),
5138
+ // Compact provider-owned context for the shared track. Providers choose what belongs here and
5139
+ // format it for display; clients must not parse provider-specific facts out of this string.
5140
+ subtitle: z.string().nullable().optional(),
4773
5141
  });
4774
5142
  export const ProviderSubagentListResponseMessageSchema = z.object({
4775
5143
  type: z.literal("agent.provider_subagents.list.response"),
@@ -5054,6 +5422,7 @@ export const ReadProjectConfigResponseMessageSchema = z.object({
5054
5422
  ok: z.literal(true),
5055
5423
  config: OttoConfigRawSchema.nullable(),
5056
5424
  revision: OttoConfigRevisionSchema.nullable(),
5425
+ hasUncommittedWorktreeSetupChanges: z.boolean().optional(),
5057
5426
  }),
5058
5427
  z.object({
5059
5428
  requestId: z.string(),
@@ -5074,6 +5443,7 @@ export const WriteProjectConfigResponseMessageSchema = z.object({
5074
5443
  ok: z.literal(true),
5075
5444
  config: OttoConfigRawSchema,
5076
5445
  revision: OttoConfigRevisionSchema,
5446
+ hasUncommittedWorktreeSetupChanges: z.boolean().optional(),
5077
5447
  }),
5078
5448
  z.object({
5079
5449
  requestId: z.string(),
@@ -5152,6 +5522,13 @@ const CheckoutStatusCommonSchema = z.object({
5152
5522
  // client inferred from isOttoOwnedWorktree.
5153
5523
  // COMPAT(checkoutDiffBaseAnyRepo): added in v0.7.4.
5154
5524
  isBaseEditable: z.boolean().optional(),
5525
+ // The full ref currentBranch tracks, as git resolves `<branch>@{upstream}`:
5526
+ // "refs/remotes/origin/main", "refs/remotes/upstream/main" on a fork, or a
5527
+ // "refs/heads/..." ref for a branch tracking a local branch. Null when there is no
5528
+ // upstream. Clients use it verbatim — the remote is not necessarily origin and the
5529
+ // upstream branch name is not necessarily currentBranch, so composing one is wrong.
5530
+ // aheadOfOrigin/behindOfOrigin are measured against exactly this ref.
5531
+ upstreamRef: z.string().nullable().optional(),
5155
5532
  });
5156
5533
  const CheckoutStatusNotGitSchema = CheckoutStatusCommonSchema.extend({
5157
5534
  isGit: z.literal(false),
@@ -5547,6 +5924,15 @@ export const CheckoutGithubSetAutoMergeResponseSchema = z.object({
5547
5924
  requestId: z.string(),
5548
5925
  }),
5549
5926
  });
5927
+ export const CheckoutDiscardChangesResponseSchema = z.object({
5928
+ type: z.literal("checkout.discard_changes.response"),
5929
+ payload: z.object({
5930
+ cwd: z.string(),
5931
+ success: z.boolean(),
5932
+ error: CheckoutErrorSchema.nullable(),
5933
+ requestId: z.string(),
5934
+ }),
5935
+ });
5550
5936
  export const CheckoutCommitsListResponseSchema = z.object({
5551
5937
  type: z.literal("checkout.commits.list.response"),
5552
5938
  payload: z.object({
@@ -5845,6 +6231,8 @@ export const BranchSuggestionsResponseSchema = z.object({
5845
6231
  // older daemons, in which case pickers disable nothing (today's
5846
6232
  // behavior).
5847
6233
  checkedOutElsewhere: z.boolean().optional(),
6234
+ localAhead: z.number().int().nonnegative().optional(),
6235
+ localBehind: z.number().int().nonnegative().optional(),
5848
6236
  }))
5849
6237
  .optional(),
5850
6238
  error: z.string().nullable(),
@@ -5996,6 +6384,49 @@ export const FsFileWriteBinaryResponseSchema = z.object({
5996
6384
  requestId: z.string(),
5997
6385
  }),
5998
6386
  });
6387
+ export const FileEntryCreateResponseSchema = z.object({
6388
+ type: z.literal("fs.entry.create.response"),
6389
+ payload: z.object({
6390
+ cwd: z.string(),
6391
+ parentPath: z.string(),
6392
+ path: z.string().nullable(),
6393
+ success: z.boolean(),
6394
+ error: z.string().nullable(),
6395
+ requestId: z.string(),
6396
+ }),
6397
+ });
6398
+ export const FileEntryRenameResponseSchema = z.object({
6399
+ type: z.literal("fs.entry.rename.response"),
6400
+ payload: z.object({
6401
+ cwd: z.string(),
6402
+ path: z.string(),
6403
+ renamedPath: z.string().nullable(),
6404
+ success: z.boolean(),
6405
+ error: z.string().nullable(),
6406
+ requestId: z.string(),
6407
+ }),
6408
+ });
6409
+ export const FileEntryDuplicateResponseSchema = z.object({
6410
+ type: z.literal("fs.entry.duplicate.response"),
6411
+ payload: z.object({
6412
+ cwd: z.string(),
6413
+ path: z.string(),
6414
+ duplicatedPath: z.string().nullable(),
6415
+ success: z.boolean(),
6416
+ error: z.string().nullable(),
6417
+ requestId: z.string(),
6418
+ }),
6419
+ });
6420
+ export const FileEntryDeleteResponseSchema = z.object({
6421
+ type: z.literal("fs.entry.delete.response"),
6422
+ payload: z.object({
6423
+ cwd: z.string(),
6424
+ path: z.string(),
6425
+ success: z.boolean(),
6426
+ error: z.string().nullable(),
6427
+ requestId: z.string(),
6428
+ }),
6429
+ });
5999
6430
  export const FileUpdateSchema = z.object({
6000
6431
  type: z.literal("fs.file.update"),
6001
6432
  payload: z.object({
@@ -6016,6 +6447,15 @@ export const ProjectIconResponseSchema = z.object({
6016
6447
  requestId: z.string(),
6017
6448
  }),
6018
6449
  });
6450
+ export const ProjectIconGetResponseSchema = z.object({
6451
+ type: z.literal("project.icon.get.response"),
6452
+ payload: z.object({
6453
+ projectId: z.string(),
6454
+ icon: ProjectIconSchema.nullable(),
6455
+ error: z.string().nullable(),
6456
+ requestId: z.string(),
6457
+ }),
6458
+ });
6019
6459
  export const FileDownloadTokenResponseSchema = z.object({
6020
6460
  type: z.literal("file_download_token_response"),
6021
6461
  payload: z.object({
@@ -6118,7 +6558,11 @@ export const ListAvailableProvidersResponseSchema = z.object({
6118
6558
  export const GetProvidersSnapshotResponseMessageSchema = z.object({
6119
6559
  type: z.literal("get_providers_snapshot_response"),
6120
6560
  payload: z.object({
6561
+ cwd: z.string().optional(),
6121
6562
  entries: z.array(ProviderSnapshotEntrySchema),
6563
+ compactSnapshot: CompactProviderSnapshotSchema.optional(),
6564
+ snapshotHash: z.string().optional(),
6565
+ notModified: z.boolean().optional(),
6122
6566
  generatedAt: z.string(),
6123
6567
  requestId: z.string(),
6124
6568
  }),
@@ -6129,6 +6573,8 @@ export const ProvidersSnapshotUpdateMessageSchema = z.object({
6129
6573
  payload: z.object({
6130
6574
  cwd: z.string().optional(),
6131
6575
  entries: z.array(ProviderSnapshotEntrySchema),
6576
+ compactSnapshot: CompactProviderSnapshotSchema.optional(),
6577
+ snapshotHash: z.string().optional(),
6132
6578
  generatedAt: z.string(),
6133
6579
  }),
6134
6580
  });
@@ -6370,6 +6816,20 @@ export const HubExecutionAgentCreateResponseSchema = z.object({
6370
6816
  agentId: z.string().nullable(),
6371
6817
  agent: AgentSnapshotPayloadSchema.nullable(),
6372
6818
  success: z.boolean(),
6819
+ toolPolicyApplied: z.literal(true).optional(),
6820
+ error: HubExecutionAgentCreateErrorSchema.nullable(),
6821
+ }),
6822
+ });
6823
+ export const HubExecutionAgentValidationIssueSchema = z.object({
6824
+ path: z.array(z.union([z.string(), z.number()])),
6825
+ message: z.string(),
6826
+ });
6827
+ export const HubExecutionAgentValidateResponseSchema = z.object({
6828
+ type: z.literal("hub.execution.agent.validate.response"),
6829
+ payload: z.object({
6830
+ requestId: z.string(),
6831
+ valid: z.boolean(),
6832
+ issues: z.array(HubExecutionAgentValidationIssueSchema),
6373
6833
  error: z.string().nullable(),
6374
6834
  }),
6375
6835
  });
@@ -6401,6 +6861,7 @@ export const HubExecutionAgentStreamSchema = z.object({
6401
6861
  });
6402
6862
  export const HubExecutionOutboundMessageSchema = z.discriminatedUnion("type", [
6403
6863
  HubExecutionAgentCreateResponseSchema,
6864
+ HubExecutionAgentValidateResponseSchema,
6404
6865
  HubExecutionControlResponseSchema,
6405
6866
  HubExecutionAgentUpdateSchema,
6406
6867
  HubExecutionAgentStreamSchema,
@@ -6425,6 +6886,7 @@ export function parseHubExecutionOutboundMessage(value) {
6425
6886
  }
6426
6887
  export const SessionOutboundMessageSchema = z.discriminatedUnion("type", [
6427
6888
  HubExecutionAgentCreateResponseSchema,
6889
+ HubExecutionAgentValidateResponseSchema,
6428
6890
  HubExecutionControlResponseSchema,
6429
6891
  HubExecutionAgentUpdateSchema,
6430
6892
  HubExecutionAgentStreamSchema,
@@ -6441,6 +6903,7 @@ export const SessionOutboundMessageSchema = z.discriminatedUnion("type", [
6441
6903
  DictationStreamErrorMessageSchema,
6442
6904
  StatusMessageSchema,
6443
6905
  PongMessageSchema,
6906
+ PushUnregisterResponseSchema,
6444
6907
  RpcErrorMessageSchema,
6445
6908
  ArtifactMessageSchema,
6446
6909
  ArtifactUpdateMessageSchema,
@@ -6478,6 +6941,7 @@ export const SessionOutboundMessageSchema = z.discriminatedUnion("type", [
6478
6941
  WorktreeReattachResponseSchema,
6479
6942
  FetchAgentResponseMessageSchema,
6480
6943
  FetchAgentTimelineResponseMessageSchema,
6944
+ AgentTimelineListPromptsResponseMessageSchema,
6481
6945
  ProviderSubagentListResponseMessageSchema,
6482
6946
  ProviderSubagentTimelineResponseMessageSchema,
6483
6947
  ProviderSubagentUpdateMessageSchema,
@@ -6532,12 +6996,16 @@ export const SessionOutboundMessageSchema = z.discriminatedUnion("type", [
6532
6996
  VisualizerVoiceCuesGenerateResponseSchema,
6533
6997
  AgentPersonalitiesGetStatsResponseSchema,
6534
6998
  AgentPersonalitiesGenerateProfileResponseSchema,
6999
+ AgentProfileStatsResponseSchema,
7000
+ AgentProfileGeneratePromptResponseSchema,
7001
+ AgentProfileGenerateVoiceCuesResponseSchema,
6535
7002
  ReadProjectConfigResponseMessageSchema,
6536
7003
  WriteProjectConfigResponseMessageSchema,
6537
7004
  SetAgentModeResponseMessageSchema,
6538
7005
  SetAgentModelResponseMessageSchema,
6539
7006
  SetAgentThinkingResponseMessageSchema,
6540
7007
  SetAgentFeatureResponseMessageSchema,
7008
+ AgentConfigApplyResponseMessageSchema,
6541
7009
  AgentDetachResponseMessageSchema,
6542
7010
  AgentWorkspaceTransferResponseMessageSchema,
6543
7011
  AgentQueueRemoveResponseMessageSchema,
@@ -6552,11 +7020,13 @@ export const SessionOutboundMessageSchema = z.discriminatedUnion("type", [
6552
7020
  SuggestedTasksChangedSchema,
6553
7021
  ContextReportChangedSchema,
6554
7022
  AgentPersonalitySetResponseMessageSchema,
7023
+ AgentProfileSetResponseMessageSchema,
6555
7024
  AgentRewindResponseMessageSchema,
6556
7025
  UpdateAgentResponseMessageSchema,
6557
7026
  ProjectRenameResponseSchema,
6558
7027
  KanbanProjectTargetSetResponseSchema,
6559
7028
  ProjectUpdatedNotificationSchema,
7029
+ ProjectIconSetResponseSchema,
6560
7030
  ProjectRemoveResponseSchema,
6561
7031
  ProjectLinksListResponseSchema,
6562
7032
  ProjectLinksSetResponseSchema,
@@ -6647,6 +7117,7 @@ export const SessionOutboundMessageSchema = z.discriminatedUnion("type", [
6647
7117
  CheckoutPushResponseSchema,
6648
7118
  CheckoutRefreshResponseSchema,
6649
7119
  CheckoutGitFetchResponseSchema,
7120
+ CheckoutDiscardChangesResponseSchema,
6650
7121
  CheckoutPrCreateResponseSchema,
6651
7122
  CheckoutPrMergeResponseSchema,
6652
7123
  CheckoutForgeSetAutoMergeResponseSchema,
@@ -6688,8 +7159,13 @@ export const SessionOutboundMessageSchema = z.discriminatedUnion("type", [
6688
7159
  FileUnsubscribeResponseSchema,
6689
7160
  FsFileWriteResponseSchema,
6690
7161
  FsFileWriteBinaryResponseSchema,
7162
+ FileEntryCreateResponseSchema,
7163
+ FileEntryRenameResponseSchema,
7164
+ FileEntryDuplicateResponseSchema,
7165
+ FileEntryDeleteResponseSchema,
6691
7166
  FileUpdateSchema,
6692
7167
  ProjectIconResponseSchema,
7168
+ ProjectIconGetResponseSchema,
6693
7169
  FileDownloadTokenResponseSchema,
6694
7170
  FileUploadResponseSchema,
6695
7171
  FileWriteResponseSchema,
@@ -6746,6 +7222,10 @@ export const SessionOutboundMessageSchema = z.discriminatedUnion("type", [
6746
7222
  PersonalityMemoryUpdateResponseMessageSchema,
6747
7223
  PersonalityMemoryTransferResponseMessageSchema,
6748
7224
  PersonalityMemoryStatsResponseMessageSchema,
7225
+ ProfileMemoryListResponseMessageSchema,
7226
+ ProfileMemoryUpdateResponseMessageSchema,
7227
+ ProfileMemoryTransferResponseMessageSchema,
7228
+ ProfileMemoryStatsResponseMessageSchema,
6749
7229
  StatsActivityResetResponseMessageSchema,
6750
7230
  UsageLogGetResponseMessageSchema,
6751
7231
  ActivityStatsChangedSchema,
@@ -6824,6 +7304,7 @@ export const WSHelloMessageSchema = z.object({
6824
7304
  [CLIENT_CAPS.terminalReflowableSnapshot]: z.boolean().optional(),
6825
7305
  [CLIENT_CAPS.providerSubagents]: z.boolean().optional(),
6826
7306
  [CLIENT_CAPS.projectUpdates]: z.boolean().optional(),
7307
+ [CLIENT_CAPS.compactProviderSnapshots]: z.boolean().optional(),
6827
7308
  [CLIENT_CAPS.browserHost]: BrowserAutomationHostCapabilitySchema.optional(),
6828
7309
  })
6829
7310
  .passthrough()