@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
@@ -1,4 +1,5 @@
1
- import { engineCapNestedTrue, engineCapState, engineCapValue } from './engineCapsCache.js';
1
+ import { engineCapNestedTrue, engineCapState, engineCapString, engineCapValue } from './engineCapsCache.js';
2
+ import { hooksReaderNotReadKeys } from './hooksReaderGenerations.js';
2
3
  import { msg, renderMessage } from './i18n/translate.js';
3
4
  import { capForDisplay, collapseLabel } from './fleetTaskDesc.js';
4
5
  import { hostLog } from './host.js';
@@ -185,7 +186,8 @@ export function hooksWirePlan(opts) {
185
186
  const types = typesByEvent.get(event);
186
187
  return types === undefined || (typeof type === 'string' && types.has(type));
187
188
  };
188
- return buildHooksWirePlan(read, engine, shellRuns, promptAuthoredByUserOf(o), suppressedLocallyOf(o), compactionOnShellOf(o));
189
+ const readerNotRead = hooksReaderNotReadKeys(engineCapString(o.baseUrl, 'version'));
190
+ return buildHooksWirePlan(read, engine, shellRuns, promptAuthoredByUserOf(o), suppressedLocallyOf(o), readerNotRead, compactionOnShellOf(o));
189
191
  }
190
192
  function taskHooksCapability(baseUrl) {
191
193
  const v = engineCapValue(baseUrl, 'taskSettings');
@@ -298,7 +300,7 @@ function withheldRowsOf(candidates, trust, layers) {
298
300
  }
299
301
  return rows;
300
302
  }
301
- function buildHooksWirePlan(read, engine, shellRuns, promptAuthoredByUser, suppressedLocally, compactionOnShell = false) {
303
+ function buildHooksWirePlan(read, engine, shellRuns, promptAuthoredByUser, suppressedLocally, readerNotRead, compactionOnShell = false) {
302
304
  const settingsDropped = [];
303
305
  const settingsVerdicts = [];
304
306
  const settingsExcluded = [];
@@ -344,6 +346,7 @@ function buildHooksWirePlan(read, engine, shellRuns, promptAuthoredByUser, suppr
344
346
  shellRuns,
345
347
  promptAuthoredByUser,
346
348
  occupied: new Map(),
349
+ readerNotRead,
347
350
  }));
348
351
  if (d === undefined)
349
352
  return planOf('failed', undefined);
@@ -465,7 +468,7 @@ function buildHooksWirePlan(read, engine, shellRuns, promptAuthoredByUser, suppr
465
468
  continue;
466
469
  if (!Array.isArray(groups) || groups.length === 0)
467
470
  continue;
468
- const kept = filterSettingsHookGroups(source, event, groups, engine.pluginHooksCapable === true, (type) => shellRuns(event, type), judge, layer.mask);
471
+ const kept = filterSettingsHookGroups(source, event, groups, engine.pluginHooksCapable === true, (type) => shellRuns(event, type), judge, readerNotRead, layer.mask);
469
472
  settingsDropped.push(...kept.drops);
470
473
  settingsVerdicts.push(...kept.verdicts);
471
474
  settingsExcluded.push(...kept.excluded);
@@ -531,6 +534,7 @@ function buildHooksWirePlan(read, engine, shellRuns, promptAuthoredByUser, suppr
531
534
  promptAuthoredByUser,
532
535
  occupied,
533
536
  ...(suppressedLocally !== undefined ? { suppressedLocally } : {}),
537
+ readerNotRead,
534
538
  });
535
539
  });
536
540
  if (d === undefined)
@@ -115,6 +115,8 @@ declare const EN: {
115
115
  'model.subagent.chainUnbound': string;
116
116
  'model.subagent.bindingNotInCatalog': string;
117
117
  'model.subagent.ambiguous': string;
118
+ 'model.catalogDefault.refused.named': string;
119
+ 'model.catalogDefault.refused.select': string;
118
120
  'session.devices.laneAbsent': string;
119
121
  'session.devices.laneUnreported': string;
120
122
  'session.devices.verbsOff': string;
@@ -127,6 +129,7 @@ declare const EN: {
127
129
  'session.engine.dispatch.scopeMismatch': string;
128
130
  'session.engine.dispatch.scopeUnproven': string;
129
131
  'session.engine.dispatch.unresolved': string;
132
+ 'session.engine.dispatch.sessionAmbiguous': string;
130
133
  'config.cloudLogin.accessDenied': string;
131
134
  'config.cloudLogin.expiredToken': string;
132
135
  'config.cloudLogin.invalidGrant': string;
@@ -141,6 +144,7 @@ declare const EN: {
141
144
  'config.engineTarget.notConfigured': string;
142
145
  'config.engineTarget.notSignedIn': string;
143
146
  'config.engineTarget.probeFailed': string;
147
+ 'config.engineTarget.cloudUnreachable': string;
144
148
  'config.engineTarget.orgPolicy': string;
145
149
  'config.engineTarget.urlRefused': string;
146
150
  'config.engineTarget.loginFailed': string;
@@ -149,6 +153,7 @@ declare const EN: {
149
153
  'config.engineTarget.serverBelowSupportFloor': string;
150
154
  'config.engineTarget.input': string;
151
155
  'config.engineTarget.unknown': string;
156
+ 'config.webSearch.apiKeyWayOut': string;
152
157
  'onboard.probe.endpointReachable': string;
153
158
  'onboard.probe.modelSuggest': string;
154
159
  'onboard.probe.redirected': string;
@@ -246,7 +251,20 @@ declare const EN: {
246
251
  'approval.settle.cause.broadcastLost': string;
247
252
  'approval.settle.cause.streamDisconnected': string;
248
253
  'approval.settle.cause.undeliverable': string;
254
+ 'approval.resolution.engineUnavailable': string;
249
255
  'approval.decide.requiresBinding': string;
256
+ 'approval.decide.unboundWayOut.armed': string;
257
+ 'approval.decide.unboundWayOut.none': string;
258
+ 'approval.decide.unboundWayOut.unknown': string;
259
+ 'approval.rowUnresumable.lackingWayOut': string;
260
+ 'approval.rowUnresumable.fallback': string;
261
+ 'approval.rowUnresumable.askNotSurfaced': string;
262
+ 'approval.park.stillParked': string;
263
+ 'approval.park.refusedNotResumable': string;
264
+ 'approval.policyDeny.denyRule': string;
265
+ 'approval.policyDeny.dontAsk': string;
266
+ 'approval.policyDeny.engineFloor': string;
267
+ 'approval.policyDeny.tail': string;
250
268
  'approval.decision.grantChanged': string;
251
269
  'approval.decision.settledElsewhereContrary.deniedFirst': string;
252
270
  'approval.decision.settledElsewhereContrary.approvedFirst': string;
@@ -327,6 +345,12 @@ declare const EN: {
327
345
  'session.policy.withheld.namespaceCoveringUnconfirmed': string;
328
346
  'session.fileHistoryLeg.notHonored': string;
329
347
  'resume.refusal.placementMismatch': string;
348
+ 'resume.refusal.untouched': string;
349
+ 'resume.refusal.principalMismatch': string;
350
+ 'resume.refusal.compositionMismatch': string;
351
+ 'resume.refusal.parentConstraintMissing': string;
352
+ 'resume.refusal.parentConstraintMismatch': string;
353
+ 'resume.refusal.constraintUnprojectable': string;
330
354
  'resume.refusal.preflightWaitable': string;
331
355
  'resume.refusal.preflightNoWait': string;
332
356
  'resume.refusal.policyBlock': string;
@@ -422,6 +446,7 @@ declare const EN: {
422
446
  'session.selfHeal.row.askDecided.inferred': string;
423
447
  'session.selfHeal.row.askDecided.releaseUnknown': string;
424
448
  'session.selfHeal.row.askReopenFailed.withKeep': string;
449
+ 'session.selfHeal.row.askReopenFailed.rowUnresumable': string;
425
450
  'session.selfHeal.row.askReopenFailed.noKeep': string;
426
451
  'session.selfHeal.row.planReopenFailed.dismissed': string;
427
452
  'session.selfHeal.row.planReopenFailed.withKeep': string;
@@ -624,6 +649,8 @@ declare const EN: {
624
649
  'notice.wayOut.switchModel': string;
625
650
  'notice.wayOut.wait': string;
626
651
  'notice.wayOut.fixRequest': string;
652
+ 'notice.userInputUndrained.approvalFeedback.one': string;
653
+ 'notice.userInputUndrained.approvalFeedback.other': string;
627
654
  'notice.askUnresolvable.remedy.approver': string;
628
655
  'notice.askUnresolvable.remedy.permissionMode': string;
629
656
  'rules.refusal.sentence.one': string;
@@ -720,6 +747,8 @@ declare const EN: {
720
747
  'session.permissionModeSwitch.refusedWithCode': string;
721
748
  'session.permissionModeSwitch.unconfirmed': string;
722
749
  'session.permissionModeSwitch.unavailable': string;
750
+ 'session.permissionModeSwitch.unavailableRunStore': string;
751
+ 'session.permissionModeSwitch.unavailableCheckpointStore': string;
723
752
  'notice.capability.subject.userInvokedSkills': string;
724
753
  'notice.capability.subject.skillToolLists': string;
725
754
  'notice.capability.subject.permissionRulesWrite': string;
@@ -831,8 +860,11 @@ declare const EN: {
831
860
  'model.tier.blurb.flash': string;
832
861
  'model.tier.blurb.lite': string;
833
862
  'model.catalog.candidateRejected': string;
863
+ 'model.catalog.envServed': string;
834
864
  'model.notServed.withDefault': string;
835
865
  'model.notServed.noDefault': string;
866
+ 'model.notMentionable.withDefault': string;
867
+ 'model.notMentionable.noDefault': string;
836
868
  'notice.failure.headline.connectionLostNotSent': string;
837
869
  'notice.failure.headline.connectionLost': string;
838
870
  'notice.failure.headline.timeout': string;
@@ -983,6 +1015,8 @@ declare const EN: {
983
1015
  'notice.wireRefusal.hostPosture.both': string;
984
1016
  'notice.wireRefusal.hostPosture.unattributed': string;
985
1017
  'notice.wireRefusal.autonomyLane': string;
1018
+ 'notice.wireRefusal.sessionArchiveStamped': string;
1019
+ 'notice.wireRefusal.sessionArchiveStamped.fork': string;
986
1020
  'notice.wireRefusal.unsupportedRule': string;
987
1021
  'notice.wireRefusal.unsupportedRule.other': string;
988
1022
  'notice.wireRefusal.unsupportedRule.stored': string;
@@ -1051,6 +1085,15 @@ declare const EN: {
1051
1085
  'rules.sessionPolicy.deployment.noOperator.removeReadStoreCorrupt': string;
1052
1086
  'rules.sessionPolicy.deployment.noOperator.removeWriteStoreCorrupt': string;
1053
1087
  'config.hooks.plan.reason.compactionLocalFallback': string;
1088
+ 'config.hooks.plan.reason.keyNotRead': string;
1089
+ 'config.hooks.plan.disableAllHooks': string;
1090
+ 'config.hooks.plan.keyNotRead.oneKey': string;
1091
+ 'config.hooks.plan.keyNotRead.manyKeys': string;
1092
+ 'config.hooks.plan.keyNotRead.more': string;
1093
+ 'config.hooks.plan.keyNotRead.withOnFailure': string;
1094
+ 'config.hooks.plan.reason.sourceNotAuthored': string;
1095
+ 'config.hooks.plan.sourceNotAuthored.oneKey': string;
1096
+ 'config.hooks.plan.sourceNotAuthored.manyKeys': string;
1054
1097
  'session.hooks.compactTransition.disclosure.engineOutcomeUnknown': string;
1055
1098
  'session.hooks.compactTransition.disclosure.neitherRan': string;
1056
1099
  'session.background.handedOff': string;
@@ -115,6 +115,8 @@ const EN = {
115
115
  'model.subagent.chainUnbound': "Subagent model {word} is not bound on this engine (neither it nor any tier below it has a model) — the subagent will run on its parent's model.",
116
116
  'model.subagent.bindingNotInCatalog': "Subagent model {word} is bound to a model that is not in this engine's model catalog — the subagent will run on its parent's model.",
117
117
  'model.subagent.ambiguous': "Subagent model {word} matches more than one model name that differ only in case — spell it exactly; the subagent will run on its parent's model.",
118
+ 'model.catalogDefault.refused.named': 'A task that names no model would be refused: the engine cannot resolve a default model from its model configuration (the settings default is {name}) · Set a default model the engine can run, or add or fix one',
119
+ 'model.catalogDefault.refused.select': 'A task that names no model would be refused: the engine cannot resolve a default model from its model configuration (the settings default is a selection) · Change the selection, or add or fix a model the engine can run',
118
120
  'session.devices.laneAbsent': 'This backend has no remote-control lane',
119
121
  'session.devices.laneUnreported': "This backend doesn't report a remote-control lane",
120
122
  'session.devices.verbsOff': "This backend's device lane is on, but its device-management verbs are off — devices can't be listed or changed here",
@@ -127,6 +129,7 @@ const EN = {
127
129
  'session.engine.dispatch.scopeMismatch': "This session belongs to an engine in a different space from the one you're signed in to, so nothing was sent. Switch to that space, then try again.",
128
130
  'session.engine.dispatch.scopeUnproven': "Your current sign-in can't be confirmed to reach this session's engine, so nothing was sent. Sign in to that engine's space (or connect to the engine directly), then try again.",
129
131
  'session.engine.dispatch.unresolved': "This session's engine isn't known yet, so nothing was sent. Choose the engine for this session once, then try again.",
132
+ 'session.engine.dispatch.sessionAmbiguous': 'This session is registered on two engines at once, so nothing was sent. Stop here and resolve which engine it belongs to first.',
130
133
  'config.cloudLogin.accessDenied': 'Sign-in was declined.',
131
134
  'config.cloudLogin.expiredToken': 'The sign-in code expired before it was approved — start again.',
132
135
  'config.cloudLogin.invalidGrant': 'The Cloud sign-in can no longer be renewed — sign in again.',
@@ -141,6 +144,7 @@ const EN = {
141
144
  'config.engineTarget.notConfigured': "Cloud isn't set up yet — sign in and connect a Cloud engine first.",
142
145
  'config.engineTarget.notSignedIn': 'Sign in to Sema Cloud first (or paste an engine token under Advanced).',
143
146
  'config.engineTarget.probeFailed': "The engine didn't pass the connection check. Nothing was saved.",
147
+ 'config.engineTarget.cloudUnreachable': "The Cloud engine is set up, but it can't be reached right now — check your connection or the engine address, then try again.",
144
148
  'config.engineTarget.orgPolicy': 'Your organization requires a different Cloud engine address.',
145
149
  'config.engineTarget.urlRefused': "That engine address can't be used — it must be an http(s) address without credentials.",
146
150
  'config.engineTarget.loginFailed': 'Sign-in failed.',
@@ -149,6 +153,7 @@ const EN = {
149
153
  'config.engineTarget.serverBelowSupportFloor': 'This server reports version {version}, older than {floor} — the oldest server this client supports. Requests to it may be refused or not behave as described; connect to a server at {floor} or newer.',
150
154
  'config.engineTarget.input': "The request wasn't in the expected shape, so nothing was changed.",
151
155
  'config.engineTarget.unknown': "The engine switch didn't go through.",
156
+ 'config.webSearch.apiKeyWayOut': 'If the key was copied with whitespace, a line break or an invisible character before or after it, remove that — the key is used exactly as written and is never trimmed for you.',
152
157
  'onboard.probe.endpointReachable': '{method} {path} → {status} (endpoint reachable)',
153
158
  'onboard.probe.modelSuggest': '{error} — listed similar id: "{near}"',
154
159
  'onboard.probe.redirected': 'the endpoint redirected ({status}) to {where} — Sema does not forward your key across redirects; use the final URL as the base URL',
@@ -246,7 +251,20 @@ const EN = {
246
251
  'approval.settle.cause.broadcastLost': 'it never reached any open connection',
247
252
  'approval.settle.cause.streamDisconnected': 'the connection carrying this card dropped',
248
253
  'approval.settle.cause.undeliverable': 'it could not be delivered to any approval surface',
249
- 'approval.decide.requiresBinding': 'This decision was sent without the binding that ties it to the exact action on the approval card, so the engine refused it · Nothing was decided and the approval is still pending · Fetch the pending approvals again and decide from the card as it is listed now; if the listed card itself carries no binding, it cannot be decided here — cancel the run or let the approval expire',
254
+ 'approval.resolution.engineUnavailable': 'The engine is temporarily unavailable — answer this once the engine is back.',
255
+ 'approval.decide.requiresBinding': 'This decision was sent without the binding that ties it to the exact action on the approval card, so the engine refused it · Nothing was decided and the approval is still pending · Fetch the pending approvals again and decide from the card as it is listed now; if the listed card itself carries no binding, {wayOut}',
256
+ 'approval.decide.unboundWayOut.armed': 'it cannot be decided here — cancel the run or let the approval expire',
257
+ 'approval.decide.unboundWayOut.none': 'it cannot be decided here — cancel the run (this approval has no expiry timer)',
258
+ 'approval.decide.unboundWayOut.unknown': 'it cannot be decided here — cancel the run',
259
+ 'approval.rowUnresumable.lackingWayOut': 'it cannot be decided on this engine — a newer engine version can continue it: upgrade this engine and send your message again (or, if several engines are available, switch to a newer one), or cancel the run',
260
+ 'approval.rowUnresumable.fallback': 'this engine does not report that it can continue this pending approval, so it was not shown as a card that can be approved; nothing was sent',
261
+ 'approval.rowUnresumable.askNotSurfaced': 'the pending row (task {taskId}) cannot be continued by this engine, so it is not surfaced as a card that can be answered: {sentence}',
262
+ 'approval.park.stillParked': '{gate} gate could not be answered: {reason} — the run is still parked on this approval.',
263
+ 'approval.park.refusedNotResumable': '{gate} gate could not be answered: {reason} — this engine cannot resume this approval as things stand; cancel the run if it is still parked.',
264
+ 'approval.policyDeny.denyRule': 'Permission for this tool use was denied by a deny rule in the permission settings. {tail}',
265
+ 'approval.policyDeny.dontAsk': 'Permission for this tool use was denied: this session no longer asks for approval, so a call that would need approval is refused. {tail}',
266
+ 'approval.policyDeny.engineFloor': 'Permission for this tool use was denied by a safeguard on the engine side that permission settings cannot override. {tail}',
267
+ 'approval.policyDeny.tail': 'The action was NOT performed. Do not claim it succeeded, and do not retry it in this session — report the limitation to the user, or suggest an alternative.',
250
268
  'approval.decision.grantChanged': 'The engine refused this approval because the skill grant it was bound to has changed since the card was shown · Nothing was decided and the request is still waiting, but approving it again will be refused the same way · Deny this request so the model can activate the skill again',
251
269
  'approval.decision.settledElsewhereContrary.deniedFirst': 'This request was already answered elsewhere and denied, so your approval did not take effect.',
252
270
  'approval.decision.settledElsewhereContrary.approvedFirst': 'This request was already answered elsewhere and approved, so your denial did not take effect.',
@@ -326,7 +344,13 @@ const EN = {
326
344
  'session.projectMemory.withheld.unknown': 'Not sent with this request: the setting that stops project instruction files from being read was held back for a reason this version does not recognize.',
327
345
  'session.policy.withheld.namespaceCoveringUnconfirmed': 'Not written to this session’s rule record: this rule names a server or agent peer as a whole, or a group of its tools by pattern, and the engine has not confirmed that this record reads such a rule as a group — an engine that matches the record by exact tool name would block none of those tools.',
328
346
  'session.fileHistoryLeg.notHonored': 'The engine is still capturing file history for this session, though your settings asked it not to.',
329
- 'resume.refusal.placementMismatch': 'This resume named a different placement root than the one recorded when the work was parked · The engine refused it before consuming anything — the parked work is untouched · Retry with the recorded root, or omit the placement root to inherit it',
347
+ 'resume.refusal.placementMismatch': 'This resume named a different placement root than the one recorded when the work was parked · {safe} · Retry with the recorded root, or omit the placement root to inherit it',
348
+ 'resume.refusal.untouched': 'The engine refused it before consuming anything — the parked work is untouched',
349
+ 'resume.refusal.principalMismatch': 'This resume named a different principal than the one recorded when the work was parked · {safe} · Retry with the recorded principal, or omit the principal to inherit it',
350
+ 'resume.refusal.compositionMismatch': 'This request does not match the composition leg recorded for this parked work (a resume named a different leg, or a verification pause was voided on a card whose recorded leg is not a verification leg) · {safe} · On a resume, name the recorded leg or omit the leg to inherit it; a verification pause can only be voided on a card recorded under a verification leg',
351
+ 'resume.refusal.parentConstraintMissing': "This parked work was suspended under policy constraints inherited from its parent tasks, and this resume did not re-supply them (resuming without them would silently drop the parents' gate) · {safe} · Retry with the parent policy chain re-supplied",
352
+ 'resume.refusal.parentConstraintMismatch': 'The parent policy constraints supplied with this resume do not match the ones this work was parked under (a partial or different chain would run it under thinner or different parent rules) · {safe} · Retry with the full original parent chain',
353
+ 'resume.refusal.constraintUnprojectable': 'This resume carried an edited approval, but the policy inherited from the parent tasks cannot be re-checked against an edit · {safe} · Decide it again without editing the input — an unedited approval is not affected by this refusal',
330
354
  'resume.refusal.preflightWaitable': "The deployment's resume preflight refused this attempt · The refusal happened before the commit — your decision was not consumed · The engine supplied a wait, so this token stays redeemable once the obstacle clears",
331
355
  'resume.refusal.preflightNoWait': "The deployment's resume preflight refused this attempt · The refusal happened before the commit — your decision was not consumed · The engine supplied no wait, so this refusal does not say whether the token stays redeemable",
332
356
  'resume.refusal.policyBlock': "The engine refused to resume this parked work at its admission check (the engine reports that its admission policy changed since the work was first accepted) · {reason} · This refusal does not say whether anything was consumed before it or whether a retry would pass — check the task's current state before deciding again, and ask whoever operates this deployment if it keeps happening",
@@ -370,7 +394,7 @@ const EN = {
370
394
  'resume.refusal.park.interactiveEnded': '{head} The engine ended that parked run, so this conversation is free: send the work again as a new message.',
371
395
  'resume.refusal.park.interactiveBusy': '{head}{configMayReturn} The parked run keeps this conversation busy until it is cancelled.',
372
396
  'resume.refusal.park.blockedPrint': 'sema will not put the card for run {run} back on screen by itself: this engine version refuses to resume it. Cancel the run ({cancel}) and submit the work again as a new task.',
373
- 'resume.refusal.park.blockedInteractive': 'sema will not put the card for run {run} back on screen by itself: this engine version refuses to resume it. To free this conversation, send a message to bring the card back and answer it — sema then offers to cancel that run, after which you can send the work again as a new message.',
397
+ 'resume.refusal.park.blockedInteractive': 'sema will not put the card for run {run} back on screen by itself: this engine version refuses to resume it. To free this conversation, send a message — sema then offers to cancel that run (if the card comes back instead, answer it first), after which you can send the work again as a new message.',
374
398
  'session.selfHeal.wayOut.interactive': 'run /clear to keep working in a fresh session',
375
399
  'session.selfHeal.freshSession.default': 'start a new session (drop --resume/--continue)',
376
400
  'session.selfHeal.freshSession.defaultCapitalized': 'Start a new session (drop --resume/--continue)',
@@ -408,7 +432,7 @@ const EN = {
408
432
  'session.selfHeal.injected.handedOffWatch': '{lead} was passed to the reply already in progress{id} instead of starting a new one — watch that reply for what it does with it.',
409
433
  'session.selfHeal.injected.interruptedFinishing': '{lead} was not delivered: the earlier reply{id} that was stopped is still finishing, so sema did not send it and did not retry — the model has not seen it. Give it a moment, then try again.',
410
434
  'session.selfHeal.injected.notDelivered': '{lead} was not delivered: this session was still busy with an earlier reply{id}, and there was no open card you could answer to free it{noView}. sema did not retry, so the model has not seen it.',
411
- 'session.selfHeal.injected.redundant': '{lead} was not passed on: it was about the reply already in progress{id}, which has already resumed on its own, so it has nothing to add.',
435
+ 'session.selfHeal.injected.redundant': '{lead} was not passed on: the reply it was about{id} resumed on its own after that decision, so it has nothing to add.',
412
436
  'session.selfHeal.injected.deferred': '{lead} is waiting: this session is busy with an earlier reply{id}, so sema kept the message and will send it as a new message once that reply has finished or paused.',
413
437
  'session.selfHeal.decisionInFlight': 'The previous turn is parked {parkedOn} and your answer to that card is still on its way to the engine, so sema did not show the card again — answering it a second time would send a second decision. It did NOT cancel the run. Your message was NOT sent; send it again in a moment, once the engine has applied that decision.',
414
438
  'session.selfHeal.parkedOn.ask': 'waiting for your decision (run {taskId})',
@@ -422,6 +446,7 @@ const EN = {
422
446
  'session.selfHeal.row.askDecided.inferred': 'The previous turn was parked on an approval that your permission rules decided on their own (no card was needed); run {taskId} resumed and has since finished — sema is re-sending your message; if that run has not fully let go of the session yet, you may have to send it once more.',
423
447
  'session.selfHeal.row.askDecided.releaseUnknown': 'The previous turn was parked on an approval that your permission rules decided on their own (no card was needed), so run {taskId} should be resuming{status}. sema could not yet confirm it finished, so your message was not sent — wait a moment and send it again.',
424
448
  'session.selfHeal.row.askReopenFailed.withKeep': 'The previous turn is parked waiting for your decision (run {taskId}) and sema could not reopen that card here{noView}. It did NOT cancel the run — that would have decided it for you. Your message was NOT sent. To keep this conversation, {keep}: the card comes back when the session resumes, if it is still waiting. Or {wayOut} if you no longer want it.{viaEngine}',
449
+ 'session.selfHeal.row.askReopenFailed.rowUnresumable': 'The previous turn is parked waiting for your decision (run {taskId}), but this engine cannot continue that pending request, so there is no card to reopen: {sentence} · {unbound}. It did NOT cancel the run. Your message was NOT sent.',
425
450
  'session.selfHeal.row.askReopenFailed.noKeep': 'The previous turn is parked waiting for your decision (run {taskId}) and sema could not reopen that card here{noView}. It did NOT cancel the run — that would have decided it for you. Your message was NOT sent; {wayOut} if you no longer want it.{viaEngine}',
426
451
  'session.selfHeal.row.planReopenFailed.dismissed': 'The previous turn is parked waiting for a plan review (run {taskId}), and you closed its approval card — {closed}. It did NOT cancel the run — that would have discarded the plan for you. Your message was NOT sent; send it again to bring the card back.',
427
452
  'session.selfHeal.row.planReopenFailed.withKeep': 'The previous turn is parked waiting for a plan review (run {taskId}) and sema could not reopen that approval card{noView}. It did NOT cancel the run — that would have discarded the plan for you. Your message was NOT sent. To keep this conversation, {keep}: the card comes back when the session resumes, if it is still waiting. Or {wayOut} if you no longer want that plan.{viaEngine}',
@@ -624,6 +649,8 @@ const EN = {
624
649
  'notice.wayOut.switchModel': 'The model service cannot serve this request right now — try another model',
625
650
  'notice.wayOut.wait': 'The model service is still working on this request — wait a moment, then try again',
626
651
  'notice.wayOut.fixRequest': 'The model service refused this request — change the request before sending it again; sending it as it is will not help',
652
+ 'notice.userInputUndrained.approvalFeedback.one': '{count} note you wrote when approving a tool call never reached the model and will not be delivered. Send it again if you still need it.',
653
+ 'notice.userInputUndrained.approvalFeedback.other': '{count} notes you wrote when approving a tool call never reached the model and will not be delivered. Send them again if you still need them.',
627
654
  'notice.askUnresolvable.remedy.approver': 'Way out: connect an approver who can answer requests like this one, or make the connected approver reachable, then try again',
628
655
  'notice.askUnresolvable.remedy.permissionMode': 'Another way out, if this deployment allows it: the {mode} permission mode lets requests like this one through without anyone answering them, and each request let through this way is marked on the tool call it applied to',
629
656
  'rules.refusal.sentence.one': 'permissions: 1 rule will not be enforced — {list}',
@@ -720,6 +747,8 @@ const EN = {
720
747
  'session.permissionModeSwitch.refusedWithCode': 'The engine refused to switch the mode of this run ({status} {code}), so it keeps the mode it had.',
721
748
  'session.permissionModeSwitch.unconfirmed': 'The switch was sent but no readable answer came back, so whether the mode changed is not known — switch again to be sure.',
722
749
  'session.permissionModeSwitch.unavailable': 'Switching the mode of a running turn is not available here, so the mode was not changed.',
750
+ 'session.permissionModeSwitch.unavailableRunStore': 'Switching the mode of a running turn needs this deployment to keep durable run records, and it does not, so the mode was not changed.',
751
+ 'session.permissionModeSwitch.unavailableCheckpointStore': 'Switching the mode of a running turn needs this deployment to keep durable approval checkpoints, and it does not, so the mode was not changed.',
723
752
  'notice.capability.subject.userInvokedSkills': 'user-invoked skills',
724
753
  'notice.capability.subject.skillToolLists': 'skill tool lists',
725
754
  'notice.capability.subject.permissionRulesWrite': 'permission-rule write entry',
@@ -831,8 +860,11 @@ const EN = {
831
860
  'model.tier.blurb.flash': 'fast + cheap — titles, recaps, volume work',
832
861
  'model.tier.blurb.lite': 'cheapest — bulk classification, simple lookups',
833
862
  'model.catalog.candidateRejected': 'The deployment refused its most recent configuration change{which} and is still running on the configuration before it — models or settings added by that change are not in effect',
863
+ 'model.catalog.envServed': 'The engine is currently serving models from its environment table; the catalog is not in effect ({stance})',
834
864
  'model.notServed.withDefault': "The model {model} is not available in this engine's model catalog, so this session uses the engine's default model {default}",
835
865
  'model.notServed.noDefault': "The model {model} is not available in this engine's model catalog, so this session leaves the choice of model to the engine",
866
+ 'model.notMentionable.withDefault': "The model {model} is in this engine's model catalog, but this deployment's model allowlist does not allow selecting it, so this session uses the engine's default model {default}",
867
+ 'model.notMentionable.noDefault': "The model {model} is in this engine's model catalog, but this deployment's model allowlist does not allow selecting it, so this session leaves the choice of model to the engine",
836
868
  'notice.failure.headline.connectionLostNotSent': 'The engine is unreachable — your message did not run. Check that the engine is up, then send it again.',
837
869
  'notice.failure.headline.connectionLost': 'The connection to the engine was lost — it is not known whether your message ran. Check the run’s status, or reattach to it, before sending it again.',
838
870
  'notice.failure.headline.timeout': 'The event stream went silent — the run may still be going on the engine. Check its status before sending again.',
@@ -983,6 +1015,8 @@ const EN = {
983
1015
  'notice.wireRefusal.hostPosture.both': "The engine refused this request before anything ran: the request asked both for the shell to inherit this machine's whole environment and for bypassPermissions, and this deployment refused at least one of them; the refusal does not say which · {notLocal}; send it again without one or both (the whole-environment setting is honored only on a single-user deployment)",
984
1016
  'notice.wireRefusal.hostPosture.unattributed': "The engine refused this request before anything ran: this deployment does not accept a setting in it that only a single-user deployment may use; the engine's own message names it · {notLocal}; send it again without that setting",
985
1017
  'notice.wireRefusal.autonomyLane': 'The engine did not start this leader run: this deployment runs in plan-only autonomy, and a leader run has no way to have its plan reviewed, so nothing was started · Submit the work as a regular run instead, or ask whoever operates the engine to change its autonomy setting',
1018
+ 'notice.wireRefusal.sessionArchiveStamped': "This session's stored archive still carries an owner stamp written by an earlier server version, so it cannot be forked or have its log replaced; nothing was written · Delete the session and push it again",
1019
+ 'notice.wireRefusal.sessionArchiveStamped.fork': "This session's stored archive still carries an owner stamp written by an earlier server version, so it cannot be forked or have its log replaced; nothing was written · This conversation keeps running on its own history; to fork it, delete the session and push it again",
986
1020
  'notice.wireRefusal.unsupportedRule': 'The engine refused this request, so none of it took effect: a rule in it is a form the engine does not support — {detail} · Remove or rewrite that rule (to stop a tool altogether, write its name alone), then send it again',
987
1021
  'notice.wireRefusal.unsupportedRule.other': 'The engine refused this request, so none of it took effect: {count} rules in it are forms the engine does not support — {detail} · Remove or rewrite those rules (to stop a tool altogether, write its name alone), then send it again',
988
1022
  'notice.wireRefusal.unsupportedRule.stored': 'The engine refused to continue this work: the request stored for it has a rule in it that is a form the engine does not support — {detail} · It cannot continue as stored. Remove or rewrite that rule (to stop a tool altogether, write its name alone), cancel the work if it is still suspended, then submit it again as a new request',
@@ -1051,6 +1085,15 @@ const EN = {
1051
1085
  'rules.sessionPolicy.deployment.noOperator.removeReadStoreCorrupt': 'The engine could not establish which version this session’s rules are at, so nothing was changed. This deployment has no operator to look at the rule store — whoever runs it has to.',
1052
1086
  'rules.sessionPolicy.deployment.noOperator.removeWriteStoreCorrupt': 'The engine could not establish which version this session’s rules are at and refused to stamp a new one, so nothing was changed. This deployment has no operator to look at the rule store — whoever runs it has to.',
1053
1087
  'config.hooks.plan.reason.compactionLocalFallback': 'this compaction is summarized on this client because the engine session is unavailable, so the engine will not run it and this client runs it itself',
1088
+ 'config.hooks.plan.reason.keyNotRead': 'the connected server does not read a key written on this hook (remove the key, or use a server that reads it)',
1089
+ 'config.hooks.plan.disableAllHooks': 'All hooks are turned off by managed settings (disableAllHooks).',
1090
+ 'config.hooks.plan.keyNotRead.oneKey': '{layer}: {hooks} will not run — the connected server does not read the key {coordinates}. Remove the key, or use a server that reads it.',
1091
+ 'config.hooks.plan.keyNotRead.manyKeys': '{layer}: {hooks} will not run — the connected server does not read the keys {coordinates}. Remove those keys, or use a server that reads them.',
1092
+ 'config.hooks.plan.keyNotRead.more': '{shown} and {rest} more',
1093
+ 'config.hooks.plan.keyNotRead.withOnFailure': '{line} The connected server does not read onFailure, so a hook set to block when it fails will not block.',
1094
+ 'config.hooks.plan.reason.sourceNotAuthored': 'the matcher group of this hook sets "source", which only this client sets (remove the key)',
1095
+ 'config.hooks.plan.sourceNotAuthored.oneKey': '{layer}: {hooks} will not run — the key {coordinates} is set only by this client, not in settings. Remove the key.',
1096
+ 'config.hooks.plan.sourceNotAuthored.manyKeys': '{layer}: {hooks} will not run — the keys {coordinates} are set only by this client, not in settings. Remove those keys.',
1054
1097
  'session.hooks.compactTransition.disclosure.engineOutcomeUnknown': 'The compaction request had already been sent to the engine when the summary fell back to this client, so whether the engine ran the compaction hooks cannot be told here, and this client did not run them again.',
1055
1098
  'session.hooks.compactTransition.disclosure.neitherRan': 'The compaction hooks did not run this time: the engine did not compact here and this client could not start its own summary. If the engine still compacts later it will run them then.',
1056
1099
  'session.background.handedOff': "Moved to the background. You'll be told when it finishes.",
@@ -115,6 +115,8 @@ const ZH = {
115
115
  'model.subagent.chainUnbound': '子代理模型 {word} 在这台引擎上没有绑定(它和比它低的档位都没绑模型)—— 子代理将沿用父代理的模型。',
116
116
  'model.subagent.bindingNotInCatalog': '子代理模型 {word} 绑定的模型不在这台引擎的模型目录里 —— 子代理将沿用父代理的模型。',
117
117
  'model.subagent.ambiguous': '子代理模型 {word} 同时对上了几个只差大小写的模型名 —— 请照原样拼写;子代理将沿用父代理的模型。',
118
+ 'model.catalogDefault.refused.named': '不点名模型的任务会被拒:引擎从它的模型配置里解析不出缺省模型(设置里的缺省是 {name}) · 设一个引擎跑得了的缺省模型,或添加 / 修好一个',
119
+ 'model.catalogDefault.refused.select': '不点名模型的任务会被拒:引擎从它的模型配置里解析不出缺省模型(设置里的缺省是挑选条件) · 改挑选条件,或添加 / 修好一个引擎跑得了的模型',
118
120
  'session.devices.laneAbsent': '这个后端没有远程控制车道',
119
121
  'session.devices.laneUnreported': '这个后端没有报告远程控制车道',
120
122
  'session.devices.verbsOff': '这个后端的设备车道开着,但设备管理动作关着 —— 这里列不出也改不了设备',
@@ -127,6 +129,7 @@ const ZH = {
127
129
  'session.engine.dispatch.scopeMismatch': '这只会话属于另一个空间里的引擎,和你当前登录的空间不同,什么都没发。切到那个空间后再试一次。',
128
130
  'session.engine.dispatch.scopeUnproven': '确认不了你当前的登录能到达这只会话所在的引擎,什么都没发。先登录那台引擎所在的空间(或直接连上那台引擎),再试一次。',
129
131
  'session.engine.dispatch.unresolved': '这只会话所在的引擎还不知道,什么都没发。先为这只会话选一次引擎,再试一次。',
132
+ 'session.engine.dispatch.sessionAmbiguous': '这个会话同时登记在两台引擎上,先停下不发 —— 请先确认它属于哪一台。',
130
133
  'config.cloudLogin.accessDenied': '登录被拒绝了。',
131
134
  'config.cloudLogin.expiredToken': '登录码在批准之前过期了 —— 请重新开始。',
132
135
  'config.cloudLogin.invalidGrant': 'Cloud 登录已无法续期 —— 请重新登录。',
@@ -141,6 +144,7 @@ const ZH = {
141
144
  'config.engineTarget.notConfigured': 'Cloud 还没配好 —— 先登录并连上一台 Cloud 引擎。',
142
145
  'config.engineTarget.notSignedIn': '请先登录 Sema Cloud(或在高级选项里粘贴引擎令牌)。',
143
146
  'config.engineTarget.probeFailed': '引擎没通过连接检查。什么都没保存。',
147
+ 'config.engineTarget.cloudUnreachable': 'Cloud 引擎已配置,但此刻连不上 —— 请检查网络或引擎地址后重试。',
144
148
  'config.engineTarget.orgPolicy': '你的组织要求使用另一个 Cloud 引擎地址。',
145
149
  'config.engineTarget.urlRefused': '这个引擎地址不能用 —— 必须是不带凭据的 http(s) 地址。',
146
150
  'config.engineTarget.loginFailed': '登录失败。',
@@ -149,6 +153,7 @@ const ZH = {
149
153
  'config.engineTarget.serverBelowSupportFloor': '这台服务端自报版本 {version},低于本客户端支持的最低服务端版本 {floor}。发给它的请求可能被拒,或与这里描述的行为不一致;请连接 {floor} 或更新的服务端。',
150
154
  'config.engineTarget.input': '请求的形状不对,什么都没改。',
151
155
  'config.engineTarget.unknown': '引擎切换没有完成。',
156
+ 'config.webSearch.apiKeyWayOut': '如果密钥复制时前后带了空白、换行或不可见字符,请去掉 —— 密钥按原样使用,不会替你去除首尾空白。',
152
157
  'onboard.probe.endpointReachable': '{method} {path} → {status}(端点可达)',
153
158
  'onboard.probe.modelSuggest': '{error} —— 列表里相近的 id:"{near}"',
154
159
  'onboard.probe.redirected': '端点重定向了({status})到 {where} —— Sema 不会把你的钥匙跟着重定向带过去;请把最终地址填成根地址',
@@ -246,7 +251,20 @@ const ZH = {
246
251
  'approval.settle.cause.broadcastLost': '它没有送达任何一个打开着的连接',
247
252
  'approval.settle.cause.streamDisconnected': '承载这张卡的连接断了',
248
253
  'approval.settle.cause.undeliverable': '它没能送达任何审批界面',
249
- 'approval.decide.requiresBinding': '这次决定没有带上把它绑到审批卡上那个具体动作的绑定,引擎拒绝了 · 什么都没有决定,这条审批仍在等待 · 请重新获取待决审批,按现在列出的那张卡再决定;如果列出的卡本身就没有绑定,这里决不了 —— 取消这次运行,或等这条审批过期',
254
+ 'approval.resolution.engineUnavailable': '引擎暂不可用 —— 待引擎回来再答。',
255
+ 'approval.decide.requiresBinding': '这次决定没有带上把它绑到审批卡上那个具体动作的绑定,引擎拒绝了 · 什么都没有决定,这条审批仍在等待 · 请重新获取待决审批,按现在列出的那张卡再决定;如果列出的卡本身就没有绑定,{wayOut}',
256
+ 'approval.decide.unboundWayOut.armed': '这里决不了 —— 取消这次运行,或等这条审批过期',
257
+ 'approval.decide.unboundWayOut.none': '这里决不了 —— 取消这次运行(这条审批没有到期计时)',
258
+ 'approval.decide.unboundWayOut.unknown': '这里决不了 —— 取消这次运行',
259
+ 'approval.rowUnresumable.lackingWayOut': '这台引擎决不了 —— 更新版本的引擎可以续跑它:请升级这台引擎后再发一次消息(有多台引擎可选时,换到更新的那一台),或者取消这次运行',
260
+ 'approval.rowUnresumable.fallback': '这台引擎没说它续得了这条待决审批,所以没有呈成可批的卡;什么都没发',
261
+ 'approval.rowUnresumable.askNotSurfaced': '这条待决行(任务 {taskId})这台引擎续不了,所以没有呈成可作答的卡:{sentence}',
262
+ 'approval.park.stillParked': '{gate} 这道门没能作答:{reason} —— 这一跑仍停在这条审批上。',
263
+ 'approval.park.refusedNotResumable': '{gate} 这道门没能作答:{reason} —— 这台引擎目前续不了这条审批;若这一跑仍停着,请取消它。',
264
+ 'approval.policyDeny.denyRule': '这次工具调用被权限设置里的拒绝规则拒绝了。{tail}',
265
+ 'approval.policyDeny.dontAsk': '这次工具调用被拒绝了:本会话不再询问审批,凡需要审批的调用一律拒绝。{tail}',
266
+ 'approval.policyDeny.engineFloor': '这次工具调用被引擎侧的保护规则拒绝了,权限设置无法覆盖。{tail}',
267
+ 'approval.policyDeny.tail': '该操作没有执行。不要声称它已成功,也不要在本会话里重试 —— 请向用户说明这一限制,或建议别的做法。',
250
268
  'approval.decision.grantChanged': '引擎拒收了这次批准:它绑定的技能授予在卡呈出之后已经变了 · 什么都没有决定,这一请求仍在等待,但再批一次会以同样的理由被拒 · 请拒绝这一请求,让模型重新激活那个技能',
251
269
  'approval.decision.settledElsewhereContrary.deniedFirst': '这一请求已在别处被答复为拒绝,你的批准没有生效。',
252
270
  'approval.decision.settledElsewhereContrary.approvedFirst': '这一请求已在别处被答复为批准,你的拒绝没有生效。',
@@ -326,7 +344,13 @@ const ZH = {
326
344
  'session.projectMemory.withheld.unknown': '这次请求没有带上它:「别读项目指令文件」这项设置因为一个这个版本不认识的原因被扣下了。',
327
345
  'session.policy.withheld.namespaceCoveringUnconfirmed': '没有写进这条会话的规则记录:这条规则点的是整个服务器或对端,或按模式点了它的一组工具,而引擎还没有确认这份记录会把这样的规则读成一组 —— 按精确工具名比对记录的引擎会一只都拦不住。',
328
346
  'session.fileHistoryLeg.notHonored': '引擎仍在为这个会话捕获文件历史,尽管你的设置要求它别这么做。',
329
- 'resume.refusal.placementMismatch': '这次续跑指定的放置根,和这件工作 parked 时记下的不是同一个 · 引擎在消耗任何东西之前就拒了它 —— parked 的工作原封未动 · 请用记下的那个根重试,或者省略放置根让它沿用记下的',
347
+ 'resume.refusal.placementMismatch': '这次续跑指定的放置根,和这件工作 parked 时记下的不是同一个 · {safe} · 请用记下的那个根重试,或者省略放置根让它沿用记下的',
348
+ 'resume.refusal.untouched': '引擎在消耗任何东西之前就拒了它 —— parked 的工作原封未动',
349
+ 'resume.refusal.principalMismatch': '这次续跑指定的身份(principal),和这件工作 parked 时记下的不是同一个 · {safe} · 请用记下的那个身份重试,或者省略它让它沿用记下的',
350
+ 'resume.refusal.compositionMismatch': '这次请求和这件工作 parked 时记下的编排段(composition leg)对不上(续跑指定了另一段,或在记录腿不是校验腿的卡上作废了校验暂停) · {safe} · 续跑时请用记下的那一段,或省略它让它沿用记下的;校验暂停只能在记录为校验腿的卡上作废',
351
+ 'resume.refusal.parentConstraintMissing': '这件工作是在继承自上层任务的策略约束下 parked 的,而这次续跑没有重新提供它们(不带它们续跑会悄悄丢掉上层的门) · {safe} · 请重新提供上层策略链后重试',
352
+ 'resume.refusal.parentConstraintMismatch': '这次续跑提供的上层策略约束,和这件工作 parked 时的对不上(链不全或不同,会让它在更薄或不同的上层规则下运行) · {safe} · 请用完整的原始上层策略链重试',
353
+ 'resume.refusal.constraintUnprojectable': '这次续跑带了编辑过的批准,但继承自上层任务的策略无法对编辑后的入参重新核对 · {safe} · 请不要编辑入参,再决断一次(没编辑过的批准不受这次拒绝影响)',
330
354
  'resume.refusal.preflightWaitable': '部署的续跑预检拒绝了这次尝试 · 拒绝发生在提交之前 —— 你的决断没有被消耗 · 引擎给了等待窗,所以障碍清除之后这个令牌仍可再赎',
331
355
  'resume.refusal.preflightNoWait': '部署的续跑预检拒绝了这次尝试 · 拒绝发生在提交之前 —— 你的决断没有被消耗 · 引擎没给等待窗,所以这次拒绝没有说明这个令牌还能不能再赎',
332
356
  'resume.refusal.policyBlock': '引擎在准入检查处拒绝续跑这件 parked 的工作(引擎说明,自这件工作最初被接受以来,它的准入策略变了) · {reason} · 这次拒绝没有说明在它之前有没有东西被消耗、重试是否会通过 —— 请先查看任务当前的状态再决断,如果它反复出现,请问运维这个部署的人',
@@ -370,7 +394,7 @@ const ZH = {
370
394
  'resume.refusal.park.interactiveEnded': '{head}引擎已结束那条 parked 的 run,所以这段对话空出来了:请把这项工作作为新消息重新发一次。',
371
395
  'resume.refusal.park.interactiveBusy': '{head}{configMayReturn}parked 的那条 run 会一直占着这段对话,直到它被取消。',
372
396
  'resume.refusal.park.blockedPrint': 'sema 不会自己把 run {run} 的卡放回屏幕:这一版引擎拒绝续跑它。请取消这条 run({cancel}),再把这项工作作为新任务重新提交。',
373
- 'resume.refusal.park.blockedInteractive': 'sema 不会自己把 run {run} 的卡放回屏幕:这一版引擎拒绝续跑它。要空出这段对话,请发一条消息把卡带回来并作答 —— sema 随后会提出取消那条 run,之后你就可以把这项工作作为新消息重新发一次。',
397
+ 'resume.refusal.park.blockedInteractive': 'sema 不会自己把 run {run} 的卡放回屏幕:这一版引擎拒绝续跑它。要空出这段对话,请发一条消息 —— sema 随后会提出取消那条 run(若卡反而回来了,先作答),之后你就可以把这项工作作为新消息重新发一次。',
374
398
  'session.selfHeal.wayOut.interactive': '运行 /clear,在全新会话里继续工作',
375
399
  'session.selfHeal.freshSession.default': '开一个新会话(去掉 --resume/--continue)',
376
400
  'session.selfHeal.freshSession.defaultCapitalized': '开一个新会话(去掉 --resume/--continue)',
@@ -408,7 +432,7 @@ const ZH = {
408
432
  'session.selfHeal.injected.handedOffWatch': '{lead}已交给正在进行的那一轮回复{id},没有另开一轮 —— 请留意那一轮回复怎么处理它。',
409
433
  'session.selfHeal.injected.interruptedFinishing': '{lead}没有送达:被叫停的较早那一轮回复{id}仍在收尾,sema 没有发送它也没有重试,所以模型没有看到它。稍等片刻后再试一次。',
410
434
  'session.selfHeal.injected.notDelivered': '{lead}没有送达:这个会话还被较早的一轮回复占着{id},而且没有可以回答来放行的打开的卡{noView}。sema 没有重试,所以模型没有看到它。',
411
- 'session.selfHeal.injected.redundant': '{lead}没有转交:它说的就是正在进行的那一轮回复{id},那一轮回复已经自己接着往下走了,它没有什么可补充的。',
435
+ 'session.selfHeal.injected.redundant': '{lead}没有转交:它说的那一轮回复{id}在那次决定之后已经自己接着往下走了,它没有什么可补充的。',
412
436
  'session.selfHeal.injected.deferred': '{lead}正在等待:这个会话正被较早的一轮回复{id}占着,sema 保留了这条消息,等那一轮回复结束或暂停后再作为一条新消息发送。',
413
437
  'session.selfHeal.decisionInFlight': '上一个 turn 处于 parked 状态,{parkedOn},而你对那张卡的回答还在送往引擎的路上,所以 sema 没有再次显示那张卡 —— 再回答一次会发出第二个决断。它没有取消这次 run。你的消息没有发出;请稍等片刻,等引擎应用了那个决断之后再发一次。',
414
438
  'session.selfHeal.parkedOn.ask': '在等你的决断(run {taskId})',
@@ -422,6 +446,7 @@ const ZH = {
422
446
  'session.selfHeal.row.askDecided.inferred': '上一个 turn 曾 parked 在一个审批上,你的权限规则自己做了决断(不需要卡);run {taskId} 已经 resume 并随后结束 —— sema 正在重新发送你的消息;如果那次 run 还没完全放开这个会话,你可能得再发一次。',
423
447
  'session.selfHeal.row.askDecided.releaseUnknown': '上一个 turn 曾 parked 在一个审批上,你的权限规则自己做了决断(不需要卡),所以 run {taskId} 应该正在 resume{status}。sema 还不能确认它已经结束,所以你的消息没有发出 —— 请稍等片刻再发一次。',
424
448
  'session.selfHeal.row.askReopenFailed.withKeep': '上一个 turn 处于 parked 状态,在等你的决断(run {taskId}),而 sema 没能在这里重新打开那张卡{noView}。它没有取消这次 run —— 那等于替你做了决断。你的消息没有发出。想保住这段对话,请{keep}:会话 resume 之后,如果它还在等,那张卡会回来。如果你不再需要它,也可以{wayOut}。{viaEngine}',
449
+ 'session.selfHeal.row.askReopenFailed.rowUnresumable': '上一个 turn 处于 parked 状态,在等你的决断(run {taskId}),而这台引擎续不了那条待决请求,所以没有卡可以重新打开:{sentence} · {unbound}。它没有取消这次 run。你的消息没有发出。',
425
450
  'session.selfHeal.row.askReopenFailed.noKeep': '上一个 turn 处于 parked 状态,在等你的决断(run {taskId}),而 sema 没能在这里重新打开那张卡{noView}。它没有取消这次 run —— 那等于替你做了决断。你的消息没有发出;如果你不再需要它,请{wayOut}。{viaEngine}',
426
451
  'session.selfHeal.row.planReopenFailed.dismissed': '上一个 turn 处于 parked 状态,在等一次计划审阅(run {taskId}),而你关掉了它的审批卡 —— {closed}。它没有取消这次 run —— 那等于替你把计划丢掉了。你的消息没有发出;再发一次可以把卡叫回来。',
427
452
  'session.selfHeal.row.planReopenFailed.withKeep': '上一个 turn 处于 parked 状态,在等一次计划审阅(run {taskId}),而 sema 没能重新打开那张审批卡{noView}。它没有取消这次 run —— 那等于替你把计划丢掉了。你的消息没有发出。想保住这段对话,请{keep}:会话 resume 之后,如果它还在等,那张卡会回来。如果你不再需要那份计划,也可以{wayOut}。{viaEngine}',
@@ -624,6 +649,8 @@ const ZH = {
624
649
  'notice.wayOut.switchModel': '模型服务此刻无法处理这个请求 —— 请换一个模型试试',
625
650
  'notice.wayOut.wait': '模型服务仍在处理这个请求 —— 请稍等片刻后重试',
626
651
  'notice.wayOut.fixRequest': '模型服务拒绝了这个请求 —— 请修改请求后再发送;原样重发不会有变化',
652
+ 'notice.userInputUndrained.approvalFeedback.one': '你在批准工具调用时写下的 {count} 条附言没有送达模型,也不会再投递。如果还需要,请再发一次。',
653
+ 'notice.userInputUndrained.approvalFeedback.other': '你在批准工具调用时写下的 {count} 条附言没有送达模型,也不会再投递。如果还需要,请再发一次。',
627
654
  'notice.askUnresolvable.remedy.approver': '出路:接一个能答这类请求的审批人,或让已接的审批人可达,然后重试',
628
655
  'notice.askUnresolvable.remedy.permissionMode': '另一条出路(须本部署允许):{mode} 权限模式会不经人作答就放行这类请求,每一次这样放行都会标在它所放行的那次工具调用上',
629
656
  'rules.refusal.sentence.one': '权限:有 1 条规则不会被执行 —— {list}',
@@ -720,6 +747,8 @@ const ZH = {
720
747
  'session.permissionModeSwitch.refusedWithCode': '引擎拒绝切这条 run 的模式({status} {code}),它保持原来的模式。',
721
748
  'session.permissionModeSwitch.unconfirmed': '切档请求已发出,但没有收到读得懂的答复,不知道模式变没变 —— 请再切一次以确认。',
722
749
  'session.permissionModeSwitch.unavailable': '这里不能切正在跑的这一轮的模式,模式没有变。',
750
+ 'session.permissionModeSwitch.unavailableRunStore': '切换正在跑的这一轮的模式,需要这个部署保存持久的 run 记录,而它没有,所以模式没有改变。',
751
+ 'session.permissionModeSwitch.unavailableCheckpointStore': '切换正在跑的这一轮的模式,需要这个部署保存持久的审批检查点,而它没有,所以模式没有改变。',
723
752
  'notice.capability.subject.userInvokedSkills': '用户点名的技能',
724
753
  'notice.capability.subject.skillToolLists': '技能工具清单',
725
754
  'notice.capability.subject.permissionRulesWrite': '权限规则写入口',
@@ -831,8 +860,11 @@ const ZH = {
831
860
  'model.tier.blurb.flash': '又快又省 —— 标题、回顾、批量活儿',
832
861
  'model.tier.blurb.lite': '最省 —— 批量分类、简单查询',
833
862
  'model.catalog.candidateRejected': '部署拒绝了最近一次配置改动{which},仍在使用它之前的那份配置 —— 那次改动里新增的模型或设置没有生效',
863
+ 'model.catalog.envServed': '引擎当前按环境变量表提供模型;目录没有生效({stance})',
834
864
  'model.notServed.withDefault': '模型 {model} 在这台引擎的模型目录里不可用,所以本次会话改用引擎的缺省模型 {default}',
835
865
  'model.notServed.noDefault': '模型 {model} 在这台引擎的模型目录里不可用,所以本次会话把模型的选择交给引擎',
866
+ 'model.notMentionable.withDefault': '模型 {model} 在这台引擎的模型目录里,但这个部署的模型名单不允许选用它,所以本次会话改用引擎的缺省模型 {default}',
867
+ 'model.notMentionable.noDefault': '模型 {model} 在这台引擎的模型目录里,但这个部署的模型名单不允许选用它,所以本次会话把模型的选择交给引擎',
836
868
  'notice.failure.headline.connectionLostNotSent': '连不上引擎 —— 你的消息没有运行。请确认引擎已经启动,然后再发送一次。',
837
869
  'notice.failure.headline.connectionLost': '与引擎的连接断了 —— 不知道你的消息是否已经运行。重新发送之前,请先查看这次 run 的状态,或者重新接上它。',
838
870
  'notice.failure.headline.timeout': '事件流静默了 —— 这次 run 可能仍在引擎上运行。再次发送之前,请先查看它的状态。',
@@ -983,6 +1015,8 @@ const ZH = {
983
1015
  'notice.wireRefusal.hostPosture.both': '引擎在任何东西运行之前就拒绝了这个请求:请求既要求 shell 继承这台机器的整份环境,又要求 bypassPermissions,而这个部署至少拒绝了其中一项;拒绝并没有说明是哪一项 · {notLocal};请去掉其中一项或两项后重新发送(整份环境设置只在单用户部署上才被采纳)',
984
1016
  'notice.wireRefusal.hostPosture.unattributed': '引擎在任何东西运行之前就拒绝了这个请求:这个部署不接受请求里只有单用户部署才能使用的某项设置;引擎自己的消息会点名它 · {notLocal};请去掉那项设置后重新发送',
985
1017
  'notice.wireRefusal.autonomyLane': '引擎没有启动这次 leader 运行:这个部署运行在只做计划的自主档,而 leader 运行没有办法让它的计划被审阅,所以什么也没有启动 · 请改为作为普通运行提交这项工作,或请运维这台引擎的人更改它的自主设置',
1018
+ 'notice.wireRefusal.sessionArchiveStamped': '这个会话存下的存档仍带着更早版本的服务端写下的属主戳,所以不能被 fork,也不能替换它的日志;什么都没有写入 · 请删除这个会话,然后重新推送',
1019
+ 'notice.wireRefusal.sessionArchiveStamped.fork': '这个会话存下的存档仍带着更早版本的服务端写下的属主戳,所以不能被 fork,也不能替换它的日志;什么都没有写入 · 这段对话会按它自己的历史接着跑;要 fork 它,请删除这个会话,然后重新推送',
986
1020
  'notice.wireRefusal.unsupportedRule': '引擎拒绝了这个请求,所以其中任何内容都没有生效:里面有一条规则是引擎不支持的写法 —— {detail} · 请删掉或改写那条规则(要整只拦下一个工具,请只写工具名),再重新发送',
987
1021
  'notice.wireRefusal.unsupportedRule.other': '引擎拒绝了这个请求,所以其中任何内容都没有生效:里面有 {count} 条规则是引擎不支持的写法 —— {detail} · 请删掉或改写这些规则(要整只拦下一个工具,请只写工具名),再重新发送',
988
1022
  'notice.wireRefusal.unsupportedRule.stored': '引擎拒绝继续这件工作:为它保存的请求里有一条规则是引擎不支持的写法 —— {detail} · 它无法按保存的样子继续。请删掉或改写那条规则(要整只拦下一个工具,请只写工具名);若这件工作仍停驻着,请先取消它,然后作为新请求重新提交',
@@ -1051,6 +1085,15 @@ const ZH = {
1051
1085
  'rules.sessionPolicy.deployment.noOperator.removeReadStoreCorrupt': '引擎确认不了这个会话的规则当前在哪一版,所以没有改动任何内容。这台部署没有运维方可以查看规则库,要由运行它的人处理。',
1052
1086
  'rules.sessionPolicy.deployment.noOperator.removeWriteStoreCorrupt': '引擎确认不了这个会话的规则当前在哪一版,拒绝盖新版本,所以没有改动任何内容。这台部署没有运维方可以查看规则库,要由运行它的人处理。',
1053
1087
  'config.hooks.plan.reason.compactionLocalFallback': '这一次压缩的摘要因引擎会话不可用而在本客户端本地生成,引擎不会替它运行这只 hook,所以由本客户端自己运行',
1088
+ 'config.hooks.plan.reason.keyNotRead': '所连服务端不读这只 hook 上写的某个键(删掉该键,或改用会读它的服务端)',
1089
+ 'config.hooks.plan.disableAllHooks': '托管设置关闭了全部 hooks(disableAllHooks)。',
1090
+ 'config.hooks.plan.keyNotRead.oneKey': '{layer}:{hooks} 不会运行 —— 所连服务端不读键 {coordinates}。删掉该键,或改用会读它的服务端。',
1091
+ 'config.hooks.plan.keyNotRead.manyKeys': '{layer}:{hooks} 不会运行 —— 所连服务端不读这些键:{coordinates}。删掉这些键,或改用会读它们的服务端。',
1092
+ 'config.hooks.plan.keyNotRead.more': '{shown} 等另 {rest} 处',
1093
+ 'config.hooks.plan.keyNotRead.withOnFailure': '{line}所连服务端不读 onFailure:设成失败即阻断的 hook 失败时不会阻断。',
1094
+ 'config.hooks.plan.reason.sourceNotAuthored': '这只 hook 所在的匹配器组写了 "source",这一键只由本客户端设置(删掉该键)',
1095
+ 'config.hooks.plan.sourceNotAuthored.oneKey': '{layer}:{hooks} 不会运行 —— 键 {coordinates} 只由本客户端设置,不写在设置里。删掉该键。',
1096
+ 'config.hooks.plan.sourceNotAuthored.manyKeys': '{layer}:{hooks} 不会运行 —— 这些键只由本客户端设置,不写在设置里:{coordinates}。删掉这些键。',
1054
1097
  'session.hooks.compactTransition.disclosure.engineOutcomeUnknown': '摘要改走本客户端时,压缩请求已经发给了引擎,所以引擎有没有运行压缩 hook 这里判不了,本客户端也没有再运行一遍。',
1055
1098
  'session.hooks.compactTransition.disclosure.neitherRan': '这一次压缩 hook 没有运行:引擎没有在这里压缩,本客户端的本地摘要也没能启动。引擎之后若仍会压缩,到时会运行它们。',
1056
1099
  'session.background.handedOff': '已转到后台,结束时会告诉你。',
@@ -1155,6 +1198,11 @@ export const TERM_SLOTS = Object.freeze({
1155
1198
  'session.inheritEnv.withheld.all': ['run'],
1156
1199
  'session.inheritEnv.withheld.scrub': ['run'],
1157
1200
  'resume.refusal.placementMismatch': ['parked'],
1201
+ 'resume.refusal.untouched': ['parked'],
1202
+ 'resume.refusal.principalMismatch': ['parked', 'principal'],
1203
+ 'resume.refusal.compositionMismatch': ['parked', 'composition leg'],
1204
+ 'resume.refusal.parentConstraintMissing': ['parked'],
1205
+ 'resume.refusal.parentConstraintMismatch': ['parked'],
1158
1206
  'resume.refusal.policyBlock': ['parked'],
1159
1207
  'resume.refusal.contextUnavailable': ['run'],
1160
1208
  'resume.refusal.contextThird.withRun': ['run'],
@@ -1201,6 +1249,7 @@ export const TERM_SLOTS = Object.freeze({
1201
1249
  'session.selfHeal.row.askDecided.releaseUnknown': ['parked', 'run', 'turn'],
1202
1250
  'session.selfHeal.row.askReopenFailed.withKeep': ['parked', 'run', 'turn'],
1203
1251
  'session.selfHeal.row.askReopenFailed.noKeep': ['parked', 'run', 'turn'],
1252
+ 'session.selfHeal.row.askReopenFailed.rowUnresumable': ['parked', 'run', 'turn'],
1204
1253
  'session.selfHeal.row.planReopenFailed.dismissed': ['parked', 'run', 'turn'],
1205
1254
  'session.selfHeal.row.planReopenFailed.withKeep': ['parked', 'run', 'turn'],
1206
1255
  'session.selfHeal.row.planReopenFailed.noKeep': ['parked', 'run', 'turn'],
package/dist/index.d.ts CHANGED
@@ -250,6 +250,8 @@ export { SUBMISSION_SURFACES, SUBMISSION_ORIGINS, SUBMISSION_TOOLS, SUBMISSION_K
250
250
  export type { SubmissionIdentity, SubmissionIdentityInput, SubmissionSurface, SubmissionOrigin, SubmissionTools, SubmissionKind, SubmissionProvenance, } from './request/submissionIdentity.js';
251
251
  export { taskNotificationOf, taskNotificationQueueCommand } from './notifications.js';
252
252
  export type { TaskNotificationQueueCommand, PendingNotificationCommand } from './notifications.js';
253
+ export { taskNotificationAdmissionOf } from './taskNotificationAdmission.js';
254
+ export type { TaskNotificationAdmission, TaskNotificationAdmissionVerdict, TaskNotificationAdmissionWhy, TaskNotificationReadResult, TaskNotificationRunRecordView, } from './taskNotificationAdmission.js';
253
255
  export { resultErrorCodeInTextOf } from './resultFrameKeys.js';
254
256
  export { humanTurnRefusalSentence, humanTurnDegradedSentence, printImageVisionSentence } from './humanTurnSentences.js';
255
257
  export type { HumanTurnInput, HumanTurnItem, HumanTurnAttachment, HumanTurnRider, HumanTurnMissing, HumanTurnCaps, HumanTurnEncoding, HumanTurnShare, HumanTurnSharePart, HumanTurnDegraded, HumanTurnDelivered, HumanTurnNotice, } from './humanTurn.js';
@@ -365,6 +367,8 @@ export { readApprovalAllowRuleShadow, approvalAllowRuleShadowed, allowRuleShadow
365
367
  export { projectCrashConverged } from './hitl/crashConverged.js';
366
368
  export type { ApprovalsListEnvelope, CrashConvergedOrphanState, CrashConvergedProjection, CrashConvergedRowReading } from './hitl/crashConverged.js';
367
369
  export type { ApprovalQueueKindedRow, ApprovalQueueRow } from './hitl/crashConverged.js';
370
+ export { checkpointQueueRowSortOf, type CheckpointQueueRowSort } from './hitl/approvalQueueRow.js';
371
+ export { subagentSourceSessionOf } from './hitl/subagentSource.js';
368
372
  export * from './hitl/crashConvergedNotice.js';
369
373
  export { approvalCompleteParked } from './hitl/approvalCompleteParked.js';
370
374
  export { approvalCompleteCauseOf } from './hitl/approvalEndingCause.js';
@@ -410,6 +414,8 @@ export { readAssistantInbox } from './assistantInbox.js';
410
414
  export type { AssistantInboxVerb, AssistantInboxEntry, AssistantInboxReading, AssistantInboxUnavailableReason } from './assistantInbox.js';
411
415
  export { checkpointRowVerdictOf } from './checkpointRowVerdict.js';
412
416
  export type { CheckpointRowVerdictReading } from './checkpointRowVerdict.js';
417
+ export { checkpointRowBarOf, checkpointRowBarSentence } from './checkpointRowVerdict.js';
418
+ export type { CheckpointRowBar } from './checkpointRowVerdict.js';
413
419
  export { checkpointRequirementsDamagedOf } from './checkpointRowVerdict.js';
414
420
  export type { CheckpointRequirementsDamagedReading } from './checkpointRowVerdict.js';
415
421
  export { READ_CREDENTIAL_NOT_ACCEPTED_NOTICE, isReadCredentialRefusal } from './readCredentialRefusal.js';
@@ -464,7 +470,7 @@ export { scenarioSkillsOf, observedScenarioSkillsCapability } from './scenarioSk
464
470
  export type { ScenarioCardSkill, ScenarioSkillsCapabilityReading } from './scenarioSkills.js';
465
471
  export { observedApprovalFrameFamilies, approvalFrameFamiliesDeclaration } from './approvalFrameFamilies.js';
466
472
  export type { ApprovalFrameFamiliesReading, ApprovalFrameFamiliesDeclaration, ApprovalFrameFamiliesWithheld, ApprovalFrameFamiliesWithheldCause, } from './approvalFrameFamilies.js';
467
- export { sessionEngineBindingFor, commitSessionEngine, readSessionEngine, sessionDispatchTarget } from './sessionEngine.js';
473
+ export { sessionEngineBindingFor, commitSessionEngine, readSessionEngine, sessionDispatchTarget, sessionDispatchRefusedFor } from './sessionEngine.js';
468
474
  export type { SessionEngineKind, SessionEngineIdentityKind, SessionEngineBindingInput, SessionEngineRowInput, SessionEngineBindingFailure, SessionEngineSelfPresentation, SessionEngineDeclaredPresentation, SessionEngineAddressPresentation, SessionEngineBindingOk, SessionEngineSelfBinding, SessionEngineDeclaredBinding, SessionEngineAddressBinding, SessionEngineBinding, SessionEngineAssignment, SessionEngineView, SessionEngineSelfView, SessionEngineDeclaredView, SessionEngineAddressView, SessionEngineReading, SessionEngineBoundReading, SessionEngineSessionRef, SessionEngineCommitRequest, SessionEngineRecoverRequest, SessionEngineUnresolvedReason, SessionEngineCommitResult, SessionEngineCommitted, SessionEngineWiring, SessionDispatchRefusal, SessionDispatchDecision, SessionDispatchUrlTarget, SessionDispatchRefused, } from './sessionEngine.js';
469
475
  export { foldSessionPlacement } from './deviceRebind.js';
470
476
  export type { SessionPlacementView } from './deviceRebind.js';