@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.
- package/dist/commands/init.d.ts.map +1 -1
- package/dist/commands/init.js +3 -1
- package/dist/commands/init.js.map +1 -1
- package/dist/services/adapters.d.ts +2 -2
- package/dist/services/adapters.d.ts.map +1 -1
- package/dist/services/adapters.js +11 -63
- package/dist/services/adapters.js.map +1 -1
- package/dist/services/agent-adapters.d.ts.map +1 -1
- package/dist/services/agent-adapters.js +3 -7
- package/dist/services/agent-adapters.js.map +1 -1
- package/dist/services/agent-adapters.test.js +43 -11
- package/dist/services/agent-adapters.test.js.map +1 -1
- package/dist/services/codex-config-template.js +2 -2
- package/dist/services/codex-conversation-lifecycle-hook.d.ts.map +1 -1
- package/dist/services/codex-conversation-lifecycle-hook.js +38 -14
- package/dist/services/codex-conversation-lifecycle-hook.js.map +1 -1
- package/dist/services/codex-hook-activation.d.ts +4 -0
- package/dist/services/codex-hook-activation.d.ts.map +1 -0
- package/dist/services/codex-hook-activation.js +64 -0
- package/dist/services/codex-hook-activation.js.map +1 -0
- package/dist/services/codex-model-policy.d.ts +4 -0
- package/dist/services/codex-model-policy.d.ts.map +1 -0
- package/dist/services/codex-model-policy.js +24 -0
- package/dist/services/codex-model-policy.js.map +1 -0
- package/dist/services/codex-native-tool-authority-template.d.ts +2 -0
- package/dist/services/codex-native-tool-authority-template.d.ts.map +1 -0
- package/dist/services/codex-native-tool-authority-template.js +89 -0
- package/dist/services/codex-native-tool-authority-template.js.map +1 -0
- package/dist/services/codex-pre-tool-hook-template.d.ts.map +1 -1
- package/dist/services/codex-pre-tool-hook-template.js +59 -86
- package/dist/services/codex-pre-tool-hook-template.js.map +1 -1
- package/dist/services/codex-pre-tool-hook-template.test.js +200 -1
- package/dist/services/codex-pre-tool-hook-template.test.js.map +1 -1
- package/dist/services/codex-pre-tool-support-template.d.ts.map +1 -1
- package/dist/services/codex-pre-tool-support-template.js +303 -12
- package/dist/services/codex-pre-tool-support-template.js.map +1 -1
- package/dist/services/codex-subagent-hook-template.d.ts +1 -1
- package/dist/services/codex-subagent-hook-template.d.ts.map +1 -1
- package/dist/services/codex-subagent-hook-template.js +11 -4
- package/dist/services/codex-subagent-hook-template.js.map +1 -1
- package/dist/services/codex-validation-runtime-template.d.ts +3 -0
- package/dist/services/codex-validation-runtime-template.d.ts.map +1 -0
- package/dist/services/codex-validation-runtime-template.js +18 -0
- package/dist/services/codex-validation-runtime-template.js.map +1 -0
- package/dist/services/codex-windows-hook-command.js +1 -1
- package/dist/services/codex-windows-hook-command.js.map +1 -1
- package/dist/services/codex-windows-hook-command.test.js +22 -0
- package/dist/services/codex-windows-hook-command.test.js.map +1 -1
- package/dist/services/global-codex-config-fixtures.d.ts +12 -0
- package/dist/services/global-codex-config-fixtures.d.ts.map +1 -0
- package/dist/services/global-codex-config-fixtures.js +38 -0
- package/dist/services/global-codex-config-fixtures.js.map +1 -0
- package/dist/services/global-codex-config-migration.test.d.ts +2 -0
- package/dist/services/global-codex-config-migration.test.d.ts.map +1 -0
- package/dist/services/global-codex-config-migration.test.js +301 -0
- package/dist/services/global-codex-config-migration.test.js.map +1 -0
- package/dist/services/global-codex-config-transaction.d.ts +15 -0
- package/dist/services/global-codex-config-transaction.d.ts.map +1 -0
- package/dist/services/global-codex-config-transaction.js +89 -0
- package/dist/services/global-codex-config-transaction.js.map +1 -0
- package/dist/services/global-codex-config-transaction.test.d.ts +2 -0
- package/dist/services/global-codex-config-transaction.test.d.ts.map +1 -0
- package/dist/services/global-codex-config-transaction.test.js +145 -0
- package/dist/services/global-codex-config-transaction.test.js.map +1 -0
- package/dist/services/global-codex-config.d.ts +10 -11
- package/dist/services/global-codex-config.d.ts.map +1 -1
- package/dist/services/global-codex-config.js +225 -107
- package/dist/services/global-codex-config.js.map +1 -1
- package/dist/services/global-codex-config.test.js +6 -6
- package/dist/services/global-codex-config.test.js.map +1 -1
- package/dist/services/hook-readiness.d.ts +7 -0
- package/dist/services/hook-readiness.d.ts.map +1 -0
- package/dist/services/hook-readiness.js +17 -0
- package/dist/services/hook-readiness.js.map +1 -0
- package/dist/services/logger.d.ts +2 -0
- package/dist/services/logger.d.ts.map +1 -1
- package/dist/services/logger.js +15 -1
- package/dist/services/logger.js.map +1 -1
- package/dist/services/logger.test.js +3 -0
- package/dist/services/logger.test.js.map +1 -1
- package/dist/services/managed-adapter.d.ts +6 -0
- package/dist/services/managed-adapter.d.ts.map +1 -0
- package/dist/services/managed-adapter.js +63 -0
- package/dist/services/managed-adapter.js.map +1 -0
- package/dist/types.d.ts +2 -0
- package/dist/types.d.ts.map +1 -1
- package/package.json +1 -1
- package/templates/.agents/README.md +8 -0
- package/templates/.agents/config/agents/discovery.json +1 -1
- package/templates/.agents/config/clients/codex/agents/zaip-agent-backend.toml +1 -2
- package/templates/.agents/config/clients/codex/agents/zaip-agent-brand-strategist.toml +1 -2
- package/templates/.agents/config/clients/codex/agents/zaip-agent-builder.toml +1 -2
- package/templates/.agents/config/clients/codex/agents/zaip-agent-cloud-engineer.toml +1 -2
- package/templates/.agents/config/clients/codex/agents/zaip-agent-data-analyst.toml +1 -2
- package/templates/.agents/config/clients/codex/agents/zaip-agent-designer.toml +1 -2
- package/templates/.agents/config/clients/codex/agents/zaip-agent-frontend.toml +1 -2
- package/templates/.agents/config/clients/codex/agents/zaip-agent-general-operations.toml +1 -2
- package/templates/.agents/config/clients/codex/agents/zaip-agent-governance-compliance.toml +1 -2
- package/templates/.agents/config/clients/codex/agents/zaip-agent-growth-strategist.toml +1 -2
- package/templates/.agents/config/clients/codex/agents/zaip-agent-marketing-analyst.toml +1 -2
- package/templates/.agents/config/clients/codex/agents/zaip-agent-orchestrator.toml +1 -2
- package/templates/.agents/config/clients/codex/agents/zaip-agent-refactoring-specialist.toml +1 -2
- package/templates/.agents/config/clients/codex/agents/zaip-agent-sales-specialist.toml +1 -2
- package/templates/.agents/config/clients/codex/agents/zaip-agent-task-executor.toml +1 -2
- package/templates/.agents/config/clients/codex/agents/zaip-agent-website-developer.toml +1 -2
- package/templates/.agents/config/clients/codex/agents/zaip-agent-writer.toml +1 -2
- package/templates/.agents/dashboard/.zaip-managed.json +40 -32
- package/templates/.agents/dashboard/apps/frontend/dist/assets/{DashboardHelpDialog-DlN5EMmD.js → DashboardHelpDialog-CkQ_y8kg.js} +60 -1
- package/templates/.agents/dashboard/apps/frontend/dist/assets/{ProjectSettingsPage-BRdoeTWk.js → ProjectSettingsPage-doIMhei7.js} +1 -1
- package/templates/.agents/dashboard/apps/frontend/dist/assets/{TraceabilityWorkspace-B_5u4Xnp.js → TraceabilityWorkspace-C_4ftjyB.js} +1 -1
- package/templates/.agents/dashboard/apps/frontend/dist/assets/{index-C4rLXrz_.js → index-Rbmpz4UO.js} +2 -2
- package/templates/.agents/dashboard/apps/frontend/dist/index.html +1 -1
- package/templates/.agents/dashboard/apps/frontend/package.json +1 -1
- package/templates/.agents/dashboard/modules/cost-monitor/package.json +1 -1
- package/templates/.agents/dashboard/modules/operations/package.json +1 -1
- package/templates/.agents/dashboard/modules/traceability/package.json +1 -1
- package/templates/.agents/dashboard/packages/branding/package.json +1 -1
- package/templates/.agents/dashboard/packages/contracts/package.json +1 -1
- package/templates/.agents/dashboard/packages/data-export/package.json +1 -1
- package/templates/.agents/dashboard/packages/local-runtime/dist/server.cjs +175 -175
- package/templates/.agents/dashboard/packages/local-runtime/dist/sqlite-read-model.cjs +135 -135
- package/templates/.agents/dashboard/packages/local-runtime/package.json +1 -1
- package/templates/.agents/dashboard/packages/local-runtime/server.mjs +175 -175
- package/templates/.agents/dashboard/packages/local-runtime/src/server-operation-detail.test.ts +106 -0
- package/templates/.agents/dashboard/packages/local-runtime/src/server.test.ts +0 -13
- package/templates/.agents/dashboard/packages/local-runtime/src/sqlite-read-model-counts-every-root-execution-day-returns.test.ts +17 -230
- package/templates/.agents/dashboard/packages/local-runtime/src/sqlite-read-model-counts-fixture.test-support.ts +239 -0
- package/templates/.agents/dashboard/packages/local-runtime/start-dashboard-launch-page.test.mjs +28 -8
- package/templates/.agents/dashboard/packages/ui/package.json +1 -1
- package/templates/.agents/dashboard/tests/e2e/package.json +1 -1
- package/templates/.agents/design/.zaip-managed.json +3 -3
- package/templates/.agents/design/apps/catalog/package.json +1 -1
- package/templates/.agents/design/packages/local-runtime/package.json +1 -1
- package/templates/.agents/requirements/autonomous-assurance.md +1 -1
- package/templates/.agents/requirements/cloud-hostinger-autonomy.md +1 -1
- package/templates/.agents/requirements/comparative-audit.md +1 -1
- package/templates/.agents/requirements/context-engine.md +1 -1
- package/templates/.agents/requirements/cost-observability.md +1 -1
- package/templates/.agents/requirements/dashboard-launch.md +1 -1
- package/templates/.agents/requirements/data-export.md +1 -1
- package/templates/.agents/requirements/design-system.md +1 -1
- package/templates/.agents/requirements/execution-engine.md +1 -1
- package/templates/.agents/requirements/kanban-dashboard.md +1 -1
- package/templates/.agents/requirements/model-orchestration.md +1 -1
- package/templates/.agents/requirements/public-distribution.md +1 -1
- package/templates/.agents/requirements/software-architecture.md +1 -1
- package/templates/.agents/requirements/strategic-improvements.md +1 -1
- package/templates/.agents/requirements/work-lifecycle.md +1 -1
- package/templates/.agents/requirements/zaip-strategic-95.md +1 -1
- package/templates/.agents/rules/astra-diagnostic.md +1 -1
- package/templates/.agents/runtime/VERSION +1 -1
- package/templates/.agents/runtime/bin/zaip.mjs +627 -177
- package/templates/.agents/runtime/checksums.sha256 +5 -5
- package/templates/.agents/runtime/manifest.json +1 -1
- package/templates/.agents/runtime/provenance.json +4 -4
- package/templates/.agents/runtime/sbom.cdx.json +1 -1
- package/templates/.agents/skills/zaip-skill-execution/SKILL.md +1 -1
- package/templates/.agents/skills/zaip-skill-execution/references/correction-cycle.md +26 -0
- package/templates/.agents/skills/zaip-skill-execution/references/runtime-governance.md +2 -0
- package/templates/.agents/skills/zaip-skill-release-qualification/references/local-preparation.md +31 -1
- package/templates/.agents/skills/zaip-skill-setup/SKILL.md +26 -1
- package/templates/.agents/skills/zaip-skill-task/references/commit-policy.md +8 -1
- package/templates/.agents/zaip-aios/VERSION +1 -1
- package/templates/.agents/zaip-aios/guides/14-troubleshooting.md +52 -1
- 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,
|
|
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
|
|
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
|
|
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
|
|
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
|
-
|
|
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
|
-
|
|
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(
|
|
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(
|
|
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(
|
|
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 =
|
|
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
|
-
|
|
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 (/(?:^|[
|
|
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
|
|
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
|
-
|
|
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]{
|
|
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
|
-
|
|
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
|
-
|
|
756
|
-
|
|
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
|
-
|
|
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
|
|
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,
|
|
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"}
|