UNPKG

@sema-agent/core

Version:

Stateless, task-oriented AI agent core

1,085 lines (1,084 loc) • 24.6 kB
{ "repo": "core", "version": "7.45.0", "from": "73002f2fdbd4de6991332f8173fa826e8186f970", "to": "185f5debffa0c4e6e5104f58db12586b2839ba8f", "added": [ { "name": "HOST_DECIDERS", "kind": "variable", "tier": "advanced", "at": [ "src/core/gate-outcome.ts:127", "src/index.ts:1490" ], "criteriaCovered": false, "breaking": false }, { "name": "HeldQuestion", "kind": "type", "tier": "advanced", "at": [ "src/core/real-approval.ts:40", "src/index.ts:1491" ], "criteriaCovered": false, "breaking": false }, { "name": "HostDecider", "kind": "type", "tier": "advanced", "at": [ "src/core/gate-outcome.ts:128", "src/index.ts:1490" ], "criteriaCovered": false, "breaking": false }, { "name": "SCOPE_HOME_FORMS", "kind": "variable", "tier": "advanced", "at": [ "src/core/memory-engine/layout.ts:1145", "src/index.ts:2422" ], "criteriaCovered": false, "breaking": false }, { "name": "SCOPE_HOME_NOT_DIRECTORY", "kind": "variable", "tier": "advanced", "at": [ "src/core/memory-engine/layout.ts:1142", "src/index.ts:2422" ], "criteriaCovered": false, "breaking": false }, { "name": "STORE_FORM_REFUSAL_CODES", "kind": "variable", "tier": "advanced", "at": [ "src/core/memory-engine/layout.ts:1135", "src/index.ts:2422" ], "criteriaCovered": false, "breaking": false }, { "name": "ScopeHomeForm", "kind": "type", "tier": "advanced", "at": [ "src/core/memory-engine/layout.ts:1146", "src/index.ts:2422" ], "criteriaCovered": false, "breaking": false }, { "name": "StoreFormRefusal", "kind": "type", "tier": "advanced", "at": [ "src/core/memory-engine/layout.ts:1163", "src/index.ts:2422" ], "criteriaCovered": false, "breaking": false }, { "name": "StoreFormRefusalCode", "kind": "type", "tier": "advanced", "at": [ "src/core/memory-engine/layout.ts:1136", "src/index.ts:2422" ], "criteriaCovered": false, "breaking": false }, { "name": "StoreFormRefusalDetail", "kind": "type", "tier": "advanced", "at": [ "src/core/memory-engine/layout.ts:1158", "src/index.ts:2422" ], "criteriaCovered": true, "breaking": false }, { "name": "TARGET_OUTSIDE_STORE", "kind": "variable", "tier": "advanced", "at": [ "src/core/memory-engine/layout.ts:1139", "src/index.ts:2422" ], "criteriaCovered": false, "breaking": false }, { "name": "USER_INPUT_UNDRAINED_FAMILIES", "kind": "variable", "tier": "advanced", "at": [ "src/core/engine-notice.ts:1050", "src/core/types.ts:55", "src/index.ts:360" ], "criteriaCovered": false, "breaking": false }, { "name": "UserInputLane", "kind": "type", "tier": "advanced", "at": [ "src/core/task-notification.ts:68", "src/index.ts:1006" ], "criteriaCovered": false, "breaking": false }, { "name": "injectionLaneOf", "kind": "function", "tier": "advanced", "at": [ "src/core/task-notification.ts:77", "src/index.ts:1005" ], "criteriaCovered": false, "breaking": false }, { "name": "isHostDecider", "kind": "variable", "tier": "advanced", "at": [ "src/core/gate-outcome.ts:129", "src/index.ts:1490" ], "criteriaCovered": false, "breaking": false }, { "name": "policyCannotAnswer", "kind": "function", "tier": "advanced", "at": [ "src/core/real-approval.ts:62", "src/core/tool-policy.ts:8", "src/index.ts:1491" ], "criteriaCovered": false, "breaking": false } ], "removed": [], "changed": [], "narrowed": [ { "id": "F6", "source": "behaviorFlips.after", "text": "v7.45.0: each entry is mapped to its tool name before the narrowing policy is built — `Edit(src/**)`, `Edit()`, `Edit(*)` and `Edit` deny the tool `Edit` for the leg and nothing else; `\"Edit \"` and `Bash(` throw `config.agent.unknown_tool` naming `workflow agentType \"<name>\"`; a name no tool carries still builds a policy that denies nothing." }, { "id": "F19", "source": "behaviorFlips.summary", "text": "BEHAVIOR NARROWING (#1403): a removal whose target is a protected location — the filesystem root, a top-level directory, a home directory, the task root / working directory / an additional working directory or an ancestor of one, or a shell script built only when the command runs that may run a removal — is the mandated class `dangerous_delete` (`ASK_CLASSES` +1): no permission mode, allow-layer member or classifier clears it." }, { "id": "G20", "source": "criteria.title", "text": "#1395 — on a narrowed read face a shell read outside the roots (or one the station cannot place) is put to the approval seat under `auto`, not to the classifier; the card is the probe card `default` gives" } ], "closedSetMembers": [ { "set": "ASK_CLASSES", "at": [ "src/core/ask-origin.ts:601" ], "newSet": false, "added": [ "dangerous_delete" ], "removed": [], "breaking": false, "criteriaCovered": false }, { "set": "DangerousRemovalKind", "at": [ "src/tools/fs/removal-targets.ts:33" ], "newSet": true, "added": [ "filesystem_root", "home", "runtime_script", "top_level", "workspace" ], "removed": [], "breaking": false, "criteriaCovered": false }, { "set": "HOST_DECIDERS", "at": [ "src/core/gate-outcome.ts:127" ], "newSet": true, "added": [ "person", "policy", "sla_timeout" ], "removed": [], "breaking": false, "criteriaCovered": false }, { "set": "HostDecider", "at": [ "src/core/gate-outcome.ts:128", "src/index.ts:1490" ], "newSet": true, "added": [ "person", "policy", "sla_timeout" ], "removed": [], "breaking": false, "criteriaCovered": false }, { "set": "PermissionResult.guard", "at": [ "src/core/tool-policy.ts:606" ], "newSet": false, "added": [ "dangerous_delete" ], "removed": [], "breaking": false, "criteriaCovered": false }, { "set": "SHELL_REMOVAL_COMMANDS", "at": [ "src/tools/fs/removal-targets.ts:24" ], "newSet": true, "added": [ "rm", "rmdir" ], "removed": [], "breaking": false, "criteriaCovered": false }, { "set": "STORE_FORM_REFUSAL_CODES", "at": [ "src/core/memory-engine/layout.ts:1135" ], "newSet": true, "added": [ "memory.scope_home_not_directory", "memory.target_outside_store" ], "removed": [], "breaking": false, "criteriaCovered": false }, { "set": "ShellRemovalCommand", "at": [ "src/tools/fs/removal-targets.ts:25" ], "newSet": true, "added": [ "rm", "rmdir" ], "removed": [], "breaking": false, "criteriaCovered": false }, { "set": "StoreFormRefusalCode", "at": [ "src/core/memory-engine/layout.ts:1136", "src/index.ts:2422" ], "newSet": true, "added": [ "memory.scope_home_not_directory", "memory.target_outside_store" ], "removed": [], "breaking": false, "criteriaCovered": false }, { "set": "ToolNameListSide", "at": [ "src/agents/tool-filter.ts:118" ], "newSet": true, "added": [ "allowed", "denied" ], "removed": [], "breaking": false, "criteriaCovered": false }, { "set": "UserInputLane", "at": [ "src/core/task-notification.ts:68" ], "newSet": true, "added": [ "followUp", "steer" ], "removed": [], "breaking": false, "criteriaCovered": false } ], "closedSetsUnreadable": [], "typeKeys": [ { "type": "AllowEntryInert", "at": [ "src/core/allow-entry.ts:68" ], "via": "SkillGrantHit.readsAsNothing", "added": [ "valueType" ], "addedDetail": [ { "key": "valueType", "optional": true } ], "addedRequired": [], "removed": [], "breaking": false, "criteriaCovered": false }, { "type": "AllowEntryInertDetail", "at": [ "src/core/allow-entry.ts:46" ], "via": "SkillGrantHit.readsAsNothing.AllowEntryInertDetail", "added": [ "valueType" ], "addedDetail": [ { "key": "valueType", "optional": true } ], "addedRequired": [], "removed": [], "breaking": false, "criteriaCovered": false }, { "type": "AskClassFacts", "at": [ "src/core/ask-origin.ts:736" ], "added": [ "readFace" ], "addedDetail": [ { "key": "readFace", "optional": true } ], "addedRequired": [], "removed": [], "breaking": false, "criteriaCovered": false }, { "type": "Prepared", "at": [ "src/core/runner/contracts.ts:246" ], "via": "Runner.SuspendReap.env", "added": [ "handsRoot" ], "addedDetail": [ { "key": "handsRoot", "optional": true } ], "addedRequired": [], "removed": [], "breaking": false, "criteriaCovered": false }, { "type": "RunnerSelfSeat", "at": [ "src/core/runner/contracts.ts:2505" ], "added": [ "canRerootChild" ], "addedDetail": [ { "key": "canRerootChild", "optional": true } ], "addedRequired": [], "removed": [], "breaking": false, "criteriaCovered": false }, { "type": "SessionRuleNameRefusal", "at": [ "src/core/session-policy-store.ts:66" ], "added": [ "guidance" ], "addedDetail": [ { "key": "guidance", "optional": true } ], "addedRequired": [], "removed": [], "breaking": false, "criteriaCovered": true }, { "type": "ToolCallRequest", "at": [ "src/core/tool-policy.ts:51" ], "added": [ "root" ], "addedDetail": [ { "key": "root", "optional": true } ], "addedRequired": [], "removed": [], "breaking": false, "criteriaCovered": true }, { "type": "ToolGateInput", "at": [ "src/core/hooks.ts:1470" ], "via": "runToolGate.ToolGateInput", "added": [ "readFace" ], "addedDetail": [ { "key": "readFace", "optional": true } ], "addedRequired": [], "removed": [], "breaking": false, "criteriaCovered": false }, { "type": "ToolSpec", "at": [ "src/core/tool-spec.ts:131" ], "added": [ "agentToolFaces[].authored", "agentToolLevelAllowTools", "agentToolLevelDenyTools" ], "addedDetail": [ { "key": "agentToolFaces[].authored", "optional": true }, { "key": "agentToolLevelAllowTools", "optional": true }, { "key": "agentToolLevelDenyTools", "optional": true } ], "addedRequired": [], "removed": [], "breaking": false, "criteriaCovered": true } ], "typeKeysUnreadableArms": [], "typeKeysFlattenedCount": 225, "signatures": [ { "name": "Prepared.approvedCallScreen", "at": [ "src/core/runner/contracts.ts:425" ], "from": [ "(call: { toolCallId: string; toolName: string; args: unknown; decidedBy: \"person\" | \"sla_timeout\" | \"policy\"; }): Promise<{ readonly refused: string; } | { readonly args: unknown; readonly admit: () => void; }>" ], "to": [ "(call: { toolCallId: string; toolName: string; args: unknown; decidedBy: HostDecider; }): Promise<{ readonly refused: string; } | { readonly args: unknown; readonly admit: () => void; }>" ], "changes": [ { "aspect": "param", "detail": "param 1 `call` type changed, direction not read: …gs: unknown; decidedBy: [\"person\" | \"sla_timeout\" | \"policy\" -> HostDecider]; }", "breaking": true, "uncertain": true } ], "uncertain": "param 1 `call` type changed, direction not read: …gs: unknown; decidedBy: [\"person\" | \"sla_timeout\" | \"policy\" -> HostDecider]; } — the direction of a type change is not read syntactically, so it is reported breaking: check whether existing call sites still type-check before writing the BREAKING line", "breaking": true, "criteriaCovered": false }, { "name": "createUnverifiableDeletePolicy", "at": [ "src/core/tool-policy.ts:2515" ], "from": [ "(opts?: { safeVars?: readonly string[]; tools?: string[]; }): ToolPolicy" ], "to": [ "(opts?: { safeVars?: readonly string[]; tools?: string[]; removalSeat?: RemovalGuardSeat; }): ToolPolicy" ], "changes": [ { "aspect": "param", "detail": "param 1 `opts` type widened: …ng[]; tools?: string[]; [ -> removalSeat?: RemovalGuardSeat; ]}", "breaking": false } ], "breaking": false, "criteriaCovered": false }, { "name": "foldArbitrationRow", "at": [ "src/core/ask-origin.ts:813" ], "from": [ "(classes: ReadonlySet<AskClass>): ModeArbitrationRow" ], "to": [ "(classes: ReadonlySet<AskClass>, readFace?: ContainmentFace): ModeArbitrationRow" ], "changes": [ { "aspect": "param", "detail": "+optional param `readFace?: ContainmentFace`", "breaking": false } ], "breaking": false, "criteriaCovered": false } ], "declarationMoves": [ { "name": "HeldQuestion", "kind": "type", "onSurface": true, "from": [ "src/core/real-approval.ts" ], "to": [ "src/core/real-approval.ts", "src/index.ts" ] }, { "name": "SCOPE_HOME_FORMS", "kind": "variable", "onSurface": true, "from": [ "src/core/memory-engine/layout.ts" ], "to": [ "src/core/memory-engine/layout.ts", "src/index.ts" ] }, { "name": "SCOPE_HOME_NOT_DIRECTORY", "kind": "variable", "onSurface": true, "from": [ "src/core/memory-engine/layout.ts" ], "to": [ "src/core/memory-engine/layout.ts", "src/index.ts" ] }, { "name": "ScopeHomeForm", "kind": "type", "onSurface": true, "from": [ "src/core/memory-engine/layout.ts" ], "to": [ "src/core/memory-engine/layout.ts", "src/index.ts" ] }, { "name": "StoreFormRefusal", "kind": "type", "onSurface": true, "from": [ "src/core/memory-engine/layout.ts" ], "to": [ "src/core/memory-engine/layout.ts", "src/index.ts" ] }, { "name": "StoreFormRefusalDetail", "kind": "type", "onSurface": true, "from": [ "src/core/memory-engine/layout.ts" ], "to": [ "src/core/memory-engine/layout.ts", "src/index.ts" ] }, { "name": "TARGET_OUTSIDE_STORE", "kind": "variable", "onSurface": true, "from": [ "src/core/memory-engine/layout.ts" ], "to": [ "src/core/memory-engine/layout.ts", "src/index.ts" ] }, { "name": "policyCannotAnswer", "kind": "function", "onSurface": true, "from": [ "src/core/real-approval.ts", "src/core/tool-policy.ts" ], "to": [ "src/core/real-approval.ts", "src/core/tool-policy.ts", "src/index.ts" ] } ], "mintMoves": [], "criteriaObserves": [ { "kind": "engineNoticeCode", "name": "permission.allowed_tool_not_granted", "assertions": [ "G16.a", "G16.b", "G17.a", "G17.b", "G19.a", "G19.c" ] }, { "kind": "engineNoticeCode", "name": "task.user_followup_undrained", "assertions": [ "G21.a", "G21.b" ] }, { "kind": "engineNoticeCode", "name": "task.user_steer_undrained", "assertions": [ "G21.a" ] }, { "kind": "taskEventField", "name": "tool_end.isError", "assertions": [ "G14.a", "G15.a" ] }, { "kind": "taskEventField", "name": "tool_end.output", "assertions": [ "G14.a", "G14.b", "G15.a", "G19.a" ] }, { "kind": "typeMember", "name": "AgentDefinition.allowTools", "assertions": [ "G18.a", "G18.b", "G18.c" ] }, { "kind": "typeMember", "name": "AgentDefinition.denyTools", "assertions": [ "G5.a", "G5.b", "G6.a", "G7.a", "G7.b", "G10.a", "G10.b", "G12.a", "G12.b", "G16.c" ] }, { "kind": "typeMember", "name": "AskRequest.askClass", "assertions": [ "G1.a", "G2.b", "G20.a", "G24.a", "G24.d" ] }, { "kind": "typeMember", "name": "AskRequest.classes", "assertions": [ "G20.a", "G24.a", "G24.b", "G24.c" ] }, { "kind": "typeMember", "name": "AskRequest.mandate", "assertions": [ "G20.a" ] }, { "kind": "typeMember", "name": "AskRequest.mandated", "assertions": [ "G20.b" ] }, { "kind": "typeMember", "name": "AskRequest.message", "assertions": [ "G1.a", "G24.b" ] }, { "kind": "typeMember", "name": "AskRequest.requiresRealApproval", "assertions": [ "G20.b", "G20.c" ] }, { "kind": "typeMember", "name": "GateOutcome.disposition", "assertions": [ "G1.b", "G1.c" ] }, { "kind": "typeMember", "name": "GateOutcome.disposition.released.reason", "assertions": [ "G2.b" ] }, { "kind": "typeMember", "name": "ModeArbitrationRow.classifierEligible", "assertions": [ "G20.c" ] }, { "kind": "typeMember", "name": "PendingSteerInput.priority", "assertions": [ "G21.c" ] }, { "kind": "typeMember", "name": "PermissionResult.matchedAskRule", "assertions": [ "G3.a" ] }, { "kind": "typeMember", "name": "PermissionResult.requiresRealApproval", "assertions": [ "G2.a" ] }, { "kind": "typeMember", "name": "PermissionResult.ruleUnreadable", "assertions": [ "G2.a", "G3.b", "G3.c" ] }, { "kind": "typeMember", "name": "ResumeOutcome.hostDecision", "assertions": [ "G13.a", "G13.b" ] }, { "kind": "typeMember", "name": "SessionRuleNameRefusal.guidance", "assertions": [ "G23.a" ] }, { "kind": "typeMember", "name": "SessionRuleNameRefusal.verdict", "assertions": [ "G23.b" ] }, { "kind": "typeMember", "name": "SkillSpec.allowedTools", "assertions": [ "G19.c", "G19.d" ] }, { "kind": "typeMember", "name": "SkillSpec.disallowedTools", "assertions": [ "G19.a", "G19.d" ] }, { "kind": "typeMember", "name": "StoreFormRefusalDetail.form", "assertions": [ "G22.a", "G22.b" ] }, { "kind": "typeMember", "name": "StoreFormRefusalDetail.path", "assertions": [ "G22.b" ] }, { "kind": "typeMember", "name": "TaskResult.terminal", "assertions": [ "G19.b" ] }, { "kind": "typeMember", "name": "TaskSpec.agents", "assertions": [ "G5.a", "G6.a", "G6.b", "G16.c", "G18.a" ] }, { "kind": "typeMember", "name": "TaskSpec.allowedTools", "assertions": [ "G16.a" ] }, { "kind": "typeMember", "name": "TaskSpec.permissionMode", "assertions": [ "G20.b" ] }, { "kind": "typeMember", "name": "TaskSpec.readFace", "assertions": [ "G20.a" ] }, { "kind": "typeMember", "name": "TaskSpec.userInvokedSkills", "assertions": [ "G19.b" ] }, { "kind": "typeMember", "name": "ToolCallRequest.cwd", "assertions": [ "G4.a" ] }, { "kind": "typeMember", "name": "ToolCallRequest.root", "assertions": [ "G4.a" ] }, { "kind": "typeMember", "name": "ToolSpec.agentToolFaces", "assertions": [ "G9.a", "G9.c", "G11.a" ] }, { "kind": "typeMember", "name": "ToolSpec.agentToolLevelAllowTools", "assertions": [ "G18.a", "G18.c" ] }, { "kind": "typeMember", "name": "ToolSpec.agentToolLevelDenyTools", "assertions": [ "G9.b" ] }, { "kind": "typeMember", "name": "ToolSpec.agentToolPool", "assertions": [ "G8.a", "G8.b", "G11.a" ] } ], "consumersHint": { "cli": [ "ASK_CLASSES", "PermissionResult", "Prepared", "RunnerSelfSeat", "ToolCallRequest", "ToolGateInput", "ToolSpec" ], "server": [ "ASK_CLASSES", "HOST_DECIDERS", "PermissionResult", "Prepared", "SCOPE_HOME_NOT_DIRECTORY", "STORE_FORM_REFUSAL_CODES", "SessionRuleNameRefusal", "StoreFormRefusal", "StoreFormRefusalCode", "TARGET_OUTSIDE_STORE", "ToolCallRequest", "ToolGateInput", "ToolSpec", "createUnverifiableDeletePolicy", "foldArbitrationRow", "policyCannotAnswer" ], "sdk": [ "ASK_CLASSES", "PermissionResult", "SCOPE_HOME_NOT_DIRECTORY" ], "note": "scanned cli@fb2a095a server@bed34b7d sdk@605ccb1 — 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, RunnerSelfSeat)" }, "breakingCount": 1, "breakingItems": [ "signature changed: Prepared.approvedCallScreen — param 1 `call` type changed, direction not read: …gs: unknown; decidedBy: [\"person\" | \"sla_timeout\" | \"policy\" -> HostDecider]; }" ] }