@sema-agent/client-core 0.112.0 → 0.113.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (182) hide show
  1. package/CHANGELOG.md +153 -0
  2. package/README.md +37 -24
  3. package/dist/adapt/arms.js +7 -1
  4. package/dist/adapt/textStream.d.ts +2 -0
  5. package/dist/adapt/textStream.js +27 -1
  6. package/dist/adapter/activeRunSelfHeal.d.ts +7 -5
  7. package/dist/adapter/activeRunSelfHeal.js +38 -66
  8. package/dist/adapter/downstream/eventToSdkMessage.js +4 -0
  9. package/dist/adapter/downstream/terminalToSdkResult.d.ts +8 -0
  10. package/dist/adapter/downstream/terminalToSdkResult.js +36 -1
  11. package/dist/adapter/runStream.d.ts +2 -12
  12. package/dist/adapter/runStream.js +46 -19
  13. package/dist/agentSession/engineAgentRegistryRead.js +2 -1
  14. package/dist/agentSession/engineSessionBackgroundStop.js +2 -2
  15. package/dist/attachmentOutcome.d.ts +35 -0
  16. package/dist/attachmentOutcome.js +192 -0
  17. package/dist/attachmentPathPlan.d.ts +67 -0
  18. package/dist/attachmentPathPlan.js +203 -0
  19. package/dist/attachmentRoute.d.ts +9 -1
  20. package/dist/attachmentRoute.js +23 -2
  21. package/dist/declared/supportFloorDeclared.d.ts +1 -1
  22. package/dist/declared/supportFloorDeclared.js +1 -0
  23. package/dist/deviceRebind.js +2 -3
  24. package/dist/displayUntrusted.js +126 -19
  25. package/dist/engineAddress.d.ts +1 -1
  26. package/dist/engineAddress.js +9 -6
  27. package/dist/engineErrorCodes.d.ts +3 -0
  28. package/dist/engineErrorCodes.js +4 -0
  29. package/dist/engineNoticeCodes.d.ts +34 -4
  30. package/dist/engineNoticeCodes.js +133 -6
  31. package/dist/engineUnavailable.d.ts +4 -2
  32. package/dist/engineUnavailable.js +99 -17
  33. package/dist/fleet/fleetLedger.d.ts +9 -3
  34. package/dist/fleet/fleetLedger.js +112 -16
  35. package/dist/fleet/fleetProjection.d.ts +5 -0
  36. package/dist/fleet/fleetProjection.js +9 -1
  37. package/dist/gateVocabulary.d.ts +7 -0
  38. package/dist/gateVocabulary.js +40 -14
  39. package/dist/generated/engineFactTables.d.ts +4 -2
  40. package/dist/generated/engineFactTables.js +198 -2
  41. package/dist/generated/engineNoticeTables.js +56 -8
  42. package/dist/generated/settingsSchemaFns.d.ts +7 -0
  43. package/dist/generated/settingsSchemaFns.js +11 -0
  44. package/dist/generated/settingsSchemaHash.d.ts +1 -0
  45. package/dist/generated/settingsSchemaHash.js +58 -0
  46. package/dist/generated/settingsSchemaOwnKeyRead.js +6 -1
  47. package/dist/generated/settingsSchemaTables.d.ts +3 -2
  48. package/dist/generated/settingsSchemaTables.js +14 -0
  49. package/dist/generated/settingsSchemaTightenVerdict.d.ts +1 -0
  50. package/dist/generated/settingsSchemaTightenVerdict.js +125 -0
  51. package/dist/headlessPermissionModeWire.d.ts +7 -2
  52. package/dist/headlessPermissionModeWire.js +77 -8
  53. package/dist/hitl/approvalDecisionDoor.d.ts +24 -0
  54. package/dist/hitl/approvalDecisionDoor.js +77 -0
  55. package/dist/hitl/approvalDelivery.d.ts +6 -0
  56. package/dist/hitl/approvalDelivery.js +57 -7
  57. package/dist/hitl/approvalResolution.d.ts +6 -3
  58. package/dist/hitl/approvalResolution.js +24 -2
  59. package/dist/hitl/approvalsFeed.js +1 -1
  60. package/dist/hitl/automaticAnswerVerdict.d.ts +1 -1
  61. package/dist/hitl/decisionSend.d.ts +7 -4
  62. package/dist/hitl/decisionSend.js +90 -41
  63. package/dist/hitl/frameRouter.d.ts +3 -3
  64. package/dist/hitl/frameRouter.js +5 -0
  65. package/dist/hitl/hitlBridge.d.ts +1 -0
  66. package/dist/hitl/hitlBridge.js +17 -4
  67. package/dist/hitl/hitlHostSurface.d.ts +3 -2
  68. package/dist/hitl/hitlHostSurface.js +5 -3
  69. package/dist/hitl/legacyApprovalShapes.d.ts +142 -0
  70. package/dist/hitl/legacyApprovalShapes.js +1 -0
  71. package/dist/hitl/livePendingAsk.d.ts +4 -4
  72. package/dist/hitl/livePendingAsk.js +5 -3
  73. package/dist/hitl/parkResolver.js +1 -1
  74. package/dist/hitl/persistedRulesWire.js +2 -2
  75. package/dist/hitl/planReviewCard.d.ts +4 -2
  76. package/dist/hitl/planReviewCard.js +66 -1
  77. package/dist/hitl/planReviewWire.d.ts +34 -2
  78. package/dist/hitl/planReviewWire.js +326 -150
  79. package/dist/hitl/sessionPolicyWire.js +16 -7
  80. package/dist/hitl/subagentSource.d.ts +1 -0
  81. package/dist/hitl/subagentSource.js +11 -0
  82. package/dist/hitl/toolApprovalWire.d.ts +34 -10
  83. package/dist/hitl/toolApprovalWire.js +182 -33
  84. package/dist/hookMatcherVerdict.d.ts +2 -1
  85. package/dist/hookMatcherVerdict.js +3 -2
  86. package/dist/hooksReaderGenerations.d.ts +8 -0
  87. package/dist/hooksReaderGenerations.js +49 -0
  88. package/dist/hooksWireCaps.js +43 -18
  89. package/dist/hostSettingsSource.d.ts +1 -1
  90. package/dist/hostSettingsSource.js +2 -2
  91. package/dist/hostTurnSettings.d.ts +2 -2
  92. package/dist/hostTurnSettings.js +87 -47
  93. package/dist/humanTurn.d.ts +2 -1
  94. package/dist/humanTurn.js +44 -13
  95. package/dist/humanTurnRead.d.ts +7 -0
  96. package/dist/humanTurnRead.js +23 -14
  97. package/dist/humanTurnSentences.js +3 -0
  98. package/dist/i18n/messages.en.d.ts +93 -5
  99. package/dist/i18n/messages.en.js +100 -12
  100. package/dist/i18n/messages.zh.js +110 -15
  101. package/dist/index.d.ts +29 -15
  102. package/dist/index.js +17 -9
  103. package/dist/liveModelCatalog.js +1 -0
  104. package/dist/liveQuestionStore.d.ts +2 -0
  105. package/dist/liveQuestionStore.js +7 -2
  106. package/dist/localConfig/kernel.d.ts +2 -1
  107. package/dist/localConfig/kernel.js +12 -18
  108. package/dist/localConfig/mcp/edit.js +25 -27
  109. package/dist/localConfig/mcp/servers.js +5 -8
  110. package/dist/localConfig/modelPool.d.ts +6 -1
  111. package/dist/localConfig/modelPool.js +104 -27
  112. package/dist/localConfig/modelPoolWords.d.ts +2 -0
  113. package/dist/localConfig/modelPoolWords.js +1 -0
  114. package/dist/localConfig/settingsWrite.js +1 -14
  115. package/dist/localConfig/skills.js +9 -16
  116. package/dist/localEngineSpawn.d.ts +29 -1
  117. package/dist/localEngineSpawn.js +62 -1
  118. package/dist/mcpLiveness.d.ts +1 -1
  119. package/dist/mcpProbeWire.js +2 -2
  120. package/dist/mcpReconnect.js +2 -2
  121. package/dist/model/catalogLoader.js +3 -17
  122. package/dist/model/onboardJudgement.d.ts +8 -0
  123. package/dist/model/onboardJudgement.js +8 -3
  124. package/dist/model/onboardSteps.d.ts +19 -0
  125. package/dist/model/onboardSteps.js +76 -0
  126. package/dist/notifications.js +20 -12
  127. package/dist/ownKey.d.ts +4 -0
  128. package/dist/ownKey.js +61 -0
  129. package/dist/pathShape.d.ts +14 -0
  130. package/dist/pathShape.js +44 -0
  131. package/dist/planReviewCardFacts.d.ts +3 -0
  132. package/dist/planReviewCardFacts.js +20 -3
  133. package/dist/planReviewOutcomeCause.d.ts +2 -0
  134. package/dist/planReviewOutcomeCause.js +12 -0
  135. package/dist/pluginHooksWire.d.ts +20 -8
  136. package/dist/pluginHooksWire.js +204 -86
  137. package/dist/prepareRefusal.d.ts +2 -0
  138. package/dist/prepareRefusal.js +11 -1
  139. package/dist/request/taskRequest.js +3 -1
  140. package/dist/resultFrameKeys.d.ts +1 -0
  141. package/dist/resultFrameKeys.js +3 -0
  142. package/dist/resumeRefusalCopy.js +3 -1
  143. package/dist/retryStatus.d.ts +11 -1
  144. package/dist/retryStatus.js +15 -4
  145. package/dist/runTerminal.d.ts +1 -0
  146. package/dist/runTerminal.js +15 -1
  147. package/dist/sdkWireTransit.d.ts +1 -1
  148. package/dist/seatContract.d.ts +12 -3
  149. package/dist/seatContract.js +24 -13
  150. package/dist/sessionEngine.js +1 -1
  151. package/dist/sessionHooksRoster.js +8 -6
  152. package/dist/sessionIdSegment.d.ts +0 -1
  153. package/dist/sessionIdSegment.js +1 -3
  154. package/dist/sessionMemoryErase.js +2 -2
  155. package/dist/sessionMemoryStatus.js +2 -1
  156. package/dist/sessionOccupant.d.ts +29 -0
  157. package/dist/sessionOccupant.js +78 -0
  158. package/dist/settingsHooksSalvage.d.ts +4 -1
  159. package/dist/settingsHooksSalvage.js +22 -9
  160. package/dist/skillOverrideChain.d.ts +3 -0
  161. package/dist/skillOverrideChain.js +31 -4
  162. package/dist/skillsWireCaps.d.ts +16 -2
  163. package/dist/skillsWireCaps.js +47 -20
  164. package/dist/subagent/agentStateDetail.js +32 -8
  165. package/dist/subagent/engineCompactWire.js +48 -36
  166. package/dist/subagent/engineDelegatedPrompt.d.ts +3 -2
  167. package/dist/subagent/engineDelegatedPrompt.js +65 -28
  168. package/dist/subagentEditOutcomes.d.ts +9 -0
  169. package/dist/subagentEditOutcomes.js +43 -0
  170. package/dist/supportFloor.d.ts +2 -1
  171. package/dist/supportFloor.js +1 -1
  172. package/dist/toolResult.js +4 -2
  173. package/dist/toolRoster.d.ts +1 -0
  174. package/dist/toolRoster.js +1 -0
  175. package/dist/usageAnalytics.js +2 -1
  176. package/dist/userAttachmentEnvelope.d.ts +11 -0
  177. package/dist/userAttachmentEnvelope.js +7 -2
  178. package/dist/userAttachmentSeat.d.ts +7 -1
  179. package/dist/userAttachmentSeat.js +44 -7
  180. package/dist/wiringInstructionsAttribution.js +8 -2
  181. package/docs/INTEGRATION-CLIENTS.md +1654 -16
  182. package/package.json +5 -5
package/dist/index.js CHANGED
@@ -87,7 +87,7 @@ export { readModsDeploymentPackages } from './engineHealthFacts.js';
87
87
  export { localEngineAnchorOf, localEnginePlanDriftOf, judgeLocalEngine, localEngineLaneOf, localEngineVerdictSentence } from './localEngineJudge.js';
88
88
  export { countClientRegistry, fleetBackgroundLiveOf, localEngineSelfOf, localEngineRegistryStatusOf, localEngineIdle, localEngineDemandOf, localEngineExitFate, localEngineExitFateSentence, } from './localEngineOccupancy.js';
89
89
  export { LOCAL_ENGINE_SWAP_CAUSES, localEngineSwapAutoable, engineSwapCardOf, engineSwapCardText } from './localEngineSwapCard.js';
90
- export { LOCAL_ENGINE_SPAWN_ENV, LOCAL_ENGINE_HOST_BITS, LOCAL_ENGINE_SPAWN_SHAPE, localEngineOperatorSingleUserOf, localEngineSpawnEnv, localEngineSeedEnv, localEnginePrincipalOf, localEnginePrincipalSentence, localEngineFirstShareSentence, } from './localEngineSpawn.js';
90
+ export { LOCAL_ENGINE_SPAWN_ENV, LOCAL_ENGINE_HOST_BITS, LOCAL_ENGINE_SPAWN_SHAPE, localEngineOperatorSingleUserOf, localEngineSpawnEnv, localEngineSeedEnv, localEnginePrincipalOf, localEnginePrincipalSentence, localEngineFirstShareSentence, LOCAL_ENGINE_SEED_REFUSALS, LOCAL_ENGINE_BIND_DISCLOSURES, localEngineSeedRefusalCodeOf, localEngineBindGateOf, localEngineBindSentence, } from './localEngineSpawn.js';
91
91
  export { ENGINE_UNAVAILABLE_REASONS, ENGINE_INSTALL_SHAPES, ENGINE_BOOT_REFUSAL_CODES, engineBootRefusalOf, engineBootRefusalSentence, engineUnavailableLine, } from './engineUnavailable.js';
92
92
  export { LOCAL_ENGINE_STOP_LADDER, stopLadderStep } from './localEngineStopLadder.js';
93
93
  export { LOCAL_ENGINE_INITIAL_STATE, LOCAL_ENGINE_FAIL_CODES, localEngineStep, engineSwapAnswerOutcomeOf } from './localEngineStep.js';
@@ -124,6 +124,7 @@ export { stripSystemReminderBlocks, unwrapSystemReminder } from './systemReminde
124
124
  export { findSystemReminderOpenTag } from './systemReminderTag.js';
125
125
  export { ACTIVE_RUN_BUSY_ERROR_CODE, APPROVAL_EXPIRED, ASK_GONE, asModelFallbackReason, CAPABILITY_IMAGE_INDEX_REQUIRED, CAPABILITY_K8S_LANE_REQUIRED, CAPABILITY_OPERATOR_PRINCIPALS_REQUIRED, CAPABILITY_SELF_ORCHESTRATION_REQUIRED, CONFIG_AGENT_UNKNOWN_TOOL, CONFIG_DELEGATION_ENTRY_CAPS, CONFIG_IMAGE_INVALID, CONFIG_LEGACY_TOOL_NAME, CONFIG_LIMIT_INVALID, CONFIG_LIMIT_UNKNOWN_KEY, CONFIG_MCP_SERVER_NAME_COLLISION, CONFIG_MEMORY_PROJECT_KEY_SPELLING, CONFIG_MEMORY_WRITE_SCOPE_MISMATCH, CONFIG_OUTPUT_STYLE_INVALID, CONFIG_TOOL_FACE_CONTROL, CONFLICT_IDEMPOTENCY_PAYLOAD_MISMATCH, CORRUPT_SESSION_ERROR_CODE, DECIDE_CLAIM_LOST, DECIDE_GATE_MOVED, DECIDE_NOT_PARKED, DECIDE_PARK_MOVED_CODES, DECIDE_ROW_UNREVIVABLE, DECIDE_WORKFLOW_HOST_UNKNOWN, DECIDE_WORKFLOW_LANE_CODES, DECIDE_WORKFLOW_PARK_FORKED, DECIDE_WORKFLOW_PARKS_UNREADABLE, DECIDE_WORKFLOW_REMEMBER_UNSUPPORTED, DELEGATION_CAP_CODES, DELEGATION_CONCURRENCY_CAP, DELEGATION_SESSION_CAP, delegationCapDispositionOf, DRAINING_ERROR_CODE, ENGINE_STOP_REASONS, engineStopReasonToCc, ENV_LIFETIME_EXPIRED, FLEET_LEASE_UNAVAILABLE, GATE_PARKED_ERROR_CODE, idempotencyPayloadMismatchContent, isConfigRefusalCode, isCorruptSessionCode, isDecideParkMovedCode, isDecideRowUnrevivableCode, isDelegationCapCode, isIdempotencyPayloadMismatchCode, isInterruptedToolEndCode, isLimitsExceededCode, isRewindFamilyCode, isRulesRefusalCode, isStatusDerivedCoarseCode, isWorkflowParkRefusalCode, LIMITS_MAX_COST_EXCEEDED, LIMITS_MAX_TOKENS_EXCEEDED, LIMITS_MAX_TURNS_EXCEEDED, LIMITS_MAX_WALLTIME_EXCEEDED, MCP_SERVER_REVOKED, MCP_TOOL_DECLARATION_CHANGED, MCP_TOOL_LISTING_UNREACHED, MODEL_FALLBACK_INHERIT_NO_TIER_BINDING, operatorGateRefusalContent, OUTPUT_INVALID, PARKED_RESUME_STARTUP_FAILED, PROMPT_ASSEMBLED_ROLE_REFUSED, REQUEST_AUTONOMY_LANE_REFUSED, RESUME_AT_ERROR_CODE_PREFIX, RESUME_CONTEXT_UNAVAILABLE, RESUME_ENV_FAILED, RESUME_PLACEMENT_MISMATCH, RESUME_POLICY_FOLD_CODE, RESUME_PREFLIGHT_REJECTED, RESUME_REOPEN_CODES, RESUME_RETRY_LATER_CODES, RESUME_TOOL_CONTRACT_MISMATCH, RESUME_TOOL_UNAVAILABLE, RESUME_USAGE_WINDOW_EXHAUSTED, REWIND_ERROR_CODE_PREFIXES, RUN_ORPHANED, RUN_STALLED, runDeathVerdictNoteOf, SCENARIO_ASSIGNMENT_UNKNOWN_ERROR_CODE, SCENARIO_NOT_ALLOWED_ERROR_CODE, STREAM_MAX_DURATION, TOOL_END_INTERRUPTED_NEVER_STARTED, TOOL_END_INTERRUPTED_OUTCOME_UNKNOWN, USAGE_WINDOW_EXHAUSTED, USER_ATTACHMENT_INVALID_ERROR_CODE, USER_INVOKED_SKILL_UNKNOWN_ERROR_CODE, WORKFLOW_PARK_REFUSAL_CODES, ATTACHMENT_BOUND_ELSEWHERE, ATTACHMENT_BUNDLE_INVALID, ATTACHMENT_BUNDLE_LANE_NOT_ISOLATED, ATTACHMENT_BUNDLE_SEED_FIXED, CONFLICT_SESSION_MEMORY_UNOBSERVED, CONFLICT_SESSION_ARCHIVE_STAMPED, ENV_HOME_UNCONFIRMED, REQUEST_ENV_CREDENTIAL_REFUSED, CONFLICT_SESSION_ID_RETIRED, } from './engineErrorCodes.js';
126
126
  export { prepareRefusalCodeOf, prepareRefusalNoteOf } from './prepareRefusal.js';
127
+ export { attachmentOutcomesOf, attachmentOutcomeText, ATTACHMENT_OUTCOMES } from './attachmentOutcome.js';
127
128
  export * from './agentsWireCaps.js';
128
129
  export { engineToolDirectoryOf } from './engineToolDirectory.js';
129
130
  export * from './attachmentsWireCaps.js';
@@ -188,6 +189,7 @@ export { abortableSleep } from './abortableSleep.js';
188
189
  export { DEFAULT_SESSION_KEY } from './sessionSlot.js';
189
190
  export * from './scratchpadWireCaps.js';
190
191
  export * from './toolResult.js';
192
+ export { subagentEditOutcomesOf, subagentEditOutcomesSentence } from './subagentEditOutcomes.js';
191
193
  export * from './diff/patch.js';
192
194
  export * from './sandboxWire.js';
193
195
  export * from './scenarioWire.js';
@@ -196,7 +198,7 @@ export * from './limitsWire.js';
196
198
  export * from './interactiveToolsWire.js';
197
199
  export * from './headlessPermissionModeWire.js';
198
200
  export * from './headlessReconnectWire.js';
199
- export { coerceTaskStatus, coerceWorkflowStatus, CONTROL_TOOL_VERBS, FLEET_TASK_ROW_KEYS_NOT_PROJECTED, FLEET_TASK_ROW_WIRE_KEYS, FLEET_TASK_VIEW_KEYS, FLEET_WORKFLOW_ROW_KEYS_NOT_PROJECTED, FLEET_WORKFLOW_ROW_WIRE_KEYS, FLEET_WORKFLOW_VIEW_KEYS, projectDescription, projectTasks, projectWorkflows, wireResumable, wireRowUsage, workflowRunDisplayStatusOf, } from './fleet/fleetProjection.js';
201
+ export { coerceTaskStatus, coerceWorkflowStatus, CONTROL_TOOL_VERBS, FLEET_LEDGER_TASK_VIEW_EXTRA_KEYS, FLEET_TASK_ROW_KEYS_NOT_PROJECTED, FLEET_TASK_ROW_WIRE_KEYS, FLEET_TASK_VIEW_KEYS, FLEET_WORKFLOW_ROW_KEYS_NOT_PROJECTED, FLEET_WORKFLOW_ROW_WIRE_KEYS, FLEET_WORKFLOW_VIEW_KEYS, fleetTaskShownStatus, projectDescription, projectTasks, projectWorkflows, wireResumable, wireRowUsage, workflowRunDisplayStatusOf, } from './fleet/fleetProjection.js';
200
202
  export * from './fleet/fleetLedger.js';
201
203
  export * from './fleet/bgSubagentRow.js';
202
204
  export * from './fleet/workflowSizeWarning.js';
@@ -231,11 +233,14 @@ export { createPromptDeliveryLedger, promptKnownUndelivered, withoutUndeliveredP
231
233
  export { mintUserAttachmentEnvelope, showAttachmentName } from './userAttachmentEnvelope.js';
232
234
  export { showAttachmentNameCc } from './userAttachmentEnvelope.js';
233
235
  export { encodeHumanTurn, deliveredUuidsOf, imageSentOnUnknownVision, otherBodyBytesOf } from './humanTurn.js';
236
+ export { attachmentPathOverflowText } from './attachmentPathPlan.js';
237
+ export { attachmentRoutePlanOf } from './attachmentPathPlan.js';
234
238
  export { batchCompatible, planQueuedDelivery, humanTurnCapsOf, humanTextForKeywordScan, selfHealSteerEligible } from './queuedDelivery.js';
235
239
  export { SUBMISSION_SURFACES, SUBMISSION_ORIGINS, SUBMISSION_TOOLS, SUBMISSION_KINDS, submissionProvenanceOf, submissionIdentityOf, requestLaneOf, submissionOriginOf, } from './request/submissionIdentity.js';
236
240
  export { taskNotificationOf, taskNotificationQueueCommand } from './notifications.js';
237
241
  export { taskNotificationAdmissionOf } from './taskNotificationAdmission.js';
238
242
  export { resultErrorCodeInTextOf } from './resultFrameKeys.js';
243
+ export { resultTurnAbortedByOf } from './resultFrameKeys.js';
239
244
  export { humanTurnRefusalSentence, humanTurnDegradedSentence, printImageVisionSentence } from './humanTurnSentences.js';
240
245
  export { observedUserAttachmentSeat, projectUserAttachmentSeatCapability, userAttachmentSeatAdmits } from './userAttachmentSeat.js';
241
246
  export { attachmentRouteOf, attachmentWithheldReasonText, attachmentLocalCopyNote, ATTACHMENT_ROUTE_LEGS, TOOLS_LOCATIONS } from './attachmentRoute.js';
@@ -258,10 +263,10 @@ export * from './detachWire.js';
258
263
  export * from './workflowMonitor.js';
259
264
  export * from './workflowClient.js';
260
265
  export * from './hooksWireCaps.js';
261
- export { ENGINE_FIRED_HOOK_EVENTS, PLUGIN_HOOK_DISPOSITIONS, PLUGIN_HOOK_REASONS, PLUGIN_HOOK_EXCLUSION_REASONS, SETTINGS_HOOK_DROP_REASONS, isEngineFiredHookEvent, pluginHookVerdictOf, pluginHookReasonText, settingsHookDropText, pluginHookExecutorLabel, hooksNotRunNotice, settingsHooksKeptLocally, pluginHooksKeptLocally, userPromptSubmitExecutorOf, HOOK_ENTRY_TYPE_WORDS, } from './pluginHooksWire.js';
266
+ export { SUPPORT_FLOOR_SETTINGS_CONTRACT, PLUGIN_HOOK_DISPOSITIONS, PLUGIN_HOOK_REASONS, PLUGIN_HOOK_EXCLUSION_REASONS, SETTINGS_HOOK_DROP_REASONS, isEngineFiredHookEvent, pluginHookVerdictOf, pluginHookReasonText, settingsHookDropText, pluginHookExecutorLabel, hooksNotRunNotice, settingsHooksKeptLocally, pluginHooksKeptLocally, userPromptSubmitExecutorOf, HOOK_ENTRY_TYPE_WORDS, } from './pluginHooksWire.js';
262
267
  export { sessionHooksRosterOf } from './sessionHooksRoster.js';
263
268
  export { HTTP_POLICY_DROP_REASONS } from './httpHookPolicy.js';
264
- export { salvageSettingsHooksEntries, settingsHooksSalvageNotice, } from './settingsHooksSalvage.js';
269
+ export { isGuardHookEvent, salvageSettingsHooksEntries, settingsHooksSalvageNotice, } from './settingsHooksSalvage.js';
265
270
  export { hostSettingNoticeEventsOf } from './hostSettingNoticeArm.js';
266
271
  export { hostSettingsSelfCheck, HostSettingsRefused, HOST_SUPPLIED_KEYS, HOST_SETTING_CAUSES, HOST_SETTING_DISPOSITIONS, hostSettingsConsent, hostSettingsAcceptCurrent, } from './hostTurnSettings.js';
267
272
  export { hostSettingsSessionFollows, } from './hostSettingsSource.js';
@@ -282,23 +287,25 @@ export { ENGINE_ABORT_TOOL_RESULT } from './hitl/frameRouter.js';
282
287
  export { toolEndOutputText } from './toolResultContent.js';
283
288
  export { toolOutputMediaAbsenceOf, toolOutputMediaAbsenceSentence } from './toolResultContent.js';
284
289
  export { _resetHitlHostSurfaceForTest, APPROVAL_PARKING_WARN_TEXT, approvalParkingNoticeText, CANCEL_DENY_BUDGET_MS, CANCEL_DENY_WARN_TEXT, EDIT_NOT_FORWARDED_WARN_TEXT, EDIT_REFUSED_ON_BLIND_ASK_WARN_TEXT, hitlHostSurfaceFor, hitlHostSurfaceMisses, hitlHostSurfaceMissesFor, installHitlHostSurface, installHitlHostSurfaceFor, observeCancelByDeny, REMEMBER_NOT_APPLIED_WARN_TEXT, REPLAYED_APPROVAL_LIST_UNREADABLE_WARN_TEXT, RULE_NOT_SENT_REJECTED_WARN_TEXT, RULE_NOT_SENT_WARN_TEXT, surfaceEditRefusedOnBlindAsk, surfaceForCurrentSession, surfaceRememberNotApplied, } from './hitl/hitlHostSurface.js';
285
- export { APPROVAL_DENY_SETTLED_BY_WORDS, ASK_ORIGIN_WORDS, RESPOND_DECISIONS, RETRACTED_CARD_DECISION_KIND, RULE_OFFERS_ABSENCE_REASONS, RULE_OFFER_BATCH_MEMBER_KINDS, RULE_OFFER_MATCHES, RULE_OFFER_UNCOVERED_REASONS, TOOL_APPROVAL_FRAME_KEYS_MIRROR, WITHDRAWN_CARD_DECISION_KIND, __resetSettledApprovalsForTests, _resetApprovalCardPortForTest, allowNoteNotCarriedSentence, answerCarriage, answerPayloadFor, approvalBoundGrantsDetail, approvalCardFactsOfFrame, approvalCardFactsOfGeneric, approvalCardFactsOfV1, approvalCardFactsOfV1Frame, approvalCardPortFor, approvalCardPortMisses, approvalCardPortMissesFor, approvalCardRequestOf, approvalIsMandated, approvalPriorCardsDetail, approvalSupersedesDetail, askProbeReasonDetail, claimApprovalCard, classifierNoRulingDetail, decisionAttributionKeyOf, hasApprovalCardPort, hasApprovalCardPortFor, installApprovalCardPort, installApprovalCardPortFor, isFromSubagent, isToolApprovalFrame, isToolApprovalGate, isToolApprovalRespondParkedRedeemed, isToolApprovalRespondReplayed, joinApprovalHolder, observeApprovalAnswerCommitted, readApprovalBoundGrants, readApprovalCardWord, readApprovalClassifierNoRuling, readApprovalDenySettledBy, readApprovalMandate, readApprovalRememberRefused, readBoundGrantEntry, readDenialLimitFallback, readRuleOfferSupply, readRuleOffers, readToolApprovalRespondAck, readToolApprovalRespondParking, rememberRefusalOf, structurallyEqual, surfaceApprovalCard, surfaceFsApprovalAndDecide, surfaceToolApprovalFrameAndRespond, toolApprovalReplayVerdictOf, toolNameIsFsWrite, toolNameIsShellExec, toolPermissionRequestAskBits } from './hitl/toolApprovalWire.js';
290
+ export { APPROVAL_DENY_SETTLED_BY_WORDS, ASK_ORIGIN_WORDS, FEEDBACK_REFUSAL_CODES, RESPOND_DECISIONS, RETRACTED_CARD_DECISION_KIND, RULE_OFFERS_ABSENCE_REASONS, RULE_OFFER_BATCH_MEMBER_KINDS, RULE_OFFER_MATCHES, RULE_OFFER_UNCOVERED_REASONS, TOOL_APPROVAL_FRAME_KEYS_MIRROR, WITHDRAWN_CARD_DECISION_KIND, __resetSettledApprovalsForTests, _resetApprovalCardPortForTest, allowNoteNotCarriedSentence, answerCarriage, answerPayloadFor, approvalBoundGrantsDetail, approvalCardFactsOfFrame, approvalCardFactsOfGeneric, approvalCardFactsOfV1, approvalCardFactsOfV1Frame, approvalCardPortFor, approvalCardPortMisses, approvalCardPortMissesFor, approvalCardRequestOf, approvalIsMandated, approvalPriorCardsDetail, approvalSupersedesDetail, askProbeReasonDetail, claimApprovalCard, classifierNoRulingDetail, decisionAttributionKeyOf, feedbackRefusalOf, hasApprovalCardPort, hasApprovalCardPortFor, installApprovalCardPort, installApprovalCardPortFor, isFromSubagent, isToolApprovalFrame, isToolApprovalGate, isToolApprovalRespondParkedRedeemed, isToolApprovalRespondReplayed, joinApprovalHolder, observeApprovalAnswerCommitted, readApprovalBoundGrants, readApprovalCardWord, readApprovalClassifierNoRuling, readApprovalDenySettledBy, readApprovalMandate, readApprovalRememberRefused, readBoundGrantEntry, readDenialLimitFallback, readRuleOfferSupply, readRuleOffers, readToolApprovalRespondAck, readToolApprovalRespondParking, rememberRefusalOf, structurallyEqual, subagentBadgeFor, surfaceApprovalCard, surfaceFsApprovalAndDecide, surfaceToolApprovalFrameAndRespond, toolApprovalReplayVerdictOf, toolNameIsFsWrite, toolNameIsShellExec, toolPermissionRequestAskBits } from './hitl/toolApprovalWire.js';
286
291
  export * from './hitl/approvalCardReading.js';
287
292
  export * from './hitl/approvalCardReasons.js';
288
293
  export { approvalRequestFrameReadingOf, APPROVAL_REQUEST_FRAME_UNREADABLE_WHYS } from './hitl/approvalRequestFrameReading.js';
289
- export { approvalAskReasonsOf } from './hitl/approvalAskers.js';
294
+ export { approvalAgentIdOf, approvalAskReasonsOf } from './hitl/approvalAskers.js';
290
295
  export { askClassReasonOf, askClassReasonsOf } from './hitl/askClassPair.js';
291
296
  export * from './hitl/editedRuleTextPrecheck.js';
292
297
  export * from './coreValuePorts.js';
293
298
  export { ruleToolNameVerdictOf } from './protocolSegment.js';
294
299
  export * from './hitl/askGateWire.js';
295
300
  export * from './hitl/planReviewWire.js';
296
- export { planReviewBodyOf } from './planReviewCardFacts.js';
301
+ export { planReviewBodyOf, mintPlanReviewCardFacts, registeredPlanReviewCardFacts, currentPlanReviewGateOf, samePlanReviewCardFacts } from './planReviewCardFacts.js';
297
302
  export { planReviewCardNote } from './hitl/planReviewCard.js';
303
+ export { planReviewOutcomeNotice } from './hitl/planReviewCard.js';
298
304
  export { readRunLedgerSnapshot } from './runLedgerSnapshot.js';
299
305
  export { decisionInFlightOf, decisionReadMark } from './hitl/decisionLedger.js';
300
306
  export { ASK_PARK_AUTO_REOPEN_BLOCKS, askParkAutoReopenBlockedContent, askParkAutoReopenBlockOf, askParkRefusalBlockOf, claimAskParkAutoReopenBlockNotice, clearAskParkAutoReopenBlocks, } from './hitl/askParkAutoReopenBlock.js';
301
307
  export { HITL_DECISION_FAMILIES, HITL_DECISION_NOT_APPLIED_CAUSES, HITL_DECISION_NOT_SENT_CAUSES, HITL_DECISION_UNCONFIRMED_CAUSES, sendHitlDecision, hitlDecisionOutcomeContent, toolPermissionSettledLine, toolPermissionUnconfirmedOf, toolPermissionUnconfirmedLine, } from './hitl/decisionSend.js';
308
+ export { APPROVAL_DECISION_DOORS, approvalDecisionDoorOf, approvalDecisionDoorSource } from './hitl/approvalDecisionDoor.js';
302
309
  export { elicitationRefusedLine } from './hitl/elicitationRefusal.js';
303
310
  export { PLAN_REVIEW_QUESTION_ID_PREFIX, REOPEN_ID_TAIL, approvalCallKey, askGateQuestionId, planReviewQuestionId, liveFrameCallKey, armedKeyFromQuestionId, SCREEN_CARD_ORIGINS, questionCardOriginOf, hostReopenQuestionId, hostRunChoiceQuestionId, } from './hitl/gateIdentity.js';
304
311
  export { _resetArmedGateRegistryForTest, _setGateArmedWaitMsForTest, clearArmedGate, gateArmedWaitMs, notePlanReviewAnswered, onGateArmed, planReviewArmedKey, registerArmedGate, registerArmedGateFor, registerArmedGateFromQuestionId, registerArmedGateFromQuestionIdFor, waitForGateArmed, wasGateArmed, wasGateArmedFor, } from './hitl/armedGateRegistry.js';
@@ -357,10 +364,11 @@ export { mcpToolTogglesToExcludeTools } from './mcpToolToggles.js';
357
364
  export { readThinkingLatch, writeThinkingLatch, thinkingLatchView, thinkingLatchSentence, thinkingLatchRowWordOf, readSeatThinkingLatch } from './thinkingLatch.js';
358
365
  export { devicesFaceOf, devicesWritesAllowed, devicesFaceDetail } from './devicesFace.js';
359
366
  export { cloudLoginFailureOf, cloudLoginFailureText, engineTargetRefusalText, seatMcpReadingOf, watchEngineTarget } from './engineTargetSeat.js';
360
- export { KEY_SLOT_PREFIX, keyEnvNameForEntry, onboardBaseUrlProblem, onboardRefusalText, onboardWriteVerdict, poolEntryNameOf, probeModelEndpoint, discoverEndpointModels, } from './model/onboardJudgement.js';
367
+ export { KEY_SLOT_PREFIX, ONBOARD_PROBE_BUDGETS, keyEnvNameForEntry, onboardBaseUrlProblem, onboardRefusalText, onboardWriteVerdict, poolEntryNameOf, probeModelEndpoint, discoverEndpointModels, } from './model/onboardJudgement.js';
368
+ export { ONBOARD_STEPS, ONBOARD_STEP_STATES, ONBOARD_STEP_REASONS, onboardStepPlanOf } from './model/onboardSteps.js';
361
369
  export { LOCAL_CONFIG_DOCUMENTS, globalStateFilePathOf } from './localConfig/documents.js';
362
370
  export { LOCAL_CONFIG_UNREADABLE_CAUSES, LOCAL_CONFIG_REFUSALS, LOCAL_CONFIG_NOT_WRITTEN_CAUSES, LOCAL_CONFIG_UNAVAILABLE_CAUSES, LOCAL_CONFIG_UNKNOWN_CAUSES, LOCAL_CONFIG_APPLIES_ON, LOCAL_CONFIG_RESIDUES, LOCAL_CONFIG_STEP_ROLES, LOCAL_CONFIG_WRITE_PRECONDITIONS, LOCAL_CONFIG_DISCLOSURE_KINDS, localConfigAccess, applyLocalConfigIntent, previewLocalConfigIntent, localConfigReceiptSentence, localConfigResidueSentence, localConfigDisclosureSentence, } from './localConfig/kernel.js';
363
- export { MODEL_POOL_EDIT_KINDS, MODEL_POOL_CHANNEL_SOURCES, MODEL_POOL_CREDENTIAL_KINDS, MODEL_POOL_COMPLETENESS, MODEL_POOL_MAX_BATCH, MODEL_POOL_PROBE_STATES, MODEL_POOL_DEFAULT_KEEP_REASONS, poolWritePlan, modelPoolIntentOf, editModelPoolWith, modelPoolViewOf, effectiveDefaultModelOf, defaultModelChoiceOf, modelPoolRowEditOf, channelProfilesOf, modelPoolEditOfSeat, onboardWritePlan, } from './localConfig/modelPool.js';
371
+ export { MODEL_POOL_EDIT_KINDS, MODEL_POOL_CHANNEL_SOURCES, MODEL_POOL_CREDENTIAL_KINDS, MODEL_POOL_COMPLETENESS, MODEL_POOL_MAX_BATCH, MODEL_POOL_PROBE_STATES, MODEL_POOL_DEFAULT_KEEP_REASONS, poolWritePlan, modelPoolIntentOf, editModelPoolWith, modelPoolViewOf, modelPoolEnvReadingOf, effectiveDefaultModelOf, defaultModelChoiceOf, modelPoolRowEditOf, channelProfilesOf, modelPoolEditOfSeat, onboardWritePlan, } from './localConfig/modelPool.js';
364
372
  export { LOCAL_CONFIG_WRITE_INTENTS, SETTINGS_WRITE_KEYS, settingsWritePlan, settingsWriteStep } from './localConfig/settingsWrite.js';
365
373
  export { MCP_SERVER_SCOPES, MCP_SERVER_ROW_STATES, MCP_SERVER_WITHHELD_CAUSES, mcpProjectChainOf, mcpPathWithinFence, expandMcpServerEntry, mcpServersReport } from './localConfig/mcp/servers.js';
366
374
  export { MCP_SERVER_EDIT_OPS, applyMcpServerEdit } from './localConfig/mcp/edit.js';
@@ -543,6 +543,7 @@ const ROUTE_PAIRING_VERDICTS = Object.freeze({
543
543
  'broken:credential_missing': 'broken',
544
544
  'broken:credential_origin_mismatch': 'broken',
545
545
  'broken:credential_answer_conflict': 'broken',
546
+ 'broken:protocol_plaintext_credentials': 'broken',
546
547
  });
547
548
  export function routePairingVerdict(v) {
548
549
  if (typeof v !== 'string' || v.length === 0)
@@ -11,6 +11,8 @@ export declare function takeLocalQuestionWithdrawHook(id: string): WithdrawHook
11
11
  export declare function unregisterLocalQuestionResponder(id: string): boolean;
12
12
  export declare function hasLocalQuestionResponder(id: string): boolean;
13
13
  export declare function publishQuestionFrame(frame: QuestionFrame): void;
14
+ export type QuestionFrameDelivery = 'delivered' | 'no_surface' | 'handler_threw';
15
+ export declare function deliverQuestionFrameFor(sessionKey: string, frame: QuestionFrame): QuestionFrameDelivery;
14
16
  export declare function publishQuestionFrameFor(sessionKey: string, frame: QuestionFrame): void;
15
17
  export declare function hasQuestionOverlay(): boolean;
16
18
  export declare function hasQuestionOverlayFor(sessionKey: string): boolean;
@@ -26,16 +26,21 @@ export function hasLocalQuestionResponder(id) {
26
26
  export function publishQuestionFrame(frame) {
27
27
  publishQuestionFrameFor(DEFAULT_SESSION_KEY, frame);
28
28
  }
29
- export function publishQuestionFrameFor(sessionKey, frame) {
29
+ export function deliverQuestionFrameFor(sessionKey, frame) {
30
30
  const frameHandler = frameHandlerByKey.get(sessionKey);
31
31
  if (!frameHandler)
32
- return;
32
+ return 'no_surface';
33
33
  try {
34
34
  frameHandler(frame);
35
+ return 'delivered';
35
36
  }
36
37
  catch {
38
+ return 'handler_threw';
37
39
  }
38
40
  }
41
+ export function publishQuestionFrameFor(sessionKey, frame) {
42
+ deliverQuestionFrameFor(sessionKey, frame);
43
+ }
39
44
  export function hasQuestionOverlay() {
40
45
  return hasQuestionOverlayFor(DEFAULT_SESSION_KEY);
41
46
  }
@@ -30,7 +30,7 @@ export declare const LOCAL_CONFIG_APPLIES_ON: readonly ["next_turn", "engine_rel
30
30
  export type LocalConfigAppliesOn = (typeof LOCAL_CONFIG_APPLIES_ON)[number];
31
31
  export declare const LOCAL_CONFIG_RESIDUES: readonly ["orphan_key_slot", "legacy_tier_groups_left"];
32
32
  export type LocalConfigResidue = (typeof LOCAL_CONFIG_RESIDUES)[number];
33
- export declare const LOCAL_CONFIG_DISCLOSURE_KINDS: readonly ["decided_by", "shadowed_by", "tier_group_overridden"];
33
+ export declare const LOCAL_CONFIG_DISCLOSURE_KINDS: readonly ["decided_by", "shadowed_by", "tier_group_overridden", "shadow_unknown"];
34
34
  export type LocalConfigDisclosureKind = (typeof LOCAL_CONFIG_DISCLOSURE_KINDS)[number];
35
35
  export interface LocalConfigDisclosure {
36
36
  readonly kind: LocalConfigDisclosureKind;
@@ -142,6 +142,7 @@ export interface LocalConfigIntent {
142
142
  readonly appliesOn: LocalConfigAppliesOn;
143
143
  readonly steps: readonly LocalConfigStep[];
144
144
  }
145
+ export declare function localConfigLaneDocsOf(steps: readonly Pick<LocalConfigStep, 'doc' | 'lock'>[]): readonly LocalConfigWritableDocumentName[];
145
146
  export declare function applyLocalConfigIntent(intent: LocalConfigIntent, store: LocalConfigStorePort, facts: LocalConfigHostFacts): Promise<LocalConfigReceipt>;
146
147
  export declare function previewLocalConfigIntent(intent: LocalConfigIntent, store: LocalConfigStorePort, facts: LocalConfigHostFacts): Promise<LocalConfigPreview>;
147
148
  export declare function localConfigReceiptSentence(receipt: LocalConfigReceipt | LocalConfigPreview, lang?: UiLanguage): string;
@@ -1,5 +1,5 @@
1
1
  import { SETTINGS_ROOT_DOCUMENT_UNREADABLE_REASONS } from '../generated/settingsSchemaTables.js';
2
- import { ownSnapshotRecord, ownSnapshotRecordFaithful, readOwnDataValue, appendOwnElement } from '../ownKey.js';
2
+ import { ownSnapshotRecord, ownSnapshotRecordFaithful, readOwnDataValue, appendOwnElement, sameJson } from '../ownKey.js';
3
3
  import { capForDisplay } from '../fleetTaskDesc.js';
4
4
  import { msg, renderMessage } from '../i18n/translate.js';
5
5
  import { isWritableLocalConfigDocument, localConfigDocumentOf } from './documents.js';
@@ -38,7 +38,7 @@ export const LOCAL_CONFIG_UNAVAILABLE_CAUSES = Object.freeze(['engine_is_remote'
38
38
  export const LOCAL_CONFIG_UNKNOWN_CAUSES = Object.freeze(['commit_unconfirmed', 'report_unreadable']);
39
39
  export const LOCAL_CONFIG_APPLIES_ON = Object.freeze(['next_turn', 'engine_reload', 'next_engine_start']);
40
40
  export const LOCAL_CONFIG_RESIDUES = Object.freeze(['orphan_key_slot', 'legacy_tier_groups_left']);
41
- export const LOCAL_CONFIG_DISCLOSURE_KINDS = Object.freeze(['decided_by', 'shadowed_by', 'tier_group_overridden']);
41
+ export const LOCAL_CONFIG_DISCLOSURE_KINDS = Object.freeze(['decided_by', 'shadowed_by', 'tier_group_overridden', 'shadow_unknown']);
42
42
  export const LOCAL_CONFIG_STEP_ROLES = Object.freeze(['prepare', 'effect', 'cleanup']);
43
43
  export const LOCAL_CONFIG_WRITE_PRECONDITIONS = Object.freeze([
44
44
  'shared_path_lock',
@@ -135,6 +135,14 @@ export function localConfigAccess(facts, request) {
135
135
  return blocked('domain_not_hosted');
136
136
  }
137
137
  }
138
+ export function localConfigLaneDocsOf(steps) {
139
+ const out = [];
140
+ for (const s of steps)
141
+ for (const d of [s.doc, ...(s.lock ?? [])])
142
+ if (!out.includes(d))
143
+ out.push(d);
144
+ return Object.freeze(out);
145
+ }
138
146
  const MAX_STEPS = 8;
139
147
  const DETAIL_MAX = 240;
140
148
  function docListOf(v, writable) {
@@ -201,7 +209,7 @@ function shapeIntent(intent) {
201
209
  }
202
210
  if (phase !== 1)
203
211
  return undefined;
204
- return { appliesOn: when, steps, docs: Object.freeze(steps.map((s) => s.doc)) };
212
+ return { appliesOn: when, steps, docs: localConfigLaneDocsOf(steps) };
205
213
  }
206
214
  const UNREADABLE_IO = Object.freeze({ status: 'unreadable', cause: 'io' });
207
215
  const ABSENT = Object.freeze({ status: 'absent' });
@@ -283,21 +291,6 @@ function planVerdictOf(v) {
283
291
  }
284
292
  return refuseVerdict('invalid_request');
285
293
  }
286
- function sameJson(a, b) {
287
- if (a === b)
288
- return true;
289
- if (typeof a !== 'object' || typeof b !== 'object' || a === null || b === null)
290
- return false;
291
- if (Array.isArray(a) !== Array.isArray(b))
292
- return false;
293
- if (Array.isArray(a) && Array.isArray(b))
294
- return a.length === b.length && a.every((x, i) => sameJson(x, b[i]));
295
- const ka = Object.keys(a);
296
- const kb = Object.keys(b);
297
- if (ka.length !== kb.length)
298
- return false;
299
- return ka.every((k) => Object.hasOwn(b, k) && sameJson(a[k], b[k]));
300
- }
301
294
  function planStep(step, fresh, carried, mode) {
302
295
  const target = fresh[step.doc];
303
296
  if (target === undefined || target.status === 'unreadable')
@@ -532,6 +525,7 @@ const DISCLOSURE_KEYS = {
532
525
  decided_by: 'config.localConfig.disclosure.decidedBy',
533
526
  shadowed_by: 'config.localConfig.disclosure.shadowed',
534
527
  tier_group_overridden: 'config.localConfig.disclosure.tierGroupOverridden',
528
+ shadow_unknown: 'config.localConfig.disclosure.shadowUnknown',
535
529
  };
536
530
  const DISCLOSURE_NAMED_KEYS = {
537
531
  tier_group_overridden: 'config.localConfig.disclosure.tierGroupOverriddenNamed',
@@ -1,4 +1,4 @@
1
- import { applyLocalConfigIntent, previewLocalConfigIntent, localConfigAccess, } from '../kernel.js';
1
+ import { applyLocalConfigIntent, previewLocalConfigIntent, localConfigAccess, localConfigLaneDocsOf, } from '../kernel.js';
2
2
  import { mcpServerNameVerdict } from '../../mcpWireCaps.js';
3
3
  import { readHostSettingsOnce } from '../../hostSettingsSource.js';
4
4
  import { settingsWriteStep } from '../settingsWrite.js';
@@ -84,10 +84,20 @@ function tableWith(table, name, value) {
84
84
  const docOf = (fresh, d) => documentOf(fresh[d]);
85
85
  function placeOf(scope, projectKey) {
86
86
  if (scope === 'user')
87
- return { doc: 'globalConfig', path: USER_SCOPE_PATH };
87
+ return { doc: docOfScope(scope), path: USER_SCOPE_PATH };
88
88
  if (scope === 'project')
89
- return { doc: 'projectMcp', path: PROJECT_FILE_PATH };
90
- return projectKey === undefined ? undefined : { doc: 'globalConfig', path: localScopePath(projectKey) };
89
+ return { doc: docOfScope(scope), path: PROJECT_FILE_PATH };
90
+ return projectKey === undefined ? undefined : { doc: docOfScope(scope), path: localScopePath(projectKey) };
91
+ }
92
+ function docOfScope(scope) {
93
+ return scope === 'project' ? 'projectMcp' : 'globalConfig';
94
+ }
95
+ function docOfOp(op) {
96
+ return op === 'setEnabled' ? 'globalConfig' : 'localSettings';
97
+ }
98
+ const siblingMcpDoc = (doc) => (doc === 'globalConfig' ? 'projectMcp' : 'globalConfig');
99
+ function stepFrameOf(doc, paired) {
100
+ return paired ? { doc, lock: [siblingMcpDoc(doc)] } : { doc };
91
101
  }
92
102
  export const mcpRowBaseOf = (revision) => (revision === null ? null : `rev:${revision}`);
93
103
  const ADD_KEYS = Object.freeze(['op', 'name', 'entry', 'scope', 'onNameTaken']);
@@ -494,20 +504,12 @@ export async function applyMcpServerEdit(edit, store, ctx, opts) {
494
504
  const f = editFactsOf(ctx);
495
505
  const { c, host, reserved, projectKey } = f;
496
506
  const dry = isRecord(opts) && opts.dryRun === true;
497
- const docsFor = () => {
498
- if (e.op === 'setEnabled')
499
- return ['globalConfig'];
500
- if (e.op === 'setProjectApproval')
501
- return ['localSettings'];
502
- if (e.op === 'remove' && e.scope === undefined)
503
- return ['globalConfig', 'projectMcp'];
504
- if (e.op === 'add' && e.onNameTaken === 'rename')
505
- return ['globalConfig', 'projectMcp'];
506
- if (e.op === 'importFromSibling')
507
- return ['globalConfig', 'projectMcp'];
508
- return [e.scope === 'project' ? 'projectMcp' : 'globalConfig'];
509
- };
510
- const access = localConfigAccess(c.lane, { access: 'write', docs: docsFor() });
507
+ const earlyFrame = e.op === 'setEnabled' || e.op === 'setProjectApproval'
508
+ ? stepFrameOf(docOfOp(e.op), false)
509
+ : e.op === 'remove' && e.scope === undefined
510
+ ? stepFrameOf('globalConfig', true)
511
+ : stepFrameOf(docOfScope(e.scope), (e.op === 'add' && e.onNameTaken === 'rename') || e.op === 'importFromSibling');
512
+ const access = localConfigAccess(c.lane, { access: 'write', docs: localConfigLaneDocsOf([earlyFrame]) });
511
513
  if (!access.ok)
512
514
  return Object.freeze({ receipt: Object.freeze({ kind: 'unavailable', cause: access.cause }), notices: Object.freeze([]) });
513
515
  const pre = preGatesOf(e, f);
@@ -525,13 +527,11 @@ export async function applyMcpServerEdit(edit, store, ctx, opts) {
525
527
  notices = await noticesFor(e.name, e.scope, e.entry, store, c, ev.missing);
526
528
  box.probe = entryProbeOf(ev.spec);
527
529
  const place = placeOf(e.scope, projectKey);
528
- const otherDoc = place.doc === 'globalConfig' ? 'projectMcp' : 'globalConfig';
529
530
  const mode = e.onNameTaken ?? 'refuse';
530
531
  const entryCopy = copyLayer(e.entry);
531
532
  step = {
532
- doc: place.doc,
533
+ ...stepFrameOf(place.doc, mode === 'rename'),
533
534
  role: 'effect',
534
- ...(mode === 'rename' ? { lock: [otherDoc] } : {}),
535
535
  plan: ({ fresh }) => {
536
536
  const cur = docOf(fresh, place.doc);
537
537
  const t = subTableOf(cur, place.path);
@@ -635,9 +635,8 @@ export async function applyMcpServerEdit(edit, store, ctx, opts) {
635
635
  const place = placeOf(target, projectKey);
636
636
  const unscoped = e.scope === undefined;
637
637
  step = {
638
- doc: place.doc,
638
+ ...stepFrameOf(place.doc, unscoped),
639
639
  role: 'effect',
640
- ...(unscoped ? { lock: [place.doc === 'globalConfig' ? 'projectMcp' : 'globalConfig'] } : {}),
641
640
  plan: ({ fresh }) => {
642
641
  if (unscoped) {
643
642
  const cand = candidatesIn(fresh);
@@ -672,7 +671,7 @@ export async function applyMcpServerEdit(edit, store, ctx, opts) {
672
671
  box.probe = fixedProbeOf(e);
673
672
  const projPath = ['projects', projectKey];
674
673
  step = {
675
- doc: 'globalConfig',
674
+ doc: docOfOp('setEnabled'),
676
675
  role: 'effect',
677
676
  plan: ({ fresh }) => {
678
677
  const cur = docOf(fresh, 'globalConfig');
@@ -721,7 +720,7 @@ export async function applyMcpServerEdit(edit, store, ctx, opts) {
721
720
  const WANT = { approve: ['set', 'delete'], reject: ['delete', 'set'], clear: ['delete', 'delete'] };
722
721
  const want = WANT[e.approval];
723
722
  const edit1 = (intent, op) => (op === 'set' ? { intent, member: e.name, op, value: e.name } : { intent, member: e.name, op });
724
- const inner = settingsWriteStep({ doc: 'localSettings', trust: approvalTrust(c), edits: [edit1('mcpJsonEnabled', want[0]), edit1('mcpJsonDisabled', want[1])] });
723
+ const inner = settingsWriteStep({ doc: docOfOp('setProjectApproval'), trust: approvalTrust(c), edits: [edit1('mcpJsonEnabled', want[0]), edit1('mcpJsonDisabled', want[1])] });
725
724
  step = {
726
725
  ...inner,
727
726
  plan: (input) => {
@@ -742,9 +741,8 @@ export async function applyMcpServerEdit(edit, store, ctx, opts) {
742
741
  const skipped = pre.skipped ?? [];
743
742
  box.probe = fixedProbeOf(e);
744
743
  step = {
745
- doc: place.doc,
744
+ ...stepFrameOf(place.doc, true),
746
745
  role: 'effect',
747
- lock: [place.doc === 'globalConfig' ? 'projectMcp' : 'globalConfig'],
748
746
  plan: ({ fresh }) => {
749
747
  const cur = docOf(fresh, place.doc);
750
748
  const t = subTableOf(cur, place.path);
@@ -2,6 +2,7 @@ import { LOCAL_CONFIG_WRITE_INTENTS } from '../settingsWrite.js';
2
2
  import { projectMcpConfigs, mcpTransportVerdict } from '../../mcpWireCaps.js';
3
3
  import { readHostSettingsOnce, CC_MERGE_ORDER } from '../../hostSettingsSource.js';
4
4
  import { layerAdmissionWord } from '../../settingsLayerAdmission.js';
5
+ import { pathShapeOf } from '../../pathShape.js';
5
6
  import { msg, renderMessage } from '../../i18n/translate.js';
6
7
  export const MCP_SERVER_SCOPES = Object.freeze(['user', 'project', 'local']);
7
8
  export const MCP_SERVER_ROW_STATES = Object.freeze(['active', 'pending_approval', 'rejected', 'disabled', 'withheld', 'unusable']);
@@ -155,15 +156,11 @@ export const localScopePath = (projectKey) => Object.freeze(['projects', project
155
156
  export const USER_SCOPE_PATH = Object.freeze(['mcpServers']);
156
157
  export const PROJECT_FILE_PATH = Object.freeze(['mcpServers']);
157
158
  function splitPath(p, sep) {
158
- if (sep === '/') {
159
- if (!p.startsWith('/'))
160
- return undefined;
161
- return { root: '/', parts: p.split('/').filter((s) => s !== '') };
162
- }
163
- const m = /^([A-Za-z]:)\\/.exec(p);
164
- if (m === null)
159
+ const shape = pathShapeOf(p, sep === '/' ? '/' : '\\');
160
+ if (shape === undefined || shape.hasDotSegment)
165
161
  return undefined;
166
- return { root: `${m[1]}\\`, parts: p.slice(m[0].length).split('\\').filter((s) => s !== '') };
162
+ const rooted = sep === '/' ? shape.kind === 'posix' : shape.kind === 'drive' && shape.root.endsWith('\\');
163
+ return rooted ? { root: shape.root, parts: [...shape.names] } : undefined;
167
164
  }
168
165
  const joinPath = (root, parts, sep) => root + parts.join(sep);
169
166
  export function mcpProjectChainOf(startDir, sep, fence) {
@@ -7,7 +7,7 @@ import { type ModelProbeResult, type ProbeVerdictWord } from '../modelCapability
7
7
  import { type OnboardWritePlan, type OnboardWritePlanInput } from '../model/onboardJudgement.js';
8
8
  import type { OnboardCatalogIssue, SeatModelPoolEdit } from '../seatContract.js';
9
9
  import type { LocalConfigDisclosure, LocalConfigFileReading, LocalConfigHostFacts, LocalConfigIntent, LocalConfigPreview, LocalConfigReceipt, LocalConfigRefusal, LocalConfigStorePort } from './kernel.js';
10
- import { type ModelPoolChannelSource, type ModelPoolCompleteness, type ModelPoolDefaultKeepReason, type ModelPoolProbeState } from './modelPoolWords.js';
10
+ import { type ModelPoolChannelSource, type ModelPoolCompleteness, type ModelPoolDefaultKeepReason, type ModelPoolProbeState, type ModelPoolViewReading } from './modelPoolWords.js';
11
11
  export { MODEL_POOL_EDIT_KINDS, MODEL_POOL_CHANNEL_SOURCES, MODEL_POOL_CREDENTIAL_KINDS, MODEL_POOL_COMPLETENESS, MODEL_POOL_MAX_BATCH, MODEL_POOL_PROBE_STATES, MODEL_POOL_DEFAULT_KEEP_REASONS } from './modelPoolWords.js';
12
12
  export type { ModelPoolEditKind, ModelPoolChannelSource, ModelPoolCredentialKind, ModelPoolCompleteness, ModelPoolProbeState, ModelPoolDefaultKeepReason } from './modelPoolWords.js';
13
13
  export interface ModelPoolEntrySpec {
@@ -144,6 +144,7 @@ export type EffectiveDefaultModel = {
144
144
  export interface EffectiveDefaultModelInput {
145
145
  readonly modelsDoc: SettingsDocument | null | undefined;
146
146
  readonly userSettings: SettingsDocument | null | undefined;
147
+ readonly userSettingsReading?: ModelPoolViewReading;
147
148
  }
148
149
  export declare function effectiveDefaultModelOf(input: EffectiveDefaultModelInput): EffectiveDefaultModel;
149
150
  export interface DefaultModelBatchRow {
@@ -251,12 +252,16 @@ export interface ModelPoolView {
251
252
  readonly legacyTierSettings: boolean;
252
253
  readonly orphanKeySlots: number;
253
254
  readonly envModels: readonly string[];
255
+ readonly effectiveEnv?: ModelPoolViewReading;
256
+ readonly userSettings?: ModelPoolViewReading;
254
257
  readonly providers: readonly ModelPoolProvider[];
255
258
  }
259
+ export type ModelPoolEnvReading = ModelPoolViewReading | 'not_reported';
256
260
  export interface ModelPoolReadings {
257
261
  readonly models: LocalConfigFileReading | undefined;
258
262
  readonly userSettings: LocalConfigFileReading | undefined;
259
263
  readonly effectiveEnv?: Readonly<Record<string, string | undefined>>;
260
264
  }
265
+ export declare function modelPoolEnvReadingOf(view: {} | null | undefined): ModelPoolEnvReading;
261
266
  export declare function modelPoolViewOf(readings: ModelPoolReadings): ModelPoolView;
262
267
  export declare function modelPoolRowEditOf(row: ModelPoolViewEntry, action: ModelPoolRowAction): ModelPoolEdit | undefined;