@de-otio/chaoskb-client 0.3.0 → 0.3.2
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/dist/cli/bootstrap.d.ts.map +1 -1
- package/dist/cli/bootstrap.js +20 -27
- package/dist/cli/bootstrap.js.map +1 -1
- package/dist/cli/commands/devices.d.ts.map +1 -1
- package/dist/cli/commands/devices.js +7 -70
- package/dist/cli/commands/devices.js.map +1 -1
- package/dist/cli/commands/notifications.d.ts.map +1 -1
- package/dist/cli/commands/notifications.js +1 -39
- package/dist/cli/commands/notifications.js.map +1 -1
- package/dist/cli/commands/projects.d.ts.map +1 -1
- package/dist/cli/commands/projects.js +9 -44
- package/dist/cli/commands/projects.js.map +1 -1
- package/dist/cli/commands/rotate-key.d.ts.map +1 -1
- package/dist/cli/commands/rotate-key.js +14 -32
- package/dist/cli/commands/rotate-key.js.map +1 -1
- package/dist/cli/commands/setup-sync.js +7 -15
- package/dist/cli/commands/setup-sync.js.map +1 -1
- package/dist/cli/mcp-server.d.ts +3 -0
- package/dist/cli/mcp-server.d.ts.map +1 -1
- package/dist/cli/mcp-server.js +21 -2
- package/dist/cli/mcp-server.js.map +1 -1
- package/dist/cli/tools/kb-delete.d.ts.map +1 -1
- package/dist/cli/tools/kb-delete.js +4 -6
- package/dist/cli/tools/kb-delete.js.map +1 -1
- package/dist/cli/tools/kb-ingest.d.ts.map +1 -1
- package/dist/cli/tools/kb-ingest.js +8 -5
- package/dist/cli/tools/kb-ingest.js.map +1 -1
- package/dist/cli/tools/sync-client.d.ts +3 -1
- package/dist/cli/tools/sync-client.d.ts.map +1 -1
- package/dist/cli/tools/sync-client.js +10 -30
- package/dist/cli/tools/sync-client.js.map +1 -1
- package/dist/storage/kb-database.d.ts +6 -1
- package/dist/storage/kb-database.d.ts.map +1 -1
- package/dist/storage/kb-database.js +18 -0
- package/dist/storage/kb-database.js.map +1 -1
- package/dist/storage/schema.d.ts +1 -1
- package/dist/storage/schema.d.ts.map +1 -1
- package/dist/storage/schema.js +153 -1
- package/dist/storage/schema.js.map +1 -1
- package/dist/storage/sync-queue-repo.d.ts +28 -0
- package/dist/storage/sync-queue-repo.d.ts.map +1 -0
- package/dist/storage/sync-queue-repo.js +107 -0
- package/dist/storage/sync-queue-repo.js.map +1 -0
- package/dist/storage/sync-sequence-repo.d.ts +17 -0
- package/dist/storage/sync-sequence-repo.d.ts.map +1 -0
- package/dist/storage/sync-sequence-repo.js +24 -0
- package/dist/storage/sync-sequence-repo.js.map +1 -0
- package/dist/storage/sync-state-repo.d.ts +16 -0
- package/dist/storage/sync-state-repo.d.ts.map +1 -0
- package/dist/storage/sync-state-repo.js +25 -0
- package/dist/storage/sync-state-repo.js.map +1 -0
- package/dist/storage/types.d.ts +51 -0
- package/dist/storage/types.d.ts.map +1 -1
- package/dist/sync/client-factory.d.ts +21 -0
- package/dist/sync/client-factory.d.ts.map +1 -0
- package/dist/sync/client-factory.js +36 -0
- package/dist/sync/client-factory.js.map +1 -0
- package/dist/sync/http-client.d.ts +2 -2
- package/dist/sync/http-client.d.ts.map +1 -1
- package/dist/sync/http-client.js +9 -3
- package/dist/sync/http-client.js.map +1 -1
- package/dist/sync/index.d.ts +2 -0
- package/dist/sync/index.d.ts.map +1 -1
- package/dist/sync/index.js +2 -0
- package/dist/sync/index.js.map +1 -1
- package/dist/sync/queue-processor.d.ts +38 -0
- package/dist/sync/queue-processor.d.ts.map +1 -0
- package/dist/sync/queue-processor.js +96 -0
- package/dist/sync/queue-processor.js.map +1 -0
- package/dist/sync/ssh-signer.d.ts +6 -1
- package/dist/sync/ssh-signer.d.ts.map +1 -1
- package/dist/sync/ssh-signer.js +9 -2
- package/dist/sync/ssh-signer.js.map +1 -1
- package/dist/sync/sync-service.d.ts +18 -8
- package/dist/sync/sync-service.d.ts.map +1 -1
- package/dist/sync/sync-service.js +55 -43
- package/dist/sync/sync-service.js.map +1 -1
- package/dist/sync/types.d.ts +4 -0
- package/dist/sync/types.d.ts.map +1 -1
- package/package.json +3 -2
package/dist/sync/http-client.js
CHANGED
|
@@ -1,4 +1,3 @@
|
|
|
1
|
-
import { SequenceCounter } from './sequence.js';
|
|
2
1
|
/** Error that indicates the request can be retried after a delay. */
|
|
3
2
|
export class RetryableError extends Error {
|
|
4
3
|
/** Seconds to wait before retrying */
|
|
@@ -22,7 +21,7 @@ export class SyncHttpClient {
|
|
|
22
21
|
signer;
|
|
23
22
|
sequence;
|
|
24
23
|
constructor(config, signer, sequence) {
|
|
25
|
-
this.sequence = sequence
|
|
24
|
+
this.sequence = sequence;
|
|
26
25
|
if (!config.endpoint.startsWith('https://')) {
|
|
27
26
|
throw new Error(`TLS required: endpoint must start with https://, got "${config.endpoint}"`);
|
|
28
27
|
}
|
|
@@ -42,7 +41,7 @@ export class SyncHttpClient {
|
|
|
42
41
|
async post(path, body) {
|
|
43
42
|
return this.request('POST', path, body);
|
|
44
43
|
}
|
|
45
|
-
async request(method, path, body) {
|
|
44
|
+
async request(method, path, body, isRetry = false) {
|
|
46
45
|
const seq = this.sequence.next();
|
|
47
46
|
const result = await this.signer.signRequest(method, path, seq, body);
|
|
48
47
|
const headers = {
|
|
@@ -77,6 +76,13 @@ export class SyncHttpClient {
|
|
|
77
76
|
clearTimeout(timeoutId);
|
|
78
77
|
}
|
|
79
78
|
if (response.status === 401) {
|
|
79
|
+
const text = await response.text();
|
|
80
|
+
if (text.includes('Replay detected') && !isRetry) {
|
|
81
|
+
// Sequence counter is behind server's highestSeq — bump ahead and retry
|
|
82
|
+
for (let i = 0; i < 100; i++)
|
|
83
|
+
this.sequence.next();
|
|
84
|
+
return this.request(method, path, body, true);
|
|
85
|
+
}
|
|
80
86
|
throw new Error('Authentication failed: invalid or expired SSH signature');
|
|
81
87
|
}
|
|
82
88
|
if (response.status === 429) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"http-client.js","sourceRoot":"","sources":["../../sync/http-client.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"http-client.js","sourceRoot":"","sources":["../../sync/http-client.ts"],"names":[],"mappings":"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"}
|
package/dist/sync/index.d.ts
CHANGED
|
@@ -2,9 +2,11 @@ export * from './types.js';
|
|
|
2
2
|
export { SSHSigner } from './ssh-signer.js';
|
|
3
3
|
export { SequenceCounter } from './sequence.js';
|
|
4
4
|
export { SyncHttpClient, RetryableError } from './http-client.js';
|
|
5
|
+
export { createSyncHttpClient, createSyncHttpClientFromConfig } from './client-factory.js';
|
|
5
6
|
export { incrementalSync } from './incremental-sync.js';
|
|
6
7
|
export { fullSync } from './full-sync.js';
|
|
7
8
|
export { UploadQueue } from './upload-queue.js';
|
|
9
|
+
export { SyncQueueProcessor } from './queue-processor.js';
|
|
8
10
|
export { verifyCanary } from './canary.js';
|
|
9
11
|
export { verifyBlobCount } from './verification.js';
|
|
10
12
|
export { parseQuotaError, getQuotaWarning } from './quota.js';
|
package/dist/sync/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../sync/index.ts"],"names":[],"mappings":"AAAA,cAAc,YAAY,CAAC;AAC3B,OAAO,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;AAC5C,OAAO,EAAE,eAAe,EAAE,MAAM,eAAe,CAAC;AAChD,OAAO,EAAE,cAAc,EAAE,cAAc,EAAE,MAAM,kBAAkB,CAAC;AAClE,OAAO,EAAE,eAAe,EAAE,MAAM,uBAAuB,CAAC;AACxD,OAAO,EAAE,QAAQ,EAAE,MAAM,gBAAgB,CAAC;AAC1C,OAAO,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAChD,OAAO,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAC3C,OAAO,EAAE,eAAe,EAAE,MAAM,mBAAmB,CAAC;AACpD,OAAO,EAAE,eAAe,EAAE,eAAe,EAAE,MAAM,YAAY,CAAC;AAC9D,OAAO,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC"}
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../sync/index.ts"],"names":[],"mappings":"AAAA,cAAc,YAAY,CAAC;AAC3B,OAAO,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;AAC5C,OAAO,EAAE,eAAe,EAAE,MAAM,eAAe,CAAC;AAChD,OAAO,EAAE,cAAc,EAAE,cAAc,EAAE,MAAM,kBAAkB,CAAC;AAClE,OAAO,EAAE,oBAAoB,EAAE,8BAA8B,EAAE,MAAM,qBAAqB,CAAC;AAC3F,OAAO,EAAE,eAAe,EAAE,MAAM,uBAAuB,CAAC;AACxD,OAAO,EAAE,QAAQ,EAAE,MAAM,gBAAgB,CAAC;AAC1C,OAAO,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAChD,OAAO,EAAE,kBAAkB,EAAE,MAAM,sBAAsB,CAAC;AAC1D,OAAO,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAC3C,OAAO,EAAE,eAAe,EAAE,MAAM,mBAAmB,CAAC;AACpD,OAAO,EAAE,eAAe,EAAE,eAAe,EAAE,MAAM,YAAY,CAAC;AAC9D,OAAO,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC"}
|
package/dist/sync/index.js
CHANGED
|
@@ -2,9 +2,11 @@ export * from './types.js';
|
|
|
2
2
|
export { SSHSigner } from './ssh-signer.js';
|
|
3
3
|
export { SequenceCounter } from './sequence.js';
|
|
4
4
|
export { SyncHttpClient, RetryableError } from './http-client.js';
|
|
5
|
+
export { createSyncHttpClient, createSyncHttpClientFromConfig } from './client-factory.js';
|
|
5
6
|
export { incrementalSync } from './incremental-sync.js';
|
|
6
7
|
export { fullSync } from './full-sync.js';
|
|
7
8
|
export { UploadQueue } from './upload-queue.js';
|
|
9
|
+
export { SyncQueueProcessor } from './queue-processor.js';
|
|
8
10
|
export { verifyCanary } from './canary.js';
|
|
9
11
|
export { verifyBlobCount } from './verification.js';
|
|
10
12
|
export { parseQuotaError, getQuotaWarning } from './quota.js';
|
package/dist/sync/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../sync/index.ts"],"names":[],"mappings":"AAAA,cAAc,YAAY,CAAC;AAC3B,OAAO,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;AAC5C,OAAO,EAAE,eAAe,EAAE,MAAM,eAAe,CAAC;AAChD,OAAO,EAAE,cAAc,EAAE,cAAc,EAAE,MAAM,kBAAkB,CAAC;AAClE,OAAO,EAAE,eAAe,EAAE,MAAM,uBAAuB,CAAC;AACxD,OAAO,EAAE,QAAQ,EAAE,MAAM,gBAAgB,CAAC;AAC1C,OAAO,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAChD,OAAO,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAC3C,OAAO,EAAE,eAAe,EAAE,MAAM,mBAAmB,CAAC;AACpD,OAAO,EAAE,eAAe,EAAE,eAAe,EAAE,MAAM,YAAY,CAAC;AAC9D,OAAO,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC"}
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../sync/index.ts"],"names":[],"mappings":"AAAA,cAAc,YAAY,CAAC;AAC3B,OAAO,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;AAC5C,OAAO,EAAE,eAAe,EAAE,MAAM,eAAe,CAAC;AAChD,OAAO,EAAE,cAAc,EAAE,cAAc,EAAE,MAAM,kBAAkB,CAAC;AAClE,OAAO,EAAE,oBAAoB,EAAE,8BAA8B,EAAE,MAAM,qBAAqB,CAAC;AAC3F,OAAO,EAAE,eAAe,EAAE,MAAM,uBAAuB,CAAC;AACxD,OAAO,EAAE,QAAQ,EAAE,MAAM,gBAAgB,CAAC;AAC1C,OAAO,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAChD,OAAO,EAAE,kBAAkB,EAAE,MAAM,sBAAsB,CAAC;AAC1D,OAAO,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAC3C,OAAO,EAAE,eAAe,EAAE,MAAM,mBAAmB,CAAC;AACpD,OAAO,EAAE,eAAe,EAAE,eAAe,EAAE,MAAM,YAAY,CAAC;AAC9D,OAAO,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC"}
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
import type { ISyncQueueRepository } from '../storage/types.js';
|
|
2
|
+
import type { ISyncHttpClient } from './types.js';
|
|
3
|
+
export interface QueueProcessResult {
|
|
4
|
+
uploaded: number;
|
|
5
|
+
deleted: number;
|
|
6
|
+
failed: number;
|
|
7
|
+
/** True if processing was stopped early (e.g. quota exceeded). */
|
|
8
|
+
quotaExceeded: boolean;
|
|
9
|
+
}
|
|
10
|
+
/**
|
|
11
|
+
* Processes the SQLite-backed sync queue (uploads and deletes).
|
|
12
|
+
*
|
|
13
|
+
* Multi-process safe: uses claimBatch() for atomic item claiming,
|
|
14
|
+
* so concurrent processes never double-process an item.
|
|
15
|
+
*/
|
|
16
|
+
export declare class SyncQueueProcessor {
|
|
17
|
+
private readonly queue;
|
|
18
|
+
private readonly client;
|
|
19
|
+
constructor(queue: ISyncQueueRepository, client: ISyncHttpClient);
|
|
20
|
+
/**
|
|
21
|
+
* Process pending items from the sync queue.
|
|
22
|
+
*
|
|
23
|
+
* 1. Releases stale 'processing' items (crash recovery).
|
|
24
|
+
* 2. Claims a batch of pending items atomically.
|
|
25
|
+
* 3. Processes each item (upload or delete).
|
|
26
|
+
* 4. Marks items as completed, failed, or permanently failed.
|
|
27
|
+
*
|
|
28
|
+
* On 409 (already exists / already deleted): treated as success.
|
|
29
|
+
* On 413 (quota exceeded): stops processing entirely.
|
|
30
|
+
* On other failure: increments retry count with exponential backoff.
|
|
31
|
+
* After max retries: marks as permanently failed.
|
|
32
|
+
*/
|
|
33
|
+
processQueue(batchSize?: number): Promise<QueueProcessResult>;
|
|
34
|
+
private processUpload;
|
|
35
|
+
private processDelete;
|
|
36
|
+
private failItem;
|
|
37
|
+
}
|
|
38
|
+
//# sourceMappingURL=queue-processor.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"queue-processor.d.ts","sourceRoot":"","sources":["../../sync/queue-processor.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,oBAAoB,EAAiB,MAAM,qBAAqB,CAAC;AAC/E,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,YAAY,CAAC;AAQlD,MAAM,WAAW,kBAAkB;IACjC,QAAQ,EAAE,MAAM,CAAC;IACjB,OAAO,EAAE,MAAM,CAAC;IAChB,MAAM,EAAE,MAAM,CAAC;IACf,kEAAkE;IAClE,aAAa,EAAE,OAAO,CAAC;CACxB;AAED;;;;;GAKG;AACH,qBAAa,kBAAkB;IAC7B,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAuB;IAC7C,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAkB;gBAE7B,KAAK,EAAE,oBAAoB,EAAE,MAAM,EAAE,eAAe;IAKhE;;;;;;;;;;;;OAYG;IACG,YAAY,CAAC,SAAS,GAAE,MAA2B,GAAG,OAAO,CAAC,kBAAkB,CAAC;YA4CzE,aAAa;YAOb,aAAa;IAI3B,OAAO,CAAC,QAAQ;CAOjB"}
|
|
@@ -0,0 +1,96 @@
|
|
|
1
|
+
/** Default batch size for claiming queue items. */
|
|
2
|
+
const DEFAULT_BATCH_SIZE = 10;
|
|
3
|
+
/** Seconds before a 'processing' item is considered stale (crash recovery). */
|
|
4
|
+
const STALE_THRESHOLD_SECONDS = 300;
|
|
5
|
+
/**
|
|
6
|
+
* Processes the SQLite-backed sync queue (uploads and deletes).
|
|
7
|
+
*
|
|
8
|
+
* Multi-process safe: uses claimBatch() for atomic item claiming,
|
|
9
|
+
* so concurrent processes never double-process an item.
|
|
10
|
+
*/
|
|
11
|
+
export class SyncQueueProcessor {
|
|
12
|
+
queue;
|
|
13
|
+
client;
|
|
14
|
+
constructor(queue, client) {
|
|
15
|
+
this.queue = queue;
|
|
16
|
+
this.client = client;
|
|
17
|
+
}
|
|
18
|
+
/**
|
|
19
|
+
* Process pending items from the sync queue.
|
|
20
|
+
*
|
|
21
|
+
* 1. Releases stale 'processing' items (crash recovery).
|
|
22
|
+
* 2. Claims a batch of pending items atomically.
|
|
23
|
+
* 3. Processes each item (upload or delete).
|
|
24
|
+
* 4. Marks items as completed, failed, or permanently failed.
|
|
25
|
+
*
|
|
26
|
+
* On 409 (already exists / already deleted): treated as success.
|
|
27
|
+
* On 413 (quota exceeded): stops processing entirely.
|
|
28
|
+
* On other failure: increments retry count with exponential backoff.
|
|
29
|
+
* After max retries: marks as permanently failed.
|
|
30
|
+
*/
|
|
31
|
+
async processQueue(batchSize = DEFAULT_BATCH_SIZE) {
|
|
32
|
+
// Crash recovery: release items stuck in 'processing' from dead processes
|
|
33
|
+
this.queue.releaseStale(STALE_THRESHOLD_SECONDS);
|
|
34
|
+
const items = this.queue.claimBatch(batchSize);
|
|
35
|
+
let uploaded = 0;
|
|
36
|
+
let deleted = 0;
|
|
37
|
+
let failed = 0;
|
|
38
|
+
let quotaExceeded = false;
|
|
39
|
+
for (const item of items) {
|
|
40
|
+
try {
|
|
41
|
+
const response = item.operation === 'upload'
|
|
42
|
+
? await this.processUpload(item)
|
|
43
|
+
: await this.processDelete(item);
|
|
44
|
+
if (response.ok || response.status === 201) {
|
|
45
|
+
this.queue.complete(item.id);
|
|
46
|
+
if (item.operation === 'upload')
|
|
47
|
+
uploaded++;
|
|
48
|
+
else
|
|
49
|
+
deleted++;
|
|
50
|
+
}
|
|
51
|
+
else if (response.status === 409) {
|
|
52
|
+
// Already exists (upload) or already deleted — idempotent success
|
|
53
|
+
this.queue.complete(item.id);
|
|
54
|
+
if (item.operation === 'upload')
|
|
55
|
+
uploaded++;
|
|
56
|
+
else
|
|
57
|
+
deleted++;
|
|
58
|
+
}
|
|
59
|
+
else if (response.status === 413) {
|
|
60
|
+
// Quota exceeded — stop processing, release this item back
|
|
61
|
+
this.queue.fail(item.id, 'Quota exceeded (HTTP 413)');
|
|
62
|
+
quotaExceeded = true;
|
|
63
|
+
break;
|
|
64
|
+
}
|
|
65
|
+
else {
|
|
66
|
+
this.failItem(item, `HTTP ${response.status}`);
|
|
67
|
+
failed++;
|
|
68
|
+
}
|
|
69
|
+
}
|
|
70
|
+
catch (error) {
|
|
71
|
+
const message = error instanceof Error ? error.message : String(error);
|
|
72
|
+
this.failItem(item, message);
|
|
73
|
+
failed++;
|
|
74
|
+
}
|
|
75
|
+
}
|
|
76
|
+
return { uploaded, deleted, failed, quotaExceeded };
|
|
77
|
+
}
|
|
78
|
+
async processUpload(item) {
|
|
79
|
+
if (!item.data) {
|
|
80
|
+
throw new Error(`Upload item ${item.blobId} has no data`);
|
|
81
|
+
}
|
|
82
|
+
return this.client.put(`/v1/blobs/${item.blobId}`, item.data);
|
|
83
|
+
}
|
|
84
|
+
async processDelete(item) {
|
|
85
|
+
return this.client.delete(`/v1/blobs/${item.blobId}`);
|
|
86
|
+
}
|
|
87
|
+
failItem(item, error) {
|
|
88
|
+
if (item.retryCount + 1 >= item.maxRetries) {
|
|
89
|
+
this.queue.permanentFail(item.id, error);
|
|
90
|
+
}
|
|
91
|
+
else {
|
|
92
|
+
this.queue.fail(item.id, error);
|
|
93
|
+
}
|
|
94
|
+
}
|
|
95
|
+
}
|
|
96
|
+
//# sourceMappingURL=queue-processor.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"queue-processor.js","sourceRoot":"","sources":["../../sync/queue-processor.ts"],"names":[],"mappings":"AAGA,mDAAmD;AACnD,MAAM,kBAAkB,GAAG,EAAE,CAAC;AAE9B,+EAA+E;AAC/E,MAAM,uBAAuB,GAAG,GAAG,CAAC;AAUpC;;;;;GAKG;AACH,MAAM,OAAO,kBAAkB;IACZ,KAAK,CAAuB;IAC5B,MAAM,CAAkB;IAEzC,YAAY,KAA2B,EAAE,MAAuB;QAC9D,IAAI,CAAC,KAAK,GAAG,KAAK,CAAC;QACnB,IAAI,CAAC,MAAM,GAAG,MAAM,CAAC;IACvB,CAAC;IAED;;;;;;;;;;;;OAYG;IACH,KAAK,CAAC,YAAY,CAAC,YAAoB,kBAAkB;QACvD,0EAA0E;QAC1E,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC,uBAAuB,CAAC,CAAC;QAEjD,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,UAAU,CAAC,SAAS,CAAC,CAAC;QAC/C,IAAI,QAAQ,GAAG,CAAC,CAAC;QACjB,IAAI,OAAO,GAAG,CAAC,CAAC;QAChB,IAAI,MAAM,GAAG,CAAC,CAAC;QACf,IAAI,aAAa,GAAG,KAAK,CAAC;QAE1B,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;YACzB,IAAI,CAAC;gBACH,MAAM,QAAQ,GAAG,IAAI,CAAC,SAAS,KAAK,QAAQ;oBAC1C,CAAC,CAAC,MAAM,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC;oBAChC,CAAC,CAAC,MAAM,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC,CAAC;gBAEnC,IAAI,QAAQ,CAAC,EAAE,IAAI,QAAQ,CAAC,MAAM,KAAK,GAAG,EAAE,CAAC;oBAC3C,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;oBAC7B,IAAI,IAAI,CAAC,SAAS,KAAK,QAAQ;wBAAE,QAAQ,EAAE,CAAC;;wBACvC,OAAO,EAAE,CAAC;gBACjB,CAAC;qBAAM,IAAI,QAAQ,CAAC,MAAM,KAAK,GAAG,EAAE,CAAC;oBACnC,kEAAkE;oBAClE,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;oBAC7B,IAAI,IAAI,CAAC,SAAS,KAAK,QAAQ;wBAAE,QAAQ,EAAE,CAAC;;wBACvC,OAAO,EAAE,CAAC;gBACjB,CAAC;qBAAM,IAAI,QAAQ,CAAC,MAAM,KAAK,GAAG,EAAE,CAAC;oBACnC,2DAA2D;oBAC3D,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,EAAE,2BAA2B,CAAC,CAAC;oBACtD,aAAa,GAAG,IAAI,CAAC;oBACrB,MAAM;gBACR,CAAC;qBAAM,CAAC;oBACN,IAAI,CAAC,QAAQ,CAAC,IAAI,EAAE,QAAQ,QAAQ,CAAC,MAAM,EAAE,CAAC,CAAC;oBAC/C,MAAM,EAAE,CAAC;gBACX,CAAC;YACH,CAAC;YAAC,OAAO,KAAc,EAAE,CAAC;gBACxB,MAAM,OAAO,GAAG,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;gBACvE,IAAI,CAAC,QAAQ,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC;gBAC7B,MAAM,EAAE,CAAC;YACX,CAAC;QACH,CAAC;QAED,OAAO,EAAE,QAAQ,EAAE,OAAO,EAAE,MAAM,EAAE,aAAa,EAAE,CAAC;IACtD,CAAC;IAEO,KAAK,CAAC,aAAa,CAAC,IAAmB;QAC7C,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC;YACf,MAAM,IAAI,KAAK,CAAC,eAAe,IAAI,CAAC,MAAM,cAAc,CAAC,CAAC;QAC5D,CAAC;QACD,OAAO,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,aAAa,IAAI,CAAC,MAAM,EAAE,EAAE,IAAI,CAAC,IAAI,CAAC,CAAC;IAChE,CAAC;IAEO,KAAK,CAAC,aAAa,CAAC,IAAmB;QAC7C,OAAO,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,aAAa,IAAI,CAAC,MAAM,EAAE,CAAC,CAAC;IACxD,CAAC;IAEO,QAAQ,CAAC,IAAmB,EAAE,KAAa;QACjD,IAAI,IAAI,CAAC,UAAU,GAAG,CAAC,IAAI,IAAI,CAAC,UAAU,EAAE,CAAC;YAC3C,IAAI,CAAC,KAAK,CAAC,aAAa,CAAC,IAAI,CAAC,EAAE,EAAE,KAAK,CAAC,CAAC;QAC3C,CAAC;aAAM,CAAC;YACN,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,EAAE,KAAK,CAAC,CAAC;QAClC,CAAC;IACH,CAAC;CACF"}
|
|
@@ -18,7 +18,12 @@ export declare class SSHSigner {
|
|
|
18
18
|
publicKey: string;
|
|
19
19
|
}>;
|
|
20
20
|
/**
|
|
21
|
-
* Compute SHA-256 hex digest of body
|
|
21
|
+
* Compute SHA-256 hex digest of body as seen by the server.
|
|
22
|
+
*
|
|
23
|
+
* Lambda function URLs base64-encode binary bodies (Content-Type:
|
|
24
|
+
* application/octet-stream), so `event.body` on the server side is
|
|
25
|
+
* the base64 string, not the raw bytes. We must hash the same value
|
|
26
|
+
* the server will hash for signature verification to succeed.
|
|
22
27
|
*/
|
|
23
28
|
computeBodyHash(body?: Uint8Array): string;
|
|
24
29
|
/**
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ssh-signer.d.ts","sourceRoot":"","sources":["../../sync/ssh-signer.ts"],"names":[],"mappings":"AAOA;;;;;;GAMG;AACH,qBAAa,SAAS;IACpB,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAS;gBAErB,UAAU,CAAC,EAAE,MAAM;IAI/B;;OAEG;IACG,WAAW,CACf,MAAM,EAAE,MAAM,EACd,IAAI,EAAE,MAAM,EACZ,QAAQ,EAAE,MAAM,EAChB,IAAI,CAAC,EAAE,UAAU,GAChB,OAAO,CAAC;QACT,aAAa,EAAE,MAAM,CAAC;QACtB,SAAS,EAAE,MAAM,CAAC;QAClB,QAAQ,EAAE,MAAM,CAAC;QACjB,SAAS,EAAE,MAAM,CAAC;KACnB,CAAC;IAiBF
|
|
1
|
+
{"version":3,"file":"ssh-signer.d.ts","sourceRoot":"","sources":["../../sync/ssh-signer.ts"],"names":[],"mappings":"AAOA;;;;;;GAMG;AACH,qBAAa,SAAS;IACpB,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAS;gBAErB,UAAU,CAAC,EAAE,MAAM;IAI/B;;OAEG;IACG,WAAW,CACf,MAAM,EAAE,MAAM,EACd,IAAI,EAAE,MAAM,EACZ,QAAQ,EAAE,MAAM,EAChB,IAAI,CAAC,EAAE,UAAU,GAChB,OAAO,CAAC;QACT,aAAa,EAAE,MAAM,CAAC;QACtB,SAAS,EAAE,MAAM,CAAC;QAClB,QAAQ,EAAE,MAAM,CAAC;QACjB,SAAS,EAAE,MAAM,CAAC;KACnB,CAAC;IAiBF;;;;;;;OAOG;IACH,eAAe,CAAC,IAAI,CAAC,EAAE,UAAU,GAAG,MAAM;IAS1C;;;;OAIG;IACG,yBAAyB,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC;QACtD,SAAS,EAAE,MAAM,CAAC;QAClB,SAAS,EAAE,MAAM,CAAC;KACnB,CAAC;IAWF;;;;;;OAMG;IACH,cAAc,CACZ,MAAM,EAAE,MAAM,EACd,IAAI,EAAE,MAAM,EACZ,SAAS,EAAE,MAAM,EACjB,QAAQ,EAAE,MAAM,EAChB,QAAQ,EAAE,MAAM,GACf,MAAM;IAIT;;;OAGG;YACW,aAAa;IAM3B;;;;;OAKG;YACW,aAAa;IAa3B;;;;OAIG;YACW,eAAe;IAa7B;;;;;;;;;OASG;YACW,aAAa;CAyB5B"}
|
package/dist/sync/ssh-signer.js
CHANGED
|
@@ -33,13 +33,20 @@ export class SSHSigner {
|
|
|
33
33
|
return { authorization, timestamp, sequence, publicKey };
|
|
34
34
|
}
|
|
35
35
|
/**
|
|
36
|
-
* Compute SHA-256 hex digest of body
|
|
36
|
+
* Compute SHA-256 hex digest of body as seen by the server.
|
|
37
|
+
*
|
|
38
|
+
* Lambda function URLs base64-encode binary bodies (Content-Type:
|
|
39
|
+
* application/octet-stream), so `event.body` on the server side is
|
|
40
|
+
* the base64 string, not the raw bytes. We must hash the same value
|
|
41
|
+
* the server will hash for signature verification to succeed.
|
|
37
42
|
*/
|
|
38
43
|
computeBodyHash(body) {
|
|
39
44
|
if (!body || body.length === 0) {
|
|
40
45
|
return '';
|
|
41
46
|
}
|
|
42
|
-
|
|
47
|
+
// Hash the base64-encoded form, matching what Lambda sets as event.body
|
|
48
|
+
const base64Body = Buffer.from(body).toString('base64');
|
|
49
|
+
return createHash('sha256').update(base64Body).digest('hex');
|
|
43
50
|
}
|
|
44
51
|
/**
|
|
45
52
|
* Sign a registration challenge nonce.
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ssh-signer.js","sourceRoot":"","sources":["../../sync/ssh-signer.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,IAAI,IAAI,UAAU,EAAE,MAAM,aAAa,CAAC;AAC7D,OAAO,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AAC5C,OAAO,EAAE,OAAO,EAAE,MAAM,SAAS,CAAC;AAClC,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AACjC,OAAO,EAAE,OAAO,EAAe,MAAM,UAAU,CAAC;AAChD,OAAO,KAAK,MAAM,OAAO,CAAC;AAE1B;;;;;;GAMG;AACH,MAAM,OAAO,SAAS;IACH,OAAO,CAAS;IAEjC,YAAY,UAAmB;QAC7B,IAAI,CAAC,OAAO,GAAG,UAAU,IAAI,IAAI,CAAC,OAAO,EAAE,EAAE,MAAM,EAAE,YAAY,CAAC,CAAC;IACrE,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,WAAW,CACf,MAAc,EACd,IAAY,EACZ,QAAgB,EAChB,IAAiB;QAOjB,MAAM,SAAS,GAAG,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC;QAC3C,MAAM,QAAQ,GAAG,IAAI,CAAC,eAAe,CAAC,IAAI,CAAC,CAAC;QAC5C,MAAM,SAAS,GAAG,IAAI,CAAC,cAAc,CAAC,MAAM,EAAE,IAAI,EAAE,SAAS,EAAE,QAAQ,EAAE,QAAQ,CAAC,CAAC;QAEnF,MAAM,YAAY,GAAG,MAAM,IAAI,CAAC,aAAa,EAAE,CAAC;QAChD,MAAM,SAAS,GAAG,MAAM,IAAI,CAAC,aAAa,CAAC,SAAS,CAAC,CAAC;QACtD,MAAM,SAAS,GAAG,SAAS,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC;QAE/C,qFAAqF;QACrF,MAAM,KAAK,GAAG,YAAY,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;QACxC,MAAM,SAAS,GAAG,KAAK,CAAC,MAAM,IAAI,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,YAAY,CAAC;QAE9D,MAAM,aAAa,GAAG,iBAAiB,SAAS,EAAE,CAAC;QACnD,OAAO,EAAE,aAAa,EAAE,SAAS,EAAE,QAAQ,EAAE,SAAS,EAAE,CAAC;IAC3D,CAAC;IAED
|
|
1
|
+
{"version":3,"file":"ssh-signer.js","sourceRoot":"","sources":["../../sync/ssh-signer.ts"],"names":[],"mappings":"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"}
|
|
@@ -4,16 +4,15 @@ import type { IEncryptionService, DerivedKeySet } from '../crypto/types.js';
|
|
|
4
4
|
/**
|
|
5
5
|
* Main sync service that orchestrates all sync operations.
|
|
6
6
|
*
|
|
7
|
-
*
|
|
8
|
-
*
|
|
7
|
+
* Uses SQLite-backed queue and state (via IDatabase) instead of flat files.
|
|
8
|
+
* Multi-process safe: concurrent VS Code instances share the same SQLite DB.
|
|
9
9
|
*/
|
|
10
10
|
export declare class SyncService implements ISyncService {
|
|
11
11
|
private readonly httpClient;
|
|
12
|
-
private readonly
|
|
12
|
+
private readonly queueProcessor;
|
|
13
13
|
private readonly storage;
|
|
14
14
|
private readonly encryptionService;
|
|
15
15
|
private readonly keys;
|
|
16
|
-
private state;
|
|
17
16
|
constructor(config: SyncConfig, storage: IDatabase, encryptionService: IEncryptionService, keys: DerivedKeySet);
|
|
18
17
|
/**
|
|
19
18
|
* Run incremental sync — download changes since last successful sync.
|
|
@@ -27,11 +26,17 @@ export declare class SyncService implements ISyncService {
|
|
|
27
26
|
* Enqueue a blob for upload to the server.
|
|
28
27
|
*/
|
|
29
28
|
upload(blobId: string, data: Uint8Array): Promise<void>;
|
|
29
|
+
/**
|
|
30
|
+
* Enqueue a blob for deletion from the server.
|
|
31
|
+
*/
|
|
32
|
+
deleteBlob(blobId: string): Promise<void>;
|
|
33
|
+
/**
|
|
34
|
+
* Process pending items in the sync queue.
|
|
35
|
+
* Called by the MCP server after tool calls that enqueue items.
|
|
36
|
+
*/
|
|
37
|
+
drainQueue(): Promise<void>;
|
|
30
38
|
/**
|
|
31
39
|
* Get current quota usage from the server.
|
|
32
|
-
*
|
|
33
|
-
* Fetches quota info from the blob count endpoint, which includes
|
|
34
|
-
* quota headers in its response.
|
|
35
40
|
*/
|
|
36
41
|
getQuota(): Promise<QuotaInfo>;
|
|
37
42
|
/**
|
|
@@ -44,10 +49,15 @@ export declare class SyncService implements ISyncService {
|
|
|
44
49
|
verifyCount(localCount: number): Promise<boolean>;
|
|
45
50
|
/**
|
|
46
51
|
* Check for unacknowledged notifications from the server.
|
|
47
|
-
* Returns formatted notification strings for display by the MCP layer.
|
|
48
52
|
*/
|
|
49
53
|
checkNotifications(): Promise<string[]>;
|
|
54
|
+
/**
|
|
55
|
+
* Load full sync state from SQLite key-value store.
|
|
56
|
+
*/
|
|
50
57
|
private loadState;
|
|
58
|
+
/**
|
|
59
|
+
* Save full sync state to SQLite key-value store.
|
|
60
|
+
*/
|
|
51
61
|
private saveState;
|
|
52
62
|
}
|
|
53
63
|
//# sourceMappingURL=sync-service.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"sync-service.d.ts","sourceRoot":"","sources":["../../sync/sync-service.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"sync-service.d.ts","sourceRoot":"","sources":["../../sync/sync-service.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,YAAY,EACZ,UAAU,EAEV,UAAU,EACV,SAAS,EACV,MAAM,YAAY,CAAC;AACpB,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,qBAAqB,CAAC;AACrD,OAAO,KAAK,EAAE,kBAAkB,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAC;AAS5E;;;;;GAKG;AACH,qBAAa,WAAY,YAAW,YAAY;IAC9C,OAAO,CAAC,QAAQ,CAAC,UAAU,CAAiB;IAC5C,OAAO,CAAC,QAAQ,CAAC,cAAc,CAAqB;IACpD,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAY;IACpC,OAAO,CAAC,QAAQ,CAAC,iBAAiB,CAAqB;IACvD,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAgB;gBAGnC,MAAM,EAAE,UAAU,EAClB,OAAO,EAAE,SAAS,EAClB,iBAAiB,EAAE,kBAAkB,EACrC,IAAI,EAAE,aAAa;IAUrB;;OAEG;IACG,eAAe,IAAI,OAAO,CAAC,UAAU,CAAC;IAkB5C;;OAEG;IACG,QAAQ,IAAI,OAAO,CAAC,UAAU,CAAC;IAOrC;;OAEG;IACG,MAAM,CAAC,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,UAAU,GAAG,OAAO,CAAC,IAAI,CAAC;IAM7D;;OAEG;IACG,UAAU,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAM/C;;;OAGG;IACG,UAAU,IAAI,OAAO,CAAC,IAAI,CAAC;IAIjC;;OAEG;IACG,QAAQ,IAAI,OAAO,CAAC,SAAS,CAAC;IAcpC;;OAEG;IACG,YAAY,IAAI,OAAO,CAAC,OAAO,CAAC;IAItC;;OAEG;IACG,WAAW,CAAC,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;IAKvD;;OAEG;IACG,kBAAkB,IAAI,OAAO,CAAC,MAAM,EAAE,CAAC;IA2C7C;;OAEG;IACH,OAAO,CAAC,SAAS;IAWjB;;OAEG;IACH,OAAO,CAAC,SAAS;CAWlB"}
|
|
@@ -1,72 +1,77 @@
|
|
|
1
|
-
import { readFileSync, writeFileSync, mkdirSync, existsSync } from 'node:fs';
|
|
2
|
-
import { homedir } from 'node:os';
|
|
3
|
-
import { join, dirname } from 'node:path';
|
|
4
1
|
import { SSHSigner } from './ssh-signer.js';
|
|
5
2
|
import { SyncHttpClient } from './http-client.js';
|
|
6
|
-
import {
|
|
3
|
+
import { SyncQueueProcessor } from './queue-processor.js';
|
|
7
4
|
import { incrementalSync } from './incremental-sync.js';
|
|
8
5
|
import { fullSync } from './full-sync.js';
|
|
9
6
|
import { verifyCanary } from './canary.js';
|
|
10
7
|
import { verifyBlobCount } from './verification.js';
|
|
11
|
-
const CHAOSKB_DIR = join(homedir(), '.chaoskb');
|
|
12
|
-
const SYNC_STATE_PATH = join(CHAOSKB_DIR, 'sync-state.json');
|
|
13
|
-
const UPLOAD_QUEUE_PATH = join(CHAOSKB_DIR, 'upload-queue.json');
|
|
14
8
|
/**
|
|
15
9
|
* Main sync service that orchestrates all sync operations.
|
|
16
10
|
*
|
|
17
|
-
*
|
|
18
|
-
*
|
|
11
|
+
* Uses SQLite-backed queue and state (via IDatabase) instead of flat files.
|
|
12
|
+
* Multi-process safe: concurrent VS Code instances share the same SQLite DB.
|
|
19
13
|
*/
|
|
20
14
|
export class SyncService {
|
|
21
15
|
httpClient;
|
|
22
|
-
|
|
16
|
+
queueProcessor;
|
|
23
17
|
storage;
|
|
24
18
|
encryptionService;
|
|
25
19
|
keys;
|
|
26
|
-
state;
|
|
27
20
|
constructor(config, storage, encryptionService, keys) {
|
|
28
21
|
const signer = new SSHSigner(config.sshKeyPath);
|
|
29
|
-
this.httpClient = new SyncHttpClient(config, signer);
|
|
30
|
-
this.
|
|
22
|
+
this.httpClient = new SyncHttpClient(config, signer, storage.syncSequence);
|
|
23
|
+
this.queueProcessor = new SyncQueueProcessor(storage.syncQueue, this.httpClient);
|
|
31
24
|
this.storage = storage;
|
|
32
25
|
this.encryptionService = encryptionService;
|
|
33
26
|
this.keys = keys;
|
|
34
|
-
this.state = this.loadState();
|
|
35
27
|
}
|
|
36
28
|
/**
|
|
37
29
|
* Run incremental sync — download changes since last successful sync.
|
|
38
30
|
*/
|
|
39
31
|
async incrementalSync() {
|
|
40
|
-
const
|
|
32
|
+
const lastSync = this.storage.syncState.get('lastSyncTimestamp');
|
|
33
|
+
const result = await incrementalSync(this.httpClient, this.storage, lastSync);
|
|
41
34
|
if (result.success) {
|
|
42
|
-
this.
|
|
43
|
-
this.saveState();
|
|
35
|
+
this.storage.syncState.set('lastSyncTimestamp', new Date().toISOString());
|
|
44
36
|
}
|
|
45
|
-
// Process any pending uploads after downloading
|
|
46
|
-
await this.
|
|
37
|
+
// Process any pending uploads/deletes after downloading
|
|
38
|
+
await this.queueProcessor.processQueue();
|
|
47
39
|
return result;
|
|
48
40
|
}
|
|
49
41
|
/**
|
|
50
42
|
* Run full sync — download all blobs from the server.
|
|
51
43
|
*/
|
|
52
44
|
async fullSync() {
|
|
53
|
-
const
|
|
54
|
-
this.
|
|
45
|
+
const state = this.loadState();
|
|
46
|
+
const result = await fullSync(this.httpClient, this.storage, state);
|
|
47
|
+
this.saveState(state);
|
|
55
48
|
return result;
|
|
56
49
|
}
|
|
57
50
|
/**
|
|
58
51
|
* Enqueue a blob for upload to the server.
|
|
59
52
|
*/
|
|
60
53
|
async upload(blobId, data) {
|
|
61
|
-
|
|
62
|
-
// Attempt immediate
|
|
63
|
-
await this.
|
|
54
|
+
this.storage.syncQueue.enqueue(blobId, 'upload', data);
|
|
55
|
+
// Attempt immediate processing
|
|
56
|
+
await this.queueProcessor.processQueue();
|
|
57
|
+
}
|
|
58
|
+
/**
|
|
59
|
+
* Enqueue a blob for deletion from the server.
|
|
60
|
+
*/
|
|
61
|
+
async deleteBlob(blobId) {
|
|
62
|
+
this.storage.syncQueue.enqueue(blobId, 'delete');
|
|
63
|
+
// Attempt immediate processing
|
|
64
|
+
await this.queueProcessor.processQueue();
|
|
65
|
+
}
|
|
66
|
+
/**
|
|
67
|
+
* Process pending items in the sync queue.
|
|
68
|
+
* Called by the MCP server after tool calls that enqueue items.
|
|
69
|
+
*/
|
|
70
|
+
async drainQueue() {
|
|
71
|
+
await this.queueProcessor.processQueue();
|
|
64
72
|
}
|
|
65
73
|
/**
|
|
66
74
|
* Get current quota usage from the server.
|
|
67
|
-
*
|
|
68
|
-
* Fetches quota info from the blob count endpoint, which includes
|
|
69
|
-
* quota headers in its response.
|
|
70
75
|
*/
|
|
71
76
|
async getQuota() {
|
|
72
77
|
const response = await this.httpClient.get('/v1/blobs/count');
|
|
@@ -77,7 +82,6 @@ export class SyncService {
|
|
|
77
82
|
if (data.quota) {
|
|
78
83
|
return data.quota;
|
|
79
84
|
}
|
|
80
|
-
// Fallback: no quota info available
|
|
81
85
|
return { used: 0, limit: 0, percentage: 0 };
|
|
82
86
|
}
|
|
83
87
|
/**
|
|
@@ -95,7 +99,6 @@ export class SyncService {
|
|
|
95
99
|
}
|
|
96
100
|
/**
|
|
97
101
|
* Check for unacknowledged notifications from the server.
|
|
98
|
-
* Returns formatted notification strings for display by the MCP layer.
|
|
99
102
|
*/
|
|
100
103
|
async checkNotifications() {
|
|
101
104
|
try {
|
|
@@ -126,24 +129,33 @@ export class SyncService {
|
|
|
126
129
|
return [];
|
|
127
130
|
}
|
|
128
131
|
}
|
|
132
|
+
/**
|
|
133
|
+
* Load full sync state from SQLite key-value store.
|
|
134
|
+
*/
|
|
129
135
|
loadState() {
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
136
|
+
const fullSyncInProgress = this.storage.syncState.get('fullSyncInProgress') === 'true';
|
|
137
|
+
const fullSyncCursor = this.storage.syncState.get('fullSyncCursor');
|
|
138
|
+
const lastSyncTimestamp = this.storage.syncState.get('lastSyncTimestamp');
|
|
139
|
+
return {
|
|
140
|
+
fullSyncInProgress,
|
|
141
|
+
fullSyncCursor,
|
|
142
|
+
lastSyncTimestamp,
|
|
143
|
+
};
|
|
144
|
+
}
|
|
145
|
+
/**
|
|
146
|
+
* Save full sync state to SQLite key-value store.
|
|
147
|
+
*/
|
|
148
|
+
saveState(state) {
|
|
149
|
+
this.storage.syncState.set('fullSyncInProgress', String(state.fullSyncInProgress));
|
|
150
|
+
if (state.fullSyncCursor) {
|
|
151
|
+
this.storage.syncState.set('fullSyncCursor', state.fullSyncCursor);
|
|
135
152
|
}
|
|
136
|
-
|
|
137
|
-
|
|
153
|
+
else {
|
|
154
|
+
this.storage.syncState.delete('fullSyncCursor');
|
|
138
155
|
}
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
saveState() {
|
|
142
|
-
const dir = dirname(SYNC_STATE_PATH);
|
|
143
|
-
if (!existsSync(dir)) {
|
|
144
|
-
mkdirSync(dir, { recursive: true });
|
|
156
|
+
if (state.lastSyncTimestamp) {
|
|
157
|
+
this.storage.syncState.set('lastSyncTimestamp', state.lastSyncTimestamp);
|
|
145
158
|
}
|
|
146
|
-
writeFileSync(SYNC_STATE_PATH, JSON.stringify(this.state, null, 2), 'utf-8');
|
|
147
159
|
}
|
|
148
160
|
}
|
|
149
161
|
//# sourceMappingURL=sync-service.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"sync-service.js","sourceRoot":"","sources":["../../sync/sync-service.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"sync-service.js","sourceRoot":"","sources":["../../sync/sync-service.ts"],"names":[],"mappings":"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"}
|
package/dist/sync/types.d.ts
CHANGED
|
@@ -89,6 +89,10 @@ export interface ISyncService {
|
|
|
89
89
|
fullSync(): Promise<SyncResult>;
|
|
90
90
|
/** Upload a blob to the server */
|
|
91
91
|
upload(blobId: string, data: Uint8Array): Promise<void>;
|
|
92
|
+
/** Delete a blob from the server (soft-delete / tombstone) */
|
|
93
|
+
deleteBlob(blobId: string): Promise<void>;
|
|
94
|
+
/** Process pending items in the sync queue (uploads and deletes). */
|
|
95
|
+
drainQueue(): Promise<void>;
|
|
92
96
|
/** Get current quota usage */
|
|
93
97
|
getQuota(): Promise<QuotaInfo>;
|
|
94
98
|
/** Write and verify canary blob */
|
package/dist/sync/types.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../sync/types.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../sync/types.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@de-otio/chaoskb-client",
|
|
3
|
-
"version": "0.3.
|
|
3
|
+
"version": "0.3.2",
|
|
4
4
|
"description": "ChaosKB - E2E encrypted personal knowledge base with MCP integration",
|
|
5
5
|
"license": "MIT",
|
|
6
6
|
"repository": {
|
|
@@ -38,7 +38,8 @@
|
|
|
38
38
|
"test": "vitest run",
|
|
39
39
|
"test:watch": "vitest",
|
|
40
40
|
"test:coverage": "vitest run --coverage",
|
|
41
|
-
"test:e2e": "node __e2e__/native-modules.mjs && node __e2e__/crypto-pipeline.mjs && node __e2e__/database-layer.mjs && node __e2e__/mcp-startup.mjs"
|
|
41
|
+
"test:e2e": "node __e2e__/native-modules.mjs && node __e2e__/crypto-pipeline.mjs && node __e2e__/database-layer.mjs && node __e2e__/mcp-startup.mjs",
|
|
42
|
+
"test:e2e:sync": "node __e2e__/sync-flow.mjs"
|
|
42
43
|
},
|
|
43
44
|
"publishConfig": {
|
|
44
45
|
"access": "public"
|