@vkenliu/adit-cloud 0.2.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 (98) hide show
  1. package/LICENSE +21 -0
  2. package/dist/auth/credentials.d.ts +62 -0
  3. package/dist/auth/credentials.d.ts.map +1 -0
  4. package/dist/auth/credentials.js +151 -0
  5. package/dist/auth/credentials.js.map +1 -0
  6. package/dist/auth/device-auth.d.ts +40 -0
  7. package/dist/auth/device-auth.d.ts.map +1 -0
  8. package/dist/auth/device-auth.js +84 -0
  9. package/dist/auth/device-auth.js.map +1 -0
  10. package/dist/config.d.ts +48 -0
  11. package/dist/config.d.ts.map +1 -0
  12. package/dist/config.js +80 -0
  13. package/dist/config.js.map +1 -0
  14. package/dist/http/client.d.ts +28 -0
  15. package/dist/http/client.d.ts.map +1 -0
  16. package/dist/http/client.js +229 -0
  17. package/dist/http/client.js.map +1 -0
  18. package/dist/http/errors.d.ts +19 -0
  19. package/dist/http/errors.d.ts.map +1 -0
  20. package/dist/http/errors.js +31 -0
  21. package/dist/http/errors.js.map +1 -0
  22. package/dist/index.d.ts +20 -0
  23. package/dist/index.d.ts.map +1 -0
  24. package/dist/index.js +25 -0
  25. package/dist/index.js.map +1 -0
  26. package/dist/project-link/auto-link.d.ts +30 -0
  27. package/dist/project-link/auto-link.d.ts.map +1 -0
  28. package/dist/project-link/auto-link.js +91 -0
  29. package/dist/project-link/auto-link.js.map +1 -0
  30. package/dist/project-link/bulk-task.d.ts +15 -0
  31. package/dist/project-link/bulk-task.d.ts.map +1 -0
  32. package/dist/project-link/bulk-task.js +107 -0
  33. package/dist/project-link/bulk-task.js.map +1 -0
  34. package/dist/project-link/cache.d.ts +22 -0
  35. package/dist/project-link/cache.d.ts.map +1 -0
  36. package/dist/project-link/cache.js +82 -0
  37. package/dist/project-link/cache.js.map +1 -0
  38. package/dist/project-link/doc-discovery.d.ts +35 -0
  39. package/dist/project-link/doc-discovery.d.ts.map +1 -0
  40. package/dist/project-link/doc-discovery.js +260 -0
  41. package/dist/project-link/doc-discovery.js.map +1 -0
  42. package/dist/project-link/git-collector.d.ts +88 -0
  43. package/dist/project-link/git-collector.d.ts.map +1 -0
  44. package/dist/project-link/git-collector.js +250 -0
  45. package/dist/project-link/git-collector.js.map +1 -0
  46. package/dist/project-link/index.d.ts +15 -0
  47. package/dist/project-link/index.d.ts.map +1 -0
  48. package/dist/project-link/index.js +20 -0
  49. package/dist/project-link/index.js.map +1 -0
  50. package/dist/project-link/intent-command.d.ts +23 -0
  51. package/dist/project-link/intent-command.d.ts.map +1 -0
  52. package/dist/project-link/intent-command.js +104 -0
  53. package/dist/project-link/intent-command.js.map +1 -0
  54. package/dist/project-link/link-command.d.ts +26 -0
  55. package/dist/project-link/link-command.d.ts.map +1 -0
  56. package/dist/project-link/link-command.js +350 -0
  57. package/dist/project-link/link-command.js.map +1 -0
  58. package/dist/project-link/qualify.d.ts +25 -0
  59. package/dist/project-link/qualify.d.ts.map +1 -0
  60. package/dist/project-link/qualify.js +45 -0
  61. package/dist/project-link/qualify.js.map +1 -0
  62. package/dist/project-link/types.d.ts +254 -0
  63. package/dist/project-link/types.d.ts.map +1 -0
  64. package/dist/project-link/types.js +8 -0
  65. package/dist/project-link/types.js.map +1 -0
  66. package/dist/sync/auto-sync.d.ts +42 -0
  67. package/dist/sync/auto-sync.d.ts.map +1 -0
  68. package/dist/sync/auto-sync.js +136 -0
  69. package/dist/sync/auto-sync.js.map +1 -0
  70. package/dist/sync/conflicts.d.ts +27 -0
  71. package/dist/sync/conflicts.d.ts.map +1 -0
  72. package/dist/sync/conflicts.js +28 -0
  73. package/dist/sync/conflicts.js.map +1 -0
  74. package/dist/sync/engine.d.ts +76 -0
  75. package/dist/sync/engine.d.ts.map +1 -0
  76. package/dist/sync/engine.js +152 -0
  77. package/dist/sync/engine.js.map +1 -0
  78. package/dist/sync/serializer.d.ts +123 -0
  79. package/dist/sync/serializer.d.ts.map +1 -0
  80. package/dist/sync/serializer.js +280 -0
  81. package/dist/sync/serializer.js.map +1 -0
  82. package/dist/transcript/auto-upload.d.ts +25 -0
  83. package/dist/transcript/auto-upload.d.ts.map +1 -0
  84. package/dist/transcript/auto-upload.js +75 -0
  85. package/dist/transcript/auto-upload.js.map +1 -0
  86. package/dist/transcript/index.d.ts +4 -0
  87. package/dist/transcript/index.d.ts.map +1 -0
  88. package/dist/transcript/index.js +4 -0
  89. package/dist/transcript/index.js.map +1 -0
  90. package/dist/transcript/manager.d.ts +63 -0
  91. package/dist/transcript/manager.d.ts.map +1 -0
  92. package/dist/transcript/manager.js +143 -0
  93. package/dist/transcript/manager.js.map +1 -0
  94. package/dist/transcript/uploader.d.ts +135 -0
  95. package/dist/transcript/uploader.d.ts.map +1 -0
  96. package/dist/transcript/uploader.js +235 -0
  97. package/dist/transcript/uploader.js.map +1 -0
  98. package/package.json +29 -0
@@ -0,0 +1,235 @@
1
+ /**
2
+ * Transcript incremental uploader.
3
+ *
4
+ * Reads a JSONL transcript file, detects new data since the last upload,
5
+ * compresses the increment with gzip, and uploads it to the server.
6
+ *
7
+ * Key design decisions:
8
+ * - Increments are split on newline boundaries to preserve JSONL format
9
+ * - Gzip compression reduces bandwidth for large transcripts
10
+ * - Server returns a version token for conflict detection
11
+ * - Server can signal "resync" to request a full re-upload
12
+ * - Max 3 consecutive failures per file before giving up
13
+ *
14
+ * The upload API is generic (/api/sync/upload) and uses `type` + `cli`
15
+ * fields so the server can handle different file types from different
16
+ * AI coding tools (Claude Code, Cursor, Windsurf, etc.).
17
+ */
18
+ import { statSync, existsSync, openSync, readSync, closeSync } from "node:fs";
19
+ import { createGzip } from "node:zlib";
20
+ import { Readable } from "node:stream";
21
+ import { CloudApiError } from "../http/errors.js";
22
+ // ── File reading ─────────────────────────────────────────────────────────
23
+ /**
24
+ * Read the increment from a transcript file starting at the given
25
+ * byte offset, snapping to the nearest complete line boundary.
26
+ *
27
+ * Returns the raw bytes of complete JSONL lines after the offset.
28
+ * If no complete new lines exist, returns null.
29
+ */
30
+ export function readIncrement(filePath, offsetBytes) {
31
+ if (!existsSync(filePath))
32
+ return null;
33
+ const stat = statSync(filePath);
34
+ if (stat.size <= offsetBytes)
35
+ return null;
36
+ // Read from the offset to end of file
37
+ const fd = openSync(filePath, "r");
38
+ try {
39
+ const remainingSize = stat.size - offsetBytes;
40
+ const buf = Buffer.alloc(remainingSize);
41
+ readSync(fd, buf, 0, remainingSize, offsetBytes);
42
+ // Find the last newline to ensure we only send complete lines.
43
+ // JSONL files have one JSON object per line, terminated by \n.
44
+ let endPos = remainingSize;
45
+ if (buf[endPos - 1] !== 0x0a) {
46
+ // Last byte is not a newline — find the last complete line
47
+ const lastNewline = buf.lastIndexOf(0x0a);
48
+ if (lastNewline === -1) {
49
+ // No complete line in the new data yet
50
+ return null;
51
+ }
52
+ endPos = lastNewline + 1;
53
+ }
54
+ const data = buf.subarray(0, endPos);
55
+ return {
56
+ data: Buffer.from(data), // Copy to avoid holding the full buffer
57
+ newOffset: offsetBytes + endPos,
58
+ };
59
+ }
60
+ finally {
61
+ closeSync(fd);
62
+ }
63
+ }
64
+ // ── Compression ──────────────────────────────────────────────────────────
65
+ /**
66
+ * Compress a buffer with gzip.
67
+ */
68
+ export async function compressGzip(data) {
69
+ return new Promise((resolve, reject) => {
70
+ const chunks = [];
71
+ const gzip = createGzip({ level: 6 });
72
+ const input = Readable.from(data);
73
+ input
74
+ .pipe(gzip)
75
+ .on("data", (chunk) => chunks.push(chunk))
76
+ .on("end", () => resolve(Buffer.concat(chunks)))
77
+ .on("error", reject);
78
+ });
79
+ }
80
+ // ── Upload ───────────────────────────────────────────────────────────────
81
+ /**
82
+ * Upload an incremental chunk to the server.
83
+ *
84
+ * Posts to `/api/sync/upload` with `type` and `cli` fields so the server
85
+ * can route to the correct handler regardless of which CLI/file-type
86
+ * produced the data.
87
+ *
88
+ * The chunk is gzip-compressed before sending. The server responds
89
+ * with the confirmed byte offset and a version token.
90
+ *
91
+ * If the server returns a 409 with resyncRequired=true, the caller
92
+ * should reset the upload state and re-upload from offset 0.
93
+ */
94
+ export async function uploadChunk(client, params) {
95
+ const increment = readIncrement(params.filePath, params.offsetBytes);
96
+ if (!increment) {
97
+ // No new data — return current state
98
+ return {
99
+ uploadId: "",
100
+ confirmedOffset: params.offsetBytes,
101
+ serverVersion: params.serverVersion ?? "",
102
+ resyncRequired: false,
103
+ };
104
+ }
105
+ // Compress the increment
106
+ const compressed = await compressGzip(increment.data);
107
+ // Build the upload payload
108
+ const payload = {
109
+ type: params.type,
110
+ cli: params.cli,
111
+ sessionId: params.sessionId,
112
+ filePath: params.filePath,
113
+ offsetBytes: params.offsetBytes,
114
+ newOffsetBytes: increment.newOffset,
115
+ fileSizeBytes: params.fileSizeBytes,
116
+ serverVersion: params.serverVersion,
117
+ encoding: "gzip",
118
+ // Base64-encode the compressed data for JSON transport
119
+ data: compressed.toString("base64"),
120
+ rawBytes: increment.data.length,
121
+ compressedBytes: compressed.length,
122
+ };
123
+ try {
124
+ return await client.post("/api/sync/upload", payload);
125
+ }
126
+ catch (error) {
127
+ if (error instanceof CloudApiError && error.status === 409) {
128
+ // Server detected corruption — needs full re-upload
129
+ const body = error.body;
130
+ if (body?.resyncRequired) {
131
+ return {
132
+ uploadId: "",
133
+ confirmedOffset: 0,
134
+ serverVersion: "",
135
+ resyncRequired: true,
136
+ };
137
+ }
138
+ }
139
+ throw error;
140
+ }
141
+ }
142
+ /**
143
+ * Upload the full file from offset 0.
144
+ * Used for initial upload or when server requests a resync.
145
+ */
146
+ export async function uploadFull(client, params) {
147
+ return uploadChunk(client, {
148
+ ...params,
149
+ offsetBytes: 0,
150
+ serverVersion: null, // Reset server version on full upload
151
+ });
152
+ }
153
+ // ── Status check ─────────────────────────────────────────────────────────
154
+ /**
155
+ * Check upload status via HEAD /api/sync/upload/{uploadId}.
156
+ *
157
+ * All status is returned in standard HTTP headers — no JSON body.
158
+ * This is the only status check method; there is no GET-by-ID endpoint.
159
+ *
160
+ * Header mapping:
161
+ * X-Upload-Id → uploadId
162
+ * X-Confirmed-Offset → confirmedOffset
163
+ * ETag → serverVersion
164
+ * X-Upload-Type → type
165
+ * X-Upload-Cli → cli
166
+ * Content-Length → totalStoredBytes
167
+ * Last-Modified → lastModified
168
+ *
169
+ * Returns null if the upload is not found (404).
170
+ */
171
+ export async function checkUploadStatus(client, uploadId) {
172
+ try {
173
+ const h = await client.head(`/api/sync/upload/${encodeURIComponent(uploadId)}`);
174
+ return parseStatusHeaders(h);
175
+ }
176
+ catch (error) {
177
+ if (error instanceof CloudApiError && error.status === 404) {
178
+ return null;
179
+ }
180
+ throw error;
181
+ }
182
+ }
183
+ /**
184
+ * Look up an upload by its original file path.
185
+ *
186
+ * Uses GET /api/sync/upload?lookup=by-path&type=...&cli=...&...
187
+ * The response has no JSON body — status comes from headers only,
188
+ * same as HEAD.
189
+ *
190
+ * Returns null if not found (404).
191
+ */
192
+ export async function lookupUploadByPath(client, params) {
193
+ const qs = new URLSearchParams({
194
+ lookup: "by-path",
195
+ type: params.type,
196
+ cli: params.cli,
197
+ sessionId: params.sessionId,
198
+ filePath: params.filePath,
199
+ });
200
+ try {
201
+ // We use head() here because the GET response also has no JSON body —
202
+ // it returns the same headers. The server treats GET and HEAD
203
+ // identically for this lookup route (both return headers-only).
204
+ const h = await client.head(`/api/sync/upload?${qs.toString()}`);
205
+ return parseStatusHeaders(h);
206
+ }
207
+ catch (error) {
208
+ if (error instanceof CloudApiError && error.status === 404) {
209
+ return null;
210
+ }
211
+ throw error;
212
+ }
213
+ }
214
+ /** Parse upload status from HTTP response headers. */
215
+ function parseStatusHeaders(h) {
216
+ return {
217
+ uploadId: h["x-upload-id"] ?? "",
218
+ confirmedOffset: parseInt(h["x-confirmed-offset"] ?? "0", 10),
219
+ serverVersion: h["etag"] ?? "",
220
+ type: h["x-upload-type"] ?? "",
221
+ cli: h["x-upload-cli"] ?? "",
222
+ totalStoredBytes: parseInt(h["content-length"] ?? "0", 10),
223
+ lastModified: h["last-modified"] ?? null,
224
+ };
225
+ }
226
+ // ── Utilities ────────────────────────────────────────────────────────────
227
+ /**
228
+ * Get the current file size, or 0 if the file doesn't exist.
229
+ */
230
+ export function getFileSize(filePath) {
231
+ if (!existsSync(filePath))
232
+ return 0;
233
+ return statSync(filePath).size;
234
+ }
235
+ //# sourceMappingURL=uploader.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"uploader.js","sourceRoot":"","sources":["../../src/transcript/uploader.ts"],"names":[],"mappings":"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"}
package/package.json ADDED
@@ -0,0 +1,29 @@
1
+ {
2
+ "name": "@vkenliu/adit-cloud",
3
+ "version": "0.2.0",
4
+ "description": "Cloud sync client for ADIT — device auth, incremental push, conflict resolution",
5
+ "type": "module",
6
+ "files": [
7
+ "dist"
8
+ ],
9
+ "main": "./dist/index.js",
10
+ "types": "./dist/index.d.ts",
11
+ "exports": {
12
+ ".": {
13
+ "types": "./dist/index.d.ts",
14
+ "import": "./dist/index.js"
15
+ }
16
+ },
17
+ "dependencies": {
18
+ "@vkenliu/adit-core": "0.2.0",
19
+ "@vkenliu/adit-engine": "0.2.0"
20
+ },
21
+ "devDependencies": {
22
+ "@types/better-sqlite3": "^7.6.13",
23
+ "typescript": "^5.7.2"
24
+ },
25
+ "scripts": {
26
+ "build": "tsc",
27
+ "typecheck": "tsc --noEmit"
28
+ }
29
+ }