linkshell-cli 0.3.27 → 0.3.29

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 (64) hide show
  1. package/dist/cli/src/commands/setup.js +20 -2
  2. package/dist/cli/src/commands/setup.js.map +1 -1
  3. package/dist/cli/src/commands/upgrade.js +9 -24
  4. package/dist/cli/src/commands/upgrade.js.map +1 -1
  5. package/dist/cli/src/index.js +28 -26
  6. package/dist/cli/src/index.js.map +1 -1
  7. package/dist/cli/src/providers.d.ts +3 -7
  8. package/dist/cli/src/providers.js +76 -19
  9. package/dist/cli/src/providers.js.map +1 -1
  10. package/dist/cli/src/runtime/acp/acp-client.d.ts +0 -10
  11. package/dist/cli/src/runtime/acp/acp-client.js +19 -146
  12. package/dist/cli/src/runtime/acp/acp-client.js.map +1 -1
  13. package/dist/cli/src/runtime/acp/agent-session.d.ts +62 -0
  14. package/dist/cli/src/runtime/acp/agent-session.js +1075 -0
  15. package/dist/cli/src/runtime/acp/agent-session.js.map +1 -0
  16. package/dist/cli/src/runtime/acp/agent-workspace.d.ts +1 -24
  17. package/dist/cli/src/runtime/acp/agent-workspace.js +162 -981
  18. package/dist/cli/src/runtime/acp/agent-workspace.js.map +1 -1
  19. package/dist/cli/src/runtime/acp/claude-sdk-client.d.ts +1 -3
  20. package/dist/cli/src/runtime/acp/claude-sdk-client.js +35 -81
  21. package/dist/cli/src/runtime/acp/claude-sdk-client.js.map +1 -1
  22. package/dist/cli/src/runtime/acp/claude-stream-json-client.d.ts +1 -2
  23. package/dist/cli/src/runtime/acp/claude-stream-json-client.js +35 -54
  24. package/dist/cli/src/runtime/acp/claude-stream-json-client.js.map +1 -1
  25. package/dist/cli/src/runtime/acp/codex-rpc-bridge.js +12 -1
  26. package/dist/cli/src/runtime/acp/codex-rpc-bridge.js.map +1 -1
  27. package/dist/cli/src/runtime/acp/json-rpc.d.ts +1 -34
  28. package/dist/cli/src/runtime/acp/json-rpc.js +8 -32
  29. package/dist/cli/src/runtime/acp/json-rpc.js.map +1 -1
  30. package/dist/cli/src/runtime/acp/provider-resolver.d.ts +0 -3
  31. package/dist/cli/src/runtime/acp/provider-resolver.js +6 -26
  32. package/dist/cli/src/runtime/acp/provider-resolver.js.map +1 -1
  33. package/dist/cli/src/runtime/bridge-session.d.ts +31 -1
  34. package/dist/cli/src/runtime/bridge-session.js +991 -81
  35. package/dist/cli/src/runtime/bridge-session.js.map +1 -1
  36. package/dist/cli/src/runtime/screen-fallback.d.ts +1 -1
  37. package/dist/cli/src/runtime/screen-fallback.js +4 -4
  38. package/dist/cli/src/runtime/screen-fallback.js.map +1 -1
  39. package/dist/cli/src/runtime/screen-share.d.ts +1 -1
  40. package/dist/cli/src/runtime/screen-share.js +7 -7
  41. package/dist/cli/src/runtime/screen-share.js.map +1 -1
  42. package/dist/cli/tsconfig.tsbuildinfo +1 -1
  43. package/dist/shared-protocol/src/index.d.ts +11940 -3423
  44. package/dist/shared-protocol/src/index.js +98 -164
  45. package/dist/shared-protocol/src/index.js.map +1 -1
  46. package/package.json +5 -5
  47. package/src/commands/setup.ts +31 -5
  48. package/src/commands/upgrade.ts +8 -28
  49. package/src/index.ts +34 -29
  50. package/src/providers.ts +108 -26
  51. package/src/runtime/acp/acp-client.ts +21 -159
  52. package/src/runtime/acp/agent-session.ts +1180 -0
  53. package/src/runtime/acp/agent-workspace.ts +170 -1068
  54. package/src/runtime/acp/claude-sdk-client.ts +37 -85
  55. package/src/runtime/acp/claude-stream-json-client.ts +41 -59
  56. package/src/runtime/acp/json-rpc.ts +14 -46
  57. package/src/runtime/acp/provider-resolver.ts +6 -29
  58. package/src/runtime/bridge-session.ts +1092 -84
  59. package/src/runtime/screen-fallback.ts +5 -5
  60. package/src/runtime/screen-share.ts +8 -8
  61. package/src/runtime/acp/claude-sessions.ts +0 -563
  62. package/src/runtime/acp/codex-rpc-bridge.ts +0 -221
  63. package/src/runtime/acp/codex-sessions.ts +0 -802
  64. package/src/types/linkshell-gateway.d.ts +0 -18
@@ -1,221 +0,0 @@
1
- import { createEnvelope } from "@linkshell/protocol";
2
- import type { Envelope } from "@linkshell/protocol";
3
- import { JsonRpcStdioTransport, type JsonRpcMessage } from "./json-rpc.js";
4
- import { resolveCodexAppServerCommands, type AgentCommandConfig } from "./provider-resolver.js";
5
-
6
- const CODEX_PROXY_STARTUP_GRACE_MS = 250;
7
-
8
- type JsonRpcId = string | number;
9
-
10
- export class CodexRpcBridge {
11
- private transport: JsonRpcStdioTransport | undefined;
12
- private transportReady = false;
13
- private starting = false;
14
- private stopping = false;
15
- private candidateIndex = 0;
16
- private startupTimer: ReturnType<typeof setTimeout> | undefined;
17
- private queuedMessages: JsonRpcMessage[] = [];
18
- private inFlightRequests = new Map<JsonRpcId, JsonRpcMessage>();
19
-
20
- constructor(
21
- private readonly input: {
22
- command?: string;
23
- commandCandidates?: AgentCommandConfig[];
24
- cwd: string;
25
- hostDeviceId: string;
26
- send: (envelope: Envelope) => void;
27
- verbose?: boolean;
28
- },
29
- ) {}
30
-
31
- send(message: unknown): void {
32
- this.ensureTransport();
33
- const jsonMessage = message as JsonRpcMessage;
34
- if (!this.transportReady) {
35
- this.queuedMessages.push(jsonMessage);
36
- return;
37
- }
38
- this.rememberRequest(jsonMessage);
39
- this.transport?.send(jsonMessage);
40
- }
41
-
42
- stop(): void {
43
- this.stopping = true;
44
- if (this.startupTimer) {
45
- clearTimeout(this.startupTimer);
46
- this.startupTimer = undefined;
47
- }
48
- this.transport?.stop();
49
- this.transport = undefined;
50
- this.transportReady = false;
51
- this.starting = false;
52
- this.queuedMessages = [];
53
- this.inFlightRequests.clear();
54
- this.stopping = false;
55
- }
56
-
57
- private ensureTransport(): void {
58
- if (this.transport || this.starting) return;
59
- const candidates = this.commandCandidates();
60
- if (candidates.length === 0) {
61
- throw new Error("Codex app-server command is unavailable.");
62
- }
63
- this.startCandidate(this.candidateIndex);
64
- }
65
-
66
- private commandCandidates(): AgentCommandConfig[] {
67
- return this.input.commandCandidates ?? resolveCodexAppServerCommands({
68
- command: this.input.command,
69
- });
70
- }
71
-
72
- private startCandidate(index: number): void {
73
- const config = this.commandCandidates()[index];
74
- if (!config) {
75
- this.failQueued("Codex app-server command is unavailable.");
76
- return;
77
- }
78
- this.candidateIndex = index;
79
- this.starting = true;
80
- this.transportReady = false;
81
- this.transport = new JsonRpcStdioTransport(
82
- config.command,
83
- config.framing,
84
- () => {},
85
- () => ({}),
86
- (message) => this.handleTransportExit(message),
87
- (message) => {
88
- this.forgetRequest(message);
89
- this.input.send(createEnvelope({
90
- type: "agent.codex.rpc",
91
- hostDeviceId: this.input.hostDeviceId,
92
- payload: message,
93
- }));
94
- return true;
95
- },
96
- {
97
- includeJsonrpc: false,
98
- verbose: this.input.verbose,
99
- onStderrData: (message) => this.handleTransportStderr(message),
100
- },
101
- );
102
- this.transport.start(this.input.cwd);
103
- if (this.input.verbose) {
104
- process.stderr.write(`[agent:codex-rpc] started ${config.command}\n`);
105
- }
106
- this.startupTimer = setTimeout(() => {
107
- this.startupTimer = undefined;
108
- this.transportReady = true;
109
- this.starting = false;
110
- this.flushQueued();
111
- }, CODEX_PROXY_STARTUP_GRACE_MS);
112
- }
113
-
114
- private handleTransportExit(message: string): void {
115
- if (this.stopping) return;
116
- if (this.startupTimer) {
117
- clearTimeout(this.startupTimer);
118
- this.startupTimer = undefined;
119
- }
120
- const wasReady = this.transportReady;
121
- this.transport = undefined;
122
- this.transportReady = false;
123
- this.starting = false;
124
- const nextIndex = this.candidateIndex + 1;
125
- if (!wasReady && nextIndex < this.commandCandidates().length) {
126
- if (this.input.verbose) {
127
- process.stderr.write(`[agent:codex-rpc] ${message}; falling back\n`);
128
- }
129
- this.startCandidate(nextIndex);
130
- return;
131
- }
132
- this.failQueued(message);
133
- this.failInFlight(message);
134
- this.emitError(message);
135
- }
136
-
137
- private flushQueued(): void {
138
- const messages = this.queuedMessages.splice(0);
139
- for (const message of messages) {
140
- this.rememberRequest(message);
141
- this.transport?.send(message);
142
- }
143
- }
144
-
145
- private failQueued(message: string): void {
146
- const queued = this.queuedMessages.splice(0);
147
- for (const item of queued) {
148
- if (!("id" in item) || item.id === undefined || item.id === null) continue;
149
- this.input.send(createEnvelope({
150
- type: "agent.codex.rpc",
151
- hostDeviceId: this.input.hostDeviceId,
152
- payload: {
153
- jsonrpc: "2.0",
154
- id: item.id,
155
- error: { code: -32000, message },
156
- },
157
- }));
158
- }
159
- if (this.input.verbose) {
160
- process.stderr.write(`[agent:codex-rpc] ${message}\n`);
161
- }
162
- }
163
-
164
- private emitError(message: string): void {
165
- this.input.send(createEnvelope({
166
- type: "agent.codex.rpc",
167
- hostDeviceId: this.input.hostDeviceId,
168
- payload: {
169
- jsonrpc: "2.0",
170
- id: "linkshell-codex-rpc-error",
171
- error: { code: -32000, message },
172
- },
173
- }));
174
- }
175
-
176
- private handleTransportStderr(message: string): void {
177
- if (this.input.verbose) {
178
- process.stderr.write(`[agent:codex-rpc] stderr ignored while app-server is running: ${message}\n`);
179
- }
180
- }
181
-
182
- private rememberRequest(message: JsonRpcMessage): void {
183
- if (!isJsonRpcRequest(message)) return;
184
- this.inFlightRequests.set(message.id, message);
185
- }
186
-
187
- private forgetRequest(message: JsonRpcMessage): void {
188
- if (!isJsonRpcResponse(message)) return;
189
- this.inFlightRequests.delete(message.id);
190
- }
191
-
192
- private failInFlight(message: string): void {
193
- const requests = [...this.inFlightRequests.values()];
194
- this.inFlightRequests.clear();
195
- for (const item of requests) {
196
- if (!isJsonRpcRequest(item)) continue;
197
- this.input.send(createEnvelope({
198
- type: "agent.codex.rpc",
199
- hostDeviceId: this.input.hostDeviceId,
200
- payload: {
201
- jsonrpc: "2.0",
202
- id: item.id,
203
- error: { code: -32000, message },
204
- },
205
- }));
206
- }
207
- }
208
- }
209
-
210
- function isJsonRpcRequest(message: JsonRpcMessage): message is JsonRpcMessage & { id: JsonRpcId; method: string } {
211
- return "id" in message &&
212
- "method" in message &&
213
- (typeof message.id === "string" || typeof message.id === "number") &&
214
- typeof message.method === "string";
215
- }
216
-
217
- function isJsonRpcResponse(message: JsonRpcMessage): message is JsonRpcMessage & { id: JsonRpcId } {
218
- return "id" in message &&
219
- (typeof message.id === "string" || typeof message.id === "number") &&
220
- ("result" in message || "error" in message);
221
- }