@sema-agent/core 7.48.0 → 7.49.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 +418 -0
- package/README.md +2 -2
- package/dist/agents/cascade.d.ts +2 -5
- package/dist/agents/child-failure.d.ts +20 -0
- package/dist/agents/child-failure.js +28 -0
- package/dist/agents/cross-session-ref.d.ts +11 -3
- package/dist/agents/cross-session-ref.js +6 -0
- package/dist/agents/cumulative-stats.d.ts +12 -15
- package/dist/agents/cumulative-stats.js +1 -1
- package/dist/agents/extra-tool-names.js +1 -1
- package/dist/agents/inherited-tool-pool.d.ts +17 -13
- package/dist/agents/inherited-tool-pool.js +4 -3
- package/dist/agents/peer-session-drain.d.ts +3 -2
- package/dist/agents/peer-session-drain.js +5 -4
- package/dist/agents/send-message-tool.js +2 -9
- package/dist/agents/subagent.d.ts +10 -29
- package/dist/agents/subagent.js +65 -53
- package/dist/agents/suspend-guard.d.ts +1 -1
- package/dist/agents/tool-filter.d.ts +76 -65
- package/dist/agents/tool-filter.js +122 -92
- package/dist/agents/verify.d.ts +4 -7
- package/dist/agents/verify.js +6 -7
- package/dist/bench/metrics.d.ts +1 -2
- package/dist/brain/anthropic.js +133 -79
- package/dist/brain/errors.d.ts +53 -6
- package/dist/brain/errors.js +22 -2
- package/dist/brain/input-too-long.d.ts +40 -19
- package/dist/brain/input-too-long.js +3 -16
- package/dist/brain/open-responses.js +19 -10
- package/dist/brain/openai.js +123 -32
- package/dist/brain/provider-dialect.d.ts +214 -0
- package/dist/brain/provider-dialect.js +186 -0
- package/dist/brain/request-params.d.ts +27 -8
- package/dist/brain/request-params.js +7 -12
- package/dist/brain/request-route.d.ts +84 -0
- package/dist/brain/request-route.js +41 -0
- package/dist/brain/retry.d.ts +8 -0
- package/dist/brain/retry.js +10 -4
- package/dist/brain/route-adjudicator.d.ts +7 -0
- package/dist/brain/route-adjudicator.js +5 -1
- package/dist/brain/status-sink.d.ts +20 -0
- package/dist/brain/status-sink.js +11 -0
- package/dist/brain/stream-engine.d.ts +52 -1
- package/dist/brain/stream-engine.js +81 -24
- package/dist/brain/stream-shared.d.ts +57 -11
- package/dist/brain/stream-shared.js +28 -2
- package/dist/core/a2a.d.ts +1 -0
- package/dist/core/agent-config-dir.js +3 -2
- package/dist/core/allow-entry.d.ts +21 -12
- package/dist/core/allow-entry.js +38 -31
- package/dist/core/arg-summary.d.ts +17 -24
- package/dist/core/arg-summary.js +169 -68
- package/dist/core/ask-origin.d.ts +42 -24
- package/dist/core/ask-origin.js +18 -13
- package/dist/core/auto-mode-prompt-assets.d.ts +2 -2
- package/dist/core/auto-mode-prompt-assets.js +1 -1
- package/dist/core/auto-mode-prompt.d.ts +11 -1
- package/dist/core/auto-mode-prompt.js +13 -10
- package/dist/core/auto-mode-rebuild.d.ts +7 -0
- package/dist/core/auto-mode-rebuild.js +4 -1
- package/dist/core/canonical-json.d.ts +3 -0
- package/dist/core/canonical-json.js +2 -1
- package/dist/core/checkpoint-requirements.d.ts +892 -0
- package/dist/core/checkpoint-requirements.js +333 -0
- package/dist/core/checkpoint-store.d.ts +94 -65
- package/dist/core/checkpoint-store.js +14 -26
- package/dist/core/child-clamp-seats.d.ts +228 -69
- package/dist/core/child-clamp-seats.js +211 -17
- package/dist/core/classifier-unavailable-arm.d.ts +5 -1
- package/dist/core/classifier-unavailable-arm.js +3 -3
- package/dist/core/compliance.d.ts +3 -0
- package/dist/core/compliance.js +9 -4
- package/dist/core/credential-vocabulary.d.ts +140 -0
- package/dist/core/credential-vocabulary.js +131 -0
- package/dist/core/decision-receipt.js +1 -1
- package/dist/core/effective-path-target.d.ts +73 -16
- package/dist/core/effective-path-target.js +63 -33
- package/dist/core/engine-notice.d.ts +32 -7
- package/dist/core/file-history-store.js +2 -2
- package/dist/core/fs-write-gate-policy.d.ts +4 -0
- package/dist/core/fs-write-gate-policy.js +22 -5
- package/dist/core/gate-bounded-await.d.ts +28 -13
- package/dist/core/gate-bounded-await.js +41 -4
- package/dist/core/gate-fold.d.ts +1 -1
- package/dist/core/gate-fold.js +24 -25
- package/dist/core/gate-lanes.js +16 -15
- package/dist/core/gate-outcome.d.ts +20 -5
- package/dist/core/gate-outcome.js +5 -0
- package/dist/core/governance-codes.d.ts +11 -4
- package/dist/core/governance-codes.js +14 -3
- package/dist/core/hooks.d.ts +4 -0
- package/dist/core/locked-config.d.ts +8 -0
- package/dist/core/locked-config.js +14 -2
- package/dist/core/lsp.js +3 -5
- package/dist/core/mailbox-store.d.ts +3 -4
- package/dist/core/mcp-connection-pool.d.ts +75 -0
- package/dist/core/mcp-connection-pool.js +128 -0
- package/dist/core/mcp-failure.d.ts +2 -1
- package/dist/core/mcp-failure.js +13 -2
- package/dist/core/mcp.d.ts +4 -0
- package/dist/core/mcp.js +70 -43
- package/dist/core/memory-engine/content-origin.js +2 -14
- package/dist/core/memory-engine/engine.d.ts +32 -22
- package/dist/core/memory-engine/engine.js +103 -55
- package/dist/core/memory-engine/file-backend.d.ts +13 -30
- package/dist/core/memory-engine/file-backend.js +37 -252
- package/dist/core/memory-engine/index.d.ts +1 -1
- package/dist/core/memory-engine/index.js +1 -1
- package/dist/core/memory-engine/layout.d.ts +139 -9
- package/dist/core/memory-engine/layout.js +350 -7
- package/dist/core/memory-engine/scope-contract.d.ts +10 -0
- package/dist/core/memory-engine/scope-contract.js +8 -0
- package/dist/core/memory-engine/session-incarnation.d.ts +14 -4
- package/dist/core/memory-engine/session-incarnation.js +5 -2
- package/dist/core/memory-engine/types.d.ts +10 -1
- package/dist/core/memory.js +5 -17
- package/dist/core/model-seat.d.ts +4 -4
- package/dist/core/model-seat.js +1 -1
- package/dist/core/mounted-mcp.d.ts +57 -0
- package/dist/core/mounted-mcp.js +19 -0
- package/dist/core/namespaced-rule-name.d.ts +29 -0
- package/dist/core/namespaced-rule-name.js +52 -0
- package/dist/core/park-selfcheck.d.ts +1 -1
- package/dist/core/park-selfcheck.js +16 -6
- package/dist/core/path-guard-rows.d.ts +99 -0
- package/dist/core/path-guard-rows.js +45 -0
- package/dist/core/path-identity.d.ts +22 -16
- package/dist/core/path-identity.js +10 -10
- package/dist/core/path-rule-binding.d.ts +2 -1
- package/dist/core/path-rule-binding.js +3 -1
- package/dist/core/pause-registry.d.ts +16 -2
- package/dist/core/pause-registry.js +6 -0
- package/dist/core/permission-rule-consent.js +0 -7
- package/dist/core/permission-rule-model.d.ts +68 -24
- package/dist/core/permission-rule-model.js +105 -24
- package/dist/core/permission-rule-store.js +2 -2
- package/dist/core/permission-rules.d.ts +3 -30
- package/dist/core/permission-rules.js +4 -54
- package/dist/core/read-root-candidate.d.ts +1 -3
- package/dist/core/read-root-candidate.js +4 -15
- package/dist/core/real-approval.d.ts +4 -3
- package/dist/core/retired-keys.d.ts +13 -0
- package/dist/core/retired-keys.js +14 -0
- package/dist/core/roles.d.ts +2 -3
- package/dist/core/roles.js +15 -6
- package/dist/core/runner/assemble-result.d.ts +0 -7
- package/dist/core/runner/assemble-result.js +19 -31
- package/dist/core/runner/caller-roster.d.ts +78 -0
- package/dist/core/runner/caller-roster.js +219 -0
- package/dist/core/runner/checkpoint-scope.d.ts +16 -16
- package/dist/core/runner/checkpoint-scope.js +2 -2
- package/dist/core/runner/child-tree.js +2 -2
- package/dist/core/runner/contracts.d.ts +68 -35
- package/dist/core/runner/decide-continuation.d.ts +51 -3
- package/dist/core/runner/decide-continuation.js +76 -21
- package/dist/core/runner/denial-limit-arms.d.ts +17 -5
- package/dist/core/runner/denial-limit-arms.js +11 -9
- package/dist/core/runner/extra-body-dropped-seat.d.ts +8 -0
- package/dist/core/runner/extra-body-dropped-seat.js +22 -0
- package/dist/core/runner/finish-reason-seat.d.ts +9 -0
- package/dist/core/runner/finish-reason-seat.js +40 -0
- package/dist/core/runner/gate-exit.d.ts +44 -32
- package/dist/core/runner/gate-exit.js +112 -25
- package/dist/core/runner/inherited-ask-grants.js +6 -4
- package/dist/core/runner/mcp-redial.d.ts +3 -3
- package/dist/core/runner/mcp-redial.js +3 -4
- package/dist/core/runner/permission-rule-lanes.d.ts +1 -2
- package/dist/core/runner/permission-rule-lanes.js +5 -4
- package/dist/core/runner/prepare-artifact.d.ts +4 -0
- package/dist/core/runner/prepare-artifact.js +2 -1
- package/dist/core/runner/prepare-ask-lane.d.ts +2 -0
- package/dist/core/runner/prepare-ask-lane.js +12 -6
- package/dist/core/runner/prepare-boundary-parks.d.ts +5 -8
- package/dist/core/runner/prepare-boundary-parks.js +4 -7
- package/dist/core/runner/prepare-caps-and-workflow.d.ts +11 -15
- package/dist/core/runner/prepare-caps-and-workflow.js +19 -27
- package/dist/core/runner/prepare-config-doors.d.ts +9 -9
- package/dist/core/runner/prepare-config-doors.js +10 -5
- package/dist/core/runner/prepare-defer-classify.d.ts +2 -2
- package/dist/core/runner/prepare-defer-classify.js +5 -3
- package/dist/core/runner/prepare-delegation-surface.d.ts +1 -1
- package/dist/core/runner/prepare-delegation-surface.js +3 -3
- package/dist/core/runner/prepare-gate-stations.d.ts +4 -4
- package/dist/core/runner/prepare-gate-stations.js +9 -7
- package/dist/core/runner/prepare-hands-readface.d.ts +7 -7
- package/dist/core/runner/prepare-hands-readface.js +7 -7
- package/dist/core/runner/prepare-inherited-gate.d.ts +7 -6
- package/dist/core/runner/prepare-inherited-gate.js +14 -15
- package/dist/core/runner/prepare-listings.d.ts +7 -24
- package/dist/core/runner/prepare-listings.js +4 -5
- package/dist/core/runner/prepare-memory-engine-session.d.ts +2 -0
- package/dist/core/runner/prepare-memory-engine-session.js +4 -3
- package/dist/core/runner/prepare-memory.d.ts +6 -0
- package/dist/core/runner/prepare-memory.js +13 -13
- package/dist/core/runner/prepare-offload-wrappers.d.ts +5 -0
- package/dist/core/runner/prepare-offload-wrappers.js +3 -3
- package/dist/core/runner/prepare-park-ask.d.ts +7 -8
- package/dist/core/runner/prepare-park-ask.js +17 -10
- package/dist/core/runner/prepare-policy-chain.js +24 -44
- package/dist/core/runner/prepare-project-context.d.ts +1 -1
- package/dist/core/runner/prepare-project-context.js +3 -4
- package/dist/core/runner/prepare-protocol-tools.d.ts +9 -3
- package/dist/core/runner/prepare-protocol-tools.js +3 -4
- package/dist/core/runner/prepare-run-refs.d.ts +3 -0
- package/dist/core/runner/prepare-run-refs.js +2 -1
- package/dist/core/runner/prepare-safety-scan.d.ts +4 -8
- package/dist/core/runner/prepare-safety-scan.js +1 -2
- package/dist/core/runner/prepare-suspend-saga.d.ts +7 -1
- package/dist/core/runner/prepare-suspend-saga.js +28 -12
- package/dist/core/runner/prepare-task.d.ts +1 -1
- package/dist/core/runner/prepare-task.js +67 -56
- package/dist/core/runner/prepare-wiring-manifest.d.ts +11 -10
- package/dist/core/runner/prepare-wiring-manifest.js +5 -8
- package/dist/core/runner/resume-apply.js +7 -14
- package/dist/core/runner/resume-checkpoint-screen.js +11 -4
- package/dist/core/runner/resume-internals-and-config.js +2 -2
- package/dist/core/runner/resume-policy-outcome.js +5 -32
- package/dist/core/runner/resume-review-outcome.js +4 -1
- package/dist/core/runner/retired-runner-deps.d.ts +6 -0
- package/dist/core/runner/retired-runner-deps.js +10 -1
- package/dist/core/runner/run-brain-sinks.d.ts +4 -0
- package/dist/core/runner/run-brain-sinks.js +5 -2
- package/dist/core/runner/run-harness-handlers.js +27 -34
- package/dist/core/runner/run-leg.d.ts +0 -2
- package/dist/core/runner/run-leg.js +32 -33
- package/dist/core/runner/run-terminal-adoption.js +4 -3
- package/dist/core/runner/runtask.js +8 -8
- package/dist/core/runner/session-rule-policy.js +5 -5
- package/dist/core/runner/stream-settle-backstop.js +7 -4
- package/dist/core/runner/sub-agent-deny-lists.d.ts +51 -12
- package/dist/core/runner/sub-agent-deny-lists.js +111 -80
- package/dist/core/runner/terminal-account.d.ts +48 -0
- package/dist/core/runner/terminal-account.js +186 -0
- package/dist/core/runner/tool-end-body.d.ts +54 -17
- package/dist/core/runner/tool-end-body.js +27 -2
- package/dist/core/runner/tool-face-overlay.d.ts +3 -1
- package/dist/core/runner/tool-face-overlay.js +6 -4
- package/dist/core/runner/tool-occurrence.d.ts +106 -0
- package/dist/core/runner/tool-occurrence.js +123 -0
- package/dist/core/runner/tool-progress-lane.d.ts +16 -8
- package/dist/core/runner/tool-progress-lane.js +25 -34
- package/dist/core/runner/turn-attachments.d.ts +1 -1
- package/dist/core/runner/write-protection-station.d.ts +21 -9
- package/dist/core/runner/write-protection-station.js +20 -17
- package/dist/core/runner-deps.d.ts +12 -22
- package/dist/core/secret-env.d.ts +16 -5
- package/dist/core/secret-env.js +23 -63
- package/dist/core/sensitive-path-policy.d.ts +19 -18
- package/dist/core/sensitive-path-policy.js +73 -49
- package/dist/core/session-reconcile.d.ts +3 -0
- package/dist/core/session-reconcile.js +5 -4
- package/dist/core/session-store.d.ts +5 -0
- package/dist/core/session-store.js +12 -0
- package/dist/core/session.d.ts +13 -0
- package/dist/core/shared-memory/normalize.d.ts +17 -4
- package/dist/core/shared-memory/normalize.js +7 -7
- package/dist/core/shell-lexer.js +5 -4
- package/dist/core/skill-grant.js +1 -1
- package/dist/core/store-contracts/checkpoint-store-contract.js +13 -0
- package/dist/core/store-contracts/mailbox-store-contract.d.ts +7 -14
- package/dist/core/store-contracts/session-store-incarnation-contract.d.ts +27 -0
- package/dist/core/store-contracts/session-store-incarnation-contract.js +92 -0
- package/dist/core/stub-env.d.ts +2 -0
- package/dist/core/stub-env.js +1 -0
- package/dist/core/synthetic-read-verdict.js +2 -2
- package/dist/core/task-event.d.ts +59 -5
- package/dist/core/task-result.d.ts +1 -1
- package/dist/core/task-spec.d.ts +42 -9
- package/dist/core/terminal-cause.d.ts +94 -11
- package/dist/core/tighten-task-spec.d.ts +5 -4
- package/dist/core/tighten-task-spec.js +20 -25
- package/dist/core/tool-catalog-entries.d.ts +5 -7
- package/dist/core/tool-catalog-entries.js +14 -15
- package/dist/core/tool-face.d.ts +47 -0
- package/dist/core/tool-face.js +5 -0
- package/dist/core/tool-model-gate.d.ts +5 -5
- package/dist/core/tool-name-aliases.d.ts +26 -2
- package/dist/core/tool-name-aliases.js +13 -0
- package/dist/core/tool-name-list.d.ts +30 -0
- package/dist/core/tool-name-list.js +55 -0
- package/dist/core/tool-name-readings.d.ts +1 -9
- package/dist/core/tool-name-readings.js +1 -3
- package/dist/core/tool-policy.d.ts +195 -85
- package/dist/core/tool-policy.js +165 -380
- package/dist/core/tool-registry.d.ts +44 -1
- package/dist/core/tool-registry.js +26 -0
- package/dist/core/tool-roster.d.ts +19 -1
- package/dist/core/tool-roster.js +21 -2
- package/dist/core/tool-spec-members.d.ts +45 -0
- package/dist/core/tool-spec-members.js +169 -0
- package/dist/core/tool-spec.d.ts +46 -8
- package/dist/core/tools.d.ts +6 -2
- package/dist/core/tools.js +8 -4
- package/dist/core/untrusted-egress.js +29 -26
- package/dist/core/untrusted-text.d.ts +13 -10
- package/dist/core/untrusted-text.js +6 -44
- package/dist/core/workflow-journal-store.d.ts +4 -1
- package/dist/core/write-protect.d.ts +65 -29
- package/dist/core/write-protect.js +235 -177
- package/dist/engine/compaction/compaction.d.ts +2 -2
- package/dist/engine/execution-env/node-execution-env.d.ts +5 -23
- package/dist/engine/execution-env/node-execution-env.js +16 -38
- package/dist/engine/execution-env/symlink-chain.d.ts +23 -0
- package/dist/engine/execution-env/symlink-chain.js +32 -0
- package/dist/engine/harness/types.d.ts +7 -0
- package/dist/engine/llm/tool-turns.d.ts +3 -0
- package/dist/engine/llm/tool-turns.js +1 -0
- package/dist/engine/llm/types.d.ts +59 -23
- package/dist/engine/loop/agent-loop.js +16 -2
- package/dist/engine/session/memory-repo.js +11 -3
- package/dist/engine/session/repo-utils.d.ts +8 -0
- package/dist/engine/session/repo-utils.js +13 -0
- package/dist/index.d.ts +20 -23
- package/dist/index.js +17 -20
- package/dist/internal/harness.d.ts +1 -1
- package/dist/internal/harness.js +1 -1
- package/dist/internal/llm.d.ts +2 -2
- package/dist/internal/llm.js +1 -1
- package/dist/orchestration/governance-baseline-validity.js +1 -1
- package/dist/orchestration/run-spec.js +3 -3
- package/dist/orchestration/run-workflow-tool.d.ts +16 -35
- package/dist/orchestration/run-workflow-tool.js +38 -78
- package/dist/orchestration/workflow-governance.d.ts +21 -25
- package/dist/orchestration/workflow-governance.js +38 -78
- package/dist/orchestration/workflow-primitives.d.ts +7 -22
- package/dist/orchestration/workflow-primitives.js +5 -12
- package/dist/orchestration/workflow-types.d.ts +1 -1
- package/dist/orchestration/workflow.d.ts +61 -11
- package/dist/orchestration/workflow.js +189 -117
- package/dist/scenarios/full-body.d.ts +1 -1
- package/dist/shell/lex.d.ts +0 -21
- package/dist/shell/lex.js +250 -68
- package/dist/shell/shell-words.d.ts +35 -0
- package/dist/shell/shell-words.js +65 -0
- package/dist/stores/file/checkpoint-store.d.ts +5 -5
- package/dist/stores/file/checkpoint-store.js +5 -2
- package/dist/stores/file/index.d.ts +0 -8
- package/dist/stores/file/index.js +0 -12
- package/dist/stores/file/session-store.d.ts +3 -0
- package/dist/stores/file/session-store.js +44 -19
- package/dist/tools/artifact/artifact-tool.js +2 -0
- package/dist/tools/fs/bash-program-position.d.ts +10 -3
- package/dist/tools/fs/bash-program-position.js +21 -9
- package/dist/tools/fs/bash-readonly-classifier.d.ts +1 -1
- package/dist/tools/fs/bash-readonly-classifier.js +8 -7
- package/dist/tools/fs/containment-face.d.ts +4 -0
- package/dist/tools/fs/containment-face.js +3 -0
- package/dist/tools/fs/fs-shared.d.ts +10 -0
- package/dist/tools/fs/fs-shared.js +18 -0
- package/dist/tools/fs/fs-write.js +4 -2
- package/dist/tools/fs/index.d.ts +1 -1
- package/dist/tools/fs/program-read-model.d.ts +39 -18
- package/dist/tools/fs/program-read-model.js +29 -19
- package/dist/tools/fs/program-read-model.rows.d.ts +0 -14
- package/dist/tools/fs/program-read-model.rows.js +5 -5
- package/dist/tools/fs/read-deny-home.d.ts +33 -47
- package/dist/tools/fs/read-deny-home.js +35 -49
- package/dist/tools/fs/read-deny.d.ts +23 -22
- package/dist/tools/fs/read-deny.js +114 -89
- package/dist/tools/fs/removal-targets.d.ts +56 -23
- package/dist/tools/fs/removal-targets.js +65 -87
- package/dist/tools/fs/safety.d.ts +29 -22
- package/dist/tools/fs/safety.js +17 -11
- package/dist/tools/fs/search.js +10 -8
- package/dist/tools/fs/shell-read-argv.js +1 -1
- package/dist/tools/fs/shell-read-bindings.d.ts +169 -37
- package/dist/tools/fs/shell-read-bindings.js +324 -86
- package/dist/tools/fs/shell-read-builtins.d.ts +35 -0
- package/dist/tools/fs/shell-read-builtins.js +43 -0
- package/dist/tools/fs/shell-read-check.d.ts +15 -1
- package/dist/tools/fs/shell-read-check.js +51 -42
- package/dist/tools/fs/shell-read-establish.js +6 -6
- package/dist/tools/fs/shell-read-functions.d.ts +22 -0
- package/dist/tools/fs/shell-read-functions.js +29 -0
- package/dist/tools/fs/shell-read-judge.d.ts +48 -18
- package/dist/tools/fs/shell-read-judge.js +33 -4
- package/dist/tools/fs/shell-read-plan.d.ts +12 -6
- package/dist/tools/fs/shell-read-plan.js +118 -113
- package/dist/tools/fs/shell-read-start.d.ts +29 -6
- package/dist/tools/fs/shell-read-start.js +16 -9
- package/dist/tools/fs/shell-read-word.js +4 -0
- package/dist/tools/fs/shell-read-workdir.d.ts +156 -0
- package/dist/tools/fs/shell-read-workdir.js +281 -0
- package/dist/tools/fs/shell-read-write-targets.d.ts +5 -2
- package/dist/tools/fs/shell-read-write-targets.js +14 -5
- package/dist/tools/fs/shell-reentry-text.d.ts +4 -6
- package/dist/tools/fs/shell-reentry-text.js +3 -11
- package/dist/tools/task-list.d.ts +1 -2
- package/dist/tools/web.js +1 -1
- package/package.json +4 -1
- package/test/export-surface.snapshot.json +107 -143
- package/wire-changes/core@7.49.0.json +4765 -0
- package/dist/agents/teacher.d.ts +0 -159
- package/dist/agents/teacher.js +0 -577
- package/dist/agents/team.d.ts +0 -226
- package/dist/agents/team.js +0 -257
- package/dist/core/strategy-store.d.ts +0 -238
- package/dist/core/strategy-store.js +0 -253
- package/dist/orchestration/builtin-workflows.d.ts +0 -133
- package/dist/orchestration/builtin-workflows.js +0 -159
- package/dist/scenarios/env.d.ts +0 -40
- package/dist/scenarios/env.js +0 -39
- package/dist/scenarios/scenario-registry.d.ts +0 -110
- package/dist/scenarios/scenario-registry.js +0 -140
- package/dist/scenarios/teacher-quickstart.d.ts +0 -40
- package/dist/scenarios/teacher-quickstart.js +0 -12
- package/dist/stores/cc/lockfile.d.ts +0 -10
- package/dist/stores/cc/lockfile.js +0 -98
- package/dist/stores/cc/mailbox-store.d.ts +0 -20
- package/dist/stores/cc/mailbox-store.js +0 -255
- package/dist/stores/cc/roster-adapter.d.ts +0 -12
- package/dist/stores/cc/roster-adapter.js +0 -117
- package/dist/stores/cc/sidecar-transcript.d.ts +0 -97
- package/dist/stores/cc/sidecar-transcript.js +0 -264
- package/dist/stores/cc/task-list-store.d.ts +0 -2
- package/dist/stores/cc/task-list-store.js +0 -125
- package/dist/stores/file/strategy-store.d.ts +0 -97
- package/dist/stores/file/strategy-store.js +0 -341
|
@@ -66,8 +66,8 @@ export function isInertBuiltin(name) {
|
|
|
66
66
|
const b = programRow(name)?.builtin;
|
|
67
67
|
return b === "inert" || b === "declaration";
|
|
68
68
|
}
|
|
69
|
-
export function
|
|
70
|
-
return programRow(name)?.movesBase === "
|
|
69
|
+
export function movesBaseByStack(name) {
|
|
70
|
+
return programRow(name)?.movesBase === "stack";
|
|
71
71
|
}
|
|
72
72
|
export function longOptionNameOf(tok) {
|
|
73
73
|
if (!tok.startsWith("--") || tok.length === 2)
|
|
@@ -979,21 +979,6 @@ export function programLanguageOf(row) {
|
|
|
979
979
|
return r.language;
|
|
980
980
|
return undefined;
|
|
981
981
|
}
|
|
982
|
-
export function printedText(row, args) {
|
|
983
|
-
const words = args.filter((a) => a !== undefined);
|
|
984
|
-
if (row?.prints === undefined || words.length !== args.length)
|
|
985
|
-
return undefined;
|
|
986
|
-
const events = readArgRoles(row, words);
|
|
987
|
-
const from = events.find((e) => e.kind === "operand" || e.kind === "dash-word-operand")?.at ?? words.length;
|
|
988
|
-
if (events.some((e) => e.at < from && e.kind === "option" && e.reading === "speculative"))
|
|
989
|
-
return undefined;
|
|
990
|
-
const printed = words.slice(from);
|
|
991
|
-
if (printed.some((w) => w.includes("\\")))
|
|
992
|
-
return undefined;
|
|
993
|
-
if (row.prints === "words")
|
|
994
|
-
return printed.join(" ");
|
|
995
|
-
return printed.length === 1 && !printed[0].includes("%") ? printed[0] : undefined;
|
|
996
|
-
}
|
|
997
982
|
export function wordsReadBySomeImplementations(row, args) {
|
|
998
983
|
if (row === undefined || row.grammars.length < 2)
|
|
999
984
|
return new Set();
|
|
@@ -1034,7 +1019,7 @@ export function moduleTailOf(row, args) {
|
|
|
1034
1019
|
}
|
|
1035
1020
|
function steppableLauncherOption(row, tok) {
|
|
1036
1021
|
const m = tok.startsWith("--") ? (tok.includes("=") ? undefined : mergedTable(row, "long").get(tok.slice(2))) : tok.length === 2 && tok.startsWith("-") ? mergedTable(row, "short").get(tok[1]) : undefined;
|
|
1037
|
-
if (m === undefined || m.spec.value?.kind === "shell-text"
|
|
1022
|
+
if (m === undefined || m.spec.value?.kind === "shell-text")
|
|
1038
1023
|
return undefined;
|
|
1039
1024
|
return m.arity !== "disputed" || takesNoWordBare(row, tok) ? m : undefined;
|
|
1040
1025
|
}
|
|
@@ -1085,6 +1070,27 @@ export function launcherOptionPathRole(row, tok) {
|
|
|
1085
1070
|
const role = readLauncherOption(row, tok)?.valued?.spec.value;
|
|
1086
1071
|
return role?.kind === "path" ? role : undefined;
|
|
1087
1072
|
}
|
|
1073
|
+
export function launcherOptionMovesBase(row, tok) {
|
|
1074
|
+
const moves = (m) => m?.spec.value?.kind === "path" && m.spec.value.base !== undefined;
|
|
1075
|
+
if (tok === "-" || tok === "--")
|
|
1076
|
+
return false;
|
|
1077
|
+
if (tok.startsWith("--")) {
|
|
1078
|
+
const eq = tok.indexOf("=");
|
|
1079
|
+
return moves(steppableLauncherOption(row, eq > 2 ? tok.slice(0, eq) : tok));
|
|
1080
|
+
}
|
|
1081
|
+
if (!/^-[^-]/.test(tok))
|
|
1082
|
+
return false;
|
|
1083
|
+
for (let i = 1; i < tok.length; i++) {
|
|
1084
|
+
const m = steppableLauncherOption(row, `-${tok[i]}`);
|
|
1085
|
+
if (m === undefined)
|
|
1086
|
+
return false;
|
|
1087
|
+
if (moves(m))
|
|
1088
|
+
return true;
|
|
1089
|
+
if (m.arity !== 0)
|
|
1090
|
+
return false;
|
|
1091
|
+
}
|
|
1092
|
+
return false;
|
|
1093
|
+
}
|
|
1088
1094
|
export function launcherOptionStep(row, tok) {
|
|
1089
1095
|
return readLauncherOption(row, tok)?.step;
|
|
1090
1096
|
}
|
|
@@ -1267,12 +1273,16 @@ export function messageWords(program, words, programIndex) {
|
|
|
1267
1273
|
const j = programIndex + 1 + found.at;
|
|
1268
1274
|
const sub = found.row.grammars[0];
|
|
1269
1275
|
const settled = (k) => words[k] !== undefined && words[k].expands === false;
|
|
1276
|
+
const oneArgument = (k) => {
|
|
1277
|
+
const pieces = words[k]?.word?.expansions ?? [];
|
|
1278
|
+
return pieces.length > 0 && pieces.every((p) => p.expansion?.kind === "command" && p.expansion.yields === "one");
|
|
1279
|
+
};
|
|
1270
1280
|
const longValues = Object.entries(sub.long).filter(([, s]) => s.arity === 1);
|
|
1271
1281
|
let pending;
|
|
1272
1282
|
for (let k = j + 1; k < words.length; k++) {
|
|
1273
1283
|
const w = words[k].folded;
|
|
1274
1284
|
if (pending !== undefined) {
|
|
1275
|
-
if (pending === "message" && settled(k))
|
|
1285
|
+
if (pending === "message" && (settled(k) || oneArgument(k)))
|
|
1276
1286
|
out.add(k);
|
|
1277
1287
|
pending = undefined;
|
|
1278
1288
|
continue;
|
|
@@ -1,17 +1,3 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* The rows of the program read model (`program-read-model.ts` is the schema and the readers). One row per program
|
|
3
|
-
* bash can run at a segment's program position, grouped by family. Every row is DATA: adding a program, an option or
|
|
4
|
-
* an implementation is a row edit, never a reader branch.
|
|
5
|
-
*
|
|
6
|
-
* How a row is written:
|
|
7
|
-
* · an option is declared with its arity and, where it is known, the ROLE of its value; a value whose role is not
|
|
8
|
-
* known is declared by arity alone, and every reader then reads that option the speculative way;
|
|
9
|
-
* · where two implementations of one program disagree, the row carries one grammar per implementation, and the
|
|
10
|
-
* readers combine them (a short letter whose arity they dispute is read as nothing; a disputed long name as
|
|
11
|
-
* optional-valued; a spelling one implementation does not declare is one it rejects, opening nothing);
|
|
12
|
-
* · a row is checked against the real binaries by the gate (`test/program-read-model.binary-gate.test.ts`);
|
|
13
|
-
* a row the gate cannot run says why in `witness`.
|
|
14
|
-
*/
|
|
15
1
|
import type { ProgramRow } from "./program-read-model.js";
|
|
16
2
|
/** The time a launcher waits (`timeout 5s …`): a number with an optional unit. */
|
|
17
3
|
export declare const DURATION_SPELLING: RegExp;
|
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import { shellWordsOf } from "../../shell/shell-words.js";
|
|
1
2
|
const READ = { kind: "path", effect: "read" };
|
|
2
3
|
const WRITE = { kind: "path", effect: "write" };
|
|
3
4
|
const CREATED = { kind: "path", effect: "create" };
|
|
@@ -504,7 +505,7 @@ const git = {
|
|
|
504
505
|
const noPath = (key, rest, extra = {}) => ({ key, grammars: [], operands: { rest }, witness: BINARY, ...extra });
|
|
505
506
|
const BUILTIN_ONLY = { declared: "a shell builtin with no binary of its own on every host: its words are read by the shell" };
|
|
506
507
|
const noPathRows = [
|
|
507
|
-
noPath("pwd", LABEL, { builtin: "inert" }), noPath("echo", LABEL, { builtin: "inert", grammars: [grammar(switches("neE"), {}, { afterFirstOperand: "operands" })]
|
|
508
|
+
noPath("pwd", LABEL, { builtin: "inert" }), noPath("echo", LABEL, { builtin: "inert", grammars: [grammar(switches("neE"), {}, { afterFirstOperand: "operands" })] }), noPath("printf", LABEL, { grammars: [grammar({ v: val(BINDS_NAME) })] }), noPath("whoami", LABEL), noPath("uname", LABEL),
|
|
508
509
|
noPath("which", LABEL), noPath("basename", LABEL), noPath("dirname", LABEL),
|
|
509
510
|
{ key: "tr", grammars: [], operands: { rest: LABEL, stdinBelow: "always" }, witness: BINARY },
|
|
510
511
|
noPath("cal", COUNT), noPath("uptime", LABEL), noPath("id", LABEL), noPath("groups", LABEL), noPath("nproc", LABEL), noPath("locale", LABEL),
|
|
@@ -583,6 +584,7 @@ const stdinReaders = [
|
|
|
583
584
|
];
|
|
584
585
|
const SYNTAX = { declared: "shell syntax, not a program: read by the lexer" };
|
|
585
586
|
const block = (key, g = []) => ({ key, grammars: g, syntax: "block", witness: SYNTAX });
|
|
587
|
+
const BLOCK_GRAMMARS = { "[[": [grammar({ v: val(BINDS_NAME) })] };
|
|
586
588
|
export const PROGRAM_ROWS = [
|
|
587
589
|
head, tail, cut, grepRow("grep"), grepRow("egrep"), grepRow("fgrep"), diff, cmp, sed, date, tar, find, curl,
|
|
588
590
|
ls, walker("du", "names", true), walker("rg", "contents", false), walker("tree", "names", true), walker("ag", "contents", false), walker("ack", "contents", false),
|
|
@@ -622,11 +624,9 @@ export const PROGRAM_ROWS = [
|
|
|
622
624
|
...nameBinders,
|
|
623
625
|
...["make", "gmake", "bmake", "cmake", "ninja", "meson"].map(assignmentNotPaths),
|
|
624
626
|
containerRuntime("docker"), containerRuntime("podman"),
|
|
625
|
-
{ key
|
|
626
|
-
{ key: "popd", grammars: [], movesBase: "unfollowed", witness: BUILTIN_ONLY },
|
|
627
|
+
...[...shellWordsOf("stack_mover")].map((key) => ({ key, grammars: [], movesBase: "stack", witness: BUILTIN_ONLY })),
|
|
627
628
|
...SHELLS.map((s) => shellRow(s, "c-option", BINARY, [SHELL_GRAMMARS[s]], "script")),
|
|
628
629
|
shellRow("eval", "words", BUILTIN_ONLY), shellRow("source", "file-operand", BUILTIN_ONLY), shellRow(".", "file-operand", BUILTIN_ONLY), shellRow("parallel", "non-option-words", BINARY, [], "script"),
|
|
629
630
|
...codeBodyRows,
|
|
630
|
-
...["
|
|
631
|
-
block("[[", [grammar({ v: val(BINDS_NAME) })]),
|
|
631
|
+
...[...shellWordsOf("block")].map((k) => block(k, BLOCK_GRAMMARS[k])),
|
|
632
632
|
];
|
|
@@ -15,68 +15,54 @@ export declare function declaredReadDenyHomes(env: Pick<ExecutionEnv, "homeDir">
|
|
|
15
15
|
* gave no answer, or where the declared home's own probe did not answer (ask again later). */
|
|
16
16
|
export declare function readDenyHomesOf(env: Pick<ExecutionEnv, "homeDir" | "canonicalPath">, signal?: AbortSignal): Promise<string[]>;
|
|
17
17
|
/**
|
|
18
|
-
* Where
|
|
19
|
-
*
|
|
20
|
-
*
|
|
21
|
-
* (`canonicalizeTarget`: the longest existing prefix resolved, the rest rejoined); a location
|
|
22
|
-
*
|
|
23
|
-
*
|
|
18
|
+
* Where a table's deny rows LEAD past the places their own runs anchor them, keyed by the row's pattern — the `linked`
|
|
19
|
+
* argument of `compileReadDeny`. ONE constructor for every anchor ({@link ReadDenyRowAnchor}): the rows the anchor
|
|
20
|
+
* places, each row's LITERAL HEAD ({@link literalHeadOf}) spelled under each of the anchor's places and resolved the way the
|
|
21
|
+
* read faces mint their keys (`canonicalizeTarget`: the longest existing prefix resolved, the rest rejoined); a location
|
|
22
|
+
* that differs from the spellings the row is already anchored at is where one of the head's segments is a link (`~/.sema`
|
|
23
|
+
* into a dotfiles directory, `/app` a link to `/data/app`), and the row is placed there too.
|
|
24
|
+
* · a head that resolves to its own spelling at an anchored place adds nothing (the row is already placed there);
|
|
24
25
|
* · a head under a spelling that is no directory (a segment of it is a file, a symlink to a file, a device node or a
|
|
25
26
|
* socket — the environment answers `not_directory` for the head) has nothing below it: an answer that adds nothing;
|
|
26
27
|
* · any other head that cannot be resolved (an unanswered or refused probe — a directory the probe may not enter — a
|
|
27
|
-
* probe that throws) adds nothing, and the answer is not WHOLE (`whole: false`): the row stays
|
|
28
|
-
*
|
|
29
|
-
* · a row whose head is empty (`~/.sema.*`) has no location to resolve and adds nothing;
|
|
28
|
+
* probe that throws) adds nothing, and the answer is not WHOLE (`whole: false`): the row stays at the places its run
|
|
29
|
+
* anchors until the mount places again;
|
|
30
30
|
* · the heads are resolved together, so one placement waits at most one probe bound — or, with `deadline` (an absolute
|
|
31
31
|
* time), each head until then: a head still unresolved at the deadline is a head that did not answer;
|
|
32
32
|
* · read per placement — a link created afterwards is followed from the next placement on.
|
|
33
33
|
*/
|
|
34
|
-
export declare function
|
|
34
|
+
export declare function readDenyLinksOf(env: ExecutionEnv, entries: readonly {
|
|
35
35
|
readonly pattern: string;
|
|
36
36
|
readonly caseSensitive?: boolean;
|
|
37
|
-
}[],
|
|
37
|
+
}[], anchor: ReadDenyRowAnchor, signal?: AbortSignal, deadline?: number): Promise<{
|
|
38
38
|
readonly linked: Map<string, string[]>;
|
|
39
39
|
readonly whole: boolean;
|
|
40
40
|
}>;
|
|
41
41
|
/**
|
|
42
|
-
*
|
|
43
|
-
*
|
|
44
|
-
*
|
|
45
|
-
*
|
|
46
|
-
*
|
|
47
|
-
* spelling
|
|
48
|
-
*
|
|
49
|
-
*
|
|
42
|
+
* Which rows one placement reads, and where their heads are spelled:
|
|
43
|
+
* · `home` — the home-anchored rows (`~/…`), under each home; the row's run anchors it there;
|
|
44
|
+
* · `root` — the ROOTED rows (`/app/config-lkg.json`, {@link isRootedReadDenyPattern}), under the filesystem root; the run
|
|
45
|
+
* anchors it there. A root is no home: read whether or not a home answered;
|
|
46
|
+
* · `unanchored` — the rows that open with the configuration directory's name (`~/.sema/…`, {@link agentConfigDirTail})
|
|
47
|
+
* under each spelling of the root the host declares for that directory (`RunnerDeps.agentConfigDir`): the head BELOW
|
|
48
|
+
* the directory name, a head that ends at it (`~/.sema/*.json`, `~/.sema`) the root itself. The row's run does not
|
|
49
|
+
* anchor it there (it is anchored at the homes), so every location — the spelling itself and where it leads — is one
|
|
50
|
+
* the row is placed at in addition; the row's name in every refusal is unchanged.
|
|
51
|
+
* A home or rooted row whose head is empty (`~/.sema.*`, `/*.json`) has no location to resolve and adds nothing.
|
|
50
52
|
*/
|
|
51
|
-
export
|
|
52
|
-
readonly
|
|
53
|
-
readonly
|
|
54
|
-
}
|
|
55
|
-
readonly
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
* the host declares the directory's root (`RunnerDeps.agentConfigDir`) — the same `linked` answer
|
|
61
|
-
* {@link readDenyHomeLinksOf} gives, for the same rows: the row's literal head below the directory name is spelled under
|
|
62
|
-
* each spelling of the root and resolved the way the read faces mint their keys. A row is not anchored at the root by
|
|
63
|
-
* its own run (it is anchored at the homes), so every location here — the spelling itself and where it leads — is one the
|
|
64
|
-
* row is placed at in addition; the home spelling stays placed. The row's name in every refusal is unchanged.
|
|
65
|
-
* · a row whose run does not open with the directory's name (`~/.sema.*`, the external tools' files) adds nothing;
|
|
66
|
-
* · a row whose head ends at the directory name (`~/.sema/*.json`, `~/.sema`) is placed at the root itself, the rest of
|
|
67
|
-
* its run matched below it.
|
|
68
|
-
*/
|
|
69
|
-
export declare function readDenyConfigRootLinksOf(env: ExecutionEnv, entries: readonly {
|
|
70
|
-
readonly pattern: string;
|
|
71
|
-
readonly caseSensitive?: boolean;
|
|
72
|
-
}[], roots: readonly string[], signal?: AbortSignal, deadline?: number): Promise<{
|
|
73
|
-
readonly linked: Map<string, string[]>;
|
|
74
|
-
readonly whole: boolean;
|
|
75
|
-
}>;
|
|
53
|
+
export type ReadDenyRowAnchor = {
|
|
54
|
+
readonly at: "home";
|
|
55
|
+
readonly homes: readonly string[];
|
|
56
|
+
} | {
|
|
57
|
+
readonly at: "root";
|
|
58
|
+
} | {
|
|
59
|
+
readonly at: "unanchored";
|
|
60
|
+
readonly roots: readonly string[];
|
|
61
|
+
};
|
|
76
62
|
/** Where an absolute location LEADS in one environment — resolved the way the read and write faces mint their keys
|
|
77
63
|
* (`canonicalizeTarget`: the longest existing prefix resolved, the rest rejoined). `undefined` when the environment
|
|
78
64
|
* does not answer (a refused or failed probe, one that throws). The one resolution a deny row's placement reads: a
|
|
79
|
-
*
|
|
65
|
+
* deny row's head ({@link readDenyLinksOf}) and a rule row's head ({@link whereItsAnsweredPrefixLeads}). */
|
|
80
66
|
export declare function whereItLeads(env: ExecutionEnv, at: string, family?: PathFamily, signal?: AbortSignal): Promise<string | undefined>;
|
|
81
67
|
/** {@link whereItLeads} with a floor: where the environment does not answer for `at` (a probe that fails), the longest
|
|
82
68
|
* prefix it does answer for is resolved and the rest rejoined — a rule row's head below a base that resolves is never
|
|
@@ -150,13 +136,13 @@ export declare function carryHomeViews<T extends object>(judge: T, source: HomeV
|
|
|
150
136
|
* · the HOME SET — `homes` when the mount carries a list (the account is not asked and no home is added), else the
|
|
151
137
|
* declared home and the account lookup's answer ({@link declaredReadDenyHomes}); every home of the set is anchored at
|
|
152
138
|
* its spelling and, where the environment answered one, its canonical spelling — one rule for both forms;
|
|
153
|
-
* · the DECLARED home's canonical spelling under the tree's gate bound, and its rows' heads ({@link
|
|
139
|
+
* · the DECLARED home's canonical spelling under the tree's gate bound, and its rows' heads ({@link readDenyLinksOf}):
|
|
154
140
|
* a declared home, or a head under it, that did not answer leaves the placement not WHOLE — and an account lookup
|
|
155
141
|
* with no answer, or a declared home that did not answer, places nothing: the rows are held anywhere (`compile([])`)
|
|
156
142
|
* rather than at a spelling that may miss the home's canonical one;
|
|
157
143
|
* · each AUXILIARY home (see the module head) read once under {@link AUXILIARY_HOME_PROBE_MS} — its spellings, its
|
|
158
144
|
* chain, its rows' heads — at the same time; whatever of it did not answer costs that home alone and never `whole`;
|
|
159
|
-
* · the ROOTED rows' heads ({@link
|
|
145
|
+
* · the ROOTED rows' heads ({@link readDenyLinksOf}), read whether or not a home answered: a head that did not answer
|
|
160
146
|
* leaves the placement not WHOLE, and a placement that held the rows anywhere still places them.
|
|
161
147
|
* `compile` is the mount's own compile; the rows' patterns are read off its compile at no home. */
|
|
162
148
|
export declare function placeReadDenyAtHome(env: ExecutionEnv, compile: (homes: readonly string[], linked?: ReadonlyMap<string, readonly string[]>) => ReadDenyMatcher, homes?: readonly string[], signal?: AbortSignal, configRoot?: string): Promise<{
|
|
@@ -1,8 +1,9 @@
|
|
|
1
1
|
import { userInfo } from "node:os";
|
|
2
|
-
import { canonicalizeTarget,
|
|
2
|
+
import { canonicalizeTarget, isAbsoluteForFamily, joinForFamily, normalizeAbsPathLexically, pathFamilyOf } from "./safety.js";
|
|
3
3
|
import { DEFAULT_GATE_AWAIT_TIMEOUT_MS, withGateTimeout } from "../../core/gate-bounded-await.js";
|
|
4
4
|
import { thrownText } from "../../core/thrown-value.js";
|
|
5
5
|
import { agentConfigDirTail } from "../../core/agent-config-dir.js";
|
|
6
|
+
import { validatePath } from "../../core/effective-path-target.js";
|
|
6
7
|
import { isRootedReadDenyPattern, readDenyPatternRun, readDenyRunHead } from "./read-deny.js";
|
|
7
8
|
export const AUXILIARY_HOME_PROBE_MS = 2_000;
|
|
8
9
|
const said = new Set();
|
|
@@ -36,8 +37,9 @@ function valueText(v) {
|
|
|
36
37
|
function accountHomeOf() {
|
|
37
38
|
try {
|
|
38
39
|
const home = userInfo().homedir;
|
|
39
|
-
|
|
40
|
-
|
|
40
|
+
const valid = validatePath(home, { intent: "validate-coordinate" });
|
|
41
|
+
if (valid !== undefined)
|
|
42
|
+
return { state: "home", home: valid };
|
|
41
43
|
sayOnce("bad_value", `read-deny homes: the account home lookup answered ${valueText(home)}, not an absolute path — home-anchored read-deny rows are placed under the environment's declared home only.`);
|
|
42
44
|
return { state: "none" };
|
|
43
45
|
}
|
|
@@ -49,8 +51,7 @@ function accountHomeOf() {
|
|
|
49
51
|
}
|
|
50
52
|
}
|
|
51
53
|
function declaredHomeOf(env) {
|
|
52
|
-
|
|
53
|
-
return home !== undefined && isAbsolutePathForm(home) ? home : undefined;
|
|
54
|
+
return validatePath(env.homeDir, { intent: "validate-coordinate" });
|
|
54
55
|
}
|
|
55
56
|
function declaredReadDenyHomesAnswered(env) {
|
|
56
57
|
const home = declaredHomeOf(env);
|
|
@@ -105,56 +106,43 @@ function sayAuxiliary(what, subject = "auxiliary") {
|
|
|
105
106
|
}
|
|
106
107
|
sayOnce("auxiliary", `read-deny homes: a home beside the environment's declared home did not answer its probes within ${AUXILIARY_HOME_PROBE_MS} ms (${what}) — its home-anchored read-deny rows sit at its spelling only, and a path through an alias of it is judged as spelled, until the next placement.`);
|
|
107
108
|
}
|
|
108
|
-
export async function
|
|
109
|
-
|
|
110
|
-
for (const { pattern, caseSensitive } of entries) {
|
|
111
|
-
const { homeAnchored, run } = readDenyPatternRun(pattern);
|
|
112
|
-
if (!homeAnchored)
|
|
113
|
-
continue;
|
|
114
|
-
const head = literalHeadOf(run);
|
|
115
|
-
if (head.length === 0)
|
|
116
|
-
continue;
|
|
117
|
-
const spelled = homes.map((home) => normalizeAbsPathLexically(joinForFamily(pathFamilyOf({ root: home }), home, head)));
|
|
118
|
-
rows.push({ pattern, caseSensitive: caseSensitive === true, spelled, anchored: spelled });
|
|
119
|
-
}
|
|
120
|
-
return await linkedLocationsOf(env, rows, signal, deadline);
|
|
109
|
+
export async function readDenyLinksOf(env, entries, anchor, signal, deadline) {
|
|
110
|
+
return await linkedLocationsOf(env, anchoredRowsOf(entries, anchor), signal, deadline);
|
|
121
111
|
}
|
|
122
112
|
const ROOT = "/";
|
|
123
|
-
export async function readDenyRootLinksOf(env, entries, signal, deadline) {
|
|
124
|
-
const rows = [];
|
|
125
|
-
for (const { pattern, caseSensitive } of entries) {
|
|
126
|
-
if (!isRootedReadDenyPattern(pattern))
|
|
127
|
-
continue;
|
|
128
|
-
const head = literalHeadOf(pattern);
|
|
129
|
-
if (head.length === 0)
|
|
130
|
-
continue;
|
|
131
|
-
const spelled = [normalizeAbsPathLexically(joinForFamily(pathFamilyOf({ root: ROOT }), ROOT, head))];
|
|
132
|
-
rows.push({ pattern, caseSensitive: caseSensitive === true, spelled, anchored: spelled });
|
|
133
|
-
}
|
|
134
|
-
return await linkedLocationsOf(env, rows, signal, deadline);
|
|
135
|
-
}
|
|
136
113
|
function literalHeadOf(run) {
|
|
137
114
|
return run.split("/").filter(Boolean).slice(0, readDenyRunHead(run)).join("/");
|
|
138
115
|
}
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
}
|
|
142
|
-
function configRootRowsOf(entries, roots) {
|
|
116
|
+
function anchoredRowsOf(entries, anchor) {
|
|
117
|
+
const places = anchor.at === "home" ? anchor.homes : anchor.at === "root" ? [ROOT] : anchor.roots;
|
|
143
118
|
const rows = [];
|
|
144
119
|
for (const { pattern, caseSensitive } of entries) {
|
|
145
|
-
const
|
|
146
|
-
|
|
147
|
-
if (tail === undefined)
|
|
120
|
+
const head = rowHeadOf(pattern, caseSensitive === true, anchor);
|
|
121
|
+
if (head === undefined)
|
|
148
122
|
continue;
|
|
149
|
-
const
|
|
150
|
-
|
|
151
|
-
rows.push({ pattern, caseSensitive: caseSensitive === true, spelled, anchored: [] });
|
|
123
|
+
const spelled = places.map((place) => normalizeAbsPathLexically(head.length === 0 ? place : joinForFamily(pathFamilyOf({ root: place }), place, head)));
|
|
124
|
+
rows.push({ pattern, caseSensitive: caseSensitive === true, spelled, anchored: anchor.at === "unanchored" ? [] : spelled });
|
|
152
125
|
}
|
|
153
126
|
return rows;
|
|
154
127
|
}
|
|
128
|
+
function rowHeadOf(pattern, caseSensitive, anchor) {
|
|
129
|
+
if (anchor.at === "root") {
|
|
130
|
+
const head = isRootedReadDenyPattern(pattern) ? literalHeadOf(pattern) : "";
|
|
131
|
+
return head.length > 0 ? head : undefined;
|
|
132
|
+
}
|
|
133
|
+
const { homeAnchored, run } = readDenyPatternRun(pattern);
|
|
134
|
+
if (!homeAnchored)
|
|
135
|
+
return undefined;
|
|
136
|
+
if (anchor.at === "unanchored") {
|
|
137
|
+
const tail = agentConfigDirTail(run, caseSensitive);
|
|
138
|
+
return tail === undefined ? undefined : literalHeadOf(tail);
|
|
139
|
+
}
|
|
140
|
+
const head = literalHeadOf(run);
|
|
141
|
+
return head.length > 0 ? head : undefined;
|
|
142
|
+
}
|
|
155
143
|
function configRootSpelledLinks(entries, roots) {
|
|
156
144
|
const out = new Map();
|
|
157
|
-
for (const { pattern, spelled } of
|
|
145
|
+
for (const { pattern, spelled } of anchoredRowsOf(entries, { at: "unanchored", roots }))
|
|
158
146
|
out.set(pattern, [...new Set(spelled)]);
|
|
159
147
|
return out;
|
|
160
148
|
}
|
|
@@ -259,9 +247,7 @@ async function readAuxiliaryHome(env, home, opts, signal) {
|
|
|
259
247
|
typeof identity === "function" ? chainAbove(env, identity, spelled.canonical, signal, deadline) : Promise.resolve({ ancestors: [], whole: true }),
|
|
260
248
|
opts.entries === undefined
|
|
261
249
|
? Promise.resolve({ linked: new Map(), whole: true })
|
|
262
|
-
: opts.configRoot === true
|
|
263
|
-
? readDenyConfigRootLinksOf(env, opts.entries, place, signal, deadline)
|
|
264
|
-
: readDenyHomeLinksOf(env, opts.entries, place, signal, deadline),
|
|
250
|
+
: readDenyLinksOf(env, opts.entries, opts.configRoot === true ? { at: "unanchored", roots: place } : { at: "home", homes: place }, signal, deadline),
|
|
265
251
|
]);
|
|
266
252
|
reading = { place, chain, linked: heads.linked, answered: chain.whole && heads.whole };
|
|
267
253
|
}
|
|
@@ -337,7 +323,7 @@ function homeViewSourceOver(env, auxiliary) {
|
|
|
337
323
|
};
|
|
338
324
|
return {
|
|
339
325
|
async of(path, opts) {
|
|
340
|
-
if (typeof identity !== "function" || (declared === undefined && auxiliary.length === 0) || !
|
|
326
|
+
if (typeof identity !== "function" || (declared === undefined && auxiliary.length === 0) || !isAbsoluteForFamily("own", path))
|
|
341
327
|
return undefined;
|
|
342
328
|
const spelled = normalizeAbsPathLexically(path);
|
|
343
329
|
const view = await viewOf(spelled, opts?.leaf === "file");
|
|
@@ -365,7 +351,7 @@ export function sayPlacementLost() {
|
|
|
365
351
|
}
|
|
366
352
|
function readAuxiliaryHomes(env, homes, opts, signal) {
|
|
367
353
|
const declared = declaredHomeOf(env);
|
|
368
|
-
return [...new Set(homes.filter((h) =>
|
|
354
|
+
return [...new Set(homes.filter((h) => isAbsoluteForFamily("own", h) && !isDeclared(declared, h)))].map((home) => readAuxiliaryHome(env, home, opts, signal));
|
|
369
355
|
}
|
|
370
356
|
export function homeViewsAt(env, homes) {
|
|
371
357
|
return homeViewSourceOver(env, readAuxiliaryHomes(env, homes, {}));
|
|
@@ -380,7 +366,7 @@ export async function placeReadDenyAtHome(env, compile, homes, signal, configRoo
|
|
|
380
366
|
const entries = compile([]).entries;
|
|
381
367
|
const declared = declaredHomeOf(env);
|
|
382
368
|
const relocated = configRoot === undefined ? undefined : readAuxiliaryHome(env, configRoot, { entries, configRoot: true }, signal);
|
|
383
|
-
const rooted =
|
|
369
|
+
const rooted = readDenyLinksOf(env, entries, { at: "root" }, signal);
|
|
384
370
|
const heldAnywhere = async (whole) => {
|
|
385
371
|
const linked = new Map();
|
|
386
372
|
for (const map of [(await relocated)?.linked, (await rooted).linked])
|
|
@@ -400,7 +386,7 @@ export async function placeReadDenyAtHome(env, compile, homes, signal, configRoo
|
|
|
400
386
|
declaredAt = [...new Set([...own, ...ownSpellings.spellings])];
|
|
401
387
|
}
|
|
402
388
|
const auxiliary = readAuxiliaryHomes(env, listed.homes, { entries }, signal);
|
|
403
|
-
const [heads, readings, root, rootedHeads] = await Promise.all([
|
|
389
|
+
const [heads, readings, root, rootedHeads] = await Promise.all([readDenyLinksOf(env, entries, { at: "home", homes: declaredAt }, signal), Promise.all(auxiliary), relocated, rooted]);
|
|
404
390
|
const at = [...new Set([...declaredAt, ...readings.flatMap((r) => r.place)])];
|
|
405
391
|
const linked = new Map();
|
|
406
392
|
for (const map of [heads.linked, ...readings.map((r) => r.linked), ...(root === undefined ? [] : [root.linked]), rootedHeads.linked]) {
|
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import { type PathGuardFold, type PathGuardRow, type PathRowsHit, type TargetViews } from "../../core/path-guard-rows.js";
|
|
1
2
|
/**
|
|
2
3
|
* One deny entry: a `/`-separated run of path SEGMENTS. `*` matches any run of non-separator
|
|
3
4
|
* characters within one segment and is the ONLY metacharacter (everything else is literal). The run
|
|
@@ -86,28 +87,12 @@ export type PathRowReach = {
|
|
|
86
87
|
export interface JudgedPathRow extends PathRuleDenyRow {
|
|
87
88
|
readonly reach?: (absolutePath: string) => PathRowReach;
|
|
88
89
|
}
|
|
89
|
-
/** A call's target as a judgment reads it: the absolute spellings of its views (lexical, canonical, the leaf chain's hops —
|
|
90
|
-
* any order the caller holds), or `unreadable` when the call names a target this reading cannot locate. */
|
|
91
|
-
export interface TargetViews {
|
|
92
|
-
readonly spellings: readonly string[];
|
|
93
|
-
readonly unreadable?: string;
|
|
94
|
-
}
|
|
95
|
-
/** What {@link pathRowsReach} found: the row, the view it met there (absent on an unreadable hold), and — when nothing was
|
|
96
|
-
* reached and some row could not be judged — the reason of the first such row. */
|
|
97
|
-
export interface PathRowsHit<R> {
|
|
98
|
-
readonly row: R;
|
|
99
|
-
readonly view?: string;
|
|
100
|
-
readonly unreadable?: string;
|
|
101
|
-
}
|
|
102
90
|
/**
|
|
103
|
-
*
|
|
104
|
-
*
|
|
105
|
-
*
|
|
106
|
-
* row that cannot be judged (or a target that cannot be read) is held and answered only when no row reaches. `allow`: a
|
|
107
|
-
* row admits the call only when it admits EVERY view (a link out of an allowed directory is not admitted through its
|
|
108
|
-
* spelling); an unreadable target is admitted by nothing.
|
|
91
|
+
* Rule rows judged by THE one judgment ({@link judgePathRows}): each rule row read as a guarded row whose reach over a view
|
|
92
|
+
* is the rule's own reach over the view's spelling (never exemptible — a rule says exactly where it reaches). Same rows
|
|
93
|
+
* outer, views inner, same tighten / allow law as every other row; the hit names the rule row itself.
|
|
109
94
|
*/
|
|
110
|
-
export declare function
|
|
95
|
+
export declare function judgeRuleRows<R extends JudgedPathRow>(rows: readonly R[], views: TargetViews, direction: "tighten" | "allow"): PathRowsHit<R> | undefined;
|
|
111
96
|
/** The locations a row is also judged at (each leading part of its HEAD: the anchor's children down to the head itself,
|
|
112
97
|
* a share's root for a UNC head) — what a leg resolves once, for every row whose head it holds. */
|
|
113
98
|
export declare function ruleHeadParts(rows: readonly Pick<PathRuleDenyRow, "head">[]): string[];
|
|
@@ -129,10 +114,23 @@ export declare function rowsWhereTheyLead<R extends JudgedPathRow>(rows: readonl
|
|
|
129
114
|
export declare function locationLeadsTo(path: string, leads: ReadonlyMap<string, string | undefined>): string | undefined;
|
|
130
115
|
/** {@link rowsWhereTheyLead} with each part resolved by `leadsTo` (the leg's resolution; each part once). */
|
|
131
116
|
export declare function withRuleRowsWhereTheyLead<R extends JudgedPathRow>(rows: readonly R[], leadsTo: (head: string) => Promise<string | undefined>): Promise<R[]>;
|
|
117
|
+
/** A rule row as a row of the one table: its name is the rule text, its reach the rule's own over a view's spelling. */
|
|
118
|
+
export declare function ruleGuardRow<R extends JudgedPathRow>(rule: R): PathGuardRow & {
|
|
119
|
+
readonly rule: R;
|
|
120
|
+
};
|
|
121
|
+
/** A compiled segment-glob row as a row of the one table (`faces`, `polarity`, `exemptible` and `origin` are the table's). */
|
|
122
|
+
export declare function segmentGuardRow(pat: CompiledSegmentPattern, columns: {
|
|
123
|
+
readonly faces: readonly DenyFace[];
|
|
124
|
+
readonly polarity: "deny" | "ask";
|
|
125
|
+
readonly exemptible: boolean;
|
|
126
|
+
readonly fold: PathGuardFold;
|
|
127
|
+
readonly origin: PathGuardRow["origin"];
|
|
128
|
+
readonly tier?: string;
|
|
129
|
+
}): PathGuardRow;
|
|
132
130
|
/**
|
|
133
131
|
* The WRITE face of the deny table: the rule rows whose faces include `write` — the judge the shell station reads for a
|
|
134
132
|
* command's write targets (a redirection, `tee`, `sed -i`, `cp` / `mv` / `touch` / `mkdir` / `rm` operands). Same row
|
|
135
|
-
* type, same judgment ({@link
|
|
133
|
+
* type, same judgment ({@link judgePathRows}) as the read face's rows; a hit names the row by its rule text.
|
|
136
134
|
*/
|
|
137
135
|
export interface WriteDenyMatcher {
|
|
138
136
|
/** Which face this judge is — the write tools' path resolution reads it to word and code the refusal as a write. */
|
|
@@ -412,6 +410,9 @@ export declare function compileSegmentPattern(raw: string, fold: "none" | "ascii
|
|
|
412
410
|
export declare function matchSegmentPatterns(path: string, compiled: readonly CompiledSegmentPattern[], opts?: {
|
|
413
411
|
readonly aliasResolved?: boolean;
|
|
414
412
|
}): string | null;
|
|
413
|
+
/** One entry's refusal under the deny list's entry law ({@link normalizeEntry}, the compiler's own), or `undefined` when the
|
|
414
|
+
* entry is lawful — the law read without compiling, for a door that judges a list before anything folds it. */
|
|
415
|
+
export declare function readDenyEntryProblem(entry: unknown, layer: string): string | undefined;
|
|
415
416
|
/** Is a canonical pattern ROOTED — placed at the filesystem root ({@link ReadDenyEntry})? Only {@link canonicalReadDenyPattern}
|
|
416
417
|
* puts a leading `/` on a canonical pattern, so the text is the whole answer. */
|
|
417
418
|
export declare function isRootedReadDenyPattern(canonical: string): boolean;
|
|
@@ -445,7 +446,7 @@ export declare function checkedReadDenyHomes(homes: unknown, seat?: string): rea
|
|
|
445
446
|
* home: a home-anchored entry then matches its run anywhere — a row that cannot be placed holds wider, never narrower.
|
|
446
447
|
*
|
|
447
448
|
* `linked` — where a home-anchored or a rooted row's LITERAL HEAD ({@link readDenyRunHead}) really leads, keyed by the row's
|
|
448
|
-
* pattern: the canonical locations a mount resolved (`
|
|
449
|
+
* pattern: the canonical locations a mount resolved (`readDenyLinksOf`, read-deny-home.ts) where
|
|
449
450
|
* one of the head's segments is a link (`~/.sema` linked into a dotfiles directory; `/app` a link to `/data/app`). The row is placed at each location too —
|
|
450
451
|
* the same row, the same name in every refusal — with the rest of its run matched below it. The read faces judge
|
|
451
452
|
* canonical keys, so every spelling that reaches the linked file meets the row there. Absolute locations only.
|