@getpaseo/server 0.1.85 → 0.1.87

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 (45) hide show
  1. package/dist/scripts/supervisor-entrypoint.js +1 -0
  2. package/dist/server/server/agent/agent-metadata-generator.d.ts +9 -0
  3. package/dist/server/server/agent/agent-metadata-generator.js +11 -2
  4. package/dist/server/server/agent/agent-response-loop.d.ts +1 -1
  5. package/dist/server/server/agent/agent-response-loop.js +3 -13
  6. package/dist/server/server/agent/create-agent/create.d.ts +2 -0
  7. package/dist/server/server/agent/create-agent/create.js +7 -0
  8. package/dist/server/server/agent/import-sessions.d.ts +3 -0
  9. package/dist/server/server/agent/import-sessions.js +11 -0
  10. package/dist/server/server/agent/providers/claude/agent.d.ts +2 -1
  11. package/dist/server/server/agent/providers/claude/agent.js +70 -0
  12. package/dist/server/server/agent/providers/claude/feature-definitions.d.ts +8 -0
  13. package/dist/server/server/agent/providers/claude/feature-definitions.js +36 -0
  14. package/dist/server/server/agent/providers/opencode-agent.js +4 -1
  15. package/dist/server/server/agent/providers/tool-call-detail-primitives.js +6 -3
  16. package/dist/server/server/agent/providers/tool-call-mapper-utils.d.ts +5 -0
  17. package/dist/server/server/agent/providers/tool-call-mapper-utils.js +62 -0
  18. package/dist/server/server/agent/structured-generation-providers.d.ts +29 -0
  19. package/dist/server/server/agent/structured-generation-providers.js +192 -0
  20. package/dist/server/server/bootstrap.d.ts +7 -0
  21. package/dist/server/server/bootstrap.js +3 -0
  22. package/dist/server/server/config.js +1 -0
  23. package/dist/server/server/daemon-config-store.js +46 -6
  24. package/dist/server/server/daemon-worker.js +1 -0
  25. package/dist/server/server/file-explorer/service.js +4 -4
  26. package/dist/server/server/persisted-config.d.ts +77 -22
  27. package/dist/server/server/persisted-config.js +13 -0
  28. package/dist/server/server/session.d.ts +3 -2
  29. package/dist/server/server/session.js +76 -24
  30. package/dist/server/server/speech/providers/local/runtime.js +52 -133
  31. package/dist/server/server/speech/providers/local/sherpa/model-catalog.d.ts +9 -2
  32. package/dist/server/server/speech/providers/local/sherpa/model-catalog.js +7 -0
  33. package/dist/server/server/speech/providers/local/worker-bytes.d.ts +4 -0
  34. package/dist/server/server/speech/providers/local/worker-bytes.js +9 -0
  35. package/dist/server/server/speech/providers/local/worker-client.d.ts +80 -0
  36. package/dist/server/server/speech/providers/local/worker-client.js +438 -0
  37. package/dist/server/server/speech/providers/local/worker-process.d.ts +2 -0
  38. package/dist/server/server/speech/providers/local/worker-process.js +270 -0
  39. package/dist/server/server/speech/providers/local/worker-protocol.d.ts +95 -0
  40. package/dist/server/server/speech/providers/local/worker-protocol.js +2 -0
  41. package/dist/server/server/websocket-server.js +2 -0
  42. package/dist/server/server/worktree-branch-name-generator.d.ts +9 -0
  43. package/dist/server/server/worktree-branch-name-generator.js +11 -2
  44. package/dist/src/server/persisted-config.js +13 -0
  45. package/package.json +5 -5
@@ -0,0 +1,192 @@
1
+ export const DEFAULT_STRUCTURED_GENERATION_PROVIDERS = [
2
+ { modelSubstring: "haiku" },
3
+ { modelSubstring: "gpt-5.4-mini", thinkingOptionId: "low" },
4
+ { modelSubstring: "minimax-m2.5" },
5
+ { modelSubstring: "nemotron-3-super" },
6
+ ];
7
+ export async function resolveStructuredGenerationProviders(options) {
8
+ const providerEntries = await options.providerSnapshotManager.listProviders({
9
+ cwd: options.cwd,
10
+ wait: true,
11
+ });
12
+ const enabledEntries = providerEntries.filter((entry) => entry.enabled);
13
+ const modelEntries = enabledEntries.filter((entry) => (entry.models?.length ?? 0) > 0);
14
+ const entriesByProvider = new Map(enabledEntries.map((entry) => [entry.provider, entry]));
15
+ const providers = [];
16
+ for (const configured of readConfiguredProviders(options.daemonConfig)) {
17
+ const resolvedConfigured = resolveConfiguredCandidate(configured, modelEntries, entriesByProvider);
18
+ if (!resolvedConfigured) {
19
+ continue;
20
+ }
21
+ providers.push(resolvedConfigured);
22
+ }
23
+ for (const identifier of DEFAULT_STRUCTURED_GENERATION_PROVIDERS) {
24
+ const resolved = resolveByModelSubstring(modelEntries, identifier);
25
+ if (resolved) {
26
+ providers.push(resolved);
27
+ }
28
+ }
29
+ const currentSelection = resolveCurrentSelection(options.currentSelection, modelEntries, entriesByProvider);
30
+ if (currentSelection) {
31
+ providers.push(currentSelection);
32
+ }
33
+ return dedupeProviders(providers);
34
+ }
35
+ function resolveCurrentSelection(selection, readyEntries, entriesByProvider) {
36
+ if (!selection) {
37
+ return null;
38
+ }
39
+ const provider = selection.provider?.trim();
40
+ if (!provider) {
41
+ return null;
42
+ }
43
+ const normalized = resolveConfiguredCandidate({
44
+ provider,
45
+ ...(selection.model ? { model: selection.model } : {}),
46
+ ...(selection.thinkingOptionId ? { thinkingOptionId: selection.thinkingOptionId } : {}),
47
+ }, readyEntries, entriesByProvider);
48
+ if (normalized) {
49
+ return normalized;
50
+ }
51
+ const explicitModel = selection.model?.trim();
52
+ if (explicitModel) {
53
+ return {
54
+ provider,
55
+ model: explicitModel,
56
+ ...(selection.thinkingOptionId ? { thinkingOptionId: selection.thinkingOptionId } : {}),
57
+ };
58
+ }
59
+ const model = selectDefaultModel(entriesByProvider.get(provider)?.models ?? []);
60
+ if (!model) {
61
+ return { provider };
62
+ }
63
+ const thinkingOptionId = resolveThinkingOptionId(model, selection.thinkingOptionId);
64
+ return {
65
+ provider,
66
+ model: model.id,
67
+ ...(thinkingOptionId ? { thinkingOptionId } : {}),
68
+ };
69
+ }
70
+ function resolveConfiguredCandidate(candidate, readyEntries, entriesByProvider) {
71
+ const provider = candidate.provider.trim();
72
+ if (!provider) {
73
+ return null;
74
+ }
75
+ const topLevelEntry = entriesByProvider.get(provider);
76
+ const configuredModel = candidate.model?.trim();
77
+ if (topLevelEntry) {
78
+ if (configuredModel) {
79
+ return {
80
+ provider,
81
+ model: configuredModel,
82
+ ...(candidate.thinkingOptionId ? { thinkingOptionId: candidate.thinkingOptionId } : {}),
83
+ };
84
+ }
85
+ const model = selectDefaultModel(topLevelEntry.models ?? []);
86
+ const thinkingOptionId = resolveThinkingOptionId(model, candidate.thinkingOptionId);
87
+ return {
88
+ provider,
89
+ ...(model ? { model: model.id } : {}),
90
+ ...(thinkingOptionId ? { thinkingOptionId } : {}),
91
+ };
92
+ }
93
+ if (!configuredModel) {
94
+ return {
95
+ provider,
96
+ ...(candidate.thinkingOptionId ? { thinkingOptionId: candidate.thinkingOptionId } : {}),
97
+ };
98
+ }
99
+ const nestedMatch = resolveNestedProviderModel(provider, configuredModel, readyEntries);
100
+ if (!nestedMatch) {
101
+ return {
102
+ provider,
103
+ model: configuredModel,
104
+ ...(candidate.thinkingOptionId ? { thinkingOptionId: candidate.thinkingOptionId } : {}),
105
+ };
106
+ }
107
+ const thinkingOptionId = resolveThinkingOptionId(nestedMatch.model, candidate.thinkingOptionId);
108
+ return {
109
+ provider: nestedMatch.provider,
110
+ model: nestedMatch.model.id,
111
+ ...(thinkingOptionId ? { thinkingOptionId } : {}),
112
+ };
113
+ }
114
+ function resolveNestedProviderModel(providerId, modelId, entries) {
115
+ const normalizedProviderId = providerId.trim().toLowerCase();
116
+ const normalizedModelId = modelId.trim().toLowerCase();
117
+ for (const entry of entries) {
118
+ for (const model of entry.models ?? []) {
119
+ const modelProviderId = readModelMetadataString(model, "providerId")?.toLowerCase();
120
+ const nestedModelId = readModelMetadataString(model, "modelId")?.toLowerCase();
121
+ if (modelProviderId !== normalizedProviderId) {
122
+ continue;
123
+ }
124
+ if (normalizedModelId === model.id.toLowerCase() ||
125
+ normalizedModelId === nestedModelId ||
126
+ model.id.toLowerCase() === `${normalizedProviderId}/${normalizedModelId}`) {
127
+ return { provider: entry.provider, model };
128
+ }
129
+ }
130
+ }
131
+ return null;
132
+ }
133
+ function resolveByModelSubstring(entries, identifier) {
134
+ const needle = identifier.modelSubstring.trim().toLowerCase();
135
+ if (!needle) {
136
+ return null;
137
+ }
138
+ for (const entry of entries) {
139
+ for (const model of entry.models ?? []) {
140
+ const haystacks = [model.id, model.label].map((value) => value.toLowerCase());
141
+ if (!haystacks.some((value) => value.includes(needle))) {
142
+ continue;
143
+ }
144
+ const thinkingOptionId = resolveThinkingOptionId(model, identifier.thinkingOptionId);
145
+ return {
146
+ provider: entry.provider,
147
+ model: model.id,
148
+ ...(thinkingOptionId ? { thinkingOptionId } : {}),
149
+ };
150
+ }
151
+ }
152
+ return null;
153
+ }
154
+ function readConfiguredProviders(daemonConfig) {
155
+ const metadataGeneration = daemonConfig?.metadataGeneration;
156
+ if (!metadataGeneration || typeof metadataGeneration !== "object") {
157
+ return [];
158
+ }
159
+ const providers = "providers" in metadataGeneration ? metadataGeneration.providers : undefined;
160
+ return Array.isArray(providers) ? providers : [];
161
+ }
162
+ function selectDefaultModel(models) {
163
+ return models.find((model) => model.isDefault) ?? models[0] ?? null;
164
+ }
165
+ function resolveThinkingOptionId(model, preferredThinkingOptionId) {
166
+ if (!model) {
167
+ return undefined;
168
+ }
169
+ if (preferredThinkingOptionId &&
170
+ model.thinkingOptions?.some((option) => option.id === preferredThinkingOptionId)) {
171
+ return preferredThinkingOptionId;
172
+ }
173
+ return model.defaultThinkingOptionId;
174
+ }
175
+ function dedupeProviders(providers) {
176
+ const seen = new Set();
177
+ const deduped = [];
178
+ for (const provider of providers) {
179
+ const key = [provider.provider, provider.model ?? "", provider.thinkingOptionId ?? ""].join("\0");
180
+ if (seen.has(key)) {
181
+ continue;
182
+ }
183
+ seen.add(key);
184
+ deduped.push(provider);
185
+ }
186
+ return deduped;
187
+ }
188
+ function readModelMetadataString(model, key) {
189
+ const value = model.metadata?.[key];
190
+ return typeof value === "string" && value.trim().length > 0 ? value : undefined;
191
+ }
192
+ //# sourceMappingURL=structured-generation-providers.js.map
@@ -76,6 +76,13 @@ export interface PaseoDaemonConfig {
76
76
  dictationFinalTimeoutMs?: number;
77
77
  downloadTokenTtlMs?: number;
78
78
  agentProviderSettings?: AgentProviderRuntimeSettingsMap;
79
+ metadataGeneration?: {
80
+ providers?: Array<{
81
+ provider: string;
82
+ model?: string;
83
+ thinkingOptionId?: string;
84
+ }>;
85
+ };
79
86
  providerOverrides?: Record<string, ProviderOverride>;
80
87
  log?: PersistedConfig["log"];
81
88
  onLifecycleIntent?: (intent: DaemonLifecycleIntent) => void;
@@ -169,6 +169,9 @@ export async function createPaseoDaemon(config, rootLogger) {
169
169
  ...(override.additionalModels ? { additionalModels: override.additionalModels } : {}),
170
170
  },
171
171
  ])),
172
+ metadataGeneration: {
173
+ providers: config.metadataGeneration?.providers ?? [],
174
+ },
172
175
  autoArchiveAfterMerge: config.autoArchiveAfterMerge ?? false,
173
176
  appendSystemPrompt: config.appendSystemPrompt ?? "",
174
177
  }, logger);
@@ -207,6 +207,7 @@ export function loadConfig(paseoHome, options) {
207
207
  voiceLlmProviderExplicit: voiceLlm.providerExplicit,
208
208
  voiceLlmModel: voiceLlm.model,
209
209
  agentProviderSettings: extractAgentProviderSettings(providerOverrides),
210
+ metadataGeneration: persisted.agents?.metadataGeneration,
210
211
  providerOverrides,
211
212
  log: resolveLogConfigFromEnv(env, persisted),
212
213
  };
@@ -114,8 +114,29 @@ export class DaemonConfigStore {
114
114
  }
115
115
  function mergeMutableConfigIntoPersistedConfig(params) {
116
116
  const { persisted, mutable } = params;
117
+ const metadataGenerationProviders = readMetadataGenerationProviders(mutable);
117
118
  const providerOverrides = applyMutableProviderConfigToOverrides(persisted.agents?.providers, mutable.providers);
118
119
  const persistedAgents = persisted.agents;
120
+ const persistedMetadataGeneration = {
121
+ providers: metadataGenerationProviders,
122
+ };
123
+ const shouldPersistMetadataGeneration = metadataGenerationProviders.length > 0 || persisted.agents?.metadataGeneration !== undefined;
124
+ let nextAgents = persisted.agents;
125
+ if (providerOverrides && Object.keys(providerOverrides).length > 0) {
126
+ nextAgents = {
127
+ ...persistedAgents,
128
+ providers: providerOverrides,
129
+ ...(shouldPersistMetadataGeneration
130
+ ? { metadataGeneration: persistedMetadataGeneration }
131
+ : {}),
132
+ };
133
+ }
134
+ else if (shouldPersistMetadataGeneration) {
135
+ nextAgents = {
136
+ ...persistedAgents,
137
+ metadataGeneration: persistedMetadataGeneration,
138
+ };
139
+ }
119
140
  return {
120
141
  ...persisted,
121
142
  daemon: {
@@ -127,12 +148,31 @@ function mergeMutableConfigIntoPersistedConfig(params) {
127
148
  autoArchiveAfterMerge: mutable.autoArchiveAfterMerge,
128
149
  appendSystemPrompt: mutable.appendSystemPrompt,
129
150
  },
130
- agents: providerOverrides && Object.keys(providerOverrides).length > 0
131
- ? {
132
- ...persistedAgents,
133
- providers: providerOverrides,
134
- }
135
- : persisted.agents,
151
+ agents: nextAgents,
136
152
  };
137
153
  }
154
+ function readMetadataGenerationProviders(mutable) {
155
+ const metadataGeneration = mutable.metadataGeneration;
156
+ if (!isRecord(metadataGeneration)) {
157
+ return [];
158
+ }
159
+ const providers = metadataGeneration["providers"];
160
+ if (!Array.isArray(providers)) {
161
+ return [];
162
+ }
163
+ return providers.flatMap((entry) => {
164
+ if (!isRecord(entry) || typeof entry["provider"] !== "string") {
165
+ return [];
166
+ }
167
+ return [
168
+ {
169
+ provider: entry["provider"],
170
+ ...(typeof entry["model"] === "string" ? { model: entry["model"] } : {}),
171
+ ...(typeof entry["thinkingOptionId"] === "string"
172
+ ? { thinkingOptionId: entry["thinkingOptionId"] }
173
+ : {}),
174
+ },
175
+ ];
176
+ });
177
+ }
138
178
  //# sourceMappingURL=daemon-config-store.js.map
@@ -2,6 +2,7 @@ import { createPaseoDaemon } from "./bootstrap.js";
2
2
  import { loadConfig } from "./config.js";
3
3
  import { resolvePaseoHome } from "./paseo-home.js";
4
4
  import { createRootLogger } from "./logger.js";
5
+ process.title = "Paseo Daemon";
5
6
  function bootstrapFromEnvironment() {
6
7
  try {
7
8
  const paseoHome = resolvePaseoHome();
@@ -1,6 +1,6 @@
1
1
  import { constants, promises as fs } from "fs";
2
2
  import path from "path";
3
- import { resolvePathFromBase } from "../path-utils.js";
3
+ import { expandUserPath, resolvePathFromBase } from "../path-utils.js";
4
4
  const TEXT_MIME_TYPES = {
5
5
  ".json": "application/json",
6
6
  };
@@ -168,7 +168,7 @@ export async function getDownloadableFileInfo({ root, relativePath }) {
168
168
  }
169
169
  }
170
170
  async function resolveScopedPath({ root, relativePath = ".", }) {
171
- const normalizedRoot = path.resolve(root);
171
+ const normalizedRoot = expandUserPath(root);
172
172
  const requestedPath = resolvePathFromBase(normalizedRoot, relativePath);
173
173
  const relative = path.relative(normalizedRoot, requestedPath);
174
174
  if (relative !== "" && (relative.startsWith("..") || path.isAbsolute(relative))) {
@@ -215,8 +215,8 @@ function isOutsideWorkspaceError(error) {
215
215
  return error instanceof Error && error.message === ACCESS_OUTSIDE_WORKSPACE_MESSAGE;
216
216
  }
217
217
  function normalizeRelativePath({ root, targetPath }) {
218
- const normalizedRoot = path.resolve(root);
219
- const normalizedTarget = path.resolve(targetPath);
218
+ const normalizedRoot = expandUserPath(root);
219
+ const normalizedTarget = expandUserPath(targetPath);
220
220
  const relative = path.relative(normalizedRoot, normalizedTarget);
221
221
  return relative === "" ? "." : relative.split(path.sep).join("/");
222
222
  }
@@ -446,7 +446,41 @@ export declare const PersistedConfigSchema: z.ZodObject<{
446
446
  extends?: string | undefined;
447
447
  order?: number | undefined;
448
448
  }>, unknown>>;
449
+ metadataGeneration: z.ZodOptional<z.ZodObject<{
450
+ providers: z.ZodOptional<z.ZodArray<z.ZodObject<{
451
+ provider: z.ZodString;
452
+ model: z.ZodOptional<z.ZodString>;
453
+ thinkingOptionId: z.ZodOptional<z.ZodString>;
454
+ }, "strict", z.ZodTypeAny, {
455
+ provider: string;
456
+ model?: string | undefined;
457
+ thinkingOptionId?: string | undefined;
458
+ }, {
459
+ provider: string;
460
+ model?: string | undefined;
461
+ thinkingOptionId?: string | undefined;
462
+ }>, "many">>;
463
+ }, "strict", z.ZodTypeAny, {
464
+ providers?: {
465
+ provider: string;
466
+ model?: string | undefined;
467
+ thinkingOptionId?: string | undefined;
468
+ }[] | undefined;
469
+ }, {
470
+ providers?: {
471
+ provider: string;
472
+ model?: string | undefined;
473
+ thinkingOptionId?: string | undefined;
474
+ }[] | undefined;
475
+ }>>;
449
476
  }, "strict", z.ZodTypeAny, {
477
+ metadataGeneration?: {
478
+ providers?: {
479
+ provider: string;
480
+ model?: string | undefined;
481
+ thinkingOptionId?: string | undefined;
482
+ }[] | undefined;
483
+ } | undefined;
450
484
  providers?: Record<string, {
451
485
  description?: string | undefined;
452
486
  label?: string | undefined;
@@ -482,6 +516,13 @@ export declare const PersistedConfigSchema: z.ZodObject<{
482
516
  order?: number | undefined;
483
517
  }> | undefined;
484
518
  }, {
519
+ metadataGeneration?: {
520
+ providers?: {
521
+ provider: string;
522
+ model?: string | undefined;
523
+ thinkingOptionId?: string | undefined;
524
+ }[] | undefined;
525
+ } | undefined;
485
526
  providers?: unknown;
486
527
  }>>;
487
528
  features: z.ZodOptional<z.ZodObject<{
@@ -561,14 +602,14 @@ export declare const PersistedConfigSchema: z.ZodObject<{
561
602
  }, "strict", z.ZodTypeAny, {
562
603
  provider?: "local" | "openai" | undefined;
563
604
  model?: string | undefined;
564
- speed?: number | undefined;
565
605
  voice?: "alloy" | "echo" | "fable" | "onyx" | "nova" | "shimmer" | undefined;
606
+ speed?: number | undefined;
566
607
  speakerId?: number | undefined;
567
608
  }, {
568
609
  provider?: string | undefined;
569
610
  model?: string | undefined;
570
- speed?: number | undefined;
571
611
  voice?: "alloy" | "echo" | "fable" | "onyx" | "nova" | "shimmer" | undefined;
612
+ speed?: number | undefined;
572
613
  speakerId?: number | undefined;
573
614
  }>>;
574
615
  }, "strict", z.ZodTypeAny, {
@@ -588,8 +629,8 @@ export declare const PersistedConfigSchema: z.ZodObject<{
588
629
  tts?: {
589
630
  provider?: "local" | "openai" | undefined;
590
631
  model?: string | undefined;
591
- speed?: number | undefined;
592
632
  voice?: "alloy" | "echo" | "fable" | "onyx" | "nova" | "shimmer" | undefined;
633
+ speed?: number | undefined;
593
634
  speakerId?: number | undefined;
594
635
  } | undefined;
595
636
  }, {
@@ -609,8 +650,8 @@ export declare const PersistedConfigSchema: z.ZodObject<{
609
650
  tts?: {
610
651
  provider?: string | undefined;
611
652
  model?: string | undefined;
612
- speed?: number | undefined;
613
653
  voice?: "alloy" | "echo" | "fable" | "onyx" | "nova" | "shimmer" | undefined;
654
+ speed?: number | undefined;
614
655
  speakerId?: number | undefined;
615
656
  } | undefined;
616
657
  }>>;
@@ -641,8 +682,8 @@ export declare const PersistedConfigSchema: z.ZodObject<{
641
682
  tts?: {
642
683
  provider?: "local" | "openai" | undefined;
643
684
  model?: string | undefined;
644
- speed?: number | undefined;
645
685
  voice?: "alloy" | "echo" | "fable" | "onyx" | "nova" | "shimmer" | undefined;
686
+ speed?: number | undefined;
646
687
  speakerId?: number | undefined;
647
688
  } | undefined;
648
689
  } | undefined;
@@ -673,8 +714,8 @@ export declare const PersistedConfigSchema: z.ZodObject<{
673
714
  tts?: {
674
715
  provider?: string | undefined;
675
716
  model?: string | undefined;
676
- speed?: number | undefined;
677
717
  voice?: "alloy" | "echo" | "fable" | "onyx" | "nova" | "shimmer" | undefined;
718
+ speed?: number | undefined;
678
719
  speakerId?: number | undefined;
679
720
  } | undefined;
680
721
  } | undefined;
@@ -722,6 +763,10 @@ export declare const PersistedConfigSchema: z.ZodObject<{
722
763
  }>>;
723
764
  }, "strict", z.ZodTypeAny, {
724
765
  level?: "error" | "fatal" | "warn" | "info" | "debug" | "trace" | undefined;
766
+ console?: {
767
+ level?: "error" | "fatal" | "warn" | "info" | "debug" | "trace" | undefined;
768
+ format?: "json" | "pretty" | undefined;
769
+ } | undefined;
725
770
  file?: {
726
771
  path?: string | undefined;
727
772
  level?: "error" | "fatal" | "warn" | "info" | "debug" | "trace" | undefined;
@@ -731,12 +776,12 @@ export declare const PersistedConfigSchema: z.ZodObject<{
731
776
  } | undefined;
732
777
  } | undefined;
733
778
  format?: "json" | "pretty" | undefined;
779
+ }, {
780
+ level?: "error" | "fatal" | "warn" | "info" | "debug" | "trace" | undefined;
734
781
  console?: {
735
782
  level?: "error" | "fatal" | "warn" | "info" | "debug" | "trace" | undefined;
736
783
  format?: "json" | "pretty" | undefined;
737
784
  } | undefined;
738
- }, {
739
- level?: "error" | "fatal" | "warn" | "info" | "debug" | "trace" | undefined;
740
785
  file?: {
741
786
  path?: string | undefined;
742
787
  level?: "error" | "fatal" | "warn" | "info" | "debug" | "trace" | undefined;
@@ -746,10 +791,6 @@ export declare const PersistedConfigSchema: z.ZodObject<{
746
791
  } | undefined;
747
792
  } | undefined;
748
793
  format?: "json" | "pretty" | undefined;
749
- console?: {
750
- level?: "error" | "fatal" | "warn" | "info" | "debug" | "trace" | undefined;
751
- format?: "json" | "pretty" | undefined;
752
- } | undefined;
753
794
  }>>;
754
795
  }, "strict", z.ZodTypeAny, {
755
796
  version?: 1 | undefined;
@@ -780,14 +821,18 @@ export declare const PersistedConfigSchema: z.ZodObject<{
780
821
  tts?: {
781
822
  provider?: "local" | "openai" | undefined;
782
823
  model?: string | undefined;
783
- speed?: number | undefined;
784
824
  voice?: "alloy" | "echo" | "fable" | "onyx" | "nova" | "shimmer" | undefined;
825
+ speed?: number | undefined;
785
826
  speakerId?: number | undefined;
786
827
  } | undefined;
787
828
  } | undefined;
788
829
  } | undefined;
789
830
  log?: {
790
831
  level?: "error" | "fatal" | "warn" | "info" | "debug" | "trace" | undefined;
832
+ console?: {
833
+ level?: "error" | "fatal" | "warn" | "info" | "debug" | "trace" | undefined;
834
+ format?: "json" | "pretty" | undefined;
835
+ } | undefined;
791
836
  file?: {
792
837
  path?: string | undefined;
793
838
  level?: "error" | "fatal" | "warn" | "info" | "debug" | "trace" | undefined;
@@ -797,12 +842,15 @@ export declare const PersistedConfigSchema: z.ZodObject<{
797
842
  } | undefined;
798
843
  } | undefined;
799
844
  format?: "json" | "pretty" | undefined;
800
- console?: {
801
- level?: "error" | "fatal" | "warn" | "info" | "debug" | "trace" | undefined;
802
- format?: "json" | "pretty" | undefined;
803
- } | undefined;
804
845
  } | undefined;
805
846
  agents?: {
847
+ metadataGeneration?: {
848
+ providers?: {
849
+ provider: string;
850
+ model?: string | undefined;
851
+ thinkingOptionId?: string | undefined;
852
+ }[] | undefined;
853
+ } | undefined;
806
854
  providers?: Record<string, {
807
855
  description?: string | undefined;
808
856
  label?: string | undefined;
@@ -901,14 +949,18 @@ export declare const PersistedConfigSchema: z.ZodObject<{
901
949
  tts?: {
902
950
  provider?: string | undefined;
903
951
  model?: string | undefined;
904
- speed?: number | undefined;
905
952
  voice?: "alloy" | "echo" | "fable" | "onyx" | "nova" | "shimmer" | undefined;
953
+ speed?: number | undefined;
906
954
  speakerId?: number | undefined;
907
955
  } | undefined;
908
956
  } | undefined;
909
957
  } | undefined;
910
958
  log?: {
911
959
  level?: "error" | "fatal" | "warn" | "info" | "debug" | "trace" | undefined;
960
+ console?: {
961
+ level?: "error" | "fatal" | "warn" | "info" | "debug" | "trace" | undefined;
962
+ format?: "json" | "pretty" | undefined;
963
+ } | undefined;
912
964
  file?: {
913
965
  path?: string | undefined;
914
966
  level?: "error" | "fatal" | "warn" | "info" | "debug" | "trace" | undefined;
@@ -918,12 +970,15 @@ export declare const PersistedConfigSchema: z.ZodObject<{
918
970
  } | undefined;
919
971
  } | undefined;
920
972
  format?: "json" | "pretty" | undefined;
921
- console?: {
922
- level?: "error" | "fatal" | "warn" | "info" | "debug" | "trace" | undefined;
923
- format?: "json" | "pretty" | undefined;
924
- } | undefined;
925
973
  } | undefined;
926
974
  agents?: {
975
+ metadataGeneration?: {
976
+ providers?: {
977
+ provider: string;
978
+ model?: string | undefined;
979
+ thinkingOptionId?: string | undefined;
980
+ }[] | undefined;
981
+ } | undefined;
927
982
  providers?: unknown;
928
983
  } | undefined;
929
984
  app?: {
@@ -112,6 +112,18 @@ const FeatureVoiceModeSchema = z
112
112
  .optional(),
113
113
  })
114
114
  .strict();
115
+ const StructuredGenerationProviderConfigSchema = z
116
+ .object({
117
+ provider: z.string().min(1),
118
+ model: z.string().min(1).optional(),
119
+ thinkingOptionId: z.string().min(1).optional(),
120
+ })
121
+ .strict();
122
+ const AgentMetadataGenerationSchema = z
123
+ .object({
124
+ providers: z.array(StructuredGenerationProviderConfigSchema).optional(),
125
+ })
126
+ .strict();
115
127
  const BUILTIN_PROVIDER_IDS = ["claude", "codex", "copilot", "opencode", "pi"];
116
128
  function isLegacyProviderEntry(value) {
117
129
  if (!value || typeof value !== "object" || Array.isArray(value)) {
@@ -203,6 +215,7 @@ export const PersistedConfigSchema = z
203
215
  agents: z
204
216
  .object({
205
217
  providers: z.preprocess(normalizeAgentProviders, ProviderOverridesSchema).optional(),
218
+ metadataGeneration: AgentMetadataGenerationSchema.optional(),
206
219
  })
207
220
  .strict()
208
221
  .optional(),
@@ -160,7 +160,6 @@ export declare class Session {
160
160
  private agentUpdatesSubscription;
161
161
  private workspaceUpdatesSubscription;
162
162
  private clientActivity;
163
- private readonly MOBILE_BACKGROUND_STREAM_GRACE_MS;
164
163
  private readonly terminalManager;
165
164
  private readonly providerSnapshotManager;
166
165
  private unsubscribeProviderSnapshotEvents;
@@ -217,6 +216,8 @@ export declare class Session {
217
216
  appVisible: boolean;
218
217
  appVisibilityChangedAt: Date;
219
218
  } | null;
219
+ private getFocusedAgentSelectionForCwd;
220
+ private readStructuredGenerationDaemonConfig;
220
221
  getRuntimeMetrics(): SessionRuntimeMetrics;
221
222
  emitServerMessage(message: SessionOutboundMessage): void;
222
223
  /**
@@ -245,7 +246,6 @@ export declare class Session {
245
246
  private bindVoiceBridges;
246
247
  private initializePerSessionManagers;
247
248
  private subscribeToAgentEvents;
248
- private shouldSkipAgentStreamForward;
249
249
  private buildAgentStreamPayload;
250
250
  private buildAgentPayload;
251
251
  private buildStoredAgentPayload;
@@ -405,6 +405,7 @@ export declare class Session {
405
405
  private handleCheckoutMergeFromBaseRequest;
406
406
  private handleCheckoutPullRequest;
407
407
  private handleCheckoutPushRequest;
408
+ private handleCheckoutRefreshRequest;
408
409
  private handleCheckoutPrCreateRequest;
409
410
  private handleCheckoutPrMergeRequest;
410
411
  private assertCurrentPullRequestHasGithubMergeFacts;