@sema-agent/client-core 0.99.0 → 0.101.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 +572 -0
- package/README.md +174 -114
- package/dist/adapt/arms.js +109 -50
- package/dist/adapt/panelTasks.d.ts +2 -1
- package/dist/adapt/panelTasks.js +32 -9
- package/dist/adapt/textStream.d.ts +1 -1
- package/dist/adapt/textStream.js +58 -32
- package/dist/adapt/toolCards.js +9 -8
- package/dist/adapt.js +7 -1
- package/dist/adapter/activeRunSelfHeal.d.ts +31 -2
- package/dist/adapter/activeRunSelfHeal.js +162 -13
- package/dist/adapter/downstream/eventToSdkMessage.d.ts +25 -6
- package/dist/adapter/downstream/eventToSdkMessage.js +157 -20
- package/dist/adapter/downstream/terminalToSdkResult.d.ts +60 -1
- package/dist/adapter/downstream/terminalToSdkResult.js +219 -39
- package/dist/adapter/downstream/wiringManifestView.d.ts +3 -1
- package/dist/adapter/downstream/wiringManifestView.js +1 -0
- package/dist/adapter/runStream.d.ts +4 -4
- package/dist/adapter/runStream.js +184 -42
- package/dist/adapter/types.d.ts +2 -0
- package/dist/agentsWireCaps.d.ts +9 -7
- package/dist/agentsWireCaps.js +101 -17
- package/dist/approvalDecidedByCapability.js +2 -2
- package/dist/approvalFrameFamilies.d.ts +33 -0
- package/dist/approvalFrameFamilies.js +120 -0
- package/dist/approvalsStreamLiveCapability.js +2 -2
- package/dist/attachmentsWireCaps.js +41 -13
- package/dist/callerCwdCapability.js +2 -2
- package/dist/centerWiringCapability.js +2 -2
- package/dist/clockReading.d.ts +2 -0
- package/dist/clockReading.js +4 -0
- package/dist/cloudConfigWireCaps.d.ts +28 -5
- package/dist/cloudConfigWireCaps.js +334 -103
- package/dist/compactionStatus.d.ts +34 -0
- package/dist/compactionStatus.js +196 -0
- package/dist/coreValuePorts.d.ts +12 -2
- package/dist/coreValuePorts.js +9 -0
- package/dist/decideFailureNote.js +8 -6
- package/dist/decideReceipt.js +2 -2
- package/dist/deviceExecutorManagementCapability.js +2 -2
- package/dist/deviceFlowPolling.js +1 -1
- package/dist/disableSkillsWire.d.ts +1 -1
- package/dist/disableSkillsWire.js +4 -3
- package/dist/displayUntrusted.d.ts +1 -0
- package/dist/displayUntrusted.js +215 -13
- package/dist/engineAgentPanelStore.d.ts +7 -4
- package/dist/engineCapReader.js +1 -1
- package/dist/engineConfigDrift.js +1 -1
- package/dist/engineErrorCodes.d.ts +23 -6
- package/dist/engineErrorCodes.js +36 -11
- package/dist/engineGenerationConvergence.d.ts +39 -0
- package/dist/engineGenerationConvergence.js +95 -0
- package/dist/engineGenerationPort.d.ts +61 -0
- package/dist/engineGenerationPort.js +144 -0
- package/dist/engineHealthFacts.d.ts +23 -0
- package/dist/engineHealthFacts.js +92 -0
- package/dist/engineIdentity.d.ts +4 -0
- package/dist/engineIdentity.js +11 -0
- package/dist/engineNoticeCodes.d.ts +2 -5
- package/dist/engineRowRef.js +4 -0
- package/dist/engineSessionMessages.js +2 -2
- package/dist/engineToolDirectory.d.ts +3 -0
- package/dist/engineToolDirectory.js +6 -4
- package/dist/engineWireFor.d.ts +99 -0
- package/dist/engineWireFor.js +248 -6
- package/dist/engineWireTarget.d.ts +1 -0
- package/dist/engineWireTarget.js +8 -0
- package/dist/env/uiLanguage.js +1 -1
- package/dist/errorSupplementRoles.d.ts +3 -0
- package/dist/errorSupplementRoles.js +37 -0
- package/dist/eventLeg.d.ts +1 -7
- package/dist/eventLeg.js +7 -8
- package/dist/executionLaneCapability.js +2 -2
- package/dist/fileHistoryCaptureCapability.d.ts +0 -3
- package/dist/fileHistoryCaptureCapability.js +3 -7
- package/dist/finalVerifyWire.d.ts +6 -3
- package/dist/finalVerifyWire.js +6 -23
- package/dist/flagInput.d.ts +4 -0
- package/dist/flagInput.js +24 -0
- package/dist/fleet/fleetLedger.js +5 -2
- package/dist/fleet/fleetProjection.d.ts +1 -0
- package/dist/fleet/fleetProjection.js +15 -2
- package/dist/gateVocabulary.js +3 -0
- package/dist/generated/engineFactTables.d.ts +7 -2
- package/dist/generated/engineFactTables.js +79 -0
- package/dist/generated/engineNoticeTables.js +15 -0
- package/dist/generated/settingsSchemaActiveTiers.d.ts +1 -0
- package/dist/generated/settingsSchemaActiveTiers.js +14 -0
- package/dist/generated/settingsSchemaCallerTextEcho.d.ts +1 -0
- package/dist/generated/settingsSchemaCallerTextEcho.js +8 -0
- package/dist/generated/settingsSchemaControlAndBidi.d.ts +1 -0
- package/dist/generated/settingsSchemaControlAndBidi.js +8 -0
- package/dist/generated/settingsSchemaDefaultModel.d.ts +11 -0
- package/dist/generated/settingsSchemaDefaultModel.js +25 -0
- package/dist/generated/settingsSchemaFns.d.ts +66 -0
- package/dist/generated/settingsSchemaFns.js +38 -0
- package/dist/generated/settingsSchemaMcpRequestEntry.d.ts +1 -0
- package/dist/generated/settingsSchemaMcpRequestEntry.js +156 -0
- package/dist/generated/settingsSchemaSafetyMergeSpec.d.ts +1 -0
- package/dist/generated/settingsSchemaSafetyMergeSpec.js +95 -0
- package/dist/generated/settingsSchemaSettingsSources.d.ts +1 -0
- package/dist/generated/settingsSchemaSettingsSources.js +58 -0
- package/dist/generated/settingsSchemaTables.d.ts +3 -0
- package/dist/generated/settingsSchemaTables.js +18 -0
- package/dist/generated/settingsSchemaTypes.d.ts +28 -0
- package/dist/generated/settingsSchemaUrlPattern.d.ts +1 -0
- package/dist/generated/settingsSchemaUrlPattern.js +183 -0
- package/dist/headlessPermissionModeWire.d.ts +18 -2
- package/dist/headlessPermissionModeWire.js +30 -19
- package/dist/hitl/allowRuleShadow.js +9 -7
- package/dist/hitl/approvalCardReading.d.ts +3 -0
- package/dist/hitl/approvalCardReading.js +17 -0
- package/dist/hitl/approvalCardReasons.js +2 -2
- package/dist/hitl/approvalCompleteParked.js +1 -1
- package/dist/hitl/approvalDelivery.d.ts +87 -0
- package/dist/hitl/approvalDelivery.js +193 -0
- package/dist/hitl/approvalHolds.d.ts +14 -0
- package/dist/hitl/approvalHolds.js +41 -0
- package/dist/hitl/approvalResolution.d.ts +11 -0
- package/dist/hitl/approvalResolution.js +50 -11
- package/dist/hitl/askClassPair.d.ts +8 -2
- package/dist/hitl/askClassPair.js +31 -4
- package/dist/hitl/askParkAutoReopenBlock.d.ts +30 -0
- package/dist/hitl/askParkAutoReopenBlock.js +117 -0
- package/dist/hitl/askParkRowRouting.js +4 -1
- package/dist/hitl/attributionLadder.d.ts +62 -0
- package/dist/hitl/attributionLadder.js +138 -0
- package/dist/hitl/automaticAnswerVerdict.d.ts +6 -1
- package/dist/hitl/automaticAnswerVerdict.js +46 -11
- package/dist/hitl/crashConverged.js +2 -2
- package/dist/hitl/decisionConflict.d.ts +6 -2
- package/dist/hitl/decisionConflict.js +24 -9
- package/dist/hitl/decisionLedger.d.ts +55 -0
- package/dist/hitl/decisionLedger.js +156 -0
- package/dist/hitl/decisionRefusal.d.ts +21 -10
- package/dist/hitl/decisionRefusal.js +100 -55
- package/dist/hitl/decisionSend.d.ts +116 -0
- package/dist/hitl/decisionSend.js +563 -0
- package/dist/hitl/frameRouter.d.ts +1 -0
- package/dist/hitl/frameRouter.js +9 -2
- package/dist/hitl/hitlBridge.d.ts +18 -6
- package/dist/hitl/hitlBridge.js +59 -43
- package/dist/hitl/livePendingAsk.js +4 -3
- package/dist/hitl/noAllowCause.js +1 -1
- package/dist/hitl/parkResolver.js +3 -2
- package/dist/hitl/persistedRulesWire.js +1 -0
- package/dist/hitl/planReviewWire.d.ts +4 -0
- package/dist/hitl/planReviewWire.js +104 -106
- package/dist/hitl/resumeRunningCard.d.ts +3 -2
- package/dist/hitl/resumeRunningCard.js +17 -11
- package/dist/hitl/sessionPolicyDeliverable.d.ts +5 -2
- package/dist/hitl/sessionPolicyDeliverable.js +65 -35
- package/dist/hitl/sessionPolicyWire.d.ts +13 -3
- package/dist/hitl/sessionPolicyWire.js +81 -16
- package/dist/hitl/standingRows.js +1 -1
- package/dist/hitl/toolApprovalWire.d.ts +9 -10
- package/dist/hitl/toolApprovalWire.js +103 -151
- package/dist/hookMatcherVerdict.d.ts +2 -0
- package/dist/hookMatcherVerdict.js +12 -0
- package/dist/hooksCompactTransition.d.ts +19 -0
- package/dist/hooksCompactTransition.js +41 -0
- package/dist/hooksWireCaps.d.ts +1 -1
- package/dist/hooksWireCaps.js +202 -203
- package/dist/host.d.ts +1 -14
- package/dist/host.js +0 -8
- package/dist/hostCallbackGuard.d.ts +1 -0
- package/dist/hostCallbackGuard.js +1 -1
- package/dist/hostSettingsSource.d.ts +172 -0
- package/dist/hostSettingsSource.js +675 -0
- package/dist/hostTurnSettings.d.ts +114 -19
- package/dist/hostTurnSettings.js +966 -68
- package/dist/httpHookPolicy.d.ts +37 -0
- package/dist/httpHookPolicy.js +176 -0
- package/dist/humanTurn.d.ts +4 -2
- package/dist/humanTurn.js +40 -10
- package/dist/humanTurnRead.js +4 -3
- package/dist/humanTurnSentences.d.ts +10 -0
- package/dist/humanTurnSentences.js +74 -0
- package/dist/i18n/messages.en.d.ts +313 -0
- package/dist/i18n/messages.en.js +326 -13
- package/dist/i18n/messages.zh.js +341 -13
- package/dist/i18n/translate.js +3 -3
- package/dist/index.d.ts +85 -15
- package/dist/index.js +53 -12
- package/dist/inheritEnvCapability.d.ts +4 -1
- package/dist/inheritEnvCapability.js +38 -17
- package/dist/inheritEnvWire.d.ts +2 -1
- package/dist/inheritEnvWire.js +11 -5
- package/dist/injectionLaneNotice.d.ts +5 -0
- package/dist/injectionLaneNotice.js +46 -0
- package/dist/interactiveToolsWire.d.ts +4 -2
- package/dist/interactiveToolsWire.js +5 -5
- package/dist/jsonFaithful.d.ts +20 -0
- package/dist/jsonFaithful.js +152 -0
- package/dist/limitsWire.d.ts +7 -2
- package/dist/limitsWire.js +19 -13
- package/dist/liveInitToolFace.d.ts +6 -1
- package/dist/liveInitToolFace.js +5 -3
- package/dist/liveModelCatalog.d.ts +22 -0
- package/dist/liveModelCatalog.js +132 -18
- package/dist/mcpPanel.js +3 -1
- package/dist/mcpProbeCapability.js +2 -2
- package/dist/mcpReconnect.js +2 -2
- package/dist/mcpStatusSupersetKeys.d.ts +24 -0
- package/dist/mcpStatusSupersetKeys.js +45 -0
- package/dist/mcpToolToggles.d.ts +6 -0
- package/dist/mcpToolToggles.js +47 -0
- package/dist/mcpWireCaps.d.ts +48 -4
- package/dist/mcpWireCaps.js +338 -99
- package/dist/mcpWireTransport.d.ts +4 -0
- package/dist/mcpWireTransport.js +18 -0
- package/dist/memoryComplianceCapability.js +2 -2
- package/dist/memoryOriginCapability.js +2 -2
- package/dist/model/catalogDefault.d.ts +24 -0
- package/dist/model/catalogDefault.js +4 -0
- package/dist/model/liveCatalogShape.js +5 -4
- package/dist/model/modelsPolicy.js +4 -3
- package/dist/model/onboardJudgement.d.ts +1 -0
- package/dist/model/onboardJudgement.js +1 -1
- package/dist/model/subagentModelWord.js +2 -2
- package/dist/modelCapabilityProbe.d.ts +2 -1
- package/dist/modelCapabilityProbe.js +16 -15
- package/dist/modelIdentityResolvability.d.ts +12 -1
- package/dist/modelIdentityResolvability.js +69 -28
- package/dist/modsKernelIdentity.d.ts +10 -0
- package/dist/modsKernelIdentity.js +103 -0
- package/dist/modsKernelTransit.d.ts +8 -0
- package/dist/modsKernelTransit.js +6 -0
- package/dist/notifications.d.ts +30 -12
- package/dist/notifications.js +241 -53
- package/dist/outputStyleSeatCapability.js +2 -2
- package/dist/ownKey.d.ts +37 -0
- package/dist/ownKey.js +238 -2
- package/dist/panelReduce.d.ts +5 -0
- package/dist/panelReduce.js +45 -13
- package/dist/panelStateHolder.d.ts +1 -0
- package/dist/panelStateHolder.js +10 -1
- package/dist/peerFrames.d.ts +1 -1
- package/dist/peerFrames.js +6 -2
- package/dist/peerLaneCapability.js +2 -2
- package/dist/permissionModesCapability.js +4 -4
- package/dist/permissionRuleIssue.d.ts +2 -1
- package/dist/permissionRuleIssue.js +24 -21
- package/dist/permissionRulesWriteCapability.js +2 -2
- package/dist/permissionsAllowGrantCapability.js +2 -2
- package/dist/permissionsDeclaration.d.ts +43 -4
- package/dist/permissionsDeclaration.js +102 -35
- package/dist/pluginHooksWire.d.ts +20 -4
- package/dist/pluginHooksWire.js +101 -60
- package/dist/prepareRefusal.d.ts +9 -0
- package/dist/prepareRefusal.js +90 -0
- package/dist/printInitToolFace.js +2 -2
- package/dist/printModelStatus.js +1 -1
- package/dist/projectMemory.d.ts +32 -0
- package/dist/projectMemory.js +70 -0
- package/dist/promptBlockedCopy.d.ts +2 -1
- package/dist/promptBlockedCopy.js +2 -1
- package/dist/promptDelivery.d.ts +23 -3
- package/dist/promptDelivery.js +169 -30
- package/dist/providerRejection.d.ts +19 -1
- package/dist/providerRejection.js +75 -4
- package/dist/queuedDelivery.d.ts +48 -0
- package/dist/queuedDelivery.js +233 -0
- package/dist/reattachWindow.d.ts +94 -0
- package/dist/reattachWindow.js +127 -0
- package/dist/request/printNotification.d.ts +1 -1
- package/dist/request/printNotification.js +5 -1
- package/dist/request/submissionIdentity.d.ts +37 -0
- package/dist/request/submissionIdentity.js +65 -0
- package/dist/request/taskRequest.d.ts +22 -14
- package/dist/request/taskRequest.js +312 -202
- package/dist/resultFrameKeys.d.ts +1 -0
- package/dist/resultFrameKeys.js +4 -1
- package/dist/resumeRefusalCopy.d.ts +3 -1
- package/dist/resumeRefusalCopy.js +22 -4
- package/dist/retryStatus.d.ts +26 -0
- package/dist/retryStatus.js +133 -28
- package/dist/rewindArchiveCapability.js +2 -2
- package/dist/rewindEngineAction.d.ts +2 -0
- package/dist/rewindEngineAction.js +23 -1
- package/dist/rowKind.d.ts +36 -0
- package/dist/rowKind.js +97 -0
- package/dist/ruleCompileVerdict.d.ts +18 -0
- package/dist/ruleCompileVerdict.js +67 -2
- package/dist/ruleReadings.d.ts +58 -0
- package/dist/ruleReadings.js +132 -0
- package/dist/ruleRefusalSentence.d.ts +8 -0
- package/dist/ruleRefusalSentence.js +64 -0
- package/dist/runCancelContext.d.ts +0 -1
- package/dist/runCancelContext.js +1 -2
- package/dist/runTerminal.d.ts +5 -0
- package/dist/runTerminal.js +52 -17
- package/dist/sandboxWire.d.ts +3 -2
- package/dist/sandboxWire.js +59 -27
- package/dist/scenarioRefusal.d.ts +2 -1
- package/dist/scenarioRefusal.js +6 -6
- package/dist/scenarioSkills.d.ts +20 -0
- package/dist/scenarioSkills.js +72 -0
- package/dist/scenarioWire.d.ts +5 -2
- package/dist/scenarioWire.js +9 -9
- package/dist/sealedKeyCapability.js +2 -2
- package/dist/seam.d.ts +26 -9
- package/dist/seam.js +44 -4
- package/dist/seatContract.d.ts +62 -9
- package/dist/seatContract.js +70 -25
- package/dist/selfOrchestrationDenial.js +1 -1
- package/dist/sessionPolicyCapability.js +2 -2
- package/dist/sessionRulesChildrenReadLive.d.ts +6 -0
- package/dist/sessionRulesChildrenReadLive.js +5 -0
- package/dist/sessionRulesNamespaceFormsCapability.d.ts +12 -0
- package/dist/sessionRulesNamespaceFormsCapability.js +29 -0
- package/dist/sessionSyncFileHistoryCapability.js +2 -2
- package/dist/settingsCredentialKeyPaths.d.ts +8 -0
- package/dist/settingsCredentialKeyPaths.js +274 -0
- package/dist/settingsHooksSalvage.d.ts +1 -0
- package/dist/settingsHooksSalvage.js +7 -1
- package/dist/settingsLayerAdmission.d.ts +4 -0
- package/dist/settingsLayerAdmission.js +16 -0
- package/dist/skillToolListsCapability.js +6 -5
- package/dist/skillsWireCaps.d.ts +14 -3
- package/dist/skillsWireCaps.js +48 -18
- package/dist/slashCommandGate.d.ts +24 -0
- package/dist/slashCommandGate.js +74 -0
- package/dist/slashCommandTable.d.ts +14 -0
- package/dist/slashCommandTable.js +99 -0
- package/dist/sqlEngineCapability.js +2 -2
- package/dist/steerPriorityCapability.js +2 -2
- package/dist/storePostureCapability.js +2 -2
- package/dist/subagent/agentStateDetail.js +1 -1
- package/dist/subagent/engineDelegatedPrompt.d.ts +9 -0
- package/dist/subagent/engineDelegatedPrompt.js +38 -7
- package/dist/subagent/engineRowStopGate.js +2 -2
- package/dist/subagent/engineSubagentResume.js +3 -3
- package/dist/subagent/engineTaskHandleWire.d.ts +1 -0
- package/dist/subagent/engineTaskHandleWire.js +10 -0
- package/dist/subagentContentStore.d.ts +1 -0
- package/dist/subagentContentStore.js +135 -27
- package/dist/submitFailure.d.ts +8 -0
- package/dist/submitFailure.js +17 -0
- package/dist/supportFloor.d.ts +1 -0
- package/dist/supportFloor.js +7 -0
- package/dist/terminationIntent.d.ts +55 -0
- package/dist/terminationIntent.js +352 -0
- package/dist/toolHistoryMismatch.d.ts +8 -0
- package/dist/toolHistoryMismatch.js +37 -6
- package/dist/toolResult.d.ts +13 -3
- package/dist/toolResult.js +158 -9
- package/dist/toolResultContent.d.ts +13 -0
- package/dist/toolResultContent.js +82 -7
- package/dist/toolRoster.d.ts +18 -0
- package/dist/toolRoster.js +64 -0
- package/dist/toolsFlagNames.d.ts +8 -0
- package/dist/toolsFlagNames.js +110 -0
- package/dist/turnFailurePresentation.js +41 -96
- package/dist/usageLimitAutoResume.d.ts +74 -0
- package/dist/usageLimitAutoResume.js +227 -0
- package/dist/userAttachmentEnvelope.js +1 -1
- package/dist/userAttachmentSeat.js +5 -5
- package/dist/userInvokedSkillsCapability.js +2 -2
- package/dist/webSearchBackendCapability.js +2 -2
- package/dist/wireErrorTriage.js +99 -50
- package/dist/wireFailureShape.d.ts +25 -1
- package/dist/wireFailureShape.js +92 -5
- package/dist/wireRefusalCopy.d.ts +75 -18
- package/dist/wireRefusalCopy.js +532 -148
- package/dist/wiringFleetDoctor.d.ts +3 -0
- package/dist/wiringFleetDoctor.js +21 -0
- package/dist/workflow.d.ts +2 -1
- package/dist/workflow.js +38 -1
- package/dist/workflowClient.d.ts +2 -7
- package/dist/workflowsJournalCapability.js +2 -2
- package/dist/writeProtectionCapability.js +2 -2
- package/docs/INTEGRATION-CLIENTS.md +1013 -190
- package/package.json +15 -4
|
@@ -1,6 +1,9 @@
|
|
|
1
|
-
import { DecideTransportRetryExhaustedError } from './hitlBridge.js';
|
|
2
|
-
import { mintDecisionRefusalReading
|
|
3
|
-
import { thrownIsInstanceOf } from '../wireFailureShape.js';
|
|
1
|
+
import { DecideTransportRetryExhaustedError, refusalCarrierOf, safetyStopHeadOf, safetyStopNamed } from './hitlBridge.js';
|
|
2
|
+
import { mintDecisionRefusalReading } from './decisionRefusal.js';
|
|
3
|
+
import { isSlotCarrier, thrownIsInstanceOf } from '../wireFailureShape.js';
|
|
4
|
+
import { carrierReadOf, isLocalSafetyStop, localCodeReadOf, topCauseReadOf } from './attributionLadder.js';
|
|
5
|
+
import { directFailureReadingOf, transportReadingOf } from './approvalDelivery.js';
|
|
6
|
+
import { ownReadingSlot } from '../engineWireFor.js';
|
|
4
7
|
export const APPROVAL_RESOLUTION_LANES = Object.freeze(['respond', 'decide', 'ask']);
|
|
5
8
|
export const APPROVAL_NOT_SENT_CAUSES = Object.freeze([
|
|
6
9
|
'retracted',
|
|
@@ -91,29 +94,65 @@ export function approvalResolutionDetail(r) {
|
|
|
91
94
|
return parts.length > 0 ? parts.join(' · ') : undefined;
|
|
92
95
|
}
|
|
93
96
|
export function unsettledCauseOfReading(reading) {
|
|
94
|
-
|
|
97
|
+
const standing = ownReadingSlot(reading, 'standing');
|
|
98
|
+
if (standing === 'ambiguous')
|
|
95
99
|
return 'engine_error';
|
|
96
|
-
return
|
|
100
|
+
return standing === undefined ? 'no_answer' : 'engine_refused';
|
|
97
101
|
}
|
|
98
102
|
export function resolutionOfDecisionFailure(e, m) {
|
|
103
|
+
const gatedCallId = ownReadingSlot(m, 'gatedCallId');
|
|
99
104
|
const base = {
|
|
100
105
|
lane: m.lane,
|
|
101
|
-
...(
|
|
106
|
+
...(gatedCallId !== undefined ? { gatedCallId } : {}),
|
|
102
107
|
};
|
|
103
|
-
const
|
|
104
|
-
const {
|
|
105
|
-
|
|
108
|
+
const mDetail = ownReadingSlot(m, 'detail');
|
|
109
|
+
const detail = mDetail !== undefined && mDetail.length > 0 ? { detail: mDetail } : {};
|
|
110
|
+
const delivered = ownReadingSlot(m, 'delivered');
|
|
111
|
+
const handed = ownReadingSlot(m, 'directStop');
|
|
112
|
+
const stop = delivered !== undefined ? undefined : handed !== undefined && handed.thrown === e ? handed : directSafetyStopOf(e);
|
|
113
|
+
const triaged = stop?.triaged;
|
|
114
|
+
const head = delivered !== undefined ? undefined : stop !== undefined ? stop.head : { named: false };
|
|
115
|
+
const direct = stop !== undefined && stop.head.local !== undefined ? (ownReadingSlot(stop, 'settled') ?? directFailureReadingOf(e, stop.triaged, stop.head)) : undefined;
|
|
116
|
+
const subject = direct !== undefined ? direct.thrown : e;
|
|
117
|
+
const reading = delivered ?? direct?.reading;
|
|
118
|
+
const carrierRead = reading !== undefined ? carrierReadOf(subject, reading) : refusalCarrierOf(e, undefined, false, triaged !== undefined && isSlotCarrier(e) ? topCauseReadOf(triaged, e) : undefined, head);
|
|
119
|
+
const local = ownReadingSlot(carrierRead, 'local');
|
|
120
|
+
if (local !== undefined && local !== 'binding_mismatch' && zeroByteProven(subject, reading, delivered !== undefined, ownReadingSlot(m, 'afterRetry') === true)) {
|
|
106
121
|
if (local === 'no_pending' || local === 'wrong_gate')
|
|
107
122
|
return { kind: 'not_sent', ...base, cause: local, ...detail };
|
|
108
123
|
return { kind: 'not_sent', ...base, cause: 'safety_stop', safetyCode: local, ...detail };
|
|
109
124
|
}
|
|
110
|
-
const refusal = mintDecisionRefusalReading(
|
|
125
|
+
const refusal = mintDecisionRefusalReading(subject, { route: m.route, ...(ownReadingSlot(m, 'afterRetry') === true ? { afterRetry: true } : {}) }, ownReadingSlot(m, 'attributionCarried'), reading, carrierRead);
|
|
111
126
|
if (local === 'binding_mismatch')
|
|
112
127
|
return { kind: 'unsettled', ...base, cause: 'engine_refused', safetyCode: 'binding_mismatch', refusal, ...detail };
|
|
113
|
-
if (thrownIsInstanceOf(e, DecideTransportRetryExhaustedError))
|
|
128
|
+
if (ownReadingSlot(m, 'transportExhausted') === true || thrownIsInstanceOf(e, DecideTransportRetryExhaustedError))
|
|
114
129
|
return { kind: 'unsettled', ...base, cause: 'transport_exhausted', refusal, ...detail };
|
|
115
130
|
return { kind: 'unsettled', ...base, cause: unsettledCauseOfReading(refusal), refusal, ...detail };
|
|
116
131
|
}
|
|
132
|
+
export function directSafetyStopOf(e) {
|
|
133
|
+
if (!isSlotCarrier(e) || !safetyStopNamed(e))
|
|
134
|
+
return undefined;
|
|
135
|
+
const triaged = transportReadingOf(e, undefined);
|
|
136
|
+
return Object.freeze({ thrown: e, head: safetyStopHeadOf(e, localCodeReadOf(triaged, e), true), triaged });
|
|
137
|
+
}
|
|
138
|
+
export function directFailureVerdictOf(e, stop) {
|
|
139
|
+
const settled = directFailureReadingOf(e, stop !== undefined ? stop.triaged : transportReadingOf(e, undefined), stop !== undefined ? stop.head : { named: false });
|
|
140
|
+
const yields = isLocalSafetyStop(carrierReadOf(settled.thrown, settled.reading), settled.reading);
|
|
141
|
+
return Object.freeze({ yields, ...(stop !== undefined ? { directStop: Object.freeze({ ...stop, settled }) } : {}) });
|
|
142
|
+
}
|
|
143
|
+
function bothAbsent(cause, status) {
|
|
144
|
+
return cause === 'absent' && status === 'absent';
|
|
145
|
+
}
|
|
146
|
+
function zeroByteProven(e, reading, viaDelivery, afterRetry) {
|
|
147
|
+
if (afterRetry)
|
|
148
|
+
return false;
|
|
149
|
+
if (reading === undefined)
|
|
150
|
+
return false;
|
|
151
|
+
if (viaDelivery && ownReadingSlot(reading, 'cls') === 'transport')
|
|
152
|
+
return false;
|
|
153
|
+
const u = ownReadingSlot(reading, 'unanswered');
|
|
154
|
+
return u !== undefined && u.layer === e && isSlotCarrier(e) && bothAbsent(ownReadingSlot(topCauseReadOf(reading, e), 'presence'), ownReadingSlot(u, 'statusSlot'));
|
|
155
|
+
}
|
|
117
156
|
export function joinedResolution(r, gatedCallId) {
|
|
118
157
|
const carry = r.gatedCallId === undefined && gatedCallId !== undefined && gatedCallId !== '' ? { gatedCallId } : {};
|
|
119
158
|
return { ...r, ...carry, joinedInFlight: true };
|
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
import {
|
|
2
|
-
export declare const DEPLOYMENT_LIST_ASK_CLASSES: readonly (
|
|
1
|
+
import { CORE_ASK_CLASSES } from '../generated/engineFactTables.js';
|
|
2
|
+
export declare const DEPLOYMENT_LIST_ASK_CLASSES: readonly (typeof CORE_ASK_CLASSES)[number][];
|
|
3
3
|
export type AskClassPairReading = {
|
|
4
4
|
readonly state: 'pair';
|
|
5
5
|
readonly askClass: string;
|
|
@@ -14,3 +14,9 @@ export declare function readAskClassPair(v: object | null | undefined): {
|
|
|
14
14
|
askClass: string;
|
|
15
15
|
classes: readonly string[];
|
|
16
16
|
} | undefined;
|
|
17
|
+
export interface AskClassReasonRow {
|
|
18
|
+
readonly askClass: string;
|
|
19
|
+
readonly reason: string;
|
|
20
|
+
}
|
|
21
|
+
export declare function askClassReasonOf(askClass: string | null | undefined): string | undefined;
|
|
22
|
+
export declare function askClassReasonsOf(carrier: object | null | undefined): readonly AskClassReasonRow[];
|
|
@@ -1,4 +1,5 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { appendOwnElement } from '../ownKey.js';
|
|
2
|
+
import { CORE_ASK_CLASSES, CORE_ASK_CLASS_REASONS } from '../generated/engineFactTables.js';
|
|
2
3
|
export const DEPLOYMENT_LIST_ASK_CLASSES = Object.freeze(['ask_rule']);
|
|
3
4
|
const ABSENT = Object.freeze({ state: 'absent' });
|
|
4
5
|
const MALFORMED = Object.freeze({ state: 'malformed' });
|
|
@@ -24,13 +25,13 @@ export function readAskClassPairState(v) {
|
|
|
24
25
|
const seen = new Set();
|
|
25
26
|
for (let i = 0; i < length; i++) {
|
|
26
27
|
const d = Object.getOwnPropertyDescriptor(raw, i);
|
|
27
|
-
if (d === undefined || !('value'
|
|
28
|
+
if (d === undefined || !Object.hasOwn(d, 'value'))
|
|
28
29
|
return MALFORMED;
|
|
29
30
|
const c = d.value;
|
|
30
31
|
if (typeof c !== 'string' || c === '' || seen.has(c))
|
|
31
32
|
return MALFORMED;
|
|
32
33
|
seen.add(c);
|
|
33
|
-
classes
|
|
34
|
+
appendOwnElement(classes, c);
|
|
34
35
|
}
|
|
35
36
|
if (raw.length !== length)
|
|
36
37
|
return MALFORMED;
|
|
@@ -41,7 +42,7 @@ export function readAskClassPairState(v) {
|
|
|
41
42
|
return Object.freeze({ state: 'pair', askClass, classes: Object.freeze(classes) });
|
|
42
43
|
}
|
|
43
44
|
function inCanonicalOrder(classes) {
|
|
44
|
-
const order =
|
|
45
|
+
const order = CORE_ASK_CLASSES;
|
|
45
46
|
let last = -1;
|
|
46
47
|
for (const c of classes) {
|
|
47
48
|
const rank = order.indexOf(c);
|
|
@@ -57,3 +58,29 @@ export function readAskClassPair(v) {
|
|
|
57
58
|
const r = readAskClassPairState(v);
|
|
58
59
|
return r.state === 'pair' ? { askClass: r.askClass, classes: r.classes } : undefined;
|
|
59
60
|
}
|
|
61
|
+
export function askClassReasonOf(askClass) {
|
|
62
|
+
if (typeof askClass !== 'string' || askClass === '')
|
|
63
|
+
return undefined;
|
|
64
|
+
return Object.hasOwn(CORE_ASK_CLASS_REASONS, askClass) ? CORE_ASK_CLASS_REASONS[askClass] : undefined;
|
|
65
|
+
}
|
|
66
|
+
export function askClassReasonsOf(carrier) {
|
|
67
|
+
let pair;
|
|
68
|
+
try {
|
|
69
|
+
pair = readAskClassPairState(carrier);
|
|
70
|
+
}
|
|
71
|
+
catch {
|
|
72
|
+
return Object.freeze([]);
|
|
73
|
+
}
|
|
74
|
+
if (pair.state !== 'pair')
|
|
75
|
+
return Object.freeze([]);
|
|
76
|
+
const seen = new Set();
|
|
77
|
+
const rows = [];
|
|
78
|
+
for (const askClass of pair.classes) {
|
|
79
|
+
const reason = askClassReasonOf(askClass);
|
|
80
|
+
if (reason === undefined || seen.has(reason))
|
|
81
|
+
continue;
|
|
82
|
+
seen.add(reason);
|
|
83
|
+
rows.push(Object.freeze({ askClass, reason }));
|
|
84
|
+
}
|
|
85
|
+
return Object.freeze(rows);
|
|
86
|
+
}
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
import type { UiLanguage } from '../env/uiLanguage.js';
|
|
2
|
+
export declare const ASK_PARK_AUTO_REOPEN_BLOCKS: readonly ["policy", "park_refused"];
|
|
3
|
+
export type AskParkAutoReopenBlock = (typeof ASK_PARK_AUTO_REOPEN_BLOCKS)[number];
|
|
4
|
+
export declare function askParkRefusalBlockOf(err: {} | null | undefined): AskParkAutoReopenBlock | undefined;
|
|
5
|
+
export declare function askParkBlockGeneration(sessionId?: string): string;
|
|
6
|
+
export interface AskParkDecideIdentity {
|
|
7
|
+
readonly taskId: string;
|
|
8
|
+
readonly sessionId: string;
|
|
9
|
+
readonly boundCallId?: string;
|
|
10
|
+
}
|
|
11
|
+
export declare function noteAskParkDecideSettled(identity: AskParkDecideIdentity, startedGeneration: string, outcome: {
|
|
12
|
+
readonly ok: true;
|
|
13
|
+
} | {
|
|
14
|
+
readonly ok: false;
|
|
15
|
+
readonly error: {} | null | undefined;
|
|
16
|
+
}): void;
|
|
17
|
+
export interface AskParkGate {
|
|
18
|
+
readonly callId: string;
|
|
19
|
+
readonly sessionId?: string;
|
|
20
|
+
}
|
|
21
|
+
export declare function askParkAutoReopenBlockOf(gate: AskParkGate): AskParkAutoReopenBlock | undefined;
|
|
22
|
+
export interface AskParkAutoReopenBlockNotice {
|
|
23
|
+
readonly kind: AskParkAutoReopenBlock;
|
|
24
|
+
readonly text: string;
|
|
25
|
+
delivered(): void;
|
|
26
|
+
}
|
|
27
|
+
export declare function claimAskParkAutoReopenBlockNotice(gate: AskParkGate, lane?: 'interactive' | 'print', lang?: UiLanguage): AskParkAutoReopenBlockNotice | undefined;
|
|
28
|
+
export declare function askParkAutoReopenBlockedContent(kind: AskParkAutoReopenBlock, taskId: string, lane?: 'interactive' | 'print', lang?: UiLanguage): string;
|
|
29
|
+
export declare function clearAskParkAutoReopenBlocks(sessionId?: string): void;
|
|
30
|
+
export declare function __resetAskParkAutoReopenBlocksForTests(): void;
|
|
@@ -0,0 +1,117 @@
|
|
|
1
|
+
import { hostLog } from '../host.js';
|
|
2
|
+
import { msg, renderMessage } from '../i18n/translate.js';
|
|
3
|
+
import { refusedParkBlockedContent, refusedParkFromError, resumePolicyBlockFromError } from '../resumeRefusalCopy.js';
|
|
4
|
+
export const ASK_PARK_AUTO_REOPEN_BLOCKS = Object.freeze(['policy', 'park_refused']);
|
|
5
|
+
export function askParkRefusalBlockOf(err) {
|
|
6
|
+
try {
|
|
7
|
+
if (resumePolicyBlockFromError(err) !== null)
|
|
8
|
+
return 'policy';
|
|
9
|
+
if (refusedParkFromError(err) !== null)
|
|
10
|
+
return 'park_refused';
|
|
11
|
+
return undefined;
|
|
12
|
+
}
|
|
13
|
+
catch {
|
|
14
|
+
return undefined;
|
|
15
|
+
}
|
|
16
|
+
}
|
|
17
|
+
const blocks = new Map();
|
|
18
|
+
const BLOCK_MAX = 64;
|
|
19
|
+
let generation = 0;
|
|
20
|
+
const sessionGenerations = new Map();
|
|
21
|
+
export function askParkBlockGeneration(sessionId) {
|
|
22
|
+
return `${generation}:${typeof sessionId === 'string' ? (sessionGenerations.get(sessionId) ?? 0) : 0}`;
|
|
23
|
+
}
|
|
24
|
+
export function noteAskParkDecideSettled(identity, startedGeneration, outcome) {
|
|
25
|
+
try {
|
|
26
|
+
if (startedGeneration !== askParkBlockGeneration(identity.sessionId))
|
|
27
|
+
return;
|
|
28
|
+
const callId = identity.boundCallId;
|
|
29
|
+
if (typeof callId !== 'string' || callId === '')
|
|
30
|
+
return;
|
|
31
|
+
if (outcome.ok) {
|
|
32
|
+
blocks.delete(callId);
|
|
33
|
+
return;
|
|
34
|
+
}
|
|
35
|
+
const kind = askParkRefusalBlockOf(outcome.error);
|
|
36
|
+
if (kind === undefined)
|
|
37
|
+
return;
|
|
38
|
+
const prev = blocks.get(callId);
|
|
39
|
+
blocks.delete(callId);
|
|
40
|
+
if (prev !== undefined && prev.kind === kind && prev.sessionId === identity.sessionId)
|
|
41
|
+
blocks.set(callId, prev);
|
|
42
|
+
else
|
|
43
|
+
blocks.set(callId, { kind, sessionId: identity.sessionId, taskId: identity.taskId, announced: false });
|
|
44
|
+
while (blocks.size > BLOCK_MAX) {
|
|
45
|
+
const oldest = blocks.keys().next();
|
|
46
|
+
if (oldest.done === true)
|
|
47
|
+
break;
|
|
48
|
+
blocks.delete(oldest.value);
|
|
49
|
+
}
|
|
50
|
+
}
|
|
51
|
+
catch (e) {
|
|
52
|
+
hostLog('debug', `askParkAutoReopenBlock.noteSettled: ${String(e).slice(0, 120)}`);
|
|
53
|
+
}
|
|
54
|
+
}
|
|
55
|
+
function entryFor(gate) {
|
|
56
|
+
if (typeof gate !== 'object' || gate === null || typeof gate.callId !== 'string' || gate.callId === '')
|
|
57
|
+
return undefined;
|
|
58
|
+
const e = blocks.get(gate.callId);
|
|
59
|
+
if (e === undefined)
|
|
60
|
+
return undefined;
|
|
61
|
+
if (typeof gate.sessionId === 'string' && gate.sessionId !== '' && e.sessionId !== undefined && e.sessionId !== gate.sessionId)
|
|
62
|
+
return undefined;
|
|
63
|
+
return e;
|
|
64
|
+
}
|
|
65
|
+
export function askParkAutoReopenBlockOf(gate) {
|
|
66
|
+
try {
|
|
67
|
+
return entryFor(gate)?.kind;
|
|
68
|
+
}
|
|
69
|
+
catch {
|
|
70
|
+
return undefined;
|
|
71
|
+
}
|
|
72
|
+
}
|
|
73
|
+
export function claimAskParkAutoReopenBlockNotice(gate, lane = 'interactive', lang) {
|
|
74
|
+
try {
|
|
75
|
+
const e = entryFor(gate);
|
|
76
|
+
if (e === undefined || e.announced)
|
|
77
|
+
return undefined;
|
|
78
|
+
const text = askParkAutoReopenBlockedContent(e.kind, e.taskId, lane, lang);
|
|
79
|
+
return Object.freeze({
|
|
80
|
+
kind: e.kind,
|
|
81
|
+
text,
|
|
82
|
+
delivered: () => {
|
|
83
|
+
const cur = entryFor(gate);
|
|
84
|
+
if (cur === e)
|
|
85
|
+
e.announced = true;
|
|
86
|
+
},
|
|
87
|
+
});
|
|
88
|
+
}
|
|
89
|
+
catch {
|
|
90
|
+
return undefined;
|
|
91
|
+
}
|
|
92
|
+
}
|
|
93
|
+
export function askParkAutoReopenBlockedContent(kind, taskId, lane = 'interactive', lang) {
|
|
94
|
+
if (kind === 'park_refused')
|
|
95
|
+
return refusedParkBlockedContent(taskId, lane, lang);
|
|
96
|
+
const run = typeof taskId === 'string' && taskId !== '' ? taskId : '<unknown>';
|
|
97
|
+
if (lane === 'print')
|
|
98
|
+
return renderMessage(msg('approval.askPark.autoReopenBlocked.policyPrint', { run, cancel: `POST /v1/runs/${run}/cancel` }), lang);
|
|
99
|
+
return renderMessage(msg('approval.askPark.autoReopenBlocked.policyInteractive', { run }), lang);
|
|
100
|
+
}
|
|
101
|
+
export function clearAskParkAutoReopenBlocks(sessionId) {
|
|
102
|
+
if (typeof sessionId !== 'string' || sessionId === '') {
|
|
103
|
+
generation++;
|
|
104
|
+
sessionGenerations.clear();
|
|
105
|
+
blocks.clear();
|
|
106
|
+
return;
|
|
107
|
+
}
|
|
108
|
+
sessionGenerations.set(sessionId, (sessionGenerations.get(sessionId) ?? 0) + 1);
|
|
109
|
+
for (const [k, e] of blocks)
|
|
110
|
+
if (e.sessionId === sessionId)
|
|
111
|
+
blocks.delete(k);
|
|
112
|
+
}
|
|
113
|
+
export function __resetAskParkAutoReopenBlocksForTests() {
|
|
114
|
+
blocks.clear();
|
|
115
|
+
sessionGenerations.clear();
|
|
116
|
+
generation = 0;
|
|
117
|
+
}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { askParkForeignGateKind, durableDecideLegOf } from '../adapter/activeRunSelfHeal.js';
|
|
2
|
-
import { isAskTool } from './frameRouter.js';
|
|
2
|
+
import { isAskTool, questionCardVerdict } from './frameRouter.js';
|
|
3
3
|
import { approvalCallKey } from './gateIdentity.js';
|
|
4
4
|
import { askQuestionsFromPending, pendingRowIsOwnedByThisSession } from './parkOwnership.js';
|
|
5
5
|
export const ASK_PARK_ROW_WAIT_MS = 15000;
|
|
@@ -39,6 +39,9 @@ export function askParkRowIdentity(taskId, row) {
|
|
|
39
39
|
return { rowTaskId, gatedCallId, armedKey: approvalCallKey(gatedCallId, rowTaskId) };
|
|
40
40
|
}
|
|
41
41
|
export function askParkRowArm(row) {
|
|
42
|
+
const byCard = questionCardVerdict(row);
|
|
43
|
+
if (byCard !== undefined)
|
|
44
|
+
return byCard ? 'question' : 'tool-gate';
|
|
42
45
|
const rowGateKind = askParkRowGateKind(row);
|
|
43
46
|
const toolNameIsAsk = isAskTool(row.toolName ?? undefined);
|
|
44
47
|
if (toolNameIsAsk)
|
|
@@ -0,0 +1,62 @@
|
|
|
1
|
+
import { type DenyAttributionRefusalDetail } from '../wireRefusalCopy.js';
|
|
2
|
+
import { type AnswerCapture, type CapturedLocalCode, type CauseSlotRead, type TopCauseReading, type TopLocalCodeReading, type UnansweredCapture } from '../engineWireFor.js';
|
|
3
|
+
import { type RefusalCarrier, type SafetyStopHead } from './hitlBridge.js';
|
|
4
|
+
import type { SettledFailureReading, TransportClass, TransportReading } from './approvalDelivery.js';
|
|
5
|
+
export interface DeliveredReading {
|
|
6
|
+
readonly cls?: TransportClass;
|
|
7
|
+
readonly answered?: AnswerCapture;
|
|
8
|
+
readonly unanswered?: UnansweredCapture;
|
|
9
|
+
readonly carrierReads?: readonly {
|
|
10
|
+
readonly thrown: object;
|
|
11
|
+
readonly read: RefusalCarrier;
|
|
12
|
+
}[];
|
|
13
|
+
readonly topLocalCode?: TopLocalCodeReading;
|
|
14
|
+
readonly bindingMismatchWrapper?: true;
|
|
15
|
+
readonly topCause?: TopCauseReading;
|
|
16
|
+
readonly safetyStop?: true;
|
|
17
|
+
}
|
|
18
|
+
export declare function isLocalSafetyStop(read: RefusalCarrier, reading: DeliveredReading | 'carrier'): boolean;
|
|
19
|
+
export declare function topCauseReadOf(delivered: DeliveredReading | undefined, x: object): CauseSlotRead | undefined;
|
|
20
|
+
export declare function localCodeReadOf(delivered: DeliveredReading | undefined, x: object): {
|
|
21
|
+
readonly value: CapturedLocalCode;
|
|
22
|
+
} | undefined;
|
|
23
|
+
export declare function carrierReadOf(thrown: {} | null | undefined, delivered: DeliveredReading | undefined): RefusalCarrier;
|
|
24
|
+
export declare function attributionRefusalOfReading(thrown: {} | null | undefined, delivered: DeliveredReading | undefined, sentAttributionKey: boolean): DenyAttributionRefusalDetail | null;
|
|
25
|
+
export declare function attributionRefusalOf(read: RefusalCarrier, reading: DeliveredReading | 'carrier', sentAttributionKey: boolean): DenyAttributionRefusalDetail | null;
|
|
26
|
+
export interface LadderSafetyStop {
|
|
27
|
+
readonly thrown: object;
|
|
28
|
+
readonly head: SafetyStopHead;
|
|
29
|
+
readonly triaged: TransportReading;
|
|
30
|
+
readonly settled?: SettledFailureReading;
|
|
31
|
+
}
|
|
32
|
+
export type LadderReadingSource = {
|
|
33
|
+
readonly kind: 'delivered';
|
|
34
|
+
readonly readingOf: (thrown: {} | null | undefined) => DeliveredReading | undefined;
|
|
35
|
+
} | {
|
|
36
|
+
readonly kind: 'direct';
|
|
37
|
+
readonly stopOf: (thrown: {} | null | undefined) => LadderSafetyStop | undefined;
|
|
38
|
+
};
|
|
39
|
+
export declare function shouldResendWithoutAttribution(refusal: DenyAttributionRefusalDetail | null, sentAttributionKey: boolean, signal?: AbortSignal): boolean;
|
|
40
|
+
export declare function shouldResendUnderSuccessorKey(refusal: DenyAttributionRefusalDetail | null, lastSendCarriedRetiredKey: boolean, signal?: AbortSignal): boolean;
|
|
41
|
+
export declare function carriesAttributionKey(body: object): boolean;
|
|
42
|
+
export declare function withoutAttributionKey<T extends {
|
|
43
|
+
settledBy?: unknown;
|
|
44
|
+
decidedBy?: unknown;
|
|
45
|
+
}>(body: T): Omit<T, 'settledBy' | 'decidedBy'>;
|
|
46
|
+
export declare function withAttributionKeyRenamed<T extends {
|
|
47
|
+
settledBy?: unknown;
|
|
48
|
+
decidedBy?: unknown;
|
|
49
|
+
}>(body: T): Omit<T, 'settledBy' | 'decidedBy'> & {
|
|
50
|
+
decidedBy?: Exclude<T['settledBy'], undefined>;
|
|
51
|
+
};
|
|
52
|
+
export interface AttributionLadderState {
|
|
53
|
+
lastCarried: boolean;
|
|
54
|
+
dropped: boolean;
|
|
55
|
+
renamed: boolean;
|
|
56
|
+
safetyStop?: LadderSafetyStop | undefined;
|
|
57
|
+
}
|
|
58
|
+
export type AttributionLadderStep = 'dropped' | 'renamed' | 'renamed_then_dropped';
|
|
59
|
+
export declare function deliverWithAttributionLadder<B extends {
|
|
60
|
+
settledBy?: unknown;
|
|
61
|
+
decidedBy?: unknown;
|
|
62
|
+
}, R>(body: B, send: (b: B) => Promise<R>, signal: AbortSignal | undefined, state: AttributionLadderState, onStep: ((step: AttributionLadderStep) => void) | undefined, source: LadderReadingSource): Promise<R>;
|
|
@@ -0,0 +1,138 @@
|
|
|
1
|
+
import { denyAttributionRefusalFromError } from '../wireRefusalCopy.js';
|
|
2
|
+
import { ownReadingSlot } from '../engineWireFor.js';
|
|
3
|
+
import { guardedRead } from '../ownKey.js';
|
|
4
|
+
import { isSlotCarrier, readRefusalField } from '../wireFailureShape.js';
|
|
5
|
+
import { refusalCarrierOf } from './hitlBridge.js';
|
|
6
|
+
export function isLocalSafetyStop(read, reading) {
|
|
7
|
+
if (reading !== 'carrier' && ownReadingSlot(reading, 'safetyStop') === true)
|
|
8
|
+
return true;
|
|
9
|
+
return ownReadingSlot(read, 'local') !== undefined;
|
|
10
|
+
}
|
|
11
|
+
export function topCauseReadOf(delivered, x) {
|
|
12
|
+
const t = ownReadingSlot(delivered, 'topCause');
|
|
13
|
+
return t !== undefined && t.layer === x ? t.read : undefined;
|
|
14
|
+
}
|
|
15
|
+
export function localCodeReadOf(delivered, x) {
|
|
16
|
+
const a = ownReadingSlot(delivered, 'answered');
|
|
17
|
+
if (a !== undefined && a.layer === x)
|
|
18
|
+
return { value: a.localCode };
|
|
19
|
+
const u = ownReadingSlot(delivered, 'unanswered');
|
|
20
|
+
if (u !== undefined && u.layer === x)
|
|
21
|
+
return { value: u.localCode };
|
|
22
|
+
const t = ownReadingSlot(delivered, 'topLocalCode');
|
|
23
|
+
return t !== undefined && t.layer === x ? { value: t.localCode } : undefined;
|
|
24
|
+
}
|
|
25
|
+
function bindingMismatchWrapperOver(thrown, delivered) {
|
|
26
|
+
return ownReadingSlot(delivered, 'bindingMismatchWrapper') === true && ownReadingSlot(delivered, 'answered')?.layer === thrown;
|
|
27
|
+
}
|
|
28
|
+
export function carrierReadOf(thrown, delivered) {
|
|
29
|
+
const read = recordedCarrierReadOf(thrown, delivered);
|
|
30
|
+
if (!bindingMismatchWrapperOver(thrown, delivered) || ownReadingSlot(read, 'local') === 'binding_mismatch')
|
|
31
|
+
return read;
|
|
32
|
+
return Object.freeze({ carrier: read.carrier, local: 'binding_mismatch' });
|
|
33
|
+
}
|
|
34
|
+
function recordedCarrierReadOf(thrown, delivered) {
|
|
35
|
+
const list = ownReadingSlot(delivered, 'carrierReads');
|
|
36
|
+
if (list !== undefined) {
|
|
37
|
+
for (let i = 0; i < list.length; i++) {
|
|
38
|
+
const c = list[i];
|
|
39
|
+
if (c !== undefined && c.thrown === thrown)
|
|
40
|
+
return c.read;
|
|
41
|
+
}
|
|
42
|
+
}
|
|
43
|
+
return isSlotCarrier(thrown) ? refusalCarrierOf(thrown, localCodeReadOf(delivered, thrown), false, topCauseReadOf(delivered, thrown)) : refusalCarrierOf(thrown);
|
|
44
|
+
}
|
|
45
|
+
export function attributionRefusalOfReading(thrown, delivered, sentAttributionKey) {
|
|
46
|
+
if (delivered === undefined)
|
|
47
|
+
return null;
|
|
48
|
+
return attributionRefusalOf(carrierReadOf(thrown, delivered), delivered, sentAttributionKey);
|
|
49
|
+
}
|
|
50
|
+
export function attributionRefusalOf(read, reading, sentAttributionKey) {
|
|
51
|
+
if (isLocalSafetyStop(read, reading))
|
|
52
|
+
return null;
|
|
53
|
+
if (reading === 'carrier')
|
|
54
|
+
return denyAttributionRefusalFromError(read.carrier, sentAttributionKey);
|
|
55
|
+
const delivered = reading;
|
|
56
|
+
const a = ownReadingSlot(delivered, 'answered');
|
|
57
|
+
if (a === undefined || a.layer !== read.carrier || a.code.state !== 'read' || a.code.wire === undefined)
|
|
58
|
+
return null;
|
|
59
|
+
const field = guardedRead(() => readRefusalField(a.layer));
|
|
60
|
+
return denyAttributionRefusalFromError(Object.freeze({ status: a.status, errorCode: a.code.wire, ...(field !== undefined ? { field } : {}) }), sentAttributionKey);
|
|
61
|
+
}
|
|
62
|
+
function ladderRefusalOf(thrown, source, state) {
|
|
63
|
+
if (source.kind === 'delivered')
|
|
64
|
+
return attributionRefusalOfReading(thrown, source.readingOf(thrown), true);
|
|
65
|
+
const stop = source.stopOf(thrown);
|
|
66
|
+
if (stop === undefined)
|
|
67
|
+
return attributionRefusalOf({ carrier: thrown }, 'carrier', true);
|
|
68
|
+
state.safetyStop = stop;
|
|
69
|
+
return attributionRefusalOf(stop.head.local !== undefined ? { carrier: thrown, local: stop.head.local } : { carrier: thrown }, stop.triaged, true);
|
|
70
|
+
}
|
|
71
|
+
export function shouldResendWithoutAttribution(refusal, sentAttributionKey, signal) {
|
|
72
|
+
if (!sentAttributionKey)
|
|
73
|
+
return false;
|
|
74
|
+
if (signal?.aborted === true)
|
|
75
|
+
return false;
|
|
76
|
+
return refusal?.kind === 'not_in_proof';
|
|
77
|
+
}
|
|
78
|
+
export function shouldResendUnderSuccessorKey(refusal, lastSendCarriedRetiredKey, signal) {
|
|
79
|
+
if (!lastSendCarriedRetiredKey)
|
|
80
|
+
return false;
|
|
81
|
+
if (signal?.aborted === true)
|
|
82
|
+
return false;
|
|
83
|
+
return refusal?.kind === 'retired_key';
|
|
84
|
+
}
|
|
85
|
+
export function carriesAttributionKey(body) {
|
|
86
|
+
return Object.hasOwn(body, 'settledBy') || Object.hasOwn(body, 'decidedBy');
|
|
87
|
+
}
|
|
88
|
+
export function withoutAttributionKey(body) {
|
|
89
|
+
const { settledBy: _droppedSettledBy, decidedBy: _droppedDecidedBy, ...rest } = body;
|
|
90
|
+
void _droppedSettledBy;
|
|
91
|
+
void _droppedDecidedBy;
|
|
92
|
+
return rest;
|
|
93
|
+
}
|
|
94
|
+
export function withAttributionKeyRenamed(body) {
|
|
95
|
+
const { settledBy, decidedBy: _replaced, ...rest } = body;
|
|
96
|
+
void _replaced;
|
|
97
|
+
return settledBy === undefined ? rest : { ...rest, decidedBy: settledBy };
|
|
98
|
+
}
|
|
99
|
+
export async function deliverWithAttributionLadder(body, send, signal, state, onStep, source) {
|
|
100
|
+
state.lastCarried = carriesAttributionKey(body);
|
|
101
|
+
state.dropped = false;
|
|
102
|
+
state.renamed = false;
|
|
103
|
+
state.safetyStop = undefined;
|
|
104
|
+
try {
|
|
105
|
+
return await send(body);
|
|
106
|
+
}
|
|
107
|
+
catch (first) {
|
|
108
|
+
const firstRefusal = ladderRefusalOf(first, source, state);
|
|
109
|
+
if (shouldResendWithoutAttribution(firstRefusal, state.lastCarried, signal)) {
|
|
110
|
+
const withoutAttribution = withoutAttributionKey(body);
|
|
111
|
+
state.lastCarried = false;
|
|
112
|
+
onStep?.('dropped');
|
|
113
|
+
const r = await send(withoutAttribution);
|
|
114
|
+
state.dropped = true;
|
|
115
|
+
return r;
|
|
116
|
+
}
|
|
117
|
+
if (shouldResendUnderSuccessorKey(firstRefusal, Object.hasOwn(body, 'settledBy'), signal)) {
|
|
118
|
+
const renamed = withAttributionKeyRenamed(body);
|
|
119
|
+
onStep?.('renamed');
|
|
120
|
+
try {
|
|
121
|
+
const r = await send(renamed);
|
|
122
|
+
state.renamed = true;
|
|
123
|
+
return r;
|
|
124
|
+
}
|
|
125
|
+
catch (second) {
|
|
126
|
+
if (!shouldResendWithoutAttribution(ladderRefusalOf(second, source, state), true, signal))
|
|
127
|
+
throw second;
|
|
128
|
+
const renamedWithoutAttribution = withoutAttributionKey(renamed);
|
|
129
|
+
state.lastCarried = false;
|
|
130
|
+
onStep?.('renamed_then_dropped');
|
|
131
|
+
const r = await send(renamedWithoutAttribution);
|
|
132
|
+
state.dropped = true;
|
|
133
|
+
return r;
|
|
134
|
+
}
|
|
135
|
+
}
|
|
136
|
+
throw first;
|
|
137
|
+
}
|
|
138
|
+
}
|
|
@@ -20,9 +20,14 @@ export type AutomaticAnswerVerdict = {
|
|
|
20
20
|
readonly kind: 'unknown';
|
|
21
21
|
readonly why: AutomaticAnswerUnknownWhy;
|
|
22
22
|
};
|
|
23
|
-
export declare const MODE_ARBITRATION: Readonly<Record<"hook" | "write_protection" | "mode" | "target_unresolved" | "content_question" | "ancestor" | "dangerous_delete" | "unverifiable_delete" | "unverifiable_shell_text" | "transcript_write" | "org_rule" | "rule_unreadable" | "ask_rule" | "denial_limit_fallback" | "classifier_no_ruling" | "requires_user_interaction" | "operator_forced" | "shell_floor" | "probe" | "tool_marks_mcp" | "tool_marks_a2a" | "policy_rra" | "artifact_shared_read" | "unstated" | "ordinary", CoreModeArbitrationRow>>;
|
|
23
|
+
export declare const MODE_ARBITRATION: Readonly<Record<"hook" | "write_protection" | "mode" | "target_unresolved" | "content_question" | "ancestor" | "dangerous_delete" | "unverifiable_delete" | "unverifiable_shell_text" | "transcript_write" | "org_rule" | "rule_unreadable" | "ask_rule" | "denial_limit_fallback" | "classifier_no_ruling" | "requires_user_interaction" | "cross_boundary" | "operator_forced" | "shell_floor" | "probe" | "tool_marks_mcp" | "tool_marks_a2a" | "policy_rra" | "artifact_shared_read" | "unstated" | "ordinary", CoreModeArbitrationRow>>;
|
|
24
24
|
export declare function foldModeArbitrationRow(classes: Iterable<string>, askFace?: AutomaticAnswerAskFace): CoreModeArbitrationRow;
|
|
25
25
|
export declare function automaticAnswerVerdict(card: object | null | undefined, lane: AutomaticAnswerLane, facts?: AutomaticAnswerFacts | null): AutomaticAnswerVerdict;
|
|
26
26
|
export declare function mandatedApprovalDetailOf(card: object | null | undefined, lang?: UiLanguage): string;
|
|
27
|
+
export interface CrossBoundaryTaintReading {
|
|
28
|
+
readonly taint: true;
|
|
29
|
+
}
|
|
30
|
+
export declare function crossBoundaryTaintOf(carrier: object | null | undefined): CrossBoundaryTaintReading | undefined;
|
|
31
|
+
export declare function crossBoundaryTaintWayOutOf(carrier: object | null | undefined, lang?: UiLanguage): string | undefined;
|
|
27
32
|
export type PermissionRequestHookScope = 'allow_or_deny' | 'deny_only' | 'skip';
|
|
28
33
|
export declare function permissionRequestHookScope(verdict: AutomaticAnswerVerdict | null | undefined): PermissionRequestHookScope;
|
|
@@ -2,7 +2,7 @@ import { CORE_MODE_ARBITRATION, CORE_MODE_RELEASE_REASONS } from '../generated/e
|
|
|
2
2
|
import { CORE_RELEASABLE_ASK_CLASSES_BY_FACE, CORE_SHELL_FACE_TOOL_NAMES } from '../generated/engineAskFaceTables.js';
|
|
3
3
|
import { mandatedApprovalDetail } from '../gateVocabulary.js';
|
|
4
4
|
import { msg, renderMessage } from '../i18n/translate.js';
|
|
5
|
-
import { readAskOrigin, readOwnNonEmptyString } from '../ownKey.js';
|
|
5
|
+
import { guardedRead, readAskOrigin, readOwnDataValue, readOwnNonEmptyString } from '../ownKey.js';
|
|
6
6
|
import { readAskClassPairState } from './askClassPair.js';
|
|
7
7
|
import { readRequiresRealApproval } from './approvalCardReading.js';
|
|
8
8
|
import { approvalAllowRuleShadowed, retiredAllowRuleShadowKeyPresent } from './allowRuleShadow.js';
|
|
@@ -31,7 +31,7 @@ function bypassImmuneOn(c, face) {
|
|
|
31
31
|
function askFaceOfCard(card) {
|
|
32
32
|
try {
|
|
33
33
|
const d = Object.getOwnPropertyDescriptor(card, 'toolName');
|
|
34
|
-
return d !== undefined && 'value'
|
|
34
|
+
return d !== undefined && Object.hasOwn(d, 'value') && typeof d.value === 'string' && CORE_SHELL_FACE_TOOL_NAMES.includes(d.value) ? 'shell' : 'other';
|
|
35
35
|
}
|
|
36
36
|
catch {
|
|
37
37
|
return 'other';
|
|
@@ -61,11 +61,11 @@ export function foldModeArbitrationRow(classes, askFace) {
|
|
|
61
61
|
return Object.freeze({ bypassImmune, classifierEligible, sandboxAdmission, ruleMayClear, hookAskFloor });
|
|
62
62
|
}
|
|
63
63
|
function rowBlocks(lane, row) {
|
|
64
|
-
return lane === 'mode_posture' ? row.bypassImmune :
|
|
64
|
+
return lane === 'mode_posture' ? row.bypassImmune : !row.ruleMayClear;
|
|
65
65
|
}
|
|
66
66
|
function classBlocks(lane, c, face) {
|
|
67
67
|
const row = TABLE[c];
|
|
68
|
-
return lane === 'mode_posture' ? bypassImmuneOn(c, face) :
|
|
68
|
+
return lane === 'mode_posture' ? bypassImmuneOn(c, face) : !row.ruleMayClear;
|
|
69
69
|
}
|
|
70
70
|
function mustAsk(road, extra) {
|
|
71
71
|
return Object.freeze({ kind: 'must_ask', road, ...(extra?.askClass !== undefined ? { askClass: extra.askClass } : {}), ...(extra?.origin !== undefined ? { origin: extra.origin } : {}) });
|
|
@@ -91,13 +91,8 @@ function evidenceView(card, ...keys) {
|
|
|
91
91
|
function readHostAskRuleMatched(facts) {
|
|
92
92
|
if (typeof facts !== 'object' || facts === null)
|
|
93
93
|
return undefined;
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
return d !== undefined && 'value' in d && typeof d.value === 'boolean' ? d.value : undefined;
|
|
97
|
-
}
|
|
98
|
-
catch {
|
|
99
|
-
return undefined;
|
|
100
|
-
}
|
|
94
|
+
const v = guardedRead(() => readOwnDataValue(facts, 'settingsAskRuleMatched'));
|
|
95
|
+
return typeof v === 'boolean' ? v : undefined;
|
|
101
96
|
}
|
|
102
97
|
export function automaticAnswerVerdict(card, lane, facts) {
|
|
103
98
|
if (lane !== 'mode_posture' && lane !== 'standing_rule' && lane !== 'permission_request_hook')
|
|
@@ -199,6 +194,46 @@ export function mandatedApprovalDetailOf(card, lang) {
|
|
|
199
194
|
return mandatedApprovalDetail(lang);
|
|
200
195
|
}
|
|
201
196
|
}
|
|
197
|
+
const CROSS_BOUNDARY_CLASS = 'cross_boundary';
|
|
198
|
+
const CROSS_BOUNDARY_MANDATE = 'cross_boundary_taint';
|
|
199
|
+
const TAINTED = Object.freeze({ taint: true });
|
|
200
|
+
function snapshotOf(carrier) {
|
|
201
|
+
const out = {};
|
|
202
|
+
for (const key of ['mandate', 'askClass', 'classes']) {
|
|
203
|
+
const v = guardedRead(() => readOwnDataValue(carrier, key));
|
|
204
|
+
if (v !== undefined)
|
|
205
|
+
out[key] = v;
|
|
206
|
+
}
|
|
207
|
+
return out;
|
|
208
|
+
}
|
|
209
|
+
function classEvidence(carrier) {
|
|
210
|
+
try {
|
|
211
|
+
const pair = readAskClassPairState(carrier);
|
|
212
|
+
return pair.state === 'pair' && pair.classes.includes(CROSS_BOUNDARY_CLASS) ? true : undefined;
|
|
213
|
+
}
|
|
214
|
+
catch {
|
|
215
|
+
return undefined;
|
|
216
|
+
}
|
|
217
|
+
}
|
|
218
|
+
function mandateEvidence(carrier) {
|
|
219
|
+
return readApprovalMandate(carrier) === CROSS_BOUNDARY_MANDATE ? true : undefined;
|
|
220
|
+
}
|
|
221
|
+
export function crossBoundaryTaintOf(carrier) {
|
|
222
|
+
if (typeof carrier !== 'object' || carrier === null)
|
|
223
|
+
return undefined;
|
|
224
|
+
const snapshot = snapshotOf(carrier);
|
|
225
|
+
return classEvidence(snapshot) === true || mandateEvidence(snapshot) === true ? TAINTED : undefined;
|
|
226
|
+
}
|
|
227
|
+
export function crossBoundaryTaintWayOutOf(carrier, lang) {
|
|
228
|
+
try {
|
|
229
|
+
if (crossBoundaryTaintOf(carrier) === undefined)
|
|
230
|
+
return undefined;
|
|
231
|
+
return renderMessage(msg('approval.mandate.wayOut.crossBoundaryTaint'), lang);
|
|
232
|
+
}
|
|
233
|
+
catch {
|
|
234
|
+
return undefined;
|
|
235
|
+
}
|
|
236
|
+
}
|
|
202
237
|
export function permissionRequestHookScope(verdict) {
|
|
203
238
|
try {
|
|
204
239
|
const kind = typeof verdict === 'object' && verdict !== null ? verdict.kind : undefined;
|