@sema-agent/client-core 0.99.0 → 0.100.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 (128) hide show
  1. package/CHANGELOG.md +177 -0
  2. package/README.md +32 -19
  3. package/dist/adapt/arms.js +60 -36
  4. package/dist/adapt/panelTasks.d.ts +2 -1
  5. package/dist/adapt/panelTasks.js +32 -9
  6. package/dist/adapt/textStream.d.ts +1 -1
  7. package/dist/adapt/textStream.js +51 -28
  8. package/dist/adapter/activeRunSelfHeal.d.ts +7 -0
  9. package/dist/adapter/activeRunSelfHeal.js +58 -11
  10. package/dist/adapter/downstream/eventToSdkMessage.d.ts +25 -6
  11. package/dist/adapter/downstream/eventToSdkMessage.js +125 -9
  12. package/dist/adapter/downstream/terminalToSdkResult.js +10 -0
  13. package/dist/adapter/downstream/wiringManifestView.d.ts +3 -1
  14. package/dist/adapter/downstream/wiringManifestView.js +1 -0
  15. package/dist/adapter/runStream.js +32 -5
  16. package/dist/adapter/types.d.ts +2 -0
  17. package/dist/agentsWireCaps.d.ts +7 -0
  18. package/dist/agentsWireCaps.js +100 -15
  19. package/dist/cloudConfigWireCaps.d.ts +10 -1
  20. package/dist/cloudConfigWireCaps.js +156 -62
  21. package/dist/compactionStatus.d.ts +34 -0
  22. package/dist/compactionStatus.js +196 -0
  23. package/dist/decideFailureNote.js +3 -3
  24. package/dist/displayUntrusted.js +150 -5
  25. package/dist/engineAgentPanelStore.d.ts +7 -4
  26. package/dist/engineErrorCodes.d.ts +9 -1
  27. package/dist/engineErrorCodes.js +9 -5
  28. package/dist/engineRowRef.js +1 -0
  29. package/dist/engineToolDirectory.d.ts +3 -0
  30. package/dist/engineToolDirectory.js +4 -2
  31. package/dist/eventLeg.d.ts +1 -7
  32. package/dist/eventLeg.js +7 -8
  33. package/dist/fileHistoryCaptureCapability.d.ts +0 -3
  34. package/dist/fileHistoryCaptureCapability.js +0 -4
  35. package/dist/generated/engineFactTables.d.ts +1 -0
  36. package/dist/generated/engineFactTables.js +27 -0
  37. package/dist/generated/engineNoticeTables.js +3 -0
  38. package/dist/generated/settingsSchemaFns.d.ts +12 -0
  39. package/dist/generated/settingsSchemaFns.js +13 -0
  40. package/dist/generated/settingsSchemaMcpRequestEntry.d.ts +1 -0
  41. package/dist/generated/settingsSchemaMcpRequestEntry.js +162 -0
  42. package/dist/generated/settingsSchemaTables.d.ts +1 -0
  43. package/dist/generated/settingsSchemaTables.js +5 -0
  44. package/dist/generated/settingsSchemaTypes.d.ts +28 -0
  45. package/dist/hitl/allowRuleShadow.js +2 -2
  46. package/dist/hitl/approvalCardReasons.js +2 -2
  47. package/dist/hitl/approvalHolds.d.ts +14 -0
  48. package/dist/hitl/approvalHolds.js +41 -0
  49. package/dist/hitl/askClassPair.d.ts +2 -2
  50. package/dist/hitl/askClassPair.js +2 -2
  51. package/dist/hitl/attributionLadder.d.ts +23 -0
  52. package/dist/hitl/attributionLadder.js +67 -0
  53. package/dist/hitl/decisionLedger.d.ts +55 -0
  54. package/dist/hitl/decisionLedger.js +156 -0
  55. package/dist/hitl/decisionRefusal.d.ts +1 -0
  56. package/dist/hitl/decisionRefusal.js +1 -1
  57. package/dist/hitl/decisionSend.d.ts +113 -0
  58. package/dist/hitl/decisionSend.js +579 -0
  59. package/dist/hitl/hitlBridge.js +18 -6
  60. package/dist/hitl/planReviewWire.js +45 -76
  61. package/dist/hitl/sessionPolicyDeliverable.js +3 -6
  62. package/dist/hitl/toolApprovalWire.js +43 -109
  63. package/dist/hostTurnSettings.d.ts +46 -7
  64. package/dist/hostTurnSettings.js +408 -7
  65. package/dist/humanTurn.d.ts +2 -1
  66. package/dist/humanTurn.js +3 -3
  67. package/dist/i18n/messages.en.d.ts +131 -0
  68. package/dist/i18n/messages.en.js +143 -12
  69. package/dist/i18n/messages.zh.js +148 -12
  70. package/dist/index.d.ts +18 -2
  71. package/dist/index.js +10 -1
  72. package/dist/inheritEnvCapability.d.ts +1 -0
  73. package/dist/inheritEnvCapability.js +9 -2
  74. package/dist/inheritEnvWire.js +2 -2
  75. package/dist/injectionLaneNotice.d.ts +5 -0
  76. package/dist/injectionLaneNotice.js +46 -0
  77. package/dist/mcpPanel.js +2 -0
  78. package/dist/mcpReconnect.js +2 -2
  79. package/dist/mcpToolToggles.d.ts +6 -0
  80. package/dist/mcpToolToggles.js +46 -0
  81. package/dist/mcpWireCaps.d.ts +10 -4
  82. package/dist/mcpWireCaps.js +106 -71
  83. package/dist/mcpWireTransport.d.ts +4 -0
  84. package/dist/mcpWireTransport.js +18 -0
  85. package/dist/modelCapabilityProbe.d.ts +2 -1
  86. package/dist/modelCapabilityProbe.js +10 -9
  87. package/dist/modelIdentityResolvability.d.ts +2 -0
  88. package/dist/modelIdentityResolvability.js +23 -5
  89. package/dist/ownKey.d.ts +26 -0
  90. package/dist/ownKey.js +75 -0
  91. package/dist/panelReduce.d.ts +5 -0
  92. package/dist/panelReduce.js +45 -13
  93. package/dist/panelStateHolder.d.ts +1 -0
  94. package/dist/panelStateHolder.js +10 -1
  95. package/dist/permissionRuleIssue.d.ts +2 -1
  96. package/dist/permissionRuleIssue.js +22 -21
  97. package/dist/pluginHooksWire.js +12 -10
  98. package/dist/prepareRefusal.d.ts +8 -0
  99. package/dist/prepareRefusal.js +72 -0
  100. package/dist/request/taskRequest.d.ts +10 -10
  101. package/dist/request/taskRequest.js +106 -65
  102. package/dist/resumeRefusalCopy.d.ts +3 -1
  103. package/dist/resumeRefusalCopy.js +22 -4
  104. package/dist/retryStatus.d.ts +18 -0
  105. package/dist/retryStatus.js +76 -19
  106. package/dist/ruleRefusalSentence.d.ts +4 -0
  107. package/dist/ruleRefusalSentence.js +58 -0
  108. package/dist/sandboxWire.d.ts +2 -1
  109. package/dist/sandboxWire.js +55 -21
  110. package/dist/scenarioRefusal.d.ts +2 -1
  111. package/dist/scenarioRefusal.js +5 -5
  112. package/dist/seam.d.ts +24 -9
  113. package/dist/seam.js +44 -4
  114. package/dist/seatContract.d.ts +16 -8
  115. package/dist/seatContract.js +21 -6
  116. package/dist/settingsCredentialKeyPaths.d.ts +8 -0
  117. package/dist/settingsCredentialKeyPaths.js +219 -0
  118. package/dist/skillsWireCaps.d.ts +0 -3
  119. package/dist/skillsWireCaps.js +1 -2
  120. package/dist/subagentContentStore.d.ts +1 -0
  121. package/dist/subagentContentStore.js +135 -27
  122. package/dist/toolsFlagNames.d.ts +8 -0
  123. package/dist/toolsFlagNames.js +110 -0
  124. package/dist/turnFailurePresentation.js +15 -7
  125. package/dist/wireRefusalCopy.d.ts +51 -17
  126. package/dist/wireRefusalCopy.js +298 -135
  127. package/docs/INTEGRATION-CLIENTS.md +423 -26
  128. package/package.json +4 -4
@@ -183,11 +183,20 @@ declare const EN: {
183
183
  'config.mcp.nameBlank': string;
184
184
  'config.mcp.nameEdgeWhitespace': string;
185
185
  'config.mcp.nameCollides': string;
186
+ 'config.mcp.nameTooLong': string;
187
+ 'config.mcp.identityHeadersBothSet': string;
188
+ 'config.mcp.transportUnreadable': string;
189
+ 'config.mcp.transportInvalid': string;
190
+ 'config.mcp.transportDegraded': string;
186
191
  'config.mcp.toolAxesInvalid': string;
187
192
  'config.mcp.toolAxesFallbackProblem': string;
188
193
  'config.mcp.elicitationInvalid': string;
189
194
  'config.mcp.cloudElicitationInvalid': string;
190
195
  'config.mcp.cloudToolAxesInvalid': string;
196
+ 'config.mcp.cloudNameUnusable': string;
197
+ 'config.mcp.cloudTransportInvalid': string;
198
+ 'config.mcp.cloudTransportDegraded': string;
199
+ 'config.mcp.cloudTransportDegradedUnreadable': string;
191
200
  'approval.boundGrants.notActivated.one': string;
192
201
  'approval.boundGrants.notActivated.other': string;
193
202
  'approval.boundGrants.listsNoToolsWithNothing.one': string;
@@ -298,10 +307,13 @@ declare const EN: {
298
307
  'resume.refusal.park.whyWalltime': string;
299
308
  'resume.refusal.park.whyInheritedGate': string;
300
309
  'resume.refusal.park.whyConfigRefused': string;
310
+ 'resume.refusal.park.whyDeps': string;
301
311
  'resume.refusal.park.whyUnsupported': string;
302
312
  'resume.refusal.park.whatDefault': string;
303
313
  'resume.refusal.park.head': string;
304
314
  'resume.refusal.park.configMayReturn': string;
315
+ 'resume.refusal.park.depsMayReturn': string;
316
+ 'resume.refusal.park.blockedByTail': string;
305
317
  'resume.refusal.park.printEnded': string;
306
318
  'resume.refusal.park.printHolds': string;
307
319
  'resume.refusal.park.interactiveEnded': string;
@@ -377,6 +389,7 @@ declare const EN: {
377
389
  'session.selfHeal.row.steered.reported': string;
378
390
  'session.selfHeal.row.steered.unknown': string;
379
391
  'session.selfHeal.row.steerFailed.rejected': string;
392
+ 'session.selfHeal.row.steerFailed.runEnded': string;
380
393
  'session.selfHeal.row.steerFailed.unknown': string;
381
394
  'session.selfHeal.row.attach': string;
382
395
  'session.selfHeal.row.cancelled.confirmed': string;
@@ -403,6 +416,9 @@ declare const EN: {
403
416
  'session.selfHeal.row.notParked.inFlight': string;
404
417
  'session.selfHeal.row.stateUnknown': string;
405
418
  'session.selfHeal.headless.status': string;
419
+ 'session.selfHeal.endRun.engine': string;
420
+ 'session.selfHeal.wakeOn.engine': string;
421
+ 'session.selfHeal.wakeOn.host': string;
406
422
  'session.selfHeal.headless.decide': string;
407
423
  'session.selfHeal.headless.statusOnly': string;
408
424
  'session.selfHeal.headless.neverReleased': string;
@@ -491,6 +507,7 @@ declare const EN: {
491
507
  'session.fileHistoryRefusal.notSaid': string;
492
508
  'session.fileHistoryRefusal.unrecognized': string;
493
509
  'session.fileHistoryRefusal.unreadable': string;
510
+ 'session.hostSettings.memorySwitchMalformed': string;
494
511
  'model.identity.lane.processEnv': string;
495
512
  'model.identity.lane.settingsEnv': string;
496
513
  'model.identity.lane.modelCatalogFile': string;
@@ -499,6 +516,37 @@ declare const EN: {
499
516
  'model.identity.routeGap.fact.endpointMissing': string;
500
517
  'model.identity.routeGap.fact.laneCredentialMissing': string;
501
518
  'model.identity.routeGap.sentence': string;
519
+ 'model.identity.catalogAdoption.refused': string;
520
+ 'model.identity.catalogAdoption.notResolvable': string;
521
+ 'model.identity.catalogAdoption.notResolvableWithPartial': string;
522
+ 'notice.injectionLane.sentence': string;
523
+ 'notice.injectionLane.item.stdioMcp': string;
524
+ 'notice.injectionLane.item.credentialedMcp': string;
525
+ 'notice.injectionLane.item.taskHooks': string;
526
+ 'notice.injectionLane.itemSeparator': string;
527
+ 'rules.refusal.sentence.one': string;
528
+ 'rules.refusal.sentence.other': string;
529
+ 'rules.refusal.item': string;
530
+ 'rules.refusal.itemSeparator': string;
531
+ 'rules.refusal.list.more': string;
532
+ 'rules.refusal.reason.toolName': string;
533
+ 'rules.refusal.reason.homePath': string;
534
+ 'config.agentsWire.refusedServer.sentence': string;
535
+ 'config.agentsWire.refusedServer.cause.rejected': string;
536
+ 'config.agentsWire.refusedServer.cause.notApproved': string;
537
+ 'config.agentsWire.refusedServer.cause.disabled': string;
538
+ 'config.agentsWire.refusedServer.cause.policyBlocked': string;
539
+ 'config.agentsWire.refusedServer.cause.pluginOnly': string;
540
+ 'config.agentsWire.refusedServer.cause.malformedConfig': string;
541
+ 'config.agentsWire.refusedServer.cause.unknown': string;
542
+ 'config.agentsWire.refusedServer.way.rejected': string;
543
+ 'config.agentsWire.refusedServer.way.notApproved': string;
544
+ 'config.agentsWire.refusedServer.way.disabled': string;
545
+ 'config.agentsWire.refusedServer.way.policyBlocked': string;
546
+ 'config.agentsWire.refusedServer.way.pluginOnly': string;
547
+ 'config.agentsWire.refusedServer.way.malformedConfig': string;
548
+ 'config.agentsWire.refusedServer.way.unknown': string;
549
+ 'config.agentsWire.toolEntry.sentence': string;
502
550
  'config.hooks.valueShape.nothing': string;
503
551
  'config.hooks.valueShape.null': string;
504
552
  'config.hooks.valueShape.array': string;
@@ -697,6 +745,89 @@ declare const EN: {
697
745
  'notice.failure.settings.riskJoin': string;
698
746
  'notice.failure.wait.one': string;
699
747
  'notice.failure.wait.other': string;
748
+ 'rules.issue.emptyTool': string;
749
+ 'rules.issue.paren': string;
750
+ 'rules.issue.toolName': string;
751
+ 'rules.issue.paramSplit': string;
752
+ 'rules.issue.primaryField': string;
753
+ 'rules.issue.capExceeded': string;
754
+ 'rules.issue.behavior': string;
755
+ 'rules.issue.commandRule': string;
756
+ 'rules.issue.entryType': string;
757
+ 'rules.issue.allowRule': string;
758
+ 'rules.issue.paramUnknown': string;
759
+ 'rules.issue.paramNonScalar': string;
760
+ 'rules.issue.toolUnknown': string;
761
+ 'rules.issue.pathBase': string;
762
+ 'rules.issue.mcpParen': string;
763
+ 'rules.issue.coveringParen': string;
764
+ 'rules.issue.paramSplitWithColon': string;
765
+ 'rules.issue.paramSplitNoColon': string;
766
+ 'rules.issue.newerCode': string;
767
+ 'model.probe.verdict.ok': string;
768
+ 'model.probe.verdict.okWaited': string;
769
+ 'model.probe.verdict.auth': string;
770
+ 'model.probe.verdict.unreachable': string;
771
+ 'model.probe.verdict.unreachableWaited': string;
772
+ 'model.probe.verdict.model': string;
773
+ 'model.probe.verdict.shape': string;
774
+ 'model.probe.verdict.busy': string;
775
+ 'model.probe.verdict.noToken': string;
776
+ 'model.probe.verdict.noTokenWaited': string;
777
+ 'model.probe.verdict.other': string;
778
+ 'session.humanTurn.imageUnknownVision.one': string;
779
+ 'session.humanTurn.imageUnknownVision.other': string;
780
+ 'config.scenarioRefusal.source.ruling': string;
781
+ 'config.scenarioRefusal.source.deployment': string;
782
+ 'config.scenarioRefusal.dangling': string;
783
+ 'config.scenarioRefusal.generic': string;
784
+ 'notice.wireRefusal.cancel.approvalSettled': string;
785
+ 'notice.wireRefusal.cancel.runNotRunning': string;
786
+ 'notice.wireRefusal.cancel.unrecognized': string;
787
+ 'notice.wireRefusal.sendAgainAbout': string;
788
+ 'notice.wireRefusal.usageWindow.head': string;
789
+ 'notice.wireRefusal.usageWindow.unknownWait': string;
790
+ 'notice.wireRefusal.fleetLease.head': string;
791
+ 'notice.wireRefusal.fleetLease.authRejected': string;
792
+ 'notice.wireRefusal.fleetLease.unreachable': string;
793
+ 'notice.wireRefusal.fleetLease.unknownWait': string;
794
+ 'notice.wireRefusal.denyAttribution.notInProof': string;
795
+ 'notice.wireRefusal.denyAttribution.decisionConflict': string;
796
+ 'notice.wireRefusal.denyAttribution.retiredKey': string;
797
+ 'notice.wireRefusal.denyAttribution.attributionRejected': string;
798
+ 'notice.wireRefusal.denyAttribution.named': string;
799
+ 'notice.wireRefusal.sessionDelete.unrecognized': string;
800
+ 'notice.wireRefusal.sessionDelete.childrenAlive': string;
801
+ 'notice.wireRefusal.sessionDelete.which': string;
802
+ 'notice.wireRefusal.sessionDelete.whichMore': string;
803
+ 'notice.wireRefusal.sessionDelete.activeRun': string;
804
+ 'notice.wireRefusal.sessionDelete.runId': string;
805
+ 'notice.wireRefusal.bucket.unknown': string;
806
+ 'notice.wireRefusal.bucket.subject.stored': string;
807
+ 'notice.wireRefusal.bucket.subject.fresh': string;
808
+ 'notice.wireRefusal.bucket.list': string;
809
+ 'notice.wireRefusal.bucket.what.overCap.more': string;
810
+ 'notice.wireRefusal.bucket.what.overCap.atMost': string;
811
+ 'notice.wireRefusal.bucket.what.overCap.unknown': string;
812
+ 'notice.wireRefusal.bucket.what.badEntry.at': string;
813
+ 'notice.wireRefusal.bucket.what.badEntry.notList': string;
814
+ 'notice.wireRefusal.bucket.fix.merge': string;
815
+ 'notice.wireRefusal.bucket.fix.entry': string;
816
+ 'notice.wireRefusal.bucket.fix.list': string;
817
+ 'notice.wireRefusal.bucket.next.stored': string;
818
+ 'notice.wireRefusal.bucket.next.fresh': string;
819
+ 'notice.wireRefusal.toolDeclaration': string;
820
+ 'notice.wireRefusal.hostPosture.notLocal': string;
821
+ 'notice.wireRefusal.hostPosture.wholeEnv': string;
822
+ 'notice.wireRefusal.hostPosture.writeFace': string;
823
+ 'notice.wireRefusal.hostPosture.both': string;
824
+ 'notice.wireRefusal.hostPosture.unattributed': string;
825
+ 'notice.wireRefusal.autonomyLane': string;
826
+ 'notice.wireRefusal.userAttachment': string;
827
+ 'notice.wireRefusal.userInvokedSkill': string;
828
+ 'notice.retry.source.unifiedHeader': string;
829
+ 'notice.retry.source.providerCode': string;
830
+ 'notice.retry.source.status': string;
700
831
  };
701
832
  export declare const EN_MESSAGES: Readonly<typeof EN>;
702
833
  export type MessageKey = keyof typeof EN;
@@ -180,14 +180,23 @@ const EN = {
180
180
  'onboard.refusal.writeFailed': 'The model configuration could not be saved.',
181
181
  'onboard.refusal.engineIsRemote': "The Cloud engine is in use — local model setup doesn't apply to it. Switch to the local engine first.",
182
182
  'onboard.refusal.envCatalogPresent': 'The engine is serving models from environment settings; adding the first catalog model would replace them, so nothing was saved. Add those models to the catalog first.',
183
- 'config.mcp.nameBlank': 'An MCP server entry{where} has an empty name ({name}), so it was not started. Give it a name, or remove the entry.',
184
- 'config.mcp.nameEdgeWhitespace': 'MCP server {name}{where} was not started: its name has leading or trailing whitespace, so it would not match the same name in other settings (for example a list of disabled servers). Remove the extra whitespace from the name.',
185
- 'config.mcp.nameCollides': 'MCP server {name}{where} was not started: its name has leading or trailing whitespace and, without it, would be the same name as another MCP server entry. Remove the extra whitespace from the name, or delete the duplicate entry.',
183
+ 'config.mcp.nameBlank': 'An MCP server entry{where} has a name that cannot be used ({name}), so it was not started. Give it a name, or remove the entry.',
184
+ 'config.mcp.nameEdgeWhitespace': 'MCP server name {name}{where} cannot be used as written, so the server was not started: it would not match the same name in other settings (for example a list of disabled servers). Remove the extra whitespace from the name.',
185
+ 'config.mcp.nameCollides': 'MCP server name {name}{where} cannot be used as written, so the server was not started: without its leading or trailing whitespace it would be the same name as another MCP server entry. Remove the extra whitespace from the name, or delete the duplicate entry.',
186
+ 'config.mcp.nameTooLong': 'MCP server name {name}{where} cannot be used, so the server was not started: server names are limited to 128 characters. Shorten the name.',
187
+ '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.',
188
+ 'config.mcp.transportUnreadable': 'could not be read (a getter or proxy trap on the declaration threw)',
189
+ '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.',
190
+ '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.',
186
191
  '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.',
187
192
  'config.mcp.toolAxesFallbackProblem': 'the declaration is not a valid set of per-tool safety settings',
188
193
  'config.mcp.elicitationInvalid': 'MCP server {name}{where} was not started: its elicitation setting must be true or false. Fix the elicitation entry for this server (or remove it); the other MCP servers are unaffected.',
189
194
  'config.mcp.cloudElicitationInvalid': 'cloud config: MCP server entries left out because their elicitation setting is not true or false — fix or remove the elicitation entry: {who}',
190
195
  'config.mcp.cloudToolAxesInvalid': 'cloud config: MCP server entries left out because their toolAxes setting is not valid (per-tool safety overrides take only effect, egress and irreversibility, each with a legal value) — fix or remove the toolAxes entry: {who}',
196
+ 'config.mcp.cloudNameUnusable': 'cloud config: MCP server entries left out because their names cannot be used as written (a name over 128 characters, or with leading or trailing whitespace) — fix the names: {who}',
197
+ 'config.mcp.cloudTransportInvalid': 'cloud config: MCP server entries left out because their transport setting cannot be used by the engine as written (for example an address that is not an http(s) URL) — fix the transport setting: {who}',
198
+ 'config.mcp.cloudTransportDegraded': 'cloud config: MCP server entries started without part of their transport settings, which cannot be used as written (the named settings were left out, the rest are applied) — fix the named settings: {who}',
199
+ 'config.mcp.cloudTransportDegradedUnreadable': 'cloud config: the list of MCP server entries started with part of their settings left out could not be read by this client — a server may be running without some of its configured settings and without notice',
191
200
  'approval.boundGrants.notActivated.one': "Approving this does not activate the skill shown on the card: 1 entry on its refuse list reads as nothing, and the engine does not drop a refusal it cannot read, so the skill's instructions are not loaded and nothing it lists is granted.",
192
201
  'approval.boundGrants.notActivated.other': "Approving this does not activate the skill shown on the card: {count} entries on its refuse list read as nothing, and the engine does not drop a refusal it cannot read, so the skill's instructions are not loaded and nothing it lists is granted.",
193
202
  'approval.boundGrants.listsNoToolsWithNothing.one': 'Approving this activates the skill shown on the card; it lists no tools to run without asking and none to refuse. 1 listed entry reads as nothing and grants nothing.',
@@ -298,12 +307,15 @@ const EN = {
298
307
  'resume.refusal.park.whyWalltime': 'its run carries a wall-clock time allowance, which this engine version no longer enforces',
299
308
  'resume.refusal.park.whyInheritedGate': 'the permission-mode setting it was parked with can no longer be read',
300
309
  'resume.refusal.park.whyConfigRefused': 'the engine refuses the task configuration it was parked with',
310
+ 'resume.refusal.park.whyDeps': 'the engine refuses the deployment’s own setup it would resume with (or a policy handed down to it as an inherited constraint) — a problem with the deployment, not with your decision',
301
311
  'resume.refusal.park.whyUnsupported': 'it was parked under conditions this engine version does not support (for example, by an earlier engine version)',
302
312
  'resume.refusal.park.whatDefault': 'parked step',
303
313
  'resume.refusal.park.head': 'This {what} cannot be resumed by this engine version: {why}. The same refusal comes back every time, so answering it again will not help (nothing was decided and nothing was resumed).',
304
314
  'resume.refusal.park.configMayReturn': ' If that configuration is restored, the same answer can go through again.',
305
- 'resume.refusal.park.printEnded': '{head} The engine ended that run ({code}); submit the work again as a new task.',
306
- 'resume.refusal.park.printHolds': '{head}{configMayReturn} The parked run still holds this session ({code}): cancel it ({cancel}), then submit the work again as a new task.',
315
+ 'resume.refusal.park.depsMayReturn': ' The card stays open: once whoever operates the engine fixes the deployment, the same card can be decided again.',
316
+ 'resume.refusal.park.blockedByTail': ' Admission code: {blockedBy}.',
317
+ 'resume.refusal.park.printEnded': '{head} The engine ended that run ({code}); submit the work again as a new task.{blocked}',
318
+ 'resume.refusal.park.printHolds': '{head}{configMayReturn} The parked run still holds this session ({code}): cancel it ({cancel}), then submit the work again as a new task.{blocked}',
307
319
  'resume.refusal.park.interactiveEnded': '{head} The engine ended that parked run, so this conversation is free: send the work again as a new message.',
308
320
  'resume.refusal.park.interactiveBusy': '{head}{configMayReturn} The parked run keeps this conversation busy until it is cancelled.',
309
321
  '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,10 +385,11 @@ const EN = {
373
385
  'session.selfHeal.row.steered.next.dismissed': 'You closed that decision card yourself, so sema did not put it back on screen; nothing will resume that run until that decision is made — send a message to bring the card back.',
374
386
  'session.selfHeal.row.steered.next.cannotShow': 'sema could not surface that decision card here{noView}, so nothing will resume that run until that decision is made; {wayOut} if you no longer want it.',
375
387
  'session.selfHeal.row.steered.queued': 'run {taskId} is not actually working right now: the engine reports it {parked} on a decision it needs from you, so it queued your message on that park instead of running it. {next} {textOnly} Nothing was cancelled, and your message did NOT start a new turn.',
376
- 'session.selfHeal.row.steered.parkedForWake': 'run {taskId} had already finished, so the engine parked your message on that finished run instead of running it — a parked message is delivered only if this session is woken on the engine (POST /v1/sessions/:id/wake), which sema does not do here. That run is no longer holding this session: send your message again to run it as a new turn — but note that the parked copy is NOT discarded, so if anything ever wakes this session on the engine that instruction would run a second time. {textOnly} Nothing was cancelled.',
388
+ 'session.selfHeal.row.steered.parkedForWake': 'run {taskId} had already finished, so the engine parked your message on that finished run instead of running it — a parked message is delivered only if this session is woken on the engine{wakeOn}, which sema does not do here. That run is no longer holding this session: send your message again to run it as a new turn — but note that the parked copy is NOT discarded, so if anything ever wakes this session on the engine that instruction would run a second time. {textOnly} Nothing was cancelled.',
377
389
  'session.selfHeal.row.steered.reported': ' (it reported that run as {status})',
378
390
  'session.selfHeal.row.steered.unknown': 'sema handed your message to run {taskId}, but the engine did not say how it will be delivered{reported}. {textOnly} Nothing was cancelled, and your message did NOT start a new turn — {tail}',
379
391
  'session.selfHeal.row.steerFailed.rejected': 'Handing your message to the running run (run {taskId}) was refused: {detail}. sema did NOT retry it (a steer is not safe to send twice) and it did NOT cancel that run. Your message was NOT sent; send it again if you still want it.',
392
+ 'session.selfHeal.row.steerFailed.runEnded': 'Run {taskId} had already finished (status {status}) by the time sema tried to hand it your message, so the engine refused it. sema did NOT retry it and did NOT cancel anything. That run no longer holds this session: send your message again to run it as a new turn.',
380
393
  'session.selfHeal.row.steerFailed.unknown': 'sema sent your message to the running run (run {taskId}) but could not confirm what happened to it ({detail}). A steer is not safe to send twice, so sema did NOT retry it, and it did NOT cancel that run. That run may or may not have received your message — watch what it does next before sending it again.',
381
394
  'session.selfHeal.row.attach': '{disclosure} Your message was NOT sent; send it again once that run has finished.',
382
395
  'session.selfHeal.row.cancelled.confirmed': 'You chose to cancel run {taskId}. The engine confirmed it is no longer holding this session, so sema is sending your message now.',
@@ -394,18 +407,21 @@ const EN = {
394
407
  'session.selfHeal.row.stale.cancelTimeout.unread': "sema asked the engine to cancel run {taskId} (parked on an approval that no longer exists there) but could not read that run's state back within {waited}, so it cannot confirm whether the session was released. Your message was NOT sent; send it again in a moment (if that run really is gone it will just run), or {wayOut}.",
395
408
  'session.selfHeal.row.stale.cancelTimeout.held': 'sema asked the engine to cancel run {taskId} (parked on an approval that no longer exists there), but that run still held this session {waited} later — cancelling is asynchronous and it may still be winding down. Your message was NOT sent; send it again in a moment, or {wayOut}.',
396
409
  'session.selfHeal.row.stale.cancelFailed.unknown': 'sema sent the cancel for run {taskId} (parked on an approval that no longer exists on the engine) but could not confirm what happened to it ({detail}), and it could not read that run back as released either. That run may or may not still be holding this session. Your message was NOT sent; send it again in a moment, or {wayOut}.',
397
- 'session.selfHeal.row.stale.wait.offered': 'Run {taskId} is still parked (status {status}) on an approval that no longer exists on the engine. sema already asked what to do with it and you chose to leave it alone, so it is not asking again. Your message was NOT sent; cancel that run on the engine (POST /v1/runs/{taskId}/cancel — that ends it for good), or {wayOut}.',
398
- 'session.selfHeal.row.stale.wait.first': 'Run {taskId} is still parked (status {status}) on an approval that no longer exists on the engine, so there is no card left to answer and that run will not settle on its own. sema did NOT cancel it — you chose to leave it alone. Your message was NOT sent; cancel that run on the engine (POST /v1/runs/{taskId}/cancel — that ends it for good), or {wayOut}.',
410
+ 'session.selfHeal.row.stale.wait.offered': 'Run {taskId} is still parked (status {status}) on an approval that no longer exists on the engine. sema already asked what to do with it and you chose to leave it alone, so it is not asking again. Your message was NOT sent; {endRun} (that ends that run for good), or {wayOut}.',
411
+ 'session.selfHeal.row.stale.wait.first': 'Run {taskId} is still parked (status {status}) on an approval that no longer exists on the engine, so there is no card left to answer and that run will not settle on its own. sema did NOT cancel it — you chose to leave it alone. Your message was NOT sent; {endRun} (that ends that run for good), or {wayOut}.',
399
412
  'session.selfHeal.row.runNotFound': 'The engine reported this session as held by run {taskId} (status running), but it no longer recognizes that run when asked directly — that claim looks stale (the run most likely no longer exists). sema did not offer to steer or cancel it: there is nothing left to act on. Your message was NOT sent; send it again (if the session really is free it will just run), or {wayOut}.',
400
413
  'session.selfHeal.row.runSettled': 'Run {taskId} has already finished (status {status}), but the engine still reported it as holding this session — that claim looks stale or mid-release. sema did not offer to steer or cancel it: the run is over. Your message was NOT sent; send it again (once the claim clears it will just run), or {wayOut}.',
401
- 'session.selfHeal.row.notParked.offered': 'Run {taskId} is still holding this session (status {status}). sema already asked what to do with it and you chose to leave it alone, so it is not asking again. Your message was NOT sent; wait for that run, cancel it on the engine (POST /v1/runs/{taskId}/cancel), or {wayOut}.',
414
+ 'session.selfHeal.row.notParked.offered': 'Run {taskId} is still holding this session (status {status}). sema already asked what to do with it and you chose to leave it alone, so it is not asking again. Your message was NOT sent; wait for that run, {endRun}, or {wayOut}.',
402
415
  'session.selfHeal.row.notParked.parkedOn': 'This session is held by an earlier run (run {taskId}, status {status}) that is waiting on {parkedOn} — it will not finish on its own. sema did NOT cancel it, because cancelling would decide that item for you. Your message was NOT sent; {wayOut} if you no longer want it.',
403
416
  'session.selfHeal.row.notParked.inFlight': 'This session already has a run in flight (run {taskId}, status {status}) — most likely a turn you sent to the background. sema did NOT cancel it, because that would throw away work you asked for. Wait for it to finish, or {wayOut}.',
404
417
  'session.selfHeal.row.stateUnknown': "A run is still active on this session{handle} and sema could not read that run's state, so it did not touch it ({detail}). sema did NOT send your message: this session cannot start a new turn until that run settles — {wayOut}.",
405
418
  'session.selfHeal.headless.status': ' (status {status})',
406
- 'session.selfHeal.headless.decide': 'This session is held by an earlier run{handle}{status} that is parked waiting on {gate}, so this message was NOT sent. Decide it and the session unlocks: POST {decidePath}. Cancelling instead ({cancelPath}) also unlocks it, but it decides that item against you. Or {freshSession}.{governance}',
407
- 'session.selfHeal.headless.statusOnly': 'This session is held by an earlier run{handle} with status {status}, so this message was NOT sent. The engine reported no decision pending on that run: if it is still working, wait for it to finish; if it will never settle, release it with {cancelPath} (that discards whatever it was doing). Or {freshSession}.',
408
- 'session.selfHeal.headless.neverReleased': 'A run is still active on this session{handle} and was never released, so sema did NOT send this message. Nothing here clears on its own. {startOver}, or release the run on the engine: {cancelPath}',
419
+ 'session.selfHeal.endRun.engine': 'cancel that run on the engine ({cancelPath})',
420
+ 'session.selfHeal.wakeOn.engine': ' (POST /v1/sessions/:id/wake)',
421
+ 'session.selfHeal.wakeOn.host': ' ({where})',
422
+ 'session.selfHeal.headless.decide': 'This session is held by an earlier run{handle}{status} that is parked waiting on {gate}, so this message was NOT sent. Decide it and the session unlocks: POST {decidePath}. Ending that run instead also unlocks it, but it decides that item against you: {endRun}. Or {freshSession}.{governance}',
423
+ 'session.selfHeal.headless.statusOnly': 'This session is held by an earlier run{handle} with status {status}, so this message was NOT sent. The engine reported no decision pending on that run: if it is still working, wait for it to finish; if it will never settle, {endRun} — that discards whatever it was doing. Or {freshSession}.',
424
+ 'session.selfHeal.headless.neverReleased': 'A run is still active on this session{handle} and was never released, so sema did NOT send this message. Nothing here clears on its own. {startOver}, or {endRun}.',
409
425
  'approval.deniedBy.policy': "denied by this deployment's permission policy",
410
426
  'approval.deniedBy.hook': 'denied by a PreToolUse hook',
411
427
  'approval.deniedBy.org': 'denied by an organization rule',
@@ -491,6 +507,7 @@ const EN = {
491
507
  '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.',
492
508
  '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.',
493
509
  '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.",
510
+ '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.',
494
511
  'model.identity.lane.processEnv': 'the environment this client was started with',
495
512
  'model.identity.lane.settingsEnv': "this client's settings file",
496
513
  'model.identity.lane.modelCatalogFile': 'the local model catalog file',
@@ -499,6 +516,37 @@ const EN = {
499
516
  'model.identity.routeGap.fact.endpointMissing': 'the model rides the OpenAI-compatible route and no gateway address (MODEL_GATEWAY_BASEURL) is set, and the engine refuses to start without one',
500
517
  'model.identity.routeGap.fact.laneCredentialMissing': 'the anthropic channel is selected (MODEL_PROVIDER=anthropic), neither ANTHROPIC_API_KEY nor ANTHROPIC_AUTH_TOKEN is set, and there is no gateway address (MODEL_GATEWAY_BASEURL) to fall back to, so the engine cannot start on any route',
501
518
  'model.identity.routeGap.sentence': '{lane} supplies a model name, but the local engine has no route to reach it — {fact}',
519
+ 'model.identity.catalogAdoption.refused': '{lane} lists models, but the engine is reported to refuse this catalog as written, so none of them can serve as its default',
520
+ 'model.identity.catalogAdoption.notResolvable': 'no model name is configured for the local engine to start with — {clause}, and the engine does not start without one',
521
+ 'model.identity.catalogAdoption.notResolvableWithPartial': 'no model name is configured for the local engine to start with — {clause}, and {partial}, and the engine does not start without one',
522
+ 'notice.injectionLane.sentence': "On this engine's {lane} lane the tools run on a different machine than the engine, so the {items} sent with a task run there rather than on this machine — any that rely on programs or credentials on this machine will fail there",
523
+ 'notice.injectionLane.item.stdioMcp': 'local stdio MCP servers',
524
+ 'notice.injectionLane.item.credentialedMcp': 'MCP servers that use credentials from this machine',
525
+ 'notice.injectionLane.item.taskHooks': 'hooks',
526
+ 'notice.injectionLane.itemSeparator': ', ',
527
+ 'rules.refusal.sentence.one': 'permissions: 1 rule will not be enforced — {list}',
528
+ 'rules.refusal.sentence.other': 'permissions: {count} rules will not be enforced — {list}',
529
+ 'rules.refusal.item': '{rule} ({reason})',
530
+ 'rules.refusal.itemSeparator': '; ',
531
+ 'rules.refusal.list.more': '{shown} and {count} more',
532
+ 'rules.refusal.reason.toolName': 'its tool name is not one this engine recognizes',
533
+ 'rules.refusal.reason.homePath': 'it uses a ~/ path this engine cannot anchor — write the path relative to the project or as an absolute path',
534
+ 'config.agentsWire.refusedServer.sentence': 'agents wire: {who}: its tools entry {entry} names a tool of the MCP server {server}, which {cause} — sent as written; this entry gives the agent nothing while that server stays out of the run. {way}',
535
+ 'config.agentsWire.refusedServer.cause.rejected': 'was declined for this project and so is left out of this run',
536
+ 'config.agentsWire.refusedServer.cause.notApproved': 'is not approved for this project and so is left out of this run',
537
+ 'config.agentsWire.refusedServer.cause.disabled': 'is switched off in the MCP settings and so is left out of this run',
538
+ 'config.agentsWire.refusedServer.cause.policyBlocked': 'is blocked by a managed policy list and so is left out of this run',
539
+ 'config.agentsWire.refusedServer.cause.pluginOnly': 'is not allowed because a managed policy restricts MCP servers to plugins, so it is left out of this run',
540
+ 'config.agentsWire.refusedServer.cause.malformedConfig': 'has a configuration the engine would refuse, so it is left out of this run',
541
+ 'config.agentsWire.refusedServer.cause.unknown': 'is left out of this run',
542
+ 'config.agentsWire.refusedServer.way.rejected': 'To give the agent those tools, approve the server for this project again; otherwise remove the entry from the agent definition.',
543
+ 'config.agentsWire.refusedServer.way.notApproved': 'To give the agent those tools, approve the server for this project; otherwise remove the entry from the agent definition.',
544
+ 'config.agentsWire.refusedServer.way.disabled': 'To give the agent those tools, switch the server back on; otherwise remove the entry from the agent definition.',
545
+ 'config.agentsWire.refusedServer.way.policyBlocked': 'Ask whoever manages the policy list to allow the server; otherwise remove the entry from the agent definition.',
546
+ 'config.agentsWire.refusedServer.way.pluginOnly': 'Ask whoever manages the policy to allow the server, or provide it through a plugin; otherwise remove the entry from the agent definition.',
547
+ 'config.agentsWire.refusedServer.way.malformedConfig': 'Fix the server configuration; otherwise remove the entry from the agent definition.',
548
+ 'config.agentsWire.refusedServer.way.unknown': 'Check why the server is left out; otherwise remove the entry from the agent definition.',
549
+ 'config.agentsWire.toolEntry.sentence': 'agents wire: {who}: its tools entry {phrase} — sent as written; the engine judges this entry by its own tool list: an engine that refuses such an entry does not start the run (code config.agent.unknown_tool), and an engine that accepts it gives the agent no tool for this entry unless this run has a tool with exactly that name. Fix the entry in the agent definition.',
502
550
  'config.hooks.valueShape.nothing': 'nothing',
503
551
  'config.hooks.valueShape.null': 'null',
504
552
  'config.hooks.valueShape.array': 'an array',
@@ -697,5 +745,88 @@ const EN = {
697
745
  'notice.failure.settings.riskJoin': ', ',
698
746
  'notice.failure.wait.one': 'The server asked to retry after 1 second (Retry-After).',
699
747
  'notice.failure.wait.other': 'The server asked to retry after {seconds} seconds (Retry-After).',
748
+ 'rules.issue.emptyTool': 'this rule is invalid: it names no tool',
749
+ 'rules.issue.paren': 'this rule is invalid: its parentheses do not parse (escape a literal one as \\( or \\))',
750
+ 'rules.issue.toolName': "this rule is invalid: its tool name is not spelled as a tool name (blanks around the rule, an invisible or disallowed character in the name or before the parenthesis, a leading '-', or the wildcard '*', which names no tool), so it would reach no tool or the wrong one",
751
+ 'rules.issue.paramSplit': 'this rule is invalid: its parentheses do not hold a parameter rule written name:pattern',
752
+ 'rules.issue.primaryField': "this rule is invalid: it patterns the tool's primary field, which matches the whole trimmed string rather than a prefix",
753
+ 'rules.issue.capExceeded': 'this rule set is invalid: it is over one of the deployment caps (rule count, rule length, pattern length, or star count); this client cannot tell which from the code alone',
754
+ 'rules.issue.behavior': 'this rule is invalid: its behavior is neither deny nor ask, so it would never fire',
755
+ 'rules.issue.commandRule': 'this rule is invalid: the command pattern was rejected by the command-rule validator',
756
+ 'rules.issue.entryType': 'this allow list is invalid: it must be a list of rule strings, and it or one of its entries is not a string',
757
+ 'rules.issue.allowRule': 'an allow rule is not supported in a rule set that only says deny or ask — a standing approval belongs on the allow list instead',
758
+ 'rules.issue.paramUnknown': 'this parameter rule is not supported: the tool carries no such parameter, so it could never match',
759
+ 'rules.issue.paramNonScalar': 'this parameter rule is not supported: that parameter holds an object or an array, so it could never match',
760
+ 'rules.issue.toolUnknown': "this rule is not supported on this leg: the resolver it supplied does not know the tool, so the rule's face cannot be checked",
761
+ 'rules.issue.pathBase': 'this path rule is not supported as spelled: the base it is relative to is missing or is not a usable absolute path, so it would reach nothing and is refused rather than compiled',
762
+ 'rules.issue.mcpParen': 'a parenthesised parameter rule is not supported on an MCP tool name',
763
+ 'rules.issue.coveringParen': 'a parenthesised parameter rule is not supported on a covering protocol name — the parameter grammar is keyed by an exact tool name, so no mounted tool could ever bear it',
764
+ 'rules.issue.paramSplitWithColon': 'this rule is invalid: a parameter rule is written name:pattern, and the name before the colon or the pattern after it is empty',
765
+ 'rules.issue.paramSplitNoColon': 'this rule is invalid: there is no colon inside the parentheses, so this is not a parameter rule (a parameter rule is written name:pattern)',
766
+ 'rules.issue.newerCode': 'this rule was refused with {code}, a code newer than this client',
767
+ 'model.probe.verdict.ok': 'The model answered',
768
+ 'model.probe.verdict.okWaited': 'The model answered — first token after {time}',
769
+ 'model.probe.verdict.auth': 'The model service rejected the API key{http}',
770
+ 'model.probe.verdict.unreachable': 'Could not reach the model service',
771
+ 'model.probe.verdict.unreachableWaited': 'Could not reach the model service — no response within {time}',
772
+ 'model.probe.verdict.model': 'The model service does not recognise this model id{http}',
773
+ 'model.probe.verdict.shape': 'This address does not offer the expected interface{http} — check the API shape',
774
+ 'model.probe.verdict.busy': 'The model service is busy right now{http} — retry later or switch model',
775
+ 'model.probe.verdict.noToken': 'The model service answered but sent no token — it may be overloaded',
776
+ 'model.probe.verdict.noTokenWaited': 'The model service answered but sent no token within {time} — it may be overloaded',
777
+ 'model.probe.verdict.other': 'The model service gave an unexpected answer{http}',
778
+ 'session.humanTurn.imageUnknownVision.one': "An @-mentioned image was sent with this message, although the engine's model list does not say whether the model this message uses accepts image input — if it does not, the images may be dropped or the message may be refused",
779
+ 'session.humanTurn.imageUnknownVision.other': "{count} @-mentioned images were sent with this message, although the engine's model list does not say whether the model this message uses accepts image input — if it does not, the images may be dropped or the message may be refused",
780
+ 'config.scenarioRefusal.source.ruling': ', assigned to you by the configuration center,',
781
+ 'config.scenarioRefusal.source.deployment': ", this deployment's default scenario,",
782
+ 'config.scenarioRefusal.dangling': "This deployment cannot resolve your scenario: the scenario{name}{from} does not exist here, so it refuses whatever depends on your scenario — new runs that do not name a scenario, and this session's list of MCP servers · Ask whoever operates the engine to fix the scenario assignment",
783
+ 'config.scenarioRefusal.generic': "This deployment's scenario check refused to resolve your scenario{tail}, so whatever depends on your scenario is not available — this session's list of MCP servers is unknown",
784
+ 'notice.wireRefusal.cancel.approvalSettled': 'The cancel did not apply: the approval this task was waiting on has already been decided or has expired elsewhere · Check what that decision did to the task before doing anything else',
785
+ 'notice.wireRefusal.cancel.runNotRunning': 'The cancel could not be set: the task kept switching between running and waiting while the engine tried · Nothing was changed — send the cancel again',
786
+ 'notice.wireRefusal.cancel.unrecognized': 'The engine refused this cancel with a conflict it did not explain · The task may have just been decided elsewhere, or may have changed state mid-cancel — check its current state, then cancel again if it is still active',
787
+ 'notice.wireRefusal.sendAgainAbout': 'Send it again in about {wait}',
788
+ 'notice.wireRefusal.usageWindow.head': "The deployment's usage window is exhausted, so the engine did not accept this request · Nothing is wrong with the request itself",
789
+ 'notice.wireRefusal.usageWindow.unknownWait': 'The engine did not say how long the window needs — send it again a little later',
790
+ 'notice.wireRefusal.fleetLease.head': 'This deployment could not confirm your usage budget with its quota service, and it refuses billed work while it cannot check, so the engine did not accept this request · Nothing is wrong with the request itself',
791
+ 'notice.wireRefusal.fleetLease.authRejected': "The quota service rejected this engine's credentials — if this keeps happening, whoever operates the engine needs to fix them",
792
+ 'notice.wireRefusal.fleetLease.unreachable': 'The engine could not reach the quota service',
793
+ 'notice.wireRefusal.fleetLease.unknownWait': 'The engine did not say how long to wait — send it again a little later',
794
+ 'notice.wireRefusal.denyAttribution.notInProof': 'The engine refused this refusal before judging it: this deployment signs the decisions it accepts, and the note saying who settled this one is not part of what gets signed · Nothing was decided and the approval is still waiting — send the same decision again without that note',
795
+ 'notice.wireRefusal.denyAttribution.decisionConflict': 'The engine refused this decision before judging it: the body says a policy settled it and also asks to allow the call, and only a person can allow one · Nothing was decided and the approval is still waiting — send it again with the decision and the note in agreement',
796
+ 'notice.wireRefusal.denyAttribution.retiredKey': 'The engine refused this decision before judging it: the note saying who settled it was sent under a name this engine no longer accepts · Nothing was decided and the approval is still waiting — send the decision again with who made it given under the name the engine now takes in its place',
797
+ 'notice.wireRefusal.denyAttribution.attributionRejected': 'The engine would not accept the settlement details this decision carried, so it refused the decision before judging it.{named} · Nothing was decided and the approval is still waiting at the same coordinates — check what that part carried (the only piece this client sets is the note saying who settled the refusal) and decide once more',
798
+ 'notice.wireRefusal.denyAttribution.named': ' It named {field} as the part it would not take.',
799
+ 'notice.wireRefusal.sessionDelete.unrecognized': 'The engine refused to delete this session with a conflict it did not explain · Check whether the session is still listed and whether anything of it is still running, then try the delete again',
800
+ 'notice.wireRefusal.sessionDelete.childrenAlive': 'This session was not deleted: background agents it started are still running where this engine cannot stop them{which} · Nothing was deleted — delete it again once they finish, or stop them where they run first',
801
+ 'notice.wireRefusal.sessionDelete.which': ' ({ids})',
802
+ 'notice.wireRefusal.sessionDelete.whichMore': ' ({ids} and {count} more)',
803
+ 'notice.wireRefusal.sessionDelete.activeRun': 'This session was not deleted: it still has a run in progress{run} · Nothing was deleted — cancel that run or let it finish, then delete the session again',
804
+ 'notice.wireRefusal.sessionDelete.runId': ' (run {id})',
805
+ 'notice.wireRefusal.bucket.unknown': "The engine refused the permission rules in this request's settings as too many or malformed · Nothing was trimmed or dropped — fix the rule lists, then send the request again",
806
+ 'notice.wireRefusal.bucket.subject.stored': 'The engine refused to continue this parked work: in the request stored for it,',
807
+ 'notice.wireRefusal.bucket.subject.fresh': 'The engine refused this request:',
808
+ 'notice.wireRefusal.bucket.list': 'the {bucket} rule list in the permission settings (permissions.{bucket})',
809
+ 'notice.wireRefusal.bucket.what.overCap.more': '{list} has {count} entries, {excess} more than the {cap} the engine accepts',
810
+ 'notice.wireRefusal.bucket.what.overCap.atMost': '{list} has {count} entries, and the engine accepts at most {cap}',
811
+ 'notice.wireRefusal.bucket.what.overCap.unknown': '{list} has more entries than the engine accepts',
812
+ 'notice.wireRefusal.bucket.what.badEntry.at': 'entry {position} of {list} is empty or not text',
813
+ 'notice.wireRefusal.bucket.what.badEntry.notList': '{list} is not a list of rules',
814
+ 'notice.wireRefusal.bucket.fix.merge': 'merge rules into broader patterns or remove some',
815
+ 'notice.wireRefusal.bucket.fix.entry': 'fix or remove that entry, so every entry is a non-empty rule',
816
+ 'notice.wireRefusal.bucket.fix.list': 'make it a list of non-empty rules',
817
+ 'notice.wireRefusal.bucket.next.stored': 'It cannot continue as stored, and the engine refuses the list rather than silently losing rules — {fix}, then submit the work again as a new request',
818
+ 'notice.wireRefusal.bucket.next.fresh': 'Nothing was trimmed or dropped, because the engine refuses the list rather than silently losing rules — {fix}, then send the request again',
819
+ 'notice.wireRefusal.toolDeclaration': "The engine refused to start this run because of a tool this request declares; the engine's own message says which tool and what is wrong with it · This is a problem with the request itself, not a temporary outage — sending the same request again is refused the same way; fix or remove that tool declaration, then send it",
820
+ 'notice.wireRefusal.hostPosture.notLocal': 'This is not a problem with your local settings and not something this client can grant — whoever runs this engine decides it',
821
+ 'notice.wireRefusal.hostPosture.wholeEnv': "The engine refused this request before anything ran: this deployment serves more than one user, so a request may not hand the shell this machine's whole environment · {notLocal}; send it again without the whole-environment setting (or with the default), and the shell gets the default environment, with credential-like variables removed",
822
+ 'notice.wireRefusal.hostPosture.writeFace': 'The engine refused this request before anything ran: this deployment does not let a request lift the write boundary with bypassPermissions · {notLocal}; send it again with another permission mode',
823
+ '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)",
824
+ '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",
825
+ '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',
826
+ 'notice.wireRefusal.userAttachment': 'This message was not sent: the engine refused the files attached to it — together with the message they are more than it can take in one request on this model, or one of them is in a form it does not accept · Nothing was started and your draft is kept · Remove some attachments or attach smaller parts, then send it again',
827
+ 'notice.wireRefusal.userInvokedSkill': 'The engine did not start this run: a skill named for it is not one this run has loaded, or skills are turned off for this run · Nothing was started and your draft is kept · Check the skill name, or load that skill, then send it again',
828
+ 'notice.retry.source.unifiedHeader': "Judged from the model service's quota headers",
829
+ 'notice.retry.source.providerCode': "Judged from the model service's error code",
830
+ 'notice.retry.source.status': 'Judged from the HTTP status alone',
700
831
  };
701
832
  export const EN_MESSAGES = Object.freeze(EN);