@sema-agent/core 7.45.0 → 7.47.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/CHANGELOG.md +298 -1
- package/dist/agents/extra-tool-names.d.ts +65 -0
- package/dist/agents/extra-tool-names.js +124 -0
- package/dist/agents/subagent.d.ts +17 -5
- package/dist/agents/subagent.js +33 -25
- package/dist/agents/tool-filter.d.ts +17 -1
- package/dist/agents/tool-filter.js +7 -0
- package/dist/core/agent-config-dir.d.ts +20 -0
- package/dist/core/agent-config-dir.js +49 -0
- package/dist/core/allow-entry.d.ts +6 -4
- package/dist/core/allow-entry.js +6 -5
- package/dist/core/ask-origin.d.ts +35 -12
- package/dist/core/ask-origin.js +24 -7
- package/dist/core/checkpoint-store.d.ts +39 -2
- package/dist/core/effective-path-target.d.ts +136 -4
- package/dist/core/effective-path-target.js +110 -2
- package/dist/core/engine-notice.d.ts +12 -4
- package/dist/core/gate-fold.js +5 -2
- package/dist/core/gate-lanes.js +11 -4
- package/dist/core/gate-outcome.d.ts +4 -2
- package/dist/core/gate-outcome.js +2 -2
- package/dist/core/governance-codes.d.ts +3 -1
- package/dist/core/governance-codes.js +3 -0
- package/dist/core/hooks.d.ts +3 -0
- package/dist/core/path-rule-binding.d.ts +65 -0
- package/dist/core/path-rule-binding.js +99 -0
- package/dist/core/permission-rule-model.d.ts +59 -24
- package/dist/core/permission-rule-model.js +48 -44
- package/dist/core/permission-rule-provider.d.ts +7 -0
- package/dist/core/permission-rule-provider.js +10 -3
- package/dist/core/permission-rule-store.d.ts +8 -0
- package/dist/core/permission-rule-store.js +6 -2
- package/dist/core/permission-rule-sync.js +2 -2
- package/dist/core/permission-rules.d.ts +26 -45
- package/dist/core/permission-rules.js +77 -57
- package/dist/core/runner/child-tree.d.ts +97 -0
- package/dist/core/runner/child-tree.js +104 -0
- package/dist/core/runner/construction-doors.d.ts +5 -0
- package/dist/core/runner/construction-doors.js +6 -0
- package/dist/core/runner/contracts.d.ts +46 -0
- package/dist/core/runner/gate-exit.d.ts +4 -1
- package/dist/core/runner/gate-exit.js +5 -1
- package/dist/core/runner/permission-rule-lanes.d.ts +34 -25
- package/dist/core/runner/permission-rule-lanes.js +18 -12
- package/dist/core/runner/persisted-path-rows.d.ts +31 -7
- package/dist/core/runner/persisted-path-rows.js +31 -12
- package/dist/core/runner/prepare-ask-lane.d.ts +4 -0
- package/dist/core/runner/prepare-ask-lane.js +4 -2
- package/dist/core/runner/prepare-execution-env.d.ts +5 -2
- package/dist/core/runner/prepare-execution-env.js +10 -3
- package/dist/core/runner/prepare-gate-stations.d.ts +3 -0
- package/dist/core/runner/prepare-gate-stations.js +2 -1
- package/dist/core/runner/prepare-hands-readface.d.ts +8 -4
- package/dist/core/runner/prepare-hands-readface.js +11 -11
- package/dist/core/runner/prepare-inherited-gate.d.ts +8 -1
- package/dist/core/runner/prepare-inherited-gate.js +8 -2
- package/dist/core/runner/prepare-park-ask.d.ts +3 -0
- package/dist/core/runner/prepare-park-ask.js +5 -3
- package/dist/core/runner/prepare-policy-chain.d.ts +14 -2
- package/dist/core/runner/prepare-policy-chain.js +13 -5
- package/dist/core/runner/prepare-suspend-saga.d.ts +10 -0
- package/dist/core/runner/prepare-suspend-saga.js +7 -1
- package/dist/core/runner/prepare-task.js +37 -18
- package/dist/core/runner/prepare-turn-wiring.d.ts +2 -0
- package/dist/core/runner/prepare-turn-wiring.js +2 -1
- package/dist/core/runner/prepare-workspace-restore.d.ts +3 -0
- package/dist/core/runner/prepare-workspace-restore.js +1 -0
- package/dist/core/runner/resume-apply.js +17 -3
- package/dist/core/runner/resume-checkpoint-screen.js +13 -0
- package/dist/core/runner/run-leg.js +5 -1
- package/dist/core/runner/runtask.js +2 -2
- package/dist/core/runner/sub-agent-deny-lists.d.ts +1 -1
- package/dist/core/runner/write-protection-station.d.ts +3 -2
- package/dist/core/runner/write-protection-station.js +1 -0
- package/dist/core/runner-deps.d.ts +14 -0
- package/dist/core/sensitive-path-policy.d.ts +8 -0
- package/dist/core/sensitive-path-policy.js +18 -2
- package/dist/core/shell-wrapper-projection.d.ts +11 -0
- package/dist/core/shell-wrapper-projection.js +56 -0
- package/dist/core/shell-wrapper-table.d.ts +144 -34
- package/dist/core/shell-wrapper-table.js +40 -20
- package/dist/core/synthetic-read-verdict.d.ts +3 -0
- package/dist/core/synthetic-read-verdict.js +3 -1
- package/dist/core/tool-catalog-entries.d.ts +21 -0
- package/dist/core/tool-catalog-entries.js +12 -2
- package/dist/core/tool-face.d.ts +10 -1
- package/dist/core/tool-name-readings.d.ts +8 -0
- package/dist/core/tool-name-readings.js +2 -0
- package/dist/core/tool-policy.d.ts +40 -17
- package/dist/core/tool-policy.js +11 -9
- package/dist/core/tool-registry.d.ts +9 -0
- package/dist/core/tool-registry.js +10 -0
- package/dist/core/tool-spec.d.ts +3 -2
- package/dist/core/write-protect.d.ts +14 -3
- package/dist/core/write-protect.js +41 -10
- package/dist/index.d.ts +6 -4
- package/dist/index.js +5 -3
- package/dist/orchestration/run-spec.js +8 -7
- package/dist/orchestration/workflow.js +1 -1
- package/dist/shell/lex.d.ts +22 -0
- package/dist/shell/lex.js +75 -13
- package/dist/tools/fs/bash-program-position.d.ts +14 -90
- package/dist/tools/fs/bash-program-position.js +41 -74
- package/dist/tools/fs/bash-readonly-classifier.d.ts +17 -444
- package/dist/tools/fs/bash-readonly-classifier.js +169 -1225
- package/dist/tools/fs/index.d.ts +3 -2
- package/dist/tools/fs/program-read-model.d.ts +711 -0
- package/dist/tools/fs/program-read-model.js +1259 -0
- package/dist/tools/fs/program-read-model.rows.d.ts +18 -0
- package/dist/tools/fs/program-read-model.rows.js +624 -0
- package/dist/tools/fs/read-deny-home.d.ts +19 -1
- package/dist/tools/fs/read-deny-home.js +62 -24
- package/dist/tools/fs/read-deny.d.ts +54 -14
- package/dist/tools/fs/read-deny.js +104 -50
- package/dist/tools/fs/removal-targets.d.ts +7 -6
- package/dist/tools/fs/removal-targets.js +34 -24
- package/dist/tools/fs/safety.d.ts +3 -0
- package/dist/tools/fs/safety.js +10 -3
- package/dist/tools/fs/shell-read-argv.d.ts +86 -0
- package/dist/tools/fs/shell-read-argv.js +388 -0
- package/dist/tools/fs/shell-read-bindings.d.ts +300 -0
- package/dist/tools/fs/shell-read-bindings.js +755 -0
- package/dist/tools/fs/shell-read-check.js +23 -15
- package/dist/tools/fs/shell-read-establish.js +82 -8
- package/dist/tools/fs/shell-read-judge.d.ts +11 -1
- package/dist/tools/fs/shell-read-judge.js +9 -1
- package/dist/tools/fs/shell-read-plan.d.ts +33 -8
- package/dist/tools/fs/shell-read-plan.js +309 -407
- package/dist/tools/fs/shell-read-word.d.ts +60 -26
- package/dist/tools/fs/shell-read-word.js +47 -37
- package/dist/tools/fs/shell-read-write-targets.d.ts +15 -64
- package/dist/tools/fs/shell-read-write-targets.js +85 -137
- package/dist/tools/fs/shell-reentry-text.d.ts +136 -6
- package/dist/tools/fs/shell-reentry-text.js +203 -53
- package/dist/tools/monitor.d.ts +3 -3
- package/package.json +1 -1
- package/test/export-surface.snapshot.json +25 -5
- package/wire-changes/core@7.46.0.json +1522 -0
- package/wire-changes/core@7.47.0.json +412 -0
|
@@ -1,8 +1,10 @@
|
|
|
1
1
|
import { persistedReadDenyEntryProblem } from "../../tools/fs/read-deny.js";
|
|
2
|
+
import { isAbsolutePathForm } from "../../tools/fs/safety.js";
|
|
2
3
|
import { isAskOrigin } from "../ask-origin.js";
|
|
3
4
|
import { CHECKPOINT_FEATURES, CheckpointError, checkpointVersionOf, MAX_SUPPORTED_CHECKPOINT_VERSION, realApprovalOrgFact } from "../checkpoint-store.js";
|
|
4
5
|
import { constraintChainDigest, constraintChainEntryOfSuppliedLayer } from "../tool-policy.js";
|
|
5
6
|
import { readFrozenSkillGrants } from "../skill-grant.js";
|
|
7
|
+
import { chainInstallationGaps, chainInstallationRefusal } from "./child-tree.js";
|
|
6
8
|
export function resumeCheckpointScreen(input) {
|
|
7
9
|
const { cp, resumeSignal, internals, runner } = input;
|
|
8
10
|
const { realApproval: realApprovalRow, face: faceRow, f012: f012Row } = CHECKPOINT_FEATURES;
|
|
@@ -49,6 +51,11 @@ export function resumeCheckpointScreen(input) {
|
|
|
49
51
|
}
|
|
50
52
|
if (readFrozenSkillGrants(cp.state.skillGrants) === undefined)
|
|
51
53
|
throw new CheckpointError("checkpoint.invalid_outcome", "this checkpoint carries a skill-grant section (state.skillGrants) that does not read as grant rows under this engine — a damaged section, or a row an earlier release wrote whose entry this release reads as nothing (an entry with a surrounding space, say) — refusing to resume without the grant rows and refusals it carries; the checkpoint stays pending: finish it on a worker of the release that parked it, or expire it", { reason: "skill_grants_damaged" });
|
|
54
|
+
for (const field of ["handsRoot", "handsHome", "handsCwd"]) {
|
|
55
|
+
const coordinate = cp.state[field];
|
|
56
|
+
if (coordinate !== undefined && (typeof coordinate !== "string" || !isAbsolutePathForm(coordinate)))
|
|
57
|
+
throw new CheckpointError("checkpoint.invalid_outcome", `this checkpoint's state.${field} is not an absolute path — refusing to resume a row whose hands' coordinates are damaged (corruption guard), the checkpoint stays pending`, { reason: "hands_coordinates_damaged" });
|
|
58
|
+
}
|
|
52
59
|
}
|
|
53
60
|
if (realApprovalOrgFact(preCasGateBit) !== undefined && runner.deps.permissionRuleStore?.partitions.org !== true) {
|
|
54
61
|
throw new CheckpointError("checkpoint.unsupported_version", `this checkpoint's approval was minted under organization governance (org ${String(realApprovalOrgFact(preCasGateBit))}, routed as ${String(preCasGateBit?.origin)}) and this worker has no org adjudication wiring (its permission-rule store carries no org partition) — a governed approval may only be redeemed where governance can be enforced; the checkpoint stays pending, resume it on an org-wired worker`, { reason: "governed_unwired" });
|
|
@@ -106,6 +113,12 @@ export function resumeCheckpointScreen(input) {
|
|
|
106
113
|
}
|
|
107
114
|
}
|
|
108
115
|
}
|
|
116
|
+
const resupplied = (internals?.inheritedGate?.parentConstraints ?? []).map((pc) => pc.policy);
|
|
117
|
+
if (resupplied.length > 0) {
|
|
118
|
+
const gaps = chainInstallationGaps(resupplied, { live: internals?.inheritedGate?.pathRuleInstallations, seed: cp.state.inheritedGate?.pathRuleInstallations }, (p) => p);
|
|
119
|
+
if (gaps.length > 0)
|
|
120
|
+
throw chainInstallationRefusal(gaps, true);
|
|
121
|
+
}
|
|
109
122
|
const resumeInternals = internals?.inheritedGate?.parentConstraints !== undefined
|
|
110
123
|
? {
|
|
111
124
|
...internals,
|
|
@@ -614,7 +614,8 @@ async function resolvePendingCall(runner, prepared, resume, emit, emitCommitted,
|
|
|
614
614
|
}
|
|
615
615
|
const executedArgs = humanRewrite !== undefined ? resolvedArgs : screened !== undefined ? screened.args : resolvedArgs;
|
|
616
616
|
const unseen = !deepJsonEqual(executedArgs, pendingAction.args);
|
|
617
|
-
|
|
617
|
+
let beltReading;
|
|
618
|
+
const beltReq = () => ({ toolName: pendingAction.toolName, args: executedArgs, toolCallId: pendingAction.toolCallId, ...callFaceSeat(parkedRowLiveFace(prepared.toolRosterDeltas.current, pendingAction)), budget: beltBudget, ...(prepared.cwdRef !== undefined ? { cwd: prepared.cwdRef.current } : {}), ...(prepared.handsRoot !== undefined ? { root: prepared.handsRoot } : {}), ...advertisedWritableRootsSeat(prepared.advertisedWritableDirs), ...(beltReading !== undefined ? { targetReading: beltReading } : {}) });
|
|
618
619
|
const unjudgeable = unseen ? chainCannotJudge(resume.cp.state.inheritedGate) : undefined;
|
|
619
620
|
if (unjudgeable !== undefined) {
|
|
620
621
|
const chainDenial = formatHookFeedback(`The approved tool call "${pendingAction.toolName}" was not executed: its input changed after the approval and the inherited ancestor chain cannot judge the changed input (${unjudgeable}). This approval is spent — the call has to be re-issued.`, prepared.reminderMark);
|
|
@@ -627,6 +628,9 @@ async function resolvePendingCall(runner, prepared, resume, emit, emitCommitted,
|
|
|
627
628
|
resourceSpentMicroUsd: prepared.resourceLedger?.spentMicroUsd ?? 0,
|
|
628
629
|
suspendCount: resume.cp.suspendCount ?? 0,
|
|
629
630
|
};
|
|
631
|
+
const beltStamped = prepared.stampCallTarget?.(beltReq(), prepared.abortController.signal);
|
|
632
|
+
if (beltStamped !== undefined)
|
|
633
|
+
beltReading = (await beltStamped).targetReading;
|
|
630
634
|
if (unseen && prepared.basePolicyForResumeEdit) {
|
|
631
635
|
const rechecked = refuseOutOfContractDecision(await prepared.basePolicyForResumeEdit.check(beltReq(), prepared.abortController.signal));
|
|
632
636
|
const personUnanswered = policyCannotAnswer(rechecked, outcome.hostDecision.decidedBy);
|
|
@@ -45,7 +45,7 @@ import { streamLifecycleVerbs } from "./stream-lifecycle-verbs.js";
|
|
|
45
45
|
import { streamHaltVerbs } from "./stream-halt-verbs.js";
|
|
46
46
|
import { streamModeVerb } from "./stream-mode-verb.js";
|
|
47
47
|
import { runNotificationLane } from "./run-notification-lane.js";
|
|
48
|
-
import {
|
|
48
|
+
import { assertRunnerDepsDoors } from "./construction-doors.js";
|
|
49
49
|
import { runLeg } from "./run-leg.js";
|
|
50
50
|
import { runTerminalAdoption } from "./run-terminal-adoption.js";
|
|
51
51
|
import { runSettleAndTeardown } from "./run-settle-and-teardown.js";
|
|
@@ -77,7 +77,7 @@ export class Runner {
|
|
|
77
77
|
static PARENT_CONSTRAINT_REGISTRY_CAP = 1024;
|
|
78
78
|
depsSeat;
|
|
79
79
|
constructor(deps) {
|
|
80
|
-
|
|
80
|
+
assertRunnerDepsDoors(deps);
|
|
81
81
|
const runner = this;
|
|
82
82
|
this.depsSeat = { get deps() { return runner.deps; } };
|
|
83
83
|
this.deps = withDeploymentAllowedTools(deps);
|
|
@@ -3,7 +3,7 @@
|
|
|
3
3
|
* list a deployment writes — the task's own definitions (`TaskSpec.agents`), the definitions a mounted delegation tool carries
|
|
4
4
|
* (the `authored` faces — the engine's built-ins name tools of other vocabularies and are not judged) and its tool-level list.
|
|
5
5
|
* Universe = the task's assembled roster plus every mounted delegation tool's pool, names and aliases; a pool the engine cannot
|
|
6
|
-
* list (an `extraTools` factory) turns the refusals that need a roster into host notices. A tool's own lists are judged where
|
|
6
|
+
* list (an `extraTools` factory with no declared roster) turns the refusals that need a roster into host notices. A tool's own lists are judged where
|
|
7
7
|
* the tool is mounted: only a tool a deployment mounted (depth 0) publishes them (`authored`, `agentToolLevelAllowTools`, `agentToolLevelDenyTools`), the
|
|
8
8
|
* engine's nested copy for a delegated child carries neither.
|
|
9
9
|
*
|
|
@@ -33,8 +33,9 @@ export interface LegWriteProtection extends WriteProtectionMount {
|
|
|
33
33
|
export declare function mountWriteProtection(input: {
|
|
34
34
|
/** borrowed-readonly — the deployment seats: the table (`writeProtectedPaths`; absent ⇒ the default
|
|
35
35
|
* table, `[]` ⇒ opted out), the data root the memory library is materialized under
|
|
36
|
-
* (`memoryEngineDir`; absent ⇒ the resolver's env/default chain)
|
|
37
|
-
|
|
36
|
+
* (`memoryEngineDir`; absent ⇒ the resolver's env/default chain), the configuration root the host
|
|
37
|
+
* declared (`agentConfigDir`) and the operator sink. */
|
|
38
|
+
deps: Pick<RunnerDeps, "writeProtectedPaths" | "memoryEngineDir" | "agentConfigDir" | "onNotice">;
|
|
38
39
|
/** The HANDS' environment, or `undefined` with no hands — the driver's own predicate, not a second
|
|
39
40
|
* reading of the env seats, so the judge sees exactly the environment the write tools do. */
|
|
40
41
|
env: ExecutionEnv | undefined;
|
|
@@ -6,6 +6,7 @@ export function mountWriteProtection(input) {
|
|
|
6
6
|
const announced = new Set();
|
|
7
7
|
const matcher = compileWriteProtection(input.deps.writeProtectedPaths, {
|
|
8
8
|
...(input.deps.memoryEngineDir !== undefined ? { dataRoot: input.deps.memoryEngineDir } : {}),
|
|
9
|
+
...(input.deps.agentConfigDir !== undefined ? { agentConfigDir: input.deps.agentConfigDir } : {}),
|
|
9
10
|
...(input.env !== undefined ? { env: input.env } : {}),
|
|
10
11
|
rootPath: input.rootPath,
|
|
11
12
|
onViewAbsent: (absence) => {
|
|
@@ -227,6 +227,20 @@ export interface RunnerDeps {
|
|
|
227
227
|
* ignored). Same deployment-only seat, clamp argument and checkpoint posture as the tiers key.
|
|
228
228
|
*/
|
|
229
229
|
readDenyBuiltinExclude?: readonly string[];
|
|
230
|
+
/**
|
|
231
|
+
* Where the host keeps the agent's configuration directory when it is not `<home>/.sema` — an ABSOLUTE path of an
|
|
232
|
+
* existing directory, resolved by the host (the engine reads no environment variable for it). The rows of the
|
|
233
|
+
* `agent-config` tier that name that directory (`~/.sema/settings.json`, `~/.sema/settings.local.json`,
|
|
234
|
+
* `~/.sema/engine-data/.env`, `~/.sema/config-lkg-*.json`) are then ALSO placed at the same files below this root, so the model can neither read
|
|
235
|
+
* nor (through the write-protection table and a wired `createSensitivePathPolicy({ agentConfigDir })`) rewrite the
|
|
236
|
+
* relocated settings; the default `~/.sema` location stays refused. Rows of the home's dotted family (`~/.sema.*`)
|
|
237
|
+
* and the external tools' files are not part of the directory and stay anchored at the home. A symlink the root is
|
|
238
|
+
* reached through is followed (the target is guarded too). ABSENT = today's behaviour, the literal `~/.sema` under
|
|
239
|
+
* the declared and account homes. A value that is not a string, is empty or relative, or names no existing directory
|
|
240
|
+
* refuses `new Runner` with `config.agent_config_dir_invalid` — never read as absent. DEPLOYMENT seat only (no
|
|
241
|
+
* TaskSpec twin) and fixed at construction: `swapDeps` does not carry it.
|
|
242
|
+
*/
|
|
243
|
+
agentConfigDir?: string;
|
|
230
244
|
/**
|
|
231
245
|
* backlog #286 (#279 — CC 2.1.233 `DANGEROUS_FILES`/`DANGEROUS_DIRECTORIES`/
|
|
232
246
|
* `DANGEROUS_DIRECTORY_PATHS` parity): the WRITE-protection table. DEFAULT-ON: a path-confinable
|
|
@@ -155,6 +155,14 @@ export declare function createSensitivePathPolicy(opts: {
|
|
|
155
155
|
* gate and the transcript gate keep speaking about the same directory.
|
|
156
156
|
*/
|
|
157
157
|
dataRoot?: string;
|
|
158
|
+
/**
|
|
159
|
+
* The host's configuration root when it keeps the agent's configuration directory somewhere other than the home's
|
|
160
|
+
* `.sema` — the same absolute directory it hands the Runner (`RunnerDeps.agentConfigDir`). Every pattern that opens with
|
|
161
|
+
* the `.sema` segment (`.sema/settings.json`, `.sema/hooks`, …) then also guards the same tail below this root; the
|
|
162
|
+
* patterns themselves keep guarding every `.sema` anywhere. Absent ⇒ the list is judged as it stands. A value that is not
|
|
163
|
+
* the absolute path of an existing directory throws (`config.agent_config_dir_invalid`).
|
|
164
|
+
*/
|
|
165
|
+
agentConfigDir?: string;
|
|
158
166
|
/** Override the guarded tool set (default: `Write`, `Edit`, `MultiEdit`-legacy → Edit, `NotebookEdit`). */
|
|
159
167
|
tools?: string[];
|
|
160
168
|
}): ToolPolicy;
|
|
@@ -2,6 +2,7 @@ import { homedir } from "node:os";
|
|
|
2
2
|
import { isAbsolute, join, resolve } from "node:path";
|
|
3
3
|
import { canonicalizeTarget, expandHomeTilde, isAbsoluteForFamily, isWinFormPath, pathFamilyOf, writeTargetPath } from "../tools/fs/safety.js";
|
|
4
4
|
import { compileSegmentPattern, matchSegmentPatterns, READ_FACE_BUILTIN_DENY_TABLE, readDenyPatternRun } from "../tools/fs/read-deny.js";
|
|
5
|
+
import { agentConfigDirSegments, agentConfigDirTail, checkedAgentConfigDir } from "./agent-config-dir.js";
|
|
5
6
|
import { isProtectedWrite, protectivePathTargetOf } from "./tool-registry.js";
|
|
6
7
|
import { pathTargetBaseOf } from "./effective-path-target.js";
|
|
7
8
|
import { symlinkChainHops } from "./path-identity.js";
|
|
@@ -32,6 +33,7 @@ export const RECOMMENDED_SENSITIVE_PATTERNS = [
|
|
|
32
33
|
".mcp.json",
|
|
33
34
|
".ai-agent/.env",
|
|
34
35
|
".sema/engine-data/.env",
|
|
36
|
+
".sema/config-lkg-*.json",
|
|
35
37
|
".codex/config.toml",
|
|
36
38
|
".cursor/mcp.json",
|
|
37
39
|
".continue/config.json",
|
|
@@ -115,6 +117,19 @@ function matchSensitive(canonicalKey, compiled, aliasResolved) {
|
|
|
115
117
|
}
|
|
116
118
|
export function createSensitivePathPolicy(opts) {
|
|
117
119
|
const compiled = compilePatterns(opts.patterns);
|
|
120
|
+
const configRoot = checkedAgentConfigDir(opts.agentConfigDir, "createSensitivePathPolicy agentConfigDir");
|
|
121
|
+
const configRows = configRoot === undefined ? [] : opts.patterns.flatMap((raw) => {
|
|
122
|
+
const tail = agentConfigDirTail(raw, !CASE_INSENSITIVE_FS);
|
|
123
|
+
return tail === undefined ? [] : [{ raw, tail }];
|
|
124
|
+
});
|
|
125
|
+
const configTwins = async (signal) => {
|
|
126
|
+
if (configRoot === undefined || configRows.length === 0)
|
|
127
|
+
return [];
|
|
128
|
+
const fold = CASE_INSENSITIVE_FS ? "ascii" : "none";
|
|
129
|
+
const lower = (segs) => (CASE_INSENSITIVE_FS ? segs.map((seg) => seg.replace(/[A-Z]/g, (c) => c.toLowerCase())) : segs);
|
|
130
|
+
const anchors = [configRoot, ...(await canonicalDataRootKeys(opts.env, [configRoot], signal))].map((root) => lower(agentConfigDirSegments(root)));
|
|
131
|
+
return configRows.map(({ raw, tail }) => ({ ...(compileSegmentPattern(tail, fold) ?? { raw, segments: [], foldAscii: CASE_INSENSITIVE_FS }), raw, anchors, rootedOnly: true }));
|
|
132
|
+
};
|
|
118
133
|
const dataRootPaths = dataRootSpellings(opts.dataRoot);
|
|
119
134
|
const guardedByName = opts.tools !== undefined ? new Set(opts.tools) : undefined;
|
|
120
135
|
const family = (cwd) => pathFamilyOf({ root: opts.rootPath, cwd: cwd ?? opts.env.cwd });
|
|
@@ -130,12 +145,13 @@ export function createSensitivePathPolicy(opts) {
|
|
|
130
145
|
}
|
|
131
146
|
if (relative === "")
|
|
132
147
|
return { kind: "clear" };
|
|
133
|
-
const
|
|
148
|
+
const twins = await configTwins(signal);
|
|
149
|
+
const hit = matchSensitive(relative ?? canon.key, [...compiled, ...twins], canon.aliasResolved === true);
|
|
134
150
|
if (hit)
|
|
135
151
|
return { kind: "hit", pattern: hit, via: "target" };
|
|
136
152
|
if (relative === null) {
|
|
137
153
|
for (const hop of await symlinkChainHops(opts.env, path, signal, fam, base)) {
|
|
138
|
-
const viaHop = matchSensitive(hop, compiled, false);
|
|
154
|
+
const viaHop = matchSensitive(hop, [...compiled, ...twins], false);
|
|
139
155
|
if (viaHop)
|
|
140
156
|
return { kind: "hit", pattern: viaHop, via: "chain" };
|
|
141
157
|
}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import type { ShellWrapperRow } from "./shell-wrapper-table.js";
|
|
2
|
+
/**
|
|
3
|
+
* The PROJECTION {@link import("./shell-wrapper-table.js").SHELL_WRAPPER_TABLE} is: the second lexer's view of the program read model's rows (`program-read-model.ts`
|
|
4
|
+
* — one table of program facts, read through the binary gate). A launcher row's options by arity (a value word, a
|
|
5
|
+
* switch or an attached-only value, a command string), its required operand (a duration, or the spelling it must have),
|
|
6
|
+
* its bare-dash switch and its `NAME=value` operands; a row that runs its operands, or a code body, as shell input
|
|
7
|
+
* (`viaShell`); an option that runs a command (`executes`). The table is this projection written out (its
|
|
8
|
+
* literal type is the export's), and `test/shell-wrapper-table-projection.test.ts` pins it equal — a launcher fact is
|
|
9
|
+
* edited in its row, never here.
|
|
10
|
+
*/
|
|
11
|
+
export declare function shellWrapperProjection(): Record<string, ShellWrapperRow>;
|
|
@@ -0,0 +1,56 @@
|
|
|
1
|
+
import { programRows } from "../tools/fs/program-read-model.js";
|
|
2
|
+
import { DURATION_SPELLING } from "../tools/fs/program-read-model.rows.js";
|
|
3
|
+
export function shellWrapperProjection() {
|
|
4
|
+
const out = {};
|
|
5
|
+
for (const row of programRows()) {
|
|
6
|
+
const projected = projectRow(row);
|
|
7
|
+
if (projected !== undefined)
|
|
8
|
+
out[row.key] = projected;
|
|
9
|
+
}
|
|
10
|
+
return out;
|
|
11
|
+
}
|
|
12
|
+
function spellings(row) {
|
|
13
|
+
const out = new Map();
|
|
14
|
+
for (const g of row.grammars) {
|
|
15
|
+
const add = (spelling, spec) => {
|
|
16
|
+
const e = out.get(spelling) ?? { spec, arities: new Set() };
|
|
17
|
+
e.arities.add(spec.arity);
|
|
18
|
+
out.set(spelling, e);
|
|
19
|
+
};
|
|
20
|
+
for (const [l, spec] of Object.entries(g.short))
|
|
21
|
+
add(`-${l}`, spec);
|
|
22
|
+
for (const [n, spec] of Object.entries(g.long))
|
|
23
|
+
add(`--${n}`, spec);
|
|
24
|
+
for (const [n, spec] of Object.entries(g.dashWords ?? {}))
|
|
25
|
+
add(`-${n}`, spec);
|
|
26
|
+
}
|
|
27
|
+
return [...out].map(([spelling, e]) => ({ spelling, spec: e.spec, arity: e.arities.size === 1 ? [...e.arities][0] : "disputed" }));
|
|
28
|
+
}
|
|
29
|
+
const runsCommand = (spec) => spec.effect === "executes" || spec.value?.kind === "shell-text" || spec.value?.kind === "command";
|
|
30
|
+
function projectRow(row) {
|
|
31
|
+
const sorted = (xs) => [...new Set(xs)].sort();
|
|
32
|
+
const all = spellings(row);
|
|
33
|
+
const viaShell = row.reentry?.kind === "shell" || row.launcher?.shellText !== undefined || row.body === "first-operand" || row.body === "assignment-values" || (row.operands?.rest?.kind === "program-text" && row.operands.rest.language === "arithmetic");
|
|
34
|
+
if (row.launcher === undefined) {
|
|
35
|
+
if (viaShell)
|
|
36
|
+
return { valueFlags: [], flags: [], commandString: [], viaShell: true };
|
|
37
|
+
const executes = sorted(all.filter((o) => runsCommand(o.spec)).map((o) => o.spelling));
|
|
38
|
+
return executes.length > 0 ? { valueFlags: [], flags: [], commandString: [], executes } : undefined;
|
|
39
|
+
}
|
|
40
|
+
const commandString = sorted(all.filter((o) => o.spec.value?.kind === "shell-text").map((o) => o.spelling));
|
|
41
|
+
const values = all.filter((o) => o.spec.value?.kind !== "shell-text");
|
|
42
|
+
const attached = sorted(values.filter((o) => o.arity === "attached" && !o.spelling.startsWith("--")).map((o) => o.spelling));
|
|
43
|
+
const required = row.launcher.requiredOperands ?? 0;
|
|
44
|
+
const duration = required > 0 && row.launcher.requiredOperandSpelling === DURATION_SPELLING;
|
|
45
|
+
return {
|
|
46
|
+
valueFlags: sorted(values.filter((o) => o.arity === 1).map((o) => o.spelling)),
|
|
47
|
+
flags: sorted(values.filter((o) => o.arity === 0 || (o.arity === "attached" && o.spelling.startsWith("--"))).map((o) => o.spelling)),
|
|
48
|
+
...(attached.length > 0 ? { attached } : {}),
|
|
49
|
+
commandString,
|
|
50
|
+
...(required > 0 && !duration ? { positional: row.launcher.requiredOperandSpelling ?? /^/ } : {}),
|
|
51
|
+
...(duration ? { duration: true } : {}),
|
|
52
|
+
...(row.launcher.bareDash === true ? { bareDash: true } : {}),
|
|
53
|
+
...(row.launcher.assignmentOperands === true ? { assignments: true } : {}),
|
|
54
|
+
...(viaShell ? { viaShell: true } : {}),
|
|
55
|
+
};
|
|
56
|
+
}
|
|
@@ -11,7 +11,10 @@
|
|
|
11
11
|
* caller asks a person) instead of guessing its arity, because a wrong guess names the option's VALUE
|
|
12
12
|
* or an operand as the program — a phantom run no deny matches. Three adversarial rounds found exactly
|
|
13
13
|
* that shape behind every "unknown is value-less" reading; the closed sets end the family rather than
|
|
14
|
-
* the instance.
|
|
14
|
+
* the instance. The table is the PROJECTION of the program read model's rows
|
|
15
|
+
* ({@link import("./shell-wrapper-projection.js").shellWrapperProjection}) written
|
|
16
|
+
* out with its literal type: a launcher fact is edited in its row (one table of program facts, read by the binary gate
|
|
17
|
+
* and by the read station alike), and `test/shell-wrapper-table-projection.test.ts` keeps the two equal.
|
|
15
18
|
*
|
|
16
19
|
* Per row: `valueFlags` — options whose value is the NEXT word (`-u root`; the attached `-uroot` and
|
|
17
20
|
* `--user=root` spellings are one word and need no row); `flags` — value-less options, including those
|
|
@@ -56,26 +59,26 @@ export declare const SHELL_WRAPPER_TABLE: {
|
|
|
56
59
|
readonly commandString: readonly [];
|
|
57
60
|
};
|
|
58
61
|
readonly env: {
|
|
59
|
-
readonly valueFlags: readonly ["
|
|
60
|
-
readonly flags: readonly ["
|
|
61
|
-
readonly commandString: readonly ["-
|
|
62
|
+
readonly valueFlags: readonly ["--argv0", "--chdir", "--unset", "-C", "-P", "-a", "-u"];
|
|
63
|
+
readonly flags: readonly ["--debug", "--default-signal", "--help", "--ignore-environment", "--ignore-signal", "--list-signal-handling", "--version", "-i", "-v"];
|
|
64
|
+
readonly commandString: readonly ["--split-string", "-S"];
|
|
62
65
|
readonly bareDash: true;
|
|
63
66
|
readonly assignments: true;
|
|
64
67
|
};
|
|
65
68
|
readonly sudo: {
|
|
66
|
-
readonly valueFlags: readonly ["-
|
|
67
|
-
readonly flags: readonly ["
|
|
69
|
+
readonly valueFlags: readonly ["--auth-type", "--chdir", "--chroot", "--close-from", "--command-timeout", "--group", "--host", "--other-user", "--prompt", "--role", "--type", "--user", "-C", "-D", "-R", "-T", "-U", "-a", "-g", "-h", "-p", "-r", "-t", "-u"];
|
|
70
|
+
readonly flags: readonly ["--askpass", "--background", "--bell", "--help", "--list", "--login", "--non-interactive", "--preserve-env", "--preserve-groups", "--remove-timestamp", "--reset-timestamp", "--set-home", "--shell", "--stdin", "--validate", "--version", "-A", "-E", "-H", "-K", "-P", "-S", "-V", "-b", "-i", "-k", "-l", "-n", "-s", "-v"];
|
|
68
71
|
readonly commandString: readonly [];
|
|
69
72
|
readonly assignments: true;
|
|
70
73
|
};
|
|
71
74
|
readonly doas: {
|
|
72
|
-
readonly valueFlags: readonly ["-
|
|
75
|
+
readonly valueFlags: readonly ["-C", "-a", "-u"];
|
|
73
76
|
readonly flags: readonly ["-L", "-n", "-s"];
|
|
74
77
|
readonly commandString: readonly [];
|
|
75
78
|
};
|
|
76
79
|
readonly pkexec: {
|
|
77
80
|
readonly valueFlags: readonly ["--user"];
|
|
78
|
-
readonly flags: readonly ["--disable-internal-agent", "--
|
|
81
|
+
readonly flags: readonly ["--disable-internal-agent", "--help", "--keep-cwd", "--version"];
|
|
79
82
|
readonly commandString: readonly [];
|
|
80
83
|
};
|
|
81
84
|
readonly nohup: {
|
|
@@ -84,29 +87,29 @@ export declare const SHELL_WRAPPER_TABLE: {
|
|
|
84
87
|
readonly commandString: readonly [];
|
|
85
88
|
};
|
|
86
89
|
readonly time: {
|
|
87
|
-
readonly valueFlags: readonly ["
|
|
88
|
-
readonly flags: readonly ["
|
|
90
|
+
readonly valueFlags: readonly ["--format", "--output", "-f", "-o"];
|
|
91
|
+
readonly flags: readonly ["--append", "--help", "--portability", "--quiet", "--verbose", "--version", "-a", "-p", "-q", "-v"];
|
|
89
92
|
readonly commandString: readonly [];
|
|
90
93
|
};
|
|
91
94
|
readonly nice: {
|
|
92
|
-
readonly valueFlags: readonly ["
|
|
95
|
+
readonly valueFlags: readonly ["--adjustment", "-n"];
|
|
93
96
|
readonly flags: readonly ["--help", "--version"];
|
|
94
97
|
readonly commandString: readonly [];
|
|
95
98
|
};
|
|
96
99
|
readonly timeout: {
|
|
97
|
-
readonly valueFlags: readonly ["-
|
|
98
|
-
readonly flags: readonly ["
|
|
100
|
+
readonly valueFlags: readonly ["--kill-after", "--signal", "-k", "-s"];
|
|
101
|
+
readonly flags: readonly ["--foreground", "--help", "--preserve-status", "--verbose", "--version", "-v"];
|
|
99
102
|
readonly commandString: readonly [];
|
|
100
103
|
readonly duration: true;
|
|
101
104
|
};
|
|
102
105
|
readonly stdbuf: {
|
|
103
|
-
readonly valueFlags: readonly ["
|
|
106
|
+
readonly valueFlags: readonly ["--error", "--input", "--output", "-e", "-i", "-o"];
|
|
104
107
|
readonly flags: readonly ["--help", "--version"];
|
|
105
108
|
readonly commandString: readonly [];
|
|
106
109
|
};
|
|
107
110
|
readonly xargs: {
|
|
108
|
-
readonly valueFlags: readonly ["-
|
|
109
|
-
readonly flags: readonly ["
|
|
111
|
+
readonly valueFlags: readonly ["--arg-file", "--delimiter", "--max-args", "--max-chars", "--max-procs", "--process-slot-var", "-E", "-I", "-L", "-P", "-a", "-d", "-n", "-s"];
|
|
112
|
+
readonly flags: readonly ["--eof", "--exit", "--help", "--interactive", "--max-lines", "--no-run-if-empty", "--null", "--open-tty", "--replace", "--show-limits", "--verbose", "--version", "-0", "-o", "-p", "-r", "-t", "-x"];
|
|
110
113
|
readonly attached: readonly ["-i", "-l"];
|
|
111
114
|
readonly commandString: readonly [];
|
|
112
115
|
};
|
|
@@ -117,57 +120,58 @@ export declare const SHELL_WRAPPER_TABLE: {
|
|
|
117
120
|
readonly viaShell: true;
|
|
118
121
|
};
|
|
119
122
|
readonly ionice: {
|
|
120
|
-
readonly valueFlags: readonly ["
|
|
121
|
-
readonly flags: readonly ["
|
|
123
|
+
readonly valueFlags: readonly ["--class", "--classdata", "--pgid", "--pid", "--uid", "-P", "-c", "-n", "-p", "-u"];
|
|
124
|
+
readonly flags: readonly ["--help", "--ignore", "--version", "-V", "-h", "-t"];
|
|
122
125
|
readonly commandString: readonly [];
|
|
123
126
|
};
|
|
124
127
|
readonly setsid: {
|
|
125
128
|
readonly valueFlags: readonly [];
|
|
126
|
-
readonly flags: readonly ["
|
|
129
|
+
readonly flags: readonly ["--ctty", "--fork", "--help", "--version", "--wait", "-c", "-f", "-w"];
|
|
127
130
|
readonly commandString: readonly [];
|
|
128
131
|
};
|
|
129
132
|
readonly taskset: {
|
|
130
133
|
readonly valueFlags: readonly [];
|
|
131
|
-
readonly flags: readonly ["-
|
|
134
|
+
readonly flags: readonly ["--all-tasks", "--cpu-list", "--help", "--pid", "--version", "-a", "-c", "-p"];
|
|
132
135
|
readonly commandString: readonly [];
|
|
133
136
|
readonly positional: RegExp;
|
|
134
137
|
};
|
|
135
138
|
readonly chrt: {
|
|
136
|
-
readonly valueFlags: readonly ["
|
|
137
|
-
readonly flags: readonly ["-
|
|
139
|
+
readonly valueFlags: readonly ["--pid", "--sched-deadline", "--sched-period", "--sched-runtime", "-D", "-P", "-T", "-p"];
|
|
140
|
+
readonly flags: readonly ["--all-tasks", "--batch", "--deadline", "--fifo", "--help", "--idle", "--max", "--other", "--reset-on-fork", "--rr", "--verbose", "--version", "-R", "-a", "-b", "-d", "-f", "-i", "-m", "-o", "-r", "-v"];
|
|
138
141
|
readonly commandString: readonly [];
|
|
139
142
|
readonly positional: RegExp;
|
|
140
143
|
};
|
|
141
144
|
readonly strace: {
|
|
142
|
-
readonly valueFlags: readonly ["
|
|
143
|
-
readonly flags: readonly ["
|
|
145
|
+
readonly valueFlags: readonly ["--attach", "--columns", "--const-print-style", "--detach-on", "--env", "--expr", "--interruptible", "--output", "--string-limit", "--summary-columns", "--summary-sort-by", "--summary-syscall-overhead", "--trace", "--trace-path", "--user", "-E", "-I", "-O", "-P", "-S", "-U", "-X", "-a", "-b", "-e", "-o", "-p", "-s", "-u"];
|
|
146
|
+
readonly flags: readonly ["--debug", "--follow-forks", "--help", "--summary", "--summary-only", "--version", "-C", "-D", "-F", "-T", "-V", "-Z", "-c", "-d", "-f", "-h", "-i", "-k", "-q", "-r", "-t", "-v", "-w", "-x", "-y", "-z"];
|
|
144
147
|
readonly commandString: readonly [];
|
|
145
148
|
};
|
|
146
149
|
readonly ltrace: {
|
|
147
|
-
readonly valueFlags: readonly ["
|
|
148
|
-
readonly flags: readonly ["
|
|
150
|
+
readonly valueFlags: readonly ["--align", "--config", "--debug", "--indent", "--library", "--output", "--string-max", "--where", "-A", "-D", "-F", "-a", "-e", "-l", "-n", "-o", "-p", "-s", "-u", "-w", "-x"];
|
|
151
|
+
readonly flags: readonly ["--demangle", "--help", "--version", "-C", "-L", "-S", "-T", "-V", "-c", "-f", "-i", "-r", "-t"];
|
|
149
152
|
readonly commandString: readonly [];
|
|
150
153
|
};
|
|
151
154
|
readonly flock: {
|
|
152
|
-
readonly valueFlags: readonly ["-
|
|
153
|
-
readonly flags: readonly ["
|
|
154
|
-
readonly commandString: readonly ["
|
|
155
|
+
readonly valueFlags: readonly ["--conflict-exit-code", "--timeout", "--wait", "-E", "-w"];
|
|
156
|
+
readonly flags: readonly ["--close", "--exclusive", "--help", "--nb", "--no-fork", "--nonblock", "--shared", "--unlock", "--verbose", "--version", "-F", "-n", "-o", "-s", "-u", "-x"];
|
|
157
|
+
readonly commandString: readonly ["--command", "-c"];
|
|
155
158
|
readonly positional: RegExp;
|
|
156
159
|
};
|
|
157
160
|
readonly script: {
|
|
158
161
|
readonly valueFlags: readonly [];
|
|
159
162
|
readonly flags: readonly [];
|
|
160
|
-
readonly commandString: readonly ["
|
|
163
|
+
readonly commandString: readonly ["--command", "-c"];
|
|
161
164
|
readonly viaShell: true;
|
|
162
165
|
};
|
|
163
166
|
readonly unshare: {
|
|
164
|
-
readonly valueFlags: readonly ["
|
|
165
|
-
readonly flags: readonly ["
|
|
167
|
+
readonly valueFlags: readonly ["--boottime", "--map-group", "--map-user", "--monotonic", "--propagation", "--root", "--setgid", "--setgroups", "--setuid", "--wd", "-G", "-R", "-S", "-w"];
|
|
168
|
+
readonly flags: readonly ["--cgroup", "--fork", "--help", "--ipc", "--keep-caps", "--kill-child", "--map-current-user", "--map-root-user", "--mount", "--mount-proc", "--net", "--pid", "--time", "--user", "--uts", "--version", "-C", "-T", "-U", "-c", "-f", "-i", "-m", "-n", "-p", "-r", "-u"];
|
|
166
169
|
readonly commandString: readonly [];
|
|
167
170
|
};
|
|
168
171
|
readonly nsenter: {
|
|
169
|
-
readonly valueFlags: readonly ["
|
|
170
|
-
readonly flags: readonly ["
|
|
172
|
+
readonly valueFlags: readonly ["--setgid", "--setuid", "--target", "-G", "-S", "-t"];
|
|
173
|
+
readonly flags: readonly ["--all", "--cgroup", "--help", "--ipc", "--mount", "--net", "--no-fork", "--pid", "--preserve-credentials", "--root", "--time", "--user", "--uts", "--version", "--wd", "-C", "-F", "-T", "-U", "-Z", "-a", "-i", "-m", "-n", "-p", "-u"];
|
|
174
|
+
readonly attached: readonly ["-r", "-w"];
|
|
171
175
|
readonly commandString: readonly [];
|
|
172
176
|
};
|
|
173
177
|
readonly eval: {
|
|
@@ -266,6 +270,112 @@ export declare const SHELL_WRAPPER_TABLE: {
|
|
|
266
270
|
readonly commandString: readonly [];
|
|
267
271
|
readonly executes: readonly ["-C", "-F"];
|
|
268
272
|
};
|
|
273
|
+
readonly busybox: {
|
|
274
|
+
readonly valueFlags: readonly [];
|
|
275
|
+
readonly flags: readonly [];
|
|
276
|
+
readonly commandString: readonly [];
|
|
277
|
+
};
|
|
278
|
+
readonly su: {
|
|
279
|
+
readonly valueFlags: readonly ["--group", "--shell", "--supp-group", "--whitelist-environment", "-G", "-g", "-s", "-w"];
|
|
280
|
+
readonly flags: readonly ["--fast", "--help", "--login", "--no-pty", "--preserve-environment", "--pty", "--version", "-P", "-T", "-V", "-f", "-h", "-l", "-m", "-p"];
|
|
281
|
+
readonly commandString: readonly ["--command", "--session-command", "-c"];
|
|
282
|
+
readonly viaShell: true;
|
|
283
|
+
};
|
|
284
|
+
readonly runuser: {
|
|
285
|
+
readonly valueFlags: readonly ["--group", "--shell", "--supp-group", "--user", "--whitelist-environment", "-G", "-g", "-s", "-u", "-w"];
|
|
286
|
+
readonly flags: readonly ["--fast", "--help", "--login", "--no-pty", "--preserve-environment", "--pty", "--version", "-P", "-T", "-V", "-f", "-h", "-l", "-m", "-p"];
|
|
287
|
+
readonly commandString: readonly ["--command", "--session-command", "-c"];
|
|
288
|
+
readonly viaShell: true;
|
|
289
|
+
};
|
|
290
|
+
readonly chroot: {
|
|
291
|
+
readonly valueFlags: readonly [];
|
|
292
|
+
readonly flags: readonly [];
|
|
293
|
+
readonly commandString: readonly [];
|
|
294
|
+
readonly positional: RegExp;
|
|
295
|
+
};
|
|
296
|
+
readonly setpriv: {
|
|
297
|
+
readonly valueFlags: readonly [];
|
|
298
|
+
readonly flags: readonly [];
|
|
299
|
+
readonly commandString: readonly [];
|
|
300
|
+
};
|
|
301
|
+
readonly numactl: {
|
|
302
|
+
readonly valueFlags: readonly [];
|
|
303
|
+
readonly flags: readonly [];
|
|
304
|
+
readonly commandString: readonly [];
|
|
305
|
+
};
|
|
306
|
+
readonly prlimit: {
|
|
307
|
+
readonly valueFlags: readonly [];
|
|
308
|
+
readonly flags: readonly [];
|
|
309
|
+
readonly commandString: readonly [];
|
|
310
|
+
};
|
|
311
|
+
readonly "systemd-run": {
|
|
312
|
+
readonly valueFlags: readonly [];
|
|
313
|
+
readonly flags: readonly [];
|
|
314
|
+
readonly commandString: readonly [];
|
|
315
|
+
};
|
|
316
|
+
readonly valgrind: {
|
|
317
|
+
readonly valueFlags: readonly [];
|
|
318
|
+
readonly flags: readonly [];
|
|
319
|
+
readonly commandString: readonly [];
|
|
320
|
+
};
|
|
321
|
+
readonly firejail: {
|
|
322
|
+
readonly valueFlags: readonly [];
|
|
323
|
+
readonly flags: readonly [];
|
|
324
|
+
readonly commandString: readonly [];
|
|
325
|
+
};
|
|
326
|
+
readonly bwrap: {
|
|
327
|
+
readonly valueFlags: readonly [];
|
|
328
|
+
readonly flags: readonly [];
|
|
329
|
+
readonly commandString: readonly [];
|
|
330
|
+
};
|
|
331
|
+
readonly ash: {
|
|
332
|
+
readonly valueFlags: readonly [];
|
|
333
|
+
readonly flags: readonly [];
|
|
334
|
+
readonly commandString: readonly [];
|
|
335
|
+
readonly viaShell: true;
|
|
336
|
+
};
|
|
337
|
+
readonly mksh: {
|
|
338
|
+
readonly valueFlags: readonly [];
|
|
339
|
+
readonly flags: readonly [];
|
|
340
|
+
readonly commandString: readonly [];
|
|
341
|
+
readonly viaShell: true;
|
|
342
|
+
};
|
|
343
|
+
readonly yash: {
|
|
344
|
+
readonly valueFlags: readonly [];
|
|
345
|
+
readonly flags: readonly [];
|
|
346
|
+
readonly commandString: readonly [];
|
|
347
|
+
readonly viaShell: true;
|
|
348
|
+
};
|
|
349
|
+
readonly pdksh: {
|
|
350
|
+
readonly valueFlags: readonly [];
|
|
351
|
+
readonly flags: readonly [];
|
|
352
|
+
readonly commandString: readonly [];
|
|
353
|
+
readonly viaShell: true;
|
|
354
|
+
};
|
|
355
|
+
readonly parallel: {
|
|
356
|
+
readonly valueFlags: readonly [];
|
|
357
|
+
readonly flags: readonly [];
|
|
358
|
+
readonly commandString: readonly [];
|
|
359
|
+
readonly viaShell: true;
|
|
360
|
+
};
|
|
361
|
+
readonly alias: {
|
|
362
|
+
readonly valueFlags: readonly [];
|
|
363
|
+
readonly flags: readonly [];
|
|
364
|
+
readonly commandString: readonly [];
|
|
365
|
+
readonly viaShell: true;
|
|
366
|
+
};
|
|
367
|
+
readonly mapfile: {
|
|
368
|
+
readonly valueFlags: readonly [];
|
|
369
|
+
readonly flags: readonly [];
|
|
370
|
+
readonly commandString: readonly [];
|
|
371
|
+
readonly executes: readonly ["-C"];
|
|
372
|
+
};
|
|
373
|
+
readonly readarray: {
|
|
374
|
+
readonly valueFlags: readonly [];
|
|
375
|
+
readonly flags: readonly [];
|
|
376
|
+
readonly commandString: readonly [];
|
|
377
|
+
readonly executes: readonly ["-C"];
|
|
378
|
+
};
|
|
269
379
|
};
|
|
270
380
|
export type ShellWrapperName = keyof typeof SHELL_WRAPPER_TABLE;
|
|
271
381
|
/** The shape of one row (see the table's contract). */
|