@getpaseo/protocol 0.1.106 → 0.1.108

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
@@ -655,6 +655,12 @@ export const WorkspaceTitleSetRequestSchema = z.object({
655
655
  title: z.string().nullable(),
656
656
  requestId: z.string(),
657
657
  });
658
+ export const WorkspacePinSetRequestSchema = z.object({
659
+ type: z.literal("workspace.pin.set.request"),
660
+ workspaceId: z.string(),
661
+ pinned: z.boolean(),
662
+ requestId: z.string(),
663
+ });
658
664
  export const SetVoiceModeMessageSchema = z.object({
659
665
  type: z.literal("set_voice_mode"),
660
666
  enabled: z.boolean(),
@@ -1056,9 +1062,24 @@ export const FetchAgentTimelineRequestMessageSchema = z.object({
1056
1062
  // Default should be projected for app timeline loading.
1057
1063
  projection: z.enum(["projected", "canonical"]).optional(),
1058
1064
  });
1065
+ export const ProviderSubagentListRequestMessageSchema = z.object({
1066
+ type: z.literal("agent.provider_subagents.list.request"),
1067
+ parentAgentId: z.string(),
1068
+ requestId: z.string(),
1069
+ });
1070
+ export const ProviderSubagentTimelineRequestMessageSchema = z.object({
1071
+ type: z.literal("agent.provider_subagents.timeline.get.request"),
1072
+ parentAgentId: z.string(),
1073
+ subagentId: z.string(),
1074
+ requestId: z.string(),
1075
+ direction: z.enum(["tail", "before", "after"]).optional(),
1076
+ cursor: AgentTimelineCursorSchema.optional(),
1077
+ limit: z.number().int().nonnegative().optional(),
1078
+ });
1059
1079
  export const AgentForkContextRequestMessageSchema = z.object({
1060
1080
  type: z.literal("agent.fork_context.request"),
1061
1081
  agentId: z.string(),
1082
+ boundaryCursor: AgentTimelineCursorSchema.optional(),
1062
1083
  boundaryMessageId: z.string().optional(),
1063
1084
  requestId: z.string(),
1064
1085
  });
@@ -1173,6 +1194,17 @@ export const WorkspaceTitleSetResponseSchema = z.object({
1173
1194
  type: z.literal("workspace.title.set.response"),
1174
1195
  payload: WorkspaceTitleSetResponsePayloadSchema,
1175
1196
  });
1197
+ export const WorkspacePinSetResponsePayloadSchema = z.object({
1198
+ requestId: z.string(),
1199
+ workspaceId: z.string(),
1200
+ accepted: z.boolean(),
1201
+ pinnedAt: z.string().nullable(),
1202
+ error: z.string().nullable(),
1203
+ });
1204
+ export const WorkspacePinSetResponseSchema = z.object({
1205
+ type: z.literal("workspace.pin.set.response"),
1206
+ payload: WorkspacePinSetResponsePayloadSchema,
1207
+ });
1176
1208
  export const SetVoiceModeResponseMessageSchema = z.object({
1177
1209
  type: z.literal("set_voice_mode_response"),
1178
1210
  payload: z.object({
@@ -1451,11 +1483,42 @@ export const OpenProjectRequestSchema = z.object({
1451
1483
  cwd: z.string(),
1452
1484
  requestId: z.string(),
1453
1485
  });
1486
+ // Smallest shorthand repo path is "a/b": owner, slash, repository.
1487
+ const MIN_REPOSITORY_PATH_LENGTH = 3;
1454
1488
  export const ProjectAddRequestSchema = z.object({
1455
1489
  type: z.literal("project.add.request"),
1456
1490
  cwd: z.string(),
1457
1491
  requestId: z.string(),
1458
1492
  });
1493
+ export const ProjectCreateDirectoryRequestSchema = z.object({
1494
+ type: z.literal("project.create_directory.request"),
1495
+ parentPath: z.string(),
1496
+ name: z.string(),
1497
+ requestId: z.string(),
1498
+ });
1499
+ export const GithubRepositorySchema = z.object({
1500
+ id: z.string().min(1),
1501
+ name: z.string().min(1),
1502
+ nameWithOwner: z.string().min(MIN_REPOSITORY_PATH_LENGTH),
1503
+ description: z.string().nullable(),
1504
+ visibility: z.enum(["public", "private", "internal"]),
1505
+ updatedAt: z.string(),
1506
+ cloneUrl: z.string().min(MIN_REPOSITORY_PATH_LENGTH),
1507
+ });
1508
+ export const WorkspaceGithubSearchRepositoriesRequestSchema = z.object({
1509
+ type: z.literal("workspace.github.search_repositories.request"),
1510
+ query: z.string(),
1511
+ limit: z.number().int().min(1).max(50).optional(),
1512
+ requestId: z.string(),
1513
+ });
1514
+ export const ProjectGithubCloneProtocolSchema = z.enum(["https", "ssh"]);
1515
+ export const ProjectGithubCloneRequestSchema = z.object({
1516
+ type: z.literal("project.github.clone.request"),
1517
+ repo: z.string().trim().min(MIN_REPOSITORY_PATH_LENGTH),
1518
+ cloneProtocol: ProjectGithubCloneProtocolSchema.optional(),
1519
+ targetDirectory: z.string().trim().min(1),
1520
+ requestId: z.string(),
1521
+ });
1459
1522
  export const ArchiveWorkspaceRequestSchema = z.object({
1460
1523
  type: z.literal("archive_workspace_request"),
1461
1524
  workspaceId: z.string(),
@@ -1641,6 +1704,16 @@ export const CreateTerminalRequestSchema = z.object({
1641
1704
  agentId: z.string().optional(),
1642
1705
  command: z.string().optional(),
1643
1706
  args: z.array(z.string()).optional(),
1707
+ // COMPAT(createTerminalSize): added in v0.1.107, drop the optional gate when floor >= v0.1.107.
1708
+ // The client seeds the PTY with its measured viewport size so a new terminal isn't born at the
1709
+ // 80x24 default and then visibly reflowed. Old daemons ignore this field and start at 80x24;
1710
+ // the client's first resize corrects it as before.
1711
+ size: z
1712
+ .object({
1713
+ rows: z.number().int().positive(),
1714
+ cols: z.number().int().positive(),
1715
+ })
1716
+ .optional(),
1644
1717
  requestId: z.string(),
1645
1718
  });
1646
1719
  export const RenameTerminalRequestSchema = z.object({
@@ -1722,6 +1795,7 @@ export const SessionInboundMessageSchema = z.discriminatedUnion("type", [
1722
1795
  ProjectRenameRequestSchema,
1723
1796
  ProjectRemoveRequestSchema,
1724
1797
  WorkspaceTitleSetRequestSchema,
1798
+ WorkspacePinSetRequestSchema,
1725
1799
  SetVoiceModeMessageSchema,
1726
1800
  SendAgentMessageRequestSchema,
1727
1801
  WaitForFinishRequestSchema,
@@ -1753,6 +1827,8 @@ export const SessionInboundMessageSchema = z.discriminatedUnion("type", [
1753
1827
  RestartServerRequestMessageSchema,
1754
1828
  DaemonUpdateRequestMessageSchema,
1755
1829
  FetchAgentTimelineRequestMessageSchema,
1830
+ ProviderSubagentListRequestMessageSchema,
1831
+ ProviderSubagentTimelineRequestMessageSchema,
1756
1832
  AgentForkContextRequestMessageSchema,
1757
1833
  SetAgentModeRequestMessageSchema,
1758
1834
  SetAgentModelRequestMessageSchema,
@@ -1793,6 +1869,9 @@ export const SessionInboundMessageSchema = z.discriminatedUnion("type", [
1793
1869
  LegacyOpenInEditorRequestSchema,
1794
1870
  OpenProjectRequestSchema,
1795
1871
  ProjectAddRequestSchema,
1872
+ ProjectCreateDirectoryRequestSchema,
1873
+ WorkspaceGithubSearchRepositoriesRequestSchema,
1874
+ ProjectGithubCloneRequestSchema,
1796
1875
  ArchiveWorkspaceRequestSchema,
1797
1876
  WorkspaceCreateRequestSchema,
1798
1877
  WorkspaceClearAttentionRequestSchema,
@@ -2010,6 +2089,18 @@ export const ServerInfoStatusPayloadSchema = z
2010
2089
  daemonSelfUpdate: z.boolean().optional(),
2011
2090
  // COMPAT(agentForkContext): added in v0.1.102, remove gate after 2026-12-28.
2012
2091
  agentForkContext: z.boolean().optional(),
2092
+ // COMPAT(agentForkContextCursor): added in v0.1.108, remove gate after 2027-01-14.
2093
+ agentForkContextCursor: z.boolean().optional(),
2094
+ // COMPAT(providerSubagents): added in v0.1.107, remove gate after 2027-01-12.
2095
+ providerSubagents: z.boolean().optional(),
2096
+ // COMPAT(workspacePinning): added in v0.1.107, remove gate after 2027-01-12.
2097
+ workspacePinning: z.boolean().optional(),
2098
+ // COMPAT(projectGithubClone): added in v0.1.108, remove gate after 2027-01-15.
2099
+ projectGithubClone: z.boolean().optional(),
2100
+ // COMPAT(workspaceGithubRepositorySearch): added in v0.1.108, remove gate after 2027-01-15.
2101
+ workspaceGithubRepositorySearch: z.boolean().optional(),
2102
+ // COMPAT(projectCreateDirectory): added in v0.1.108, remove gate after 2027-01-15.
2103
+ projectCreateDirectory: z.boolean().optional(),
2013
2104
  })
2014
2105
  .optional(),
2015
2106
  })
@@ -2260,6 +2351,8 @@ export const WorkspaceDescriptorPayloadSchema = z
2260
2351
  // its input and offer a "reset to branch name" action. Null means the name
2261
2352
  // is derived from the branch/directory.
2262
2353
  title: z.string().nullable().optional(),
2354
+ // COMPAT(workspacePinning): added in v0.1.107, remove optional after 2027-01-12.
2355
+ pinnedAt: z.string().nullable().optional(),
2263
2356
  archivingAt: z.string().nullable().optional().default(null),
2264
2357
  status: WorkspaceStateBucketSchema,
2265
2358
  // Best-effort workspace status entry timestamp. Old daemons omit the
@@ -2459,6 +2552,70 @@ export const ProjectAddResponseSchema = z.object({
2459
2552
  errorCode: z.enum(["directory_not_found"]).nullish().catch(null),
2460
2553
  }),
2461
2554
  });
2555
+ export const ProjectCreateDirectoryErrorCodeSchema = z.enum([
2556
+ "invalid_name",
2557
+ "parent_directory_not_found",
2558
+ "directory_exists",
2559
+ "permission_denied",
2560
+ "registration_failed",
2561
+ "filesystem_error",
2562
+ ]);
2563
+ export const ProjectCreateDirectoryResponseSchema = z.object({
2564
+ type: z.literal("project.create_directory.response"),
2565
+ payload: z.object({
2566
+ requestId: z.string(),
2567
+ directoryPath: z.string().nullable(),
2568
+ project: WorkspaceProjectDescriptorPayloadSchema.nullable(),
2569
+ error: z.string().nullable(),
2570
+ // Error codes are open-ended on the wire so older clients can still parse
2571
+ // responses after a newer daemon learns another failure reason.
2572
+ errorCode: z.string().nullable(),
2573
+ }),
2574
+ });
2575
+ export const WorkspaceGithubSearchRepositoriesResponseSchema = z.object({
2576
+ type: z.literal("workspace.github.search_repositories.response"),
2577
+ payload: z.discriminatedUnion("status", [
2578
+ z.object({
2579
+ status: z.literal("success"),
2580
+ requestId: z.string(),
2581
+ repositories: z.array(GithubRepositorySchema),
2582
+ available: z.literal(true),
2583
+ error: z.null(),
2584
+ }),
2585
+ z.object({
2586
+ status: z.literal("unavailable"),
2587
+ requestId: z.string(),
2588
+ repositories: z.array(GithubRepositorySchema),
2589
+ reason: z.literal("gh_missing"),
2590
+ available: z.literal(false),
2591
+ error: z.string(),
2592
+ }),
2593
+ z.object({
2594
+ status: z.literal("unauthenticated"),
2595
+ requestId: z.string(),
2596
+ repositories: z.array(GithubRepositorySchema),
2597
+ available: z.literal(false),
2598
+ error: z.string(),
2599
+ }),
2600
+ z.object({
2601
+ status: z.literal("error"),
2602
+ requestId: z.string(),
2603
+ repositories: z.array(GithubRepositorySchema),
2604
+ available: z.literal(true),
2605
+ error: z.string(),
2606
+ }),
2607
+ ]),
2608
+ });
2609
+ export const ProjectGithubCloneResponseSchema = z.object({
2610
+ type: z.literal("project.github.clone.response"),
2611
+ payload: z.object({
2612
+ requestId: z.string(),
2613
+ repo: z.string().trim().min(MIN_REPOSITORY_PATH_LENGTH),
2614
+ checkoutPath: z.string().nullable(),
2615
+ project: WorkspaceProjectDescriptorPayloadSchema.nullable(),
2616
+ error: z.string().nullable(),
2617
+ }),
2618
+ });
2462
2619
  export const StartWorkspaceScriptResponseMessageSchema = z.object({
2463
2620
  type: z.literal("start_workspace_script_response"),
2464
2621
  payload: z.object({
@@ -2544,6 +2701,78 @@ export const FetchAgentTimelineResponseMessageSchema = z.object({
2544
2701
  error: z.string().nullable(),
2545
2702
  }),
2546
2703
  });
2704
+ export const ProviderSubagentDescriptorPayloadSchema = z.object({
2705
+ id: z.string(),
2706
+ parentAgentId: z.string(),
2707
+ provider: AgentProviderSchema,
2708
+ title: z.string().nullable(),
2709
+ description: z.string().nullable(),
2710
+ status: z.enum(["running", "completed", "failed", "canceled"]),
2711
+ createdAt: z.string(),
2712
+ updatedAt: z.string(),
2713
+ toolCallId: z.string().nullable(),
2714
+ cwd: z.string().nullable().optional(),
2715
+ });
2716
+ export const ProviderSubagentListResponseMessageSchema = z.object({
2717
+ type: z.literal("agent.provider_subagents.list.response"),
2718
+ payload: z.object({
2719
+ requestId: z.string(),
2720
+ parentAgentId: z.string(),
2721
+ subagents: z.array(ProviderSubagentDescriptorPayloadSchema),
2722
+ error: z.string().nullable(),
2723
+ }),
2724
+ });
2725
+ export const ProviderSubagentTimelineResponseMessageSchema = z.object({
2726
+ type: z.literal("agent.provider_subagents.timeline.get.response"),
2727
+ payload: z.object({
2728
+ requestId: z.string(),
2729
+ parentAgentId: z.string(),
2730
+ subagentId: z.string(),
2731
+ provider: AgentProviderSchema.nullable(),
2732
+ direction: z.enum(["tail", "before", "after"]),
2733
+ epoch: z.string(),
2734
+ reset: z.boolean(),
2735
+ staleCursor: z.boolean(),
2736
+ gap: z.boolean(),
2737
+ window: z.object({
2738
+ minSeq: z.number().int().nonnegative(),
2739
+ maxSeq: z.number().int().nonnegative(),
2740
+ nextSeq: z.number().int().nonnegative(),
2741
+ }),
2742
+ hasOlder: z.boolean(),
2743
+ hasNewer: z.boolean(),
2744
+ rows: z.array(z.object({
2745
+ item: AgentTimelineItemPayloadSchema,
2746
+ timestamp: z.string(),
2747
+ seq: z.number().int().nonnegative(),
2748
+ })),
2749
+ error: z.string().nullable(),
2750
+ }),
2751
+ });
2752
+ export const ProviderSubagentUpdateMessageSchema = z.object({
2753
+ type: z.literal("agent.provider_subagents.update"),
2754
+ payload: z.discriminatedUnion("kind", [
2755
+ z.object({
2756
+ kind: z.literal("upsert"),
2757
+ subagent: ProviderSubagentDescriptorPayloadSchema,
2758
+ }),
2759
+ z.object({
2760
+ kind: z.literal("timeline"),
2761
+ parentAgentId: z.string(),
2762
+ subagentId: z.string(),
2763
+ provider: AgentProviderSchema,
2764
+ item: AgentTimelineItemPayloadSchema,
2765
+ timestamp: z.string(),
2766
+ seq: z.number().int().nonnegative(),
2767
+ epoch: z.string(),
2768
+ }),
2769
+ z.object({
2770
+ kind: z.literal("remove"),
2771
+ parentAgentId: z.string(),
2772
+ subagentId: z.string(),
2773
+ }),
2774
+ ]),
2775
+ });
2547
2776
  export const AgentForkContextResponseMessageSchema = z.object({
2548
2777
  type: z.literal("agent.fork_context.response"),
2549
2778
  payload: z.object({
@@ -2552,6 +2781,7 @@ export const AgentForkContextResponseMessageSchema = z.object({
2552
2781
  attachment: TextAttachmentSchema.nullable(),
2553
2782
  itemCount: z.number().int().nonnegative(),
2554
2783
  boundaryMessageId: z.string().nullable(),
2784
+ boundaryCursor: AgentTimelineCursorSchema.nullable().optional(),
2555
2785
  error: z.string().nullable(),
2556
2786
  }),
2557
2787
  });
@@ -2561,6 +2791,7 @@ export const CancelAgentResponseMessageSchema = z.object({
2561
2791
  requestId: z.string(),
2562
2792
  agentId: z.string(),
2563
2793
  agent: AgentSnapshotPayloadSchema.nullable(),
2794
+ error: z.string().nullable().optional(),
2564
2795
  }),
2565
2796
  });
2566
2797
  export const ClearAgentAttentionResponseMessageSchema = z.object({
@@ -3659,13 +3890,19 @@ export const SessionOutboundMessageSchema = z.discriminatedUnion("type", [
3659
3890
  FetchRecentProviderSessionsResponseMessageSchema,
3660
3891
  FetchWorkspacesResponseMessageSchema,
3661
3892
  ProjectAddResponseSchema,
3893
+ ProjectCreateDirectoryResponseSchema,
3662
3894
  OpenProjectResponseMessageSchema,
3895
+ WorkspaceGithubSearchRepositoriesResponseSchema,
3896
+ ProjectGithubCloneResponseSchema,
3663
3897
  StartWorkspaceScriptResponseMessageSchema,
3664
3898
  LegacyListAvailableEditorsResponseMessageSchema,
3665
3899
  LegacyOpenInEditorResponseMessageSchema,
3666
3900
  ArchiveWorkspaceResponseMessageSchema,
3667
3901
  FetchAgentResponseMessageSchema,
3668
3902
  FetchAgentTimelineResponseMessageSchema,
3903
+ ProviderSubagentListResponseMessageSchema,
3904
+ ProviderSubagentTimelineResponseMessageSchema,
3905
+ ProviderSubagentUpdateMessageSchema,
3669
3906
  AgentForkContextResponseMessageSchema,
3670
3907
  CancelAgentResponseMessageSchema,
3671
3908
  ClearAgentAttentionResponseMessageSchema,
@@ -3690,6 +3927,7 @@ export const SessionOutboundMessageSchema = z.discriminatedUnion("type", [
3690
3927
  ProjectRenameResponseSchema,
3691
3928
  ProjectRemoveResponseSchema,
3692
3929
  WorkspaceTitleSetResponseSchema,
3930
+ WorkspacePinSetResponseSchema,
3693
3931
  WaitForFinishResponseMessageSchema,
3694
3932
  AgentPermissionRequestMessageSchema,
3695
3933
  AgentPermissionResolvedMessageSchema,
@@ -3794,6 +4032,7 @@ export const WSHelloMessageSchema = z.object({
3794
4032
  [CLIENT_CAPS.reasoningMergeEnum]: z.boolean().optional(),
3795
4033
  [CLIENT_CAPS.customModeIcons]: z.boolean().optional(),
3796
4034
  [CLIENT_CAPS.terminalReflowableSnapshot]: z.boolean().optional(),
4035
+ [CLIENT_CAPS.providerSubagents]: z.boolean().optional(),
3797
4036
  [CLIENT_CAPS.browserHost]: BrowserAutomationHostCapabilitySchema.optional(),
3798
4037
  })
3799
4038
  .passthrough()
@@ -1,38 +1,38 @@
1
1
  import { z } from "zod";
2
2
  const CLAUDE_MODES = [
3
+ {
4
+ id: "plan",
5
+ label: "Plan Mode",
6
+ description: "Analyze the codebase without executing tools or edits",
7
+ icon: "ShieldEllipsis",
8
+ colorTier: "planning",
9
+ },
3
10
  {
4
11
  id: "default",
5
12
  label: "Always Ask",
6
13
  description: "Prompts for permission the first time a tool is used",
7
- icon: "ShieldCheck",
14
+ icon: "Shield",
8
15
  colorTier: "safe",
9
16
  },
10
- {
11
- id: "auto",
12
- label: "Auto mode",
13
- description: "Uses a model classifier to review permission prompts automatically",
14
- icon: "ShieldQuestionMark",
15
- colorTier: "moderate",
16
- },
17
17
  {
18
18
  id: "acceptEdits",
19
19
  label: "Accept File Edits",
20
20
  description: "Automatically approves edit-focused tools without prompting",
21
- icon: "ShieldAlert",
21
+ icon: "ShieldPlus",
22
22
  colorTier: "moderate",
23
23
  },
24
24
  {
25
- id: "plan",
26
- label: "Plan Mode",
27
- description: "Analyze the codebase without executing tools or edits",
25
+ id: "auto",
26
+ label: "Auto mode",
27
+ description: "Uses a model classifier to review permission prompts automatically",
28
28
  icon: "ShieldCheck",
29
- colorTier: "planning",
29
+ colorTier: "moderate",
30
30
  },
31
31
  {
32
32
  id: "bypassPermissions",
33
33
  label: "Bypass",
34
34
  description: "Skip all permission prompts (use with caution)",
35
- icon: "ShieldAlert",
35
+ icon: "ShieldOff",
36
36
  colorTier: "dangerous",
37
37
  isUnattended: true,
38
38
  },
@@ -42,21 +42,21 @@ const CODEX_MODES = [
42
42
  id: "auto",
43
43
  label: "Default Permissions",
44
44
  description: "Edit files and run commands with Codex's default approval flow.",
45
- icon: "ShieldAlert",
45
+ icon: "Shield",
46
46
  colorTier: "moderate",
47
47
  },
48
48
  {
49
49
  id: "auto-review",
50
50
  label: "Auto-review",
51
51
  description: "Same workspace-write permissions as Default, but eligible `on-request` approvals are routed through the auto-reviewer subagent.",
52
- icon: "ShieldQuestionMark",
52
+ icon: "ShieldCheck",
53
53
  colorTier: "moderate",
54
54
  },
55
55
  {
56
56
  id: "full-access",
57
57
  label: "Full Access",
58
58
  description: "Edit files, run commands, and access the network without additional prompts.",
59
- icon: "ShieldAlert",
59
+ icon: "ShieldOff",
60
60
  colorTier: "dangerous",
61
61
  isUnattended: true,
62
62
  },
@@ -66,14 +66,14 @@ const COPILOT_MODES = [
66
66
  id: "https://agentclientprotocol.com/protocol/session-modes#agent",
67
67
  label: "Agent",
68
68
  description: "Default agent mode for conversational interactions",
69
- icon: "ShieldAlert",
69
+ icon: "Shield",
70
70
  colorTier: "moderate",
71
71
  },
72
72
  {
73
73
  id: "https://agentclientprotocol.com/protocol/session-modes#plan",
74
74
  label: "Plan",
75
75
  description: "Plan mode for creating and executing multi-step plans",
76
- icon: "ShieldCheck",
76
+ icon: "ShieldEllipsis",
77
77
  colorTier: "planning",
78
78
  },
79
79
  {
@@ -90,14 +90,14 @@ const OPENCODE_MODES = [
90
90
  id: "build",
91
91
  label: "Build",
92
92
  description: "Allows edits and tool execution for implementation work",
93
- icon: "Bot",
93
+ icon: "Shield",
94
94
  colorTier: "moderate",
95
95
  },
96
96
  {
97
97
  id: "plan",
98
98
  label: "Plan",
99
99
  description: "Read-only planning mode that avoids file edits",
100
- icon: "Bot",
100
+ icon: "ShieldEllipsis",
101
101
  colorTier: "planning",
102
102
  },
103
103
  ];
@@ -155,7 +155,10 @@ export const AGENT_PROVIDER_DEFINITIONS = [
155
155
  id: "opencode",
156
156
  label: "OpenCode",
157
157
  description: "Open-source coding assistant with multi-provider model support",
158
- defaultModeId: "build",
158
+ // No static default: OpenCode users can rename or delete any agent,
159
+ // including "build". Leaving this unset means the daemon and OpenCode
160
+ // itself decide (see normalizeOpenCodeModeId in opencode-agent.ts).
161
+ defaultModeId: null,
159
162
  modes: OPENCODE_MODES,
160
163
  voice: {
161
164
  enabled: true,