linkshell-cli 0.8.2 → 0.10.0

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 (173) 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 +4 -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/screen.d.ts +10 -0
  9. package/dist/cli/src/commands/screen.js +82 -74
  10. package/dist/cli/src/commands/screen.js.map +1 -1
  11. package/dist/cli/src/commands/setup.d.ts +11 -1
  12. package/dist/cli/src/commands/setup.js +102 -38
  13. package/dist/cli/src/commands/setup.js.map +1 -1
  14. package/dist/cli/src/index.js +28 -338
  15. package/dist/cli/src/index.js.map +1 -1
  16. package/dist/cli/src/utils/daemon.d.ts +0 -7
  17. package/dist/cli/src/utils/daemon.js +1 -18
  18. package/dist/cli/src/utils/daemon.js.map +1 -1
  19. package/dist/cli/tsconfig.tsbuildinfo +1 -1
  20. package/dist/gateway/src/accounts.d.ts +6 -0
  21. package/dist/gateway/src/accounts.js +32 -0
  22. package/dist/gateway/src/accounts.js.map +1 -0
  23. package/dist/gateway/src/index.d.ts +4 -0
  24. package/dist/gateway/src/index.js +5 -0
  25. package/dist/gateway/src/index.js.map +1 -0
  26. package/dist/gateway/src/main.d.ts +1 -0
  27. package/dist/gateway/src/main.js +57 -0
  28. package/dist/gateway/src/main.js.map +1 -0
  29. package/dist/gateway/src/rate-limit.d.ts +22 -0
  30. package/dist/gateway/src/rate-limit.js +66 -0
  31. package/dist/gateway/src/rate-limit.js.map +1 -0
  32. package/dist/gateway/src/relay.d.ts +84 -0
  33. package/dist/gateway/src/relay.js +434 -0
  34. package/dist/gateway/src/relay.js.map +1 -0
  35. package/dist/gateway/src/serve.d.ts +34 -0
  36. package/dist/gateway/src/serve.js +102 -0
  37. package/dist/gateway/src/serve.js.map +1 -0
  38. package/dist/gateway/src/store.d.ts +35 -0
  39. package/dist/gateway/src/store.js +109 -0
  40. package/dist/gateway/src/store.js.map +1 -0
  41. package/dist/gateway/src/subscription.d.ts +18 -0
  42. package/dist/gateway/src/subscription.js +46 -0
  43. package/dist/gateway/src/subscription.js.map +1 -0
  44. package/dist/host/src/drivers/claude/transcript.d.ts +23 -23
  45. package/dist/host/src/fs.d.ts +3 -3
  46. package/dist/host/src/input.d.ts +112 -27
  47. package/dist/host/src/input.js +214 -144
  48. package/dist/host/src/input.js.map +1 -1
  49. package/dist/host/src/rpc/server.js +1 -1
  50. package/dist/host/src/rpc/server.js.map +1 -1
  51. package/dist/host/src/screen-pacer.d.ts +25 -11
  52. package/dist/host/src/screen-pacer.js +28 -6
  53. package/dist/host/src/screen-pacer.js.map +1 -1
  54. package/dist/host/src/screen-viewer.d.ts +5 -0
  55. package/dist/host/src/screen-viewer.js +1231 -55
  56. package/dist/host/src/screen-viewer.js.map +1 -1
  57. package/dist/host/src/screen.d.ts +19 -10
  58. package/dist/host/src/screen.js +314 -108
  59. package/dist/host/src/screen.js.map +1 -1
  60. package/dist/host/src/terminals.d.ts +1 -1
  61. package/dist/host/src/terminals.js +1 -0
  62. package/dist/host/src/terminals.js.map +1 -1
  63. package/dist/wire/src/model.d.ts +6 -6
  64. package/dist/wire/src/relay.d.ts +8 -8
  65. package/dist/wire/src/rpc.d.ts +818 -818
  66. package/dist/wire/src/updates.d.ts +18 -18
  67. package/package.json +6 -15
  68. package/src/commands/gateway.ts +31 -0
  69. package/src/commands/host.ts +15 -2
  70. package/src/commands/screen.ts +78 -72
  71. package/src/commands/setup.ts +102 -60
  72. package/src/index.ts +29 -433
  73. package/src/utils/daemon.ts +2 -27
  74. package/dist/cli/src/config.d.ts +0 -14
  75. package/dist/cli/src/config.js +0 -23
  76. package/dist/cli/src/config.js.map +0 -1
  77. package/dist/cli/src/machine-id.d.ts +0 -6
  78. package/dist/cli/src/machine-id.js +0 -50
  79. package/dist/cli/src/machine-id.js.map +0 -1
  80. package/dist/cli/src/providers.d.ts +0 -13
  81. package/dist/cli/src/providers.js +0 -77
  82. package/dist/cli/src/providers.js.map +0 -1
  83. package/dist/cli/src/runtime/acp/acp-client.d.ts +0 -128
  84. package/dist/cli/src/runtime/acp/acp-client.js +0 -430
  85. package/dist/cli/src/runtime/acp/acp-client.js.map +0 -1
  86. package/dist/cli/src/runtime/acp/agent-process-discovery.d.ts +0 -48
  87. package/dist/cli/src/runtime/acp/agent-process-discovery.js +0 -278
  88. package/dist/cli/src/runtime/acp/agent-process-discovery.js.map +0 -1
  89. package/dist/cli/src/runtime/acp/agent-session.d.ts +0 -62
  90. package/dist/cli/src/runtime/acp/agent-session.js +0 -1081
  91. package/dist/cli/src/runtime/acp/agent-session.js.map +0 -1
  92. package/dist/cli/src/runtime/acp/agent-workspace.d.ts +0 -311
  93. package/dist/cli/src/runtime/acp/agent-workspace.js +0 -6083
  94. package/dist/cli/src/runtime/acp/agent-workspace.js.map +0 -1
  95. package/dist/cli/src/runtime/acp/claude-sdk-client.d.ts +0 -121
  96. package/dist/cli/src/runtime/acp/claude-sdk-client.js +0 -1147
  97. package/dist/cli/src/runtime/acp/claude-sdk-client.js.map +0 -1
  98. package/dist/cli/src/runtime/acp/claude-stream-json-client.d.ts +0 -53
  99. package/dist/cli/src/runtime/acp/claude-stream-json-client.js +0 -552
  100. package/dist/cli/src/runtime/acp/claude-stream-json-client.js.map +0 -1
  101. package/dist/cli/src/runtime/acp/json-rpc.d.ts +0 -22
  102. package/dist/cli/src/runtime/acp/json-rpc.js +0 -160
  103. package/dist/cli/src/runtime/acp/json-rpc.js.map +0 -1
  104. package/dist/cli/src/runtime/acp/provider-resolver.d.ts +0 -16
  105. package/dist/cli/src/runtime/acp/provider-resolver.js +0 -132
  106. package/dist/cli/src/runtime/acp/provider-resolver.js.map +0 -1
  107. package/dist/cli/src/runtime/bridge-session.d.ts +0 -97
  108. package/dist/cli/src/runtime/bridge-session.js +0 -1364
  109. package/dist/cli/src/runtime/bridge-session.js.map +0 -1
  110. package/dist/cli/src/runtime/hook-command.d.ts +0 -9
  111. package/dist/cli/src/runtime/hook-command.js +0 -80
  112. package/dist/cli/src/runtime/hook-command.js.map +0 -1
  113. package/dist/cli/src/runtime/screen-fallback.d.ts +0 -22
  114. package/dist/cli/src/runtime/screen-fallback.js +0 -202
  115. package/dist/cli/src/runtime/screen-fallback.js.map +0 -1
  116. package/dist/cli/src/runtime/screen-share.d.ts +0 -34
  117. package/dist/cli/src/runtime/screen-share.js +0 -376
  118. package/dist/cli/src/runtime/screen-share.js.map +0 -1
  119. package/dist/cli/src/runtime/scrollback.d.ts +0 -11
  120. package/dist/cli/src/runtime/scrollback.js +0 -33
  121. package/dist/cli/src/runtime/scrollback.js.map +0 -1
  122. package/dist/cli/src/runtime/usage-report.d.ts +0 -34
  123. package/dist/cli/src/runtime/usage-report.js +0 -332
  124. package/dist/cli/src/runtime/usage-report.js.map +0 -1
  125. package/dist/cli/src/utils/keep-awake.d.ts +0 -6
  126. package/dist/cli/src/utils/keep-awake.js +0 -48
  127. package/dist/cli/src/utils/keep-awake.js.map +0 -1
  128. package/dist/cli/src/utils/lan-ip.d.ts +0 -9
  129. package/dist/cli/src/utils/lan-ip.js +0 -61
  130. package/dist/cli/src/utils/lan-ip.js.map +0 -1
  131. package/dist/host/src/input-helper.d.ts +0 -1
  132. package/dist/host/src/input-helper.js +0 -564
  133. package/dist/host/src/input-helper.js.map +0 -1
  134. package/dist/shared-protocol/src/index.d.ts +0 -17029
  135. package/dist/shared-protocol/src/index.js +0 -1064
  136. package/dist/shared-protocol/src/index.js.map +0 -1
  137. package/scripts/copy-web.mjs +0 -34
  138. package/src/config.ts +0 -36
  139. package/src/machine-id.ts +0 -61
  140. package/src/providers.ts +0 -97
  141. package/src/runtime/acp/acp-client.ts +0 -521
  142. package/src/runtime/acp/agent-process-discovery.ts +0 -308
  143. package/src/runtime/acp/agent-session.ts +0 -1186
  144. package/src/runtime/acp/agent-workspace.ts +0 -6590
  145. package/src/runtime/acp/claude-sdk-client.ts +0 -1221
  146. package/src/runtime/acp/claude-stream-json-client.ts +0 -633
  147. package/src/runtime/acp/json-rpc.ts +0 -184
  148. package/src/runtime/acp/provider-resolver.ts +0 -154
  149. package/src/runtime/bridge-session.ts +0 -1549
  150. package/src/runtime/hook-command.ts +0 -73
  151. package/src/runtime/screen-fallback.ts +0 -235
  152. package/src/runtime/screen-share.ts +0 -426
  153. package/src/runtime/scrollback.ts +0 -43
  154. package/src/runtime/usage-report.ts +0 -342
  155. package/src/utils/keep-awake.ts +0 -61
  156. package/src/utils/lan-ip.ts +0 -61
  157. package/web/assets/FileBrowser-wOAfY-xj.js +0 -2
  158. package/web/assets/PortPreview-Cbvv7yzA.js +0 -2
  159. package/web/assets/TerminalPanel-CTSklkct.js +0 -1
  160. package/web/assets/UsageDashboard-CJ1AsNmd.js +0 -1
  161. package/web/assets/index-BsnDaeCt.css +0 -33
  162. package/web/assets/index-q85psYZ5.js +0 -36
  163. package/web/assets/vendor-highlight-NXWAAyIv.js +0 -5
  164. package/web/assets/vendor-react-M7xG3qiw.js +0 -49
  165. package/web/assets/vendor-xterm-D15THcI4.js +0 -9
  166. package/web/index.html +0 -37
  167. package/web/logos/claude.png +0 -0
  168. package/web/logos/codex.png +0 -0
  169. package/web/logos/copilot.png +0 -0
  170. package/web/logos/gemini.png +0 -0
  171. package/web/logos/linkshell-1024.png +0 -0
  172. package/web/logos/linkshell-splash.png +0 -0
  173. 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;