@sema-agent/client-core 0.104.1 → 0.106.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +310 -0
- package/README.md +36 -14
- package/dist/adapt/arms.js +23 -6
- package/dist/adapter/activeRunSelfHeal.d.ts +14 -2
- package/dist/adapter/activeRunSelfHeal.js +90 -12
- package/dist/adapter/downstream/eventToSdkMessage.d.ts +0 -5
- package/dist/adapter/downstream/eventToSdkMessage.js +24 -23
- package/dist/adapter/downstream/terminalToSdkResult.js +2 -3
- package/dist/adapter/downstream/wiringManifestView.d.ts +7 -3
- package/dist/adapter/downstream/wiringManifestView.js +25 -1
- package/dist/adapter/runStream.js +8 -5
- package/dist/approvalReachWire.d.ts +1 -0
- package/dist/approvalReachWire.js +4 -1
- package/dist/approvalSeat.d.ts +21 -0
- package/dist/approvalSeat.js +73 -0
- package/dist/assistantInbox.d.ts +2 -0
- package/dist/assistantInbox.js +3 -0
- package/dist/checkpointRowVerdict.d.ts +23 -0
- package/dist/checkpointRowVerdict.js +89 -0
- package/dist/cloudConfigWireCaps.js +3 -0
- package/dist/compensations.js +6 -6
- package/dist/coreValuePorts.d.ts +14 -1
- package/dist/coreValuePorts.js +14 -0
- package/dist/decideFailureNote.js +3 -1
- package/dist/decideReceipt.d.ts +9 -0
- package/dist/decideReceipt.js +29 -1
- package/dist/declared/supportFloorDeclared.js +2 -2
- package/dist/deviceRebind.d.ts +7 -0
- package/dist/deviceRebind.js +39 -5
- package/dist/displayUntrusted.d.ts +4 -2
- package/dist/displayUntrusted.js +45 -22
- package/dist/engineAddress.d.ts +3 -0
- package/dist/engineAddress.js +25 -0
- package/dist/engineDirectory.js +9 -17
- package/dist/engineErrorCodes.d.ts +8 -0
- package/dist/engineErrorCodes.js +8 -0
- package/dist/engineGenerationPort.d.ts +11 -2
- package/dist/engineGenerationPort.js +63 -9
- package/dist/engineHealthFacts.d.ts +5 -0
- package/dist/engineHealthFacts.js +11 -0
- package/dist/engineNoticeCodes.d.ts +26 -3
- package/dist/engineNoticeCodes.js +52 -7
- package/dist/engineRowRef.js +1 -1
- package/dist/errorSupplementRoles.js +2 -0
- package/dist/eventLeg.d.ts +3 -3
- package/dist/eventLeg.js +25 -4
- package/dist/fleet/fleetProjection.js +26 -5
- package/dist/generated/engineFactTables.d.ts +3 -1
- package/dist/generated/engineFactTables.js +4 -1
- package/dist/generated/engineNoticeTables.js +19 -4
- package/dist/generated/sdkFactTables.d.ts +5 -0
- package/dist/generated/sdkFactTables.js +24 -0
- package/dist/generated/settingsSchemaFns.d.ts +11 -0
- package/dist/generated/settingsSchemaFns.js +2 -1
- package/dist/generated/settingsSchemaSafetyMergeSpec.js +1 -1
- package/dist/generated/settingsSchemaSettingsSources.d.ts +1 -1
- package/dist/generated/settingsSchemaSettingsSources.js +22 -2
- package/dist/headlessReconnectWire.js +31 -4
- package/dist/hitl/approvalLiveFace.d.ts +17 -0
- package/dist/hitl/approvalLiveFace.js +35 -0
- package/dist/hitl/approvalQueueRow.d.ts +21 -0
- package/dist/hitl/approvalQueueRow.js +69 -0
- package/dist/hitl/approvalsFeed.d.ts +5 -4
- package/dist/hitl/approvalsFeed.js +38 -6
- package/dist/hitl/askGateWire.js +26 -2
- package/dist/hitl/askParkRowRouting.d.ts +4 -3
- package/dist/hitl/askParkRowRouting.js +15 -3
- package/dist/hitl/automaticAnswerVerdict.js +13 -10
- package/dist/hitl/crashConverged.d.ts +5 -1
- package/dist/hitl/decisionConflict.js +2 -1
- package/dist/hitl/decisionRefusal.js +1 -1
- package/dist/hitl/decisionSend.d.ts +1 -0
- package/dist/hitl/decisionSend.js +14 -2
- package/dist/hitl/frameRouter.d.ts +4 -0
- package/dist/hitl/frameRouter.js +18 -5
- package/dist/hitl/gateIdentity.d.ts +1 -0
- package/dist/hitl/gateIdentity.js +3 -0
- package/dist/hitl/hitlBridge.d.ts +1 -1
- package/dist/hitl/hitlBridge.js +26 -5
- package/dist/hitl/livePendingAsk.d.ts +5 -0
- package/dist/hitl/livePendingAsk.js +6 -1
- package/dist/hitl/planReviewCard.d.ts +23 -0
- package/dist/hitl/planReviewCard.js +250 -0
- package/dist/hitl/planReviewWire.d.ts +39 -14
- package/dist/hitl/planReviewWire.js +450 -163
- package/dist/hitl/sessionAllowRoute.d.ts +2 -0
- package/dist/hitl/sessionAllowRoute.js +7 -0
- package/dist/hitl/sessionPolicyWire.d.ts +1 -7
- package/dist/hitl/sessionPolicyWire.js +3 -43
- package/dist/hitl/subagentSource.d.ts +1 -0
- package/dist/hitl/subagentSource.js +13 -0
- package/dist/hitl/toolApprovalWire.d.ts +3 -2
- package/dist/hitl/toolApprovalWire.js +79 -37
- package/dist/hostSettingsSource.d.ts +5 -2
- package/dist/hostSettingsSource.js +19 -10
- package/dist/hostTurnSettings.d.ts +5 -6
- package/dist/hostTurnSettings.js +106 -26
- package/dist/i18n/messages.en.d.ts +85 -12
- package/dist/i18n/messages.en.js +85 -12
- package/dist/i18n/messages.zh.js +88 -12
- package/dist/index.d.ts +35 -4
- package/dist/index.js +19 -2
- package/dist/liveInitToolFace.js +0 -1
- package/dist/liveModelCatalog.d.ts +15 -0
- package/dist/liveModelCatalog.js +40 -0
- package/dist/mcpTransportKindsCapability.d.ts +18 -0
- package/dist/mcpTransportKindsCapability.js +75 -0
- package/dist/mcpWireCaps.d.ts +4 -1
- package/dist/mcpWireCaps.js +25 -14
- package/dist/modelCapabilityProbe.js +66 -33
- package/dist/notifications.d.ts +9 -0
- package/dist/notifications.js +11 -2
- package/dist/ownKey.d.ts +4 -1
- package/dist/ownKey.js +8 -2
- package/dist/permissionModeWriteCapability.d.ts +13 -0
- package/dist/permissionModeWriteCapability.js +35 -0
- package/dist/permissionsAllowGrantCapability.d.ts +3 -0
- package/dist/permissionsAllowGrantCapability.js +26 -3
- package/dist/permissionsDeclaration.d.ts +25 -3
- package/dist/permissionsDeclaration.js +69 -41
- package/dist/planReviewCardFacts.d.ts +116 -0
- package/dist/planReviewCardFacts.js +469 -0
- package/dist/projectSeed.d.ts +39 -0
- package/dist/projectSeed.js +80 -0
- package/dist/promptDelivery.js +1 -1
- package/dist/reattachWindow.d.ts +8 -1
- package/dist/reattachWindow.js +44 -12
- package/dist/replayBody.d.ts +7 -6
- package/dist/replayBody.js +62 -7
- package/dist/request/taskRequest.js +3 -4
- package/dist/ruleCompileVerdict.d.ts +0 -2
- package/dist/ruleCompileVerdict.js +0 -31
- package/dist/ruleRefusalSentence.js +0 -3
- package/dist/runFollow.d.ts +30 -0
- package/dist/runFollow.js +117 -0
- package/dist/runLedgerSnapshot.d.ts +20 -0
- package/dist/runLedgerSnapshot.js +272 -0
- package/dist/runPermissionModeSwitch.d.ts +57 -0
- package/dist/runPermissionModeSwitch.js +135 -0
- package/dist/runReattachPolicy.d.ts +16 -5
- package/dist/runReattachPolicy.js +72 -24
- package/dist/runTerminal.js +30 -8
- package/dist/sandboxWire.d.ts +0 -3
- package/dist/sandboxWire.js +0 -9
- package/dist/seam.d.ts +17 -7
- package/dist/seam.js +13 -1
- package/dist/seatContract.d.ts +57 -7
- package/dist/seatContract.js +133 -3
- package/dist/serverSupportRange.d.ts +18 -0
- package/dist/serverSupportRange.js +25 -0
- package/dist/sessionEngine.d.ts +156 -0
- package/dist/sessionEngine.js +464 -0
- package/dist/sessionMap.d.ts +11 -1
- package/dist/sessionMap.js +35 -9
- package/dist/sessionMemoryErase.d.ts +1 -1
- package/dist/sessionMemoryErase.js +5 -0
- package/dist/sessionMemoryStatus.d.ts +27 -1
- package/dist/sessionMemoryStatus.js +117 -0
- package/dist/sessionMemorySync.d.ts +31 -0
- package/dist/sessionMemorySync.js +95 -0
- package/dist/sessionRowTag.d.ts +4 -0
- package/dist/sessionRowTag.js +18 -0
- package/dist/settingsLayerAdmission.d.ts +1 -0
- package/dist/settingsLayerAdmission.js +4 -1
- package/dist/sseIdleTriage.d.ts +3 -1
- package/dist/sseIdleTriage.js +19 -4
- package/dist/subagent/engineSubagentTail.js +2 -0
- package/dist/subagentContentStore.d.ts +3 -0
- package/dist/subagentContentStore.js +10 -1
- package/dist/toolResult.js +1 -1
- package/dist/turnFailurePresentation.d.ts +5 -2
- package/dist/turnFailurePresentation.js +12 -4
- package/dist/wireRefusalCopy.js +2 -6
- package/docs/INTEGRATION-CLIENTS.md +1507 -18
- package/package.json +5 -5
|
@@ -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,
|
|
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,
|
|
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
|
-
|
|
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", "
|
|
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
|
-
...(
|
|
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
|
|
1294
|
-
const
|
|
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
|
|
1306
|
-
const
|
|
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
|
-
|
|
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
|
-
|
|
1609
|
-
|
|
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 ===
|
|
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
|
-
|
|
1751
|
-
|
|
1752
|
-
|
|
1753
|
-
|
|
1754
|
-
|
|
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 (
|
|
1781
|
-
|
|
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
|
|
1846
|
+
if (sessionAllowCarried(leg, approvalId))
|
|
1821
1847
|
out.allowSessionCarried = true;
|
|
1822
1848
|
out.grantBinding = readApprovalGrantBinding(carrier);
|
|
1823
|
-
|
|
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
|
|
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
|
|
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
|
|
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
|
|
631
|
-
const
|
|
632
|
-
const
|
|
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 {
|
|
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
|
|
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
|
|
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;
|