@sema-agent/client-core 0.83.5 → 0.84.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 +112 -0
- package/README.md +11 -11
- package/dist/adapt/wireShapes.js +3 -2
- package/dist/adapter/activeRunSelfHeal.js +7 -7
- package/dist/adapter/downstream/eventToSdkMessage.js +6 -2
- package/dist/adapter/downstream/wiringManifestView.d.ts +3 -1
- package/dist/adapter/downstream/wiringManifestView.js +1 -0
- package/dist/agentSession/engineAgentRegistryRead.d.ts +18 -0
- package/dist/agentSession/engineAgentRegistryRead.js +167 -0
- package/dist/agentsWireCaps.js +2 -1
- package/dist/attachmentsWireCaps.js +2 -2
- package/dist/controlRouter.js +1 -1
- package/dist/engineAgentAbsence.d.ts +37 -0
- package/dist/engineAgentAbsence.js +142 -0
- package/dist/engineErrorCodes.js +6 -5
- package/dist/engineNoticeCodes.d.ts +17 -0
- package/dist/engineNoticeCodes.js +45 -0
- package/dist/fleet/fleetProjection.js +3 -2
- package/dist/frozenSet.d.ts +1 -0
- package/dist/frozenSet.js +20 -0
- package/dist/handsSeam.d.ts +3 -0
- package/dist/handsSeam.js +19 -0
- package/dist/hitl/sessionPolicyDeliverable.d.ts +2 -1
- package/dist/hitl/sessionPolicyDeliverable.js +54 -4
- package/dist/index.d.ts +23 -13
- package/dist/index.js +12 -13
- package/dist/model/catalogLoader.js +3 -3
- package/dist/model/tierVocabulary.js +1 -1
- package/dist/request/taskRequest.js +15 -5
- package/dist/rewindWireCaps.d.ts +0 -1
- package/dist/seam.d.ts +2 -1
- package/dist/seatContract.js +2 -2
- package/dist/toolResult.js +2 -6
- package/dist/toolRoster.d.ts +16 -0
- package/dist/toolRoster.js +46 -5
- package/dist/wireErrorTriage.js +1 -11
- package/dist/workflowClient.js +4 -3
- package/dist/workflowMonitor.d.ts +1 -1
- package/docs/INTEGRATION-CLIENTS.md +364 -29
- package/package.json +3 -3
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
class FrozenVerdictSet extends Set {
|
|
2
|
+
constructor(members) {
|
|
3
|
+
super();
|
|
4
|
+
for (const m of members)
|
|
5
|
+
super.add(m);
|
|
6
|
+
}
|
|
7
|
+
add(_value) {
|
|
8
|
+
throw new TypeError('This set is read-only: it is a verdict table shared by every caller; copy it into a new Set to change it.');
|
|
9
|
+
}
|
|
10
|
+
delete(_value) {
|
|
11
|
+
throw new TypeError('This set is read-only: it is a verdict table shared by every caller; copy it into a new Set to change it.');
|
|
12
|
+
}
|
|
13
|
+
clear() {
|
|
14
|
+
throw new TypeError('This set is read-only: it is a verdict table shared by every caller; copy it into a new Set to change it.');
|
|
15
|
+
}
|
|
16
|
+
}
|
|
17
|
+
Object.freeze(FrozenVerdictSet.prototype);
|
|
18
|
+
export function frozenSet(members) {
|
|
19
|
+
return Object.freeze(new FrozenVerdictSet(members));
|
|
20
|
+
}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
export function projectHandsSection(holder) {
|
|
2
|
+
if (!Object.hasOwn(holder, 'hands'))
|
|
3
|
+
return undefined;
|
|
4
|
+
const raw = holder.hands;
|
|
5
|
+
if (typeof raw !== 'object' || raw === null || Array.isArray(raw))
|
|
6
|
+
return undefined;
|
|
7
|
+
if (!Object.hasOwn(raw, 'mounted'))
|
|
8
|
+
return undefined;
|
|
9
|
+
const mounted = raw.mounted;
|
|
10
|
+
if (typeof mounted !== 'boolean')
|
|
11
|
+
return undefined;
|
|
12
|
+
const reason = Object.hasOwn(raw, 'reason') ? raw.reason : undefined;
|
|
13
|
+
return { mounted, ...(typeof reason === 'string' && reason.length > 0 ? { reason } : {}) };
|
|
14
|
+
}
|
|
15
|
+
export const HANDS_REASON_NO_EXECUTION_ENV = 'no_execution_env';
|
|
16
|
+
const _handsReasonPin = true;
|
|
17
|
+
void _handsReasonPin;
|
|
18
|
+
const _handsViewPin = true;
|
|
19
|
+
void _handsViewPin;
|
|
@@ -1,9 +1,10 @@
|
|
|
1
1
|
import type { SessionPermissionRules } from '@sema-agent/sdk';
|
|
2
|
-
export type SessionPolicyWithheldWhy = 'ask_no_bucket' | 'qualified_deny' | 'peer_wide' | 'wildcard' | 'not_a_tool_name';
|
|
2
|
+
export type SessionPolicyWithheldWhy = 'ask_no_bucket' | 'qualified_deny' | 'peer_wide' | 'wildcard' | 'not_a_tool_name' | 'legacy_tool_name';
|
|
3
3
|
export declare const SESSION_POLICY_WITHHELD_WHY: readonly SessionPolicyWithheldWhy[];
|
|
4
4
|
export interface SessionPolicyWithheldRule {
|
|
5
5
|
readonly rule: string;
|
|
6
6
|
readonly why: SessionPolicyWithheldWhy;
|
|
7
|
+
readonly currentName?: string;
|
|
7
8
|
}
|
|
8
9
|
export interface SessionPolicyDeliverability {
|
|
9
10
|
readonly deliverable: SessionPermissionRules;
|
|
@@ -1,16 +1,60 @@
|
|
|
1
|
+
const COVERING_NAMESPACE_PREFIXES = ['mcp__', 'a2a__'];
|
|
2
|
+
const ENGINE_RETIRED_TOOL_NAMES = new Map([
|
|
3
|
+
['read_file', 'Read'],
|
|
4
|
+
['edit_file', 'Edit'],
|
|
5
|
+
['write_file', 'Write'],
|
|
6
|
+
['bash', 'Bash'],
|
|
7
|
+
['bash_readonly', null],
|
|
8
|
+
['glob', 'Glob'],
|
|
9
|
+
['grep', 'Grep'],
|
|
10
|
+
['web_fetch', 'WebFetch'],
|
|
11
|
+
['tool_search', 'ToolSearch'],
|
|
12
|
+
['skill', 'Skill'],
|
|
13
|
+
['present_plan', 'ExitPlanMode'],
|
|
14
|
+
['enter_plan_mode', 'EnterPlanMode'],
|
|
15
|
+
['spawn_subagent', 'Agent'],
|
|
16
|
+
['CronCancel', 'CronDelete'],
|
|
17
|
+
['lsp', 'LSP'],
|
|
18
|
+
['submit_output', 'StructuredOutput'],
|
|
19
|
+
['repo_map', 'RepoMap'],
|
|
20
|
+
['read_tool_result', 'ReadToolResult'],
|
|
21
|
+
['report_blocked', 'ReportBlocked'],
|
|
22
|
+
['declare_done', 'DeclareDone'],
|
|
23
|
+
['run_workflow', 'Workflow'],
|
|
24
|
+
['RunWorkflow', 'Workflow'],
|
|
25
|
+
['Task', 'Agent'],
|
|
26
|
+
['BashOutput', 'TaskOutput'],
|
|
27
|
+
['AgentOutputTool', 'TaskOutput'],
|
|
28
|
+
['BashOutputTool', 'TaskOutput'],
|
|
29
|
+
['AgentOutput', 'TaskOutput'],
|
|
30
|
+
['WorkflowStatus', null],
|
|
31
|
+
['KillShell', 'TaskStop'],
|
|
32
|
+
['KillBash', 'TaskStop'],
|
|
33
|
+
['ListMcpResources', 'ListMcpResourcesTool'],
|
|
34
|
+
['ReadMcpResource', 'ReadMcpResourceTool'],
|
|
35
|
+
['ReadMcpResourceDir', 'ReadMcpResourceDirTool'],
|
|
36
|
+
['MultiEdit', null],
|
|
37
|
+
['Fork', null],
|
|
38
|
+
['Sleep', null],
|
|
39
|
+
['Remember', null],
|
|
40
|
+
['remember', null],
|
|
41
|
+
['Recall', null],
|
|
42
|
+
['recall', null],
|
|
43
|
+
]);
|
|
44
|
+
const PREFIXES_IN_PROSE = COVERING_NAMESPACE_PREFIXES.map((prefix) => `"${prefix}"`).join(' or ');
|
|
1
45
|
const WITHHELD_NOTICE = {
|
|
2
46
|
ask_no_bucket: 'Not written to this session’s rule record: that record only holds rules that block outright, and this rule asks before running instead — recording it as a block would change what it means.',
|
|
3
47
|
qualified_deny: 'Not written to this session’s rule record: that record holds whole tool names and command names only, and this rule has a part in parentheses it cannot carry — recording just the name could block more than this rule does.',
|
|
4
|
-
peer_wide: 'Not written to this session’s rule record: this rule
|
|
48
|
+
peer_wide: 'Not written to this session’s rule record: this rule names a server or agent peer without naming one of its tools, and an engine that matches that record by exact tool name would block none of that peer’s tools.',
|
|
5
49
|
wildcard: 'Not written to this session’s rule record: this rule uses a wildcard (*), and an engine that matches that record by exact tool name would block none of the tools it covers.',
|
|
6
50
|
not_a_tool_name: 'Not written to this session’s rule record: this entry is not exactly one tool name — it is empty, not text, or has spaces around the name.',
|
|
51
|
+
legacy_tool_name: `Not written to this session’s rule record: unless a tool by exactly this name is available, the engine refuses it — it is a retired tool name, or it contains "__" but does not start with ${PREFIXES_IN_PROSE} — and with it in that record every later run of this session would fail at startup until that entry is removed from the record. If the tool still exists, use its current name; a server or agent-peer tool name starts with ${PREFIXES_IN_PROSE}.`,
|
|
7
52
|
};
|
|
8
53
|
export const SESSION_POLICY_WITHHELD_WHY = Object.freeze(Object.keys(WITHHELD_NOTICE));
|
|
9
54
|
const MAX_RULES = 10_000;
|
|
10
55
|
function unreadable() {
|
|
11
56
|
return { deliverable: {}, withheld: [], unreadable: true };
|
|
12
57
|
}
|
|
13
|
-
const COVERING_NAMESPACE_PREFIXES = ['mcp__', 'a2a__'];
|
|
14
58
|
function withheldWhyOf(rule) {
|
|
15
59
|
if (rule.length === 0)
|
|
16
60
|
return 'not_a_tool_name';
|
|
@@ -27,6 +71,10 @@ function withheldWhyOf(rule) {
|
|
|
27
71
|
}
|
|
28
72
|
if (rule.trim() !== rule)
|
|
29
73
|
return 'not_a_tool_name';
|
|
74
|
+
if (ENGINE_RETIRED_TOOL_NAMES.has(rule))
|
|
75
|
+
return 'legacy_tool_name';
|
|
76
|
+
if (rule.includes('__') && !COVERING_NAMESPACE_PREFIXES.some((prefix) => rule.startsWith(prefix)))
|
|
77
|
+
return 'legacy_tool_name';
|
|
30
78
|
return undefined;
|
|
31
79
|
}
|
|
32
80
|
export function sessionPolicyDeliverable(behavior, rules) {
|
|
@@ -66,8 +114,10 @@ export function sessionPolicyDeliverable(behavior, rules) {
|
|
|
66
114
|
const why = withheldWhyOf(r);
|
|
67
115
|
if (why === undefined)
|
|
68
116
|
exact.push(r);
|
|
69
|
-
else
|
|
70
|
-
|
|
117
|
+
else {
|
|
118
|
+
const currentName = why === 'legacy_tool_name' ? ENGINE_RETIRED_TOOL_NAMES.get(r) : undefined;
|
|
119
|
+
withheld.push(typeof currentName === 'string' ? { rule: r, why, currentName } : { rule: r, why });
|
|
120
|
+
}
|
|
71
121
|
}
|
|
72
122
|
if (withheld.length > 0 || exact.length === 0)
|
|
73
123
|
return { deliverable: {}, withheld };
|
package/dist/index.d.ts
CHANGED
|
@@ -1,9 +1,10 @@
|
|
|
1
1
|
export * from './seam.js';
|
|
2
2
|
export * from './workflow.js';
|
|
3
|
-
export
|
|
3
|
+
export { _resetEngineTaskNotificationForTest, _resetNotificationQueuePortForTest, _setWatcherTimingForTest, _tickWatchOnceForTest, classifyHookFailureFrame, classifyHookNoticeFrame, deriveNotificationResidualLines, dropQueuedNotificationsForRun, enqueueBgChildNotification, enqueueEngineWorkflowNotification, enqueuePlanReviewOutcome, HOOK_NOTICE_WARN_PREFIX, hookNoticeLastCheckText, installBgTaskStatusProbe, installNotificationQueuePort, installWorkflowStatusProbe, isEngineWorkflowNotified, isHookNoticeFrame, isOwnWorkflowRun, isTaskNotificationObjective, isWorkflowCompletionCardEnqueued, listOwnWorkflowRuns, markEngineWorkflowNotified, normalizeTaskNotification, noteOwnWorkflowRun, noteWorkflowCompletionCardEnqueued, notificationDropCounters, notificationQueuePortMisses, outstandingAbandonedCount, outstandingBgTaskPrompt, outstandingDeliverableWorkflowCount, outstandingWorkflowCount, parseTranscriptNotificationSeeds, registerOutstandingBgTask, registerOutstandingWorkflowRun, renderTaskNotificationXml, splitApiErrorSupplement, subscribeOutstandingWorkflows, taskNotificationDedupKey, taskNotificationDedupKeyFromWire, taskNotificationDeliverySupplement, } from './notifications.js';
|
|
4
|
+
export type { EngineWorkflowCompletion, GoalHookNotice, HookEntryType, HookFailureNotice, HookFailureReason, HookFailureVerdict, HookNoticeReason, HookNoticeVerdict, HookNoticeWire, NotificationDropCounters, NotificationQueuePort, QueuedCommandLike, TaskNotificationFields, TranscriptNotificationSeeds, } from './notifications.js';
|
|
4
5
|
export * from './peerFrames.js';
|
|
5
6
|
export * from './steering.js';
|
|
6
|
-
export
|
|
7
|
+
export type { DiagnosticsAttachment, } from './diagnostics.js';
|
|
7
8
|
export * from './retryStatus.js';
|
|
8
9
|
export * from './sessionMemoryStatus.js';
|
|
9
10
|
export * from './memorySpecWire.js';
|
|
@@ -12,11 +13,13 @@ export * from './adapt/textSegmentAuthority.js';
|
|
|
12
13
|
export * from './engineHttpTools.js';
|
|
13
14
|
export * from './sdkWireTransit.js';
|
|
14
15
|
export { SEMA_SEGMENT_ID_KEY } from './adapt/textStream.js';
|
|
15
|
-
export
|
|
16
|
+
export { __resetSubagentContentStoreConfigForTests, __resetSubagentOwnerLedgerForTests, clearSubagentContent, coerceOutput, configureSubagentContentStore, getBgParentRun, getBgParentRunOwner, getBgTerminalFacts, getSubagentContentSnapshot, isOwnEngineRun, parentToolCallIdOf, planSubagentViewSlots, publishSubagentContentEvent, pushSubagentLocalEcho, recordBgParentRun, recordBgTerminalFacts, recordOwnEngineRun, recordSubagentOwner, recordSubagentOwnerFromProgress, registerSubagentAlias, settleSubagentContent, SUBAGENT_CONTENT_STORE_DEFAULTS, subagentContentStoreConfig, subagentOwnerSessionConflicts, subscribeSubagentContent, } from './subagentContentStore.js';
|
|
17
|
+
export type { BgTerminalFacts, SubagentContentEvent, SubagentContentItem, SubagentContentSnapshot, SubagentContentStoreConfig, SubagentOwnerRecord, SubagentOwnerSessionConflict, SubagentViewSlot, } from './subagentContentStore.js';
|
|
16
18
|
export * from './engineAgentPanelStore.js';
|
|
17
19
|
export * from './engineAgentAbsence.js';
|
|
18
20
|
export * from './fleetAgentPanelProjection.js';
|
|
19
|
-
export
|
|
21
|
+
export { _resetLiveQuestionStore, hasLocalQuestionResponder, hasQuestionOverlay, hasQuestionOverlayFor, onQuestionFrame, onQuestionFrameFor, publishQuestionFrame, publishQuestionFrameFor, registerLocalQuestionResponder, respondToQuestion, setQuestionRespond, } from './liveQuestionStore.js';
|
|
22
|
+
export type { AskQuestion, AskQuestionOption, QuestionAnswer, QuestionFrame, } from './liveQuestionStore.js';
|
|
20
23
|
export * from './engineInlineTaskStats.js';
|
|
21
24
|
export * from './printToolResultFrame.js';
|
|
22
25
|
export * from './engineCapsCache.js';
|
|
@@ -67,7 +70,8 @@ export * from './sseIdleTriage.js';
|
|
|
67
70
|
export * from './engineWireSdk.js';
|
|
68
71
|
export * from './classifierVerdictWire.js';
|
|
69
72
|
export { stripSystemReminderBlocks, unwrapSystemReminder } from './systemReminderTag.js';
|
|
70
|
-
export
|
|
73
|
+
export { ACTIVE_RUN_BUSY_ERROR_CODE, asModelFallbackReason, CAPABILITY_SELF_ORCHESTRATION_REQUIRED, CONFIG_DELEGATION_ENTRY_CAPS, CONFIG_LIMIT_INVALID, CONFIG_LIMIT_UNKNOWN_KEY, CONFIG_MEMORY_PROJECT_KEY_SPELLING, CONFIG_MEMORY_WRITE_SCOPE_MISMATCH, CONFIG_REFUSAL_CODES, CONFIG_STRATEGY_FIND_LIMIT_INVALID, CONFIG_STRATEGY_MAX_SIZE_INVALID, DECIDE_WORKFLOW_HOST_UNKNOWN, DECIDE_WORKFLOW_LANE_CODES, DECIDE_WORKFLOW_REMEMBER_UNSUPPORTED, DELEGATION_CAP_CODES, DELEGATION_CONCURRENCY_CAP, DELEGATION_SESSION_CAP, delegationCapDispositionOf, DRAINING_ERROR_CODE, ENGINE_STOP_REASONS, engineStopReasonToCc, ENV_LIFETIME_EXPIRED, GATE_PARKED_ERROR_CODE, isConfigRefusalCode, isDelegationCapCode, isInterruptedToolEndCode, isLimitsExceededCode, isRewindFamilyCode, isWorkflowParkRefusalCode, LIMITS_MAX_COST_EXCEEDED, LIMITS_MAX_TOKENS_EXCEEDED, LIMITS_MAX_TURNS_EXCEEDED, LIMITS_MAX_WALLTIME_EXCEEDED, MCP_SERVER_REVOKED, MODEL_FALLBACK_INHERIT_NO_TIER_BINDING, OUTPUT_INVALID, RESUME_AT_ERROR_CODE_PREFIX, RESUME_CONTEXT_UNAVAILABLE, RESUME_ENV_FAILED, RESUME_PLACEMENT_MISMATCH, RESUME_POLICY_FOLD_CODE, RESUME_PREFLIGHT_REJECTED, RESUME_REOPEN_CODES, RESUME_RETRY_LATER_CODES, RESUME_TOOL_CONTRACT_MISMATCH, RESUME_TOOL_UNAVAILABLE, RESUME_USAGE_WINDOW_EXHAUSTED, REWIND_ERROR_CODE_PREFIXES, SCENARIO_NOT_ALLOWED_ERROR_CODE, STOP_CONFLICT_CODES, STREAM_MAX_DURATION, TOOL_END_INTERRUPTED_NEVER_STARTED, TOOL_END_INTERRUPTED_OUTCOME_UNKNOWN, USAGE_WINDOW_EXHAUSTED, WORKFLOW_PARK_REFUSAL_CODES, } from './engineErrorCodes.js';
|
|
74
|
+
export type { DelegationCapDisposition, ModelFallbackReason, } from './engineErrorCodes.js';
|
|
71
75
|
export * from './agentsWireCaps.js';
|
|
72
76
|
export * from './attachmentsWireCaps.js';
|
|
73
77
|
export * from './clientContextWireCaps.js';
|
|
@@ -115,20 +119,23 @@ export * from './limitsWire.js';
|
|
|
115
119
|
export * from './interactiveToolsWire.js';
|
|
116
120
|
export * from './headlessPermissionModeWire.js';
|
|
117
121
|
export * from './headlessReconnectWire.js';
|
|
118
|
-
export
|
|
122
|
+
export { coerceTaskStatus, coerceWorkflowStatus, CONTROL_TOOL_VERBS, FLEET_TASK_ROW_KEYS_NOT_PROJECTED, FLEET_TASK_ROW_WIRE_KEYS, FLEET_TASK_VIEW_KEYS, FLEET_WORKFLOW_ROW_KEYS_NOT_PROJECTED, FLEET_WORKFLOW_ROW_WIRE_KEYS, FLEET_WORKFLOW_VIEW_KEYS, projectDescription, projectTasks, projectWorkflows, TERMINAL_FLEET_TASK_STATUSES, wireResumable, wireRowUsage, } from './fleet/fleetProjection.js';
|
|
123
|
+
export type { FleetRowUsage, FleetTaskStatus, FleetTaskView, FleetWorkflowView, NotProjectedEntry, ProjectTasksOptions, } from './fleet/fleetProjection.js';
|
|
119
124
|
export * from './fleet/fleetLedger.js';
|
|
120
125
|
export * from './fleet/workflowSizeWarning.js';
|
|
121
126
|
export * from './subagent/engineDelegatedPrompt.js';
|
|
122
127
|
export * from './subagent/engineRowStopGate.js';
|
|
123
128
|
export * from './subagent/engineSubagentOutput.js';
|
|
124
129
|
export * from './subagent/engineSubagentSteer.js';
|
|
125
|
-
export
|
|
130
|
+
export { __resetRetainWithoutWakeWarningForTests, auditRetainWithoutWake, classifySubagentResumeFailure, resolveOwnerRunId, resolveSubagentContinueTarget, resolveSubagentResumeContext, resumeSettledSubagent, SUBAGENT_RESUME_CAP, subagentResumeAvailable, } from './subagent/engineSubagentResume.js';
|
|
131
|
+
export type { RetainWithoutWakeInput, RetainWithoutWakeVerdict, SubagentOwnerContext, SubagentResumeContext, SubagentResumeFacade, SubagentResumeFailureKind, SubagentResumeFailureVerdict, SubagentResumeOutcome, } from './subagent/engineSubagentResume.js';
|
|
126
132
|
export * from './subagent/engineTaskHandleWire.js';
|
|
127
133
|
export * from './subagent/engineCompactWire.js';
|
|
128
134
|
export * from './subagent/engineSubagentTail.js';
|
|
129
|
-
export
|
|
135
|
+
export { __resetBgOwnerAbsenceForTests, } from './subagent/subagentOwnerAbsence.js';
|
|
130
136
|
export * from './engineSessionParam.js';
|
|
131
|
-
export
|
|
137
|
+
export { engineWireTarget, engineWireTargetFor, installEngineWireTarget, installEngineWireTargetFor, } from './engineWireTarget.js';
|
|
138
|
+
export type { EngineWireTarget, } from './engineWireTarget.js';
|
|
132
139
|
export * from './principalWire.js';
|
|
133
140
|
export * from './wireErrorTriage.js';
|
|
134
141
|
export * from './resumeRefusalCopy.js';
|
|
@@ -143,20 +150,21 @@ export { ENGINE_FIRED_HOOK_EVENTS, PLUGIN_HOOK_DISPOSITIONS, PLUGIN_HOOK_REASONS
|
|
|
143
150
|
export * from './liveInitToolFace.js';
|
|
144
151
|
export * from './printInitToolFace.js';
|
|
145
152
|
export * from './model/providerPresets.js';
|
|
146
|
-
export
|
|
153
|
+
export { __setDecideTimeoutRetryBudgetForTests, backendDeny, DecideTransportRetryExhaustedError, findPendingForTask, HitlBridge, HitlSafetyError, isPlanReviewModeAfter, makeHitlCanUseTool, PLAN_REVIEW_MODE_AFTER_WORDS, readDecideCurrentPending, readWireErrorCode, } from './hitl/hitlBridge.js';
|
|
154
|
+
export type { ActiveGate, ApprovalsResourceLike, AskAnswer, AssistantResourceLike, DecideOperationEnd, DecideOperationEvent, DecideOperationIdentity, DecideOperationObserver, DecideOperationSpan, DecideOperationStart, FindPendingOutcome, GateCurrentPending, GatePrompt, HitlBackendDenyDecision, HitlBridgeOptions, HitlCanUseToolFn, HitlClientLike, HitlDecideDenyOutcome, HitlFailureStage, HitlPermissionDecisionLike, HitlSafetyCode, PlanReviewModeAfter, PlanReviewOutcome, } from './hitl/hitlBridge.js';
|
|
147
155
|
export * from './hitl/suspendedReopen.js';
|
|
148
156
|
export * from './hitl/approvalOutcomeNote.js';
|
|
149
157
|
export * from './hitl/approvalResolution.js';
|
|
150
158
|
export { toolEndOutputText, ENGINE_ABORT_TOOL_RESULT } from './hitl/frameRouter.js';
|
|
151
|
-
export {
|
|
152
|
-
export
|
|
159
|
+
export { _resetHitlHostSurfaceForTest, CANCEL_DENY_BUDGET_MS, CANCEL_DENY_WARN_TEXT, EDIT_NOT_FORWARDED_WARN_TEXT, EDIT_REFUSED_ON_BLIND_ASK_WARN_TEXT, hitlHostSurfaceFor, hitlHostSurfaceMisses, hitlHostSurfaceMissesFor, installHitlHostSurface, installHitlHostSurfaceFor, observeCancelByDeny, REMEMBER_NOT_APPLIED_WARN_TEXT, RULE_NOT_SENT_REJECTED_WARN_TEXT, RULE_NOT_SENT_WARN_TEXT, surfaceEditRefusedOnBlindAsk, surfaceForCurrentSession, surfaceRememberNotApplied, } from './hitl/hitlHostSurface.js';
|
|
160
|
+
export type { ClassifierDenyContext, HitlHostSurface, HitlNotice, } from './hitl/hitlHostSurface.js';
|
|
153
161
|
export * from './hitl/toolApprovalWire.js';
|
|
154
162
|
export * from './hitl/editedRuleTextPrecheck.js';
|
|
155
163
|
export * from './coreValuePorts.js';
|
|
156
164
|
export * from './hitl/askGateWire.js';
|
|
157
165
|
export * from './hitl/planReviewWire.js';
|
|
158
166
|
export { PLAN_REVIEW_QUESTION_ID_PREFIX, REOPEN_ID_TAIL, approvalCallKey, askGateQuestionId, planReviewQuestionId, liveFrameCallKey, armedKeyFromQuestionId, } from './hitl/gateIdentity.js';
|
|
159
|
-
export
|
|
167
|
+
export { _resetArmedGateRegistryForTest, _setGateArmedWaitMsForTest, clearArmedGate, gateArmedWaitMs, notePlanReviewAnswered, onGateArmed, planReviewArmedKey, registerArmedGate, registerArmedGateFor, registerArmedGateFromQuestionId, waitForGateArmed, wasGateArmed, wasGateArmedFor, } from './hitl/armedGateRegistry.js';
|
|
160
168
|
export * from './hitl/parkOwnership.js';
|
|
161
169
|
export * from './hitl/parkRowBirthWait.js';
|
|
162
170
|
export * from './hitl/approvalDecisionNoteAudit.js';
|
|
@@ -176,6 +184,8 @@ export * from './request/printNotification.js';
|
|
|
176
184
|
export * from './seatContract.js';
|
|
177
185
|
export * from './agentSession/contract.js';
|
|
178
186
|
export * from './agentSession/backgroundView.js';
|
|
187
|
+
export { readEngineAgentRegistry, isEngineAgentRegistryListingSuperseded } from './agentSession/engineAgentRegistryRead.js';
|
|
188
|
+
export type { EngineAgentRegistryClient } from './agentSession/engineAgentRegistryRead.js';
|
|
179
189
|
export * from './model/catalog.js';
|
|
180
190
|
export * from './model/catalogLoader.js';
|
|
181
191
|
export * from './model/providerAuth.js';
|
package/dist/index.js
CHANGED
|
@@ -1,9 +1,8 @@
|
|
|
1
1
|
export * from './seam.js';
|
|
2
2
|
export * from './workflow.js';
|
|
3
|
-
export
|
|
3
|
+
export { _resetEngineTaskNotificationForTest, _resetNotificationQueuePortForTest, _setWatcherTimingForTest, _tickWatchOnceForTest, classifyHookFailureFrame, classifyHookNoticeFrame, deriveNotificationResidualLines, dropQueuedNotificationsForRun, enqueueBgChildNotification, enqueueEngineWorkflowNotification, enqueuePlanReviewOutcome, HOOK_NOTICE_WARN_PREFIX, hookNoticeLastCheckText, installBgTaskStatusProbe, installNotificationQueuePort, installWorkflowStatusProbe, isEngineWorkflowNotified, isHookNoticeFrame, isOwnWorkflowRun, isTaskNotificationObjective, isWorkflowCompletionCardEnqueued, listOwnWorkflowRuns, markEngineWorkflowNotified, normalizeTaskNotification, noteOwnWorkflowRun, noteWorkflowCompletionCardEnqueued, notificationDropCounters, notificationQueuePortMisses, outstandingAbandonedCount, outstandingBgTaskPrompt, outstandingDeliverableWorkflowCount, outstandingWorkflowCount, parseTranscriptNotificationSeeds, registerOutstandingBgTask, registerOutstandingWorkflowRun, renderTaskNotificationXml, splitApiErrorSupplement, subscribeOutstandingWorkflows, taskNotificationDedupKey, taskNotificationDedupKeyFromWire, taskNotificationDeliverySupplement, } from './notifications.js';
|
|
4
4
|
export * from './peerFrames.js';
|
|
5
5
|
export * from './steering.js';
|
|
6
|
-
export * from './diagnostics.js';
|
|
7
6
|
export * from './retryStatus.js';
|
|
8
7
|
export * from './sessionMemoryStatus.js';
|
|
9
8
|
export * from './memorySpecWire.js';
|
|
@@ -12,11 +11,11 @@ export * from './adapt/textSegmentAuthority.js';
|
|
|
12
11
|
export * from './engineHttpTools.js';
|
|
13
12
|
export * from './sdkWireTransit.js';
|
|
14
13
|
export { SEMA_SEGMENT_ID_KEY } from './adapt/textStream.js';
|
|
15
|
-
export
|
|
14
|
+
export { __resetSubagentContentStoreConfigForTests, __resetSubagentOwnerLedgerForTests, clearSubagentContent, coerceOutput, configureSubagentContentStore, getBgParentRun, getBgParentRunOwner, getBgTerminalFacts, getSubagentContentSnapshot, isOwnEngineRun, parentToolCallIdOf, planSubagentViewSlots, publishSubagentContentEvent, pushSubagentLocalEcho, recordBgParentRun, recordBgTerminalFacts, recordOwnEngineRun, recordSubagentOwner, recordSubagentOwnerFromProgress, registerSubagentAlias, settleSubagentContent, SUBAGENT_CONTENT_STORE_DEFAULTS, subagentContentStoreConfig, subagentOwnerSessionConflicts, subscribeSubagentContent, } from './subagentContentStore.js';
|
|
16
15
|
export * from './engineAgentPanelStore.js';
|
|
17
16
|
export * from './engineAgentAbsence.js';
|
|
18
17
|
export * from './fleetAgentPanelProjection.js';
|
|
19
|
-
export
|
|
18
|
+
export { _resetLiveQuestionStore, hasLocalQuestionResponder, hasQuestionOverlay, hasQuestionOverlayFor, onQuestionFrame, onQuestionFrameFor, publishQuestionFrame, publishQuestionFrameFor, registerLocalQuestionResponder, respondToQuestion, setQuestionRespond, } from './liveQuestionStore.js';
|
|
20
19
|
export * from './engineInlineTaskStats.js';
|
|
21
20
|
export * from './printToolResultFrame.js';
|
|
22
21
|
export * from './engineCapsCache.js';
|
|
@@ -65,7 +64,7 @@ export * from './sseIdleTriage.js';
|
|
|
65
64
|
export * from './engineWireSdk.js';
|
|
66
65
|
export * from './classifierVerdictWire.js';
|
|
67
66
|
export { stripSystemReminderBlocks, unwrapSystemReminder } from './systemReminderTag.js';
|
|
68
|
-
export
|
|
67
|
+
export { ACTIVE_RUN_BUSY_ERROR_CODE, asModelFallbackReason, CAPABILITY_SELF_ORCHESTRATION_REQUIRED, CONFIG_DELEGATION_ENTRY_CAPS, CONFIG_LIMIT_INVALID, CONFIG_LIMIT_UNKNOWN_KEY, CONFIG_MEMORY_PROJECT_KEY_SPELLING, CONFIG_MEMORY_WRITE_SCOPE_MISMATCH, CONFIG_REFUSAL_CODES, CONFIG_STRATEGY_FIND_LIMIT_INVALID, CONFIG_STRATEGY_MAX_SIZE_INVALID, DECIDE_WORKFLOW_HOST_UNKNOWN, DECIDE_WORKFLOW_LANE_CODES, DECIDE_WORKFLOW_REMEMBER_UNSUPPORTED, DELEGATION_CAP_CODES, DELEGATION_CONCURRENCY_CAP, DELEGATION_SESSION_CAP, delegationCapDispositionOf, DRAINING_ERROR_CODE, ENGINE_STOP_REASONS, engineStopReasonToCc, ENV_LIFETIME_EXPIRED, GATE_PARKED_ERROR_CODE, isConfigRefusalCode, isDelegationCapCode, isInterruptedToolEndCode, isLimitsExceededCode, isRewindFamilyCode, isWorkflowParkRefusalCode, LIMITS_MAX_COST_EXCEEDED, LIMITS_MAX_TOKENS_EXCEEDED, LIMITS_MAX_TURNS_EXCEEDED, LIMITS_MAX_WALLTIME_EXCEEDED, MCP_SERVER_REVOKED, MODEL_FALLBACK_INHERIT_NO_TIER_BINDING, OUTPUT_INVALID, RESUME_AT_ERROR_CODE_PREFIX, RESUME_CONTEXT_UNAVAILABLE, RESUME_ENV_FAILED, RESUME_PLACEMENT_MISMATCH, RESUME_POLICY_FOLD_CODE, RESUME_PREFLIGHT_REJECTED, RESUME_REOPEN_CODES, RESUME_RETRY_LATER_CODES, RESUME_TOOL_CONTRACT_MISMATCH, RESUME_TOOL_UNAVAILABLE, RESUME_USAGE_WINDOW_EXHAUSTED, REWIND_ERROR_CODE_PREFIXES, SCENARIO_NOT_ALLOWED_ERROR_CODE, STOP_CONFLICT_CODES, STREAM_MAX_DURATION, TOOL_END_INTERRUPTED_NEVER_STARTED, TOOL_END_INTERRUPTED_OUTCOME_UNKNOWN, USAGE_WINDOW_EXHAUSTED, WORKFLOW_PARK_REFUSAL_CODES, } from './engineErrorCodes.js';
|
|
69
68
|
export * from './agentsWireCaps.js';
|
|
70
69
|
export * from './attachmentsWireCaps.js';
|
|
71
70
|
export * from './clientContextWireCaps.js';
|
|
@@ -112,20 +111,20 @@ export * from './limitsWire.js';
|
|
|
112
111
|
export * from './interactiveToolsWire.js';
|
|
113
112
|
export * from './headlessPermissionModeWire.js';
|
|
114
113
|
export * from './headlessReconnectWire.js';
|
|
115
|
-
export
|
|
114
|
+
export { coerceTaskStatus, coerceWorkflowStatus, CONTROL_TOOL_VERBS, FLEET_TASK_ROW_KEYS_NOT_PROJECTED, FLEET_TASK_ROW_WIRE_KEYS, FLEET_TASK_VIEW_KEYS, FLEET_WORKFLOW_ROW_KEYS_NOT_PROJECTED, FLEET_WORKFLOW_ROW_WIRE_KEYS, FLEET_WORKFLOW_VIEW_KEYS, projectDescription, projectTasks, projectWorkflows, TERMINAL_FLEET_TASK_STATUSES, wireResumable, wireRowUsage, } from './fleet/fleetProjection.js';
|
|
116
115
|
export * from './fleet/fleetLedger.js';
|
|
117
116
|
export * from './fleet/workflowSizeWarning.js';
|
|
118
117
|
export * from './subagent/engineDelegatedPrompt.js';
|
|
119
118
|
export * from './subagent/engineRowStopGate.js';
|
|
120
119
|
export * from './subagent/engineSubagentOutput.js';
|
|
121
120
|
export * from './subagent/engineSubagentSteer.js';
|
|
122
|
-
export
|
|
121
|
+
export { __resetRetainWithoutWakeWarningForTests, auditRetainWithoutWake, classifySubagentResumeFailure, resolveOwnerRunId, resolveSubagentContinueTarget, resolveSubagentResumeContext, resumeSettledSubagent, SUBAGENT_RESUME_CAP, subagentResumeAvailable, } from './subagent/engineSubagentResume.js';
|
|
123
122
|
export * from './subagent/engineTaskHandleWire.js';
|
|
124
123
|
export * from './subagent/engineCompactWire.js';
|
|
125
124
|
export * from './subagent/engineSubagentTail.js';
|
|
126
|
-
export
|
|
125
|
+
export { __resetBgOwnerAbsenceForTests, } from './subagent/subagentOwnerAbsence.js';
|
|
127
126
|
export * from './engineSessionParam.js';
|
|
128
|
-
export
|
|
127
|
+
export { engineWireTarget, engineWireTargetFor, installEngineWireTarget, installEngineWireTargetFor, } from './engineWireTarget.js';
|
|
129
128
|
export * from './principalWire.js';
|
|
130
129
|
export * from './wireErrorTriage.js';
|
|
131
130
|
export * from './resumeRefusalCopy.js';
|
|
@@ -140,20 +139,19 @@ export { ENGINE_FIRED_HOOK_EVENTS, PLUGIN_HOOK_DISPOSITIONS, PLUGIN_HOOK_REASONS
|
|
|
140
139
|
export * from './liveInitToolFace.js';
|
|
141
140
|
export * from './printInitToolFace.js';
|
|
142
141
|
export * from './model/providerPresets.js';
|
|
143
|
-
export
|
|
142
|
+
export { __setDecideTimeoutRetryBudgetForTests, backendDeny, DecideTransportRetryExhaustedError, findPendingForTask, HitlBridge, HitlSafetyError, isPlanReviewModeAfter, makeHitlCanUseTool, PLAN_REVIEW_MODE_AFTER_WORDS, readDecideCurrentPending, readWireErrorCode, } from './hitl/hitlBridge.js';
|
|
144
143
|
export * from './hitl/suspendedReopen.js';
|
|
145
144
|
export * from './hitl/approvalOutcomeNote.js';
|
|
146
145
|
export * from './hitl/approvalResolution.js';
|
|
147
146
|
export { toolEndOutputText, ENGINE_ABORT_TOOL_RESULT } from './hitl/frameRouter.js';
|
|
148
|
-
export {
|
|
149
|
-
export * from './hitl/hitlHostSurface.js';
|
|
147
|
+
export { _resetHitlHostSurfaceForTest, CANCEL_DENY_BUDGET_MS, CANCEL_DENY_WARN_TEXT, EDIT_NOT_FORWARDED_WARN_TEXT, EDIT_REFUSED_ON_BLIND_ASK_WARN_TEXT, hitlHostSurfaceFor, hitlHostSurfaceMisses, hitlHostSurfaceMissesFor, installHitlHostSurface, installHitlHostSurfaceFor, observeCancelByDeny, REMEMBER_NOT_APPLIED_WARN_TEXT, RULE_NOT_SENT_REJECTED_WARN_TEXT, RULE_NOT_SENT_WARN_TEXT, surfaceEditRefusedOnBlindAsk, surfaceForCurrentSession, surfaceRememberNotApplied, } from './hitl/hitlHostSurface.js';
|
|
150
148
|
export * from './hitl/toolApprovalWire.js';
|
|
151
149
|
export * from './hitl/editedRuleTextPrecheck.js';
|
|
152
150
|
export * from './coreValuePorts.js';
|
|
153
151
|
export * from './hitl/askGateWire.js';
|
|
154
152
|
export * from './hitl/planReviewWire.js';
|
|
155
153
|
export { PLAN_REVIEW_QUESTION_ID_PREFIX, REOPEN_ID_TAIL, approvalCallKey, askGateQuestionId, planReviewQuestionId, liveFrameCallKey, armedKeyFromQuestionId, } from './hitl/gateIdentity.js';
|
|
156
|
-
export
|
|
154
|
+
export { _resetArmedGateRegistryForTest, _setGateArmedWaitMsForTest, clearArmedGate, gateArmedWaitMs, notePlanReviewAnswered, onGateArmed, planReviewArmedKey, registerArmedGate, registerArmedGateFor, registerArmedGateFromQuestionId, waitForGateArmed, wasGateArmed, wasGateArmedFor, } from './hitl/armedGateRegistry.js';
|
|
157
155
|
export * from './hitl/parkOwnership.js';
|
|
158
156
|
export * from './hitl/parkRowBirthWait.js';
|
|
159
157
|
export * from './hitl/approvalDecisionNoteAudit.js';
|
|
@@ -173,6 +171,7 @@ export * from './request/printNotification.js';
|
|
|
173
171
|
export * from './seatContract.js';
|
|
174
172
|
export * from './agentSession/contract.js';
|
|
175
173
|
export * from './agentSession/backgroundView.js';
|
|
174
|
+
export { readEngineAgentRegistry, isEngineAgentRegistryListingSuperseded } from './agentSession/engineAgentRegistryRead.js';
|
|
176
175
|
export * from './model/catalog.js';
|
|
177
176
|
export * from './model/catalogLoader.js';
|
|
178
177
|
export * from './model/providerAuth.js';
|
|
@@ -1,10 +1,10 @@
|
|
|
1
1
|
import { hostEnv } from '../hostEnv.js';
|
|
2
2
|
import { resolveModelCatalog, } from './catalog.js';
|
|
3
|
-
export const DEFAULT_CATALOG_SOURCES = [
|
|
3
|
+
export const DEFAULT_CATALOG_SOURCES = Object.freeze([
|
|
4
4
|
'https://raw.githubusercontent.com/sema-agent/sema-model-catalog/main/dist/catalog.json',
|
|
5
5
|
'https://cdn.jsdelivr.net/gh/sema-agent/sema-model-catalog@main/dist/catalog.json',
|
|
6
|
-
];
|
|
7
|
-
export const CATALOG_DEFAULT_HOSTS = ['raw.githubusercontent.com', 'cdn.jsdelivr.net'];
|
|
6
|
+
]);
|
|
7
|
+
export const CATALOG_DEFAULT_HOSTS = Object.freeze(['raw.githubusercontent.com', 'cdn.jsdelivr.net']);
|
|
8
8
|
export const CATALOG_SOURCES_ENV = 'SEMA_CATALOG_SOURCES';
|
|
9
9
|
const DEFAULT_CATALOG_TIMEOUT_MS = 3500;
|
|
10
10
|
const CATALOG_CACHE_RELATIVE_PATH = 'cache/model-catalog.json';
|
|
@@ -39,11 +39,11 @@ export const REQUEST_FIELD_MATRIX = [
|
|
|
39
39
|
{ field: 'reasoningEffort', lanes: ['interactive', 'print', 'utility'], live: false, why: '思考档位(sdk `TaskRequest.reasoningEffort` 七词闭集;上游对表外词 400 响亮拒 ⇒ 本层不预铸第二判官)。档位是请求级的位、与车道无关:交互面 = `/effort` 拨盘,无人值守面 = 档位旗。🔴 端交的必须是**档位词**:「思考 token 数」今天没有上游对位(见 `UPSTREAM_ABSENT_REQUEST_INTENTS` 的 `maxThinkingTokens`),别把一个数字折成档位词发出去', whyUtilityLane: '有座:side-channel 该用显式低档(省钱省时);与 model 同一条理由 —— 本车道上这两位都由壳显式给,不跟用户会话的拨盘走' },
|
|
40
40
|
{ field: 'model', lanes: ['interactive', 'print', 'utility'], live: false, why: '模型选择(sdk `TaskRequest.model`;交互面 = `/model` 中途换模型的拨盘,无人值守面 = 模型旗 / 部署缺省那一路,side-channel 面 = 壳显式挑的那一只)。三条车道都有来源、都是提交面。🔴 0.79.0 改口:修前「print 的模型走另一条路」这句理由被用户面实测证伪 —— 无人值守车道传了模型名却整键不上请求体,于是同一个坏名字在交互态被引擎 400 点名、在无人值守态却安静换成部署缺省并在首帧回显一个没生效的名字。一个**选择**类声明被静默丢掉,后果与收紧类声明被静默丢掉同形(端不读回执就以为生效)—— 与 `excludeTools` 补 print 座同律。本层原样透传、不预判模型名(名字的合法性归引擎,本层不铸第二判官)', whyUtilityLane: '有座:side-channel 显式挑便宜的那只模型(不跟用户会话的 `/model` 拨盘走)' },
|
|
41
41
|
{ field: 'images', lanes: ['interactive'], live: false, why: '贴图提交是交互动作,`-p` 的 stdin 没有图片块', whyUtilityLane: '无座:贴图是交互动作,side-channel 的提交体里没有图片块' },
|
|
42
|
-
{ field: 'resumeAt/resumeAtMode/restoreFiles/
|
|
42
|
+
{ field: 'resumeAt/resumeAtMode/restoreFiles/rewindFilesTo', lanes: ['interactive'], live: false, why: 'E18 `/rewind` 是交互命令;四键同生同灭(CC-145:core 6.0.0 起 both 臂发 restoreFiles;CC-223 起退役键 rewindFiles 不再有座 —— 交它按表外子键响亮拒;resumeAtMode 是 both/conversation 两臂恒带的排他截语义位)', whyUtilityLane: '无座:回退是交互命令,而 side-channel 是一次性的独立会话,没有可回退的历史' },
|
|
43
43
|
{ field: 'clientContext', lanes: ['interactive'], live: false, why: 'IANA 时区 + 可选邮箱 → core 本地化 `# Environment` 的 today;print 同样跑在用户机器上,缺席让引擎误标 (UTC)', gap: true, whyUtilityLane: '无座:本地化 today 的用途在用户会话的环境段,而 side-channel 的系统提示由壳整段给出 —— 这一列我判不准要不要(与本行 `gap` 同一条待办:要补先单独立项)' },
|
|
44
44
|
{ field: 'scratchpadDir', lanes: ['interactive'], live: true, why: '[816]③ per-session 暂存目录;print 也有 session,缺席让 `-p` 的工具写不进 exemptDir', gap: true, whyUtilityLane: '无座:per-session 暂存目录是给**工具**写的,零工具面上没人写' },
|
|
45
45
|
];
|
|
46
|
-
export const LIVE_DEFAULT_FIELDS = [
|
|
46
|
+
export const LIVE_DEFAULT_FIELDS = Object.freeze([
|
|
47
47
|
'cwd',
|
|
48
48
|
'additionalDirectories',
|
|
49
49
|
'additionalReadDirectories',
|
|
@@ -54,7 +54,7 @@ export const LIVE_DEFAULT_FIELDS = [
|
|
|
54
54
|
'suggestNextPrompts',
|
|
55
55
|
'compactionModel',
|
|
56
56
|
'sessionId(三态解析)',
|
|
57
|
-
];
|
|
57
|
+
]);
|
|
58
58
|
export const TASK_REQUEST_OMISSION_CAUSES = Object.freeze([
|
|
59
59
|
'upstream_absent',
|
|
60
60
|
'other_channel',
|
|
@@ -125,7 +125,7 @@ const INPUT_KEY_ROUTES = {
|
|
|
125
125
|
memoryCapture: row('memoryCapture'),
|
|
126
126
|
memory: row('memory'),
|
|
127
127
|
approverPosture: row('approverPosture'),
|
|
128
|
-
rewind: row('resumeAt/resumeAtMode/restoreFiles/
|
|
128
|
+
rewind: row('resumeAt/resumeAtMode/restoreFiles/rewindFilesTo'),
|
|
129
129
|
repo: row('repo'),
|
|
130
130
|
council: row('council'),
|
|
131
131
|
debate: row('debate'),
|
|
@@ -585,11 +585,12 @@ export function assembleTaskRequest(input, lane) {
|
|
|
585
585
|
refuseBadMaxTokens(maxTokensIn);
|
|
586
586
|
refuseBadOutputRetries(outputRetriesIn);
|
|
587
587
|
const rewindRoute = INPUT_KEY_ROUTES.rewind;
|
|
588
|
+
const RETIRED_REWIND_FILES_KEY = 'rewindFiles';
|
|
588
589
|
const REWIND_KEYS = rewindRoute.via === 'matrix' ? rewindRoute.field.split('/') : [];
|
|
589
590
|
const rewindIn = i.rewind;
|
|
590
591
|
if (present(rewindIn) && (typeof rewindIn !== 'object' || Array.isArray(rewindIn))) {
|
|
591
592
|
throw new TypeError(`buildTaskRequest: rewind 只接受对象或缺席(undefined/null)—— 收到 ${coarseShape(rewindIn)}。` +
|
|
592
|
-
'
|
|
593
|
+
'它是四个具名请求键(resumeAt / resumeAtMode / restoreFiles / rewindFilesTo)的合写位,不是任意展开口。错误文本只报形状,不回显值。');
|
|
593
594
|
}
|
|
594
595
|
const rewindObj = present(rewindIn) ? rewindIn : {};
|
|
595
596
|
const rewindWire = {};
|
|
@@ -632,14 +633,23 @@ export function assembleTaskRequest(input, lane) {
|
|
|
632
633
|
continue;
|
|
633
634
|
unknownKeys.push(`settings.${sub}`);
|
|
634
635
|
}
|
|
636
|
+
let retiredRewindFiles = false;
|
|
635
637
|
for (const sub of Object.keys(rewindObj)) {
|
|
636
638
|
if (REWIND_KEYS.includes(sub))
|
|
637
639
|
continue;
|
|
638
640
|
const stray = rewindObj[sub];
|
|
639
641
|
if (!present(stray))
|
|
640
642
|
continue;
|
|
643
|
+
if (sub === RETIRED_REWIND_FILES_KEY)
|
|
644
|
+
retiredRewindFiles = true;
|
|
641
645
|
unknownKeys.push(`rewind.${sub}`);
|
|
642
646
|
}
|
|
647
|
+
if (retiredRewindFiles) {
|
|
648
|
+
throw new TypeError('buildTaskRequest: "rewind.rewindFiles" 是退役键(引擎 core 6.0.0 起退役:「逐轮捕获」那一义被引擎忽略 —— 文件首触追踪恒开,' +
|
|
649
|
+
'无需请求;「回退时一并还原文件」那一义被引擎拒收、改名为 restoreFiles)。本包在装配前拒:在场即拒,true / false 同判。' +
|
|
650
|
+
'处置:删掉这个键;要在回退会话时一并还原文件,改交 ' +
|
|
651
|
+
'rewind.restoreFiles: true(必须与 rewind.resumeAt 同交);只还原文件、不动会话,交 rewind.rewindFilesTo。错误文本只报键名,不回显值。');
|
|
652
|
+
}
|
|
643
653
|
if (unknownKeys.length > 0) {
|
|
644
654
|
const shown = unknownKeys.slice(0, MAX_UNKNOWN_KEYS_SHOWN).map(keyForDisplay).join(', ');
|
|
645
655
|
const more = unknownKeys.length > MAX_UNKNOWN_KEYS_SHOWN ? ` 等共 ${unknownKeys.length} 个` : '';
|
package/dist/rewindWireCaps.d.ts
CHANGED
package/dist/seam.d.ts
CHANGED
|
@@ -2,7 +2,7 @@ import type { ModelUsage, SDKMessage } from '@sema-agent/agent-types';
|
|
|
2
2
|
import type { EngineTurnUsage } from './adapter/downstream/turnUsageToModelUsage.js';
|
|
3
3
|
import type { RunCostReconcile } from './adapter/downstream/terminalToSdkResult.js';
|
|
4
4
|
import type { WiringManifestAutoMode, WiringManifestModelGate, WiringManifestMcpEntryView, WiringManifestHookEntryView, WiringManifestLspSeamView, WiringManifestWriteProtectionView, WiringManifestAutoConsolidationView, WiringManifestReadDenyView, ContextUsageSectionView, PromptManifestSectionView, PromptManifestBlockView, PromptManifestToolView } from './adapter/downstream/eventToSdkMessage.js';
|
|
5
|
-
import type { ToolRosterView, ToolRosterDeltaView } from './toolRoster.js';
|
|
5
|
+
import type { ToolRosterView, ToolRosterDeltaView, WiringManifestHandsView } from './toolRoster.js';
|
|
6
6
|
export interface AbortSignalLike {
|
|
7
7
|
readonly aborted: boolean;
|
|
8
8
|
}
|
|
@@ -162,6 +162,7 @@ export interface WiringManifestChromeEvent {
|
|
|
162
162
|
writeProtection?: WiringManifestWriteProtectionView;
|
|
163
163
|
autoConsolidation?: WiringManifestAutoConsolidationView;
|
|
164
164
|
readDeny?: WiringManifestReadDenyView;
|
|
165
|
+
hands?: WiringManifestHandsView;
|
|
165
166
|
eventId?: string;
|
|
166
167
|
}
|
|
167
168
|
export interface TextSegmentCommittedRow {
|
package/dist/seatContract.js
CHANGED
|
@@ -12,13 +12,13 @@ const isObject = (v) => typeof v === "object" && v !== null;
|
|
|
12
12
|
const isAbsent = (v) => typeof v === "undefined";
|
|
13
13
|
const optionalString = (v) => isAbsent(v) || typeof v === "string";
|
|
14
14
|
const inTuple = (tuple, v) => tuple.includes(v);
|
|
15
|
-
export const TOOL_PERMISSION_REQUEST_ID_DOMAINS = [
|
|
15
|
+
export const TOOL_PERMISSION_REQUEST_ID_DOMAINS = Object.freeze([
|
|
16
16
|
"live:",
|
|
17
17
|
"durable:",
|
|
18
18
|
"question:",
|
|
19
19
|
"elicit:",
|
|
20
20
|
"plan:",
|
|
21
|
-
];
|
|
21
|
+
]);
|
|
22
22
|
export function toolPermissionRequestIdDomain(requestId) {
|
|
23
23
|
if (typeof requestId !== "string")
|
|
24
24
|
return undefined;
|
package/dist/toolResult.js
CHANGED
|
@@ -2,7 +2,8 @@ import { convertLeadingTabsToSpaces, getPatchFromContents } from './diff/patch.j
|
|
|
2
2
|
import { markEngineWorkflowNotified, registerOutstandingBgTask, registerOutstandingWorkflowRun, } from './notifications.js';
|
|
3
3
|
import { parseWorkflowPollEnvelope, projectWorkflowTaskOutput } from './workflow.js';
|
|
4
4
|
import { asModelFallbackReason } from './engineErrorCodes.js';
|
|
5
|
-
|
|
5
|
+
import { frozenSet } from './frozenSet.js';
|
|
6
|
+
export const STRUCTURED_DETAIL_TYPES = frozenSet([
|
|
6
7
|
'edit',
|
|
7
8
|
'create',
|
|
8
9
|
'update',
|
|
@@ -58,13 +59,8 @@ export function structuredDetailType(structured) {
|
|
|
58
59
|
const MAX_STRUCTURED_FIELD_CHARS = 1_000_000;
|
|
59
60
|
const WF_TERMINAL_STATUSES = new Set([
|
|
60
61
|
'completed',
|
|
61
|
-
'done',
|
|
62
62
|
'failed',
|
|
63
|
-
'stopped',
|
|
64
|
-
'interrupted',
|
|
65
|
-
'error',
|
|
66
63
|
'cancelled',
|
|
67
|
-
'canceled',
|
|
68
64
|
]);
|
|
69
65
|
export const PROTOCOL_MARKERS = {
|
|
70
66
|
bashHead: /^exit code: (-?\d+)(?: \(([^)\n]*)\))?\n(--- stdout ---\n)?/,
|
package/dist/toolRoster.d.ts
CHANGED
|
@@ -63,6 +63,22 @@ export type HandsMountedReading = {
|
|
|
63
63
|
why: 'no-manifest' | 'no-roster' | 'roster-unreadable' | 'mount-condition-absent';
|
|
64
64
|
};
|
|
65
65
|
export declare function handsMountedFromManifest(manifest: unknown): HandsMountedReading;
|
|
66
|
+
export interface WiringManifestHandsView {
|
|
67
|
+
mounted: boolean;
|
|
68
|
+
reason?: string;
|
|
69
|
+
}
|
|
70
|
+
export type HandsSeamReading = {
|
|
71
|
+
kind: 'not_reported';
|
|
72
|
+
} | {
|
|
73
|
+
kind: 'mounted';
|
|
74
|
+
} | {
|
|
75
|
+
kind: 'not_mounted';
|
|
76
|
+
reason?: string;
|
|
77
|
+
};
|
|
78
|
+
export declare function handsSeamReadingOf(view: {
|
|
79
|
+
readonly hands?: WiringManifestHandsView;
|
|
80
|
+
} | null | undefined): HandsSeamReading;
|
|
81
|
+
export declare function handsSeamDetail(reading: HandsSeamReading): string;
|
|
66
82
|
export declare function handsMountedDetail(reading: HandsMountedReading): string;
|
|
67
83
|
export declare function toolRosterNames(roster: ToolRosterView | undefined): readonly string[];
|
|
68
84
|
export interface ToolShim {
|
package/dist/toolRoster.js
CHANGED
|
@@ -1,3 +1,5 @@
|
|
|
1
|
+
import { displayUntrusted } from './displayUntrusted.js';
|
|
2
|
+
import { HANDS_REASON_NO_EXECUTION_ENV, projectHandsSection } from './handsSeam.js';
|
|
1
3
|
const str = (v) => typeof v === 'string' && v.length > 0 ? v : undefined;
|
|
2
4
|
const strArr = (v) => Array.isArray(v) ? v.filter((x) => typeof x === 'string') : undefined;
|
|
3
5
|
const obj = (v) => typeof v === 'object' && v !== null && !Array.isArray(v) ? v : undefined;
|
|
@@ -135,14 +137,51 @@ export function handsMountedFromManifest(manifest) {
|
|
|
135
137
|
const rows = roster.entries.filter((e) => e.mountedBy === 'hands').length;
|
|
136
138
|
return rows > 0 ? { kind: 'mounted', rows } : { kind: 'not-mounted' };
|
|
137
139
|
}
|
|
138
|
-
export function
|
|
139
|
-
|
|
140
|
+
export function handsSeamReadingOf(view) {
|
|
141
|
+
const seam = typeof view === 'object' && view !== null ? projectHandsSection(view) : undefined;
|
|
142
|
+
if (seam === undefined)
|
|
143
|
+
return { kind: 'not_reported' };
|
|
144
|
+
if (seam.mounted)
|
|
145
|
+
return { kind: 'mounted' };
|
|
146
|
+
return seam.reason !== undefined ? { kind: 'not_mounted', reason: seam.reason } : { kind: 'not_mounted' };
|
|
147
|
+
}
|
|
148
|
+
const HANDS_NONE_STEM = 'this leg of the run was assembled with NO built-in file-and-shell tools';
|
|
149
|
+
const HANDS_NONE_TAIL = "so on this leg the model had no tool of the engine's own for editing files or running commands (tools mounted by other conditions, such as external servers, and sub-runs delegated to other legs are not covered by this reading)";
|
|
150
|
+
const HANDS_REASON_DISPLAY_MAX = 64;
|
|
151
|
+
const HANDS_NOT_REPORTED_SENTENCE = 'whether this leg has built-in file-and-shell tools is not stated here — the engine did not report its hands seam (older engines and servers, and the static half of a manifest, never do); the tool roster may still answer it';
|
|
152
|
+
export function handsSeamDetail(reading) {
|
|
153
|
+
const kind = typeof reading === 'object' && reading !== null ? reading.kind : undefined;
|
|
154
|
+
switch (kind) {
|
|
140
155
|
case 'mounted':
|
|
141
|
-
return
|
|
156
|
+
return 'this leg of the run was assembled with its built-in file tools mounted — the engine says so; whether a shell is reachable is answered by the tool roster, not by this statement';
|
|
157
|
+
case 'not_mounted': {
|
|
158
|
+
const raw = reading.reason;
|
|
159
|
+
const reason = typeof raw === 'string' && raw.length > 0 ? raw : undefined;
|
|
160
|
+
const why = reason === undefined
|
|
161
|
+
? 'the engine states it mounted no hands on this leg (it gave no reason)'
|
|
162
|
+
: reason === HANDS_REASON_NO_EXECUTION_ENV
|
|
163
|
+
? 'the engine states it mounted no hands on this leg because no execution environment was supplied'
|
|
164
|
+
: `the engine states it mounted no hands on this leg (reason: ${displayUntrusted(reason, { max: HANDS_REASON_DISPLAY_MAX })}, a word this build does not know)`;
|
|
165
|
+
return `${HANDS_NONE_STEM} — ${why}, ${HANDS_NONE_TAIL}`;
|
|
166
|
+
}
|
|
167
|
+
default:
|
|
168
|
+
return HANDS_NOT_REPORTED_SENTENCE;
|
|
169
|
+
}
|
|
170
|
+
}
|
|
171
|
+
export function handsMountedDetail(reading) {
|
|
172
|
+
const r = reading;
|
|
173
|
+
const kind = typeof r === 'object' && r !== null ? r.kind : undefined;
|
|
174
|
+
switch (kind) {
|
|
175
|
+
case 'mounted': {
|
|
176
|
+
const rows = r.rows;
|
|
177
|
+
if (typeof rows === 'number' && Number.isInteger(rows) && rows > 0)
|
|
178
|
+
return `this run was assembled with file-and-shell tools mounted (${rows} of them)`;
|
|
179
|
+
return HANDS_NOT_REPORTED_SENTENCE;
|
|
180
|
+
}
|
|
142
181
|
case 'not-mounted':
|
|
143
|
-
return
|
|
182
|
+
return `${HANDS_NONE_STEM} — the engine reports a roster and not one row was mounted by that condition, ${HANDS_NONE_TAIL}`;
|
|
144
183
|
case 'unknown':
|
|
145
|
-
switch (
|
|
184
|
+
switch (r.why) {
|
|
146
185
|
case 'no-manifest':
|
|
147
186
|
return 'whether this run has file-and-shell tools is unknown — no assembly manifest was observed for it';
|
|
148
187
|
case 'no-roster':
|
|
@@ -152,7 +191,9 @@ export function handsMountedDetail(reading) {
|
|
|
152
191
|
case 'mount-condition-absent':
|
|
153
192
|
return 'whether this run has file-and-shell tools is unknown — this engine does not report which condition mounted each tool, so an empty count here would be a fact about the reader, not about the run';
|
|
154
193
|
}
|
|
194
|
+
return HANDS_NOT_REPORTED_SENTENCE;
|
|
155
195
|
}
|
|
196
|
+
return HANDS_NOT_REPORTED_SENTENCE;
|
|
156
197
|
}
|
|
157
198
|
export function toolRosterNames(roster) {
|
|
158
199
|
return roster?.entries.map((e) => e.name) ?? [];
|