@sema-agent/client-core 0.104.1 → 0.106.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 (175) hide show
  1. package/CHANGELOG.md +310 -0
  2. package/README.md +36 -14
  3. package/dist/adapt/arms.js +23 -6
  4. package/dist/adapter/activeRunSelfHeal.d.ts +14 -2
  5. package/dist/adapter/activeRunSelfHeal.js +90 -12
  6. package/dist/adapter/downstream/eventToSdkMessage.d.ts +0 -5
  7. package/dist/adapter/downstream/eventToSdkMessage.js +24 -23
  8. package/dist/adapter/downstream/terminalToSdkResult.js +2 -3
  9. package/dist/adapter/downstream/wiringManifestView.d.ts +7 -3
  10. package/dist/adapter/downstream/wiringManifestView.js +25 -1
  11. package/dist/adapter/runStream.js +8 -5
  12. package/dist/approvalReachWire.d.ts +1 -0
  13. package/dist/approvalReachWire.js +4 -1
  14. package/dist/approvalSeat.d.ts +21 -0
  15. package/dist/approvalSeat.js +73 -0
  16. package/dist/assistantInbox.d.ts +2 -0
  17. package/dist/assistantInbox.js +3 -0
  18. package/dist/checkpointRowVerdict.d.ts +23 -0
  19. package/dist/checkpointRowVerdict.js +89 -0
  20. package/dist/cloudConfigWireCaps.js +3 -0
  21. package/dist/compensations.js +6 -6
  22. package/dist/coreValuePorts.d.ts +14 -1
  23. package/dist/coreValuePorts.js +14 -0
  24. package/dist/decideFailureNote.js +3 -1
  25. package/dist/decideReceipt.d.ts +9 -0
  26. package/dist/decideReceipt.js +29 -1
  27. package/dist/declared/supportFloorDeclared.js +2 -2
  28. package/dist/deviceRebind.d.ts +7 -0
  29. package/dist/deviceRebind.js +39 -5
  30. package/dist/displayUntrusted.d.ts +4 -2
  31. package/dist/displayUntrusted.js +45 -22
  32. package/dist/engineAddress.d.ts +3 -0
  33. package/dist/engineAddress.js +25 -0
  34. package/dist/engineDirectory.js +9 -17
  35. package/dist/engineErrorCodes.d.ts +8 -0
  36. package/dist/engineErrorCodes.js +8 -0
  37. package/dist/engineGenerationPort.d.ts +11 -2
  38. package/dist/engineGenerationPort.js +63 -9
  39. package/dist/engineHealthFacts.d.ts +5 -0
  40. package/dist/engineHealthFacts.js +11 -0
  41. package/dist/engineNoticeCodes.d.ts +26 -3
  42. package/dist/engineNoticeCodes.js +52 -7
  43. package/dist/engineRowRef.js +1 -1
  44. package/dist/errorSupplementRoles.js +2 -0
  45. package/dist/eventLeg.d.ts +3 -3
  46. package/dist/eventLeg.js +25 -4
  47. package/dist/fleet/fleetProjection.js +26 -5
  48. package/dist/generated/engineFactTables.d.ts +3 -1
  49. package/dist/generated/engineFactTables.js +4 -1
  50. package/dist/generated/engineNoticeTables.js +19 -4
  51. package/dist/generated/sdkFactTables.d.ts +5 -0
  52. package/dist/generated/sdkFactTables.js +24 -0
  53. package/dist/generated/settingsSchemaFns.d.ts +11 -0
  54. package/dist/generated/settingsSchemaFns.js +2 -1
  55. package/dist/generated/settingsSchemaSafetyMergeSpec.js +1 -1
  56. package/dist/generated/settingsSchemaSettingsSources.d.ts +1 -1
  57. package/dist/generated/settingsSchemaSettingsSources.js +22 -2
  58. package/dist/headlessReconnectWire.js +31 -4
  59. package/dist/hitl/approvalLiveFace.d.ts +17 -0
  60. package/dist/hitl/approvalLiveFace.js +35 -0
  61. package/dist/hitl/approvalQueueRow.d.ts +21 -0
  62. package/dist/hitl/approvalQueueRow.js +69 -0
  63. package/dist/hitl/approvalsFeed.d.ts +5 -4
  64. package/dist/hitl/approvalsFeed.js +38 -6
  65. package/dist/hitl/askGateWire.js +26 -2
  66. package/dist/hitl/askParkRowRouting.d.ts +4 -3
  67. package/dist/hitl/askParkRowRouting.js +15 -3
  68. package/dist/hitl/automaticAnswerVerdict.js +13 -10
  69. package/dist/hitl/crashConverged.d.ts +5 -1
  70. package/dist/hitl/decisionConflict.js +2 -1
  71. package/dist/hitl/decisionRefusal.js +1 -1
  72. package/dist/hitl/decisionSend.d.ts +1 -0
  73. package/dist/hitl/decisionSend.js +14 -2
  74. package/dist/hitl/frameRouter.d.ts +4 -0
  75. package/dist/hitl/frameRouter.js +18 -5
  76. package/dist/hitl/gateIdentity.d.ts +1 -0
  77. package/dist/hitl/gateIdentity.js +3 -0
  78. package/dist/hitl/hitlBridge.d.ts +1 -1
  79. package/dist/hitl/hitlBridge.js +26 -5
  80. package/dist/hitl/livePendingAsk.d.ts +5 -0
  81. package/dist/hitl/livePendingAsk.js +6 -1
  82. package/dist/hitl/planReviewCard.d.ts +23 -0
  83. package/dist/hitl/planReviewCard.js +250 -0
  84. package/dist/hitl/planReviewWire.d.ts +39 -14
  85. package/dist/hitl/planReviewWire.js +450 -163
  86. package/dist/hitl/sessionAllowRoute.d.ts +2 -0
  87. package/dist/hitl/sessionAllowRoute.js +7 -0
  88. package/dist/hitl/sessionPolicyWire.d.ts +1 -7
  89. package/dist/hitl/sessionPolicyWire.js +3 -43
  90. package/dist/hitl/subagentSource.d.ts +1 -0
  91. package/dist/hitl/subagentSource.js +13 -0
  92. package/dist/hitl/toolApprovalWire.d.ts +3 -2
  93. package/dist/hitl/toolApprovalWire.js +79 -37
  94. package/dist/hostSettingsSource.d.ts +5 -2
  95. package/dist/hostSettingsSource.js +19 -10
  96. package/dist/hostTurnSettings.d.ts +5 -6
  97. package/dist/hostTurnSettings.js +106 -26
  98. package/dist/i18n/messages.en.d.ts +85 -12
  99. package/dist/i18n/messages.en.js +85 -12
  100. package/dist/i18n/messages.zh.js +88 -12
  101. package/dist/index.d.ts +35 -4
  102. package/dist/index.js +19 -2
  103. package/dist/liveInitToolFace.js +0 -1
  104. package/dist/liveModelCatalog.d.ts +15 -0
  105. package/dist/liveModelCatalog.js +40 -0
  106. package/dist/mcpTransportKindsCapability.d.ts +18 -0
  107. package/dist/mcpTransportKindsCapability.js +75 -0
  108. package/dist/mcpWireCaps.d.ts +4 -1
  109. package/dist/mcpWireCaps.js +25 -14
  110. package/dist/modelCapabilityProbe.js +66 -33
  111. package/dist/notifications.d.ts +9 -0
  112. package/dist/notifications.js +11 -2
  113. package/dist/ownKey.d.ts +4 -1
  114. package/dist/ownKey.js +8 -2
  115. package/dist/permissionModeWriteCapability.d.ts +13 -0
  116. package/dist/permissionModeWriteCapability.js +35 -0
  117. package/dist/permissionsAllowGrantCapability.d.ts +3 -0
  118. package/dist/permissionsAllowGrantCapability.js +26 -3
  119. package/dist/permissionsDeclaration.d.ts +25 -3
  120. package/dist/permissionsDeclaration.js +69 -41
  121. package/dist/planReviewCardFacts.d.ts +116 -0
  122. package/dist/planReviewCardFacts.js +469 -0
  123. package/dist/projectSeed.d.ts +39 -0
  124. package/dist/projectSeed.js +80 -0
  125. package/dist/promptDelivery.js +1 -1
  126. package/dist/reattachWindow.d.ts +8 -1
  127. package/dist/reattachWindow.js +44 -12
  128. package/dist/replayBody.d.ts +7 -6
  129. package/dist/replayBody.js +62 -7
  130. package/dist/request/taskRequest.js +3 -4
  131. package/dist/ruleCompileVerdict.d.ts +0 -2
  132. package/dist/ruleCompileVerdict.js +0 -31
  133. package/dist/ruleRefusalSentence.js +0 -3
  134. package/dist/runFollow.d.ts +30 -0
  135. package/dist/runFollow.js +117 -0
  136. package/dist/runLedgerSnapshot.d.ts +20 -0
  137. package/dist/runLedgerSnapshot.js +272 -0
  138. package/dist/runPermissionModeSwitch.d.ts +57 -0
  139. package/dist/runPermissionModeSwitch.js +135 -0
  140. package/dist/runReattachPolicy.d.ts +16 -5
  141. package/dist/runReattachPolicy.js +72 -24
  142. package/dist/runTerminal.js +30 -8
  143. package/dist/sandboxWire.d.ts +0 -3
  144. package/dist/sandboxWire.js +0 -9
  145. package/dist/seam.d.ts +17 -7
  146. package/dist/seam.js +13 -1
  147. package/dist/seatContract.d.ts +57 -7
  148. package/dist/seatContract.js +133 -3
  149. package/dist/serverSupportRange.d.ts +18 -0
  150. package/dist/serverSupportRange.js +25 -0
  151. package/dist/sessionEngine.d.ts +156 -0
  152. package/dist/sessionEngine.js +464 -0
  153. package/dist/sessionMap.d.ts +11 -1
  154. package/dist/sessionMap.js +35 -9
  155. package/dist/sessionMemoryErase.d.ts +1 -1
  156. package/dist/sessionMemoryErase.js +5 -0
  157. package/dist/sessionMemoryStatus.d.ts +27 -1
  158. package/dist/sessionMemoryStatus.js +117 -0
  159. package/dist/sessionMemorySync.d.ts +31 -0
  160. package/dist/sessionMemorySync.js +95 -0
  161. package/dist/sessionRowTag.d.ts +4 -0
  162. package/dist/sessionRowTag.js +18 -0
  163. package/dist/settingsLayerAdmission.d.ts +1 -0
  164. package/dist/settingsLayerAdmission.js +4 -1
  165. package/dist/sseIdleTriage.d.ts +3 -1
  166. package/dist/sseIdleTriage.js +19 -4
  167. package/dist/subagent/engineSubagentTail.js +2 -0
  168. package/dist/subagentContentStore.d.ts +3 -0
  169. package/dist/subagentContentStore.js +10 -1
  170. package/dist/toolResult.js +1 -1
  171. package/dist/turnFailurePresentation.d.ts +5 -2
  172. package/dist/turnFailurePresentation.js +12 -4
  173. package/dist/wireRefusalCopy.js +2 -6
  174. package/docs/INTEGRATION-CLIENTS.md +1507 -18
  175. package/package.json +5 -5
@@ -122,6 +122,11 @@ const EN = {
122
122
  'session.devices.probeFailedTransport': "Couldn't reach the engine to check for a remote-control lane — try again",
123
123
  'session.devices.probeFailedRefused': 'The engine refused the device-list check — try again',
124
124
  'session.devices.probeFailedUnreadable': "The engine's device list couldn't be read — try again",
125
+ 'session.engine.selfNotLocal': "This session runs on the engine this app started on this device, but it was started as a Cloud session. Nothing was changed — check how this session was opened.",
126
+ 'session.engine.dispatch.notWired': "This session's engine isn't connected right now, so nothing was sent. Connect to that engine, then try again.",
127
+ '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
+ '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
+ '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.",
125
130
  'config.cloudLogin.accessDenied': 'Sign-in was declined.',
126
131
  'config.cloudLogin.expiredToken': 'The sign-in code expired before it was approved — start again.',
127
132
  'config.cloudLogin.invalidGrant': 'The Cloud sign-in can no longer be renewed — sign in again.',
@@ -141,6 +146,7 @@ const EN = {
141
146
  'config.engineTarget.loginFailed': 'Sign-in failed.',
142
147
  'config.engineTarget.storageUnavailable': "Secure storage isn't available on this device, so the Cloud credential can't be kept. Nothing was changed.",
143
148
  'config.engineTarget.noLocalRuntime': "There's no local engine on this device.",
149
+ '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.',
144
150
  'config.engineTarget.input': "The request wasn't in the expected shape, so nothing was changed.",
145
151
  'config.engineTarget.unknown': "The engine switch didn't go through.",
146
152
  'onboard.probe.endpointReachable': '{method} {path} → {status} (endpoint reachable)',
@@ -187,6 +193,8 @@ const EN = {
187
193
  'config.mcp.nameReserved': 'MCP server name {name}{where} cannot be used, so the server was not started: names starting with "remote-" are kept for the MCP servers a connected device offers. Rename the server.',
188
194
  'config.mcp.identityHeadersBothSet': 'MCP server {name}{where} was not started: it sets both principalHeader and assertionHeader, which name the same identity header — keep only one of the two. The other MCP servers are unaffected.',
189
195
  'config.mcp.transportUnreadable': 'could not be read (a getter or proxy trap on the declaration threw)',
196
+ 'config.mcp.transportNotAdvertised': 'MCP server {name}{where} was not started: it uses the {kind} transport, which the engine in use says it does not support (it supports: {supported}). The other MCP servers are unaffected.',
197
+ 'config.mcp.transportsNone': 'none',
190
198
  'config.mcp.transportInvalid': 'MCP server {name}{where} was not started: its transport setting cannot be used — {path} {problem}. Fix that setting for this server (or remove the server); the other MCP servers are unaffected.',
191
199
  'config.mcp.transportDegraded': 'MCP server {name}{where} was started without part of its transport settings, which cannot be used as written: {lost}. The rest of its settings are applied; fix the settings named above to get them applied too.',
192
200
  'config.mcp.toolAxesInvalid': 'MCP server {name}{where} was not started: its toolAxes setting is not valid — {problem}. Fix the toolAxes entry for this server (or remove it); the other MCP servers are unaffected.',
@@ -238,6 +246,7 @@ const EN = {
238
246
  'approval.settle.cause.broadcastLost': 'it never reached any open connection',
239
247
  'approval.settle.cause.streamDisconnected': 'the connection carrying this card dropped',
240
248
  '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',
241
250
  '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',
242
251
  'approval.decision.settledElsewhereContrary.deniedFirst': 'This request was already answered elsewhere and denied, so your approval did not take effect.',
243
252
  'approval.decision.settledElsewhereContrary.approvedFirst': 'This request was already answered elsewhere and approved, so your denial did not take effect.',
@@ -293,6 +302,13 @@ const EN = {
293
302
  'session.crashConverged.cause.neutral': 'the decision converged automatically',
294
303
  'session.crashConverged.cause.withClause': '{clause}, and the decision converged automatically',
295
304
  'session.corrupt.content': "This session's saved history cannot be read — its stored log is damaged — so the engine cannot open this session. Retrying will not help: whoever operates this engine has to repair or remove that stored log. Until then, continue in a new session.",
305
+ 'session.projectSeed.invalid': 'The project package was refused: it is not a usable project archive. It has to be a gzip tar of the project folder within the size and entry limits, holding only regular files, folders and links that stay inside the folder, each path once, and nothing named .git or attachments at the top level. Fix the folder and upload it again.',
306
+ 'session.projectSeed.invalidAt': '{sentence} Problem entry: {path}',
307
+ 'session.projectSeed.laneNotIsolated': 'The execution lane for this session is not a sandbox, so a project package cannot become its workspace. Hand off a project with a pushed git commit instead, or run the session on a sandboxed lane.',
308
+ 'session.projectSeed.seedFixed': 'A session can start from only one project package: this session already has one, or this submission carried more than one. Send a single package, or start a new session to begin from a different one.',
309
+ 'session.projectSeed.boundElsewhere': 'This upload is already bound to another session, and an upload cannot be moved to a different session, so this submission was not accepted. Upload the project package again for this session.',
310
+ 'session.projectSeed.laneUnknown': 'The engine has not said whether it runs sessions in a sandbox, so a project package cannot be offered as the workspace yet.',
311
+ 'session.projectSeed.missing': 'Upload the project package before handing the session off.',
296
312
  'resume.reopen.first.envFailed': 'The execution environment for this parked work could not be brought back',
297
313
  'resume.reopen.first.toolUnavailable': 'The tool this approval was granted for is not available on this engine',
298
314
  'resume.reopen.first.toolContractMismatch': 'The tool this approval was granted for has changed since the approval was recorded',
@@ -392,6 +408,8 @@ const EN = {
392
408
  '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.',
393
409
  '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.',
394
410
  '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.',
412
+ '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.',
395
413
  '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.',
396
414
  'session.selfHeal.parkedOn.ask': 'waiting for your decision (run {taskId})',
397
415
  'session.selfHeal.parkedOn.plan': 'on a plan review (run {taskId})',
@@ -543,10 +561,28 @@ const EN = {
543
561
  'approval.boundGrants.denyPart.one': '1 tool entry is refused for the rest of this run',
544
562
  'approval.boundGrants.denyPart.other': '{count} tool entries are refused for the rest of this run',
545
563
  'approval.boundGrants.activates': 'Approving this activates the skill shown on the card: {allow}, and {deny}.',
564
+ 'approval.boundGrants.allowPart.named.one': '1 tool entry it lists runs without asking once it is active ({names})',
565
+ 'approval.boundGrants.allowPart.named.other': '{count} tool entries it lists run without asking once it is active ({names})',
566
+ 'approval.boundGrants.denyPart.named.one': '1 tool entry is refused for the rest of this run ({names})',
567
+ 'approval.boundGrants.denyPart.named.other': '{count} tool entries are refused for the rest of this run ({names})',
568
+ 'approval.boundGrants.more': 'and {count} more',
546
569
  'session.fileHistoryRefusal.notYet': "Nothing was sent: file checkpointing is turned off in your settings, but this engine's capabilities have not been read yet, so whether it can stop recording file history for a session is unknown and sending now could record it anyway. Try again in a moment; to send regardless and let file history be recorded this time, turn file checkpointing back on in your settings.",
547
570
  'session.fileHistoryRefusal.notSaid': 'Nothing was sent: file checkpointing is turned off in your settings, but this engine did not report whether it can stop recording file history for a session, so sending now could record it anyway. Trying again will not change that while this engine reports the same; to send and let file history be recorded this time, turn file checkpointing back on in your settings.',
548
571
  'session.fileHistoryRefusal.unrecognized': 'Nothing was sent: file checkpointing is turned off in your settings, but this engine reported a file-history capture mode this client does not recognize, so whether it can stop recording file history for a session is unknown and sending now could record it anyway. Trying again will not change that while this engine reports the same; to send and let file history be recorded this time, turn file checkpointing back on in your settings.',
549
572
  'session.fileHistoryRefusal.unreadable': "Nothing was sent: file checkpointing is turned off in your settings, but this engine's report on whether it can stop recording file history for a session could not be read by this client, so sending now could record it anyway. Trying again will not change that while this engine reports the same; to send and let file history be recorded this time, turn file checkpointing back on in your settings.",
573
+ 'session.memoryErase.personalStoreUnjudged': "Nothing was erased: part of this session's memory is kept in a personal memory store that this deployment cannot erase yet, so the erase was declined before anything changed.",
574
+ 'session.memorySync.parked.one': 'Memory sync is paused on this deployment for the "{scope}" layer: its sync cursor could not be used. {wayOut}',
575
+ 'session.memorySync.parked.other': 'Memory sync is paused on this deployment for {count} layers ({scopes}): their sync cursors could not be used. {wayOut}',
576
+ 'session.memorySync.parkedUnnamed.one': 'Memory sync is paused on this deployment for 1 layer: its sync cursor could not be used. {wayOut}',
577
+ 'session.memorySync.parkedUnnamed.other': 'Memory sync is paused on this deployment for {count} layers: their sync cursors could not be used. {wayOut}',
578
+ 'session.memorySync.wayOut.deleteCursor': 'Syncing resumes once an operator deletes the sync cursor of each paused layer on the server; entries deleted on only one side since the last sync will come back and need to be deleted again.',
579
+ 'session.memorySync.wayOut.unrecognized': 'The deployment named a way out that this client does not recognize, so none is suggested here.',
580
+ 'session.memorySyncTrigger.notConfigured': 'Nothing to sync: this session does not use any memory.',
581
+ 'session.memorySyncTrigger.noSettledRun': 'Memory cannot be synced yet: no run in this session has finished with a record of which memory it reads. Run a task in this session (or let the one in progress finish), then sync again.',
582
+ 'session.memorySyncTrigger.runUnobserved': 'Memory cannot be synced: the latest finished run in this session has no record of which memory it read, and an earlier run is never used in its place. Run another task in this session (if that run was refused, fix what refused it first), then sync again.',
583
+ 'session.memorySyncTrigger.memoryNotMounted': 'Memory cannot be synced: memory was set up for the latest finished run in this session but did not load, so which memory this session reads is unknown. Run another task in this session (if its memory fails to load again, fix that first), then sync again.',
584
+ 'session.memorySyncTrigger.noLeaf': 'Memory cannot be synced yet: this session has no conversation yet, so there is nothing to sync from. Run a task in it (or let the one in progress finish), then sync again.',
585
+ 'session.memorySyncTrigger.unobtainable': 'Memory cannot be synced: which memory this session reads could not be determined. Run a task in this session (or let the one in progress finish), then sync again.',
550
586
  'session.hostSettings.memorySwitchMalformed': 'The memory setting in your settings file could not be read, so turning memory off was not applied: this request was sent with memory available. Fix the memory section (memory.enabled must be true or false) to turn it off.',
551
587
  'session.hostSettings.fileHistoryRestoreConflict': 'Nothing was sent: file checkpointing was turned off in your settings after this request was prepared, but this request also restores files from a checkpoint, and a request cannot do both. To restore the files, turn file checkpointing back on in your settings; otherwise send the request without the file restore.',
552
588
  'session.hostSettings.projectionUnchecked': 'The settings for this request could not be checked before sending, so the request is not sent. Reload your settings and try again.',
@@ -556,11 +592,14 @@ const EN = {
556
592
  'session.hostSettings.layerNotLoaded.hold.unreadable': '{layer} could not be read, so the rules and hooks in that file would not apply to this request. Continue without these settings, or cancel and fix the file first.',
557
593
  'session.hostSettings.layerNotLoaded.hold.rejected': '{layer} were not loaded because a hook guarding tool use in that file is malformed, so the rules and hooks in that file would not apply to this request. Continue without these settings, or cancel and fix the file first.',
558
594
  'session.hostSettings.layerNotLoaded.sent.unreadable': '{layer} could not be read: this request was sent without the rules and hooks in that file.',
595
+ 'session.hostSettings.layerNotLoaded.restrictions.hold': '{layer} could not be read, so the restrictions in that file (deny and ask rules) would not apply to this request. Continue without them, or cancel and fix the file first.',
596
+ 'session.hostSettings.layerNotLoaded.restrictions.sent': '{layer} could not be read: this request was sent without the restrictions in that file (deny and ask rules).',
559
597
  'session.hostSettings.layer.policySettings': 'Managed settings',
560
598
  'session.hostSettings.layer.userSettings': 'Your user settings',
561
599
  'session.hostSettings.layer.projectSettings': 'The project settings',
562
600
  'session.hostSettings.layer.localSettings': 'The local project settings',
563
601
  'session.hostSettings.layer.flagSettings': 'The settings passed at launch',
602
+ 'session.hostSettings.layer.foreignProjectSettings': "The project's settings for another tool",
564
603
  'session.hostSettings.heldPrevious': 'A settings file could not be read cleanly just now (it may be in the middle of being saved), so the permission rules from the last clean read are still applied.',
565
604
  'session.hostSettings.styleMissing': 'The output style "{name}" selected in your settings could not be found or read, so it is not applied to this request.',
566
605
  'session.hostSettings.styleSafeMode': 'Safe mode is on, so the output style from your settings is not applied.',
@@ -594,7 +633,6 @@ const EN = {
594
633
  'rules.refusal.list.more': '{shown} and {count} more',
595
634
  'rules.refusal.reason.toolName': 'its tool name is not one this engine recognizes',
596
635
  'rules.refusal.reason.homePath': 'it uses a ~/ path this engine cannot anchor — write the path relative to the project or as an absolute path',
597
- 'rules.refusal.reason.neverMatches': 'this rule form cannot match as a deny or ask rule for this tool, so the engine would never apply it — to block the tool altogether, write its name alone',
598
636
  'rules.nearMiss.sentence.one': 'permissions: 1 rule names a tool by a spelling no tool of this run answers to, so it can never match — {list}',
599
637
  'rules.nearMiss.sentence.other': 'permissions: {count} rules name a tool by a spelling no tool of this run answers to, so they can never match — {list}',
600
638
  'rules.nearMiss.reason': 'write the name as "{mounted}"',
@@ -670,6 +708,18 @@ const EN = {
670
708
  'session.steerRefusal.advice': '{happened} — {nextStep}',
671
709
  'session.steerRefusal.hostQueue.queued': 'it stays queued and will be submitted as-is when this turn ends',
672
710
  'session.steerRefusal.hostQueue.dropped': 'it was not kept; {nextStep}',
711
+ 'session.permissionModeSwitch.applied': 'The running turn now uses the {mode} permission mode.',
712
+ 'session.permissionModeSwitch.folded': 'The running turn now uses the {mode} permission mode instead of the one you chose — {reason}.',
713
+ 'session.permissionModeSwitch.reason.entryFloor': 'this deployment does not allow a looser mode than its floor',
714
+ 'session.permissionModeSwitch.reason.disableAutoMode': "this task's settings turn auto mode off",
715
+ 'session.permissionModeSwitch.reason.engine': 'the engine does not allow the chosen mode for this run',
716
+ 'session.permissionModeSwitch.notPersisted': '{line} The switch was not saved with the run: if the run pauses and later resumes, it resumes in the mode it had before, so switch again after it resumes.',
717
+ 'session.permissionModeSwitch.notRunning': 'This run is not running a turn right now (it is paused waiting on a decision, has finished, or is running elsewhere), so its mode was not switched.',
718
+ 'session.permissionModeSwitch.notFound': 'No such run is visible to you, so no mode was switched.',
719
+ 'session.permissionModeSwitch.refused': 'The engine refused to switch the mode of this run ({status}), so it keeps the mode it had.',
720
+ 'session.permissionModeSwitch.refusedWithCode': 'The engine refused to switch the mode of this run ({status} {code}), so it keeps the mode it had.',
721
+ '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
+ 'session.permissionModeSwitch.unavailable': 'Switching the mode of a running turn is not available here, so the mode was not changed.',
673
723
  'notice.capability.subject.userInvokedSkills': 'user-invoked skills',
674
724
  'notice.capability.subject.skillToolLists': 'skill tool lists',
675
725
  'notice.capability.subject.permissionRulesWrite': 'permission-rule write entry',
@@ -713,17 +763,6 @@ const EN = {
713
763
  'notice.capability.hands.unknownRosterUnreadable': 'whether this run has file-and-shell tools is unknown — the tool roster could not be read in the shape this reader knows',
714
764
  'notice.capability.hands.unknownMountConditionAbsent': 'whether this run has file-and-shell tools is unknown — this engine does not report which condition mounted each tool, so an empty count here would be a fact about the reader, not about the run',
715
765
  'rules.sessionPolicy.tighten.written': 'Session rules saved (version {rev}) — the record now holds everything it already had plus the entries sent here, and it applies from this session’s next tool gate onward; the step already running is not interrupted.',
716
- 'rules.sessionPolicy.tighten.writtenBeforeFirstRule.counts': "Still running, and possibly started before this session's first rule: {list}. Anything that started before that first rule keeps running without this one — to make the rule apply to it now, stop it.",
717
- 'rules.sessionPolicy.tighten.writtenBeforeFirstRule.unreadable': "This client could not read which background agents or workflows are running now. Anything that started before this session's first rule keeps running without this one — stop whatever must not keep running without it.",
718
- 'rules.sessionPolicy.tighten.writtenBeforeFirstRule.unseen': 'Work whose start has not reached this client yet may not read this rule either.',
719
- 'rules.sessionPolicy.tighten.writtenBeforeFirstRule.agents.one': '{n} background agent',
720
- 'rules.sessionPolicy.tighten.writtenBeforeFirstRule.agents.many': '{n} background agents',
721
- 'rules.sessionPolicy.tighten.writtenBeforeFirstRule.workflows.one': '{n} workflow',
722
- 'rules.sessionPolicy.tighten.writtenBeforeFirstRule.workflows.many': '{n} workflows',
723
- 'rules.sessionPolicy.tighten.writtenBeforeFirstRule.untracked.one': '{n} background item this client stopped tracking',
724
- 'rules.sessionPolicy.tighten.writtenBeforeFirstRule.untracked.many': '{n} background items this client stopped tracking',
725
- 'rules.sessionPolicy.tighten.writtenBeforeFirstRule.list.two': '{a} and {b}',
726
- 'rules.sessionPolicy.tighten.writtenBeforeFirstRule.list.three': '{a}, {b} and {c}',
727
766
  'rules.sessionPolicy.tighten.conflict': 'Session rules were changed by someone else while this tightening was being written, twice in a row — nothing was written. Re-read the current rules and try again, or let the other writer finish first.',
728
767
  'rules.sessionPolicy.tighten.loosenForbidden': 'The engine refused this write because it would relax the session rules: at least one entry sent here widens what is allowed rather than narrowing it. Only entries that add restrictions are accepted on this path.',
729
768
  'rules.sessionPolicy.tighten.capabilityAbsent': 'This deployment does not keep per-session tool rules, so there is nothing to tighten here.',
@@ -1053,5 +1092,39 @@ const EN = {
1053
1092
  'config.mods.refusal.by': 'Refused by {by}',
1054
1093
  'config.mods.rewrite.resultInPlace': 'Answered by {by} in place of the tool',
1055
1094
  'config.mods.rewrite.inputBy': 'Arguments changed by {by} before the call was let through',
1095
+ 'follow.notFollowed.headRun': 'This screen is no longer following run {taskId}{reason}{ending}{exit}',
1096
+ 'follow.notFollowed.headTurn': "This screen is no longer following this turn's run{reason}{ending}{exit}",
1097
+ 'follow.notFollowed.reason.exhaustedDraining': ": the engine instance serving it was going down when its last event stream closed, and this client's re-attach allowance has run out.",
1098
+ 'follow.notFollowed.reason.exhaustedConnectionLost': ": the connection dropped on the last attempt, and this client's re-attach allowance has run out.",
1099
+ 'follow.notFollowed.reason.exhaustedStreamCap': ": the engine ended its event stream with a stream-limit notice on the last attempt, and this client's re-attach allowance has run out.",
1100
+ 'follow.notFollowed.reason.exhausted': ": this client's re-attach allowance has run out.",
1101
+ 'follow.notFollowed.reason.badInput': ': this client hit an internal error while re-attaching.',
1102
+ 'follow.notFollowed.reason.noRunId': ': this client never learned which run it was, so there is nothing to re-attach to.',
1103
+ 'follow.notFollowed.reason.runUnknown': ': the engine answered that it does not know that run — it may have been cleaned up, or this client asked with the wrong identity.',
1104
+ 'follow.notFollowed.reason.unspecified': '.',
1105
+ 'follow.notFollowed.endingUnknown': ' The engine has not said how that run ended — it may still be going.',
1106
+ 'follow.notFollowed.exit.reattach': ' What it does next shows up here only after this client re-attaches to it.',
1107
+ 'follow.notFollowed.exit.checkRuns': " Check this session's runs before sending the work again.",
1108
+ 'follow.notFollowed.exit.runUnknown': " Re-attaching will not bring it back here; check this session's runs before sending the work again.",
1109
+ 'follow.notFollowed.idleTear': "This turn's event stream went silent for {secs}s. {notice} {grace}",
1110
+ 'follow.notFollowed.idleGrace': 'If the run legitimately goes quiet this long (e.g. a long build), raising the idle grace may help next time: set {env} (settings env, integer ms, {min}-{max}; default {default}).',
1111
+ 'approval.planReview.note.empty': 'The plan is empty.',
1112
+ 'approval.planReview.note.marked': 'This plan contains characters that cannot be shown as written, so it cannot be approved from this card. Reject it, or ask for the plan to be presented again.',
1113
+ 'approval.planReview.note.tooLarge': 'This plan is too large to be shown in full ({length} characters), so it cannot be approved from this card. Reject it, or ask for a shorter plan.',
1114
+ 'approval.planReview.note.notCarried': "The engine did not bring this plan's text up to this card (it may be too long), so it cannot be approved from this card. Reject it, or ask for the plan to be presented again.",
1115
+ 'approval.planReview.note.unknown': 'This card cannot show the plan it would approve, so it cannot be approved from this card. Reject it, or ask for the plan to be presented again.',
1116
+ 'approval.planReview.askAgain.shown': 'The user asked for the plan to be presented again.',
1117
+ 'approval.planReview.askAgain.marked': 'The user could not approve this plan: it contains characters that cannot be shown as written. Present the plan again without those characters.',
1118
+ 'approval.planReview.askAgain.tooLarge': 'The user could not approve this plan: it is too large to be shown in full. Present a shorter plan.',
1119
+ 'approval.planReview.askAgain.notCarried': 'The user could not approve this plan: its text did not reach the approval card (it may be too long). Present a shorter plan.',
1120
+ 'approval.planReview.askAgain.unknown': 'The user could not approve this plan: the approval card could not show it. Present the plan again.',
1121
+ 'approval.planReview.askAgain.withNote': '{sentence} The user added: {note}',
1122
+ 'approval.planReview.decision.notSent': 'The plan_review {decision} could NOT be sent; the plan is still waiting for a decision.',
1123
+ 'approval.planReview.decision.refused': 'This {decision} was not applied: the engine refused it and changed nothing.',
1124
+ 'approval.planReview.decision.cardMissing': 'Approving a plan needs the card that showed it, and none came with this approval.',
1125
+ 'approval.planReview.decision.gateMoved': 'The plan on this card is no longer the one waiting for approval.',
1126
+ 'approval.planReview.decision.gateUntrusted': "The engine could not recognise this review's gate id (the server's record of it looks damaged; an operator should check it). The card still shows the plan that is waiting: answering again sends the answer without the gate id, and that answer is not protected against the plan having changed.",
1127
+ 'approval.planReview.option.askAgain.label': 'No, ask for the plan to be presented again',
1128
+ 'approval.planReview.option.askAgain.description': 'Do not approve; ask the model to present the plan again',
1056
1129
  };
1057
1130
  export const EN_MESSAGES = Object.freeze(EN);
@@ -122,6 +122,11 @@ const ZH = {
122
122
  'session.devices.probeFailedTransport': '连不上引擎,查不了远程控制车道 —— 请重试',
123
123
  'session.devices.probeFailedRefused': '引擎拒绝了设备清单查询 —— 请重试',
124
124
  'session.devices.probeFailedUnreadable': '读不懂引擎给的设备清单 —— 请重试',
125
+ 'session.engine.selfNotLocal': '这只会话跑在本机这个应用自己起的引擎上,却是按 Cloud 会话开的。什么都没改 —— 请检查这只会话是怎么打开的。',
126
+ 'session.engine.dispatch.notWired': '这只会话所在的引擎此刻没接上,什么都没发。先连上那台引擎,再试一次。',
127
+ 'session.engine.dispatch.scopeMismatch': '这只会话属于另一个空间里的引擎,和你当前登录的空间不同,什么都没发。切到那个空间后再试一次。',
128
+ 'session.engine.dispatch.scopeUnproven': '确认不了你当前的登录能到达这只会话所在的引擎,什么都没发。先登录那台引擎所在的空间(或直接连上那台引擎),再试一次。',
129
+ 'session.engine.dispatch.unresolved': '这只会话所在的引擎还不知道,什么都没发。先为这只会话选一次引擎,再试一次。',
125
130
  'config.cloudLogin.accessDenied': '登录被拒绝了。',
126
131
  'config.cloudLogin.expiredToken': '登录码在批准之前过期了 —— 请重新开始。',
127
132
  'config.cloudLogin.invalidGrant': 'Cloud 登录已无法续期 —— 请重新登录。',
@@ -141,6 +146,7 @@ const ZH = {
141
146
  'config.engineTarget.loginFailed': '登录失败。',
142
147
  'config.engineTarget.storageUnavailable': '这台设备上没有可用的安全存储,保存不了 Cloud 凭据。什么都没改。',
143
148
  'config.engineTarget.noLocalRuntime': '这台设备上没有本机引擎。',
149
+ 'config.engineTarget.serverBelowSupportFloor': '这台服务端自报版本 {version},低于本客户端支持的最低服务端版本 {floor}。发给它的请求可能被拒,或与这里描述的行为不一致;请连接 {floor} 或更新的服务端。',
144
150
  'config.engineTarget.input': '请求的形状不对,什么都没改。',
145
151
  'config.engineTarget.unknown': '引擎切换没有完成。',
146
152
  'onboard.probe.endpointReachable': '{method} {path} → {status}(端点可达)',
@@ -187,6 +193,8 @@ const ZH = {
187
193
  'config.mcp.nameReserved': 'MCP 服务器名 {name}{where} 不可用,所以没有启动:以 "remote-" 开头的名字留给已连接设备提供的 MCP 服务器。请给这台服务器换个名字。',
188
194
  'config.mcp.identityHeadersBothSet': 'MCP 服务器 {name}{where} 没有启动:它同时设置了 principalHeader 和 assertionHeader,而这两项指的是同一个身份头 —— 只保留其中一项。其他 MCP 服务器不受影响。',
189
195
  'config.mcp.transportUnreadable': '读不出(声明上的取值器或代理陷阱抛了错)',
196
+ 'config.mcp.transportNotAdvertised': 'MCP 服务器 {name}{where} 没有启动:它用的是 {kind} 传输,而这台引擎说它不支持这种传输(它支持:{supported})。其他 MCP 服务器不受影响。',
197
+ 'config.mcp.transportsNone': '无',
190
198
  'config.mcp.transportInvalid': 'MCP 服务器 {name}{where} 没有启动:它的传输设置不可用 —— {path} {problem}。请修正这台服务器的这项设置(或删掉这台服务器);其他 MCP 服务器不受影响。',
191
199
  'config.mcp.transportDegraded': 'MCP 服务器 {name}{where} 已启动,但它的部分传输设置不能照原样使用、被略去了:{lost}。其余设置照常生效;请修正上面点名的设置,让它们也生效。',
192
200
  'config.mcp.toolAxesInvalid': 'MCP 服务器 {name}{where} 没有启动:它的 toolAxes 设置不合法 —— {problem}。请修正这台服务器的 toolAxes(或删掉它);其他 MCP 服务器不受影响。',
@@ -238,6 +246,7 @@ const ZH = {
238
246
  'approval.settle.cause.broadcastLost': '它没有送达任何一个打开着的连接',
239
247
  'approval.settle.cause.streamDisconnected': '承载这张卡的连接断了',
240
248
  'approval.settle.cause.undeliverable': '它没能送达任何审批界面',
249
+ 'approval.decide.requiresBinding': '这次决定没有带上把它绑到审批卡上那个具体动作的绑定,引擎拒绝了 · 什么都没有决定,这条审批仍在等待 · 请重新获取待决审批,按现在列出的那张卡再决定;如果列出的卡本身就没有绑定,这里决不了 —— 取消这次运行,或等这条审批过期',
241
250
  'approval.decision.grantChanged': '引擎拒收了这次批准:它绑定的技能授予在卡呈出之后已经变了 · 什么都没有决定,这一请求仍在等待,但再批一次会以同样的理由被拒 · 请拒绝这一请求,让模型重新激活那个技能',
242
251
  'approval.decision.settledElsewhereContrary.deniedFirst': '这一请求已在别处被答复为拒绝,你的批准没有生效。',
243
252
  'approval.decision.settledElsewhereContrary.approvedFirst': '这一请求已在别处被答复为批准,你的拒绝没有生效。',
@@ -293,6 +302,13 @@ const ZH = {
293
302
  'session.crashConverged.cause.neutral': '这个决断被自动收敛了',
294
303
  'session.crashConverged.cause.withClause': '{clause},这个决断被自动收敛了',
295
304
  'session.corrupt.content': '这个会话保存的历史读不出来 —— 它存的日志已损坏 —— 所以引擎打不开这个会话。重试没有用:得由运维这台引擎的人修复或移除那份存储的日志。在那之前,请在新会话里继续。',
305
+ 'session.projectSeed.invalid': '项目包被拒了:它不是能用的项目归档。项目包须是项目文件夹打成的 gzip tar,大小与条目数在上限之内,只含普通文件、文件夹和不指出文件夹的链接,每条路径只出现一次,顶层不能有名为 .git 或 attachments 的条目。请修好文件夹后重新上传。',
306
+ 'session.projectSeed.invalidAt': '{sentence} 出问题的条目:{path}',
307
+ 'session.projectSeed.laneNotIsolated': '这个会话的执行车道不是沙箱,所以项目包不能当作它的工作区。请改用已推送 git 提交的项目交接,或让会话跑在带沙箱的车道上。',
308
+ 'session.projectSeed.seedFixed': '一个会话只能从一个项目包起始:这个会话已经有了,或这次提交带了不止一个。请只带一个项目包,或新开会话从另一个项目包开始。',
309
+ 'session.projectSeed.boundElsewhere': '这次上传已经绑在另一个会话上,上传一经绑定就不能改绑到别的会话,所以这次提交没有被受理。请为这个会话重新上传项目包。',
310
+ 'session.projectSeed.laneUnknown': '引擎还没说明它是否在沙箱里跑会话,所以暂时不能把项目包作为工作区交出去。',
311
+ 'session.projectSeed.missing': '请先上传项目包,再交接这个会话。',
296
312
  'resume.reopen.first.envFailed': '这件 parked 的工作所需的执行环境没能恢复',
297
313
  'resume.reopen.first.toolUnavailable': '这个审批所授予的工具在这台引擎上不可用',
298
314
  'resume.reopen.first.toolContractMismatch': '这个审批所授予的工具,自审批记录以来已经变了',
@@ -392,6 +408,8 @@ const ZH = {
392
408
  'session.selfHeal.injected.handedOffWatch': '{lead}已交给正在进行的那一轮回复{id},没有另开一轮 —— 请留意那一轮回复怎么处理它。',
393
409
  'session.selfHeal.injected.interruptedFinishing': '{lead}没有送达:被叫停的较早那一轮回复{id}仍在收尾,sema 没有发送它也没有重试,所以模型没有看到它。稍等片刻后再试一次。',
394
410
  'session.selfHeal.injected.notDelivered': '{lead}没有送达:这个会话还被较早的一轮回复占着{id},而且没有可以回答来放行的打开的卡{noView}。sema 没有重试,所以模型没有看到它。',
411
+ 'session.selfHeal.injected.redundant': '{lead}没有转交:它说的就是正在进行的那一轮回复{id},那一轮回复已经自己接着往下走了,它没有什么可补充的。',
412
+ 'session.selfHeal.injected.deferred': '{lead}正在等待:这个会话正被较早的一轮回复{id}占着,sema 保留了这条消息,等那一轮回复结束或暂停后再作为一条新消息发送。',
395
413
  'session.selfHeal.decisionInFlight': '上一个 turn 处于 parked 状态,{parkedOn},而你对那张卡的回答还在送往引擎的路上,所以 sema 没有再次显示那张卡 —— 再回答一次会发出第二个决断。它没有取消这次 run。你的消息没有发出;请稍等片刻,等引擎应用了那个决断之后再发一次。',
396
414
  'session.selfHeal.parkedOn.ask': '在等你的决断(run {taskId})',
397
415
  'session.selfHeal.parkedOn.plan': '停在一次计划审阅上(run {taskId})',
@@ -543,10 +561,28 @@ const ZH = {
543
561
  'approval.boundGrants.denyPart.one': '1 条工具条目在本次 run 剩余的时间里被拒绝',
544
562
  'approval.boundGrants.denyPart.other': '{count} 条工具条目在本次 run 剩余的时间里被拒绝',
545
563
  'approval.boundGrants.activates': '批准这一张会激活卡上的技能:{allow},且 {deny}。',
564
+ 'approval.boundGrants.allowPart.named.one': '它列出的 1 条工具条目({names}),在技能激活后免问运行',
565
+ 'approval.boundGrants.allowPart.named.other': '它列出的 {count} 条工具条目({names}),在技能激活后免问运行',
566
+ 'approval.boundGrants.denyPart.named.one': '1 条工具条目({names})在本次 run 剩余的时间里被拒绝',
567
+ 'approval.boundGrants.denyPart.named.other': '{count} 条工具条目({names})在本次 run 剩余的时间里被拒绝',
568
+ 'approval.boundGrants.more': '另有 {count} 条',
546
569
  'session.fileHistoryRefusal.notYet': '没有发送:你的设置里已关闭文件检查点,但这台引擎的能力信息还没读到,所以不知道它能否按会话停止记录文件历史,现在发送仍可能把它记录下来。请稍后再试;如果要照常发送、并让这一次的文件历史被记录,请在设置里把文件检查点重新打开。',
547
570
  'session.fileHistoryRefusal.notSaid': '没有发送:你的设置里已关闭文件检查点,但这台引擎没有报告它能否按会话停止记录文件历史,所以现在发送仍可能把它记录下来。只要这台引擎还是同样的报告,重试也不会改变这一点;要发送并让这一次的文件历史被记录,请在设置里把文件检查点重新打开。',
548
571
  'session.fileHistoryRefusal.unrecognized': '没有发送:你的设置里已关闭文件检查点,但这台引擎报告了一个本客户端不认识的文件历史捕获模式,所以不知道它能否按会话停止记录文件历史,现在发送仍可能把它记录下来。只要这台引擎还是同样的报告,重试也不会改变这一点;要发送并让这一次的文件历史被记录,请在设置里把文件检查点重新打开。',
549
572
  'session.fileHistoryRefusal.unreadable': '没有发送:你的设置里已关闭文件检查点,但这台引擎关于能否按会话停止记录文件历史的报告,本客户端读不出来,所以现在发送仍可能把它记录下来。只要这台引擎还是同样的报告,重试也不会改变这一点;要发送并让这一次的文件历史被记录,请在设置里把文件检查点重新打开。',
573
+ 'session.memoryErase.personalStoreUnjudged': '什么都没有抹除:这条会话的记忆有一部分存放在这台部署目前还抹除不了的个人记忆库里,所以抹除在任何改动之前就被拒绝了。',
574
+ 'session.memorySync.parked.one': '这台部署上「{scope}」这一层的记忆同步已暂停:它的同步游标用不了。{wayOut}',
575
+ 'session.memorySync.parked.other': '这台部署上 {count} 层的记忆同步已暂停({scopes}):它们的同步游标用不了。{wayOut}',
576
+ 'session.memorySync.parkedUnnamed.one': '这台部署上 1 层的记忆同步已暂停:它的同步游标用不了。{wayOut}',
577
+ 'session.memorySync.parkedUnnamed.other': '这台部署上 {count} 层的记忆同步已暂停:它们的同步游标用不了。{wayOut}',
578
+ 'session.memorySync.wayOut.deleteCursor': '运维在服务器上删掉每个暂停层的同步游标后,同步即恢复;自上次同步以来只在一侧删掉的条目会回来,需要再删一次。',
579
+ 'session.memorySync.wayOut.unrecognized': '部署给出的出路本客户端认不出,这里不给建议。',
580
+ 'session.memorySyncTrigger.notConfigured': '没有可同步的:这条会话没有使用任何记忆。',
581
+ 'session.memorySyncTrigger.noSettledRun': '暂时无法同步记忆:这条会话里还没有一条跑完、并记下了它读哪些记忆的任务。请在这条会话里跑一条任务(或等正在跑的那条结束),再同步。',
582
+ 'session.memorySyncTrigger.runUnobserved': '无法同步记忆:这条会话里最近跑完的那条任务没有记下它读了哪些记忆,而更早的任务不会拿来顶替。请在这条会话里再跑一条任务(如果那条任务被拒了,先改好拒它的地方),再同步。',
583
+ 'session.memorySyncTrigger.memoryNotMounted': '无法同步记忆:这条会话里最近跑完的那条任务配了记忆却没有加载成功,所以不知道这条会话读哪些记忆。请在这条会话里再跑一条任务(如果记忆再次加载失败,先修好它),再同步。',
584
+ 'session.memorySyncTrigger.noLeaf': '暂时无法同步记忆:这条会话还没有任何对话内容,没有可以同步的起点。请在这条会话里跑一条任务(或等正在跑的那条结束),再同步。',
585
+ 'session.memorySyncTrigger.unobtainable': '无法同步记忆:无法确定这条会话读哪些记忆。请在这条会话里跑一条任务(或等正在跑的那条结束),再同步。',
550
586
  'session.hostSettings.memorySwitchMalformed': '设置文件里的记忆设置读不出,所以「关闭记忆」没有生效:这一次请求照常带着记忆发出。改好记忆那一段(memory.enabled 只能是 true 或 false)即可关闭。',
551
587
  'session.hostSettings.fileHistoryRestoreConflict': '没有发送:这次请求准备好之后,你在设置里关闭了文件检查点,但这次请求同时要从检查点还原文件,两者不能放在同一个请求里。要还原文件,请在设置里把文件检查点重新打开;否则请去掉文件还原再发送。',
552
588
  'session.hostSettings.projectionUnchecked': '这一次请求要带的设置在发出前没法核对,所以没有发送。请重新载入设置后再试。',
@@ -556,11 +592,14 @@ const ZH = {
556
592
  'session.hostSettings.layerNotLoaded.hold.unreadable': '{layer}读不出,那份文件里的规则和 hooks 不会作用于这一次请求。可以不带这些设置继续,或者先取消、改好文件。',
557
593
  'session.hostSettings.layerNotLoaded.hold.rejected': '{layer}没有装上:那份文件里一个守着工具调用的 hook 写坏了,文件里的规则和 hooks 不会作用于这一次请求。可以不带这些设置继续,或者先取消、改好文件。',
558
594
  'session.hostSettings.layerNotLoaded.sent.unreadable': '{layer}读不出:这一次请求没有带那份文件里的规则和 hooks。',
595
+ 'session.hostSettings.layerNotLoaded.restrictions.hold': '{layer}读不出,那份文件里的限制(deny 与 ask 规则)不会作用于这一次请求。可以不带它们继续,或者先取消、改好文件。',
596
+ 'session.hostSettings.layerNotLoaded.restrictions.sent': '{layer}读不出:这一次请求没有带那份文件里的限制(deny 与 ask 规则)。',
559
597
  'session.hostSettings.layer.policySettings': '托管设置',
560
598
  'session.hostSettings.layer.userSettings': '你的用户设置',
561
599
  'session.hostSettings.layer.projectSettings': '项目设置',
562
600
  'session.hostSettings.layer.localSettings': '本地项目设置',
563
601
  'session.hostSettings.layer.flagSettings': '启动时传入的设置',
602
+ 'session.hostSettings.layer.foreignProjectSettings': '写给另一个工具的项目设置',
564
603
  'session.hostSettings.heldPrevious': '刚才有一份设置文件没能完整读出(可能正在保存),所以仍按上一次完整读到的权限规则执行。',
565
604
  'session.hostSettings.styleMissing': '设置里选中的输出风格「{name}」找不到或读不出,这一次请求不套用它。',
566
605
  'session.hostSettings.styleSafeMode': '安全模式已开启,设置里的输出风格不套用。',
@@ -594,7 +633,6 @@ const ZH = {
594
633
  'rules.refusal.list.more': '{shown},另有 {count} 条',
595
634
  'rules.refusal.reason.toolName': '它的工具名不是这台引擎认得的名字',
596
635
  'rules.refusal.reason.homePath': '它用了引擎无法锚定的 ~/ 路径 —— 请改写成相对项目的路径或绝对路径',
597
- 'rules.refusal.reason.neverMatches': '这种写法作为这只工具的拒绝或询问规则永远匹配不上,引擎不会执行它 —— 要整只拦下这只工具,请只写工具名',
598
636
  'rules.nearMiss.sentence.one': '权限:有 1 条规则写的工具名拼法,本次运行里没有任何工具认,所以永远匹配不上 —— {list}',
599
637
  'rules.nearMiss.sentence.other': '权限:有 {count} 条规则写的工具名拼法,本次运行里没有任何工具认,所以永远匹配不上 —— {list}',
600
638
  'rules.nearMiss.reason': '请把名字写成「{mounted}」',
@@ -670,6 +708,18 @@ const ZH = {
670
708
  'session.steerRefusal.advice': '{happened} —— {nextStep}',
671
709
  'session.steerRefusal.hostQueue.queued': '它留在队列里,在这个 turn 结束时会原样提交',
672
710
  'session.steerRefusal.hostQueue.dropped': '它没有被保留;{nextStep}',
711
+ 'session.permissionModeSwitch.applied': '正在跑的这一轮现在用 {mode} 权限模式。',
712
+ 'session.permissionModeSwitch.folded': '正在跑的这一轮现在用 {mode} 权限模式,不是你选的那一档 —— {reason}。',
713
+ 'session.permissionModeSwitch.reason.entryFloor': '这台部署不允许比它的下限更宽松的模式',
714
+ 'session.permissionModeSwitch.reason.disableAutoMode': '这个任务的设置关掉了 auto 模式',
715
+ 'session.permissionModeSwitch.reason.engine': '引擎不允许这条 run 用你选的模式',
716
+ 'session.permissionModeSwitch.notPersisted': '{line}这次切档没有随 run 存下:run 停下后再续跑时会回到切档前的模式,续跑后请再切一次。',
717
+ 'session.permissionModeSwitch.notRunning': '这条 run 此刻没在跑一轮(停在等决断上、已经结束,或在别处跑),所以没有切它的模式。',
718
+ 'session.permissionModeSwitch.notFound': '你看不到这条 run,没有切任何模式。',
719
+ 'session.permissionModeSwitch.refused': '引擎拒绝切这条 run 的模式({status}),它保持原来的模式。',
720
+ 'session.permissionModeSwitch.refusedWithCode': '引擎拒绝切这条 run 的模式({status} {code}),它保持原来的模式。',
721
+ 'session.permissionModeSwitch.unconfirmed': '切档请求已发出,但没有收到读得懂的答复,不知道模式变没变 —— 请再切一次以确认。',
722
+ 'session.permissionModeSwitch.unavailable': '这里不能切正在跑的这一轮的模式,模式没有变。',
673
723
  'notice.capability.subject.userInvokedSkills': '用户点名的技能',
674
724
  'notice.capability.subject.skillToolLists': '技能工具清单',
675
725
  'notice.capability.subject.permissionRulesWrite': '权限规则写入口',
@@ -713,17 +763,6 @@ const ZH = {
713
763
  'notice.capability.hands.unknownRosterUnreadable': '这次 run 有没有文件与 shell 工具,目前不知道 —— 工具名册不是这个读口认识的形状,读不出来',
714
764
  'notice.capability.hands.unknownMountConditionAbsent': '这次 run 有没有文件与 shell 工具,目前不知道 —— 这台引擎不报每个工具是由哪个条件挂载的,所以这里数出一个空的计数,说的是读口的事,不是这次 run 的事',
715
765
  'rules.sessionPolicy.tighten.written': '会话规则已保存(版本 {rev})—— 记录现在包含它原有的全部内容加上这里送来的条目,并从这个会话的下一道工具门起生效;已经在跑的那一步不会被打断。',
716
- 'rules.sessionPolicy.tighten.writtenBeforeFirstRule.counts': '仍在运行,而且可能是在这个会话的第一条规则之前启动的:{list}。凡是在那第一条规则之前启动的,都会不带这条规则继续运行 —— 要让它立即生效,请停掉它们。',
717
- 'rules.sessionPolicy.tighten.writtenBeforeFirstRule.unreadable': '本客户端读不出现在有哪些后台子代或工作流在运行。凡是在这个会话的第一条规则之前启动的,都会不带这条规则继续运行 —— 不该继续运行的请停掉。',
718
- 'rules.sessionPolicy.tighten.writtenBeforeFirstRule.unseen': '起跑还没报到本客户端的工作,可能也读不到这条规则。',
719
- 'rules.sessionPolicy.tighten.writtenBeforeFirstRule.agents.one': '{n} 个后台子代',
720
- 'rules.sessionPolicy.tighten.writtenBeforeFirstRule.agents.many': '{n} 个后台子代',
721
- 'rules.sessionPolicy.tighten.writtenBeforeFirstRule.workflows.one': '{n} 个工作流',
722
- 'rules.sessionPolicy.tighten.writtenBeforeFirstRule.workflows.many': '{n} 个工作流',
723
- 'rules.sessionPolicy.tighten.writtenBeforeFirstRule.untracked.one': '{n} 个本客户端已不再跟踪的后台项',
724
- 'rules.sessionPolicy.tighten.writtenBeforeFirstRule.untracked.many': '{n} 个本客户端已不再跟踪的后台项',
725
- 'rules.sessionPolicy.tighten.writtenBeforeFirstRule.list.two': '{a}和 {b}',
726
- 'rules.sessionPolicy.tighten.writtenBeforeFirstRule.list.three': '{a}、{b}和 {c}',
727
766
  'rules.sessionPolicy.tighten.conflict': '写入这次收紧的过程中,会话规则被别人改了,连续两次 —— 什么都没写。请重新读一遍当前的规则再试,或者先让另一个写入方写完。',
728
767
  'rules.sessionPolicy.tighten.loosenForbidden': '引擎拒绝了这次写入,因为它会放宽会话规则:这里送来的条目里至少有一条是放宽允许范围而不是收窄。这条路上只接受增加限制的条目。',
729
768
  'rules.sessionPolicy.tighten.capabilityAbsent': '这个部署不保存会话级的工具规则,所以这里没有什么可收紧的。',
@@ -1053,10 +1092,45 @@ const ZH = {
1053
1092
  'config.mods.refusal.by': '被 {by} 拒绝',
1054
1093
  'config.mods.rewrite.resultInPlace': '由 {by} 代替工具作答',
1055
1094
  'config.mods.rewrite.inputBy': '参数在放行前被 {by} 改过',
1095
+ 'follow.notFollowed.headRun': '这块屏已不再跟着 run {taskId}{reason}{ending}{exit}',
1096
+ 'follow.notFollowed.headTurn': '这块屏已不再跟着这一轮的 run{reason}{ending}{exit}',
1097
+ 'follow.notFollowed.reason.exhaustedDraining': ':服务它的那台引擎实例在它最后一条事件流关闭时正在下线,而这个客户端的重新附着次数已经用完。',
1098
+ 'follow.notFollowed.reason.exhaustedConnectionLost': ':最后一次尝试时连接断了,而这个客户端的重新附着次数已经用完。',
1099
+ 'follow.notFollowed.reason.exhaustedStreamCap': ':最后一次尝试时引擎以流上限通知收了它的事件流,而这个客户端的重新附着次数已经用完。',
1100
+ 'follow.notFollowed.reason.exhausted': ':这个客户端的重新附着次数已经用完。',
1101
+ 'follow.notFollowed.reason.badInput': ':这个客户端在重新附着时出了内部错误。',
1102
+ 'follow.notFollowed.reason.noRunId': ':这个客户端始终不知道它是哪一次 run,所以没有可以重新附着的对象。',
1103
+ 'follow.notFollowed.reason.runUnknown': ':引擎答复说它不认识那次 run —— 它可能已被清理,也可能是这个客户端用错了身份去问。',
1104
+ 'follow.notFollowed.reason.unspecified': '。',
1105
+ 'follow.notFollowed.endingUnknown': '引擎没有说那次 run 是怎么结束的 —— 它可能还在跑。',
1106
+ 'follow.notFollowed.exit.reattach': '它接下来的动作,只有在这个客户端重新附着到它之后才会显示在这里。',
1107
+ 'follow.notFollowed.exit.checkRuns': '再发一次这件工作之前,先查一下这个会话的 run。',
1108
+ 'follow.notFollowed.exit.runUnknown': '重新附着也不会把它带回这里;再发一次这件工作之前,先查一下这个会话的 run。',
1109
+ 'follow.notFollowed.idleTear': '这一轮的事件流静默了 {secs} 秒。{notice}{grace}',
1110
+ 'follow.notFollowed.idleGrace': '如果这次 run 本来就会安静这么久(比如一次长构建),下次可以调大空闲宽限:设置 {env}(settings 的 env 块,整数毫秒,{min}-{max};默认 {default})。',
1111
+ 'approval.planReview.note.empty': '计划为空。',
1112
+ 'approval.planReview.note.marked': '这份计划里有不能照原样显示的字符,不能在这张卡上批准。可以拒绝,或要模型重新呈一次计划。',
1113
+ 'approval.planReview.note.tooLarge': '这份计划太长,卡上显示不全({length} 个字符),不能在这张卡上批准。可以拒绝,或要一份更短的计划。',
1114
+ 'approval.planReview.note.notCarried': '引擎没有把这份计划的正文带到卡上(可能过长),不能在这张卡上批准。可以拒绝,或要模型重新呈一次计划。',
1115
+ 'approval.planReview.note.unknown': '这张卡给不出它要批的计划正文,不能在这张卡上批准。可以拒绝,或要模型重新呈一次计划。',
1116
+ 'approval.planReview.askAgain.shown': '用户要求重新呈上这份计划。',
1117
+ 'approval.planReview.askAgain.marked': '用户没法批准这份计划:里面有不能照原样显示的字符。请去掉这些字符后重新呈上计划。',
1118
+ 'approval.planReview.askAgain.tooLarge': '用户没法批准这份计划:它太长,显示不全。请呈上一份更短的计划。',
1119
+ 'approval.planReview.askAgain.notCarried': '用户没法批准这份计划:计划正文没有到达审批卡(可能过长)。请呈上一份更短的计划。',
1120
+ 'approval.planReview.askAgain.unknown': '用户没法批准这份计划:审批卡显示不了它。请重新呈上计划。',
1121
+ 'approval.planReview.askAgain.withNote': '{sentence} 用户补充:{note}',
1122
+ 'approval.planReview.decision.notSent': '这次计划审阅的 {decision} 没能发出;计划仍在等决断。',
1123
+ 'approval.planReview.decision.refused': '这次 {decision} 没有生效:引擎拒了它,什么都没改。',
1124
+ 'approval.planReview.decision.cardMissing': '批准一份计划需要附上呈出它的那张卡,这次批准没有附卡。',
1125
+ 'approval.planReview.decision.gateMoved': '这张卡上的计划已不是在等批的那份。',
1126
+ 'approval.planReview.decision.gateUntrusted': '引擎认不出这道审阅门的编号(服务端那一行记录看起来坏了,请运维检查)。卡上就是当前在等批的计划:再答一次将不带门编号提交,那一次没有「计划已换」的保护。',
1127
+ 'approval.planReview.option.askAgain.label': '不,要模型重新呈上计划',
1128
+ 'approval.planReview.option.askAgain.description': '不批准;要模型重新呈上计划',
1056
1129
  };
1057
1130
  export const ZH_MESSAGES = Object.freeze(ZH);
1058
1131
  export const TERM_SLOTS = Object.freeze({
1059
1132
  'session.background.refusal.envOff': ['SEMA_HEADLESS_DETACH'],
1133
+ 'session.permissionModeSwitch.reason.disableAutoMode': ['auto'],
1060
1134
  'session.thinking.offWithUltracodeOnBody': ['Ultracode'],
1061
1135
  'config.mcp.toolAxesInvalid': ['toolAxes'],
1062
1136
  'config.mcp.toolFacesInvalid': ['toolFaces'],
@@ -1181,6 +1255,8 @@ export const TERM_SLOTS = Object.freeze({
1181
1255
  'approval.origin.hook': ['hook'],
1182
1256
  'approval.boundGrants.denyPart.one': ['run'],
1183
1257
  'approval.boundGrants.denyPart.other': ['run'],
1258
+ 'approval.boundGrants.denyPart.named.one': ['run'],
1259
+ 'approval.boundGrants.denyPart.named.other': ['run'],
1184
1260
  'session.steerRefusal.notRunning.happened': ['run'],
1185
1261
  'session.steerRefusal.notRunning.nextStep': ['run'],
1186
1262
  'session.steerRefusal.queueFull.happened': ['run'],
package/dist/index.d.ts CHANGED
@@ -77,6 +77,11 @@ export * from './steerPriorityCapability.js';
77
77
  export * from './permissionModesCapability.js';
78
78
  export * from './approvalDecidedByCapability.js';
79
79
  export * from './outputStyleSeatCapability.js';
80
+ export * from './permissionModeWriteCapability.js';
81
+ export { setRunPermissionMode, runPermissionModeSwitchLine } from './runPermissionModeSwitch.js';
82
+ export type { RunPermissionModeSwitchOutcome, RunPermissionModeSwitchRuns, RunPermissionModeSwitchOptions, PermissionModeAdmissionView, PermissionModeReceiptView, } from './runPermissionModeSwitch.js';
83
+ export { observedMcpTransportKinds, projectMcpTransportKindsCapability } from './mcpTransportKindsCapability.js';
84
+ export type { McpRequestTransportKind, McpTransportKindsReading } from './mcpTransportKindsCapability.js';
80
85
  export * from './mcpProbeWire.js';
81
86
  export * from './connectorStatus.js';
82
87
  export * from './effectiveFacts.js';
@@ -84,7 +89,7 @@ export * from './gateOutcome.js';
84
89
  export * from './postureKnob.js';
85
90
  export * from './engineIdentity.js';
86
91
  export { readEngineHealthFacts } from './engineHealthFacts.js';
87
- export type { EngineHealthFacts, EngineHealthCenterFacts, EngineHealthAuthFacts, EngineHealthDrainingFacts } from './engineHealthFacts.js';
92
+ export type { EngineHealthFacts, EngineHealthCenterFacts, EngineHealthAuthFacts, EngineHealthDrainingFacts, EngineHealthLeaseFacts } from './engineHealthFacts.js';
88
93
  export { transportFailureScene } from './engineWireFor.js';
89
94
  export type { EngineWireNoAnswerKind, TransportFailureChainEnd, TransportFailureLayer, TransportFailureScene, TransportFailureSocket } from './engineWireFor.js';
90
95
  export { engineUrlTransportVerdict, normalizeEngineBaseUrl } from './engineUrl.js';
@@ -105,6 +110,7 @@ export * from './engineToolLabelStore.js';
105
110
  export * from './fleetTaskDesc.js';
106
111
  export { displayUntrusted, displayUntrustedMarks, displayConfiguredUrl, queryCarriesCredential, cleanUntrustedScalar } from './displayUntrusted.js';
107
112
  export type { DisplayUntrustedOptions, DisplayMark, DisplayMarkSpan, DisplayUntrustedMarked } from './displayUntrusted.js';
113
+ export { DISPLAY_DECISION_BODY } from './displayUntrusted.js';
108
114
  export { isDiagnosticValueWord } from './displayUntrusted.js';
109
115
  export type * from './types/engineState.js';
110
116
  export * from './hostEnv.js';
@@ -117,7 +123,7 @@ export * from './engineWireSdk.js';
117
123
  export * from './classifierVerdictWire.js';
118
124
  export { stripSystemReminderBlocks, unwrapSystemReminder } from './systemReminderTag.js';
119
125
  export { findSystemReminderOpenTag, type SystemReminderOpenTagSpan } from './systemReminderTag.js';
120
- export { ACTIVE_RUN_BUSY_ERROR_CODE, APPROVAL_EXPIRED, ASK_GONE, asModelFallbackReason, CAPABILITY_IMAGE_INDEX_REQUIRED, CAPABILITY_K8S_LANE_REQUIRED, CAPABILITY_OPERATOR_PRINCIPALS_REQUIRED, CAPABILITY_SELF_ORCHESTRATION_REQUIRED, CONFIG_AGENT_UNKNOWN_TOOL, CONFIG_DELEGATION_ENTRY_CAPS, CONFIG_IMAGE_INVALID, CONFIG_LEGACY_TOOL_NAME, CONFIG_LIMIT_INVALID, CONFIG_LIMIT_UNKNOWN_KEY, CONFIG_MCP_SERVER_NAME_COLLISION, CONFIG_MEMORY_PROJECT_KEY_SPELLING, CONFIG_MEMORY_WRITE_SCOPE_MISMATCH, CONFIG_OUTPUT_STYLE_INVALID, CONFIG_TOOL_FACE_CONTROL, CONFLICT_IDEMPOTENCY_PAYLOAD_MISMATCH, CORRUPT_SESSION_ERROR_CODE, DECIDE_CLAIM_LOST, DECIDE_GATE_MOVED, DECIDE_NOT_PARKED, DECIDE_PARK_MOVED_CODES, DECIDE_ROW_UNREVIVABLE, DECIDE_WORKFLOW_HOST_UNKNOWN, DECIDE_WORKFLOW_LANE_CODES, DECIDE_WORKFLOW_PARK_FORKED, DECIDE_WORKFLOW_PARKS_UNREADABLE, DECIDE_WORKFLOW_REMEMBER_UNSUPPORTED, DELEGATION_CAP_CODES, DELEGATION_CONCURRENCY_CAP, DELEGATION_SESSION_CAP, delegationCapDispositionOf, DRAINING_ERROR_CODE, ENGINE_STOP_REASONS, engineStopReasonToCc, ENV_LIFETIME_EXPIRED, FLEET_LEASE_UNAVAILABLE, GATE_PARKED_ERROR_CODE, idempotencyPayloadMismatchContent, isConfigRefusalCode, isCorruptSessionCode, isDecideParkMovedCode, isDecideRowUnrevivableCode, isDelegationCapCode, isIdempotencyPayloadMismatchCode, isInterruptedToolEndCode, isLimitsExceededCode, isRewindFamilyCode, isRulesRefusalCode, isStatusDerivedCoarseCode, isWorkflowParkRefusalCode, LIMITS_MAX_COST_EXCEEDED, LIMITS_MAX_TOKENS_EXCEEDED, LIMITS_MAX_TURNS_EXCEEDED, LIMITS_MAX_WALLTIME_EXCEEDED, MCP_SERVER_REVOKED, MCP_TOOL_DECLARATION_CHANGED, MCP_TOOL_LISTING_UNREACHED, MODEL_FALLBACK_INHERIT_NO_TIER_BINDING, operatorGateRefusalContent, OUTPUT_INVALID, PARKED_RESUME_STARTUP_FAILED, PROMPT_ASSEMBLED_ROLE_REFUSED, REQUEST_AUTONOMY_LANE_REFUSED, RESUME_AT_ERROR_CODE_PREFIX, RESUME_CONTEXT_UNAVAILABLE, RESUME_ENV_FAILED, RESUME_PLACEMENT_MISMATCH, RESUME_POLICY_FOLD_CODE, RESUME_PREFLIGHT_REJECTED, RESUME_REOPEN_CODES, RESUME_RETRY_LATER_CODES, RESUME_TOOL_CONTRACT_MISMATCH, RESUME_TOOL_UNAVAILABLE, RESUME_USAGE_WINDOW_EXHAUSTED, REWIND_ERROR_CODE_PREFIXES, RUN_ORPHANED, RUN_STALLED, runDeathVerdictNoteOf, SCENARIO_ASSIGNMENT_UNKNOWN_ERROR_CODE, SCENARIO_NOT_ALLOWED_ERROR_CODE, STREAM_MAX_DURATION, TOOL_END_INTERRUPTED_NEVER_STARTED, TOOL_END_INTERRUPTED_OUTCOME_UNKNOWN, USAGE_WINDOW_EXHAUSTED, USER_ATTACHMENT_INVALID_ERROR_CODE, USER_INVOKED_SKILL_UNKNOWN_ERROR_CODE, WORKFLOW_PARK_REFUSAL_CODES, } from './engineErrorCodes.js';
126
+ export { ACTIVE_RUN_BUSY_ERROR_CODE, APPROVAL_EXPIRED, ASK_GONE, asModelFallbackReason, CAPABILITY_IMAGE_INDEX_REQUIRED, CAPABILITY_K8S_LANE_REQUIRED, CAPABILITY_OPERATOR_PRINCIPALS_REQUIRED, CAPABILITY_SELF_ORCHESTRATION_REQUIRED, CONFIG_AGENT_UNKNOWN_TOOL, CONFIG_DELEGATION_ENTRY_CAPS, CONFIG_IMAGE_INVALID, CONFIG_LEGACY_TOOL_NAME, CONFIG_LIMIT_INVALID, CONFIG_LIMIT_UNKNOWN_KEY, CONFIG_MCP_SERVER_NAME_COLLISION, CONFIG_MEMORY_PROJECT_KEY_SPELLING, CONFIG_MEMORY_WRITE_SCOPE_MISMATCH, CONFIG_OUTPUT_STYLE_INVALID, CONFIG_TOOL_FACE_CONTROL, CONFLICT_IDEMPOTENCY_PAYLOAD_MISMATCH, CORRUPT_SESSION_ERROR_CODE, DECIDE_CLAIM_LOST, DECIDE_GATE_MOVED, DECIDE_NOT_PARKED, DECIDE_PARK_MOVED_CODES, DECIDE_ROW_UNREVIVABLE, DECIDE_WORKFLOW_HOST_UNKNOWN, DECIDE_WORKFLOW_LANE_CODES, DECIDE_WORKFLOW_PARK_FORKED, DECIDE_WORKFLOW_PARKS_UNREADABLE, DECIDE_WORKFLOW_REMEMBER_UNSUPPORTED, DELEGATION_CAP_CODES, DELEGATION_CONCURRENCY_CAP, DELEGATION_SESSION_CAP, delegationCapDispositionOf, DRAINING_ERROR_CODE, ENGINE_STOP_REASONS, engineStopReasonToCc, ENV_LIFETIME_EXPIRED, FLEET_LEASE_UNAVAILABLE, GATE_PARKED_ERROR_CODE, idempotencyPayloadMismatchContent, isConfigRefusalCode, isCorruptSessionCode, isDecideParkMovedCode, isDecideRowUnrevivableCode, isDelegationCapCode, isIdempotencyPayloadMismatchCode, isInterruptedToolEndCode, isLimitsExceededCode, isRewindFamilyCode, isRulesRefusalCode, isStatusDerivedCoarseCode, isWorkflowParkRefusalCode, LIMITS_MAX_COST_EXCEEDED, LIMITS_MAX_TOKENS_EXCEEDED, LIMITS_MAX_TURNS_EXCEEDED, LIMITS_MAX_WALLTIME_EXCEEDED, MCP_SERVER_REVOKED, MCP_TOOL_DECLARATION_CHANGED, MCP_TOOL_LISTING_UNREACHED, MODEL_FALLBACK_INHERIT_NO_TIER_BINDING, operatorGateRefusalContent, OUTPUT_INVALID, PARKED_RESUME_STARTUP_FAILED, PROMPT_ASSEMBLED_ROLE_REFUSED, REQUEST_AUTONOMY_LANE_REFUSED, RESUME_AT_ERROR_CODE_PREFIX, RESUME_CONTEXT_UNAVAILABLE, RESUME_ENV_FAILED, RESUME_PLACEMENT_MISMATCH, RESUME_POLICY_FOLD_CODE, RESUME_PREFLIGHT_REJECTED, RESUME_REOPEN_CODES, RESUME_RETRY_LATER_CODES, RESUME_TOOL_CONTRACT_MISMATCH, RESUME_TOOL_UNAVAILABLE, RESUME_USAGE_WINDOW_EXHAUSTED, REWIND_ERROR_CODE_PREFIXES, RUN_ORPHANED, RUN_STALLED, runDeathVerdictNoteOf, SCENARIO_ASSIGNMENT_UNKNOWN_ERROR_CODE, SCENARIO_NOT_ALLOWED_ERROR_CODE, STREAM_MAX_DURATION, TOOL_END_INTERRUPTED_NEVER_STARTED, TOOL_END_INTERRUPTED_OUTCOME_UNKNOWN, USAGE_WINDOW_EXHAUSTED, USER_ATTACHMENT_INVALID_ERROR_CODE, USER_INVOKED_SKILL_UNKNOWN_ERROR_CODE, WORKFLOW_PARK_REFUSAL_CODES, ATTACHMENT_BOUND_ELSEWHERE, ATTACHMENT_BUNDLE_INVALID, ATTACHMENT_BUNDLE_LANE_NOT_ISOLATED, ATTACHMENT_BUNDLE_SEED_FIXED, CONFLICT_SESSION_MEMORY_UNOBSERVED, CONFLICT_SESSION_ARCHIVE_STAMPED, ENV_HOME_UNCONFIRMED, } from './engineErrorCodes.js';
121
127
  export type { DelegationCapDisposition, ModelFallbackReason, OperatorGateRefusal, RunDeathVerdictCode, } from './engineErrorCodes.js';
122
128
  export { prepareRefusalCodeOf, prepareRefusalNoteOf, type PrepareRefusalCode, type PrepareRefusalNoteFacts } from './prepareRefusal.js';
123
129
  export * from './agentsWireCaps.js';
@@ -178,6 +184,8 @@ export * from './request/taskRequest.js';
178
184
  export { disableSkillsDeclaration, disableSkillsDeclarationSettled } from './disableSkillsWire.js';
179
185
  export { approvalReachDeclaration, approvalReachDeclarationSettled } from './approvalReachWire.js';
180
186
  export type { ApprovalReachDeclaration, ApprovalReachWithheldCause, ApprovalReachWord } from './approvalReachWire.js';
187
+ export { approvalSeatOf, APPROVAL_SEAT_STATES, APPROVAL_SEAT_BASES } from './approvalSeat.js';
188
+ export type { ApprovalSeatInput, ApprovalSeatReading, ApprovalSeatState } from './approvalSeat.js';
181
189
  export type { DisableSkillsDeclaration } from './disableSkillsWire.js';
182
190
  export { PERMISSIONS_KEPT_REASONS, WIRE_RULE_TRUST_ORDER, permissionsAllowKeptNotice, permissionsDeclaration, permissionsDeclarationReport } from './permissionsDeclaration.js';
183
191
  export type { PermissionsAllowKeptFacts, PermissionsClientOwnedStatement, PermissionsDeclaration, PermissionsDeclarationBuckets, PermissionsDeclarationInput, PermissionsDeclarationReport, PermissionsKeptReason, PermissionsKeptRule, PermissionsRewrittenRule, WireRuleOrigin, WireRuleOrigins, } from './permissionsDeclaration.js';
@@ -222,7 +230,8 @@ export { guardedRead, readOwnDataFiniteNumber, readOwnDataNonEmptyString } from
222
230
  export { contextUsageReadingOf, type ContextUsageReading } from './ownKey.js';
223
231
  export { TURN_FAILURE_CATEGORIES, turnFailurePresentation, type TurnFailureCategory, type TurnFailurePresentation, type TurnFailureRetry } from './turnFailurePresentation.js';
224
232
  export { readSeatTurnFailure, seatTurnFailureOf, type SeatTurnFailure } from './turnFailurePresentation.js';
225
- export { REATTACH_BUDGET_FRESH, REATTACH_MAX_TRIES, runReattachPolicy, type ReattachBudget, type ReattachDecision, type ReattachEvent, type ReattachGiveUp, } from './runReattachPolicy.js';
233
+ export { REATTACH_BUDGET_FRESH, REATTACH_BUDGET_NONE, REATTACH_MAX_TRIES, STREAM_CAP_CREDIBLE_AFTER_MS, runReattachPolicy, type ReattachBudget, type ReattachDecision, type ReattachDrainingEvent, type ReattachEvent, } from './runReattachPolicy.js';
234
+ export { runNotFollowedNotice, runNotFollowedOf, type ReattachBreak, type RunNotFollowed, type RunNotFollowedCause } from './runFollow.js';
226
235
  export * from './corruptSession.js';
227
236
  export * from './corruptSessionCopy.js';
228
237
  export { SEMA_TOOL_HISTORY_ACCEPTED_KEY, classifyToolHistoryMismatch, readToolHistoryAcceptedKey, readToolHistoryMismatchKey, resolveToolHistoryRewindTarget } from './toolHistoryMismatch.js';
@@ -260,13 +269,15 @@ export type { InterruptedRunRow, InterruptedRunSettleDeps, InterruptedRunSettleV
260
269
  export { ENGINE_GENERATION_WINDOW_MARGIN_MS, ENGINE_STOPPED_CALL_PHASES, approvalWindowLeftMs, convergeEndedEngineGeneration } from './engineGenerationConvergence.js';
261
270
  export type { ApprovalWindowAnchor, EndedGenerationCard, EndedGenerationFacts, EndedGenerationOpenedCall, EndedGenerationPhaseChange, EndedGenerationPhaseHold, EngineGenerationConvergence, EngineStoppedCallPhase, } from './engineGenerationConvergence.js';
262
271
  export { AWAIT_ENGINE_INSTALL_POLL_MS, REATTACH_AWAIT_NEXT_ENGINE_MS, REATTACH_RUN_STATES, approvalFrameGenerationVerdict, awaitNextEngineInstalled, endedGenerationSettleStep, engineGenerationEnded, engineGenerationOfPort, engineGenerationReadingOf, unreachableForSettle, } from './engineGenerationPort.js';
263
- export type { ApprovalFrameGenerationFacts, AwaitNextEngineDeps, EndedGenerationMaterials, EndedGenerationSettleFacts, EndedGenerationSettleStep, EngineGenerationEndedFacts, EngineGenerationPort, EngineGenerationReading, ReattachLivenessReading, ReattachOutageStopLine, ReattachOutageStopLineParts, ReattachRunState, } from './engineGenerationPort.js';
272
+ export type { ApprovalFrameGenerationFacts, AwaitNextEngineDeps, EndedGenerationMaterials, EndedGenerationSettleFacts, EndedGenerationSettleStep, EndedGenerationWaitReading, EngineGenerationEndFact, EngineGenerationEndedFacts, EngineGenerationPort, EngineGenerationReading, ReattachLivenessReading, ReattachOutageStopLine, ReattachOutageStopLineParts, ReattachRunState, } from './engineGenerationPort.js';
264
273
  export { POISON_FRAME_RAW_MAX, REATTACH_BACKOFF_CAP_MS, REATTACH_BACKOFF_START_MS, REATTACH_NOT_FOUND_CONFIRM, REATTACH_NOT_FOUND_MIN_ELAPSED_MS, REATTACH_WINDOW_MS, malformedFrameErrorOf, poisonFrameInitial, poisonFrameStep, reattachBackoffMs, reattachWindowOpen, reattachWindowStep, } from './reattachWindow.js';
265
274
  export type { PoisonFrameDecision, PoisonFrameEvent, PoisonFrameState, PoisonFrameStep, ReattachProbeResult, ReattachWindowDecision, ReattachWindowEvent, ReattachWindowState, ReattachWindowStep, ReattachWindowTuning, } from './reattachWindow.js';
266
275
  export * from './inheritEnvWire.js';
267
276
  export * from './inheritEnvCapability.js';
268
277
  export { SUPPORT_FLOOR, supportFloorOf, engineVersionTier, engineSupportFloorEffective, coreVersionTier, compareReleaseVersions } from './supportFloor.js';
269
278
  export type { SupportFloor, SupportFloorComponent, EngineVersionTier } from './supportFloor.js';
279
+ export { SERVER_SUPPORT_RANGE_REASONS, serverSupportRangeVerdict, serverSupportRangeSentence } from './serverSupportRange.js';
280
+ export type { ServerSupportRangeReason, ServerSupportRangeVerdict } from './serverSupportRange.js';
270
281
  export * from './decideReceipt.js';
271
282
  export * from './sessionMap.js';
272
283
  export * from './detachWire.js';
@@ -310,6 +321,11 @@ export { ruleToolNameVerdictOf } from './protocolSegment.js';
310
321
  export type { RuleToolNameReading } from './protocolSegment.js';
311
322
  export * from './hitl/askGateWire.js';
312
323
  export * from './hitl/planReviewWire.js';
324
+ export type { PlanReviewCardFacts, PlanReviewBody, PlanBodyUnknownCause } from './planReviewCardFacts.js';
325
+ export { planReviewBodyOf } from './planReviewCardFacts.js';
326
+ export { planReviewCardNote } from './hitl/planReviewCard.js';
327
+ export { readRunLedgerSnapshot } from './runLedgerSnapshot.js';
328
+ export type { RunLedgerSnapshot, RunLedgerFold, RunLedgerSnapshotDeps } from './runLedgerSnapshot.js';
313
329
  export { decisionInFlightOf, decisionReadMark } from './hitl/decisionLedger.js';
314
330
  export { ASK_PARK_AUTO_REOPEN_BLOCKS, askParkAutoReopenBlockedContent, askParkAutoReopenBlockOf, askParkRefusalBlockOf, claimAskParkAutoReopenBlockNotice, clearAskParkAutoReopenBlocks, } from './hitl/askParkAutoReopenBlock.js';
315
331
  export type { AskParkAutoReopenBlock, AskParkAutoReopenBlockNotice, AskParkGate } from './hitl/askParkAutoReopenBlock.js';
@@ -348,6 +364,7 @@ export { policyDenyReason, type PolicyDenyLane, type PolicyDenyReasonFacts } fro
348
364
  export { readApprovalAllowRuleShadow, approvalAllowRuleShadowed, allowRuleShadowSentence, type ApprovalAllowRuleShadow, type ApprovalAllowRuleShadowMember, type AllowRuleShadowedWireMember, } from './hitl/allowRuleShadow.js';
349
365
  export { projectCrashConverged } from './hitl/crashConverged.js';
350
366
  export type { ApprovalsListEnvelope, CrashConvergedOrphanState, CrashConvergedProjection, CrashConvergedRowReading } from './hitl/crashConverged.js';
367
+ export type { ApprovalQueueKindedRow, ApprovalQueueRow } from './hitl/crashConverged.js';
351
368
  export * from './hitl/crashConvergedNotice.js';
352
369
  export { approvalCompleteParked } from './hitl/approvalCompleteParked.js';
353
370
  export { approvalCompleteCauseOf } from './hitl/approvalEndingCause.js';
@@ -371,6 +388,12 @@ export * from './request/printNotification.js';
371
388
  export * from './seatContract.js';
372
389
  export { sessionRowTagOf, sessionRowPatchRefusalOf } from './sessionRowTag.js';
373
390
  export type { SessionRowCurrentReading, SessionRowPatchRefusal } from './sessionRowTag.js';
391
+ export { sessionRowUnreadableOf } from './sessionRowTag.js';
392
+ export type { SessionRowUnreadable } from './sessionRowTag.js';
393
+ export { projectSeedGateContent, projectSeedGateOf, projectSeedRefusalContent, projectSeedRefusalOf } from './projectSeed.js';
394
+ export type { ProjectSeedArm, ProjectSeedGate, ProjectSeedGateInput, ProjectSeedRefusal } from './projectSeed.js';
395
+ export { sessionMemorySyncNotice, sessionMemorySyncStateOf } from './sessionMemorySync.js';
396
+ export type { SessionMemorySyncReportReading, SessionMemorySyncSettled, SessionMemorySyncState } from './sessionMemorySync.js';
374
397
  export { mcpToolTogglesToExcludeTools } from './mcpToolToggles.js';
375
398
  export type { McpToolToggleKey, McpMountedServers } from './mcpToolToggles.js';
376
399
  export { readThinkingLatch, writeThinkingLatch, thinkingLatchView, thinkingLatchSentence, thinkingLatchRowWordOf, readSeatThinkingLatch } from './thinkingLatch.js';
@@ -385,6 +408,10 @@ export * from './agentSession/contract.js';
385
408
  export * from './agentSession/backgroundView.js';
386
409
  export { readAssistantInbox } from './assistantInbox.js';
387
410
  export type { AssistantInboxVerb, AssistantInboxEntry, AssistantInboxReading, AssistantInboxUnavailableReason } from './assistantInbox.js';
411
+ export { checkpointRowVerdictOf } from './checkpointRowVerdict.js';
412
+ export type { CheckpointRowVerdictReading } from './checkpointRowVerdict.js';
413
+ export { checkpointRequirementsDamagedOf } from './checkpointRowVerdict.js';
414
+ export type { CheckpointRequirementsDamagedReading } from './checkpointRowVerdict.js';
388
415
  export { READ_CREDENTIAL_NOT_ACCEPTED_NOTICE, isReadCredentialRefusal } from './readCredentialRefusal.js';
389
416
  export { readEngineAgentRegistry, isEngineAgentRegistryListingSuperseded } from './agentSession/engineAgentRegistryRead.js';
390
417
  export type { EngineAgentRegistryClient } from './agentSession/engineAgentRegistryRead.js';
@@ -437,3 +464,7 @@ export { scenarioSkillsOf, observedScenarioSkillsCapability } from './scenarioSk
437
464
  export type { ScenarioCardSkill, ScenarioSkillsCapabilityReading } from './scenarioSkills.js';
438
465
  export { observedApprovalFrameFamilies, approvalFrameFamiliesDeclaration } from './approvalFrameFamilies.js';
439
466
  export type { ApprovalFrameFamiliesReading, ApprovalFrameFamiliesDeclaration, ApprovalFrameFamiliesWithheld, ApprovalFrameFamiliesWithheldCause, } from './approvalFrameFamilies.js';
467
+ export { sessionEngineBindingFor, commitSessionEngine, readSessionEngine, sessionDispatchTarget } from './sessionEngine.js';
468
+ 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
+ export { foldSessionPlacement } from './deviceRebind.js';
470
+ export type { SessionPlacementView } from './deviceRebind.js';