@superblocksteam/workspace-sync 2.0.178-next.2 → 2.0.179-next.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 (51) hide show
  1. package/README.md +21 -6
  2. package/dist/atomic-write.d.ts +4 -1
  3. package/dist/atomic-write.d.ts.map +1 -1
  4. package/dist/atomic-write.js +12 -10
  5. package/dist/atomic-write.js.map +1 -1
  6. package/dist/control.d.ts +150 -4
  7. package/dist/control.d.ts.map +1 -1
  8. package/dist/control.js +120 -8
  9. package/dist/control.js.map +1 -1
  10. package/dist/dbfs-transport.d.ts +8 -9
  11. package/dist/dbfs-transport.d.ts.map +1 -1
  12. package/dist/dbfs-transport.js +1 -20
  13. package/dist/dbfs-transport.js.map +1 -1
  14. package/dist/draft-helpers.d.ts +13 -0
  15. package/dist/draft-helpers.d.ts.map +1 -1
  16. package/dist/draft-helpers.js +86 -6
  17. package/dist/draft-helpers.js.map +1 -1
  18. package/dist/file-draft-journal-blob-store.d.ts +14 -0
  19. package/dist/file-draft-journal-blob-store.d.ts.map +1 -0
  20. package/dist/file-draft-journal-blob-store.js +74 -0
  21. package/dist/file-draft-journal-blob-store.js.map +1 -0
  22. package/dist/index.d.ts +1 -0
  23. package/dist/index.d.ts.map +1 -1
  24. package/dist/index.js +1 -0
  25. package/dist/index.js.map +1 -1
  26. package/dist/session-draft-journal-store.d.ts +12 -10
  27. package/dist/session-draft-journal-store.d.ts.map +1 -1
  28. package/dist/session-draft-journal-store.js +22 -49
  29. package/dist/session-draft-journal-store.js.map +1 -1
  30. package/dist/sigv4.d.ts +36 -0
  31. package/dist/sigv4.d.ts.map +1 -0
  32. package/dist/sigv4.js +97 -0
  33. package/dist/sigv4.js.map +1 -0
  34. package/dist/snapshot/upload-snapshot.d.ts +6 -0
  35. package/dist/snapshot/upload-snapshot.d.ts.map +1 -1
  36. package/dist/snapshot/upload-snapshot.js +12 -1
  37. package/dist/snapshot/upload-snapshot.js.map +1 -1
  38. package/dist/socket-dbfs-transport.d.ts +1 -1
  39. package/dist/socket-dbfs-transport.d.ts.map +1 -1
  40. package/dist/socket-dbfs-transport.js +4 -0
  41. package/dist/socket-dbfs-transport.js.map +1 -1
  42. package/dist/sync-credential-provider.d.ts +2 -2
  43. package/dist/sync-engine.d.ts +34 -1
  44. package/dist/sync-engine.d.ts.map +1 -1
  45. package/dist/sync-engine.js +189 -30
  46. package/dist/sync-engine.js.map +1 -1
  47. package/dist/testing.d.ts +26 -4
  48. package/dist/testing.d.ts.map +1 -1
  49. package/dist/testing.js +23 -8
  50. package/dist/testing.js.map +1 -1
  51. package/package.json +11 -7
package/dist/sigv4.js ADDED
@@ -0,0 +1,97 @@
1
+ /**
2
+ * The SigV4 header signer for requests to an AgentCore session endpoint.
3
+ *
4
+ * Only the Superblocks server signs these requests: it holds the AWS
5
+ * credentials, and the live-edit pod asks it for each signature. The signer
6
+ * lives here so the server and the tests that check the pod's wire format
7
+ * share one implementation. Import it as
8
+ * `@superblocksteam/workspace-sync/sigv4`.
9
+ */
10
+ import { Sha256 } from "@aws-crypto/sha256-js";
11
+ import { SignatureV4 } from "@smithy/signature-v4";
12
+ export const UNSIGNED_PAYLOAD = "UNSIGNED-PAYLOAD";
13
+ /** True for headers the SigV4 signer covers: `host` and `x-amz-*`. */
14
+ export function isSignedHeader(name) {
15
+ return name === "host" || name.startsWith("x-amz-");
16
+ }
17
+ /**
18
+ * Parses form-encoded query parameters as AgentCore does, preserving repeated keys.
19
+ */
20
+ function parseQuery(search) {
21
+ const query = {};
22
+ for (const pair of search.replace(/^\?/, "").split("&")) {
23
+ if (!pair)
24
+ continue;
25
+ const eq = pair.indexOf("=");
26
+ const key = decodeComponent(eq === -1 ? pair : pair.slice(0, eq));
27
+ const value = eq === -1 ? "" : decodeComponent(pair.slice(eq + 1));
28
+ const existing = query[key];
29
+ if (existing === undefined)
30
+ query[key] = value;
31
+ else if (Array.isArray(existing))
32
+ existing.push(value);
33
+ else
34
+ query[key] = [existing, value];
35
+ }
36
+ return query;
37
+ }
38
+ function decodeComponent(value) {
39
+ const formDecoded = value.replace(/\+/g, " ");
40
+ try {
41
+ return decodeURIComponent(formDecoded);
42
+ }
43
+ catch {
44
+ return formDecoded;
45
+ }
46
+ }
47
+ /**
48
+ * A SigV4 header signer (default service `bedrock-agentcore`). It signs only
49
+ * `host` and `x-amz-*` headers with `x-amz-content-sha256: UNSIGNED-PAYLOAD`,
50
+ * so connection, upgrade, Sec-WebSocket-*, length and encoding headers stay
51
+ * free for intermediaries to rewrite. Returned headers are the input headers
52
+ * plus `authorization`, `x-amz-date`, `x-amz-content-sha256` and, with
53
+ * session credentials, `x-amz-security-token`.
54
+ */
55
+ export function createSigV4Signer(options) {
56
+ const signer = new SignatureV4({
57
+ credentials: options.credentials,
58
+ region: options.region,
59
+ service: options.service ?? "bedrock-agentcore",
60
+ sha256: Sha256,
61
+ uriEscapePath: true,
62
+ applyChecksum: false,
63
+ });
64
+ const now = options.now ?? (() => new Date());
65
+ return {
66
+ async sign({ method, url, headers }) {
67
+ const signable = {};
68
+ for (const [name, value] of Object.entries(headers)) {
69
+ const lower = name.toLowerCase();
70
+ if (isSignedHeader(lower))
71
+ signable[lower] = value;
72
+ }
73
+ // Always the URL's own host: a caller-chosen Host would sign for
74
+ // another endpoint than the one the URL names.
75
+ signable.host = url.host;
76
+ signable["x-amz-content-sha256"] = UNSIGNED_PAYLOAD;
77
+ const signed = await signer.sign({
78
+ method,
79
+ protocol: url.protocol,
80
+ hostname: url.hostname,
81
+ port: url.port ? Number(url.port) : undefined,
82
+ path: url.pathname,
83
+ query: parseQuery(url.search),
84
+ headers: signable,
85
+ }, { signingDate: now() });
86
+ const out = {};
87
+ for (const [name, value] of Object.entries(headers)) {
88
+ out[name.toLowerCase()] = value;
89
+ }
90
+ for (const [name, value] of Object.entries(signed.headers)) {
91
+ out[name.toLowerCase()] = value;
92
+ }
93
+ return out;
94
+ },
95
+ };
96
+ }
97
+ //# sourceMappingURL=sigv4.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sigv4.js","sourceRoot":"","sources":["../src/sigv4.ts"],"names":[],"mappings":"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"}
@@ -12,6 +12,12 @@ export interface SnapshotUploadTarget {
12
12
  validateMany?: (items: PutManyItems) => Promise<void>;
13
13
  putMany: (items: PutManyItems) => Promise<void>;
14
14
  }
15
+ /**
16
+ * The server's refusal of a listing or a root over hashes this application does not own. It also means the server
17
+ * no longer remembers an upload that this client's hash cache still counts as stored. Only that refusal carries
18
+ * the reason; a token bound to another app or branch gets the same message without it, and re-uploading cannot fix that.
19
+ */
20
+ export declare function isUploadRefusal(error: unknown): boolean;
15
21
  /**
16
22
  * The putMany items that bring the server up to `directorySnapshot`, children
17
23
  * before the listings that reference them. Hashes the cache already knows are
@@ -1 +1 @@
1
- {"version":3,"file":"upload-snapshot.d.ts","sourceRoot":"","sources":["../../src/snapshot/upload-snapshot.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAEV,qBAAqB,EACtB,MAAM,yBAAyB,CAAC;AAEjC,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAC;AAClD,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,kBAAkB,CAAC;AAC5D,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,YAAY,CAAC;AAIpD,MAAM,MAAM,YAAY,GAAG,qBAAqB,CAAC,OAAO,CAAC,CAAC;AAE1D,mDAAmD;AACnD,MAAM,WAAW,oBAAoB;IACnC;;;OAGG;IACH,YAAY,CAAC,EAAE,CAAC,KAAK,EAAE,YAAY,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;IACtD,OAAO,EAAE,CAAC,KAAK,EAAE,YAAY,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;CACjD;AAWD;;;;GAIG;AACH,wBAAgB,0BAA0B,CACxC,iBAAiB,EAAE,iBAAiB,EACpC,SAAS,EAAE,SAAS,GACnB,YAAY,CAwDd;AAED;;;GAGG;AACH,wBAAsB,mBAAmB,CACvC,MAAM,EAAE,oBAAoB,EAC5B,aAAa,EAAE,YAAY,GAC1B,OAAO,CAAC,MAAM,CAAC,CAajB;AAED,wBAAsB,uBAAuB,CAC3C,SAAS,EAAE,mBAAmB,EAC9B,iBAAiB,EAAE,iBAAiB,EACpC,SAAS,EAAE,SAAS,GACnB,OAAO,CAAC,IAAI,CAAC,CAKf;AAED;;;;GAIG;AACH,wBAAgB,0BAA0B,CACxC,SAAS,EAAE,mBAAmB,GAC7B,oBAAoB,CAiBtB"}
1
+ {"version":3,"file":"upload-snapshot.d.ts","sourceRoot":"","sources":["../../src/snapshot/upload-snapshot.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAEV,qBAAqB,EACtB,MAAM,yBAAyB,CAAC;AAEjC,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAC;AAClD,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,kBAAkB,CAAC;AAC5D,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,YAAY,CAAC;AAIpD,MAAM,MAAM,YAAY,GAAG,qBAAqB,CAAC,OAAO,CAAC,CAAC;AAE1D,mDAAmD;AACnD,MAAM,WAAW,oBAAoB;IACnC;;;OAGG;IACH,YAAY,CAAC,EAAE,CAAC,KAAK,EAAE,YAAY,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;IACtD,OAAO,EAAE,CAAC,KAAK,EAAE,YAAY,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;CACjD;AAWD;;;;GAIG;AACH,wBAAgB,eAAe,CAAC,KAAK,EAAE,OAAO,GAAG,OAAO,CAOvD;AAED;;;;GAIG;AACH,wBAAgB,0BAA0B,CACxC,iBAAiB,EAAE,iBAAiB,EACpC,SAAS,EAAE,SAAS,GACnB,YAAY,CAwDd;AAED;;;GAGG;AACH,wBAAsB,mBAAmB,CACvC,MAAM,EAAE,oBAAoB,EAC5B,aAAa,EAAE,YAAY,GAC1B,OAAO,CAAC,MAAM,CAAC,CAajB;AAED,wBAAsB,uBAAuB,CAC3C,SAAS,EAAE,mBAAmB,EAC9B,iBAAiB,EAAE,iBAAiB,EACpC,SAAS,EAAE,SAAS,GACnB,OAAO,CAAC,IAAI,CAAC,CAKf;AAED;;;;GAIG;AACH,wBAAgB,0BAA0B,CACxC,SAAS,EAAE,mBAAmB,GAC7B,oBAAoB,CAiBtB"}
@@ -1,4 +1,4 @@
1
- import { unwrapResponseDto } from "@superblocksteam/shared";
1
+ import { SYNC_OBJECT_NOT_OWNED_REASON, unwrapResponseDto, } from "@superblocksteam/shared";
2
2
  const BATCH_SIZE = 64;
3
3
  function isUnsupportedMethod(error) {
4
4
  return (typeof error === "object" &&
@@ -6,6 +6,17 @@ function isUnsupportedMethod(error) {
6
6
  "code" in error &&
7
7
  error.code === 2);
8
8
  }
9
+ /**
10
+ * The server's refusal of a listing or a root over hashes this application does not own. It also means the server
11
+ * no longer remembers an upload that this client's hash cache still counts as stored. Only that refusal carries
12
+ * the reason; a token bound to another app or branch gets the same message without it, and re-uploading cannot fix that.
13
+ */
14
+ export function isUploadRefusal(error) {
15
+ return (typeof error === "object" &&
16
+ error !== null &&
17
+ "reason" in error &&
18
+ error.reason === SYNC_OBJECT_NOT_OWNED_REASON);
19
+ }
9
20
  /**
10
21
  * The putMany items that bring the server up to `directorySnapshot`, children
11
22
  * before the listings that reference them. Hashes the cache already knows are
@@ -1 +1 @@
1
- {"version":3,"file":"upload-snapshot.js","sourceRoot":"","sources":["../../src/snapshot/upload-snapshot.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"upload-snapshot.js","sourceRoot":"","sources":["../../src/snapshot/upload-snapshot.ts"],"names":[],"mappings":"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"}
@@ -23,7 +23,7 @@ export declare class SocketDbfsTransport implements DbfsTransport {
23
23
  putMany(items: PutManyItems): Promise<string[]>;
24
24
  getDirectory(hash: string): Promise<DirectoryEntry[]>;
25
25
  getContents(rootHash: string, files: DbfsFileRef[]): Promise<Buffer[]>;
26
- getBlob(hash: string): Promise<Buffer>;
26
+ private getBlob;
27
27
  getServerHash(): Promise<string>;
28
28
  setHash({ hash, source }: SetHashRequest): Promise<SetHashResult>;
29
29
  setDraftState(hasDraft: boolean): Promise<void>;
@@ -1 +1 @@
1
- {"version":3,"file":"socket-dbfs-transport.d.ts","sourceRoot":"","sources":["../src/socket-dbfs-transport.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,yBAAyB,CAAC;AAE9D,OAAO,KAAK,EACV,WAAW,EACX,aAAa,EACb,cAAc,EACd,aAAa,EACd,MAAM,qBAAqB,CAAC;AAG7B,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,iBAAiB,CAAC;AAC3D,OAAO,EACL,KAAK,YAAY,EAElB,MAAM,+BAA+B,CAAC;AAKvC,MAAM,WAAW,0BAA0B;IACzC;;;OAGG;IACH,SAAS,EAAE,mBAAmB,GAAG,CAAC,MAAM,mBAAmB,CAAC,CAAC;IAC7D,aAAa,EAAE,MAAM,CAAC;IACtB,UAAU,EAAE,MAAM,GAAG,SAAS,CAAC;CAChC;AAED;;;GAGG;AACH,qBAAa,mBAAoB,YAAW,aAAa;IAC3C,OAAO,CAAC,QAAQ,CAAC,OAAO;IAApC,YAA6B,OAAO,EAAE,0BAA0B,EAAI;IAEpE,OAAO,KAAK,MAAM,GAGjB;IAEK,YAAY,CAAC,KAAK,EAAE,YAAY,GAAG,OAAO,CAAC,IAAI,CAAC,CAErD;IAEK,OAAO,CAAC,KAAK,EAAE,YAAY,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC,CAKpD;IAEK,YAAY,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,cAAc,EAAE,CAAC,CAK1D;IAEK,WAAW,CAAC,QAAQ,EAAE,MAAM,EAAE,KAAK,EAAE,WAAW,EAAE,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC,CA2B3E;IAEK,OAAO,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAK3C;IAEK,aAAa,IAAI,OAAO,CAAC,MAAM,CAAC,CAQrC;IAEK,OAAO,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,EAAE,cAAc,GAAG,OAAO,CAAC,aAAa,CAAC,CAgBtE;IAEK,aAAa,CAAC,QAAQ,EAAE,OAAO,GAAG,OAAO,CAAC,IAAI,CAAC,CAQpD;YAEa,YAAY;CAoB3B"}
1
+ {"version":3,"file":"socket-dbfs-transport.d.ts","sourceRoot":"","sources":["../src/socket-dbfs-transport.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,yBAAyB,CAAC;AAE9D,OAAO,KAAK,EACV,WAAW,EACX,aAAa,EACb,cAAc,EACd,aAAa,EACd,MAAM,qBAAqB,CAAC;AAG7B,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,iBAAiB,CAAC;AAC3D,OAAO,EACL,KAAK,YAAY,EAElB,MAAM,+BAA+B,CAAC;AAKvC,MAAM,WAAW,0BAA0B;IACzC;;;OAGG;IACH,SAAS,EAAE,mBAAmB,GAAG,CAAC,MAAM,mBAAmB,CAAC,CAAC;IAC7D,aAAa,EAAE,MAAM,CAAC;IACtB,UAAU,EAAE,MAAM,GAAG,SAAS,CAAC;CAChC;AAED;;;GAGG;AACH,qBAAa,mBAAoB,YAAW,aAAa;IAC3C,OAAO,CAAC,QAAQ,CAAC,OAAO;IAApC,YAA6B,OAAO,EAAE,0BAA0B,EAAI;IAEpE,OAAO,KAAK,MAAM,GAGjB;IAEK,YAAY,CAAC,KAAK,EAAE,YAAY,GAAG,OAAO,CAAC,IAAI,CAAC,CAErD;IAEK,OAAO,CAAC,KAAK,EAAE,YAAY,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC,CAKpD;IAEK,YAAY,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,cAAc,EAAE,CAAC,CAK1D;IAEK,WAAW,CAAC,QAAQ,EAAE,MAAM,EAAE,KAAK,EAAE,WAAW,EAAE,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC,CA2B3E;YAEa,OAAO;IAOf,aAAa,IAAI,OAAO,CAAC,MAAM,CAAC,CAQrC;IAEK,OAAO,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,EAAE,cAAc,GAAG,OAAO,CAAC,aAAa,CAAC,CAoBtE;IAEK,aAAa,CAAC,QAAQ,EAAE,OAAO,GAAG,OAAO,CAAC,IAAI,CAAC,CAQpD;YAEa,YAAY;CAoB3B"}
@@ -75,6 +75,10 @@ export class SocketDbfsTransport {
75
75
  return {
76
76
  hash: response.hash ?? hash,
77
77
  ...(response.commitId ? { commitId: response.commitId } : {}),
78
+ ...(response.checkpointSkipped
79
+ ? { checkpointSkipped: response.checkpointSkipped }
80
+ : {}),
81
+ ...(response.heldPaths ? { heldPaths: response.heldPaths } : {}),
78
82
  };
79
83
  }
80
84
  async setDraftState(hasDraft) {
@@ -1 +1 @@
1
- {"version":3,"file":"socket-dbfs-transport.js","sourceRoot":"","sources":["../src/socket-dbfs-transport.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"socket-dbfs-transport.js","sourceRoot":"","sources":["../src/socket-dbfs-transport.ts"],"names":[],"mappings":"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"}
@@ -5,8 +5,8 @@ export interface SyncCredential {
5
5
  expiresAt?: number;
6
6
  }
7
7
  /**
8
- * Supplies the current sync credential. The interim implementation is a narrow
9
- * server token the edge pushes before expiry; AR-1074 hardens or replaces it.
8
+ * Supplies the current sync credential: a narrow server token, bound to one
9
+ * application branch, that the edge pushes before expiry.
10
10
  */
11
11
  export interface SyncCredentialProvider {
12
12
  /** The latest credential, or undefined before the first one arrives. */
@@ -1,5 +1,5 @@
1
1
  import type { Meter, Tracer } from "@opentelemetry/api";
2
- import type { ApplicationHashChangeSource } from "@superblocksteam/shared";
2
+ import type { ApplicationHashChangeSource, CheckpointSkipReason } from "@superblocksteam/shared";
3
3
  import { type BranchWriteGuard } from "./branch-write-guard.js";
4
4
  import type { DbfsTransport } from "./dbfs-transport.js";
5
5
  import { HashCache } from "./hash-cache.js";
@@ -42,14 +42,36 @@ export interface CommitOptions {
42
42
  * running; the journal then stays open. Defaults to true.
43
43
  */
44
44
  finalizeJournal?: boolean;
45
+ /**
46
+ * Send the hash even when it matches the stored one, and report the draft
47
+ * state even when it was already reported. The server records an accept or
48
+ * reject against its last checkpoint and drafts, not the branch hash: an
49
+ * accept of drafts the turn-end commit already uploaded must still reach it.
50
+ */
51
+ checkpoint?: boolean;
52
+ /**
53
+ * Settles the draft markers (accept, reject or clear) inside the commit
54
+ * queue, after the branch guard passes and the draft journal is dropped,
55
+ * and before the snapshot. No
56
+ * other commit can then reconcile the journal or report draft state between
57
+ * the markers changing and this commit.
58
+ */
59
+ settle?: () => Promise<void>;
45
60
  }
46
61
  export interface CommitResult {
47
62
  dbfsHash: string;
48
63
  commitId?: string;
64
+ /** Why the server made no checkpoint, when it skipped one by design. */
65
+ checkpointSkipped?: CheckpointSkipReason;
49
66
  /** False when the tree already matched the stored hash. */
50
67
  moved: boolean;
51
68
  /** Paths the journal reconcile found changed, when a journal is active. */
52
69
  journalChangedPaths?: string[];
70
+ /**
71
+ * Protected paths whose changes the server holds for a user's approval.
72
+ * The workspace then holds the server's tree, without those changes.
73
+ */
74
+ heldPaths?: string[];
53
75
  }
54
76
  export interface FlushResult {
55
77
  /** Hash of the tree whose blobs were uploaded. */
@@ -99,6 +121,17 @@ export interface WorkspaceSyncEngine {
99
121
  interimFlush(): Promise<FlushResult>;
100
122
  /** The turn-end commit. */
101
123
  commit(source: ApplicationHashChangeSource, options?: CommitOptions): Promise<CommitResult>;
124
+ /**
125
+ * Reports whether the tree holds drafts, even when that was already
126
+ * reported. For a draft change that moves no hash, such as clearing markers.
127
+ */
128
+ resendDraftState(options?: Pick<CommitOptions, "settle">): Promise<void>;
129
+ /**
130
+ * Loads the server's tree when the branch moved and this workspace has
131
+ * nothing unsaved, for example after a user approved a held change.
132
+ * Resolves true when it loaded a tree.
133
+ */
134
+ pull(): Promise<boolean>;
102
135
  /** True while the tree has changes the branch hash does not include. */
103
136
  readonly unsynced: boolean;
104
137
  /** The hash last committed or loaded, once known. */
@@ -1 +1 @@
1
- {"version":3,"file":"sync-engine.d.ts","sourceRoot":"","sources":["../src/sync-engine.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"sync-engine.d.ts","sourceRoot":"","sources":["../src/sync-engine.ts"],"names":[],"mappings":"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"}
@@ -1,11 +1,11 @@
1
1
  import * as fsp from "node:fs/promises";
2
2
  import { BranchWriteRejectedError, } from "./branch-write-guard.js";
3
- import { hasSwapFiles } from "./draft-helpers.js";
3
+ import { hasDraftsFailClosed } from "./draft-helpers.js";
4
4
  import { HashCache } from "./hash-cache.js";
5
5
  import { hashLocalDirectory } from "./hash-dir-tree.js";
6
6
  import { downloadServerTree, flattenTree, readServerTree, } from "./server-tree.js";
7
7
  import { snapshotLocalDirectory, snapshotLocalDirectoryWithDrafts, } from "./snapshot/take-snapshot.js";
8
- import { collectSnapshotUploadItems, uploadSnapshotItems, } from "./snapshot/upload-snapshot.js";
8
+ import { collectSnapshotUploadItems, isUploadRefusal, uploadSnapshotItems, } from "./snapshot/upload-snapshot.js";
9
9
  import { createSyncTelemetry, inSpan, } from "./sync-telemetry.js";
10
10
  const BLOB_BATCH = 64;
11
11
  const NOTHING_DOWNLOADED = { files: 0, bytes: 0 };
@@ -67,7 +67,41 @@ class SyncEngine {
67
67
  }));
68
68
  }
69
69
  commit(source, options = {}) {
70
- return this.serialize(() => this.commitNow(source, options.finalizeJournal === false ? "keep" : "finalize"));
70
+ const { settle } = options;
71
+ return this.serialize(async () => {
72
+ if (settle)
73
+ await this.settleNow(settle);
74
+ return this.commitNow(source, settle
75
+ ? "skip"
76
+ : options.finalizeJournal === false
77
+ ? "keep"
78
+ : "finalize", options.checkpoint ?? false);
79
+ });
80
+ }
81
+ resendDraftState(options = {}) {
82
+ const { settle } = options;
83
+ return this.serialize(async () => {
84
+ if (settle)
85
+ await this.settleNow(settle);
86
+ await this.reportDraftState({
87
+ force: true,
88
+ beforeSend: () => this.assertOwnsBranch(),
89
+ });
90
+ });
91
+ }
92
+ pull() {
93
+ return this.serialize(async () => {
94
+ const serverHash = await this.options.transport.getServerHash();
95
+ const storedHash = (await this.options.state.read())?.dbfsHash;
96
+ if (serverHash === storedHash)
97
+ return false;
98
+ // Unsaved changes stay: the commit guard then reports the moved branch.
99
+ if ((await this.hashLocalTree())?.hash !== storedHash)
100
+ return false;
101
+ await this.loadServerTree(serverHash);
102
+ this.updateUnsynced();
103
+ return true;
104
+ });
71
105
  }
72
106
  rehydrate(options = {}) {
73
107
  return this.serialize(() => inSpan(this.telemetry.tracer, "workspace.rehydrate", async (span) => {
@@ -164,8 +198,16 @@ class SyncEngine {
164
198
  const reconciled = await journal.reconcile(false);
165
199
  if (reconciled) {
166
200
  result.interruptedJournal = { changedPaths: reconciled.changedPaths };
201
+ // Without the branch the flag is not this workspace's to set; the
202
+ // next commit reports it once the guard passes.
167
203
  if (reconciled.changedPaths.length > 0)
168
- await this.reportDraftState();
204
+ await this.reportDraftState({
205
+ only: true,
206
+ beforeSend: () => this.assertOwnsBranch(),
207
+ }).catch((error) => {
208
+ if (!(error instanceof BranchWriteRejectedError))
209
+ throw error;
210
+ });
169
211
  }
170
212
  }
171
213
  if (result.outcome !== "replayed" || result.replayCommitted)
@@ -173,28 +215,51 @@ class SyncEngine {
173
215
  this.updateUnsynced();
174
216
  return result;
175
217
  }
176
- async commitNow(source, journalMode) {
177
- const { root, transport, state, journal, guard } = this.options;
218
+ async commitNow(source, journalMode, checkpoint = false) {
219
+ const { root, state, journal, guard } = this.options;
178
220
  const started = performance.now();
179
221
  let outcome = "error";
180
222
  try {
181
223
  return await inSpan(this.telemetry.tracer, "workspace.commit", async (span) => {
182
224
  span.setAttribute("workspace.sync.source", source);
225
+ span.setAttribute("workspace.sync.checkpoint", checkpoint);
183
226
  const writesAtStart = this.writes;
184
227
  let journalChangedPaths;
185
228
  if (journal && journalMode !== "skip") {
186
229
  const reconciled = await journal.reconcile(journalMode === "finalize");
187
230
  journalChangedPaths = reconciled?.changedPaths;
188
231
  }
232
+ const baseHash = (await state.read())?.dbfsHash;
233
+ const assertCanCommit = async () => {
234
+ try {
235
+ await guard.assertCanCommit(baseHash);
236
+ }
237
+ catch (error) {
238
+ if (error instanceof BranchWriteRejectedError) {
239
+ outcome = "rejected";
240
+ span.setAttribute("workspace.sync.rejection", error.reason);
241
+ }
242
+ throw error;
243
+ }
244
+ };
245
+ // Drafts go before the hash: the server files an
246
+ // `ai:generate:post` as a draft only while it holds isDraft=true.
247
+ // Reported after, a turn's first drafts become a manual checkpoint,
248
+ // and the accept that follows finds nothing new to checkpoint. The
249
+ // guard runs first, so a workspace that lost the branch cannot
250
+ // flip the shared flag.
251
+ await this.reportDraftState({
252
+ only: true,
253
+ force: checkpoint,
254
+ beforeSend: assertCanCommit,
255
+ });
189
256
  await this.fault("after-write-before-flush");
190
257
  const snapshot = await snapshotLocalDirectoryWithDrafts(root);
191
258
  const hash = snapshot.hash;
192
259
  this.localHash = hash;
193
- const baseHash = (await state.read())?.dbfsHash;
194
- if (hash === baseHash) {
260
+ if (hash === baseHash && !checkpoint) {
195
261
  this.committedHash = baseHash;
196
262
  await journal?.retireUploaded(hash);
197
- await this.reportDraftState();
198
263
  this.committedWrites = writesAtStart;
199
264
  this.updateUnsynced();
200
265
  outcome = "unchanged";
@@ -208,34 +273,47 @@ class SyncEngine {
208
273
  const uploadedItems = await this.upload(snapshot);
209
274
  span.setAttribute("workspace.sync.uploaded_items", uploadedItems);
210
275
  await this.fault("after-put-before-set");
211
- try {
212
- await guard.assertCanCommit(baseHash);
213
- }
214
- catch (error) {
215
- if (error instanceof BranchWriteRejectedError) {
216
- outcome = "rejected";
217
- span.setAttribute("workspace.sync.rejection", error.reason);
218
- }
219
- throw error;
220
- }
221
- const result = await transport.setHash({ hash, baseHash, source });
276
+ await assertCanCommit();
277
+ const result = await this.setHashRecovering(snapshot, { hash, baseHash, source }, assertCanCommit);
278
+ if (result.checkpointSkipped)
279
+ span.setAttribute("workspace.sync.checkpoint_skipped", result.checkpointSkipped);
222
280
  await this.fault("after-set-before-state");
223
- await state.write({ dbfsHash: hash });
224
- this.committedHash = hash;
281
+ // The server stored another tree when it held protected changes.
282
+ // Apply what differs from the upload, so edits made since stay.
283
+ const committed = result.hash;
284
+ if (committed === hash) {
285
+ await state.write({ dbfsHash: hash });
286
+ this.committedHash = hash;
287
+ }
288
+ else
289
+ await this.loadServerTree(committed, snapshot);
225
290
  await journal?.retireUploaded(hash);
226
- await this.reportDraftState();
227
291
  this.committedWrites = writesAtStart;
228
292
  this.updateUnsynced();
293
+ // Only an accept or reject checkpoint clears the flag, and only
294
+ // once the server has its hash. A plain commit never does: after a
295
+ // failed accept the markers are gone, and clearing then would make
296
+ // the AI tree publishable without its checkpoint.
297
+ if (checkpoint)
298
+ await this.reportDraftState({
299
+ only: false,
300
+ force: true,
301
+ beforeSend: () => this.assertOwnsBranch(),
302
+ });
229
303
  outcome = "committed";
230
304
  span.setAttribute("workspace.sync.outcome", outcome);
231
305
  this.emit("committed", {
232
- dbfsHash: hash,
306
+ dbfsHash: committed,
233
307
  ...(result.commitId && { commitId: result.commitId }),
234
308
  });
235
309
  return {
236
- dbfsHash: hash,
237
- moved: true,
310
+ dbfsHash: committed,
311
+ moved: committed !== baseHash,
312
+ ...(result.heldPaths?.length && { heldPaths: result.heldPaths }),
238
313
  ...(result.commitId && { commitId: result.commitId }),
314
+ ...(result.checkpointSkipped && {
315
+ checkpointSkipped: result.checkpointSkipped,
316
+ }),
239
317
  ...(journalChangedPaths && { journalChangedPaths }),
240
318
  };
241
319
  });
@@ -244,15 +322,48 @@ class SyncEngine {
244
322
  this.telemetry.commitDuration.record((performance.now() - started) / 1000, { outcome });
245
323
  }
246
324
  }
325
+ /**
326
+ * Moves the branch to `snapshot`'s root. The server also refuses a root it does not remember this
327
+ * application uploading, which can happen when this engine's cache skipped uploading it. The
328
+ * recovery is the one `upload` uses: forget the cache, send the whole tree, check the branch guard again and ask once more.
329
+ */
330
+ async setHashRecovering(snapshot, request, assertCanCommit) {
331
+ const { transport } = this.options;
332
+ try {
333
+ return await transport.setHash(request);
334
+ }
335
+ catch (error) {
336
+ if (!isUploadRefusal(error))
337
+ throw error;
338
+ this.hashCache.empty();
339
+ await this.upload(snapshot);
340
+ // The re-upload takes time, and the client's branch check is the only compare-and-set on this move, so ask again.
341
+ await assertCanCommit();
342
+ return await transport.setHash(request);
343
+ }
344
+ }
247
345
  /** Puts what DBFS lacks for `snapshot`; returns the items sent. */
248
346
  async upload(snapshot) {
249
347
  const { transport } = this.options;
250
- const sent = await uploadSnapshotItems({
348
+ const send = () => uploadSnapshotItems({
251
349
  validateMany: (items) => transport.validateMany(items),
252
350
  putMany: async (items) => {
253
351
  await transport.putMany(items);
254
352
  },
255
353
  }, collectSnapshotUploadItems(snapshot, this.hashCache));
354
+ let sent;
355
+ try {
356
+ sent = await send();
357
+ }
358
+ catch (error) {
359
+ if (!isUploadRefusal(error))
360
+ throw error;
361
+ // The server only accepts a listing over objects it remembers this application uploading, and it forgets
362
+ // them after a while. This cache can still count such an object as stored, so forget the cache and send
363
+ // the whole tree again. A second refusal is a real one and surfaces to the caller.
364
+ this.hashCache.empty();
365
+ sent = await send();
366
+ }
256
367
  this.hashCache.add_directory_recursive(snapshot);
257
368
  return sent;
258
369
  }
@@ -267,6 +378,21 @@ class SyncEngine {
267
378
  const local = await hashLocalDirectory(this.options.root);
268
379
  return local.contents.length === 0 ? undefined : local;
269
380
  }
381
+ /**
382
+ * Writes the server's tree over the paths where it differs from `local`
383
+ * (by default the tree on disk now) and records its hash.
384
+ */
385
+ async loadServerTree(serverHash, local) {
386
+ const { root, transport } = this.options;
387
+ const tree = await readServerTree(transport, serverHash);
388
+ await downloadServerTree({
389
+ transport,
390
+ tree,
391
+ local: local ?? (await this.hashLocalTree()),
392
+ root,
393
+ });
394
+ await this.storeLoaded(serverHash, tree);
395
+ }
270
396
  async storeLoaded(hash, tree) {
271
397
  await this.options.state.write({ dbfsHash: hash });
272
398
  this.hashCache.add_directory_recursive(tree);
@@ -326,11 +452,44 @@ class SyncEngine {
326
452
  deleted,
327
453
  });
328
454
  }
329
- async reportDraftState() {
455
+ /**
456
+ * Runs `settle` once the guard lets this workspace write the branch, so a
457
+ * refused settle leaves the markers and the server's draft flag as they
458
+ * were. A running journal (its turn-end reconcile failed) is reconciled
459
+ * first, so every marker is there to accept or restore. The journal is then
460
+ * dropped, since its next reconcile would rebuild the markers `settle`
461
+ * removes. Callers hold the queue.
462
+ */
463
+ async settleNow(settle) {
464
+ await this.assertOwnsBranch();
465
+ const { journal } = this.options;
466
+ if (journal && (await journal.phase()) === "running")
467
+ await journal.reconcile(false);
468
+ await journal?.clear();
469
+ await settle();
470
+ }
471
+ /**
472
+ * The server's draft flag is shared by the branch, so only the workspace
473
+ * the guard lets write the branch may change it: the lock holder, on the
474
+ * hash it last committed.
475
+ */
476
+ async assertOwnsBranch() {
477
+ await this.options.guard.assertCanCommit((await this.options.state.read())?.dbfsHash);
478
+ }
479
+ /**
480
+ * Sends the tree's draft state when it changed, or always with `force`.
481
+ * With `only`, sends it only when the tree's state is that value;
482
+ * `beforeSend` runs only when it is about to be sent.
483
+ */
484
+ async reportDraftState(options = {}) {
485
+ const { force = false, only, beforeSend } = options;
330
486
  const hasDraft = await (this.options.hasDraft?.() ??
331
- hasSwapFiles(this.options.root));
332
- if (hasDraft === this.reportedDraft)
487
+ hasDraftsFailClosed(this.options.root));
488
+ if (only !== undefined && hasDraft !== only)
489
+ return;
490
+ if (!force && hasDraft === this.reportedDraft)
333
491
  return;
492
+ await beforeSend?.();
334
493
  await this.options.transport.setDraftState(hasDraft);
335
494
  this.reportedDraft = hasDraft;
336
495
  }