@sema-agent/client-core 0.104.1 → 0.106.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (175) hide show
  1. package/CHANGELOG.md +310 -0
  2. package/README.md +36 -14
  3. package/dist/adapt/arms.js +23 -6
  4. package/dist/adapter/activeRunSelfHeal.d.ts +14 -2
  5. package/dist/adapter/activeRunSelfHeal.js +90 -12
  6. package/dist/adapter/downstream/eventToSdkMessage.d.ts +0 -5
  7. package/dist/adapter/downstream/eventToSdkMessage.js +24 -23
  8. package/dist/adapter/downstream/terminalToSdkResult.js +2 -3
  9. package/dist/adapter/downstream/wiringManifestView.d.ts +7 -3
  10. package/dist/adapter/downstream/wiringManifestView.js +25 -1
  11. package/dist/adapter/runStream.js +8 -5
  12. package/dist/approvalReachWire.d.ts +1 -0
  13. package/dist/approvalReachWire.js +4 -1
  14. package/dist/approvalSeat.d.ts +21 -0
  15. package/dist/approvalSeat.js +73 -0
  16. package/dist/assistantInbox.d.ts +2 -0
  17. package/dist/assistantInbox.js +3 -0
  18. package/dist/checkpointRowVerdict.d.ts +23 -0
  19. package/dist/checkpointRowVerdict.js +89 -0
  20. package/dist/cloudConfigWireCaps.js +3 -0
  21. package/dist/compensations.js +6 -6
  22. package/dist/coreValuePorts.d.ts +14 -1
  23. package/dist/coreValuePorts.js +14 -0
  24. package/dist/decideFailureNote.js +3 -1
  25. package/dist/decideReceipt.d.ts +9 -0
  26. package/dist/decideReceipt.js +29 -1
  27. package/dist/declared/supportFloorDeclared.js +2 -2
  28. package/dist/deviceRebind.d.ts +7 -0
  29. package/dist/deviceRebind.js +39 -5
  30. package/dist/displayUntrusted.d.ts +4 -2
  31. package/dist/displayUntrusted.js +45 -22
  32. package/dist/engineAddress.d.ts +3 -0
  33. package/dist/engineAddress.js +25 -0
  34. package/dist/engineDirectory.js +9 -17
  35. package/dist/engineErrorCodes.d.ts +8 -0
  36. package/dist/engineErrorCodes.js +8 -0
  37. package/dist/engineGenerationPort.d.ts +11 -2
  38. package/dist/engineGenerationPort.js +63 -9
  39. package/dist/engineHealthFacts.d.ts +5 -0
  40. package/dist/engineHealthFacts.js +11 -0
  41. package/dist/engineNoticeCodes.d.ts +26 -3
  42. package/dist/engineNoticeCodes.js +52 -7
  43. package/dist/engineRowRef.js +1 -1
  44. package/dist/errorSupplementRoles.js +2 -0
  45. package/dist/eventLeg.d.ts +3 -3
  46. package/dist/eventLeg.js +25 -4
  47. package/dist/fleet/fleetProjection.js +26 -5
  48. package/dist/generated/engineFactTables.d.ts +3 -1
  49. package/dist/generated/engineFactTables.js +4 -1
  50. package/dist/generated/engineNoticeTables.js +19 -4
  51. package/dist/generated/sdkFactTables.d.ts +5 -0
  52. package/dist/generated/sdkFactTables.js +24 -0
  53. package/dist/generated/settingsSchemaFns.d.ts +11 -0
  54. package/dist/generated/settingsSchemaFns.js +2 -1
  55. package/dist/generated/settingsSchemaSafetyMergeSpec.js +1 -1
  56. package/dist/generated/settingsSchemaSettingsSources.d.ts +1 -1
  57. package/dist/generated/settingsSchemaSettingsSources.js +22 -2
  58. package/dist/headlessReconnectWire.js +31 -4
  59. package/dist/hitl/approvalLiveFace.d.ts +17 -0
  60. package/dist/hitl/approvalLiveFace.js +35 -0
  61. package/dist/hitl/approvalQueueRow.d.ts +21 -0
  62. package/dist/hitl/approvalQueueRow.js +69 -0
  63. package/dist/hitl/approvalsFeed.d.ts +5 -4
  64. package/dist/hitl/approvalsFeed.js +38 -6
  65. package/dist/hitl/askGateWire.js +26 -2
  66. package/dist/hitl/askParkRowRouting.d.ts +4 -3
  67. package/dist/hitl/askParkRowRouting.js +15 -3
  68. package/dist/hitl/automaticAnswerVerdict.js +13 -10
  69. package/dist/hitl/crashConverged.d.ts +5 -1
  70. package/dist/hitl/decisionConflict.js +2 -1
  71. package/dist/hitl/decisionRefusal.js +1 -1
  72. package/dist/hitl/decisionSend.d.ts +1 -0
  73. package/dist/hitl/decisionSend.js +14 -2
  74. package/dist/hitl/frameRouter.d.ts +4 -0
  75. package/dist/hitl/frameRouter.js +18 -5
  76. package/dist/hitl/gateIdentity.d.ts +1 -0
  77. package/dist/hitl/gateIdentity.js +3 -0
  78. package/dist/hitl/hitlBridge.d.ts +1 -1
  79. package/dist/hitl/hitlBridge.js +26 -5
  80. package/dist/hitl/livePendingAsk.d.ts +5 -0
  81. package/dist/hitl/livePendingAsk.js +6 -1
  82. package/dist/hitl/planReviewCard.d.ts +23 -0
  83. package/dist/hitl/planReviewCard.js +250 -0
  84. package/dist/hitl/planReviewWire.d.ts +39 -14
  85. package/dist/hitl/planReviewWire.js +450 -163
  86. package/dist/hitl/sessionAllowRoute.d.ts +2 -0
  87. package/dist/hitl/sessionAllowRoute.js +7 -0
  88. package/dist/hitl/sessionPolicyWire.d.ts +1 -7
  89. package/dist/hitl/sessionPolicyWire.js +3 -43
  90. package/dist/hitl/subagentSource.d.ts +1 -0
  91. package/dist/hitl/subagentSource.js +13 -0
  92. package/dist/hitl/toolApprovalWire.d.ts +3 -2
  93. package/dist/hitl/toolApprovalWire.js +79 -37
  94. package/dist/hostSettingsSource.d.ts +5 -2
  95. package/dist/hostSettingsSource.js +19 -10
  96. package/dist/hostTurnSettings.d.ts +5 -6
  97. package/dist/hostTurnSettings.js +106 -26
  98. package/dist/i18n/messages.en.d.ts +85 -12
  99. package/dist/i18n/messages.en.js +85 -12
  100. package/dist/i18n/messages.zh.js +88 -12
  101. package/dist/index.d.ts +35 -4
  102. package/dist/index.js +19 -2
  103. package/dist/liveInitToolFace.js +0 -1
  104. package/dist/liveModelCatalog.d.ts +15 -0
  105. package/dist/liveModelCatalog.js +40 -0
  106. package/dist/mcpTransportKindsCapability.d.ts +18 -0
  107. package/dist/mcpTransportKindsCapability.js +75 -0
  108. package/dist/mcpWireCaps.d.ts +4 -1
  109. package/dist/mcpWireCaps.js +25 -14
  110. package/dist/modelCapabilityProbe.js +66 -33
  111. package/dist/notifications.d.ts +9 -0
  112. package/dist/notifications.js +11 -2
  113. package/dist/ownKey.d.ts +4 -1
  114. package/dist/ownKey.js +8 -2
  115. package/dist/permissionModeWriteCapability.d.ts +13 -0
  116. package/dist/permissionModeWriteCapability.js +35 -0
  117. package/dist/permissionsAllowGrantCapability.d.ts +3 -0
  118. package/dist/permissionsAllowGrantCapability.js +26 -3
  119. package/dist/permissionsDeclaration.d.ts +25 -3
  120. package/dist/permissionsDeclaration.js +69 -41
  121. package/dist/planReviewCardFacts.d.ts +116 -0
  122. package/dist/planReviewCardFacts.js +469 -0
  123. package/dist/projectSeed.d.ts +39 -0
  124. package/dist/projectSeed.js +80 -0
  125. package/dist/promptDelivery.js +1 -1
  126. package/dist/reattachWindow.d.ts +8 -1
  127. package/dist/reattachWindow.js +44 -12
  128. package/dist/replayBody.d.ts +7 -6
  129. package/dist/replayBody.js +62 -7
  130. package/dist/request/taskRequest.js +3 -4
  131. package/dist/ruleCompileVerdict.d.ts +0 -2
  132. package/dist/ruleCompileVerdict.js +0 -31
  133. package/dist/ruleRefusalSentence.js +0 -3
  134. package/dist/runFollow.d.ts +30 -0
  135. package/dist/runFollow.js +117 -0
  136. package/dist/runLedgerSnapshot.d.ts +20 -0
  137. package/dist/runLedgerSnapshot.js +272 -0
  138. package/dist/runPermissionModeSwitch.d.ts +57 -0
  139. package/dist/runPermissionModeSwitch.js +135 -0
  140. package/dist/runReattachPolicy.d.ts +16 -5
  141. package/dist/runReattachPolicy.js +72 -24
  142. package/dist/runTerminal.js +30 -8
  143. package/dist/sandboxWire.d.ts +0 -3
  144. package/dist/sandboxWire.js +0 -9
  145. package/dist/seam.d.ts +17 -7
  146. package/dist/seam.js +13 -1
  147. package/dist/seatContract.d.ts +57 -7
  148. package/dist/seatContract.js +133 -3
  149. package/dist/serverSupportRange.d.ts +18 -0
  150. package/dist/serverSupportRange.js +25 -0
  151. package/dist/sessionEngine.d.ts +156 -0
  152. package/dist/sessionEngine.js +464 -0
  153. package/dist/sessionMap.d.ts +11 -1
  154. package/dist/sessionMap.js +35 -9
  155. package/dist/sessionMemoryErase.d.ts +1 -1
  156. package/dist/sessionMemoryErase.js +5 -0
  157. package/dist/sessionMemoryStatus.d.ts +27 -1
  158. package/dist/sessionMemoryStatus.js +117 -0
  159. package/dist/sessionMemorySync.d.ts +31 -0
  160. package/dist/sessionMemorySync.js +95 -0
  161. package/dist/sessionRowTag.d.ts +4 -0
  162. package/dist/sessionRowTag.js +18 -0
  163. package/dist/settingsLayerAdmission.d.ts +1 -0
  164. package/dist/settingsLayerAdmission.js +4 -1
  165. package/dist/sseIdleTriage.d.ts +3 -1
  166. package/dist/sseIdleTriage.js +19 -4
  167. package/dist/subagent/engineSubagentTail.js +2 -0
  168. package/dist/subagentContentStore.d.ts +3 -0
  169. package/dist/subagentContentStore.js +10 -1
  170. package/dist/toolResult.js +1 -1
  171. package/dist/turnFailurePresentation.d.ts +5 -2
  172. package/dist/turnFailurePresentation.js +12 -4
  173. package/dist/wireRefusalCopy.js +2 -6
  174. package/docs/INTEGRATION-CLIENTS.md +1507 -18
  175. package/package.json +5 -5
@@ -0,0 +1,2 @@
1
+ export type SessionAllowLeg = 'frame' | 'v1' | 'generic';
2
+ export declare function sessionAllowCarried(leg: SessionAllowLeg, approvalId: unknown): boolean;
@@ -0,0 +1,7 @@
1
+ export function sessionAllowCarried(leg, approvalId) {
2
+ if (leg === 'frame')
3
+ return true;
4
+ if (leg === 'v1')
5
+ return typeof approvalId === 'string' && approvalId !== '';
6
+ return false;
7
+ }
@@ -128,17 +128,11 @@ export interface SessionPolicyInertEntryRefusal {
128
128
  export declare function tightenSessionPolicy(facade: SessionPolicyFacade, req: SessionPolicyTightenRequest, opts?: {
129
129
  signal?: AbortSignal;
130
130
  }): Promise<SessionPolicyTightenOutcome>;
131
- export interface SessionPolicyTightenFacts {
132
- readonly agentsStartedBeforeFirstRule?: number | undefined;
133
- readonly workflowsRunning?: number | undefined;
134
- readonly untrackedBackgroundItems?: number | undefined;
135
- readonly inFlightUnreadable?: true | undefined;
136
- }
137
131
  export interface SessionPolicyDeploymentFacts {
138
132
  readonly operator?: 'present' | 'absent';
139
133
  readonly identityAttach?: 'available' | 'unavailable';
140
134
  }
141
- export declare function sessionPolicyTightenNotice(outcome: SessionPolicyTightenOutcome, lang?: UiLanguage, facts?: SessionPolicyTightenFacts, deployment?: SessionPolicyDeploymentFacts): string;
135
+ export declare function sessionPolicyTightenNotice(outcome: SessionPolicyTightenOutcome, lang?: UiLanguage, deployment?: SessionPolicyDeploymentFacts): string;
142
136
  export declare function sessionPolicyReadNotice(outcome: Exclude<SessionPolicyReadOutcome, {
143
137
  kind: 'present';
144
138
  }> | {
@@ -414,29 +414,6 @@ export async function tightenSessionPolicy(facade, req, opts) {
414
414
  return { kind: 'conflict', rev: second.retryAtRev };
415
415
  }
416
416
  const earlierGrammarNote = (lang) => renderMessage(msg('rules.sessionPolicy.tighten.earlierGrammar'), lang);
417
- function factSlot(facts, key) {
418
- try {
419
- return ownRead(facts, key);
420
- }
421
- catch {
422
- return undefined;
423
- }
424
- }
425
- function factCount(facts, key) {
426
- const n = factSlot(facts, key);
427
- return typeof n === 'number' && Number.isSafeInteger(n) && n >= 1 ? n : undefined;
428
- }
429
- function firstRuleWorkFactsOf(facts) {
430
- const none = { agents: undefined, workflows: undefined, untracked: undefined, unreadable: false };
431
- if (typeof facts !== 'object' || facts === null)
432
- return none;
433
- return {
434
- agents: factCount(facts, 'agentsStartedBeforeFirstRule'),
435
- workflows: factCount(facts, 'workflowsRunning'),
436
- untracked: factCount(facts, 'untrackedBackgroundItems'),
437
- unreadable: factSlot(facts, 'inFlightUnreadable') === true,
438
- };
439
- }
440
417
  function deploymentHasNoOperator(d) {
441
418
  try {
442
419
  return typeof d === 'object' && d !== null && ownRead(d, 'operator') === 'absent';
@@ -453,28 +430,11 @@ function deploymentHasNoIdentity(d) {
453
430
  return false;
454
431
  }
455
432
  }
456
- export function sessionPolicyTightenNotice(outcome, lang, facts, deployment) {
433
+ export function sessionPolicyTightenNotice(outcome, lang, deployment) {
457
434
  const say = (key, params) => renderMessage(msg(key, params), lang);
458
435
  switch (outcome.kind) {
459
- case 'written': {
460
- const head = say('rules.sessionPolicy.tighten.written', { rev: outcome.rev });
461
- const w = firstRuleWorkFactsOf(facts);
462
- const unseen = msg('rules.sessionPolicy.tighten.writtenBeforeFirstRule.unseen');
463
- if (w.unreadable)
464
- return `${head} ${renderMessage(msg('rules.sessionPolicy.tighten.writtenBeforeFirstRule.unreadable'), lang)} ${renderMessage(unseen, lang)}`;
465
- const parts = [];
466
- if (w.agents !== undefined)
467
- appendOwnElement(parts, msg(w.agents === 1 ? 'rules.sessionPolicy.tighten.writtenBeforeFirstRule.agents.one' : 'rules.sessionPolicy.tighten.writtenBeforeFirstRule.agents.many', { n: w.agents }));
468
- if (w.workflows !== undefined)
469
- appendOwnElement(parts, msg(w.workflows === 1 ? 'rules.sessionPolicy.tighten.writtenBeforeFirstRule.workflows.one' : 'rules.sessionPolicy.tighten.writtenBeforeFirstRule.workflows.many', { n: w.workflows }));
470
- if (w.untracked !== undefined)
471
- appendOwnElement(parts, msg(w.untracked === 1 ? 'rules.sessionPolicy.tighten.writtenBeforeFirstRule.untracked.one' : 'rules.sessionPolicy.tighten.writtenBeforeFirstRule.untracked.many', { n: w.untracked }));
472
- const [p0, p1, p2] = parts;
473
- if (p0 === undefined)
474
- return head;
475
- const list = p1 === undefined ? p0 : p2 === undefined ? msg('rules.sessionPolicy.tighten.writtenBeforeFirstRule.list.two', { a: p0, b: p1 }) : msg('rules.sessionPolicy.tighten.writtenBeforeFirstRule.list.three', { a: p0, b: p1, c: p2 });
476
- return `${head} ${renderMessage(msg('rules.sessionPolicy.tighten.writtenBeforeFirstRule.counts', { list }), lang)} ${renderMessage(unseen, lang)}`;
477
- }
436
+ case 'written':
437
+ return say('rules.sessionPolicy.tighten.written', { rev: outcome.rev });
478
438
  case 'conflict':
479
439
  return say('rules.sessionPolicy.tighten.conflict');
480
440
  case 'loosen_forbidden':
@@ -0,0 +1 @@
1
+ export declare function subagentSourceSessionOf(carrier: object | null | undefined): string | undefined;
@@ -0,0 +1,13 @@
1
+ import { slotReadOf } from '../wireFailureShape.js';
2
+ const nonEmpty = (v) => (typeof v === 'string' && v !== '' ? v : undefined);
3
+ export function subagentSourceSessionOf(carrier) {
4
+ if (typeof carrier !== 'object' || carrier === null)
5
+ return undefined;
6
+ const current = slotReadOf(carrier, 'sourceSessionId');
7
+ if (current.presence === 'present')
8
+ return nonEmpty(current.value);
9
+ if (current.presence !== 'absent')
10
+ return undefined;
11
+ const retired = slotReadOf(carrier, 'sourceTaskId');
12
+ return retired.presence === 'present' ? nonEmpty(retired.value) : undefined;
13
+ }
@@ -163,7 +163,7 @@ export declare function approvalCardPortFor(sessionKey: string): ApprovalCardPor
163
163
  export declare function __resetSettledApprovalsForTests(): void;
164
164
  export declare function _resetApprovalCardPortForTest(): void;
165
165
  export declare function surfaceApprovalCard(req: ApprovalCardRequest): Promise<ApprovalCardDecision>;
166
- declare const REMEMBER_REFUSAL_CODES: readonly ["remember_not_in_proof", "remember_requires_binding", "capability.store_required", "decide.workflow_remember_unsupported", "decide.parked_remember_unsupported"];
166
+ declare const REMEMBER_REFUSAL_CODES: readonly ["remember_not_in_proof", "capability.store_required", "decide.workflow_remember_unsupported", "decide.parked_remember_unsupported"];
167
167
  export type RememberRefusalCode = (typeof REMEMBER_REFUSAL_CODES)[number];
168
168
  export declare function rememberRefusalOf(error: unknown): RememberRefusalCode | undefined;
169
169
  export declare function surfaceFsApprovalAndDecide(deps: FsApprovalWireDeps, taskId: string, argsByCall: Map<string, unknown>, signal?: AbortSignal, parkGatedCallId?: string, parkToolName?: string): Promise<ApprovalResolution>;
@@ -179,7 +179,7 @@ export interface ReadRootCandidateView {
179
179
  covers?: 'exact';
180
180
  }
181
181
  export type ToolApprovalDelegation = ApprovalCardDelegation;
182
- export declare const TOOL_APPROVAL_FRAME_KEYS_MIRROR: readonly ["type", "approvalId", "toolCallId", "toolName", "sourceTaskId", "fromSubagent", "sourceAgentName", "message", "args", "argsOmitted", "governanceForced", "ruleOffers", "ruleOffersAbsence", "denialLimitFallback", "readRootCandidate", "mandated", "mandate", "origin", "approvalCard", "askClass", "classes", "inputHasBidi", "parked", "persistedRuleShadowed", "allowRuleShadowed", "probeCause", "probeReason", "rememberRefused", "boundGrantDigest", "boundGrantAbsence", "boundGrants", "classifierNoRuling", "ruleEvidence", "requiresRealApproval", "expiresInMs", "expiresAtMs", "serverNowMs", "delegation", "outcome", "cause", "requestedBy"];
182
+ export declare const TOOL_APPROVAL_FRAME_KEYS_MIRROR: readonly ["type", "approvalId", "toolCallId", "toolName", "sourceTaskId", "sourceSessionId", "agentId", "askReasons", "fromSubagent", "sourceAgentName", "message", "args", "argsOmitted", "governanceForced", "ruleOffers", "ruleOffersAbsence", "denialLimitFallback", "readRootCandidate", "mandated", "mandate", "origin", "approvalCard", "askClass", "classes", "inputHasBidi", "parked", "persistedRuleShadowed", "allowRuleShadowed", "probeCause", "probeReason", "rememberRefused", "boundGrantDigest", "boundGrantAbsence", "boundGrants", "classifierNoRuling", "ruleEvidence", "requiresRealApproval", "expiresInMs", "expiresAtMs", "serverNowMs", "delegation", "outcome", "cause", "requestedBy"];
183
183
  export interface ApprovalMandatedFacts {
184
184
  readonly mandated?: true;
185
185
  readonly ruleOffersAbsence?: string;
@@ -283,6 +283,7 @@ export interface ApprovalCardFrameFactsOptions {
283
283
  readonly argsUnavailable?: true;
284
284
  }
285
285
  export declare function approvalCardFactsOfV1(card: object | null | undefined): Readonly<ApprovalCardV1Facts> | undefined;
286
+ export declare function approvalCardFactsOfV1Frame(frame: object | null | undefined): Readonly<ApprovalCardFacts> | undefined;
286
287
  export declare function approvalCardFactsOfFrame(frame: object | null | undefined, opts?: ApprovalCardFrameFactsOptions | null): Readonly<ApprovalCardFacts> | undefined;
287
288
  export declare function approvalCardFactsOfGeneric(card: object | null | undefined): Readonly<ApprovalCardFacts> | undefined;
288
289
  export interface ToolApprovalFrameLaneOpts {
@@ -15,9 +15,10 @@ import { readEngineActiveBgTasks } from '../fleet/fleetLedger.js';
15
15
  import { CORE_SKILL_TOOL_NAME } from '../generated/toolNameTables.js';
16
16
  import { CORE_ALLOW_ENTRY_INERT_REASONS, CORE_PERSISTED_RULE_MATCHES } from '../generated/engineFactTables.js';
17
17
  import { msg, renderMessage } from '../i18n/translate.js';
18
+ import { sessionAllowCarried } from './sessionAllowRoute.js';
18
19
  import { INTERRUPT_DENY_REASON, observeCancelByDeny, surfaceApprovalParking, surfaceRememberNotApplied, surfaceEditNotForwarded, surfaceEditRefusedOnBlindAsk, surfaceRuleArmNotSent, surfaceRuleArmRejected } from './hitlHostSurface.js';
19
20
  import { approvalCallKey, liveFrameCallKey } from './gateIdentity.js';
20
- import { displayUntrusted } from '../displayUntrusted.js';
21
+ import { displayUntrusted, quoteUntrustedForSentence } from '../displayUntrusted.js';
21
22
  import { frameBindingOf } from '../frameBinding.js';
22
23
  import { carriesAttributionKey, deliverWithAttributionLadder } from './attributionLadder.js';
23
24
  import { deliverApprovalDecision, newSendTally } from './approvalDelivery.js';
@@ -28,6 +29,8 @@ import { isApprovalMandateWord } from '../gateVocabulary.js';
28
29
  import { approvalDecidedByAdmitted } from '../approvalDecidedByCapability.js';
29
30
  import { decideFailureNote } from '../decideFailureNote.js';
30
31
  import { slotPresenceOf, wireFailureTextsOf } from '../wireFailureShape.js';
32
+ import { APPROVAL_LIVE_FACE_KEYS, approvalLiveFaceOf, hasOwnStrictTrue } from './approvalLiveFace.js';
33
+ import { subagentSourceSessionOf } from './subagentSource.js';
31
34
  import { isPlainRecord } from '../jsonFaithful.js';
32
35
  import { DECIDE_WORKFLOW_REMEMBER_UNSUPPORTED } from '../engineErrorCodes.js';
33
36
  import { readDecideReceipt } from '../decideReceipt.js';
@@ -156,7 +159,6 @@ function cardPortMissReason() {
156
159
  }
157
160
  const REMEMBER_REFUSAL_CODES = Object.freeze([
158
161
  'remember_not_in_proof',
159
- 'remember_requires_binding',
160
162
  'capability.store_required',
161
163
  DECIDE_WORKFLOW_REMEMBER_UNSUPPORTED,
162
164
  'decide.parked_remember_unsupported',
@@ -512,9 +514,7 @@ async function presentFsApprovalAndDecide(deps, taskId, argsByCall, signal, foun
512
514
  ...(argsRewritten ? { argsRewritten: true, wireNote: ARGS_REWRITTEN_NOTE } : {}),
513
515
  ...(pending.governanceForced === true ? { governanceForced: true } : {}),
514
516
  ...(readRequiresRealApproval(pending) ? { requiresRealApproval: true } : {}),
515
- ...(hasOwnStrictTrue(pending, 'mandated') ? { mandated: true } : {}),
516
- ...((w) => (w !== undefined ? { mandate: w } : {}))(readApprovalMandate(pending)),
517
- ...((o) => (o !== undefined ? { origin: o } : {}))(readAskOrigin(pending)),
517
+ ...approvalLiveFaceOf(pending).facts,
518
518
  ...((w) => (w !== undefined ? { approvalCard: w } : {}))(readApprovalCardWord(pending)),
519
519
  ...(readAskClassPair(pending) ?? {}),
520
520
  ...(pending.gateKind === 'irreversible_ask' ? { irreversibleParkGate: true } : {}),
@@ -683,6 +683,9 @@ export const TOOL_APPROVAL_FRAME_KEYS_MIRROR = [
683
683
  'toolCallId',
684
684
  'toolName',
685
685
  'sourceTaskId',
686
+ 'sourceSessionId',
687
+ 'agentId',
688
+ 'askReasons',
686
689
  'fromSubagent',
687
690
  'sourceAgentName',
688
691
  'message',
@@ -758,9 +761,6 @@ export function toolPermissionRequestAskBits(card, requestId) {
758
761
  ...(seatSessionRowOf(card, requestId) ? { sessionRow: true } : {}),
759
762
  };
760
763
  }
761
- function hasOwnStrictTrue(v, key) {
762
- return Object.hasOwn(v, key) && v[key] === true;
763
- }
764
764
  function isToolApprovalDelegation(v) {
765
765
  if (v === null || typeof v !== 'object')
766
766
  return false;
@@ -1283,6 +1283,30 @@ export function classifierNoRulingDetail(word, lang) {
1283
1283
  return renderMessage(msg('approval.classifier.noRulingOther', { reason: displayUntrusted(word) }), lang);
1284
1284
  return renderMessage(msg('approval.classifier.noRulingBare'), lang);
1285
1285
  }
1286
+ const BOUND_GRANT_NAMES_SHOWN = 6;
1287
+ const BOUND_GRANT_NAME_MAX = 512;
1288
+ const BOUND_GRANT_NAME_INPUT_MAX = 8192;
1289
+ const BOUND_GRANT_NAMES_LOOKAHEAD = 32;
1290
+ function boundGrantNameList(rules, lang) {
1291
+ const shown = [];
1292
+ let looked = 0;
1293
+ for (const entry of rules) {
1294
+ if (shown.length >= BOUND_GRANT_NAMES_SHOWN || looked >= BOUND_GRANT_NAMES_LOOKAHEAD)
1295
+ break;
1296
+ looked += 1;
1297
+ if (entry.length > BOUND_GRANT_NAME_INPUT_MAX)
1298
+ continue;
1299
+ const quoted = quoteUntrustedForSentence(entry, BOUND_GRANT_NAME_MAX);
1300
+ if (quoted !== undefined)
1301
+ shown.push(quoted);
1302
+ }
1303
+ if (shown.length === 0)
1304
+ return undefined;
1305
+ const rest = rules.length - shown.length;
1306
+ if (rest > 0)
1307
+ shown.push(renderMessage(msg('approval.boundGrants.more', { count: rest }), lang));
1308
+ return shown.join(' · ');
1309
+ }
1286
1310
  export function approvalBoundGrantsDetail(grants, lang) {
1287
1311
  const g = readApprovalBoundGrants({ boundGrants: grants });
1288
1312
  if (g === undefined)
@@ -1290,8 +1314,10 @@ export function approvalBoundGrantsDetail(grants, lang) {
1290
1314
  if (g.skill === null)
1291
1315
  return renderMessage(msg('approval.boundGrants.noSkill'), lang);
1292
1316
  const isRule = (e) => readBoundGrantEntry(e)?.kind === 'rule';
1293
- const a = g.allowedTools.filter(isRule).length;
1294
- const d = g.disallowedTools.filter(isRule).length;
1317
+ const allowRules = g.allowedTools.filter(isRule);
1318
+ const denyRules = g.disallowedTools.filter(isRule);
1319
+ const a = allowRules.length;
1320
+ const d = denyRules.length;
1295
1321
  const allowNothing = g.allowedTools.length - a;
1296
1322
  const denyNothing = g.disallowedTools.length - d;
1297
1323
  if (denyNothing > 0) {
@@ -1302,8 +1328,14 @@ export function approvalBoundGrantsDetail(grants, lang) {
1302
1328
  return renderMessage(allowNothing === 1 ? msg('approval.boundGrants.listsNoToolsWithNothing.one') : msg('approval.boundGrants.listsNoToolsWithNothing.other', { count: String(allowNothing) }), lang);
1303
1329
  return renderMessage(msg('approval.boundGrants.listsNoTools'), lang);
1304
1330
  }
1305
- const allow = a === 1 ? msg('approval.boundGrants.allowPart.one') : msg('approval.boundGrants.allowPart.other', { count: a });
1306
- const deny = d === 1 ? msg('approval.boundGrants.denyPart.one') : msg('approval.boundGrants.denyPart.other', { count: d });
1331
+ const allowNames = boundGrantNameList(allowRules, lang);
1332
+ const denyNames = boundGrantNameList(denyRules, lang);
1333
+ const allow = allowNames !== undefined
1334
+ ? (a === 1 ? msg('approval.boundGrants.allowPart.named.one', { names: allowNames }) : msg('approval.boundGrants.allowPart.named.other', { count: a, names: allowNames }))
1335
+ : (a === 1 ? msg('approval.boundGrants.allowPart.one') : msg('approval.boundGrants.allowPart.other', { count: a }));
1336
+ const deny = denyNames !== undefined
1337
+ ? (d === 1 ? msg('approval.boundGrants.denyPart.named.one', { names: denyNames }) : msg('approval.boundGrants.denyPart.named.other', { count: d, names: denyNames }))
1338
+ : (d === 1 ? msg('approval.boundGrants.denyPart.one') : msg('approval.boundGrants.denyPart.other', { count: d }));
1307
1339
  if (allowNothing > 0) {
1308
1340
  return renderMessage(allowNothing === 1 ? msg('approval.boundGrants.activatesWithNothing.one', { allow, deny }) : msg('approval.boundGrants.activatesWithNothing.other', { allow, deny, count: String(allowNothing) }), lang);
1309
1341
  }
@@ -1320,7 +1352,8 @@ function askSigOf(classes, origin, mandate) {
1320
1352
  }
1321
1353
  function carrierAskSig(v, live) {
1322
1354
  try {
1323
- return askSigOf(readAskClassPair(v)?.classes, live === undefined ? undefined : readAskOrigin(live), live === undefined ? undefined : readApprovalMandate(live));
1355
+ const face = live === undefined ? undefined : approvalLiveFaceOf(live);
1356
+ return askSigOf(readAskClassPair(v)?.classes, face?.facts.origin, face?.facts.mandate);
1324
1357
  }
1325
1358
  catch {
1326
1359
  return undefined;
@@ -1605,10 +1638,11 @@ export function readRuleOfferSupply(offers) {
1605
1638
  }
1606
1639
  function subagentBadgeFor(frame) {
1607
1640
  let name = typeof frame.sourceAgentName === 'string' && frame.sourceAgentName.length > 0 ? frame.sourceAgentName : '';
1608
- if (!name && typeof frame.sourceTaskId === 'string' && frame.sourceTaskId.length > 0) {
1609
- name = frame.sourceTaskId;
1641
+ const source = subagentSourceSessionOf(frame);
1642
+ if (!name && source !== undefined) {
1643
+ name = source;
1610
1644
  try {
1611
- const row = readEngineActiveBgTasks().tasks.find(t => t.id === frame.sourceTaskId);
1645
+ const row = readEngineActiveBgTasks().tasks.find(t => t.id === source);
1612
1646
  if (typeof row?.name === 'string' && row.name.length > 0)
1613
1647
  name = row.name;
1614
1648
  }
@@ -1631,10 +1665,11 @@ function v1Bit(stamp) {
1631
1665
  const SUSPENDED_ASK_ARGS_NOTE = "this request's tool arguments are not available on this surface — it was raised while no client was connected, " +
1632
1666
  'so you are deciding without seeing them; deny it if you are not sure what it will do. ' +
1633
1667
  'Edits are not accepted on this card: there is no original input to edit';
1634
- function cardFactsOf(carrier, leg, opts, liveFacts) {
1668
+ function cardFactsOf(carrier, leg, opts, liveFacts, approvalId) {
1635
1669
  const c = carrier;
1636
1670
  const full = leg !== 'generic';
1637
1671
  const live = leg === 'frame' ? carrier : leg === 'v1' ? liveFacts : undefined;
1672
+ let face;
1638
1673
  const asFrame = carrier;
1639
1674
  const fromSubagent = full
1640
1675
  ? (() => {
@@ -1747,15 +1782,11 @@ function cardFactsOf(carrier, leg, opts, liveFacts) {
1747
1782
  realApprovalUnreadable = true;
1748
1783
  }
1749
1784
  if (live !== undefined) {
1750
- v1Bit(() => {
1751
- if (hasOwnStrictTrue(live, 'mandated'))
1752
- out.mandated = true;
1753
- });
1754
- v1Bit(() => {
1755
- const w = readApprovalMandate(live);
1756
- if (w !== undefined)
1757
- out.mandate = w;
1758
- });
1785
+ face = approvalLiveFaceOf(live);
1786
+ if (face.facts.mandated === true)
1787
+ out.mandated = true;
1788
+ if (face.facts.mandate !== undefined)
1789
+ out.mandate = face.facts.mandate;
1759
1790
  v1Bit(() => {
1760
1791
  const rc = readReadRootCandidate(live.readRootCandidate);
1761
1792
  if (rc !== undefined)
@@ -1777,13 +1808,8 @@ function cardFactsOf(carrier, leg, opts, liveFacts) {
1777
1808
  if (dlf !== undefined)
1778
1809
  out.denialLimitFallback = dlf;
1779
1810
  });
1780
- if (live !== undefined) {
1781
- v1Bit(() => {
1782
- const o = readAskOrigin(live);
1783
- if (o !== undefined)
1784
- out.origin = o;
1785
- });
1786
- }
1811
+ if (face !== undefined && face.facts.origin !== undefined)
1812
+ out.origin = face.facts.origin;
1787
1813
  if (leg !== 'generic') {
1788
1814
  v1Bit(() => {
1789
1815
  const w = readApprovalCardWord(carrier);
@@ -1817,16 +1843,32 @@ function cardFactsOf(carrier, leg, opts, liveFacts) {
1817
1843
  });
1818
1844
  if (leg === 'generic')
1819
1845
  out.cardPayloadUnreadable = true;
1820
- if (leg === 'frame')
1846
+ if (sessionAllowCarried(leg, approvalId))
1821
1847
  out.allowSessionCarried = true;
1822
1848
  out.grantBinding = readApprovalGrantBinding(carrier);
1823
- return withUnreadableEvidence(carrier, leg, out, realApprovalUnreadable ? ['requiresRealApproval'] : [], live);
1849
+ const reported = realApprovalUnreadable ? ['requiresRealApproval'] : [];
1850
+ if (face?.layerUnknown === 'marked' || (leg === 'v1' && face?.layerUnknown === 'absent'))
1851
+ reported.push(...APPROVAL_LIVE_FACE_KEYS);
1852
+ return withUnreadableEvidence(carrier, leg, out, reported, live);
1824
1853
  }
1825
1854
  export function approvalCardFactsOfV1(card) {
1826
1855
  if (typeof card !== 'object' || card === null)
1827
1856
  return undefined;
1828
1857
  return Object.freeze(cardFactsOf(card, 'v1'));
1829
1858
  }
1859
+ export function approvalCardFactsOfV1Frame(frame) {
1860
+ if (typeof frame !== 'object' || frame === null)
1861
+ return undefined;
1862
+ try {
1863
+ const carriers = openingFrameCarriersOf(frame);
1864
+ if (carriers.leg !== 'v1')
1865
+ return undefined;
1866
+ return Object.freeze(cardFactsOf(carriers.body, 'v1', null, carriers.live, ownDataValue(frame, 'approvalId')));
1867
+ }
1868
+ catch {
1869
+ return undefined;
1870
+ }
1871
+ }
1830
1872
  export function approvalCardFactsOfFrame(frame, opts) {
1831
1873
  if (typeof frame !== 'object' || frame === null)
1832
1874
  return undefined;
@@ -1888,7 +1930,7 @@ function liveCardIdentityOf(approvalId, frame, carriers, run) {
1888
1930
  const fromSubagent = isFromSubagent(carriers.body);
1889
1931
  const bound = fromSubagent ? undefined : frameBindingOf(frame);
1890
1932
  const source = bound ?? run;
1891
- const ownRun = fromSubagent ? body.sourceTaskId : source?.taskId;
1933
+ const ownRun = fromSubagent ? subagentSourceSessionOf(carriers.body) : source?.taskId;
1892
1934
  const taskId = typeof ownRun === 'string' && ownRun !== '' ? ownRun : undefined;
1893
1935
  const sessionId = !fromSubagent && typeof source?.sessionId === 'string' && source.sessionId !== '' ? source.sessionId : undefined;
1894
1936
  const askSig = carrierAskSig(carriers.body, carriers.live);
@@ -1950,7 +1992,7 @@ async function presentToolApprovalFrameAndRespond(frame, carriers, approvalId, r
1950
1992
  const bodyToolCallId = carriers.body.toolCallId;
1951
1993
  const frameToolCallId = typeof bodyToolCallId === 'string' && bodyToolCallId !== '' ? bodyToolCallId : undefined;
1952
1994
  const decidedByReading = decidedByReadingSnapshotOf(lane);
1953
- const facts = cardFactsOf(carriers.body, carriers.leg, { streamArgs, ...(lane?.argsUnavailable === true ? { argsUnavailable: true } : {}) }, carriers.live);
1995
+ const facts = cardFactsOf(carriers.body, carriers.leg, { streamArgs, ...(lane?.argsUnavailable === true ? { argsUnavailable: true } : {}) }, carriers.live, approvalId);
1954
1996
  const argsNotRealInput = facts.argsUnavailable === true;
1955
1997
  const ruleOffers = facts.ruleOffers;
1956
1998
  if (argsNotRealInput && lane?.argsUnavailable !== true && facts.wireNote !== undefined) {
@@ -2,7 +2,7 @@ import { SETTINGS_WORKSPACE_TRUST_STATES } from './generated/settingsSchemaTable
2
2
  import type { ManagedPolicyState, PluginHooksReading, SessionHooksReading, SettingsDocument } from './host.js';
3
3
  import type { PluginHookReaderState } from './pluginHooksWire.js';
4
4
  export type WorkspaceTrustState = (typeof SETTINGS_WORKSPACE_TRUST_STATES)[number];
5
- export declare const HOST_SETTINGS_LAYERS: readonly ["policySettings", "userSettings", "projectSettings", "localSettings", "flagSettings"];
5
+ export declare const HOST_SETTINGS_LAYERS: readonly ["policySettings", "userSettings", "projectSettings", "localSettings", "flagSettings", "foreignProjectSettings"];
6
6
  export type HostSettingsLayer = (typeof HOST_SETTINGS_LAYERS)[number];
7
7
  export declare const MANAGED_POLICY_STATES: readonly ["absent", "in-effect", "in-effect-pieces", "unreadable-covered", "unreadable-uncovered", "remote-unknown"];
8
8
  export declare const HOST_STARTUP_MODES: readonly ["safe", "bare", "none"];
@@ -71,6 +71,8 @@ export declare function sourceOfRead(read: HostSettingsRead): HostSettingsSource
71
71
  export declare function settingsValueOf(read: HostSettingsRead, key: string): {} | null | undefined;
72
72
  export declare function mergedBooleanOf(read: HostSettingsRead, key: string): boolean | undefined;
73
73
  export declare const CC_MERGE_ORDER: readonly ["userSettings", "projectSettings", "localSettings", "flagSettings", "policySettings"];
74
+ export type TightenOnlyHostSettingsLayer = Exclude<HostSettingsLayer, (typeof CC_MERGE_ORDER)[number]>;
75
+ export declare const TIGHTEN_ONLY_HOST_SETTINGS_LAYERS: readonly TightenOnlyHostSettingsLayer[];
74
76
  export declare function nonManagedLayerDown(read: HostSettingsRead): boolean;
75
77
  export declare const ADOPTED_LAYERS: readonly ["userSettings", "projectSettings", "localSettings", "flagSettings"];
76
78
  export type AdoptedLayer = (typeof ADOPTED_LAYERS)[number];
@@ -102,6 +104,7 @@ export declare function hostSettingsSessionFollows(stored: HostSettingsSession |
102
104
  export declare const FIRST_SESSION: HostSettingsSession;
103
105
  export declare function sessionSnapshotOf(previous: {} | null | undefined): HostSettingsSession | undefined;
104
106
  export declare function permissionRulesOf(doc: SettingsDocument | null, bucket: 'allow' | 'deny' | 'ask'): readonly string[];
107
+ export declare function permissionBucketOf(doc: SettingsDocument | null, bucket: 'allow' | 'deny' | 'ask'): readonly string[] | undefined;
105
108
  export interface HostSettingsAdoption {
106
109
  readonly read: HostSettingsRead;
107
110
  readonly session: HostSettingsSession;
@@ -121,7 +124,7 @@ export interface HostSettingsAdoption {
121
124
  };
122
125
  readonly overflow?: true;
123
126
  }
124
- export declare function adoptHostSettingsRead(read: HostSettingsRead, session: HostSettingsSession, allowAdmitted?: (layer: AdoptedLayer) => boolean): HostSettingsAdoption;
127
+ export declare function adoptHostSettingsRead(read: HostSettingsRead, session: HostSettingsSession, allowAdmitted?: (layer: AdoptedLayer) => boolean, layeredRules?: boolean): HostSettingsAdoption;
125
128
  export type ManagedCommitVerdict = 'proceed' | 'refuse';
126
129
  export type ManagedRuleScopeVerdict = 'all-sources' | 'by-switch' | 'degrade';
127
130
  export type ManagedHooksRestrictionVerdict = 'use-read' | 'held-restrictions' | 'withhold';
@@ -2,7 +2,7 @@ import { appendOwnElement } from './ownKey.js';
2
2
  import { SETTINGS_WORKSPACE_TRUST_STATES } from './generated/settingsSchemaTables.js';
3
3
  import { jsonFaithfulCost, materializeJsonFaithful } from './jsonFaithful.js';
4
4
  import { faultText } from './hostCallbackGuard.js';
5
- export const HOST_SETTINGS_LAYERS = Object.freeze(['policySettings', 'userSettings', 'projectSettings', 'localSettings', 'flagSettings']);
5
+ export const HOST_SETTINGS_LAYERS = Object.freeze(['policySettings', 'userSettings', 'projectSettings', 'localSettings', 'flagSettings', 'foreignProjectSettings']);
6
6
  export const MANAGED_POLICY_STATES = Object.freeze(['absent', 'in-effect', 'in-effect-pieces', 'unreadable-covered', 'unreadable-uncovered', 'remote-unknown']);
7
7
  export const HOST_STARTUP_MODES = Object.freeze(['safe', 'bare', 'none']);
8
8
  export const HOST_SETTINGS_CARRIER_STATUSES = Object.freeze(['loaded', 'loaded-partial', 'empty', 'absent', 'unreadable', 'not-loaded']);
@@ -394,8 +394,9 @@ export function mergedBooleanOf(read, key) {
394
394
  return out;
395
395
  }
396
396
  export const CC_MERGE_ORDER = Object.freeze(['userSettings', 'projectSettings', 'localSettings', 'flagSettings', 'policySettings']);
397
+ export const TIGHTEN_ONLY_HOST_SETTINGS_LAYERS = Object.freeze(HOST_SETTINGS_LAYERS.filter((l) => !CC_MERGE_ORDER.includes(l)));
397
398
  export function nonManagedLayerDown(read) {
398
- return HOST_SETTINGS_LAYERS.some((l) => {
399
+ return CC_MERGE_ORDER.some((l) => {
399
400
  if (l === 'policySettings')
400
401
  return false;
401
402
  const snap = read.layers[l];
@@ -403,6 +404,7 @@ export function nonManagedLayerDown(read) {
403
404
  });
404
405
  }
405
406
  export const ADOPTED_LAYERS = Object.freeze(['userSettings', 'projectSettings', 'localSettings', 'flagSettings']);
407
+ const isAdoptedLayer = (l) => ADOPTED_LAYERS.includes(l);
406
408
  const GENESIS_VERSION = '0';
407
409
  export const parentVersionOf = (session) => (session.version === GENESIS_VERSION ? null : session.version);
408
410
  function canonicalOf(v) {
@@ -512,19 +514,22 @@ export function sessionSnapshotOf(previous) {
512
514
  }
513
515
  const LOADED = new Set(['loaded', 'loaded-partial']);
514
516
  export function permissionRulesOf(doc, bucket) {
517
+ return permissionBucketOf(doc, bucket) ?? [];
518
+ }
519
+ export function permissionBucketOf(doc, bucket) {
515
520
  if (doc === null)
516
- return [];
521
+ return undefined;
517
522
  const p = ownData(doc, 'permissions');
518
523
  if (!p.ok || !isRecord(p.value))
519
- return [];
524
+ return undefined;
520
525
  const b = ownData(p.value, bucket);
521
- return b.ok && Array.isArray(b.value) ? b.value.filter((x) => typeof x === 'string') : [];
526
+ return b.ok && Array.isArray(b.value) ? b.value.filter((x) => typeof x === 'string') : undefined;
522
527
  }
523
528
  function overflowOf(read, session) {
524
529
  return Object.freeze({ read, session: remintSameContent(session), trusted: false, clean: false, extraTighten: NO_EXTRA, allowByLayer: emptyByLayer(), overflow: true });
525
530
  }
526
531
  const carrierKeysOf = (read, layer) => read.layers[layer].carriers.map((c) => c.id);
527
- export function adoptHostSettingsRead(read, session, allowAdmitted = () => true) {
532
+ export function adoptHostSettingsRead(read, session, allowAdmitted = () => true, layeredRules = false) {
528
533
  const B = session.baseline;
529
534
  const stackIssues = ADOPTED_LAYERS.flatMap((l) => read.layers[l].issues.map((x) => `${l}|${x}`));
530
535
  const loadedNow = ADOPTED_LAYERS.flatMap((l) => read.layers[l].malformed ? [] : read.layers[l].carriers.filter((c) => LOADED.has(c.status) || (c.status === 'empty' && c.emptyKind === 'empty-object')).map((c) => `${l}|${c.id}`));
@@ -624,12 +629,16 @@ export function adoptHostSettingsRead(read, session, allowAdmitted = () => true)
624
629
  const effectiveLayers = {};
625
630
  for (const l of HOST_SETTINGS_LAYERS) {
626
631
  const snap = read.layers[l];
627
- effectiveLayers[l] = l === 'policySettings' ? snap : Object.freeze({ ...snap, doc: base.docs[l] });
632
+ effectiveLayers[l] = isAdoptedLayer(l) ? Object.freeze({ ...snap, doc: base.docs[l] }) : snap;
628
633
  }
629
634
  const effective = Object.freeze({ ...read, layers: Object.freeze(effectiveLayers), current: read, debug: Object.freeze([]) });
630
- const sentNow = (bucket) => new Set([...ADOPTED_LAYERS.flatMap((l) => permissionRulesOf(base.docs[l], bucket)), ...extraTighten[bucket].map((r) => r.rule)]);
631
- const readNow = (bucket) => new Set(ADOPTED_LAYERS.flatMap((l) => permissionRulesOf(read.layers[l].doc, bucket)));
632
- const drop = (bucket) => Object.freeze([...sentNow(bucket)].filter((r) => !readNow(bucket).has(r)).sort());
635
+ const idOf = (layer, rule) => (layeredRules ? JSON.stringify([layer, rule]) : rule);
636
+ const sentNow = (bucket) => [...ADOPTED_LAYERS.flatMap((l) => permissionRulesOf(base.docs[l], bucket).map((rule) => ({ layer: l, rule }))), ...extraTighten[bucket]];
637
+ const readNow = (bucket) => new Set(ADOPTED_LAYERS.flatMap((l) => permissionRulesOf(read.layers[l].doc, bucket).map((rule) => idOf(l, rule))));
638
+ const drop = (bucket) => {
639
+ const now = readNow(bucket);
640
+ return Object.freeze([...new Set(sentNow(bucket).filter((r) => !now.has(idOf(r.layer, r.rule))).map((r) => r.rule))].sort());
641
+ };
633
642
  const wouldDrop = Object.freeze({ deny: drop('deny'), ask: drop('ask') });
634
643
  const acceptable = !stackIssues.some((x) => !base.issues.includes(x)) && !anyMalformed && !ADOPTED_LAYERS.some((l) => read.layers[l].carriers.some((c) => c.status === 'unreadable' || c.status === 'not-loaded'));
635
644
  const s = mintHostSettingsSession(parentVersionOf(session), session.consented, baseline);
@@ -3,12 +3,12 @@ import type { WireHooksConfig } from './finalVerifyWire.js';
3
3
  import type { memoryOffDeclared as MemoryOffDeclared } from './request/taskRequest.js';
4
4
  import type { EnvLike } from './hostEnv.js';
5
5
  import { type SettingsDocument } from './host.js';
6
- import type { HookSettingsSource, HooksWirePlan, HooksWirePlanOptions } from './pluginHooksWire.js';
7
- import { type HostSettingsSession, type HostSettingsSource } from './hostSettingsSource.js';
6
+ import type { HooksWirePlan, HooksWirePlanOptions } from './pluginHooksWire.js';
7
+ import { type HostSettingsLayer, type HostSettingsSession, type HostSettingsSource } from './hostSettingsSource.js';
8
8
  import { type SubmissionIdentity } from './request/submissionIdentity.js';
9
9
  import { type WebSearchApiKeyFor } from './webSearchWireCaps.js';
10
10
  import { type FileHistoryCaptureReading } from './fileHistoryCaptureCapability.js';
11
- import type { PermissionsAllowGrantReading } from './permissionsAllowGrantCapability.js';
11
+ import { type PermissionsAllowGrantReading } from './permissionsAllowGrantCapability.js';
12
12
  export declare const HOST_SUPPLIED_KEYS: readonly ["settings.hooks", "settings.resolved", "settings.webSearch", "settings.outputStyle", "memory", "fileHistory"];
13
13
  export type HostSuppliedKey = (typeof HOST_SUPPLIED_KEYS)[number];
14
14
  export declare const HOST_SETTING_CAUSES: readonly ["carried", "entries_dropped", "source_rejected", "projection_failed", "source_unreadable", "empty", "no_source", "host_port_missing", "value_malformed", "held_previous", "policy_withheld"];
@@ -16,12 +16,12 @@ export type HostSettingCause = (typeof HOST_SETTING_CAUSES)[number];
16
16
  export declare const HOST_SETTING_DISPOSITIONS: readonly ["carry", "carry_partial", "withhold_notice", "withhold_by_policy", "hold_for_consent", "refuse_turn", "unwired", "nothing_to_carry"];
17
17
  export type HostSettingDisposition = (typeof HOST_SETTING_DISPOSITIONS)[number];
18
18
  export type HostSettingPlane = 'turn' | 'session' | 'diagnostic';
19
- export type HostSettingNoticeId = 'HS-UNWIRED' | 'HS-MANAGED-REJECTED' | 'HS-PROJECTION' | 'HS-SOURCE-UNREADABLE' | 'HS-WEBSEARCH-MALFORMED' | 'HS-SWITCH-MALFORMED' | 'HS-FILEHISTORY-UNJUDGED' | 'HS-FILEHISTORY-RESTORE' | 'HS-MANAGED-UNREADABLE' | 'HS-LAYER-NOT-LOADED' | 'HS-HELD-PREVIOUS' | 'HS-STYLE-MISSING' | 'HS-STYLE-SAFE';
19
+ export type HostSettingNoticeId = 'HS-UNWIRED' | 'HS-MANAGED-REJECTED' | 'HS-PROJECTION' | 'HS-SOURCE-UNREADABLE' | 'HS-WEBSEARCH-MALFORMED' | 'HS-SWITCH-MALFORMED' | 'HS-FILEHISTORY-UNJUDGED' | 'HS-FILEHISTORY-RESTORE' | 'HS-MANAGED-UNREADABLE' | 'HS-LAYER-NOT-LOADED' | 'HS-HELD-PREVIOUS' | 'HS-STYLE-MISSING' | 'HS-STYLE-SAFE' | 'HS-LAYER-PARTS-UNREAD';
20
20
  export interface HostSettingRow {
21
21
  readonly key: HostSuppliedKey;
22
22
  readonly cause: HostSettingCause;
23
23
  readonly disposition: HostSettingDisposition;
24
- readonly layers?: readonly HookSettingsSource[];
24
+ readonly layers?: readonly HostSettingsLayer[];
25
25
  }
26
26
  export interface HostSettingNotice {
27
27
  readonly id: HostSettingNoticeId;
@@ -123,7 +123,6 @@ export interface HostPermissionFacts {
123
123
  readonly ask?: readonly string[];
124
124
  };
125
125
  readonly clientOwnedServers?: readonly string[];
126
- readonly serverVersion?: string;
127
126
  }
128
127
  export declare function rethrowHostResolvedDeferred(product: HostTurnSettings): void;
129
128
  export type HostResolvedMaterializer = (snapshot: SettingsDocument) => SettingsDocument;