@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.
- package/dist/agent-stream/forward.d.ts +8 -0
- package/dist/agent-stream/index.d.ts +6 -0
- package/dist/agent-stream/manager.d.ts +59 -0
- package/dist/agent-stream/poller.d.ts +41 -0
- package/dist/agent-stream/provider-adapter.d.ts +29 -0
- package/dist/agent-stream/types.d.ts +62 -0
- package/dist/boot/daemon-lifecycle.d.ts +97 -0
- package/dist/cdp/devtools.d.ts +51 -0
- package/dist/cdp/initializer.d.ts +50 -0
- package/dist/cdp/manager.d.ts +145 -0
- package/dist/cdp/scanner.d.ts +58 -0
- package/dist/cdp/setup.d.ts +58 -0
- package/dist/cli-adapter-types.d.ts +25 -0
- package/dist/cli-adapters/provider-cli-adapter.d.ts +229 -0
- package/dist/cli-adapters/pty-transport.d.ts +43 -0
- package/dist/cli-adapters/session-host-transport.d.ts +19 -0
- package/dist/cli-adapters/terminal-backends/ghostty-vt-backend.d.ts +12 -0
- package/dist/cli-adapters/terminal-backends/types.d.ts +14 -0
- package/dist/cli-adapters/terminal-backends/xterm-backend.d.ts +13 -0
- package/dist/cli-adapters/terminal-screen.d.ts +27 -0
- package/dist/commands/cdp-commands.d.ts +15 -0
- package/dist/commands/chat-commands.d.ts +15 -0
- package/dist/commands/cli-manager.d.ts +82 -0
- package/dist/commands/handler.d.ts +101 -0
- package/dist/commands/router.d.ts +69 -0
- package/dist/commands/stream-commands.d.ts +13 -0
- package/dist/commands/workspace-commands.d.ts +11 -0
- package/dist/config/chat-history.d.ts +60 -0
- package/dist/config/config.d.ts +103 -0
- package/dist/config/recent-activity.d.ts +27 -0
- package/dist/config/workspaces.d.ts +82 -0
- package/dist/daemon/dev-auto-implement.d.ts +26 -0
- package/dist/daemon/dev-cdp-handlers.d.ts +22 -0
- package/dist/daemon/dev-cli-debug.d.ts +24 -0
- package/dist/daemon/dev-server-types.d.ts +43 -0
- package/dist/daemon/dev-server.d.ts +133 -0
- package/dist/daemon/scaffold-template.d.ts +32 -0
- package/dist/daemon-core.d.ts +36 -0
- package/dist/detection/cli-detector.d.ts +27 -0
- package/dist/detection/ide-detector.d.ts +34 -0
- package/dist/index.d.ts +72 -2499
- package/dist/index.js +673 -879
- package/dist/index.js.map +1 -1
- package/dist/index.mjs +680 -884
- package/dist/index.mjs.map +1 -1
- package/dist/installer.d.ts +50 -0
- package/dist/ipc-protocol.d.ts +111 -0
- package/dist/launch.d.ts +46 -0
- package/dist/logging/command-log.d.ts +31 -0
- package/dist/logging/logger.d.ts +87 -0
- package/dist/providers/acp-provider-instance.d.ts +101 -0
- package/dist/providers/cli-provider-instance.d.ts +43 -0
- package/dist/providers/contracts.d.ts +483 -0
- package/dist/providers/extension-provider-instance.d.ts +44 -0
- package/dist/providers/ide-provider-instance.d.ts +61 -0
- package/dist/providers/index.d.ts +5 -0
- package/dist/providers/provider-instance-manager.d.ts +84 -0
- package/dist/providers/provider-instance.d.ts +148 -0
- package/dist/providers/provider-loader.d.ts +270 -0
- package/dist/providers/status-monitor.d.ts +48 -0
- package/dist/providers/version-archive.d.ts +52 -0
- package/dist/session-host/runtime-support.d.ts +8 -0
- package/dist/sessions/registry.d.ts +24 -0
- package/dist/shared-types-extra.d.ts +29 -0
- package/dist/shared-types.d.ts +205 -0
- package/dist/status/builders.d.ts +33 -0
- package/dist/status/normalize.d.ts +14 -1
- package/dist/status/reporter.d.ts +69 -0
- package/dist/status/snapshot.d.ts +51 -0
- package/dist/system/host-memory.d.ts +19 -0
- package/dist/types.d.ts +123 -0
- package/node_modules/@adhdev/session-host-core/package.json +1 -1
- package/package.json +3 -2
- package/src/commands/cli-manager.ts +1 -26
- package/src/commands/handler.ts +0 -31
- package/src/commands/router.ts +27 -34
- package/src/commands/stream-commands.ts +2 -4
- package/src/commands/workspace-commands.ts +9 -23
- package/src/config/config.ts +7 -81
- package/src/config/recent-activity.ts +24 -12
- package/src/config/workspaces.ts +0 -24
- package/src/index.ts +16 -15
- package/src/providers/provider-loader.ts +13 -5
- package/src/shared-types-extra.ts +34 -0
- package/src/shared-types.d.ts +4 -6
- package/src/shared-types.ts +17 -38
- package/src/status/builders.ts +12 -0
- package/src/status/reporter.ts +2 -1
- package/src/status/snapshot.ts +70 -87
- package/src/types.ts +3 -8
- package/dist/index.d.mts +0 -2504
- package/dist/normalize-DVI4Lo5I.d.mts +0 -947
- package/dist/normalize-DVI4Lo5I.d.ts +0 -947
- package/dist/status/normalize.d.mts +0 -1
- package/src/config/workspace-activity.ts +0 -65
package/src/shared-types.ts
CHANGED
|
@@ -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:
|
|
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
|
-
|
|
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
|
-
|
|
218
|
-
|
|
219
|
-
|
|
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
|
|
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
|
|
222
|
+
title?: string;
|
|
233
223
|
workspace?: string | null;
|
|
234
224
|
currentModel?: string;
|
|
235
|
-
|
|
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
|
-
/**
|
|
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
|
-
|
|
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
|
}
|
package/src/status/builders.ts
CHANGED
|
@@ -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
|
}
|
package/src/status/reporter.ts
CHANGED
|
@@ -203,10 +203,11 @@ export class DaemonStatusReporter {
|
|
|
203
203
|
currentModel: session.currentModel,
|
|
204
204
|
currentPlan: session.currentPlan,
|
|
205
205
|
currentAutoApprove: session.currentAutoApprove,
|
|
206
|
-
|
|
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,
|
package/src/status/snapshot.ts
CHANGED
|
@@ -8,18 +8,18 @@
|
|
|
8
8
|
|
|
9
9
|
import * as os from 'os';
|
|
10
10
|
import { loadConfig } from '../config/config.js';
|
|
11
|
-
import {
|
|
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):
|
|
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 =
|
|
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
|
|
148
|
-
sessions: ReturnType<typeof buildSessionEntries>,
|
|
177
|
+
function buildRecentLaunches(
|
|
149
178
|
recentActivity: ReturnType<typeof getRecentActivity>,
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
|
|
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
|
|
227
|
-
const
|
|
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
|
|
235
|
-
|
|
236
|
-
|
|
237
|
-
|
|
238
|
-
|
|
239
|
-
|
|
240
|
-
|
|
241
|
-
|
|
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
|
-
|
|
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:
|
|
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 */
|