@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.
- package/LICENSE +21 -0
- package/dist/auth/credentials.d.ts +62 -0
- package/dist/auth/credentials.d.ts.map +1 -0
- package/dist/auth/credentials.js +151 -0
- package/dist/auth/credentials.js.map +1 -0
- package/dist/auth/device-auth.d.ts +40 -0
- package/dist/auth/device-auth.d.ts.map +1 -0
- package/dist/auth/device-auth.js +84 -0
- package/dist/auth/device-auth.js.map +1 -0
- package/dist/config.d.ts +48 -0
- package/dist/config.d.ts.map +1 -0
- package/dist/config.js +80 -0
- package/dist/config.js.map +1 -0
- package/dist/http/client.d.ts +28 -0
- package/dist/http/client.d.ts.map +1 -0
- package/dist/http/client.js +229 -0
- package/dist/http/client.js.map +1 -0
- package/dist/http/errors.d.ts +19 -0
- package/dist/http/errors.d.ts.map +1 -0
- package/dist/http/errors.js +31 -0
- package/dist/http/errors.js.map +1 -0
- package/dist/index.d.ts +20 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +25 -0
- package/dist/index.js.map +1 -0
- package/dist/project-link/auto-link.d.ts +30 -0
- package/dist/project-link/auto-link.d.ts.map +1 -0
- package/dist/project-link/auto-link.js +91 -0
- package/dist/project-link/auto-link.js.map +1 -0
- package/dist/project-link/bulk-task.d.ts +15 -0
- package/dist/project-link/bulk-task.d.ts.map +1 -0
- package/dist/project-link/bulk-task.js +107 -0
- package/dist/project-link/bulk-task.js.map +1 -0
- package/dist/project-link/cache.d.ts +22 -0
- package/dist/project-link/cache.d.ts.map +1 -0
- package/dist/project-link/cache.js +82 -0
- package/dist/project-link/cache.js.map +1 -0
- package/dist/project-link/doc-discovery.d.ts +35 -0
- package/dist/project-link/doc-discovery.d.ts.map +1 -0
- package/dist/project-link/doc-discovery.js +260 -0
- package/dist/project-link/doc-discovery.js.map +1 -0
- package/dist/project-link/git-collector.d.ts +88 -0
- package/dist/project-link/git-collector.d.ts.map +1 -0
- package/dist/project-link/git-collector.js +250 -0
- package/dist/project-link/git-collector.js.map +1 -0
- package/dist/project-link/index.d.ts +15 -0
- package/dist/project-link/index.d.ts.map +1 -0
- package/dist/project-link/index.js +20 -0
- package/dist/project-link/index.js.map +1 -0
- package/dist/project-link/intent-command.d.ts +23 -0
- package/dist/project-link/intent-command.d.ts.map +1 -0
- package/dist/project-link/intent-command.js +104 -0
- package/dist/project-link/intent-command.js.map +1 -0
- package/dist/project-link/link-command.d.ts +26 -0
- package/dist/project-link/link-command.d.ts.map +1 -0
- package/dist/project-link/link-command.js +350 -0
- package/dist/project-link/link-command.js.map +1 -0
- package/dist/project-link/qualify.d.ts +25 -0
- package/dist/project-link/qualify.d.ts.map +1 -0
- package/dist/project-link/qualify.js +45 -0
- package/dist/project-link/qualify.js.map +1 -0
- package/dist/project-link/types.d.ts +254 -0
- package/dist/project-link/types.d.ts.map +1 -0
- package/dist/project-link/types.js +8 -0
- package/dist/project-link/types.js.map +1 -0
- package/dist/sync/auto-sync.d.ts +42 -0
- package/dist/sync/auto-sync.d.ts.map +1 -0
- package/dist/sync/auto-sync.js +136 -0
- package/dist/sync/auto-sync.js.map +1 -0
- package/dist/sync/conflicts.d.ts +27 -0
- package/dist/sync/conflicts.d.ts.map +1 -0
- package/dist/sync/conflicts.js +28 -0
- package/dist/sync/conflicts.js.map +1 -0
- package/dist/sync/engine.d.ts +76 -0
- package/dist/sync/engine.d.ts.map +1 -0
- package/dist/sync/engine.js +152 -0
- package/dist/sync/engine.js.map +1 -0
- package/dist/sync/serializer.d.ts +123 -0
- package/dist/sync/serializer.d.ts.map +1 -0
- package/dist/sync/serializer.js +280 -0
- package/dist/sync/serializer.js.map +1 -0
- package/dist/transcript/auto-upload.d.ts +25 -0
- package/dist/transcript/auto-upload.d.ts.map +1 -0
- package/dist/transcript/auto-upload.js +75 -0
- package/dist/transcript/auto-upload.js.map +1 -0
- package/dist/transcript/index.d.ts +4 -0
- package/dist/transcript/index.d.ts.map +1 -0
- package/dist/transcript/index.js +4 -0
- package/dist/transcript/index.js.map +1 -0
- package/dist/transcript/manager.d.ts +63 -0
- package/dist/transcript/manager.d.ts.map +1 -0
- package/dist/transcript/manager.js +143 -0
- package/dist/transcript/manager.js.map +1 -0
- package/dist/transcript/uploader.d.ts +135 -0
- package/dist/transcript/uploader.d.ts.map +1 -0
- package/dist/transcript/uploader.js +235 -0
- package/dist/transcript/uploader.js.map +1 -0
- 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
|
+
}
|