@sema-agent/core 5.37.0 → 5.39.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.
Files changed (58) hide show
  1. package/CHANGELOG.md +151 -0
  2. package/dist/agents/send-message-tool.d.ts +8 -0
  3. package/dist/agents/send-message-tool.js +8 -0
  4. package/dist/agents/subagent.js +6 -0
  5. package/dist/agents/teacher.js +12 -3
  6. package/dist/agents/team.d.ts +7 -1
  7. package/dist/agents/team.js +11 -9
  8. package/dist/agents/verify.js +12 -3
  9. package/dist/core/auto-mode-prompt-assets.d.ts +5 -3
  10. package/dist/core/auto-mode-prompt-assets.js +1 -1
  11. package/dist/core/checkpoint-store.d.ts +26 -1
  12. package/dist/core/hooks.d.ts +152 -2
  13. package/dist/core/hooks.js +65 -7
  14. package/dist/core/mailbox-store.d.ts +39 -0
  15. package/dist/core/mailbox-store.js +9 -0
  16. package/dist/core/permission-rule-consent.d.ts +27 -4
  17. package/dist/core/permission-rule-consent.js +29 -4
  18. package/dist/core/permission-rule-model.d.ts +7 -1
  19. package/dist/core/runner/prepare-config-doors.d.ts +17 -0
  20. package/dist/core/runner/prepare-config-doors.js +33 -2
  21. package/dist/core/runner/prepare-task.d.ts +17 -2
  22. package/dist/core/runner/prepare-task.js +135 -44
  23. package/dist/core/runner/runtask.js +46 -11
  24. package/dist/core/sensitive-path-policy.js +3 -3
  25. package/dist/core/store-contracts/mailbox-store-contract.d.ts +29 -1
  26. package/dist/core/store-contracts/mailbox-store-contract.js +78 -0
  27. package/dist/core/tool-model-gate.d.ts +125 -0
  28. package/dist/core/tool-model-gate.js +303 -0
  29. package/dist/core/tool-policy.d.ts +1 -1
  30. package/dist/core/types.d.ts +210 -1
  31. package/dist/core/types.js +21 -0
  32. package/dist/core/untrusted-text.d.ts +1 -1
  33. package/dist/core/write-protect.d.ts +93 -0
  34. package/dist/core/write-protect.js +194 -0
  35. package/dist/index.d.ts +7 -5
  36. package/dist/index.js +5 -3
  37. package/dist/orchestration/builtin-workflows.d.ts +68 -6
  38. package/dist/orchestration/builtin-workflows.js +26 -9
  39. package/dist/orchestration/governance-baseline-validity.d.ts +44 -0
  40. package/dist/orchestration/governance-baseline-validity.js +55 -0
  41. package/dist/orchestration/run-workflow-tool.d.ts +10 -1
  42. package/dist/orchestration/run-workflow-tool.js +99 -31
  43. package/dist/orchestration/workflow-script-runner.js +9 -4
  44. package/dist/orchestration/workflow-script-store.d.ts +8 -3
  45. package/dist/prompts/coordinator.d.ts +4 -1
  46. package/dist/prompts/coordinator.js +8 -0
  47. package/dist/prompts/default.d.ts +14 -4
  48. package/dist/prompts/default.js +2 -1
  49. package/dist/scenarios/full-body.d.ts +5 -0
  50. package/dist/scenarios/full-body.js +8 -4
  51. package/dist/tools/fs/fs-shared.d.ts +3 -2
  52. package/dist/tools/fs/fs-shared.js +19 -9
  53. package/dist/tools/fs/read-deny.d.ts +15 -5
  54. package/dist/tools/fs/read-deny.js +33 -12
  55. package/dist/tools/fs/safety.d.ts +4 -1
  56. package/dist/tools/fs/safety.js +4 -2
  57. package/package.json +1 -1
  58. package/test/export-surface.snapshot.json +24 -1
@@ -28,6 +28,8 @@ export interface CodeToolsConfig {
28
28
  * parity: TodoWrite is enabled only when the task list is off). With `taskList` on (the default),
29
29
  * TodoWrite is NOT mounted even when `todoWrite: true` is set explicitly — the exclusion gate wins;
30
30
  * pass `taskList: false` to get TodoWrite back. `todoWrite: false` always drops it.
31
+ * design/277: the DEFAULT arm (undefined) is model-gated (`modelGate: "task-scaffold"` — trimmed
32
+ * at prepare for gate-table models); an EXPLICIT `true` mounts unstamped (never gated).
31
33
  */
32
34
  todoWrite?: boolean;
33
35
  /**
@@ -36,6 +38,9 @@ export interface CodeToolsConfig {
36
38
  * list is on unless explicitly disabled, and TodoWrite is its off-state fallback — the two families
37
39
  * are mutually exclusive, never co-mounted). Only an explicit `taskList: false` reverts to the
38
40
  * TodoWrite shape.
41
+ * design/277: the DEFAULT arm (undefined) is model-gated (`modelGate: "task-scaffold"`); an
42
+ * EXPLICIT `true` mounts the family unstamped (never gated). `taskList: false` only selects the
43
+ * TodoWrite family shape — it is NOT an explicit demand for TodoWrite (see `todoWrite`).
39
44
  */
40
45
  taskList?: boolean;
41
46
  /**
@@ -10,11 +10,15 @@ export function assembleCodeTools(cfg = {}) {
10
10
  tools.push(createWebSearchTool(cfg.webSearch));
11
11
  if (cfg.subagent)
12
12
  tools.push(createSubagentTool({ ...cfg.subagent, systemPrompt: cfg.subagent.systemPrompt ?? CODE_SYSTEM_PROMPT }));
13
+ const stamp = (t) => ({ ...t, modelGate: "task-scaffold" });
13
14
  const taskListOn = cfg.taskList !== false;
14
- if (cfg.todoWrite !== false && !taskListOn)
15
- tools.push(createTodoWriteTool());
16
- if (taskListOn)
17
- tools.push(...createTaskListTools(cfg.taskListStore));
15
+ if (cfg.todoWrite !== false && !taskListOn) {
16
+ tools.push(cfg.todoWrite === true ? createTodoWriteTool() : stamp(createTodoWriteTool()));
17
+ }
18
+ if (taskListOn) {
19
+ const family = createTaskListTools(cfg.taskListStore);
20
+ tools.push(...(cfg.taskList === true ? family : family.map(stamp)));
21
+ }
18
22
  return tools;
19
23
  }
20
24
  export const CODE_ROLE = { systemPrompt: CODE_SYSTEM_PROMPT, thinking: "high" };
@@ -232,8 +232,9 @@ export declare function resolveBashTimeoutCaps(opts?: {
232
232
  defaultMs: number;
233
233
  maxMs: number;
234
234
  };
235
- /** Test seam: the announcement de-dupes per process, so a test that asserts the line must be able to
236
- * clear the ledger. Never called by production code. */
235
+ /** Test seam: the announcement de-dupes per sink (console arm per process), so a test that asserts
236
+ * the line must be able to re-arm the ledger. Re-arms BOTH arms (a WeakMap has no clear — it is
237
+ * re-minted). Never called by production code. */
237
238
  export declare function __resetBashTimeoutAnnouncements(): void;
238
239
  /** RB-370 ②: the seconds view of a resolved {@link resolveBashTimeoutCaps} pair — the shell's INTERNAL
239
240
  * unit stays seconds while every model-facing surface stays ms (design/64 §8.1C posture). One rounding
@@ -88,8 +88,23 @@ export function envErrorDetail(message) {
88
88
  const trimmed = (message ?? "").trim();
89
89
  return trimmed === "" ? "the execution environment reported no reason" : trimmed;
90
90
  }
91
- const announcedTimeoutConfig = new Set();
91
+ let announcedTimeoutConfigBySink = new WeakMap();
92
+ const announcedTimeoutConfigConsole = new Set();
93
+ function timeoutConfigLedger(onNotice) {
94
+ if (typeof onNotice !== "function")
95
+ return announcedTimeoutConfigConsole;
96
+ let lines = announcedTimeoutConfigBySink.get(onNotice);
97
+ if (lines === undefined) {
98
+ lines = new Set();
99
+ announcedTimeoutConfigBySink.set(onNotice, lines);
100
+ }
101
+ return lines;
102
+ }
92
103
  function emitTimeoutDiscardNotice(message, detail, onNotice) {
104
+ const ledger = timeoutConfigLedger(onNotice);
105
+ if (ledger.has(message))
106
+ return;
107
+ ledger.add(message);
93
108
  deliverEngineNotice(onNotice, { code: "config.env_timeout_discarded", message, detail });
94
109
  }
95
110
  function announceDiscardedTimeout(knob, raw, usedMs, onNotice) {
@@ -106,9 +121,6 @@ function announceDiscardedTimeout(knob, raw, usedMs, onNotice) {
106
121
  return;
107
122
  line = `${knob}=${String(raw)} was ignored — it ${defect}. Using ${usedMs}ms instead.`;
108
123
  }
109
- if (announcedTimeoutConfig.has(line))
110
- return;
111
- announcedTimeoutConfig.add(line);
112
124
  emitTimeoutDiscardNotice(line, { knob, raw, usedMs }, onNotice);
113
125
  }
114
126
  export function bashTimeoutParamDescription(caps, withDefault) {
@@ -147,15 +159,13 @@ export function resolveBashTimeoutCaps(opts) {
147
159
  if (requestedCap !== undefined && requestedCap < defaultMs) {
148
160
  const knob = optsCap !== undefined ? "bashMaxTimeoutMs" : "BASH_MAX_TIMEOUT_MS";
149
161
  const line = `${knob}=${requestedCap} is below the resolved default budget (${defaultMs}ms) — the ceiling was raised to ${maxMs}ms (the default always fits under the cap).`;
150
- if (!announcedTimeoutConfig.has(line)) {
151
- announcedTimeoutConfig.add(line);
152
- emitTimeoutDiscardNotice(line, { knob, raw: requestedCap, usedMs: maxMs }, opts?.onNotice);
153
- }
162
+ emitTimeoutDiscardNotice(line, { knob, raw: requestedCap, usedMs: maxMs }, opts?.onNotice);
154
163
  }
155
164
  return { defaultMs, maxMs };
156
165
  }
157
166
  export function __resetBashTimeoutAnnouncements() {
158
- announcedTimeoutConfig.clear();
167
+ announcedTimeoutConfigBySink = new WeakMap();
168
+ announcedTimeoutConfigConsole.clear();
159
169
  }
160
170
  export function bashTimeoutCapsSec(caps) {
161
171
  return { defaultSec: Math.max(1, Math.round(caps.defaultMs / 1000)), maxSec: Math.max(1, Math.round(caps.maxMs / 1000)) };
@@ -40,10 +40,18 @@ export interface ReadDenyMatcher {
40
40
  /** Normalized entries (built-ins first, then additions; exact duplicates folded). The disclosure /
41
41
  * persistence face. */
42
42
  readonly entries: readonly NormalizedReadDenyEntry[];
43
- /** Judge ONE path view (segment-window semantics). Returns the first matching entry, or null. */
44
- matchPath(path: string): ReadDenyHit | null;
45
- /** §3.3 target judgment: canonical view + lexical view; EITHER hit decides. */
46
- matchTarget(canonicalKey: string, lexicalView?: string): ReadDenyHit | null;
43
+ /** Judge ONE path view (segment-window semantics). Returns the first matching entry, or null.
44
+ * `aliasResolved` = the key's MINTER reports the real filesystem already collapsed any win32
45
+ * component alias in it (canonicalizeTarget's realpath arm); unset both readings are judged,
46
+ * which is the fail-closed default. */
47
+ matchPath(path: string, opts?: {
48
+ readonly aliasResolved?: boolean;
49
+ }): ReadDenyHit | null;
50
+ /** §3.3 target judgment: canonical view + lexical view; EITHER hit decides. `aliasResolved`
51
+ * applies to the CANONICAL arm only — the lexical view is an unresolved spelling. */
52
+ matchTarget(canonicalKey: string, lexicalView?: string, opts?: {
53
+ readonly aliasResolved?: boolean;
54
+ }): ReadDenyHit | null;
47
55
  /** Traversal exclusions for the rg legs: `!`-polarity glob pairs — `!**\/<p>` plus `!**\/<p>/…`
48
56
  * (the entry itself and its descendants). */
49
57
  readonly rgExclusionGlobs: readonly ReadDenyRgGlob[];
@@ -145,7 +153,9 @@ export declare function compileSegmentPattern(raw: string, fold: "none" | "ascii
145
153
  * BOTH separator families — win32 canonical keys are backslash-form. Returns the matched raw pattern
146
154
  * or null.
147
155
  */
148
- export declare function matchSegmentPatterns(path: string, compiled: readonly CompiledSegmentPattern[]): string | null;
156
+ export declare function matchSegmentPatterns(path: string, compiled: readonly CompiledSegmentPattern[], opts?: {
157
+ readonly aliasResolved?: boolean;
158
+ }): string | null;
149
159
  /**
150
160
  * codex r3 — the PURE validation/canonicality predicate over a PERSISTED deny entry (checkpoint v9
151
161
  * face section), for the resume pre-CAS ladder: it must refuse BEFORE the approval CAS everything
@@ -91,15 +91,36 @@ export function compileSegmentPattern(raw, fold) {
91
91
  });
92
92
  return { raw, segments, foldAscii: fold === "ascii" };
93
93
  }
94
- export function matchSegmentPatterns(path, compiled) {
95
- const rawSegs = path.split(/[\\/]/).filter(Boolean);
96
- let loweredSegs;
94
+ export function matchSegmentPatterns(path, compiled, opts) {
95
+ const literalSegs = path.split(/[\\/]/).filter(Boolean);
96
+ const win32Segs = [];
97
+ for (const raw of literalSegs) {
98
+ const dot = /^\.{1,2}$/.test(raw) ? raw : raw.replace(/ +$/, "");
99
+ if (dot === ".")
100
+ continue;
101
+ if (dot === "..") {
102
+ const last = win32Segs[win32Segs.length - 1];
103
+ if (win32Segs.length > 0 && last !== "..")
104
+ win32Segs.pop();
105
+ else
106
+ win32Segs.push("..");
107
+ continue;
108
+ }
109
+ const stripped = raw.replace(/[. ]+$/, "");
110
+ win32Segs.push(stripped.length > 0 ? stripped : raw);
111
+ }
112
+ const sameView = opts?.aliasResolved === true ||
113
+ (win32Segs.length === literalSegs.length && win32Segs.every((s, i) => s === literalSegs[i]));
114
+ const views = sameView ? [literalSegs] : [literalSegs, win32Segs];
115
+ const lowered = new Map();
97
116
  for (const pat of compiled) {
98
- const segs = pat.foldAscii ? (loweredSegs ??= rawSegs.map(asciiLower)) : rawSegs;
99
- const n = pat.segments.length;
100
- for (let i = 0; i + n <= segs.length; i++) {
101
- if (pat.segments.every((re, j) => re.test(segs[i + j] ?? "")))
102
- return pat.raw;
117
+ for (const view of views) {
118
+ const segs = pat.foldAscii ? (lowered.get(view) ?? lowered.set(view, view.map(asciiLower)).get(view)) : view;
119
+ const n = pat.segments.length;
120
+ for (let i = 0; i + n <= segs.length; i++) {
121
+ if (pat.segments.every((re, j) => re.test(segs[i + j] ?? "")))
122
+ return pat.raw;
123
+ }
103
124
  }
104
125
  }
105
126
  return null;
@@ -171,15 +192,15 @@ export function compileReadDeny(additions = [], layer = "additions", builtin) {
171
192
  rgExclusionGlobs.push({ flag, glob: `!**/${g}` }, { flag, glob: `!**/${g}/**` });
172
193
  rgProbeGlobs.push({ flag, glob: `**/${g}` }, { flag, glob: `**/${g}/**` });
173
194
  }
174
- const matchPath = (path) => {
175
- const hit = matchSegmentPatterns(path, compiled);
195
+ const matchPath = (path, opts) => {
196
+ const hit = matchSegmentPatterns(path, compiled, opts);
176
197
  return hit === null ? null : { pattern: hit };
177
198
  };
178
199
  return {
179
200
  entries: normalized,
180
201
  matchPath,
181
- matchTarget(canonicalKey, lexicalView) {
182
- const canonical = matchPath(canonicalKey);
202
+ matchTarget(canonicalKey, lexicalView, opts) {
203
+ const canonical = matchPath(canonicalKey, opts);
183
204
  if (canonical !== null)
184
205
  return { ...canonical, matchedView: canonicalKey };
185
206
  if (lexicalView !== undefined) {
@@ -268,7 +268,9 @@ export declare function lexicalViewOf(spelled: string, base: string): string;
268
268
  * `executionEnv` — see design/44 §5.)
269
269
  */
270
270
  export declare function resolveKey(env: ExecutionEnv, rootCanonical: string, path: string, signal?: AbortSignal, baseCwd?: string, additionalRootsCanonical?: readonly string[], exactFileReadExemption?: (canonicalKey: string) => boolean, readDeny?: {
271
- matchTarget(canonicalKey: string, lexicalView?: string): {
271
+ matchTarget(canonicalKey: string, lexicalView?: string, opts?: {
272
+ readonly aliasResolved?: boolean;
273
+ }): {
272
274
  pattern: string;
273
275
  matchedView?: string;
274
276
  } | null;
@@ -291,6 +293,7 @@ export declare function resolveKey(env: ExecutionEnv, rootCanonical: string, pat
291
293
  export declare function canonicalizeTarget(env: ExecutionEnv, path: string, signal?: AbortSignal, baseCwd?: string): Promise<{
292
294
  ok: true;
293
295
  key: string;
296
+ aliasResolved?: true;
294
297
  } | {
295
298
  ok: false;
296
299
  message: string;
@@ -339,7 +339,9 @@ export async function resolveKey(env, rootCanonical, path, signal, baseCwd, addi
339
339
  return { ok: false, violation: { code: "invalid", message: `path "${path}" is a blocked device/special file (reading it can hang the process); refused.` } };
340
340
  }
341
341
  if (readDeny !== undefined) {
342
- const hit = readDeny.matchTarget(key, lexicalViewOf(path, baseCwd ?? rootCanonical));
342
+ const hit = readDeny.matchTarget(key, lexicalViewOf(path, baseCwd ?? rootCanonical), {
343
+ aliasResolved: canon.aliasResolved === true,
344
+ });
343
345
  if (hit !== null) {
344
346
  const lexicalHit = hit.matchedView !== undefined && hit.matchedView !== key;
345
347
  const judged = lexicalHit
@@ -419,7 +421,7 @@ export async function canonicalizeTarget(env, path, signal, baseCwd) {
419
421
  }
420
422
  const canon = await env.canonicalPath(abs, signal);
421
423
  if (canon.ok)
422
- return { ok: true, key: canon.value };
424
+ return { ok: true, key: canon.value, aliasResolved: true };
423
425
  const info = await env.fileInfo(abs, signal);
424
426
  if (!info.ok) {
425
427
  return { ok: false, message: `cannot determine whether "${path}" is a symlink: ${info.error.message}`, unresolvedSymlink: true };
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@sema-agent/core",
3
- "version": "5.37.0",
3
+ "version": "5.39.0",
4
4
  "description": "Stateless, task-oriented AI agent core",
5
5
  "type": "module",
6
6
  "license": "BUSL-1.1",
@@ -1,6 +1,6 @@
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
- "count": 1574,
3
+ "count": 1597,
4
4
  "exports": {
5
5
  "A2ATaskState": "type",
6
6
  "A2ATaskStateReversal": "type",
@@ -226,12 +226,15 @@
226
226
  "DEFAULT_TOOL_RESULT_THRESHOLD_CHARS": "variable",
227
227
  "DEGRADED_DIAGNOSTIC_TYPE": "variable",
228
228
  "DESIGN_REVIEW_PROMPTS": "variable",
229
+ "DISCUSSION_SCRIPT": "variable",
230
+ "DISCUSSION_WORKFLOW_NAME": "variable",
229
231
  "DURABLE_AGENT_HANDLE_RE": "variable",
230
232
  "DecisionReason": "type",
231
233
  "DefaultPackDescription": "interface",
232
234
  "DegradationInfo": "interface",
233
235
  "DegradeReason": "type",
234
236
  "DegradingBrainOptions": "type",
237
+ "DelegationLifecycleEvent": "type",
235
238
  "DelegationTaskType": "type",
236
239
  "DeveloperTaskConfig": "interface",
237
240
  "DocumentContent": "interface",
@@ -336,6 +339,7 @@
336
339
  "HarvestRejectionCode": "type",
337
340
  "HarvestReport": "interface",
338
341
  "HookEnvCapabilities": "interface",
342
+ "HookInvocationIdentity": "interface",
339
343
  "HookToolContext": "interface",
340
344
  "HookToolFailure": "interface",
341
345
  "HookToolOutput": "interface",
@@ -404,6 +408,7 @@
404
408
  "LspToolOptions": "interface",
405
409
  "LspTransport": "interface",
406
410
  "MAILBOX_CONTRACT_SCOPE": "variable",
411
+ "MAILBOX_TOMBSTONED_RECIPIENT_CODE": "variable",
407
412
  "MASS_DELETION_FUSE_RATIO": "variable",
408
413
  "MAX_ACTOR_FIELD_CHARS": "variable",
409
414
  "MAX_EDIT_BYTES": "variable",
@@ -441,6 +446,8 @@
441
446
  "MailboxLease": "interface",
442
447
  "MailboxMessage": "interface",
443
448
  "MailboxStore": "interface",
449
+ "MailboxStoreError": "class",
450
+ "MailboxTombstonedRecipientContractHooks": "interface",
444
451
  "ManagedRetentionCapability": "interface",
445
452
  "ManifestDurability": "type",
446
453
  "MaterializedA2a": "interface",
@@ -617,6 +624,7 @@
617
624
  "PlatformLimitReason": "type",
618
625
  "PostCompactContext": "interface",
619
626
  "PostToolBatchCall": "interface",
627
+ "PostToolBatchContext": "interface",
620
628
  "PostToolBatchResult": "interface",
621
629
  "PostToolUseFailureResult": "interface",
622
630
  "PostToolUseResult": "interface",
@@ -920,6 +928,7 @@
920
928
  "TEAM_DISCUSSION_SCRIPT": "variable",
921
929
  "TEAM_DISCUSSION_WORKFLOW_NAME": "variable",
922
930
  "TOKEN_CHECKPOINT_VERSION": "variable",
931
+ "TOOL_MODEL_GATE_CLASSES": "variable",
923
932
  "TOOL_RESULT_REF_CONFLICT_CODE": "variable",
924
933
  "TSchema": "interface",
925
934
  "TaskAccess": "interface",
@@ -963,6 +972,7 @@
963
972
  "ToolEffect": "type",
964
973
  "ToolExecuteContext": "interface",
965
974
  "ToolFingerprintInput": "interface",
975
+ "ToolModelGateRule": "interface",
966
976
  "ToolOrigin": "type",
967
977
  "ToolPolicy": "interface",
968
978
  "ToolPolicyNameSets": "interface",
@@ -998,6 +1008,7 @@
998
1008
  "UsageWindowRecord": "interface",
999
1009
  "UsageWindowStore": "interface",
1000
1010
  "UserMessage": "interface",
1011
+ "UserPromptSubmitContext": "interface",
1001
1012
  "UserPromptSubmitResult": "interface",
1002
1013
  "UtilityGate": "type",
1003
1014
  "V2HeaderHints": "interface",
@@ -1020,6 +1031,7 @@
1020
1031
  "WORKFLOW_SUBAGENT_PROMPT": "variable",
1021
1032
  "WORKFLOW_SUBAGENT_PROMPT_SCHEMA": "variable",
1022
1033
  "WORKTREE_PARENT": "variable",
1034
+ "WRITE_PROTECTED_DEFAULT_TABLE": "variable",
1023
1035
  "WebFetchConfig": "interface",
1024
1036
  "WebSearchConfig": "interface",
1025
1037
  "WiringFacts": "interface",
@@ -1069,6 +1081,11 @@
1069
1081
  "WorktreeSessionRef": "interface",
1070
1082
  "WorktreeToolsOptions": "interface",
1071
1083
  "WritablePermissionRuleStore": "interface",
1084
+ "WriteProtectedEntry": "type",
1085
+ "WriteProtectedHit": "interface",
1086
+ "WriteProtectedKind": "type",
1087
+ "WriteProtectedRow": "interface",
1088
+ "WriteProtectionMatcher": "interface",
1072
1089
  "ackAdoptionConfig": "function",
1073
1090
  "acquireCcLock": "function",
1074
1091
  "addDotsOf": "function",
@@ -1130,6 +1147,7 @@
1130
1147
  "callKeyOrdinal": "function",
1131
1148
  "canAccessAgentRecord": "function",
1132
1149
  "canAccessWorkflowRun": "function",
1150
+ "canonicalWorkflowName": "function",
1133
1151
  "capAggregateMediaBytes": "function",
1134
1152
  "capAggregateToolResults": "function",
1135
1153
  "captureBaseline": "function",
@@ -1149,6 +1167,7 @@
1149
1167
  "collectBelowFrontier": "function",
1150
1168
  "combinePolicies": "function",
1151
1169
  "compileReadDeny": "function",
1170
+ "compileWriteProtection": "function",
1152
1171
  "complianceCallDenial": "function",
1153
1172
  "compose": "function",
1154
1173
  "composeConstitution": "function",
@@ -1318,6 +1337,7 @@
1318
1337
  "isApprovalSettledBy": "function",
1319
1338
  "isDelegatedAgentTerminal": "function",
1320
1339
  "isIsolated": "function",
1340
+ "isModelGatedForClass": "function",
1321
1341
  "isPersonalScope": "function",
1322
1342
  "isQuestionUnavailable": "function",
1323
1343
  "isRemoteExecutionEnv": "function",
@@ -1352,6 +1372,7 @@
1352
1372
  "mailboxAckOwnershipContract": "function",
1353
1373
  "mailboxBundledOnlyContract": "function",
1354
1374
  "mailboxStoreContract": "function",
1375
+ "mailboxTombstonedRecipientContract": "function",
1355
1376
  "markTruncated": "function",
1356
1377
  "materializeA2aTools": "function",
1357
1378
  "materializeEntriesToFiles": "function",
@@ -1467,8 +1488,10 @@
1467
1488
  "resolveTaskLimits": "function",
1468
1489
  "resolveTaskModel": "function",
1469
1490
  "resolveUsageWindows": "function",
1491
+ "resolveWriteProtectedTable": "function",
1470
1492
  "restoreFrozenPaths": "function",
1471
1493
  "resumeWithVerification": "function",
1494
+ "retiredWorkflowNameAliases": "function",
1472
1495
  "retryBackoffMs": "function",
1473
1496
  "riskSeverity": "function",
1474
1497
  "ruleAdmitsCommand": "function",