cli-link 0.0.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 (34) hide show
  1. package/README.md +271 -0
  2. package/bin/agentpilot.js +239 -0
  3. package/dist/client/assets/History-DR_K6WbO.js +3 -0
  4. package/dist/client/assets/MarkdownRenderer-D9IwexPM.js +1 -0
  5. package/dist/client/assets/PageTopBar-SnTIrSb5.js +1 -0
  6. package/dist/client/assets/Session-EFYFIC_X.js +11 -0
  7. package/dist/client/assets/Settings-DgmHC_Hw.js +1 -0
  8. package/dist/client/assets/Workspace-CJvVQVzU.js +8 -0
  9. package/dist/client/assets/WorkspaceLinkedText-D6hNg0T9.js +2 -0
  10. package/dist/client/assets/code-highlight-CEcsuMpw.js +1 -0
  11. package/dist/client/assets/index-Bk4_acsd.css +1 -0
  12. package/dist/client/assets/index-C89UCwGk.js +2 -0
  13. package/dist/client/assets/vendor-icons-S_ObYVVf.js +331 -0
  14. package/dist/client/assets/vendor-markdown-BDwu-Ux6.js +35 -0
  15. package/dist/client/assets/vendor-motion-n6Lx6G4a.js +9 -0
  16. package/dist/client/assets/vendor-react-DSV5aFEg.js +67 -0
  17. package/dist/client/assets/vendor-virtual-CcftJrIC.js +4 -0
  18. package/dist/client/favicon.svg +18 -0
  19. package/dist/client/icons/apple-touch-icon.png +0 -0
  20. package/dist/client/icons/icon-192.png +0 -0
  21. package/dist/client/icons/icon-512.png +0 -0
  22. package/dist/client/index.html +34 -0
  23. package/dist/client/manifest.webmanifest +59 -0
  24. package/dist/client/sw.js +143 -0
  25. package/dist/client//344/273/243/347/240/201/351/241/265/351/235/242.png +0 -0
  26. package/dist/client//345/216/206/345/217/262/350/256/260/345/275/225.png +0 -0
  27. package/dist/client//345/257/271/350/257/235/351/241/265/351/235/242.png +0 -0
  28. package/dist/client//350/256/276/347/275/256/351/241/265/351/235/242.png +0 -0
  29. package/dist/server/cli-manager.js +1532 -0
  30. package/dist/server/codex-history.js +280 -0
  31. package/dist/server/index.js +2097 -0
  32. package/dist/server/store.js +594 -0
  33. package/dist/server/terminal-qr.js +317 -0
  34. package/package.json +71 -0
@@ -0,0 +1,317 @@
1
+ const QR_TOTAL_CODEWORDS = [0, 26, 44, 70, 100, 134, 172];
2
+ const QR_EC_CODEWORDS_PER_BLOCK_M = [0, 10, 16, 26, 18, 24, 16];
3
+ const QR_NUM_ERROR_CORRECTION_BLOCKS_M = [0, 1, 1, 1, 2, 2, 4];
4
+ const QR_ALIGNMENT_POSITIONS = [
5
+ [],
6
+ [],
7
+ [6, 18],
8
+ [6, 22],
9
+ [6, 26],
10
+ [6, 30],
11
+ [6, 34],
12
+ ];
13
+ class BitBuffer {
14
+ bits = [];
15
+ append(value, length) {
16
+ for (let i = length - 1; i >= 0; i -= 1) {
17
+ this.bits.push((value >>> i) & 1);
18
+ }
19
+ }
20
+ toBytes() {
21
+ const bytes = [];
22
+ for (let i = 0; i < this.bits.length; i += 8) {
23
+ let value = 0;
24
+ for (let j = 0; j < 8; j += 1) {
25
+ value = (value << 1) | (this.bits[i + j] || 0);
26
+ }
27
+ bytes.push(value);
28
+ }
29
+ return bytes;
30
+ }
31
+ }
32
+ function getQrDataCodewordCount(version) {
33
+ return QR_TOTAL_CODEWORDS[version] - QR_EC_CODEWORDS_PER_BLOCK_M[version] * QR_NUM_ERROR_CORRECTION_BLOCKS_M[version];
34
+ }
35
+ function selectQrVersion(data) {
36
+ for (let version = 1; version < QR_TOTAL_CODEWORDS.length; version += 1) {
37
+ const capacityBits = getQrDataCodewordCount(version) * 8;
38
+ if (4 + 8 + data.length * 8 <= capacityBits)
39
+ return version;
40
+ }
41
+ return null;
42
+ }
43
+ function qrMultiply(x, y) {
44
+ let z = 0;
45
+ for (let i = 7; i >= 0; i -= 1) {
46
+ z = (z << 1) ^ ((z >>> 7) * 0x11d);
47
+ z ^= ((y >>> i) & 1) * x;
48
+ }
49
+ return z;
50
+ }
51
+ function qrReedSolomonDivisor(degree) {
52
+ const result = Array(degree).fill(0);
53
+ result[degree - 1] = 1;
54
+ let root = 1;
55
+ for (let i = 0; i < degree; i += 1) {
56
+ for (let j = 0; j < result.length; j += 1) {
57
+ result[j] = qrMultiply(result[j], root);
58
+ if (j + 1 < result.length)
59
+ result[j] ^= result[j + 1];
60
+ }
61
+ root = qrMultiply(root, 0x02);
62
+ }
63
+ return result;
64
+ }
65
+ function qrReedSolomonRemainder(data, divisor) {
66
+ const result = Array(divisor.length).fill(0);
67
+ for (const byte of data) {
68
+ const factor = byte ^ (result.shift() || 0);
69
+ result.push(0);
70
+ for (let i = 0; i < divisor.length; i += 1) {
71
+ result[i] ^= qrMultiply(divisor[i], factor);
72
+ }
73
+ }
74
+ return result;
75
+ }
76
+ function qrAddEccAndInterleave(dataCodewords, version) {
77
+ const numBlocks = QR_NUM_ERROR_CORRECTION_BLOCKS_M[version];
78
+ const blockEccLen = QR_EC_CODEWORDS_PER_BLOCK_M[version];
79
+ const rawCodewords = QR_TOTAL_CODEWORDS[version];
80
+ const numShortBlocks = numBlocks - (rawCodewords % numBlocks);
81
+ const shortBlockLen = Math.floor(rawCodewords / numBlocks);
82
+ const divisor = qrReedSolomonDivisor(blockEccLen);
83
+ const blocks = [];
84
+ for (let i = 0, offset = 0; i < numBlocks; i += 1) {
85
+ const dataLen = shortBlockLen - blockEccLen + (i < numShortBlocks ? 0 : 1);
86
+ const data = dataCodewords.slice(offset, offset + dataLen);
87
+ offset += dataLen;
88
+ const ecc = qrReedSolomonRemainder(data, divisor);
89
+ if (i < numShortBlocks)
90
+ data.push(0);
91
+ blocks.push(data.concat(ecc));
92
+ }
93
+ const result = [];
94
+ for (let i = 0; i < blocks[0].length; i += 1) {
95
+ for (let j = 0; j < blocks.length; j += 1) {
96
+ if (i !== shortBlockLen - blockEccLen || j >= numShortBlocks) {
97
+ result.push(blocks[j][i]);
98
+ }
99
+ }
100
+ }
101
+ return result;
102
+ }
103
+ function qrFormatBits(mask) {
104
+ const data = mask; // Error correction level M has format bits 00.
105
+ let rem = data;
106
+ for (let i = 0; i < 10; i += 1) {
107
+ rem = (rem << 1) ^ (((rem >>> 9) & 1) * 0x537);
108
+ }
109
+ return ((data << 10) | rem) ^ 0x5412;
110
+ }
111
+ function qrMask(mask, x, y) {
112
+ switch (mask) {
113
+ case 0: return (x + y) % 2 === 0;
114
+ case 1: return y % 2 === 0;
115
+ case 2: return x % 3 === 0;
116
+ case 3: return (x + y) % 3 === 0;
117
+ case 4: return (Math.floor(y / 2) + Math.floor(x / 3)) % 2 === 0;
118
+ case 5: return ((x * y) % 2) + ((x * y) % 3) === 0;
119
+ case 6: return (((x * y) % 2) + ((x * y) % 3)) % 2 === 0;
120
+ case 7: return (((x + y) % 2) + ((x * y) % 3)) % 2 === 0;
121
+ default: return false;
122
+ }
123
+ }
124
+ function createQrMatrix(text) {
125
+ const data = new TextEncoder().encode(text);
126
+ const version = selectQrVersion(data);
127
+ if (!version)
128
+ return null;
129
+ const dataCodewordCount = getQrDataCodewordCount(version);
130
+ const buffer = new BitBuffer();
131
+ buffer.append(0b0100, 4);
132
+ buffer.append(data.length, 8);
133
+ for (const byte of data)
134
+ buffer.append(byte, 8);
135
+ const capacityBits = dataCodewordCount * 8;
136
+ buffer.append(0, Math.min(4, capacityBits - buffer.bits.length));
137
+ while (buffer.bits.length % 8 !== 0)
138
+ buffer.append(0, 1);
139
+ const dataCodewords = buffer.toBytes();
140
+ for (let pad = 0xec; dataCodewords.length < dataCodewordCount; pad ^= 0xec ^ 0x11) {
141
+ dataCodewords.push(pad);
142
+ }
143
+ const codewords = qrAddEccAndInterleave(dataCodewords, version);
144
+ const size = version * 4 + 17;
145
+ const modules = Array.from({ length: size }, () => Array(size).fill(false));
146
+ const isFunction = Array.from({ length: size }, () => Array(size).fill(false));
147
+ const setFunction = (x, y, dark) => {
148
+ if (x < 0 || y < 0 || x >= size || y >= size)
149
+ return;
150
+ modules[y][x] = dark;
151
+ isFunction[y][x] = true;
152
+ };
153
+ const drawFinder = (cx, cy) => {
154
+ for (let dy = -4; dy <= 4; dy += 1) {
155
+ for (let dx = -4; dx <= 4; dx += 1) {
156
+ const dist = Math.max(Math.abs(dx), Math.abs(dy));
157
+ setFunction(cx + dx, cy + dy, dist !== 2 && dist !== 4);
158
+ }
159
+ }
160
+ };
161
+ const drawAlignment = (cx, cy) => {
162
+ for (let dy = -2; dy <= 2; dy += 1) {
163
+ for (let dx = -2; dx <= 2; dx += 1) {
164
+ setFunction(cx + dx, cy + dy, Math.max(Math.abs(dx), Math.abs(dy)) !== 1);
165
+ }
166
+ }
167
+ };
168
+ const drawFormat = (mask) => {
169
+ const bits = qrFormatBits(mask);
170
+ for (let i = 0; i <= 5; i += 1)
171
+ setFunction(8, i, ((bits >>> i) & 1) !== 0);
172
+ setFunction(8, 7, ((bits >>> 6) & 1) !== 0);
173
+ setFunction(8, 8, ((bits >>> 7) & 1) !== 0);
174
+ setFunction(7, 8, ((bits >>> 8) & 1) !== 0);
175
+ for (let i = 9; i < 15; i += 1)
176
+ setFunction(14 - i, 8, ((bits >>> i) & 1) !== 0);
177
+ for (let i = 0; i < 8; i += 1)
178
+ setFunction(size - 1 - i, 8, ((bits >>> i) & 1) !== 0);
179
+ for (let i = 8; i < 15; i += 1)
180
+ setFunction(8, size - 15 + i, ((bits >>> i) & 1) !== 0);
181
+ setFunction(8, size - 8, true);
182
+ };
183
+ drawFinder(3, 3);
184
+ drawFinder(size - 4, 3);
185
+ drawFinder(3, size - 4);
186
+ const alignment = QR_ALIGNMENT_POSITIONS[version];
187
+ for (const x of alignment) {
188
+ for (const y of alignment) {
189
+ if (isFunction[y]?.[x])
190
+ continue;
191
+ drawAlignment(x, y);
192
+ }
193
+ }
194
+ for (let i = 8; i < size - 8; i += 1) {
195
+ setFunction(6, i, i % 2 === 0);
196
+ setFunction(i, 6, i % 2 === 0);
197
+ }
198
+ drawFormat(0);
199
+ let bitIndex = 0;
200
+ for (let right = size - 1; right >= 1; right -= 2) {
201
+ if (right === 6)
202
+ right -= 1;
203
+ for (let vert = 0; vert < size; vert += 1) {
204
+ const y = ((right + 1) & 2) === 0 ? size - 1 - vert : vert;
205
+ for (let j = 0; j < 2; j += 1) {
206
+ const x = right - j;
207
+ if (isFunction[y][x])
208
+ continue;
209
+ modules[y][x] = ((codewords[Math.floor(bitIndex / 8)] >>> (7 - (bitIndex % 8))) & 1) !== 0;
210
+ bitIndex += 1;
211
+ }
212
+ }
213
+ }
214
+ let bestMask = 0;
215
+ let bestPenalty = Infinity;
216
+ for (let mask = 0; mask < 8; mask += 1) {
217
+ const penalty = scoreQrMask(modules, isFunction, mask);
218
+ if (penalty < bestPenalty) {
219
+ bestMask = mask;
220
+ bestPenalty = penalty;
221
+ }
222
+ }
223
+ for (let y = 0; y < size; y += 1) {
224
+ for (let x = 0; x < size; x += 1) {
225
+ if (!isFunction[y][x] && qrMask(bestMask, x, y))
226
+ modules[y][x] = !modules[y][x];
227
+ }
228
+ }
229
+ drawFormat(bestMask);
230
+ return modules;
231
+ }
232
+ function scoreQrMask(modules, isFunction, mask) {
233
+ const size = modules.length;
234
+ const get = (x, y) => modules[y][x] !== (!isFunction[y][x] && qrMask(mask, x, y));
235
+ let penalty = 0;
236
+ for (let y = 0; y < size; y += 1) {
237
+ let runColor = get(0, y);
238
+ let runLen = 1;
239
+ for (let x = 1; x < size; x += 1) {
240
+ const color = get(x, y);
241
+ if (color === runColor) {
242
+ runLen += 1;
243
+ if (runLen === 5)
244
+ penalty += 3;
245
+ else if (runLen > 5)
246
+ penalty += 1;
247
+ }
248
+ else {
249
+ runColor = color;
250
+ runLen = 1;
251
+ }
252
+ }
253
+ }
254
+ for (let x = 0; x < size; x += 1) {
255
+ let runColor = get(x, 0);
256
+ let runLen = 1;
257
+ for (let y = 1; y < size; y += 1) {
258
+ const color = get(x, y);
259
+ if (color === runColor) {
260
+ runLen += 1;
261
+ if (runLen === 5)
262
+ penalty += 3;
263
+ else if (runLen > 5)
264
+ penalty += 1;
265
+ }
266
+ else {
267
+ runColor = color;
268
+ runLen = 1;
269
+ }
270
+ }
271
+ }
272
+ let dark = 0;
273
+ for (let y = 0; y < size; y += 1) {
274
+ for (let x = 0; x < size; x += 1) {
275
+ if (get(x, y))
276
+ dark += 1;
277
+ if (x + 1 < size && y + 1 < size) {
278
+ const color = get(x, y);
279
+ if (color === get(x + 1, y) && color === get(x, y + 1) && color === get(x + 1, y + 1)) {
280
+ penalty += 3;
281
+ }
282
+ }
283
+ }
284
+ }
285
+ const total = size * size;
286
+ penalty += Math.floor(Math.abs(dark * 20 - total * 10) / total) * 10;
287
+ return penalty;
288
+ }
289
+ export function renderTerminalQr(text, options = {}) {
290
+ const modules = createQrMatrix(text);
291
+ if (!modules)
292
+ return null;
293
+ const size = modules.length;
294
+ const quiet = 2;
295
+ const lines = [];
296
+ if (options.color === false) {
297
+ for (let y = -quiet; y < size + quiet; y += 1) {
298
+ let line = '';
299
+ for (let x = -quiet; x < size + quiet; x += 1) {
300
+ const dark = x >= 0 && x < size && y >= 0 && y < size && modules[y][x];
301
+ line += dark ? '██' : ' ';
302
+ }
303
+ lines.push(line);
304
+ }
305
+ return lines.join('\n');
306
+ }
307
+ for (let y = -quiet; y < size + quiet; y += 2) {
308
+ let line = '\x1b[30;47m';
309
+ for (let x = -quiet; x < size + quiet; x += 1) {
310
+ const top = x >= 0 && x < size && y >= 0 && y < size && modules[y][x];
311
+ const bottom = x >= 0 && x < size && y + 1 >= 0 && y + 1 < size && modules[y + 1][x];
312
+ line += top && bottom ? '█' : top ? '▀' : bottom ? '▄' : ' ';
313
+ }
314
+ lines.push(`${line}\x1b[0m`);
315
+ }
316
+ return lines.join('\n');
317
+ }
package/package.json ADDED
@@ -0,0 +1,71 @@
1
+ {
2
+ "name": "cli-link",
3
+ "version": "0.0.1",
4
+ "type": "module",
5
+ "bin": {
6
+ "cli-link": "bin/agentpilot.js"
7
+ },
8
+ "files": [
9
+ "bin/",
10
+ "dist/",
11
+ "README.md",
12
+ "package.json"
13
+ ],
14
+ "packageManager": "pnpm@10.32.1",
15
+ "engines": {
16
+ "node": ">=20.0.0"
17
+ },
18
+ "scripts": {
19
+ "dev": "vite",
20
+ "dev:server": "caffeinate -i tsx watch server/index.ts < /dev/null",
21
+ "dev:all": "concurrently \"pnpm dev\" \"pnpm dev:server\"",
22
+ "clean": "node scripts/clean-dist.js",
23
+ "build": "pnpm clean && pnpm build:client && pnpm build:server",
24
+ "build:client": "tsc && vite build",
25
+ "build:server": "tsc -p tsconfig.server.json",
26
+ "preview": "vite preview",
27
+ "start": "caffeinate -i tsx server/index.ts",
28
+ "serve": "node bin/agentpilot.js",
29
+ "prepack": "pnpm build",
30
+ "publish:dry-run": "npm publish --dry-run --registry=https://registry.npmjs.org --access public",
31
+ "publish:public": "npm publish --registry=https://registry.npmjs.org --access public"
32
+ },
33
+ "dependencies": {
34
+ "better-sqlite3": "^12.9.0",
35
+ "ws": "^8.16.0"
36
+ },
37
+ "pnpm": {
38
+ "onlyBuiltDependencies": [
39
+ "better-sqlite3",
40
+ "node-pty"
41
+ ]
42
+ },
43
+ "devDependencies": {
44
+ "@homebridge/node-pty-prebuilt-multiarch": "^0.13.1",
45
+ "@tanstack/react-virtual": "^3.13.23",
46
+ "@types/better-sqlite3": "^7.6.13",
47
+ "@types/node": "^25.6.0",
48
+ "@types/react": "^18.2.0",
49
+ "@types/react-dom": "^18.2.0",
50
+ "@types/ws": "^8.5.10",
51
+ "@vitejs/plugin-react": "^4.2.0",
52
+ "autoprefixer": "^10.4.19",
53
+ "clsx": "2.1.1",
54
+ "concurrently": "^8.2.0",
55
+ "framer-motion": "11.1.7",
56
+ "lucide-react": "0.378.0",
57
+ "node-pty": "^1.1.0",
58
+ "postcss": "^8.4.38",
59
+ "react": "18.2.0",
60
+ "react-dom": "18.2.0",
61
+ "react-markdown": "^9.0.1",
62
+ "react-router-dom": "6.23.0",
63
+ "rehype-highlight": "^7.0.2",
64
+ "remark-gfm": "^4.0.0",
65
+ "tailwindcss": "^3.4.3",
66
+ "tailwind-merge": "2.3.0",
67
+ "tsx": "^4.7.0",
68
+ "typescript": "^5.4.0",
69
+ "vite": "^5.2.0"
70
+ }
71
+ }