@adhdev/daemon-core 0.8.57 → 0.8.59

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 (75) hide show
  1. package/dist/agent-stream/types.d.ts +3 -4
  2. package/dist/boot/daemon-lifecycle.d.ts +1 -0
  3. package/dist/commands/handler.d.ts +1 -0
  4. package/dist/commands/router.d.ts +1 -0
  5. package/dist/commands/stream-commands.d.ts +3 -0
  6. package/dist/config/chat-history.d.ts +3 -0
  7. package/dist/config/config.d.ts +3 -0
  8. package/dist/config/provider-source-config.d.ts +23 -0
  9. package/dist/config/recent-activity.d.ts +2 -1
  10. package/dist/config/saved-sessions.d.ts +2 -1
  11. package/dist/daemon/dev-server-types.d.ts +1 -0
  12. package/dist/daemon/dev-server.d.ts +4 -0
  13. package/dist/index.d.ts +3 -1
  14. package/dist/index.js +876 -337
  15. package/dist/index.js.map +1 -1
  16. package/dist/index.mjs +875 -337
  17. package/dist/index.mjs.map +1 -1
  18. package/dist/providers/acp-provider-instance.d.ts +8 -2
  19. package/dist/providers/cli-provider-instance.d.ts +10 -0
  20. package/dist/providers/contracts.d.ts +4 -2
  21. package/dist/providers/extension-provider-instance.d.ts +1 -2
  22. package/dist/providers/provider-instance.d.ts +3 -4
  23. package/dist/providers/provider-loader.d.ts +14 -1
  24. package/dist/providers/provider-patch-state.d.ts +23 -0
  25. package/dist/providers/summary-metadata.d.ts +22 -0
  26. package/dist/shared-types.d.ts +15 -9
  27. package/dist/status/snapshot.d.ts +16 -1
  28. package/node_modules/@adhdev/session-host-core/package.json +1 -1
  29. package/package.json +1 -1
  30. package/src/agent-stream/forward.ts +1 -2
  31. package/src/agent-stream/manager.ts +2 -1
  32. package/src/agent-stream/provider-adapter.ts +7 -3
  33. package/src/agent-stream/types.d.ts +3 -4
  34. package/src/agent-stream/types.ts +3 -4
  35. package/src/boot/daemon-lifecycle.ts +13 -3
  36. package/src/commands/cli-manager.ts +10 -5
  37. package/src/commands/handler.ts +3 -0
  38. package/src/commands/router.ts +160 -26
  39. package/src/commands/stream-commands.ts +60 -2
  40. package/src/config/chat-history.ts +39 -0
  41. package/src/config/config.d.ts +3 -0
  42. package/src/config/config.ts +19 -3
  43. package/src/config/provider-source-config.ts +42 -0
  44. package/src/config/recent-activity.d.ts +2 -1
  45. package/src/config/recent-activity.ts +12 -1
  46. package/src/config/saved-sessions.d.ts +2 -1
  47. package/src/config/saved-sessions.ts +12 -2
  48. package/src/daemon/dev-auto-implement.ts +1 -14
  49. package/src/daemon/dev-cli-debug.ts +0 -1
  50. package/src/daemon/dev-server-types.ts +1 -0
  51. package/src/daemon/dev-server.ts +46 -21
  52. package/src/daemon/scaffold-template.ts +8 -1
  53. package/src/index.d.ts +1 -1
  54. package/src/index.ts +4 -0
  55. package/src/providers/acp-provider-instance.d.ts +8 -2
  56. package/src/providers/acp-provider-instance.ts +80 -23
  57. package/src/providers/cli-provider-instance.ts +42 -22
  58. package/src/providers/contracts.d.ts +3 -2
  59. package/src/providers/contracts.ts +7 -4
  60. package/src/providers/control-effects.ts +3 -4
  61. package/src/providers/extension-provider-instance.d.ts +1 -2
  62. package/src/providers/extension-provider-instance.ts +26 -14
  63. package/src/providers/ide-provider-instance.ts +28 -15
  64. package/src/providers/provider-instance.d.ts +3 -4
  65. package/src/providers/provider-instance.ts +6 -7
  66. package/src/providers/provider-loader.d.ts +4 -1
  67. package/src/providers/provider-loader.ts +61 -23
  68. package/src/providers/provider-patch-state.ts +91 -0
  69. package/src/providers/provider-schema.ts +3 -0
  70. package/src/providers/summary-metadata.ts +118 -0
  71. package/src/shared-types.d.ts +15 -9
  72. package/src/shared-types.ts +17 -9
  73. package/src/status/builders.ts +18 -13
  74. package/src/status/reporter.ts +2 -4
  75. package/src/status/snapshot.ts +60 -2
@@ -35,8 +35,7 @@ export declare class AcpProviderInstance implements ProviderInstance {
35
35
  private lastStatus;
36
36
  private generatingStartedAt;
37
37
  private agentCapabilities;
38
- private currentModel;
39
- private currentMode;
38
+ private currentSelections;
40
39
  private activeToolCalls;
41
40
  private stopReason;
42
41
  private partialContent;
@@ -62,6 +61,13 @@ export declare class AcpProviderInstance implements ProviderInstance {
62
61
  getState(): AcpProviderState;
63
62
  onEvent(event: string, data?: any): void;
64
63
  getInstanceId(): string;
64
+ private resolveConfigOptionLabel;
65
+ private resolveModeLabel;
66
+ private getCurrentSelection;
67
+ private setCurrentSelection;
68
+ private getSelectionControlValues;
69
+ private resolveSelectionLabel;
70
+ private buildSelectionSummaryMetadata;
65
71
  private parseConfigOptions;
66
72
  private parseModes;
67
73
  setConfigOption(category: string, value: string): Promise<void>;
@@ -9,6 +9,15 @@ import type { ProviderInstance, ProviderState, InstanceContext } from './provide
9
9
  import { ProviderCliAdapter } from '../cli-adapters/provider-cli-adapter.js';
10
10
  import type { PtyTransportFactory } from '../cli-adapters/pty-transport.js';
11
11
  export declare function getForcedNewSessionScriptName(provider: ProviderModule | undefined, launchMode: 'new' | 'resume' | 'manual'): string | null;
12
+ export declare function waitForCliAdapterReady(adapter: {
13
+ isReady?: () => boolean;
14
+ getStatus?: () => {
15
+ status?: string;
16
+ };
17
+ }, options?: {
18
+ timeoutMs?: number;
19
+ pollMs?: number;
20
+ }): Promise<void>;
12
21
  export declare class CliProviderInstance implements ProviderInstance {
13
22
  private provider;
14
23
  private workingDir;
@@ -26,6 +35,7 @@ export declare class CliProviderInstance implements ProviderInstance {
26
35
  private generatingDebouncePending;
27
36
  private lastApprovalEventAt;
28
37
  private controlValues;
38
+ private summaryMetadata;
29
39
  private appliedEffectKeys;
30
40
  private historyWriter;
31
41
  private runtimeMessages;
@@ -6,6 +6,7 @@
6
6
  * - Common across all categories (cli, ide, extension)
7
7
  * - User custom providers use the same contracts
8
8
  */
9
+ import type { ProviderSummaryMetadata } from '../shared-types.js';
9
10
  export interface ReadChatResult {
10
11
  messages: ChatMessage[];
11
12
  status: AgentStatus;
@@ -21,10 +22,10 @@ export interface ReadChatResult {
21
22
  isVisible?: boolean;
22
23
  isWelcomeScreen?: boolean;
23
24
  inputContent?: string;
24
- model?: string;
25
- autoApprove?: string;
26
25
  /** Explicit dynamic control values returned by the provider */
27
26
  controlValues?: Record<string, string | number | boolean>;
27
+ /** Flexible always-visible metadata for compact/live surfaces. */
28
+ summaryMetadata?: ProviderSummaryMetadata;
28
29
  /** Provider-driven UI effects derived from chat state */
29
30
  effects?: ProviderEffect[];
30
31
  }
@@ -328,6 +329,7 @@ export interface ProviderModule {
328
329
  /** How the CLI adapter decides when to submit typed input */
329
330
  submitStrategy?: 'wait_for_echo' | 'immediate';
330
331
  /** Keep this provider out of the upstream auto-updated bundle */
332
+ /** @deprecated Machine-level provider source policy now lives in config.providerSourceMode. Local overrides shadow upstream by root precedence and should not rely on provider-level disableUpstream. */
331
333
  disableUpstream?: boolean;
332
334
  approvalKeys?: Record<number, string>;
333
335
  patterns?: {
@@ -18,9 +18,8 @@ export declare class ExtensionProviderInstance implements ProviderInstance {
18
18
  private messages;
19
19
  private prevMessageHashes;
20
20
  private activeModal;
21
- private currentModel;
22
- private currentMode;
23
21
  private controlValues;
22
+ private summaryMetadata;
24
23
  private appliedEffectKeys;
25
24
  private runtimeMessages;
26
25
  private lastAgentStatus;
@@ -8,7 +8,7 @@
8
8
  * Each Instance manages its own status.
9
9
  */
10
10
  import type { ProviderResumeCapability } from './contracts.js';
11
- import type { AcpConfigOption, AcpMode, ProviderControlSchema } from '../shared-types.js';
11
+ import type { AcpConfigOption, AcpMode, ProviderControlSchema, ProviderSummaryMetadata } from '../shared-types.js';
12
12
  import type { ChatMessage } from '../types.js';
13
13
  export type ProviderStatus = 'idle' | 'generating' | 'waiting_approval' | 'error' | 'stopped' | 'starting';
14
14
  export interface ProviderRuntimeWriteOwner {
@@ -54,8 +54,6 @@ interface ProviderStateBase {
54
54
  /** Workspace — project path or name (all categories) */
55
55
  workspace?: string | null;
56
56
  /** Runtime info (real-time detection) */
57
- currentModel?: string;
58
- currentPlan?: string;
59
57
  /** Error details (when status === 'error') */
60
58
  errorMessage?: string;
61
59
  errorReason?: ProviderErrorReason;
@@ -72,6 +70,8 @@ interface ProviderStateBase {
72
70
  controlValues?: Record<string, string | number | boolean>;
73
71
  /** Provider-declared controls schema (from provider.controls) */
74
72
  providerControls?: ProviderControlSchema[];
73
+ /** Flexible always-visible metadata for compact/live surfaces. */
74
+ summaryMetadata?: ProviderSummaryMetadata;
75
75
  }
76
76
  /** IDE provider state */
77
77
  export interface IdeProviderState extends ProviderStateBase {
@@ -79,7 +79,6 @@ export interface IdeProviderState extends ProviderStateBase {
79
79
  cdpConnected: boolean;
80
80
  /** IDE child Extension Instance status */
81
81
  extensions: ProviderState[];
82
- currentAutoApprove?: string;
83
82
  }
84
83
  /** CLI provider state */
85
84
  export interface CliProviderState extends ProviderStateBase {
@@ -14,11 +14,16 @@
14
14
  */
15
15
  import { VersionArchive } from './version-archive.js';
16
16
  import type { ProviderModule, ProviderCategory, ProviderSettingSchema, ResolvedProvider } from './contracts.js';
17
+ import type { ProviderSourceMode } from '../config/config.js';
18
+ import type { ProviderSourceConfigSnapshot } from '../config/provider-source-config.js';
17
19
  export declare class ProviderLoader {
18
20
  private providers;
19
21
  private providerAvailability;
22
+ private defaultProvidersDir;
23
+ private explicitProviderDir;
20
24
  private userDir;
21
25
  private upstreamDir;
26
+ private sourceMode;
22
27
  private disableUpstream;
23
28
  private watchers;
24
29
  private logFn;
@@ -31,7 +36,9 @@ export declare class ProviderLoader {
31
36
  constructor(options?: {
32
37
  userDir?: string;
33
38
  logFn?: (msg: string) => void;
34
- /** Disable upstream auto-download (for dev/testing/OSS) */
39
+ /** Explicit machine-level provider source policy */
40
+ sourceMode?: ProviderSourceMode;
41
+ /** Deprecated alias for sourceMode='no-upstream' */
35
42
  disableUpstream?: boolean;
36
43
  });
37
44
  private log;
@@ -48,6 +55,12 @@ export declare class ProviderLoader {
48
55
  * Highest-priority editable overrides come first.
49
56
  */
50
57
  getProviderRoots(): string[];
58
+ getSourceConfig(): ProviderSourceConfigSnapshot;
59
+ applySourceConfig(options?: {
60
+ userDir?: string;
61
+ sourceMode?: ProviderSourceMode;
62
+ disableUpstream?: boolean;
63
+ }): ProviderSourceConfigSnapshot;
51
64
  /**
52
65
  * Canonical provider directory shape for a given root.
53
66
  */
@@ -0,0 +1,23 @@
1
+ import type { ProviderControlDef } from './contracts.js';
2
+ export type ProviderControlValue = string | number | boolean;
3
+ export type ProviderControlValueMap = Record<string, ProviderControlValue>;
4
+ export declare function mergeProviderPatchState(params: {
5
+ providerControls?: ProviderControlDef[];
6
+ data: any;
7
+ currentControlValues?: ProviderControlValueMap;
8
+ currentSummaryMetadata?: unknown;
9
+ mergeWithCurrent?: boolean;
10
+ }): {
11
+ controlValues: ProviderControlValueMap;
12
+ summaryMetadata: unknown;
13
+ };
14
+ export declare function normalizeProviderStateControlValues(controlValues: ProviderControlValueMap | undefined): ProviderControlValueMap | undefined;
15
+ export declare function resolveProviderStateSurface(params: {
16
+ controlValues?: ProviderControlValueMap;
17
+ summaryMetadata?: unknown;
18
+ modelLabel?: string | null;
19
+ modeLabel?: string | null;
20
+ }): {
21
+ controlValues: ProviderControlValueMap | undefined;
22
+ summaryMetadata: unknown;
23
+ };
@@ -0,0 +1,22 @@
1
+ import type { ProviderSummaryItem, ProviderSummaryMetadata } from '../shared-types.js';
2
+ export declare function normalizeProviderSummaryMetadata(summary: ProviderSummaryMetadata | null | undefined): ProviderSummaryMetadata | undefined;
3
+ export declare function buildProviderSummaryMetadata(items: Array<ProviderSummaryItem | null | undefined>): ProviderSummaryMetadata | undefined;
4
+ export declare function getProviderSummaryItem(summary: ProviderSummaryMetadata | null | undefined, id: string): ProviderSummaryItem | undefined;
5
+ export declare function getProviderSummaryValue(summary: ProviderSummaryMetadata | null | undefined, id: string, options?: {
6
+ preferShortValue?: boolean;
7
+ }): string | undefined;
8
+ export declare function buildLegacyModelModeSummaryMetadata(params: {
9
+ model?: string | null;
10
+ mode?: string | null;
11
+ modelLabel?: string | null;
12
+ modeLabel?: string | null;
13
+ }): ProviderSummaryMetadata | undefined;
14
+ export declare function resolveProviderStateSummaryMetadata(params: {
15
+ summaryMetadata?: ProviderSummaryMetadata | null;
16
+ controlValues?: Record<string, string | number | boolean> | null;
17
+ modelLabel?: string | null;
18
+ modeLabel?: string | null;
19
+ }): ProviderSummaryMetadata | undefined;
20
+ export declare function normalizePersistedSummaryMetadata(params: {
21
+ summaryMetadata?: ProviderSummaryMetadata | null;
22
+ }): ProviderSummaryMetadata | undefined;
@@ -52,6 +52,17 @@ export interface ReadChatSyncResult {
52
52
  totalMessages: number;
53
53
  lastMessageSignature: string;
54
54
  }
55
+ export interface ProviderSummaryItem {
56
+ id: string;
57
+ value: string;
58
+ label?: string;
59
+ shortValue?: string;
60
+ icon?: string;
61
+ order?: number;
62
+ }
63
+ export interface ProviderSummaryMetadata {
64
+ items: ProviderSummaryItem[];
65
+ }
55
66
  export interface SessionHostAttachedClient {
56
67
  clientId: string;
57
68
  type: string;
@@ -239,15 +250,12 @@ export interface SessionEntry {
239
250
  activeChat: _ActiveChatData | null;
240
251
  capabilities?: SessionCapability[];
241
252
  cdpConnected?: boolean;
242
- currentModel?: string;
243
- currentPlan?: string;
244
- currentAutoApprove?: string;
245
- acpConfigOptions?: AcpConfigOption[];
246
- acpModes?: AcpMode[];
247
253
  /** Dynamic control current values (generic key-value) */
248
254
  controlValues?: Record<string, string | number | boolean>;
249
255
  /** Provider-declared controls schema (transmitted once, cached by frontend) */
250
256
  providerControls?: ProviderControlSchema[];
257
+ /** Flexible always-visible metadata for compact/live surfaces. */
258
+ summaryMetadata?: ProviderSummaryMetadata;
251
259
  errorMessage?: string;
252
260
  errorReason?: _ProviderErrorReason;
253
261
  lastMessagePreview?: string;
@@ -275,9 +283,7 @@ export interface CompactSessionEntry {
275
283
  title: string;
276
284
  workspace: string | null;
277
285
  cdpConnected?: boolean;
278
- currentModel?: string;
279
- currentPlan?: string;
280
- currentAutoApprove?: string;
286
+ summaryMetadata?: ProviderSummaryMetadata;
281
287
  }
282
288
  export type VersionUpdateReason = 'force_update_below' | 'major_minor_mismatch' | 'patch_mismatch' | 'daemon_ahead';
283
289
  /** Available provider information */
@@ -384,7 +390,7 @@ export interface RecentLaunchEntry {
384
390
  providerSessionId?: string;
385
391
  title?: string;
386
392
  workspace?: string | null;
387
- currentModel?: string;
393
+ summaryMetadata?: ProviderSummaryMetadata;
388
394
  lastLaunchedAt: number;
389
395
  }
390
396
  /** Compact machine payload broadcast by UserSessionDO to cloud dashboards. */
@@ -8,7 +8,7 @@
8
8
  import type { DaemonCdpManager } from '../cdp/manager.js';
9
9
  import { type SessionEntryProfile } from './builders.js';
10
10
  import type { ProviderState } from '../providers/provider-instance.js';
11
- import type { MachineInfo, StatusReportPayload } from '../shared-types.js';
11
+ import type { MachineInfo, RecentSessionBucket, StatusReportPayload } from '../shared-types.js';
12
12
  export interface StatusSnapshotOptions {
13
13
  allStates: ProviderState[];
14
14
  cdpManagers: Map<string, DaemonCdpManager>;
@@ -43,6 +43,21 @@ export interface StatusSnapshotOptions {
43
43
  profile?: SessionEntryProfile;
44
44
  }
45
45
  export type StatusSnapshot = StatusReportPayload;
46
+ export interface RecentReadDebugSnapshot {
47
+ sessionId: string;
48
+ providerType: string;
49
+ status: string;
50
+ inboxBucket: RecentSessionBucket;
51
+ unread: boolean;
52
+ lastSeenAt: number;
53
+ completionMarker: string;
54
+ seenCompletionMarker: string;
55
+ lastUpdated: number;
56
+ lastUsedAt: number;
57
+ lastRole: string;
58
+ messageUpdatedAt: number;
59
+ }
60
+ export declare function shouldEmitRecentReadDebugLog(cache: Map<string, string>, snapshot: RecentReadDebugSnapshot): boolean;
46
61
  export declare function buildMachineInfo(profile?: 'full' | 'live' | 'metadata'): MachineInfo;
47
62
  export declare function getSessionCompletionMarker(session: {
48
63
  activeChat?: {
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@adhdev/session-host-core",
3
- "version": "0.8.57",
3
+ "version": "0.8.59",
4
4
  "description": "ADHDev local session host core — session registry, protocol, buffers",
5
5
  "main": "dist/index.js",
6
6
  "types": "dist/index.d.ts",
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@adhdev/daemon-core",
3
- "version": "0.8.57",
3
+ "version": "0.8.59",
4
4
  "description": "ADHDev daemon core — CDP, IDE detection, providers, command execution",
5
5
  "main": "dist/index.js",
6
6
  "types": "dist/index.d.ts",
@@ -30,9 +30,8 @@ export function forwardAgentStreamsToIdeInstance(
30
30
  messages: stream.messages || [],
31
31
  status: stream.status || 'idle',
32
32
  activeModal: stream.activeModal || null,
33
- model: stream.model || undefined,
34
- mode: stream.mode || undefined,
35
33
  controlValues: stream.controlValues || undefined,
34
+ summaryMetadata: stream.summaryMetadata || undefined,
36
35
  effects: stream.effects || undefined,
37
36
  sessionId: stream.sessionId || stream.instanceId || undefined,
38
37
  title: stream.title || stream.agentName || undefined,
@@ -201,7 +201,8 @@ export class DaemonAgentStreamManager {
201
201
  cdp.evaluateInSessionFrame(agent.cdpSessionId, expr, timeout);
202
202
  const state = await agent.adapter.readChat(evaluate);
203
203
  const stateError = this.getStateError(state);
204
- LOG.debug('AgentStream', `[AgentStream] readChat(${type}) result: status=${state.status} msgs=${state.messages?.length || 0} model=${state.model || ''}${state.status === 'error' ? ' error=' + JSON.stringify(stateError) : ''}`);
204
+ const selectedModelValue = typeof state.controlValues?.model === 'string' ? state.controlValues.model : '';
205
+ LOG.debug('AgentStream', `[AgentStream] readChat(${type}) result: status=${state.status} msgs=${state.messages?.length || 0} model=${selectedModelValue}${state.status === 'error' ? ' error=' + JSON.stringify(stateError) : ''}`);
205
206
  if (state.status === 'error' && this.isRecoverableSessionError(stateError)) {
206
207
  throw new Error(stateError);
207
208
  }
@@ -13,6 +13,7 @@ import type {
13
13
  } from './types.js';
14
14
  import type { ProviderModule, ProviderScripts } from '../providers/contracts.js';
15
15
  import { extractProviderControlValues, normalizeProviderEffects } from '../providers/control-effects.js';
16
+ import { resolveProviderStateSurface } from '../providers/provider-patch-state.js';
16
17
 
17
18
  export class ProviderStreamAdapter implements IAgentStreamAdapter {
18
19
  readonly agentType: string;
@@ -154,15 +155,18 @@ export class ProviderStreamAdapter implements IAgentStreamAdapter {
154
155
  status: data.status || 'idle',
155
156
  messages: data.messages || [],
156
157
  inputContent: data.inputContent || '',
157
- model: data.model,
158
- mode: data.mode,
159
158
  activeModal: data.activeModal,
160
159
  };
161
160
  if (typeof data.title === 'string' && data.title.trim()) {
162
161
  state.title = data.title.trim();
163
162
  }
164
163
  const controlValues = extractProviderControlValues(this.provider.controls, data);
165
- if (controlValues) state.controlValues = controlValues;
164
+ const surface = resolveProviderStateSurface({
165
+ controlValues,
166
+ summaryMetadata: data.summaryMetadata,
167
+ });
168
+ if (surface.controlValues) state.controlValues = surface.controlValues;
169
+ if (surface.summaryMetadata) state.summaryMetadata = surface.summaryMetadata as any;
166
170
  const effects = normalizeProviderEffects(data);
167
171
  if (effects.length > 0) state.effects = effects;
168
172
  if (state.messages.length > 0) {
@@ -5,6 +5,7 @@
5
5
  * No vscode dependency — can be used as-is.
6
6
  */
7
7
  import type { ProviderEffect } from '../providers/contracts.js';
8
+ import type { ProviderSummaryMetadata } from '../shared-types.js';
8
9
  /** Agent chat message */
9
10
  export interface AgentChatMessage {
10
11
  role: 'user' | 'assistant' | 'system';
@@ -28,10 +29,6 @@ export interface AgentStreamState {
28
29
  messages: AgentChatMessage[];
29
30
  inputContent: string;
30
31
  title?: string;
31
- /** @deprecated Use controlValues['model'] — kept for backward compatibility */
32
- model?: string;
33
- /** @deprecated Use controlValues['mode'] — kept for backward compatibility */
34
- mode?: string;
35
32
  activeModal?: {
36
33
  message: string;
37
34
  buttons: string[];
@@ -40,6 +37,8 @@ export interface AgentStreamState {
40
37
  _error?: string;
41
38
  /** Dynamic control current values (populated from readChat + provider controls schema) */
42
39
  controlValues?: Record<string, string | number | boolean>;
40
+ /** Flexible compact/live summary metadata from readChat */
41
+ summaryMetadata?: ProviderSummaryMetadata;
43
42
  /** Provider-driven UI effects from readChat */
44
43
  effects?: ProviderEffect[];
45
44
  }
@@ -6,6 +6,7 @@
6
6
  */
7
7
 
8
8
  import type { ProviderEffect } from '../providers/contracts.js';
9
+ import type { ProviderSummaryMetadata } from '../shared-types.js';
9
10
 
10
11
  /** Agent chat message */
11
12
  export interface AgentChatMessage {
@@ -32,15 +33,13 @@ export interface AgentStreamState {
32
33
  messages: AgentChatMessage[];
33
34
  inputContent: string;
34
35
  title?: string;
35
- /** @deprecated Use controlValues['model'] — kept for backward compatibility */
36
- model?: string;
37
- /** @deprecated Use controlValues['mode'] — kept for backward compatibility */
38
- mode?: string;
39
36
  activeModal?: { message: string; buttons: string[] };
40
37
  error?: string;
41
38
  _error?: string;
42
39
  /** Dynamic control current values (populated from readChat + provider controls schema) */
43
40
  controlValues?: Record<string, string | number | boolean>;
41
+ /** Flexible compact/live summary metadata from readChat */
42
+ summaryMetadata?: ProviderSummaryMetadata;
44
43
  /** Provider-driven UI effects from readChat */
45
44
  effects?: ProviderEffect[];
46
45
  }
@@ -90,6 +90,7 @@ export interface DaemonComponents {
90
90
  cdpManagers: Map<string, DaemonCdpManager>;
91
91
  sessionRegistry: SessionRegistry;
92
92
  detectedIdes: { value: IDEInfo[] };
93
+ refreshProviderAvailability: (providerType?: string) => Promise<void>;
93
94
  }
94
95
 
95
96
  export interface DaemonDevSupportOptions {
@@ -116,12 +117,13 @@ export async function initDaemonComponents(config: DaemonInitConfig): Promise<Da
116
117
  // 1. Global log interceptor
117
118
  installGlobalInterceptor();
118
119
 
119
- // 2. ProviderLoader (disableUpstream from config.json)
120
+ // 2. ProviderLoader (provider source mode from config.json)
120
121
  const appConfig = loadConfig();
121
- const disableUpstream = appConfig.disableUpstream ?? false;
122
+ const providerSourceMode = appConfig.providerSourceMode || 'normal';
123
+ const disableUpstream = providerSourceMode === 'no-upstream';
122
124
  const providerLoader = new ProviderLoader({
123
125
  logFn: config.providerLogFn,
124
- disableUpstream,
126
+ sourceMode: providerSourceMode,
125
127
  userDir: appConfig.providerDir,
126
128
  });
127
129
 
@@ -253,6 +255,10 @@ export async function initDaemonComponents(config: DaemonInitConfig): Promise<Da
253
255
  await refreshProviderAvailability(providerType);
254
256
  config.onStatusChange?.();
255
257
  },
258
+ onProviderSourceConfigChanged: async () => {
259
+ await refreshProviderAvailability();
260
+ config.onStatusChange?.();
261
+ },
256
262
  });
257
263
 
258
264
  // 8. AgentStreamManager
@@ -312,6 +318,7 @@ export async function initDaemonComponents(config: DaemonInitConfig): Promise<Da
312
318
  cdpManagers,
313
319
  sessionRegistry,
314
320
  detectedIdes: detectedIdesRef,
321
+ refreshProviderAvailability,
315
322
  };
316
323
  }
317
324
 
@@ -327,6 +334,9 @@ export async function startDaemonDevSupport(options: DaemonDevSupportOptions): P
327
334
  instanceManager: options.components.instanceManager,
328
335
  cliManager: options.components.cliManager,
329
336
  logFn: options.logFn,
337
+ onProviderSourceConfigChanged: async () => {
338
+ await options.components.refreshProviderAvailability();
339
+ },
330
340
  });
331
341
  await devServer.start();
332
342
  options.components.providerLoader.watch();
@@ -17,6 +17,7 @@ import { loadState, saveState } from '../config/state-store.js';
17
17
  import { getWorkspaceState, resolveLaunchDirectory } from '../config/workspaces.js';
18
18
  import { appendRecentActivity } from '../config/recent-activity.js';
19
19
  import { upsertSavedProviderSession } from '../config/saved-sessions.js';
20
+ import { buildLegacyModelModeSummaryMetadata, normalizeProviderSummaryMetadata } from '../providers/summary-metadata.js';
20
21
  import { CliProviderInstance } from '../providers/cli-provider-instance.js';
21
22
  import { AcpProviderInstance } from '../providers/acp-provider-instance.js';
22
23
  import type { ProviderInstanceManager } from '../providers/provider-instance-manager.js';
@@ -273,12 +274,16 @@ export class DaemonCliManager {
273
274
  providerName: string;
274
275
  providerSessionId?: string;
275
276
  workspace?: string;
276
- currentModel?: string;
277
+ summaryMetadata?: unknown;
277
278
  sessionId?: string;
278
279
  title?: string;
279
280
  }): void {
280
281
  try {
281
- let nextState = appendRecentActivity(loadState(), entry);
282
+ const summaryMetadata = normalizeProviderSummaryMetadata(entry.summaryMetadata as any);
283
+ let nextState = appendRecentActivity(loadState(), {
284
+ ...entry,
285
+ summaryMetadata,
286
+ });
282
287
  if (entry.providerSessionId && (entry.kind === 'cli' || entry.kind === 'acp')) {
283
288
  nextState = upsertSavedProviderSession(nextState, {
284
289
  kind: entry.kind,
@@ -286,7 +291,7 @@ export class DaemonCliManager {
286
291
  providerName: entry.providerName,
287
292
  providerSessionId: entry.providerSessionId,
288
293
  workspace: entry.workspace,
289
- currentModel: entry.currentModel,
294
+ summaryMetadata,
290
295
  title: entry.title,
291
296
  });
292
297
  }
@@ -534,7 +539,7 @@ export class DaemonCliManager {
534
539
  providerType: normalizedType,
535
540
  providerName: provider.displayName || provider.name || normalizedType,
536
541
  workspace: resolvedDir,
537
- currentModel: initialModel,
542
+ summaryMetadata: buildLegacyModelModeSummaryMetadata({ model: initialModel }),
538
543
  sessionId,
539
544
  title: provider.displayName || provider.name || normalizedType,
540
545
  });
@@ -646,7 +651,7 @@ export class DaemonCliManager {
646
651
  providerName: provider?.displayName || provider?.name || normalizedType,
647
652
  providerSessionId: sessionBinding.providerSessionId,
648
653
  workspace: resolvedDir,
649
- currentModel: initialModel,
654
+ summaryMetadata: buildLegacyModelModeSummaryMetadata({ model: initialModel }),
650
655
  sessionId: key,
651
656
  title: provider?.displayName || provider?.name || normalizedType,
652
657
  });
@@ -46,6 +46,7 @@ export interface CommandContext {
46
46
  instanceManager?: ProviderInstanceManager;
47
47
  sessionRegistry?: SessionRegistry;
48
48
  onProviderSettingChanged?: (providerType: string, key: string, value: any) => Promise<void> | void;
49
+ onProviderSourceConfigChanged?: () => Promise<void> | void;
49
50
  }
50
51
 
51
52
  /**
@@ -502,6 +503,8 @@ export class DaemonCommandHandler implements CommandHelpers {
502
503
  // ─── Provider Settings (stream-commands.ts) ──────────
503
504
  case 'get_provider_settings': return Stream.handleGetProviderSettings(this, args);
504
505
  case 'set_provider_setting': return Stream.handleSetProviderSetting(this, args);
506
+ case 'get_provider_source_config': return Stream.handleGetProviderSourceConfig(this, args);
507
+ case 'set_provider_source_config': return Stream.handleSetProviderSourceConfig(this, args);
505
508
 
506
509
  // ─── IDE Extension Settings (stream-commands.ts) ──────────
507
510
  case 'get_ide_extensions': return Stream.handleGetIdeExtensions(this, args);