@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
@@ -1,7 +1,7 @@
1
1
  import { SETTINGS_CLASSIFY_HOOKS_CONFIG } from './generated/settingsSchemaFns.js';
2
2
  import { hostLog } from './host.js';
3
3
  import { layerNotAppliedRefusesTurn, salvageSettingsHooksEntries } from './settingsHooksSalvage.js';
4
- import { ADOPTED_LAYERS, HOST_SETTINGS_LAYERS, HostSettingsSourceShapeError, permissionRulesOf, MANAGED_READING_DISPOSITIONS, adoptHostSettingsRead, mintHostSettingsSession, readHostSettingsOnce, remintSameContent, sessionSnapshotOf, settingsValueOf, sourceOfRead, } from './hostSettingsSource.js';
4
+ import { ADOPTED_LAYERS, HOST_SETTINGS_LAYERS, HostSettingsSourceShapeError, TIGHTEN_ONLY_HOST_SETTINGS_LAYERS, permissionBucketOf, permissionRulesOf, MANAGED_READING_DISPOSITIONS, adoptHostSettingsRead, mintHostSettingsSession, readHostSettingsOnce, remintSameContent, sessionSnapshotOf, settingsValueOf, sourceOfRead, } from './hostSettingsSource.js';
5
5
  import { hooksWirePlan } from './hooksWireCaps.js';
6
6
  import { submissionSurfaceOf } from './request/submissionIdentity.js';
7
7
  import { displayUntrusted } from './displayUntrusted.js';
@@ -10,7 +10,9 @@ import { fileHistoryTightenVerdict, fileHistoryUnjudgedRefusal } from './fileHis
10
10
  import { msg, renderMessage } from './i18n/translate.js';
11
11
  import { newRulePortsProjection, projectPermissionsDeclaration, rulePortsMissingOf, WIRE_RULE_TRUST_ORDER } from './permissionsDeclaration.js';
12
12
  import { assemblyRefusalOf } from './wireFailureShape.js';
13
- import { layerAdmitted } from './settingsLayerAdmission.js';
13
+ import { permissionRuleLayersOn } from './permissionsAllowGrantCapability.js';
14
+ import { layerAdmissionReading, layerAdmitted } from './settingsLayerAdmission.js';
15
+ import { SETTINGS_BUILD_LAYER_PARTS_UNREAD_NOTICE } from './generated/settingsSchemaFns.js';
14
16
  import { appendOwnElement, ownDataField } from './ownKey.js';
15
17
  export const HOST_SUPPLIED_KEYS = Object.freeze(['settings.hooks', 'settings.resolved', 'settings.webSearch', 'settings.outputStyle', 'memory', 'fileHistory']);
16
18
  export const HOST_SETTING_CAUSES = Object.freeze([
@@ -41,6 +43,7 @@ const HOST_SETTING_NOTICE_TEXT = {
41
43
  'HS-HELD-PREVIOUS': () => renderMessage(msg('session.hostSettings.heldPrevious')),
42
44
  'HS-STYLE-MISSING': (what) => renderMessage(msg('session.hostSettings.styleMissing', { name: what })),
43
45
  'HS-STYLE-SAFE': () => renderMessage(msg('session.hostSettings.styleSafeMode')),
46
+ 'HS-LAYER-PARTS-UNREAD': (line) => line,
44
47
  };
45
48
  const KEY_NOUN = {
46
49
  'settings.hooks': 'the hooks',
@@ -366,10 +369,60 @@ function stringListOf(v) {
366
369
  function permissionMemberAdmitted(layer, read, bucket) {
367
370
  return layerAdmitted(layer, read.trust, 'permissions', bucket);
368
371
  }
372
+ function managedRulesOnly(read) {
373
+ const policyDoc = read.layers.policySettings.doc;
374
+ return MANAGED_READING_DISPOSITIONS[read.managed].ruleScope === 'by-switch' && policyDoc !== null && managedOnlySwitchOn(policyDoc);
375
+ }
376
+ const TIGHTEN_ONLY_LAYER_BUCKETS = Object.freeze(['deny', 'ask']);
377
+ function tightenOnlyBucketsRead(read, layer) {
378
+ if (managedRulesOnly(read))
379
+ return [];
380
+ const doc = read.layers[layer].doc;
381
+ return TIGHTEN_ONLY_LAYER_BUCKETS.filter((bucket) => permissionMemberAdmitted(layer, read, bucket) && permissionBucketOf(doc, bucket) !== undefined);
382
+ }
383
+ function tightenOnlyLayerPartsUnread(read, layer, permissionsRead) {
384
+ const doc = read.layers[layer].doc;
385
+ if (doc === null)
386
+ return [];
387
+ const readBuckets = permissionsRead ? tightenOnlyBucketsRead(read, layer) : [];
388
+ const parts = [];
389
+ const rec = doc;
390
+ for (const key of Object.keys(rec)) {
391
+ const v = rec[key];
392
+ if (key !== 'permissions')
393
+ appendOwnElement(parts, key);
394
+ else if (typeof v !== 'object' || v === null || Array.isArray(v))
395
+ appendOwnElement(parts, key);
396
+ else
397
+ for (const member of Object.keys(v))
398
+ if (!readBuckets.includes(member))
399
+ appendOwnElement(parts, `${key}.${member}`);
400
+ }
401
+ for (const c of read.layers[layer].carriers)
402
+ if (c.status === 'loaded-partial')
403
+ for (const k of c.issues ?? [])
404
+ if (!parts.includes(k))
405
+ appendOwnElement(parts, k);
406
+ return parts;
407
+ }
408
+ function tightenOnlyLayerNotices(read, permissionsRead) {
409
+ const out = [];
410
+ for (const layer of TIGHTEN_ONLY_HOST_SETTINGS_LAYERS) {
411
+ const snap = read.layers[layer];
412
+ if (!snap.enabled || snap.doc === null)
413
+ continue;
414
+ const parts = tightenOnlyLayerPartsUnread(read, layer, permissionsRead);
415
+ const loaded = snap.carriers.filter((c) => c.status === 'loaded' || c.status === 'loaded-partial').map((c) => c.id);
416
+ const file = (loaded.length > 0 ? loaded : snap.carriers.map((c) => c.id)).join(', ');
417
+ const n = SETTINGS_BUILD_LAYER_PARTS_UNREAD_NOTICE({ source: layer, workspace: layerAdmissionReading(read.trust), file, parts });
418
+ if (n !== undefined)
419
+ appendOwnElement(out, notice('HS-LAYER-PARTS-UNREAD', 'session', displayUntrusted(n.line)));
420
+ }
421
+ return out;
422
+ }
369
423
  function allowAdmittedFor(read) {
370
424
  const disp = MANAGED_READING_DISPOSITIONS[read.managed];
371
- const policyDoc = read.layers.policySettings.doc;
372
- const managedOnlySwitch = disp.ruleScope === 'by-switch' && policyDoc !== null && managedOnlySwitchOn(policyDoc);
425
+ const managedOnlySwitch = managedRulesOnly(read);
373
426
  const degrade = disp.ruleScope === 'degrade';
374
427
  return (layer) => {
375
428
  if (degrade || managedOnlySwitch)
@@ -386,17 +439,17 @@ function allowAdmittedFor(read) {
386
439
  };
387
440
  }
388
441
  function badPermissionsSource() {
389
- return new HostSourceShapeError(`hostTurnSettings: sources.resolved must be 'none' or { allowGrantReading, cliArg?, session?, clientOwnedServers?, serverVersion? } — since 0.101.0 the permission rules of the settings files come from the settings the entry reads; do not pass snapshot — got something else (the value is not echoed).`);
442
+ return new HostSourceShapeError(`hostTurnSettings: sources.resolved must be 'none' or { allowGrantReading, cliArg?, session?, clientOwnedServers? } — since 0.101.0 the permission rules of the settings files come from the settings the entry reads; do not pass snapshot — got something else (the value is not echoed).`);
390
443
  }
391
- function permissionsArm(src, side, adoption) {
444
+ function readPermissionSource(src) {
392
445
  const key = 'settings.resolved';
393
446
  if (src.kind === 'missing')
394
- return missingArm(key);
447
+ return { kind: 'arm', arm: missingArm(key) };
395
448
  if (src.kind === 'threw')
396
- return unreadableArm(key);
449
+ return { kind: 'arm', arm: unreadableArm(key) };
397
450
  const v = src.value;
398
451
  if (v === 'none')
399
- return noSourceArm(key);
452
+ return { kind: 'arm', arm: noSourceArm(key) };
400
453
  let allowGrantReading;
401
454
  let cliAllow;
402
455
  let cliDeny;
@@ -404,18 +457,15 @@ function permissionsArm(src, side, adoption) {
404
457
  let sesAsk;
405
458
  let owned;
406
459
  let ownedRaw;
407
- let serverVersion;
408
460
  try {
409
461
  if (!isRecordShape(v) || Object.hasOwn(v, 'snapshot') || !Object.hasOwn(v, 'allowGrantReading'))
410
462
  throw badPermissionsSource();
411
- const sver = ownDataOf(v, 'serverVersion');
412
- serverVersion = sver.ok && typeof sver.value === 'string' ? sver.value : undefined;
413
463
  const g = ownDataOf(v, 'allowGrantReading');
414
464
  const c = ownDataOf(v, 'cliArg');
415
465
  const se = ownDataOf(v, 'session');
416
466
  const o = ownDataOf(v, 'clientOwnedServers');
417
467
  if (!g.ok || !c.ok || !se.ok || !o.ok)
418
- return unreadableArm(key);
468
+ return { kind: 'arm', arm: unreadableArm(key) };
419
469
  allowGrantReading = g.value;
420
470
  const cv = c.value;
421
471
  const sv = se.value;
@@ -428,7 +478,7 @@ function permissionsArm(src, side, adoption) {
428
478
  const sd = sv === undefined ? { ok: true, value: undefined } : ownDataOf(sv, 'deny');
429
479
  const sa = sv === undefined ? { ok: true, value: undefined } : ownDataOf(sv, 'ask');
430
480
  if (!ca.ok || !cd.ok || !sd.ok || !sa.ok)
431
- return unreadableArm(key);
481
+ return { kind: 'arm', arm: unreadableArm(key) };
432
482
  cliAllow = stringListOf(ca.value);
433
483
  cliDeny = stringListOf(cd.value);
434
484
  sesDeny = stringListOf(sd.value);
@@ -439,16 +489,32 @@ function permissionsArm(src, side, adoption) {
439
489
  catch (e) {
440
490
  if (e instanceof HostSourceShapeError)
441
491
  throw e;
442
- return unreadableArm(key);
492
+ return { kind: 'arm', arm: unreadableArm(key) };
443
493
  }
444
494
  if (cliAllow === undefined || cliDeny === undefined || sesDeny === undefined || sesAsk === undefined || (owned === undefined && ownedRaw !== undefined))
445
495
  throw badPermissionsSource();
496
+ return { kind: 'facts', allowGrantReading, cliAllow, cliDeny, sesDeny, sesAsk, owned };
497
+ }
498
+ function permissionsArm(facts, side, adoption, layered) {
499
+ const key = 'settings.resolved';
500
+ if (facts.kind === 'arm')
501
+ return facts.arm;
502
+ const { allowGrantReading, cliAllow, cliDeny, sesDeny, sesAsk, owned } = facts;
446
503
  if (side.kind === 'missing')
447
504
  return missingArm(key);
448
505
  const buckets = { deny: [], ask: [], allow: [] };
449
506
  const origins = { deny: new Map(), ask: new Map(), allow: new Map() };
450
507
  const rank = (o) => WIRE_RULE_TRUST_ORDER.indexOf(o);
508
+ const contributions = { deny: [], ask: [] };
509
+ const contributed = { deny: new Set(), ask: new Set() };
451
510
  const add = (bucket, rule, origin) => {
511
+ if (bucket !== 'allow') {
512
+ const k = JSON.stringify([origin, rule]);
513
+ if (!contributed[bucket].has(k)) {
514
+ contributed[bucket].add(k);
515
+ appendOwnElement(contributions[bucket], freeze({ rule, origin }));
516
+ }
517
+ }
452
518
  const prev = origins[bucket].get(rule);
453
519
  if (prev === undefined) {
454
520
  appendOwnElement(buckets[bucket], rule);
@@ -465,7 +531,7 @@ function permissionsArm(src, side, adoption) {
465
531
  const read = side.read;
466
532
  const disp = MANAGED_READING_DISPOSITIONS[read.managed];
467
533
  const policyDoc = read.layers.policySettings.doc;
468
- const managedOnlySwitch = disp.ruleScope === 'by-switch' && policyDoc !== null && managedOnlySwitchOn(policyDoc);
534
+ const managedOnlySwitch = managedRulesOnly(read);
469
535
  const degrade = disp.ruleScope === 'degrade';
470
536
  try {
471
537
  for (const bucket of Object.keys(buckets)) {
@@ -489,6 +555,10 @@ function permissionsArm(src, side, adoption) {
489
555
  for (const r of adoption?.extraTighten[bucket] ?? [])
490
556
  if (permissionMemberAdmitted(r.layer, read, bucket))
491
557
  add(bucket, r.rule, r.layer);
558
+ for (const l of TIGHTEN_ONLY_HOST_SETTINGS_LAYERS)
559
+ for (const bucket of tightenOnlyBucketsRead(read, l))
560
+ for (const r of permissionRulesOf(read.layers[l].doc, bucket))
561
+ add(bucket, r, l);
492
562
  }
493
563
  }
494
564
  catch (error) {
@@ -504,7 +574,7 @@ function permissionsArm(src, side, adoption) {
504
574
  let declared;
505
575
  if (projectionError === undefined) {
506
576
  try {
507
- const d = projectPermissionsDeclaration({ deny: buckets.deny, ask: buckets.ask, allow: buckets.allow, origins, cliDeny, settingsRead: 'clean', ...(owned !== undefined && owned.length > 0 ? { clientOwnedServers: owned } : {}), ...(serverVersion !== undefined ? { serverVersion } : {}) }, allowGrantReading, portsProjection);
577
+ const d = projectPermissionsDeclaration({ deny: buckets.deny, ask: buckets.ask, allow: buckets.allow, origins, cliDeny, settingsRead: 'clean', ...(owned !== undefined && owned.length > 0 ? { clientOwnedServers: owned } : {}) }, allowGrantReading, portsProjection, layered ? freeze({ deny: freeze([...contributions.deny]), ask: freeze([...contributions.ask]) }) : undefined);
508
578
  declared = d.permissions !== undefined ? { permissions: d.permissions } : undefined;
509
579
  }
510
580
  catch (error) {
@@ -567,8 +637,11 @@ function notLoadedLayers(read, plan) {
567
637
  }
568
638
  return out;
569
639
  }
640
+ const isTightenOnlyLayer = (l) => TIGHTEN_ONLY_HOST_SETTINGS_LAYERS.includes(l);
570
641
  function notLoadedSentence(n, form) {
571
642
  const layer = msg(`session.hostSettings.layer.${n.layer}`);
643
+ if (isTightenOnlyLayer(n.layer))
644
+ return renderMessage(msg(form === 'hold' ? 'session.hostSettings.layerNotLoaded.restrictions.hold' : 'session.hostSettings.layerNotLoaded.restrictions.sent', { layer }));
572
645
  return renderMessage(msg(form === 'hold' ? `session.hostSettings.layerNotLoaded.hold.${n.how}` : 'session.hostSettings.layerNotLoaded.sent.unreadable', { layer }));
573
646
  }
574
647
  function settingsSideOf(input) {
@@ -615,10 +688,12 @@ export function buildHostTurnSettings(input, judges) {
615
688
  if (rawSide.kind === 'read')
616
689
  for (const line of rawSide.read.debug)
617
690
  hostLog('debug', line);
618
- const adoption = rawSide.kind === 'read' ? adoptHostSettingsRead(rawSide.read, session, allowAdmittedFor(rawSide.read)) : undefined;
691
+ const permissionSource = readPermissionSource(read('resolved'));
692
+ const layeredRules = permissionSource.kind === 'facts' && permissionRuleLayersOn(permissionSource.allowGrantReading);
693
+ const adoption = rawSide.kind === 'read' ? adoptHostSettingsRead(rawSide.read, session, allowAdmittedFor(rawSide.read), layeredRules) : undefined;
619
694
  const side = adoption !== undefined ? { kind: 'read', read: adoption.read } : rawSide;
620
695
  const nextSession = adoption?.session ?? remintSameContent(session);
621
- const resolvedArm = permissionsArm(read('resolved'), side, adoption);
696
+ const resolvedArm = permissionsArm(permissionSource, side, adoption, layeredRules);
622
697
  let resolvedCarried = resolvedArm.carried;
623
698
  let resolvedError;
624
699
  if (resolvedCarried !== undefined) {
@@ -660,17 +735,19 @@ export function buildHostTurnSettings(input, judges) {
660
735
  if (notLoaded.length > 0) {
661
736
  const key = `hs1-${fnv1a(JSON.stringify(notLoaded.map((n) => n.key)))}`;
662
737
  const ask = surface === 'interactive' && !session.consented.includes(key);
663
- const layers = freeze(notLoaded.map((n) => n.layer));
664
- const cause = notLoaded.some((n) => n.how === 'unreadable') ? 'source_unreadable' : 'source_rejected';
665
- const reshape = (a) => {
738
+ const reshape = (a, feeds) => {
666
739
  const d = a.row.disposition;
667
740
  if (d === 'refuse_turn' || d === 'unwired' || a.row.cause === 'no_source')
668
741
  return a;
742
+ const mine = notLoaded.filter((n) => feeds(n.layer));
743
+ if (mine.length === 0)
744
+ return a;
745
+ const cause = mine.some((n) => n.how === 'unreadable') ? 'source_unreadable' : 'source_rejected';
669
746
  const disposition = ask ? 'hold_for_consent' : a.carried !== undefined ? 'carry_partial' : 'withhold_notice';
670
- return { ...a, row: freeze({ key: a.row.key, cause, disposition, layers }) };
747
+ return { ...a, row: freeze({ key: a.row.key, cause, disposition, layers: freeze(mine.map((n) => n.layer)) }) };
671
748
  };
672
749
  const before = armsByKey;
673
- armsByKey = [{ ...reshape(before[0]), ...(hooks.plan !== undefined ? { plan: hooks.plan } : {}) }, reshape(before[1]), before[2], before[3], before[4], before[5]];
750
+ armsByKey = [{ ...reshape(before[0], (l) => !isTightenOnlyLayer(l)), ...(hooks.plan !== undefined ? { plan: hooks.plan } : {}) }, reshape(before[1], () => true), before[2], before[3], before[4], before[5]];
674
751
  if (ask && armsByKey.slice(0, 2).some((a) => a.row.disposition === 'hold_for_consent'))
675
752
  consentKey = key;
676
753
  for (const n of notLoaded) {
@@ -690,7 +767,11 @@ export function buildHostTurnSettings(input, judges) {
690
767
  }
691
768
  const arms = armsByKey;
692
769
  const rows = freeze(arms.map((a) => a.row));
693
- const notices = freeze([...arms.flatMap((a) => a.notices), ...notLoadedNotices, ...heldNotices]);
770
+ const resolvedOut = arms[1]?.row.disposition === 'carry' || arms[1]?.row.disposition === 'carry_partial' || arms[1]?.row.disposition === 'hold_for_consent' ? resolvedCarried : undefined;
771
+ const permissionsRow = arms[1]?.row;
772
+ const permissionsRead = permissionsRow !== undefined && permissionsRow.disposition !== 'refuse_turn' && permissionsRow.disposition !== 'unwired' && permissionsRow.cause !== 'no_source';
773
+ const partsNotices = side.kind === 'read' ? tightenOnlyLayerNotices(side.read, permissionsRead) : [];
774
+ const notices = freeze([...arms.flatMap((a) => a.notices), ...notLoadedNotices, ...heldNotices, ...partsNotices]);
694
775
  const refusal = arms.find((a) => a.row.disposition === 'refuse_turn');
695
776
  const verdict = refusal !== undefined
696
777
  ? freeze({ kind: 'refuse', notice: refusal.notices[0] ?? notices.find((n) => n.plane === 'turn') ?? notice('HS-PROJECTION', 'turn') })
@@ -702,7 +783,6 @@ export function buildHostTurnSettings(input, judges) {
702
783
  return a.row.disposition === 'carry' || a.row.disposition === 'carry_partial' || a.row.disposition === 'hold_for_consent' ? a.carried : undefined;
703
784
  };
704
785
  const hooksCarried = carriedOf(0);
705
- const resolvedOut = arms[1]?.row.disposition === 'carry' || arms[1]?.row.disposition === 'carry_partial' || arms[1]?.row.disposition === 'hold_for_consent' ? resolvedCarried : undefined;
706
786
  const carried = freeze({
707
787
  ...(hooksCarried !== undefined ? { hooks: hooksCarried } : {}),
708
788
  ...(resolvedOut !== undefined ? { resolved: resolvedOut } : {}),
@@ -122,6 +122,11 @@ declare const EN: {
122
122
  'session.devices.probeFailedTransport': string;
123
123
  'session.devices.probeFailedRefused': string;
124
124
  'session.devices.probeFailedUnreadable': string;
125
+ 'session.engine.selfNotLocal': string;
126
+ 'session.engine.dispatch.notWired': string;
127
+ 'session.engine.dispatch.scopeMismatch': string;
128
+ 'session.engine.dispatch.scopeUnproven': string;
129
+ 'session.engine.dispatch.unresolved': string;
125
130
  'config.cloudLogin.accessDenied': string;
126
131
  'config.cloudLogin.expiredToken': string;
127
132
  'config.cloudLogin.invalidGrant': string;
@@ -141,6 +146,7 @@ declare const EN: {
141
146
  'config.engineTarget.loginFailed': string;
142
147
  'config.engineTarget.storageUnavailable': string;
143
148
  'config.engineTarget.noLocalRuntime': string;
149
+ 'config.engineTarget.serverBelowSupportFloor': string;
144
150
  'config.engineTarget.input': string;
145
151
  'config.engineTarget.unknown': string;
146
152
  'onboard.probe.endpointReachable': string;
@@ -187,6 +193,8 @@ declare const EN: {
187
193
  'config.mcp.nameReserved': string;
188
194
  'config.mcp.identityHeadersBothSet': string;
189
195
  'config.mcp.transportUnreadable': string;
196
+ 'config.mcp.transportNotAdvertised': string;
197
+ 'config.mcp.transportsNone': string;
190
198
  'config.mcp.transportInvalid': string;
191
199
  'config.mcp.transportDegraded': string;
192
200
  'config.mcp.toolAxesInvalid': string;
@@ -238,6 +246,7 @@ declare const EN: {
238
246
  'approval.settle.cause.broadcastLost': string;
239
247
  'approval.settle.cause.streamDisconnected': string;
240
248
  'approval.settle.cause.undeliverable': string;
249
+ 'approval.decide.requiresBinding': string;
241
250
  'approval.decision.grantChanged': string;
242
251
  'approval.decision.settledElsewhereContrary.deniedFirst': string;
243
252
  'approval.decision.settledElsewhereContrary.approvedFirst': string;
@@ -293,6 +302,13 @@ declare const EN: {
293
302
  'session.crashConverged.cause.neutral': string;
294
303
  'session.crashConverged.cause.withClause': string;
295
304
  'session.corrupt.content': string;
305
+ 'session.projectSeed.invalid': string;
306
+ 'session.projectSeed.invalidAt': string;
307
+ 'session.projectSeed.laneNotIsolated': string;
308
+ 'session.projectSeed.seedFixed': string;
309
+ 'session.projectSeed.boundElsewhere': string;
310
+ 'session.projectSeed.laneUnknown': string;
311
+ 'session.projectSeed.missing': string;
296
312
  'resume.reopen.first.envFailed': string;
297
313
  'resume.reopen.first.toolUnavailable': string;
298
314
  'resume.reopen.first.toolContractMismatch': string;
@@ -392,6 +408,8 @@ declare const EN: {
392
408
  'session.selfHeal.injected.handedOffWatch': string;
393
409
  'session.selfHeal.injected.interruptedFinishing': string;
394
410
  'session.selfHeal.injected.notDelivered': string;
411
+ 'session.selfHeal.injected.redundant': string;
412
+ 'session.selfHeal.injected.deferred': string;
395
413
  'session.selfHeal.decisionInFlight': string;
396
414
  'session.selfHeal.parkedOn.ask': string;
397
415
  'session.selfHeal.parkedOn.plan': string;
@@ -543,10 +561,28 @@ declare const EN: {
543
561
  'approval.boundGrants.denyPart.one': string;
544
562
  'approval.boundGrants.denyPart.other': string;
545
563
  'approval.boundGrants.activates': string;
564
+ 'approval.boundGrants.allowPart.named.one': string;
565
+ 'approval.boundGrants.allowPart.named.other': string;
566
+ 'approval.boundGrants.denyPart.named.one': string;
567
+ 'approval.boundGrants.denyPart.named.other': string;
568
+ 'approval.boundGrants.more': string;
546
569
  'session.fileHistoryRefusal.notYet': string;
547
570
  'session.fileHistoryRefusal.notSaid': string;
548
571
  'session.fileHistoryRefusal.unrecognized': string;
549
572
  'session.fileHistoryRefusal.unreadable': string;
573
+ 'session.memoryErase.personalStoreUnjudged': string;
574
+ 'session.memorySync.parked.one': string;
575
+ 'session.memorySync.parked.other': string;
576
+ 'session.memorySync.parkedUnnamed.one': string;
577
+ 'session.memorySync.parkedUnnamed.other': string;
578
+ 'session.memorySync.wayOut.deleteCursor': string;
579
+ 'session.memorySync.wayOut.unrecognized': string;
580
+ 'session.memorySyncTrigger.notConfigured': string;
581
+ 'session.memorySyncTrigger.noSettledRun': string;
582
+ 'session.memorySyncTrigger.runUnobserved': string;
583
+ 'session.memorySyncTrigger.memoryNotMounted': string;
584
+ 'session.memorySyncTrigger.noLeaf': string;
585
+ 'session.memorySyncTrigger.unobtainable': string;
550
586
  'session.hostSettings.memorySwitchMalformed': string;
551
587
  'session.hostSettings.fileHistoryRestoreConflict': string;
552
588
  'session.hostSettings.projectionUnchecked': string;
@@ -556,11 +592,14 @@ declare const EN: {
556
592
  'session.hostSettings.layerNotLoaded.hold.unreadable': string;
557
593
  'session.hostSettings.layerNotLoaded.hold.rejected': string;
558
594
  'session.hostSettings.layerNotLoaded.sent.unreadable': string;
595
+ 'session.hostSettings.layerNotLoaded.restrictions.hold': string;
596
+ 'session.hostSettings.layerNotLoaded.restrictions.sent': string;
559
597
  'session.hostSettings.layer.policySettings': string;
560
598
  'session.hostSettings.layer.userSettings': string;
561
599
  'session.hostSettings.layer.projectSettings': string;
562
600
  'session.hostSettings.layer.localSettings': string;
563
601
  'session.hostSettings.layer.flagSettings': string;
602
+ 'session.hostSettings.layer.foreignProjectSettings': string;
564
603
  'session.hostSettings.heldPrevious': string;
565
604
  'session.hostSettings.styleMissing': string;
566
605
  'session.hostSettings.styleSafeMode': string;
@@ -594,7 +633,6 @@ declare const EN: {
594
633
  'rules.refusal.list.more': string;
595
634
  'rules.refusal.reason.toolName': string;
596
635
  'rules.refusal.reason.homePath': string;
597
- 'rules.refusal.reason.neverMatches': string;
598
636
  'rules.nearMiss.sentence.one': string;
599
637
  'rules.nearMiss.sentence.other': string;
600
638
  'rules.nearMiss.reason': string;
@@ -670,6 +708,18 @@ declare const EN: {
670
708
  'session.steerRefusal.advice': string;
671
709
  'session.steerRefusal.hostQueue.queued': string;
672
710
  'session.steerRefusal.hostQueue.dropped': string;
711
+ 'session.permissionModeSwitch.applied': string;
712
+ 'session.permissionModeSwitch.folded': string;
713
+ 'session.permissionModeSwitch.reason.entryFloor': string;
714
+ 'session.permissionModeSwitch.reason.disableAutoMode': string;
715
+ 'session.permissionModeSwitch.reason.engine': string;
716
+ 'session.permissionModeSwitch.notPersisted': string;
717
+ 'session.permissionModeSwitch.notRunning': string;
718
+ 'session.permissionModeSwitch.notFound': string;
719
+ 'session.permissionModeSwitch.refused': string;
720
+ 'session.permissionModeSwitch.refusedWithCode': string;
721
+ 'session.permissionModeSwitch.unconfirmed': string;
722
+ 'session.permissionModeSwitch.unavailable': string;
673
723
  'notice.capability.subject.userInvokedSkills': string;
674
724
  'notice.capability.subject.skillToolLists': string;
675
725
  'notice.capability.subject.permissionRulesWrite': string;
@@ -713,17 +763,6 @@ declare const EN: {
713
763
  'notice.capability.hands.unknownRosterUnreadable': string;
714
764
  'notice.capability.hands.unknownMountConditionAbsent': string;
715
765
  'rules.sessionPolicy.tighten.written': string;
716
- 'rules.sessionPolicy.tighten.writtenBeforeFirstRule.counts': string;
717
- 'rules.sessionPolicy.tighten.writtenBeforeFirstRule.unreadable': string;
718
- 'rules.sessionPolicy.tighten.writtenBeforeFirstRule.unseen': string;
719
- 'rules.sessionPolicy.tighten.writtenBeforeFirstRule.agents.one': string;
720
- 'rules.sessionPolicy.tighten.writtenBeforeFirstRule.agents.many': string;
721
- 'rules.sessionPolicy.tighten.writtenBeforeFirstRule.workflows.one': string;
722
- 'rules.sessionPolicy.tighten.writtenBeforeFirstRule.workflows.many': string;
723
- 'rules.sessionPolicy.tighten.writtenBeforeFirstRule.untracked.one': string;
724
- 'rules.sessionPolicy.tighten.writtenBeforeFirstRule.untracked.many': string;
725
- 'rules.sessionPolicy.tighten.writtenBeforeFirstRule.list.two': string;
726
- 'rules.sessionPolicy.tighten.writtenBeforeFirstRule.list.three': string;
727
766
  'rules.sessionPolicy.tighten.conflict': string;
728
767
  'rules.sessionPolicy.tighten.loosenForbidden': string;
729
768
  'rules.sessionPolicy.tighten.capabilityAbsent': string;
@@ -1053,6 +1092,40 @@ declare const EN: {
1053
1092
  'config.mods.refusal.by': string;
1054
1093
  'config.mods.rewrite.resultInPlace': string;
1055
1094
  'config.mods.rewrite.inputBy': string;
1095
+ 'follow.notFollowed.headRun': string;
1096
+ 'follow.notFollowed.headTurn': string;
1097
+ 'follow.notFollowed.reason.exhaustedDraining': string;
1098
+ 'follow.notFollowed.reason.exhaustedConnectionLost': string;
1099
+ 'follow.notFollowed.reason.exhaustedStreamCap': string;
1100
+ 'follow.notFollowed.reason.exhausted': string;
1101
+ 'follow.notFollowed.reason.badInput': string;
1102
+ 'follow.notFollowed.reason.noRunId': string;
1103
+ 'follow.notFollowed.reason.runUnknown': string;
1104
+ 'follow.notFollowed.reason.unspecified': string;
1105
+ 'follow.notFollowed.endingUnknown': string;
1106
+ 'follow.notFollowed.exit.reattach': string;
1107
+ 'follow.notFollowed.exit.checkRuns': string;
1108
+ 'follow.notFollowed.exit.runUnknown': string;
1109
+ 'follow.notFollowed.idleTear': string;
1110
+ 'follow.notFollowed.idleGrace': string;
1111
+ 'approval.planReview.note.empty': string;
1112
+ 'approval.planReview.note.marked': string;
1113
+ 'approval.planReview.note.tooLarge': string;
1114
+ 'approval.planReview.note.notCarried': string;
1115
+ 'approval.planReview.note.unknown': string;
1116
+ 'approval.planReview.askAgain.shown': string;
1117
+ 'approval.planReview.askAgain.marked': string;
1118
+ 'approval.planReview.askAgain.tooLarge': string;
1119
+ 'approval.planReview.askAgain.notCarried': string;
1120
+ 'approval.planReview.askAgain.unknown': string;
1121
+ 'approval.planReview.askAgain.withNote': string;
1122
+ 'approval.planReview.decision.notSent': string;
1123
+ 'approval.planReview.decision.refused': string;
1124
+ 'approval.planReview.decision.cardMissing': string;
1125
+ 'approval.planReview.decision.gateMoved': string;
1126
+ 'approval.planReview.decision.gateUntrusted': string;
1127
+ 'approval.planReview.option.askAgain.label': string;
1128
+ 'approval.planReview.option.askAgain.description': string;
1056
1129
  };
1057
1130
  export declare const EN_MESSAGES: Readonly<typeof EN>;
1058
1131
  export type MessageKey = keyof typeof EN;