@narumitw/pi-sync 0.57.10 → 0.57.12
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +14 -0
- package/README.md +32 -22
- package/dist/chunks/{agent-candidate-EYB35AGL.ts → agent-candidate-U2NU3GUX.ts} +11 -11
- package/dist/chunks/{agent-plan-KO43GTOR.ts → agent-plan-3YXDIJXO.ts} +25 -22
- package/dist/chunks/agent-plan-3YXDIJXO.ts.map +7 -0
- package/dist/chunks/{agent-refusal-retry-C2HQROTP.ts → agent-refusal-retry-476YGNU5.ts} +10 -10
- package/dist/chunks/{agent-runner-WMSCKSCB.ts → agent-runner-FCRV2Z75.ts} +11 -10
- package/dist/chunks/agent-runner-FCRV2Z75.ts.map +7 -0
- package/dist/chunks/{agent-store-UT52DS7B.ts → agent-store-7GINKTS7.ts} +8 -8
- package/dist/chunks/{agent-store-UT52DS7B.ts.map → agent-store-7GINKTS7.ts.map} +2 -2
- package/dist/chunks/{agent-sync-VM3TXWA3.ts → agent-sync-P6AWQXGK.ts} +6 -6
- package/dist/chunks/{chunk-JXWTEJS5.ts → chunk-45COPAK7.ts} +10 -3
- package/dist/chunks/chunk-45COPAK7.ts.map +7 -0
- package/dist/chunks/{chunk-DOJRPBQU.ts → chunk-5TSCBBPP.ts} +4 -4
- package/dist/chunks/{chunk-CDQGSZL3.ts → chunk-6LD5KX55.ts} +6 -6
- package/dist/chunks/{chunk-MDUORMCK.ts → chunk-6O3EDBRL.ts} +2 -2
- package/dist/chunks/{chunk-AAPAHANE.ts → chunk-7A35ZAVO.ts} +320 -219
- package/dist/chunks/chunk-7A35ZAVO.ts.map +7 -0
- package/dist/chunks/{chunk-STVQQ5KG.ts → chunk-7ZIYU5QS.ts} +6 -6
- package/dist/chunks/{chunk-AO6EDUA6.ts → chunk-AKMV47YC.ts} +3 -3
- package/dist/chunks/{chunk-66GAUVDL.ts → chunk-BEST45H2.ts} +6 -6
- package/dist/chunks/{chunk-DO55XUNU.ts → chunk-CBLTWXAU.ts} +15 -5
- package/dist/chunks/chunk-CBLTWXAU.ts.map +7 -0
- package/dist/chunks/{chunk-IMMMZUFC.ts → chunk-CQD2TJHE.ts} +7 -7
- package/dist/chunks/{chunk-IMMMZUFC.ts.map → chunk-CQD2TJHE.ts.map} +2 -2
- package/dist/chunks/{chunk-73MDIVYJ.ts → chunk-DN4IA7MR.ts} +6 -6
- package/dist/chunks/{chunk-PHANBTVM.ts → chunk-ESKOPQVB.ts} +4 -4
- package/dist/chunks/{chunk-YZ5BQNRZ.ts → chunk-FHE2DCA2.ts} +2 -2
- package/dist/chunks/{chunk-YZ5BQNRZ.ts.map → chunk-FHE2DCA2.ts.map} +2 -2
- package/dist/chunks/{chunk-MRIPZGPR.ts → chunk-FLHCOJCD.ts} +3 -3
- package/dist/chunks/{chunk-5WJQ6XOW.ts → chunk-GNYGNHFF.ts} +2 -2
- package/dist/chunks/{chunk-DFJGTVPX.ts → chunk-KYTT7KV4.ts} +2 -2
- package/dist/chunks/{chunk-UGSSZWQ6.ts → chunk-MKSMJPVA.ts} +2 -2
- package/dist/chunks/{chunk-2VSN3MFX.ts → chunk-MMQIEDZ6.ts} +33 -27
- package/dist/chunks/chunk-MMQIEDZ6.ts.map +7 -0
- package/dist/chunks/{chunk-RAMHGOX2.ts → chunk-OJARL2TG.ts} +4 -4
- package/dist/chunks/{chunk-BJXSCGQK.ts → chunk-OKPPZA4D.ts} +148 -89
- package/dist/chunks/chunk-OKPPZA4D.ts.map +7 -0
- package/dist/chunks/{chunk-RX3WGWVL.ts → chunk-OVBAW7KV.ts} +177 -130
- package/dist/chunks/chunk-OVBAW7KV.ts.map +7 -0
- package/dist/chunks/{chunk-U77DWNRH.ts → chunk-Q23JJW7E.ts} +3 -3
- package/dist/chunks/{chunk-NLWS55B6.ts → chunk-QPC5HT3A.ts} +2 -2
- package/dist/chunks/{chunk-NLWS55B6.ts.map → chunk-QPC5HT3A.ts.map} +1 -1
- package/dist/chunks/{chunk-4RLATUP4.ts → chunk-S5OCYVPS.ts} +7 -7
- package/dist/chunks/{chunk-4RLATUP4.ts.map → chunk-S5OCYVPS.ts.map} +2 -2
- package/dist/chunks/{chunk-QWV3XKNJ.ts → chunk-TIMWN2RH.ts} +5 -5
- package/dist/chunks/{chunk-Z5O2TLNF.ts → chunk-TZC7GDJE.ts} +7 -7
- package/dist/chunks/{chunk-UCD7TQDT.ts → chunk-U6GXGY5G.ts} +5 -5
- package/dist/chunks/{chunk-PWA3YN5Z.ts → chunk-XEODG2PE.ts} +3 -3
- package/dist/chunks/{chunk-TO2GMX3K.ts → chunk-XJHQPB3E.ts} +2 -2
- package/dist/chunks/{chunk-JY2RVOUL.ts → chunk-Y4UVXOLQ.ts} +5 -5
- package/dist/chunks/{chunk-ODF2M4RF.ts → chunk-ZC3IHFNM.ts} +8 -8
- package/dist/chunks/{chunk-ODF2M4RF.ts.map → chunk-ZC3IHFNM.ts.map} +2 -2
- package/dist/chunks/{chunk-M5IV3KL2.ts → chunk-ZDDBZH72.ts} +3 -3
- package/dist/chunks/{command-handler-FO6F2APH.ts → command-handler-VKLZBRLO.ts} +26 -21
- package/dist/chunks/command-handler-VKLZBRLO.ts.map +7 -0
- package/dist/chunks/{config-B37W7FXW.ts → config-HYG7G5EM.ts} +6 -4
- package/dist/chunks/{conflict-artifacts-6XGSSU5S.ts → conflict-artifacts-J6WSDCWP.ts} +12 -12
- package/dist/chunks/{conflict-review-BQSHSJB3.ts → conflict-review-GXA6Y7KY.ts} +23 -23
- package/dist/chunks/{continuous-record-4DQ2EAZS.ts → continuous-record-EPHGR2DU.ts} +6 -6
- package/dist/chunks/{continuous-sync-ZT3UEQLK.ts → continuous-sync-TTOSJCQU.ts} +18 -18
- package/dist/chunks/{file-selection-FBLKM25V.ts → file-selection-IELTXSGZ.ts} +6 -7
- package/dist/chunks/{file-selection-FBLKM25V.ts.map → file-selection-IELTXSGZ.ts.map} +1 -1
- package/dist/chunks/{git-backend-7PCWECRN.ts → git-backend-KHD36W27.ts} +6 -7
- package/dist/chunks/{git-backend-7PCWECRN.ts.map → git-backend-KHD36W27.ts.map} +1 -1
- package/dist/chunks/{local-fields-B6JWLPAE.ts → local-fields-JEKAPZKD.ts} +6 -7
- package/dist/chunks/manager-result-dispatcher-6W52NM7F.ts +32 -0
- package/dist/chunks/{manager-ui-DGRTG76I.ts → manager-ui-INVMAFEN.ts} +245 -224
- package/dist/chunks/manager-ui-INVMAFEN.ts.map +7 -0
- package/dist/chunks/{merge-baseline-store-HL3VLMAM.ts → merge-baseline-store-65GKUMXI.ts} +6 -6
- package/dist/chunks/{remote-selection-ui-OHMIQ32X.ts → remote-selection-ui-TD4C4W3J.ts} +16 -12
- package/dist/chunks/{s3-backend-CJXBEWWU.ts → s3-backend-L24UZ6IK.ts} +12 -10
- package/dist/chunks/s3-backend-L24UZ6IK.ts.map +7 -0
- package/dist/chunks/{setup-switch-66GWMBNH.ts → setup-switch-KLGESLQX.ts} +6 -6
- package/dist/chunks/{setup-wizard-OHZXJVQZ.ts → setup-wizard-ZQAK35BP.ts} +7 -7
- package/dist/chunks/{snapshot-VRHNAUUH.ts → snapshot-RGNDYT6A.ts} +5 -6
- package/dist/chunks/{snapshot-transaction-EUGA4VX6.ts → snapshot-transaction-26BQO36S.ts} +8 -8
- package/dist/chunks/{sync-inspection-4WFQEJOE.ts → sync-inspection-MOMLGUTD.ts} +11 -11
- package/dist/chunks/{sync-operations-X4AOXMBT.ts → sync-operations-TMGQHBF5.ts} +26 -26
- package/dist/chunks/{sync-operations-X4AOXMBT.ts.map → sync-operations-TMGQHBF5.ts.map} +2 -2
- package/dist/chunks/{sync-state-SWLSMK4G.ts → sync-state-7L4NT7W2.ts} +7 -8
- package/dist/chunks/{webdav-backend-2Q5ZEBST.ts → webdav-backend-3ZCACILP.ts} +7 -8
- package/dist/chunks/{webdav-backend-2Q5ZEBST.ts.map → webdav-backend-3ZCACILP.ts.map} +1 -1
- package/dist/index.ts +20 -20
- package/docs/agent-continuous-hardening.md +5 -5
- package/docs/agent-mode-verification.md +3 -3
- package/docs/agent-quality-verification.md +3 -3
- package/docs/continuous-sync-verification.md +2 -2
- package/docs/settings.md +9 -5
- package/docs/tui-contract.md +20 -3
- package/package.json +3 -3
- package/skills/configure-pi-sync/SKILL.md +3 -1
- package/skills/configure-pi-sync/references/configuration.md +56 -38
- package/src/backends/s3/s3-client.ts +8 -1
- package/src/commands/command-execution.ts +11 -6
- package/src/commands/command.ts +1 -1
- package/src/paths.ts +6 -1
- package/src/settings/config-file.ts +205 -118
- package/src/settings/config.ts +1 -1
- package/src/settings/settings-management.ts +15 -1
- package/src/settings/settings-store.ts +0 -14
- package/src/settings/settings-types.ts +1 -1
- package/src/snapshot/session-paths.ts +15 -2
- package/src/snapshot/snapshot-mutation-queues.ts +142 -0
- package/src/snapshot/snapshot-transaction.ts +122 -125
- package/src/sync/agent-candidate.ts +3 -3
- package/src/sync/agent-plan.ts +11 -8
- package/src/sync/agent-runner.ts +10 -9
- package/src/sync/agent-store.ts +1 -1
- package/src/sync/agent-sync.ts +2 -2
- package/src/sync/continuous-record.ts +1 -1
- package/src/sync/merge-apply.ts +6 -0
- package/src/sync/merged-sync.ts +4 -4
- package/src/sync/sync-mutations.ts +1 -1
- package/src/ui/agent-mode-setting.ts +6 -6
- package/src/ui/cancellable-operation.ts +36 -13
- package/src/ui/manager-state.ts +4 -2
- package/src/ui/manager-ui.ts +76 -24
- package/src/ui/remote-selection-ui.ts +131 -82
- package/src/ui/settings-ui.ts +21 -56
- package/src/ui/setup/setup-switcher.ts +2 -2
- package/src/ui/sync-setups-ui.ts +2 -2
- package/dist/chunks/agent-plan-KO43GTOR.ts.map +0 -7
- package/dist/chunks/agent-runner-WMSCKSCB.ts.map +0 -7
- package/dist/chunks/chunk-2VSN3MFX.ts.map +0 -7
- package/dist/chunks/chunk-AAPAHANE.ts.map +0 -7
- package/dist/chunks/chunk-BJXSCGQK.ts.map +0 -7
- package/dist/chunks/chunk-DO55XUNU.ts.map +0 -7
- package/dist/chunks/chunk-JXWTEJS5.ts.map +0 -7
- package/dist/chunks/chunk-RX3WGWVL.ts.map +0 -7
- package/dist/chunks/command-handler-FO6F2APH.ts.map +0 -7
- package/dist/chunks/manager-result-dispatcher-NODX3KKH.ts +0 -28
- package/dist/chunks/manager-ui-DGRTG76I.ts.map +0 -7
- package/dist/chunks/s3-backend-CJXBEWWU.ts.map +0 -7
- /package/dist/chunks/{agent-candidate-EYB35AGL.ts.map → agent-candidate-U2NU3GUX.ts.map} +0 -0
- /package/dist/chunks/{agent-refusal-retry-C2HQROTP.ts.map → agent-refusal-retry-476YGNU5.ts.map} +0 -0
- /package/dist/chunks/{agent-sync-VM3TXWA3.ts.map → agent-sync-P6AWQXGK.ts.map} +0 -0
- /package/dist/chunks/{chunk-DOJRPBQU.ts.map → chunk-5TSCBBPP.ts.map} +0 -0
- /package/dist/chunks/{chunk-CDQGSZL3.ts.map → chunk-6LD5KX55.ts.map} +0 -0
- /package/dist/chunks/{chunk-MDUORMCK.ts.map → chunk-6O3EDBRL.ts.map} +0 -0
- /package/dist/chunks/{chunk-STVQQ5KG.ts.map → chunk-7ZIYU5QS.ts.map} +0 -0
- /package/dist/chunks/{chunk-AO6EDUA6.ts.map → chunk-AKMV47YC.ts.map} +0 -0
- /package/dist/chunks/{chunk-66GAUVDL.ts.map → chunk-BEST45H2.ts.map} +0 -0
- /package/dist/chunks/{chunk-73MDIVYJ.ts.map → chunk-DN4IA7MR.ts.map} +0 -0
- /package/dist/chunks/{chunk-PHANBTVM.ts.map → chunk-ESKOPQVB.ts.map} +0 -0
- /package/dist/chunks/{chunk-MRIPZGPR.ts.map → chunk-FLHCOJCD.ts.map} +0 -0
- /package/dist/chunks/{chunk-5WJQ6XOW.ts.map → chunk-GNYGNHFF.ts.map} +0 -0
- /package/dist/chunks/{chunk-DFJGTVPX.ts.map → chunk-KYTT7KV4.ts.map} +0 -0
- /package/dist/chunks/{chunk-UGSSZWQ6.ts.map → chunk-MKSMJPVA.ts.map} +0 -0
- /package/dist/chunks/{chunk-RAMHGOX2.ts.map → chunk-OJARL2TG.ts.map} +0 -0
- /package/dist/chunks/{chunk-U77DWNRH.ts.map → chunk-Q23JJW7E.ts.map} +0 -0
- /package/dist/chunks/{chunk-QWV3XKNJ.ts.map → chunk-TIMWN2RH.ts.map} +0 -0
- /package/dist/chunks/{chunk-Z5O2TLNF.ts.map → chunk-TZC7GDJE.ts.map} +0 -0
- /package/dist/chunks/{chunk-UCD7TQDT.ts.map → chunk-U6GXGY5G.ts.map} +0 -0
- /package/dist/chunks/{chunk-PWA3YN5Z.ts.map → chunk-XEODG2PE.ts.map} +0 -0
- /package/dist/chunks/{chunk-TO2GMX3K.ts.map → chunk-XJHQPB3E.ts.map} +0 -0
- /package/dist/chunks/{chunk-JY2RVOUL.ts.map → chunk-Y4UVXOLQ.ts.map} +0 -0
- /package/dist/chunks/{chunk-M5IV3KL2.ts.map → chunk-ZDDBZH72.ts.map} +0 -0
- /package/dist/chunks/{config-B37W7FXW.ts.map → config-HYG7G5EM.ts.map} +0 -0
- /package/dist/chunks/{conflict-artifacts-6XGSSU5S.ts.map → conflict-artifacts-J6WSDCWP.ts.map} +0 -0
- /package/dist/chunks/{conflict-review-BQSHSJB3.ts.map → conflict-review-GXA6Y7KY.ts.map} +0 -0
- /package/dist/chunks/{continuous-record-4DQ2EAZS.ts.map → continuous-record-EPHGR2DU.ts.map} +0 -0
- /package/dist/chunks/{continuous-sync-ZT3UEQLK.ts.map → continuous-sync-TTOSJCQU.ts.map} +0 -0
- /package/dist/chunks/{local-fields-B6JWLPAE.ts.map → local-fields-JEKAPZKD.ts.map} +0 -0
- /package/dist/chunks/{manager-result-dispatcher-NODX3KKH.ts.map → manager-result-dispatcher-6W52NM7F.ts.map} +0 -0
- /package/dist/chunks/{merge-baseline-store-HL3VLMAM.ts.map → merge-baseline-store-65GKUMXI.ts.map} +0 -0
- /package/dist/chunks/{remote-selection-ui-OHMIQ32X.ts.map → remote-selection-ui-TD4C4W3J.ts.map} +0 -0
- /package/dist/chunks/{setup-switch-66GWMBNH.ts.map → setup-switch-KLGESLQX.ts.map} +0 -0
- /package/dist/chunks/{setup-wizard-OHZXJVQZ.ts.map → setup-wizard-ZQAK35BP.ts.map} +0 -0
- /package/dist/chunks/{snapshot-VRHNAUUH.ts.map → snapshot-RGNDYT6A.ts.map} +0 -0
- /package/dist/chunks/{snapshot-transaction-EUGA4VX6.ts.map → snapshot-transaction-26BQO36S.ts.map} +0 -0
- /package/dist/chunks/{sync-inspection-4WFQEJOE.ts.map → sync-inspection-MOMLGUTD.ts.map} +0 -0
- /package/dist/chunks/{sync-state-SWLSMK4G.ts.map → sync-state-7L4NT7W2.ts.map} +0 -0
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../../src/sync/agent-store.ts"],
|
|
4
|
-
"sourcesContent": ["import { createHash, randomUUID } from \"node:crypto\";\nimport fs from \"node:fs/promises\";\nimport path from \"node:path\";\nimport lockfile from \"proper-lockfile\";\nimport { writeJson } from \"../state/json-file.js\";\nimport { withLock } from \"../state/lock.js\";\nimport { LOCK_GUARD_STALE_MS, LOCK_GUARD_UPDATE_MS } from \"../state/lock-policy.js\";\nimport { LOCKFILE_FS_ADAPTER } from \"../state/lockfile-fs.js\";\nimport { stateDir } from \"../state/state-directory.js\";\nimport type { AgentCandidate } from \"./agent-candidate.js\";\nimport { AGENT_OUTPUT_BYTES } from \"./agent-policy.js\";\nimport { ContinuousError } from \"./continuous-errors.js\";\n\ninterface Claim {\n version: 1;\n id: string;\n pid: number;\n}\nfunction paths() {\n const root = path.join(stateDir(), \"agent-resolver\");\n return { root, claim: path.join(root, \"claim.json\") };\n}\nasync function directory() {\n const { root } = paths();\n await fs.mkdir(root, { mode: 0o700 });\n}\nasync function checkDirectory() {\n const stat = await fs.lstat(paths().root);\n if (!stat.isDirectory() || stat.isSymbolicLink() || (process.platform !== \"win32\" && stat.mode & 0o077))\n throw new Error(\"Unsafe agent resolver directory; evidence retained.\");\n}\nasync function readPrivate(file: string): Promise<unknown> {\n try {\n await checkDirectory();\n const stat = await fs.lstat(file);\n if (\n !stat.isFile() ||\n stat.isSymbolicLink() ||\n stat.nlink !== 1 ||\n stat.size > AGENT_OUTPUT_BYTES * 2 ||\n (process.platform !== \"win32\" && stat.mode & 0o077)\n )\n throw new Error(\"Unsafe agent resolver record; evidence retained.\");\n return JSON.parse(await fs.readFile(file, \"utf8\"));\n } catch (error) {\n if ((error as NodeJS.ErrnoException).code === \"ENOENT\") return undefined;\n throw new Error(\"Unreadable agent resolver record; evidence retained.\");\n }\n}\nasync function readClaim(): Promise<Claim | undefined> {\n const value = await readPrivate(paths().claim);\n if (value === undefined) return;\n const claim = value as Claim;\n if (\n claim?.version !== 1 ||\n typeof claim.id !== \"string\" ||\n !/^[a-f0-9]{8}-[a-f0-9]{4}-[a-f0-9]{4}-[a-f0-9]{4}-[a-f0-9]{12}$/u.test(claim.id) ||\n Object.keys(claim).sort().join(\",\") !== \"id,pid,version\" ||\n !Number.isSafeInteger(claim.pid) ||\n claim.pid < 1 ||\n claim.pid > 2_147_483_647\n )\n throw new Error(\"Invalid agent resolver claim; evidence retained.\");\n return claim;\n}\nfunction alive(pid: number) {\n try {\n process.kill(pid, 0);\n return true;\n } catch (error) {\n return (error as NodeJS.ErrnoException).code !== \"ESRCH\";\n }\n}\n\n/** Caller retains the state-directory migration guard; claim changes use a separate short-lived guard. */\nexport async function withAgentClaim<T>(fn: (assertOwner: () => Promise<void>) => Promise<T>): Promise<T> {\n const claim: Claim = { version: 1, id: randomUUID(), pid: process.pid };\n let armed = false;\n const assertOwner = async () => {\n const current = await readClaim();\n if (current?.id !== claim.id || current.pid !== process.pid)\n throw new Error(\"Agent resolver ownership changed; candidate not applied.\");\n };\n try {\n await withLock(\"agent-claim\", async () => {\n try {\n await directory();\n } catch (error) {\n if ((error as NodeJS.ErrnoException).code !== \"EEXIST\") throw error;\n }\n await checkDirectory();\n await withClaimGuard(async () => {\n const existing = await readClaim();\n if (existing && alive(existing.pid))\n throw new ContinuousError(\"contention\", \"
|
|
5
|
-
"mappings": ";;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA,SAAS,YAAY,kBAAkB;AACvC,OAAO,QAAQ;AACf,OAAO,UAAU;AACjB,OAAO,cAAc;AAerB,SAAS,QAAQ;AACf,QAAM,OAAO,KAAK,KAAK,SAAS,GAAG,gBAAgB;AACnD,SAAO,EAAE,MAAM,OAAO,KAAK,KAAK,MAAM,YAAY,EAAE;AACtD;AACA,eAAe,YAAY;AACzB,QAAM,EAAE,KAAK,IAAI,MAAM;AACvB,QAAM,GAAG,MAAM,MAAM,EAAE,MAAM,IAAM,CAAC;AACtC;AACA,eAAe,iBAAiB;AAC9B,QAAM,OAAO,MAAM,GAAG,MAAM,MAAM,EAAE,IAAI;AACxC,MAAI,CAAC,KAAK,YAAY,KAAK,KAAK,eAAe,KAAM,QAAQ,aAAa,WAAW,KAAK,OAAO;AAC/F,UAAM,IAAI,MAAM,qDAAqD;AACzE;AACA,eAAe,YAAY,MAAgC;AACzD,MAAI;AACF,UAAM,eAAe;AACrB,UAAM,OAAO,MAAM,GAAG,MAAM,IAAI;AAChC,QACE,CAAC,KAAK,OAAO,KACb,KAAK,eAAe,KACpB,KAAK,UAAU,KACf,KAAK,OAAO,qBAAqB,KAChC,QAAQ,aAAa,WAAW,KAAK,OAAO;AAE7C,YAAM,IAAI,MAAM,kDAAkD;AACpE,WAAO,KAAK,MAAM,MAAM,GAAG,SAAS,MAAM,MAAM,CAAC;AAAA,EACnD,SAAS,OAAO;AACd,QAAK,MAAgC,SAAS,SAAU,QAAO;AAC/D,UAAM,IAAI,MAAM,sDAAsD;AAAA,EACxE;AACF;AACA,eAAe,YAAwC;AACrD,QAAM,QAAQ,MAAM,YAAY,MAAM,EAAE,KAAK;AAC7C,MAAI,UAAU,OAAW;AACzB,QAAM,QAAQ;AACd,MACE,OAAO,YAAY,KACnB,OAAO,MAAM,OAAO,YACpB,CAAC,kEAAkE,KAAK,MAAM,EAAE,KAChF,OAAO,KAAK,KAAK,EAAE,KAAK,EAAE,KAAK,GAAG,MAAM,oBACxC,CAAC,OAAO,cAAc,MAAM,GAAG,KAC/B,MAAM,MAAM,KACZ,MAAM,MAAM;AAEZ,UAAM,IAAI,MAAM,kDAAkD;AACpE,SAAO;AACT;AACA,SAAS,MAAM,KAAa;AAC1B,MAAI;AACF,YAAQ,KAAK,KAAK,CAAC;AACnB,WAAO;AAAA,EACT,SAAS,OAAO;AACd,WAAQ,MAAgC,SAAS;AAAA,EACnD;AACF;AAGA,eAAsB,eAAkB,IAAkE;AACxG,QAAM,QAAe,EAAE,SAAS,GAAG,IAAI,WAAW,GAAG,KAAK,QAAQ,IAAI;AACtE,MAAI,QAAQ;AACZ,QAAM,cAAc,YAAY;AAC9B,UAAM,UAAU,MAAM,UAAU;AAChC,QAAI,SAAS,OAAO,MAAM,MAAM,QAAQ,QAAQ,QAAQ;AACtD,YAAM,IAAI,MAAM,0DAA0D;AAAA,EAC9E;AACA,MAAI;AACF,UAAM,SAAS,eAAe,YAAY;AACxC,UAAI;AACF,cAAM,UAAU;AAAA,MAClB,SAAS,OAAO;AACd,YAAK,MAAgC,SAAS,SAAU,OAAM;AAAA,MAChE;AACA,YAAM,eAAe;AACrB,YAAM,eAAe,YAAY;AAC/B,cAAM,WAAW,MAAM,UAAU;AACjC,YAAI,YAAY,MAAM,SAAS,GAAG;AAChC,gBAAM,IAAI,gBAAgB,cAAc,
|
|
4
|
+
"sourcesContent": ["import { createHash, randomUUID } from \"node:crypto\";\nimport fs from \"node:fs/promises\";\nimport path from \"node:path\";\nimport lockfile from \"proper-lockfile\";\nimport { writeJson } from \"../state/json-file.js\";\nimport { withLock } from \"../state/lock.js\";\nimport { LOCK_GUARD_STALE_MS, LOCK_GUARD_UPDATE_MS } from \"../state/lock-policy.js\";\nimport { LOCKFILE_FS_ADAPTER } from \"../state/lockfile-fs.js\";\nimport { stateDir } from \"../state/state-directory.js\";\nimport type { AgentCandidate } from \"./agent-candidate.js\";\nimport { AGENT_OUTPUT_BYTES } from \"./agent-policy.js\";\nimport { ContinuousError } from \"./continuous-errors.js\";\n\ninterface Claim {\n version: 1;\n id: string;\n pid: number;\n}\nfunction paths() {\n const root = path.join(stateDir(), \"agent-resolver\");\n return { root, claim: path.join(root, \"claim.json\") };\n}\nasync function directory() {\n const { root } = paths();\n await fs.mkdir(root, { mode: 0o700 });\n}\nasync function checkDirectory() {\n const stat = await fs.lstat(paths().root);\n if (!stat.isDirectory() || stat.isSymbolicLink() || (process.platform !== \"win32\" && stat.mode & 0o077))\n throw new Error(\"Unsafe agent resolver directory; evidence retained.\");\n}\nasync function readPrivate(file: string): Promise<unknown> {\n try {\n await checkDirectory();\n const stat = await fs.lstat(file);\n if (\n !stat.isFile() ||\n stat.isSymbolicLink() ||\n stat.nlink !== 1 ||\n stat.size > AGENT_OUTPUT_BYTES * 2 ||\n (process.platform !== \"win32\" && stat.mode & 0o077)\n )\n throw new Error(\"Unsafe agent resolver record; evidence retained.\");\n return JSON.parse(await fs.readFile(file, \"utf8\"));\n } catch (error) {\n if ((error as NodeJS.ErrnoException).code === \"ENOENT\") return undefined;\n throw new Error(\"Unreadable agent resolver record; evidence retained.\");\n }\n}\nasync function readClaim(): Promise<Claim | undefined> {\n const value = await readPrivate(paths().claim);\n if (value === undefined) return;\n const claim = value as Claim;\n if (\n claim?.version !== 1 ||\n typeof claim.id !== \"string\" ||\n !/^[a-f0-9]{8}-[a-f0-9]{4}-[a-f0-9]{4}-[a-f0-9]{4}-[a-f0-9]{12}$/u.test(claim.id) ||\n Object.keys(claim).sort().join(\",\") !== \"id,pid,version\" ||\n !Number.isSafeInteger(claim.pid) ||\n claim.pid < 1 ||\n claim.pid > 2_147_483_647\n )\n throw new Error(\"Invalid agent resolver claim; evidence retained.\");\n return claim;\n}\nfunction alive(pid: number) {\n try {\n process.kill(pid, 0);\n return true;\n } catch (error) {\n return (error as NodeJS.ErrnoException).code !== \"ESRCH\";\n }\n}\n\n/** Caller retains the state-directory migration guard; claim changes use a separate short-lived guard. */\nexport async function withAgentClaim<T>(fn: (assertOwner: () => Promise<void>) => Promise<T>): Promise<T> {\n const claim: Claim = { version: 1, id: randomUUID(), pid: process.pid };\n let armed = false;\n const assertOwner = async () => {\n const current = await readClaim();\n if (current?.id !== claim.id || current.pid !== process.pid)\n throw new Error(\"Agent resolver ownership changed; candidate not applied.\");\n };\n try {\n await withLock(\"agent-claim\", async () => {\n try {\n await directory();\n } catch (error) {\n if ((error as NodeJS.ErrnoException).code !== \"EEXIST\") throw error;\n }\n await checkDirectory();\n await withClaimGuard(async () => {\n const existing = await readClaim();\n if (existing && alive(existing.pid))\n throw new ContinuousError(\"contention\", \"Autonomous sync deferred: another local resolver is running.\");\n // A durability failure can occur after rename: cleanup must own partial initialization too.\n armed = true;\n await writeJson(paths().claim, claim);\n });\n });\n return await fn(assertOwner);\n } finally {\n if (armed) await releaseClaim(claim);\n }\n}\nasync function releaseClaim(claim: Claim) {\n // Ordinary transfers may hold the operation lock for an arbitrary time.\n // Cleanup needs only the claim guard; it never waits for that operation lock.\n await withClaimGuard(async () => {\n const current = await readClaim();\n if (current?.id === claim.id && current.pid === claim.pid) await fs.rm(paths().claim);\n });\n}\nasync function withClaimGuard<T>(run: () => Promise<T>): Promise<T> {\n await checkDirectory();\n let compromisedError: Error | undefined;\n const release = await lockfile.lock(paths().claim, {\n fs: LOCKFILE_FS_ADAPTER,\n realpath: false,\n stale: LOCK_GUARD_STALE_MS,\n update: LOCK_GUARD_UPDATE_MS,\n retries: { retries: 100, factor: 1.2, minTimeout: 10, maxTimeout: 100 },\n onCompromised: (error) => {\n compromisedError = error;\n },\n });\n try {\n const result = await run();\n if (compromisedError) throw compromisedError;\n return result;\n } finally {\n await release();\n }\n}\nfunction candidatePath(key: string) {\n if (!/^[a-f0-9]{64}$/u.test(key)) throw new Error(\"Invalid agent candidate key.\");\n return path.join(paths().root, `${key}.json`);\n}\nexport async function readAgentCandidate(key: string): Promise<unknown> {\n return readPrivate(candidatePath(key));\n}\nexport async function saveAgentCandidate(key: string, candidate: unknown) {\n await checkDirectory();\n const target = candidatePath(key);\n const existing = await readPrivate(target);\n if (existing !== undefined) {\n if (JSON.stringify(existing) !== JSON.stringify(candidate))\n throw new Error(\"Agent candidate changed before save; existing evidence retained.\");\n return;\n }\n await writeJson(target, candidate, { maxBytes: AGENT_OUTPUT_BYTES * 2 });\n}\n\n/** Caller holds the resolver claim and operation lock and has validated both candidates. */\nexport async function replaceRefusedAgentCandidate(\n key: string,\n previous: AgentCandidate,\n candidate: AgentCandidate,\n validate: () => Promise<void>,\n) {\n const original = JSON.stringify(previous);\n if (!previous.results.some((row) => \"refuse\" in row) || candidate.results.some((row) => \"refuse\" in row))\n throw new Error(\"Only a validated refusal can be replaced by a complete retry result.\");\n const target = candidatePath(key);\n const assertPrevious = async () => {\n if (JSON.stringify(await readPrivate(target)) !== original)\n throw new Error(\"Cached refusal changed during review; previous evidence retained.\");\n await validate();\n };\n await assertPrevious();\n const digest = createHash(\"sha256\").update(original).digest(\"hex\");\n const archive = path.join(paths().root, `${key}.refusal-${digest}.json`);\n const retained = await readPrivate(archive);\n await validate();\n if (retained !== undefined && JSON.stringify(retained) !== original)\n throw new Error(\"Retained refusal changed; evidence retained.\");\n if (retained === undefined) await writeJson(archive, previous, { maxBytes: AGENT_OUTPUT_BYTES * 2 });\n await assertPrevious();\n // Archive first: even a durability error after replacement retains the original refusal.\n // Once rename commits, later cancellation cannot undo the valid new candidate.\n await writeJson(target, candidate, { maxBytes: AGENT_OUTPUT_BYTES * 2 });\n}\n"],
|
|
5
|
+
"mappings": "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",
|
|
6
6
|
"names": []
|
|
7
7
|
}
|
|
@@ -2,21 +2,21 @@
|
|
|
2
2
|
// @ts-nocheck -- generated JavaScript uses a .ts extension for Pi's Jiti loader.
|
|
3
3
|
import {
|
|
4
4
|
withAgentSyncLock
|
|
5
|
-
} from "./chunk-
|
|
5
|
+
} from "./chunk-ZC3IHFNM.ts";
|
|
6
6
|
import "./chunk-3ST7RSYN.ts";
|
|
7
7
|
import "./chunk-K3RIEL6J.ts";
|
|
8
|
-
import "./chunk-
|
|
8
|
+
import "./chunk-6O3EDBRL.ts";
|
|
9
9
|
import "./chunk-PWMWOJP4.ts";
|
|
10
|
-
import "./chunk-
|
|
10
|
+
import "./chunk-DN4IA7MR.ts";
|
|
11
|
+
import "./chunk-AR2DGDUI.ts";
|
|
11
12
|
import "./chunk-SWRVXVFD.ts";
|
|
12
13
|
import "./chunk-2JZFHNLM.ts";
|
|
13
14
|
import "./chunk-T2SJD3N7.ts";
|
|
14
|
-
import "./chunk-
|
|
15
|
-
import "./chunk-YZ5BQNRZ.ts";
|
|
15
|
+
import "./chunk-FHE2DCA2.ts";
|
|
16
16
|
import "./chunk-DT7M4VQS.ts";
|
|
17
17
|
import "./chunk-YDVQYUHE.ts";
|
|
18
18
|
import "./chunk-PRUEIIK7.ts";
|
|
19
19
|
export {
|
|
20
20
|
withAgentSyncLock
|
|
21
21
|
};
|
|
22
|
-
//# sourceMappingURL=agent-sync-
|
|
22
|
+
//# sourceMappingURL=agent-sync-P6AWQXGK.ts.map
|
|
@@ -1,15 +1,17 @@
|
|
|
1
1
|
// @generated by scripts/build-runtime.mjs; do not edit.
|
|
2
2
|
// @ts-nocheck -- generated JavaScript uses a .ts extension for Pi's Jiti loader.
|
|
3
3
|
import {
|
|
4
|
+
configFromSettings,
|
|
4
5
|
effectiveSyncSetupRemoteIdentity,
|
|
5
6
|
localConfigPath,
|
|
7
|
+
syncCheckConfigFingerprint,
|
|
6
8
|
syncSetupStorageReview,
|
|
7
9
|
updateLocalConfig,
|
|
8
10
|
validateConfigName
|
|
9
|
-
} from "./chunk-
|
|
11
|
+
} from "./chunk-OVBAW7KV.ts";
|
|
10
12
|
import {
|
|
11
13
|
normalizeSyncInclude
|
|
12
|
-
} from "./chunk-
|
|
14
|
+
} from "./chunk-KYTT7KV4.ts";
|
|
13
15
|
|
|
14
16
|
// src/settings/settings-management.ts
|
|
15
17
|
import { isDeepStrictEqual } from "node:util";
|
|
@@ -98,6 +100,11 @@ async function updateSyncSetup(name, update, options = {}) {
|
|
|
98
100
|
await updateSettings((settings) => {
|
|
99
101
|
const setup = settings.syncSetups[name];
|
|
100
102
|
if (!setup) throw new Error(`Sync setup not found: ${name}`);
|
|
103
|
+
if (options.expectedConfigFingerprint !== void 0 && syncCheckConfigFingerprint(configFromSettings(settings, name)) !== options.expectedConfigFingerprint) {
|
|
104
|
+
throw new SyncSetupReviewChangedError(
|
|
105
|
+
`Sync setup \u201C${name}\u201D changed while it was open; reopen it and review the current configuration.`
|
|
106
|
+
);
|
|
107
|
+
}
|
|
101
108
|
if (options.expectedInclude && !sameNames(normalizeSyncInclude(setup.sync.include), options.expectedInclude)) {
|
|
102
109
|
throw new SyncSetupReviewChangedError(
|
|
103
110
|
`Sync setup \u201C${name}\u201D included content changed while it was open; reopen it and review the current selection.`
|
|
@@ -195,4 +202,4 @@ export {
|
|
|
195
202
|
removeSyncSetup,
|
|
196
203
|
removeStorageConnection
|
|
197
204
|
};
|
|
198
|
-
//# sourceMappingURL=chunk-
|
|
205
|
+
//# sourceMappingURL=chunk-45COPAK7.ts.map
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../../src/settings/settings-management.ts"],
|
|
4
|
+
"sourcesContent": ["import { isDeepStrictEqual } from \"node:util\";\nimport { normalizeSyncInclude } from \"../sync/sync-policy.js\";\nimport {\n configFromSettings,\n type SyncSetupStorageReview,\n syncCheckConfigFingerprint,\n syncSetupStorageReview,\n} from \"./config.js\";\nimport { localConfigPath } from \"./config-file.js\";\nimport { updateLocalConfig } from \"./settings-store.js\";\nimport type { PiSyncSettingsV3, StorageConnectionSettings, SyncSetupSettings } from \"./settings-types.js\";\nimport { effectiveSyncSetupRemoteIdentity, validateConfigName } from \"./settings-validation.js\";\n\nexport class SyncSetupReviewChangedError extends Error {\n constructor(message: string) {\n super(message);\n this.name = \"SyncSetupReviewChangedError\";\n }\n}\n\nexport async function saveNewV3Settings(\n input: {\n setupName: string;\n connectionName: string;\n connection: StorageConnectionSettings;\n setup: SyncSetupSettings;\n },\n signal?: AbortSignal,\n) {\n validateConfigName(input.setupName, \"sync setup\");\n validateConfigName(input.connectionName, \"storage connection\");\n const settings: PiSyncSettingsV3 = {\n version: 3,\n activeSyncSetup: input.setupName,\n onSwitch: \"ask-before-pull\",\n skipSecretScan: false,\n storageConnections: { [input.connectionName]: structuredClone(input.connection) },\n syncSetups: {\n [input.setupName]: {\n ...structuredClone(input.setup),\n storage: { ...input.setup.storage, connection: input.connectionName },\n },\n },\n };\n return updateLocalConfig((current) => {\n if (Object.keys(current.storageConnections).length || Object.keys(current.syncSetups).length) {\n throw new Error(`Settings already exist: ${localConfigPath()}`);\n }\n return { ...current, ...settings };\n }, signal);\n}\n\nexport async function addStorageConnection(name: string, connection: StorageConnectionSettings, signal?: AbortSignal) {\n validateConfigName(name, \"storage connection\");\n await updateSettings((settings) => {\n if (Object.hasOwn(settings.storageConnections, name)) {\n throw new Error(`Storage connection already exists: ${name}`);\n }\n return {\n ...settings,\n storageConnections: {\n ...settings.storageConnections,\n [name]: structuredClone(connection),\n },\n };\n }, signal);\n}\n\nexport async function updateStorageConnection(\n name: string,\n update: (connection: StorageConnectionSettings) => StorageConnectionSettings,\n expectedSetups?: readonly string[],\n signal?: AbortSignal,\n) {\n validateConfigName(name, \"storage connection\");\n await updateSettings((settings) => {\n const connection = settings.storageConnections[name];\n if (!connection) throw new Error(`Storage connection not found: ${name}`);\n const currentSetups = referencingSetupNames(settings.syncSetups, name);\n if (expectedSetups && !sameNames(currentSetups, expectedSetups)) {\n throw new Error(\n `Storage connection \u201C${name}\u201D usage changed while it was open; reopen it and review the affected sync setups.`,\n );\n }\n const nextConnection = update(structuredClone(connection));\n const nextConnections = { ...settings.storageConnections, [name]: nextConnection };\n assertUniqueLocations(settings.syncSetups, nextConnections);\n return { ...settings, storageConnections: nextConnections };\n }, signal);\n}\n\nexport async function addSyncSetup(\n name: string,\n setup: SyncSetupSettings,\n signal?: AbortSignal,\n expectedConnection?: StorageConnectionSettings,\n) {\n validateConfigName(name, \"sync setup\");\n await updateSettings((settings) => {\n if (Object.hasOwn(settings.syncSetups, name)) throw new Error(`Sync setup already exists: ${name}`);\n if (!Object.hasOwn(settings.storageConnections, setup.storage.connection)) {\n throw new Error(`Storage connection not found: ${setup.storage.connection}`);\n }\n if (\n expectedConnection &&\n !isDeepStrictEqual(settings.storageConnections[setup.storage.connection], expectedConnection)\n ) {\n throw new SyncSetupReviewChangedError(\"Storage connection changed while the setup review was open; reopen it.\");\n }\n const nextSetups = { ...settings.syncSetups, [name]: structuredClone(setup) };\n assertUniqueLocations(nextSetups, settings.storageConnections);\n return {\n ...settings,\n syncSetups: nextSetups,\n ...(settings.activeSyncSetup ? {} : { activeSyncSetup: name }),\n };\n }, signal);\n}\n\nexport async function updateSyncSetup(\n name: string,\n update: (setup: SyncSetupSettings) => SyncSetupSettings,\n options: {\n expectedStorage?: SyncSetupStorageReview;\n expectedInclude?: readonly string[];\n expectedConnection?: StorageConnectionSettings;\n expectedConfigFingerprint?: string;\n signal?: AbortSignal;\n } = {},\n) {\n validateConfigName(name, \"sync setup\");\n await updateSettings((settings) => {\n const setup = settings.syncSetups[name];\n if (!setup) throw new Error(`Sync setup not found: ${name}`);\n if (\n options.expectedConfigFingerprint !== undefined &&\n syncCheckConfigFingerprint(configFromSettings(settings, name)) !== options.expectedConfigFingerprint\n ) {\n throw new SyncSetupReviewChangedError(\n `Sync setup \u201C${name}\u201D changed while it was open; reopen it and review the current configuration.`,\n );\n }\n if (options.expectedInclude && !sameNames(normalizeSyncInclude(setup.sync.include), options.expectedInclude)) {\n throw new SyncSetupReviewChangedError(\n `Sync setup \u201C${name}\u201D included content changed while it was open; reopen it and review the current selection.`,\n );\n }\n if (options.expectedStorage) {\n const connectionName = setup.storage.connection;\n const connection = settings.storageConnections[connectionName];\n if (\n !connection ||\n !sameStorageReview(syncSetupStorageReview(name, setup, connectionName, connection), options.expectedStorage)\n ) {\n throw new SyncSetupReviewChangedError(\n `Sync setup \u201C${name}\u201D storage changed while it was open; reopen it and review the current storage location.`,\n );\n }\n }\n if (\n options.expectedConnection &&\n !isDeepStrictEqual(settings.storageConnections[setup.storage.connection], options.expectedConnection)\n ) {\n throw new SyncSetupReviewChangedError(\"Storage connection changed while the setup review was open; reopen it.\");\n }\n const nextSetup = update(structuredClone(setup));\n if (!Object.hasOwn(settings.storageConnections, nextSetup.storage.connection)) {\n throw new Error(`Storage connection not found: ${nextSetup.storage.connection}`);\n }\n const nextSetups = { ...settings.syncSetups, [name]: nextSetup };\n assertUniqueLocations(nextSetups, settings.storageConnections);\n return { ...settings, syncSetups: nextSetups };\n }, options.signal);\n}\n\nexport async function removeSyncSetup(name: string, signal?: AbortSignal) {\n validateConfigName(name, \"sync setup\");\n await updateSettings((settings) => {\n if (!Object.hasOwn(settings.syncSetups, name)) throw new Error(`Sync setup not found: ${name}`);\n const isCurrent = settings.activeSyncSetup === name;\n if (isCurrent && Object.keys(settings.syncSetups).length > 1) {\n throw new Error(\"Switch to another sync setup before removing the current setup.\");\n }\n const syncSetups = { ...settings.syncSetups };\n delete syncSetups[name];\n const next = { ...settings, syncSetups };\n if (isCurrent) delete next.activeSyncSetup;\n return next;\n }, signal);\n}\n\nexport async function removeStorageConnection(name: string, signal?: AbortSignal) {\n validateConfigName(name, \"storage connection\");\n await updateSettings((settings) => {\n const referenced = referencingSetupNames(settings.syncSetups, name)[0];\n if (referenced) {\n throw new Error(`Storage connection \u201C${name}\u201D is used by sync setup \u201C${referenced}\u201D.`);\n }\n if (!Object.hasOwn(settings.storageConnections, name)) {\n throw new Error(`Storage connection not found: ${name}`);\n }\n const storageConnections = { ...settings.storageConnections };\n delete storageConnections[name];\n return { ...settings, storageConnections };\n }, signal);\n}\n\nasync function updateSettings(update: (settings: PiSyncSettingsV3) => PiSyncSettingsV3, signal?: AbortSignal) {\n return updateLocalConfig((settings) => {\n if (settings.version !== 3 && settings.version !== 4 && settings.version !== 5) {\n throw new Error(\"Storage connections and sync setups require version 3 or 4 or 5 pi-sync settings.\");\n }\n return update(settings);\n }, signal);\n}\n\nfunction referencingSetupNames(setups: Record<string, SyncSetupSettings>, connection: string) {\n return Object.entries(setups)\n .filter(([, setup]) => setup.storage.connection === connection)\n .map(([name]) => name)\n .sort((left, right) => left.localeCompare(right));\n}\n\nfunction assertUniqueLocations(\n setups: Record<string, SyncSetupSettings>,\n connections: Record<string, StorageConnectionSettings>,\n) {\n const identities = new Map<string, string>();\n for (const [name, setup] of Object.entries(setups)) {\n const connection = connections[setup.storage.connection];\n if (!connection) throw new Error(`Storage connection not found: ${setup.storage.connection}`);\n const identity = effectiveSyncSetupRemoteIdentity(setup, connection);\n const previous = identities.get(identity);\n if (previous) {\n throw new Error(`Sync setup \u201C${name}\u201D duplicates the storage location of \u201C${previous}\u201D.`);\n }\n identities.set(identity, name);\n }\n}\n\nfunction sameNames(left: readonly string[], right: readonly string[]) {\n return left.length === right.length && left.every((name, index) => name === right[index]);\n}\n\nfunction sameStorageReview(left: SyncSetupStorageReview, right: SyncSetupStorageReview) {\n return (\n left.connectionName === right.connectionName &&\n left.storageKind === right.storageKind &&\n left.storagePath === right.storagePath &&\n left.bucket === right.bucket &&\n left.branch === right.branch\n );\n}\n"],
|
|
5
|
+
"mappings": "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",
|
|
6
|
+
"names": []
|
|
7
|
+
}
|
|
@@ -2,15 +2,15 @@
|
|
|
2
2
|
// @ts-nocheck -- generated JavaScript uses a .ts extension for Pi's Jiti loader.
|
|
3
3
|
import {
|
|
4
4
|
mergeJournalIdentity
|
|
5
|
-
} from "./chunk-
|
|
5
|
+
} from "./chunk-BEST45H2.ts";
|
|
6
6
|
import {
|
|
7
7
|
mergePathIdentity,
|
|
8
8
|
planFileMerge
|
|
9
|
-
} from "./chunk-
|
|
9
|
+
} from "./chunk-XJHQPB3E.ts";
|
|
10
10
|
import {
|
|
11
11
|
statePathForConfig,
|
|
12
12
|
syncStateFingerprint
|
|
13
|
-
} from "./chunk-
|
|
13
|
+
} from "./chunk-DN4IA7MR.ts";
|
|
14
14
|
import {
|
|
15
15
|
syncDirectory,
|
|
16
16
|
writeJson
|
|
@@ -226,4 +226,4 @@ export {
|
|
|
226
226
|
saveConflictArtifact,
|
|
227
227
|
readConflictArtifact
|
|
228
228
|
};
|
|
229
|
-
//# sourceMappingURL=chunk-
|
|
229
|
+
//# sourceMappingURL=chunk-5TSCBBPP.ts.map
|
|
@@ -7,18 +7,18 @@ import {
|
|
|
7
7
|
import {
|
|
8
8
|
collidingPaths,
|
|
9
9
|
planFileMerge
|
|
10
|
-
} from "./chunk-
|
|
10
|
+
} from "./chunk-XJHQPB3E.ts";
|
|
11
11
|
import {
|
|
12
12
|
statePathForConfig,
|
|
13
13
|
syncStateFingerprint
|
|
14
|
-
} from "./chunk-
|
|
15
|
-
import {
|
|
16
|
-
backendIdentityCoordinates
|
|
17
|
-
} from "./chunk-2JZFHNLM.ts";
|
|
14
|
+
} from "./chunk-DN4IA7MR.ts";
|
|
18
15
|
import {
|
|
19
16
|
syncDirectory,
|
|
20
17
|
writeJson
|
|
21
18
|
} from "./chunk-AR2DGDUI.ts";
|
|
19
|
+
import {
|
|
20
|
+
backendIdentityCoordinates
|
|
21
|
+
} from "./chunk-2JZFHNLM.ts";
|
|
22
22
|
|
|
23
23
|
// src/state/merge-baseline-store.ts
|
|
24
24
|
import { createHash } from "node:crypto";
|
|
@@ -393,4 +393,4 @@ export {
|
|
|
393
393
|
readMergeAncestor,
|
|
394
394
|
pruneMergeBaselines
|
|
395
395
|
};
|
|
396
|
-
//# sourceMappingURL=chunk-
|
|
396
|
+
//# sourceMappingURL=chunk-6LD5KX55.ts.map
|
|
@@ -6,7 +6,7 @@ import {
|
|
|
6
6
|
import {
|
|
7
7
|
ensureStateDir,
|
|
8
8
|
lockPath
|
|
9
|
-
} from "./chunk-
|
|
9
|
+
} from "./chunk-DN4IA7MR.ts";
|
|
10
10
|
import {
|
|
11
11
|
LOCKFILE_FS_ADAPTER,
|
|
12
12
|
LOCK_GUARD_STALE_MS,
|
|
@@ -255,4 +255,4 @@ export {
|
|
|
255
255
|
isStaleLock,
|
|
256
256
|
unlock
|
|
257
257
|
};
|
|
258
|
-
//# sourceMappingURL=chunk-
|
|
258
|
+
//# sourceMappingURL=chunk-6O3EDBRL.ts.map
|