@sema-agent/client-core 0.105.0 → 0.107.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 (152) hide show
  1. package/CHANGELOG.md +301 -0
  2. package/README.md +40 -21
  3. package/dist/adapt/arms.js +10 -1
  4. package/dist/adapter/activeRunSelfHeal.d.ts +21 -2
  5. package/dist/adapter/activeRunSelfHeal.js +129 -28
  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 +29 -0
  19. package/dist/checkpointRowVerdict.js +98 -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/displayUntrusted.d.ts +5 -3
  29. package/dist/displayUntrusted.js +50 -41
  30. package/dist/engineAddress.d.ts +3 -0
  31. package/dist/engineAddress.js +25 -0
  32. package/dist/engineDirectory.js +9 -17
  33. package/dist/engineErrorCodes.d.ts +8 -0
  34. package/dist/engineErrorCodes.js +8 -0
  35. package/dist/engineNoticeCodes.d.ts +38 -3
  36. package/dist/engineNoticeCodes.js +167 -11
  37. package/dist/engineRowRef.js +1 -1
  38. package/dist/errorSupplementRoles.js +4 -1
  39. package/dist/eventLeg.d.ts +2 -2
  40. package/dist/eventLeg.js +2 -1
  41. package/dist/executionLaneCapability.js +3 -2
  42. package/dist/executionLaneWords.d.ts +1 -0
  43. package/dist/executionLaneWords.js +3 -0
  44. package/dist/fleet/fleetProjection.js +26 -5
  45. package/dist/generated/engineFactTables.d.ts +2 -1
  46. package/dist/generated/engineFactTables.js +3 -1
  47. package/dist/generated/engineNoticeTables.js +28 -7
  48. package/dist/generated/sdkFactTables.d.ts +3 -0
  49. package/dist/generated/sdkFactTables.js +15 -0
  50. package/dist/generated/settingsSchemaFns.d.ts +11 -0
  51. package/dist/generated/settingsSchemaFns.js +2 -1
  52. package/dist/generated/settingsSchemaSafetyMergeSpec.js +1 -1
  53. package/dist/generated/settingsSchemaSettingsSources.d.ts +1 -1
  54. package/dist/generated/settingsSchemaSettingsSources.js +22 -2
  55. package/dist/hitl/approvalLiveFace.d.ts +17 -0
  56. package/dist/hitl/approvalLiveFace.js +35 -0
  57. package/dist/hitl/approvalQueueRow.d.ts +21 -0
  58. package/dist/hitl/approvalQueueRow.js +69 -0
  59. package/dist/hitl/approvalResolution.d.ts +5 -1
  60. package/dist/hitl/approvalResolution.js +18 -1
  61. package/dist/hitl/approvalsFeed.d.ts +5 -4
  62. package/dist/hitl/approvalsFeed.js +39 -6
  63. package/dist/hitl/askParkRowRouting.d.ts +4 -3
  64. package/dist/hitl/askParkRowRouting.js +27 -3
  65. package/dist/hitl/automaticAnswerVerdict.js +13 -10
  66. package/dist/hitl/crashConverged.d.ts +5 -1
  67. package/dist/hitl/decisionConflict.js +2 -1
  68. package/dist/hitl/decisionRefusal.js +1 -1
  69. package/dist/hitl/decisionSend.d.ts +3 -0
  70. package/dist/hitl/decisionSend.js +32 -6
  71. package/dist/hitl/frameRouter.js +4 -5
  72. package/dist/hitl/hitlBridge.d.ts +6 -2
  73. package/dist/hitl/hitlBridge.js +53 -7
  74. package/dist/hitl/livePendingAsk.d.ts +5 -0
  75. package/dist/hitl/livePendingAsk.js +10 -3
  76. package/dist/hitl/parkOwnership.js +4 -5
  77. package/dist/hitl/parkResolver.js +9 -5
  78. package/dist/hitl/parkRowBirthWait.d.ts +7 -0
  79. package/dist/hitl/parkRowBirthWait.js +1 -1
  80. package/dist/hitl/parkRowDelegation.d.ts +6 -0
  81. package/dist/hitl/parkRowDelegation.js +33 -0
  82. package/dist/hitl/persistedRulesWire.d.ts +15 -3
  83. package/dist/hitl/persistedRulesWire.js +102 -20
  84. package/dist/hitl/planReviewCard.d.ts +2 -0
  85. package/dist/hitl/planReviewCard.js +21 -0
  86. package/dist/hitl/planReviewWire.d.ts +2 -2
  87. package/dist/hitl/planReviewWire.js +105 -38
  88. package/dist/hitl/sessionAllowRoute.d.ts +7 -0
  89. package/dist/hitl/sessionAllowRoute.js +49 -0
  90. package/dist/hitl/sessionPolicyWire.d.ts +1 -7
  91. package/dist/hitl/sessionPolicyWire.js +3 -43
  92. package/dist/hitl/standingRows.js +10 -10
  93. package/dist/hitl/subagentSource.d.ts +1 -0
  94. package/dist/hitl/subagentSource.js +13 -0
  95. package/dist/hitl/toolApprovalWire.d.ts +3 -2
  96. package/dist/hitl/toolApprovalWire.js +100 -44
  97. package/dist/hostSettingsSource.d.ts +4 -1
  98. package/dist/hostSettingsSource.js +11 -6
  99. package/dist/hostTurnSettings.d.ts +4 -5
  100. package/dist/hostTurnSettings.js +80 -19
  101. package/dist/i18n/messages.en.d.ts +41 -12
  102. package/dist/i18n/messages.en.js +42 -13
  103. package/dist/i18n/messages.zh.js +45 -13
  104. package/dist/index.d.ts +22 -2
  105. package/dist/index.js +12 -2
  106. package/dist/injectionLaneNotice.js +2 -1
  107. package/dist/liveInitToolFace.js +0 -1
  108. package/dist/liveModelCatalog.d.ts +15 -0
  109. package/dist/liveModelCatalog.js +40 -0
  110. package/dist/mcpWireCaps.js +1 -1
  111. package/dist/modelCapabilityProbe.js +66 -33
  112. package/dist/noticePresentation.js +2 -0
  113. package/dist/ownKey.d.ts +0 -1
  114. package/dist/ownKey.js +0 -2
  115. package/dist/permissionsDeclaration.d.ts +2 -2
  116. package/dist/permissionsDeclaration.js +12 -14
  117. package/dist/projectSeed.d.ts +39 -0
  118. package/dist/projectSeed.js +80 -0
  119. package/dist/promptDelivery.js +1 -1
  120. package/dist/replayBody.d.ts +7 -6
  121. package/dist/replayBody.js +62 -7
  122. package/dist/request/taskRequest.js +3 -4
  123. package/dist/ruleCompileVerdict.d.ts +0 -2
  124. package/dist/ruleCompileVerdict.js +0 -31
  125. package/dist/ruleRefusalSentence.js +0 -3
  126. package/dist/runReattachPolicy.d.ts +3 -0
  127. package/dist/runReattachPolicy.js +15 -2
  128. package/dist/runTerminal.js +30 -8
  129. package/dist/sandboxWire.d.ts +0 -3
  130. package/dist/sandboxWire.js +0 -9
  131. package/dist/sdkWireTransit.d.ts +1 -1
  132. package/dist/seam.d.ts +14 -7
  133. package/dist/seam.js +12 -0
  134. package/dist/seatContract.d.ts +58 -7
  135. package/dist/seatContract.js +135 -4
  136. package/dist/serverSupportRange.d.ts +18 -0
  137. package/dist/serverSupportRange.js +25 -0
  138. package/dist/sessionEngine.d.ts +156 -0
  139. package/dist/sessionEngine.js +464 -0
  140. package/dist/sessionMap.d.ts +11 -1
  141. package/dist/sessionMap.js +35 -9
  142. package/dist/sessionMemorySync.d.ts +31 -0
  143. package/dist/sessionMemorySync.js +95 -0
  144. package/dist/sessionRowTag.d.ts +4 -0
  145. package/dist/sessionRowTag.js +18 -0
  146. package/dist/settingsLayerAdmission.d.ts +1 -0
  147. package/dist/settingsLayerAdmission.js +4 -1
  148. package/dist/toolResult.js +1 -1
  149. package/dist/wireRefusalCopy.d.ts +6 -1
  150. package/dist/wireRefusalCopy.js +9 -7
  151. package/docs/INTEGRATION-CLIENTS.md +1393 -18
  152. 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
@@ -191,7 +192,9 @@ const keyWords = (k) => k
191
192
  .filter((w) => w.length > 0);
192
193
  const SECRET_KEY_WORDS = new Set(["token", "secret", "password", "passwd", "authorization", "bearer", "sealed"]);
193
194
  const SECRET_KEY_PAIRS = new Set(["api key", "device code", "access key", "private key"]);
194
- const isSecretKeyName = (k) => {
195
+ export const isSecretKeyName = (k) => {
196
+ if (typeof k !== "string")
197
+ return false;
195
198
  const words = keyWords(k);
196
199
  for (let i = 0; i < words.length; i += 1) {
197
200
  if (SECRET_KEY_WORDS.has(words[i]))
@@ -295,6 +298,7 @@ const CHROME_ARM_SEAT_ROUTE = {
295
298
  plan_review_park: "host",
296
299
  approval_request: "host",
297
300
  approval_revoke: "host",
301
+ approval_complete: "host",
298
302
  task_ledger_sync: "host",
299
303
  inline_task_stats: "host",
300
304
  stream_delta: "host",
@@ -314,6 +318,7 @@ const CHROME_ARM_SEAT_ROUTE = {
314
318
  wiring_manifest: "host",
315
319
  suspended_reopened: "host",
316
320
  result_text_diverged: "host",
321
+ session_titled: "host",
317
322
  };
318
323
  const CHROME_EVENT_KIND_TUPLE = Object.keys(CHROME_ARM_SEAT_ROUTE).filter((k) => CHROME_ARM_SEAT_ROUTE[k] === "seat");
319
324
  export const CHROME_EVENT_KINDS = Object.freeze(CHROME_EVENT_KIND_TUPLE);
@@ -376,7 +381,7 @@ export function readSeatStreamDelta(message) {
376
381
  return Object.freeze({ kind: "malformed" });
377
382
  }
378
383
  }
379
- export const SEAT_CAPABILITY_NAMES = Object.freeze(["pickFolder", "rewind", "recents", "patchSession", "devices", "engineTarget", "onboard", "mcpToolToggles", "thinkingLatch"]);
384
+ export const SEAT_CAPABILITY_NAMES = Object.freeze(["pickFolder", "rewind", "recents", "patchSession", "devices", "engineTarget", "onboard", "mcpToolToggles", "thinkingLatch", "computerUseSwitch", "engineModeDefaultOnly"]);
380
385
  const notReported = () => Object.freeze({ kind: "not_reported" });
381
386
  const malformedReading = () => Object.freeze({ kind: "malformed" });
382
387
  const reported = (available) => Object.freeze({ kind: "reported", available });
@@ -453,6 +458,8 @@ const SEAT_CAPABILITY_PHRASES = Object.freeze({
453
458
  onboard: Object.freeze({ action: "Model setup", ability: "add models", support: "model-setup support" }),
454
459
  mcpToolToggles: Object.freeze({ action: "Per-tool switching", ability: "toggle tools", support: "per-tool switches" }),
455
460
  thinkingLatch: Object.freeze({ action: "Switching thinking", ability: "switch thinking", support: "thinking-switch support" }),
461
+ computerUseSwitch: Object.freeze({ action: "Computer use", ability: "be switched", support: "switch support" }),
462
+ engineModeDefaultOnly: Object.freeze({ action: "Default-only engine switching", ability: "keep existing sessions on their engine", support: "default-only engine switching" }),
456
463
  });
457
464
  export function seatCapabilityUnavailableDetail(name, reading) {
458
465
  const phrase = Object.hasOwn(SEAT_CAPABILITY_PHRASES, name)
@@ -886,6 +893,7 @@ const checkOnboardProvidersResult = seatShapeCheck(shapeRule("onboard providers"
886
893
  api: reqF(R_API_WORD),
887
894
  hasKey: reqF(R_BOOL),
888
895
  models: reqF(arrayRule(R_NONEMPTY)),
896
+ isCurrent: optF(R_BOOL),
889
897
  }))),
890
898
  }));
891
899
  const checkSessionMcpPanelFailure = seatShapeCheck(armsRule("readSessionMcpPanel failure", "kind", {
@@ -967,6 +975,95 @@ const MCP_TOOL_TOGGLE_KEY = shapeRule("toggle key", {
967
975
  });
968
976
  export const checkMcpToolToggleKey = seatShapeCheck(MCP_TOOL_TOGGLE_KEY);
969
977
  const checkMcpToolTogglesResult = seatShapeCheck(shapeRule("toggles result", { off: reqF(arrayRule(MCP_TOOL_TOGGLE_KEY)) }));
978
+ export const COMPUTER_USE_SOURCES = Object.freeze(["env", "settings", "default"]);
979
+ export const COMPUTER_USE_REFUSAL_REASONS = Object.freeze(["locked-by-env", "confirmation-required", "invalid-request", "write-failed"]);
980
+ export const COMPUTER_USE_APPLIES_ON = Object.freeze(["next-engine-start"]);
981
+ const SET_COMPUTER_USE_REQUEST_KEYS = Object.freeze(["enabled", "confirmed"]);
982
+ const COMPUTER_USE_STATE_SHAPE = shapeRule("computer-use state", {
983
+ enabled: reqF(R_BOOL),
984
+ source: reqF(oneOfRule("computer-use source", COMPUTER_USE_SOURCES)),
985
+ lockedByEnv: reqF(R_BOOL),
986
+ appliesOn: reqF(oneOfRule("computer-use appliesOn", COMPUTER_USE_APPLIES_ON)),
987
+ });
988
+ const COMPUTER_USE_STATE = {
989
+ label: COMPUTER_USE_STATE_SHAPE.label,
990
+ test: (v, path) => {
991
+ const verdict = COMPUTER_USE_STATE_SHAPE.test(v, path);
992
+ if (verdict !== true)
993
+ return verdict;
994
+ const rec = v;
995
+ return own(rec, "lockedByEnv") === true && own(rec, "source") !== "env" ? bad("lock conflict", pathAt(path, "lockedByEnv")) : true;
996
+ },
997
+ };
998
+ const checkComputerUseState = seatShapeCheck(COMPUTER_USE_STATE);
999
+ const SET_COMPUTER_USE_RESULT = okArmsRule("setComputerUse result", { changed: reqF(R_BOOL), state: reqF(COMPUTER_USE_STATE) }, {
1000
+ reason: reqF(oneOfRule("computer-use refusal", COMPUTER_USE_REFUSAL_REASONS)),
1001
+ state: reqF(COMPUTER_USE_STATE),
1002
+ });
1003
+ const checkSetComputerUseResult = seatShapeCheck({
1004
+ label: SET_COMPUTER_USE_RESULT.label,
1005
+ test: (v, path) => {
1006
+ const verdict = SET_COMPUTER_USE_RESULT.test(v, path);
1007
+ if (verdict !== true)
1008
+ return verdict;
1009
+ const rec = v;
1010
+ if (own(rec, "reason") === "locked-by-env" && own(own(rec, "state"), "lockedByEnv") !== true)
1011
+ return bad("lock conflict", pathAt(path, "state.lockedByEnv"));
1012
+ return true;
1013
+ },
1014
+ });
1015
+ const failureOfRule = (rule, v, path) => {
1016
+ const verdict = rule.test(v, path);
1017
+ return verdict === true ? bad("bad value", path) : verdict;
1018
+ };
1019
+ const computerUseIntentOf = (v) => {
1020
+ const invalid = (failure) => ({ kind: "invalid", failure });
1021
+ if (!isPlainRecord(v))
1022
+ return invalid(bad("not object"));
1023
+ const snap = new Map();
1024
+ for (const k of Reflect.ownKeys(v))
1025
+ if (typeof k === "string")
1026
+ snap.set(k, own(v, k));
1027
+ for (const k of snap.keys())
1028
+ if (!inTuple(SET_COMPUTER_USE_REQUEST_KEYS, k))
1029
+ return invalid(bad("unknown key", k));
1030
+ const enabled = snap.get("enabled");
1031
+ if (enabled === undefined)
1032
+ return invalid(bad("missing key", "enabled"));
1033
+ if (typeof enabled !== "boolean")
1034
+ return invalid(failureOfRule(R_BOOL, enabled, "enabled"));
1035
+ if (!enabled)
1036
+ return snap.has("confirmed") ? invalid(bad("unknown key", "confirmed")) : { kind: "disable" };
1037
+ const confirmed = snap.get("confirmed");
1038
+ if (confirmed === true)
1039
+ return { kind: "enable" };
1040
+ if (confirmed === undefined)
1041
+ return { kind: "unconfirmed", failure: bad("missing key", "confirmed") };
1042
+ if (confirmed === false)
1043
+ return { kind: "unconfirmed", failure: failureOfRule(R_TRUE, confirmed, "confirmed") };
1044
+ return invalid(failureOfRule(R_BOOL, confirmed, "confirmed"));
1045
+ };
1046
+ export const checkSetComputerUseRequest = seatCheck((v) => {
1047
+ const intent = computerUseIntentOf(v);
1048
+ return intent.kind === "disable" || intent.kind === "enable" ? true : intent.failure;
1049
+ });
1050
+ export function planSetComputerUse(request, lockedByEnv) {
1051
+ let intent;
1052
+ try {
1053
+ const at = firstAccessorPath(request);
1054
+ intent = at !== undefined ? { kind: "invalid", failure: bad(NOT_PLAIN_DATA, at) } : computerUseIntentOf(request);
1055
+ }
1056
+ catch {
1057
+ intent = { kind: "invalid", failure: bad("unreadable") };
1058
+ }
1059
+ if (intent.kind === "invalid")
1060
+ return Object.freeze({ kind: "refused", reason: "invalid-request" });
1061
+ if (lockedByEnv !== false)
1062
+ return Object.freeze({ kind: "refused", reason: "locked-by-env" });
1063
+ if (intent.kind === "unconfirmed")
1064
+ return Object.freeze({ kind: "refused", reason: "confirmation-required" });
1065
+ return Object.freeze({ kind: "apply", enabled: intent.kind === "enable" });
1066
+ }
970
1067
  const checkLocalSessionRecord = seatCheck((s) => {
971
1068
  if (!isPlainRecord(s))
972
1069
  return bad("session record is not a plain object");
@@ -1006,12 +1103,28 @@ const checkLocalSessionRecord = seatCheck((s) => {
1006
1103
  if (!isAbsent(rowTag) && (typeof rowTag !== "string" || rowTag.length === 0)) {
1007
1104
  return bad("rowTag must be a non-empty string when present (absent = this row cannot be written conditionally)", "rowTag");
1008
1105
  }
1106
+ const unreadable = own(s, "unreadable");
1107
+ if (!isAbsent(unreadable)) {
1108
+ if (!isPlainRecord(unreadable))
1109
+ return bad("unreadable must be a plain object when present (absent = the list did not report this session as unreadable)", "unreadable");
1110
+ const code = own(unreadable, "errorCode");
1111
+ if (!isAbsent(code) && (typeof code !== "string" || code.length === 0))
1112
+ return bad("unreadable.errorCode must be a non-empty string when present", "unreadable.errorCode");
1113
+ }
1009
1114
  const latch = own(s, "thinkingLatch");
1010
1115
  if (!isAbsent(latch)) {
1011
1116
  const verdict = R_THINKING_LATCH_ROW.test(latch, "thinkingLatch");
1012
1117
  if (verdict !== true)
1013
1118
  return verdict;
1014
1119
  }
1120
+ const engine = own(s, "engine");
1121
+ if (!isAbsent(engine) && !isSessionEngineView(engine)) {
1122
+ 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");
1123
+ }
1124
+ const lane = own(s, "executionLane");
1125
+ if (!isAbsent(lane) && (typeof lane !== "string" || lane.length === 0)) {
1126
+ return bad("executionLane must be a non-empty string when present (absent = no writer lane reading)", "executionLane");
1127
+ }
1015
1128
  return true;
1016
1129
  });
1017
1130
  export function isLocalSessionRecord(s) {
@@ -1667,6 +1780,8 @@ export const LOCAL_SESSIONS_SPEC = {
1667
1780
  listMcpToolToggles: { kind: "invoke", check: checkMcpToolTogglesResult },
1668
1781
  setMcpToolToggle: { kind: "invoke", check: checkOkAck },
1669
1782
  setThinkingLatch: { kind: "invoke", check: checkOkAck },
1783
+ getComputerUse: { kind: "invoke", check: checkComputerUseState },
1784
+ setComputerUse: { kind: "invoke", check: checkSetComputerUseResult },
1670
1785
  onEvent: { kind: "event", check: checkLocalSessionEvent },
1671
1786
  onToolPermissionRequest: { kind: "event", check: checkToolPermissionRequest },
1672
1787
  },
@@ -1715,6 +1830,8 @@ export const SEAT_METHOD_NAMES = [
1715
1830
  "listMcpToolToggles",
1716
1831
  "setMcpToolToggle",
1717
1832
  "setThinkingLatch",
1833
+ "getComputerUse",
1834
+ "setComputerUse",
1718
1835
  "onEvent",
1719
1836
  "onToolPermissionRequest",
1720
1837
  ];
@@ -1774,7 +1891,10 @@ export const LOCAL_SESSION_RECORD_KEYS = [
1774
1891
  "parked",
1775
1892
  "pinned",
1776
1893
  "rowTag",
1894
+ "unreadable",
1777
1895
  "thinkingLatch",
1896
+ "engine",
1897
+ "executionLane",
1778
1898
  ];
1779
1899
  export const SEND_MESSAGE_REQUEST_KEYS = [
1780
1900
  "sessionId",
@@ -1819,7 +1939,7 @@ export const SEAT_VALIDATOR_KEY_COVERAGE = {
1819
1939
  LocalSessionRecord: {
1820
1940
  guard: "isLocalSessionRecord",
1821
1941
  check: checkLocalSessionRecord,
1822
- validated: ["sessionId", "engineSessionId", "model", "title", "cwd", "isRunning", "createdAt", "lastActivityAt", "queuedMessages", "parked", "pinned", "rowTag", "thinkingLatch"],
1942
+ validated: ["sessionId", "engineSessionId", "model", "title", "cwd", "isRunning", "createdAt", "lastActivityAt", "queuedMessages", "parked", "pinned", "rowTag", "unreadable", "thinkingLatch", "engine", "executionLane"],
1823
1943
  unchecked: [],
1824
1944
  },
1825
1945
  ToolPermissionRequest: {
@@ -1915,6 +2035,10 @@ export const SEAT_VALIDATOR_KEY_COVERAGE = {
1915
2035
  key: "candidateRejected",
1916
2036
  why: "诊断面(0.97.0 CC-715;当前配置是候选被整拒后回落的那一份),三态读法归 modelCandidateRejectedOf(含坏形 unreadable);出站门为它拒掉整份目录 = 选单为一行诊断整个消失。",
1917
2037
  },
2038
+ {
2039
+ key: "modelPlane",
2040
+ why: "诊断面(0.106.0 CC-1156;这台引擎服务的是哪张模型表 / 最近一份目录候选的结局),三态读法归 modelPlaneOf(含坏形 unreadable、表外词整位不给);出站门为它拒掉整份目录 = 选单为一行诊断整个消失。",
2041
+ },
1918
2042
  ],
1919
2043
  },
1920
2044
  SendMessageRequest: {
@@ -2002,7 +2126,7 @@ export const SEAT_VALIDATOR_KEY_COVERAGE = {
2002
2126
  },
2003
2127
  SeatCapabilitiesState: {
2004
2128
  check: checkSeatCapabilitiesState,
2005
- validated: ["pickFolder", "rewind", "recents", "patchSession", "devices", "engineTarget", "onboard", "mcpToolToggles", "thinkingLatch"],
2129
+ validated: ["pickFolder", "rewind", "recents", "patchSession", "devices", "engineTarget", "onboard", "mcpToolToggles", "thinkingLatch", "computerUseSwitch", "engineModeDefaultOnly"],
2006
2130
  unchecked: [],
2007
2131
  },
2008
2132
  RecentFoldersResult: {
@@ -2065,6 +2189,9 @@ export const SEAT_VALIDATOR_COVERAGE_EXEMPT = [
2065
2189
  ["OnboardApplyRequest", checkOnboardApplyRequest],
2066
2190
  ["McpToolTogglesResult", checkMcpToolTogglesResult],
2067
2191
  ["McpToolToggleKey", checkMcpToolToggleKey],
2192
+ ["ComputerUseState", checkComputerUseState],
2193
+ ["SetComputerUseResult", checkSetComputerUseResult],
2194
+ ["SetComputerUseRequest", checkSetComputerUseRequest],
2068
2195
  ].map(([label, check]) => ({
2069
2196
  label,
2070
2197
  check,
@@ -2120,5 +2247,9 @@ const _seatContractPins = [
2120
2247
  true, true, true, true, true, true,
2121
2248
  true, true, true,
2122
2249
  true, true,
2250
+ true, true, true,
2251
+ true, true,
2252
+ true, true, true, true,
2253
+ true, true,
2123
2254
  ];
2124
2255
  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;