@zaip-ai/cli 4.2.0 → 4.4.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (178) hide show
  1. package/dist/commands/init.d.ts.map +1 -1
  2. package/dist/commands/init.js +3 -1
  3. package/dist/commands/init.js.map +1 -1
  4. package/dist/services/adapters.d.ts +2 -2
  5. package/dist/services/adapters.d.ts.map +1 -1
  6. package/dist/services/adapters.js +24 -70
  7. package/dist/services/adapters.js.map +1 -1
  8. package/dist/services/adapters.test.js +5 -1
  9. package/dist/services/adapters.test.js.map +1 -1
  10. package/dist/services/agent-adapters.d.ts.map +1 -1
  11. package/dist/services/agent-adapters.js +3 -7
  12. package/dist/services/agent-adapters.js.map +1 -1
  13. package/dist/services/agent-adapters.test.js +43 -11
  14. package/dist/services/agent-adapters.test.js.map +1 -1
  15. package/dist/services/codex-config-overlay.d.ts +6 -0
  16. package/dist/services/codex-config-overlay.d.ts.map +1 -0
  17. package/dist/services/codex-config-overlay.js +161 -0
  18. package/dist/services/codex-config-overlay.js.map +1 -0
  19. package/dist/services/codex-config-template.js +2 -2
  20. package/dist/services/codex-conversation-lifecycle-hook.d.ts.map +1 -1
  21. package/dist/services/codex-conversation-lifecycle-hook.js +38 -14
  22. package/dist/services/codex-conversation-lifecycle-hook.js.map +1 -1
  23. package/dist/services/codex-hook-activation.d.ts +4 -0
  24. package/dist/services/codex-hook-activation.d.ts.map +1 -0
  25. package/dist/services/codex-hook-activation.js +64 -0
  26. package/dist/services/codex-hook-activation.js.map +1 -0
  27. package/dist/services/codex-model-policy.d.ts +4 -0
  28. package/dist/services/codex-model-policy.d.ts.map +1 -0
  29. package/dist/services/codex-model-policy.js +24 -0
  30. package/dist/services/codex-model-policy.js.map +1 -0
  31. package/dist/services/codex-native-tool-authority-template.d.ts +2 -0
  32. package/dist/services/codex-native-tool-authority-template.d.ts.map +1 -0
  33. package/dist/services/codex-native-tool-authority-template.js +89 -0
  34. package/dist/services/codex-native-tool-authority-template.js.map +1 -0
  35. package/dist/services/codex-pre-tool-hook-template.d.ts.map +1 -1
  36. package/dist/services/codex-pre-tool-hook-template.js +59 -86
  37. package/dist/services/codex-pre-tool-hook-template.js.map +1 -1
  38. package/dist/services/codex-pre-tool-hook-template.test.js +200 -1
  39. package/dist/services/codex-pre-tool-hook-template.test.js.map +1 -1
  40. package/dist/services/codex-pre-tool-support-template.d.ts.map +1 -1
  41. package/dist/services/codex-pre-tool-support-template.js +303 -12
  42. package/dist/services/codex-pre-tool-support-template.js.map +1 -1
  43. package/dist/services/codex-subagent-hook-template.d.ts +1 -1
  44. package/dist/services/codex-subagent-hook-template.d.ts.map +1 -1
  45. package/dist/services/codex-subagent-hook-template.js +11 -4
  46. package/dist/services/codex-subagent-hook-template.js.map +1 -1
  47. package/dist/services/codex-validation-runtime-template.d.ts +3 -0
  48. package/dist/services/codex-validation-runtime-template.d.ts.map +1 -0
  49. package/dist/services/codex-validation-runtime-template.js +18 -0
  50. package/dist/services/codex-validation-runtime-template.js.map +1 -0
  51. package/dist/services/codex-windows-hook-command.js +1 -1
  52. package/dist/services/codex-windows-hook-command.js.map +1 -1
  53. package/dist/services/codex-windows-hook-command.test.js +22 -0
  54. package/dist/services/codex-windows-hook-command.test.js.map +1 -1
  55. package/dist/services/global-codex-config-fixtures.d.ts +12 -0
  56. package/dist/services/global-codex-config-fixtures.d.ts.map +1 -0
  57. package/dist/services/global-codex-config-fixtures.js +38 -0
  58. package/dist/services/global-codex-config-fixtures.js.map +1 -0
  59. package/dist/services/global-codex-config-migration.test.d.ts +2 -0
  60. package/dist/services/global-codex-config-migration.test.d.ts.map +1 -0
  61. package/dist/services/global-codex-config-migration.test.js +301 -0
  62. package/dist/services/global-codex-config-migration.test.js.map +1 -0
  63. package/dist/services/global-codex-config-transaction.d.ts +15 -0
  64. package/dist/services/global-codex-config-transaction.d.ts.map +1 -0
  65. package/dist/services/global-codex-config-transaction.js +89 -0
  66. package/dist/services/global-codex-config-transaction.js.map +1 -0
  67. package/dist/services/global-codex-config-transaction.test.d.ts +2 -0
  68. package/dist/services/global-codex-config-transaction.test.d.ts.map +1 -0
  69. package/dist/services/global-codex-config-transaction.test.js +145 -0
  70. package/dist/services/global-codex-config-transaction.test.js.map +1 -0
  71. package/dist/services/global-codex-config.d.ts +10 -11
  72. package/dist/services/global-codex-config.d.ts.map +1 -1
  73. package/dist/services/global-codex-config.js +225 -107
  74. package/dist/services/global-codex-config.js.map +1 -1
  75. package/dist/services/global-codex-config.test.js +6 -6
  76. package/dist/services/global-codex-config.test.js.map +1 -1
  77. package/dist/services/hook-readiness.d.ts +7 -0
  78. package/dist/services/hook-readiness.d.ts.map +1 -0
  79. package/dist/services/hook-readiness.js +17 -0
  80. package/dist/services/hook-readiness.js.map +1 -0
  81. package/dist/services/install-agents-template.d.ts.map +1 -1
  82. package/dist/services/install-agents-template.js +12 -18
  83. package/dist/services/install-agents-template.js.map +1 -1
  84. package/dist/services/logger.d.ts +2 -0
  85. package/dist/services/logger.d.ts.map +1 -1
  86. package/dist/services/logger.js +15 -1
  87. package/dist/services/logger.js.map +1 -1
  88. package/dist/services/logger.test.js +3 -0
  89. package/dist/services/logger.test.js.map +1 -1
  90. package/dist/services/managed-adapter.d.ts +6 -0
  91. package/dist/services/managed-adapter.d.ts.map +1 -0
  92. package/dist/services/managed-adapter.js +63 -0
  93. package/dist/services/managed-adapter.js.map +1 -0
  94. package/dist/services/render-framework-lock.d.ts +6 -0
  95. package/dist/services/render-framework-lock.d.ts.map +1 -0
  96. package/dist/services/render-framework-lock.js +20 -0
  97. package/dist/services/render-framework-lock.js.map +1 -0
  98. package/dist/types.d.ts +2 -0
  99. package/dist/types.d.ts.map +1 -1
  100. package/package.json +1 -1
  101. package/templates/.agents/README.md +8 -0
  102. package/templates/.agents/config/agents/discovery.json +1 -1
  103. package/templates/.agents/config/clients/codex/agents/zaip-agent-backend.toml +1 -2
  104. package/templates/.agents/config/clients/codex/agents/zaip-agent-brand-strategist.toml +1 -2
  105. package/templates/.agents/config/clients/codex/agents/zaip-agent-builder.toml +1 -2
  106. package/templates/.agents/config/clients/codex/agents/zaip-agent-cloud-engineer.toml +1 -2
  107. package/templates/.agents/config/clients/codex/agents/zaip-agent-data-analyst.toml +1 -2
  108. package/templates/.agents/config/clients/codex/agents/zaip-agent-designer.toml +1 -2
  109. package/templates/.agents/config/clients/codex/agents/zaip-agent-frontend.toml +1 -2
  110. package/templates/.agents/config/clients/codex/agents/zaip-agent-general-operations.toml +1 -2
  111. package/templates/.agents/config/clients/codex/agents/zaip-agent-governance-compliance.toml +1 -2
  112. package/templates/.agents/config/clients/codex/agents/zaip-agent-growth-strategist.toml +1 -2
  113. package/templates/.agents/config/clients/codex/agents/zaip-agent-marketing-analyst.toml +1 -2
  114. package/templates/.agents/config/clients/codex/agents/zaip-agent-orchestrator.toml +1 -2
  115. package/templates/.agents/config/clients/codex/agents/zaip-agent-refactoring-specialist.toml +1 -2
  116. package/templates/.agents/config/clients/codex/agents/zaip-agent-sales-specialist.toml +1 -2
  117. package/templates/.agents/config/clients/codex/agents/zaip-agent-task-executor.toml +1 -2
  118. package/templates/.agents/config/clients/codex/agents/zaip-agent-website-developer.toml +1 -2
  119. package/templates/.agents/config/clients/codex/agents/zaip-agent-writer.toml +1 -2
  120. package/templates/.agents/dashboard/.zaip-managed.json +40 -32
  121. package/templates/.agents/dashboard/apps/frontend/dist/assets/{DashboardHelpDialog-DlN5EMmD.js → DashboardHelpDialog-CkQ_y8kg.js} +60 -1
  122. package/templates/.agents/dashboard/apps/frontend/dist/assets/{ProjectSettingsPage-BRdoeTWk.js → ProjectSettingsPage-doIMhei7.js} +1 -1
  123. package/templates/.agents/dashboard/apps/frontend/dist/assets/{TraceabilityWorkspace-B_5u4Xnp.js → TraceabilityWorkspace-C_4ftjyB.js} +1 -1
  124. package/templates/.agents/dashboard/apps/frontend/dist/assets/{index-C4rLXrz_.js → index-Rbmpz4UO.js} +2 -2
  125. package/templates/.agents/dashboard/apps/frontend/dist/index.html +1 -1
  126. package/templates/.agents/dashboard/apps/frontend/package.json +1 -1
  127. package/templates/.agents/dashboard/modules/cost-monitor/package.json +1 -1
  128. package/templates/.agents/dashboard/modules/operations/package.json +1 -1
  129. package/templates/.agents/dashboard/modules/traceability/package.json +1 -1
  130. package/templates/.agents/dashboard/packages/branding/package.json +1 -1
  131. package/templates/.agents/dashboard/packages/contracts/package.json +1 -1
  132. package/templates/.agents/dashboard/packages/data-export/package.json +1 -1
  133. package/templates/.agents/dashboard/packages/local-runtime/dist/server.cjs +177 -177
  134. package/templates/.agents/dashboard/packages/local-runtime/dist/sqlite-read-model.cjs +135 -135
  135. package/templates/.agents/dashboard/packages/local-runtime/package.json +1 -1
  136. package/templates/.agents/dashboard/packages/local-runtime/server.mjs +177 -177
  137. package/templates/.agents/dashboard/packages/local-runtime/src/server-operation-detail.test.ts +106 -0
  138. package/templates/.agents/dashboard/packages/local-runtime/src/server.test.ts +0 -13
  139. package/templates/.agents/dashboard/packages/local-runtime/src/sqlite-read-model-counts-every-root-execution-day-returns.test.ts +17 -230
  140. package/templates/.agents/dashboard/packages/local-runtime/src/sqlite-read-model-counts-fixture.test-support.ts +239 -0
  141. package/templates/.agents/dashboard/packages/local-runtime/start-dashboard-launch-page.test.mjs +28 -8
  142. package/templates/.agents/dashboard/packages/ui/package.json +1 -1
  143. package/templates/.agents/dashboard/tests/e2e/package.json +1 -1
  144. package/templates/.agents/design/.zaip-managed.json +3 -3
  145. package/templates/.agents/design/apps/catalog/package.json +1 -1
  146. package/templates/.agents/design/packages/local-runtime/package.json +1 -1
  147. package/templates/.agents/requirements/autonomous-assurance.md +1 -1
  148. package/templates/.agents/requirements/cloud-hostinger-autonomy.md +1 -1
  149. package/templates/.agents/requirements/comparative-audit.md +1 -1
  150. package/templates/.agents/requirements/context-engine.md +1 -1
  151. package/templates/.agents/requirements/cost-observability.md +1 -1
  152. package/templates/.agents/requirements/dashboard-launch.md +1 -1
  153. package/templates/.agents/requirements/data-export.md +1 -1
  154. package/templates/.agents/requirements/design-system.md +1 -1
  155. package/templates/.agents/requirements/execution-engine.md +1 -1
  156. package/templates/.agents/requirements/kanban-dashboard.md +1 -1
  157. package/templates/.agents/requirements/model-orchestration.md +1 -1
  158. package/templates/.agents/requirements/public-distribution.md +1 -1
  159. package/templates/.agents/requirements/software-architecture.md +1 -1
  160. package/templates/.agents/requirements/strategic-improvements.md +1 -1
  161. package/templates/.agents/requirements/work-lifecycle.md +1 -1
  162. package/templates/.agents/requirements/zaip-strategic-95.md +1 -1
  163. package/templates/.agents/rules/astra-diagnostic.md +1 -1
  164. package/templates/.agents/runtime/VERSION +1 -1
  165. package/templates/.agents/runtime/bin/zaip.mjs +654 -199
  166. package/templates/.agents/runtime/checksums.sha256 +5 -5
  167. package/templates/.agents/runtime/manifest.json +1 -1
  168. package/templates/.agents/runtime/provenance.json +4 -4
  169. package/templates/.agents/runtime/sbom.cdx.json +1 -1
  170. package/templates/.agents/skills/zaip-skill-execution/SKILL.md +1 -1
  171. package/templates/.agents/skills/zaip-skill-execution/references/correction-cycle.md +26 -0
  172. package/templates/.agents/skills/zaip-skill-execution/references/runtime-governance.md +2 -0
  173. package/templates/.agents/skills/zaip-skill-release-qualification/references/local-preparation.md +31 -1
  174. package/templates/.agents/skills/zaip-skill-setup/SKILL.md +26 -1
  175. package/templates/.agents/skills/zaip-skill-task/references/commit-policy.md +8 -1
  176. package/templates/.agents/zaip-aios/VERSION +1 -1
  177. package/templates/.agents/zaip-aios/guides/14-troubleshooting.md +52 -1
  178. package/templates/template-manifest.json +95 -87
@@ -1 +1 @@
1
- {"version":3,"file":"codex-windows-hook-command.test.js","sourceRoot":"","sources":["../../src/services/codex-windows-hook-command.test.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"codex-windows-hook-command.test.js","sourceRoot":"","sources":["../../src/services/codex-windows-hook-command.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,12 @@
1
+ import type { GlobalCodexConfigFileSystem } from "./global-codex-config.js";
2
+ export declare const nodeFileSystem: GlobalCodexConfigFileSystem;
3
+ export declare function projectFixture(): Promise<{
4
+ projectRoot: string;
5
+ codexHome: string;
6
+ catalogPath: string;
7
+ projectConfigPath: string;
8
+ configPath: string;
9
+ projectCodexPath: string;
10
+ }>;
11
+ export declare function cleanupProjectFixtures(): Promise<void>;
12
+ //# sourceMappingURL=global-codex-config-fixtures.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"global-codex-config-fixtures.d.ts","sourceRoot":"","sources":["../../src/services/global-codex-config-fixtures.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,2BAA2B,EAAE,MAAM,0BAA0B,CAAC;AAG5E,eAAO,MAAM,cAAc,EAAE,2BAQ5B,CAAC;AAEF,wBAAsB,cAAc;;;;;;;GAqBnC;AAED,wBAAsB,sBAAsB,IAAI,OAAO,CAAC,IAAI,CAAC,CAI5D"}
@@ -0,0 +1,38 @@
1
+ import { link, lstat, mkdir, mkdtemp, readFile, rename, rm, writeFile } from "node:fs/promises";
2
+ import { tmpdir } from "node:os";
3
+ import { dirname, join } from "node:path";
4
+ import { adapterFiles } from "./adapters.js";
5
+ const projectFixtureRoots = [];
6
+ export const nodeFileSystem = {
7
+ link,
8
+ lstat,
9
+ mkdir,
10
+ readFile,
11
+ rename,
12
+ rm,
13
+ writeFile,
14
+ };
15
+ export async function projectFixture() {
16
+ const root = await mkdtemp(join(tmpdir(), "zaip-global-codex-config-"));
17
+ projectFixtureRoots.push(root);
18
+ const projectRoot = join(root, "consumer O'Brien – hooks");
19
+ const codexHome = join(root, "user-home", ".codex");
20
+ const catalogPath = join(projectRoot, ".agents/config/agents/catalog.yaml");
21
+ const projectConfigPath = join(projectRoot, ".agents/config/project.yaml");
22
+ const configPath = join(codexHome, "config.toml");
23
+ const projectCodexPath = join(projectRoot, ".codex/config.toml");
24
+ await mkdir(dirname(catalogPath), { recursive: true });
25
+ await mkdir(codexHome, { recursive: true });
26
+ await writeFile(catalogPath, "schema_version: 1\nagents: []\n");
27
+ await writeFile(projectConfigPath, "zaip:\n enabled: true\n");
28
+ for (const file of adapterFiles(projectRoot).filter((file) => file.path === ".codex/config.toml" || file.path.startsWith(".codex/hooks/"))) {
29
+ const path = join(projectRoot, file.path);
30
+ await mkdir(dirname(path), { recursive: true });
31
+ await writeFile(path, file.content);
32
+ }
33
+ return { projectRoot, codexHome, catalogPath, projectConfigPath, configPath, projectCodexPath };
34
+ }
35
+ export async function cleanupProjectFixtures() {
36
+ await Promise.all(projectFixtureRoots.splice(0).map((path) => rm(path, { recursive: true, force: true })));
37
+ }
38
+ //# sourceMappingURL=global-codex-config-fixtures.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"global-codex-config-fixtures.js","sourceRoot":"","sources":["../../src/services/global-codex-config-fixtures.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAE,KAAK,EAAE,KAAK,EAAE,OAAO,EAAE,QAAQ,EAAE,MAAM,EAAE,EAAE,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAC;AAChG,OAAO,EAAE,MAAM,EAAE,MAAM,SAAS,CAAC;AACjC,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AAC1C,OAAO,EAAE,YAAY,EAAE,MAAM,eAAe,CAAC;AAG7C,MAAM,mBAAmB,GAAa,EAAE,CAAC;AACzC,MAAM,CAAC,MAAM,cAAc,GAAgC;IACzD,IAAI;IACJ,KAAK;IACL,KAAK;IACL,QAAQ;IACR,MAAM;IACN,EAAE;IACF,SAAS;CACV,CAAC;AAEF,MAAM,CAAC,KAAK,UAAU,cAAc;IAClC,MAAM,IAAI,GAAG,MAAM,OAAO,CAAC,IAAI,CAAC,MAAM,EAAE,EAAE,2BAA2B,CAAC,CAAC,CAAC;IACxE,mBAAmB,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IAC/B,MAAM,WAAW,GAAG,IAAI,CAAC,IAAI,EAAE,0BAA0B,CAAC,CAAC;IAC3D,MAAM,SAAS,GAAG,IAAI,CAAC,IAAI,EAAE,WAAW,EAAE,QAAQ,CAAC,CAAC;IACpD,MAAM,WAAW,GAAG,IAAI,CAAC,WAAW,EAAE,oCAAoC,CAAC,CAAC;IAC5E,MAAM,iBAAiB,GAAG,IAAI,CAAC,WAAW,EAAE,6BAA6B,CAAC,CAAC;IAC3E,MAAM,UAAU,GAAG,IAAI,CAAC,SAAS,EAAE,aAAa,CAAC,CAAC;IAClD,MAAM,gBAAgB,GAAG,IAAI,CAAC,WAAW,EAAE,oBAAoB,CAAC,CAAC;IACjE,MAAM,KAAK,CAAC,OAAO,CAAC,WAAW,CAAC,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IACvD,MAAM,KAAK,CAAC,SAAS,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IAC5C,MAAM,SAAS,CAAC,WAAW,EAAE,iCAAiC,CAAC,CAAC;IAChE,MAAM,SAAS,CAAC,iBAAiB,EAAE,0BAA0B,CAAC,CAAC;IAC/D,KAAK,MAAM,IAAI,IAAI,YAAY,CAAC,WAAW,CAAC,CAAC,MAAM,CACjD,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,IAAI,KAAK,oBAAoB,IAAI,IAAI,CAAC,IAAI,CAAC,UAAU,CAAC,eAAe,CAAC,CACtF,EAAE,CAAC;QACF,MAAM,IAAI,GAAG,IAAI,CAAC,WAAW,EAAE,IAAI,CAAC,IAAI,CAAC,CAAC;QAC1C,MAAM,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;QAChD,MAAM,SAAS,CAAC,IAAI,EAAE,IAAI,CAAC,OAAO,CAAC,CAAC;IACtC,CAAC;IACD,OAAO,EAAE,WAAW,EAAE,SAAS,EAAE,WAAW,EAAE,iBAAiB,EAAE,UAAU,EAAE,gBAAgB,EAAE,CAAC;AAClG,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,sBAAsB;IAC1C,MAAM,OAAO,CAAC,GAAG,CACf,mBAAmB,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,EAAE,CAAC,IAAI,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC,CACxF,CAAC;AACJ,CAAC"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=global-codex-config-migration.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"global-codex-config-migration.test.d.ts","sourceRoot":"","sources":["../../src/services/global-codex-config-migration.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,301 @@
1
+ import { link, readdir, readFile, rename, rm, writeFile } from "node:fs/promises";
2
+ import { join } from "node:path";
3
+ import { afterEach, describe, expect, it, vi } from "vitest";
4
+ import { codexWindowsHookCommand } from "./codex-windows-hook-command.js";
5
+ import { installSecurityHook, reconcileGlobalCodexConfig, } from "./global-codex-config.js";
6
+ import { cleanupProjectFixtures, nodeFileSystem, projectFixture, } from "./global-codex-config-fixtures.js";
7
+ afterEach(cleanupProjectFixtures);
8
+ describe("reconcileGlobalCodexConfig project-hook migration", () => {
9
+ it("accepts the canonical portable Windows commands emitted by the builder", async () => {
10
+ const fixture = await projectFixture();
11
+ let config = await readFile(fixture.projectCodexPath, "utf8");
12
+ for (const hook of [
13
+ "zaip-pre-tool-use.mjs",
14
+ "zaip-conversation-lifecycle.mjs",
15
+ "zaip-subagent-lifecycle.mjs",
16
+ ]) {
17
+ // Replace only the exact rooted command, not arbitrary user PowerShell.
18
+ const rooted = codexWindowsHookCommand(hook, fixture.projectRoot);
19
+ expect(config).toContain(rooted);
20
+ config = config.replaceAll(rooted, codexWindowsHookCommand(hook));
21
+ }
22
+ config = config.replace("Reconciling ZAIP task closure and telemetry", "Finalizing ZAIP conversation telemetry");
23
+ await writeFile(fixture.projectCodexPath, config);
24
+ await writeFile(fixture.configPath, installSecurityHook("# keep\n"));
25
+ await expect(reconcileGlobalCodexConfig(fixture.codexHome, fixture.catalogPath)).resolves.toMatchObject({
26
+ installed: true,
27
+ securityHookOwner: "project",
28
+ error: null,
29
+ });
30
+ expect(await readFile(fixture.configPath, "utf8")).toBe("# keep\n\n");
31
+ expect(await readFile(fixture.projectCodexPath, "utf8")).toBe(config);
32
+ });
33
+ it("retires recognized global hooks only after canonical project adapters are installed", async () => {
34
+ const fixture = await projectFixture();
35
+ const before = '\uFEFF# personal preferences\r\nmodel = "personal-model"\r\n\r\n';
36
+ const parent = '[[hooks.Stop]]\r\nmatcher = "*"\r\n\r\n';
37
+ const user = '[[hooks.Stop.hooks]]\r\ncommand = "personal-stop-hook"\r\nstatusMessage = "Reconciling ZAIP task closure and telemetry"\r\ntimeout = 17\r\n\r\n';
38
+ const legacy = '[[hooks.Stop.hooks]]\r\ncommand = "node .codex/hooks/zaip-conversation-lifecycle.mjs"\r\n\r\n';
39
+ const lifecycle = ["SubagentStart", "SubagentStop"]
40
+ .map((event) => `[[hooks.${event}]]\r\nmatcher = "*"\r\n[[hooks.${event}.hooks]]\r\ncommand = "node .codex/hooks/zaip-subagent-lifecycle.mjs"\r\n\r\n`)
41
+ .join("");
42
+ const after = '[agents."personal"]\r\nconfig_file = "./agents/personal.toml"\r\n\r\n[permissions.personal.filesystem]\r\n":root" = "read"\r\n\r\n[desktop]\r\nlabel = "ação preservada"\r\n';
43
+ const originalProject = await readFile(fixture.projectCodexPath);
44
+ await writeFile(fixture.configPath, before + installSecurityHook("") + parent + user + legacy + lifecycle + after);
45
+ const write = vi.fn(writeFile);
46
+ const filesystem = { ...nodeFileSystem, writeFile: write };
47
+ await expect(reconcileGlobalCodexConfig(fixture.codexHome, fixture.catalogPath, filesystem)).resolves.toMatchObject({
48
+ installed: true,
49
+ securityHookInstalled: true,
50
+ securityHookOwner: "project",
51
+ error: null,
52
+ });
53
+ const expected = Buffer.from(before + parent + user + after);
54
+ expect(await readFile(fixture.configPath)).toEqual(expected);
55
+ expect(await readFile(fixture.projectCodexPath)).toEqual(originalProject);
56
+ expect(write).toHaveBeenCalledTimes(1);
57
+ write.mockClear();
58
+ await reconcileGlobalCodexConfig(fixture.codexHome, fixture.catalogPath, filesystem);
59
+ expect(await readFile(fixture.configPath)).toEqual(expected);
60
+ expect(write).not.toHaveBeenCalled();
61
+ const preserved = (await readdir(fixture.codexHome)).filter((name) => name.startsWith("config.toml.zaip-saved-"));
62
+ expect(preserved).toHaveLength(1);
63
+ expect(await readFile(join(fixture.codexHome, preserved[0] ?? ""), "utf8")).toBe(before + installSecurityHook("") + parent + user + legacy + lifecycle + after);
64
+ expect((await readdir(fixture.codexHome)).sort()).toEqual(["config.toml", preserved[0]]);
65
+ });
66
+ it("does not create a global config when installed project hooks already supply protection", async () => {
67
+ const fixture = await projectFixture();
68
+ const write = vi.fn(writeFile);
69
+ await expect(reconcileGlobalCodexConfig(fixture.codexHome, fixture.catalogPath, {
70
+ ...nodeFileSystem,
71
+ writeFile: write,
72
+ })).resolves.toMatchObject({
73
+ installed: true,
74
+ securityHookInstalled: true,
75
+ securityHookOwner: "project",
76
+ error: null,
77
+ });
78
+ expect(write).not.toHaveBeenCalled();
79
+ expect(await readdir(fixture.codexHome)).toEqual([]);
80
+ });
81
+ it.each([
82
+ "missing config",
83
+ "disabled hooks",
84
+ "duplicate hooks flag",
85
+ "disabled ZAIP",
86
+ "string enabled",
87
+ "missing executable",
88
+ "changed executable",
89
+ "missing dependency",
90
+ "disabled hook",
91
+ "wrong matcher",
92
+ "missing lifecycle",
93
+ "unreadable config",
94
+ ])("preserves user config without a global fallback for %s", async (scenario) => {
95
+ const fixture = await projectFixture();
96
+ const config = await readFile(fixture.projectCodexPath, "utf8");
97
+ if (scenario === "missing config")
98
+ await rm(fixture.projectCodexPath);
99
+ if (scenario === "disabled hooks")
100
+ await writeFile(fixture.projectCodexPath, config.replace("hooks = true", "hooks = false"));
101
+ if (scenario === "duplicate hooks flag")
102
+ await writeFile(fixture.projectCodexPath, config.replace("hooks = true", "hooks = true\nhooks = false"));
103
+ if (scenario === "disabled ZAIP")
104
+ await writeFile(fixture.projectConfigPath, "zaip:\n enabled: false\n");
105
+ if (scenario === "string enabled")
106
+ await writeFile(fixture.projectConfigPath, 'zaip:\n enabled: "true"\n');
107
+ if (scenario === "missing executable")
108
+ await rm(join(fixture.projectRoot, ".codex/hooks/zaip-pre-tool-use.mjs"));
109
+ if (scenario === "changed executable")
110
+ await writeFile(join(fixture.projectRoot, ".codex/hooks/zaip-pre-tool-use.mjs"), "// not the canonical hook\n");
111
+ if (scenario === "missing dependency")
112
+ await rm(join(fixture.projectRoot, ".codex/hooks/zaip-pre-tool-support.mjs"));
113
+ if (scenario === "disabled hook")
114
+ await writeFile(fixture.projectCodexPath, config.replace('statusMessage = "Applying ZAIP workspace safety policy"', 'statusMessage = "Applying ZAIP workspace safety policy"\nenabled = false'));
115
+ if (scenario === "wrong matcher")
116
+ await writeFile(fixture.projectCodexPath, config.replace('matcher = "^(Bash|shell_command|exec_command|apply_patch|Edit|Write)$"', 'matcher = "Nothing"'));
117
+ if (scenario === "missing lifecycle")
118
+ await writeFile(fixture.projectCodexPath, config
119
+ .replace("[[hooks.Stop]]", "[[hooks.UnrelatedStop]]")
120
+ .replace("[[hooks.Stop.hooks]]", "[[hooks.UnrelatedStop.hooks]]"));
121
+ const filesystem = scenario === "unreadable config"
122
+ ? {
123
+ ...nodeFileSystem,
124
+ readFile: vi.fn(async (...args) => {
125
+ if (args[0] === fixture.projectCodexPath)
126
+ throw new Error("fixture access denied");
127
+ return readFile(...args);
128
+ }),
129
+ }
130
+ : nodeFileSystem;
131
+ const user = '[desktop]\r\nlabel = "ação preservada"\r\n';
132
+ await writeFile(fixture.configPath, user);
133
+ await expect(reconcileGlobalCodexConfig(fixture.codexHome, fixture.catalogPath, filesystem)).resolves.toMatchObject({
134
+ installed: true,
135
+ securityHookInstalled: false,
136
+ securityHookOwner: null,
137
+ error: null,
138
+ });
139
+ const once = await readFile(fixture.configPath, "utf8");
140
+ expect(once).toBe(user);
141
+ expect(once).not.toContain("-EncodedCommand");
142
+ expect(once).not.toContain("[[hooks.PreToolUse]]");
143
+ await reconcileGlobalCodexConfig(fixture.codexHome, fixture.catalogPath, filesystem);
144
+ expect(await readFile(fixture.configPath, "utf8")).toBe(once);
145
+ });
146
+ it("migrates a Windows-only recognized ZAIP command without using its status", async () => {
147
+ const fixture = await projectFixture();
148
+ const user = '# retained\r\n[desktop]\r\nmode = "personal"\r\n';
149
+ const owned = `[[hooks.PreToolUse]]\nmatcher = "*"\n[[hooks.PreToolUse.hooks]]\ncommand_windows = '''${codexWindowsHookCommand("zaip-pre-tool-use.mjs")}'''\nstatusMessage = "custom status"\n`;
150
+ await writeFile(fixture.configPath, owned + user);
151
+ await reconcileGlobalCodexConfig(fixture.codexHome, fixture.catalogPath);
152
+ expect(await readFile(fixture.configPath, "utf8")).toBe(user);
153
+ });
154
+ it("verifies canonical project hooks alongside user hooks in the same event", async () => {
155
+ const fixture = await projectFixture();
156
+ const config = await readFile(fixture.projectCodexPath, "utf8");
157
+ const user = '[[hooks.PreToolUse.hooks]]\ncommand = "personal-project-hook"\nstatusMessage = "Applying ZAIP workspace safety policy"\n\n';
158
+ const withUser = config
159
+ .replace("[[hooks.PreToolUse.hooks]]", `${user}[[hooks.PreToolUse.hooks]]`)
160
+ .replaceAll("\n", "\r\n");
161
+ await writeFile(fixture.projectCodexPath, withUser);
162
+ await writeFile(fixture.configPath, installSecurityHook(""));
163
+ await reconcileGlobalCodexConfig(fixture.codexHome, fixture.catalogPath);
164
+ expect(await readFile(fixture.configPath, "utf8")).toBe("");
165
+ expect(await readFile(fixture.projectCodexPath, "utf8")).toBe(withUser);
166
+ });
167
+ it("preserves quoted table names, comments, and table-looking nested arrays", async () => {
168
+ const fixture = await projectFixture();
169
+ const before = 'personal_matrix = [\r\n[["hooks.Stop"]],\r\n["command = node .codex/hooks/zaip-conversation-lifecycle.mjs"],\r\n]\r\n';
170
+ const after = '# keep this comment\r\n[plugins."personal]guard"] # user config\r\nenabled = true\r\n';
171
+ await writeFile(fixture.configPath, before + installSecurityHook("") + after);
172
+ await reconcileGlobalCodexConfig(fixture.codexHome, fixture.catalogPath);
173
+ expect(await readFile(fixture.configPath, "utf8")).toBe(before + after);
174
+ });
175
+ it("preserves unrelated operations in an encoded script mentioning a ZAIP hook", async () => {
176
+ const fixture = await projectFixture();
177
+ const canonical = codexWindowsHookCommand("zaip-pre-tool-use.mjs");
178
+ const prefix = canonical.slice(0, canonical.lastIndexOf(" ") + 1);
179
+ const script = Buffer.from(canonical.split(" ").at(-1) ?? "", "base64").toString("utf16le");
180
+ const mixed = prefix +
181
+ Buffer.from(`Write-Output "personal action"; ${script}`, "utf16le").toString("base64");
182
+ const user = `[[hooks.PreToolUse]]\nmatcher = "*"\n[[hooks.PreToolUse.hooks]]\ncommand_windows = '''${mixed}'''\n`;
183
+ await writeFile(fixture.configPath, user);
184
+ await reconcileGlobalCodexConfig(fixture.codexHome, fixture.catalogPath);
185
+ expect(await readFile(fixture.configPath, "utf8")).toBe(user);
186
+ });
187
+ it.each([
188
+ "write",
189
+ "backup rename",
190
+ "promotion link",
191
+ ])("rolls migration back byte-for-byte after a failed %s", async (failure) => {
192
+ const fixture = await projectFixture();
193
+ const original = Buffer.from(`\uFEFF# retained\r\nmodel = "personal"\r\n${installSecurityHook("")}`);
194
+ await writeFile(fixture.configPath, original);
195
+ await writeFile(join(fixture.codexHome, "personal.toml"), "untouched\n");
196
+ const filesystem = {
197
+ ...nodeFileSystem,
198
+ writeFile: vi.fn(async (...args) => {
199
+ if (failure === "write")
200
+ throw new Error("fixture write failure");
201
+ await writeFile(...args);
202
+ }),
203
+ rename: vi.fn(async (...args) => {
204
+ if (failure === "backup rename" && args[0] === fixture.configPath)
205
+ throw new Error("fixture backup rename failure");
206
+ await rename(...args);
207
+ }),
208
+ link: vi.fn(async (...args) => {
209
+ if (failure === "promotion link" && String(args[0]).includes(".zaip-tmp-"))
210
+ throw new Error("fixture promotion link failure");
211
+ await link(...args);
212
+ }),
213
+ };
214
+ await expect(reconcileGlobalCodexConfig(fixture.codexHome, fixture.catalogPath, filesystem)).resolves.toMatchObject({
215
+ installed: false,
216
+ securityHookInstalled: false,
217
+ securityHookOwner: null,
218
+ error: `fixture ${failure} failure`,
219
+ });
220
+ expect(await readFile(fixture.configPath)).toEqual(original);
221
+ expect(await readFile(join(fixture.codexHome, "personal.toml"), "utf8")).toBe("untouched\n");
222
+ expect((await readdir(fixture.codexHome)).sort()).toEqual(["config.toml", "personal.toml"]);
223
+ await expect(reconcileGlobalCodexConfig(fixture.codexHome, fixture.catalogPath)).resolves.toMatchObject({ installed: true, error: null });
224
+ expect(await readFile(fixture.configPath, "utf8")).toBe('\uFEFF# retained\r\nmodel = "personal"\r\n');
225
+ });
226
+ it.each([
227
+ "tmp",
228
+ "backup",
229
+ ])("preserves a pre-existing %s file and global settings", async (kind) => {
230
+ const fixture = await projectFixture();
231
+ const original = Buffer.from(installSecurityHook('model = "personal"\r\n'));
232
+ const existingPath = `${fixture.configPath}.zaip-${kind}-${process.pid}`;
233
+ const existing = Buffer.from("preserve this earlier file\r\n");
234
+ await writeFile(fixture.configPath, original);
235
+ await writeFile(existingPath, existing);
236
+ const result = await reconcileGlobalCodexConfig(fixture.codexHome, fixture.catalogPath);
237
+ expect(result.installed).toBe(false);
238
+ expect(result.error).not.toBeNull();
239
+ expect(await readFile(fixture.configPath)).toEqual(original);
240
+ expect(await readFile(existingPath)).toEqual(existing);
241
+ });
242
+ it("retains the original backup when restoration fails and blocks a destructive repeat", async () => {
243
+ const fixture = await projectFixture();
244
+ const original = Buffer.from(installSecurityHook('model = "personal"\r\n'));
245
+ const backupPath = `${fixture.configPath}.zaip-backup-${process.pid}`;
246
+ await writeFile(fixture.configPath, original);
247
+ const filesystem = {
248
+ ...nodeFileSystem,
249
+ link: vi.fn(async (...args) => {
250
+ if (String(args[0]).includes(".zaip-tmp-"))
251
+ throw new Error("fixture promotion failure");
252
+ if (args[0] === backupPath)
253
+ throw new Error("fixture restore failure");
254
+ await link(...args);
255
+ }),
256
+ };
257
+ await expect(reconcileGlobalCodexConfig(fixture.codexHome, fixture.catalogPath, filesystem)).resolves.toMatchObject({ installed: false, error: "fixture restore failure" });
258
+ expect(await readFile(backupPath)).toEqual(original);
259
+ await expect(readFile(fixture.configPath)).rejects.toMatchObject({ code: "ENOENT" });
260
+ const repeat = await reconcileGlobalCodexConfig(fixture.codexHome, fixture.catalogPath);
261
+ expect(repeat.installed).toBe(false);
262
+ expect(repeat.error).toContain("recover it before retrying");
263
+ expect(await readFile(backupPath)).toEqual(original);
264
+ expect(await readdir(fixture.codexHome)).toEqual([`config.toml.zaip-backup-${process.pid}`]);
265
+ });
266
+ it("preserves a leading UTF-8 BOM when the first table is a retired hook", async () => {
267
+ const fixture = await projectFixture();
268
+ const after = '[desktop]\r\nmode = "personal"\r\n';
269
+ await writeFile(fixture.configPath, `\uFEFF${installSecurityHook("")}${after}`);
270
+ await reconcileGlobalCodexConfig(fixture.codexHome, fixture.catalogPath);
271
+ expect(await readFile(fixture.configPath)).toEqual(Buffer.from(`\uFEFF${after}`));
272
+ });
273
+ it.each([
274
+ "Applying ZAIP workspace safety policy",
275
+ "Reconciling ZAIP task closure and telemetry",
276
+ "Attributing ZAIP subagent Run",
277
+ "Finalizing ZAIP subagent Run",
278
+ ])("preserves a third-party hook sharing status %s", async (status) => {
279
+ const fixture = await projectFixture();
280
+ const user = `[[hooks.PreToolUse]]\r\nmatcher = "*"\r\n[[hooks.PreToolUse.hooks]]\r\ncommand = "node personal-guard.mjs"\r\nstatusMessage = "${status}"\r\n`;
281
+ await writeFile(fixture.configPath, user);
282
+ await reconcileGlobalCodexConfig(fixture.codexHome, fixture.catalogPath);
283
+ expect(await readFile(fixture.configPath, "utf8")).toBe(user);
284
+ expect(installSecurityHook(user).startsWith(user)).toBe(true);
285
+ });
286
+ it.each([
287
+ 'command = "node personal-guard.mjs .codex/hooks/zaip-pre-tool-use.mjs"',
288
+ 'command = "node .codex/hooks/zaip-pre-tool-use.mjs.backup"',
289
+ 'command = "node personal-guard.mjs"\n# command = "node .codex/hooks/zaip-pre-tool-use.mjs"',
290
+ 'command = "node personal-guard.mjs"\ndescription = """\n[[hooks.Stop]]\ncommand = "node .codex/hooks/zaip-conversation-lifecycle.mjs"\n"""',
291
+ 'command = "node .codex/hooks/zaip-pre-tool-use.mjs"\ncommand_windows = "personal-windows-hook"',
292
+ 'command = "node .codex/hooks/zaip-pre-tool-use.mjs && personal-hook"',
293
+ ])("preserves command lookalikes and mixed platform ownership: %s", async (commands) => {
294
+ const fixture = await projectFixture();
295
+ const user = `[[hooks.PreToolUse]]\nmatcher = "*"\n[[hooks.PreToolUse.hooks]]\n${commands}\n`;
296
+ await writeFile(fixture.configPath, user);
297
+ await reconcileGlobalCodexConfig(fixture.codexHome, fixture.catalogPath);
298
+ expect(await readFile(fixture.configPath, "utf8")).toBe(user);
299
+ });
300
+ });
301
+ //# sourceMappingURL=global-codex-config-migration.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"global-codex-config-migration.test.js","sourceRoot":"","sources":["../../src/services/global-codex-config-migration.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,15 @@
1
+ import { link, lstat, mkdir, readFile, rename, rm, writeFile } from "node:fs/promises";
2
+ export interface GlobalCodexConfigFileSystem {
3
+ link: typeof link;
4
+ lstat: typeof lstat;
5
+ mkdir: typeof mkdir;
6
+ readFile: typeof readFile;
7
+ rename: typeof rename;
8
+ rm: typeof rm;
9
+ writeFile: typeof writeFile;
10
+ }
11
+ export declare const nodeFileSystem: GlobalCodexConfigFileSystem;
12
+ export declare function assertNoConfigBackup(backup: string, filesystem: GlobalCodexConfigFileSystem): Promise<void>;
13
+ export declare function replaceConfig(path: string, content: string, original: Buffer | null, filesystem: GlobalCodexConfigFileSystem, mode?: number): Promise<string | null>;
14
+ export declare function isMissingFile(error: unknown): boolean;
15
+ //# sourceMappingURL=global-codex-config-transaction.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"global-codex-config-transaction.d.ts","sourceRoot":"","sources":["../../src/services/global-codex-config-transaction.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,IAAI,EAAE,KAAK,EAAE,KAAK,EAAE,QAAQ,EAAE,MAAM,EAAE,EAAE,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAC;AAGvF,MAAM,WAAW,2BAA2B;IAC1C,IAAI,EAAE,OAAO,IAAI,CAAC;IAClB,KAAK,EAAE,OAAO,KAAK,CAAC;IACpB,KAAK,EAAE,OAAO,KAAK,CAAC;IACpB,QAAQ,EAAE,OAAO,QAAQ,CAAC;IAC1B,MAAM,EAAE,OAAO,MAAM,CAAC;IACtB,EAAE,EAAE,OAAO,EAAE,CAAC;IACd,SAAS,EAAE,OAAO,SAAS,CAAC;CAC7B;AAED,eAAO,MAAM,cAAc,EAAE,2BAQ5B,CAAC;AAEF,wBAAsB,oBAAoB,CACxC,MAAM,EAAE,MAAM,EACd,UAAU,EAAE,2BAA2B,GACtC,OAAO,CAAC,IAAI,CAAC,CAUf;AAED,wBAAsB,aAAa,CACjC,IAAI,EAAE,MAAM,EACZ,OAAO,EAAE,MAAM,EACf,QAAQ,EAAE,MAAM,GAAG,IAAI,EACvB,UAAU,EAAE,2BAA2B,EACvC,IAAI,SAAQ,GACX,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,CAyDxB;AAED,wBAAgB,aAAa,CAAC,KAAK,EAAE,OAAO,GAAG,OAAO,CAErD"}
@@ -0,0 +1,89 @@
1
+ import { randomUUID } from "node:crypto";
2
+ import { link, lstat, mkdir, readFile, rename, rm, writeFile } from "node:fs/promises";
3
+ import { dirname } from "node:path";
4
+ export const nodeFileSystem = {
5
+ link,
6
+ lstat,
7
+ mkdir,
8
+ readFile,
9
+ rename,
10
+ rm,
11
+ writeFile,
12
+ };
13
+ export async function assertNoConfigBackup(backup, filesystem) {
14
+ const exists = await filesystem
15
+ .readFile(backup)
16
+ .then(() => true)
17
+ .catch((error) => {
18
+ if (isMissingFile(error))
19
+ return false;
20
+ throw error;
21
+ });
22
+ if (exists)
23
+ throw new Error(`Preserved existing ZAIP config backup; recover it before retrying: ${backup}`);
24
+ }
25
+ export async function replaceConfig(path, content, original, filesystem, mode = 0o600) {
26
+ const temporary = `${path}.zaip-tmp-${process.pid}`;
27
+ const backup = `${path}.zaip-backup-${process.pid}`;
28
+ let previousConfigMoved = false;
29
+ await filesystem.mkdir(dirname(path), { recursive: true });
30
+ await assertNoConfigBackup(backup, filesystem);
31
+ // Exclusive creation preserves staging files from interrupted installs.
32
+ await filesystem.writeFile(temporary, content, {
33
+ encoding: "utf8",
34
+ flag: "wx",
35
+ mode: mode & 0o777,
36
+ });
37
+ try {
38
+ try {
39
+ await filesystem.rename(path, backup);
40
+ previousConfigMoved = true;
41
+ }
42
+ catch (error) {
43
+ if (!isMissingFile(error))
44
+ throw error;
45
+ if (original !== null)
46
+ throw new Error(`Global Codex config disappeared concurrently; current absence preserved: ${path}`);
47
+ }
48
+ if (previousConfigMoved) {
49
+ const moved = await filesystem.readFile(backup);
50
+ if (original === null || !moved.equals(original))
51
+ throw new Error(`Global Codex config changed concurrently; newer config restored: ${path}`);
52
+ }
53
+ // An editor can recreate config.toml after backup creation. Never replace it.
54
+ await filesystem.link(temporary, path);
55
+ }
56
+ catch (error) {
57
+ try {
58
+ if (previousConfigMoved) {
59
+ try {
60
+ await filesystem.link(backup, path);
61
+ await filesystem.rm(backup);
62
+ }
63
+ catch (restoreError) {
64
+ if (restoreError.code !== "EEXIST")
65
+ throw restoreError;
66
+ throw new Error(`Concurrent global config preserved; original backup retained at ${backup}`);
67
+ }
68
+ }
69
+ }
70
+ finally {
71
+ await filesystem.rm(temporary, { force: true }).catch(() => undefined);
72
+ }
73
+ throw error;
74
+ }
75
+ await filesystem.rm(temporary);
76
+ if (!previousConfigMoved)
77
+ return null;
78
+ // Retain the original inode: an editor may still hold it open after rename.
79
+ const preserved = `${path}.zaip-saved-${randomUUID()}`;
80
+ await filesystem.link(backup, preserved);
81
+ await filesystem.rm(backup);
82
+ if (!(await filesystem.readFile(preserved)).equals(original))
83
+ throw new Error(`Concurrent save detected; recoverable config retained at ${preserved}`);
84
+ return preserved;
85
+ }
86
+ export function isMissingFile(error) {
87
+ return typeof error === "object" && error !== null && "code" in error && error.code === "ENOENT";
88
+ }
89
+ //# sourceMappingURL=global-codex-config-transaction.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"global-codex-config-transaction.js","sourceRoot":"","sources":["../../src/services/global-codex-config-transaction.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=global-codex-config-transaction.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"global-codex-config-transaction.test.d.ts","sourceRoot":"","sources":["../../src/services/global-codex-config-transaction.test.ts"],"names":[],"mappings":""}