@sema-agent/client-core 0.106.0 → 0.108.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 (114) hide show
  1. package/CHANGELOG.md +199 -0
  2. package/README.md +35 -26
  3. package/dist/adapter/activeRunSelfHeal.d.ts +10 -0
  4. package/dist/adapter/activeRunSelfHeal.js +68 -23
  5. package/dist/checkpointRowVerdict.d.ts +11 -0
  6. package/dist/checkpointRowVerdict.js +35 -0
  7. package/dist/cloudConfigWireCaps.d.ts +10 -0
  8. package/dist/cloudConfigWireCaps.js +33 -0
  9. package/dist/coreValuePorts.d.ts +17 -1
  10. package/dist/coreValuePorts.js +5 -0
  11. package/dist/decideReceipt.js +2 -1
  12. package/dist/displayUntrusted.d.ts +5 -3
  13. package/dist/displayUntrusted.js +50 -41
  14. package/dist/engineErrorCodes.d.ts +5 -0
  15. package/dist/engineErrorCodes.js +5 -0
  16. package/dist/engineNoticeCodes.d.ts +31 -1
  17. package/dist/engineNoticeCodes.js +182 -9
  18. package/dist/engineTargetSeat.js +1 -0
  19. package/dist/errorSupplementRoles.js +4 -1
  20. package/dist/eventLeg.js +1 -1
  21. package/dist/executionLaneCapability.js +3 -2
  22. package/dist/executionLaneWords.d.ts +1 -0
  23. package/dist/executionLaneWords.js +4 -0
  24. package/dist/gateOutcome.d.ts +10 -1
  25. package/dist/gateOutcome.js +48 -1
  26. package/dist/generated/engineFactTables.d.ts +1 -0
  27. package/dist/generated/engineFactTables.js +5 -0
  28. package/dist/generated/engineNoticeTables.js +12 -3
  29. package/dist/generated/settingsSchemaFns.d.ts +4 -2
  30. package/dist/generated/settingsSchemaFns.js +9 -3
  31. package/dist/generated/settingsSchemaMcpRequestEntry.d.ts +1 -1
  32. package/dist/generated/settingsSchemaMcpRequestEntry.js +9 -18
  33. package/dist/generated/settingsSchemaReservedMemberName.d.ts +1 -0
  34. package/dist/generated/settingsSchemaReservedMemberName.js +7 -0
  35. package/dist/generated/settingsSchemaTables.d.ts +2 -0
  36. package/dist/generated/settingsSchemaTables.js +10 -0
  37. package/dist/generated/settingsSchemaWireName.d.ts +1 -0
  38. package/dist/generated/settingsSchemaWireName.js +8 -0
  39. package/dist/headlessReconnectWire.js +12 -7
  40. package/dist/hitl/approvalAskers.d.ts +13 -0
  41. package/dist/hitl/approvalAskers.js +79 -0
  42. package/dist/hitl/approvalResolution.d.ts +8 -1
  43. package/dist/hitl/approvalResolution.js +37 -2
  44. package/dist/hitl/approvalsFeed.js +5 -13
  45. package/dist/hitl/askParkRowRouting.js +17 -1
  46. package/dist/hitl/decisionRefusal.d.ts +1 -0
  47. package/dist/hitl/decisionRefusal.js +5 -2
  48. package/dist/hitl/decisionSend.d.ts +2 -0
  49. package/dist/hitl/decisionSend.js +22 -12
  50. package/dist/hitl/frameRouter.d.ts +3 -2
  51. package/dist/hitl/frameRouter.js +28 -6
  52. package/dist/hitl/gateLedger.d.ts +2 -0
  53. package/dist/hitl/gateLedger.js +3 -1
  54. package/dist/hitl/hitlBridge.d.ts +5 -1
  55. package/dist/hitl/hitlBridge.js +26 -2
  56. package/dist/hitl/livePendingAsk.js +4 -2
  57. package/dist/hitl/parkOwnership.js +4 -5
  58. package/dist/hitl/parkResolver.js +34 -21
  59. package/dist/hitl/parkRowBirthWait.d.ts +9 -0
  60. package/dist/hitl/parkRowBirthWait.js +8 -1
  61. package/dist/hitl/parkRowDelegation.d.ts +6 -0
  62. package/dist/hitl/parkRowDelegation.js +33 -0
  63. package/dist/hitl/persistedRulesWire.d.ts +19 -3
  64. package/dist/hitl/persistedRulesWire.js +118 -20
  65. package/dist/hitl/planReviewWire.js +16 -18
  66. package/dist/hitl/policyDenyCause.d.ts +3 -0
  67. package/dist/hitl/policyDenyCause.js +16 -0
  68. package/dist/hitl/sessionAllowRoute.d.ts +5 -0
  69. package/dist/hitl/sessionAllowRoute.js +42 -0
  70. package/dist/hitl/sessionPolicyDeliverable.js +1 -1
  71. package/dist/hitl/standingRows.js +10 -10
  72. package/dist/hitl/toolApprovalWire.d.ts +8 -2
  73. package/dist/hitl/toolApprovalWire.js +44 -11
  74. package/dist/hooksReaderGenerations.d.ts +1 -0
  75. package/dist/hooksReaderGenerations.js +12 -0
  76. package/dist/hooksWireCaps.js +8 -4
  77. package/dist/i18n/messages.en.d.ts +43 -0
  78. package/dist/i18n/messages.en.js +47 -4
  79. package/dist/i18n/messages.zh.js +53 -4
  80. package/dist/index.d.ts +7 -1
  81. package/dist/index.js +5 -1
  82. package/dist/injectionLaneNotice.js +2 -1
  83. package/dist/liveModelCatalog.d.ts +4 -2
  84. package/dist/liveModelCatalog.js +164 -26
  85. package/dist/model/catalogDefault.d.ts +25 -0
  86. package/dist/model/catalogDefault.js +44 -0
  87. package/dist/noticePresentation.js +2 -0
  88. package/dist/permissionWireCaps.d.ts +1 -0
  89. package/dist/permissionWireCaps.js +11 -0
  90. package/dist/pluginHooksWire.d.ts +5 -3
  91. package/dist/pluginHooksWire.js +116 -7
  92. package/dist/queuedDelivery.d.ts +1 -0
  93. package/dist/queuedDelivery.js +12 -0
  94. package/dist/resultFrameKeys.js +4 -2
  95. package/dist/resumeRefusalCopy.js +15 -8
  96. package/dist/runPermissionModeSwitch.d.ts +2 -1
  97. package/dist/runPermissionModeSwitch.js +16 -6
  98. package/dist/sdkWireTransit.d.ts +1 -1
  99. package/dist/seatContract.d.ts +64 -10
  100. package/dist/seatContract.js +167 -12
  101. package/dist/sessionEngine.d.ts +2 -1
  102. package/dist/sessionEngine.js +5 -0
  103. package/dist/settingsHooksSalvage.d.ts +5 -0
  104. package/dist/settingsHooksSalvage.js +54 -0
  105. package/dist/subagentContentStore.js +1 -1
  106. package/dist/supportFloor.js +2 -0
  107. package/dist/taskNotificationAdmission.d.ts +19 -0
  108. package/dist/taskNotificationAdmission.js +84 -0
  109. package/dist/toolResult.js +2 -1
  110. package/dist/webSearchWireCaps.js +9 -4
  111. package/dist/wireRefusalCopy.d.ts +7 -1
  112. package/dist/wireRefusalCopy.js +7 -1
  113. package/docs/INTEGRATION-CLIENTS.md +1189 -18
  114. package/package.json +5 -5
@@ -3,6 +3,7 @@ import type { ActiveRunBusySignal } from './runStream.js';
3
3
  import type { RejectedSubmissionOrigin } from '../request/submissionIdentity.js';
4
4
  import type { PlanReviewReopenTrigger } from '../hitl/planReviewWire.js';
5
5
  import { type AskParkAutoReopenBlock } from '../hitl/askParkAutoReopenBlock.js';
6
+ import { type CheckpointRowVerdictReading } from '../checkpointRowVerdict.js';
6
7
  import { atMostOnceFailureClass } from '../atMostOnce.js';
7
8
  export declare const PLAN_REVIEW_GATE_KIND = "plan_review";
8
9
  export type DurableDecideLeg = 'approval' | 'plan_review' | 'other_gate' | 'unreadable';
@@ -44,6 +45,10 @@ export type ReopenCardVerdict = {
44
45
  _sema_errorCode?: string;
45
46
  _sema_reopenRefusal?: PlanReviewReopenRefusal;
46
47
  _sema_policyBlocked?: AskParkAutoReopenBlock;
48
+ _sema_rowVerdict?: Exclude<CheckpointRowVerdictReading, {
49
+ readonly kind: 'ok';
50
+ }>;
51
+ _sema_rowDeadline?: number | null;
47
52
  } | {
48
53
  reopened: true;
49
54
  firstSight: boolean;
@@ -147,6 +152,10 @@ export type SelfHealOutcome = {
147
152
  noPresentationSurface?: true;
148
153
  errorCode?: string;
149
154
  policyBlocked?: AskParkAutoReopenBlock;
155
+ rowVerdict?: Exclude<CheckpointRowVerdictReading, {
156
+ readonly kind: 'ok';
157
+ }>;
158
+ rowDeadline?: 'armed' | 'none';
150
159
  } | {
151
160
  kind: 'ask-decided-without-card';
152
161
  taskId: string;
@@ -162,6 +171,7 @@ export type SelfHealOutcome = {
162
171
  delivery: string | null;
163
172
  status: string | null;
164
173
  reopened: ReopenCardVerdict | null;
174
+ messageId?: string;
165
175
  } | {
166
176
  kind: 'running-steer-failed';
167
177
  taskId: string;
@@ -5,7 +5,8 @@ import { registeredPlanReviewCardFacts } from '../planReviewCardFacts.js';
5
5
  import { DEFAULT_SESSION_KEY } from '../sessionSlot.js';
6
6
  import { ASK_PARK_AUTO_REOPEN_BLOCKS, askParkAutoReopenBlockedContent } from '../hitl/askParkAutoReopenBlock.js';
7
7
  import { corruptStoredRowContent, corruptStoredRowWhere, effectiveWireErrorCode } from '../wireErrorTriage.js';
8
- import { readThrownStatusSlot } from '../wireFailureShape.js';
8
+ import { readThrownStatusSlot, slotReadOf } from '../wireFailureShape.js';
9
+ import { checkpointDeadlineStateOf, checkpointRowBarOf, checkpointRowBarSentence, rowBarWayOutContent } from '../checkpointRowVerdict.js';
9
10
  import { guardedRead, readOwnDataNonEmptyString, readOwnDataValue } from '../ownKey.js';
10
11
  import { steerBodyOf, UNOBSERVED_STEER_PRIORITY } from '../controlRouter.js';
11
12
  import { atMostOnceFailureClass } from '../atMostOnce.js';
@@ -145,6 +146,12 @@ function injectedCarrierVerdict(items, busyTaskId) {
145
146
  return null;
146
147
  return allNameBusyRun && present === length ? 'redundant' : 'deferred';
147
148
  }
149
+ function injectedCarrierVerdictOf(deps, busyTaskId) {
150
+ return deps?.submissionOrigin === 'injected' ? injectedCarrierVerdict(guardedRead(() => deps?.injectedCarriers), busyTaskId) : null;
151
+ }
152
+ function runSettledOutcome(carrierVerdict, settled) {
153
+ return carrierVerdict === 'redundant' ? { kind: 'injected-redundant', taskId: settled.taskId } : settled;
154
+ }
148
155
  function sessionOpts(deps) {
149
156
  const sessionId = deps?.sessionId;
150
157
  return typeof sessionId === 'string' && sessionId.length > 0 ? { session: sessionId } : {};
@@ -207,6 +214,8 @@ const REOPEN_VERDICT_KEYS = [
207
214
  '_sema_errorCode',
208
215
  '_sema_reopenRefusal',
209
216
  '_sema_policyBlocked',
217
+ '_sema_rowVerdict',
218
+ '_sema_rowDeadline',
210
219
  ];
211
220
  function snapshotReopenVerdict(raw) {
212
221
  if (raw === null || raw === undefined)
@@ -320,6 +329,30 @@ function reopenPolicyBlockedOf(verdict) {
320
329
  return undefined;
321
330
  }
322
331
  }
332
+ function reopenRowVerdictOf(verdict) {
333
+ try {
334
+ if (verdict.reopened !== false)
335
+ return undefined;
336
+ return checkpointRowBarOf({ rowVerdict: verdict._sema_rowVerdict });
337
+ }
338
+ catch {
339
+ return undefined;
340
+ }
341
+ }
342
+ function reopenRowDeadlineStateOf(verdict) {
343
+ try {
344
+ if (verdict.reopened !== false)
345
+ return undefined;
346
+ const slot = slotReadOf(verdict, '_sema_rowDeadline');
347
+ if (slot.presence !== 'present')
348
+ return undefined;
349
+ const state = checkpointDeadlineStateOf({ deadline: slot.value });
350
+ return state === 'unknown' ? undefined : state;
351
+ }
352
+ catch {
353
+ return undefined;
354
+ }
355
+ }
323
356
  function reopenRefusalOf(verdict) {
324
357
  try {
325
358
  if (verdict.reopened !== false)
@@ -583,6 +616,7 @@ export async function attemptActiveRunSelfHeal(signal, runs, deps) {
583
616
  detail: 'the engine did not name the run that holds this session',
584
617
  };
585
618
  }
619
+ const carrierVerdict = injectedCarrierVerdictOf(deps, taskId);
586
620
  const gateKind = signal.pendingGate?.kind ?? null;
587
621
  const gateLeg = durableDecideLegOf({ gateKind });
588
622
  const pendingCp = signal.pendingGate?.checkpointId;
@@ -590,7 +624,7 @@ export async function attemptActiveRunSelfHeal(signal, runs, deps) {
590
624
  if (gateLeg === 'plan_review')
591
625
  return planReviewArm(taskId, signal, deps, sameTaskCp);
592
626
  if (gateLeg === 'approval')
593
- return askParkArm(taskId, signal, runs, deps);
627
+ return askParkArm(taskId, signal, runs, carrierVerdict, deps);
594
628
  let status = signal.activeTaskStatus;
595
629
  const statusFresh = status === null;
596
630
  if (status === null) {
@@ -610,16 +644,16 @@ export async function attemptActiveRunSelfHeal(signal, runs, deps) {
610
644
  return { kind: 'state-unknown', taskId, detail: 'the engine reported no status for that run' };
611
645
  }
612
646
  if (isSdkRunTerminal(status))
613
- return { kind: 'running-settled', taskId, status };
647
+ return runSettledOutcome(carrierVerdict, { kind: 'running-settled', taskId, status });
614
648
  const triageGate = signal.pendingGate && !statusFresh ? { pendingGateKind: signal.pendingGate.kind ?? null } : {};
615
649
  if (gateKind !== null)
616
650
  return { kind: 'not-parked', taskId, status, ...triageGate };
617
651
  if (PLAN_REVIEW_STATES.includes(status))
618
652
  return planReviewArm(taskId, signal, deps);
619
653
  if (ASK_PARK_STATES.includes(status))
620
- return askParkArm(taskId, signal, runs, deps);
654
+ return askParkArm(taskId, signal, runs, carrierVerdict, deps);
621
655
  if (RUNNING_STATES.includes(status)) {
622
- return runningChoiceArm(taskId, status, signal, signal.activeTaskStatus !== null, runs, deps);
656
+ return runningChoiceArm(taskId, status, signal, signal.activeTaskStatus !== null, runs, carrierVerdict, deps);
623
657
  }
624
658
  return { kind: 'not-parked', taskId, status, ...triageGate };
625
659
  }
@@ -668,7 +702,7 @@ async function planReviewArm(taskId, signal, deps, checkpointId) {
668
702
  ...(reopenRefusal !== undefined ? { reopenRefusal } : {}),
669
703
  };
670
704
  }
671
- async function askParkArm(taskId, signal, runs, deps) {
705
+ async function askParkArm(taskId, signal, runs, carrierVerdict, deps) {
672
706
  const verdict = await askVerdict(taskId, deps);
673
707
  if (reopenDelivered(verdict))
674
708
  return { kind: 'ask-reopened', taskId, firstSight: verdict.firstSight === true };
@@ -692,17 +726,19 @@ async function askParkArm(taskId, signal, runs, deps) {
692
726
  };
693
727
  }
694
728
  if (release.lastStatus !== null && RUNNING_STATES.includes(release.lastStatus)) {
695
- return runningChoiceArm(taskId, release.lastStatus, signal, false, runs, deps);
729
+ return runningChoiceArm(taskId, release.lastStatus, signal, false, runs, carrierVerdict, deps);
696
730
  }
697
731
  return { kind: 'ask-decided-release-unknown', taskId, lastStatus: release.lastStatus };
698
732
  }
699
733
  const inFlight = reopenRefusedForDecisionInFlight(verdict);
700
734
  if (verdict.reopened === false && verdict.decidedWithoutCard !== true && verdict.pendingRowGone === true && !inFlight) {
701
- return staleParkArm(taskId, signal, runs, deps);
735
+ return staleParkArm(taskId, signal, runs, carrierVerdict, deps);
702
736
  }
703
737
  const noView = reopenRefusedForNoPresentationSurface(verdict);
704
738
  const policyBlocked = inFlight || noView ? undefined : reopenPolicyBlockedOf(verdict);
705
- const errorCode = inFlight || noView || reopenRefusedForUserDismissal(verdict) || policyBlocked !== undefined ? undefined : reopenErrorCodeOf(verdict);
739
+ const rowVerdict = inFlight ? undefined : reopenRowVerdictOf(verdict);
740
+ const rowDeadline = rowVerdict !== undefined ? reopenRowDeadlineStateOf(verdict) : undefined;
741
+ const errorCode = inFlight || noView || reopenRefusedForUserDismissal(verdict) || policyBlocked !== undefined || rowVerdict !== undefined ? undefined : reopenErrorCodeOf(verdict);
706
742
  return {
707
743
  kind: 'ask-reopen-failed',
708
744
  taskId,
@@ -712,6 +748,8 @@ async function askParkArm(taskId, signal, runs, deps) {
712
748
  ...(noView ? { noPresentationSurface: true } : {}),
713
749
  ...(errorCode !== undefined ? { errorCode } : {}),
714
750
  ...(policyBlocked !== undefined ? { policyBlocked } : {}),
751
+ ...(rowVerdict !== undefined ? { rowVerdict } : {}),
752
+ ...(rowDeadline !== undefined ? { rowDeadline } : {}),
715
753
  };
716
754
  }
717
755
  async function probeRunStatusOnce(taskId, durable, durableGet, deps) {
@@ -738,7 +776,7 @@ async function probeRunStatusOnce(taskId, durable, durableGet, deps) {
738
776
  status = readStatusGuarded(record);
739
777
  return errorCode !== undefined ? { status, ghost, errorCode } : { status, ghost };
740
778
  }
741
- async function staleParkArm(taskId, busy, runs, deps) {
779
+ async function staleParkArm(taskId, busy, runs, carrierVerdict, deps) {
742
780
  const reopenFailed = {
743
781
  kind: 'ask-reopen-failed',
744
782
  taskId,
@@ -766,11 +804,11 @@ async function staleParkArm(taskId, busy, runs, deps) {
766
804
  if (fresh === null)
767
805
  return withFailureCode(reopenFailed, first.errorCode);
768
806
  if (RUNNING_STATES.includes(fresh))
769
- return runningChoiceArm(taskId, fresh, busy, false, runs, deps);
807
+ return runningChoiceArm(taskId, fresh, busy, false, runs, carrierVerdict, deps);
770
808
  if (PLAN_REVIEW_STATES.includes(fresh))
771
809
  return planReviewArm(taskId, busy, deps);
772
810
  if (isSdkRunTerminal(fresh))
773
- return { kind: 'ask-run-settled', taskId, status: fresh };
811
+ return runSettledOutcome(carrierVerdict, { kind: 'ask-run-settled', taskId, status: fresh });
774
812
  if (!ASK_PARK_STATES.includes(fresh))
775
813
  return reopenFailed;
776
814
  const offer = deps?.offerStaleParkChoice;
@@ -809,7 +847,7 @@ async function staleParkArm(taskId, busy, runs, deps) {
809
847
  return withFailureCode(reopenFailedAfterCard, afterCard.errorCode);
810
848
  if (!ASK_PARK_STATES.includes(afterCard.status)) {
811
849
  if (isSdkRunTerminal(afterCard.status))
812
- return { kind: 'ask-run-settled', taskId, status: afterCard.status };
850
+ return runSettledOutcome(carrierVerdict, { kind: 'ask-run-settled', taskId, status: afterCard.status });
813
851
  if (RUNNING_STATES.includes(afterCard.status))
814
852
  return { kind: 'not-parked', taskId, status: afterCard.status };
815
853
  return !CLAIM_HELD_STATES.includes(afterCard.status) ? reopenFailed : reopenFailedAfterCard;
@@ -871,11 +909,10 @@ async function cancelAndConfirmRelease(taskId, durable, durableGet, deps) {
871
909
  (verdict.lastStatus !== null && CLAIM_HELD_STATES.includes(verdict.lastStatus)),
872
910
  };
873
911
  }
874
- async function runningChoiceArm(taskId, status, busy, statusFromWire, runs, deps) {
912
+ async function runningChoiceArm(taskId, status, busy, statusFromWire, runs, carrierVerdict, deps) {
875
913
  const notParked = { kind: 'not-parked', taskId, status };
876
914
  const offer = deps?.offerRunningChoice;
877
915
  const injected = deps?.submissionOrigin === 'injected';
878
- const carrierVerdict = injected ? injectedCarrierVerdict(guardedRead(() => deps?.injectedCarriers), taskId) : null;
879
916
  if (typeof offer !== 'function' && !injected)
880
917
  return notParked;
881
918
  const text = typeof deps?.deniedMessage === 'string' ? deps.deniedMessage : '';
@@ -895,7 +932,7 @@ async function runningChoiceArm(taskId, status, busy, statusFromWire, runs, deps
895
932
  if (probeCallerAborted())
896
933
  return notParked;
897
934
  if (fresh !== null) {
898
- const routed = await routeFreshNonRunning(fresh, taskId, busy, runs, deps);
935
+ const routed = await routeFreshNonRunning(fresh, taskId, busy, runs, deps, carrierVerdict);
899
936
  if (routed !== undefined)
900
937
  return routed;
901
938
  }
@@ -936,16 +973,17 @@ async function runningChoiceArm(taskId, status, busy, statusFromWire, runs, deps
936
973
  if (choice === 'steer' && canSteer && runs?.steer !== undefined) {
937
974
  try {
938
975
  const receipt = await runs.steer(taskId, steerBodyOf({ text }, UNOBSERVED_STEER_PRIORITY), sessionOpts(deps));
939
- const { delivery, status: receiptStatus } = readSteerReceipt(receipt);
976
+ const { delivery, status: receiptStatus, messageId } = readSteerReceipt(receipt);
977
+ const handedId = messageId !== undefined ? { messageId } : {};
940
978
  if (delivery === 'queued') {
941
979
  const verdict = receiptStatus !== null && PLAN_REVIEW_STATES.includes(receiptStatus)
942
980
  ? await planVerdict(taskId, deps)
943
981
  : receiptStatus !== null && ASK_PARK_STATES.includes(receiptStatus)
944
982
  ? await askVerdict(taskId, deps)
945
983
  : null;
946
- return { kind: 'running-steered', taskId, delivery, status: receiptStatus, reopened: verdict };
984
+ return { kind: 'running-steered', taskId, delivery, status: receiptStatus, reopened: verdict, ...handedId };
947
985
  }
948
- return { kind: 'running-steered', taskId, delivery, status: receiptStatus, reopened: null };
986
+ return { kind: 'running-steered', taskId, delivery, status: receiptStatus, reopened: null, ...handedId };
949
987
  }
950
988
  catch (e) {
951
989
  const delivery = atMostOnceFailureClass(e);
@@ -974,7 +1012,7 @@ async function runningChoiceArm(taskId, status, busy, statusFromWire, runs, deps
974
1012
  return { kind: 'running-not-found', taskId };
975
1013
  if (probeCallerAborted() || preFire.status === null)
976
1014
  return notParked;
977
- const rerouted = await routeFreshNonRunning(preFire.status, taskId, busy, runs, deps);
1015
+ const rerouted = await routeFreshNonRunning(preFire.status, taskId, busy, runs, deps, carrierVerdict);
978
1016
  if (rerouted !== undefined)
979
1017
  return rerouted;
980
1018
  const verdict = await cancelAndConfirmRelease(taskId, runs, runs.get, deps);
@@ -996,15 +1034,15 @@ async function runningChoiceArm(taskId, status, busy, statusFromWire, runs, deps
996
1034
  return { kind: 'running-attach', taskId };
997
1035
  return notParked;
998
1036
  }
999
- async function routeFreshNonRunning(fresh, taskId, busy, runs, deps) {
1037
+ async function routeFreshNonRunning(fresh, taskId, busy, runs, deps, carrierVerdict) {
1000
1038
  if (RUNNING_STATES.includes(fresh))
1001
1039
  return undefined;
1002
1040
  if (PLAN_REVIEW_STATES.includes(fresh))
1003
1041
  return planReviewArm(taskId, busy, deps);
1004
1042
  if (ASK_PARK_STATES.includes(fresh))
1005
- return askParkArm(taskId, busy, runs, deps);
1043
+ return askParkArm(taskId, busy, runs, carrierVerdict, deps);
1006
1044
  if (isSdkRunTerminal(fresh))
1007
- return { kind: 'running-settled', taskId, status: fresh };
1045
+ return runSettledOutcome(carrierVerdict, { kind: 'running-settled', taskId, status: fresh });
1008
1046
  return { kind: 'not-parked', taskId, status: fresh };
1009
1047
  }
1010
1048
  export const INTERACTIVE_WAY_OUT = EN_MESSAGES['session.selfHeal.wayOut.interactive'];
@@ -1190,6 +1228,13 @@ function activeRunSelfHealBaseRow(outcome, wayOut, following = false, keepSessio
1190
1228
  case 'ask-reopen-failed': {
1191
1229
  if (outcome.decisionInFlight === true)
1192
1230
  return decisionInFlightRow('ask', outcome.taskId, lang);
1231
+ if (outcome.rowVerdict !== undefined) {
1232
+ return say(lang, 'session.selfHeal.row.askReopenFailed.rowUnresumable', {
1233
+ taskId: outcome.taskId,
1234
+ sentence: checkpointRowBarSentence(outcome.rowVerdict),
1235
+ unbound: rowBarWayOutContent(outcome.rowVerdict, outcome.rowDeadline ?? 'unknown', lang),
1236
+ });
1237
+ }
1193
1238
  if (outcome.policyBlocked !== undefined)
1194
1239
  return askParkAutoReopenBlockedContent(outcome.policyBlocked, outcome.taskId, 'interactive', lang);
1195
1240
  const viaEngine = engineDecide && outcome.decidePath ? msg('session.selfHeal.viaEngine', { decidePath: outcome.decidePath }) : '';
@@ -1,3 +1,4 @@
1
+ import { type UiLanguage } from './env/uiLanguage.js';
1
2
  export type CheckpointRowVerdictReading = {
2
3
  readonly kind: 'ok';
3
4
  } | {
@@ -21,3 +22,13 @@ export type CheckpointRequirementsDamagedReading = {
21
22
  readonly kind: 'row_mismatch';
22
23
  };
23
24
  export declare function checkpointRequirementsDamagedOf(failure: object | null | undefined): CheckpointRequirementsDamagedReading | undefined;
25
+ export type CheckpointRowBar = Exclude<CheckpointRowVerdictReading, {
26
+ readonly kind: 'ok';
27
+ }>;
28
+ export declare function checkpointRowBarOf(row: object | null | undefined): CheckpointRowBar | undefined;
29
+ export declare const CHECKPOINT_ROW_BAR_SENTENCE: string;
30
+ export declare function checkpointRowBarSentence(bar: CheckpointRowBar): string;
31
+ export type CheckpointDeadlineState = 'armed' | 'none' | 'unknown';
32
+ export declare function checkpointDeadlineStateOf(row: object | null | undefined): CheckpointDeadlineState;
33
+ export declare function unboundWayOutContent(state: CheckpointDeadlineState, lang?: UiLanguage | (string & {})): string;
34
+ export declare function rowBarWayOutContent(bar: CheckpointRowBar, state: CheckpointDeadlineState, lang?: UiLanguage | (string & {})): string;
@@ -1,4 +1,6 @@
1
1
  import { readErrorString, slotReadOf } from './wireFailureShape.js';
2
+ import { msg, renderMessage } from './i18n/translate.js';
3
+ import { isUiLanguage } from './env/uiLanguage.js';
2
4
  const UNREADABLE = Object.freeze({ kind: 'unreadable' });
3
5
  const OK = Object.freeze({ kind: 'ok' });
4
6
  function ownNonEmptyString(o, key) {
@@ -87,3 +89,36 @@ export function checkpointRequirementsDamagedOf(failure) {
87
89
  return undefined;
88
90
  }
89
91
  }
92
+ export function checkpointRowBarOf(row) {
93
+ const v = checkpointRowVerdictOf(row);
94
+ return v === undefined || v.kind === 'ok' ? undefined : v;
95
+ }
96
+ export const CHECKPOINT_ROW_BAR_SENTENCE = renderMessage(msg('approval.rowUnresumable.fallback'));
97
+ export function checkpointRowBarSentence(bar) {
98
+ return bar.kind !== 'unreadable' && typeof bar.sentence === 'string' && bar.sentence !== '' ? bar.sentence : CHECKPOINT_ROW_BAR_SENTENCE;
99
+ }
100
+ export function checkpointDeadlineStateOf(row) {
101
+ try {
102
+ if (typeof row !== 'object' || row === null)
103
+ return 'unknown';
104
+ const r = slotReadOf(row, 'deadline');
105
+ if (r.presence !== 'present')
106
+ return 'unknown';
107
+ const v = r.value;
108
+ if (v === null)
109
+ return 'none';
110
+ return typeof v === 'number' && Number.isFinite(v) && v >= 0 ? 'armed' : 'unknown';
111
+ }
112
+ catch {
113
+ return 'unknown';
114
+ }
115
+ }
116
+ export function unboundWayOutContent(state, lang) {
117
+ const key = state === 'armed' ? 'approval.decide.unboundWayOut.armed' : state === 'none' ? 'approval.decide.unboundWayOut.none' : 'approval.decide.unboundWayOut.unknown';
118
+ return renderMessage(msg(key), isUiLanguage(lang) ? lang : undefined);
119
+ }
120
+ export function rowBarWayOutContent(bar, state, lang) {
121
+ if (bar.kind === 'lacking')
122
+ return renderMessage(msg('approval.rowUnresumable.lackingWayOut'), isUiLanguage(lang) ? lang : undefined);
123
+ return unboundWayOutContent(state, lang);
124
+ }
@@ -63,6 +63,15 @@ export interface CloudExecutionProjection {
63
63
  }
64
64
  export declare function cloudExecutionToPolicy(execution: unknown): CloudExecutionProjection;
65
65
  export declare function cloudRosterNames(rostersValue: unknown): string[];
66
+ export type CloudA2aReading = {
67
+ readonly kind: 'present';
68
+ readonly peerNames: readonly string[];
69
+ readonly unreadableRows: number;
70
+ } | {
71
+ readonly kind: 'absent';
72
+ } | {
73
+ readonly kind: 'unreadable';
74
+ };
66
75
  export interface CloudEffectiveWarning {
67
76
  readonly kind: string;
68
77
  readonly domain?: string;
@@ -137,6 +146,7 @@ export interface CloudProjection {
137
146
  budget: CloudBudgetReading;
138
147
  runtimeCaps: CloudRuntimeCapsReading;
139
148
  modelRefIssues: CloudModelRefIssue[];
149
+ a2a: CloudA2aReading;
140
150
  }
141
151
  export declare function projectEffectiveBody(body: unknown, skillBodies: Record<string, string>, env: EnvLike, rostersValue?: unknown, opts?: CloudModelsDocOptions, skills?: CloudSkillsOptions): CloudProjection;
142
152
  export interface CloudEffectiveNotice {
@@ -1,6 +1,7 @@
1
1
  import { mcpAllowToolsVerdict, mcpAssertionHeaderNotSentNotice, mcpElicitationVerdict, mcpToolAxesVerdict, mcpToolFacesVerdict, readMcpHttpIdentityHeaders } from './mcpWireCaps.js';
2
2
  import { skillToolListsVerdict, toCappedSpec } from './skillsWireCaps.js';
3
3
  import { SETTINGS_DESCRIBE_BAD_MCP_SERVER_NAME, SETTINGS_IS_USABLE_MCP_SERVER_NAME, SETTINGS_READ_REQUEST_MCP_TRANSPORT } from './generated/settingsSchemaFns.js';
4
+ import { SETTINGS_IS_USABLE_WIRE_NAME } from './generated/settingsSchemaFns.js';
4
5
  import { snapshotArgs, wireTransportOf } from './mcpWireTransport.js';
5
6
  import { msg, renderMessage } from './i18n/translate.js';
6
7
  import { TIER_ORDER } from './model/tierVocabulary.js';
@@ -8,6 +9,7 @@ import { SETTINGS_NARROW_AT_MENTION } from './generated/settingsSchemaFns.js';
8
9
  import { modelsPolicyOf } from './model/modelsPolicy.js';
9
10
  import { normalizeEngineBaseUrl } from './engineUrl.js';
10
11
  import { guardedRead, readOwnDataNonEmptyString, readOwnDataValue } from './ownKey.js';
12
+ import { slotReadOf } from './wireFailureShape.js';
11
13
  import { capForDisplay } from './fleetTaskDesc.js';
12
14
  import { SETTINGS_BUDGET_NUMBER_KEYS, SETTINGS_BUDGET_PER_MODEL_NUMBER_KEYS, SETTINGS_BUDGET_STRING_KEYS, SETTINGS_TIER_GROUP_NAME_RE, } from './generated/settingsSchemaTables.js';
13
15
  const asRec = (v) => (typeof v === 'object' && v !== null && !Array.isArray(v) ? v : undefined);
@@ -535,6 +537,36 @@ export function cloudRosterNames(rostersValue) {
535
537
  .map((e) => asStr(asRec(e)?.name))
536
538
  .filter((n) => !!n);
537
539
  }
540
+ function cloudA2aOf(body) {
541
+ const cfg = slotReadOf(body, 'config');
542
+ const config = cfg.presence === 'present' ? guardedRead(() => asRec(cfg.value)) : undefined;
543
+ if (config === undefined)
544
+ return { kind: 'unreadable' };
545
+ const slot = slotReadOf(config, 'a2a');
546
+ if (slot.presence === 'absent')
547
+ return { kind: 'absent' };
548
+ const domain = slot.presence === 'present' ? guardedRead(() => asRec(slot.value)) : undefined;
549
+ if (domain === undefined)
550
+ return { kind: 'unreadable' };
551
+ const peersSlot = slotReadOf(domain, 'peers');
552
+ if (peersSlot.presence === 'absent')
553
+ return { kind: 'present', peerNames: [], unreadableRows: 0 };
554
+ const peers = peersSlot.presence === 'present' ? guardedRead(() => (Array.isArray(peersSlot.value) ? peersSlot.value : undefined)) : undefined;
555
+ const count = peers === undefined ? undefined : guardedRead(() => readOwnDataValue(peers, 'length'));
556
+ if (peers === undefined || typeof count !== 'number' || !Number.isSafeInteger(count) || count < 0)
557
+ return { kind: 'unreadable' };
558
+ const peerNames = [];
559
+ let unreadableRows = 0;
560
+ for (let i = 0; i < count; i++) {
561
+ const row = guardedRead(() => readOwnDataValue(peers, String(i)));
562
+ const name = typeof row === 'object' && row !== null ? guardedRead(() => readOwnDataValue(row, 'name')) : undefined;
563
+ if (typeof name === 'string' && SETTINGS_IS_USABLE_WIRE_NAME(name))
564
+ peerNames.push(name);
565
+ else
566
+ unreadableRows += 1;
567
+ }
568
+ return { kind: 'present', peerNames, unreadableRows };
569
+ }
538
570
  const BUDGET_NUMBER_KEYS = SETTINGS_BUDGET_NUMBER_KEYS;
539
571
  const BUDGET_STRING_KEYS = SETTINGS_BUDGET_STRING_KEYS;
540
572
  const PER_MODEL_NUMBER_KEYS = SETTINGS_BUDGET_PER_MODEL_NUMBER_KEYS;
@@ -702,6 +734,7 @@ export function projectEffectiveBody(body, skillBodies, env, rostersValue, opts,
702
734
  budget: budgetOf(b, view),
703
735
  runtimeCaps: runtimeCapsOf(b, view),
704
736
  modelRefIssues,
737
+ a2a: cloudA2aOf(b),
705
738
  };
706
739
  }
707
740
  const quoted = (s, fallback) => (s === undefined ? fallback : `the "${s}" settings`);
@@ -153,6 +153,7 @@ export interface CoreValuePorts {
153
153
  IMPORTED_SETTINGS_LAYERS: readonly ['userSettings', 'projectSettings', 'localSettings'];
154
154
  runParkedOf(run: WorkflowRunParkedInputView): boolean;
155
155
  parkedAgentsOf(agents: ReadonlyArray<WorkflowAgentStatusView>): WorkflowAgentStatusView[];
156
+ modelFaceResolvable(face: object, options?: ModelFaceOptionsView): ModelFaceVerdictView;
156
157
  }
157
158
  export interface WorkflowAgentStatusView {
158
159
  readonly status: string;
@@ -161,7 +162,21 @@ export interface WorkflowRunParkedInputView {
161
162
  readonly status: string;
162
163
  readonly agents: ReadonlyArray<WorkflowAgentStatusView>;
163
164
  }
164
- export declare const CORE_VALUE_PORT_NAMES: readonly ["resolveAutonomousLoopPrompt", "loosenReasons", "combinePolicies", "createAllowDenyPolicy", "MCP_NAMESPACE", "protocolOf", "ruleToolGrammarOf", "validatePermissionRules", "mintNamespacePrefix", "compileAllowList", "routeKeyOf", "joinRequestUrl", "resolveRouteCredential", "adjudicateModelRoute", "routePairingStatus", "judgeRuleToolName", "readRuleEntry", "readMcpToolAxes", "ANTHROPIC_DEFAULT_BASE_URL", "readToolFaces", "ruleNameCovers", "IMPORTED_SETTINGS_LAYERS", "runParkedOf", "parkedAgentsOf"];
165
+ export interface ModelFaceOptionsView {
166
+ readonly spec?: {
167
+ readonly model?: string | object;
168
+ readonly modelRole?: string;
169
+ };
170
+ readonly when?: readonly ('per-task' | 'deployment')[];
171
+ }
172
+ export type ModelFaceVerdictView = {
173
+ readonly ok: true;
174
+ } | {
175
+ readonly ok: false;
176
+ readonly role: string;
177
+ readonly code: string;
178
+ };
179
+ export declare const CORE_VALUE_PORT_NAMES: readonly ["resolveAutonomousLoopPrompt", "loosenReasons", "combinePolicies", "createAllowDenyPolicy", "MCP_NAMESPACE", "protocolOf", "ruleToolGrammarOf", "validatePermissionRules", "mintNamespacePrefix", "compileAllowList", "routeKeyOf", "joinRequestUrl", "resolveRouteCredential", "adjudicateModelRoute", "routePairingStatus", "judgeRuleToolName", "readRuleEntry", "readMcpToolAxes", "ANTHROPIC_DEFAULT_BASE_URL", "readToolFaces", "ruleNameCovers", "IMPORTED_SETTINGS_LAYERS", "runParkedOf", "parkedAgentsOf", "modelFaceResolvable"];
165
180
  export type CoreValuePortName = (typeof CORE_VALUE_PORT_NAMES)[number];
166
181
  export declare function installCoreValuePorts(ports: Partial<CoreValuePorts> | null): () => void;
167
182
  export declare function hasCoreValuePorts(): boolean;
@@ -195,3 +210,4 @@ export declare function ruleNameCovers(ruleName: string, toolName: string): bool
195
210
  export declare function importedSettingsLayers(): CoreValuePorts['IMPORTED_SETTINGS_LAYERS'] | undefined;
196
211
  export declare function runParkedOf(run: WorkflowRunParkedInputView): boolean | undefined;
197
212
  export declare function parkedAgentsOf(agents: ReadonlyArray<WorkflowAgentStatusView>): WorkflowAgentStatusView[] | undefined;
213
+ export declare function modelFaceResolvable(face: object, options?: ModelFaceOptionsView): ModelFaceVerdictView | undefined;
@@ -23,6 +23,7 @@ export const CORE_VALUE_PORT_NAMES = Object.freeze([
23
23
  'IMPORTED_SETTINGS_LAYERS',
24
24
  'runParkedOf',
25
25
  'parkedAgentsOf',
26
+ 'modelFaceResolvable',
26
27
  ]);
27
28
  let installed = null;
28
29
  export function installCoreValuePorts(ports) {
@@ -137,3 +138,7 @@ export function parkedAgentsOf(agents) {
137
138
  const fn = port('parkedAgentsOf');
138
139
  return fn === undefined ? undefined : fn(agents);
139
140
  }
141
+ export function modelFaceResolvable(face, options) {
142
+ const fn = port('modelFaceResolvable');
143
+ return fn === undefined ? undefined : fn(face, options);
144
+ }
@@ -9,6 +9,7 @@ import { askRowEndingCauseFor } from './hitl/approvalEndingCause.js';
9
9
  import { SDK_DECIDE_BINDING_KEYS } from './generated/sdkFactTables.js';
10
10
  import { isUiLanguage } from './env/uiLanguage.js';
11
11
  import { msg, renderMessage } from './i18n/translate.js';
12
+ import { unboundWayOutContent } from './checkpointRowVerdict.js';
12
13
  const STATUS_RESUMING = 'resuming';
13
14
  function str(v) {
14
15
  return typeof v === 'string' && v.length > 0 ? v : undefined;
@@ -162,7 +163,7 @@ export function decideRequiresBindingFromError(e) {
162
163
  }
163
164
  }
164
165
  export function decideRequiresBindingContent(_detail, lang) {
165
- return renderMessage(msg('approval.decide.requiresBinding'), isUiLanguage(lang) ? lang : undefined);
166
+ return renderMessage(msg('approval.decide.requiresBinding', { wayOut: unboundWayOutContent('unknown', lang) }), isUiLanguage(lang) ? lang : undefined);
166
167
  }
167
168
  function askGoneRawCause(e) {
168
169
  let top;
@@ -2,6 +2,7 @@ export declare const REDACTION_MARKER_PREFIX = "\u00ABredacted";
2
2
  export declare function looksLikeKnownSecret(s: string): boolean;
3
3
  export declare function isDiagnosticValueWord(value: string): boolean;
4
4
  export declare function percentBoundaryReadingOf(text: string): string;
5
+ type BlankNet = 0 | 1 | 2;
5
6
  interface WashStats {
6
7
  passes: number;
7
8
  capped: boolean;
@@ -13,7 +14,7 @@ export interface DisplayFace {
13
14
  readonly unsafe: RegExp | null;
14
15
  readonly fold: boolean;
15
16
  readonly mark: DisplayMark;
16
- readonly keepBlanks?: boolean;
17
+ readonly blanks?: BlankNet;
17
18
  readonly keepCrlf?: boolean;
18
19
  }
19
20
  export declare function applyDisplayFace(text: string, face: DisplayFace): string;
@@ -26,8 +27,8 @@ export interface DisplayUntrustedOptions {
26
27
  readonly keepLayout?: boolean | 'crlf';
27
28
  readonly mark?: DisplayMark;
28
29
  readonly max?: number;
29
- readonly escapeBackslashes?: boolean;
30
- readonly blanks?: boolean | 'fillers';
30
+ readonly escapeBackslashes?: boolean | 'auto';
31
+ readonly blanks?: boolean | 'except-ideographic';
31
32
  }
32
33
  export interface DisplayMarkSpan {
33
34
  readonly start: number;
@@ -37,6 +38,7 @@ export interface DisplayMarkSpan {
37
38
  export interface DisplayUntrustedMarked {
38
39
  readonly text: string;
39
40
  readonly marks: readonly DisplayMarkSpan[];
41
+ readonly exact: boolean;
40
42
  }
41
43
  export declare const DISPLAY_DECISION_BODY: Readonly<DisplayUntrustedOptions>;
42
44
  export declare const ESCAPE_FACE: DisplayFace;