@sema-agent/client-core 0.109.0 → 0.111.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 +342 -0
- package/README.md +88 -32
- package/dist/abortableSleep.d.ts +7 -0
- package/dist/abortableSleep.js +37 -0
- package/dist/adapt/arms.js +45 -11
- package/dist/adapt/toolCards.d.ts +3 -1
- package/dist/adapt/toolCards.js +4 -2
- package/dist/adapter/activeRunSelfHeal.d.ts +39 -0
- package/dist/adapter/activeRunSelfHeal.js +171 -3
- package/dist/adapter/downstream/eventToSdkMessage.js +20 -15
- package/dist/adapter/downstream/terminalToSdkResult.d.ts +2 -0
- package/dist/adapter/downstream/terminalToSdkResult.js +11 -0
- package/dist/adapter/runStream.d.ts +5 -0
- package/dist/adapter/runStream.js +15 -3
- package/dist/attachmentRoute.d.ts +20 -0
- package/dist/attachmentRoute.js +39 -0
- package/dist/attachmentsWireCaps.js +1 -1
- package/dist/builtinOutputStyles.d.ts +12 -0
- package/dist/builtinOutputStyles.js +147 -0
- package/dist/compactionStatus.d.ts +9 -0
- package/dist/compactionStatus.js +29 -5
- package/dist/controlRouter.js +2 -1
- package/dist/coreValuePorts.d.ts +39 -1
- package/dist/coreValuePorts.js +10 -0
- package/dist/declared/supportFloorDeclared.js +1 -1
- package/dist/displayUntrusted.d.ts +1 -0
- package/dist/displayUntrusted.js +138 -14
- package/dist/engineErrorCodes.d.ts +3 -0
- package/dist/engineErrorCodes.js +3 -0
- package/dist/engineHealthFacts.d.ts +20 -0
- package/dist/engineHealthFacts.js +42 -1
- package/dist/engineHealthProbeVerdict.d.ts +23 -0
- package/dist/engineHealthProbeVerdict.js +115 -0
- package/dist/engineInlineTaskStats.d.ts +4 -3
- package/dist/engineInlineTaskStats.js +18 -2
- package/dist/engineNoticeCodes.d.ts +10 -0
- package/dist/engineNoticeCodes.js +36 -6
- package/dist/engineRepoint.d.ts +147 -0
- package/dist/engineRepoint.js +310 -0
- package/dist/engineRowRef.d.ts +3 -0
- package/dist/engineRowRef.js +13 -1
- package/dist/engineSessionMessages.d.ts +2 -1
- package/dist/engineSessionMessages.js +5 -0
- package/dist/engineSwapCrossing.d.ts +57 -0
- package/dist/engineSwapCrossing.js +297 -0
- package/dist/engineUnavailable.d.ts +44 -0
- package/dist/engineUnavailable.js +492 -0
- package/dist/errorSupplementRoles.js +2 -1
- package/dist/eventLeg.js +3 -3
- package/dist/fleet/fleetProjection.js +3 -2
- package/dist/generated/engineFactTables.d.ts +2 -0
- package/dist/generated/engineFactTables.js +12 -0
- package/dist/generated/sdkFactTables.d.ts +2 -1
- package/dist/generated/sdkFactTables.js +5 -0
- package/dist/generated/settingsSchemaTables.d.ts +4 -0
- package/dist/generated/settingsSchemaTables.js +1 -0
- package/dist/hitl/approvalAskers.d.ts +6 -0
- package/dist/hitl/approvalAskers.js +30 -0
- package/dist/hitl/approvalCardReasons.js +6 -3
- package/dist/hitl/approvalDelivery.d.ts +1 -0
- package/dist/hitl/approvalDelivery.js +1 -1
- package/dist/hitl/approvalRequestFrameReading.d.ts +7 -0
- package/dist/hitl/approvalRequestFrameReading.js +11 -0
- package/dist/hitl/approvalResolution.d.ts +9 -2
- package/dist/hitl/approvalResolution.js +6 -1
- package/dist/hitl/askGateWire.js +5 -8
- package/dist/hitl/automaticAnswerVerdict.js +2 -2
- package/dist/hitl/decisionConflict.js +6 -3
- package/dist/hitl/decisionRefusal.d.ts +2 -0
- package/dist/hitl/decisionRefusal.js +8 -8
- package/dist/hitl/decisionRefusalCarrier.d.ts +3 -0
- package/dist/hitl/decisionRefusalCarrier.js +348 -0
- package/dist/hitl/decisionSend.d.ts +10 -0
- package/dist/hitl/decisionSend.js +57 -17
- package/dist/hitl/editedApprovalAcceptance.d.ts +25 -0
- package/dist/hitl/editedApprovalAcceptance.js +26 -0
- package/dist/hitl/elicitationRefusal.d.ts +4 -0
- package/dist/hitl/elicitationRefusal.js +23 -0
- package/dist/hitl/frameRouter.d.ts +2 -2
- package/dist/hitl/frameRouter.js +12 -33
- package/dist/hitl/gateIdentity.d.ts +5 -0
- package/dist/hitl/gateIdentity.js +23 -0
- package/dist/hitl/gateLedger.d.ts +0 -4
- package/dist/hitl/gateLedger.js +0 -19
- package/dist/hitl/hitlBridge.d.ts +7 -0
- package/dist/hitl/hitlBridge.js +14 -8
- package/dist/hitl/hitlHostSurface.d.ts +3 -1
- package/dist/hitl/hitlHostSurface.js +14 -4
- package/dist/hitl/hostWithdrawal.d.ts +15 -0
- package/dist/hitl/hostWithdrawal.js +38 -0
- package/dist/hitl/localAllowRedemption.d.ts +67 -0
- package/dist/hitl/localAllowRedemption.js +256 -0
- package/dist/hitl/parkResolver.js +32 -13
- package/dist/hitl/persistedRulesWire.d.ts +16 -0
- package/dist/hitl/persistedRulesWire.js +72 -2
- package/dist/hitl/planReviewWire.d.ts +3 -0
- package/dist/hitl/planReviewWire.js +37 -10
- package/dist/hitl/policyDenyCause.d.ts +1 -1
- package/dist/hitl/policyDenyCause.js +1 -1
- package/dist/hitl/resumeRunningCard.d.ts +1 -0
- package/dist/hitl/resumeRunningCard.js +1 -0
- package/dist/hitl/screenCardCarriers.d.ts +15 -0
- package/dist/hitl/screenCardCarriers.js +41 -0
- package/dist/hitl/screenDecisionCards.d.ts +98 -0
- package/dist/hitl/screenDecisionCards.js +362 -0
- package/dist/hitl/sessionPolicyWire.js +6 -4
- package/dist/hitl/standingRows.d.ts +4 -1
- package/dist/hitl/standingRows.js +33 -1
- package/dist/hitl/toolApprovalWire.d.ts +64 -15
- package/dist/hitl/toolApprovalWire.js +470 -125
- package/dist/hooksWireCaps.js +31 -1
- package/dist/hostSettingNoticeArm.d.ts +3 -0
- package/dist/hostSettingNoticeArm.js +12 -0
- package/dist/hostTurnSettings.d.ts +13 -4
- package/dist/hostTurnSettings.js +150 -10
- package/dist/humanTurnRead.js +11 -1
- package/dist/i18n/messages.en.d.ts +212 -0
- package/dist/i18n/messages.en.js +217 -5
- package/dist/i18n/messages.zh.js +235 -5
- package/dist/i18n/translate.d.ts +3 -0
- package/dist/i18n/translate.js +78 -10
- package/dist/i18n/zh.d.ts +1 -0
- package/dist/i18n/zh.js +1 -0
- package/dist/index.d.ts +56 -16
- package/dist/index.js +40 -12
- package/dist/inheritEnvCapability.js +2 -0
- package/dist/inputAuthor.d.ts +16 -0
- package/dist/inputAuthor.js +44 -0
- package/dist/interactiveHalt.js +2 -1
- package/dist/interactiveInterrupt.js +20 -2
- package/dist/interruptRefusalNote.d.ts +2 -0
- package/dist/interruptRefusalNote.js +17 -0
- package/dist/liveModelCatalog.d.ts +2 -0
- package/dist/liveModelCatalog.js +23 -9
- package/dist/liveQuestionStore.d.ts +4 -1
- package/dist/liveQuestionStore.js +12 -3
- package/dist/localEngineSeatReading.d.ts +2 -2
- package/dist/localEngineSeatReading.js +5 -3
- package/dist/localEngineSpawn.d.ts +0 -7
- package/dist/localEngineSpawn.js +0 -92
- package/dist/localEngineStep.d.ts +2 -2
- package/dist/localEngineStep.js +2 -0
- package/dist/mcpEngineLeg.d.ts +3 -0
- package/dist/mcpEngineLeg.js +38 -1
- package/dist/mcpPanel.js +2 -0
- package/dist/mcpReconnect.d.ts +9 -1
- package/dist/mcpReconnect.js +124 -19
- package/dist/mcpWireCaps.js +1 -1
- package/dist/model/engineModelWords.d.ts +3 -0
- package/dist/model/engineModelWords.js +13 -0
- package/dist/model/subagentModelWord.d.ts +21 -2
- package/dist/model/subagentModelWord.js +100 -29
- package/dist/modelCapabilityProbe.js +7 -43
- package/dist/modsFace.d.ts +8 -1
- package/dist/modsFace.js +27 -0
- package/dist/notifications.d.ts +36 -6
- package/dist/notifications.js +170 -20
- package/dist/ownKey.d.ts +6 -5
- package/dist/ownKey.js +31 -7
- package/dist/peerFrames.d.ts +40 -2
- package/dist/peerFrames.js +158 -3
- package/dist/pendingUserRow.d.ts +4 -0
- package/dist/pendingUserRow.js +16 -0
- package/dist/permissionsDeclaration.d.ts +1 -0
- package/dist/permissionsDeclaration.js +11 -1
- package/dist/planReviewCardFacts.d.ts +3 -0
- package/dist/planReviewCardFacts.js +52 -2
- package/dist/pluginHooksWire.d.ts +10 -1
- package/dist/pluginHooksWire.js +96 -7
- package/dist/printToolResultFrame.js +4 -2
- package/dist/promptBlockedCopy.js +11 -6
- package/dist/promptSuggestionBatch.d.ts +7 -0
- package/dist/promptSuggestionBatch.js +9 -0
- package/dist/promptSuggestionsTail.d.ts +39 -0
- package/dist/promptSuggestionsTail.js +116 -0
- package/dist/replayBody.js +10 -2
- package/dist/request/taskRequest.d.ts +5 -0
- package/dist/request/taskRequest.js +142 -21
- package/dist/requestCoordinate.d.ts +1 -0
- package/dist/requestCoordinate.js +13 -0
- package/dist/resumeRefusalCopy.d.ts +1 -3
- package/dist/resumeRefusalCopy.js +2 -1
- package/dist/retryStatus.d.ts +2 -2
- package/dist/retryStatus.js +2 -0
- package/dist/rewindArchiveReading.js +4 -4
- package/dist/runCancelContext.d.ts +2 -1
- package/dist/runCancelContext.js +1 -0
- package/dist/runPermissionModeSwitch.js +2 -2
- package/dist/scenarioRefusal.js +11 -13
- package/dist/scenarioSkills.js +11 -6
- package/dist/seam.d.ts +27 -2
- package/dist/seam.js +17 -1
- package/dist/seatContract.d.ts +189 -12
- package/dist/seatContract.js +401 -9
- package/dist/sessionBackground.js +2 -1
- package/dist/sessionBackgroundHandoff.js +2 -1
- package/dist/sessionCostReading.d.ts +70 -0
- package/dist/sessionCostReading.js +150 -0
- package/dist/sessionEngine.d.ts +2 -0
- package/dist/sessionEngine.js +111 -0
- package/dist/sessionHooksRoster.d.ts +4 -0
- package/dist/sessionHooksRoster.js +158 -0
- package/dist/sessionMemoryStatus.d.ts +2 -1
- package/dist/sessionMemoryStatus.js +2 -2
- package/dist/sessionReadRedaction.d.ts +7 -0
- package/dist/sessionReadRedaction.js +26 -0
- package/dist/sessionSyncFileHistory.d.ts +4 -0
- package/dist/sessionSyncFileHistory.js +27 -0
- package/dist/settingsHooksSalvage.js +2 -1
- package/dist/sseIdleTriage.d.ts +13 -1
- package/dist/sseIdleTriage.js +25 -6
- package/dist/storeDurabilityWord.d.ts +15 -0
- package/dist/storeDurabilityWord.js +18 -0
- package/dist/storePostureCapability.d.ts +7 -3
- package/dist/storePostureCapability.js +69 -39
- package/dist/subagent/engineSubagentResume.js +2 -2
- package/dist/subagent/engineSubagentTail.js +8 -1
- package/dist/subagentContentStore.d.ts +11 -0
- package/dist/subagentContentStore.js +28 -2
- package/dist/terminalStatuses.d.ts +1 -0
- package/dist/terminalStatuses.js +4 -1
- package/dist/toolResult.d.ts +1 -0
- package/dist/toolResult.js +2 -0
- package/dist/turnFailurePresentation.js +9 -2
- package/dist/typePins.d.ts +11 -0
- package/dist/usageAnalytics.d.ts +17 -0
- package/dist/usageAnalytics.js +44 -2
- package/dist/userAttachmentEnvelope.d.ts +2 -1
- package/dist/userAttachmentEnvelope.js +10 -0
- package/dist/wireErrorTriage.js +2 -1
- package/dist/wireFailureShape.d.ts +6 -5
- package/dist/wireFailureShape.js +150 -38
- package/dist/wireRefusalCopy.d.ts +16 -5
- package/dist/wireRefusalCopy.js +119 -86
- package/docs/INTEGRATION-CLIENTS.md +4228 -21
- package/package.json +7 -3
|
@@ -0,0 +1,348 @@
|
|
|
1
|
+
import { isSecretKeyName } from '../seatContract.js';
|
|
2
|
+
import { placeThrownExtraOnCopy, wireFailureCoreOf, wireFailureTextsOf } from '../wireFailureShape.js';
|
|
3
|
+
import { decideFailureNote } from '../decideFailureNote.js';
|
|
4
|
+
import { REFUSAL_ROUTES, classifyDecisionRefusal, decisionRefusalAskReading, decisionRefusalSaysAskGone, mintDecisionRefusalReading, readDecisionRefusalReading, } from './decisionRefusal.js';
|
|
5
|
+
import { decisionConflictOf } from './decisionConflict.js';
|
|
6
|
+
import { resumeReopenFromError } from './suspendedReopen.js';
|
|
7
|
+
import { askGoneFromError, decideParkMovedFromError, decideRefusalFromError, decideRequiresBindingFromError } from '../decideReceipt.js';
|
|
8
|
+
import { corruptStoredRowWhere, resumeRetryLaterFromError, scenarioDenyFromError } from '../wireErrorTriage.js';
|
|
9
|
+
import { checkpointUnsupportedVersionFromError, parkedResumeStartupFromError, refusedParkFromError, requireExistingSessionRefusalFromError, resumeContextUnavailableFromError, resumePolicyBlockFromError, resumeRefusalFromError, } from '../resumeRefusalCopy.js';
|
|
10
|
+
import { admissionWallRefusalFromError, autonomyLaneRefusalFromError, bodyShapeRefusalFromError, cancelConflictFromError, denyAttributionRefusalFromError, envCredentialRefusalFromError, fieldLimitRefusalFromError, fleetLeaseUnavailableFromError, hostPostureRefusalFromError, quotaExhaustedFromError, runConcurrencyCapFromError, sessionArchiveStampedFromError, sessionDeleteConflictFromError, sessionIdRetiredFromError, settingsHooksRefusalFromError, toolDeclarationRefusalFromError, unreadRequestMembersFromError, unsupportedRuleRefusalFromError, usageWindowExhaustedFromError, userAttachmentRefusalFromError, userInvokedSkillRefusalFromError, } from '../wireRefusalCopy.js';
|
|
11
|
+
import { scenarioRefusalFromError } from '../scenarioRefusal.js';
|
|
12
|
+
import { inheritEnvRefusalFromError } from '../inheritEnvWire.js';
|
|
13
|
+
const DECISION_WORDS = { approve: true, deny: true };
|
|
14
|
+
const DECISIONS = Object.freeze([undefined, ...Object.keys(DECISION_WORDS)]);
|
|
15
|
+
const CONTEXTS = Object.freeze([undefined, ...REFUSAL_ROUTES.map((route) => Object.freeze({ route }))]);
|
|
16
|
+
const READERS = Object.freeze({
|
|
17
|
+
classifyDecisionRefusal: (e) => CONTEXTS.map((c) => classifyDecisionRefusal(e, c)),
|
|
18
|
+
readDecisionRefusalReading: (e) => CONTEXTS.map((c) => readDecisionRefusalReading(e, c)),
|
|
19
|
+
mintDecisionRefusalReading: (e) => [mintDecisionRefusalReading(e, undefined, true), mintDecisionRefusalReading(e, undefined, false)],
|
|
20
|
+
decisionRefusalAskReading: (e) => decisionRefusalAskReading(e),
|
|
21
|
+
decisionRefusalSaysAskGone: (e) => decisionRefusalSaysAskGone(e),
|
|
22
|
+
decideFailureNote: (e) => DECISIONS.map((d) => decideFailureNote(e, d)),
|
|
23
|
+
decisionConflictOf: (e) => decisionConflictOf(e),
|
|
24
|
+
corruptStoredRowWhere: (e) => corruptStoredRowWhere(e),
|
|
25
|
+
wireFailureCoreOf: (e) => wireFailureCoreOf(e),
|
|
26
|
+
wireFailureTextsOf: (e) => wireFailureTextsOf(e).reason,
|
|
27
|
+
admissionWallRefusalFromError: (e) => admissionWallRefusalFromError(e),
|
|
28
|
+
askGoneFromError: (e) => askGoneFromError(e),
|
|
29
|
+
autonomyLaneRefusalFromError: (e) => autonomyLaneRefusalFromError(e),
|
|
30
|
+
bodyShapeRefusalFromError: (e) => bodyShapeRefusalFromError(e),
|
|
31
|
+
cancelConflictFromError: (e) => cancelConflictFromError(e),
|
|
32
|
+
checkpointUnsupportedVersionFromError: (e) => checkpointUnsupportedVersionFromError(e),
|
|
33
|
+
decideParkMovedFromError: (e) => decideParkMovedFromError(e),
|
|
34
|
+
decideRefusalFromError: (e) => decideRefusalFromError(e),
|
|
35
|
+
decideRequiresBindingFromError: (e) => decideRequiresBindingFromError(e),
|
|
36
|
+
denyAttributionRefusalFromError: (e) => [denyAttributionRefusalFromError(e, true), denyAttributionRefusalFromError(e, false)],
|
|
37
|
+
envCredentialRefusalFromError: (e) => envCredentialRefusalFromError(e),
|
|
38
|
+
fieldLimitRefusalFromError: (e) => fieldLimitRefusalFromError(e),
|
|
39
|
+
fleetLeaseUnavailableFromError: (e) => fleetLeaseUnavailableFromError(e),
|
|
40
|
+
hostPostureRefusalFromError: (e) => hostPostureRefusalFromError(e, undefined),
|
|
41
|
+
inheritEnvRefusalFromError: (e) => inheritEnvRefusalFromError(e, undefined),
|
|
42
|
+
parkedResumeStartupFromError: (e) => DECISIONS.map((d) => parkedResumeStartupFromError(e, d)),
|
|
43
|
+
quotaExhaustedFromError: (e) => quotaExhaustedFromError(e),
|
|
44
|
+
refusedParkFromError: (e) => refusedParkFromError(e),
|
|
45
|
+
requireExistingSessionRefusalFromError: (e) => requireExistingSessionRefusalFromError(e),
|
|
46
|
+
resumeContextUnavailableFromError: (e) => resumeContextUnavailableFromError(e),
|
|
47
|
+
resumePolicyBlockFromError: (e) => resumePolicyBlockFromError(e),
|
|
48
|
+
resumeRefusalFromError: (e) => resumeRefusalFromError(e),
|
|
49
|
+
resumeReopenFromError: (e) => resumeReopenFromError(e),
|
|
50
|
+
resumeRetryLaterFromError: (e) => resumeRetryLaterFromError(e),
|
|
51
|
+
runConcurrencyCapFromError: (e) => runConcurrencyCapFromError(e),
|
|
52
|
+
scenarioDenyFromError: (e) => scenarioDenyFromError(e),
|
|
53
|
+
scenarioRefusalFromError: (e) => scenarioRefusalFromError(e),
|
|
54
|
+
sessionArchiveStampedFromError: (e) => sessionArchiveStampedFromError(e),
|
|
55
|
+
sessionDeleteConflictFromError: (e) => sessionDeleteConflictFromError(e),
|
|
56
|
+
sessionIdRetiredFromError: (e) => sessionIdRetiredFromError(e),
|
|
57
|
+
settingsHooksRefusalFromError: (e) => settingsHooksRefusalFromError(e),
|
|
58
|
+
toolDeclarationRefusalFromError: (e) => toolDeclarationRefusalFromError(e),
|
|
59
|
+
unreadRequestMembersFromError: (e) => unreadRequestMembersFromError(e),
|
|
60
|
+
unsupportedRuleRefusalFromError: (e) => unsupportedRuleRefusalFromError(e),
|
|
61
|
+
usageWindowExhaustedFromError: (e) => usageWindowExhaustedFromError(e),
|
|
62
|
+
userAttachmentRefusalFromError: (e) => userAttachmentRefusalFromError(e),
|
|
63
|
+
userInvokedSkillRefusalFromError: (e) => userInvokedSkillRefusalFromError(e),
|
|
64
|
+
});
|
|
65
|
+
export function decisionRefusalCarrierReaderNames() {
|
|
66
|
+
return Object.freeze(Object.keys(READERS));
|
|
67
|
+
}
|
|
68
|
+
const COPY_DEPTH_MAX = 16;
|
|
69
|
+
const COPY_NODES_MAX = 4096;
|
|
70
|
+
const COPY_KEYS_MAX = 1024;
|
|
71
|
+
const SKIP = Symbol('carrier-skip');
|
|
72
|
+
function ownDataDescriptor(o, k) {
|
|
73
|
+
try {
|
|
74
|
+
const d = Reflect.getOwnPropertyDescriptor(o, k);
|
|
75
|
+
return d !== undefined && Object.hasOwn(d, 'value') ? { value: d.value } : undefined;
|
|
76
|
+
}
|
|
77
|
+
catch {
|
|
78
|
+
return undefined;
|
|
79
|
+
}
|
|
80
|
+
}
|
|
81
|
+
function copyOf(v, depth, run) {
|
|
82
|
+
if (v === null || v === undefined || typeof v === 'string' || typeof v === 'boolean' || typeof v === 'number')
|
|
83
|
+
return v;
|
|
84
|
+
if (typeof v !== 'object' && typeof v !== 'function')
|
|
85
|
+
return SKIP;
|
|
86
|
+
const o = v;
|
|
87
|
+
if (depth > COPY_DEPTH_MAX || run.nodes >= COPY_NODES_MAX || run.path.has(o))
|
|
88
|
+
return SKIP;
|
|
89
|
+
run.nodes += 1;
|
|
90
|
+
run.path.add(o);
|
|
91
|
+
try {
|
|
92
|
+
let isArray;
|
|
93
|
+
try {
|
|
94
|
+
isArray = Array.isArray(o);
|
|
95
|
+
}
|
|
96
|
+
catch {
|
|
97
|
+
return SKIP;
|
|
98
|
+
}
|
|
99
|
+
if (isArray) {
|
|
100
|
+
const len = ownDataDescriptor(o, 'length')?.value;
|
|
101
|
+
if (typeof len !== 'number' || !Number.isInteger(len) || len < 0 || len > COPY_KEYS_MAX)
|
|
102
|
+
return SKIP;
|
|
103
|
+
const out = new Array(len);
|
|
104
|
+
for (let i = 0; i < len; i += 1) {
|
|
105
|
+
const d = ownDataDescriptor(o, String(i));
|
|
106
|
+
if (d === undefined)
|
|
107
|
+
continue;
|
|
108
|
+
const c = copyOf(d.value, depth + 1, run);
|
|
109
|
+
if (c !== SKIP)
|
|
110
|
+
out[i] = c;
|
|
111
|
+
}
|
|
112
|
+
return out;
|
|
113
|
+
}
|
|
114
|
+
let keys;
|
|
115
|
+
try {
|
|
116
|
+
keys = Reflect.ownKeys(o);
|
|
117
|
+
}
|
|
118
|
+
catch {
|
|
119
|
+
return SKIP;
|
|
120
|
+
}
|
|
121
|
+
const out = {};
|
|
122
|
+
let taken = 0;
|
|
123
|
+
for (let i = 0; i < keys.length; i += 1) {
|
|
124
|
+
const k = keys[i];
|
|
125
|
+
if (typeof k !== 'string')
|
|
126
|
+
continue;
|
|
127
|
+
if (taken >= COPY_KEYS_MAX)
|
|
128
|
+
break;
|
|
129
|
+
const d = ownDataDescriptor(o, k);
|
|
130
|
+
if (d === undefined)
|
|
131
|
+
continue;
|
|
132
|
+
const c = copyOf(d.value, depth + 1, run);
|
|
133
|
+
if (c === SKIP)
|
|
134
|
+
continue;
|
|
135
|
+
Object.defineProperty(out, k, { value: c, writable: true, enumerable: true, configurable: true });
|
|
136
|
+
taken += 1;
|
|
137
|
+
}
|
|
138
|
+
placeThrownExtraOnCopy(o, out, (bag) => {
|
|
139
|
+
const c = copyOf(bag, depth + 1, run);
|
|
140
|
+
return c === SKIP ? undefined : c;
|
|
141
|
+
});
|
|
142
|
+
return out;
|
|
143
|
+
}
|
|
144
|
+
finally {
|
|
145
|
+
run.path.delete(o);
|
|
146
|
+
}
|
|
147
|
+
}
|
|
148
|
+
const newWatch = (node) => ({ node, touched: new Set(), kids: new Map(), enumerated: false, whole: false });
|
|
149
|
+
function viewOf(w, watches) {
|
|
150
|
+
if (w.view !== undefined)
|
|
151
|
+
return w.view;
|
|
152
|
+
const kid = (k, v) => {
|
|
153
|
+
if (typeof v !== 'object' || v === null)
|
|
154
|
+
return v;
|
|
155
|
+
let c = w.kids.get(k);
|
|
156
|
+
if (c === undefined || c.node !== v) {
|
|
157
|
+
c = newWatch(v);
|
|
158
|
+
w.kids.set(k, c);
|
|
159
|
+
}
|
|
160
|
+
return viewOf(c, watches);
|
|
161
|
+
};
|
|
162
|
+
const view = new Proxy(w.node, {
|
|
163
|
+
getOwnPropertyDescriptor(t, k) {
|
|
164
|
+
const d = Reflect.getOwnPropertyDescriptor(t, k);
|
|
165
|
+
if (typeof k !== 'string')
|
|
166
|
+
return d;
|
|
167
|
+
w.touched.add(k);
|
|
168
|
+
return d !== undefined && Object.hasOwn(d, 'value') ? { ...d, value: kid(k, d.value) } : d;
|
|
169
|
+
},
|
|
170
|
+
get(t, k, receiver) {
|
|
171
|
+
if (typeof k !== 'string')
|
|
172
|
+
return Reflect.get(t, k, receiver);
|
|
173
|
+
w.touched.add(k);
|
|
174
|
+
return Object.hasOwn(t, k) ? kid(k, t[k]) : Reflect.get(t, k, receiver);
|
|
175
|
+
},
|
|
176
|
+
has(t, k) {
|
|
177
|
+
if (typeof k === 'string')
|
|
178
|
+
w.touched.add(k);
|
|
179
|
+
return Reflect.has(t, k);
|
|
180
|
+
},
|
|
181
|
+
ownKeys(t) {
|
|
182
|
+
w.enumerated = true;
|
|
183
|
+
return Reflect.ownKeys(t);
|
|
184
|
+
},
|
|
185
|
+
});
|
|
186
|
+
w.view = view;
|
|
187
|
+
watches.set(view, w);
|
|
188
|
+
return view;
|
|
189
|
+
}
|
|
190
|
+
function ownKeysReading(o) {
|
|
191
|
+
try {
|
|
192
|
+
return { kind: 'listed', keys: Reflect.ownKeys(o) };
|
|
193
|
+
}
|
|
194
|
+
catch {
|
|
195
|
+
return { kind: 'unreadable' };
|
|
196
|
+
}
|
|
197
|
+
}
|
|
198
|
+
function consumeOutput(out, watches, seen, depth) {
|
|
199
|
+
if ((typeof out !== 'object' && typeof out !== 'function') || out === null || depth > COPY_DEPTH_MAX || seen.has(out))
|
|
200
|
+
return;
|
|
201
|
+
const w = watches.get(out);
|
|
202
|
+
if (w !== undefined) {
|
|
203
|
+
w.whole = true;
|
|
204
|
+
return;
|
|
205
|
+
}
|
|
206
|
+
seen.add(out);
|
|
207
|
+
const listed = ownKeysReading(out);
|
|
208
|
+
if (listed.kind === 'unreadable')
|
|
209
|
+
return;
|
|
210
|
+
for (let i = 0; i < listed.keys.length; i += 1) {
|
|
211
|
+
const k = listed.keys[i];
|
|
212
|
+
if (typeof k !== 'string')
|
|
213
|
+
continue;
|
|
214
|
+
const d = ownDataDescriptor(out, k);
|
|
215
|
+
if (d !== undefined)
|
|
216
|
+
consumeOutput(d.value, watches, seen, depth + 1);
|
|
217
|
+
}
|
|
218
|
+
}
|
|
219
|
+
function wholeOf(v) {
|
|
220
|
+
if (typeof v !== 'object' || v === null)
|
|
221
|
+
return v;
|
|
222
|
+
if (Array.isArray(v)) {
|
|
223
|
+
const out = new Array(v.length);
|
|
224
|
+
for (let i = 0; i < v.length; i += 1)
|
|
225
|
+
if (Object.hasOwn(v, i))
|
|
226
|
+
out[i] = wholeOf(v[i]);
|
|
227
|
+
return out;
|
|
228
|
+
}
|
|
229
|
+
const out = {};
|
|
230
|
+
const names = Object.keys(v);
|
|
231
|
+
for (let i = 0; i < names.length; i += 1) {
|
|
232
|
+
const k = names[i];
|
|
233
|
+
if (isSecretKeyName(k))
|
|
234
|
+
continue;
|
|
235
|
+
Object.defineProperty(out, k, { value: wholeOf(v[k]), writable: true, enumerable: true, configurable: true });
|
|
236
|
+
}
|
|
237
|
+
return out;
|
|
238
|
+
}
|
|
239
|
+
function carried(w, k, v) {
|
|
240
|
+
if (typeof v !== 'object' || v === null)
|
|
241
|
+
return v;
|
|
242
|
+
if (w.whole)
|
|
243
|
+
return wholeOf(v);
|
|
244
|
+
const c = w.kids.get(k);
|
|
245
|
+
if (c !== undefined && c.node === v)
|
|
246
|
+
return pruned(c);
|
|
247
|
+
return Array.isArray(v) ? [] : {};
|
|
248
|
+
}
|
|
249
|
+
function pruned(w) {
|
|
250
|
+
if (w.whole)
|
|
251
|
+
return wholeOf(w.node);
|
|
252
|
+
const src = w.node;
|
|
253
|
+
if (Array.isArray(src)) {
|
|
254
|
+
const out = new Array(src.length);
|
|
255
|
+
for (let i = 0; i < src.length; i += 1) {
|
|
256
|
+
const k = String(i);
|
|
257
|
+
if (!Object.hasOwn(src, k))
|
|
258
|
+
continue;
|
|
259
|
+
if (w.touched.has(k))
|
|
260
|
+
out[i] = carried(w, k, src[k]);
|
|
261
|
+
else if (w.enumerated)
|
|
262
|
+
out[i] = null;
|
|
263
|
+
}
|
|
264
|
+
return out;
|
|
265
|
+
}
|
|
266
|
+
const out = {};
|
|
267
|
+
const names = Object.keys(src);
|
|
268
|
+
for (let i = 0; i < names.length; i += 1) {
|
|
269
|
+
const k = names[i];
|
|
270
|
+
if (isSecretKeyName(k))
|
|
271
|
+
continue;
|
|
272
|
+
const value = w.touched.has(k) ? carried(w, k, src[k]) : w.enumerated ? null : SKIP;
|
|
273
|
+
if (value !== SKIP)
|
|
274
|
+
Object.defineProperty(out, k, { value, writable: true, enumerable: true, configurable: true });
|
|
275
|
+
}
|
|
276
|
+
return out;
|
|
277
|
+
}
|
|
278
|
+
function deepFreeze(v) {
|
|
279
|
+
if (typeof v === 'object' && v !== null && !Object.isFrozen(v)) {
|
|
280
|
+
Object.freeze(v);
|
|
281
|
+
const names = Object.keys(v);
|
|
282
|
+
for (let i = 0; i < names.length; i += 1)
|
|
283
|
+
deepFreeze(v[names[i]]);
|
|
284
|
+
}
|
|
285
|
+
return v;
|
|
286
|
+
}
|
|
287
|
+
function sameReading(a, b, depth) {
|
|
288
|
+
if (Object.is(a, b))
|
|
289
|
+
return true;
|
|
290
|
+
if (typeof a !== 'object' || typeof b !== 'object' || a === null || b === null || depth > COPY_DEPTH_MAX * 2)
|
|
291
|
+
return false;
|
|
292
|
+
if (Array.isArray(a) !== Array.isArray(b))
|
|
293
|
+
return false;
|
|
294
|
+
const ka = Object.keys(a);
|
|
295
|
+
const kb = Object.keys(b);
|
|
296
|
+
if (ka.length !== kb.length)
|
|
297
|
+
return false;
|
|
298
|
+
for (let i = 0; i < ka.length; i += 1) {
|
|
299
|
+
const k = ka[i];
|
|
300
|
+
if (k !== kb[i] || !sameReading(a[k], b[k], depth + 1))
|
|
301
|
+
return false;
|
|
302
|
+
}
|
|
303
|
+
return true;
|
|
304
|
+
}
|
|
305
|
+
function readAll(e) {
|
|
306
|
+
return Object.values(READERS).map((read) => {
|
|
307
|
+
try {
|
|
308
|
+
return read(e);
|
|
309
|
+
}
|
|
310
|
+
catch {
|
|
311
|
+
return Symbol('reader-threw');
|
|
312
|
+
}
|
|
313
|
+
});
|
|
314
|
+
}
|
|
315
|
+
export function decisionRefusalCarrierOf(err) {
|
|
316
|
+
try {
|
|
317
|
+
if ((typeof err !== 'object' && typeof err !== 'function') || err === null)
|
|
318
|
+
return undefined;
|
|
319
|
+
const copy = copyOf(err, 0, { nodes: 0, path: new Set() });
|
|
320
|
+
if (typeof copy !== 'object' || copy === null || Array.isArray(copy))
|
|
321
|
+
return undefined;
|
|
322
|
+
const root = newWatch(copy);
|
|
323
|
+
const watches = new WeakMap();
|
|
324
|
+
const view = viewOf(root, watches);
|
|
325
|
+
const readers = Object.values(READERS);
|
|
326
|
+
for (let i = 0; i < readers.length; i += 1) {
|
|
327
|
+
const read = readers[i];
|
|
328
|
+
let out;
|
|
329
|
+
try {
|
|
330
|
+
out = read(view);
|
|
331
|
+
}
|
|
332
|
+
catch {
|
|
333
|
+
return undefined;
|
|
334
|
+
}
|
|
335
|
+
consumeOutput(out, watches, new Set(), 0);
|
|
336
|
+
}
|
|
337
|
+
const carrier = deepFreeze(pruned(root));
|
|
338
|
+
const original = readAll(err);
|
|
339
|
+
const fromCarrier = readAll(carrier);
|
|
340
|
+
for (let i = 0; i < original.length; i += 1)
|
|
341
|
+
if (!sameReading(original[i], fromCarrier[i], 0))
|
|
342
|
+
return undefined;
|
|
343
|
+
return carrier;
|
|
344
|
+
}
|
|
345
|
+
catch {
|
|
346
|
+
return undefined;
|
|
347
|
+
}
|
|
348
|
+
}
|
|
@@ -1,5 +1,7 @@
|
|
|
1
1
|
import type { AgentClient, ElicitResponse } from '@sema-agent/sdk';
|
|
2
2
|
import type { UiLanguage } from '../env/uiLanguage.js';
|
|
3
|
+
import type { ToolPermissionSettledElsewhere } from './approvalResolution.js';
|
|
4
|
+
import { type ToolPermissionAck } from '../seatContract.js';
|
|
3
5
|
import { type AskGoneDetail } from '../decideReceipt.js';
|
|
4
6
|
import type { ApprovalDecidedByReading } from '../approvalDecidedByCapability.js';
|
|
5
7
|
import { type DecisionNoteAudit } from './approvalDecisionNoteAudit.js';
|
|
@@ -12,6 +14,10 @@ export declare const HITL_DECISION_NOT_APPLIED_CAUSES: readonly ["gone", "parked
|
|
|
12
14
|
export type HitlDecisionNotAppliedCause = (typeof HITL_DECISION_NOT_APPLIED_CAUSES)[number];
|
|
13
15
|
export declare const HITL_DECISION_UNCONFIRMED_CAUSES: readonly ["transport", "server_error", "local_error", "aborted", "gone_after_retry"];
|
|
14
16
|
export type HitlDecisionUnconfirmedCause = (typeof HITL_DECISION_UNCONFIRMED_CAUSES)[number];
|
|
17
|
+
export type ToolPermissionUnconfirmedCause = HitlDecisionUnconfirmedCause | 'registry_unreadable';
|
|
18
|
+
export interface ToolPermissionUnconfirmed {
|
|
19
|
+
readonly cause: ToolPermissionUnconfirmedCause;
|
|
20
|
+
}
|
|
15
21
|
export declare const HITL_DECISION_NOT_SENT_CAUSES: readonly ["aborted", "duplicate_in_flight", "invalid_request", "no_verb", "not_an_answer"];
|
|
16
22
|
export type HitlDecisionNotSentCause = (typeof HITL_DECISION_NOT_SENT_CAUSES)[number];
|
|
17
23
|
export interface HitlApprovalDecisionRequest {
|
|
@@ -64,6 +70,7 @@ interface HitlDecisionOutcomeBase {
|
|
|
64
70
|
readonly attempts: number;
|
|
65
71
|
readonly fallback?: 'approval';
|
|
66
72
|
readonly noteDropped?: true;
|
|
73
|
+
readonly allowNoteDropped?: true;
|
|
67
74
|
readonly rememberDropped?: true;
|
|
68
75
|
readonly allowSessionCarried?: true;
|
|
69
76
|
readonly attributionDropped?: true;
|
|
@@ -115,5 +122,8 @@ export interface HitlDecisionSendTiming {
|
|
|
115
122
|
export declare function __setHitlDecisionSendTimingForTests(t?: HitlDecisionSendTiming): void;
|
|
116
123
|
export declare function hitlAskIdempotencyKey(askId: string, verdict: 'approve' | 'deny'): string;
|
|
117
124
|
export declare function sendHitlDecision(request: HitlDecisionSendRequest, deps: HitlDecisionSendDeps): Promise<HitlDecisionSendOutcome>;
|
|
125
|
+
export declare function toolPermissionSettledLine(fact: ToolPermissionSettledElsewhere | null | undefined, lang?: UiLanguage): string | undefined;
|
|
126
|
+
export declare function toolPermissionUnconfirmedLine(ack: ToolPermissionAck | null | undefined, lang?: UiLanguage): string | undefined;
|
|
127
|
+
export declare function toolPermissionUnconfirmedOf(thrown: {} | null | undefined, signal?: AbortSignal): ToolPermissionUnconfirmed | undefined;
|
|
118
128
|
export declare function hitlDecisionOutcomeContent(outcome: HitlDecisionSendOutcome, lang?: UiLanguage): string | undefined;
|
|
119
129
|
export {};
|
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
import { settleWithinDeadline } from '../abortableSleep.js';
|
|
2
2
|
import { hostLog } from '../host.js';
|
|
3
3
|
import { invokeHostCallbackIsolated } from '../hostCallbackGuard.js';
|
|
4
|
+
import { readToolPermissionAckState } from '../seatContract.js';
|
|
4
5
|
import { msg, renderMessage } from '../i18n/translate.js';
|
|
5
6
|
import { askGoneFromError } from '../decideReceipt.js';
|
|
6
7
|
import { appendOwnElement, guardedRead, readOwnDataNonEmptyString, readOwnDataValue } from '../ownKey.js';
|
|
@@ -14,7 +15,7 @@ import { ASK_DECIDED_CODE, classifyDeliveredDecisionRefusal, decisionRefusalClos
|
|
|
14
15
|
import { sessionAllowEligible } from './sessionAllowRoute.js';
|
|
15
16
|
import { addDecisionOpKeys, closeDecisionOp, decisionLedgerKeysOf, decisionOpsWithKey, openDecisionOp } from './decisionLedger.js';
|
|
16
17
|
import { hostHoldIsActive, takeHostHoldLedgerOp, tryHoldApprovalNow } from './approvalHolds.js';
|
|
17
|
-
import { answerPayloadFor, decisionAttributionKeyOf,
|
|
18
|
+
import { allowNoteReadingOf, answerPayloadFor, decisionAttributionKeyOf, readApprovalDenySettledBy, readToolApprovalRespondAck, readToolApprovalRespondParking, replayVerdictFrom, settlementAckOf, } from './toolApprovalWire.js';
|
|
18
19
|
export const HITL_DECISION_FAMILIES = Object.freeze(['approval', 'ask', 'elicitation']);
|
|
19
20
|
export const HITL_DECISION_NOT_APPLIED_CAUSES = Object.freeze(['gone', 'parked', 'parking', 'lane_disabled', 'refused', 'idempotency_crossed']);
|
|
20
21
|
export const HITL_DECISION_UNCONFIRMED_CAUSES = Object.freeze(['transport', 'server_error', 'local_error', 'aborted', 'gone_after_retry']);
|
|
@@ -163,9 +164,10 @@ async function sendApprovalFamily(respond, approvalId, answer, ctx) {
|
|
|
163
164
|
const hint = view !== undefined ? ownReadingSlot(view, 'retryAfterMs') : undefined;
|
|
164
165
|
return { ...base, kind: 'not_applied', cause: 'parking', ...(view !== undefined ? { parking: view, ...(hint !== undefined ? { retryAfterMs: hint } : {}) } : {}) };
|
|
165
166
|
}
|
|
166
|
-
const parsed = readToolApprovalRespondAck(raw);
|
|
167
|
-
|
|
168
|
-
|
|
167
|
+
const parsed = settlementAckOf(readToolApprovalRespondAck(raw));
|
|
168
|
+
const replay = replayVerdictFrom(raw, parsed, approvalId);
|
|
169
|
+
if (replay.kind === 'replayed') {
|
|
170
|
+
const first = verdictOf(replay.firstDecision);
|
|
169
171
|
return {
|
|
170
172
|
...base,
|
|
171
173
|
kind: 'settled_elsewhere',
|
|
@@ -173,8 +175,8 @@ async function sendApprovalFamily(respond, approvalId, answer, ctx) {
|
|
|
173
175
|
...(first !== undefined && ours !== undefined && first !== ours ? { contrary: true } : {}),
|
|
174
176
|
};
|
|
175
177
|
}
|
|
176
|
-
if (
|
|
177
|
-
return { ...base, kind: '
|
|
178
|
+
if (replay.kind === 'unreadable')
|
|
179
|
+
return { ...base, kind: 'unconfirmed', cause: 'local_error' };
|
|
178
180
|
const ack = parsed !== undefined && parsed.approvalId === approvalId ? parsed : undefined;
|
|
179
181
|
return { ...base, kind: 'applied', ...(ack !== undefined ? { ack } : {}), ...(ctx.noteCapable ? { noteAudit: readDecisionNoteAudit(raw) } : {}) };
|
|
180
182
|
}
|
|
@@ -183,14 +185,12 @@ function bodyFacts(answer, payload, rememberUnsupported) {
|
|
|
183
185
|
return {
|
|
184
186
|
...(reason !== undefined && reason.trim() !== '' && payload.note === undefined ? { noteDropped: true } : {}),
|
|
185
187
|
...(rememberUnsupported && answer.kind === 'allow' && answer.allowSession === true ? { rememberDropped: true } : {}),
|
|
188
|
+
...(answer.kind === 'allow' && allowNoteReadingOf(answer).kind === 'text' ? { allowNoteDropped: true } : {}),
|
|
186
189
|
};
|
|
187
190
|
}
|
|
188
191
|
function answerGateCannotTake(out) {
|
|
189
192
|
return out.kind === 'not_applied' && (out.cause === 'gone' || out.cause === 'parking' || out.cause === 'lane_disabled');
|
|
190
193
|
}
|
|
191
|
-
function ownTrue(raw, key) {
|
|
192
|
-
return typeof raw === 'object' && raw !== null && guardedRead(() => readOwnDataValue(raw, key)) === true;
|
|
193
|
-
}
|
|
194
194
|
async function sendAskFamily(respondForFallback, decideAsk, req, ctx) {
|
|
195
195
|
const payload = answerPayloadFor(req.answer, 'respond', { approvalDecisionNoteCapable: ctx.noteCapable });
|
|
196
196
|
if (payload === undefined)
|
|
@@ -361,8 +361,10 @@ function snapshotAnswer(raw) {
|
|
|
361
361
|
if (kind === 'allow') {
|
|
362
362
|
const allowSession = guardedRead(() => readOwnDataValue(raw, 'allowSession')) === true;
|
|
363
363
|
const edited = guardedRead(() => readOwnDataValue(raw, 'updatedInput'));
|
|
364
|
+
const noteReading = guardedRead(() => allowNoteReadingOf(raw));
|
|
365
|
+
const note = noteReading?.kind === 'text' ? noteReading.text : undefined;
|
|
364
366
|
if (edited === undefined)
|
|
365
|
-
return Object.freeze({ kind: 'allow', allowSession });
|
|
367
|
+
return Object.freeze({ kind: 'allow', allowSession, ...(note !== undefined ? { note } : {}) });
|
|
366
368
|
let copy;
|
|
367
369
|
try {
|
|
368
370
|
const text = JSON.stringify(edited);
|
|
@@ -373,7 +375,7 @@ function snapshotAnswer(raw) {
|
|
|
373
375
|
catch {
|
|
374
376
|
return undefined;
|
|
375
377
|
}
|
|
376
|
-
return Object.freeze({ kind: 'allow', allowSession, updatedInput: copy });
|
|
378
|
+
return Object.freeze({ kind: 'allow', allowSession, ...(note !== undefined ? { note } : {}), updatedInput: copy });
|
|
377
379
|
}
|
|
378
380
|
if (kind === 'deny') {
|
|
379
381
|
const reason = guardedRead(() => readOwnDataValue(raw, 'reason'));
|
|
@@ -560,6 +562,48 @@ export async function sendHitlDecision(request, deps) {
|
|
|
560
562
|
ownHold.release(out.kind === 'applied' || out.kind === 'settled_elsewhere' ? 'answered' : undefined);
|
|
561
563
|
return Object.freeze(out);
|
|
562
564
|
}
|
|
565
|
+
function settledElsewhereContraryContent(first, lang) {
|
|
566
|
+
return first === 'deny'
|
|
567
|
+
? renderMessage(msg('approval.decision.settledElsewhereContrary.deniedFirst'), lang)
|
|
568
|
+
: renderMessage(msg('approval.decision.settledElsewhereContrary.approvedFirst'), lang);
|
|
569
|
+
}
|
|
570
|
+
export function toolPermissionSettledLine(fact, lang) {
|
|
571
|
+
try {
|
|
572
|
+
if (typeof fact !== 'object' || fact === null)
|
|
573
|
+
return undefined;
|
|
574
|
+
if (readOwnDataValue(fact, 'contrary') !== true)
|
|
575
|
+
return undefined;
|
|
576
|
+
const first = readOwnDataValue(fact, 'firstDecision');
|
|
577
|
+
return first === 'allow' || first === 'deny' ? settledElsewhereContraryContent(first, lang) : undefined;
|
|
578
|
+
}
|
|
579
|
+
catch {
|
|
580
|
+
return undefined;
|
|
581
|
+
}
|
|
582
|
+
}
|
|
583
|
+
function unconfirmedDecisionContent(cause, lang) {
|
|
584
|
+
return cause === 'gone_after_retry' ? renderMessage(msg('approval.decision.unconfirmedAfterRetry'), lang) : renderMessage(msg('approval.decideAck.unconfirmed'), lang);
|
|
585
|
+
}
|
|
586
|
+
export function toolPermissionUnconfirmedLine(ack, lang) {
|
|
587
|
+
try {
|
|
588
|
+
const state = readToolPermissionAckState(ack);
|
|
589
|
+
return state !== undefined && state.kind === 'unconfirmed' ? unconfirmedDecisionContent(state.cause, lang) : undefined;
|
|
590
|
+
}
|
|
591
|
+
catch {
|
|
592
|
+
return undefined;
|
|
593
|
+
}
|
|
594
|
+
}
|
|
595
|
+
export function toolPermissionUnconfirmedOf(thrown, signal) {
|
|
596
|
+
try {
|
|
597
|
+
const out = outcomeOfThrown(thrown, 'approval', undefined, signal, newSendTally(), false);
|
|
598
|
+
if (out.kind !== 'unconfirmed')
|
|
599
|
+
return undefined;
|
|
600
|
+
const cause = HITL_DECISION_UNCONFIRMED_CAUSES.find((w) => w === out.cause);
|
|
601
|
+
return cause === undefined ? undefined : Object.freeze({ cause });
|
|
602
|
+
}
|
|
603
|
+
catch {
|
|
604
|
+
return Object.freeze({ cause: 'local_error' });
|
|
605
|
+
}
|
|
606
|
+
}
|
|
563
607
|
export function hitlDecisionOutcomeContent(outcome, lang) {
|
|
564
608
|
try {
|
|
565
609
|
if (typeof outcome !== 'object' || outcome === null)
|
|
@@ -569,14 +613,10 @@ export function hitlDecisionOutcomeContent(outcome, lang) {
|
|
|
569
613
|
if (readOwnDataValue(outcome, 'contrary') !== true)
|
|
570
614
|
return undefined;
|
|
571
615
|
const first = readOwnDataValue(outcome, 'firstDecision');
|
|
572
|
-
|
|
573
|
-
return renderMessage(msg('approval.decision.settledElsewhereContrary.deniedFirst'), lang);
|
|
574
|
-
if (first === 'approve')
|
|
575
|
-
return renderMessage(msg('approval.decision.settledElsewhereContrary.approvedFirst'), lang);
|
|
576
|
-
return undefined;
|
|
616
|
+
return first === 'deny' || first === 'approve' ? settledElsewhereContraryContent(first, lang) : undefined;
|
|
577
617
|
}
|
|
578
618
|
if (kind === 'unconfirmed' && readOwnDataValue(outcome, 'cause') === 'gone_after_retry')
|
|
579
|
-
return
|
|
619
|
+
return unconfirmedDecisionContent('gone_after_retry', lang);
|
|
580
620
|
return undefined;
|
|
581
621
|
}
|
|
582
622
|
catch {
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
import type { UiLanguage } from '../env/uiLanguage.js';
|
|
2
|
+
export declare const EDITED_APPROVAL_STATES: readonly ["accepts", "refuses", "unknown"];
|
|
3
|
+
export type EditedApprovalState = (typeof EDITED_APPROVAL_STATES)[number];
|
|
4
|
+
export declare const EDITED_APPROVAL_BASES: Readonly<{
|
|
5
|
+
accepts: readonly ["args_available"];
|
|
6
|
+
refuses: readonly ["args_unavailable"];
|
|
7
|
+
unknown: readonly ["card_unreadable", "slot_unreadable", "slot_malformed"];
|
|
8
|
+
}>;
|
|
9
|
+
interface EditedApprovalAccepts {
|
|
10
|
+
readonly state: 'accepts';
|
|
11
|
+
readonly basis: (typeof EDITED_APPROVAL_BASES.accepts)[number];
|
|
12
|
+
}
|
|
13
|
+
interface EditedApprovalRefuses {
|
|
14
|
+
readonly state: 'refuses';
|
|
15
|
+
readonly basis: (typeof EDITED_APPROVAL_BASES.refuses)[number];
|
|
16
|
+
readonly askStaysPending: true;
|
|
17
|
+
}
|
|
18
|
+
interface EditedApprovalUnknown {
|
|
19
|
+
readonly state: 'unknown';
|
|
20
|
+
readonly basis: (typeof EDITED_APPROVAL_BASES.unknown)[number];
|
|
21
|
+
}
|
|
22
|
+
export type EditedApprovalAcceptance = EditedApprovalAccepts | EditedApprovalRefuses | EditedApprovalUnknown;
|
|
23
|
+
export declare function editedApprovalAcceptanceOf(card: {} | null | undefined): EditedApprovalAcceptance;
|
|
24
|
+
export declare function editedApprovalRefusedLine(lang?: UiLanguage): string;
|
|
25
|
+
export {};
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
import { msg, renderMessage } from '../i18n/translate.js';
|
|
2
|
+
import { slotReadOf } from '../wireFailureShape.js';
|
|
3
|
+
export const EDITED_APPROVAL_STATES = Object.freeze(['accepts', 'refuses', 'unknown']);
|
|
4
|
+
export const EDITED_APPROVAL_BASES = Object.freeze({
|
|
5
|
+
accepts: Object.freeze(['args_available']),
|
|
6
|
+
refuses: Object.freeze(['args_unavailable']),
|
|
7
|
+
unknown: Object.freeze(['card_unreadable', 'slot_unreadable', 'slot_malformed']),
|
|
8
|
+
});
|
|
9
|
+
const ACCEPTS = Object.freeze({ state: 'accepts', basis: 'args_available' });
|
|
10
|
+
const REFUSES = Object.freeze({ state: 'refuses', basis: 'args_unavailable', askStaysPending: true });
|
|
11
|
+
const UNKNOWN_CARD = Object.freeze({ state: 'unknown', basis: 'card_unreadable' });
|
|
12
|
+
const UNKNOWN_SLOT = Object.freeze({ state: 'unknown', basis: 'slot_unreadable' });
|
|
13
|
+
const UNKNOWN_MALFORMED = Object.freeze({ state: 'unknown', basis: 'slot_malformed' });
|
|
14
|
+
export function editedApprovalAcceptanceOf(card) {
|
|
15
|
+
if (typeof card !== 'object' || card === null)
|
|
16
|
+
return UNKNOWN_CARD;
|
|
17
|
+
const read = slotReadOf(card, 'argsUnavailable');
|
|
18
|
+
if (read.presence === 'unreadable')
|
|
19
|
+
return UNKNOWN_SLOT;
|
|
20
|
+
if (read.presence === 'absent' || read.value === undefined)
|
|
21
|
+
return ACCEPTS;
|
|
22
|
+
return read.value === true ? REFUSES : UNKNOWN_MALFORMED;
|
|
23
|
+
}
|
|
24
|
+
export function editedApprovalRefusedLine(lang) {
|
|
25
|
+
return renderMessage(msg('approval.editRefusal.line', { stem: msg('approval.editRefusal.stem') }), lang);
|
|
26
|
+
}
|
|
@@ -0,0 +1,4 @@
|
|
|
1
|
+
import type { EventLegElicitationFrame } from '../eventLeg.js';
|
|
2
|
+
import type { UiLanguage } from '../env/uiLanguage.js';
|
|
3
|
+
import type { HitlDecisionSendOutcome } from './decisionSend.js';
|
|
4
|
+
export declare function elicitationRefusedLine(frame: EventLegElicitationFrame, outcome: HitlDecisionSendOutcome, lang?: UiLanguage): string | undefined;
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
import { capForDisplay } from '../fleetTaskDesc.js';
|
|
2
|
+
import { msg, renderMessage } from '../i18n/translate.js';
|
|
3
|
+
import { guardedRead, readOwnDataNonEmptyString, readOwnDataValue } from '../ownKey.js';
|
|
4
|
+
const SERVER_NAME_SHOWN_MAX = 40;
|
|
5
|
+
export function elicitationRefusedLine(frame, outcome, lang) {
|
|
6
|
+
try {
|
|
7
|
+
if (typeof frame !== 'object' || frame === null || typeof outcome !== 'object' || outcome === null)
|
|
8
|
+
return undefined;
|
|
9
|
+
if (guardedRead(() => readOwnDataValue(frame, 'type')) !== 'elicitation')
|
|
10
|
+
return undefined;
|
|
11
|
+
if (guardedRead(() => readOwnDataValue(outcome, 'family')) !== 'elicitation')
|
|
12
|
+
return undefined;
|
|
13
|
+
if (guardedRead(() => readOwnDataValue(outcome, 'kind')) !== 'applied')
|
|
14
|
+
return undefined;
|
|
15
|
+
const name = guardedRead(() => readOwnDataNonEmptyString(frame, 'mcpServerName'));
|
|
16
|
+
return name === undefined
|
|
17
|
+
? renderMessage(msg('mcp.elicitation.refused.unnamed'), lang)
|
|
18
|
+
: renderMessage(msg('mcp.elicitation.refused.named', { server: capForDisplay(name, SERVER_NAME_SHOWN_MAX) }), lang);
|
|
19
|
+
}
|
|
20
|
+
catch {
|
|
21
|
+
return undefined;
|
|
22
|
+
}
|
|
23
|
+
}
|
|
@@ -38,9 +38,8 @@ export interface AskGateWireDeps {
|
|
|
38
38
|
onToolApprovalOutcome?: (frame: ToolApprovalFrame, resolution: ApprovalResolution) => void | Promise<void>;
|
|
39
39
|
onDecideOperation?: DecideOperationObserver;
|
|
40
40
|
onReplayedApproval?: (frame: ToolApprovalFrame, disposition: ReplayedApprovalDisposition) => void | Promise<void>;
|
|
41
|
+
engineGeneration?: () => number;
|
|
41
42
|
}
|
|
42
|
-
export declare function setBridgeRunHandleFallback(deps: object, read: () => string | undefined): void;
|
|
43
|
-
export declare function bridgeRunHandleFallbackOf(deps: object): string | undefined;
|
|
44
43
|
type GateKind = 'ask' | 'fs';
|
|
45
44
|
export interface GatePark {
|
|
46
45
|
gate: GateKind;
|
|
@@ -73,6 +72,7 @@ export interface FrameRouterCtx {
|
|
|
73
72
|
deps: AskGateWireDeps;
|
|
74
73
|
taskId: TaskIdRef;
|
|
75
74
|
signal?: AbortSignal | undefined;
|
|
75
|
+
streamGeneration?: number | undefined;
|
|
76
76
|
}
|
|
77
77
|
export declare function isAskTool(toolName: string | undefined): boolean;
|
|
78
78
|
export declare function questionCardVerdict(carrier: object | null | undefined): boolean | undefined;
|