@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.
- package/CHANGELOG.md +220 -0
- package/README.md +26 -11
- package/dist/adapt/arms.js +10 -1
- package/dist/adapter/activeRunSelfHeal.d.ts +13 -2
- package/dist/adapter/activeRunSelfHeal.js +80 -7
- package/dist/adapter/downstream/eventToSdkMessage.d.ts +0 -5
- package/dist/adapter/downstream/eventToSdkMessage.js +20 -19
- package/dist/adapter/downstream/terminalToSdkResult.js +2 -3
- package/dist/adapter/downstream/wiringManifestView.d.ts +1 -3
- package/dist/adapter/downstream/wiringManifestView.js +0 -1
- package/dist/adapter/runStream.js +3 -4
- package/dist/approvalReachWire.d.ts +1 -0
- package/dist/approvalReachWire.js +4 -1
- package/dist/approvalSeat.d.ts +21 -0
- package/dist/approvalSeat.js +73 -0
- package/dist/assistantInbox.d.ts +2 -0
- package/dist/assistantInbox.js +3 -0
- package/dist/checkpointRowVerdict.d.ts +23 -0
- package/dist/checkpointRowVerdict.js +89 -0
- package/dist/coreValuePorts.d.ts +12 -1
- package/dist/coreValuePorts.js +10 -0
- package/dist/decideFailureNote.js +3 -1
- package/dist/decideReceipt.d.ts +9 -0
- package/dist/decideReceipt.js +29 -1
- package/dist/declared/supportFloorDeclared.js +2 -2
- package/dist/deviceRebind.d.ts +7 -0
- package/dist/deviceRebind.js +39 -5
- package/dist/engineAddress.d.ts +3 -0
- package/dist/engineAddress.js +25 -0
- package/dist/engineDirectory.js +9 -17
- package/dist/engineErrorCodes.d.ts +8 -0
- package/dist/engineErrorCodes.js +8 -0
- package/dist/engineNoticeCodes.d.ts +26 -3
- package/dist/engineNoticeCodes.js +52 -7
- package/dist/engineRowRef.js +1 -1
- package/dist/errorSupplementRoles.js +2 -0
- package/dist/eventLeg.d.ts +2 -2
- package/dist/eventLeg.js +2 -1
- package/dist/fleet/fleetProjection.js +26 -5
- package/dist/generated/engineFactTables.d.ts +2 -1
- package/dist/generated/engineFactTables.js +3 -1
- package/dist/generated/engineNoticeTables.js +19 -4
- package/dist/generated/sdkFactTables.d.ts +3 -0
- package/dist/generated/sdkFactTables.js +15 -0
- package/dist/generated/settingsSchemaFns.d.ts +11 -0
- package/dist/generated/settingsSchemaFns.js +2 -1
- package/dist/generated/settingsSchemaSafetyMergeSpec.js +1 -1
- package/dist/generated/settingsSchemaSettingsSources.d.ts +1 -1
- package/dist/generated/settingsSchemaSettingsSources.js +22 -2
- package/dist/hitl/approvalLiveFace.d.ts +17 -0
- package/dist/hitl/approvalLiveFace.js +35 -0
- package/dist/hitl/approvalQueueRow.d.ts +21 -0
- package/dist/hitl/approvalQueueRow.js +69 -0
- package/dist/hitl/approvalsFeed.d.ts +5 -4
- package/dist/hitl/approvalsFeed.js +38 -6
- package/dist/hitl/askParkRowRouting.d.ts +4 -3
- package/dist/hitl/askParkRowRouting.js +15 -3
- package/dist/hitl/automaticAnswerVerdict.js +13 -10
- package/dist/hitl/crashConverged.d.ts +5 -1
- package/dist/hitl/decisionConflict.js +2 -1
- package/dist/hitl/decisionRefusal.js +1 -1
- package/dist/hitl/decisionSend.d.ts +1 -0
- package/dist/hitl/decisionSend.js +14 -2
- package/dist/hitl/frameRouter.js +4 -5
- package/dist/hitl/hitlBridge.d.ts +1 -1
- package/dist/hitl/hitlBridge.js +26 -5
- package/dist/hitl/livePendingAsk.d.ts +5 -0
- package/dist/hitl/livePendingAsk.js +6 -1
- package/dist/hitl/planReviewCard.d.ts +2 -0
- package/dist/hitl/planReviewCard.js +21 -0
- package/dist/hitl/planReviewWire.d.ts +2 -2
- package/dist/hitl/planReviewWire.js +101 -36
- package/dist/hitl/sessionAllowRoute.d.ts +2 -0
- package/dist/hitl/sessionAllowRoute.js +7 -0
- package/dist/hitl/sessionPolicyWire.d.ts +1 -7
- package/dist/hitl/sessionPolicyWire.js +3 -43
- package/dist/hitl/subagentSource.d.ts +1 -0
- package/dist/hitl/subagentSource.js +13 -0
- package/dist/hitl/toolApprovalWire.d.ts +3 -2
- package/dist/hitl/toolApprovalWire.js +79 -37
- package/dist/hostSettingsSource.d.ts +4 -1
- package/dist/hostSettingsSource.js +11 -6
- package/dist/hostTurnSettings.d.ts +4 -5
- package/dist/hostTurnSettings.js +80 -19
- package/dist/i18n/messages.en.d.ts +35 -12
- package/dist/i18n/messages.en.js +36 -13
- package/dist/i18n/messages.zh.js +38 -13
- package/dist/index.d.ts +21 -2
- package/dist/index.js +11 -2
- package/dist/liveInitToolFace.js +0 -1
- package/dist/liveModelCatalog.d.ts +15 -0
- package/dist/liveModelCatalog.js +40 -0
- package/dist/mcpWireCaps.js +1 -1
- package/dist/modelCapabilityProbe.js +66 -33
- package/dist/ownKey.d.ts +0 -1
- package/dist/ownKey.js +0 -2
- package/dist/permissionsDeclaration.d.ts +2 -2
- package/dist/permissionsDeclaration.js +12 -14
- package/dist/projectSeed.d.ts +39 -0
- package/dist/projectSeed.js +80 -0
- package/dist/promptDelivery.js +1 -1
- package/dist/replayBody.d.ts +7 -6
- package/dist/replayBody.js +62 -7
- package/dist/request/taskRequest.js +3 -4
- package/dist/ruleCompileVerdict.d.ts +0 -2
- package/dist/ruleCompileVerdict.js +0 -31
- package/dist/ruleRefusalSentence.js +0 -3
- package/dist/runReattachPolicy.d.ts +3 -0
- package/dist/runReattachPolicy.js +15 -2
- package/dist/runTerminal.js +30 -8
- package/dist/sandboxWire.d.ts +0 -3
- package/dist/sandboxWire.js +0 -9
- package/dist/seam.d.ts +14 -7
- package/dist/seam.js +12 -0
- package/dist/seatContract.d.ts +57 -7
- package/dist/seatContract.js +132 -3
- package/dist/serverSupportRange.d.ts +18 -0
- package/dist/serverSupportRange.js +25 -0
- package/dist/sessionEngine.d.ts +156 -0
- package/dist/sessionEngine.js +464 -0
- package/dist/sessionMap.d.ts +11 -1
- package/dist/sessionMap.js +35 -9
- package/dist/sessionMemorySync.d.ts +31 -0
- package/dist/sessionMemorySync.js +95 -0
- package/dist/sessionRowTag.d.ts +4 -0
- package/dist/sessionRowTag.js +18 -0
- package/dist/settingsLayerAdmission.d.ts +1 -0
- package/dist/settingsLayerAdmission.js +4 -1
- package/dist/toolResult.js +1 -1
- package/dist/wireRefusalCopy.js +2 -6
- package/docs/INTEGRATION-CLIENTS.md +1022 -16
- package/package.json +5 -5
package/dist/seatContract.js
CHANGED
|
@@ -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;
|