linkshell-cli 0.3.4 → 0.3.6
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/cli/src/runtime/acp/acp-client.d.ts +1 -0
- package/dist/cli/src/runtime/acp/acp-client.js +83 -2
- package/dist/cli/src/runtime/acp/acp-client.js.map +1 -1
- package/dist/cli/src/runtime/acp/agent-workspace.d.ts +1 -0
- package/dist/cli/src/runtime/acp/agent-workspace.js +34 -27
- package/dist/cli/src/runtime/acp/agent-workspace.js.map +1 -1
- package/dist/cli/src/runtime/acp/codex-sessions.d.ts +10 -0
- package/dist/cli/src/runtime/acp/codex-sessions.js +207 -0
- package/dist/cli/src/runtime/acp/codex-sessions.js.map +1 -0
- package/dist/cli/tsconfig.tsbuildinfo +1 -1
- package/dist/shared-protocol/src/index.d.ts +658 -658
- package/dist/shared-protocol/src/index.js.map +1 -1
- package/package.json +1 -1
- package/src/runtime/acp/acp-client.ts +84 -2
- package/src/runtime/acp/agent-workspace.ts +35 -27
- package/src/runtime/acp/codex-sessions.ts +219 -0
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import { JsonRpcStdioTransport } from "./json-rpc.js";
|
|
2
|
+
import { listCodexStoredSessions } from "./codex-sessions.js";
|
|
2
3
|
function normalizeMcpServers(value) {
|
|
3
4
|
if (Array.isArray(value))
|
|
4
5
|
return value;
|
|
@@ -11,6 +12,77 @@ function normalizeMcpServers(value) {
|
|
|
11
12
|
return { name, config };
|
|
12
13
|
});
|
|
13
14
|
}
|
|
15
|
+
function asRecord(value) {
|
|
16
|
+
return value && typeof value === "object" && !Array.isArray(value)
|
|
17
|
+
? value
|
|
18
|
+
: undefined;
|
|
19
|
+
}
|
|
20
|
+
function parseTimestamp(value) {
|
|
21
|
+
if (typeof value === "number" && Number.isFinite(value)) {
|
|
22
|
+
return value > 10_000_000_000 ? value : value * 1000;
|
|
23
|
+
}
|
|
24
|
+
if (typeof value === "string" && value.trim()) {
|
|
25
|
+
const parsed = Date.parse(value);
|
|
26
|
+
return Number.isNaN(parsed) ? undefined : parsed;
|
|
27
|
+
}
|
|
28
|
+
return undefined;
|
|
29
|
+
}
|
|
30
|
+
function firstString(record, keys) {
|
|
31
|
+
for (const key of keys) {
|
|
32
|
+
const value = record[key];
|
|
33
|
+
if (typeof value === "string" && value.trim())
|
|
34
|
+
return value;
|
|
35
|
+
}
|
|
36
|
+
return undefined;
|
|
37
|
+
}
|
|
38
|
+
function remoteSessionEntries(value) {
|
|
39
|
+
const raw = asRecord(value);
|
|
40
|
+
return Array.isArray(value) ? value :
|
|
41
|
+
Array.isArray(raw?.threads) ? raw.threads :
|
|
42
|
+
Array.isArray(raw?.sessions) ? raw.sessions :
|
|
43
|
+
Array.isArray(raw?.items) ? raw.items :
|
|
44
|
+
[];
|
|
45
|
+
}
|
|
46
|
+
function normalizeRemoteSession(entry, fallback) {
|
|
47
|
+
if (typeof entry === "string" && entry.trim()) {
|
|
48
|
+
return fallback ?? { id: entry, cwd: "", lastModified: Date.now() };
|
|
49
|
+
}
|
|
50
|
+
const session = asRecord(entry);
|
|
51
|
+
if (!session)
|
|
52
|
+
return fallback;
|
|
53
|
+
const nestedThread = asRecord(session.thread);
|
|
54
|
+
const source = nestedThread ?? session;
|
|
55
|
+
const id = firstString(source, ["id", "threadId", "sessionId", "agentSessionId"]) ?? fallback?.id;
|
|
56
|
+
if (!id)
|
|
57
|
+
return undefined;
|
|
58
|
+
return {
|
|
59
|
+
id,
|
|
60
|
+
cwd: firstString(source, ["cwd", "workingDirectory", "workspacePath"]) ?? fallback?.cwd ?? "",
|
|
61
|
+
title: firstString(source, ["title", "name", "summary", "thread_name"]) ?? fallback?.title,
|
|
62
|
+
createdAt: parseTimestamp(source.createdAt ?? source.created_at) ?? fallback?.createdAt,
|
|
63
|
+
lastModified: parseTimestamp(source.lastActivityAt ?? source.updatedAt ?? source.modifiedAt ?? source.lastModified ?? source.updated_at) ??
|
|
64
|
+
fallback?.lastModified ??
|
|
65
|
+
Date.now(),
|
|
66
|
+
};
|
|
67
|
+
}
|
|
68
|
+
function mergeCodexSessionLists(remote, local) {
|
|
69
|
+
const byId = new Map(local.sessions.map((session) => [session.id, session]));
|
|
70
|
+
for (const entry of remoteSessionEntries(remote)) {
|
|
71
|
+
const id = typeof entry === "string"
|
|
72
|
+
? entry
|
|
73
|
+
: (() => {
|
|
74
|
+
const session = asRecord(entry);
|
|
75
|
+
const source = asRecord(session?.thread) ?? session;
|
|
76
|
+
return source ? firstString(source, ["id", "threadId", "sessionId", "agentSessionId"]) : undefined;
|
|
77
|
+
})();
|
|
78
|
+
const merged = normalizeRemoteSession(entry, id ? byId.get(id) : undefined);
|
|
79
|
+
if (merged?.id)
|
|
80
|
+
byId.set(merged.id, merged);
|
|
81
|
+
}
|
|
82
|
+
return {
|
|
83
|
+
sessions: [...byId.values()].sort((a, b) => b.lastModified - a.lastModified),
|
|
84
|
+
};
|
|
85
|
+
}
|
|
14
86
|
function permissionsForMode(mode, cwd) {
|
|
15
87
|
if (!mode)
|
|
16
88
|
return undefined;
|
|
@@ -33,8 +105,10 @@ function permissionsForMode(mode, cwd) {
|
|
|
33
105
|
export class AcpClient {
|
|
34
106
|
transport;
|
|
35
107
|
protocol;
|
|
108
|
+
cwd;
|
|
36
109
|
constructor(input) {
|
|
37
110
|
this.protocol = input.protocol;
|
|
111
|
+
this.cwd = input.cwd;
|
|
38
112
|
this.transport = new JsonRpcStdioTransport(input.command, input.framing, input.onNotification, input.onRequest, input.onExit);
|
|
39
113
|
this.transport.start(input.cwd);
|
|
40
114
|
}
|
|
@@ -82,9 +156,16 @@ export class AcpClient {
|
|
|
82
156
|
mcpServers: normalizeMcpServers(input.mcpServers),
|
|
83
157
|
});
|
|
84
158
|
}
|
|
85
|
-
listSessions() {
|
|
159
|
+
async listSessions() {
|
|
86
160
|
if (this.protocol === "codex-app-server") {
|
|
87
|
-
|
|
161
|
+
const localSessions = listCodexStoredSessions(this.cwd);
|
|
162
|
+
try {
|
|
163
|
+
const remoteSessions = await this.transport.request("thread/list", { limit: 200 });
|
|
164
|
+
return mergeCodexSessionLists(remoteSessions, localSessions);
|
|
165
|
+
}
|
|
166
|
+
catch {
|
|
167
|
+
return localSessions;
|
|
168
|
+
}
|
|
88
169
|
}
|
|
89
170
|
return this.transport.request("session/list", {});
|
|
90
171
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"acp-client.js","sourceRoot":"","sources":["../../../../../src/runtime/acp/acp-client.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,qBAAqB,EAAE,MAAM,eAAe,CAAC;
|
|
1
|
+
{"version":3,"file":"acp-client.js","sourceRoot":"","sources":["../../../../../src/runtime/acp/acp-client.ts"],"names":[],"mappings":"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"}
|
|
@@ -38,6 +38,7 @@ export declare class AgentWorkspaceProxy {
|
|
|
38
38
|
private ensureProviderClient;
|
|
39
39
|
private refreshProviderCapabilities;
|
|
40
40
|
private syncProviderSessions;
|
|
41
|
+
private upsertProviderSessions;
|
|
41
42
|
private sendCapabilities;
|
|
42
43
|
private openConversation;
|
|
43
44
|
private openFailure;
|
|
@@ -5,6 +5,8 @@ import { createEnvelope, parseTypedPayload, } from "@linkshell/protocol";
|
|
|
5
5
|
import { AcpClient } from "./acp-client.js";
|
|
6
6
|
import { ClaudeSdkClient } from "./claude-sdk-client.js";
|
|
7
7
|
import { ClaudeStreamJsonClient } from "./claude-stream-json-client.js";
|
|
8
|
+
import { listClaudeStoredSessions } from "./claude-sessions.js";
|
|
9
|
+
import { listCodexStoredSessions } from "./codex-sessions.js";
|
|
8
10
|
import { resolveAgentCommand } from "./provider-resolver.js";
|
|
9
11
|
const PERMISSION_TIMEOUT_MS = 5 * 60_000;
|
|
10
12
|
const MAX_TIMELINE_ITEMS = 200;
|
|
@@ -1181,36 +1183,12 @@ export class AgentWorkspaceProxy {
|
|
|
1181
1183
|
}
|
|
1182
1184
|
async syncProviderSessions() {
|
|
1183
1185
|
await this.initialize();
|
|
1186
|
+
this.upsertProviderSessions("codex", listCodexStoredSessions(this.input.cwd));
|
|
1187
|
+
this.upsertProviderSessions("claude", listClaudeStoredSessions(this.input.cwd));
|
|
1184
1188
|
for (const [provider, client] of this.clients) {
|
|
1185
1189
|
try {
|
|
1186
1190
|
const result = await client.listSessions();
|
|
1187
|
-
|
|
1188
|
-
const agentSessionId = remote.id;
|
|
1189
|
-
const existingId = this.conversationByAgentSessionId.get(agentSessionId);
|
|
1190
|
-
const now = Date.now();
|
|
1191
|
-
const conversationId = existingId ?? `agent:${agentSessionId}`;
|
|
1192
|
-
const existing = this.conversations.get(conversationId);
|
|
1193
|
-
const cwd = remote.cwd ?? existing?.cwd ?? this.input.cwd;
|
|
1194
|
-
const conversation = {
|
|
1195
|
-
id: conversationId,
|
|
1196
|
-
agentSessionId,
|
|
1197
|
-
provider,
|
|
1198
|
-
cwd,
|
|
1199
|
-
title: remote.title ?? existing?.title ?? titleFromCwd(cwd),
|
|
1200
|
-
model: remote.model ?? existing?.model,
|
|
1201
|
-
reasoningEffort: existing?.reasoningEffort,
|
|
1202
|
-
permissionMode: existing?.permissionMode,
|
|
1203
|
-
collaborationMode: existing?.collaborationMode,
|
|
1204
|
-
status: existing?.status ?? "idle",
|
|
1205
|
-
archived: existing?.archived ?? false,
|
|
1206
|
-
lastMessagePreview: existing?.lastMessagePreview,
|
|
1207
|
-
lastActivityAt: remote.lastActivityAt ?? existing?.lastActivityAt ?? now,
|
|
1208
|
-
createdAt: remote.createdAt ?? existing?.createdAt ?? now,
|
|
1209
|
-
};
|
|
1210
|
-
this.conversations.set(conversation.id, conversation);
|
|
1211
|
-
this.conversationByAgentSessionId.set(agentSessionId, conversation.id);
|
|
1212
|
-
this.timelines.set(conversation.id, this.timelines.get(conversation.id) ?? []);
|
|
1213
|
-
}
|
|
1191
|
+
this.upsertProviderSessions(provider, result);
|
|
1214
1192
|
}
|
|
1215
1193
|
catch (error) {
|
|
1216
1194
|
if (this.input.verbose) {
|
|
@@ -1219,6 +1197,35 @@ export class AgentWorkspaceProxy {
|
|
|
1219
1197
|
}
|
|
1220
1198
|
}
|
|
1221
1199
|
}
|
|
1200
|
+
upsertProviderSessions(provider, result) {
|
|
1201
|
+
for (const remote of parseRemoteSessions(result)) {
|
|
1202
|
+
const agentSessionId = remote.id;
|
|
1203
|
+
const existingId = this.conversationByAgentSessionId.get(agentSessionId);
|
|
1204
|
+
const now = Date.now();
|
|
1205
|
+
const conversationId = existingId ?? `agent:${agentSessionId}`;
|
|
1206
|
+
const existing = this.conversations.get(conversationId);
|
|
1207
|
+
const cwd = remote.cwd ?? existing?.cwd ?? this.input.cwd;
|
|
1208
|
+
const conversation = {
|
|
1209
|
+
id: conversationId,
|
|
1210
|
+
agentSessionId,
|
|
1211
|
+
provider,
|
|
1212
|
+
cwd,
|
|
1213
|
+
title: remote.title ?? existing?.title ?? titleFromCwd(cwd),
|
|
1214
|
+
model: remote.model ?? existing?.model,
|
|
1215
|
+
reasoningEffort: existing?.reasoningEffort,
|
|
1216
|
+
permissionMode: existing?.permissionMode,
|
|
1217
|
+
collaborationMode: existing?.collaborationMode,
|
|
1218
|
+
status: existing?.status ?? "idle",
|
|
1219
|
+
archived: existing?.archived ?? false,
|
|
1220
|
+
lastMessagePreview: existing?.lastMessagePreview,
|
|
1221
|
+
lastActivityAt: remote.lastActivityAt ?? existing?.lastActivityAt ?? now,
|
|
1222
|
+
createdAt: remote.createdAt ?? existing?.createdAt ?? now,
|
|
1223
|
+
};
|
|
1224
|
+
this.conversations.set(conversation.id, conversation);
|
|
1225
|
+
this.conversationByAgentSessionId.set(agentSessionId, conversation.id);
|
|
1226
|
+
this.timelines.set(conversation.id, this.timelines.get(conversation.id) ?? []);
|
|
1227
|
+
}
|
|
1228
|
+
}
|
|
1222
1229
|
sendCapabilities() {
|
|
1223
1230
|
const providers = this.input.availableProviders.map((provider) => {
|
|
1224
1231
|
const client = this.clients.get(provider);
|