@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.
- package/CHANGELOG.md +177 -0
- package/README.md +32 -19
- package/dist/adapt/arms.js +60 -36
- package/dist/adapt/panelTasks.d.ts +2 -1
- package/dist/adapt/panelTasks.js +32 -9
- package/dist/adapt/textStream.d.ts +1 -1
- package/dist/adapt/textStream.js +51 -28
- package/dist/adapter/activeRunSelfHeal.d.ts +7 -0
- package/dist/adapter/activeRunSelfHeal.js +58 -11
- package/dist/adapter/downstream/eventToSdkMessage.d.ts +25 -6
- package/dist/adapter/downstream/eventToSdkMessage.js +125 -9
- package/dist/adapter/downstream/terminalToSdkResult.js +10 -0
- package/dist/adapter/downstream/wiringManifestView.d.ts +3 -1
- package/dist/adapter/downstream/wiringManifestView.js +1 -0
- package/dist/adapter/runStream.js +32 -5
- package/dist/adapter/types.d.ts +2 -0
- package/dist/agentsWireCaps.d.ts +7 -0
- package/dist/agentsWireCaps.js +100 -15
- package/dist/cloudConfigWireCaps.d.ts +10 -1
- package/dist/cloudConfigWireCaps.js +156 -62
- package/dist/compactionStatus.d.ts +34 -0
- package/dist/compactionStatus.js +196 -0
- package/dist/decideFailureNote.js +3 -3
- package/dist/displayUntrusted.js +150 -5
- package/dist/engineAgentPanelStore.d.ts +7 -4
- package/dist/engineErrorCodes.d.ts +9 -1
- package/dist/engineErrorCodes.js +9 -5
- package/dist/engineRowRef.js +1 -0
- package/dist/engineToolDirectory.d.ts +3 -0
- package/dist/engineToolDirectory.js +4 -2
- package/dist/eventLeg.d.ts +1 -7
- package/dist/eventLeg.js +7 -8
- package/dist/fileHistoryCaptureCapability.d.ts +0 -3
- package/dist/fileHistoryCaptureCapability.js +0 -4
- package/dist/generated/engineFactTables.d.ts +1 -0
- package/dist/generated/engineFactTables.js +27 -0
- package/dist/generated/engineNoticeTables.js +3 -0
- package/dist/generated/settingsSchemaFns.d.ts +12 -0
- package/dist/generated/settingsSchemaFns.js +13 -0
- package/dist/generated/settingsSchemaMcpRequestEntry.d.ts +1 -0
- package/dist/generated/settingsSchemaMcpRequestEntry.js +162 -0
- package/dist/generated/settingsSchemaTables.d.ts +1 -0
- package/dist/generated/settingsSchemaTables.js +5 -0
- package/dist/generated/settingsSchemaTypes.d.ts +28 -0
- package/dist/hitl/allowRuleShadow.js +2 -2
- package/dist/hitl/approvalCardReasons.js +2 -2
- package/dist/hitl/approvalHolds.d.ts +14 -0
- package/dist/hitl/approvalHolds.js +41 -0
- package/dist/hitl/askClassPair.d.ts +2 -2
- package/dist/hitl/askClassPair.js +2 -2
- package/dist/hitl/attributionLadder.d.ts +23 -0
- package/dist/hitl/attributionLadder.js +67 -0
- package/dist/hitl/decisionLedger.d.ts +55 -0
- package/dist/hitl/decisionLedger.js +156 -0
- package/dist/hitl/decisionRefusal.d.ts +1 -0
- package/dist/hitl/decisionRefusal.js +1 -1
- package/dist/hitl/decisionSend.d.ts +113 -0
- package/dist/hitl/decisionSend.js +579 -0
- package/dist/hitl/hitlBridge.js +18 -6
- package/dist/hitl/planReviewWire.js +45 -76
- package/dist/hitl/sessionPolicyDeliverable.js +3 -6
- package/dist/hitl/toolApprovalWire.js +43 -109
- package/dist/hostTurnSettings.d.ts +46 -7
- package/dist/hostTurnSettings.js +408 -7
- package/dist/humanTurn.d.ts +2 -1
- package/dist/humanTurn.js +3 -3
- package/dist/i18n/messages.en.d.ts +131 -0
- package/dist/i18n/messages.en.js +143 -12
- package/dist/i18n/messages.zh.js +148 -12
- package/dist/index.d.ts +18 -2
- package/dist/index.js +10 -1
- package/dist/inheritEnvCapability.d.ts +1 -0
- package/dist/inheritEnvCapability.js +9 -2
- package/dist/inheritEnvWire.js +2 -2
- package/dist/injectionLaneNotice.d.ts +5 -0
- package/dist/injectionLaneNotice.js +46 -0
- package/dist/mcpPanel.js +2 -0
- package/dist/mcpReconnect.js +2 -2
- package/dist/mcpToolToggles.d.ts +6 -0
- package/dist/mcpToolToggles.js +46 -0
- package/dist/mcpWireCaps.d.ts +10 -4
- package/dist/mcpWireCaps.js +106 -71
- package/dist/mcpWireTransport.d.ts +4 -0
- package/dist/mcpWireTransport.js +18 -0
- package/dist/modelCapabilityProbe.d.ts +2 -1
- package/dist/modelCapabilityProbe.js +10 -9
- package/dist/modelIdentityResolvability.d.ts +2 -0
- package/dist/modelIdentityResolvability.js +23 -5
- package/dist/ownKey.d.ts +26 -0
- package/dist/ownKey.js +75 -0
- package/dist/panelReduce.d.ts +5 -0
- package/dist/panelReduce.js +45 -13
- package/dist/panelStateHolder.d.ts +1 -0
- package/dist/panelStateHolder.js +10 -1
- package/dist/permissionRuleIssue.d.ts +2 -1
- package/dist/permissionRuleIssue.js +22 -21
- package/dist/pluginHooksWire.js +12 -10
- package/dist/prepareRefusal.d.ts +8 -0
- package/dist/prepareRefusal.js +72 -0
- package/dist/request/taskRequest.d.ts +10 -10
- package/dist/request/taskRequest.js +106 -65
- package/dist/resumeRefusalCopy.d.ts +3 -1
- package/dist/resumeRefusalCopy.js +22 -4
- package/dist/retryStatus.d.ts +18 -0
- package/dist/retryStatus.js +76 -19
- package/dist/ruleRefusalSentence.d.ts +4 -0
- package/dist/ruleRefusalSentence.js +58 -0
- package/dist/sandboxWire.d.ts +2 -1
- package/dist/sandboxWire.js +55 -21
- package/dist/scenarioRefusal.d.ts +2 -1
- package/dist/scenarioRefusal.js +5 -5
- package/dist/seam.d.ts +24 -9
- package/dist/seam.js +44 -4
- package/dist/seatContract.d.ts +16 -8
- package/dist/seatContract.js +21 -6
- package/dist/settingsCredentialKeyPaths.d.ts +8 -0
- package/dist/settingsCredentialKeyPaths.js +219 -0
- package/dist/skillsWireCaps.d.ts +0 -3
- package/dist/skillsWireCaps.js +1 -2
- package/dist/subagentContentStore.d.ts +1 -0
- package/dist/subagentContentStore.js +135 -27
- package/dist/toolsFlagNames.d.ts +8 -0
- package/dist/toolsFlagNames.js +110 -0
- package/dist/turnFailurePresentation.js +15 -7
- package/dist/wireRefusalCopy.d.ts +51 -17
- package/dist/wireRefusalCopy.js +298 -135
- package/docs/INTEGRATION-CLIENTS.md +423 -26
- 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
|
-
|
|
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
|
|
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
|
-
|
|
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,
|
|
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,
|
|
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
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
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
|
-
|
|
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
|
|
752
|
-
|
|
753
|
-
|
|
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;
|
package/dist/adapter/types.d.ts
CHANGED
|
@@ -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;
|
package/dist/agentsWireCaps.d.ts
CHANGED
|
@@ -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;
|