@sema-agent/client-core 0.104.1 → 0.106.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +310 -0
- package/README.md +36 -14
- package/dist/adapt/arms.js +23 -6
- package/dist/adapter/activeRunSelfHeal.d.ts +14 -2
- package/dist/adapter/activeRunSelfHeal.js +90 -12
- package/dist/adapter/downstream/eventToSdkMessage.d.ts +0 -5
- package/dist/adapter/downstream/eventToSdkMessage.js +24 -23
- package/dist/adapter/downstream/terminalToSdkResult.js +2 -3
- package/dist/adapter/downstream/wiringManifestView.d.ts +7 -3
- package/dist/adapter/downstream/wiringManifestView.js +25 -1
- package/dist/adapter/runStream.js +8 -5
- 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/cloudConfigWireCaps.js +3 -0
- package/dist/compensations.js +6 -6
- package/dist/coreValuePorts.d.ts +14 -1
- package/dist/coreValuePorts.js +14 -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/displayUntrusted.d.ts +4 -2
- package/dist/displayUntrusted.js +45 -22
- 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/engineGenerationPort.d.ts +11 -2
- package/dist/engineGenerationPort.js +63 -9
- package/dist/engineHealthFacts.d.ts +5 -0
- package/dist/engineHealthFacts.js +11 -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 +3 -3
- package/dist/eventLeg.js +25 -4
- package/dist/fleet/fleetProjection.js +26 -5
- package/dist/generated/engineFactTables.d.ts +3 -1
- package/dist/generated/engineFactTables.js +4 -1
- package/dist/generated/engineNoticeTables.js +19 -4
- package/dist/generated/sdkFactTables.d.ts +5 -0
- package/dist/generated/sdkFactTables.js +24 -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/headlessReconnectWire.js +31 -4
- 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/askGateWire.js +26 -2
- 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.d.ts +4 -0
- package/dist/hitl/frameRouter.js +18 -5
- package/dist/hitl/gateIdentity.d.ts +1 -0
- package/dist/hitl/gateIdentity.js +3 -0
- 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 +23 -0
- package/dist/hitl/planReviewCard.js +250 -0
- package/dist/hitl/planReviewWire.d.ts +39 -14
- package/dist/hitl/planReviewWire.js +450 -163
- 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 +5 -2
- package/dist/hostSettingsSource.js +19 -10
- package/dist/hostTurnSettings.d.ts +5 -6
- package/dist/hostTurnSettings.js +106 -26
- package/dist/i18n/messages.en.d.ts +85 -12
- package/dist/i18n/messages.en.js +85 -12
- package/dist/i18n/messages.zh.js +88 -12
- package/dist/index.d.ts +35 -4
- package/dist/index.js +19 -2
- package/dist/liveInitToolFace.js +0 -1
- package/dist/liveModelCatalog.d.ts +15 -0
- package/dist/liveModelCatalog.js +40 -0
- package/dist/mcpTransportKindsCapability.d.ts +18 -0
- package/dist/mcpTransportKindsCapability.js +75 -0
- package/dist/mcpWireCaps.d.ts +4 -1
- package/dist/mcpWireCaps.js +25 -14
- package/dist/modelCapabilityProbe.js +66 -33
- package/dist/notifications.d.ts +9 -0
- package/dist/notifications.js +11 -2
- package/dist/ownKey.d.ts +4 -1
- package/dist/ownKey.js +8 -2
- package/dist/permissionModeWriteCapability.d.ts +13 -0
- package/dist/permissionModeWriteCapability.js +35 -0
- package/dist/permissionsAllowGrantCapability.d.ts +3 -0
- package/dist/permissionsAllowGrantCapability.js +26 -3
- package/dist/permissionsDeclaration.d.ts +25 -3
- package/dist/permissionsDeclaration.js +69 -41
- package/dist/planReviewCardFacts.d.ts +116 -0
- package/dist/planReviewCardFacts.js +469 -0
- package/dist/projectSeed.d.ts +39 -0
- package/dist/projectSeed.js +80 -0
- package/dist/promptDelivery.js +1 -1
- package/dist/reattachWindow.d.ts +8 -1
- package/dist/reattachWindow.js +44 -12
- 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/runFollow.d.ts +30 -0
- package/dist/runFollow.js +117 -0
- package/dist/runLedgerSnapshot.d.ts +20 -0
- package/dist/runLedgerSnapshot.js +272 -0
- package/dist/runPermissionModeSwitch.d.ts +57 -0
- package/dist/runPermissionModeSwitch.js +135 -0
- package/dist/runReattachPolicy.d.ts +16 -5
- package/dist/runReattachPolicy.js +72 -24
- package/dist/runTerminal.js +30 -8
- package/dist/sandboxWire.d.ts +0 -3
- package/dist/sandboxWire.js +0 -9
- package/dist/seam.d.ts +17 -7
- package/dist/seam.js +13 -1
- package/dist/seatContract.d.ts +57 -7
- package/dist/seatContract.js +133 -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/sessionMemoryErase.d.ts +1 -1
- package/dist/sessionMemoryErase.js +5 -0
- package/dist/sessionMemoryStatus.d.ts +27 -1
- package/dist/sessionMemoryStatus.js +117 -0
- 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/sseIdleTriage.d.ts +3 -1
- package/dist/sseIdleTriage.js +19 -4
- package/dist/subagent/engineSubagentTail.js +2 -0
- package/dist/subagentContentStore.d.ts +3 -0
- package/dist/subagentContentStore.js +10 -1
- package/dist/toolResult.js +1 -1
- package/dist/turnFailurePresentation.d.ts +5 -2
- package/dist/turnFailurePresentation.js +12 -4
- package/dist/wireRefusalCopy.js +2 -6
- package/docs/INTEGRATION-CLIENTS.md +1507 -18
- package/package.json +5 -5
package/dist/runTerminal.js
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import { CORE_PROMPT_BLOCK_CAUSES } from './generated/engineFactTables.js';
|
|
2
2
|
import { isSdkRunParked } from './terminalStatuses.js';
|
|
3
|
+
import { runRowSentenceOf, terminalLayerOf } from './replayBody.js';
|
|
3
4
|
import { readOwnDataNonEmptyString, readOwnDataValue } from './ownKey.js';
|
|
4
|
-
import { doneResultView } from './replayBody.js';
|
|
5
5
|
import { washCredentials } from './displayUntrusted.js';
|
|
6
6
|
export const PROMPT_BLOCK_CAUSES = CORE_PROMPT_BLOCK_CAUSES;
|
|
7
7
|
const _promptBlockTablePin = true;
|
|
@@ -300,18 +300,40 @@ function blockedDetailOf(cause) {
|
|
|
300
300
|
}
|
|
301
301
|
}
|
|
302
302
|
export function readRunTerminal(result) {
|
|
303
|
-
|
|
304
|
-
|
|
305
|
-
|
|
306
|
-
|
|
307
|
-
|
|
303
|
+
const layer = terminalLayerOf(result);
|
|
304
|
+
const read = readRunTerminalArm(layer);
|
|
305
|
+
if (read === null || read.kind !== 'failed' || read.plane !== 'flat' || read.message !== undefined || layer !== result)
|
|
306
|
+
return read;
|
|
307
|
+
const sentence = runRowSentenceOf(result);
|
|
308
|
+
return sentence === undefined ? read : { ...read, message: sentence };
|
|
309
|
+
}
|
|
310
|
+
function topLevelSnapshotOf(o) {
|
|
311
|
+
const snap = Object.create(null);
|
|
312
|
+
for (const k of ['terminal', 'status', 'errorCode', 'errorMessage', 'blockedReason', 'checkpointGate', 'checkpointId', 'workspaceRestoreMode']) {
|
|
313
|
+
let present;
|
|
314
|
+
try {
|
|
315
|
+
present = k in o;
|
|
316
|
+
}
|
|
317
|
+
catch {
|
|
318
|
+
return undefined;
|
|
319
|
+
}
|
|
320
|
+
if (!present)
|
|
321
|
+
continue;
|
|
322
|
+
try {
|
|
323
|
+
snap[k] = o[k];
|
|
324
|
+
}
|
|
325
|
+
catch {
|
|
326
|
+
snap[k] = undefined;
|
|
327
|
+
}
|
|
308
328
|
}
|
|
309
|
-
return
|
|
329
|
+
return snap;
|
|
310
330
|
}
|
|
311
331
|
function readRunTerminalArm(result) {
|
|
312
332
|
if (typeof result !== 'object' || result === null || Array.isArray(result))
|
|
313
333
|
return null;
|
|
314
|
-
const r = result;
|
|
334
|
+
const r = topLevelSnapshotOf(result);
|
|
335
|
+
if (r === undefined)
|
|
336
|
+
return null;
|
|
315
337
|
if ('terminal' in r) {
|
|
316
338
|
const t = r.terminal;
|
|
317
339
|
const c = typeof t === 'object' && t !== null && !Array.isArray(t) ? t : undefined;
|
package/dist/sandboxWire.d.ts
CHANGED
|
@@ -20,9 +20,6 @@ export declare function sandboxRequestFields(sel: SandboxSelection | undefined):
|
|
|
20
20
|
};
|
|
21
21
|
export declare const AUTO_SANDBOX_ADVISORY: string;
|
|
22
22
|
export declare function wrapObjectiveWithAutoSandboxAdvisory(objective: string): string;
|
|
23
|
-
export declare const SANDBOX_K8S_ONLY_400_ANCHOR = "only supported on the k8s sandbox backend";
|
|
24
|
-
export declare const SANDBOX_NO_IMAGE_INDEX_400_ANCHOR = "requires the image index";
|
|
25
|
-
export declare const SANDBOX_NO_PUBLISHED_IMAGE_404_ANCHOR = "no published sandbox image for profile";
|
|
26
23
|
export declare const SANDBOX_CASCADE_CONFLICT_400_ANCHOR = "not supported together with cascade/verify";
|
|
27
24
|
export type SandboxHintHost = 'terminal' | 'web' | 'desktop';
|
|
28
25
|
export declare const SANDBOX_HINT_HOSTS: readonly SandboxHintHost[];
|
package/dist/sandboxWire.js
CHANGED
|
@@ -41,9 +41,6 @@ export const AUTO_SANDBOX_ADVISORY = '<sandbox-auto-select>\n' +
|
|
|
41
41
|
export function wrapObjectiveWithAutoSandboxAdvisory(objective) {
|
|
42
42
|
return `${AUTO_SANDBOX_ADVISORY}\n\n${objective}`;
|
|
43
43
|
}
|
|
44
|
-
export const SANDBOX_K8S_ONLY_400_ANCHOR = 'only supported on the k8s sandbox backend';
|
|
45
|
-
export const SANDBOX_NO_IMAGE_INDEX_400_ANCHOR = 'requires the image index';
|
|
46
|
-
export const SANDBOX_NO_PUBLISHED_IMAGE_404_ANCHOR = 'no published sandbox image for profile';
|
|
47
44
|
export const SANDBOX_CASCADE_CONFLICT_400_ANCHOR = 'not supported together with cascade/verify';
|
|
48
45
|
export const SANDBOX_HINT_HOSTS = Object.freeze(['terminal', 'web', 'desktop']);
|
|
49
46
|
const SANDBOX_HINT_ARMS = Object.freeze({
|
|
@@ -146,12 +143,6 @@ export function sandboxDegradeHint(err, host, sentRequest) {
|
|
|
146
143
|
const msg = err.message;
|
|
147
144
|
if (typeof msg !== 'string')
|
|
148
145
|
return undefined;
|
|
149
|
-
if (noCode && status === 400 && msg.includes(SANDBOX_K8S_ONLY_400_ANCHOR))
|
|
150
|
-
return sandboxHintOf(SANDBOX_HINT_ARMS.k8sLaneOnly, host);
|
|
151
|
-
if (noCode && status === 400 && msg.includes(SANDBOX_NO_IMAGE_INDEX_400_ANCHOR))
|
|
152
|
-
return sandboxHintOf(SANDBOX_HINT_ARMS.imageIndexRequired, host);
|
|
153
|
-
if (noCode && status === 404 && msg.includes(SANDBOX_NO_PUBLISHED_IMAGE_404_ANCHOR))
|
|
154
|
-
return sandboxHintOf(SANDBOX_HINT_ARMS.noPublishedImage404, host);
|
|
155
146
|
if (status === 400 && msg.includes(SANDBOX_CASCADE_CONFLICT_400_ANCHOR))
|
|
156
147
|
return sandboxHintOf(SANDBOX_HINT_ARMS.cascadeConflict400, host);
|
|
157
148
|
return undefined;
|
package/dist/seam.d.ts
CHANGED
|
@@ -1,10 +1,11 @@
|
|
|
1
1
|
import type { ModelUsage, SDKMessage } from '@sema-agent/agent-types';
|
|
2
2
|
import type { EngineTurnUsage } from './adapter/downstream/turnUsageToModelUsage.js';
|
|
3
3
|
import type { RunCostReconcile } from './adapter/downstream/terminalToSdkResult.js';
|
|
4
|
-
import type { WiringManifestAutoMode, WiringManifestModelGate, WiringManifestMcpEntryView,
|
|
4
|
+
import type { WiringManifestAutoMode, WiringManifestModelGate, WiringManifestMcpEntryView, WiringManifestLspSeamView, WiringManifestWriteProtectionView, WiringManifestAutoConsolidationView, WiringManifestReadDenyView, WiringManifestModView, ContextUsageSectionView, PromptManifestSectionView, PromptManifestBlockView, PromptManifestToolView, PromptManifestIdentityView } from './adapter/downstream/eventToSdkMessage.js';
|
|
5
5
|
import type { ToolRosterView, ToolRosterDeltaView, WiringManifestHandsView } from './toolRoster.js';
|
|
6
6
|
import type { WiringManifestFleetView } from './adapter/downstream/wiringManifestView.js';
|
|
7
7
|
import type { SuspendedReopenReading } from './hitl/suspendedReopen.js';
|
|
8
|
+
import type { PlanReviewCardFacts } from './planReviewCardFacts.js';
|
|
8
9
|
import type { ToolKillCause } from './toolResult.js';
|
|
9
10
|
import type { HumanInputAttachmentView } from './ownKey.js';
|
|
10
11
|
import type { TaskNotificationFields } from './notifications.js';
|
|
@@ -117,6 +118,7 @@ export type ChromeEvent = {
|
|
|
117
118
|
summary: string;
|
|
118
119
|
message: string;
|
|
119
120
|
notification: Readonly<TaskNotificationFields>;
|
|
121
|
+
diagnostics?: string;
|
|
120
122
|
} | {
|
|
121
123
|
kind: 'task_ledger_sync';
|
|
122
124
|
laneProof: LaneProof;
|
|
@@ -159,10 +161,11 @@ export type ChromeEvent = {
|
|
|
159
161
|
kind: 'plan_review_park';
|
|
160
162
|
laneProof: LaneProof;
|
|
161
163
|
result: unknown;
|
|
164
|
+
planReview?: PlanReviewCardFacts;
|
|
162
165
|
} | ({
|
|
163
166
|
kind: 'run_cost_reconciled';
|
|
164
167
|
laneProof: LaneProof;
|
|
165
|
-
} & RunCostReconcile) | HumanInputChromeEvent | MessageCommittedChromeEvent | EngineNoticeChromeEvent | TextSegmentEndChromeEvent | ThinkingSegmentEndChromeEvent | ToolDisclosureChromeEvent | ToolProgressChromeEvent | ToolRosterDeltaChromeEvent | ContextUsageChromeEvent | CompactionOutcomeChromeEvent | CompactionStartedChromeEvent | SubagentStartedChromeEvent | PromptAssembledChromeEvent | MemorySavedChromeEvent | WiringManifestChromeEvent | ResultTextDivergedChromeEvent | ResultReplayedChromeEvent | ToolParkedChromeEvent | ApprovalRequestChromeEvent | ApprovalRevokeChromeEvent | {
|
|
168
|
+
} & RunCostReconcile) | HumanInputChromeEvent | MessageCommittedChromeEvent | EngineNoticeChromeEvent | TextSegmentEndChromeEvent | ThinkingSegmentEndChromeEvent | ToolDisclosureChromeEvent | ToolProgressChromeEvent | ToolRosterDeltaChromeEvent | ContextUsageChromeEvent | CompactionOutcomeChromeEvent | CompactionStartedChromeEvent | SubagentStartedChromeEvent | PromptAssembledChromeEvent | MemorySavedChromeEvent | WiringManifestChromeEvent | ResultTextDivergedChromeEvent | ResultReplayedChromeEvent | ToolParkedChromeEvent | ApprovalRequestChromeEvent | ApprovalRevokeChromeEvent | ApprovalCompleteChromeEvent | SessionTitledChromeEvent | {
|
|
166
169
|
kind: 'suspended_reopened';
|
|
167
170
|
laneProof: LaneProof;
|
|
168
171
|
reopen: Extract<SuspendedReopenReading, {
|
|
@@ -179,7 +182,6 @@ export interface WiringManifestChromeEvent {
|
|
|
179
182
|
autoMode?: WiringManifestAutoMode;
|
|
180
183
|
mcp?: readonly WiringManifestMcpEntryView[];
|
|
181
184
|
tools?: ToolRosterView;
|
|
182
|
-
hooks?: readonly WiringManifestHookEntryView[];
|
|
183
185
|
lsp?: WiringManifestLspSeamView;
|
|
184
186
|
writeProtection?: WiringManifestWriteProtectionView;
|
|
185
187
|
autoConsolidation?: WiringManifestAutoConsolidationView;
|
|
@@ -308,17 +310,25 @@ export interface ThinkingSegmentEndChromeEvent {
|
|
|
308
310
|
committedUuids?: readonly string[];
|
|
309
311
|
eventId?: string;
|
|
310
312
|
}
|
|
311
|
-
export interface ApprovalRequestChromeEvent {
|
|
313
|
+
export interface ApprovalRequestChromeEvent extends ApprovalFrameChromeEnvelope {
|
|
312
314
|
kind: 'approval_request';
|
|
315
|
+
}
|
|
316
|
+
export interface ApprovalFrameChromeEnvelope {
|
|
313
317
|
laneProof: LaneProof;
|
|
314
318
|
frame: unknown;
|
|
315
319
|
schemaVersion: number;
|
|
316
320
|
}
|
|
317
|
-
export interface
|
|
321
|
+
export interface ApprovalCompleteChromeEvent extends ApprovalFrameChromeEnvelope {
|
|
322
|
+
kind: 'approval_complete';
|
|
323
|
+
}
|
|
324
|
+
export interface ApprovalRevokeChromeEvent extends ApprovalFrameChromeEnvelope {
|
|
318
325
|
kind: 'approval_revoke';
|
|
326
|
+
}
|
|
327
|
+
export interface SessionTitledChromeEvent {
|
|
328
|
+
kind: 'session_titled';
|
|
319
329
|
laneProof: LaneProof;
|
|
320
|
-
|
|
321
|
-
|
|
330
|
+
sessionId: string;
|
|
331
|
+
title: string;
|
|
322
332
|
}
|
|
323
333
|
export interface ResultTextDivergedChromeEvent {
|
|
324
334
|
kind: 'result_text_diverged';
|
package/dist/seam.js
CHANGED
|
@@ -32,7 +32,7 @@ const CHROME_ARM_TABLE = {
|
|
|
32
32
|
'🔴 `usageMissing` 在场时同行 usage 是**下界**,渲「≥」不渲已知账;' +
|
|
33
33
|
'🔴 终帧的 `_sema_nested_usage_by_task` 是同一份账的**收口快照**,两者**不相加**(本臂是增量、那是合计)',
|
|
34
34
|
},
|
|
35
|
-
plan_review_park: { required: true, duty: '弹 plan 审批卡(fail-soft,不挡后续终态帧)' },
|
|
35
|
+
plan_review_park: { required: true, duty: '弹 plan 审批卡(fail-soft,不挡后续终态帧);卡事实 `planReview` 在场时按它出选项与原因句(只有 shown 给批准档)' },
|
|
36
36
|
run_cost_reconciled: {
|
|
37
37
|
required: false,
|
|
38
38
|
duty: '可选:终局成本对账(own / nested / compaction 三段 + reconciled = own + nested)。' +
|
|
@@ -168,6 +168,18 @@ const CHROME_ARM_TABLE = {
|
|
|
168
168
|
'🔴 三纪律:①按 taskId 归属过滤(孤儿撤帧行非我即忽略)②账本重放的撤帧只用于时间线渲染,卡集基准恒为开流 preamble' +
|
|
169
169
|
'(撤帧可能整帧丢失)③已 DECIDED 的兄弟不在 askIds 里;真撤到本地卡时给一行归因(reason 消毒后呈现),零命中不要多说那一行',
|
|
170
170
|
},
|
|
171
|
+
approval_complete: {
|
|
172
|
+
required: true,
|
|
173
|
+
duty: '用 sdk isApprovalCompleteFrameV1 窄化 frame 取 askId/outcome/cause/parked;窄不下来按 askId(若有)清卡、别猜结局;按开卡帧的 askId 清本地卡' +
|
|
174
|
+
'(与撤卡帧不冲突,两帧都可能到;清卡是这张卡的一条出口,呈卡臂登记的持有句柄照放);🔴 永不据本帧推断 run 的归宿(读 run 行 / 停驻面),' +
|
|
175
|
+
'expired 不是拒绝,带 parked 的是转进耐久队列、还在等人;账本重放的消卡帧只用于时间线渲染,卡集对账基准恒为开流 preamble(帧可能整帧丢失)',
|
|
176
|
+
},
|
|
177
|
+
session_titled: {
|
|
178
|
+
required: false,
|
|
179
|
+
duty: '可选:按 sessionId(服务端会话 id)把那一条会话行的标题刷新成 title(与行上同值,写进宿主自己那一份会话行);' +
|
|
180
|
+
'🔴 会话行 title 是唯一真源:本臂只活不存、可能不到(冷启动 / 多窗口 / 断线重连读行),没收到 ≠ 还没有标题;' +
|
|
181
|
+
'title 是模型产文,只渲染、永不回喂模型;座位上由宿主刷新会话行后经 session_updated 推给渲染端',
|
|
182
|
+
},
|
|
171
183
|
text_segment_end: {
|
|
172
184
|
required: true,
|
|
173
185
|
duty: '🔴 引擎明报的 assistant 散文段边界 + **该段权威全文**(server ≥7.75.3 起 content 经脱敏器、' +
|
package/dist/seatContract.d.ts
CHANGED
|
@@ -14,7 +14,8 @@ import type { DeviceEnrollTokenOutcome, DeviceListOutcome, DeviceRebindOutcome,
|
|
|
14
14
|
import type { McpPanelView } from "./mcpPanel.js";
|
|
15
15
|
import type { McpToolToggleKey } from "./mcpToolToggles.js";
|
|
16
16
|
import { type ThinkingLatchEvent, type ThinkingLatchRowWord } from "./thinkingLatchWords.js";
|
|
17
|
-
import type { SessionRowPatchFields } from "./sessionRowTag.js";
|
|
17
|
+
import type { SessionRowPatchFields, SessionRowUnreadable } from "./sessionRowTag.js";
|
|
18
|
+
import { type SessionEngineView } from "./sessionEngine.js";
|
|
18
19
|
export interface SeatValidationFailure {
|
|
19
20
|
reason: string;
|
|
20
21
|
field?: string;
|
|
@@ -50,7 +51,10 @@ export interface LocalSessionRecord {
|
|
|
50
51
|
parked?: boolean;
|
|
51
52
|
pinned?: boolean;
|
|
52
53
|
rowTag?: string;
|
|
54
|
+
unreadable?: SessionRowUnreadable;
|
|
53
55
|
thinkingLatch?: ThinkingLatchRowWord;
|
|
56
|
+
engine?: SessionEngineView;
|
|
57
|
+
executionLane?: string;
|
|
54
58
|
}
|
|
55
59
|
export declare const TOOL_PERMISSION_REQUEST_ID_DOMAINS: readonly ["live:", "durable:", "question:", "elicit:", "plan:"];
|
|
56
60
|
export type ToolPermissionRequestIdDomain = (typeof TOOL_PERMISSION_REQUEST_ID_DOMAINS)[number];
|
|
@@ -105,6 +109,7 @@ declare const CHROME_ARM_SEAT_ROUTE: {
|
|
|
105
109
|
readonly plan_review_park: "host";
|
|
106
110
|
readonly approval_request: "host";
|
|
107
111
|
readonly approval_revoke: "host";
|
|
112
|
+
readonly approval_complete: "host";
|
|
108
113
|
readonly task_ledger_sync: "host";
|
|
109
114
|
readonly inline_task_stats: "host";
|
|
110
115
|
readonly stream_delta: "host";
|
|
@@ -124,6 +129,7 @@ declare const CHROME_ARM_SEAT_ROUTE: {
|
|
|
124
129
|
readonly wiring_manifest: "host";
|
|
125
130
|
readonly suspended_reopened: "host";
|
|
126
131
|
readonly result_text_diverged: "host";
|
|
132
|
+
readonly session_titled: "host";
|
|
127
133
|
};
|
|
128
134
|
type SeatRoutedKind = {
|
|
129
135
|
[K in keyof typeof CHROME_ARM_SEAT_ROUTE]: (typeof CHROME_ARM_SEAT_ROUTE)[K] extends "seat" ? K : never;
|
|
@@ -194,7 +200,7 @@ export type SeatStreamReading = {
|
|
|
194
200
|
};
|
|
195
201
|
export declare function seatStreamDeltaMessage(event: SeatStreamDeltaSource, ids: SeatStreamDeltaIds): SeatStreamEventMessage | undefined;
|
|
196
202
|
export declare function readSeatStreamDelta(message: object): SeatStreamReading;
|
|
197
|
-
export declare const SEAT_CAPABILITY_NAMES: readonly ["pickFolder", "rewind", "recents", "patchSession", "devices", "engineTarget", "onboard", "mcpToolToggles", "thinkingLatch"];
|
|
203
|
+
export declare const SEAT_CAPABILITY_NAMES: readonly ["pickFolder", "rewind", "recents", "patchSession", "devices", "engineTarget", "onboard", "mcpToolToggles", "thinkingLatch", "computerUseSwitch", "engineModeDefaultOnly"];
|
|
198
204
|
export type SeatCapabilityName = (typeof SEAT_CAPABILITY_NAMES)[number];
|
|
199
205
|
export interface SeatCapabilitiesState {
|
|
200
206
|
pickFolder?: boolean;
|
|
@@ -206,6 +212,8 @@ export interface SeatCapabilitiesState {
|
|
|
206
212
|
onboard?: boolean;
|
|
207
213
|
mcpToolToggles?: boolean;
|
|
208
214
|
thinkingLatch?: boolean;
|
|
215
|
+
computerUseSwitch?: boolean;
|
|
216
|
+
engineModeDefaultOnly?: boolean;
|
|
209
217
|
}
|
|
210
218
|
export type SeatCapabilityReading = {
|
|
211
219
|
readonly kind: "reported";
|
|
@@ -589,6 +597,7 @@ export interface OnboardImportableProfile {
|
|
|
589
597
|
api: ModelApiWord;
|
|
590
598
|
hasKey: boolean;
|
|
591
599
|
models: string[];
|
|
600
|
+
isCurrent?: boolean;
|
|
592
601
|
}
|
|
593
602
|
export interface OnboardProvidersResult {
|
|
594
603
|
providers: OnboardProviderRow[];
|
|
@@ -600,6 +609,42 @@ export declare const checkMcpToolToggleKey: (v: unknown) => SeatValidation;
|
|
|
600
609
|
export interface McpToolTogglesResult {
|
|
601
610
|
off: McpToolToggleKey[];
|
|
602
611
|
}
|
|
612
|
+
export declare const COMPUTER_USE_SOURCES: readonly ["env", "settings", "default"];
|
|
613
|
+
export type ComputerUseSource = (typeof COMPUTER_USE_SOURCES)[number];
|
|
614
|
+
export declare const COMPUTER_USE_REFUSAL_REASONS: readonly ["locked-by-env", "confirmation-required", "invalid-request", "write-failed"];
|
|
615
|
+
export type ComputerUseRefusalReason = (typeof COMPUTER_USE_REFUSAL_REASONS)[number];
|
|
616
|
+
export declare const COMPUTER_USE_APPLIES_ON: readonly ["next-engine-start"];
|
|
617
|
+
export type ComputerUseAppliesOn = (typeof COMPUTER_USE_APPLIES_ON)[number];
|
|
618
|
+
export interface ComputerUseState {
|
|
619
|
+
enabled: boolean;
|
|
620
|
+
source: ComputerUseSource;
|
|
621
|
+
lockedByEnv: boolean;
|
|
622
|
+
appliesOn: ComputerUseAppliesOn;
|
|
623
|
+
}
|
|
624
|
+
export type SetComputerUseRequest = {
|
|
625
|
+
readonly enabled: false;
|
|
626
|
+
} | {
|
|
627
|
+
readonly enabled: true;
|
|
628
|
+
readonly confirmed: true;
|
|
629
|
+
};
|
|
630
|
+
export type SetComputerUseResult = {
|
|
631
|
+
ok: true;
|
|
632
|
+
changed: boolean;
|
|
633
|
+
state: ComputerUseState;
|
|
634
|
+
} | {
|
|
635
|
+
ok: false;
|
|
636
|
+
reason: ComputerUseRefusalReason;
|
|
637
|
+
state: ComputerUseState;
|
|
638
|
+
};
|
|
639
|
+
export declare const checkSetComputerUseRequest: (v: unknown) => SeatValidation;
|
|
640
|
+
export type SetComputerUsePlan = {
|
|
641
|
+
readonly kind: "apply";
|
|
642
|
+
readonly enabled: boolean;
|
|
643
|
+
} | {
|
|
644
|
+
readonly kind: "refused";
|
|
645
|
+
readonly reason: Exclude<ComputerUseRefusalReason, "write-failed">;
|
|
646
|
+
};
|
|
647
|
+
export declare function planSetComputerUse(request: {} | null | undefined, lockedByEnv: boolean): SetComputerUsePlan;
|
|
603
648
|
export interface LocalSessionsApi {
|
|
604
649
|
start(opts?: StartSessionOptions): Promise<LocalSessionRecord>;
|
|
605
650
|
sendMessage(req: SendMessageRequest): Promise<SendMessageAck>;
|
|
@@ -638,6 +683,8 @@ export interface LocalSessionsApi {
|
|
|
638
683
|
listMcpToolToggles(): Promise<McpToolTogglesResult>;
|
|
639
684
|
setMcpToolToggle(key: McpToolToggleKey, enabled: boolean): Promise<OkAck>;
|
|
640
685
|
setThinkingLatch(req: SetThinkingLatchRequest): Promise<OkAck>;
|
|
686
|
+
getComputerUse(): Promise<ComputerUseState>;
|
|
687
|
+
setComputerUse(req: SetComputerUseRequest): Promise<SetComputerUseResult>;
|
|
641
688
|
onEvent(cb: (ev: LocalSessionEvent) => void): () => void;
|
|
642
689
|
onToolPermissionRequest(cb: (req: ToolPermissionRequest) => void): () => void;
|
|
643
690
|
sessionsStateStore: EipcStoreClient<SessionsState>;
|
|
@@ -683,12 +730,12 @@ export declare const checkSetThinkingLatchRequest: (v: unknown) => SeatValidatio
|
|
|
683
730
|
export declare function isSetThinkingLatchRequest(v: unknown): v is SetThinkingLatchRequest;
|
|
684
731
|
export declare function isSendMessageAck(v: unknown): v is SendMessageAck;
|
|
685
732
|
export declare const LOCAL_SESSIONS_SPEC: EipcServiceSpec;
|
|
686
|
-
export declare const SEAT_METHOD_NAMES: readonly ["start", "sendMessage", "interrupt", "stop", "respondToToolPermission", "cancelQueuedMessage", "reorderQueuedMessage", "promoteQueuedMessage", "setFocusedSession", "setModel", "getTranscript", "searchSessions", "uploadAttachment", "listModels", "applyModelConfig", "pickFolder", "listRecentFolders", "noteRecentFolder", "patchSession", "listDevices", "readSessionBinding", "rebindSession", "issueEnrollToken", "revokeDevice", "setEngineMode", "startCloudLogin", "cancelCloudLogin", "connectCloudEngine", "configureCloudEngine", "clearCloudEngine", "listOnboardProviders", "probeOnboardEntry", "applyOnboardEntry", "readSessionMcpPanel", "listMcpToolToggles", "setMcpToolToggle", "setThinkingLatch", "onEvent", "onToolPermissionRequest"];
|
|
733
|
+
export declare const SEAT_METHOD_NAMES: readonly ["start", "sendMessage", "interrupt", "stop", "respondToToolPermission", "cancelQueuedMessage", "reorderQueuedMessage", "promoteQueuedMessage", "setFocusedSession", "setModel", "getTranscript", "searchSessions", "uploadAttachment", "listModels", "applyModelConfig", "pickFolder", "listRecentFolders", "noteRecentFolder", "patchSession", "listDevices", "readSessionBinding", "rebindSession", "issueEnrollToken", "revokeDevice", "setEngineMode", "startCloudLogin", "cancelCloudLogin", "connectCloudEngine", "configureCloudEngine", "clearCloudEngine", "listOnboardProviders", "probeOnboardEntry", "applyOnboardEntry", "readSessionMcpPanel", "listMcpToolToggles", "setMcpToolToggle", "setThinkingLatch", "getComputerUse", "setComputerUse", "onEvent", "onToolPermissionRequest"];
|
|
687
734
|
export declare const SEAT_STORE_PROPS: readonly ["sessionsStateStore", "focusedSessionStateStore", "settingsStateStore", "seatCapabilitiesStateStore", "engineTargetStateStore"];
|
|
688
735
|
export declare const SEAT_EVENT_METHOD_NAMES: readonly ["onEvent", "onToolPermissionRequest"];
|
|
689
736
|
export declare const LOCAL_SESSION_EVENT_KEYS: readonly ["type", "sessionId", "message", "error", "errorCategory", "code", "session", "userMessageUuid", "requestId", "outcome", "parked", "chrome", "_sema_turnFailure", "subagentContent"];
|
|
690
737
|
export declare const TOOL_PERMISSION_REQUEST_KEYS: readonly ["requestId", "sessionId", "toolName", "toolCallId", "input", "message", "toctouBinding", "createdAtMs", "governanceForced", "delegation", "mandated", "mandate", "origin", "ruleOffersAbsence", "askClass", "classes", "sessionRow"];
|
|
691
|
-
export declare const LOCAL_SESSION_RECORD_KEYS: readonly ["sessionId", "engineSessionId", "model", "title", "cwd", "isRunning", "createdAt", "lastActivityAt", "queuedMessages", "parked", "pinned", "rowTag", "thinkingLatch"];
|
|
738
|
+
export declare const LOCAL_SESSION_RECORD_KEYS: readonly ["sessionId", "engineSessionId", "model", "title", "cwd", "isRunning", "createdAt", "lastActivityAt", "queuedMessages", "parked", "pinned", "rowTag", "unreadable", "thinkingLatch", "engine", "executionLane"];
|
|
692
739
|
export declare const SEND_MESSAGE_REQUEST_KEYS: readonly ["sessionId", "text", "model", "userMessageUuid", "permissionMode", "attachmentIds", "reasoningEffort", "retainBackgroundProcesses", "forwardSubagentEvents", "retainSubagentSessions", "settings", "scenario", "rewind"];
|
|
693
740
|
export declare const SEAT_SEND_MESSAGE_KEY_ORIGINS: {
|
|
694
741
|
readonly sessionId: {
|
|
@@ -738,7 +785,7 @@ export declare const SEAT_VALIDATOR_KEY_COVERAGE: {
|
|
|
738
785
|
readonly LocalSessionRecord: {
|
|
739
786
|
readonly guard: "isLocalSessionRecord";
|
|
740
787
|
readonly check: (v: unknown) => SeatValidation;
|
|
741
|
-
readonly validated: readonly ["sessionId", "engineSessionId", "model", "title", "cwd", "isRunning", "createdAt", "lastActivityAt", "queuedMessages", "parked", "pinned", "rowTag", "thinkingLatch"];
|
|
788
|
+
readonly validated: readonly ["sessionId", "engineSessionId", "model", "title", "cwd", "isRunning", "createdAt", "lastActivityAt", "queuedMessages", "parked", "pinned", "rowTag", "unreadable", "thinkingLatch", "engine", "executionLane"];
|
|
742
789
|
readonly unchecked: readonly [];
|
|
743
790
|
};
|
|
744
791
|
readonly ToolPermissionRequest: {
|
|
@@ -804,6 +851,9 @@ export declare const SEAT_VALIDATOR_KEY_COVERAGE: {
|
|
|
804
851
|
}, {
|
|
805
852
|
readonly key: "candidateRejected";
|
|
806
853
|
readonly why: "诊断面(0.97.0 CC-715;当前配置是候选被整拒后回落的那一份),三态读法归 modelCandidateRejectedOf(含坏形 unreadable);出站门为它拒掉整份目录 = 选单为一行诊断整个消失。";
|
|
854
|
+
}, {
|
|
855
|
+
readonly key: "modelPlane";
|
|
856
|
+
readonly why: "诊断面(0.106.0 CC-1156;这台引擎服务的是哪张模型表 / 最近一份目录候选的结局),三态读法归 modelPlaneOf(含坏形 unreadable、表外词整位不给);出站门为它拒掉整份目录 = 选单为一行诊断整个消失。";
|
|
807
857
|
}];
|
|
808
858
|
};
|
|
809
859
|
readonly SendMessageRequest: {
|
|
@@ -877,7 +927,7 @@ export declare const SEAT_VALIDATOR_KEY_COVERAGE: {
|
|
|
877
927
|
};
|
|
878
928
|
readonly SeatCapabilitiesState: {
|
|
879
929
|
readonly check: (v: unknown) => SeatValidation;
|
|
880
|
-
readonly validated: readonly ["pickFolder", "rewind", "recents", "patchSession", "devices", "engineTarget", "onboard", "mcpToolToggles", "thinkingLatch"];
|
|
930
|
+
readonly validated: readonly ["pickFolder", "rewind", "recents", "patchSession", "devices", "engineTarget", "onboard", "mcpToolToggles", "thinkingLatch", "computerUseSwitch", "engineModeDefaultOnly"];
|
|
881
931
|
readonly unchecked: readonly [];
|
|
882
932
|
};
|
|
883
933
|
readonly RecentFoldersResult: {
|
|
@@ -917,7 +967,7 @@ export declare const SEAT_VALIDATOR_KEY_COVERAGE: {
|
|
|
917
967
|
};
|
|
918
968
|
};
|
|
919
969
|
export declare const SEAT_VALIDATOR_COVERAGE_EXEMPT: readonly [...{
|
|
920
|
-
label: "DeviceListOutcome" | "DeviceSessionBindingOutcome" | "DeviceRebindOutcome" | "DeviceEnrollTokenOutcome" | "DeviceRevokeOutcome" | "SeatDeviceRebindRequest" | "SeatDeviceRevokeRequest" | "EngineTargetState" | "EngineTargetResult" | "CloudLoginStart" | "CloudLoginCancelAck" | "CloudConnectResult" | "CloudLoginRequest" | "CloudEngineConnectRequest" | "CloudEngineConfigureRequest" | "OnboardProvidersResult" | "OnboardProbeResult" | "OnboardApplyResult" | "OnboardEntryRequest" | "OnboardApplyRequest" | "McpToolTogglesResult" | "McpToolToggleKey";
|
|
970
|
+
label: "DeviceListOutcome" | "DeviceSessionBindingOutcome" | "DeviceRebindOutcome" | "DeviceEnrollTokenOutcome" | "DeviceRevokeOutcome" | "SeatDeviceRebindRequest" | "SeatDeviceRevokeRequest" | "EngineTargetState" | "EngineTargetResult" | "CloudLoginStart" | "CloudLoginCancelAck" | "CloudConnectResult" | "CloudLoginRequest" | "CloudEngineConnectRequest" | "CloudEngineConfigureRequest" | "OnboardProvidersResult" | "OnboardProbeResult" | "OnboardApplyResult" | "OnboardEntryRequest" | "OnboardApplyRequest" | "McpToolTogglesResult" | "McpToolToggleKey" | "ComputerUseState" | "SetComputerUseResult" | "SetComputerUseRequest";
|
|
921
971
|
check: (v: unknown) => SeatValidation;
|
|
922
972
|
why: string;
|
|
923
973
|
}[], {
|
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) {
|
|
@@ -1254,6 +1365,7 @@ const SUBAGENT_CONTENT_SHAPE = shapeRule("subagent content", {
|
|
|
1254
1365
|
args: optF({ label: "passthrough", test: () => true }),
|
|
1255
1366
|
output: optF(R_STR),
|
|
1256
1367
|
isError: optF(R_BOOL),
|
|
1368
|
+
notExecuted: optF(R_TRUE),
|
|
1257
1369
|
});
|
|
1258
1370
|
export function readSeatSubagentContent(event) {
|
|
1259
1371
|
try {
|
|
@@ -1666,6 +1778,8 @@ export const LOCAL_SESSIONS_SPEC = {
|
|
|
1666
1778
|
listMcpToolToggles: { kind: "invoke", check: checkMcpToolTogglesResult },
|
|
1667
1779
|
setMcpToolToggle: { kind: "invoke", check: checkOkAck },
|
|
1668
1780
|
setThinkingLatch: { kind: "invoke", check: checkOkAck },
|
|
1781
|
+
getComputerUse: { kind: "invoke", check: checkComputerUseState },
|
|
1782
|
+
setComputerUse: { kind: "invoke", check: checkSetComputerUseResult },
|
|
1669
1783
|
onEvent: { kind: "event", check: checkLocalSessionEvent },
|
|
1670
1784
|
onToolPermissionRequest: { kind: "event", check: checkToolPermissionRequest },
|
|
1671
1785
|
},
|
|
@@ -1714,6 +1828,8 @@ export const SEAT_METHOD_NAMES = [
|
|
|
1714
1828
|
"listMcpToolToggles",
|
|
1715
1829
|
"setMcpToolToggle",
|
|
1716
1830
|
"setThinkingLatch",
|
|
1831
|
+
"getComputerUse",
|
|
1832
|
+
"setComputerUse",
|
|
1717
1833
|
"onEvent",
|
|
1718
1834
|
"onToolPermissionRequest",
|
|
1719
1835
|
];
|
|
@@ -1773,7 +1889,10 @@ export const LOCAL_SESSION_RECORD_KEYS = [
|
|
|
1773
1889
|
"parked",
|
|
1774
1890
|
"pinned",
|
|
1775
1891
|
"rowTag",
|
|
1892
|
+
"unreadable",
|
|
1776
1893
|
"thinkingLatch",
|
|
1894
|
+
"engine",
|
|
1895
|
+
"executionLane",
|
|
1777
1896
|
];
|
|
1778
1897
|
export const SEND_MESSAGE_REQUEST_KEYS = [
|
|
1779
1898
|
"sessionId",
|
|
@@ -1818,7 +1937,7 @@ export const SEAT_VALIDATOR_KEY_COVERAGE = {
|
|
|
1818
1937
|
LocalSessionRecord: {
|
|
1819
1938
|
guard: "isLocalSessionRecord",
|
|
1820
1939
|
check: checkLocalSessionRecord,
|
|
1821
|
-
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"],
|
|
1822
1941
|
unchecked: [],
|
|
1823
1942
|
},
|
|
1824
1943
|
ToolPermissionRequest: {
|
|
@@ -1914,6 +2033,10 @@ export const SEAT_VALIDATOR_KEY_COVERAGE = {
|
|
|
1914
2033
|
key: "candidateRejected",
|
|
1915
2034
|
why: "诊断面(0.97.0 CC-715;当前配置是候选被整拒后回落的那一份),三态读法归 modelCandidateRejectedOf(含坏形 unreadable);出站门为它拒掉整份目录 = 选单为一行诊断整个消失。",
|
|
1916
2035
|
},
|
|
2036
|
+
{
|
|
2037
|
+
key: "modelPlane",
|
|
2038
|
+
why: "诊断面(0.106.0 CC-1156;这台引擎服务的是哪张模型表 / 最近一份目录候选的结局),三态读法归 modelPlaneOf(含坏形 unreadable、表外词整位不给);出站门为它拒掉整份目录 = 选单为一行诊断整个消失。",
|
|
2039
|
+
},
|
|
1917
2040
|
],
|
|
1918
2041
|
},
|
|
1919
2042
|
SendMessageRequest: {
|
|
@@ -2001,7 +2124,7 @@ export const SEAT_VALIDATOR_KEY_COVERAGE = {
|
|
|
2001
2124
|
},
|
|
2002
2125
|
SeatCapabilitiesState: {
|
|
2003
2126
|
check: checkSeatCapabilitiesState,
|
|
2004
|
-
validated: ["pickFolder", "rewind", "recents", "patchSession", "devices", "engineTarget", "onboard", "mcpToolToggles", "thinkingLatch"],
|
|
2127
|
+
validated: ["pickFolder", "rewind", "recents", "patchSession", "devices", "engineTarget", "onboard", "mcpToolToggles", "thinkingLatch", "computerUseSwitch", "engineModeDefaultOnly"],
|
|
2005
2128
|
unchecked: [],
|
|
2006
2129
|
},
|
|
2007
2130
|
RecentFoldersResult: {
|
|
@@ -2064,6 +2187,9 @@ export const SEAT_VALIDATOR_COVERAGE_EXEMPT = [
|
|
|
2064
2187
|
["OnboardApplyRequest", checkOnboardApplyRequest],
|
|
2065
2188
|
["McpToolTogglesResult", checkMcpToolTogglesResult],
|
|
2066
2189
|
["McpToolToggleKey", checkMcpToolToggleKey],
|
|
2190
|
+
["ComputerUseState", checkComputerUseState],
|
|
2191
|
+
["SetComputerUseResult", checkSetComputerUseResult],
|
|
2192
|
+
["SetComputerUseRequest", checkSetComputerUseRequest],
|
|
2067
2193
|
].map(([label, check]) => ({
|
|
2068
2194
|
label,
|
|
2069
2195
|
check,
|
|
@@ -2119,5 +2245,9 @@ const _seatContractPins = [
|
|
|
2119
2245
|
true, true, true, true, true, true,
|
|
2120
2246
|
true, true, true,
|
|
2121
2247
|
true, true,
|
|
2248
|
+
true, true, true,
|
|
2249
|
+
true, true,
|
|
2250
|
+
true, true, true, true,
|
|
2251
|
+
true, true,
|
|
2122
2252
|
];
|
|
2123
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;
|