@sema-agent/core 7.6.0 → 7.6.1

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 (75) hide show
  1. package/CHANGELOG.md +26 -0
  2. package/dist/agents/agent-transcript-tool.d.ts +2 -2
  3. package/dist/agents/cascade.d.ts +2 -3
  4. package/dist/agents/repair-loop.d.ts +2 -2
  5. package/dist/agents/retain-ledger.d.ts +2 -3
  6. package/dist/agents/send-message-tool.d.ts +2 -2
  7. package/dist/agents/session-util.d.ts +2 -2
  8. package/dist/agents/subagent.d.ts +3 -4
  9. package/dist/agents/teacher.d.ts +2 -2
  10. package/dist/agents/team.d.ts +2 -2
  11. package/dist/agents/verify.d.ts +5 -6
  12. package/dist/core/agent-definition.d.ts +172 -0
  13. package/dist/core/agent-definition.js +1 -0
  14. package/dist/core/delegation-frames.d.ts +298 -0
  15. package/dist/core/delegation-frames.js +21 -0
  16. package/dist/core/engine-notice.d.ts +555 -0
  17. package/dist/core/engine-notice.js +55 -0
  18. package/dist/core/gate-fold.d.ts +12 -0
  19. package/dist/core/gate-fold.js +158 -0
  20. package/dist/core/gate-lanes.d.ts +93 -0
  21. package/dist/core/gate-lanes.js +626 -0
  22. package/dist/core/hands-band.d.ts +134 -0
  23. package/dist/core/hands-band.js +1 -0
  24. package/dist/core/hooks.d.ts +20 -101
  25. package/dist/core/hooks.js +53 -854
  26. package/dist/core/mcp-failure.d.ts +43 -5
  27. package/dist/core/mcp-failure.js +31 -14
  28. package/dist/core/mcp-server-spec.d.ts +217 -0
  29. package/dist/core/mcp-server-spec.js +1 -0
  30. package/dist/core/model-seat.d.ts +99 -0
  31. package/dist/core/model-seat.js +1 -0
  32. package/dist/core/reminder-mint.d.ts +10 -0
  33. package/dist/core/reminder-mint.js +3 -0
  34. package/dist/core/runner/contracts.d.ts +382 -6
  35. package/dist/core/runner/gate-exit.d.ts +177 -9
  36. package/dist/core/runner/gate-exit.js +70 -1
  37. package/dist/core/runner/prepare-caps-and-workflow.d.ts +2 -7
  38. package/dist/core/runner/prepare-delegation-surface.d.ts +2 -7
  39. package/dist/core/runner/prepare-task.d.ts +2 -2
  40. package/dist/core/runner/runtask.d.ts +4 -71
  41. package/dist/core/runner/runtask.js +14 -5
  42. package/dist/core/runner-deps.d.ts +1416 -0
  43. package/dist/core/runner-deps.js +1 -0
  44. package/dist/core/runtime-caps.d.ts +164 -0
  45. package/dist/core/runtime-caps.js +1 -0
  46. package/dist/core/task-event.d.ts +910 -0
  47. package/dist/core/task-event.js +1 -0
  48. package/dist/core/task-limits.d.ts +110 -0
  49. package/dist/core/task-limits.js +1 -0
  50. package/dist/core/task-result.d.ts +809 -0
  51. package/dist/core/task-result.js +1 -0
  52. package/dist/core/task-spec.d.ts +1370 -0
  53. package/dist/core/task-spec.js +1 -0
  54. package/dist/core/task-stream.d.ts +382 -0
  55. package/dist/core/task-stream.js +1 -0
  56. package/dist/core/tool-spec.d.ts +1174 -0
  57. package/dist/core/tool-spec.js +1 -0
  58. package/dist/core/types.d.ts +26 -7691
  59. package/dist/core/types.js +2 -76
  60. package/dist/core/warm-resume.d.ts +2 -2
  61. package/dist/index.d.ts +2 -1
  62. package/dist/index.js +1 -1
  63. package/dist/orchestration/goal.d.ts +2 -2
  64. package/dist/orchestration/run-spec.d.ts +2 -2
  65. package/dist/orchestration/run-workflow-tool.d.ts +3 -3
  66. package/dist/orchestration/workflow.d.ts +4 -4
  67. package/dist/scenarios/scenario-registry.d.ts +3 -3
  68. package/dist/scenarios/teacher-quickstart.d.ts +2 -2
  69. package/dist/server/http.d.ts +2 -2
  70. package/dist/stores/file/fs-atomic.d.ts +88 -12
  71. package/dist/stores/file/fs-atomic.js +184 -55
  72. package/dist/stores/file/index.d.ts +1 -0
  73. package/dist/stores/file/index.js +1 -0
  74. package/package.json +1 -1
  75. package/test/export-surface.snapshot.json +9 -1
@@ -1,7 +1,9 @@
1
1
  import { closeSync, constants as FS, existsSync, fstatSync, linkSync, mkdirSync, openSync, readFileSync, readSync, realpathSync, renameSync, truncateSync, unlinkSync, writeFileSync, writeSync, fsyncSync, } from "node:fs";
2
- import { homedir } from "node:os";
2
+ import { homedir, hostname, uptime } from "node:os";
3
+ import { hrtime } from "node:process";
3
4
  import { basename, dirname, join, resolve as resolvePath } from "node:path";
4
5
  import { createHash, randomBytes } from "node:crypto";
6
+ import { execFileSync } from "node:child_process";
5
7
  const SAFE_COMPONENT = /^[A-Za-z0-9_.-]+$/;
6
8
  export function sanitizePathComponent(raw) {
7
9
  if (raw === "" || raw === "." || raw === ".." || !SAFE_COMPONENT.test(raw)) {
@@ -270,6 +272,64 @@ export class FileStoreLockError extends Error {
270
272
  const MAX_RECLAIM_DEPTH = 8;
271
273
  const MAX_ACQUIRE_ATTEMPTS = 4;
272
274
  const abandonedLocks = new Set();
275
+ const LOCK_RECORD_VERSION = 2;
276
+ function serializeLockRecord() {
277
+ const fp = processFingerprint();
278
+ return JSON.stringify({
279
+ v: LOCK_RECORD_VERSION,
280
+ pid: fp.pid,
281
+ startedAtMs: fp.startedAtMs,
282
+ startedSinceBootMs: fp.startedSinceBootMs,
283
+ host: fp.host,
284
+ });
285
+ }
286
+ function parseLockRecord(raw) {
287
+ if (/^[1-9][0-9]*$/.test(raw)) {
288
+ const barePid = Number.parseInt(raw, 10);
289
+ return Number.isSafeInteger(barePid) && barePid > 0
290
+ ? { pid: barePid, startedAtMs: null, startedSinceBootMs: null, host: null }
291
+ : null;
292
+ }
293
+ if (!raw.startsWith("{"))
294
+ return null;
295
+ let parsed;
296
+ try {
297
+ parsed = JSON.parse(raw);
298
+ }
299
+ catch {
300
+ return null;
301
+ }
302
+ if (typeof parsed !== "object" || parsed === null || Array.isArray(parsed))
303
+ return null;
304
+ const rec = parsed;
305
+ if (typeof rec.pid !== "number" || !Number.isSafeInteger(rec.pid) || rec.pid <= 0)
306
+ return null;
307
+ const known = rec.v === LOCK_RECORD_VERSION;
308
+ const measure = (raw) => (known && typeof raw === "number" && Number.isFinite(raw) ? raw : null);
309
+ return {
310
+ pid: rec.pid,
311
+ startedAtMs: measure(rec.startedAtMs),
312
+ startedSinceBootMs: measure(rec.startedSinceBootMs),
313
+ host: known && typeof rec.host === "string" && rec.host !== "" ? rec.host : null,
314
+ };
315
+ }
316
+ function readLockRecord(lockPath) {
317
+ let raw;
318
+ try {
319
+ raw = readFileSync(lockPath, "utf8").trim();
320
+ }
321
+ catch (err) {
322
+ return err.code === "ENOENT" ? { state: "absent" } : { state: "unreadable" };
323
+ }
324
+ const owner = parseLockRecord(raw);
325
+ return owner === null ? { state: "unreadable" } : { state: "owner", ...owner };
326
+ }
327
+ function sameOwner(a, b) {
328
+ return (a.pid === b.pid &&
329
+ a.startedAtMs === b.startedAtMs &&
330
+ a.startedSinceBootMs === b.startedSinceBootMs &&
331
+ a.host === b.host);
332
+ }
273
333
  export class BootLock {
274
334
  lockPath;
275
335
  held = false;
@@ -302,7 +362,7 @@ export class BootLock {
302
362
  this.pruneOwnAbandoned();
303
363
  return;
304
364
  }
305
- if (isProcessRunning(owner.pid)) {
365
+ if (isProcessLive(owner)) {
306
366
  throw new FileStoreLockError("store.dir_in_use", `file store: another instance (pid ${owner.pid}) owns this data dir (${dirnameOf(this.lockPath)})`, this.lockPath, owner.pid);
307
367
  }
308
368
  if (depth >= MAX_RECLAIM_DEPTH) {
@@ -322,7 +382,7 @@ export class BootLock {
322
382
  }
323
383
  try {
324
384
  const under = this.inspectLock();
325
- if (under.state === "owner" && under.pid === owner.pid) {
385
+ if (under.state === "owner" && sameOwner(under, owner)) {
326
386
  try {
327
387
  unlinkSync(this.lockPath);
328
388
  }
@@ -368,23 +428,13 @@ export class BootLock {
368
428
  this.publishOrLoseRace();
369
429
  }
370
430
  writeLock() {
371
- writeThenLink(this.lockPath, String(process.pid));
431
+ writeThenLink(this.lockPath, serializeLockRecord());
372
432
  }
373
433
  get abandonKey() {
374
434
  return resolvePath(this.lockPath);
375
435
  }
376
436
  inspectLock() {
377
- let raw;
378
- try {
379
- raw = readFileSync(this.lockPath, "utf8").trim();
380
- }
381
- catch (err) {
382
- return err.code === "ENOENT" ? { state: "absent" } : { state: "unreadable" };
383
- }
384
- if (!/^[1-9][0-9]*$/.test(raw))
385
- return { state: "unreadable" };
386
- const pid = Number.parseInt(raw, 10);
387
- return Number.isInteger(pid) && pid > 0 ? { state: "owner", pid } : { state: "unreadable" };
437
+ return readLockRecord(this.lockPath);
388
438
  }
389
439
  release() {
390
440
  if (!this.held) {
@@ -500,49 +550,18 @@ export function acquireStoreDirLock(dir, opts) {
500
550
  export function createFileConsolidationLock(lockDir) {
501
551
  return (scope) => {
502
552
  ensureDir(lockDir);
503
- const lockPath = join(lockDir, `${sanitizeScope(scope)}.consolidate.lock`);
504
- const tryWrite = () => {
505
- try {
506
- writeThenLink(lockPath, String(process.pid));
507
- return true;
508
- }
509
- catch (err) {
510
- if (err.code !== "EEXIST")
511
- throw err;
512
- return false;
513
- }
514
- };
515
- const readPid = () => {
516
- try {
517
- const raw = readFileSync(lockPath, "utf8").trim();
518
- if (!/^[1-9][0-9]*$/.test(raw))
519
- return undefined;
520
- const pid = Number.parseInt(raw, 10);
521
- return Number.isInteger(pid) && pid > 0 ? pid : undefined;
522
- }
523
- catch {
524
- return undefined;
525
- }
526
- };
527
- const release = () => {
528
- try {
529
- if (readPid() === process.pid)
530
- unlinkSync(lockPath);
531
- }
532
- catch {
533
- }
534
- };
535
- if (tryWrite())
536
- return release;
537
- const ownerPid = readPid();
538
- if (ownerPid === undefined || isProcessRunning(ownerPid))
539
- return undefined;
553
+ const lock = new BootLock(join(lockDir, `${sanitizeScope(scope)}.consolidate.lock`));
540
554
  try {
541
- unlinkSync(lockPath);
555
+ lock.acquire();
542
556
  }
543
- catch {
557
+ catch (err) {
558
+ if (err instanceof FileStoreLockError)
559
+ return undefined;
560
+ throw err;
544
561
  }
545
- return tryWrite() ? release : undefined;
562
+ return () => {
563
+ lock.release();
564
+ };
546
565
  };
547
566
  }
548
567
  function isProcessRunning(pid) {
@@ -554,3 +573,113 @@ function isProcessRunning(pid) {
554
573
  return err.code === "EPERM";
555
574
  }
556
575
  }
576
+ const START_TIME_TOLERANCE_MS = 2_000;
577
+ const START_TIME_PROBE_TIMEOUT_MS = 2_000;
578
+ const START_TIME_PROBE_PRECISION_MS = 250;
579
+ const ETIME_PATTERN = /^(?:(\d+)-)?(?:(\d+):)?(\d+):(\d+)$/;
580
+ let cachedHostname;
581
+ let selfFingerprint;
582
+ let startTimeProbeUnavailable = false;
583
+ function thisHost() {
584
+ return (cachedHostname ??= hostname());
585
+ }
586
+ function announceStartTimeDegrade(reason) {
587
+ if (startTimeProbeUnavailable)
588
+ return;
589
+ startTimeProbeUnavailable = true;
590
+ console.warn(`[sema] file store: this host cannot report process start times (${reason}), so a directory lock's owner ` +
591
+ `is judged by PID ALONE. A lock left behind by a crashed owner whose pid the OS has since handed to an ` +
592
+ `unrelated process then reads as a LIVE owner, and that directory stays refused until the lock file is ` +
593
+ `removed by hand.`);
594
+ }
595
+ const START_TIME_PROBE_ATTEMPTS = 3;
596
+ function probeStartTimes(pid) {
597
+ for (let attempt = 0; attempt < START_TIME_PROBE_ATTEMPTS; attempt++) {
598
+ const reading = probeStartTimesOnce(pid);
599
+ if (reading !== "imprecise")
600
+ return reading;
601
+ }
602
+ return null;
603
+ }
604
+ function probeStartTimesOnce(pid) {
605
+ if (startTimeProbeUnavailable)
606
+ return null;
607
+ const knownToExist = pid === process.pid;
608
+ if (process.platform === "win32") {
609
+ announceStartTimeDegrade("no ps(1) on win32");
610
+ return null;
611
+ }
612
+ const monotonicBefore = hrtime.bigint();
613
+ const wallBefore = Date.now();
614
+ const uptimeBefore = Math.round(uptime() * 1000);
615
+ let raw;
616
+ try {
617
+ raw = execFileSync("ps", ["-p", String(pid), "-o", "etime="], {
618
+ encoding: "utf8",
619
+ timeout: START_TIME_PROBE_TIMEOUT_MS,
620
+ stdio: ["ignore", "pipe", "ignore"],
621
+ env: { ...process.env, LC_ALL: "C", LANG: "C" },
622
+ });
623
+ }
624
+ catch (err) {
625
+ if (typeof err.status === "number") {
626
+ if (knownToExist)
627
+ announceStartTimeDegrade("ps refused a query about this very process");
628
+ return null;
629
+ }
630
+ announceStartTimeDegrade(`ps failed (${err.code ?? "unknown"})`);
631
+ return null;
632
+ }
633
+ const latency = Number(hrtime.bigint() - monotonicBefore) / 1e6;
634
+ const wallDelta = Date.now() - wallBefore;
635
+ const trimmed = raw.trim();
636
+ const parts = ETIME_PATTERN.exec(trimmed);
637
+ if (parts === null) {
638
+ if (trimmed !== "" || knownToExist)
639
+ announceStartTimeDegrade("ps produced no elapsed time");
640
+ return null;
641
+ }
642
+ if (latency > START_TIME_PROBE_PRECISION_MS)
643
+ return "imprecise";
644
+ if (Math.abs(wallDelta - latency) > START_TIME_PROBE_PRECISION_MS)
645
+ return "imprecise";
646
+ const elapsedMs = (Number(parts[1] ?? "0") * 86_400 + Number(parts[2] ?? "0") * 3_600 + Number(parts[3] ?? "0") * 60 + Number(parts[4] ?? "0")) *
647
+ 1000;
648
+ return {
649
+ startedAtMs: Math.round((wallBefore - elapsedMs) / 1000) * 1000,
650
+ startedSinceBootMs: Math.round((uptimeBefore - elapsedMs) / 1000) * 1000,
651
+ };
652
+ }
653
+ export function processFingerprint(pid) {
654
+ const host = thisHost();
655
+ const of = (id, probed) => ({
656
+ pid: id,
657
+ startedAtMs: probed?.startedAtMs ?? null,
658
+ startedSinceBootMs: probed?.startedSinceBootMs ?? null,
659
+ host,
660
+ });
661
+ if (pid === undefined || pid === process.pid) {
662
+ if (selfFingerprint === undefined || selfFingerprint.startedAtMs === null) {
663
+ const answer = of(process.pid, probeStartTimes(process.pid));
664
+ if (answer.startedAtMs === null)
665
+ return answer;
666
+ selfFingerprint = answer;
667
+ }
668
+ return selfFingerprint;
669
+ }
670
+ if (processFingerprint().startedAtMs === null)
671
+ return of(pid, null);
672
+ return of(pid, probeStartTimes(pid));
673
+ }
674
+ export function isProcessLive(record) {
675
+ if (!isProcessRunning(record.pid))
676
+ return false;
677
+ if (record.host !== undefined && record.host !== null && record.host !== thisHost())
678
+ return true;
679
+ const observed = processFingerprint(record.pid);
680
+ const falsified = (was, now) => was !== undefined && was !== null && now !== null && now - was > START_TIME_TOLERANCE_MS;
681
+ const bootIsOver = (was) => was !== undefined && was !== null && was - Math.round(uptime() * 1000) > START_TIME_TOLERANCE_MS;
682
+ const wallSaysGone = falsified(record.startedAtMs, observed.startedAtMs);
683
+ const uptimeSaysGone = falsified(record.startedSinceBootMs, observed.startedSinceBootMs) || bootIsOver(record.startedSinceBootMs);
684
+ return !(wallSaysGone && uptimeSaysGone);
685
+ }
@@ -25,6 +25,7 @@ export { FileStrategyStore, type FileStrategyStoreOptions } from "./strategy-sto
25
25
  export { resolveDataRoot, sanitizeScope, sanitizePathComponent, createFileConsolidationLock } from "./fs-atomic.js";
26
26
  export { FileStoreLockError, type FileStoreLockErrorCode } from "./fs-atomic.js";
27
27
  export { atomicWriteFile, writeThenLink, ensureDir, readJsonlRecords, AppendLog } from "./fs-atomic.js";
28
+ export { processFingerprint, isProcessLive, type ProcessFingerprint } from "./fs-atomic.js";
28
29
  export { AdoptionError, assertAdoptionBootGate, readRootAdoptionFile, writeRootAdoptionFile, ROOT_ADOPTION_FILE, type AdoptionErrorCode, type AdoptionSource, type AdoptionReport, type AdoptionReceipt, type AdoptionLegReport, type AffectedDeploymentConfig, type RootAdoptionFile, } from "./adoption/marker.js";
29
30
  export { adoptLocalDataRoot, ackAdoptionConfig, witnessAdoptionConfig, listAdoptionQuarantine, readAdoptionStatus, type AdoptionStatus, type AdoptLocalDataRootOptions, type AdoptLocalDataRootResult, type AdoptionCarriageLeg, type AdoptionCarriageLegContext, type AdoptionConfigWitnessReceipt, } from "./adoption/adopt.js";
30
31
  /**
@@ -27,6 +27,7 @@ export { FileStrategyStore } from "./strategy-store.js";
27
27
  export { resolveDataRoot, sanitizeScope, sanitizePathComponent, createFileConsolidationLock } from "./fs-atomic.js";
28
28
  export { FileStoreLockError } from "./fs-atomic.js";
29
29
  export { atomicWriteFile, writeThenLink, ensureDir, readJsonlRecords, AppendLog } from "./fs-atomic.js";
30
+ export { processFingerprint, isProcessLive } from "./fs-atomic.js";
30
31
  export { AdoptionError, assertAdoptionBootGate, readRootAdoptionFile, writeRootAdoptionFile, ROOT_ADOPTION_FILE, } from "./adoption/marker.js";
31
32
  export { adoptLocalDataRoot, ackAdoptionConfig, witnessAdoptionConfig, listAdoptionQuarantine, readAdoptionStatus, } from "./adoption/adopt.js";
32
33
  export class FileStorageBackend {
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@sema-agent/core",
3
- "version": "7.6.0",
3
+ "version": "7.6.1",
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": 2098,
4
+ "count": 2102,
5
5
  "exports": {
6
6
  "A2ATaskState": "type",
7
7
  "A2ATaskStateReversal": "type",
@@ -893,6 +893,7 @@
893
893
  "PrefixInputClass": "type",
894
894
  "ProbeCause": "interface",
895
895
  "ProbeCauseOperands": "interface",
896
+ "ProcessFingerprint": "interface",
896
897
  "ProjectMemoryLoad": "interface",
897
898
  "PromotedRecord": "interface",
898
899
  "PromptArtifactSource": "interface",
@@ -1079,6 +1080,7 @@
1079
1080
  "RunWorkflowToolDeps": "interface",
1080
1081
  "Runner": "class",
1081
1082
  "RunnerDeps": "interface",
1083
+ "RunnerSelfSeat": "interface",
1082
1084
  "RuntimeCaps": "interface",
1083
1085
  "SAFETY_AXIS_VOCABULARY": "variable",
1084
1086
  "SAFETY_MERGE_CONFORMANCE_CORPUS": "variable",
@@ -1736,6 +1738,7 @@
1736
1738
  "isPeerSessionProcessAlive": "function",
1737
1739
  "isPermissionModeClass": "function",
1738
1740
  "isPersonalScope": "function",
1741
+ "isProcessLive": "function",
1739
1742
  "isQuestionUnavailable": "function",
1740
1743
  "isRemoteExecutionEnv": "function",
1741
1744
  "isRetryableRemoteErrorCode": "function",
@@ -1878,6 +1881,7 @@
1878
1881
  "prepareStarterBatch": "function",
1879
1882
  "probeParkRoundTrip": "function",
1880
1883
  "probeSearchBackend": "function",
1884
+ "processFingerprint": "function",
1881
1885
  "projectHumanInput": "function",
1882
1886
  "projectToolManifest": "function",
1883
1887
  "projectionsToWriteBack": "function",
@@ -2993,6 +2997,7 @@
2993
2997
  "PrefixInputClass": "advanced",
2994
2998
  "ProbeCause": "advanced",
2995
2999
  "ProbeCauseOperands": "advanced",
3000
+ "ProcessFingerprint": "advanced",
2996
3001
  "ProjectMemoryLoad": "advanced",
2997
3002
  "PromotedRecord": "advanced",
2998
3003
  "PromptArtifactSource": "advanced",
@@ -3179,6 +3184,7 @@
3179
3184
  "RunWorkflowToolDeps": "advanced",
3180
3185
  "Runner": "stable",
3181
3186
  "RunnerDeps": "stable",
3187
+ "RunnerSelfSeat": "internal",
3182
3188
  "RuntimeCaps": "stable",
3183
3189
  "SAFETY_AXIS_VOCABULARY": "advanced",
3184
3190
  "SAFETY_MERGE_CONFORMANCE_CORPUS": "advanced",
@@ -3836,6 +3842,7 @@
3836
3842
  "isPeerSessionProcessAlive": "advanced",
3837
3843
  "isPermissionModeClass": "advanced",
3838
3844
  "isPersonalScope": "advanced",
3845
+ "isProcessLive": "advanced",
3839
3846
  "isQuestionUnavailable": "advanced",
3840
3847
  "isRemoteExecutionEnv": "advanced",
3841
3848
  "isRetryableRemoteErrorCode": "advanced",
@@ -3978,6 +3985,7 @@
3978
3985
  "prepareStarterBatch": "advanced",
3979
3986
  "probeParkRoundTrip": "stable",
3980
3987
  "probeSearchBackend": "advanced",
3988
+ "processFingerprint": "advanced",
3981
3989
  "projectHumanInput": "advanced",
3982
3990
  "projectToolManifest": "advanced",
3983
3991
  "projectionsToWriteBack": "advanced",