@paperclipai/shared 2026.824.1 → 2026.825.0-beta.1

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 (276) hide show
  1. package/dist/adapter-auth-check-code.d.ts +13 -0
  2. package/dist/adapter-auth-check-code.d.ts.map +1 -0
  3. package/dist/adapter-auth-check-code.js +13 -0
  4. package/dist/adapter-auth-check-code.js.map +1 -0
  5. package/dist/adapter-auth-check-code.test.d.ts +2 -0
  6. package/dist/adapter-auth-check-code.test.d.ts.map +1 -0
  7. package/dist/adapter-auth-check-code.test.js +8 -0
  8. package/dist/adapter-auth-check-code.test.js.map +1 -0
  9. package/dist/company-import-transfer.d.ts +3 -37
  10. package/dist/company-import-transfer.d.ts.map +1 -1
  11. package/dist/config-schema.d.ts +130 -1570
  12. package/dist/config-schema.d.ts.map +1 -1
  13. package/dist/config-schema.js +3 -7
  14. package/dist/config-schema.js.map +1 -1
  15. package/dist/constants.d.ts +3 -2
  16. package/dist/constants.d.ts.map +1 -1
  17. package/dist/constants.js +3 -0
  18. package/dist/constants.js.map +1 -1
  19. package/dist/environment-support.d.ts +1 -1
  20. package/dist/environment-support.d.ts.map +1 -1
  21. package/dist/environment-support.js +3 -2
  22. package/dist/environment-support.js.map +1 -1
  23. package/dist/environment-support.test.js +19 -0
  24. package/dist/environment-support.test.js.map +1 -1
  25. package/dist/feature-catalog.d.ts +7 -17
  26. package/dist/feature-catalog.d.ts.map +1 -1
  27. package/dist/feature-catalog.js +9 -2
  28. package/dist/feature-catalog.js.map +1 -1
  29. package/dist/frontmatter.d.ts +3 -13
  30. package/dist/frontmatter.d.ts.map +1 -1
  31. package/dist/frontmatter.js +2 -2
  32. package/dist/frontmatter.js.map +1 -1
  33. package/dist/index.d.ts +7 -3
  34. package/dist/index.d.ts.map +1 -1
  35. package/dist/index.js +6 -2
  36. package/dist/index.js.map +1 -1
  37. package/dist/markdown-work-products.d.ts +26 -0
  38. package/dist/markdown-work-products.d.ts.map +1 -0
  39. package/dist/markdown-work-products.js +70 -0
  40. package/dist/markdown-work-products.js.map +1 -0
  41. package/dist/markdown-work-products.test.d.ts +2 -0
  42. package/dist/markdown-work-products.test.d.ts.map +1 -0
  43. package/dist/markdown-work-products.test.js +122 -0
  44. package/dist/markdown-work-products.test.js.map +1 -0
  45. package/dist/node-version.d.ts +6 -0
  46. package/dist/node-version.d.ts.map +1 -0
  47. package/dist/node-version.js +46 -0
  48. package/dist/node-version.js.map +1 -0
  49. package/dist/runtime-exposure/loopback-bind.d.ts +2 -2
  50. package/dist/runtime-exposure/loopback-bind.d.ts.map +1 -1
  51. package/dist/runtime-exposure/loopback-bind.js +3 -3
  52. package/dist/runtime-exposure/loopback-bind.js.map +1 -1
  53. package/dist/runtime-exposure/loopback-bind.test.js +11 -10
  54. package/dist/runtime-exposure/loopback-bind.test.js.map +1 -1
  55. package/dist/settings-visibility.d.ts +62 -0
  56. package/dist/settings-visibility.d.ts.map +1 -0
  57. package/dist/settings-visibility.js +102 -0
  58. package/dist/settings-visibility.js.map +1 -0
  59. package/dist/settings-visibility.test.d.ts +2 -0
  60. package/dist/settings-visibility.test.d.ts.map +1 -0
  61. package/dist/settings-visibility.test.js +51 -0
  62. package/dist/settings-visibility.test.js.map +1 -0
  63. package/dist/telemetry/generated/paperclip-telemetry.d.ts +4 -2
  64. package/dist/telemetry/generated/paperclip-telemetry.d.ts.map +1 -1
  65. package/dist/telemetry/generated/paperclip-telemetry.js +2 -0
  66. package/dist/telemetry/generated/paperclip-telemetry.js.map +1 -1
  67. package/dist/types/environment.d.ts +20 -0
  68. package/dist/types/environment.d.ts.map +1 -1
  69. package/dist/types/index.d.ts +5 -3
  70. package/dist/types/index.d.ts.map +1 -1
  71. package/dist/types/index.js +1 -0
  72. package/dist/types/index.js.map +1 -1
  73. package/dist/types/instance.d.ts +7 -0
  74. package/dist/types/instance.d.ts.map +1 -1
  75. package/dist/types/instance.js.map +1 -1
  76. package/dist/types/issue.d.ts +19 -0
  77. package/dist/types/issue.d.ts.map +1 -1
  78. package/dist/types/plugin.d.ts +36 -4
  79. package/dist/types/plugin.d.ts.map +1 -1
  80. package/dist/types/workspace-operation.d.ts +1 -1
  81. package/dist/types/workspace-operation.d.ts.map +1 -1
  82. package/dist/types/workspace-readiness.d.ts +62 -0
  83. package/dist/types/workspace-readiness.d.ts.map +1 -0
  84. package/dist/types/workspace-readiness.js +28 -0
  85. package/dist/types/workspace-readiness.js.map +1 -0
  86. package/dist/types/workspace-runtime.d.ts +6 -8
  87. package/dist/types/workspace-runtime.d.ts.map +1 -1
  88. package/dist/validators/access.d.ts +143 -277
  89. package/dist/validators/access.d.ts.map +1 -1
  90. package/dist/validators/access.js +5 -5
  91. package/dist/validators/adapter-auth-session.d.ts +50 -97
  92. package/dist/validators/adapter-auth-session.d.ts.map +1 -1
  93. package/dist/validators/adapter-auth-session.js +3 -3
  94. package/dist/validators/adapter-registry.d.ts +8 -40
  95. package/dist/validators/adapter-registry.d.ts.map +1 -1
  96. package/dist/validators/adapter-registry.js +1 -1
  97. package/dist/validators/adapter-registry.js.map +1 -1
  98. package/dist/validators/adapter-skills.d.ts +71 -170
  99. package/dist/validators/adapter-skills.d.ts.map +1 -1
  100. package/dist/validators/adapter-skills.js +3 -3
  101. package/dist/validators/agent.d.ts +412 -4798
  102. package/dist/validators/agent.d.ts.map +1 -1
  103. package/dist/validators/agent.js +13 -13
  104. package/dist/validators/agent.js.map +1 -1
  105. package/dist/validators/app-definition.d.ts +270 -2315
  106. package/dist/validators/app-definition.d.ts.map +1 -1
  107. package/dist/validators/approval.d.ts +15 -36
  108. package/dist/validators/approval.d.ts.map +1 -1
  109. package/dist/validators/approval.js +2 -2
  110. package/dist/validators/artifact.d.ts +162 -893
  111. package/dist/validators/artifact.d.ts.map +1 -1
  112. package/dist/validators/artifact.js +6 -6
  113. package/dist/validators/asset.d.ts +1 -5
  114. package/dist/validators/asset.d.ts.map +1 -1
  115. package/dist/validators/budget.d.ts +19 -43
  116. package/dist/validators/budget.d.ts.map +1 -1
  117. package/dist/validators/budget.js +1 -1
  118. package/dist/validators/claude-setup-token-session.d.ts +61 -181
  119. package/dist/validators/claude-setup-token-session.d.ts.map +1 -1
  120. package/dist/validators/claude-setup-token-session.js +4 -4
  121. package/dist/validators/company-portability.d.ts +318 -3616
  122. package/dist/validators/company-portability.d.ts.map +1 -1
  123. package/dist/validators/company-portability.js +2 -2
  124. package/dist/validators/company-skill.d.ts +722 -2934
  125. package/dist/validators/company-skill.d.ts.map +1 -1
  126. package/dist/validators/company-skill.js +63 -63
  127. package/dist/validators/company.d.ts +162 -289
  128. package/dist/validators/company.d.ts.map +1 -1
  129. package/dist/validators/company.js +4 -3
  130. package/dist/validators/company.js.map +1 -1
  131. package/dist/validators/cost.d.ts +29 -57
  132. package/dist/validators/cost.d.ts.map +1 -1
  133. package/dist/validators/cost.js +5 -5
  134. package/dist/validators/decision-queue.d.ts +60 -108
  135. package/dist/validators/decision-queue.d.ts.map +1 -1
  136. package/dist/validators/decision.d.ts +230 -1884
  137. package/dist/validators/decision.d.ts.map +1 -1
  138. package/dist/validators/decision.js +9 -9
  139. package/dist/validators/document-annotation.d.ts +37 -203
  140. package/dist/validators/document-annotation.d.ts.map +1 -1
  141. package/dist/validators/document-annotation.js +3 -3
  142. package/dist/validators/environment-custom-images.d.ts +79 -173
  143. package/dist/validators/environment-custom-images.d.ts.map +1 -1
  144. package/dist/validators/environment-custom-images.js +14 -11
  145. package/dist/validators/environment-custom-images.js.map +1 -1
  146. package/dist/validators/environment.d.ts +82 -259
  147. package/dist/validators/environment.d.ts.map +1 -1
  148. package/dist/validators/execution-workspace.d.ts +173 -513
  149. package/dist/validators/execution-workspace.d.ts.map +1 -1
  150. package/dist/validators/execution-workspace.js +13 -13
  151. package/dist/validators/execution-workspace.js.map +1 -1
  152. package/dist/validators/external-object.d.ts +55 -27
  153. package/dist/validators/external-object.d.ts.map +1 -1
  154. package/dist/validators/external-object.js +1 -1
  155. package/dist/validators/external-object.js.map +1 -1
  156. package/dist/validators/feedback.d.ts +28 -19
  157. package/dist/validators/feedback.d.ts.map +1 -1
  158. package/dist/validators/feedback.js +1 -1
  159. package/dist/validators/finance.d.ts +69 -74
  160. package/dist/validators/finance.d.ts.map +1 -1
  161. package/dist/validators/finance.js +6 -6
  162. package/dist/validators/folder.d.ts +44 -205
  163. package/dist/validators/folder.d.ts.map +1 -1
  164. package/dist/validators/folder.js +7 -7
  165. package/dist/validators/goal.d.ts +26 -34
  166. package/dist/validators/goal.d.ts.map +1 -1
  167. package/dist/validators/goal.js +4 -3
  168. package/dist/validators/goal.js.map +1 -1
  169. package/dist/validators/inbox-agent-policy.d.ts +12 -16
  170. package/dist/validators/inbox-agent-policy.d.ts.map +1 -1
  171. package/dist/validators/inbox-agent-policy.js +1 -1
  172. package/dist/validators/index.d.ts +2 -2
  173. package/dist/validators/index.d.ts.map +1 -1
  174. package/dist/validators/index.js +2 -2
  175. package/dist/validators/index.js.map +1 -1
  176. package/dist/validators/instance.d.ts +50 -563
  177. package/dist/validators/instance.d.ts.map +1 -1
  178. package/dist/validators/instance.js +16 -6
  179. package/dist/validators/instance.js.map +1 -1
  180. package/dist/validators/instance.test.js +13 -0
  181. package/dist/validators/instance.test.js.map +1 -1
  182. package/dist/validators/issue-tree-control.d.ts +41 -80
  183. package/dist/validators/issue-tree-control.d.ts.map +1 -1
  184. package/dist/validators/issue.d.ts +1772 -12251
  185. package/dist/validators/issue.d.ts.map +1 -1
  186. package/dist/validators/issue.js +150 -84
  187. package/dist/validators/issue.js.map +1 -1
  188. package/dist/validators/onboarding-seed.d.ts +3 -37
  189. package/dist/validators/onboarding-seed.d.ts.map +1 -1
  190. package/dist/validators/partial.d.ts +4 -0
  191. package/dist/validators/partial.d.ts.map +1 -0
  192. package/dist/validators/partial.js +35 -0
  193. package/dist/validators/partial.js.map +1 -0
  194. package/dist/validators/pipeline.d.ts +218 -3882
  195. package/dist/validators/pipeline.d.ts.map +1 -1
  196. package/dist/validators/pipeline.js +11 -11
  197. package/dist/validators/plugin.d.ts +725 -2597
  198. package/dist/validators/plugin.d.ts.map +1 -1
  199. package/dist/validators/plugin.js +38 -6
  200. package/dist/validators/plugin.js.map +1 -1
  201. package/dist/validators/plugin.test.js +54 -10
  202. package/dist/validators/plugin.test.js.map +1 -1
  203. package/dist/validators/project.d.ts +345 -2406
  204. package/dist/validators/project.d.ts.map +1 -1
  205. package/dist/validators/project.js +8 -7
  206. package/dist/validators/project.js.map +1 -1
  207. package/dist/validators/resource-memberships.d.ts +11 -27
  208. package/dist/validators/resource-memberships.d.ts.map +1 -1
  209. package/dist/validators/routine.d.ts +362 -1297
  210. package/dist/validators/routine.d.ts.map +1 -1
  211. package/dist/validators/routine.js +21 -20
  212. package/dist/validators/routine.js.map +1 -1
  213. package/dist/validators/runtime-exposure.d.ts +31 -80
  214. package/dist/validators/runtime-exposure.d.ts.map +1 -1
  215. package/dist/validators/search.d.ts +25 -93
  216. package/dist/validators/search.d.ts.map +1 -1
  217. package/dist/validators/secret.d.ts +174 -655
  218. package/dist/validators/secret.d.ts.map +1 -1
  219. package/dist/validators/secret.js +14 -14
  220. package/dist/validators/secret.js.map +1 -1
  221. package/dist/validators/sidebar-preferences.d.ts +5 -15
  222. package/dist/validators/sidebar-preferences.d.ts.map +1 -1
  223. package/dist/validators/sidebar-preferences.js +1 -1
  224. package/dist/validators/skill-policy.d.ts +184 -561
  225. package/dist/validators/skill-policy.d.ts.map +1 -1
  226. package/dist/validators/skill-policy.js +4 -4
  227. package/dist/validators/smoke-lab.d.ts +53 -37
  228. package/dist/validators/smoke-lab.d.ts.map +1 -1
  229. package/dist/validators/status-card.d.ts +139 -994
  230. package/dist/validators/status-card.d.ts.map +1 -1
  231. package/dist/validators/status-card.js +21 -21
  232. package/dist/validators/status-card.js.map +1 -1
  233. package/dist/validators/summary-slot.d.ts +28 -50
  234. package/dist/validators/summary-slot.d.ts.map +1 -1
  235. package/dist/validators/summary-slot.js +3 -3
  236. package/dist/validators/teams-catalog.d.ts +209 -472
  237. package/dist/validators/teams-catalog.d.ts.map +1 -1
  238. package/dist/validators/text.d.ts +1 -1
  239. package/dist/validators/text.d.ts.map +1 -1
  240. package/dist/validators/tool-access.d.ts +1088 -4670
  241. package/dist/validators/tool-access.d.ts.map +1 -1
  242. package/dist/validators/tool-access.js +96 -95
  243. package/dist/validators/tool-access.js.map +1 -1
  244. package/dist/validators/trust-policy.d.ts +62 -358
  245. package/dist/validators/trust-policy.d.ts.map +1 -1
  246. package/dist/validators/trust-policy.js +12 -12
  247. package/dist/validators/work-product.d.ts +110 -536
  248. package/dist/validators/work-product.d.ts.map +1 -1
  249. package/dist/validators/work-product.js +7 -6
  250. package/dist/validators/work-product.js.map +1 -1
  251. package/dist/validators/workspace-file-resource.d.ts +163 -618
  252. package/dist/validators/workspace-file-resource.d.ts.map +1 -1
  253. package/dist/validators/workspace-file-resource.js +11 -11
  254. package/dist/workspace-commands.d.ts +4 -2
  255. package/dist/workspace-commands.d.ts.map +1 -1
  256. package/dist/workspace-commands.js +9 -1
  257. package/dist/workspace-commands.js.map +1 -1
  258. package/dist/workspace-commands.test.js +45 -0
  259. package/dist/workspace-commands.test.js.map +1 -1
  260. package/dist/worktree-port-registry.d.ts +5 -0
  261. package/dist/worktree-port-registry.d.ts.map +1 -0
  262. package/dist/worktree-port-registry.js +382 -0
  263. package/dist/worktree-port-registry.js.map +1 -0
  264. package/dist/worktree-port-registry.test.d.ts +2 -0
  265. package/dist/worktree-port-registry.test.d.ts.map +1 -0
  266. package/dist/worktree-port-registry.test.js +118 -0
  267. package/dist/worktree-port-registry.test.js.map +1 -0
  268. package/dist/worktree-seed-source.d.ts +43 -0
  269. package/dist/worktree-seed-source.d.ts.map +1 -0
  270. package/dist/worktree-seed-source.js +180 -0
  271. package/dist/worktree-seed-source.js.map +1 -0
  272. package/dist/worktree-seed-source.test.d.ts +2 -0
  273. package/dist/worktree-seed-source.test.d.ts.map +1 -0
  274. package/dist/worktree-seed-source.test.js +166 -0
  275. package/dist/worktree-seed-source.test.js.map +1 -0
  276. package/package.json +6 -3
@@ -0,0 +1,118 @@
1
+ import fs from "node:fs";
2
+ import os from "node:os";
3
+ import path from "node:path";
4
+ import { setTimeout as delay } from "node:timers/promises";
5
+ import { afterEach, describe, expect, it } from "vitest";
6
+ import { withWorktreePortRegistryLock, withWorktreePortRegistryLockSync, } from "./worktree-port-registry.js";
7
+ const temporaryRoots = [];
8
+ function makeTemporaryRoot() {
9
+ const root = fs.mkdtempSync(path.join(os.tmpdir(), "paperclip-port-registry-lock-"));
10
+ temporaryRoots.push(root);
11
+ return root;
12
+ }
13
+ function deferred() {
14
+ let resolve;
15
+ const promise = new Promise((done) => {
16
+ resolve = done;
17
+ });
18
+ return { promise, resolve };
19
+ }
20
+ afterEach(() => {
21
+ for (const root of temporaryRoots.splice(0)) {
22
+ fs.rmSync(root, { recursive: true, force: true });
23
+ }
24
+ });
25
+ describe("worktree port registry lock", () => {
26
+ it("does not reclaim a stale lock while its fallback ownership probe responds", async () => {
27
+ const homeDir = makeTemporaryRoot();
28
+ const lockPath = path.join(homeDir, ".worktree-port-reservations.lock");
29
+ const firstEntered = deferred();
30
+ const releaseFirst = deferred();
31
+ let secondEntered = false;
32
+ const first = withWorktreePortRegistryLock(homeDir, async () => {
33
+ fs.renameSync(path.join(lockPath, "owner.json"), path.join(lockPath, "owner.unavailable.json"));
34
+ const backupOwnerPath = path.join(lockPath, "owner.backup.json");
35
+ const owner = JSON.parse(fs.readFileSync(backupOwnerPath, "utf8"));
36
+ fs.writeFileSync(backupOwnerPath, `${JSON.stringify({
37
+ ...owner,
38
+ processIdentity: "unavailable-process-identity",
39
+ })}\n`);
40
+ const oldTimestamp = new Date(Date.now() - 10_000);
41
+ fs.utimesSync(lockPath, oldTimestamp, oldTimestamp);
42
+ firstEntered.resolve();
43
+ await releaseFirst.promise;
44
+ });
45
+ await firstEntered.promise;
46
+ expect(Date.now() - fs.statSync(lockPath).mtimeMs).toBeGreaterThan(5_000);
47
+ const second = withWorktreePortRegistryLock(homeDir, async () => {
48
+ secondEntered = true;
49
+ });
50
+ await delay(100);
51
+ expect(secondEntered).toBe(false);
52
+ releaseFirst.resolve();
53
+ await Promise.all([first, second]);
54
+ expect(secondEntered).toBe(true);
55
+ }, 10_000);
56
+ it("refreshes the lease throughout an async critical section", async () => {
57
+ const homeDir = makeTemporaryRoot();
58
+ const lockPath = path.join(homeDir, ".worktree-port-reservations.lock");
59
+ await withWorktreePortRegistryLock(homeDir, async () => {
60
+ await delay(5_250);
61
+ expect(Date.now() - fs.statSync(lockPath).mtimeMs).toBeLessThan(2_000);
62
+ });
63
+ expect(fs.existsSync(lockPath)).toBe(false);
64
+ }, 10_000);
65
+ it("reclaims an old lock after its owner process exits", async () => {
66
+ const homeDir = makeTemporaryRoot();
67
+ const lockPath = path.join(homeDir, ".worktree-port-reservations.lock");
68
+ fs.mkdirSync(lockPath);
69
+ fs.writeFileSync(path.join(lockPath, "owner.json"), `${JSON.stringify({
70
+ version: 1,
71
+ pid: 2_147_483_647,
72
+ processIdentity: "dead-process",
73
+ probePort: 1,
74
+ token: "dead-owner",
75
+ })}\n`);
76
+ const oldTimestamp = new Date(Date.now() - 10_000);
77
+ fs.utimesSync(lockPath, oldTimestamp, oldTimestamp);
78
+ let entered = false;
79
+ await withWorktreePortRegistryLock(homeDir, async () => {
80
+ entered = true;
81
+ });
82
+ expect(entered).toBe(true);
83
+ expect(fs.existsSync(lockPath)).toBe(false);
84
+ });
85
+ it("reclaims an old lock when its pid belongs to a different process", async () => {
86
+ const homeDir = makeTemporaryRoot();
87
+ const lockPath = path.join(homeDir, ".worktree-port-reservations.lock");
88
+ fs.mkdirSync(lockPath);
89
+ fs.writeFileSync(path.join(lockPath, "owner.json"), `${JSON.stringify({
90
+ version: 1,
91
+ pid: process.pid,
92
+ processIdentity: "reused-pid-owner",
93
+ probePort: 1,
94
+ token: "abandoned-owner",
95
+ })}\n`);
96
+ const oldTimestamp = new Date(Date.now() - 10_000);
97
+ fs.utimesSync(lockPath, oldTimestamp, oldTimestamp);
98
+ let entered = false;
99
+ await withWorktreePortRegistryLock(homeDir, async () => {
100
+ entered = true;
101
+ });
102
+ expect(entered).toBe(true);
103
+ expect(fs.existsSync(lockPath)).toBe(false);
104
+ });
105
+ it("refreshes the lease while a synchronous critical section blocks the main thread", () => {
106
+ const homeDir = makeTemporaryRoot();
107
+ const lockPath = path.join(homeDir, ".worktree-port-reservations.lock");
108
+ const blocker = new Int32Array(new SharedArrayBuffer(4));
109
+ withWorktreePortRegistryLockSync(homeDir, () => {
110
+ const oldTimestamp = new Date(Date.now() - 10_000);
111
+ fs.utimesSync(lockPath, oldTimestamp, oldTimestamp);
112
+ Atomics.wait(blocker, 0, 0, 1_500);
113
+ expect(Date.now() - fs.statSync(lockPath).mtimeMs).toBeLessThan(1_250);
114
+ });
115
+ expect(fs.existsSync(lockPath)).toBe(false);
116
+ });
117
+ });
118
+ //# sourceMappingURL=worktree-port-registry.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"worktree-port-registry.test.js","sourceRoot":"","sources":["../src/worktree-port-registry.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,43 @@
1
+ export type WorktreeSeedSourceDiagnostic = {
2
+ configPath?: unknown;
3
+ instanceId?: unknown;
4
+ };
5
+ export type CanonicalWorktreeSeedSource = {
6
+ baseWorkspaceCwd: string | null;
7
+ configPath: string;
8
+ instanceId: string;
9
+ targetConfigPath: string;
10
+ targetInstanceId: string;
11
+ };
12
+ export type RegisteredWorktreeSeedSourceInput = {
13
+ registeredBaseWorkspaceCwd?: string | null;
14
+ explicitSourceConfigPath?: string | null;
15
+ targetConfigPath: string;
16
+ expectedTargetInstanceId: string;
17
+ };
18
+ /**
19
+ * Whether a base project workspace declares an instance config of its own.
20
+ *
21
+ * This tests directory entries and does not follow them. A dangling or aliased symlink,
22
+ * at the config itself or at the `.paperclip` directory holding it, still counts as a
23
+ * declared config, so the resolver rejects the malformed source instead of falling back
24
+ * to another one.
25
+ */
26
+ export declare function baseWorkspaceDeclaresInstanceConfig(baseWorkspaceCwd: string): boolean;
27
+ /** Resolve the authoritative source and target identities without consulting diagnostics. */
28
+ export declare function resolveRegisteredWorktreeSeedSource(input: RegisteredWorktreeSeedSourceInput): CanonicalWorktreeSeedSource;
29
+ /**
30
+ * Resolve a worktree seed source without granting authority to the seed manifest.
31
+ *
32
+ * A managed caller supplies the project-workspace cwd from its server-owned row.
33
+ * An operator may instead supply an explicit source config. A base workspace that
34
+ * carries its own `.paperclip/config.json` stays authoritative, so an explicit path
35
+ * must equal it; a base workspace that is a plain checkout has none, and the explicit
36
+ * path supplies the source. Manifest source fields are diagnostic assertions only and
37
+ * never select the returned source.
38
+ */
39
+ export declare function resolveCanonicalWorktreeSeedSource(input: RegisteredWorktreeSeedSourceInput & {
40
+ manifestSource: WorktreeSeedSourceDiagnostic | null | undefined;
41
+ manifestTargetInstanceId?: unknown;
42
+ }): CanonicalWorktreeSeedSource;
43
+ //# sourceMappingURL=worktree-seed-source.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"worktree-seed-source.d.ts","sourceRoot":"","sources":["../src/worktree-seed-source.ts"],"names":[],"mappings":"AAIA,MAAM,MAAM,4BAA4B,GAAG;IACzC,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB,UAAU,CAAC,EAAE,OAAO,CAAC;CACtB,CAAC;AAEF,MAAM,MAAM,2BAA2B,GAAG;IACxC,gBAAgB,EAAE,MAAM,GAAG,IAAI,CAAC;IAChC,UAAU,EAAE,MAAM,CAAC;IACnB,UAAU,EAAE,MAAM,CAAC;IACnB,gBAAgB,EAAE,MAAM,CAAC;IACzB,gBAAgB,EAAE,MAAM,CAAC;CAC1B,CAAC;AAEF,MAAM,MAAM,iCAAiC,GAAG;IAC9C,0BAA0B,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAC3C,wBAAwB,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IACzC,gBAAgB,EAAE,MAAM,CAAC;IACzB,wBAAwB,EAAE,MAAM,CAAC;CAClC,CAAC;AA6CF;;;;;;;GAOG;AACH,wBAAgB,mCAAmC,CAAC,gBAAgB,EAAE,MAAM,GAAG,OAAO,CAmBrF;AAmBD,6FAA6F;AAC7F,wBAAgB,mCAAmC,CACjD,KAAK,EAAE,iCAAiC,GACvC,2BAA2B,CAyE7B;AAED;;;;;;;;;GASG;AACH,wBAAgB,kCAAkC,CAAC,KAAK,EAAE,iCAAiC,GAAG;IAC5F,cAAc,EAAE,4BAA4B,GAAG,IAAI,GAAG,SAAS,CAAC;IAChE,wBAAwB,CAAC,EAAE,OAAO,CAAC;CACpC,GAAG,2BAA2B,CAsB9B"}
@@ -0,0 +1,180 @@
1
+ import { existsSync, lstatSync, readFileSync, realpathSync, statSync } from "node:fs";
2
+ import path from "node:path";
3
+ import { resolvePaperclipInstanceId } from "./home-paths.js";
4
+ function readInstanceId(configPath, label) {
5
+ const configDir = path.dirname(configPath);
6
+ const envPath = path.join(configDir, ".env");
7
+ if (!existsSync(envPath)) {
8
+ // An instance-root config (`<home>/instances/<id>/config.json`) names its instance
9
+ // by directory rather than by an adjacent .env; worktree configs always ship one.
10
+ if (path.basename(path.dirname(configDir)) === "instances") {
11
+ return resolvePaperclipInstanceId(path.basename(configDir));
12
+ }
13
+ throw new Error(`Registered ${label} Paperclip config is missing its adjacent .env instance pointer.`);
14
+ }
15
+ const contents = readFileSync(envPath, "utf8");
16
+ for (const rawLine of contents.split(/\r?\n/)) {
17
+ const match = rawLine.match(/^\s*(?:export\s+)?PAPERCLIP_INSTANCE_ID\s*=\s*(?:"([^"]*)"|'([^']*)'|([^\s#]+))/);
18
+ const value = (match?.[1] ?? match?.[2] ?? match?.[3] ?? "").trim();
19
+ if (value)
20
+ return value;
21
+ }
22
+ throw new Error(`Registered ${label} Paperclip config has no PAPERCLIP_INSTANCE_ID binding.`);
23
+ }
24
+ function errorCode(error) {
25
+ return error?.code ?? "unknown error";
26
+ }
27
+ /**
28
+ * Inspect a directory entry without following it, returning null only when it is absent.
29
+ *
30
+ * Any other failure means the declared path is unreadable or malformed, and a guess there
31
+ * would silently seed from a different instance.
32
+ */
33
+ function inspectDeclaredEntry(entryPath, configPath, detail) {
34
+ try {
35
+ return lstatSync(entryPath);
36
+ }
37
+ catch (error) {
38
+ if (errorCode(error) === "ENOENT")
39
+ return null;
40
+ throw new Error(`Registered base project workspace Paperclip config at ${configPath} cannot be inspected (${errorCode(error)}${detail ?? ""}).`);
41
+ }
42
+ }
43
+ /**
44
+ * Whether a base project workspace declares an instance config of its own.
45
+ *
46
+ * This tests directory entries and does not follow them. A dangling or aliased symlink,
47
+ * at the config itself or at the `.paperclip` directory holding it, still counts as a
48
+ * declared config, so the resolver rejects the malformed source instead of falling back
49
+ * to another one.
50
+ */
51
+ export function baseWorkspaceDeclaresInstanceConfig(baseWorkspaceCwd) {
52
+ const configDir = path.join(baseWorkspaceCwd, ".paperclip");
53
+ const configPath = path.join(configDir, "config.json");
54
+ if (inspectDeclaredEntry(configPath, configPath))
55
+ return true;
56
+ // The probe above resolves `.paperclip` before it reaches the config, so a broken link
57
+ // there also reports ENOENT. Only an absent or traversable `.paperclip` lets the caller
58
+ // name another source; a link that hides whatever it points at is malformed, not empty.
59
+ const configDirEntry = inspectDeclaredEntry(configDir, configPath, " on its .paperclip entry");
60
+ if (configDirEntry?.isSymbolicLink()) {
61
+ try {
62
+ statSync(configDir);
63
+ }
64
+ catch (error) {
65
+ throw new Error(`Registered base project workspace Paperclip config at ${configPath} cannot be inspected (${errorCode(error)} on its .paperclip symlink target).`);
66
+ }
67
+ }
68
+ return false;
69
+ }
70
+ function canonicalRegularFile(filePath, label) {
71
+ const resolved = path.resolve(filePath);
72
+ let canonical;
73
+ try {
74
+ canonical = realpathSync(resolved);
75
+ }
76
+ catch {
77
+ throw new Error(`${label} does not exist at ${resolved}.`);
78
+ }
79
+ if (canonical !== resolved || lstatSync(resolved).isSymbolicLink()) {
80
+ throw new Error(`${label} must be a canonical path and cannot use a symlink alias.`);
81
+ }
82
+ if (!lstatSync(canonical).isFile()) {
83
+ throw new Error(`${label} is not a regular file at ${canonical}.`);
84
+ }
85
+ return canonical;
86
+ }
87
+ /** Resolve the authoritative source and target identities without consulting diagnostics. */
88
+ export function resolveRegisteredWorktreeSeedSource(input) {
89
+ const registeredCwd = input.registeredBaseWorkspaceCwd?.trim();
90
+ const explicitSource = input.explicitSourceConfigPath?.trim();
91
+ if (!registeredCwd && !explicitSource) {
92
+ throw new Error("Worktree seed source is not registered. Managed boot requires a project workspace; manual boot requires --from-config.");
93
+ }
94
+ let canonicalBaseCwd = null;
95
+ let registeredConfigPath = null;
96
+ if (registeredCwd) {
97
+ const resolvedRegisteredCwd = path.resolve(registeredCwd);
98
+ try {
99
+ canonicalBaseCwd = realpathSync(resolvedRegisteredCwd);
100
+ }
101
+ catch {
102
+ throw new Error(`Registered base project workspace does not exist at ${resolvedRegisteredCwd}.`);
103
+ }
104
+ if (canonicalBaseCwd !== resolvedRegisteredCwd) {
105
+ throw new Error("Registered base project workspace must be canonical and cannot use a symlink alias.");
106
+ }
107
+ if (!lstatSync(canonicalBaseCwd).isDirectory()) {
108
+ throw new Error(`Registered base project workspace is not a directory at ${canonicalBaseCwd}.`);
109
+ }
110
+ // A base workspace that is a plain checkout carries no instance config of its own.
111
+ // The caller's explicit source supplies it, and stays subject to every check below.
112
+ registeredConfigPath = baseWorkspaceDeclaresInstanceConfig(canonicalBaseCwd)
113
+ ? path.join(canonicalBaseCwd, ".paperclip", "config.json")
114
+ : null;
115
+ }
116
+ const selectedPath = registeredConfigPath ?? explicitSource;
117
+ if (!selectedPath) {
118
+ throw new Error("Registered base project workspace has no Paperclip config of its own and no explicit source was provided.");
119
+ }
120
+ const canonicalSourceConfigPath = canonicalRegularFile(selectedPath, "Registered source Paperclip config");
121
+ if (registeredConfigPath && canonicalSourceConfigPath !== registeredConfigPath) {
122
+ throw new Error("Registered source Paperclip config escapes the base project workspace or uses a symlink alias.");
123
+ }
124
+ if (explicitSource) {
125
+ const canonicalExplicitSource = canonicalRegularFile(explicitSource, "Explicit source Paperclip config");
126
+ if (canonicalExplicitSource !== canonicalSourceConfigPath) {
127
+ throw new Error("Explicit source Paperclip config does not match the registered base project workspace.");
128
+ }
129
+ }
130
+ const canonicalTargetConfigPath = canonicalRegularFile(input.targetConfigPath, "Target worktree Paperclip config");
131
+ if (canonicalSourceConfigPath === canonicalTargetConfigPath) {
132
+ throw new Error("Source and target Paperclip configs are the same canonical file.");
133
+ }
134
+ const sourceInstanceId = readInstanceId(canonicalSourceConfigPath, "source");
135
+ const targetInstanceId = readInstanceId(canonicalTargetConfigPath, "target");
136
+ if (targetInstanceId !== input.expectedTargetInstanceId) {
137
+ throw new Error("Target Paperclip instance does not match the registered worktree instance.");
138
+ }
139
+ if (sourceInstanceId === targetInstanceId) {
140
+ throw new Error("Source and target Paperclip configs name the same instance.");
141
+ }
142
+ return {
143
+ baseWorkspaceCwd: canonicalBaseCwd,
144
+ configPath: canonicalSourceConfigPath,
145
+ instanceId: sourceInstanceId,
146
+ targetConfigPath: canonicalTargetConfigPath,
147
+ targetInstanceId,
148
+ };
149
+ }
150
+ /**
151
+ * Resolve a worktree seed source without granting authority to the seed manifest.
152
+ *
153
+ * A managed caller supplies the project-workspace cwd from its server-owned row.
154
+ * An operator may instead supply an explicit source config. A base workspace that
155
+ * carries its own `.paperclip/config.json` stays authoritative, so an explicit path
156
+ * must equal it; a base workspace that is a plain checkout has none, and the explicit
157
+ * path supplies the source. Manifest source fields are diagnostic assertions only and
158
+ * never select the returned source.
159
+ */
160
+ export function resolveCanonicalWorktreeSeedSource(input) {
161
+ const registered = resolveRegisteredWorktreeSeedSource(input);
162
+ const diagnosticPath = typeof input.manifestSource?.configPath === "string"
163
+ ? input.manifestSource.configPath.trim()
164
+ : "";
165
+ if (!diagnosticPath) {
166
+ throw new Error("Worktree seed manifest is missing source path diagnostics.");
167
+ }
168
+ const canonicalDiagnosticPath = canonicalRegularFile(diagnosticPath, "Worktree seed manifest source diagnostic");
169
+ if (path.resolve(diagnosticPath) !== registered.configPath || canonicalDiagnosticPath !== registered.configPath) {
170
+ throw new Error("Worktree seed manifest source path does not match the registered canonical source.");
171
+ }
172
+ if (input.manifestSource?.instanceId !== registered.instanceId) {
173
+ throw new Error("Worktree seed manifest source instance does not match the registered source instance.");
174
+ }
175
+ if (input.manifestTargetInstanceId !== registered.targetInstanceId) {
176
+ throw new Error("Worktree seed manifest target instance does not match the registered target instance.");
177
+ }
178
+ return registered;
179
+ }
180
+ //# sourceMappingURL=worktree-seed-source.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"worktree-seed-source.js","sourceRoot":"","sources":["../src/worktree-seed-source.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=worktree-seed-source.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"worktree-seed-source.test.d.ts","sourceRoot":"","sources":["../src/worktree-seed-source.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,166 @@
1
+ import fs from "node:fs";
2
+ import os from "node:os";
3
+ import path from "node:path";
4
+ import { afterEach, describe, expect, it } from "vitest";
5
+ import { resolveCanonicalWorktreeSeedSource } from "./worktree-seed-source.js";
6
+ const cleanup = [];
7
+ function makeInstance(prefix, instanceId) {
8
+ const cwd = fs.mkdtempSync(path.join(os.tmpdir(), prefix));
9
+ cleanup.push(cwd);
10
+ const configDir = path.join(cwd, ".paperclip");
11
+ const configPath = path.join(configDir, "config.json");
12
+ fs.mkdirSync(configDir, { recursive: true });
13
+ fs.writeFileSync(configPath, "{}\n");
14
+ fs.writeFileSync(path.join(configDir, ".env"), `PAPERCLIP_INSTANCE_ID=${instanceId}\n`);
15
+ return { cwd, configPath, instanceId };
16
+ }
17
+ /**
18
+ * A control plane's own instance root: `<home>/instances/<id>/config.json`, which
19
+ * names its instance by directory and has no adjacent .env.
20
+ */
21
+ function makeInstanceRoot(instanceId) {
22
+ const home = fs.mkdtempSync(path.join(os.tmpdir(), "paperclip-seed-home-"));
23
+ cleanup.push(home);
24
+ const configDir = path.join(home, "instances", instanceId);
25
+ fs.mkdirSync(configDir, { recursive: true });
26
+ const configPath = path.join(configDir, "config.json");
27
+ fs.writeFileSync(configPath, "{}\n");
28
+ return { configPath, instanceId };
29
+ }
30
+ /** A managed project checkout: a plain clone with no `.paperclip` of its own. */
31
+ function makePlainCheckout() {
32
+ const cwd = fs.mkdtempSync(path.join(os.tmpdir(), "paperclip-seed-checkout-"));
33
+ cleanup.push(cwd);
34
+ return cwd;
35
+ }
36
+ afterEach(() => {
37
+ for (const dir of cleanup.splice(0))
38
+ fs.rmSync(dir, { recursive: true, force: true });
39
+ });
40
+ describe("resolveCanonicalWorktreeSeedSource", () => {
41
+ it("returns only the registered base workspace config", () => {
42
+ const source = makeInstance("paperclip-seed-source-", "source-instance");
43
+ const target = makeInstance("paperclip-seed-target-", "target-instance");
44
+ expect(resolveCanonicalWorktreeSeedSource({
45
+ registeredBaseWorkspaceCwd: source.cwd,
46
+ targetConfigPath: target.configPath,
47
+ expectedTargetInstanceId: target.instanceId,
48
+ manifestSource: { configPath: source.configPath, instanceId: source.instanceId },
49
+ manifestTargetInstanceId: target.instanceId,
50
+ })).toMatchObject({
51
+ baseWorkspaceCwd: source.cwd,
52
+ configPath: source.configPath,
53
+ targetConfigPath: target.configPath,
54
+ });
55
+ });
56
+ it("takes the named source when the base workspace carries no config of its own", () => {
57
+ const baseCwd = makePlainCheckout();
58
+ const source = makeInstanceRoot("default");
59
+ const target = makeInstance("paperclip-seed-target-", "target-instance");
60
+ expect(resolveCanonicalWorktreeSeedSource({
61
+ registeredBaseWorkspaceCwd: baseCwd,
62
+ explicitSourceConfigPath: source.configPath,
63
+ targetConfigPath: target.configPath,
64
+ expectedTargetInstanceId: target.instanceId,
65
+ manifestSource: { configPath: source.configPath, instanceId: source.instanceId },
66
+ manifestTargetInstanceId: target.instanceId,
67
+ })).toMatchObject({
68
+ baseWorkspaceCwd: baseCwd,
69
+ configPath: source.configPath,
70
+ instanceId: "default",
71
+ });
72
+ });
73
+ it("rejects a dangling config symlink instead of falling back to the named source", () => {
74
+ const baseCwd = makePlainCheckout();
75
+ fs.mkdirSync(path.join(baseCwd, ".paperclip"), { recursive: true });
76
+ fs.symlinkSync(path.join(baseCwd, "absent.json"), path.join(baseCwd, ".paperclip", "config.json"));
77
+ const source = makeInstanceRoot("default");
78
+ const target = makeInstance("paperclip-seed-dangling-target-", "target-instance");
79
+ expect(() => resolveCanonicalWorktreeSeedSource({
80
+ registeredBaseWorkspaceCwd: baseCwd,
81
+ explicitSourceConfigPath: source.configPath,
82
+ targetConfigPath: target.configPath,
83
+ expectedTargetInstanceId: target.instanceId,
84
+ manifestSource: { configPath: source.configPath, instanceId: source.instanceId },
85
+ manifestTargetInstanceId: target.instanceId,
86
+ })).toThrow(/Registered source Paperclip config does not exist/);
87
+ });
88
+ it("fails closed when the declared config cannot be inspected", () => {
89
+ const baseCwd = makePlainCheckout();
90
+ // `.paperclip` as a regular file makes lstat report ENOTDIR, not ENOENT.
91
+ fs.writeFileSync(path.join(baseCwd, ".paperclip"), "not a directory\n");
92
+ const source = makeInstanceRoot("default");
93
+ const target = makeInstance("paperclip-seed-unreadable-target-", "target-instance");
94
+ expect(() => resolveCanonicalWorktreeSeedSource({
95
+ registeredBaseWorkspaceCwd: baseCwd,
96
+ explicitSourceConfigPath: source.configPath,
97
+ targetConfigPath: target.configPath,
98
+ expectedTargetInstanceId: target.instanceId,
99
+ manifestSource: { configPath: source.configPath, instanceId: source.instanceId },
100
+ manifestTargetInstanceId: target.instanceId,
101
+ })).toThrow(/cannot be inspected \(ENOTDIR\)/);
102
+ });
103
+ it("rejects a dangling .paperclip symlink instead of falling back to the named source", () => {
104
+ const baseCwd = makePlainCheckout();
105
+ // Resolving `.paperclip` fails before the probe reaches config.json, so the config
106
+ // entry reports ENOENT even though this workspace is malformed rather than plain.
107
+ fs.symlinkSync(path.join(baseCwd, "absent-dir"), path.join(baseCwd, ".paperclip"));
108
+ const source = makeInstanceRoot("default");
109
+ const target = makeInstance("paperclip-seed-dangling-parent-target-", "target-instance");
110
+ expect(() => resolveCanonicalWorktreeSeedSource({
111
+ registeredBaseWorkspaceCwd: baseCwd,
112
+ explicitSourceConfigPath: source.configPath,
113
+ targetConfigPath: target.configPath,
114
+ expectedTargetInstanceId: target.instanceId,
115
+ manifestSource: { configPath: source.configPath, instanceId: source.instanceId },
116
+ manifestTargetInstanceId: target.instanceId,
117
+ })).toThrow(/cannot be inspected \(ENOENT on its \.paperclip symlink target\)/);
118
+ });
119
+ it("takes the named source when .paperclip is a symlink to a directory with no config", () => {
120
+ const baseCwd = makePlainCheckout();
121
+ const linked = path.join(baseCwd, "linked-config-dir");
122
+ fs.mkdirSync(linked, { recursive: true });
123
+ fs.symlinkSync(linked, path.join(baseCwd, ".paperclip"));
124
+ const source = makeInstanceRoot("default");
125
+ const target = makeInstance("paperclip-seed-linked-empty-target-", "target-instance");
126
+ const resolved = resolveCanonicalWorktreeSeedSource({
127
+ registeredBaseWorkspaceCwd: baseCwd,
128
+ explicitSourceConfigPath: source.configPath,
129
+ targetConfigPath: target.configPath,
130
+ expectedTargetInstanceId: target.instanceId,
131
+ manifestSource: { configPath: source.configPath, instanceId: source.instanceId },
132
+ manifestTargetInstanceId: target.instanceId,
133
+ });
134
+ expect(resolved.configPath).toBe(source.configPath);
135
+ expect(resolved.instanceId).toBe("default");
136
+ });
137
+ it("fails closed when the base workspace carries no config and none is named", () => {
138
+ const baseCwd = makePlainCheckout();
139
+ const target = makeInstance("paperclip-seed-unnamed-target-", "target-instance");
140
+ expect(() => resolveCanonicalWorktreeSeedSource({
141
+ registeredBaseWorkspaceCwd: baseCwd,
142
+ targetConfigPath: target.configPath,
143
+ expectedTargetInstanceId: target.instanceId,
144
+ manifestSource: { configPath: target.configPath, instanceId: target.instanceId },
145
+ manifestTargetInstanceId: target.instanceId,
146
+ })).toThrow(/no Paperclip config of its own/);
147
+ });
148
+ it("fails closed without registration and when source equals target", () => {
149
+ const target = makeInstance("paperclip-seed-same-target-", "target-instance");
150
+ const diagnostic = { configPath: target.configPath, instanceId: target.instanceId };
151
+ expect(() => resolveCanonicalWorktreeSeedSource({
152
+ targetConfigPath: target.configPath,
153
+ expectedTargetInstanceId: target.instanceId,
154
+ manifestSource: diagnostic,
155
+ manifestTargetInstanceId: target.instanceId,
156
+ })).toThrow(/not registered/);
157
+ expect(() => resolveCanonicalWorktreeSeedSource({
158
+ registeredBaseWorkspaceCwd: target.cwd,
159
+ targetConfigPath: target.configPath,
160
+ expectedTargetInstanceId: target.instanceId,
161
+ manifestSource: diagnostic,
162
+ manifestTargetInstanceId: target.instanceId,
163
+ })).toThrow(/same canonical file/);
164
+ });
165
+ });
166
+ //# sourceMappingURL=worktree-seed-source.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"worktree-seed-source.test.js","sourceRoot":"","sources":["../src/worktree-seed-source.test.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@paperclipai/shared",
3
- "version": "2026.824.1",
3
+ "version": "2026.825.0-beta.1",
4
4
  "license": "MIT",
5
5
  "homepage": "https://github.com/paperclipai/paperclip",
6
6
  "bugs": {
@@ -33,12 +33,15 @@
33
33
  "dist"
34
34
  ],
35
35
  "dependencies": {
36
- "zod": "^3.24.2"
36
+ "zod": "^4.4.3"
37
37
  },
38
38
  "devDependencies": {
39
- "@types/node": "^22.20.1",
39
+ "@types/node": "^24.0.0",
40
40
  "typescript": "^5.7.3"
41
41
  },
42
+ "engines": {
43
+ "node": ">=24.11.0"
44
+ },
42
45
  "scripts": {
43
46
  "build": "tsc",
44
47
  "clean": "rm -rf dist",