@otto-code/protocol 0.8.17 → 0.8.18

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.
@@ -39,6 +39,10 @@ export const ProviderProfileModelSchema = z.object({
39
39
  * Otto tools natively (see the openai-compat provider) can be scoped to a subset
40
40
  * of these groups; omitting the selection means all groups. Kept deliberately
41
41
  * coarse - users pick groups, not individual tools.
42
+ *
43
+ * The list is APPEND-ONLY, and the wire never carries it as a closed enum (see
44
+ * normalizeOttoToolGroups): an older peer must be able to parse a newer peer's
45
+ * selection, dropping names it does not know rather than failing the message.
42
46
  */
43
47
  export const OTTO_TOOL_GROUPS = [
44
48
  "preview",
@@ -50,29 +54,165 @@ export const OTTO_TOOL_GROUPS = [
50
54
  "artifacts",
51
55
  "widgets",
52
56
  "workspace",
57
+ // Split out of the "agents" catch-all, which had grown to hold 60% of the
58
+ // catalog and so could not be switched off for one reason without losing six
59
+ // unrelated capabilities with it.
60
+ "orchestration",
61
+ "knowledge",
62
+ "memory",
63
+ "permissions",
64
+ "providers",
65
+ "tasks",
66
+ "voice",
67
+ ];
68
+ /**
69
+ * The taxonomy as it stood before the "agents" split. A stored selection that
70
+ * uses only these names predates the split and is migrated forward by
71
+ * expandLegacyOttoToolGroups.
72
+ */
73
+ export const LEGACY_OTTO_TOOL_GROUPS = [
74
+ "preview",
75
+ "browser",
76
+ "web",
77
+ "agents",
78
+ "terminals",
79
+ "schedules",
80
+ "artifacts",
81
+ "widgets",
82
+ "workspace",
83
+ ];
84
+ /**
85
+ * The categories carved out of the legacy "agents" catch-all. They inherit
86
+ * "agents" when a pre-split selection is migrated forward, and collapse back
87
+ * into it when a current selection is projected back for an older peer.
88
+ */
89
+ export const AGENTS_DERIVED_TOOL_GROUPS = [
90
+ "orchestration",
91
+ "knowledge",
92
+ "memory",
93
+ "permissions",
94
+ "providers",
95
+ "tasks",
96
+ "voice",
97
+ ];
98
+ const OTTO_TOOL_GROUP_SET = new Set(OTTO_TOOL_GROUPS);
99
+ const LEGACY_OTTO_TOOL_GROUP_SET = new Set(LEGACY_OTTO_TOOL_GROUPS);
100
+ const AGENTS_DERIVED_TOOL_GROUP_SET = new Set(AGENTS_DERIVED_TOOL_GROUPS);
101
+ export function isOttoToolGroup(value) {
102
+ return typeof value === "string" && OTTO_TOOL_GROUP_SET.has(value);
103
+ }
104
+ /**
105
+ * Post-validation normalization for a stored or wire-carried group selection.
106
+ * The schemas that carry it are `string[]` on purpose - wire schemas are pure
107
+ * structural declarations - and this is the one place unknown names are
108
+ * dropped, so a group added by a newer peer degrades to "not selected" instead
109
+ * of failing the whole message.
110
+ *
111
+ * Returns undefined for a non-array, which every caller reads as "all groups".
112
+ */
113
+ export function normalizeOttoToolGroups(value) {
114
+ if (!Array.isArray(value)) {
115
+ return undefined;
116
+ }
117
+ const seen = new Set(value.filter(isOttoToolGroup));
118
+ return OTTO_TOOL_GROUPS.filter((group) => seen.has(group));
119
+ }
120
+ /**
121
+ * Migrate a pre-split selection forward: every category carved out of "agents"
122
+ * inherits whatever "agents" was set to. Without this, upgrading would silently
123
+ * strip project knowledge, orchestration, memory, permissions, provider lookups,
124
+ * tasks and voice from anyone who had ever touched a tool toggle.
125
+ */
126
+ export function expandLegacyOttoToolGroups(groups) {
127
+ const selected = new Set(groups.filter((group) => LEGACY_OTTO_TOOL_GROUP_SET.has(group)));
128
+ if (selected.has("agents")) {
129
+ for (const derived of AGENTS_DERIVED_TOOL_GROUPS) {
130
+ selected.add(derived);
131
+ }
132
+ }
133
+ return OTTO_TOOL_GROUPS.filter((group) => selected.has(group));
134
+ }
135
+ /**
136
+ * Project a current selection back into the pre-split taxonomy for the legacy
137
+ * key we keep writing. "agents" stands in for the whole family, so a peer that
138
+ * predates the split still grants the tools the user left enabled rather than
139
+ * withholding them.
140
+ */
141
+ export function toLegacyOttoToolGroups(groups) {
142
+ const selected = new Set(groups.filter((group) => LEGACY_OTTO_TOOL_GROUP_SET.has(group)));
143
+ if (groups.some((group) => AGENTS_DERIVED_TOOL_GROUP_SET.has(group))) {
144
+ selected.add("agents");
145
+ }
146
+ return LEGACY_OTTO_TOOL_GROUPS.filter((group) => selected.has(group));
147
+ }
148
+ /**
149
+ * Read a persisted selection that may be in either taxonomy.
150
+ *
151
+ * COMPAT(ottoToolGroupsV2): added in v0.8.20. The v2 key wins when present; the
152
+ * legacy key is migrated forward otherwise. A second key rather than a
153
+ * heuristic, because the two shapes are genuinely ambiguous - "no new groups
154
+ * listed" reads as "pre-split config" one way and "the user turned all seven
155
+ * off" the other, and silently re-enabling tools somebody disabled is the worse
156
+ * way to be wrong. Drop the legacy branch when the floor is >= v0.8.20.
157
+ */
158
+ export function resolveStoredOttoToolGroups(input) {
159
+ const v2 = normalizeOttoToolGroups(input.v2);
160
+ if (v2) {
161
+ return v2;
162
+ }
163
+ const legacy = normalizeOttoToolGroups(input.legacy);
164
+ return legacy ? expandLegacyOttoToolGroups(legacy) : undefined;
165
+ }
166
+ /** Both persisted shapes for one selection: the current key and its legacy projection. */
167
+ export function serializeOttoToolGroups(groups) {
168
+ const normalized = OTTO_TOOL_GROUPS.filter((group) => groups.includes(group));
169
+ return { toolGroups: toLegacyOttoToolGroups(normalized), toolGroupsV2: normalized };
170
+ }
171
+ /**
172
+ * Ordered: the first matching rule wins, so a name that could satisfy two rules
173
+ * resolves the same way every time. Prefer a shared substring over an exact-name
174
+ * list, so a tool added later lands in its category without a second edit here.
175
+ */
176
+ const OTTO_TOOL_GROUP_RULES = [
177
+ { group: "preview", prefixes: ["preview_"] },
178
+ { group: "browser", prefixes: ["browser_"] },
179
+ { group: "web", names: ["web_search", "web_fetch"] },
180
+ { group: "terminals", contains: ["terminal"] },
181
+ // "heartbeat" rather than just create_heartbeat: delete_heartbeat used to fall
182
+ // through to the catch-all, so switching Schedules off left an agent able to
183
+ // delete heartbeats it could no longer create.
184
+ { group: "schedules", contains: ["schedule", "heartbeat"] },
185
+ { group: "artifacts", contains: ["artifact"] },
186
+ { group: "widgets", names: ["show_widget", "widget_contract"] },
187
+ { group: "workspace", contains: ["worktree", "workspace"] },
188
+ { group: "orchestration", contains: ["orchestration"] },
189
+ { group: "knowledge", contains: ["project_"] },
190
+ { group: "memory", contains: ["lesson"] },
191
+ { group: "permissions", contains: ["permission"] },
192
+ { group: "tasks", contains: ["task"] },
193
+ // "model" must stay below the rules above it: it is one character from
194
+ // matching set_chat_mode, which belongs to the chat family.
195
+ { group: "providers", contains: ["provider", "model"] },
196
+ { group: "voice", names: ["speak"] },
53
197
  ];
54
198
  /**
55
199
  * Map a tool name to its group. Covers both Otto's catalog tools and the
56
- * openai-compat builtin web tools (web_search/web_fetch → "web"). Unknown/
57
- * lifecycle tools fall under "agents".
200
+ * openai-compat builtin web tools (web_search/web_fetch → "web").
201
+ *
202
+ * "agents" is still the fallback, but it now means what it says - spawning and
203
+ * steering chats - instead of "everything not otherwise classified". It used to
204
+ * collect 43 of the catalog's 72 tools, which made it impossible to switch off
205
+ * one capability without losing six unrelated ones.
58
206
  */
59
207
  export function ottoToolGroupForName(name) {
60
- if (name.startsWith("preview_"))
61
- return "preview";
62
- if (name.startsWith("browser_"))
63
- return "browser";
64
- if (name === "web_search" || name === "web_fetch")
65
- return "web";
66
- if (name.includes("terminal"))
67
- return "terminals";
68
- if (name.includes("schedule") || name === "create_heartbeat")
69
- return "schedules";
70
- if (name.includes("artifact"))
71
- return "artifacts";
72
- if (name === "show_widget" || name === "widget_contract")
73
- return "widgets";
74
- if (name.includes("worktree") || name.includes("workspace"))
75
- return "workspace";
208
+ for (const rule of OTTO_TOOL_GROUP_RULES) {
209
+ if (rule.prefixes?.some((prefix) => name.startsWith(prefix)))
210
+ return rule.group;
211
+ if (rule.names?.includes(name))
212
+ return rule.group;
213
+ if (rule.contains?.some((fragment) => name.includes(fragment)))
214
+ return rule.group;
215
+ }
76
216
  return "agents";
77
217
  }
78
218
  const McpStdioServerConfigSchema = z.object({
@@ -339,8 +479,15 @@ export const ProviderOverrideSchema = z.object({
339
479
  /**
340
480
  * Which Otto tool groups to inject for this provider (natively-injected
341
481
  * providers only). Omitted = all groups. Empty array = no Otto tools.
482
+ *
483
+ * COMPAT(ottoToolGroupsV2): added in v0.8.20. `ottoToolGroups` is the legacy
484
+ * projection kept for older peers; `ottoToolGroupsV2` is authoritative. Both
485
+ * are `string[]` rather than an enum so an older peer drops group names it
486
+ * does not know instead of failing to parse the provider entry - read them
487
+ * through resolveStoredOttoToolGroups, never directly.
342
488
  */
343
- ottoToolGroups: z.array(z.enum(OTTO_TOOL_GROUPS)).optional(),
489
+ ottoToolGroups: z.array(z.string().min(1)).optional(),
490
+ ottoToolGroupsV2: z.array(z.string().min(1)).optional(),
344
491
  /**
345
492
  * MCP servers for providers whose tool loop the daemon hosts (openai-compat).
346
493
  * Merged with any per-agent AgentSessionConfig.mcpServers; the per-agent
@@ -1414,6 +1414,10 @@ export declare const WSOutboundMessageSchema: {
1414
1414
  }>;
1415
1415
  boardId: import("zod").ZodOptional<import("zod").ZodNullable<import("zod").ZodString>>;
1416
1416
  }, import("zod/v4/core").$loose>>>;
1417
+ projectKnowledgeLocation: import("zod").ZodOptional<import("zod").ZodNullable<import("zod").ZodEnum<{
1418
+ repository: "repository";
1419
+ host: "host";
1420
+ }>>>;
1417
1421
  projectCustomIconRevision: import("zod").ZodOptional<import("zod").ZodNullable<import("zod").ZodString>>;
1418
1422
  projectRootPath: import("zod").ZodString;
1419
1423
  projectKind: import("zod").ZodEnum<{
@@ -1440,6 +1444,10 @@ export declare const WSOutboundMessageSchema: {
1440
1444
  }>;
1441
1445
  boardId: import("zod").ZodOptional<import("zod").ZodNullable<import("zod").ZodString>>;
1442
1446
  }, import("zod/v4/core").$loose>>>;
1447
+ projectKnowledgeLocation: import("zod").ZodOptional<import("zod").ZodNullable<import("zod").ZodEnum<{
1448
+ repository: "repository";
1449
+ host: "host";
1450
+ }>>>;
1443
1451
  projectCustomIconRevision: import("zod").ZodOptional<import("zod").ZodNullable<import("zod").ZodString>>;
1444
1452
  projectRootPath: import("zod").ZodString;
1445
1453
  projectKind: import("zod").ZodEnum<{
@@ -1468,6 +1476,10 @@ export declare const WSOutboundMessageSchema: {
1468
1476
  }>;
1469
1477
  boardId: import("zod").ZodOptional<import("zod").ZodNullable<import("zod").ZodString>>;
1470
1478
  }, import("zod/v4/core").$loose>>>;
1479
+ projectKnowledgeLocation: import("zod").ZodOptional<import("zod").ZodNullable<import("zod").ZodEnum<{
1480
+ repository: "repository";
1481
+ host: "host";
1482
+ }>>>;
1471
1483
  projectCustomIconRevision: import("zod").ZodOptional<import("zod").ZodNullable<import("zod").ZodString>>;
1472
1484
  projectRootPath: import("zod").ZodString;
1473
1485
  projectKind: import("zod").ZodEnum<{
@@ -2717,6 +2729,10 @@ export declare const WSOutboundMessageSchema: {
2717
2729
  }>;
2718
2730
  boardId: import("zod").ZodOptional<import("zod").ZodNullable<import("zod").ZodString>>;
2719
2731
  }, import("zod/v4/core").$loose>>>;
2732
+ projectKnowledgeLocation: import("zod").ZodOptional<import("zod").ZodNullable<import("zod").ZodEnum<{
2733
+ repository: "repository";
2734
+ host: "host";
2735
+ }>>>;
2720
2736
  projectCustomIconRevision: import("zod").ZodOptional<import("zod").ZodNullable<import("zod").ZodString>>;
2721
2737
  projectRootPath: import("zod").ZodString;
2722
2738
  projectKind: import("zod").ZodEnum<{
@@ -2747,6 +2763,10 @@ export declare const WSOutboundMessageSchema: {
2747
2763
  }>;
2748
2764
  boardId: import("zod").ZodOptional<import("zod").ZodNullable<import("zod").ZodString>>;
2749
2765
  }, import("zod/v4/core").$loose>>>;
2766
+ projectKnowledgeLocation: import("zod").ZodOptional<import("zod").ZodNullable<import("zod").ZodEnum<{
2767
+ repository: "repository";
2768
+ host: "host";
2769
+ }>>>;
2750
2770
  projectCustomIconRevision: import("zod").ZodOptional<import("zod").ZodNullable<import("zod").ZodString>>;
2751
2771
  projectRootPath: import("zod").ZodString;
2752
2772
  projectKind: import("zod").ZodEnum<{
@@ -2776,6 +2796,10 @@ export declare const WSOutboundMessageSchema: {
2776
2796
  }>;
2777
2797
  boardId: import("zod").ZodOptional<import("zod").ZodNullable<import("zod").ZodString>>;
2778
2798
  }, import("zod/v4/core").$loose>>>;
2799
+ projectKnowledgeLocation: import("zod").ZodOptional<import("zod").ZodNullable<import("zod").ZodEnum<{
2800
+ repository: "repository";
2801
+ host: "host";
2802
+ }>>>;
2779
2803
  projectCustomIconRevision: import("zod").ZodOptional<import("zod").ZodNullable<import("zod").ZodString>>;
2780
2804
  projectRootPath: import("zod").ZodString;
2781
2805
  projectKind: import("zod").ZodEnum<{
@@ -2839,6 +2863,10 @@ export declare const WSOutboundMessageSchema: {
2839
2863
  }>;
2840
2864
  boardId: import("zod").ZodOptional<import("zod").ZodNullable<import("zod").ZodString>>;
2841
2865
  }, import("zod/v4/core").$loose>>>;
2866
+ projectKnowledgeLocation: import("zod").ZodOptional<import("zod").ZodNullable<import("zod").ZodEnum<{
2867
+ repository: "repository";
2868
+ host: "host";
2869
+ }>>>;
2842
2870
  projectCustomIconRevision: import("zod").ZodOptional<import("zod").ZodNullable<import("zod").ZodString>>;
2843
2871
  projectRootPath: import("zod").ZodString;
2844
2872
  projectKind: import("zod").ZodEnum<{
@@ -3422,6 +3450,10 @@ export declare const WSOutboundMessageSchema: {
3422
3450
  }>;
3423
3451
  boardId: import("zod").ZodOptional<import("zod").ZodNullable<import("zod").ZodString>>;
3424
3452
  }, import("zod/v4/core").$loose>>>;
3453
+ projectKnowledgeLocation: import("zod").ZodOptional<import("zod").ZodNullable<import("zod").ZodEnum<{
3454
+ repository: "repository";
3455
+ host: "host";
3456
+ }>>>;
3425
3457
  projectCustomIconRevision: import("zod").ZodOptional<import("zod").ZodNullable<import("zod").ZodString>>;
3426
3458
  projectRootPath: import("zod").ZodString;
3427
3459
  projectKind: import("zod").ZodEnum<{
@@ -5570,17 +5602,8 @@ export declare const WSOutboundMessageSchema: {
5570
5602
  }, import("zod/v4/core").$loose>>;
5571
5603
  mcp: import("zod").ZodObject<{
5572
5604
  injectIntoAgents: import("zod").ZodBoolean;
5573
- toolGroups: import("zod").ZodOptional<import("zod").ZodArray<import("zod").ZodEnum<{
5574
- preview: "preview";
5575
- browser: "browser";
5576
- web: "web";
5577
- agents: "agents";
5578
- terminals: "terminals";
5579
- schedules: "schedules";
5580
- artifacts: "artifacts";
5581
- widgets: "widgets";
5582
- workspace: "workspace";
5583
- }>>>;
5605
+ toolGroups: import("zod").ZodOptional<import("zod").ZodArray<import("zod").ZodString>>;
5606
+ toolGroupsV2: import("zod").ZodOptional<import("zod").ZodArray<import("zod").ZodString>>;
5584
5607
  }, import("zod/v4/core").$loose>;
5585
5608
  browserTools: import("zod").ZodDefault<import("zod").ZodObject<{
5586
5609
  enabled: import("zod").ZodDefault<import("zod").ZodBoolean>;
@@ -5601,17 +5624,8 @@ export declare const WSOutboundMessageSchema: {
5601
5624
  description: import("zod").ZodOptional<import("zod").ZodString>;
5602
5625
  isDefault: import("zod").ZodOptional<import("zod").ZodBoolean>;
5603
5626
  }, import("zod/v4/core").$loose>>>;
5604
- ottoToolGroups: import("zod").ZodOptional<import("zod").ZodArray<import("zod").ZodEnum<{
5605
- preview: "preview";
5606
- browser: "browser";
5607
- web: "web";
5608
- agents: "agents";
5609
- terminals: "terminals";
5610
- schedules: "schedules";
5611
- artifacts: "artifacts";
5612
- widgets: "widgets";
5613
- workspace: "workspace";
5614
- }>>>;
5627
+ ottoToolGroups: import("zod").ZodOptional<import("zod").ZodArray<import("zod").ZodString>>;
5628
+ ottoToolGroupsV2: import("zod").ZodOptional<import("zod").ZodArray<import("zod").ZodString>>;
5615
5629
  }, import("zod/v4/core").$loose>>>;
5616
5630
  metadataGeneration: import("zod").ZodDefault<import("zod").ZodObject<{
5617
5631
  providers: import("zod").ZodDefault<import("zod").ZodArray<import("zod").ZodObject<{
@@ -5739,6 +5753,11 @@ export declare const WSOutboundMessageSchema: {
5739
5753
  modelId: import("zod").ZodString;
5740
5754
  tier: import("zod").ZodType<import("../agent-types.js").ModelTier, unknown, import("zod/v4/core").$ZodTypeInternals<import("../agent-types.js").ModelTier, unknown>>;
5741
5755
  }, import("zod/v4/core").$loose>>>;
5756
+ modelVisibilityOverrides: import("zod").ZodDefault<import("zod").ZodArray<import("zod").ZodObject<{
5757
+ provider: import("zod").ZodString;
5758
+ modelId: import("zod").ZodString;
5759
+ visible: import("zod").ZodBoolean;
5760
+ }, import("zod/v4/core").$loose>>>;
5742
5761
  savedProviderEndpoints: import("zod").ZodDefault<import("zod").ZodArray<import("zod").ZodObject<{
5743
5762
  id: import("zod").ZodString;
5744
5763
  baseUrlKey: import("zod").ZodString;
@@ -5870,6 +5889,12 @@ export declare const WSOutboundMessageSchema: {
5870
5889
  }, import("zod/v4/core").$loose>;
5871
5890
  }, import("zod/v4/core").$loose>>;
5872
5891
  }, import("zod/v4/core").$loose>>;
5892
+ projectKnowledge: import("zod").ZodOptional<import("zod").ZodObject<{
5893
+ defaultStoreLocation: import("zod").ZodDefault<import("zod").ZodEnum<{
5894
+ repository: "repository";
5895
+ host: "host";
5896
+ }>>;
5897
+ }, import("zod/v4/core").$loose>>;
5873
5898
  agentProfiles: import("zod").ZodOptional<import("zod").ZodArray<import("zod").ZodObject<{
5874
5899
  id: import("zod").ZodString;
5875
5900
  name: import("zod").ZodString;
@@ -5914,17 +5939,8 @@ export declare const WSOutboundMessageSchema: {
5914
5939
  }, import("zod/v4/core").$loose>>;
5915
5940
  mcp: import("zod").ZodObject<{
5916
5941
  injectIntoAgents: import("zod").ZodBoolean;
5917
- toolGroups: import("zod").ZodOptional<import("zod").ZodArray<import("zod").ZodEnum<{
5918
- preview: "preview";
5919
- browser: "browser";
5920
- web: "web";
5921
- agents: "agents";
5922
- terminals: "terminals";
5923
- schedules: "schedules";
5924
- artifacts: "artifacts";
5925
- widgets: "widgets";
5926
- workspace: "workspace";
5927
- }>>>;
5942
+ toolGroups: import("zod").ZodOptional<import("zod").ZodArray<import("zod").ZodString>>;
5943
+ toolGroupsV2: import("zod").ZodOptional<import("zod").ZodArray<import("zod").ZodString>>;
5928
5944
  }, import("zod/v4/core").$loose>;
5929
5945
  browserTools: import("zod").ZodDefault<import("zod").ZodObject<{
5930
5946
  enabled: import("zod").ZodDefault<import("zod").ZodBoolean>;
@@ -5945,17 +5961,8 @@ export declare const WSOutboundMessageSchema: {
5945
5961
  description: import("zod").ZodOptional<import("zod").ZodString>;
5946
5962
  isDefault: import("zod").ZodOptional<import("zod").ZodBoolean>;
5947
5963
  }, import("zod/v4/core").$loose>>>;
5948
- ottoToolGroups: import("zod").ZodOptional<import("zod").ZodArray<import("zod").ZodEnum<{
5949
- preview: "preview";
5950
- browser: "browser";
5951
- web: "web";
5952
- agents: "agents";
5953
- terminals: "terminals";
5954
- schedules: "schedules";
5955
- artifacts: "artifacts";
5956
- widgets: "widgets";
5957
- workspace: "workspace";
5958
- }>>>;
5964
+ ottoToolGroups: import("zod").ZodOptional<import("zod").ZodArray<import("zod").ZodString>>;
5965
+ ottoToolGroupsV2: import("zod").ZodOptional<import("zod").ZodArray<import("zod").ZodString>>;
5959
5966
  }, import("zod/v4/core").$loose>>>;
5960
5967
  metadataGeneration: import("zod").ZodDefault<import("zod").ZodObject<{
5961
5968
  providers: import("zod").ZodDefault<import("zod").ZodArray<import("zod").ZodObject<{
@@ -6083,6 +6090,11 @@ export declare const WSOutboundMessageSchema: {
6083
6090
  modelId: import("zod").ZodString;
6084
6091
  tier: import("zod").ZodType<import("../agent-types.js").ModelTier, unknown, import("zod/v4/core").$ZodTypeInternals<import("../agent-types.js").ModelTier, unknown>>;
6085
6092
  }, import("zod/v4/core").$loose>>>;
6093
+ modelVisibilityOverrides: import("zod").ZodDefault<import("zod").ZodArray<import("zod").ZodObject<{
6094
+ provider: import("zod").ZodString;
6095
+ modelId: import("zod").ZodString;
6096
+ visible: import("zod").ZodBoolean;
6097
+ }, import("zod/v4/core").$loose>>>;
6086
6098
  savedProviderEndpoints: import("zod").ZodDefault<import("zod").ZodArray<import("zod").ZodObject<{
6087
6099
  id: import("zod").ZodString;
6088
6100
  baseUrlKey: import("zod").ZodString;
@@ -6214,6 +6226,12 @@ export declare const WSOutboundMessageSchema: {
6214
6226
  }, import("zod/v4/core").$loose>;
6215
6227
  }, import("zod/v4/core").$loose>>;
6216
6228
  }, import("zod/v4/core").$loose>>;
6229
+ projectKnowledge: import("zod").ZodOptional<import("zod").ZodObject<{
6230
+ defaultStoreLocation: import("zod").ZodDefault<import("zod").ZodEnum<{
6231
+ repository: "repository";
6232
+ host: "host";
6233
+ }>>;
6234
+ }, import("zod/v4/core").$loose>>;
6217
6235
  agentProfiles: import("zod").ZodOptional<import("zod").ZodArray<import("zod").ZodObject<{
6218
6236
  id: import("zod").ZodString;
6219
6237
  name: import("zod").ZodString;
@@ -7590,6 +7608,10 @@ export declare const WSOutboundMessageSchema: {
7590
7608
  }>;
7591
7609
  boardId: import("zod").ZodOptional<import("zod").ZodNullable<import("zod").ZodString>>;
7592
7610
  }, import("zod/v4/core").$loose>>>;
7611
+ projectKnowledgeLocation: import("zod").ZodOptional<import("zod").ZodNullable<import("zod").ZodEnum<{
7612
+ repository: "repository";
7613
+ host: "host";
7614
+ }>>>;
7593
7615
  projectCustomIconRevision: import("zod").ZodOptional<import("zod").ZodNullable<import("zod").ZodString>>;
7594
7616
  projectRootPath: import("zod").ZodString;
7595
7617
  projectKind: import("zod").ZodEnum<{
@@ -12729,6 +12751,7 @@ export declare const WSOutboundMessageSchema: {
12729
12751
  }, import("zod/v4/core").$strip>>>;
12730
12752
  defaultThinkingOptionId: import("zod").ZodOptional<import("zod").ZodString>;
12731
12753
  tier: import("zod").ZodOptional<import("zod").ZodType<import("../agent-types.js").ModelTier, unknown, import("zod/v4/core").$ZodTypeInternals<import("../agent-types.js").ModelTier, unknown>>>;
12754
+ isVisible: import("zod").ZodOptional<import("zod").ZodBoolean>;
12732
12755
  supportsAutoMode: import("zod").ZodOptional<import("zod").ZodBoolean>;
12733
12756
  }, import("zod/v4/core").$strip>>>;
12734
12757
  error: import("zod").ZodOptional<import("zod").ZodNullable<import("zod").ZodString>>;
@@ -12823,6 +12846,7 @@ export declare const WSOutboundMessageSchema: {
12823
12846
  }, import("zod/v4/core").$strip>>>;
12824
12847
  defaultThinkingOptionId: import("zod").ZodOptional<import("zod").ZodString>;
12825
12848
  tier: import("zod").ZodOptional<import("zod").ZodType<import("../agent-types.js").ModelTier, unknown, import("zod/v4/core").$ZodTypeInternals<import("../agent-types.js").ModelTier, unknown>>>;
12849
+ isVisible: import("zod").ZodOptional<import("zod").ZodBoolean>;
12826
12850
  supportsAutoMode: import("zod").ZodOptional<import("zod").ZodBoolean>;
12827
12851
  }, import("zod/v4/core").$strip>>>;
12828
12852
  modes: import("zod").ZodOptional<import("zod").ZodArray<import("zod").ZodType<import("../agent-types.js").AgentMode, unknown, import("zod/v4/core").$ZodTypeInternals<import("../agent-types.js").AgentMode, unknown>>>>;
@@ -12858,6 +12882,7 @@ export declare const WSOutboundMessageSchema: {
12858
12882
  isSelectable: import("zod").ZodOptional<import("zod").ZodBoolean>;
12859
12883
  contextWindowMaxTokens: import("zod").ZodOptional<import("zod").ZodNumber>;
12860
12884
  defaultThinkingOptionId: import("zod").ZodOptional<import("zod").ZodString>;
12885
+ isVisible: import("zod").ZodOptional<import("zod").ZodBoolean>;
12861
12886
  supportsAutoMode: import("zod").ZodOptional<import("zod").ZodBoolean>;
12862
12887
  thinkingSet: import("zod").ZodOptional<import("zod").ZodNumber>;
12863
12888
  }, import("zod/v4/core").$strip>>>;
@@ -12913,6 +12938,7 @@ export declare const WSOutboundMessageSchema: {
12913
12938
  }, import("zod/v4/core").$strip>>>;
12914
12939
  defaultThinkingOptionId: import("zod").ZodOptional<import("zod").ZodString>;
12915
12940
  tier: import("zod").ZodOptional<import("zod").ZodType<import("../agent-types.js").ModelTier, unknown, import("zod/v4/core").$ZodTypeInternals<import("../agent-types.js").ModelTier, unknown>>>;
12941
+ isVisible: import("zod").ZodOptional<import("zod").ZodBoolean>;
12916
12942
  supportsAutoMode: import("zod").ZodOptional<import("zod").ZodBoolean>;
12917
12943
  }, import("zod/v4/core").$strip>>>;
12918
12944
  modes: import("zod").ZodOptional<import("zod").ZodArray<import("zod").ZodType<import("../agent-types.js").AgentMode, unknown, import("zod/v4/core").$ZodTypeInternals<import("../agent-types.js").AgentMode, unknown>>>>;
@@ -12948,6 +12974,7 @@ export declare const WSOutboundMessageSchema: {
12948
12974
  isSelectable: import("zod").ZodOptional<import("zod").ZodBoolean>;
12949
12975
  contextWindowMaxTokens: import("zod").ZodOptional<import("zod").ZodNumber>;
12950
12976
  defaultThinkingOptionId: import("zod").ZodOptional<import("zod").ZodString>;
12977
+ isVisible: import("zod").ZodOptional<import("zod").ZodBoolean>;
12951
12978
  supportsAutoMode: import("zod").ZodOptional<import("zod").ZodBoolean>;
12952
12979
  thinkingSet: import("zod").ZodOptional<import("zod").ZodNumber>;
12953
12980
  }, import("zod/v4/core").$strip>>>;
@@ -13417,11 +13444,13 @@ export declare const WSOutboundMessageSchema: {
13417
13444
  affects: import("zod").ZodOptional<import("zod").ZodArray<import("zod").ZodString>>;
13418
13445
  }, import("zod/v4/core").$strip>>>;
13419
13446
  path: import("zod").ZodOptional<import("zod").ZodString>;
13447
+ absolutePath: import("zod").ZodOptional<import("zod").ZodString>;
13420
13448
  }, import("zod/v4/core").$strip>>;
13421
13449
  rootPages: import("zod").ZodOptional<import("zod").ZodArray<import("zod").ZodObject<{
13422
13450
  slug: import("zod").ZodString;
13423
13451
  title: import("zod").ZodString;
13424
13452
  path: import("zod").ZodString;
13453
+ absolutePath: import("zod").ZodOptional<import("zod").ZodString>;
13425
13454
  body: import("zod").ZodString;
13426
13455
  }, import("zod/v4/core").$strip>>>;
13427
13456
  findings: import("zod").ZodArray<import("zod").ZodObject<{
@@ -13502,6 +13531,7 @@ export declare const WSOutboundMessageSchema: {
13502
13531
  affects: import("zod").ZodOptional<import("zod").ZodArray<import("zod").ZodString>>;
13503
13532
  }, import("zod/v4/core").$strip>>>;
13504
13533
  path: import("zod").ZodOptional<import("zod").ZodString>;
13534
+ absolutePath: import("zod").ZodOptional<import("zod").ZodString>;
13505
13535
  }, import("zod/v4/core").$strip>>;
13506
13536
  }, import("zod/v4/core").$strip>;
13507
13537
  }, import("zod/v4/core").$strip>, import("zod").ZodObject<{
@@ -13562,6 +13592,7 @@ export declare const WSOutboundMessageSchema: {
13562
13592
  affects: import("zod").ZodOptional<import("zod").ZodArray<import("zod").ZodString>>;
13563
13593
  }, import("zod/v4/core").$strip>>>;
13564
13594
  path: import("zod").ZodOptional<import("zod").ZodString>;
13595
+ absolutePath: import("zod").ZodOptional<import("zod").ZodString>;
13565
13596
  }, import("zod/v4/core").$strip>;
13566
13597
  }, import("zod/v4/core").$strip>;
13567
13598
  }, import("zod/v4/core").$strip>, import("zod").ZodObject<{
@@ -13622,6 +13653,7 @@ export declare const WSOutboundMessageSchema: {
13622
13653
  affects: import("zod").ZodOptional<import("zod").ZodArray<import("zod").ZodString>>;
13623
13654
  }, import("zod/v4/core").$strip>>>;
13624
13655
  path: import("zod").ZodOptional<import("zod").ZodString>;
13656
+ absolutePath: import("zod").ZodOptional<import("zod").ZodString>;
13625
13657
  }, import("zod/v4/core").$strip>>;
13626
13658
  error: import("zod").ZodOptional<import("zod").ZodString>;
13627
13659
  }, import("zod/v4/core").$strip>;
@@ -13683,6 +13715,7 @@ export declare const WSOutboundMessageSchema: {
13683
13715
  affects: import("zod").ZodOptional<import("zod").ZodArray<import("zod").ZodString>>;
13684
13716
  }, import("zod/v4/core").$strip>>>;
13685
13717
  path: import("zod").ZodOptional<import("zod").ZodString>;
13718
+ absolutePath: import("zod").ZodOptional<import("zod").ZodString>;
13686
13719
  }, import("zod/v4/core").$strip>>;
13687
13720
  }, import("zod/v4/core").$strip>;
13688
13721
  }, import("zod/v4/core").$strip>, import("zod").ZodObject<{
@@ -13743,6 +13776,7 @@ export declare const WSOutboundMessageSchema: {
13743
13776
  affects: import("zod").ZodOptional<import("zod").ZodArray<import("zod").ZodString>>;
13744
13777
  }, import("zod/v4/core").$strip>>>;
13745
13778
  path: import("zod").ZodOptional<import("zod").ZodString>;
13779
+ absolutePath: import("zod").ZodOptional<import("zod").ZodString>;
13746
13780
  }, import("zod/v4/core").$strip>>;
13747
13781
  error: import("zod").ZodOptional<import("zod").ZodString>;
13748
13782
  }, import("zod/v4/core").$strip>;
@@ -13804,6 +13838,7 @@ export declare const WSOutboundMessageSchema: {
13804
13838
  affects: import("zod").ZodOptional<import("zod").ZodArray<import("zod").ZodString>>;
13805
13839
  }, import("zod/v4/core").$strip>>>;
13806
13840
  path: import("zod").ZodOptional<import("zod").ZodString>;
13841
+ absolutePath: import("zod").ZodOptional<import("zod").ZodString>;
13807
13842
  }, import("zod/v4/core").$strip>>;
13808
13843
  error: import("zod").ZodOptional<import("zod").ZodString>;
13809
13844
  }, import("zod/v4/core").$strip>;
@@ -13815,6 +13850,7 @@ export declare const WSOutboundMessageSchema: {
13815
13850
  slug: import("zod").ZodString;
13816
13851
  title: import("zod").ZodString;
13817
13852
  path: import("zod").ZodString;
13853
+ absolutePath: import("zod").ZodOptional<import("zod").ZodString>;
13818
13854
  body: import("zod").ZodString;
13819
13855
  }, import("zod/v4/core").$strip>>;
13820
13856
  }, import("zod/v4/core").$strip>;
@@ -13825,6 +13861,57 @@ export declare const WSOutboundMessageSchema: {
13825
13861
  deleted: import("zod").ZodBoolean;
13826
13862
  error: import("zod").ZodOptional<import("zod").ZodString>;
13827
13863
  }, import("zod/v4/core").$strip>;
13864
+ }, import("zod/v4/core").$strip>, import("zod").ZodObject<{
13865
+ type: import("zod").ZodLiteral<"project.knowledge.store.get.response">;
13866
+ payload: import("zod").ZodObject<{
13867
+ requestId: import("zod").ZodString;
13868
+ store: import("zod").ZodNullable<import("zod").ZodObject<{
13869
+ location: import("zod").ZodEnum<{
13870
+ repository: "repository";
13871
+ host: "host";
13872
+ }>;
13873
+ override: import("zod").ZodNullable<import("zod").ZodEnum<{
13874
+ repository: "repository";
13875
+ host: "host";
13876
+ }>>;
13877
+ hostDefault: import("zod").ZodEnum<{
13878
+ repository: "repository";
13879
+ host: "host";
13880
+ }>;
13881
+ basePath: import("zod").ZodString;
13882
+ projectId: import("zod").ZodNullable<import("zod").ZodString>;
13883
+ hasPages: import("zod").ZodBoolean;
13884
+ otherLocationHasPages: import("zod").ZodBoolean;
13885
+ }, import("zod/v4/core").$strip>>;
13886
+ error: import("zod").ZodNullable<import("zod").ZodString>;
13887
+ }, import("zod/v4/core").$strip>;
13888
+ }, import("zod/v4/core").$strip>, import("zod").ZodObject<{
13889
+ type: import("zod").ZodLiteral<"project.knowledge.store.set.response">;
13890
+ payload: import("zod").ZodObject<{
13891
+ requestId: import("zod").ZodString;
13892
+ projectId: import("zod").ZodString;
13893
+ accepted: import("zod").ZodBoolean;
13894
+ store: import("zod").ZodNullable<import("zod").ZodObject<{
13895
+ location: import("zod").ZodEnum<{
13896
+ repository: "repository";
13897
+ host: "host";
13898
+ }>;
13899
+ override: import("zod").ZodNullable<import("zod").ZodEnum<{
13900
+ repository: "repository";
13901
+ host: "host";
13902
+ }>>;
13903
+ hostDefault: import("zod").ZodEnum<{
13904
+ repository: "repository";
13905
+ host: "host";
13906
+ }>;
13907
+ basePath: import("zod").ZodString;
13908
+ projectId: import("zod").ZodNullable<import("zod").ZodString>;
13909
+ hasPages: import("zod").ZodBoolean;
13910
+ otherLocationHasPages: import("zod").ZodBoolean;
13911
+ }, import("zod/v4/core").$strip>>;
13912
+ movedPageCount: import("zod").ZodNumber;
13913
+ error: import("zod").ZodNullable<import("zod").ZodString>;
13914
+ }, import("zod/v4/core").$strip>;
13828
13915
  }, import("zod/v4/core").$strip>, import("zod").ZodObject<{
13829
13916
  type: import("zod").ZodLiteral<"context.edge.convert.response">;
13830
13917
  payload: import("zod").ZodObject<{
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@otto-code/protocol",
3
- "version": "0.8.17",
3
+ "version": "0.8.18",
4
4
  "description": "Otto shared protocol schemas and wire types",
5
5
  "license": "AGPL-3.0-or-later",
6
6
  "files": [