UNPKG

@sema-agent/core

Version:

Stateless, task-oriented AI agent core

413 lines (412 loc) • 11.1 kB
{ "repo": "core", "version": "7.47.0", "from": "d3d1a70f250fad85ace0bf4e792e75bf18373690", "to": "v7.47.0", "added": [ { "name": "ASK_FACES", "kind": "variable", "tier": "advanced", "at": [ "src/core/ask-origin.ts:707", "src/index.ts:1472" ], "criteriaCovered": false, "breaking": false }, { "name": "AskFace", "kind": "type", "tier": "advanced", "at": [ "src/core/ask-origin.ts:708", "src/index.ts:1472" ], "criteriaCovered": false, "breaking": false }, { "name": "askFaceOf", "kind": "function", "tier": "advanced", "at": [ "src/core/ask-origin.ts:713", "src/index.ts:1472" ], "criteriaCovered": false, "breaking": false }, { "name": "releasableAskClassesFor", "kind": "function", "tier": "advanced", "at": [ "src/core/ask-origin.ts:751", "src/index.ts:1472" ], "criteriaCovered": false, "breaking": false } ], "removed": [ { "name": "RELEASABLE_ASK_CLASSES", "kind": "variable", "tier": "advanced", "at": [ "src/core/ask-origin.ts:711", "src/index.ts:1472" ], "breaking": true } ], "changed": [], "narrowed": [ { "id": "F33", "source": "behaviorFlips.summary", "text": "BEHAVIOR NARROWING (#1402): a `Bash(...)` command rule — deny, ask or allow, from a task policy, the deployment's policy, a person's stored rows, the org partition or the allow lists — judges a `Monitor` call by its `command`, as it judges a `Bash` call." }, { "id": "F34", "source": "behaviorFlips.summary", "text": "BEHAVIOR NARROWING (#1402): a `Monitor(<command>)` rule text is refused at compile time (`invalid.command_rule`, naming the `Bash(<command>)` spelling); `Monitor(command:…)` is the primary-field refusal." }, { "id": "F35", "source": "behaviorFlips.summary", "text": "BEHAVIOR NARROWING (#1421, #1445 merged): a launcher that runs a program named by no word of its own hands it an argv its row composes, read as that program reads its own — `sudo -s` / `-i` / `--shell` / `--login` with a command hand the shell the command as escaped `-c` text (`$NAME` still expands); `su` / `runuser` hand the program `-c TEXT` and the words after the user (the user is a name, not text); su's `-s PROGRAM` names the program (a shell's row, or the program's own); a program the text does not spell (`-s \"$X\"`, `-m` / `-p`) is read as its command line and as a shell; `runuser -u USER CMD` runs CMD as the program." }, { "id": "F40", "source": "behaviorFlips.summary", "text": "BEHAVIOR NARROWING (#1421 r3b; one rule for every command): a character inside a bracket class that quotes or a backslash protect is a literal member — the path reader judges every class holding one as any one character (`?`, as the glob matcher reads a POSIX class), a well-formed class read as bash forms it — ending where bash ends it (a `[:…:]` / `[=…=]` / `[.….]` unit skipped whole, a quoted `]` closing nothing), no class where a `/` stands inside the brackets; a malformed unit (`[[:alpha]]`, `[[:a]x/y:]`, `[a[=b]c=]`) is not, its outer `[` read as a literal where bash reads a member (KL-7470-d, unchanged from v7.46.x) — and every class the matcher widens (a quoted character, or a `[:…:]` / `[=…=]` / `[.….]` unit) judging the name it spells beside its matches. The deny table and the dangerous-delete judge therefore see every name the shell could match in a whole word (and some it would not) — not in a part cut out of a word (an attached option value `grep --file=…` / `grep -f…`, `dd if=`'s value, an assignment's value), which is matched by its own quote-removed text while bash matches the whole word (KL-7470-c, a live miss unchanged from v7.46.x: `grep --file=[\"!\"a]* x` beside a plain `--file=apple` opens a denied `apple` on every arm; #1466). Reach: `Bash` commands whose words carry such a class, written literally or through a settled value; the text handed to a launched or re-reading shell is unchanged." } ], "closedSetMembers": [ { "set": "ASK_FACES", "at": [ "src/core/ask-origin.ts:707" ], "newSet": true, "added": [ "other", "shell" ], "removed": [], "breaking": false, "criteriaCovered": false }, { "set": "AskFace", "at": [ "src/core/ask-origin.ts:708", "src/index.ts:1472" ], "newSet": true, "added": [ "other", "shell" ], "removed": [], "breaking": false, "criteriaCovered": false }, { "set": "MODE_RELEASE_REASONS", "at": [ "src/core/ask-origin.ts:765" ], "newSet": false, "added": [ "write_protection_unresolved" ], "removed": [], "breaking": false, "criteriaCovered": false }, { "set": "ToolFaceDeclaration.ruleFace.grammar", "at": [ "src/core/tool-face.ts:232" ], "newSet": true, "added": [ "command" ], "removed": [], "breaking": false, "criteriaCovered": false } ], "closedSetsUnreadable": [], "typeKeys": [ { "type": "AskClassFacts", "at": [ "src/core/ask-origin.ts:780" ], "added": [ "askFace" ], "addedDetail": [ { "key": "askFace", "optional": true } ], "addedRequired": [], "removed": [], "breaking": false, "criteriaCovered": true }, { "type": "LexedWord", "at": [ "src/shell/lex.ts:184" ], "via": "ShellReadSegment.argv", "added": [ "judged" ], "addedDetail": [ { "key": "judged", "optional": true } ], "addedRequired": [], "removed": [], "breaking": false, "criteriaCovered": false }, { "type": "ReadCandidate", "at": [ "src/tools/fs/shell-read-plan.ts:125" ], "added": [ "pattern" ], "addedDetail": [ { "key": "pattern", "optional": true } ], "addedRequired": [], "removed": [], "breaking": false, "criteriaCovered": false }, { "type": "ToolFaceDeclaration", "at": [ "src/core/tool-face.ts:216" ], "added": [ "ruleFace.grammar" ], "addedDetail": [ { "key": "ruleFace.grammar", "optional": true } ], "addedRequired": [], "removed": [], "breaking": false, "criteriaCovered": false }, { "type": "WordExpansion", "at": [ "src/shell/lex.ts:134" ], "via": "ShellReadSegment.argv.pieces.expansion", "added": [ "pattern", "pattern.folded", "pattern.judged", "pattern.written" ], "addedDetail": [ { "key": "pattern", "optional": true }, { "key": "pattern.folded", "optional": false }, { "key": "pattern.judged", "optional": false }, { "key": "pattern.written", "optional": false } ], "addedRequired": [], "removed": [], "breaking": false, "criteriaCovered": false } ], "typeKeysUnreadableArms": [], "typeKeysFlattenedCount": 228, "signatures": [ { "name": "foldArbitrationRow", "at": [ "src/core/ask-origin.ts:860" ], "from": [ "(classes: ReadonlySet<AskClass>, readFace?: ContainmentFace): ModeArbitrationRow" ], "to": [ "(classes: ReadonlySet<AskClass>, readFace?: ContainmentFace, askFace?: AskFace): ModeArbitrationRow" ], "changes": [ { "aspect": "param", "detail": "+optional param `askFace?: AskFace`", "breaking": false } ], "breaking": false, "criteriaCovered": false } ], "declarationMoves": [], "mintMoves": [], "criteriaObserves": [ { "kind": "taskEventField", "name": "tool_end.gate", "assertions": [ "G43.a", "G43.c", "G46.c" ] }, { "kind": "typeMember", "name": "AskClassFacts.askFace", "assertions": [ "G47.a", "G47.b" ] }, { "kind": "typeMember", "name": "AskRequest.askClass", "assertions": [ "G45.a", "G45.b", "G45.e", "G45.f", "G45.g", "G45.h", "G45.i", "G45.k" ] }, { "kind": "typeMember", "name": "AskRequest.classes", "assertions": [ "G43.b", "G45.c", "G45.d" ] }, { "kind": "typeMember", "name": "AskRequest.message", "assertions": [ "G45.a", "G45.b", "G45.d", "G45.f", "G45.g", "G45.h" ] }, { "kind": "typeMember", "name": "GateOutcome.disposition", "assertions": [ "G43.a", "G43.b", "G43.c", "G45.i", "G45.j", "G45.l", "G46.a", "G46.b", "G46.c", "G46.d" ] }, { "kind": "typeMember", "name": "ModeRelease.reason", "assertions": [ "G46.a", "G46.d", "G47.b" ] }, { "kind": "typeMember", "name": "PermissionRuleIssue.code", "assertions": [ "G44.a" ] }, { "kind": "typeMember", "name": "PermissionRuleIssue.message", "assertions": [ "G44.a" ] }, { "kind": "typeMember", "name": "ToolCatalogEntry.face", "assertions": [ "G44.b" ] } ], "consumersHint": { "cli": [ "AskClassFacts", "LexedWord", "MODE_RELEASE_REASONS", "RELEASABLE_ASK_CLASSES", "ReadCandidate", "foldArbitrationRow" ], "server": [ "LexedWord", "MODE_RELEASE_REASONS", "RELEASABLE_ASK_CLASSES", "ReadCandidate", "foldArbitrationRow" ], "sdk": [ "RELEASABLE_ASK_CLASSES" ], "note": "scanned cli@b43004f0 server@b5d7c626 sdk@f6f9666 — a name listed is MENTIONED there today, which is evidence of consumption, not proof of it. Ledger files (**/docs/core-consumption/**, **/docs/wire-consumption/**, **/*LEDGER*.json) are not evidence of use — server: 2 name(s) matched ONLY in bookkeeping files and were set aside (AskClassFacts, ToolFaceDeclaration)" }, "breakingCount": 1, "breakingItems": [ "export removed: RELEASABLE_ASK_CLASSES (variable)" ], "toResolvedAt": "931d1bd694bf8b8e1376209647db753133079ee8" }