linkshell-cli 0.9.0 → 0.10.1

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 (168) hide show
  1. package/README.md +11 -6
  2. package/dist/cli/src/commands/gateway.d.ts +2 -0
  3. package/dist/cli/src/commands/gateway.js +29 -0
  4. package/dist/cli/src/commands/gateway.js.map +1 -0
  5. package/dist/cli/src/commands/host.d.ts +2 -0
  6. package/dist/cli/src/commands/host.js +12 -2
  7. package/dist/cli/src/commands/host.js.map +1 -1
  8. package/dist/cli/src/commands/setup.js +4 -2
  9. package/dist/cli/src/commands/setup.js.map +1 -1
  10. package/dist/cli/src/index.js +12 -334
  11. package/dist/cli/src/index.js.map +1 -1
  12. package/dist/cli/src/utils/daemon.d.ts +0 -7
  13. package/dist/cli/src/utils/daemon.js +1 -18
  14. package/dist/cli/src/utils/daemon.js.map +1 -1
  15. package/dist/cli/tsconfig.tsbuildinfo +1 -1
  16. package/dist/gateway/src/accounts.d.ts +6 -0
  17. package/dist/gateway/src/accounts.js +32 -0
  18. package/dist/gateway/src/accounts.js.map +1 -0
  19. package/dist/gateway/src/index.d.ts +4 -0
  20. package/dist/gateway/src/index.js +5 -0
  21. package/dist/gateway/src/index.js.map +1 -0
  22. package/dist/gateway/src/main.d.ts +1 -0
  23. package/dist/gateway/src/main.js +57 -0
  24. package/dist/gateway/src/main.js.map +1 -0
  25. package/dist/gateway/src/rate-limit.d.ts +22 -0
  26. package/dist/gateway/src/rate-limit.js +66 -0
  27. package/dist/gateway/src/rate-limit.js.map +1 -0
  28. package/dist/gateway/src/relay.d.ts +84 -0
  29. package/dist/gateway/src/relay.js +434 -0
  30. package/dist/gateway/src/relay.js.map +1 -0
  31. package/dist/gateway/src/serve.d.ts +34 -0
  32. package/dist/gateway/src/serve.js +102 -0
  33. package/dist/gateway/src/serve.js.map +1 -0
  34. package/dist/gateway/src/store.d.ts +35 -0
  35. package/dist/gateway/src/store.js +109 -0
  36. package/dist/gateway/src/store.js.map +1 -0
  37. package/dist/gateway/src/subscription.d.ts +18 -0
  38. package/dist/gateway/src/subscription.js +46 -0
  39. package/dist/gateway/src/subscription.js.map +1 -0
  40. package/dist/host/src/drivers/claude/transcript.d.ts +23 -23
  41. package/dist/host/src/drivers/codex/app-server.d.ts +31 -6
  42. package/dist/host/src/drivers/codex/app-server.js +99 -24
  43. package/dist/host/src/drivers/codex/app-server.js.map +1 -1
  44. package/dist/host/src/drivers/codex/desktop-ipc.d.ts +8 -0
  45. package/dist/host/src/drivers/codex/desktop-ipc.js +124 -0
  46. package/dist/host/src/drivers/codex/desktop-ipc.js.map +1 -0
  47. package/dist/host/src/drivers/codex/driver.d.ts +111 -2
  48. package/dist/host/src/drivers/codex/driver.js +629 -63
  49. package/dist/host/src/drivers/codex/driver.js.map +1 -1
  50. package/dist/host/src/drivers/codex/mapper.d.ts +21 -0
  51. package/dist/host/src/drivers/codex/mapper.js +45 -6
  52. package/dist/host/src/drivers/codex/mapper.js.map +1 -1
  53. package/dist/host/src/drivers/types.d.ts +6 -0
  54. package/dist/host/src/fs.d.ts +3 -3
  55. package/dist/host/src/hub.js +8 -1
  56. package/dist/host/src/hub.js.map +1 -1
  57. package/dist/host/src/input.d.ts +4 -4
  58. package/dist/host/src/terminals.d.ts +1 -1
  59. package/dist/wire/src/model.d.ts +6 -6
  60. package/dist/wire/src/relay.d.ts +8 -8
  61. package/dist/wire/src/rpc.d.ts +818 -818
  62. package/dist/wire/src/updates.d.ts +18 -18
  63. package/package.json +5 -14
  64. package/src/commands/gateway.ts +31 -0
  65. package/src/commands/host.ts +13 -2
  66. package/src/commands/setup.ts +4 -2
  67. package/src/index.ts +14 -429
  68. package/src/utils/daemon.ts +2 -27
  69. package/dist/cli/src/config.d.ts +0 -14
  70. package/dist/cli/src/config.js +0 -23
  71. package/dist/cli/src/config.js.map +0 -1
  72. package/dist/cli/src/machine-id.d.ts +0 -6
  73. package/dist/cli/src/machine-id.js +0 -50
  74. package/dist/cli/src/machine-id.js.map +0 -1
  75. package/dist/cli/src/providers.d.ts +0 -13
  76. package/dist/cli/src/providers.js +0 -77
  77. package/dist/cli/src/providers.js.map +0 -1
  78. package/dist/cli/src/runtime/acp/acp-client.d.ts +0 -128
  79. package/dist/cli/src/runtime/acp/acp-client.js +0 -430
  80. package/dist/cli/src/runtime/acp/acp-client.js.map +0 -1
  81. package/dist/cli/src/runtime/acp/agent-process-discovery.d.ts +0 -48
  82. package/dist/cli/src/runtime/acp/agent-process-discovery.js +0 -278
  83. package/dist/cli/src/runtime/acp/agent-process-discovery.js.map +0 -1
  84. package/dist/cli/src/runtime/acp/agent-session.d.ts +0 -62
  85. package/dist/cli/src/runtime/acp/agent-session.js +0 -1081
  86. package/dist/cli/src/runtime/acp/agent-session.js.map +0 -1
  87. package/dist/cli/src/runtime/acp/agent-workspace.d.ts +0 -311
  88. package/dist/cli/src/runtime/acp/agent-workspace.js +0 -6083
  89. package/dist/cli/src/runtime/acp/agent-workspace.js.map +0 -1
  90. package/dist/cli/src/runtime/acp/claude-sdk-client.d.ts +0 -121
  91. package/dist/cli/src/runtime/acp/claude-sdk-client.js +0 -1147
  92. package/dist/cli/src/runtime/acp/claude-sdk-client.js.map +0 -1
  93. package/dist/cli/src/runtime/acp/claude-stream-json-client.d.ts +0 -53
  94. package/dist/cli/src/runtime/acp/claude-stream-json-client.js +0 -552
  95. package/dist/cli/src/runtime/acp/claude-stream-json-client.js.map +0 -1
  96. package/dist/cli/src/runtime/acp/json-rpc.d.ts +0 -22
  97. package/dist/cli/src/runtime/acp/json-rpc.js +0 -160
  98. package/dist/cli/src/runtime/acp/json-rpc.js.map +0 -1
  99. package/dist/cli/src/runtime/acp/provider-resolver.d.ts +0 -16
  100. package/dist/cli/src/runtime/acp/provider-resolver.js +0 -132
  101. package/dist/cli/src/runtime/acp/provider-resolver.js.map +0 -1
  102. package/dist/cli/src/runtime/bridge-session.d.ts +0 -97
  103. package/dist/cli/src/runtime/bridge-session.js +0 -1364
  104. package/dist/cli/src/runtime/bridge-session.js.map +0 -1
  105. package/dist/cli/src/runtime/hook-command.d.ts +0 -9
  106. package/dist/cli/src/runtime/hook-command.js +0 -80
  107. package/dist/cli/src/runtime/hook-command.js.map +0 -1
  108. package/dist/cli/src/runtime/screen-fallback.d.ts +0 -22
  109. package/dist/cli/src/runtime/screen-fallback.js +0 -202
  110. package/dist/cli/src/runtime/screen-fallback.js.map +0 -1
  111. package/dist/cli/src/runtime/screen-share.d.ts +0 -34
  112. package/dist/cli/src/runtime/screen-share.js +0 -376
  113. package/dist/cli/src/runtime/screen-share.js.map +0 -1
  114. package/dist/cli/src/runtime/scrollback.d.ts +0 -11
  115. package/dist/cli/src/runtime/scrollback.js +0 -33
  116. package/dist/cli/src/runtime/scrollback.js.map +0 -1
  117. package/dist/cli/src/runtime/usage-report.d.ts +0 -34
  118. package/dist/cli/src/runtime/usage-report.js +0 -332
  119. package/dist/cli/src/runtime/usage-report.js.map +0 -1
  120. package/dist/cli/src/utils/keep-awake.d.ts +0 -6
  121. package/dist/cli/src/utils/keep-awake.js +0 -48
  122. package/dist/cli/src/utils/keep-awake.js.map +0 -1
  123. package/dist/cli/src/utils/lan-ip.d.ts +0 -9
  124. package/dist/cli/src/utils/lan-ip.js +0 -61
  125. package/dist/cli/src/utils/lan-ip.js.map +0 -1
  126. package/dist/host/src/input-helper.d.ts +0 -1
  127. package/dist/host/src/input-helper.js +0 -564
  128. package/dist/host/src/input-helper.js.map +0 -1
  129. package/dist/shared-protocol/src/index.d.ts +0 -17029
  130. package/dist/shared-protocol/src/index.js +0 -1064
  131. package/dist/shared-protocol/src/index.js.map +0 -1
  132. package/scripts/copy-web.mjs +0 -34
  133. package/src/config.ts +0 -36
  134. package/src/machine-id.ts +0 -61
  135. package/src/providers.ts +0 -97
  136. package/src/runtime/acp/acp-client.ts +0 -521
  137. package/src/runtime/acp/agent-process-discovery.ts +0 -308
  138. package/src/runtime/acp/agent-session.ts +0 -1186
  139. package/src/runtime/acp/agent-workspace.ts +0 -6590
  140. package/src/runtime/acp/claude-sdk-client.ts +0 -1221
  141. package/src/runtime/acp/claude-stream-json-client.ts +0 -633
  142. package/src/runtime/acp/json-rpc.ts +0 -184
  143. package/src/runtime/acp/provider-resolver.ts +0 -154
  144. package/src/runtime/bridge-session.ts +0 -1549
  145. package/src/runtime/hook-command.ts +0 -73
  146. package/src/runtime/screen-fallback.ts +0 -235
  147. package/src/runtime/screen-share.ts +0 -426
  148. package/src/runtime/scrollback.ts +0 -43
  149. package/src/runtime/usage-report.ts +0 -342
  150. package/src/utils/keep-awake.ts +0 -61
  151. package/src/utils/lan-ip.ts +0 -61
  152. package/web/assets/FileBrowser-wOAfY-xj.js +0 -2
  153. package/web/assets/PortPreview-Cbvv7yzA.js +0 -2
  154. package/web/assets/TerminalPanel-CTSklkct.js +0 -1
  155. package/web/assets/UsageDashboard-CJ1AsNmd.js +0 -1
  156. package/web/assets/index-BsnDaeCt.css +0 -33
  157. package/web/assets/index-q85psYZ5.js +0 -36
  158. package/web/assets/vendor-highlight-NXWAAyIv.js +0 -5
  159. package/web/assets/vendor-react-M7xG3qiw.js +0 -49
  160. package/web/assets/vendor-xterm-D15THcI4.js +0 -9
  161. package/web/index.html +0 -37
  162. package/web/logos/claude.png +0 -0
  163. package/web/logos/codex.png +0 -0
  164. package/web/logos/copilot.png +0 -0
  165. package/web/logos/gemini.png +0 -0
  166. package/web/logos/linkshell-1024.png +0 -0
  167. package/web/logos/linkshell-splash.png +0 -0
  168. package/web/logos/linkshell.png +0 -0
@@ -1,376 +0,0 @@
1
- import { spawn, execSync } from "node:child_process";
2
- import { createRequire } from "node:module";
3
- import { platform } from "node:os";
4
- import { createEnvelope } from "@linkshell/protocol";
5
- const RTP_MTU = 1200; // Max payload size before FU-A fragmentation
6
- /** Detect the avfoundation device index for "Capture screen" on macOS. */
7
- function detectMacScreenIndex() {
8
- try {
9
- const out = execSync('ffmpeg -f avfoundation -list_devices true -i "" 2>&1 || true', {
10
- timeout: 5000,
11
- stdio: ["pipe", "pipe", "pipe"],
12
- }).toString();
13
- // Look for lines like: [AVFoundation ...] [2] Capture screen 0
14
- const match = out.match(/\[(\d+)]\s+Capture screen/);
15
- if (match)
16
- return match[1];
17
- }
18
- catch { }
19
- return "1"; // legacy fallback
20
- }
21
- /**
22
- * WebRTC screen sharing using werift (pure TS WebRTC) + ffmpeg.
23
- *
24
- * Flow:
25
- * 1. ffmpeg captures screen → H.264 → writes to stdout as raw annexb
26
- * 2. We read H.264 NAL units and push them into werift video track
27
- * 3. werift handles ICE/DTLS/SRTP and sends to remote peer
28
- * 4. Signaling (SDP offer/answer, ICE candidates) goes through existing WebSocket
29
- */
30
- export class ScreenShare {
31
- pc; // werift.RTCPeerConnection
32
- ffmpeg;
33
- active = false;
34
- options;
35
- constructor(options) {
36
- this.options = options;
37
- }
38
- static isAvailable() {
39
- // Check ffmpeg exists
40
- try {
41
- execSync("which ffmpeg", { stdio: "pipe" });
42
- }
43
- catch {
44
- return false;
45
- }
46
- // Check werift can be resolved from this package's context
47
- try {
48
- const require = createRequire(import.meta.url);
49
- require.resolve("werift");
50
- const werift = require("werift");
51
- if (!werift.RTCPeerConnection || !werift.MediaStreamTrack) {
52
- return false;
53
- }
54
- return true;
55
- }
56
- catch {
57
- return false;
58
- }
59
- }
60
- async start() {
61
- if (this.active)
62
- return;
63
- this.active = true;
64
- try {
65
- const werift = await import("werift");
66
- // ICE servers
67
- const iceServers = [
68
- { urls: "stun:stun.l.google.com:19302" },
69
- ];
70
- if (this.options.turnUrl) {
71
- iceServers.push({
72
- urls: this.options.turnUrl,
73
- username: this.options.turnUser ?? "",
74
- credential: this.options.turnPass ?? "",
75
- });
76
- }
77
- this.pc = new werift.RTCPeerConnection({
78
- iceServers,
79
- bundlePolicy: "max-bundle",
80
- codecs: { video: [werift.useH264()] },
81
- });
82
- // Create video track — werift defaults to H264, no need to set codecs explicitly
83
- // (setting transceiver.codecs crashes createOffer in werift 0.22.x)
84
- const videoTrack = new werift.MediaStreamTrack({ kind: "video" });
85
- this.pc.addTransceiver(videoTrack, {
86
- direction: "sendonly",
87
- });
88
- // ICE candidate → send to remote
89
- this.pc.onIceCandidate.subscribe((candidate) => {
90
- if (candidate) {
91
- this.options.onSignal(createEnvelope({
92
- type: "screen.ice",
93
- sessionId: this.options.sessionId,
94
- payload: {
95
- candidate: candidate.candidate,
96
- sdpMid: candidate.sdpMid ?? null,
97
- sdpMLineIndex: candidate.sdpMLineIndex ?? null,
98
- },
99
- }));
100
- }
101
- });
102
- // Connection state changes
103
- this.pc.connectionStateChange.subscribe((state) => {
104
- if (state === "connected") {
105
- this.options.onStatus(createEnvelope({
106
- type: "screen.status",
107
- sessionId: this.options.sessionId,
108
- payload: { active: true, mode: "webrtc" },
109
- }));
110
- }
111
- else if (state === "failed" || state === "disconnected" || state === "closed") {
112
- this.options.onStatus(createEnvelope({
113
- type: "screen.status",
114
- sessionId: this.options.sessionId,
115
- payload: { active: false, mode: "off", error: `WebRTC ${state}` },
116
- }));
117
- }
118
- });
119
- // Create offer
120
- const offer = await this.pc.createOffer();
121
- await this.pc.setLocalDescription(offer);
122
- // Notify client that WebRTC mode is active BEFORE sending the offer,
123
- // so the client mounts the WebView and is ready to process the offer.
124
- this.options.onStatus(createEnvelope({
125
- type: "screen.status",
126
- sessionId: this.options.sessionId,
127
- payload: { active: true, mode: "webrtc" },
128
- }));
129
- this.options.onSignal(createEnvelope({
130
- type: "screen.offer",
131
- sessionId: this.options.sessionId,
132
- payload: { sdp: offer.sdp },
133
- }));
134
- // Start ffmpeg capture (will begin sending once ICE connects)
135
- this.startFfmpeg(videoTrack, werift);
136
- }
137
- catch (err) {
138
- this.options.onStatus(createEnvelope({
139
- type: "screen.status",
140
- sessionId: this.options.sessionId,
141
- payload: {
142
- active: false,
143
- mode: "off",
144
- error: `WebRTC init failed: ${err instanceof Error ? err.message : String(err)}`,
145
- },
146
- }));
147
- this.active = false;
148
- }
149
- }
150
- async handleAnswer(sdp) {
151
- if (!this.pc)
152
- return;
153
- try {
154
- const werift = await import("werift");
155
- await this.pc.setRemoteDescription(new werift.RTCSessionDescription(sdp, "answer"));
156
- }
157
- catch (err) {
158
- process.stderr.write(`[screen-share] failed to set answer: ${err}\n`);
159
- }
160
- }
161
- async handleIceCandidate(candidate, sdpMid, sdpMLineIndex) {
162
- if (!this.pc)
163
- return;
164
- try {
165
- const werift = await import("werift");
166
- await this.pc.addIceCandidate(new werift.RTCIceCandidate({ candidate, sdpMid: sdpMid ?? undefined, sdpMLineIndex: sdpMLineIndex ?? undefined }));
167
- }
168
- catch (err) {
169
- process.stderr.write(`[screen-share] failed to add ICE candidate: ${err}\n`);
170
- }
171
- }
172
- stop() {
173
- this.active = false;
174
- if (this.ffmpeg) {
175
- this.ffmpeg.kill("SIGTERM");
176
- this.ffmpeg = undefined;
177
- }
178
- if (this.pc) {
179
- try {
180
- this.pc.close();
181
- }
182
- catch { }
183
- this.pc = undefined;
184
- }
185
- this.options.onStatus(createEnvelope({
186
- type: "screen.status",
187
- sessionId: this.options.sessionId,
188
- payload: { active: false, mode: "off" },
189
- }));
190
- }
191
- startFfmpeg(videoTrack, werift) {
192
- const os = platform();
193
- const fps = this.options.fps;
194
- const scale = this.options.scale;
195
- let inputArgs;
196
- if (os === "darwin") {
197
- const screenIdx = detectMacScreenIndex();
198
- inputArgs = ["-f", "avfoundation", "-framerate", String(fps), "-i", `${screenIdx}:none`];
199
- }
200
- else if (os === "linux") {
201
- inputArgs = ["-f", "x11grab", "-framerate", String(fps), "-i", ":0"];
202
- }
203
- else {
204
- inputArgs = ["-f", "gdigrab", "-framerate", String(fps), "-i", "desktop"];
205
- }
206
- // libx264 requires even width & height; crop 1px if needed
207
- const evenFilter = "crop=trunc(iw/2)*2:trunc(ih/2)*2";
208
- const vf = scale < 1
209
- ? ["-vf", `scale=iw*${scale}:ih*${scale},${evenFilter}`]
210
- : ["-vf", evenFilter];
211
- this.ffmpeg = spawn("ffmpeg", [
212
- ...inputArgs,
213
- ...vf,
214
- "-c:v", "libx264",
215
- "-preset", "ultrafast",
216
- "-tune", "zerolatency",
217
- "-profile:v", "baseline",
218
- "-level", "3.1",
219
- "-pix_fmt", "yuv420p",
220
- "-g", String(fps * 2),
221
- "-b:v", "1500k",
222
- "-maxrate", "2000k",
223
- "-bufsize", "4000k",
224
- "-f", "h264",
225
- "-an",
226
- "pipe:1",
227
- ], {
228
- stdio: ["pipe", "pipe", "pipe"],
229
- });
230
- // RTP state
231
- let seqNum = 0;
232
- let timestamp = -Math.floor(90000 / fps); // so first bump yields 0
233
- const clockRate = 90000;
234
- const frameDuration = Math.floor(clockRate / fps);
235
- const ssrc = (Math.random() * 0xffffffff) >>> 0;
236
- // Parse NAL units from annexb stream and packetize as RTP
237
- let nalBuffer = Buffer.alloc(0);
238
- const sendNalUnit = (nal) => {
239
- if (nal.length === 0)
240
- return;
241
- // Strip start code
242
- let offset = 0;
243
- if (nal[0] === 0 && nal[1] === 0 && nal[2] === 0 && nal[3] === 1) {
244
- offset = 4;
245
- }
246
- else if (nal[0] === 0 && nal[1] === 0 && nal[2] === 1) {
247
- offset = 3;
248
- }
249
- const nalData = nal.subarray(offset);
250
- if (nalData.length === 0)
251
- return;
252
- const nalType = nalData[0] & 0x1f;
253
- // Update timestamp on each new access unit (SPS/IDR/non-IDR slice)
254
- if (nalType === 7 || nalType === 5 || nalType === 1) {
255
- // Only bump timestamp for actual picture NALs (not SPS/PPS)
256
- if (nalType === 5 || nalType === 1) {
257
- timestamp += frameDuration;
258
- }
259
- }
260
- if (nalData.length <= RTP_MTU) {
261
- // Single NAL unit packet
262
- const header = new werift.RtpHeader({
263
- sequenceNumber: seqNum++ & 0xffff,
264
- timestamp: timestamp >>> 0,
265
- payloadType: 96,
266
- ssrc,
267
- marker: nalType === 1 || nalType === 5, // marker on last NAL of frame
268
- });
269
- try {
270
- videoTrack.writeRtp(new werift.RtpPacket(header, nalData));
271
- }
272
- catch { }
273
- }
274
- else {
275
- // FU-A fragmentation (RFC 6184)
276
- const fnri = nalData[0] & 0xe0; // F + NRI bits
277
- const nalTypeVal = nalData[0] & 0x1f;
278
- const fuIndicator = fnri | 28; // FU-A type = 28
279
- let pos = 1; // skip NAL header byte
280
- let isFirst = true;
281
- while (pos < nalData.length) {
282
- const end = Math.min(pos + RTP_MTU - 2, nalData.length); // -2 for FU indicator + FU header
283
- const isLast = end >= nalData.length;
284
- let fuHeader = nalTypeVal;
285
- if (isFirst)
286
- fuHeader |= 0x80; // Start bit
287
- if (isLast)
288
- fuHeader |= 0x40; // End bit
289
- const payload = Buffer.concat([
290
- Buffer.from([fuIndicator, fuHeader]),
291
- nalData.subarray(pos, end),
292
- ]);
293
- const header = new werift.RtpHeader({
294
- sequenceNumber: seqNum++ & 0xffff,
295
- timestamp: timestamp >>> 0,
296
- payloadType: 96,
297
- ssrc,
298
- marker: isLast && (nalType === 1 || nalType === 5),
299
- });
300
- try {
301
- videoTrack.writeRtp(new werift.RtpPacket(header, payload));
302
- }
303
- catch { }
304
- isFirst = false;
305
- pos = end;
306
- }
307
- }
308
- };
309
- const extractNalUnits = (flush = false) => {
310
- // Find NAL unit boundaries (0x00000001 or 0x000001)
311
- const units = [];
312
- let start = -1;
313
- for (let i = 0; i < nalBuffer.length - 3; i++) {
314
- if (nalBuffer[i] === 0 && nalBuffer[i + 1] === 0) {
315
- let scLen = 0;
316
- if (nalBuffer[i + 2] === 0 && i + 3 < nalBuffer.length && nalBuffer[i + 3] === 1) {
317
- scLen = 4;
318
- }
319
- else if (nalBuffer[i + 2] === 1) {
320
- scLen = 3;
321
- }
322
- if (scLen > 0) {
323
- if (start >= 0) {
324
- units.push(nalBuffer.subarray(start, i));
325
- }
326
- start = i;
327
- i += scLen - 1; // skip past start code
328
- }
329
- }
330
- }
331
- // On flush (ffmpeg exit), emit the trailing NAL unit too
332
- if (flush && start >= 0) {
333
- units.push(nalBuffer.subarray(start));
334
- nalBuffer = Buffer.alloc(0);
335
- return units;
336
- }
337
- if (start >= 0) {
338
- // Keep remaining data from last start code onward
339
- nalBuffer = nalBuffer.subarray(start);
340
- }
341
- // Safety cap: if buffer grows beyond 4MB without producing NALs, discard
342
- if (nalBuffer.length > 4 * 1024 * 1024 && units.length === 0) {
343
- process.stderr.write(`[screen-share] NAL buffer exceeded 4MB, resetting\n`);
344
- nalBuffer = Buffer.alloc(0);
345
- }
346
- return units;
347
- };
348
- this.ffmpeg.stdout?.on("data", (chunk) => {
349
- if (!this.active)
350
- return;
351
- nalBuffer = Buffer.concat([nalBuffer, chunk]);
352
- const units = extractNalUnits();
353
- for (const unit of units) {
354
- sendNalUnit(unit);
355
- }
356
- });
357
- this.ffmpeg.stderr?.on("data", (data) => {
358
- const msg = data.toString();
359
- if (msg.includes("Error") || msg.includes("error")) {
360
- process.stderr.write(`[screen-share:ffmpeg] ${msg}\n`);
361
- }
362
- });
363
- this.ffmpeg.on("exit", (code) => {
364
- // Flush any remaining NAL unit in the buffer
365
- const remaining = extractNalUnits(true);
366
- for (const unit of remaining) {
367
- sendNalUnit(unit);
368
- }
369
- if (this.active) {
370
- process.stderr.write(`[screen-share] ffmpeg exited with code ${code}\n`);
371
- this.stop();
372
- }
373
- });
374
- }
375
- }
376
- //# sourceMappingURL=screen-share.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"screen-share.js","sourceRoot":"","sources":["../../../../src/runtime/screen-share.ts"],"names":[],"mappings":"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"}
@@ -1,11 +0,0 @@
1
- import type { Envelope } from "@linkshell/protocol";
2
- export declare class ScrollbackBuffer {
3
- private buffer;
4
- private readonly capacity;
5
- constructor(capacity?: number);
6
- push(envelope: Envelope): void;
7
- replayFrom(seq: number): Envelope[];
8
- trimUpTo(seq: number): void;
9
- get size(): number;
10
- get lastSeq(): number;
11
- }
@@ -1,33 +0,0 @@
1
- export class ScrollbackBuffer {
2
- buffer = [];
3
- capacity;
4
- constructor(capacity = 1000) {
5
- this.capacity = capacity;
6
- }
7
- push(envelope) {
8
- if (this.buffer.length >= this.capacity) {
9
- this.buffer.shift();
10
- }
11
- this.buffer.push(envelope);
12
- }
13
- replayFrom(seq) {
14
- return this.buffer.filter((e) => e.seq !== undefined && e.seq > seq);
15
- }
16
- trimUpTo(seq) {
17
- const idx = this.buffer.findIndex((e) => e.seq !== undefined && e.seq > seq);
18
- if (idx > 0) {
19
- this.buffer.splice(0, idx);
20
- }
21
- else if (idx === -1) {
22
- this.buffer = [];
23
- }
24
- }
25
- get size() {
26
- return this.buffer.length;
27
- }
28
- get lastSeq() {
29
- const last = this.buffer[this.buffer.length - 1];
30
- return last?.seq ?? -1;
31
- }
32
- }
33
- //# sourceMappingURL=scrollback.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"scrollback.js","sourceRoot":"","sources":["../../../../src/runtime/scrollback.ts"],"names":[],"mappings":"AAEA,MAAM,OAAO,gBAAgB;IACnB,MAAM,GAAe,EAAE,CAAC;IACf,QAAQ,CAAS;IAElC,YAAY,QAAQ,GAAG,IAAI;QACzB,IAAI,CAAC,QAAQ,GAAG,QAAQ,CAAC;IAC3B,CAAC;IAED,IAAI,CAAC,QAAkB;QACrB,IAAI,IAAI,CAAC,MAAM,CAAC,MAAM,IAAI,IAAI,CAAC,QAAQ,EAAE,CAAC;YACxC,IAAI,CAAC,MAAM,CAAC,KAAK,EAAE,CAAC;QACtB,CAAC;QACD,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;IAC7B,CAAC;IAED,UAAU,CAAC,GAAW;QACpB,OAAO,IAAI,CAAC,MAAM,CAAC,MAAM,CACvB,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,GAAG,KAAK,SAAS,IAAI,CAAC,CAAC,GAAG,GAAG,GAAG,CAC1C,CAAC;IACJ,CAAC;IAED,QAAQ,CAAC,GAAW;QAClB,MAAM,GAAG,GAAG,IAAI,CAAC,MAAM,CAAC,SAAS,CAC/B,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,GAAG,KAAK,SAAS,IAAI,CAAC,CAAC,GAAG,GAAG,GAAG,CAC1C,CAAC;QACF,IAAI,GAAG,GAAG,CAAC,EAAE,CAAC;YACZ,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC;QAC7B,CAAC;aAAM,IAAI,GAAG,KAAK,CAAC,CAAC,EAAE,CAAC;YACtB,IAAI,CAAC,MAAM,GAAG,EAAE,CAAC;QACnB,CAAC;IACH,CAAC;IAED,IAAI,IAAI;QACN,OAAO,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC;IAC5B,CAAC;IAED,IAAI,OAAO;QACT,MAAM,IAAI,GAAG,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;QACjD,OAAO,IAAI,EAAE,GAAG,IAAI,CAAC,CAAC,CAAC;IACzB,CAAC;CACF"}
@@ -1,34 +0,0 @@
1
- export interface UsageTotals {
2
- inputTokens: number;
3
- outputTokens: number;
4
- cacheReadTokens: number;
5
- cacheWriteTokens: number;
6
- totalTokens: number;
7
- calls: number;
8
- }
9
- export interface UsageBucket extends UsageTotals {
10
- key: string;
11
- }
12
- export interface UsageReport {
13
- totals: UsageTotals;
14
- sessions: number;
15
- /** Highest single-day token total. */
16
- peakDayTokens: number;
17
- /** Longest single session span (first→last activity), milliseconds. */
18
- longestTaskMs: number;
19
- /** Consecutive active days ending at the most recent active day. */
20
- currentStreakDays: number;
21
- /** Longest run of consecutive active days ever. */
22
- longestStreakDays: number;
23
- byDay: UsageBucket[];
24
- byHourWeekday: {
25
- weekday: number;
26
- hour: number;
27
- tokens: number;
28
- }[];
29
- byTool: UsageBucket[];
30
- byModel: UsageBucket[];
31
- byProject: UsageBucket[];
32
- generatedAt: number;
33
- }
34
- export declare function aggregateUsage(): UsageReport;