@sema-agent/client-core 0.105.0 → 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 (132) hide show
  1. package/CHANGELOG.md +220 -0
  2. package/README.md +26 -11
  3. package/dist/adapt/arms.js +10 -1
  4. package/dist/adapter/activeRunSelfHeal.d.ts +13 -2
  5. package/dist/adapter/activeRunSelfHeal.js +80 -7
  6. package/dist/adapter/downstream/eventToSdkMessage.d.ts +0 -5
  7. package/dist/adapter/downstream/eventToSdkMessage.js +20 -19
  8. package/dist/adapter/downstream/terminalToSdkResult.js +2 -3
  9. package/dist/adapter/downstream/wiringManifestView.d.ts +1 -3
  10. package/dist/adapter/downstream/wiringManifestView.js +0 -1
  11. package/dist/adapter/runStream.js +3 -4
  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/coreValuePorts.d.ts +12 -1
  21. package/dist/coreValuePorts.js +10 -0
  22. package/dist/decideFailureNote.js +3 -1
  23. package/dist/decideReceipt.d.ts +9 -0
  24. package/dist/decideReceipt.js +29 -1
  25. package/dist/declared/supportFloorDeclared.js +2 -2
  26. package/dist/deviceRebind.d.ts +7 -0
  27. package/dist/deviceRebind.js +39 -5
  28. package/dist/engineAddress.d.ts +3 -0
  29. package/dist/engineAddress.js +25 -0
  30. package/dist/engineDirectory.js +9 -17
  31. package/dist/engineErrorCodes.d.ts +8 -0
  32. package/dist/engineErrorCodes.js +8 -0
  33. package/dist/engineNoticeCodes.d.ts +26 -3
  34. package/dist/engineNoticeCodes.js +52 -7
  35. package/dist/engineRowRef.js +1 -1
  36. package/dist/errorSupplementRoles.js +2 -0
  37. package/dist/eventLeg.d.ts +2 -2
  38. package/dist/eventLeg.js +2 -1
  39. package/dist/fleet/fleetProjection.js +26 -5
  40. package/dist/generated/engineFactTables.d.ts +2 -1
  41. package/dist/generated/engineFactTables.js +3 -1
  42. package/dist/generated/engineNoticeTables.js +19 -4
  43. package/dist/generated/sdkFactTables.d.ts +3 -0
  44. package/dist/generated/sdkFactTables.js +15 -0
  45. package/dist/generated/settingsSchemaFns.d.ts +11 -0
  46. package/dist/generated/settingsSchemaFns.js +2 -1
  47. package/dist/generated/settingsSchemaSafetyMergeSpec.js +1 -1
  48. package/dist/generated/settingsSchemaSettingsSources.d.ts +1 -1
  49. package/dist/generated/settingsSchemaSettingsSources.js +22 -2
  50. package/dist/hitl/approvalLiveFace.d.ts +17 -0
  51. package/dist/hitl/approvalLiveFace.js +35 -0
  52. package/dist/hitl/approvalQueueRow.d.ts +21 -0
  53. package/dist/hitl/approvalQueueRow.js +69 -0
  54. package/dist/hitl/approvalsFeed.d.ts +5 -4
  55. package/dist/hitl/approvalsFeed.js +38 -6
  56. package/dist/hitl/askParkRowRouting.d.ts +4 -3
  57. package/dist/hitl/askParkRowRouting.js +15 -3
  58. package/dist/hitl/automaticAnswerVerdict.js +13 -10
  59. package/dist/hitl/crashConverged.d.ts +5 -1
  60. package/dist/hitl/decisionConflict.js +2 -1
  61. package/dist/hitl/decisionRefusal.js +1 -1
  62. package/dist/hitl/decisionSend.d.ts +1 -0
  63. package/dist/hitl/decisionSend.js +14 -2
  64. package/dist/hitl/frameRouter.js +4 -5
  65. package/dist/hitl/hitlBridge.d.ts +1 -1
  66. package/dist/hitl/hitlBridge.js +26 -5
  67. package/dist/hitl/livePendingAsk.d.ts +5 -0
  68. package/dist/hitl/livePendingAsk.js +6 -1
  69. package/dist/hitl/planReviewCard.d.ts +2 -0
  70. package/dist/hitl/planReviewCard.js +21 -0
  71. package/dist/hitl/planReviewWire.d.ts +2 -2
  72. package/dist/hitl/planReviewWire.js +101 -36
  73. package/dist/hitl/sessionAllowRoute.d.ts +2 -0
  74. package/dist/hitl/sessionAllowRoute.js +7 -0
  75. package/dist/hitl/sessionPolicyWire.d.ts +1 -7
  76. package/dist/hitl/sessionPolicyWire.js +3 -43
  77. package/dist/hitl/subagentSource.d.ts +1 -0
  78. package/dist/hitl/subagentSource.js +13 -0
  79. package/dist/hitl/toolApprovalWire.d.ts +3 -2
  80. package/dist/hitl/toolApprovalWire.js +79 -37
  81. package/dist/hostSettingsSource.d.ts +4 -1
  82. package/dist/hostSettingsSource.js +11 -6
  83. package/dist/hostTurnSettings.d.ts +4 -5
  84. package/dist/hostTurnSettings.js +80 -19
  85. package/dist/i18n/messages.en.d.ts +35 -12
  86. package/dist/i18n/messages.en.js +36 -13
  87. package/dist/i18n/messages.zh.js +38 -13
  88. package/dist/index.d.ts +21 -2
  89. package/dist/index.js +11 -2
  90. package/dist/liveInitToolFace.js +0 -1
  91. package/dist/liveModelCatalog.d.ts +15 -0
  92. package/dist/liveModelCatalog.js +40 -0
  93. package/dist/mcpWireCaps.js +1 -1
  94. package/dist/modelCapabilityProbe.js +66 -33
  95. package/dist/ownKey.d.ts +0 -1
  96. package/dist/ownKey.js +0 -2
  97. package/dist/permissionsDeclaration.d.ts +2 -2
  98. package/dist/permissionsDeclaration.js +12 -14
  99. package/dist/projectSeed.d.ts +39 -0
  100. package/dist/projectSeed.js +80 -0
  101. package/dist/promptDelivery.js +1 -1
  102. package/dist/replayBody.d.ts +7 -6
  103. package/dist/replayBody.js +62 -7
  104. package/dist/request/taskRequest.js +3 -4
  105. package/dist/ruleCompileVerdict.d.ts +0 -2
  106. package/dist/ruleCompileVerdict.js +0 -31
  107. package/dist/ruleRefusalSentence.js +0 -3
  108. package/dist/runReattachPolicy.d.ts +3 -0
  109. package/dist/runReattachPolicy.js +15 -2
  110. package/dist/runTerminal.js +30 -8
  111. package/dist/sandboxWire.d.ts +0 -3
  112. package/dist/sandboxWire.js +0 -9
  113. package/dist/seam.d.ts +14 -7
  114. package/dist/seam.js +12 -0
  115. package/dist/seatContract.d.ts +57 -7
  116. package/dist/seatContract.js +132 -3
  117. package/dist/serverSupportRange.d.ts +18 -0
  118. package/dist/serverSupportRange.js +25 -0
  119. package/dist/sessionEngine.d.ts +156 -0
  120. package/dist/sessionEngine.js +464 -0
  121. package/dist/sessionMap.d.ts +11 -1
  122. package/dist/sessionMap.js +35 -9
  123. package/dist/sessionMemorySync.d.ts +31 -0
  124. package/dist/sessionMemorySync.js +95 -0
  125. package/dist/sessionRowTag.d.ts +4 -0
  126. package/dist/sessionRowTag.js +18 -0
  127. package/dist/settingsLayerAdmission.d.ts +1 -0
  128. package/dist/settingsLayerAdmission.js +4 -1
  129. package/dist/toolResult.js +1 -1
  130. package/dist/wireRefusalCopy.js +2 -6
  131. package/docs/INTEGRATION-CLIENTS.md +1022 -16
  132. package/package.json +5 -5
@@ -7,6 +7,7 @@ import { guardedRead, ownDataField, ownDataRefusalKeyOf, ownSendableField, readO
7
7
  import { MCP_LIVENESS_STATES } from "./mcpLiveness.js";
8
8
  import { THINKING_LATCH_EVENTS, THINKING_LATCH_ROW_WORDS } from "./thinkingLatchWords.js";
9
9
  import { EXECUTION_PLACEMENT_ROLES } from "./executionPlacementWords.js";
10
+ import { isSessionEngineView } from "./sessionEngine.js";
10
11
  const bad = (reason, field) => field === undefined ? { reason } : { reason, field };
11
12
  const nested = (prefix, verdict) => {
12
13
  const path = verdict.field === undefined
@@ -295,6 +296,7 @@ const CHROME_ARM_SEAT_ROUTE = {
295
296
  plan_review_park: "host",
296
297
  approval_request: "host",
297
298
  approval_revoke: "host",
299
+ approval_complete: "host",
298
300
  task_ledger_sync: "host",
299
301
  inline_task_stats: "host",
300
302
  stream_delta: "host",
@@ -314,6 +316,7 @@ const CHROME_ARM_SEAT_ROUTE = {
314
316
  wiring_manifest: "host",
315
317
  suspended_reopened: "host",
316
318
  result_text_diverged: "host",
319
+ session_titled: "host",
317
320
  };
318
321
  const CHROME_EVENT_KIND_TUPLE = Object.keys(CHROME_ARM_SEAT_ROUTE).filter((k) => CHROME_ARM_SEAT_ROUTE[k] === "seat");
319
322
  export const CHROME_EVENT_KINDS = Object.freeze(CHROME_EVENT_KIND_TUPLE);
@@ -376,7 +379,7 @@ export function readSeatStreamDelta(message) {
376
379
  return Object.freeze({ kind: "malformed" });
377
380
  }
378
381
  }
379
- export const SEAT_CAPABILITY_NAMES = Object.freeze(["pickFolder", "rewind", "recents", "patchSession", "devices", "engineTarget", "onboard", "mcpToolToggles", "thinkingLatch"]);
382
+ export const SEAT_CAPABILITY_NAMES = Object.freeze(["pickFolder", "rewind", "recents", "patchSession", "devices", "engineTarget", "onboard", "mcpToolToggles", "thinkingLatch", "computerUseSwitch", "engineModeDefaultOnly"]);
380
383
  const notReported = () => Object.freeze({ kind: "not_reported" });
381
384
  const malformedReading = () => Object.freeze({ kind: "malformed" });
382
385
  const reported = (available) => Object.freeze({ kind: "reported", available });
@@ -453,6 +456,8 @@ const SEAT_CAPABILITY_PHRASES = Object.freeze({
453
456
  onboard: Object.freeze({ action: "Model setup", ability: "add models", support: "model-setup support" }),
454
457
  mcpToolToggles: Object.freeze({ action: "Per-tool switching", ability: "toggle tools", support: "per-tool switches" }),
455
458
  thinkingLatch: Object.freeze({ action: "Switching thinking", ability: "switch thinking", support: "thinking-switch support" }),
459
+ computerUseSwitch: Object.freeze({ action: "Computer use", ability: "be switched", support: "switch support" }),
460
+ engineModeDefaultOnly: Object.freeze({ action: "Default-only engine switching", ability: "keep existing sessions on their engine", support: "default-only engine switching" }),
456
461
  });
457
462
  export function seatCapabilityUnavailableDetail(name, reading) {
458
463
  const phrase = Object.hasOwn(SEAT_CAPABILITY_PHRASES, name)
@@ -886,6 +891,7 @@ const checkOnboardProvidersResult = seatShapeCheck(shapeRule("onboard providers"
886
891
  api: reqF(R_API_WORD),
887
892
  hasKey: reqF(R_BOOL),
888
893
  models: reqF(arrayRule(R_NONEMPTY)),
894
+ isCurrent: optF(R_BOOL),
889
895
  }))),
890
896
  }));
891
897
  const checkSessionMcpPanelFailure = seatShapeCheck(armsRule("readSessionMcpPanel failure", "kind", {
@@ -967,6 +973,95 @@ const MCP_TOOL_TOGGLE_KEY = shapeRule("toggle key", {
967
973
  });
968
974
  export const checkMcpToolToggleKey = seatShapeCheck(MCP_TOOL_TOGGLE_KEY);
969
975
  const checkMcpToolTogglesResult = seatShapeCheck(shapeRule("toggles result", { off: reqF(arrayRule(MCP_TOOL_TOGGLE_KEY)) }));
976
+ export const COMPUTER_USE_SOURCES = Object.freeze(["env", "settings", "default"]);
977
+ export const COMPUTER_USE_REFUSAL_REASONS = Object.freeze(["locked-by-env", "confirmation-required", "invalid-request", "write-failed"]);
978
+ export const COMPUTER_USE_APPLIES_ON = Object.freeze(["next-engine-start"]);
979
+ const SET_COMPUTER_USE_REQUEST_KEYS = Object.freeze(["enabled", "confirmed"]);
980
+ const COMPUTER_USE_STATE_SHAPE = shapeRule("computer-use state", {
981
+ enabled: reqF(R_BOOL),
982
+ source: reqF(oneOfRule("computer-use source", COMPUTER_USE_SOURCES)),
983
+ lockedByEnv: reqF(R_BOOL),
984
+ appliesOn: reqF(oneOfRule("computer-use appliesOn", COMPUTER_USE_APPLIES_ON)),
985
+ });
986
+ const COMPUTER_USE_STATE = {
987
+ label: COMPUTER_USE_STATE_SHAPE.label,
988
+ test: (v, path) => {
989
+ const verdict = COMPUTER_USE_STATE_SHAPE.test(v, path);
990
+ if (verdict !== true)
991
+ return verdict;
992
+ const rec = v;
993
+ return own(rec, "lockedByEnv") === true && own(rec, "source") !== "env" ? bad("lock conflict", pathAt(path, "lockedByEnv")) : true;
994
+ },
995
+ };
996
+ const checkComputerUseState = seatShapeCheck(COMPUTER_USE_STATE);
997
+ const SET_COMPUTER_USE_RESULT = okArmsRule("setComputerUse result", { changed: reqF(R_BOOL), state: reqF(COMPUTER_USE_STATE) }, {
998
+ reason: reqF(oneOfRule("computer-use refusal", COMPUTER_USE_REFUSAL_REASONS)),
999
+ state: reqF(COMPUTER_USE_STATE),
1000
+ });
1001
+ const checkSetComputerUseResult = seatShapeCheck({
1002
+ label: SET_COMPUTER_USE_RESULT.label,
1003
+ test: (v, path) => {
1004
+ const verdict = SET_COMPUTER_USE_RESULT.test(v, path);
1005
+ if (verdict !== true)
1006
+ return verdict;
1007
+ const rec = v;
1008
+ if (own(rec, "reason") === "locked-by-env" && own(own(rec, "state"), "lockedByEnv") !== true)
1009
+ return bad("lock conflict", pathAt(path, "state.lockedByEnv"));
1010
+ return true;
1011
+ },
1012
+ });
1013
+ const failureOfRule = (rule, v, path) => {
1014
+ const verdict = rule.test(v, path);
1015
+ return verdict === true ? bad("bad value", path) : verdict;
1016
+ };
1017
+ const computerUseIntentOf = (v) => {
1018
+ const invalid = (failure) => ({ kind: "invalid", failure });
1019
+ if (!isPlainRecord(v))
1020
+ return invalid(bad("not object"));
1021
+ const snap = new Map();
1022
+ for (const k of Reflect.ownKeys(v))
1023
+ if (typeof k === "string")
1024
+ snap.set(k, own(v, k));
1025
+ for (const k of snap.keys())
1026
+ if (!inTuple(SET_COMPUTER_USE_REQUEST_KEYS, k))
1027
+ return invalid(bad("unknown key", k));
1028
+ const enabled = snap.get("enabled");
1029
+ if (enabled === undefined)
1030
+ return invalid(bad("missing key", "enabled"));
1031
+ if (typeof enabled !== "boolean")
1032
+ return invalid(failureOfRule(R_BOOL, enabled, "enabled"));
1033
+ if (!enabled)
1034
+ return snap.has("confirmed") ? invalid(bad("unknown key", "confirmed")) : { kind: "disable" };
1035
+ const confirmed = snap.get("confirmed");
1036
+ if (confirmed === true)
1037
+ return { kind: "enable" };
1038
+ if (confirmed === undefined)
1039
+ return { kind: "unconfirmed", failure: bad("missing key", "confirmed") };
1040
+ if (confirmed === false)
1041
+ return { kind: "unconfirmed", failure: failureOfRule(R_TRUE, confirmed, "confirmed") };
1042
+ return invalid(failureOfRule(R_BOOL, confirmed, "confirmed"));
1043
+ };
1044
+ export const checkSetComputerUseRequest = seatCheck((v) => {
1045
+ const intent = computerUseIntentOf(v);
1046
+ return intent.kind === "disable" || intent.kind === "enable" ? true : intent.failure;
1047
+ });
1048
+ export function planSetComputerUse(request, lockedByEnv) {
1049
+ let intent;
1050
+ try {
1051
+ const at = firstAccessorPath(request);
1052
+ intent = at !== undefined ? { kind: "invalid", failure: bad(NOT_PLAIN_DATA, at) } : computerUseIntentOf(request);
1053
+ }
1054
+ catch {
1055
+ intent = { kind: "invalid", failure: bad("unreadable") };
1056
+ }
1057
+ if (intent.kind === "invalid")
1058
+ return Object.freeze({ kind: "refused", reason: "invalid-request" });
1059
+ if (lockedByEnv !== false)
1060
+ return Object.freeze({ kind: "refused", reason: "locked-by-env" });
1061
+ if (intent.kind === "unconfirmed")
1062
+ return Object.freeze({ kind: "refused", reason: "confirmation-required" });
1063
+ return Object.freeze({ kind: "apply", enabled: intent.kind === "enable" });
1064
+ }
970
1065
  const checkLocalSessionRecord = seatCheck((s) => {
971
1066
  if (!isPlainRecord(s))
972
1067
  return bad("session record is not a plain object");
@@ -1006,12 +1101,28 @@ const checkLocalSessionRecord = seatCheck((s) => {
1006
1101
  if (!isAbsent(rowTag) && (typeof rowTag !== "string" || rowTag.length === 0)) {
1007
1102
  return bad("rowTag must be a non-empty string when present (absent = this row cannot be written conditionally)", "rowTag");
1008
1103
  }
1104
+ const unreadable = own(s, "unreadable");
1105
+ if (!isAbsent(unreadable)) {
1106
+ if (!isPlainRecord(unreadable))
1107
+ return bad("unreadable must be a plain object when present (absent = the list did not report this session as unreadable)", "unreadable");
1108
+ const code = own(unreadable, "errorCode");
1109
+ if (!isAbsent(code) && (typeof code !== "string" || code.length === 0))
1110
+ return bad("unreadable.errorCode must be a non-empty string when present", "unreadable.errorCode");
1111
+ }
1009
1112
  const latch = own(s, "thinkingLatch");
1010
1113
  if (!isAbsent(latch)) {
1011
1114
  const verdict = R_THINKING_LATCH_ROW.test(latch, "thinkingLatch");
1012
1115
  if (verdict !== true)
1013
1116
  return verdict;
1014
1117
  }
1118
+ const engine = own(s, "engine");
1119
+ if (!isAbsent(engine) && !isSessionEngineView(engine)) {
1120
+ return bad("engine must be a session engine reading (kind local|cloud + identityKind + identity{key, presentation} as the package mints it) when present (absent = the engine is not known)", "engine");
1121
+ }
1122
+ const lane = own(s, "executionLane");
1123
+ if (!isAbsent(lane) && (typeof lane !== "string" || lane.length === 0)) {
1124
+ return bad("executionLane must be a non-empty string when present (absent = no writer lane reading)", "executionLane");
1125
+ }
1015
1126
  return true;
1016
1127
  });
1017
1128
  export function isLocalSessionRecord(s) {
@@ -1667,6 +1778,8 @@ export const LOCAL_SESSIONS_SPEC = {
1667
1778
  listMcpToolToggles: { kind: "invoke", check: checkMcpToolTogglesResult },
1668
1779
  setMcpToolToggle: { kind: "invoke", check: checkOkAck },
1669
1780
  setThinkingLatch: { kind: "invoke", check: checkOkAck },
1781
+ getComputerUse: { kind: "invoke", check: checkComputerUseState },
1782
+ setComputerUse: { kind: "invoke", check: checkSetComputerUseResult },
1670
1783
  onEvent: { kind: "event", check: checkLocalSessionEvent },
1671
1784
  onToolPermissionRequest: { kind: "event", check: checkToolPermissionRequest },
1672
1785
  },
@@ -1715,6 +1828,8 @@ export const SEAT_METHOD_NAMES = [
1715
1828
  "listMcpToolToggles",
1716
1829
  "setMcpToolToggle",
1717
1830
  "setThinkingLatch",
1831
+ "getComputerUse",
1832
+ "setComputerUse",
1718
1833
  "onEvent",
1719
1834
  "onToolPermissionRequest",
1720
1835
  ];
@@ -1774,7 +1889,10 @@ export const LOCAL_SESSION_RECORD_KEYS = [
1774
1889
  "parked",
1775
1890
  "pinned",
1776
1891
  "rowTag",
1892
+ "unreadable",
1777
1893
  "thinkingLatch",
1894
+ "engine",
1895
+ "executionLane",
1778
1896
  ];
1779
1897
  export const SEND_MESSAGE_REQUEST_KEYS = [
1780
1898
  "sessionId",
@@ -1819,7 +1937,7 @@ export const SEAT_VALIDATOR_KEY_COVERAGE = {
1819
1937
  LocalSessionRecord: {
1820
1938
  guard: "isLocalSessionRecord",
1821
1939
  check: checkLocalSessionRecord,
1822
- validated: ["sessionId", "engineSessionId", "model", "title", "cwd", "isRunning", "createdAt", "lastActivityAt", "queuedMessages", "parked", "pinned", "rowTag", "thinkingLatch"],
1940
+ validated: ["sessionId", "engineSessionId", "model", "title", "cwd", "isRunning", "createdAt", "lastActivityAt", "queuedMessages", "parked", "pinned", "rowTag", "unreadable", "thinkingLatch", "engine", "executionLane"],
1823
1941
  unchecked: [],
1824
1942
  },
1825
1943
  ToolPermissionRequest: {
@@ -1915,6 +2033,10 @@ export const SEAT_VALIDATOR_KEY_COVERAGE = {
1915
2033
  key: "candidateRejected",
1916
2034
  why: "诊断面(0.97.0 CC-715;当前配置是候选被整拒后回落的那一份),三态读法归 modelCandidateRejectedOf(含坏形 unreadable);出站门为它拒掉整份目录 = 选单为一行诊断整个消失。",
1917
2035
  },
2036
+ {
2037
+ key: "modelPlane",
2038
+ why: "诊断面(0.106.0 CC-1156;这台引擎服务的是哪张模型表 / 最近一份目录候选的结局),三态读法归 modelPlaneOf(含坏形 unreadable、表外词整位不给);出站门为它拒掉整份目录 = 选单为一行诊断整个消失。",
2039
+ },
1918
2040
  ],
1919
2041
  },
1920
2042
  SendMessageRequest: {
@@ -2002,7 +2124,7 @@ export const SEAT_VALIDATOR_KEY_COVERAGE = {
2002
2124
  },
2003
2125
  SeatCapabilitiesState: {
2004
2126
  check: checkSeatCapabilitiesState,
2005
- validated: ["pickFolder", "rewind", "recents", "patchSession", "devices", "engineTarget", "onboard", "mcpToolToggles", "thinkingLatch"],
2127
+ validated: ["pickFolder", "rewind", "recents", "patchSession", "devices", "engineTarget", "onboard", "mcpToolToggles", "thinkingLatch", "computerUseSwitch", "engineModeDefaultOnly"],
2006
2128
  unchecked: [],
2007
2129
  },
2008
2130
  RecentFoldersResult: {
@@ -2065,6 +2187,9 @@ export const SEAT_VALIDATOR_COVERAGE_EXEMPT = [
2065
2187
  ["OnboardApplyRequest", checkOnboardApplyRequest],
2066
2188
  ["McpToolTogglesResult", checkMcpToolTogglesResult],
2067
2189
  ["McpToolToggleKey", checkMcpToolToggleKey],
2190
+ ["ComputerUseState", checkComputerUseState],
2191
+ ["SetComputerUseResult", checkSetComputerUseResult],
2192
+ ["SetComputerUseRequest", checkSetComputerUseRequest],
2068
2193
  ].map(([label, check]) => ({
2069
2194
  label,
2070
2195
  check,
@@ -2120,5 +2245,9 @@ const _seatContractPins = [
2120
2245
  true, true, true, true, true, true,
2121
2246
  true, true, true,
2122
2247
  true, true,
2248
+ true, true, true,
2249
+ true, true,
2250
+ true, true, true, true,
2251
+ true, true,
2123
2252
  ];
2124
2253
  void _seatContractPins;
@@ -0,0 +1,18 @@
1
+ import type { UiLanguage } from './env/uiLanguage.js';
2
+ export declare const SERVER_SUPPORT_RANGE_REASONS: readonly ["below_floor", "version_absent", "version_unreadable"];
3
+ export type ServerSupportRangeReason = (typeof SERVER_SUPPORT_RANGE_REASONS)[number];
4
+ export type ServerSupportRangeVerdict = {
5
+ readonly kind: 'in_range';
6
+ readonly floor: string;
7
+ } | {
8
+ readonly kind: 'out_of_range';
9
+ readonly reason: 'below_floor';
10
+ readonly version: string;
11
+ readonly floor: string;
12
+ } | {
13
+ readonly kind: 'unknown';
14
+ readonly reason: 'version_absent' | 'version_unreadable';
15
+ readonly floor: string;
16
+ };
17
+ export declare function serverSupportRangeVerdict(version: string | undefined): ServerSupportRangeVerdict;
18
+ export declare function serverSupportRangeSentence(verdict: ServerSupportRangeVerdict, lang?: UiLanguage): string | undefined;
@@ -0,0 +1,25 @@
1
+ import { engineSupportFloorEffective, engineVersionTier } from './supportFloor.js';
2
+ import { msg, renderMessage } from './i18n/translate.js';
3
+ export const SERVER_SUPPORT_RANGE_REASONS = Object.freeze(['below_floor', 'version_absent', 'version_unreadable']);
4
+ export function serverSupportRangeVerdict(version) {
5
+ const floor = engineSupportFloorEffective();
6
+ const tier = engineVersionTier(version);
7
+ if (tier === 'engine')
8
+ return Object.freeze({ kind: 'in_range', floor });
9
+ if (tier === 'legacy')
10
+ return Object.freeze({ kind: 'out_of_range', reason: 'below_floor', version: version, floor });
11
+ return Object.freeze({ kind: 'unknown', reason: version === undefined ? 'version_absent' : 'version_unreadable', floor });
12
+ }
13
+ export function serverSupportRangeSentence(verdict, lang) {
14
+ try {
15
+ if (typeof verdict !== 'object' || verdict === null || verdict.kind !== 'out_of_range')
16
+ return undefined;
17
+ const again = serverSupportRangeVerdict(verdict.version);
18
+ if (again.kind !== 'out_of_range')
19
+ return undefined;
20
+ return renderMessage(msg('config.engineTarget.serverBelowSupportFloor', { version: again.version, floor: again.floor }), lang);
21
+ }
22
+ catch {
23
+ return undefined;
24
+ }
25
+ }
@@ -0,0 +1,156 @@
1
+ import type { EngineRowReading } from './engineDirectory.js';
2
+ import type { EngineTargetCloudAuth } from './seatContract.js';
3
+ import { type SessionMapRecord, type SessionMapStorePort } from './sessionMap.js';
4
+ import { type MessageRef } from './i18n/translate.js';
5
+ export type SessionEngineKind = 'local' | 'cloud';
6
+ export type SessionEngineIdentityKind = 'self' | 'declared' | 'address';
7
+ export type SessionEngineBindingInput = {
8
+ readonly role: 'self';
9
+ } | SessionEngineRowInput | {
10
+ readonly role: 'external';
11
+ readonly address: string;
12
+ };
13
+ export interface SessionEngineRowInput {
14
+ readonly role: 'external';
15
+ readonly row: EngineRowReading;
16
+ readonly center: string;
17
+ }
18
+ export type SessionEngineBindingFailure = 'row-incomplete' | 'center-invalid' | 'address-invalid' | 'input-invalid';
19
+ export type SessionEngineSelfPresentation = Readonly<Record<string, never>>;
20
+ export interface SessionEngineDeclaredPresentation {
21
+ readonly center: string;
22
+ readonly scope: string;
23
+ readonly name: string;
24
+ }
25
+ export interface SessionEngineAddressPresentation {
26
+ readonly address: string;
27
+ }
28
+ export type SessionEngineBindingOk = SessionEngineSelfBinding | SessionEngineDeclaredBinding | SessionEngineAddressBinding;
29
+ export interface SessionEngineSelfBinding {
30
+ readonly ok: true;
31
+ readonly identityKind: 'self';
32
+ readonly key: string;
33
+ readonly presentation: SessionEngineSelfPresentation;
34
+ }
35
+ export interface SessionEngineDeclaredBinding {
36
+ readonly ok: true;
37
+ readonly identityKind: 'declared';
38
+ readonly key: string;
39
+ readonly presentation: SessionEngineDeclaredPresentation;
40
+ readonly connect: {
41
+ readonly viaCenter: string;
42
+ };
43
+ }
44
+ export interface SessionEngineAddressBinding {
45
+ readonly ok: true;
46
+ readonly identityKind: 'address';
47
+ readonly key: string;
48
+ readonly presentation: SessionEngineAddressPresentation;
49
+ readonly connect: {
50
+ readonly url: string;
51
+ };
52
+ }
53
+ export type SessionEngineBinding = SessionEngineBindingOk | {
54
+ readonly ok: false;
55
+ readonly reason: SessionEngineBindingFailure;
56
+ };
57
+ export interface SessionEngineAssignment {
58
+ readonly kind: SessionEngineKind;
59
+ readonly identity: SessionEngineBindingOk;
60
+ }
61
+ export type SessionEngineView = SessionEngineSelfView | SessionEngineDeclaredView | SessionEngineAddressView;
62
+ export interface SessionEngineSelfView {
63
+ readonly kind: SessionEngineKind;
64
+ readonly identityKind: 'self';
65
+ readonly identity: {
66
+ readonly key: string;
67
+ readonly presentation: SessionEngineSelfPresentation;
68
+ };
69
+ }
70
+ export interface SessionEngineDeclaredView {
71
+ readonly kind: SessionEngineKind;
72
+ readonly identityKind: 'declared';
73
+ readonly identity: {
74
+ readonly key: string;
75
+ readonly presentation: SessionEngineDeclaredPresentation;
76
+ };
77
+ }
78
+ export interface SessionEngineAddressView {
79
+ readonly kind: SessionEngineKind;
80
+ readonly identityKind: 'address';
81
+ readonly identity: {
82
+ readonly key: string;
83
+ readonly presentation: SessionEngineAddressPresentation;
84
+ };
85
+ }
86
+ export type SessionEngineReading = SessionEngineBoundReading | {
87
+ readonly kind: 'legacy';
88
+ } | {
89
+ readonly kind: 'unresolved';
90
+ } | {
91
+ readonly kind: 'none';
92
+ };
93
+ export interface SessionEngineBoundReading {
94
+ readonly kind: 'bound';
95
+ readonly binding: SessionEngineAssignment;
96
+ readonly engine: SessionEngineView;
97
+ readonly uuid: string;
98
+ }
99
+ export interface SessionEngineSessionRef {
100
+ readonly shellSessionId: string;
101
+ readonly uuid: string;
102
+ }
103
+ export type SessionEngineCommitRequest = {
104
+ readonly arm: 'create';
105
+ readonly binding: SessionEngineAssignment;
106
+ } | {
107
+ readonly arm: 'resume';
108
+ readonly binding: SessionEngineAssignment;
109
+ } | SessionEngineRecoverRequest;
110
+ export interface SessionEngineRecoverRequest {
111
+ readonly arm: 'recover';
112
+ readonly binding: SessionEngineAssignment;
113
+ readonly chosenByUser?: true;
114
+ }
115
+ export type SessionEngineUnresolvedReason = 'request-invalid' | 'record-mismatch' | 'record-legacy' | 'record-unbound' | 'record-unreadable' | 'recover-unproven';
116
+ export type SessionEngineCommitResult = SessionEngineCommitted | {
117
+ readonly kind: 'conflict';
118
+ readonly bound: SessionEngineView;
119
+ } | {
120
+ readonly kind: 'unresolved';
121
+ readonly reason: SessionEngineUnresolvedReason;
122
+ } | {
123
+ readonly kind: 'store-failed';
124
+ };
125
+ export interface SessionEngineCommitted {
126
+ readonly kind: 'committed';
127
+ readonly engine: SessionEngineView;
128
+ readonly notice?: MessageRef;
129
+ }
130
+ export interface SessionEngineWiring {
131
+ readonly id: string;
132
+ readonly selfSpawned: boolean;
133
+ readonly wiredAddresses: readonly string[];
134
+ readonly auth: EngineTargetCloudAuth | undefined;
135
+ readonly explicitAddresses?: readonly string[];
136
+ }
137
+ export type SessionDispatchRefusal = 'not-wired' | 'scope-mismatch' | 'scope-unproven' | 'unresolved';
138
+ export type SessionDispatchDecision = {
139
+ readonly kind: 'self';
140
+ readonly wiringSnapshotId: string;
141
+ } | SessionDispatchUrlTarget | SessionDispatchRefused;
142
+ export interface SessionDispatchUrlTarget {
143
+ readonly kind: 'address' | 'center';
144
+ readonly url: string;
145
+ readonly wiringSnapshotId: string;
146
+ }
147
+ export interface SessionDispatchRefused {
148
+ readonly kind: 'refused';
149
+ readonly refusal: SessionDispatchRefusal;
150
+ readonly message: MessageRef;
151
+ }
152
+ export declare function sessionEngineBindingFor(input: SessionEngineBindingInput): SessionEngineBinding;
153
+ export declare function isSessionEngineView(v: {} | null | undefined): boolean;
154
+ export declare function readSessionEngine(record: SessionMapRecord | undefined): SessionEngineReading;
155
+ export declare function commitSessionEngine(store: SessionMapStorePort, session: SessionEngineSessionRef, request: SessionEngineCommitRequest): SessionEngineCommitResult;
156
+ export declare function sessionDispatchTarget(reading: SessionEngineReading, ctx: SessionEngineWiring): SessionDispatchDecision;