@adhdev/daemon-core 0.7.38 → 0.7.40

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 (95) hide show
  1. package/dist/agent-stream/forward.d.ts +8 -0
  2. package/dist/agent-stream/index.d.ts +6 -0
  3. package/dist/agent-stream/manager.d.ts +59 -0
  4. package/dist/agent-stream/poller.d.ts +41 -0
  5. package/dist/agent-stream/provider-adapter.d.ts +29 -0
  6. package/dist/agent-stream/types.d.ts +62 -0
  7. package/dist/boot/daemon-lifecycle.d.ts +97 -0
  8. package/dist/cdp/devtools.d.ts +51 -0
  9. package/dist/cdp/initializer.d.ts +50 -0
  10. package/dist/cdp/manager.d.ts +145 -0
  11. package/dist/cdp/scanner.d.ts +58 -0
  12. package/dist/cdp/setup.d.ts +58 -0
  13. package/dist/cli-adapter-types.d.ts +25 -0
  14. package/dist/cli-adapters/provider-cli-adapter.d.ts +229 -0
  15. package/dist/cli-adapters/pty-transport.d.ts +43 -0
  16. package/dist/cli-adapters/session-host-transport.d.ts +19 -0
  17. package/dist/cli-adapters/terminal-backends/ghostty-vt-backend.d.ts +12 -0
  18. package/dist/cli-adapters/terminal-backends/types.d.ts +14 -0
  19. package/dist/cli-adapters/terminal-backends/xterm-backend.d.ts +13 -0
  20. package/dist/cli-adapters/terminal-screen.d.ts +27 -0
  21. package/dist/commands/cdp-commands.d.ts +15 -0
  22. package/dist/commands/chat-commands.d.ts +15 -0
  23. package/dist/commands/cli-manager.d.ts +82 -0
  24. package/dist/commands/handler.d.ts +101 -0
  25. package/dist/commands/router.d.ts +69 -0
  26. package/dist/commands/stream-commands.d.ts +13 -0
  27. package/dist/commands/workspace-commands.d.ts +11 -0
  28. package/dist/config/chat-history.d.ts +60 -0
  29. package/dist/config/config.d.ts +103 -0
  30. package/dist/config/recent-activity.d.ts +27 -0
  31. package/dist/config/workspaces.d.ts +82 -0
  32. package/dist/daemon/dev-auto-implement.d.ts +26 -0
  33. package/dist/daemon/dev-cdp-handlers.d.ts +22 -0
  34. package/dist/daemon/dev-cli-debug.d.ts +24 -0
  35. package/dist/daemon/dev-server-types.d.ts +43 -0
  36. package/dist/daemon/dev-server.d.ts +133 -0
  37. package/dist/daemon/scaffold-template.d.ts +32 -0
  38. package/dist/daemon-core.d.ts +36 -0
  39. package/dist/detection/cli-detector.d.ts +27 -0
  40. package/dist/detection/ide-detector.d.ts +34 -0
  41. package/dist/index.d.ts +72 -2499
  42. package/dist/index.js +673 -879
  43. package/dist/index.js.map +1 -1
  44. package/dist/index.mjs +680 -884
  45. package/dist/index.mjs.map +1 -1
  46. package/dist/installer.d.ts +50 -0
  47. package/dist/ipc-protocol.d.ts +111 -0
  48. package/dist/launch.d.ts +46 -0
  49. package/dist/logging/command-log.d.ts +31 -0
  50. package/dist/logging/logger.d.ts +87 -0
  51. package/dist/providers/acp-provider-instance.d.ts +101 -0
  52. package/dist/providers/cli-provider-instance.d.ts +43 -0
  53. package/dist/providers/contracts.d.ts +483 -0
  54. package/dist/providers/extension-provider-instance.d.ts +44 -0
  55. package/dist/providers/ide-provider-instance.d.ts +61 -0
  56. package/dist/providers/index.d.ts +5 -0
  57. package/dist/providers/provider-instance-manager.d.ts +84 -0
  58. package/dist/providers/provider-instance.d.ts +148 -0
  59. package/dist/providers/provider-loader.d.ts +270 -0
  60. package/dist/providers/status-monitor.d.ts +48 -0
  61. package/dist/providers/version-archive.d.ts +52 -0
  62. package/dist/session-host/runtime-support.d.ts +8 -0
  63. package/dist/sessions/registry.d.ts +24 -0
  64. package/dist/shared-types-extra.d.ts +29 -0
  65. package/dist/shared-types.d.ts +205 -0
  66. package/dist/status/builders.d.ts +33 -0
  67. package/dist/status/normalize.d.ts +14 -1
  68. package/dist/status/reporter.d.ts +69 -0
  69. package/dist/status/snapshot.d.ts +51 -0
  70. package/dist/system/host-memory.d.ts +19 -0
  71. package/dist/types.d.ts +123 -0
  72. package/node_modules/@adhdev/session-host-core/package.json +1 -1
  73. package/package.json +3 -2
  74. package/src/commands/cli-manager.ts +1 -26
  75. package/src/commands/handler.ts +0 -31
  76. package/src/commands/router.ts +27 -34
  77. package/src/commands/stream-commands.ts +2 -4
  78. package/src/commands/workspace-commands.ts +9 -23
  79. package/src/config/config.ts +7 -81
  80. package/src/config/recent-activity.ts +24 -12
  81. package/src/config/workspaces.ts +0 -24
  82. package/src/index.ts +16 -15
  83. package/src/providers/provider-loader.ts +13 -5
  84. package/src/shared-types-extra.ts +34 -0
  85. package/src/shared-types.d.ts +4 -6
  86. package/src/shared-types.ts +17 -38
  87. package/src/status/builders.ts +12 -0
  88. package/src/status/reporter.ts +2 -1
  89. package/src/status/snapshot.ts +70 -87
  90. package/src/types.ts +3 -8
  91. package/dist/index.d.mts +0 -2504
  92. package/dist/normalize-DVI4Lo5I.d.mts +0 -947
  93. package/dist/normalize-DVI4Lo5I.d.ts +0 -947
  94. package/dist/status/normalize.d.mts +0 -1
  95. package/src/config/workspace-activity.ts +0 -65
@@ -86,6 +86,9 @@ export type SessionCapability =
86
86
  | 'set_mode'
87
87
  | 'set_thought_level';
88
88
 
89
+ import type { RuntimeWriteOwner, RuntimeAttachedClient, SessionStatus } from './shared-types-extra.js';
90
+ export type { RuntimeWriteOwner, RuntimeAttachedClient, SessionStatus } from './shared-types-extra.js';
91
+
89
92
  export interface SessionEntry {
90
93
  id: string;
91
94
  parentId: string | null;
@@ -93,21 +96,14 @@ export interface SessionEntry {
93
96
  providerName: string;
94
97
  kind: SessionKind;
95
98
  transport: SessionTransport;
96
- status: 'idle' | 'generating' | 'waiting_approval' | 'error' | 'stopped' | 'starting' | 'panel_hidden' | 'not_monitored' | 'disconnected';
99
+ status: SessionStatus;
97
100
  title: string;
98
101
  workspace: string | null;
99
102
  runtimeKey?: string;
100
103
  runtimeDisplayName?: string;
101
104
  runtimeWorkspaceLabel?: string;
102
- runtimeWriteOwner?: {
103
- clientId: string;
104
- ownerType: 'agent' | 'user';
105
- } | null;
106
- runtimeAttachedClients?: {
107
- clientId: string;
108
- type: 'daemon' | 'web' | 'local-terminal';
109
- readOnly: boolean;
110
- }[];
105
+ runtimeWriteOwner?: RuntimeWriteOwner | null;
106
+ runtimeAttachedClients?: RuntimeAttachedClient[];
111
107
  resume?: ProviderResumeCapability;
112
108
  activeChat: _ActiveChatData | null;
113
109
  capabilities: SessionCapability[];
@@ -124,10 +120,10 @@ export interface SessionEntry {
124
120
  errorMessage?: string;
125
121
  errorReason?: _ProviderErrorReason;
126
122
  lastUpdated?: number;
127
- recentKey?: string;
128
123
  unread?: boolean;
129
124
  lastSeenAt?: number;
130
125
  inboxBucket?: RecentSessionBucket;
126
+ surfaceHidden?: boolean;
131
127
  }
132
128
 
133
129
  /** Available provider information */
@@ -214,44 +210,26 @@ export interface DetectedIdeInfo {
214
210
  path?: string;
215
211
  }
216
212
 
217
- /** Workspace recent activity */
218
- export interface WorkspaceActivity {
219
- path: string;
220
- lastUsedAt: number;
221
- kind?: string;
222
- agentType?: string;
223
- }
213
+ export type { RecentSessionBucket, TerminalBackendStatus } from './shared-types-extra.js';
214
+ import type { RecentSessionBucket } from './shared-types-extra.js';
215
+ import type { TerminalBackendStatus } from './shared-types-extra.js';
224
216
 
225
- export interface RecentSessionEntry {
217
+ export interface RecentLaunchEntry {
226
218
  id: string;
227
- recentKey: string;
228
- sessionId?: string | null;
229
219
  providerType: string;
230
220
  providerName: string;
231
221
  kind: 'ide' | 'cli' | 'acp';
232
- title: string;
222
+ title?: string;
233
223
  workspace?: string | null;
234
224
  currentModel?: string;
235
- status?: SessionEntry['status'];
236
- lastUsedAt: number;
237
- unread?: boolean;
238
- lastSeenAt?: number;
239
- inboxBucket?: RecentSessionBucket;
240
- }
241
-
242
- export type RecentSessionBucket = 'needs_attention' | 'working' | 'task_complete' | 'idle';
243
-
244
- export interface TerminalBackendStatus {
245
- backend: 'xterm' | 'ghostty-vt';
246
- preference: 'auto' | 'xterm' | 'ghostty-vt';
247
- ghosttyAvailable: boolean;
225
+ lastLaunchedAt: number;
248
226
  }
249
227
 
250
228
  // ─── Status Report Payload (daemon → server) ────────────────────────
251
229
  // Full payload shape sent via WebSocket status_report
252
230
 
253
231
  export interface StatusReportPayload {
254
- /** Daemon instance ID */
232
+ /** Unique daemon instance identifier */
255
233
  instanceId: string;
256
234
  /** Daemon version */
257
235
  version: string;
@@ -273,7 +251,8 @@ export interface StatusReportPayload {
273
251
  workspaces?: WorkspaceEntry[];
274
252
  defaultWorkspaceId?: string | null;
275
253
  defaultWorkspacePath?: string | null;
276
- workspaceActivity?: WorkspaceActivity[];
277
- recentSessions?: RecentSessionEntry[];
254
+ recentLaunches?: RecentLaunchEntry[];
278
255
  terminalBackend?: TerminalBackendStatus;
256
+ /** Available providers (present in StatusSnapshot, optional in raw payload) */
257
+ availableProviders?: AvailableProviderInfo[];
279
258
  }
@@ -337,5 +337,17 @@ export function buildSessionEntries(
337
337
  sessions.push(buildAcpSession(state));
338
338
  }
339
339
 
340
+ // Hide native IDE parent rows from inbox/recent surfaces when extension tabs exist.
341
+ const extensionParentIds = new Set(
342
+ sessions
343
+ .filter((session) => session.transport === 'cdp-webview' && !!session.parentId)
344
+ .map((session) => session.parentId as string)
345
+ );
346
+ for (const session of sessions) {
347
+ if (session.transport === 'cdp-page' && extensionParentIds.has(session.id)) {
348
+ session.surfaceHidden = true;
349
+ }
350
+ }
351
+
340
352
  return sessions;
341
353
  }
@@ -203,10 +203,11 @@ export class DaemonStatusReporter {
203
203
  currentModel: session.currentModel,
204
204
  currentPlan: session.currentPlan,
205
205
  currentAutoApprove: session.currentAutoApprove,
206
- recentKey: (session as any).recentKey,
206
+ lastUpdated: session.lastUpdated,
207
207
  unread: (session as any).unread,
208
208
  lastSeenAt: (session as any).lastSeenAt,
209
209
  inboxBucket: (session as any).inboxBucket,
210
+ surfaceHidden: (session as any).surfaceHidden,
210
211
  controlValues: session.controlValues,
211
212
  providerControls: session.providerControls,
212
213
  acpConfigOptions: session.acpConfigOptions,
@@ -8,18 +8,18 @@
8
8
 
9
9
  import * as os from 'os';
10
10
  import { loadConfig } from '../config/config.js';
11
- import { buildRecentActivityKey, getRecentActivity, getRecentSessionSeenAt } from '../config/recent-activity.js';
11
+ import { getRecentActivity, getSessionSeenAt, getSessionSeenMarker } from '../config/recent-activity.js';
12
12
  import { getWorkspaceState } from '../config/workspaces.js';
13
- import { getWorkspaceActivity } from '../config/workspace-activity.js';
14
13
  import { getHostMemorySnapshot } from '../system/host-memory.js';
15
14
  import { getTerminalBackendRuntimeStatus } from '../cli-adapters/terminal-screen.js';
15
+ import { LOG } from '../logging/logger.js';
16
16
  import { buildSessionEntries, isCdpConnected } from './builders.js';
17
17
  import type { ProviderState } from '../providers/provider-instance.js';
18
18
  import type {
19
19
  AvailableProviderInfo,
20
20
  DetectedIdeInfo,
21
+ RecentLaunchEntry,
21
22
  RecentSessionBucket,
22
- RecentSessionEntry,
23
23
  SessionEntry,
24
24
  StatusReportPayload,
25
25
  } from '../shared-types.js';
@@ -54,6 +54,8 @@ export interface StatusSnapshot extends StatusReportPayload {
54
54
  availableProviders: AvailableProviderInfo[];
55
55
  }
56
56
 
57
+ const READ_DEBUG_ENABLED = process.argv.includes('--dev') || process.env.ADHDEV_READ_DEBUG === '1';
58
+
57
59
  function buildDetectedIdeInfos(
58
60
  detectedIdes: StatusSnapshotOptions['detectedIdes'],
59
61
  cdpManagers: StatusSnapshotOptions['cdpManagers'],
@@ -105,6 +107,30 @@ function getSessionMessageUpdatedAt(session: {
105
107
  );
106
108
  }
107
109
 
110
+ export function getSessionCompletionMarker(session: {
111
+ activeChat?: {
112
+ messages?: Array<{
113
+ role?: string;
114
+ id?: string;
115
+ index?: number;
116
+ timestamp?: number | string;
117
+ receivedAt?: number | string;
118
+ createdAt?: number | string;
119
+ _turnKey?: string;
120
+ }> | null
121
+ } | null
122
+ }) {
123
+ const lastMessage = session.activeChat?.messages?.at?.(-1) as any;
124
+ if (!lastMessage) return '';
125
+ const role = typeof lastMessage.role === 'string' ? lastMessage.role : '';
126
+ if (role === 'user' || role === 'human') return '';
127
+ if (typeof lastMessage._turnKey === 'string' && lastMessage._turnKey) return `turn:${lastMessage._turnKey}`;
128
+ if (typeof lastMessage.id === 'string' && lastMessage.id) return `id:${lastMessage.id}`;
129
+ if (typeof lastMessage.index === 'number' && Number.isFinite(lastMessage.index)) return `idx:${lastMessage.index}`;
130
+ const timestamp = parseMessageTime(lastMessage.timestamp) || parseMessageTime(lastMessage.receivedAt) || parseMessageTime(lastMessage.createdAt);
131
+ return timestamp > 0 ? `ts:${timestamp}` : '';
132
+ }
133
+
108
134
  function getSessionLastUsedAt(session: {
109
135
  activeChat?: {
110
136
  messages?: Array<{ timestamp?: number | string; receivedAt?: number | string; createdAt?: number | string }> | null
@@ -114,7 +140,7 @@ function getSessionLastUsedAt(session: {
114
140
  return getSessionMessageUpdatedAt(session) || session.lastUpdated || Date.now();
115
141
  }
116
142
 
117
- function getSessionKind(session: SessionEntry): RecentSessionEntry['kind'] {
143
+ function getSessionKind(session: SessionEntry): RecentLaunchEntry['kind'] {
118
144
  return session.transport === 'cdp-page' || session.transport === 'cdp-webview'
119
145
  ? 'ide'
120
146
  : session.transport === 'acp'
@@ -133,6 +159,8 @@ function getUnreadState(
133
159
  lastUsedAt: number,
134
160
  lastSeenAt: number,
135
161
  lastRole: string,
162
+ completionMarker: string,
163
+ seenCompletionMarker: string,
136
164
  ): { unread: boolean; inboxBucket: RecentSessionBucket } {
137
165
  if (status === 'waiting_approval') {
138
166
  return { unread: false, inboxBucket: 'needs_attention' };
@@ -140,75 +168,27 @@ function getUnreadState(
140
168
  if (status === 'generating' || status === 'starting') {
141
169
  return { unread: false, inboxBucket: 'working' };
142
170
  }
143
- const unread = hasContentChange && lastUsedAt > lastSeenAt && lastRole !== 'user' && lastRole !== 'human';
171
+ const unread = completionMarker
172
+ ? completionMarker !== seenCompletionMarker
173
+ : hasContentChange && lastUsedAt > lastSeenAt && lastRole !== 'user' && lastRole !== 'human';
144
174
  return { unread, inboxBucket: unread ? 'task_complete' : 'idle' };
145
175
  }
146
176
 
147
- function buildRecentSessions(
148
- sessions: ReturnType<typeof buildSessionEntries>,
177
+ function buildRecentLaunches(
149
178
  recentActivity: ReturnType<typeof getRecentActivity>,
150
- readState: Record<string, number>,
151
- ): RecentSessionEntry[] {
152
- const live = sessions
153
- .filter((session) => !session.parentId && session.status !== 'stopped')
154
- .map((session) => {
155
- const kind = getSessionKind(session);
156
- const recentKey = buildRecentActivityKey({
157
- kind,
158
- providerType: session.providerType,
159
- workspace: session.workspace,
160
- });
161
- const lastSeenAt = readState[recentKey] || 0;
162
- const lastUsedAt = getSessionLastUsedAt(session);
163
- const { unread, inboxBucket } = getUnreadState(
164
- getSessionMessageUpdatedAt(session) > 0,
165
- session.status,
166
- lastUsedAt,
167
- lastSeenAt,
168
- getLastMessageRole(session),
169
- );
170
- return {
171
- id: session.id,
172
- recentKey,
173
- sessionId: session.id,
174
- providerType: session.providerType,
175
- providerName: session.providerName,
176
- kind,
177
- title: session.activeChat?.title || session.title || session.providerName,
178
- workspace: session.workspace,
179
- currentModel: session.currentModel,
180
- status: session.status,
181
- lastUsedAt,
182
- unread,
183
- lastSeenAt,
184
- inboxBucket,
185
- };
186
- })
187
- const seen = new Set(live.map((item) => `${item.kind}:${item.providerType}:${item.workspace || ''}`));
188
- const persisted = recentActivity
189
- .filter((item) => !seen.has(`${item.kind}:${item.providerType}:${item.workspace || ''}`))
190
- .map((item) => {
191
- const lastSeenAt = readState[item.id] || 0;
192
- const unread = item.lastUsedAt > lastSeenAt;
193
- return {
194
- id: item.id,
195
- recentKey: item.id,
196
- sessionId: item.sessionId || null,
197
- providerType: item.providerType,
198
- providerName: item.providerName,
199
- kind: item.kind,
200
- title: item.title || item.providerName,
201
- workspace: item.workspace,
202
- currentModel: item.currentModel,
203
- lastUsedAt: item.lastUsedAt,
204
- unread,
205
- lastSeenAt,
206
- inboxBucket: unread ? 'task_complete' : 'idle' as RecentSessionBucket,
207
- };
208
- });
209
-
210
- return [...live, ...persisted]
211
- .sort((a, b) => b.lastUsedAt - a.lastUsedAt)
179
+ ): RecentLaunchEntry[] {
180
+ return recentActivity
181
+ .map((item) => ({
182
+ id: item.id,
183
+ providerType: item.providerType,
184
+ providerName: item.providerName,
185
+ kind: item.kind,
186
+ title: item.title || item.providerName,
187
+ workspace: item.workspace,
188
+ currentModel: item.currentModel,
189
+ lastLaunchedAt: item.lastUsedAt,
190
+ }))
191
+ .sort((a, b) => b.lastLaunchedAt - a.lastLaunchedAt)
212
192
  .slice(0, 12);
213
193
  }
214
194
 
@@ -221,27 +201,31 @@ export function buildStatusSnapshot(options: StatusSnapshotOptions): StatusSnaps
221
201
  options.allStates,
222
202
  options.cdpManagers as Map<string, any>,
223
203
  );
224
- const readState = cfg.recentSessionReads || {};
225
204
  for (const session of sessions) {
226
- const kind = getSessionKind(session);
227
- const recentKey = buildRecentActivityKey({
228
- kind,
229
- providerType: session.providerType,
230
- workspace: session.workspace,
231
- });
232
- const lastSeenAt = getRecentSessionSeenAt(cfg, recentKey);
205
+ const lastSeenAt = getSessionSeenAt(cfg, session.id);
206
+ const seenCompletionMarker = getSessionSeenMarker(cfg, session.id);
233
207
  const lastUsedAt = getSessionLastUsedAt(session);
234
- const { unread, inboxBucket } = getUnreadState(
235
- getSessionMessageUpdatedAt(session) > 0,
236
- session.status,
237
- lastUsedAt,
238
- lastSeenAt,
239
- getLastMessageRole(session),
240
- );
241
- session.recentKey = recentKey;
208
+ const completionMarker = getSessionCompletionMarker(session);
209
+ const { unread, inboxBucket } = session.surfaceHidden
210
+ ? { unread: false, inboxBucket: 'idle' as RecentSessionBucket }
211
+ : getUnreadState(
212
+ getSessionMessageUpdatedAt(session) > 0,
213
+ session.status,
214
+ lastUsedAt,
215
+ lastSeenAt,
216
+ getLastMessageRole(session),
217
+ completionMarker,
218
+ seenCompletionMarker,
219
+ );
242
220
  session.lastSeenAt = lastSeenAt;
243
221
  session.unread = unread;
244
222
  session.inboxBucket = inboxBucket;
223
+ if (READ_DEBUG_ENABLED && (session.unread || session.inboxBucket !== 'idle' || session.providerType.includes('codex'))) {
224
+ LOG.info(
225
+ 'RecentRead',
226
+ `snapshot session id=${session.id} provider=${session.providerType} status=${String(session.status || '')} bucket=${inboxBucket} unread=${String(unread)} lastSeenAt=${lastSeenAt} completionMarker=${completionMarker || '-'} seenMarker=${seenCompletionMarker || '-'} lastUpdated=${String(session.lastUpdated || 0)} lastUsedAt=${lastUsedAt} lastRole=${getLastMessageRole(session)} msgUpdatedAt=${getSessionMessageUpdatedAt(session)}`,
227
+ );
228
+ }
245
229
  }
246
230
  const terminalBackend = getTerminalBackendRuntimeStatus();
247
231
 
@@ -269,8 +253,7 @@ export function buildStatusSnapshot(options: StatusSnapshotOptions): StatusSnaps
269
253
  workspaces: wsState.workspaces,
270
254
  defaultWorkspaceId: wsState.defaultWorkspaceId,
271
255
  defaultWorkspacePath: wsState.defaultWorkspacePath,
272
- workspaceActivity: getWorkspaceActivity(cfg, 15),
273
- recentSessions: buildRecentSessions(sessions, recentActivity, readState),
256
+ recentLaunches: buildRecentLaunches(recentActivity),
274
257
  terminalBackend,
275
258
  availableProviders: buildAvailableProviders(options.providerLoader),
276
259
  };
package/src/types.ts CHANGED
@@ -4,7 +4,7 @@
4
4
  * Shared types referenced by daemon-core, daemon-standalone, and web-core.
5
5
  * When modifying this file, also update interface contracts in AGENT_PROTOCOL.md.
6
6
  */
7
- import type { StatusReportPayload } from './shared-types.js';
7
+ import type { StatusReportPayload, AvailableProviderInfo } from './shared-types.js';
8
8
 
9
9
  // ── Daemon Status ──
10
10
 
@@ -18,7 +18,7 @@ export interface StatusResponse extends StatusReportPayload {
18
18
  /** User display name from config */
19
19
  userName?: string;
20
20
  /** Available providers */
21
- availableProviders: ProviderInfo[];
21
+ availableProviders: AvailableProviderInfo[];
22
22
  /** System info (legacy compat) */
23
23
  system?: SystemInfo;
24
24
  }
@@ -111,12 +111,7 @@ export interface DetectedIde {
111
111
  running: boolean;
112
112
  }
113
113
 
114
- export interface ProviderInfo {
115
- type: string;
116
- icon: string;
117
- displayName: string;
118
- category: string;
119
- }
114
+ export interface ProviderInfo extends AvailableProviderInfo {}
120
115
 
121
116
 
122
117
  /** Flattened agent entry from /api/v1/agents */