pushwork 1.2.2 → 1.2.4

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 (147) hide show
  1. package/dist/browser/browser-sync-engine.d.ts +64 -0
  2. package/dist/browser/browser-sync-engine.d.ts.map +1 -0
  3. package/dist/browser/browser-sync-engine.js +303 -0
  4. package/dist/browser/browser-sync-engine.js.map +1 -0
  5. package/dist/browser/filesystem-adapter.d.ts +84 -0
  6. package/dist/browser/filesystem-adapter.d.ts.map +1 -0
  7. package/dist/browser/filesystem-adapter.js +413 -0
  8. package/dist/browser/filesystem-adapter.js.map +1 -0
  9. package/dist/browser/index.d.ts +36 -0
  10. package/dist/browser/index.d.ts.map +1 -0
  11. package/dist/browser/index.js +90 -0
  12. package/dist/browser/index.js.map +1 -0
  13. package/dist/browser/types.d.ts +70 -0
  14. package/dist/browser/types.d.ts.map +1 -0
  15. package/dist/browser/types.js +6 -0
  16. package/dist/browser/types.js.map +1 -0
  17. package/dist/cli/commands.d.ts +77 -0
  18. package/dist/cli/commands.d.ts.map +1 -0
  19. package/dist/cli/commands.js +904 -0
  20. package/dist/cli/commands.js.map +1 -0
  21. package/dist/cli/index.d.ts +2 -0
  22. package/dist/cli/index.d.ts.map +1 -0
  23. package/dist/cli/index.js +19 -0
  24. package/dist/cli/index.js.map +1 -0
  25. package/dist/cli/output.d.ts +75 -0
  26. package/dist/cli/output.d.ts.map +1 -0
  27. package/dist/cli/output.js +182 -0
  28. package/dist/cli/output.js.map +1 -0
  29. package/dist/cli.js +0 -0
  30. package/dist/config/index.d.ts +71 -0
  31. package/dist/config/index.d.ts.map +1 -0
  32. package/dist/config/index.js +314 -0
  33. package/dist/config/index.js.map +1 -0
  34. package/dist/config/remote-manager.d.ts +65 -0
  35. package/dist/config/remote-manager.d.ts.map +1 -0
  36. package/dist/config/remote-manager.js +243 -0
  37. package/dist/config/remote-manager.js.map +1 -0
  38. package/dist/config.d.ts +16 -0
  39. package/dist/config.d.ts.map +1 -0
  40. package/dist/config.js +83 -0
  41. package/dist/config.js.map +1 -0
  42. package/dist/core/isomorphic-snapshot.d.ts +58 -0
  43. package/dist/core/isomorphic-snapshot.d.ts.map +1 -0
  44. package/dist/core/isomorphic-snapshot.js +204 -0
  45. package/dist/core/isomorphic-snapshot.js.map +1 -0
  46. package/dist/fs-tree.d.ts +6 -0
  47. package/dist/fs-tree.d.ts.map +1 -0
  48. package/dist/fs-tree.js +99 -0
  49. package/dist/fs-tree.js.map +1 -0
  50. package/dist/ignore.d.ts +6 -0
  51. package/dist/ignore.d.ts.map +1 -0
  52. package/dist/ignore.js +74 -0
  53. package/dist/ignore.js.map +1 -0
  54. package/dist/log.d.ts +3 -0
  55. package/dist/log.d.ts.map +1 -0
  56. package/dist/log.js +14 -0
  57. package/dist/log.js.map +1 -0
  58. package/dist/platform/browser-filesystem.d.ts +26 -0
  59. package/dist/platform/browser-filesystem.d.ts.map +1 -0
  60. package/dist/platform/browser-filesystem.js +91 -0
  61. package/dist/platform/browser-filesystem.js.map +1 -0
  62. package/dist/platform/filesystem.d.ts +29 -0
  63. package/dist/platform/filesystem.d.ts.map +1 -0
  64. package/dist/platform/filesystem.js +65 -0
  65. package/dist/platform/filesystem.js.map +1 -0
  66. package/dist/platform/node-filesystem.d.ts +21 -0
  67. package/dist/platform/node-filesystem.d.ts.map +1 -0
  68. package/dist/platform/node-filesystem.js +93 -0
  69. package/dist/platform/node-filesystem.js.map +1 -0
  70. package/dist/polyfill-node-window.d.ts +13 -0
  71. package/dist/polyfill-node-window.d.ts.map +1 -0
  72. package/dist/polyfill-node-window.js +17 -0
  73. package/dist/polyfill-node-window.js.map +1 -0
  74. package/dist/pushwork.d.ts +97 -0
  75. package/dist/pushwork.d.ts.map +1 -0
  76. package/dist/pushwork.js +726 -0
  77. package/dist/pushwork.js.map +1 -0
  78. package/dist/repo.d.ts +14 -0
  79. package/dist/repo.d.ts.map +1 -0
  80. package/dist/repo.js +60 -0
  81. package/dist/repo.js.map +1 -0
  82. package/dist/shapes/custom.d.ts +3 -0
  83. package/dist/shapes/custom.d.ts.map +1 -0
  84. package/dist/shapes/custom.js +57 -0
  85. package/dist/shapes/custom.js.map +1 -0
  86. package/dist/shapes/file.d.ts +20 -0
  87. package/dist/shapes/file.d.ts.map +1 -0
  88. package/dist/shapes/file.js +140 -0
  89. package/dist/shapes/file.js.map +1 -0
  90. package/dist/shapes/index.d.ts +10 -0
  91. package/dist/shapes/index.d.ts.map +1 -0
  92. package/dist/shapes/index.js +35 -0
  93. package/dist/shapes/index.js.map +1 -0
  94. package/dist/shapes/patchwork-folder.d.ts +3 -0
  95. package/dist/shapes/patchwork-folder.d.ts.map +1 -0
  96. package/dist/shapes/patchwork-folder.js +160 -0
  97. package/dist/shapes/patchwork-folder.js.map +1 -0
  98. package/dist/shapes/types.d.ts +38 -0
  99. package/dist/shapes/types.d.ts.map +1 -0
  100. package/dist/shapes/types.js +52 -0
  101. package/dist/shapes/types.js.map +1 -0
  102. package/dist/shapes/vfs.d.ts +3 -0
  103. package/dist/shapes/vfs.d.ts.map +1 -0
  104. package/dist/shapes/vfs.js +92 -0
  105. package/dist/shapes/vfs.js.map +1 -0
  106. package/dist/snarf.d.ts +21 -0
  107. package/dist/snarf.d.ts.map +1 -0
  108. package/dist/snarf.js +117 -0
  109. package/dist/snarf.js.map +1 -0
  110. package/dist/utils/content-similarity.d.ts +53 -0
  111. package/dist/utils/content-similarity.d.ts.map +1 -0
  112. package/dist/utils/content-similarity.js +155 -0
  113. package/dist/utils/content-similarity.js.map +1 -0
  114. package/dist/utils/fs-browser.d.ts +57 -0
  115. package/dist/utils/fs-browser.d.ts.map +1 -0
  116. package/dist/utils/fs-browser.js +311 -0
  117. package/dist/utils/fs-browser.js.map +1 -0
  118. package/dist/utils/fs-node.d.ts +53 -0
  119. package/dist/utils/fs-node.d.ts.map +1 -0
  120. package/dist/utils/fs-node.js +220 -0
  121. package/dist/utils/fs-node.js.map +1 -0
  122. package/dist/utils/isomorphic.d.ts +29 -0
  123. package/dist/utils/isomorphic.d.ts.map +1 -0
  124. package/dist/utils/isomorphic.js +139 -0
  125. package/dist/utils/isomorphic.js.map +1 -0
  126. package/dist/utils/node-polyfills.d.ts +9 -0
  127. package/dist/utils/node-polyfills.d.ts.map +1 -0
  128. package/dist/utils/node-polyfills.js +9 -0
  129. package/dist/utils/node-polyfills.js.map +1 -0
  130. package/dist/utils/pure.d.ts +25 -0
  131. package/dist/utils/pure.d.ts.map +1 -0
  132. package/dist/utils/pure.js +112 -0
  133. package/dist/utils/pure.js.map +1 -0
  134. package/dist/version.d.ts +11 -0
  135. package/dist/version.d.ts.map +1 -0
  136. package/dist/version.js +93 -0
  137. package/dist/version.js.map +1 -0
  138. package/package.json +96 -98
  139. package/scripts/roundtrip-test.sh +0 -0
  140. package/test/integration/clone-test.sh +0 -0
  141. package/test/integration/conflict-resolution-test.sh +0 -0
  142. package/test/integration/deletion-behavior-test.sh +0 -0
  143. package/test/integration/deletion-sync-test-simple.sh +0 -0
  144. package/test/integration/deletion-sync-test.sh +0 -0
  145. package/test/integration/full-integration-test.sh +0 -0
  146. package/test/integration/manual-sync-test.sh +0 -0
  147. package/test/run-tests.sh +0 -0
@@ -0,0 +1,38 @@
1
+ import type { AutomergeUrl, DocHandle, ImmutableString, Repo } from "@automerge/automerge-repo";
2
+ export type VfsNode = {
3
+ kind: "dir";
4
+ entries: Map<string, VfsNode>;
5
+ } | {
6
+ kind: "file";
7
+ url: AutomergeUrl;
8
+ };
9
+ export type UnixFileEntry = {
10
+ "@patchwork": {
11
+ type: "file";
12
+ };
13
+ content: string | Uint8Array | ImmutableString;
14
+ extension: string;
15
+ mimeType: string;
16
+ name: string;
17
+ };
18
+ export interface Shape {
19
+ encode(args: {
20
+ repo: Repo;
21
+ tree: VfsNode;
22
+ previousRoot?: DocHandle<unknown>;
23
+ title?: string;
24
+ }): Promise<AutomergeUrl>;
25
+ decode(args: {
26
+ repo: Repo;
27
+ root: DocHandle<unknown>;
28
+ }): Promise<VfsNode>;
29
+ }
30
+ export declare const newDir: () => VfsNode;
31
+ export declare function walkLeaves(node: VfsNode, prefix?: string[]): Generator<{
32
+ path: string[];
33
+ url: AutomergeUrl;
34
+ }>;
35
+ export declare function flattenLeaves(node: VfsNode): Map<string, AutomergeUrl>;
36
+ export declare function ensureDirAt(root: VfsNode, segments: string[]): VfsNode;
37
+ export declare function setFileAt(root: VfsNode, path: string[], url: AutomergeUrl): void;
38
+ //# sourceMappingURL=types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/shapes/types.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACX,YAAY,EACZ,SAAS,EACT,eAAe,EACf,IAAI,EACJ,MAAM,2BAA2B,CAAC;AAEnC,MAAM,MAAM,OAAO,GAChB;IAAE,IAAI,EAAE,KAAK,CAAC;IAAC,OAAO,EAAE,GAAG,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;CAAE,GAC9C;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,GAAG,EAAE,YAAY,CAAA;CAAE,CAAC;AAEvC,MAAM,MAAM,aAAa,GAAG;IAC3B,YAAY,EAAE;QAAE,IAAI,EAAE,MAAM,CAAA;KAAE,CAAC;IAC/B,OAAO,EAAE,MAAM,GAAG,UAAU,GAAG,eAAe,CAAC;IAC/C,SAAS,EAAE,MAAM,CAAC;IAClB,QAAQ,EAAE,MAAM,CAAC;IACjB,IAAI,EAAE,MAAM,CAAC;CACb,CAAC;AAEF,MAAM,WAAW,KAAK;IACrB,MAAM,CAAC,IAAI,EAAE;QACZ,IAAI,EAAE,IAAI,CAAC;QACX,IAAI,EAAE,OAAO,CAAC;QACd,YAAY,CAAC,EAAE,SAAS,CAAC,OAAO,CAAC,CAAC;QAClC,KAAK,CAAC,EAAE,MAAM,CAAC;KACf,GAAG,OAAO,CAAC,YAAY,CAAC,CAAC;IAC1B,MAAM,CAAC,IAAI,EAAE;QACZ,IAAI,EAAE,IAAI,CAAC;QACX,IAAI,EAAE,SAAS,CAAC,OAAO,CAAC,CAAC;KACzB,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC;CACrB;AAED,eAAO,MAAM,MAAM,QAAO,OAAgD,CAAC;AAE3E,wBAAiB,UAAU,CAC1B,IAAI,EAAE,OAAO,EACb,MAAM,GAAE,MAAM,EAAO,GACnB,SAAS,CAAC;IAAE,IAAI,EAAE,MAAM,EAAE,CAAC;IAAC,GAAG,EAAE,YAAY,CAAA;CAAE,CAAC,CAQlD;AAED,wBAAgB,aAAa,CAAC,IAAI,EAAE,OAAO,GAAG,GAAG,CAAC,MAAM,EAAE,YAAY,CAAC,CAItE;AAED,wBAAgB,WAAW,CAAC,IAAI,EAAE,OAAO,EAAE,QAAQ,EAAE,MAAM,EAAE,GAAG,OAAO,CAetE;AAED,wBAAgB,SAAS,CACxB,IAAI,EAAE,OAAO,EACb,IAAI,EAAE,MAAM,EAAE,EACd,GAAG,EAAE,YAAY,GACf,IAAI,CAKN"}
@@ -0,0 +1,52 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.newDir = void 0;
4
+ exports.walkLeaves = walkLeaves;
5
+ exports.flattenLeaves = flattenLeaves;
6
+ exports.ensureDirAt = ensureDirAt;
7
+ exports.setFileAt = setFileAt;
8
+ const newDir = () => ({ kind: "dir", entries: new Map() });
9
+ exports.newDir = newDir;
10
+ function* walkLeaves(node, prefix = []) {
11
+ if (node.kind === "file") {
12
+ yield { path: prefix, url: node.url };
13
+ return;
14
+ }
15
+ for (const [name, child] of node.entries) {
16
+ yield* walkLeaves(child, [...prefix, name]);
17
+ }
18
+ }
19
+ function flattenLeaves(node) {
20
+ const out = new Map();
21
+ for (const { path, url } of walkLeaves(node))
22
+ out.set(path.join("/"), url);
23
+ return out;
24
+ }
25
+ function ensureDirAt(root, segments) {
26
+ if (root.kind !== "dir")
27
+ throw new Error("ensureDirAt: root must be a dir");
28
+ let current = root;
29
+ for (const seg of segments) {
30
+ if (current.kind !== "dir")
31
+ throw new Error(`not a dir: ${seg}`);
32
+ const existing = current.entries.get(seg);
33
+ if (existing && existing.kind === "dir") {
34
+ current = existing;
35
+ }
36
+ else {
37
+ const fresh = (0, exports.newDir)();
38
+ current.entries.set(seg, fresh);
39
+ current = fresh;
40
+ }
41
+ }
42
+ return current;
43
+ }
44
+ function setFileAt(root, path, url) {
45
+ if (path.length === 0)
46
+ throw new Error("setFileAt: empty path");
47
+ const parent = ensureDirAt(root, path.slice(0, -1));
48
+ if (parent.kind !== "dir")
49
+ throw new Error("setFileAt: parent not a dir");
50
+ parent.entries.set(path[path.length - 1], { kind: "file", url });
51
+ }
52
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/shapes/types.ts"],"names":[],"mappings":";;;AAkCA,gCAWC;AAED,sCAIC;AAED,kCAeC;AAED,8BASC;AA/CM,MAAM,MAAM,GAAG,GAAY,EAAE,CAAC,CAAC,EAAE,IAAI,EAAE,KAAK,EAAE,OAAO,EAAE,IAAI,GAAG,EAAE,EAAE,CAAC,CAAC;AAA9D,QAAA,MAAM,UAAwD;AAE3E,QAAe,CAAC,CAAC,UAAU,CAC1B,IAAa,EACb,SAAmB,EAAE;IAErB,IAAI,IAAI,CAAC,IAAI,KAAK,MAAM,EAAE,CAAC;QAC1B,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,GAAG,EAAE,IAAI,CAAC,GAAG,EAAE,CAAC;QACtC,OAAO;IACR,CAAC;IACD,KAAK,MAAM,CAAC,IAAI,EAAE,KAAK,CAAC,IAAI,IAAI,CAAC,OAAO,EAAE,CAAC;QAC1C,KAAK,CAAC,CAAC,UAAU,CAAC,KAAK,EAAE,CAAC,GAAG,MAAM,EAAE,IAAI,CAAC,CAAC,CAAC;IAC7C,CAAC;AACF,CAAC;AAED,SAAgB,aAAa,CAAC,IAAa;IAC1C,MAAM,GAAG,GAAG,IAAI,GAAG,EAAwB,CAAC;IAC5C,KAAK,MAAM,EAAE,IAAI,EAAE,GAAG,EAAE,IAAI,UAAU,CAAC,IAAI,CAAC;QAAE,GAAG,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,GAAG,CAAC,CAAC;IAC3E,OAAO,GAAG,CAAC;AACZ,CAAC;AAED,SAAgB,WAAW,CAAC,IAAa,EAAE,QAAkB;IAC5D,IAAI,IAAI,CAAC,IAAI,KAAK,KAAK;QAAE,MAAM,IAAI,KAAK,CAAC,iCAAiC,CAAC,CAAC;IAC5E,IAAI,OAAO,GAAY,IAAI,CAAC;IAC5B,KAAK,MAAM,GAAG,IAAI,QAAQ,EAAE,CAAC;QAC5B,IAAI,OAAO,CAAC,IAAI,KAAK,KAAK;YAAE,MAAM,IAAI,KAAK,CAAC,cAAc,GAAG,EAAE,CAAC,CAAC;QACjE,MAAM,QAAQ,GAAG,OAAO,CAAC,OAAO,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;QAC1C,IAAI,QAAQ,IAAI,QAAQ,CAAC,IAAI,KAAK,KAAK,EAAE,CAAC;YACzC,OAAO,GAAG,QAAQ,CAAC;QACpB,CAAC;aAAM,CAAC;YACP,MAAM,KAAK,GAAG,IAAA,cAAM,GAAE,CAAC;YACvB,OAAO,CAAC,OAAO,CAAC,GAAG,CAAC,GAAG,EAAE,KAAK,CAAC,CAAC;YAChC,OAAO,GAAG,KAAK,CAAC;QACjB,CAAC;IACF,CAAC;IACD,OAAO,OAAO,CAAC;AAChB,CAAC;AAED,SAAgB,SAAS,CACxB,IAAa,EACb,IAAc,EACd,GAAiB;IAEjB,IAAI,IAAI,CAAC,MAAM,KAAK,CAAC;QAAE,MAAM,IAAI,KAAK,CAAC,uBAAuB,CAAC,CAAC;IAChE,MAAM,MAAM,GAAG,WAAW,CAAC,IAAI,EAAE,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC;IACpD,IAAI,MAAM,CAAC,IAAI,KAAK,KAAK;QAAE,MAAM,IAAI,KAAK,CAAC,6BAA6B,CAAC,CAAC;IAC1E,MAAM,CAAC,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,MAAM,GAAG,CAAC,CAAC,EAAE,EAAE,IAAI,EAAE,MAAM,EAAE,GAAG,EAAE,CAAC,CAAC;AAClE,CAAC"}
@@ -0,0 +1,3 @@
1
+ import { type Shape } from "./types.js";
2
+ export declare const vfsShape: Shape;
3
+ //# sourceMappingURL=vfs.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"vfs.d.ts","sourceRoot":"","sources":["../../src/shapes/vfs.ts"],"names":[],"mappings":"AAMA,OAAO,EAAyB,KAAK,KAAK,EAAgB,MAAM,YAAY,CAAC;AAwB7E,eAAO,MAAM,QAAQ,EAAE,KA+CtB,CAAC"}
@@ -0,0 +1,92 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.vfsShape = void 0;
4
+ const automerge_repo_1 = require("@automerge/automerge-repo");
5
+ const log_js_1 = require("../log.js");
6
+ const types_js_1 = require("./types.js");
7
+ const dlog = (0, log_js_1.log)("shapes:vfs");
8
+ const META = "@patchwork";
9
+ const isDirectoryDoc = (doc) => {
10
+ if (!doc || typeof doc !== "object")
11
+ return false;
12
+ const meta = doc[META];
13
+ return (!!meta &&
14
+ typeof meta === "object" &&
15
+ meta.type === "directory");
16
+ };
17
+ const RESERVED = new Set([META, "lastSyncAt"]);
18
+ exports.vfsShape = {
19
+ async encode({ repo, tree, previousRoot, title }) {
20
+ if (tree.kind !== "dir")
21
+ throw new Error("vfs: root must be a dir");
22
+ const flat = (0, types_js_1.flattenLeaves)(tree);
23
+ dlog("encode keys=%d previousRoot=%s", flat.size, previousRoot?.url ?? "<new>");
24
+ const handle = previousRoot ??
25
+ repo.create({
26
+ "@patchwork": { type: "directory", ...(title ? { title } : {}) },
27
+ });
28
+ handle.change((d) => {
29
+ if (!d["@patchwork"])
30
+ d["@patchwork"] = { type: "directory" };
31
+ if (title && d["@patchwork"].title !== title)
32
+ d["@patchwork"].title = title;
33
+ for (const k of Object.keys(d)) {
34
+ if (RESERVED.has(k))
35
+ continue;
36
+ if (!flat.has(k))
37
+ delete d[k];
38
+ }
39
+ for (const [k, url] of flat) {
40
+ d[k] = url;
41
+ }
42
+ });
43
+ dlog("encode complete url=%s", handle.url);
44
+ return handle.url;
45
+ },
46
+ async decode({ root }) {
47
+ const doc = root.doc();
48
+ if (!isDirectoryDoc(doc)) {
49
+ throw new Error(`expected directory doc at ${root.url}`);
50
+ }
51
+ const tree = (0, types_js_1.newDir)();
52
+ let count = 0;
53
+ for (const [key, value] of Object.entries(doc)) {
54
+ if (RESERVED.has(key))
55
+ continue;
56
+ if (typeof value !== "string")
57
+ continue;
58
+ if (!(0, automerge_repo_1.isValidAutomergeUrl)(value))
59
+ continue;
60
+ const segments = key.split("/").filter(Boolean);
61
+ if (segments.length === 0)
62
+ continue;
63
+ setLeaf(tree, segments, value);
64
+ count++;
65
+ }
66
+ dlog("decode url=%s leaves=%d", root.url, count);
67
+ return tree;
68
+ },
69
+ };
70
+ function setLeaf(root, segments, url) {
71
+ if (root.kind !== "dir")
72
+ throw new Error("setLeaf: root must be a dir");
73
+ let cur = root;
74
+ for (let i = 0; i < segments.length - 1; i++) {
75
+ if (cur.kind !== "dir")
76
+ return;
77
+ const name = segments[i];
78
+ const existing = cur.entries.get(name);
79
+ if (existing && existing.kind === "dir") {
80
+ cur = existing;
81
+ }
82
+ else {
83
+ const fresh = (0, types_js_1.newDir)();
84
+ cur.entries.set(name, fresh);
85
+ cur = fresh;
86
+ }
87
+ }
88
+ if (cur.kind !== "dir")
89
+ return;
90
+ cur.entries.set(segments[segments.length - 1], { kind: "file", url });
91
+ }
92
+ //# sourceMappingURL=vfs.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"vfs.js","sourceRoot":"","sources":["../../src/shapes/vfs.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,21 @@
1
+ export type SnarfKind = "modified" | "added" | "deleted";
2
+ export interface SnarfEntry {
3
+ path: string;
4
+ kind: SnarfKind;
5
+ contentBase64?: string;
6
+ }
7
+ export interface Snarf {
8
+ id: number;
9
+ name?: string;
10
+ createdAt: number;
11
+ entries: SnarfEntry[];
12
+ }
13
+ export declare function listSnarfs(root: string): Promise<Snarf[]>;
14
+ export declare function appendSnarf(root: string, args: {
15
+ name?: string;
16
+ entries: SnarfEntry[];
17
+ }): Promise<Snarf>;
18
+ export declare function takeSnarf(root: string, selector?: string): Promise<Snarf | null>;
19
+ export declare function encodeBytes(bytes: Uint8Array): string;
20
+ export declare function decodeBytes(b64: string): Uint8Array;
21
+ //# sourceMappingURL=snarf.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"snarf.d.ts","sourceRoot":"","sources":["../src/snarf.ts"],"names":[],"mappings":"AAMA,MAAM,MAAM,SAAS,GAAG,UAAU,GAAG,OAAO,GAAG,SAAS,CAAC;AAEzD,MAAM,WAAW,UAAU;IAC1B,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,SAAS,CAAC;IAChB,aAAa,CAAC,EAAE,MAAM,CAAC;CACvB;AAED,MAAM,WAAW,KAAK;IACrB,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,SAAS,EAAE,MAAM,CAAC;IAClB,OAAO,EAAE,UAAU,EAAE,CAAC;CACtB;AA+BD,wBAAsB,UAAU,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,KAAK,EAAE,CAAC,CAI/D;AAED,wBAAsB,WAAW,CAChC,IAAI,EAAE,MAAM,EACZ,IAAI,EAAE;IAAE,IAAI,CAAC,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,UAAU,EAAE,CAAA;CAAE,GAC5C,OAAO,CAAC,KAAK,CAAC,CAahB;AAED,wBAAsB,SAAS,CAC9B,IAAI,EAAE,MAAM,EACZ,QAAQ,CAAC,EAAE,MAAM,GACf,OAAO,CAAC,KAAK,GAAG,IAAI,CAAC,CAkBvB;AAED,wBAAgB,WAAW,CAAC,KAAK,EAAE,UAAU,GAAG,MAAM,CAErD;AAED,wBAAgB,WAAW,CAAC,GAAG,EAAE,MAAM,GAAG,UAAU,CAEnD"}
package/dist/snarf.js ADDED
@@ -0,0 +1,117 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
15
+ }) : function(o, v) {
16
+ o["default"] = v;
17
+ });
18
+ var __importStar = (this && this.__importStar) || (function () {
19
+ var ownKeys = function(o) {
20
+ ownKeys = Object.getOwnPropertyNames || function (o) {
21
+ var ar = [];
22
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
23
+ return ar;
24
+ };
25
+ return ownKeys(o);
26
+ };
27
+ return function (mod) {
28
+ if (mod && mod.__esModule) return mod;
29
+ var result = {};
30
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
31
+ __setModuleDefault(result, mod);
32
+ return result;
33
+ };
34
+ })();
35
+ Object.defineProperty(exports, "__esModule", { value: true });
36
+ exports.listSnarfs = listSnarfs;
37
+ exports.appendSnarf = appendSnarf;
38
+ exports.takeSnarf = takeSnarf;
39
+ exports.encodeBytes = encodeBytes;
40
+ exports.decodeBytes = decodeBytes;
41
+ const fs = __importStar(require("fs/promises"));
42
+ const path = __importStar(require("path"));
43
+ const log_js_1 = require("./log.js");
44
+ const dlog = (0, log_js_1.log)("snarf");
45
+ const SNARF_DIR = path.join(".pushwork", "snarf");
46
+ const SNARF_INDEX = path.join(SNARF_DIR, "index.json");
47
+ async function readSnarfs(root) {
48
+ try {
49
+ const text = await fs.readFile(path.join(root, SNARF_INDEX), "utf8");
50
+ const parsed = JSON.parse(text);
51
+ if (!Array.isArray(parsed))
52
+ return [];
53
+ return parsed;
54
+ }
55
+ catch (err) {
56
+ if (err.code === "ENOENT")
57
+ return [];
58
+ throw err;
59
+ }
60
+ }
61
+ async function writeSnarfs(root, snarfs) {
62
+ await fs.mkdir(path.join(root, SNARF_DIR), { recursive: true });
63
+ await fs.writeFile(path.join(root, SNARF_INDEX), JSON.stringify(snarfs, null, 2) + "\n");
64
+ }
65
+ function nextId(snarfs) {
66
+ let max = 0;
67
+ for (const s of snarfs)
68
+ if (s.id > max)
69
+ max = s.id;
70
+ return max + 1;
71
+ }
72
+ async function listSnarfs(root) {
73
+ const snarfs = await readSnarfs(root);
74
+ snarfs.sort((a, b) => b.id - a.id); // newest first
75
+ return snarfs;
76
+ }
77
+ async function appendSnarf(root, args) {
78
+ const snarfs = await readSnarfs(root);
79
+ const id = nextId(snarfs);
80
+ const snarf = {
81
+ id,
82
+ name: args.name,
83
+ createdAt: Date.now(),
84
+ entries: args.entries,
85
+ };
86
+ snarfs.push(snarf);
87
+ await writeSnarfs(root, snarfs);
88
+ dlog("appendSnarf id=%d name=%s entries=%d", id, args.name ?? "(unnamed)", args.entries.length);
89
+ return snarf;
90
+ }
91
+ async function takeSnarf(root, selector) {
92
+ const snarfs = await readSnarfs(root);
93
+ if (snarfs.length === 0)
94
+ return null;
95
+ let idx;
96
+ if (!selector) {
97
+ // most recent
98
+ idx = snarfs.reduce((best, s, i) => (s.id > snarfs[best].id ? i : best), 0);
99
+ }
100
+ else {
101
+ const asInt = Number(selector);
102
+ idx = snarfs.findIndex((s) => (!Number.isNaN(asInt) && s.id === asInt) || s.name === selector);
103
+ if (idx < 0)
104
+ return null;
105
+ }
106
+ const [taken] = snarfs.splice(idx, 1);
107
+ await writeSnarfs(root, snarfs);
108
+ dlog("takeSnarf id=%d name=%s", taken.id, taken.name ?? "(unnamed)");
109
+ return taken;
110
+ }
111
+ function encodeBytes(bytes) {
112
+ return Buffer.from(bytes).toString("base64");
113
+ }
114
+ function decodeBytes(b64) {
115
+ return new Uint8Array(Buffer.from(b64, "base64"));
116
+ }
117
+ //# sourceMappingURL=snarf.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"snarf.js","sourceRoot":"","sources":["../src/snarf.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,53 @@
1
+ /**
2
+ * Content similarity calculation for move detection
3
+ */
4
+ export declare class ContentSimilarity {
5
+ private static readonly CHUNK_SIZE;
6
+ private static readonly AUTO_THRESHOLD;
7
+ private static readonly PROMPT_THRESHOLD;
8
+ /**
9
+ * Calculate similarity between two content pieces
10
+ */
11
+ static calculateSimilarity(content1: string | Uint8Array, content2: string | Uint8Array): Promise<number>;
12
+ /**
13
+ * Check if two content pieces are identical
14
+ */
15
+ private static areIdentical;
16
+ /**
17
+ * Calculate similarity for small files using full content
18
+ */
19
+ private static calculateFullSimilarity;
20
+ /**
21
+ * Calculate similarity for large files using sampling
22
+ */
23
+ private static calculateSampledSimilarity;
24
+ /**
25
+ * Get representative samples from content
26
+ */
27
+ private static getSamples;
28
+ /**
29
+ * Calculate Levenshtein similarity (0-1 scale)
30
+ */
31
+ private static levenshteinSimilarity;
32
+ /**
33
+ * Calculate Levenshtein distance
34
+ */
35
+ private static levenshteinDistance;
36
+ /**
37
+ * Convert buffer to string for comparison
38
+ */
39
+ private static bufferToString;
40
+ /**
41
+ * Determine confidence level based on similarity score
42
+ */
43
+ static getConfidenceLevel(similarity: number): "auto" | "prompt" | "low";
44
+ /**
45
+ * Should auto-apply move based on similarity
46
+ */
47
+ static shouldAutoApply(similarity: number): boolean;
48
+ /**
49
+ * Should prompt user for move confirmation
50
+ */
51
+ static shouldPromptUser(similarity: number): boolean;
52
+ }
53
+ //# sourceMappingURL=content-similarity.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"content-similarity.d.ts","sourceRoot":"","sources":["../../src/utils/content-similarity.ts"],"names":[],"mappings":"AAEA;;GAEG;AACH,qBAAa,iBAAiB;IAC5B,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC,UAAU,CAAQ;IAC1C,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC,cAAc,CAAO;IAC7C,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC,gBAAgB,CAAO;IAE/C;;OAEG;WACU,mBAAmB,CAC9B,QAAQ,EAAE,MAAM,GAAG,UAAU,EAC7B,QAAQ,EAAE,MAAM,GAAG,UAAU,GAC5B,OAAO,CAAC,MAAM,CAAC;IA0BlB;;OAEG;mBACkB,YAAY;IASjC;;OAEG;IACH,OAAO,CAAC,MAAM,CAAC,uBAAuB;IAYtC;;OAEG;IACH,OAAO,CAAC,MAAM,CAAC,0BAA0B;IAkBzC;;OAEG;IACH,OAAO,CAAC,MAAM,CAAC,UAAU;IAwBzB;;OAEG;IACH,OAAO,CAAC,MAAM,CAAC,qBAAqB;IAUpC;;OAEG;IACH,OAAO,CAAC,MAAM,CAAC,mBAAmB;IAsBlC;;OAEG;IACH,OAAO,CAAC,MAAM,CAAC,cAAc;IAO7B;;OAEG;IACH,MAAM,CAAC,kBAAkB,CAAC,UAAU,EAAE,MAAM,GAAG,MAAM,GAAG,QAAQ,GAAG,KAAK;IAUxE;;OAEG;IACH,MAAM,CAAC,eAAe,CAAC,UAAU,EAAE,MAAM,GAAG,OAAO;IAInD;;OAEG;IACH,MAAM,CAAC,gBAAgB,CAAC,UAAU,EAAE,MAAM,GAAG,OAAO;CAKrD"}
@@ -0,0 +1,155 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.ContentSimilarity = void 0;
4
+ const fs_1 = require("./fs");
5
+ /**
6
+ * Content similarity calculation for move detection
7
+ */
8
+ class ContentSimilarity {
9
+ /**
10
+ * Calculate similarity between two content pieces
11
+ */
12
+ static async calculateSimilarity(content1, content2) {
13
+ // Quick early exit for identical content
14
+ if (await this.areIdentical(content1, content2)) {
15
+ return 1.0;
16
+ }
17
+ // Size-based quick rejection
18
+ const size1 = typeof content1 === "string" ? content1.length : content1.length;
19
+ const size2 = typeof content2 === "string" ? content2.length : content2.length;
20
+ const sizeDiff = Math.abs(size1 - size2) / Math.max(size1, size2);
21
+ if (sizeDiff > 0.5) {
22
+ return 0.0; // Too different in size
23
+ }
24
+ // For small files, use full content comparison
25
+ if (size1 < this.CHUNK_SIZE * 4 && size2 < this.CHUNK_SIZE * 4) {
26
+ return this.calculateFullSimilarity(content1, content2);
27
+ }
28
+ // For large files, use sampling
29
+ return this.calculateSampledSimilarity(content1, content2);
30
+ }
31
+ /**
32
+ * Check if two content pieces are identical
33
+ */
34
+ static async areIdentical(content1, content2) {
35
+ const hash1 = await (0, fs_1.calculateContentHash)(content1);
36
+ const hash2 = await (0, fs_1.calculateContentHash)(content2);
37
+ return hash1 === hash2;
38
+ }
39
+ /**
40
+ * Calculate similarity for small files using full content
41
+ */
42
+ static calculateFullSimilarity(content1, content2) {
43
+ const str1 = typeof content1 === "string" ? content1 : this.bufferToString(content1);
44
+ const str2 = typeof content2 === "string" ? content2 : this.bufferToString(content2);
45
+ return this.levenshteinSimilarity(str1, str2);
46
+ }
47
+ /**
48
+ * Calculate similarity for large files using sampling
49
+ */
50
+ static calculateSampledSimilarity(content1, content2) {
51
+ const samples1 = this.getSamples(content1);
52
+ const samples2 = this.getSamples(content2);
53
+ let totalSimilarity = 0;
54
+ let comparisons = 0;
55
+ for (let i = 0; i < Math.min(samples1.length, samples2.length); i++) {
56
+ totalSimilarity += this.levenshteinSimilarity(samples1[i], samples2[i]);
57
+ comparisons++;
58
+ }
59
+ return comparisons > 0 ? totalSimilarity / comparisons : 0;
60
+ }
61
+ /**
62
+ * Get representative samples from content
63
+ */
64
+ static getSamples(content) {
65
+ const str = typeof content === "string" ? content : this.bufferToString(content);
66
+ const length = str.length;
67
+ const samples = [];
68
+ if (length <= this.CHUNK_SIZE) {
69
+ samples.push(str);
70
+ return samples;
71
+ }
72
+ // Beginning
73
+ samples.push(str.slice(0, this.CHUNK_SIZE));
74
+ // Middle
75
+ const midStart = Math.floor(length / 2) - Math.floor(this.CHUNK_SIZE / 2);
76
+ samples.push(str.slice(midStart, midStart + this.CHUNK_SIZE));
77
+ // End
78
+ samples.push(str.slice(-this.CHUNK_SIZE));
79
+ return samples;
80
+ }
81
+ /**
82
+ * Calculate Levenshtein similarity (0-1 scale)
83
+ */
84
+ static levenshteinSimilarity(str1, str2) {
85
+ if (str1 === str2)
86
+ return 1.0;
87
+ if (str1.length === 0 || str2.length === 0)
88
+ return 0.0;
89
+ const distance = this.levenshteinDistance(str1, str2);
90
+ const maxLength = Math.max(str1.length, str2.length);
91
+ return 1 - distance / maxLength;
92
+ }
93
+ /**
94
+ * Calculate Levenshtein distance
95
+ */
96
+ static levenshteinDistance(str1, str2) {
97
+ const matrix = Array(str2.length + 1)
98
+ .fill(null)
99
+ .map(() => Array(str1.length + 1).fill(null));
100
+ for (let i = 0; i <= str1.length; i++)
101
+ matrix[0][i] = i;
102
+ for (let j = 0; j <= str2.length; j++)
103
+ matrix[j][0] = j;
104
+ for (let j = 1; j <= str2.length; j++) {
105
+ for (let i = 1; i <= str1.length; i++) {
106
+ const indicator = str1[i - 1] === str2[j - 1] ? 0 : 1;
107
+ matrix[j][i] = Math.min(matrix[j][i - 1] + 1, // deletion
108
+ matrix[j - 1][i] + 1, // insertion
109
+ matrix[j - 1][i - 1] + indicator // substitution
110
+ );
111
+ }
112
+ }
113
+ return matrix[str2.length][str1.length];
114
+ }
115
+ /**
116
+ * Convert buffer to string for comparison
117
+ */
118
+ static bufferToString(buffer) {
119
+ // For binary content, use hex representation for comparison
120
+ return Array.from(buffer)
121
+ .map((b) => b.toString(16).padStart(2, "0"))
122
+ .join("");
123
+ }
124
+ /**
125
+ * Determine confidence level based on similarity score
126
+ */
127
+ static getConfidenceLevel(similarity) {
128
+ if (similarity >= this.AUTO_THRESHOLD) {
129
+ return "auto";
130
+ }
131
+ else if (similarity >= this.PROMPT_THRESHOLD) {
132
+ return "prompt";
133
+ }
134
+ else {
135
+ return "low";
136
+ }
137
+ }
138
+ /**
139
+ * Should auto-apply move based on similarity
140
+ */
141
+ static shouldAutoApply(similarity) {
142
+ return similarity >= this.AUTO_THRESHOLD;
143
+ }
144
+ /**
145
+ * Should prompt user for move confirmation
146
+ */
147
+ static shouldPromptUser(similarity) {
148
+ return (similarity >= this.PROMPT_THRESHOLD && similarity < this.AUTO_THRESHOLD);
149
+ }
150
+ }
151
+ exports.ContentSimilarity = ContentSimilarity;
152
+ ContentSimilarity.CHUNK_SIZE = 1024; // 1KB chunks for sampling
153
+ ContentSimilarity.AUTO_THRESHOLD = 0.8;
154
+ ContentSimilarity.PROMPT_THRESHOLD = 0.5;
155
+ //# sourceMappingURL=content-similarity.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"content-similarity.js","sourceRoot":"","sources":["../../src/utils/content-similarity.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,57 @@
1
+ /**
2
+ * Browser-specific filesystem utilities using File System Access API
3
+ */
4
+ import { FileSystemEntry } from "../types";
5
+ /**
6
+ * Set the root directory handle for browser filesystem operations
7
+ */
8
+ export declare function setRootDirectoryHandle(handle: any): void;
9
+ /**
10
+ * Get the root directory handle
11
+ */
12
+ export declare function getRootDirectoryHandle(): any;
13
+ /**
14
+ * Check if a path exists
15
+ */
16
+ export declare function pathExists(filePath: string): Promise<boolean>;
17
+ /**
18
+ * Get file system entry information
19
+ */
20
+ export declare function getFileSystemEntry(filePath: string): Promise<FileSystemEntry>;
21
+ /**
22
+ * Check if a file is a text file
23
+ */
24
+ export declare function isTextFile(filePath: string): Promise<boolean>;
25
+ /**
26
+ * Read file content
27
+ */
28
+ export declare function readFileContent(filePath: string): Promise<string | Uint8Array>;
29
+ /**
30
+ * Write file content
31
+ */
32
+ export declare function writeFileContent(filePath: string, content: string | Uint8Array): Promise<void>;
33
+ /**
34
+ * Ensure directory exists
35
+ */
36
+ export declare function ensureDirectoryExists(dirPath: string): Promise<void>;
37
+ /**
38
+ * Remove a file or directory
39
+ */
40
+ export declare function removePath(filePath: string): Promise<void>;
41
+ /**
42
+ * List directory contents
43
+ */
44
+ export declare function listDirectory(dirPath: string, excludePatterns?: string[]): Promise<FileSystemEntry[]>;
45
+ /**
46
+ * Copy a file (not supported in File System Access API)
47
+ */
48
+ export declare function copyFile(sourcePath: string, targetPath: string): Promise<void>;
49
+ /**
50
+ * Move a file or directory
51
+ */
52
+ export declare function movePath(sourcePath: string, targetPath: string): Promise<void>;
53
+ /**
54
+ * Get MIME type
55
+ */
56
+ export declare function getMimeType(filePath: string): string;
57
+ //# sourceMappingURL=fs-browser.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"fs-browser.d.ts","sourceRoot":"","sources":["../../src/utils/fs-browser.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,eAAe,EAAY,MAAM,UAAU,CAAC;AAYrD;;GAEG;AACH,wBAAgB,sBAAsB,CAAC,MAAM,EAAE,GAAG,GAAG,IAAI,CAExD;AAED;;GAEG;AACH,wBAAgB,sBAAsB,IAAI,GAAG,CAO5C;AAiCD;;GAEG;AACH,wBAAsB,UAAU,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAOnE;AAED;;GAEG;AACH,wBAAsB,kBAAkB,CACtC,QAAQ,EAAE,MAAM,GACf,OAAO,CAAC,eAAe,CAAC,CA2B1B;AAED;;GAEG;AACH,wBAAsB,UAAU,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAMnE;AAED;;GAEG;AACH,wBAAsB,eAAe,CACnC,QAAQ,EAAE,MAAM,GACf,OAAO,CAAC,MAAM,GAAG,UAAU,CAAC,CAiB9B;AAED;;GAEG;AACH,wBAAsB,gBAAgB,CACpC,QAAQ,EAAE,MAAM,EAChB,OAAO,EAAE,MAAM,GAAG,UAAU,GAC3B,OAAO,CAAC,IAAI,CAAC,CA+Bf;AAED;;GAEG;AACH,wBAAsB,qBAAqB,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAwB1E;AAED;;GAEG;AACH,wBAAsB,UAAU,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CA2BhE;AAED;;GAEG;AACH,wBAAsB,aAAa,CACjC,OAAO,EAAE,MAAM,EACf,eAAe,GAAE,MAAM,EAAO,GAC7B,OAAO,CAAC,eAAe,EAAE,CAAC,CAyC5B;AAED;;GAEG;AACH,wBAAsB,QAAQ,CAC5B,UAAU,EAAE,MAAM,EAClB,UAAU,EAAE,MAAM,GACjB,OAAO,CAAC,IAAI,CAAC,CAOf;AAED;;GAEG;AACH,wBAAsB,QAAQ,CAC5B,UAAU,EAAE,MAAM,EAClB,UAAU,EAAE,MAAM,GACjB,OAAO,CAAC,IAAI,CAAC,CAef;AAED;;GAEG;AACH,wBAAgB,WAAW,CAAC,QAAQ,EAAE,MAAM,GAAG,MAAM,CAEpD"}