@sema-agent/client-core 0.99.0 → 0.100.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 (128) hide show
  1. package/CHANGELOG.md +177 -0
  2. package/README.md +32 -19
  3. package/dist/adapt/arms.js +60 -36
  4. package/dist/adapt/panelTasks.d.ts +2 -1
  5. package/dist/adapt/panelTasks.js +32 -9
  6. package/dist/adapt/textStream.d.ts +1 -1
  7. package/dist/adapt/textStream.js +51 -28
  8. package/dist/adapter/activeRunSelfHeal.d.ts +7 -0
  9. package/dist/adapter/activeRunSelfHeal.js +58 -11
  10. package/dist/adapter/downstream/eventToSdkMessage.d.ts +25 -6
  11. package/dist/adapter/downstream/eventToSdkMessage.js +125 -9
  12. package/dist/adapter/downstream/terminalToSdkResult.js +10 -0
  13. package/dist/adapter/downstream/wiringManifestView.d.ts +3 -1
  14. package/dist/adapter/downstream/wiringManifestView.js +1 -0
  15. package/dist/adapter/runStream.js +32 -5
  16. package/dist/adapter/types.d.ts +2 -0
  17. package/dist/agentsWireCaps.d.ts +7 -0
  18. package/dist/agentsWireCaps.js +100 -15
  19. package/dist/cloudConfigWireCaps.d.ts +10 -1
  20. package/dist/cloudConfigWireCaps.js +156 -62
  21. package/dist/compactionStatus.d.ts +34 -0
  22. package/dist/compactionStatus.js +196 -0
  23. package/dist/decideFailureNote.js +3 -3
  24. package/dist/displayUntrusted.js +150 -5
  25. package/dist/engineAgentPanelStore.d.ts +7 -4
  26. package/dist/engineErrorCodes.d.ts +9 -1
  27. package/dist/engineErrorCodes.js +9 -5
  28. package/dist/engineRowRef.js +1 -0
  29. package/dist/engineToolDirectory.d.ts +3 -0
  30. package/dist/engineToolDirectory.js +4 -2
  31. package/dist/eventLeg.d.ts +1 -7
  32. package/dist/eventLeg.js +7 -8
  33. package/dist/fileHistoryCaptureCapability.d.ts +0 -3
  34. package/dist/fileHistoryCaptureCapability.js +0 -4
  35. package/dist/generated/engineFactTables.d.ts +1 -0
  36. package/dist/generated/engineFactTables.js +27 -0
  37. package/dist/generated/engineNoticeTables.js +3 -0
  38. package/dist/generated/settingsSchemaFns.d.ts +12 -0
  39. package/dist/generated/settingsSchemaFns.js +13 -0
  40. package/dist/generated/settingsSchemaMcpRequestEntry.d.ts +1 -0
  41. package/dist/generated/settingsSchemaMcpRequestEntry.js +162 -0
  42. package/dist/generated/settingsSchemaTables.d.ts +1 -0
  43. package/dist/generated/settingsSchemaTables.js +5 -0
  44. package/dist/generated/settingsSchemaTypes.d.ts +28 -0
  45. package/dist/hitl/allowRuleShadow.js +2 -2
  46. package/dist/hitl/approvalCardReasons.js +2 -2
  47. package/dist/hitl/approvalHolds.d.ts +14 -0
  48. package/dist/hitl/approvalHolds.js +41 -0
  49. package/dist/hitl/askClassPair.d.ts +2 -2
  50. package/dist/hitl/askClassPair.js +2 -2
  51. package/dist/hitl/attributionLadder.d.ts +23 -0
  52. package/dist/hitl/attributionLadder.js +67 -0
  53. package/dist/hitl/decisionLedger.d.ts +55 -0
  54. package/dist/hitl/decisionLedger.js +156 -0
  55. package/dist/hitl/decisionRefusal.d.ts +1 -0
  56. package/dist/hitl/decisionRefusal.js +1 -1
  57. package/dist/hitl/decisionSend.d.ts +113 -0
  58. package/dist/hitl/decisionSend.js +579 -0
  59. package/dist/hitl/hitlBridge.js +18 -6
  60. package/dist/hitl/planReviewWire.js +45 -76
  61. package/dist/hitl/sessionPolicyDeliverable.js +3 -6
  62. package/dist/hitl/toolApprovalWire.js +43 -109
  63. package/dist/hostTurnSettings.d.ts +46 -7
  64. package/dist/hostTurnSettings.js +408 -7
  65. package/dist/humanTurn.d.ts +2 -1
  66. package/dist/humanTurn.js +3 -3
  67. package/dist/i18n/messages.en.d.ts +131 -0
  68. package/dist/i18n/messages.en.js +143 -12
  69. package/dist/i18n/messages.zh.js +148 -12
  70. package/dist/index.d.ts +18 -2
  71. package/dist/index.js +10 -1
  72. package/dist/inheritEnvCapability.d.ts +1 -0
  73. package/dist/inheritEnvCapability.js +9 -2
  74. package/dist/inheritEnvWire.js +2 -2
  75. package/dist/injectionLaneNotice.d.ts +5 -0
  76. package/dist/injectionLaneNotice.js +46 -0
  77. package/dist/mcpPanel.js +2 -0
  78. package/dist/mcpReconnect.js +2 -2
  79. package/dist/mcpToolToggles.d.ts +6 -0
  80. package/dist/mcpToolToggles.js +46 -0
  81. package/dist/mcpWireCaps.d.ts +10 -4
  82. package/dist/mcpWireCaps.js +106 -71
  83. package/dist/mcpWireTransport.d.ts +4 -0
  84. package/dist/mcpWireTransport.js +18 -0
  85. package/dist/modelCapabilityProbe.d.ts +2 -1
  86. package/dist/modelCapabilityProbe.js +10 -9
  87. package/dist/modelIdentityResolvability.d.ts +2 -0
  88. package/dist/modelIdentityResolvability.js +23 -5
  89. package/dist/ownKey.d.ts +26 -0
  90. package/dist/ownKey.js +75 -0
  91. package/dist/panelReduce.d.ts +5 -0
  92. package/dist/panelReduce.js +45 -13
  93. package/dist/panelStateHolder.d.ts +1 -0
  94. package/dist/panelStateHolder.js +10 -1
  95. package/dist/permissionRuleIssue.d.ts +2 -1
  96. package/dist/permissionRuleIssue.js +22 -21
  97. package/dist/pluginHooksWire.js +12 -10
  98. package/dist/prepareRefusal.d.ts +8 -0
  99. package/dist/prepareRefusal.js +72 -0
  100. package/dist/request/taskRequest.d.ts +10 -10
  101. package/dist/request/taskRequest.js +106 -65
  102. package/dist/resumeRefusalCopy.d.ts +3 -1
  103. package/dist/resumeRefusalCopy.js +22 -4
  104. package/dist/retryStatus.d.ts +18 -0
  105. package/dist/retryStatus.js +76 -19
  106. package/dist/ruleRefusalSentence.d.ts +4 -0
  107. package/dist/ruleRefusalSentence.js +58 -0
  108. package/dist/sandboxWire.d.ts +2 -1
  109. package/dist/sandboxWire.js +55 -21
  110. package/dist/scenarioRefusal.d.ts +2 -1
  111. package/dist/scenarioRefusal.js +5 -5
  112. package/dist/seam.d.ts +24 -9
  113. package/dist/seam.js +44 -4
  114. package/dist/seatContract.d.ts +16 -8
  115. package/dist/seatContract.js +21 -6
  116. package/dist/settingsCredentialKeyPaths.d.ts +8 -0
  117. package/dist/settingsCredentialKeyPaths.js +219 -0
  118. package/dist/skillsWireCaps.d.ts +0 -3
  119. package/dist/skillsWireCaps.js +1 -2
  120. package/dist/subagentContentStore.d.ts +1 -0
  121. package/dist/subagentContentStore.js +135 -27
  122. package/dist/toolsFlagNames.d.ts +8 -0
  123. package/dist/toolsFlagNames.js +110 -0
  124. package/dist/turnFailurePresentation.js +15 -7
  125. package/dist/wireRefusalCopy.d.ts +51 -17
  126. package/dist/wireRefusalCopy.js +298 -135
  127. package/docs/INTEGRATION-CLIENTS.md +423 -26
  128. package/package.json +4 -4
@@ -44,6 +44,7 @@ export const PLAN_REVIEW_STATES = Object.freeze(['needs_review']);
44
44
  export const ASK_PARK_STATES = Object.freeze(['suspended']);
45
45
  export const RUNNING_STATES = Object.freeze(['running']);
46
46
  export const CLAIM_HELD_STATES = SDK_RUN_LIVE_STATUSES;
47
+ export const PLAN_REVIEW_REOPEN_REFUSALS = Object.freeze(['invalid_call', 'no_delivery_path', 'not_presented', 'gate_record_gone', 'internal_error']);
47
48
  export function selfHealSubmissionDisposition(outcome) {
48
49
  switch (outcome.kind) {
49
50
  case 'decision-pending':
@@ -790,7 +791,22 @@ async function runningChoiceArm(taskId, status, busy, statusFromWire, runs, deps
790
791
  return { kind: 'running-steered', taskId, delivery, status: receiptStatus, reopened: null };
791
792
  }
792
793
  catch (e) {
793
- return { kind: 'running-steer-failed', taskId, detail: describeFailure(e), delivery: atMostOnceFailureClass(e) };
794
+ const delivery = atMostOnceFailureClass(e);
795
+ const errorCode = failureWireCode(e);
796
+ let runStatus;
797
+ if (delivery === 'rejected' && errorCode === STEER_NOT_RUNNING_CODE && typeof runs.get === 'function' && !probeCallerAborted()) {
798
+ const probe = await probeRunStatusOnce(taskId, runs, runs.get, deps);
799
+ if (probe.status !== null)
800
+ runStatus = probe.status;
801
+ }
802
+ return {
803
+ kind: 'running-steer-failed',
804
+ taskId,
805
+ detail: describeFailure(e),
806
+ delivery,
807
+ ...(errorCode !== undefined ? { errorCode } : {}),
808
+ ...(runStatus !== undefined ? { runStatus } : {}),
809
+ };
794
810
  }
795
811
  }
796
812
  if (choice === 'cancel' && canCancel && runs?.cancel !== undefined && runs.get !== undefined) {
@@ -839,6 +855,34 @@ const say = (lang, key, params) => renderMessage(msg(key, params), lang);
839
855
  function gateKindPhrase(kind, lang) {
840
856
  return kind ? say(lang, 'session.selfHeal.gate.kind', { kind }) : say(lang, 'session.selfHeal.gate.generic');
841
857
  }
858
+ function endRunClause(copy, taskId, lang) {
859
+ let host;
860
+ try {
861
+ host = copy?.endRun;
862
+ }
863
+ catch {
864
+ host = undefined;
865
+ }
866
+ const phrase = typeof host === 'string' ? host.trim().replace(/[\s.;。;!!??]+$/u, '') : '';
867
+ if (/[\p{L}\p{N}]/u.test(phrase))
868
+ return phrase;
869
+ return say(lang, 'session.selfHeal.endRun.engine', { cancelPath: `POST /v1/runs/${taskId ? taskId : '<id>'}/cancel` });
870
+ }
871
+ function wakeSessionClause(copy, lang) {
872
+ let host;
873
+ try {
874
+ host = copy?.wakeSession;
875
+ }
876
+ catch {
877
+ host = undefined;
878
+ }
879
+ if (host === null)
880
+ return '';
881
+ if (typeof host === 'string' && host.trim().length > 0)
882
+ return say(lang, 'session.selfHeal.wakeOn.host', { where: host.trim() });
883
+ return say(lang, 'session.selfHeal.wakeOn.engine');
884
+ }
885
+ const STEER_NOT_RUNNING_CODE = 'steering.not_running';
842
886
  function decidePathClause(signal, lang) {
843
887
  const decidePath = signal?.pendingGate?.decidePath;
844
888
  if (!decidePath)
@@ -869,7 +913,7 @@ export function activeRunSelfHealRow(outcome, signal, copy, origin, follow, lang
869
913
  (outcome.kind !== 'plan-review-reopen-failed' || outcome.dismissedByUser !== true)
870
914
  ? keepSessionWayOutOf(copy)
871
915
  : null;
872
- const base = activeRunSelfHealBaseRow(outcome, copy?.wayOut ?? say(lang, 'session.selfHeal.wayOut.interactive'), following, keep, engineDecide, lang);
916
+ const base = activeRunSelfHealBaseRow(outcome, copy?.wayOut ?? say(lang, 'session.selfHeal.wayOut.interactive'), following, keep, engineDecide, lang, copy);
873
917
  const viaEngine = engineDecide ? decidePathClause(signal, lang) : '';
874
918
  switch (outcome.kind) {
875
919
  case 'not-parked':
@@ -953,7 +997,7 @@ function keepSessionWayOutOf(copy) {
953
997
  return null;
954
998
  }
955
999
  }
956
- function activeRunSelfHealBaseRow(outcome, wayOut, following = false, keepSessionWayOut = null, engineDecide = true, lang) {
1000
+ function activeRunSelfHealBaseRow(outcome, wayOut, following = false, keepSessionWayOut = null, engineDecide = true, lang, copy) {
957
1001
  switch (outcome.kind) {
958
1002
  case 'decision-pending':
959
1003
  return say(lang, 'session.selfHeal.row.decisionPending', { handle: outcome.taskId ? msg('session.selfHeal.handle.run', { taskId: outcome.taskId }) : '' });
@@ -1021,7 +1065,7 @@ function activeRunSelfHealBaseRow(outcome, wayOut, following = false, keepSessio
1021
1065
  return say(lang, 'session.selfHeal.row.steered.queued', { taskId, parked, next, textOnly });
1022
1066
  }
1023
1067
  if (outcome.delivery === 'parked_for_wake') {
1024
- return say(lang, 'session.selfHeal.row.steered.parkedForWake', { taskId, textOnly });
1068
+ return say(lang, 'session.selfHeal.row.steered.parkedForWake', { taskId, textOnly, wakeOn: wakeSessionClause(copy, lang) });
1025
1069
  }
1026
1070
  return say(lang, 'session.selfHeal.row.steered.unknown', {
1027
1071
  taskId,
@@ -1031,6 +1075,9 @@ function activeRunSelfHealBaseRow(outcome, wayOut, following = false, keepSessio
1031
1075
  });
1032
1076
  }
1033
1077
  case 'running-steer-failed':
1078
+ if (outcome.delivery === 'rejected' && outcome.errorCode === STEER_NOT_RUNNING_CODE && outcome.runStatus !== undefined && isSdkRunTerminal(outcome.runStatus)) {
1079
+ return say(lang, 'session.selfHeal.row.steerFailed.runEnded', { taskId: outcome.taskId, status: outcome.runStatus });
1080
+ }
1034
1081
  return outcome.delivery === 'rejected'
1035
1082
  ? say(lang, 'session.selfHeal.row.steerFailed.rejected', { taskId: outcome.taskId, detail: outcome.detail })
1036
1083
  : say(lang, 'session.selfHeal.row.steerFailed.unknown', { taskId: outcome.taskId, detail: outcome.detail });
@@ -1078,15 +1125,15 @@ function activeRunSelfHealBaseRow(outcome, wayOut, following = false, keepSessio
1078
1125
  return say(lang, 'session.selfHeal.row.cancelFailed.rejected', { taskId: outcome.taskId, detail: outcome.detail, wayOut });
1079
1126
  case 'stale-park-wait':
1080
1127
  return outcome.alreadyOffered === true
1081
- ? say(lang, 'session.selfHeal.row.stale.wait.offered', { taskId: outcome.taskId, status: outcome.status, wayOut })
1082
- : say(lang, 'session.selfHeal.row.stale.wait.first', { taskId: outcome.taskId, status: outcome.status, wayOut });
1128
+ ? say(lang, 'session.selfHeal.row.stale.wait.offered', { taskId: outcome.taskId, status: outcome.status, wayOut, endRun: endRunClause(copy, outcome.taskId, lang) })
1129
+ : say(lang, 'session.selfHeal.row.stale.wait.first', { taskId: outcome.taskId, status: outcome.status, wayOut, endRun: endRunClause(copy, outcome.taskId, lang) });
1083
1130
  case 'running-not-found':
1084
1131
  return say(lang, 'session.selfHeal.row.runNotFound', { taskId: outcome.taskId, wayOut });
1085
1132
  case 'running-settled':
1086
1133
  return say(lang, 'session.selfHeal.row.runSettled', { taskId: outcome.taskId, status: outcome.status, wayOut });
1087
1134
  case 'not-parked':
1088
1135
  if (outcome.alreadyOffered === true) {
1089
- return say(lang, 'session.selfHeal.row.notParked.offered', { taskId: outcome.taskId, status: outcome.status, wayOut });
1136
+ return say(lang, 'session.selfHeal.row.notParked.offered', { taskId: outcome.taskId, status: outcome.status, wayOut, endRun: endRunClause(copy, outcome.taskId, lang) });
1090
1137
  }
1091
1138
  const parkedOn = outcome.pendingGateKind !== undefined
1092
1139
  ? gateKindPhrase(outcome.pendingGateKind, lang)
@@ -1111,7 +1158,7 @@ export function activeRunBusyHeadlessRow(signal, copy, lang) {
1111
1158
  return override;
1112
1159
  const activeTaskId = signal.activeTaskId;
1113
1160
  const handle = activeTaskId ? msg('session.selfHeal.handle.run', { taskId: activeTaskId }) : '';
1114
- const cancelPath = `POST /v1/runs/${activeTaskId ?? '<id>'}/cancel`;
1161
+ const endRun = endRunClause(copy, activeTaskId, lang);
1115
1162
  const status = signal.activeTaskStatus;
1116
1163
  const decidePath = signal.pendingGate?.decidePath ?? null;
1117
1164
  const hostFresh = copy?.freshSession ?? undefined;
@@ -1122,13 +1169,13 @@ export function activeRunBusyHeadlessRow(signal, copy, lang) {
1122
1169
  status: status ? msg('session.selfHeal.headless.status', { status }) : '',
1123
1170
  gate: gateKindPhrase(signal.pendingGate?.kind, lang),
1124
1171
  decidePath,
1125
- cancelPath,
1172
+ endRun,
1126
1173
  freshSession,
1127
1174
  governance: governanceOriginClause(signal, lang),
1128
1175
  });
1129
1176
  }
1130
1177
  if (status)
1131
- return say(lang, 'session.selfHeal.headless.statusOnly', { handle, status, cancelPath, freshSession });
1178
+ return say(lang, 'session.selfHeal.headless.statusOnly', { handle, status, endRun, freshSession });
1132
1179
  const startOver = hostFresh !== undefined ? `${hostFresh.charAt(0).toUpperCase()}${hostFresh.slice(1)}` : say(lang, 'session.selfHeal.freshSession.defaultCapitalized');
1133
- return say(lang, 'session.selfHeal.headless.neverReleased', { handle, startOver, cancelPath });
1180
+ return say(lang, 'session.selfHeal.headless.neverReleased', { handle, startOver, endRun });
1134
1181
  }
@@ -2,7 +2,7 @@ import type { AgentEvent, CheckpointGate, TaskResult } from '@sema-agent/sdk';
2
2
  import { type WiringManifestView } from './wiringManifestView.js';
3
3
  import { type SDKMessage, type EmitContext, type ModelUsage } from '../types.js';
4
4
  import { type McpLivenessView } from '../../mcpLiveness.js';
5
- import { type ContextUsageSectionRow } from '../../ownKey.js';
5
+ import { type ContextUsageSectionRow, type PromptIdentityLayersRow, type PromptManifestIdentityRow, type PromptManifestSectionRow } from '../../ownKey.js';
6
6
  export declare const INTERNAL_SDK_ARM_TYPES: ReadonlySet<string>;
7
7
  export type EventProjectionNoneReason = 'usage_only' | 'terminal_delegated' | 'hitl_out_of_slice' | 'not_in_slice' | 'empty_payload';
8
8
  export type EventProjectionDropReason = 'malformed' | 'unknown_arm' | 'unsupported_arm';
@@ -67,12 +67,31 @@ export interface WiringManifestLspSeamView {
67
67
  mounted: boolean;
68
68
  lane?: string;
69
69
  }
70
- export type ContextUsageSectionView = ContextUsageSectionRow;
71
- export interface PromptManifestSectionView {
72
- id: string;
73
- chars: number;
74
- slot?: string;
70
+ export interface WiringManifestModSkipView {
71
+ readonly registration: string;
72
+ readonly cause: string;
73
+ readonly reason: string;
75
74
  }
75
+ export interface WiringManifestModMountedView {
76
+ readonly name: string;
77
+ readonly seat: string;
78
+ readonly tier: string;
79
+ readonly events: readonly string[];
80
+ readonly observe?: readonly string[];
81
+ readonly skipped?: readonly WiringManifestModSkipView[];
82
+ }
83
+ export interface WiringManifestModRefusedView {
84
+ readonly name: string;
85
+ readonly seat: string;
86
+ readonly tier: string;
87
+ readonly refusedBy: string;
88
+ readonly reason: string;
89
+ }
90
+ export type WiringManifestModView = WiringManifestModMountedView | WiringManifestModRefusedView;
91
+ export type ContextUsageSectionView = ContextUsageSectionRow;
92
+ export type PromptManifestSectionView = PromptManifestSectionRow;
93
+ export type PromptManifestIdentityView = PromptManifestIdentityRow;
94
+ export type PromptIdentityLayersView = PromptIdentityLayersRow;
76
95
  export interface PromptManifestBlockView {
77
96
  id: string;
78
97
  chars: number;
@@ -5,7 +5,7 @@ import { ccToolDenialKindForToolEnd, gateOutcomeOf } from '../../gateOutcome.js'
5
5
  import { projectToolRoster, projectToolRosterDelta } from '../../toolRoster.js';
6
6
  import { projectHandsSection } from '../../handsSeam.js';
7
7
  import { readMcpLiveness } from '../../mcpLiveness.js';
8
- import { contextUsageReadingOf, humanInputAttachmentsOf, markMcpSectionDroppedNamedRows, readFrameTrueMark } from '../../ownKey.js';
8
+ import { contextUsageReadingOf, humanInputAttachmentsOf, markMcpSectionDroppedNamedRows, promptManifestIdentityOfFrame, promptManifestSectionViewOf, readFrameTrueMark } from '../../ownKey.js';
9
9
  import { SEGMENT_END_IDENTITY_KEYS, eventSeq, stripToolUseSideChannels } from '../types.js';
10
10
  import { frozenSet } from '../../frozenSet.js';
11
11
  import { isCoreWorkflowRunTerminal } from '../../terminalStatuses.js';
@@ -21,6 +21,7 @@ export const INTERNAL_SDK_ARM_TYPES = frozenSet([
21
21
  'tool_roster_delta',
22
22
  'context_usage',
23
23
  'compaction_outcome',
24
+ 'compaction_started',
24
25
  'prompt_assembled',
25
26
  'workflow_complete',
26
27
  'tool_end_result',
@@ -69,6 +70,9 @@ function streamEventArm(ctx, event) {
69
70
  const projected = (message) => ({ kind: 'message', message });
70
71
  const nothing = (why) => ({ kind: 'none', why });
71
72
  const dropped = (why, type) => ({ kind: 'dropped', why, type });
73
+ function isCompactionStartedFrame(ev) {
74
+ return ev.type === 'compaction_started';
75
+ }
72
76
  function assertNeverArm(_ev) {
73
77
  }
74
78
  export function eventToSdkMessage(ev, ctx) {
@@ -85,6 +89,8 @@ function withEngineIdentity(p, ev, ctx) {
85
89
  return projected(Object.assign({}, env, { uuid: envelopeUuidOf(eventId, env.type), _sema_engine_ref: ref }));
86
90
  }
87
91
  function projectEvent(ev, ctx) {
92
+ if (isCompactionStartedFrame(ev))
93
+ return compactionStartedProjection(ev, ctx);
88
94
  switch (ev.type) {
89
95
  case 'task_started':
90
96
  return taskStartedProjection(ev, ctx);
@@ -164,6 +170,10 @@ function projectEvent(ev, ctx) {
164
170
  }
165
171
  case 'compacted': {
166
172
  const raw = ev;
173
+ const pass = typeof raw.pass === 'string' && raw.pass.length > 0 ? raw.pass : undefined;
174
+ const tokenOf = (v) => (typeof v === 'number' && Number.isFinite(v) && v >= 0 ? v : undefined);
175
+ const tokensBefore = tokenOf(raw.triggerTokensBefore);
176
+ const tokensAfter = tokenOf(raw.tokensAfter);
167
177
  const freedTokens = typeof raw.freedTokens === 'number' && Number.isFinite(raw.freedTokens) && raw.freedTokens >= 0 ? raw.freedTokens : undefined;
168
178
  const attachedFiles = raw.attachedFiles;
169
179
  const seg = raw.preserved_segment;
@@ -184,6 +194,10 @@ function projectEvent(ev, ctx) {
184
194
  ? { _sema_clamped_ratio: clampedRatio }
185
195
  : {}),
186
196
  ...(freedTokens !== undefined ? { _sema_freed_tokens: freedTokens } : {}),
197
+ ...(pass !== undefined ? { _sema_pass: pass } : {}),
198
+ ...(tokensBefore !== undefined || tokensAfter !== undefined
199
+ ? { _sema_compaction_tokens: { ...(tokensBefore !== undefined ? { before: tokensBefore } : {}), ...(tokensAfter !== undefined ? { after: tokensAfter } : {}) } }
200
+ : {}),
187
201
  },
188
202
  ...(Array.isArray(attachedFiles) && attachedFiles.length > 0 ? { _sema_attached_files: attachedFiles } : {}),
189
203
  })));
@@ -265,6 +279,7 @@ function projectEvent(ev, ctx) {
265
279
  const workflowAgentLabel = ev.workflowAgentLabel;
266
280
  const model = ev.model;
267
281
  const status = ev.status;
282
+ const seq = typeof ev.seq === 'number' && Number.isFinite(ev.seq) ? ev.seq : undefined;
268
283
  return projected(stamp(ctx, armBody({
269
284
  type: 'task_progress',
270
285
  taskId: ev.taskId,
@@ -284,6 +299,7 @@ function projectEvent(ev, ctx) {
284
299
  ...(ev.parentToolCallId !== undefined
285
300
  ? { parentToolCallId: ev.parentToolCallId }
286
301
  : {}),
302
+ ...(seq !== undefined ? { seq } : {}),
287
303
  })));
288
304
  }
289
305
  case 'wiring_manifest': {
@@ -582,7 +598,8 @@ function wiringManifestSupersetBody(ev) {
582
598
  const fileHistory = projectFileHistorySection(ev);
583
599
  const instructions = readInstructionsSegment(ev, 'instructions');
584
600
  const fleet = readFleetSegment(ev, 'fleet');
585
- if (modelGate === undefined && autoMode === undefined && mcp === undefined && tools === undefined && hooks === undefined && lsp === undefined && writeProtection === undefined && autoConsolidation === undefined && readDeny === undefined && hands === undefined && fileHistory === undefined && instructions === undefined && fleet === undefined)
601
+ const mods = projectModsSection(ev);
602
+ if (modelGate === undefined && autoMode === undefined && mcp === undefined && tools === undefined && hooks === undefined && lsp === undefined && writeProtection === undefined && autoConsolidation === undefined && readDeny === undefined && hands === undefined && fileHistory === undefined && instructions === undefined && fleet === undefined && mods === undefined)
586
603
  return undefined;
587
604
  return {
588
605
  ...(modelGate !== undefined ? { _sema_modelGate: modelGate } : {}),
@@ -598,6 +615,7 @@ function wiringManifestSupersetBody(ev) {
598
615
  ...(fileHistory !== undefined ? { _sema_fileHistory: fileHistory } : {}),
599
616
  ...(instructions !== undefined ? { _sema_instructions: instructions } : {}),
600
617
  ...(fleet !== undefined ? { _sema_fleet: fleet } : {}),
618
+ ...(mods !== undefined ? { _sema_mods: mods } : {}),
601
619
  };
602
620
  }
603
621
  function projectFileHistorySection(holder) {
@@ -636,6 +654,83 @@ function projectReadDenySection(raw) {
636
654
  return undefined;
637
655
  return { builtinTiers: [...tiers] };
638
656
  }
657
+ const _modViewPins = [true, true, true, true, true, true];
658
+ void _modViewPins;
659
+ function projectModsSection(holder) {
660
+ try {
661
+ if (!Object.hasOwn(holder, 'mods'))
662
+ return undefined;
663
+ const raw = holder.mods;
664
+ if (!Array.isArray(raw))
665
+ return undefined;
666
+ const rows = [];
667
+ for (const r of raw) {
668
+ const row = modRowOf(r);
669
+ if (row !== undefined)
670
+ rows.push(row);
671
+ }
672
+ if (raw.length > 0 && rows.length === 0)
673
+ return undefined;
674
+ return rows;
675
+ }
676
+ catch {
677
+ return undefined;
678
+ }
679
+ }
680
+ function modRowOf(r) {
681
+ try {
682
+ if (typeof r !== 'object' || r === null || Array.isArray(r))
683
+ return undefined;
684
+ const str = (v) => (typeof v === 'string' && v.length > 0 ? v : undefined);
685
+ const strList = (v) => (Array.isArray(v) && v.every((x) => typeof x === 'string') ? [...v] : undefined);
686
+ const o = r;
687
+ const name = str(o.name);
688
+ const seat = str(o.seat);
689
+ const tier = str(o.tier);
690
+ if (name === undefined || seat === undefined || tier === undefined)
691
+ return undefined;
692
+ const eventsRaw = o.events;
693
+ const observeRaw = o.observe;
694
+ const skippedRaw = o.skipped;
695
+ const refusedByRaw = o.refusedBy;
696
+ const reasonRaw = o.reason;
697
+ const hasMountedKey = eventsRaw !== undefined || observeRaw !== undefined || skippedRaw !== undefined;
698
+ const hasRefusedKey = refusedByRaw !== undefined || reasonRaw !== undefined;
699
+ if (hasMountedKey && hasRefusedKey)
700
+ return undefined;
701
+ if (hasRefusedKey) {
702
+ const refusedBy = str(refusedByRaw);
703
+ const reason = str(reasonRaw);
704
+ return refusedBy === undefined || reason === undefined ? undefined : { name, seat, tier, refusedBy, reason };
705
+ }
706
+ const events = strList(eventsRaw);
707
+ if (events === undefined)
708
+ return undefined;
709
+ const observe = observeRaw === undefined ? undefined : strList(observeRaw);
710
+ const skipped = Array.isArray(skippedRaw)
711
+ ? skippedRaw.flatMap((x) => {
712
+ if (typeof x !== 'object' || x === null || Array.isArray(x))
713
+ return [];
714
+ const k = x;
715
+ const registration = str(k.registration);
716
+ const cause = str(k.cause);
717
+ const why = str(k.reason);
718
+ return registration === undefined || cause === undefined || why === undefined ? [] : [{ registration, cause, reason: why }];
719
+ })
720
+ : undefined;
721
+ return {
722
+ name,
723
+ seat,
724
+ tier,
725
+ events,
726
+ ...(observe !== undefined ? { observe } : {}),
727
+ ...(skipped !== undefined && skipped.length > 0 ? { skipped } : {}),
728
+ };
729
+ }
730
+ catch {
731
+ return undefined;
732
+ }
733
+ }
639
734
  function projectHooksSection(raw) {
640
735
  if (!Array.isArray(raw))
641
736
  return undefined;
@@ -725,14 +820,37 @@ function compactionOutcomeProjection(frame, ctx) {
725
820
  return dropped('malformed', 'compaction_outcome');
726
821
  const trigger = str(ev.trigger);
727
822
  const reason = str(ev.reason);
823
+ const pass = str(ev.pass);
728
824
  return projected(internalArmExit(stamp(ctx, armBody({
729
825
  type: 'compaction_outcome',
730
826
  outcome,
731
827
  ...(trigger !== undefined ? { trigger } : {}),
732
828
  ...(reason !== undefined ? { reason } : {}),
829
+ ...(pass !== undefined ? { pass } : {}),
733
830
  ...identity,
734
831
  }))));
735
832
  }
833
+ function compactionStartedProjection(frame, ctx) {
834
+ const ev = frame;
835
+ const { identity, bad } = identityOrMalformed(ev, 'compaction_started');
836
+ if (bad !== null)
837
+ return bad;
838
+ const str = (v) => (typeof v === 'string' && v.length > 0 ? v : undefined);
839
+ const pass = str(ev.pass);
840
+ const trigger = str(ev.trigger);
841
+ if (pass === undefined || trigger === undefined)
842
+ return dropped('malformed', 'compaction_started');
843
+ const startedAt = typeof ev.startedAt === 'number' && Number.isFinite(ev.startedAt) ? ev.startedAt : undefined;
844
+ return projected(internalArmExit(stamp(ctx, armBody({
845
+ type: 'compaction_started',
846
+ trigger,
847
+ pass,
848
+ ...(startedAt !== undefined ? { startedAt } : {}),
849
+ ...identity,
850
+ }))));
851
+ }
852
+ const _promptManifestPins = [true, true, true, true, true];
853
+ void _promptManifestPins;
736
854
  function promptAssembledProjection(frame, ctx) {
737
855
  const ev = frame;
738
856
  const { identity, bad } = identityOrMalformed(ev, 'prompt_assembled');
@@ -748,16 +866,13 @@ function promptAssembledProjection(frame, ctx) {
748
866
  for (const r of ev.sections) {
749
867
  if (typeof r !== 'object' || r === null || Array.isArray(r))
750
868
  continue;
751
- const o = r;
752
- const id = str(o.id);
753
- const chars = size(o.chars);
754
- if (id === undefined || chars === undefined)
755
- continue;
756
- const slot = str(o.slot);
757
- rows.push({ id, chars, ...(slot !== undefined ? { slot } : {}) });
869
+ const row = promptManifestSectionViewOf(r);
870
+ if (row !== undefined)
871
+ rows.push(row);
758
872
  }
759
873
  return rows.length > 0 ? rows : undefined;
760
874
  })();
875
+ const promptIdentity = promptManifestIdentityOfFrame(ev);
761
876
  const blocks = (() => {
762
877
  if (!Array.isArray(ev.blocks))
763
878
  return undefined;
@@ -797,6 +912,7 @@ function promptAssembledProjection(frame, ctx) {
797
912
  ...(blocks !== undefined ? { blocks } : {}),
798
913
  ...(sections !== undefined ? { sections } : {}),
799
914
  ...(tools !== undefined ? { tools } : {}),
915
+ ...(promptIdentity !== undefined ? { identity: promptIdentity } : {}),
800
916
  ...identity,
801
917
  }))));
802
918
  }
@@ -523,8 +523,17 @@ function errorResult(ctx, parts) {
523
523
  ...(parts.outcomeUnknown === true ? { _sema_outcome: 'unknown' } : {}),
524
524
  ...(parts.parkFailedReason !== undefined ? { _sema_park_failed_reason: washCredentials(parts.parkFailedReason) } : {}),
525
525
  ...(parts.abortCause !== undefined ? { _sema_abort_cause: parts.abortCause } : {}),
526
+ ...(parts.route !== undefined ? { _sema_route: routeOnFrame(parts.route) } : {}),
526
527
  });
527
528
  }
529
+ function routeOnFrame(route) {
530
+ return {
531
+ credentialSource: route.credentialSource,
532
+ ...(route.carrier !== undefined ? { carrier: route.carrier } : {}),
533
+ ...(route.carrierBag !== undefined ? { carrierBag: route.carrierBag } : {}),
534
+ root: route.root,
535
+ };
536
+ }
528
537
  export function doneToSdkResult(ev, ctx, observed) {
529
538
  const msg = doneToSdkResultBody(ev, ctx, observed);
530
539
  return isReplayedTerminal(ev) ? Object.assign({}, msg, { _sema_replay: true }) : msg;
@@ -563,6 +572,7 @@ function doneToSdkResultBody(ev, ctx, observed) {
563
572
  return errorResult(ctx, {
564
573
  ...errorBase,
565
574
  subtype: failedSubtype,
575
+ ...(terminal.detail?.kind === 'provider_rejected' && terminal.detail.route !== undefined ? { route: terminal.detail.route } : {}),
566
576
  errors: [
567
577
  withTerminalNote(isRewindFamilyCode(failedCode) && failedMessage
568
578
  ? `${failedMessage} (${failedCode})`
@@ -1,4 +1,4 @@
1
- import type { WiringManifestModelGate, WiringManifestAutoMode, WiringManifestMcpEntryView, WiringManifestHookEntryView, WiringManifestLspSeamView, WiringManifestWriteProtectionView, WiringManifestAutoConsolidationView, WiringManifestReadDenyView } from './eventToSdkMessage.js';
1
+ import type { WiringManifestModelGate, WiringManifestAutoMode, WiringManifestMcpEntryView, WiringManifestHookEntryView, WiringManifestLspSeamView, WiringManifestWriteProtectionView, WiringManifestAutoConsolidationView, WiringManifestReadDenyView, WiringManifestModView } from './eventToSdkMessage.js';
2
2
  import type { ToolRosterView, WiringManifestHandsView } from '../../toolRoster.js';
3
3
  export type WiringManifestSections = {
4
4
  _sema_modelGate?: WiringManifestModelGate;
@@ -16,6 +16,7 @@ export type WiringManifestSections = {
16
16
  readonly selected: readonly string[];
17
17
  };
18
18
  _sema_fleet?: WiringManifestFleetView;
19
+ _sema_mods?: WiringManifestModView[];
19
20
  eventId?: string;
20
21
  };
21
22
  export interface WiringManifestFleetView {
@@ -37,6 +38,7 @@ export interface WiringManifestView {
37
38
  readonly selected: readonly string[];
38
39
  };
39
40
  fleet?: WiringManifestFleetView;
41
+ mods?: readonly WiringManifestModView[];
40
42
  eventId?: string;
41
43
  }
42
44
  export declare function readInstructionsSegment(holder: object, key: 'instructions' | '_sema_instructions'): {
@@ -59,6 +59,7 @@ export function wiringManifestViewOf(s) {
59
59
  ...(typeof s._sema_fileHistory === 'string' && s._sema_fileHistory.length > 0 ? { fileHistory: s._sema_fileHistory } : {}),
60
60
  ...(instructions !== undefined ? { instructions } : {}),
61
61
  ...(fleet !== undefined ? { fleet } : {}),
62
+ ...(Array.isArray(s._sema_mods) ? { mods: s._sema_mods } : {}),
62
63
  };
63
64
  if (Object.keys(view).length === 0)
64
65
  return undefined;
@@ -141,7 +141,7 @@ function apiErrorRowBitsOf(read) {
141
141
  return undefined;
142
142
  }
143
143
  }
144
- function syntheticTerminalRow(ctx, identity, replayed, text, historyKey, resend, apiError) {
144
+ function syntheticTerminalRow(ctx, identity, replayed, text, historyKey, resend, apiError, owner) {
145
145
  return stamp(ctx, {
146
146
  uuid: identity.runId === undefined ? undefined : terminalUuidOf(identity.runId, identity.label),
147
147
  session_id: undefined,
@@ -155,8 +155,34 @@ function syntheticTerminalRow(ctx, identity, replayed, text, historyKey, resend,
155
155
  ...(apiError?.providerCondition !== undefined ? { _sema_provider_condition: apiError.providerCondition } : {}),
156
156
  ...(apiError?.errorCode !== undefined ? { _sema_api_error_code: apiError.errorCode } : {}),
157
157
  ...(replayed ? { _sema_replay: true } : {}),
158
+ ...(owner !== undefined ? { _sema_terminal_owner: owner } : {}),
158
159
  });
159
160
  }
161
+ function withTerminalOwner(frame, owner) {
162
+ return owner === undefined ? frame : { ...frame, _sema_terminal_owner: owner };
163
+ }
164
+ function terminalOwnerOfStream(ctx, busy, busyHandle, runId) {
165
+ const hostString = (k) => {
166
+ try {
167
+ const d = Object.getOwnPropertyDescriptor(ctx, k);
168
+ return d !== undefined && 'value' in d && typeof d.value === 'string' && d.value.length > 0 ? d.value : undefined;
169
+ }
170
+ catch {
171
+ return undefined;
172
+ }
173
+ };
174
+ const followed = hostString('followedRun');
175
+ if (followed !== undefined)
176
+ return { kind: 'followed-run', taskId: followed, ...(runId !== undefined ? { runId } : {}) };
177
+ if (!busy)
178
+ return undefined;
179
+ const requestId = hostString('requestId');
180
+ return {
181
+ kind: 'request-not-sent',
182
+ ...(requestId !== undefined ? { requestId } : {}),
183
+ ...(typeof busyHandle === 'string' && busyHandle.length > 0 ? { heldBy: busyHandle } : {}),
184
+ };
185
+ }
160
186
  function engineResultOf(result) {
161
187
  const v = doneResultView(result);
162
188
  return v.replay ? (v.engine ?? result) : result;
@@ -655,6 +681,7 @@ async function* runStreamInner(events, ctx, handle = {}) {
655
681
  const doneTerminal = rowFacts.doneTerminal;
656
682
  const terminalRunId = terminalRunIdOf(ev);
657
683
  const replayed = isReplayedTerminal(ev);
684
+ const owner = terminalOwnerOfStream(ctx, rowFacts.busy.busy, rowFacts.busy.handle, terminalRunId);
658
685
  const errText = rowFacts.errText;
659
686
  if (errText) {
660
687
  const busy = rowFacts.busy;
@@ -695,7 +722,7 @@ async function* runStreamInner(events, ctx, handle = {}) {
695
722
  : '';
696
723
  const resend = historyTerminal.detail !== undefined ? providerRejectionResend(historyTerminal.detail, historyTerminal.carrier) : undefined;
697
724
  const resendLine = resend !== undefined ? `\n${resend.text}` : '';
698
- yield syntheticTerminalRow(ctx, { runId: terminalRunId, label: 'terminal-row' }, replayed, `${sessionUnreadable ? `${rowText}\n${corruptSessionContent()}` : rowText}${abortNote !== undefined ? `\n${abortNote}` : ''}${rewindLine}${resendLine}`, historyMismatch === null ? undefined : toolHistoryMismatchRowKey(historyMismatch, historyRepeat, rewindOffered), resend, arm === 'apiError' ? apiErrorRowBitsOf(historyTerminal) : undefined);
725
+ yield syntheticTerminalRow(ctx, { runId: terminalRunId, label: 'terminal-row' }, replayed, `${sessionUnreadable ? `${rowText}\n${corruptSessionContent()}` : rowText}${abortNote !== undefined ? `\n${abortNote}` : ''}${rewindLine}${resendLine}`, historyMismatch === null ? undefined : toolHistoryMismatchRowKey(historyMismatch, historyRepeat, rewindOffered), resend, arm === 'apiError' ? apiErrorRowBitsOf(historyTerminal) : undefined, owner);
699
726
  }
700
727
  else {
701
728
  const echoedSid = ev.type === 'done' ? engineSessionIdOf(engineResultOf(ev.result)) : undefined;
@@ -721,7 +748,7 @@ async function* runStreamInner(events, ctx, handle = {}) {
721
748
  emitChromeFireAndForget(ctx, { kind: 'run_cost_reconciled', laneProof: mainLane(), ...costFacts.reconcile });
722
749
  }
723
750
  }
724
- const resultFrame = terminalToSdkResult(ev, ctx, {
751
+ const resultFrame = withTerminalOwner(terminalToSdkResult(ev, ctx, {
725
752
  usageMissingObserved,
726
753
  nestedUsageByTask,
727
754
  toolInputByCallId,
@@ -731,13 +758,13 @@ async function* runStreamInner(events, ctx, handle = {}) {
731
758
  streamSawRunOpen,
732
759
  deniedToolNameByCallId,
733
760
  deniedCallsOverflowed,
734
- });
761
+ }), owner);
735
762
  const outcome = resultFrame.
736
763
  _sema_outcome;
737
764
  if (outcome === 'unknown') {
738
765
  const errs = resultFrame.errors;
739
766
  const sentence = Array.isArray(errs) && typeof errs[0] === 'string' ? errs[0] : 'the run ended without a terminal record this client can read';
740
- yield syntheticTerminalRow(ctx, { runId: terminalRunId, label: 'outcome-unknown' }, replayed, `${OUTCOME_UNKNOWN_ROW_PREFIX}: ${sentence}`);
767
+ yield syntheticTerminalRow(ctx, { runId: terminalRunId, label: 'outcome-unknown' }, replayed, `${OUTCOME_UNKNOWN_ROW_PREFIX}: ${sentence}`, undefined, undefined, undefined, owner);
741
768
  }
742
769
  yield terminalFactOf(ev, doneTerminal);
743
770
  yield resultFrame;
@@ -23,6 +23,8 @@ export interface EmitContext {
23
23
  emitChrome?(event: ChromeEvent): void | Promise<void>;
24
24
  onDroppedFrame?(info: DroppedFrameInfo): void;
25
25
  boundRun?(frame: AgentEvent): EngineBoundRun | undefined;
26
+ requestId?: string;
27
+ followedRun?: string;
26
28
  }
27
29
  export declare function stamp<T extends {
28
30
  uuid?: string | undefined;
@@ -46,6 +46,12 @@ export type AgentDefLike = {
46
46
  source: string;
47
47
  getSystemPrompt?: (arg?: unknown) => string;
48
48
  };
49
+ export declare const REFUSED_PROJECT_SERVER_CAUSES: readonly ["rejected", "not_approved", "disabled", "policy_blocked", "plugin_only", "malformed_config"];
50
+ export type RefusedProjectServerCause = (typeof REFUSED_PROJECT_SERVER_CAUSES)[number];
51
+ export interface RefusedProjectServer {
52
+ readonly name: string;
53
+ readonly cause: RefusedProjectServerCause;
54
+ }
49
55
  export type ProjectAgentsDeps = {
50
56
  resolveModel: (frontmatterModel: string | undefined) => {
51
57
  model: string;
@@ -55,6 +61,7 @@ export type ProjectAgentsDeps = {
55
61
  skillSpecs?: TaskAgentWireSkill[];
56
62
  toolRoster?: ToolRosterView | null;
57
63
  agentSourceLabel?: (agentName: string) => string | undefined;
64
+ refusedProjectServers?: readonly RefusedProjectServer[];
58
65
  };
59
66
  export type ProjectAgentsResult = {
60
67
  agents: TaskAgentWireItem[] | undefined;