@zaip-ai/cli 4.2.0 → 4.3.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 (165) 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 +11 -63
  7. package/dist/services/adapters.js.map +1 -1
  8. package/dist/services/agent-adapters.d.ts.map +1 -1
  9. package/dist/services/agent-adapters.js +3 -7
  10. package/dist/services/agent-adapters.js.map +1 -1
  11. package/dist/services/agent-adapters.test.js +43 -11
  12. package/dist/services/agent-adapters.test.js.map +1 -1
  13. package/dist/services/codex-config-template.js +2 -2
  14. package/dist/services/codex-conversation-lifecycle-hook.d.ts.map +1 -1
  15. package/dist/services/codex-conversation-lifecycle-hook.js +38 -14
  16. package/dist/services/codex-conversation-lifecycle-hook.js.map +1 -1
  17. package/dist/services/codex-hook-activation.d.ts +4 -0
  18. package/dist/services/codex-hook-activation.d.ts.map +1 -0
  19. package/dist/services/codex-hook-activation.js +64 -0
  20. package/dist/services/codex-hook-activation.js.map +1 -0
  21. package/dist/services/codex-model-policy.d.ts +4 -0
  22. package/dist/services/codex-model-policy.d.ts.map +1 -0
  23. package/dist/services/codex-model-policy.js +24 -0
  24. package/dist/services/codex-model-policy.js.map +1 -0
  25. package/dist/services/codex-native-tool-authority-template.d.ts +2 -0
  26. package/dist/services/codex-native-tool-authority-template.d.ts.map +1 -0
  27. package/dist/services/codex-native-tool-authority-template.js +89 -0
  28. package/dist/services/codex-native-tool-authority-template.js.map +1 -0
  29. package/dist/services/codex-pre-tool-hook-template.d.ts.map +1 -1
  30. package/dist/services/codex-pre-tool-hook-template.js +59 -86
  31. package/dist/services/codex-pre-tool-hook-template.js.map +1 -1
  32. package/dist/services/codex-pre-tool-hook-template.test.js +200 -1
  33. package/dist/services/codex-pre-tool-hook-template.test.js.map +1 -1
  34. package/dist/services/codex-pre-tool-support-template.d.ts.map +1 -1
  35. package/dist/services/codex-pre-tool-support-template.js +303 -12
  36. package/dist/services/codex-pre-tool-support-template.js.map +1 -1
  37. package/dist/services/codex-subagent-hook-template.d.ts +1 -1
  38. package/dist/services/codex-subagent-hook-template.d.ts.map +1 -1
  39. package/dist/services/codex-subagent-hook-template.js +11 -4
  40. package/dist/services/codex-subagent-hook-template.js.map +1 -1
  41. package/dist/services/codex-validation-runtime-template.d.ts +3 -0
  42. package/dist/services/codex-validation-runtime-template.d.ts.map +1 -0
  43. package/dist/services/codex-validation-runtime-template.js +18 -0
  44. package/dist/services/codex-validation-runtime-template.js.map +1 -0
  45. package/dist/services/codex-windows-hook-command.js +1 -1
  46. package/dist/services/codex-windows-hook-command.js.map +1 -1
  47. package/dist/services/codex-windows-hook-command.test.js +22 -0
  48. package/dist/services/codex-windows-hook-command.test.js.map +1 -1
  49. package/dist/services/global-codex-config-fixtures.d.ts +12 -0
  50. package/dist/services/global-codex-config-fixtures.d.ts.map +1 -0
  51. package/dist/services/global-codex-config-fixtures.js +38 -0
  52. package/dist/services/global-codex-config-fixtures.js.map +1 -0
  53. package/dist/services/global-codex-config-migration.test.d.ts +2 -0
  54. package/dist/services/global-codex-config-migration.test.d.ts.map +1 -0
  55. package/dist/services/global-codex-config-migration.test.js +301 -0
  56. package/dist/services/global-codex-config-migration.test.js.map +1 -0
  57. package/dist/services/global-codex-config-transaction.d.ts +15 -0
  58. package/dist/services/global-codex-config-transaction.d.ts.map +1 -0
  59. package/dist/services/global-codex-config-transaction.js +89 -0
  60. package/dist/services/global-codex-config-transaction.js.map +1 -0
  61. package/dist/services/global-codex-config-transaction.test.d.ts +2 -0
  62. package/dist/services/global-codex-config-transaction.test.d.ts.map +1 -0
  63. package/dist/services/global-codex-config-transaction.test.js +145 -0
  64. package/dist/services/global-codex-config-transaction.test.js.map +1 -0
  65. package/dist/services/global-codex-config.d.ts +10 -11
  66. package/dist/services/global-codex-config.d.ts.map +1 -1
  67. package/dist/services/global-codex-config.js +225 -107
  68. package/dist/services/global-codex-config.js.map +1 -1
  69. package/dist/services/global-codex-config.test.js +6 -6
  70. package/dist/services/global-codex-config.test.js.map +1 -1
  71. package/dist/services/hook-readiness.d.ts +7 -0
  72. package/dist/services/hook-readiness.d.ts.map +1 -0
  73. package/dist/services/hook-readiness.js +17 -0
  74. package/dist/services/hook-readiness.js.map +1 -0
  75. package/dist/services/logger.d.ts +2 -0
  76. package/dist/services/logger.d.ts.map +1 -1
  77. package/dist/services/logger.js +15 -1
  78. package/dist/services/logger.js.map +1 -1
  79. package/dist/services/logger.test.js +3 -0
  80. package/dist/services/logger.test.js.map +1 -1
  81. package/dist/services/managed-adapter.d.ts +6 -0
  82. package/dist/services/managed-adapter.d.ts.map +1 -0
  83. package/dist/services/managed-adapter.js +63 -0
  84. package/dist/services/managed-adapter.js.map +1 -0
  85. package/dist/types.d.ts +2 -0
  86. package/dist/types.d.ts.map +1 -1
  87. package/package.json +1 -1
  88. package/templates/.agents/README.md +8 -0
  89. package/templates/.agents/config/agents/discovery.json +1 -1
  90. package/templates/.agents/config/clients/codex/agents/zaip-agent-backend.toml +1 -2
  91. package/templates/.agents/config/clients/codex/agents/zaip-agent-brand-strategist.toml +1 -2
  92. package/templates/.agents/config/clients/codex/agents/zaip-agent-builder.toml +1 -2
  93. package/templates/.agents/config/clients/codex/agents/zaip-agent-cloud-engineer.toml +1 -2
  94. package/templates/.agents/config/clients/codex/agents/zaip-agent-data-analyst.toml +1 -2
  95. package/templates/.agents/config/clients/codex/agents/zaip-agent-designer.toml +1 -2
  96. package/templates/.agents/config/clients/codex/agents/zaip-agent-frontend.toml +1 -2
  97. package/templates/.agents/config/clients/codex/agents/zaip-agent-general-operations.toml +1 -2
  98. package/templates/.agents/config/clients/codex/agents/zaip-agent-governance-compliance.toml +1 -2
  99. package/templates/.agents/config/clients/codex/agents/zaip-agent-growth-strategist.toml +1 -2
  100. package/templates/.agents/config/clients/codex/agents/zaip-agent-marketing-analyst.toml +1 -2
  101. package/templates/.agents/config/clients/codex/agents/zaip-agent-orchestrator.toml +1 -2
  102. package/templates/.agents/config/clients/codex/agents/zaip-agent-refactoring-specialist.toml +1 -2
  103. package/templates/.agents/config/clients/codex/agents/zaip-agent-sales-specialist.toml +1 -2
  104. package/templates/.agents/config/clients/codex/agents/zaip-agent-task-executor.toml +1 -2
  105. package/templates/.agents/config/clients/codex/agents/zaip-agent-website-developer.toml +1 -2
  106. package/templates/.agents/config/clients/codex/agents/zaip-agent-writer.toml +1 -2
  107. package/templates/.agents/dashboard/.zaip-managed.json +40 -32
  108. package/templates/.agents/dashboard/apps/frontend/dist/assets/{DashboardHelpDialog-DlN5EMmD.js → DashboardHelpDialog-CkQ_y8kg.js} +60 -1
  109. package/templates/.agents/dashboard/apps/frontend/dist/assets/{ProjectSettingsPage-BRdoeTWk.js → ProjectSettingsPage-doIMhei7.js} +1 -1
  110. package/templates/.agents/dashboard/apps/frontend/dist/assets/{TraceabilityWorkspace-B_5u4Xnp.js → TraceabilityWorkspace-C_4ftjyB.js} +1 -1
  111. package/templates/.agents/dashboard/apps/frontend/dist/assets/{index-C4rLXrz_.js → index-Rbmpz4UO.js} +2 -2
  112. package/templates/.agents/dashboard/apps/frontend/dist/index.html +1 -1
  113. package/templates/.agents/dashboard/apps/frontend/package.json +1 -1
  114. package/templates/.agents/dashboard/modules/cost-monitor/package.json +1 -1
  115. package/templates/.agents/dashboard/modules/operations/package.json +1 -1
  116. package/templates/.agents/dashboard/modules/traceability/package.json +1 -1
  117. package/templates/.agents/dashboard/packages/branding/package.json +1 -1
  118. package/templates/.agents/dashboard/packages/contracts/package.json +1 -1
  119. package/templates/.agents/dashboard/packages/data-export/package.json +1 -1
  120. package/templates/.agents/dashboard/packages/local-runtime/dist/server.cjs +175 -175
  121. package/templates/.agents/dashboard/packages/local-runtime/dist/sqlite-read-model.cjs +135 -135
  122. package/templates/.agents/dashboard/packages/local-runtime/package.json +1 -1
  123. package/templates/.agents/dashboard/packages/local-runtime/server.mjs +175 -175
  124. package/templates/.agents/dashboard/packages/local-runtime/src/server-operation-detail.test.ts +106 -0
  125. package/templates/.agents/dashboard/packages/local-runtime/src/server.test.ts +0 -13
  126. package/templates/.agents/dashboard/packages/local-runtime/src/sqlite-read-model-counts-every-root-execution-day-returns.test.ts +17 -230
  127. package/templates/.agents/dashboard/packages/local-runtime/src/sqlite-read-model-counts-fixture.test-support.ts +239 -0
  128. package/templates/.agents/dashboard/packages/local-runtime/start-dashboard-launch-page.test.mjs +28 -8
  129. package/templates/.agents/dashboard/packages/ui/package.json +1 -1
  130. package/templates/.agents/dashboard/tests/e2e/package.json +1 -1
  131. package/templates/.agents/design/.zaip-managed.json +3 -3
  132. package/templates/.agents/design/apps/catalog/package.json +1 -1
  133. package/templates/.agents/design/packages/local-runtime/package.json +1 -1
  134. package/templates/.agents/requirements/autonomous-assurance.md +1 -1
  135. package/templates/.agents/requirements/cloud-hostinger-autonomy.md +1 -1
  136. package/templates/.agents/requirements/comparative-audit.md +1 -1
  137. package/templates/.agents/requirements/context-engine.md +1 -1
  138. package/templates/.agents/requirements/cost-observability.md +1 -1
  139. package/templates/.agents/requirements/dashboard-launch.md +1 -1
  140. package/templates/.agents/requirements/data-export.md +1 -1
  141. package/templates/.agents/requirements/design-system.md +1 -1
  142. package/templates/.agents/requirements/execution-engine.md +1 -1
  143. package/templates/.agents/requirements/kanban-dashboard.md +1 -1
  144. package/templates/.agents/requirements/model-orchestration.md +1 -1
  145. package/templates/.agents/requirements/public-distribution.md +1 -1
  146. package/templates/.agents/requirements/software-architecture.md +1 -1
  147. package/templates/.agents/requirements/strategic-improvements.md +1 -1
  148. package/templates/.agents/requirements/work-lifecycle.md +1 -1
  149. package/templates/.agents/requirements/zaip-strategic-95.md +1 -1
  150. package/templates/.agents/rules/astra-diagnostic.md +1 -1
  151. package/templates/.agents/runtime/VERSION +1 -1
  152. package/templates/.agents/runtime/bin/zaip.mjs +627 -177
  153. package/templates/.agents/runtime/checksums.sha256 +5 -5
  154. package/templates/.agents/runtime/manifest.json +1 -1
  155. package/templates/.agents/runtime/provenance.json +4 -4
  156. package/templates/.agents/runtime/sbom.cdx.json +1 -1
  157. package/templates/.agents/skills/zaip-skill-execution/SKILL.md +1 -1
  158. package/templates/.agents/skills/zaip-skill-execution/references/correction-cycle.md +26 -0
  159. package/templates/.agents/skills/zaip-skill-execution/references/runtime-governance.md +2 -0
  160. package/templates/.agents/skills/zaip-skill-release-qualification/references/local-preparation.md +31 -1
  161. package/templates/.agents/skills/zaip-skill-setup/SKILL.md +26 -1
  162. package/templates/.agents/skills/zaip-skill-task/references/commit-policy.md +8 -1
  163. package/templates/.agents/zaip-aios/VERSION +1 -1
  164. package/templates/.agents/zaip-aios/guides/14-troubleshooting.md +52 -1
  165. package/templates/template-manifest.json +95 -87
@@ -5,9 +5,10 @@ import { lstat, readFile, realpath } from "node:fs/promises";
5
5
  import { dirname, isAbsolute, relative, resolve } from "node:path";
6
6
  import { fileURLToPath, pathToFileURL } from "node:url";
7
7
  import { promisify } from "node:util";
8
- import { captureCliTurn, rewriteCliInput, selectHookRepositoryRoot, tokenizeLiteralCommand } from "./zaip-pre-tool-support.mjs";
9
-
8
+ import { captureCliTurn, checkDestructivePatterns, gitInvocation, inside, isLiteralReadSequence, requiresShellMutationRun, reviewedContextReadPaths, reviewedReleasePaths, rewriteCliInput, selectHookExecutionWorkspace, shellSyntax, tokenizeLiteralCommand, validateInlineExecution } from "./zaip-pre-tool-support.mjs";
10
9
  const execute = promisify(execFile);
10
+ const nativeAuthority = await import("./zaip-native-tool-authority.mjs").catch(() => null);
11
+ const activation = await import("./zaip-hook-activation.mjs").catch(() => null);
11
12
  const installedRoot = resolve(dirname(fileURLToPath(import.meta.url)), "..", "..");
12
13
  let repositoryRoot = installedRoot;
13
14
  const deletionCommandPattern = /\b(?:Remove-Item|rm|rmdir|rd|del|erase)\b/i;
@@ -68,7 +69,7 @@ const destructivePatterns = [
68
69
  reason: "Remote, SSH, and credential configuration changes are blocked.",
69
70
  },
70
71
  {
71
- pattern: /\bgh\b[\s\S]*\s--repo(?:=|\s)/i,
72
+ pattern: /\bgh(?:\.exe)?\b[\s\S]*\s(?:--repo|-R)(?:=|\s|(?=[A-Za-z0-9]))/i,
72
73
  reason: "GitHub CLI commands must target the current repository.",
73
74
  },
74
75
  {
@@ -96,13 +97,17 @@ const destructivePatterns = [
96
97
  reason: "OS persistence and service changes are blocked.",
97
98
  },
98
99
  {
99
- pattern: /\b(?:diskpart|bcdedit|fsutil|takeown|icacls|Set-Acl|chmod|chown)\b|(?:^|[\s;&|"'(])format(?:\.com)?\b|\bcipher\s+\/w\b/i,
100
+ pattern: /\b(?:diskpart|bcdedit|fsutil|takeown|icacls|Set-Acl|chmod|chown)\b|(?:^|[;&|({\r\n])\s*(?:&\s*)?["']?format(?:\.(?:com|exe))?["']?(?=\s|$)|\bcipher\s+\/w\b/i,
100
101
  reason: "Disk, boot, ownership, and access-control changes are blocked.",
101
102
  },
102
103
  {
103
104
  pattern: /\b(?:runas|sudo|gsudo)\b|Start-Process[\s\S]*-Verb\s+RunAs|\bSet-ExecutionPolicy\b/i,
104
105
  reason: "Privilege escalation and persistent execution-policy changes are blocked.",
105
106
  },
107
+ {
108
+ pattern: /\b(?:Start-Process|saps)\b[^\r\n;|]*(?:[$(]|\b(?:-FilePath\s+)?['"]?git(?:\.exe)?['"]?(?:\s|$))/i,
109
+ reason: "Dynamic or indirect Git process launch is blocked; use a reviewed repository script.",
110
+ },
106
111
  {
107
112
  pattern: /\b(?:winget|choco|scoop)\s+(?:install|uninstall|upgrade)\b|\b(?:npm|pnpm|yarn)\s+(?:install|add|remove|uninstall)[\s\S]*(?:--global|-g)\b/i,
108
113
  reason: "System-wide package changes are blocked.",
@@ -112,7 +117,7 @@ const destructivePatterns = [
112
117
  reason: "Non-loopback listeners are blocked.",
113
118
  },
114
119
  {
115
- pattern: /\bgh\s+(?:pr\s+(?:create|merge|close|reopen)|issue\s+(?:create|close|reopen|delete)|release\s+(?:create|delete|upload)|repo\s+(?:create|delete|archive)|api\b[\s\S]*(?:--method|-X)\s*(?:POST|PUT|PATCH|DELETE))\b/i,
120
+ pattern: /\bgh(?:\.exe)?\s+(?:pr\s+(?:create|merge|close|reopen)|issue\s+(?:create|close|reopen|delete)|release\s+(?:create|delete|upload)|repo\s+(?:create|delete|archive)|api\b[\s\S]*(?:(?:--method|-X)(?:=|\s*)(?:POST|PUT|PATCH|DELETE)\b|(?:--field|--raw-field|--input)(?:=|\s+)|(?:^|\s)-[fF](?:=|\s+)))/i,
116
121
  reason: "Unreviewed GitHub mutations are blocked; use the bounded deploy workflow.",
117
122
  },
118
123
  {
@@ -122,23 +127,21 @@ const destructivePatterns = [
122
127
  ];
123
128
 
124
129
  function deny(reason) {
130
+ activation?.recordActivation(repositoryRoot, event, "denied");
125
131
  writeSync(
126
132
  1,
127
133
  JSON.stringify({
128
134
  hookSpecificOutput: {
129
135
  hookEventName: "PreToolUse",
130
136
  permissionDecision: "deny",
131
- permissionDecisionReason: "ZAIP safety policy: " + reason,
137
+ permissionDecisionReason: "ZAIP safety policy: " + reason + " [tool=" + String(event?.tool_name ?? "unknown").slice(0, 80) + "; session=" + String(event?.session_id ?? "missing").slice(0, 80) + "; turn=" + String(event?.turn_id ?? "missing").slice(0, 80) + "]",
132
138
  },
133
139
  }) + "\n",
134
140
  );
135
141
  process.exit(0);
136
142
  }
137
143
 
138
- function isWithinRepository(path) {
139
- const candidate = relative(repositoryRoot, resolve(path));
140
- return candidate === "" || (!candidate.startsWith("..") && !isAbsolute(candidate));
141
- }
144
+ const isWithinRepository = path => inside(path, repositoryRoot);
142
145
 
143
146
  function repositoryPath(path) {
144
147
  return relative(repositoryRoot, resolve(path)).replaceAll("\\", "/");
@@ -170,56 +173,52 @@ function explicitPathCandidates(command) {
170
173
  }
171
174
  return [...candidates].map(unquote).filter(Boolean);
172
175
  }
173
- function validateExplicitFilesystemReferences(command, cwd) {
174
- if (homeReferencePattern.test(command)) {
176
+ function validateExplicitFilesystemReferences(command, cwd, reviewedPaths = []) {
177
+ const checked = reviewedPaths.reduce((text, path) => text.replaceAll(path, "REVIEWED_RELEASE_PATH"), command);
178
+ if (homeReferencePattern.test(checked)) {
175
179
  deny("Direct user-profile path references are blocked; use repository-scoped paths.");
176
180
  }
177
- if (credentialReferencePattern.test(command) || sensitiveEnvironmentPattern.test(command)) {
181
+ if (credentialReferencePattern.test(checked) || sensitiveEnvironmentPattern.test(checked)) {
178
182
  deny("Direct credential and secret access is blocked.");
179
183
  }
180
- if (/\b(?:Get-ChildItem|gci|dir)\s+Env:|\b(?:printenv|set)\s*$/i.test(command) || /GetEnvironmentVariables\s*\(/i.test(command)) {
184
+ if (/\b(?:Get-ChildItem|gci|dir)\s+Env:|\b(?:printenv|set)\s*$/i.test(checked) || /GetEnvironmentVariables\s*\(/i.test(checked)) {
181
185
  deny("Bulk environment enumeration is blocked.");
182
186
  }
183
- if (/(?:^|[\s"'=(,]|-[A-Za-z][A-Za-z0-9_-]*:)(?:(?:\\\\){1,2}|\/\/)[^\\/\s"']+[\\/]/.test(command)) {
187
+ if (/(?:^|[\s"'=(,]|-[A-Za-z][A-Za-z0-9_-]*:)(?:(?:\\\\){1,2}|\/\/)[^\\/\s"']+[\\/]/.test(checked)) {
184
188
  deny("UNC and network filesystem paths are blocked.");
185
189
  }
186
- const osPathCommand = command.replace(/^(node\s+\.agents[\\/]runtime[\\/]bin[\\/]zaip\.mjs\s+subagent\s+capture-terminal\b[^;&|\x60\r\n]*?)--agent-id\s+\/root\/[a-z][a-z0-9_]*_zaip_agent(?:_[a-z0-9]+)?(?=\s|$)(?=[^;&|\x60\r\n]*$)/, "$1--agent-id zaip-agent");
190
+ const osPathCommand = checked.replace(/^(node\s+\.agents[\\/]runtime[\\/]bin[\\/]zaip\.mjs\s+subagent\s+capture-terminal\b[^;&|\x60\r\n]*?)--agent-id\s+\/root\/[a-z][a-z0-9_]*_zaip_agent(?:_[a-z0-9]+)?(?=\s|$)(?=[^;&|\x60\r\n]*$)/, "$1--agent-id zaip-agent");
187
191
  if (/(?:^|[\s"'=])\/(?:etc|home|Users|root|var|opt|private|mnt|proc|sys|dev|tmp)(?:[\/\s"']|$)/i.test(osPathCommand)) {
188
192
  deny("Explicit operating-system paths outside the repository are blocked.");
189
193
  }
190
- for (const candidate of explicitPathCandidates(command)) {
194
+ if (process.platform === "win32" && /(?:^|[\s"'=(,])\\(?!\\)[^\s\\/"'<>|;]+(?:\\[^\s"'<>|;]+|\.[A-Za-z0-9]{1,10})/.test(checked)) {
195
+ deny("Drive-rooted filesystem paths outside the repository are blocked.");
196
+ }
197
+ for (const candidate of explicitPathCandidates(checked)) {
191
198
  if (process.platform !== "win32" && /^[A-Za-z]:[\\/]/.test(candidate)) deny("Explicit filesystem path escapes the repository boundary.");
192
199
  const absolute = resolve(cwd, candidate);
193
200
  if (!isWithinRepository(absolute)) {
194
- deny("Explicit filesystem path escapes the repository boundary.");
201
+ deny("Explicit filesystem path escapes the repository boundary. Validated workspace: " + repositoryRoot + "; tool: " + event.tool_name + "; workdir override: " + (typeof event.tool_input?.workdir === "string"));
195
202
  }
196
203
  }
197
204
  }
198
-
199
- function validateInlineExecution(command) {
200
- const inlinePatterns = [
201
- /\b(?:node|deno)\s+(?:-e|--eval)\b/i,
202
- /\b(?:python(?:3)?|ruby|perl|php)\s+(?:-c|-e)\b/i,
203
- /\bdeno\s+eval\b/i,
204
- /\b(?:powershell|pwsh)(?:\.exe)?\b[\s\S]*\s-(?:Command|EncodedCommand|enc)\b/i,
205
- /\bcmd(?:\.exe)?\s+\/c\b/i,
206
- /\|\s*(?:node|deno|python(?:3)?|ruby|perl|php|powershell|pwsh|cmd)\b/i,
207
- /\b(?:Invoke-Expression|iex)\b/i,
208
- ];
209
- if (inlinePatterns.some((pattern) => pattern.test(command))) {
210
- deny("Inline or piped interpreter execution is blocked; use a reviewed repository script.");
211
- }
212
- }
213
-
214
205
  async function validateGitPublication(command) {
206
+ if (/(?:^|[;&|\r\n])\s*(?:(?:&\s*)?(?:['"]git(?:\.exe)?['"]|\(\s*['"]git(?:\.exe)?['"]\s*\))|(?:env|command)\s+git(?:\.exe)?\b)/i.test(command) ||
207
+ /&\s*\(\s*Get-Command\s+git(?:\.exe)?\b/i.test(command) ||
208
+ /(?:^|[\s;&|])&\s*\$[A-Za-z_]/i.test(command) || /\b(?:Set-Alias|New-Alias)\b[^\r\n;]*\bgit\b/i.test(command)) {
209
+ deny("Indirect Git execution is blocked; use a single literal command.");
210
+ }
211
+ if (/\(\s*git(?:\.exe)?\b/i.test(command)) {
212
+ deny("Nested Git execution is blocked; use a single literal command.");
213
+ }
215
214
  const tokens = tokenizeLiteralCommand(command);
216
215
  if (tokens === null) {
217
- if (/(?:^|[;&|]\s*)git(?:\.exe)?\b/i.test(command)) {
216
+ if (/(?:^|[;&|\r\n(])\s*git(?:\.exe)?\b/i.test(command)) {
218
217
  deny("Git commands must be a single literal command; separate commands before requesting execution.");
219
218
  }
220
219
  return;
221
220
  }
222
- const invocation = gitInvocation(tokens);
221
+ const invocation = gitInvocation(tokens, deny);
223
222
  if (invocation === null) return;
224
223
  const { subcommand, arguments: arguments_ } = invocation;
225
224
  if (subcommand === "commit" && arguments_.some((value) => /^(?:--amend|--no-verify|-n)/i.test(value))) {
@@ -333,39 +332,6 @@ function isSafeBranchName(branch) {
333
332
  return typeof branch === "string" && branch.length <= 255 && /^[A-Za-z0-9][A-Za-z0-9._/-]*$/.test(branch) && !branch.includes("..") && !branch.includes("//") && !branch.includes("@{") && !branch.endsWith(".") && !branch.endsWith("/") && !branch.split("/").some((segment) => segment.startsWith(".") || segment.endsWith(".lock"));
334
333
  }
335
334
 
336
- function gitInvocation(tokens) {
337
- if (tokens === null || !/^(?:git|git\.exe)$/i.test(tokens[0] ?? "")) return null;
338
- let index = 1;
339
- while (index < tokens.length && tokens[index].startsWith("-")) {
340
- const rawOption = tokens[index];
341
- const option = rawOption.toLowerCase();
342
- if (option === "--version" || option === "--help") return null;
343
- if (option === "--no-pager" || option === "--literal-pathspecs") {
344
- index += 1;
345
- continue;
346
- }
347
- if (
348
- rawOption === "-c" ||
349
- rawOption.startsWith("-c") ||
350
- option.startsWith("--config") ||
351
- option === "--git-dir" ||
352
- option === "--work-tree" ||
353
- option === "--namespace"
354
- ) {
355
- deny("Git global configuration and repository-routing overrides are blocked.");
356
- }
357
- if (rawOption === "-C" || rawOption.startsWith("-C")) {
358
- const directory = rawOption === "-C" ? tokens[index + 1] : rawOption.slice(2);
359
- if (directory !== ".") deny("Git working-directory overrides outside the repository root are blocked.");
360
- index += rawOption === "-C" ? 2 : 1;
361
- continue;
362
- }
363
- deny("Unknown Git global option is blocked.");
364
- }
365
- const subcommand = tokens[index]?.toLowerCase();
366
- return subcommand === undefined ? null : { subcommand, arguments: tokens.slice(index + 1) };
367
- }
368
-
369
335
  function validateExplicitNetwork(command) {
370
336
  if (/(?:^|[;&|]\s*)\b(?:ssh|scp|sftp|rsync|ftp|telnet|nc|ncat)\b/i.test(command)) {
371
337
  deny("Direct remote-shell and file-transfer clients are blocked.");
@@ -617,7 +583,7 @@ async function validateShellDeletion(command, cwd) {
617
583
  for (const target of targets) await validateDeletionPath(target, cwd);
618
584
  }
619
585
 
620
- function validatePatch(command) {
586
+ async function validatePatch(command) {
621
587
  const headers = [...command.matchAll(/^\*\*\* (Add|Update|Delete) File:\s*(.+)$|^\*\*\* Move to:\s*(.+)$/gm)];
622
588
  const lifecycleRecordTouched = headers.some((match) => {
623
589
  const candidate = (match[2] ?? match[3]).trim().replace(/^["']|["']$/g, "");
@@ -630,28 +596,27 @@ function validatePatch(command) {
630
596
  const candidate = (match[2] ?? match[3]).trim().replace(/^["']|["']$/g, "");
631
597
  const absolute = resolve(repositoryRoot, candidate);
632
598
  if (!isWithinRepository(absolute)) deny("Patch path escapes the repository boundary.");
599
+ if (!await nativeAuthority?.isSafePatchPath(absolute, repositoryRoot)) deny("Patch path traverses a link or could not be safely verified.");
633
600
  if (repositoryPath(absolute) === "") deny("Patching the repository root is blocked.");
634
601
  if (isGitPath(absolute)) {
635
602
  deny("Direct edits to protected Git control files are blocked.");
636
603
  }
637
604
  }
638
605
  }
639
-
640
- const lifecycleExemptPathPattern = /^(?:\.agents\/records|\.local)\//;
641
- const shellMutationPattern = /\b(?:Set-Content|Add-Content|Out-File|New-Item|Copy-Item|Move-Item|Remove-Item|git\s+apply|npm\s+version|pnpm\s+version)\b/i;
642
-
606
+ const lifecycleExemptPathPattern = /^\.local\/(?!(?:codex-hook-|codex-telemetry-spool\/|runs\/))/;
643
607
  function patchPaths(command) {
644
608
  return [...command.matchAll(/^\*\*\* (?:Add|Update|Delete) File:\s*(.+)$|^\*\*\* Move to:\s*(.+)$/gm)].map(
645
609
  (match) => repositoryPath(resolve(repositoryRoot, (match[1] ?? match[2]).trim().replace(/^["']|["']$/g, ""))),
646
610
  );
647
611
  }
648
612
 
649
- function requiresOrchestratorRun(event, command) {
613
+ async function requiresOrchestratorRun(event, command) {
650
614
  if (event.tool_name === "apply_patch") {
651
615
  const paths = patchPaths(command);
652
616
  return paths.length === 0 || paths.some((path) => !lifecycleExemptPathPattern.test(path));
653
617
  }
654
618
  if (event.tool_name === "Edit" || event.tool_name === "Write") {
619
+ if (!await nativeAuthority?.isSafePatchPath(resolve(event.cwd ?? repositoryRoot, command), repositoryRoot)) deny("File write path traverses a link or could not be safely verified.");
655
620
  return !lifecycleExemptPathPattern.test(repositoryPath(resolve(event.cwd ?? repositoryRoot, command)));
656
621
  }
657
622
  // Only single literal writes claim exemptions; compound commands remain gated.
@@ -666,17 +631,19 @@ function requiresOrchestratorRun(event, command) {
666
631
  }
667
632
  if (valid && options.has("-literalpath") && options.has("-value")) {
668
633
  const path = repositoryPath(resolve(event.cwd ?? repositoryRoot, options.get("-literalpath")));
634
+ if (!await nativeAuthority?.isSafePatchPath(resolve(repositoryRoot, path), repositoryRoot)) deny("Shell write path traverses a link or could not be safely verified.");
669
635
  if (lifecycleExemptPathPattern.test(path)) return false;
670
636
  }
671
637
  }
672
- return shellMutationPattern.test(command);
638
+ return requiresShellMutationRun(command, tokens, event.cwd ?? repositoryRoot, repositoryRoot);
673
639
  }
674
640
 
675
641
  async function boundedCanonicalText(path, maximumBytes) {
676
642
  const info = await lstat(path);
677
643
  if (!info.isFile() || info.isSymbolicLink() || info.size > maximumBytes) throw new Error("Unsafe Run lookup file");
678
644
  const physical = await realpath(path);
679
- if (!isWithinRepository(physical) || physical.toLowerCase() !== resolve(path).toLowerCase()) throw new Error("Run lookup must not follow links");
645
+ const identity = value => process.platform === "win32" ? value.toLowerCase() : value;
646
+ if (!isWithinRepository(physical) || identity(physical) !== identity(resolve(path))) throw new Error("Run lookup must not follow links");
680
647
  return readFile(path, "utf8");
681
648
  }
682
649
 
@@ -691,7 +658,7 @@ async function hasCurrentTaskOrchestratorRun(event) {
691
658
  const digest = createHash("sha256").update(JSON.stringify(["codex", threadId, turnId, null, null])).digest("hex");
692
659
  const correlation = JSON.parse(await boundedCanonicalText(resolve(repositoryRoot, ".local/codex-telemetry-spool/v1/correlations", digest + ".json"), 65536));
693
660
  const id = correlation.run_id;
694
- const dated = typeof id === "string" ? /^RUN-(\d{4})-(\d{2})-(\d{2})-[A-Z0-9-]+-[A-Z0-9]{4}$/.exec(id) : null;
661
+ const dated = typeof id === "string" ? /^RUN-(\d{4})-(\d{2})-(\d{2})-[A-Z0-9-]+-[A-Z0-9]{2,16}$/.exec(id) : null;
695
662
  if (!dated || correlation.schema_version !== 1 || correlation.thread_id !== threadId || correlation.turn_id !== turnId || correlation.agent_path !== null) return false;
696
663
  const candidates = [
697
664
  ".agents/records/runs/" + dated[1] + "/" + dated[2] + "/" + id + ".jsonl",
@@ -731,13 +698,13 @@ try {
731
698
  deny("Malformed hook input was rejected.");
732
699
  }
733
700
 
734
- try { repositoryRoot = await selectHookRepositoryRoot(installedRoot, event.cwd); }
701
+ const toolInput = event?.tool_input;
702
+ try { const scope = await selectHookExecutionWorkspace(installedRoot, event); repositoryRoot = scope.repositoryRoot; event = { ...event, cwd: scope.cwd }; }
735
703
  catch (error) { deny(error.message); }
736
704
  if (!isWithinRepository(event.cwd)) {
737
705
  deny("Tool execution outside the ZAIP-AIOS repository is blocked.");
738
706
  }
739
707
 
740
- const toolInput = event?.tool_input;
741
708
  const commandFromCmd = toolInput?.cmd;
742
709
  const commandFromCommand = toolInput?.command;
743
710
  if (typeof commandFromCmd === "string" && typeof commandFromCommand === "string" && commandFromCmd !== commandFromCommand) {
@@ -746,24 +713,30 @@ if (typeof commandFromCmd === "string" && typeof commandFromCommand === "string"
746
713
  const command = typeof commandFromCmd === "string" ? commandFromCmd : commandFromCommand;
747
714
  if (typeof command !== "string") deny("A matched tool call without a command was rejected.");
748
715
 
749
- if (requiresOrchestratorRun(event, command) && !(await hasCurrentTaskOrchestratorRun(event))) {
716
+ if (await requiresOrchestratorRun(event, command) && !(await hasCurrentTaskOrchestratorRun(event)) &&
717
+ !(await nativeAuthority?.hasNativeDelegatedPatch(event, repositoryRoot, boundedCanonicalText))) {
750
718
  deny("Persistent mutation requires the exact active Task Run and its verified thread/turn correlation. Capture or reconcile this turn before retrying; no global Task fallback is allowed.");
751
719
  }
752
720
 
753
- if (event.tool_name === "apply_patch") validatePatch(command);
721
+ if (event.tool_name === "apply_patch") await validatePatch(command);
754
722
  else {
755
- validateExplicitFilesystemReferences(command, event.cwd);
756
- validateInlineExecution(command);
723
+ const reviewedPaths = [
724
+ ...await reviewedReleasePaths(command, event.cwd, repositoryRoot, credentialReferencePattern, deny),
725
+ ...await reviewedContextReadPaths(command, credentialReferencePattern), ...await (nativeAuthority?.reviewedValidationRuntimePaths?.(command, tokenizeLiteralCommand) ?? []),
726
+ ];
727
+ validateExplicitFilesystemReferences(command, event.cwd, reviewedPaths);
728
+ validateInlineExecution(command, deny);
729
+ if (!isLiteralReadSequence(command)) {
757
730
  await validateGitPublication(command);
758
731
  await validateCloudRunner(command);
759
732
  validateDirectCloudProviderMutation(command);
760
733
  validateExplicitNetwork(command);
761
734
  await validateShellDeletion(command, event.cwd);
762
- for (const entry of destructivePatterns) {
763
- if (entry.pattern.test(command)) deny(entry.reason);
735
+ checkDestructivePatterns(command, destructivePatterns, deny);
764
736
  }
765
737
  try { const updated = await captureCliTurn(repositoryRoot, event, command); if (updated) writeSync(1, JSON.stringify(rewriteCliInput(toolInput, updated, commandFromCmd)) + "\n"); }
766
738
  catch (error) { deny(error.message); }
767
739
  }
740
+ activation?.recordActivation(repositoryRoot, event, "allowed");
768
741
  `;
769
742
  //# sourceMappingURL=codex-pre-tool-hook-template.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"codex-pre-tool-hook-template.js","sourceRoot":"","sources":["../../src/services/codex-pre-tool-hook-template.ts"],"names":[],"mappings":"AAAA,MAAM,CAAC,MAAM,mBAAmB,GAAG,MAAM,CAAC,GAAG,CAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CA+vB5C,CAAC"}
1
+ {"version":3,"file":"codex-pre-tool-hook-template.js","sourceRoot":"","sources":["../../src/services/codex-pre-tool-hook-template.ts"],"names":[],"mappings":"AAAA,MAAM,CAAC,MAAM,mBAAmB,GAAG,MAAM,CAAC,GAAG,CAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAouB5C,CAAC"}
@@ -1,6 +1,6 @@
1
1
  import { spawnSync } from "node:child_process";
2
2
  import { mkdir, mkdtemp, rm, writeFile } from "node:fs/promises";
3
- import { tmpdir } from "node:os";
3
+ import { homedir, tmpdir } from "node:os";
4
4
  import { join } from "node:path";
5
5
  import { afterEach, expect, it } from "vitest";
6
6
  import { CODEX_PRE_TOOL_HOOK } from "./codex-pre-tool-hook-template.js";
@@ -9,6 +9,80 @@ const roots = [];
9
9
  afterEach(async () => {
10
10
  await Promise.all(roots.splice(0).map((root) => rm(root, { recursive: true, force: true })));
11
11
  });
12
+ it("permits only literal reviewed release commands with controlled external paths", async () => {
13
+ const root = await mkdtemp(join(tmpdir(), "zaip-cli-release-hook-"));
14
+ roots.push(root);
15
+ const hookPath = join(root, ".codex", "hooks", "zaip-pre-tool-use.mjs");
16
+ await mkdir(join(root, ".codex", "hooks"), { recursive: true });
17
+ await writeFile(hookPath, CODEX_PRE_TOOL_HOOK);
18
+ await writeFile(join(root, ".codex", "hooks", "zaip-pre-tool-support.mjs"), CODEX_PRE_TOOL_SUPPORT_HOOK);
19
+ await mkdir(join(root, "scripts"), { recursive: true });
20
+ await writeFile(join(root, "scripts", "local-release-preparation.mjs"), "export default null;\n");
21
+ await writeFile(join(root, "scripts", "local-release-deploy.mjs"), "export default null;\n");
22
+ await mkdir(join(root, "nested", "scripts"), { recursive: true });
23
+ await writeFile(join(root, "nested", "scripts", "local-release-deploy.mjs"), "export default null;\n");
24
+ const artifact = join(homedir(), ".codex", "release-candidates", "zaip-aios", "v4.3-full-aaaaaaaa-20260927");
25
+ const receipt = join(artifact, "local-release-receipt.json");
26
+ const tarball = join(artifact, "cli.tgz");
27
+ const policy = join(homedir(), ".codex", "release-keys", "zaip-aios", "maintainer-v4", "policy-v4.3-full.json");
28
+ const trust = join(homedir(), ".codex", "release-keys", "zaip-aios", "maintainer-v4", "trust");
29
+ const privateKey = join(homedir(), ".codex", "release-keys", "zaip-aios", "maintainer-v4", "release-private.pem");
30
+ const q = (path) => `"${path}"`;
31
+ const base = `--repository ${q(root)} --expected-repository zaip-ai/zaip-aios --sha ${"a".repeat(40)} --channel latest --version 4.3 --profile full`;
32
+ const prepare = `node scripts/local-release-preparation.mjs prepare ${base} --output-dir ${q(artifact)} --policy ${q(policy)} --key-id maintainer-v4 --expires-at 2026-09-28T00:00:00Z`;
33
+ const verify = `node scripts/local-release-preparation.mjs verify ${base} --tree-sha256 ${"b".repeat(64)} --receipt ${q(receipt)} --tarball ${q(tarball)} --policy ${q(policy)} --trust-store ${q(trust)}`;
34
+ const deploy = `node scripts/local-release-deploy.mjs ${base} --branch main --output-dir ${q(artifact)} --policy ${q(policy)} --trust-store ${q(trust)} --private-key ${q(privateKey)} --key-id maintainer-v4 --expires-at 2026-09-28T00:00:00Z --notes-file ${q(join(artifact, "notes.md"))} --inventory-file ${q(join(artifact, "inventory.json"))} --initial --dry-run --offline-dry-run`;
35
+ const invoke = (cmd) => spawnSync(process.execPath, [hookPath], {
36
+ cwd: root,
37
+ encoding: "utf8",
38
+ input: JSON.stringify({ cwd: root, tool_name: "exec_command", tool_input: { cmd } }),
39
+ });
40
+ for (const command of [prepare, verify, deploy]) {
41
+ const result = invoke(command);
42
+ expect(result.status).toBe(0);
43
+ expect(result.stdout, command).toBe("");
44
+ }
45
+ const nested = spawnSync(process.execPath, [hookPath], {
46
+ cwd: root,
47
+ encoding: "utf8",
48
+ input: JSON.stringify({
49
+ cwd: join(root, "nested"),
50
+ tool_name: "exec_command",
51
+ tool_input: { cmd: deploy },
52
+ }),
53
+ });
54
+ expect(JSON.parse(nested.stdout).hookSpecificOutput.permissionDecision).toBe("deny");
55
+ for (const command of [
56
+ verify.replace(" verify ", " pilot "),
57
+ prepare.replace(" prepare ", " bootstrap "),
58
+ prepare.replace("--profile full", "--profile full-v2"),
59
+ prepare.replace(q(policy), q(join(artifact, "policy-v4.3-full.json"))),
60
+ prepare.replace(q(policy), q(join(root, "policy.json"))),
61
+ prepare.replace(q(artifact), q(join(homedir(), ".codex", "release-candidates", "zaip-aios", "v4.3-full-bbbbbbbb-20260927"))),
62
+ prepare.replace(q(artifact), q(join(homedir(), ".codex", "release-candidates", "other", "v4.3-full-aaaaaaaa-20260927"))),
63
+ verify.replace("--receipt", "--unknown x --receipt"),
64
+ `${verify} --receipt ${q(receipt)}`,
65
+ verify.replace(q(tarball), q(`${artifact}\\..\\cli.tgz`)),
66
+ verify.replace(q(receipt), q(join(tmpdir(), "unrelated", "local-release-receipt.json"))),
67
+ verify.replace(q(trust), q(join(root, "trust"))),
68
+ verify.replace(q(trust), q(join(homedir(), ".codex", "release-keys", "zaip-aios", "other-key", "trust"))),
69
+ verify.replace(q(tarball), q(join(artifact, "cli^evil.tgz"))),
70
+ `${verify} ; Get-Content ${q(receipt)}`,
71
+ `${verify} && Get-Content ${q(receipt)}`,
72
+ `Get-Content ${q(receipt)}`,
73
+ `node scripts/unrelated.mjs --receipt ${q(receipt)}`,
74
+ deploy.replace("--initial", "--from v4.2 --initial"),
75
+ deploy.replace(q(privateKey), q(join(homedir(), ".ssh", "id_rsa"))),
76
+ deploy.replace(q(privateKey), q(join(artifact, "release-private.pem"))),
77
+ deploy.replace(q(privateKey), q(join(root, "key.txt"))),
78
+ deploy.replace(q(join(artifact, "notes.md")), q(join(artifact, ".env"))),
79
+ ]) {
80
+ const result = invoke(command);
81
+ expect(result.status).toBe(0);
82
+ expect(result.stdout, command).not.toBe("");
83
+ expect(JSON.parse(result.stdout).hookSpecificOutput.permissionDecision).toBe("deny");
84
+ }
85
+ });
12
86
  it("uses tool_input.cmd, rejects conflicting commands, and keeps read-only git formatting", async () => {
13
87
  const root = await mkdtemp(join(tmpdir(), "zaip-cli-pre-tool-"));
14
88
  roots.push(root);
@@ -24,6 +98,79 @@ it("uses tool_input.cmd, rejects conflicting commands, and keeps read-only git f
24
98
  const allowed = invoke({ cmd: "git log -1 --format='%H %s'" });
25
99
  expect(allowed.status).toBe(0);
26
100
  expect(allowed.stdout).toBe("");
101
+ for (const cmd of [
102
+ "Write-Output safe\ngit push origin HEAD:refs/heads/unapproved",
103
+ "Write-Output safe\r\ngit push origin HEAD:refs/heads/unapproved",
104
+ "Write-Output $(git push origin HEAD:refs/heads/unapproved)",
105
+ "Write-Output (git push origin HEAD:refs/heads/unapproved)",
106
+ "echo `git push origin HEAD:refs/heads/unapproved`",
107
+ "& 'git' push origin HEAD:refs/heads/unapproved",
108
+ "& ('git') push origin HEAD:refs/heads/unapproved",
109
+ "env git push origin HEAD:refs/heads/unapproved",
110
+ "command git push origin HEAD:refs/heads/unapproved",
111
+ "& $git push origin HEAD:refs/heads/unapproved",
112
+ "gh api repos/zaip-ai/zaip-aios/git/refs -f ref=refs/heads/unapproved",
113
+ "gh api repos/zaip-ai/zaip-aios/git/refs --method=POST",
114
+ "gh -R other/repo pr merge 123",
115
+ "gh -R other/repo release create v1",
116
+ "Start-Process git -ArgumentList 'push origin HEAD:refs/heads/unapproved'",
117
+ "Start-Process -FilePath (Get-Command git) -ArgumentList 'push origin HEAD:refs/heads/unapproved'",
118
+ "saps -FilePath (Get-Command git) -ArgumentList 'push origin HEAD:refs/heads/unapproved'",
119
+ "Start-Process -FilePath $git -ArgumentList 'push origin HEAD:refs/heads/unapproved'",
120
+ "echo code > src/a.ts",
121
+ "Write-Output code > src/a.ts",
122
+ "echo code | tee src/a.ts",
123
+ "sed -i s/old/new/ src/a.ts",
124
+ "sed -i.bak s/old/new/ src/a.ts",
125
+ "sed '-i.bak' s/old/new/ src/a.ts",
126
+ "sed -Ei s/old/new/ src/a.ts",
127
+ 'sed "-Ei" s/old/new/ src/a.ts',
128
+ "sed -e s/old/new/ -i src/a.ts",
129
+ "sed --expression=s/old/new/ --in-place src/a.ts",
130
+ "sed --in-place=.bak s/old/new/ src/a.ts",
131
+ "sed '--in-place=.bak' s/old/new/ src/a.ts",
132
+ "sed -e 'w src/a.ts' src/input.ts",
133
+ "sed 'w src/a.ts' src/input.ts",
134
+ "sed 's/old/new/w src/a.ts' src/input.ts",
135
+ "sed -f script.sed src/input.ts",
136
+ "sed --file=script.sed src/input.ts",
137
+ "sed --file script.sed src/input.ts",
138
+ "sed -e 's/x/y/wsrc/output.ts' src/input.ts",
139
+ "bash -c 'git push origin HEAD:refs/heads/unapproved'",
140
+ "bash -xc 'printf x > src/output.ts'",
141
+ "bash --noprofile -c 'printf x > src/output.ts'",
142
+ "sh -c 'git push origin HEAD:refs/heads/unapproved'",
143
+ "sh -ec 'printf x > src/output.ts'",
144
+ "sh -e -c 'printf x > src/output.ts'",
145
+ "& (Get-Command git) push origin HEAD:refs/heads/unapproved",
146
+ "& (Get-Command -Name git) push origin HEAD:refs/heads/unapproved",
147
+ "& (Get-Command 'git') reset --hard",
148
+ "Write-Output safe; & (Get-Command git) push origin HEAD:refs/heads/unapproved",
149
+ "ac src/a.ts payload",
150
+ "ni src/a.ts -ItemType File",
151
+ "cp src/a.ts src/b.ts",
152
+ "mv src/a.ts src/b.ts",
153
+ ]) {
154
+ const result = invoke({ cmd });
155
+ expect(result.status).toBe(0);
156
+ expect(JSON.parse(result.stdout).hookSpecificOutput.permissionDecision).toBe("deny");
157
+ }
158
+ if (process.platform === "win32") {
159
+ const rooted = invoke({ cmd: "Get-Content \\Windows\\System32\\config\\SAM" });
160
+ expect(JSON.parse(rooted.stdout).hookSpecificOutput.permissionDecision).toBe("deny");
161
+ const single = invoke({ cmd: "Get-Content \\secret.txt" });
162
+ expect(JSON.parse(single.stdout).hookSpecificOutput.permissionDecision).toBe("deny");
163
+ }
164
+ for (const cmd of [
165
+ "Write-Output 'literal $()'",
166
+ "Write-Output 'literal `mark'",
167
+ "Write-Output 'git reset --hard'",
168
+ "Write-Output 'gh api repos/other/repo/git/refs -f ref=x'",
169
+ ]) {
170
+ const literal = invoke({ cmd });
171
+ expect(literal.status).toBe(0);
172
+ expect(literal.stdout).toBe("");
173
+ }
27
174
  const capture = "node .agents/runtime/bin/zaip.mjs subagent capture-terminal --parent-agent-id native-parent --parent-run-id RUN-EXAMPLE --agent-id /root/gui_quality_assurance_lead_zaip_agent --agent-type zaip-agent-finalizer --status completed --json";
28
175
  const captureResult = invoke({ cmd: capture });
29
176
  expect(captureResult.status).toBe(0);
@@ -92,4 +239,56 @@ it("uses tool_input.cmd, rejects conflicting commands, and keeps read-only git f
92
239
  const nestedDiskDenied = invoke({ cmd: "cmd /c " + "format" + " C:" });
93
240
  expect(JSON.parse(nestedDiskDenied.stdout).hookSpecificOutput.permissionDecision).toBe("deny");
94
241
  });
242
+ it("allows explicit acceptance arguments before Task capture without allowing writes", async () => {
243
+ const root = await mkdtemp(join(tmpdir(), "zaip-cli-bootstrap-hook-"));
244
+ roots.push(root);
245
+ const hooks = join(root, ".codex", "hooks");
246
+ await mkdir(hooks, { recursive: true });
247
+ await writeFile(join(hooks, "zaip-pre-tool-use.mjs"), CODEX_PRE_TOOL_HOOK);
248
+ await writeFile(join(hooks, "zaip-pre-tool-support.mjs"), CODEX_PRE_TOOL_SUPPORT_HOOK);
249
+ const invoke = (cmd) => spawnSync(process.execPath, [join(hooks, "zaip-pre-tool-use.mjs")], {
250
+ cwd: root,
251
+ encoding: "utf8",
252
+ windowsHide: true,
253
+ env: { ...process.env, CODEX_THREAD_ID: "bootstrap-thread", CODEX_TURN_ID: "bootstrap-turn" },
254
+ input: JSON.stringify({
255
+ cwd: root,
256
+ session_id: "bootstrap-thread",
257
+ turn_id: "bootstrap-turn",
258
+ tool_use_id: "bootstrap-tool",
259
+ tool_name: "exec_command",
260
+ tool_input: { cmd },
261
+ }),
262
+ });
263
+ const result = invoke("node .agents/runtime/bin/zaip.mjs conversation start --intent new-work --acceptance AC-WORK-001-09 --json");
264
+ expect(result.status, result.stderr).toBe(0);
265
+ const output = JSON.parse(result.stdout).hookSpecificOutput;
266
+ expect(output.permissionDecision, result.stdout).toBe("allow");
267
+ expect(output.updatedInput.cmd).toContain("--codex-hook-id=");
268
+ for (const cmd of [
269
+ "ac src/a.ts payload",
270
+ "AC src/a.ts payload",
271
+ "(Set-Content -LiteralPath src/a.ts -Value code)",
272
+ "Write-Output (Set-Content -LiteralPath src/a.ts -Value code)",
273
+ "env cp src/a.ts src/b.ts",
274
+ "exec cp src/a.ts src/b.ts",
275
+ "FOO=1 cp src/a.ts src/b.ts",
276
+ "unknown-wrapper ac src/a.ts payload",
277
+ ".\\echo.cmd ac src/a.ts payload",
278
+ ".\\node.cmd .agents/runtime/bin/zaip.mjs conversation start --acceptance AC-WORK-001-09",
279
+ "echo.cmd ac src/a.ts payload",
280
+ "node.cmd .agents/runtime/bin/zaip.mjs conversation start --acceptance AC-WORK-001-09",
281
+ "node scripts/unknown.mjs --acceptance AC-WORK-001-09",
282
+ "command ac src/a.ts payload",
283
+ ".\\sed.exe -i s/a/b/ src/a.ts",
284
+ ".\\sed.exe -f script.sed src/input.ts",
285
+ "git apply patch.diff",
286
+ "node scripts/read.mjs --acceptance AC-WORK-001-09; ac src/a.ts payload",
287
+ "node scripts/read.mjs > src/a.ts",
288
+ ]) {
289
+ const blocked = invoke(cmd);
290
+ expect(blocked.status, blocked.stderr).toBe(0);
291
+ expect(JSON.parse(blocked.stdout).hookSpecificOutput.permissionDecision).toBe("deny");
292
+ }
293
+ });
95
294
  //# sourceMappingURL=codex-pre-tool-hook-template.test.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"codex-pre-tool-hook-template.test.js","sourceRoot":"","sources":["../../src/services/codex-pre-tool-hook-template.test.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"codex-pre-tool-hook-template.test.js","sourceRoot":"","sources":["../../src/services/codex-pre-tool-hook-template.test.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"codex-pre-tool-support-template.d.ts","sourceRoot":"","sources":["../../src/services/codex-pre-tool-support-template.ts"],"names":[],"mappings":"AAAA,eAAO,MAAM,2BAA2B,QA4GvC,CAAC"}
1
+ {"version":3,"file":"codex-pre-tool-support-template.d.ts","sourceRoot":"","sources":["../../src/services/codex-pre-tool-support-template.ts"],"names":[],"mappings":"AAAA,eAAO,MAAM,2BAA2B,QA+YvC,CAAC"}