@sema-agent/core 7.41.0 → 7.41.2

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 CHANGED
@@ -1,3 +1,35 @@
1
+ ## 7.41.2 — 2026-10-05
2
+
3
+ **Hard-breaking changes:** none. **Closed sets:** none added. **Package exports:** +1 / −0 — `steerPriorityOf`. **Behavior narrowing:** none (one reading replaces two; a replay that spelled the default is no longer refused).
4
+
5
+ ### A steer's priority has one reading: absent means `next` (#1361; fix; +1 export) (@server @client-core)
6
+
7
+ - **Before (v7.41.1).** The live acceptance check (`sameAcceptedSteerInput`) compared the admission's normalized priority (`priority ?? "next"`), while the parked replay check (`samePendingSteerPayload`) compared the row's raw member — a row parked without a priority (every row a ≤7.115.0 server parked, or a client that omits the field) against a retry that spelled `"next"` read as a different instruction: `409 steering.duplicate_input_id`, after which a client re-issuing under a fresh id queued the same instruction twice (server S-1121, reproduced on 7.41.1 with `appendPendingSteer`).
8
+ - **Now.** `steerPriorityOf(x)` (src/core/task-notification.ts, the priority word's home; exported) is the one reading — `x.priority ?? "next"` — used by both comparators and by the admission default; `omitted→next`, `next→omitted` and `omitted→omitted` are the idempotent replay (queue unchanged), `next→later` / `next→now` still refuse. Parked rows are written as before (the field stays optional); old rows read through the same default.
9
+ - **Who is hurt.** Nobody: a refusal that was never correct goes away; a real priority change still refuses.
10
+ - **Consumers.** server — S-1121: pin `7.41.2`, flip the probe cell, delete the MIGRATION / contract sentence about this boundary; client-core — none (one export added).
11
+ - Pins: `test/backlog1361-steer-priority-one-reading.test.ts` (A–F from the reproduction; base 7.41.1 red on omitted↔next and on the live check); `test/export-surface.snapshot.json` (+1 name).
12
+
13
+ ## 7.41.1 — 2026-10-05
14
+
15
+ **Hard-breaking changes:** none. **Closed sets:** none added (two existing sets become reachable from the package root). **Package exports:** +5 / −0 — `SKILL_GRANT_ORIGINS`, `SKILL_ENTRY_INERT_REASONS`, types `SkillGrantOrigin`, `SkillEntryInertReason` (all defined in 7.41.0, re-exported now), and `mintNamespacePrefix` (#1355, defined since the namespace minting landed, re-exported now).
16
+
17
+ ### The two skill-grant vocabularies are on the package root (#1347; surface only; +4 exports) (@client-core @server)
18
+
19
+ - **Before (v7.41.0).** `SKILL_GRANT_ORIGINS` (`model` / `user` / `inherited`) and `SKILL_ENTRY_INERT_REASONS` (`wildcard_all` / `namespace_wildcard` / `path_pattern` / `domain` / `content_unsupported` / `grammar`) and their two types were declared in `dist/core/skill-grant.d.ts` and not re-exported from `index.d.ts`; the 7.41.0 ship post called them consumable closed sets because the wire manifest scans every `dist/` file, not the package root.
20
+ - **Now.** Both constants and both types are re-exported from the package root beside `RULE_TOOL_NAME_VERDICTS`; the consumer smoke probe asserts their presence.
21
+ - **Who is hurt.** Nobody: additive.
22
+ - **Consumers.** client-core — generate the two mirrors from the package root (CC-338). server — none.
23
+ - Pins: `test/export-surface.snapshot.json` (+4 names); `scripts/consumer-smoke-probe.mjs` (two new object entries, run by `gate:blackbox`).
24
+
25
+ ### The peer-segment minter is on the package root (#1355 part one; surface only; +1 export) (@server)
26
+
27
+ - **Before (v7.41.0).** A covering-form rule such as `mcp__github.com` (two segments, accepted since #1156) or `mcp__github.com__*` was compiled and stored as written, while the engine mints the peer segment normalized (character set, length clamp with a digest suffix, separator fold: `mcp__github_com__`). The rule's segment and the minted segment are compared byte for byte, so such a rule never matches — a deny that reads protective and is inert. Nothing on the package root let a rule writer ask "is this segment one the engine mints?".
28
+ - **Now.** `mintNamespacePrefix(ns, peer)` (src/core/protocol-naming.ts) is re-exported from the package root beside `PROTOCOL_TABLE` / `MCP_NAMESPACE` / `A2A_NAMESPACE`: a rule writer mints the prefix for the rule's peer and compares it with the rule's own spelling. Part two (7.42.0): `judgeRuleToolName` gains the verdict `unmintable_segment` with the minted spelling as `currentName`, and both rule compilers refuse through that one judge.
29
+ - **Who is hurt.** Nobody: additive.
30
+ - **Consumers.** server — S-1113: judge `permissions.deny` / `APPROVAL_DENY` covering-form rules at the door until the 7.42.0 verdict lands.
31
+ - Pins: `test/export-surface.snapshot.json` (+1 name); `scripts/consumer-smoke-probe.mjs` (one new function entry, run by `gate:blackbox`).
32
+
1
33
  ## 7.41.0 — 2026-10-04
2
34
 
3
35
  **Hard-breaking changes:** one — #1303. **#1303 — Before:** a skill that declared `allowed-tools` (or a host's `SkillSpec.manifest.allowTools`) narrowed the whole task once activated: every unlisted tool was refused (`allowPaths` fenced writes to directories), the listed ones still asked where they always asked, and activating it asked nobody. **#1303 — Who is hurt:** a deployment that relied on a skill's list to fence the model — an unlisted tool is now judged as usual (asked under an asking mode, run under `bypassPermissions` or a deployment allow) and a listed one runs without asking for the rest of the run; a host that hand-built `SkillSpec.manifest` (now refused by name: `config.spec_retired_key`) or wrote `allowPaths` (the write fence is gone), imported the deleted `SkillManifest` type or `skillScopeWriteToolNames`, passed the retired `deployedTools` option to `createSkillsFromDirectory` (refused: `config.deps_retired_key`) or matched on one of its three removed warning codes, or built an auto-promote record with `manifest` / `gate3Scoped` / `lineageId` or passed a manifest to `deriveTripwire`; an embedder with no approver under an asking mode (activating a skill that declares a list is now a card nobody answers — refused); a deployment policy that returns an unmarked `ask` (class `ordinary`) for a listed tool (the list clears it, as a stored allow rule would); a delegation tool that read `ctx.activeSkillScope()` (renamed `ctx.activeSkillGrants()`). **#1303 — Compensation:** fence tools with deny rules (a deployment deny list, a person's deny row) or a delegated agent definition's `allowTools`; fence write paths with session `allowDirs` / the write face (`createSessionRulePolicy`, the fs-write gate); mark a policy's question `mandated` / `requiresRealApproval` (or write an ask rule) when it must reach a person; with no approver, name `Skill` in an allow list or run `bypassPermissions`; move `manifest.allowTools` to `SkillSpec.allowedTools`; drop `deployedTools` (the loader copies every entry and the run's grant table reads it); give `deriveTripwire` the artifact's `{ allowedTools }` and drop `manifest` / `gate3Scoped` / `lineageId` from the promoted record. Everything else in this version adds, tightens or re-words: #1118 adds optional members and text lines; #1294 changes which hook seats fire for a call approved on a parked checkpoint (a PreToolUse seat now sees that call again on the resumed leg); #1307 / #1308 re-word request-time refusals of the file stores (no on-disk location in the sentence; the location rides the store's disclosure seat); #1309 turns a session's enumeration over its own damaged row from a short list into a refusal; #1310 and #1314 change model-facing text only; #1156 refuses a retired or prefix-less `__` tool name at the session-rules write (it used to fail every later run instead); #1328 refuses a resumed `Skill` call whose final arguments select another skill than the card named. **Closed sets:** `DecisionReason` +1 `skill`; `ASK_CLASSES` / `AskClass` +1 `requires_user_interaction` (`MODE_ARBITRATION` +1 row; `RELEASABLE_ASK_CLASSES` and `PERSISTED_RULE_MANDATES` unchanged); `ENGINE_NOTICE_CODES` +1 `skills.allowed_tool_not_granted` (audience `operator`, minter `engine`); trace kinds +1 `permission.skill_allowed`; config refusal codes +1 `config.user_invoked_skill_unknown`; `CheckpointErrorReason` +1 `skill_grants_damaged` and `CheckpointError.detail.field` +1 `boundGrantDigest` (both on the existing `checkpoint.invalid_outcome`); `SessionPolicyError.code` +1 `legacy_tool_name` (with `detail: { field, name, verdict, currentName? }`); new closed set `RULE_TOOL_NAME_VERDICTS` (`current` / `retired` / `unprefixed_namespace`). **Package exports:** +22 / −2 (the entry's count 2558 → 2578). Added — #1118: `readAgentState`, `agentStateSourceOfRecord`, `agentStateSummary`, types `AgentState`, `AgentApproval`, `AgentApprovalState`, `AgentStateRow`, `AgentStateSource`, `TranscriptStep`; #1303: types `SkillGrantRecord`, `SkillGrantHit`, `SkillGrantLane`, `SkillGateSeats`, `PermissionSeatInputs`, `PermissionSeatReading`; #1308: type `FileUsageWindowStoreOptions`; #1156: `judgeRuleToolName`, `RULE_TOOL_NAME_VERDICTS`, `assertSessionRuleNamesCurrent`, types `RuleToolNameVerdict`, `SessionPolicyStoreOptions`, `SessionRuleNameRefusal`. Removed — #1303: `SkillManifest`, `skillScopeWriteToolNames`. Members — new and optional: `TaskSpec.userInvokedSkills`, `SkillSpec.allowedTools` / `disallowedTools`, `CheckpointState.skillGrants`, the `tool_approval` pending action's `boundGrantDigest`, `ToolGateInput.requiresUserInteraction`, `UnifiedTaskOutput.agentState`, `AgentPollDetailsInput.agentState`, `ListAgentsRow.agentState`, `serveDurableAgentRowLane(row, agentState?)`, `checkpointSeat` on `AgentTranscriptToolOptions` / `ListAgentsToolOptions` / `TaskToolOptions` / `TaskPollOptions`, `TaskRegistry.agentStateSource` (new method), `FileUsageWindowStore`'s constructor options and `createFileTaskListStore`'s `onCorruptRead`, `mountedToolNames` on both session-rules stores (`FileStorageBackendOptions.sessionPolicy` forwards it), `loosenReasons`' third parameter; `AgentTranscriptToolOptions.registry` widens to `Pick<TaskRegistry, "getAccessibleTask"> & Partial<Pick<TaskRegistry, "agentStateSource">>` (a full `TaskRegistry` still fits). Removed (the hard-breaking change above): `SkillSpec.manifest` (a host still passing it is refused by name), `SkillsDirectoryOptions.deployedTools` (refused by name), three `SkillsDirectoryWarningCode` words (`allowed_tool_pattern_unsupported`, `allowed_tool_not_mounted`, `disallowed_tools_unenforced`), `PromotedRecord.manifest` / `gate3Scoped` / `lineageId`; `deriveTripwire`'s second parameter is `Pick<SkillSpec, "allowedTools">` (was `SkillManifest`).
@@ -1,7 +1,7 @@
1
1
  import type { GateOutcome } from "./gate-outcome.js";
2
2
  import { type ExecutionOutcomeRecordWord } from "./checkpoint-execution-record.js";
3
3
  import type { CheckpointPause } from "./pause-registry.js";
4
- import type { SystemInjectionPriority } from "./task-notification.js";
4
+ import { type SystemInjectionPriority } from "./task-notification.js";
5
5
  import { type QuestionAnswer } from "./ask-question.js";
6
6
  import type { ReadEntry } from "../tools/fs/safety.js";
7
7
  import type { RepairBundle } from "../agents/repair-loop.js";
@@ -7,6 +7,7 @@ import { isAskOrigin, isPersistedRuleMandate } from "./ask-origin.js";
7
7
  import { checkpointExecutionRecorded, executionRecordDisposition, ExecutionOutcomeConflictError, } from "./checkpoint-execution-record.js";
8
8
  import { renderUntrustedCommandText, stripFormatCharacters } from "./permission-rule-model.js";
9
9
  import { redactSecrets } from "./untrusted-egress.js";
10
+ import { steerPriorityOf } from "./task-notification.js";
10
11
  import { ASK_USER_QUESTION_TOOL_NAME } from "./ask-question.js";
11
12
  import { isPermissionMode } from "./ask-origin.js";
12
13
  import { wireOf } from "./tool-name-readings.js";
@@ -547,7 +548,7 @@ export function readPendingSteerQueue(state) {
547
548
  function samePendingSteerPayload(a, b) {
548
549
  return (a.text === b.text &&
549
550
  a.trusted === b.trusted &&
550
- a.priority === b.priority &&
551
+ steerPriorityOf(a) === steerPriorityOf(b) &&
551
552
  a.actor?.id === b.actor?.id &&
552
553
  a.actor?.hostAsserted === b.actor?.hostAsserted &&
553
554
  a.actor?.issuer === b.actor?.issuer);
@@ -1,3 +1,4 @@
1
+ import { steerPriorityOf } from "../task-notification.js";
1
2
  const humanInputOrdinals = new WeakMap();
2
3
  export function nextHumanInputSeq(key) {
3
4
  let box = humanInputOrdinals.get(key);
@@ -18,7 +19,7 @@ export function announceAcceptance(record) {
18
19
  export function sameAcceptedSteerInput(a, b) {
19
20
  return (a.payload === b.payload &&
20
21
  a.trusted === b.trusted &&
21
- a.priority === b.priority &&
22
+ steerPriorityOf(a) === steerPriorityOf(b) &&
22
23
  a.actor?.id === b.actor?.id &&
23
24
  a.actor?.hostAsserted === b.actor?.hostAsserted &&
24
25
  a.actor?.issuer === b.actor?.issuer);
@@ -3,7 +3,7 @@ import { snapshotActorAssertion } from "../../internal/llm.js";
3
3
  import { MAX_STEER_INPUT_ID_CHARS } from "../checkpoint-store.js";
4
4
  import { formatHookFeedback, hookSeatExpiredError, runHookSeat } from "../hooks.js";
5
5
  import { buildHumanInputEvent, frameMidTurnUserInput, projectHumanInput } from "../human-input-projection.js";
6
- import { isSystemInjectionPriority, SYSTEM_INJECTION_PRIORITIES } from "../task-notification.js";
6
+ import { isSystemInjectionPriority, steerPriorityOf, SYSTEM_INJECTION_PRIORITIES } from "../task-notification.js";
7
7
  import { deliverEngineNotice } from "../types.js";
8
8
  import { inlineUntrusted, sanitizeUntrustedText } from "../untrusted-text.js";
9
9
  import { announceAcceptance, armAcceptance, nextHumanInputSeq, sameAcceptedSteerInput } from "./steer-admission.js";
@@ -29,7 +29,7 @@ export function streamSteerVerb(input) {
29
29
  if (priorityIn !== undefined && !isSystemInjectionPriority(priorityIn)) {
30
30
  throw steeringError(`priority must be one of ${SYSTEM_INJECTION_PRIORITIES.join("/")} when supplied`, "steering.invalid_content");
31
31
  }
32
- const priority = priorityIn ?? "next";
32
+ const priority = steerPriorityOf({ priority: priorityIn });
33
33
  const actorIn = options?.actor;
34
34
  const actor = actorIn === undefined ? undefined : snapshotActorAssertion(actorIn);
35
35
  const projected = projectHumanInput({ text, actor, source: "steer" });
@@ -30,6 +30,12 @@ export declare const SYSTEM_INJECTION_PRIORITIES: readonly SystemInjectionPriori
30
30
  * no-subscriber retain path indexes `queues[priority]` and the park path stores it verbatim, so an
31
31
  * unknown value used to travel until something downstream failed on it (or didn't, and lied). */
32
32
  export declare function isSystemInjectionPriority(value: unknown): value is SystemInjectionPriority;
33
+ /** The ONE reading of a steer's priority: a parked row or an accepted input that carries none means `"next"`
34
+ * (the default the live admission has always applied) — so a retry that spells the default and a row parked
35
+ * without it are the same instruction, whichever side normalized. */
36
+ export declare function steerPriorityOf(x: {
37
+ readonly priority?: SystemInjectionPriority;
38
+ }): SystemInjectionPriority;
33
39
  export interface TaskNotificationPayload {
34
40
  task_id: string;
35
41
  /** design/144 §2: `"external"` is CORE-MINTED ONLY — `TaskStream.notify()` casts it onto every
@@ -10,6 +10,9 @@ export const SYSTEM_INJECTION_PRIORITIES = ["now", "next", "later"];
10
10
  export function isSystemInjectionPriority(value) {
11
11
  return typeof value === "string" && SYSTEM_INJECTION_PRIORITIES.includes(value);
12
12
  }
13
+ export function steerPriorityOf(x) {
14
+ return x.priority ?? "next";
15
+ }
13
16
  const TASK_NOTIFICATION_TAGS = [
14
17
  "task-notification",
15
18
  "task-id",
package/dist/index.d.ts CHANGED
@@ -145,7 +145,7 @@ export { judgeRuleToolName, RULE_TOOL_NAME_VERDICTS, type RuleToolNameVerdict }
145
145
  export { DEFAULT_SUBAGENT_TOOL_NAME } from "./agents/subagent.js";
146
146
  export { renderTaskNotificationXml, RESUPPLIED_FRAME_PREAMBLE, taskNotificationDedupKey, isDelegatedAgentTerminal, isTerminalTaskNotification, SystemInjectionQueue, type TaskNotificationPayload, type TaskNotificationStatus, type ExternalNotificationInput, type SystemInjection, type SystemInjectionPriority, type NotificationInjectionOutcome, // the injector's outcome words (`parked_durably` = the session's durable box took the frame)
147
147
  NOTIFICATION_INJECTION_OUTCOMES, // …and their value half + guard, so a host wiring its own uplink validates a reported outcome without duplicating the vocabulary
148
- isNotificationInjectionOutcome, SYSTEM_INJECTION_PRIORITIES, isSystemInjectionPriority, AGENT_MESSAGE_TAG, renderAgentMessageFrame, type SemaProvenance, HANDBACK_STATES, type HandbackState, COMPACTION_KINDS, type CompactionKind, handbackStateOf, terminalFrameFacets, } from "./core/task-notification.js";
148
+ isNotificationInjectionOutcome, SYSTEM_INJECTION_PRIORITIES, isSystemInjectionPriority, steerPriorityOf, AGENT_MESSAGE_TAG, renderAgentMessageFrame, type SemaProvenance, HANDBACK_STATES, type HandbackState, COMPACTION_KINDS, type CompactionKind, handbackStateOf, terminalFrameFacets, } from "./core/task-notification.js";
149
149
  export { TOOL_FAMILIES, TOOL_MOUNT_TAGS, TOOL_APPROVAL_CARDS, TOOL_PATH_ACCESSES, TOOL_PATH_BASES, TOOL_PATH_ABSENCES, TOOL_WIRE_NAME_MAX_CHARS, TOOL_CONTRACT_MAX_CHARS, TOOL_CARD_ID_MAX_CHARS, TOOL_KEY_MAX_CHARS, TOOL_KEYS_MAX, RENDER_HINT_MAX_CHARS, RENDER_HINT_ACTIVITY_MAX_CHARS, RENDER_HINT_MAX_LIST, type ToolFamily, type ToolMountTag, type ToolApprovalCard, type ToolPathAccess, type ToolPathBase, type ToolPathAbsence, type ToolPathTarget, type ToolCallPathTarget, type ToolRosterPathTarget, pathTargetSlotOnly, type ToolRuleFace, type ToolRenderHints, type ToolFaceDeclaration, type ToolCatalogEntry, } from "./core/tool-face.js";
150
150
  export { describeToolCatalog, catalogEntriesNamed, catalogToolNames, catalogRuleFaceOf, pathTargetOf, pathTargetValue, protectivePathTargetOf, declaredPathTargetOf, BARE_REQUEST_CODE, isProtectedWrite, isDeclaredWrite, fileOpAccessOf, type ToolCallLike, pathConfinableWriteToolNames, pathTargetingToolNames, compactableToolNames, budgetExemptToolNames, handBandEffects, engineCardTypes, predictMountedToolNames, HANDS_BAND_TAGS, MOUNT_TAG_IN_HANDS_BAND, } from "./core/tool-registry.js";
151
151
  export { ToolRosterEntry, ToolRoster, ToolRosterDelta, ToolRosterRenderHints, ROSTER_SOURCES, type RosterSource, type ToolIdentity, toolIdentityOf, mintCapabilityId, diffToolRoster, judgeParkedToolIdentity, ruleFacesFromRoster, toolCallFaceOf, rosterToolName, ruleNamesOf, inputKeysOf, ruleFaceOfInstance, rosterMemberBoundProblem, type RosterBoundMembers, type RosterBoundCode, ToolRosterDeltaSeat, } from "./core/tool-roster.js";
@@ -198,7 +198,9 @@ export { type AskOrigin, ASK_ORIGINS, isAskOrigin, ORIGIN_IMPLIES_REAL_APPROVAL,
198
198
  export { PERMISSION_MODES, type PermissionMode, isPermissionMode, PERMISSION_MODE_RANK, clampPermissionMode, ASK_CLASSES, type AskClass, isAskClass, MODE_ARBITRATION, type ModeArbitrationRow, RELEASABLE_ASK_CLASSES, MODE_RELEASE_REASONS, type ModeReleaseReason, isModeReleaseReason, RRA_EXPLAINERS, classifyAsk, foldArbitrationRow, type AskClassification, type AskClassFacts, type ToolMarkSource, arbitrateByMode, type Arbitration, fileCommandOptionsSentence } from "./core/ask-origin.js";
199
199
  export { modePolicyOf, type ModePolicy, PERMISSION_MODE_FOLD_REASONS, type PermissionModeFoldReason, type PermissionModeReceipt, ACCEPT_EDITS_FILE_COMMANDS, modeAcceptsFileCommand } from "./core/mode-policy.js";
200
200
  export type { PermissionSeatInputs, PermissionSeatReading } from "./core/mode-policy.js";
201
- export type { SkillGateSeats, SkillGrantHit, SkillGrantLane, SkillGrantRecord } from "./core/skill-grant.js";
201
+ export type { SkillEntryInertReason, SkillGateSeats, SkillGrantHit, SkillGrantLane, SkillGrantOrigin, SkillGrantRecord } from "./core/skill-grant.js";
202
+ export { SKILL_ENTRY_INERT_REASONS, SKILL_GRANT_ORIGINS } from "./core/skill-grant.js";
203
+ export { mintNamespacePrefix } from "./core/protocol-naming.js";
202
204
  export { readDenyClassifierRules, renderClassifierDenyRules, type DerivedDenyRule } from "./core/auto-mode-prompt.js";
203
205
  export { AUTO_MODE_DENY_SOURCES, isAutoModeDenySource, type AutoModeDenySource } from "./core/runtime-caps.js";
204
206
  export { SETTLEMENT_KINDS, type SettlementKind, isSettlementKind, type Settlement, SETTLEMENT_PARTIES, type SettlementParty, isSettlementParty, SETTLEMENT_IS_REFUSAL, DENIED_BY_VALUES, type DeniedBy, isDeniedBy, DENIED_BY_MAY_VETO, CLASSIFIER_DENY_CAUSES, type ClassifierDenyCause, isClassifierDenyCause, DENIED_BY_MAY_CARRY_CAUSE, type GateDisposition, type GateOutcome, type ModeRelease, type ModeRefusal, screenGateOutcome } from "./core/gate-outcome.js";
package/dist/index.js CHANGED
@@ -117,7 +117,7 @@ export { createFsWriteGatePolicy, WRITE_EXEMPT_DIR_COVERS_ROOT_CODE } from "./co
117
117
  export { RETIRED_TOOL_NAMES } from "./core/tool-name-aliases.js";
118
118
  export { judgeRuleToolName, RULE_TOOL_NAME_VERDICTS } from "./core/tool-name-aliases.js";
119
119
  export { DEFAULT_SUBAGENT_TOOL_NAME } from "./agents/subagent.js";
120
- export { renderTaskNotificationXml, RESUPPLIED_FRAME_PREAMBLE, taskNotificationDedupKey, isDelegatedAgentTerminal, isTerminalTaskNotification, SystemInjectionQueue, NOTIFICATION_INJECTION_OUTCOMES, isNotificationInjectionOutcome, SYSTEM_INJECTION_PRIORITIES, isSystemInjectionPriority, AGENT_MESSAGE_TAG, renderAgentMessageFrame, HANDBACK_STATES, COMPACTION_KINDS, handbackStateOf, terminalFrameFacets, } from "./core/task-notification.js";
120
+ export { renderTaskNotificationXml, RESUPPLIED_FRAME_PREAMBLE, taskNotificationDedupKey, isDelegatedAgentTerminal, isTerminalTaskNotification, SystemInjectionQueue, NOTIFICATION_INJECTION_OUTCOMES, isNotificationInjectionOutcome, SYSTEM_INJECTION_PRIORITIES, isSystemInjectionPriority, steerPriorityOf, AGENT_MESSAGE_TAG, renderAgentMessageFrame, HANDBACK_STATES, COMPACTION_KINDS, handbackStateOf, terminalFrameFacets, } from "./core/task-notification.js";
121
121
  export { TOOL_FAMILIES, TOOL_MOUNT_TAGS, TOOL_APPROVAL_CARDS, TOOL_PATH_ACCESSES, TOOL_PATH_BASES, TOOL_PATH_ABSENCES, TOOL_WIRE_NAME_MAX_CHARS, TOOL_CONTRACT_MAX_CHARS, TOOL_CARD_ID_MAX_CHARS, TOOL_KEY_MAX_CHARS, TOOL_KEYS_MAX, RENDER_HINT_MAX_CHARS, RENDER_HINT_ACTIVITY_MAX_CHARS, RENDER_HINT_MAX_LIST, pathTargetSlotOnly, } from "./core/tool-face.js";
122
122
  export { describeToolCatalog, catalogEntriesNamed, catalogToolNames, catalogRuleFaceOf, pathTargetOf, pathTargetValue, protectivePathTargetOf, declaredPathTargetOf, BARE_REQUEST_CODE, isProtectedWrite, isDeclaredWrite, fileOpAccessOf, pathConfinableWriteToolNames, pathTargetingToolNames, compactableToolNames, budgetExemptToolNames, handBandEffects, engineCardTypes, predictMountedToolNames, HANDS_BAND_TAGS, MOUNT_TAG_IN_HANDS_BAND, } from "./core/tool-registry.js";
123
123
  export { ToolRosterEntry, ToolRoster, ToolRosterDelta, ToolRosterRenderHints, ROSTER_SOURCES, toolIdentityOf, mintCapabilityId, diffToolRoster, judgeParkedToolIdentity, ruleFacesFromRoster, toolCallFaceOf, rosterToolName, ruleNamesOf, inputKeysOf, ruleFaceOfInstance, rosterMemberBoundProblem, ToolRosterDeltaSeat, } from "./core/tool-roster.js";
@@ -162,6 +162,8 @@ export {} from "./core/read-root-grant-screen.js";
162
162
  export { ASK_ORIGINS, isAskOrigin, ORIGIN_IMPLIES_REAL_APPROVAL, PERSISTED_RULE_MANDATES, isPersistedRuleMandate, screenAskClassMembers } from "./core/ask-origin.js";
163
163
  export { PERMISSION_MODES, isPermissionMode, PERMISSION_MODE_RANK, clampPermissionMode, ASK_CLASSES, isAskClass, MODE_ARBITRATION, RELEASABLE_ASK_CLASSES, MODE_RELEASE_REASONS, isModeReleaseReason, RRA_EXPLAINERS, classifyAsk, foldArbitrationRow, arbitrateByMode, fileCommandOptionsSentence } from "./core/ask-origin.js";
164
164
  export { modePolicyOf, PERMISSION_MODE_FOLD_REASONS, ACCEPT_EDITS_FILE_COMMANDS, modeAcceptsFileCommand } from "./core/mode-policy.js";
165
+ export { SKILL_ENTRY_INERT_REASONS, SKILL_GRANT_ORIGINS } from "./core/skill-grant.js";
166
+ export { mintNamespacePrefix } from "./core/protocol-naming.js";
165
167
  export { readDenyClassifierRules, renderClassifierDenyRules } from "./core/auto-mode-prompt.js";
166
168
  export { AUTO_MODE_DENY_SOURCES, isAutoModeDenySource } from "./core/runtime-caps.js";
167
169
  export { SETTLEMENT_KINDS, isSettlementKind, SETTLEMENT_PARTIES, isSettlementParty, SETTLEMENT_IS_REFUSAL, DENIED_BY_VALUES, isDeniedBy, DENIED_BY_MAY_VETO, CLASSIFIER_DENY_CAUSES, isClassifierDenyCause, DENIED_BY_MAY_CARRY_CAUSE, screenGateOutcome } from "./core/gate-outcome.js";
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@sema-agent/core",
3
- "version": "7.41.0",
3
+ "version": "7.41.2",
4
4
  "description": "Stateless, task-oriented AI agent core",
5
5
  "type": "module",
6
6
  "license": "BUSL-1.1",
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "_comment": "design/87 L3 — frozen public export surface of src/index.ts (name -> kind). DO NOT edit by hand to silence a red test. A removed/changed entry = a SemVer-BREAKING change; bump MAJOR and update this fixture in the SAME commit (design/87 §4.2 / §5.2). Regenerate via REGEN in test/export-surface.test.ts.",
3
3
  "_tierComment": "#435 v1 — machine-readable layering of the public surface: stable = demonstrated by README.md / src/examples; internal = an `Internal`-marked name or a runner/engine deep-subtree declaration (the model seam src/engine/llm is excluded — it is the BYOM contract, not an engine internal); advanced = a supported export the front door does not walk you through. THIS IS AN INITIAL HEURISTIC, derived mechanically and expected to be refined ticket by ticket: no human reviewed these 1700+ entries one by one, and nothing here claims otherwise. Known bias: a short or English-word export name (ok, err, Result, Usage) can match ordinary prose in README.md and land `stable` on a coincidence. Every export MUST carry a tier — a new export with no row fails the gate in export-surface.test.ts.",
4
- "count": 2578,
4
+ "count": 2584,
5
5
  "exports": {
6
6
  "A2ATaskState": "type",
7
7
  "A2ATaskStateReversal": "type",
@@ -1337,6 +1337,8 @@
1337
1337
  "SHELL_READ_FINDING_RANK": "variable",
1338
1338
  "SHELL_READ_SEATS": "variable",
1339
1339
  "SHELL_WRAPPER_TABLE": "variable",
1340
+ "SKILL_ENTRY_INERT_REASONS": "variable",
1341
+ "SKILL_GRANT_ORIGINS": "variable",
1340
1342
  "SKILL_TOOL_NAME": "variable",
1341
1343
  "STALE_RUNNING_REAP_ATTRIBUTION": "variable",
1342
1344
  "STARTER_RULES": "variable",
@@ -1448,9 +1450,11 @@
1448
1450
  "SideQueryResult": "interface",
1449
1451
  "SideQuerySpec": "interface",
1450
1452
  "SideQueryToolDef": "interface",
1453
+ "SkillEntryInertReason": "type",
1451
1454
  "SkillGateSeats": "interface",
1452
1455
  "SkillGrantHit": "interface",
1453
1456
  "SkillGrantLane": "interface",
1457
+ "SkillGrantOrigin": "type",
1454
1458
  "SkillGrantRecord": "interface",
1455
1459
  "SkillSpec": "interface",
1456
1460
  "SkillsDirectoryOptions": "interface",
@@ -2228,6 +2232,7 @@
2228
2232
  "mintCheckpointToken": "function",
2229
2233
  "mintExposurePartitionedPlan": "function",
2230
2234
  "mintLlmConsolidationPlan": "function",
2235
+ "mintNamespacePrefix": "function",
2231
2236
  "mintPeerRef": "function",
2232
2237
  "mintPeerSessionCandidates": "function",
2233
2238
  "mintReminderMark": "function",
@@ -2510,6 +2515,7 @@
2510
2515
  "splitWorkflowMeta": "function",
2511
2516
  "sqliteQuery": "function",
2512
2517
  "startWorkflow": "function",
2518
+ "steerPriorityOf": "function",
2513
2519
  "storeReadBackShapeContract": "function",
2514
2520
  "stripEngineMetadata": "function",
2515
2521
  "stripFormatCharacters": "function",
@@ -3917,6 +3923,8 @@
3917
3923
  "SHELL_READ_FINDING_RANK": "advanced",
3918
3924
  "SHELL_READ_SEATS": "advanced",
3919
3925
  "SHELL_WRAPPER_TABLE": "advanced",
3926
+ "SKILL_ENTRY_INERT_REASONS": "advanced",
3927
+ "SKILL_GRANT_ORIGINS": "advanced",
3920
3928
  "SKILL_TOOL_NAME": "internal",
3921
3929
  "STALE_RUNNING_REAP_ATTRIBUTION": "advanced",
3922
3930
  "STARTER_RULES": "advanced",
@@ -4028,9 +4036,11 @@
4028
4036
  "SideQueryResult": "advanced",
4029
4037
  "SideQuerySpec": "advanced",
4030
4038
  "SideQueryToolDef": "advanced",
4039
+ "SkillEntryInertReason": "advanced",
4031
4040
  "SkillGateSeats": "advanced",
4032
4041
  "SkillGrantHit": "advanced",
4033
4042
  "SkillGrantLane": "advanced",
4043
+ "SkillGrantOrigin": "advanced",
4034
4044
  "SkillGrantRecord": "advanced",
4035
4045
  "SkillSpec": "stable",
4036
4046
  "SkillsDirectoryOptions": "advanced",
@@ -4808,6 +4818,7 @@
4808
4818
  "mintCheckpointToken": "advanced",
4809
4819
  "mintExposurePartitionedPlan": "advanced",
4810
4820
  "mintLlmConsolidationPlan": "advanced",
4821
+ "mintNamespacePrefix": "advanced",
4811
4822
  "mintPeerRef": "advanced",
4812
4823
  "mintPeerSessionCandidates": "advanced",
4813
4824
  "mintReminderMark": "advanced",
@@ -5090,6 +5101,7 @@
5090
5101
  "splitWorkflowMeta": "advanced",
5091
5102
  "sqliteQuery": "advanced",
5092
5103
  "startWorkflow": "advanced",
5104
+ "steerPriorityOf": "advanced",
5093
5105
  "storeReadBackShapeContract": "advanced",
5094
5106
  "stripEngineMetadata": "advanced",
5095
5107
  "stripFormatCharacters": "advanced",
@@ -0,0 +1,159 @@
1
+ {
2
+ "repo": "core",
3
+ "version": "7.41.1",
4
+ "from": "e91ad31a94f1ea1688241d5bb9e5e278986f3d23",
5
+ "to": "08eee448c5a848592a8c12684867cd423eac5d95",
6
+ "added": [
7
+ {
8
+ "name": "SKILL_ENTRY_INERT_REASONS",
9
+ "kind": "variable",
10
+ "tier": "advanced",
11
+ "at": [
12
+ "src/core/skill-grant.ts:65",
13
+ "src/index.ts:1470"
14
+ ],
15
+ "criteriaCovered": false,
16
+ "breaking": false
17
+ },
18
+ {
19
+ "name": "SKILL_GRANT_ORIGINS",
20
+ "kind": "variable",
21
+ "tier": "advanced",
22
+ "at": [
23
+ "src/core/skill-grant.ts:46",
24
+ "src/index.ts:1470"
25
+ ],
26
+ "criteriaCovered": false,
27
+ "breaking": false
28
+ },
29
+ {
30
+ "name": "SkillEntryInertReason",
31
+ "kind": "type",
32
+ "tier": "advanced",
33
+ "at": [
34
+ "src/core/skill-grant.ts:66",
35
+ "src/index.ts:1469"
36
+ ],
37
+ "criteriaCovered": false,
38
+ "breaking": false
39
+ },
40
+ {
41
+ "name": "SkillGrantOrigin",
42
+ "kind": "type",
43
+ "tier": "advanced",
44
+ "at": [
45
+ "src/core/skill-grant.ts:47",
46
+ "src/index.ts:1469"
47
+ ],
48
+ "criteriaCovered": false,
49
+ "breaking": false
50
+ },
51
+ {
52
+ "name": "mintNamespacePrefix",
53
+ "kind": "function",
54
+ "tier": "advanced",
55
+ "at": [
56
+ "src/core/protocol-naming.ts:114",
57
+ "src/index.ts:1471"
58
+ ],
59
+ "criteriaCovered": false,
60
+ "breaking": false
61
+ }
62
+ ],
63
+ "removed": [],
64
+ "changed": [],
65
+ "narrowed": [],
66
+ "closedSetMembers": [],
67
+ "closedSetsUnreadable": [],
68
+ "typeKeys": [],
69
+ "typeKeysUnreadableArms": [],
70
+ "typeKeysFlattenedCount": 225,
71
+ "signatures": [],
72
+ "declarationMoves": [
73
+ {
74
+ "name": "SKILL_ENTRY_INERT_REASONS",
75
+ "kind": "variable",
76
+ "onSurface": true,
77
+ "from": [
78
+ "src/core/skill-grant.ts"
79
+ ],
80
+ "to": [
81
+ "src/core/skill-grant.ts",
82
+ "src/index.ts"
83
+ ]
84
+ },
85
+ {
86
+ "name": "SKILL_GRANT_ORIGINS",
87
+ "kind": "variable",
88
+ "onSurface": true,
89
+ "from": [
90
+ "src/core/skill-grant.ts"
91
+ ],
92
+ "to": [
93
+ "src/core/skill-grant.ts",
94
+ "src/index.ts"
95
+ ]
96
+ },
97
+ {
98
+ "name": "SkillEntryInertReason",
99
+ "kind": "type",
100
+ "onSurface": true,
101
+ "from": [
102
+ "src/core/skill-grant.ts"
103
+ ],
104
+ "to": [
105
+ "src/core/skill-grant.ts",
106
+ "src/index.ts"
107
+ ]
108
+ },
109
+ {
110
+ "name": "SkillGrantOrigin",
111
+ "kind": "type",
112
+ "onSurface": true,
113
+ "from": [
114
+ "src/core/skill-grant.ts"
115
+ ],
116
+ "to": [
117
+ "src/core/skill-grant.ts",
118
+ "src/index.ts"
119
+ ]
120
+ },
121
+ {
122
+ "name": "mintNamespacePrefix",
123
+ "kind": "function",
124
+ "onSurface": true,
125
+ "from": [
126
+ "src/core/protocol-naming.ts"
127
+ ],
128
+ "to": [
129
+ "src/core/protocol-naming.ts",
130
+ "src/index.ts"
131
+ ]
132
+ }
133
+ ],
134
+ "mintMoves": [],
135
+ "criteriaObserves": [
136
+ {
137
+ "kind": "typeMember",
138
+ "name": "ProtocolNamespace.makeName",
139
+ "assertions": [
140
+ "G1.b"
141
+ ]
142
+ },
143
+ {
144
+ "kind": "typeMember",
145
+ "name": "ProtocolNamespace.prefix",
146
+ "assertions": [
147
+ "G1.a"
148
+ ]
149
+ }
150
+ ],
151
+ "consumersHint": {
152
+ "cli": [],
153
+ "server": [],
154
+ "sdk": [],
155
+ "note": "scanned cli@e790a1ca server@4160110a sdk@ee3b981 — a name listed is MENTIONED there today, which is evidence of consumption, not proof of it"
156
+ },
157
+ "breakingCount": 0,
158
+ "breakingItems": []
159
+ }
@@ -0,0 +1,54 @@
1
+ {
2
+ "repo": "core",
3
+ "version": "7.41.2",
4
+ "from": "b8c8666207a044498ac37fb36d14304a66ea5a92",
5
+ "to": "96a0ef21bc1d7887c1016b1762fcb9efaae02252",
6
+ "added": [
7
+ {
8
+ "name": "steerPriorityOf",
9
+ "kind": "function",
10
+ "tier": "advanced",
11
+ "at": [
12
+ "src/core/task-notification.ts:49",
13
+ "src/index.ts:1004"
14
+ ],
15
+ "criteriaCovered": false,
16
+ "breaking": false
17
+ }
18
+ ],
19
+ "removed": [],
20
+ "changed": [],
21
+ "narrowed": [],
22
+ "closedSetMembers": [],
23
+ "closedSetsUnreadable": [],
24
+ "typeKeys": [],
25
+ "typeKeysUnreadableArms": [],
26
+ "typeKeysFlattenedCount": 225,
27
+ "signatures": [],
28
+ "declarationMoves": [],
29
+ "mintMoves": [],
30
+ "criteriaObserves": [
31
+ {
32
+ "kind": "typeMember",
33
+ "name": "PendingSteerEntry.inputId",
34
+ "assertions": [
35
+ "G1.b"
36
+ ]
37
+ },
38
+ {
39
+ "kind": "typeMember",
40
+ "name": "PendingSteerEntry.priority",
41
+ "assertions": [
42
+ "G1.a"
43
+ ]
44
+ }
45
+ ],
46
+ "consumersHint": {
47
+ "cli": [],
48
+ "server": [],
49
+ "sdk": [],
50
+ "note": "scanned cli@e790a1ca server@4160110a sdk@bc45b50 — a name listed is MENTIONED there today, which is evidence of consumption, not proof of it"
51
+ },
52
+ "breakingCount": 0,
53
+ "breakingItems": []
54
+ }