@lazyingart/agintiflow 0.20.89 → 0.20.90
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/package.json +1 -1
- package/scripts/smoke-coding-tools.js +14 -0
- package/src/command-policy.js +10 -10
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@lazyingart/agintiflow",
|
|
3
|
-
"version": "0.20.
|
|
3
|
+
"version": "0.20.90",
|
|
4
4
|
"type": "module",
|
|
5
5
|
"description": "Low-cost, project-aware Web and CLI agents with DeepSeek/Venice/OpenAI routing, visible tool calls, durable sessions, scouts, AAPS, SCS, and guarded local execution.",
|
|
6
6
|
"license": "Apache-2.0",
|
|
@@ -288,6 +288,18 @@ try {
|
|
|
288
288
|
);
|
|
289
289
|
assert(readonlyTestEchoPolicy.allowed, "read-only test/echo probe sequence should not require package-install-policy=allow");
|
|
290
290
|
assert(readonlyTestEchoPolicy.category === "read-only", "read-only test/echo probe sequence should be classified as read-only");
|
|
291
|
+
const pdflatexCompilePolicy = evaluateCommandPolicy(
|
|
292
|
+
'cd profile-latex-20260506 && pdflatex -interaction=nonstopmode -halt-on-error main.tex 2>&1; echo "PDFLATEX_EXIT:$?"',
|
|
293
|
+
dockerWorkspaceNoInstallsPolicy
|
|
294
|
+
);
|
|
295
|
+
assert(pdflatexCompilePolicy.allowed, "workspace-local pdflatex compile should be allowed without package installs");
|
|
296
|
+
assert(pdflatexCompilePolicy.category === "toolchain", "workspace-local pdflatex compile should be classified as toolchain");
|
|
297
|
+
const latexmkCompilePolicy = evaluateCommandPolicy(
|
|
298
|
+
'cd profile-latex-20260506 && latexmk -pdf main.tex 2>&1; echo "LATEXMK_EXIT:$?"',
|
|
299
|
+
dockerWorkspaceNoInstallsPolicy
|
|
300
|
+
);
|
|
301
|
+
assert(latexmkCompilePolicy.allowed, "workspace-local latexmk compile should be allowed without package installs");
|
|
302
|
+
assert(latexmkCompilePolicy.category === "toolchain", "workspace-local latexmk compile should be classified as toolchain");
|
|
291
303
|
const curlPolicy = evaluateCommandPolicy("curl -s -o /dev/null -w '%{http_code}' https://github.com/lazyingart/AgInTiFlow.git", dockerWorkspacePolicy);
|
|
292
304
|
assert(curlPolicy.allowed, "curl URL probe with flags should be allowed in docker-workspace allow mode");
|
|
293
305
|
assert(curlPolicy.needsNetwork, "curl URL probe with flags was not classified as network");
|
|
@@ -750,6 +762,8 @@ try {
|
|
|
750
762
|
"command_policy_readonly_probe_sequence_no_installs",
|
|
751
763
|
"command_policy_readonly_version_pipeline_no_installs",
|
|
752
764
|
"command_policy_readonly_test_echo_no_installs",
|
|
765
|
+
"command_policy_pdflatex_compile_no_installs",
|
|
766
|
+
"command_policy_latexmk_compile_no_installs",
|
|
753
767
|
"command_policy_git_clone_network",
|
|
754
768
|
"command_policy_safe_chmod_sequence",
|
|
755
769
|
"command_policy_cd_workspace",
|
package/src/command-policy.js
CHANGED
|
@@ -265,7 +265,7 @@ function classifyGitClone(normalized) {
|
|
|
265
265
|
}
|
|
266
266
|
|
|
267
267
|
function classifySimpleCommand(normalized) {
|
|
268
|
-
const
|
|
268
|
+
const benignRedirectCommand = stripBenignRedirections(normalized);
|
|
269
269
|
if (ALWAYS_BLOCKED_PATTERNS.some((pattern) => pattern.test(normalized))) {
|
|
270
270
|
return { category: "blocked", reason: "Command is blocked because it may expose secrets or publish packages." };
|
|
271
271
|
}
|
|
@@ -318,7 +318,7 @@ function classifySimpleCommand(normalized) {
|
|
|
318
318
|
const gitCloneClassification = classifyGitClone(normalized);
|
|
319
319
|
if (gitCloneClassification) return gitCloneClassification;
|
|
320
320
|
|
|
321
|
-
const unquoted = stripQuotedSegments(
|
|
321
|
+
const unquoted = stripQuotedSegments(benignRedirectCommand);
|
|
322
322
|
const lowered = ` ${unquoted.toLowerCase()} `;
|
|
323
323
|
if (BLOCKED_WRITE_TOKENS.some((part) => lowered.includes(part))) {
|
|
324
324
|
return {
|
|
@@ -337,25 +337,25 @@ function classifySimpleCommand(normalized) {
|
|
|
337
337
|
};
|
|
338
338
|
}
|
|
339
339
|
|
|
340
|
-
if (matchAny(READ_ONLY_PATTERNS,
|
|
340
|
+
if (matchAny(READ_ONLY_PATTERNS, benignRedirectCommand) || isReadOnlyFindCommand(normalized)) {
|
|
341
341
|
return { category: "read-only", needsNetwork: false, writesWorkspace: false };
|
|
342
342
|
}
|
|
343
|
-
if (matchAny(TEST_PATTERNS,
|
|
343
|
+
if (matchAny(TEST_PATTERNS, benignRedirectCommand)) {
|
|
344
344
|
return { category: "test", needsNetwork: false, writesWorkspace: false };
|
|
345
345
|
}
|
|
346
|
-
if (matchAny(TOOLCHAIN_PATTERNS,
|
|
346
|
+
if (matchAny(TOOLCHAIN_PATTERNS, benignRedirectCommand)) {
|
|
347
347
|
return { category: "toolchain", needsNetwork: false, writesWorkspace: true };
|
|
348
348
|
}
|
|
349
|
-
if (matchAny(NETWORK_FETCH_PATTERNS,
|
|
350
|
-
return { category: "network-fetch", needsNetwork: true, writesWorkspace: /(\s-o\s|\s-O\s)/.test(
|
|
349
|
+
if (matchAny(NETWORK_FETCH_PATTERNS, benignRedirectCommand)) {
|
|
350
|
+
return { category: "network-fetch", needsNetwork: true, writesWorkspace: /(\s-o\s|\s-O\s)/.test(benignRedirectCommand) };
|
|
351
351
|
}
|
|
352
|
-
if (matchAny(SYSTEM_PACKAGE_INSTALL_PATTERNS,
|
|
352
|
+
if (matchAny(SYSTEM_PACKAGE_INSTALL_PATTERNS, benignRedirectCommand)) {
|
|
353
353
|
return { category: "system-package-install", needsNetwork: true, writesWorkspace: false, requiresDockerRoot: true };
|
|
354
354
|
}
|
|
355
|
-
if (matchAny(PACKAGE_INSTALL_PATTERNS,
|
|
355
|
+
if (matchAny(PACKAGE_INSTALL_PATTERNS, benignRedirectCommand)) {
|
|
356
356
|
return { category: "package-install", needsNetwork: true, writesWorkspace: true };
|
|
357
357
|
}
|
|
358
|
-
if (matchAny(ENV_SETUP_PATTERNS,
|
|
358
|
+
if (matchAny(ENV_SETUP_PATTERNS, benignRedirectCommand)) {
|
|
359
359
|
return { category: "env-setup", needsNetwork: false, writesWorkspace: true };
|
|
360
360
|
}
|
|
361
361
|
|