@sema-agent/client-core 0.84.1 → 0.85.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 (84) hide show
  1. package/CHANGELOG.md +149 -0
  2. package/README.md +18 -11
  3. package/dist/adapt/arms.js +1 -1
  4. package/dist/adapt.d.ts +1 -1
  5. package/dist/adapt.js +1 -1
  6. package/dist/adapter/downstream/terminalToSdkResult.js +9 -5
  7. package/dist/adapter/runStream.js +6 -2
  8. package/dist/agentSession/engineSessionBackgroundStop.d.ts +50 -0
  9. package/dist/agentSession/engineSessionBackgroundStop.js +291 -0
  10. package/dist/agentsWireCaps.d.ts +2 -1
  11. package/dist/cloudConfigWireCaps.js +2 -1
  12. package/dist/corruptSession.d.ts +3 -0
  13. package/dist/corruptSession.js +29 -0
  14. package/dist/corruptSessionCopy.d.ts +1 -0
  15. package/dist/corruptSessionCopy.js +4 -0
  16. package/dist/decideFailureNote.js +4 -1
  17. package/dist/decideReceipt.d.ts +6 -0
  18. package/dist/decideReceipt.js +30 -1
  19. package/dist/effortWire.d.ts +2 -1
  20. package/dist/effortWire.js +2 -4
  21. package/dist/engineErrorCodes.d.ts +9 -0
  22. package/dist/engineErrorCodes.js +29 -0
  23. package/dist/engineNoticeCodes.d.ts +9 -0
  24. package/dist/engineNoticeCodes.js +44 -156
  25. package/dist/engineWireFor.d.ts +43 -0
  26. package/dist/engineWireFor.js +399 -0
  27. package/dist/engineWireSdk.d.ts +4 -0
  28. package/dist/fileHistoryCaptureCapability.d.ts +4 -1
  29. package/dist/fileHistoryCaptureCapability.js +43 -9
  30. package/dist/gateVocabulary.d.ts +1 -2
  31. package/dist/gateVocabulary.js +1 -22
  32. package/dist/generated/engineNoticeTables.d.ts +3 -0
  33. package/dist/generated/engineNoticeTables.js +156 -0
  34. package/dist/generated/toolNameTables.d.ts +2 -0
  35. package/dist/generated/toolNameTables.js +43 -0
  36. package/dist/headlessPermissionModeWire.js +2 -4
  37. package/dist/hitl/frameRouter.js +4 -2
  38. package/dist/hitl/parkResolver.js +3 -1
  39. package/dist/hitl/planReviewWire.d.ts +11 -0
  40. package/dist/hitl/planReviewWire.js +177 -69
  41. package/dist/hitl/rosterMountedNames.d.ts +2 -0
  42. package/dist/hitl/rosterMountedNames.js +38 -0
  43. package/dist/hitl/sessionPolicyDeliverable.d.ts +6 -2
  44. package/dist/hitl/sessionPolicyDeliverable.js +25 -45
  45. package/dist/hitl/sessionPolicyWire.js +1 -38
  46. package/dist/hitl/toolApprovalWire.d.ts +4 -2
  47. package/dist/hitl/toolApprovalWire.js +4 -2
  48. package/dist/index.d.ts +9 -3
  49. package/dist/index.js +6 -2
  50. package/dist/permissionWireCaps.d.ts +2 -1
  51. package/dist/permissionWireCaps.js +2 -7
  52. package/dist/request/taskRequest.d.ts +2 -0
  53. package/dist/request/taskRequest.js +18 -1
  54. package/dist/resumeRefusalCopy.js +4 -2
  55. package/dist/runTerminal.js +4 -0
  56. package/dist/sandboxWire.js +1 -1
  57. package/dist/sealedKeyCapability.d.ts +17 -0
  58. package/dist/sealedKeyCapability.js +42 -0
  59. package/dist/seatContract.d.ts +2 -1
  60. package/dist/seatContract.js +5 -21
  61. package/dist/subagent/engineCompactWire.d.ts +13 -2
  62. package/dist/subagent/engineCompactWire.js +48 -37
  63. package/dist/subagent/engineDelegatedPrompt.d.ts +9 -1
  64. package/dist/subagent/engineDelegatedPrompt.js +16 -16
  65. package/dist/subagent/engineRowStopGate.d.ts +2 -2
  66. package/dist/subagent/engineRowStopGate.js +4 -4
  67. package/dist/subagent/engineSubagentOutput.d.ts +8 -0
  68. package/dist/subagent/engineSubagentOutput.js +37 -18
  69. package/dist/subagent/engineSubagentResume.d.ts +11 -2
  70. package/dist/subagent/engineSubagentResume.js +28 -14
  71. package/dist/subagent/engineSubagentSteer.d.ts +10 -1
  72. package/dist/subagent/engineSubagentSteer.js +16 -11
  73. package/dist/subagent/engineSubagentTail.d.ts +10 -1
  74. package/dist/subagent/engineSubagentTail.js +35 -17
  75. package/dist/subagent/engineTaskHandleWire.d.ts +13 -0
  76. package/dist/subagent/engineTaskHandleWire.js +41 -20
  77. package/dist/taskRequestWords.d.ts +5 -0
  78. package/dist/taskRequestWords.js +4 -0
  79. package/dist/wireErrorTriage.d.ts +1 -0
  80. package/dist/wireErrorTriage.js +3 -1
  81. package/dist/wireRefusalCopy.d.ts +10 -0
  82. package/dist/wireRefusalCopy.js +62 -2
  83. package/docs/INTEGRATION-CLIENTS.md +679 -18
  84. package/package.json +1 -1
@@ -4,7 +4,7 @@ import { type ApprovalMandateWord } from '../gateVocabulary.js';
4
4
  import type { ToolPermissionRequest } from '../seatContract.js';
5
5
  import { type DenyAttributionRefusalDetail } from '../wireRefusalCopy.js';
6
6
  import { type DecideReceiptView } from '../decideReceipt.js';
7
- import { RULE_OFFER_MATCHES, RULE_OFFER_BATCH_MEMBER_KINDS, RULE_OFFER_UNCOVERED_REASONS, RULE_OFFERS_ABSENCE_REASONS, DENIAL_LIMIT_KINDS } from '@sema-agent/sdk';
7
+ import { RULE_OFFER_MATCHES, RULE_OFFER_BATCH_MEMBER_KINDS, RULE_OFFER_UNCOVERED_REASONS, RULE_OFFERS_ABSENCE_REASONS } from '@sema-agent/sdk';
8
8
  import type { RuleSuggestion, ToolApprovalRespondAck, PersistedRuleAnchor as SdkPersistedRuleAnchor, RuleOfferMatch as SdkRuleOfferMatch, RuleOfferBatchMember as SdkRuleOfferBatchMember, RuleOfferUncoveredDetail as SdkRuleOfferUncoveredDetail, RuleOfferUncoveredReason as SdkRuleOfferUncoveredReason, AskOrigin as SdkAskOrigin, RuleOffersAbsence as SdkRuleOffersAbsence, DenialLimitKind as SdkDenialLimitKind, DenialLimitFallback as SdkDenialLimitFallback } from '@sema-agent/sdk';
9
9
  export declare function isFsApprovalGate(gate: {
10
10
  kind?: unknown;
@@ -58,7 +58,9 @@ export type AskOrigin = SdkAskOrigin;
58
58
  export type RuleOffersAbsence = SdkRuleOffersAbsence;
59
59
  export type DenialLimitKind = SdkDenialLimitKind;
60
60
  export type DenialLimitFallback = SdkDenialLimitFallback;
61
- export { RULE_OFFERS_ABSENCE_REASONS, DENIAL_LIMIT_KINDS };
61
+ export { RULE_OFFERS_ABSENCE_REASONS };
62
+ export declare const ASK_ORIGIN_WORDS: readonly string[];
63
+ export declare const APPROVAL_MANDATE_WORDS: readonly ["operator_always", "tool_marks", "probe_mandate", "probe_unanswered", "write_protection", "write_protection_unresolved"];
62
64
  export type WireRuleOffer = {
63
65
  kind: 'single';
64
66
  rule: string;
@@ -11,7 +11,7 @@ import { isApprovalMandateWord } from '../gateVocabulary.js';
11
11
  import { denyAttributionRefusalFromError } from '../wireRefusalCopy.js';
12
12
  import { decideFailureNote } from '../decideFailureNote.js';
13
13
  import { readDecideReceipt } from '../decideReceipt.js';
14
- import { RULE_OFFER_MATCHES, RULE_OFFER_BATCH_MEMBER_KINDS, RULE_OFFER_UNCOVERED_REASONS, RULE_OFFERS_ABSENCE_REASONS, DENIAL_LIMIT_KINDS, } from '@sema-agent/sdk';
14
+ import { RULE_OFFER_MATCHES, RULE_OFFER_BATCH_MEMBER_KINDS, RULE_OFFER_UNCOVERED_REASONS, RULE_OFFERS_ABSENCE_REASONS, ASK_ORIGINS, PERSISTED_RULE_MANDATES, } from '@sema-agent/sdk';
15
15
  export function isFsApprovalGate(gate) {
16
16
  if (!gate)
17
17
  return false;
@@ -52,7 +52,9 @@ export function structurallyEqual(a, b) {
52
52
  return ka.every(k => structurallyEqual(a[k], b[k]));
53
53
  }
54
54
  export { RULE_OFFER_MATCHES, RULE_OFFER_BATCH_MEMBER_KINDS, RULE_OFFER_UNCOVERED_REASONS };
55
- export { RULE_OFFERS_ABSENCE_REASONS, DENIAL_LIMIT_KINDS };
55
+ export { RULE_OFFERS_ABSENCE_REASONS };
56
+ export const ASK_ORIGIN_WORDS = ASK_ORIGINS;
57
+ export const APPROVAL_MANDATE_WORDS = PERSISTED_RULE_MANDATES;
56
58
  export const APPROVAL_DENY_SETTLED_BY_WORDS = Object.freeze(['human', 'policy']);
57
59
  export function readApprovalDenySettledBy(decision) {
58
60
  if (decision === null || typeof decision !== 'object')
package/dist/index.d.ts CHANGED
@@ -22,7 +22,8 @@ export { _resetLiveQuestionStore, hasLocalQuestionResponder, hasQuestionOverlay,
22
22
  export type { AskQuestion, AskQuestionOption, QuestionAnswer, QuestionFrame, } from './liveQuestionStore.js';
23
23
  export * from './engineInlineTaskStats.js';
24
24
  export * from './printToolResultFrame.js';
25
- export * from './engineCapsCache.js';
25
+ export { __resetEngineCapsCacheForTests, engineCapState, engineCapString, engineCapsGeneration, engineCapsSettled, engineCapTrue, engineCapValue, invalidateEngineCaps, kickEngineCapsProbe, } from './engineCapsCache.js';
26
+ export type { EngineCapState, EngineCapValueState, } from './engineCapsCache.js';
26
27
  export * from './sqlEngineCapability.js';
27
28
  export * from './writeProtectionCapability.js';
28
29
  export * from './webSearchBackendCapability.js';
@@ -71,7 +72,7 @@ export * from './engineWireSdk.js';
71
72
  export * from './classifierVerdictWire.js';
72
73
  export { stripSystemReminderBlocks, unwrapSystemReminder } from './systemReminderTag.js';
73
74
  export { findSystemReminderOpenTag, type SystemReminderOpenTagSpan } from './systemReminderTag.js';
74
- export { ACTIVE_RUN_BUSY_ERROR_CODE, asModelFallbackReason, CAPABILITY_SELF_ORCHESTRATION_REQUIRED, CONFIG_DELEGATION_ENTRY_CAPS, CONFIG_LEGACY_TOOL_NAME, 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, PARKED_RESUME_STARTUP_FAILED, 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';
75
+ export { ACTIVE_RUN_BUSY_ERROR_CODE, asModelFallbackReason, CAPABILITY_SELF_ORCHESTRATION_REQUIRED, CONFIG_DELEGATION_ENTRY_CAPS, CONFIG_LEGACY_TOOL_NAME, 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, CORRUPT_SESSION_ERROR_CODE, DECIDE_CLAIM_LOST, DECIDE_GATE_MOVED, DECIDE_NOT_PARKED, DECIDE_PARK_MOVED_CODES, 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, isCorruptSessionCode, isDecideParkMovedCode, isDelegationCapCode, isInterruptedToolEndCode, isLimitsExceededCode, isRewindFamilyCode, isStatusDerivedCoarseCode, 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, PARKED_RESUME_STARTUP_FAILED, 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, STATUS_DERIVED_COARSE_CODES, 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';
75
76
  export type { DelegationCapDisposition, ModelFallbackReason, } from './engineErrorCodes.js';
76
77
  export * from './agentsWireCaps.js';
77
78
  export * from './attachmentsWireCaps.js';
@@ -88,6 +89,7 @@ export * from './oneShotWireCaps.js';
88
89
  export * from './rewindWireCaps.js';
89
90
  export * from './rewindArchiveCapability.js';
90
91
  export * from './fileHistoryCaptureCapability.js';
92
+ export * from './sealedKeyCapability.js';
91
93
  export * from './registryQuotaUsage.js';
92
94
  export * from './selfOrchestrationWireCaps.js';
93
95
  export * from './skillsWireCaps.js';
@@ -129,7 +131,7 @@ export * from './subagent/engineRowStopGate.js';
129
131
  export * from './subagent/engineSubagentOutput.js';
130
132
  export * from './subagent/engineSubagentSteer.js';
131
133
  export { __resetRetainWithoutWakeWarningForTests, auditRetainWithoutWake, classifySubagentResumeFailure, resolveOwnerRunId, resolveSubagentContinueTarget, resolveSubagentResumeContext, resumeSettledSubagent, SUBAGENT_RESUME_CAP, subagentResumeAvailable, } from './subagent/engineSubagentResume.js';
132
- export type { RetainWithoutWakeInput, RetainWithoutWakeVerdict, SubagentOwnerContext, SubagentResumeContext, SubagentResumeFacade, SubagentResumeFailureKind, SubagentResumeFailureVerdict, SubagentResumeOutcome, } from './subagent/engineSubagentResume.js';
134
+ export type { RetainWithoutWakeInput, RetainWithoutWakeVerdict, SubagentOwnerContext, SubagentResumeContext, SubagentResumeFacade, SubagentResumeFailureKind, SubagentResumeFailureVerdict, SubagentResumeOutcome, SubagentResumeWire, SubagentResumeWireClient, } from './subagent/engineSubagentResume.js';
133
135
  export * from './subagent/engineTaskHandleWire.js';
134
136
  export * from './subagent/engineCompactWire.js';
135
137
  export * from './subagent/engineSubagentTail.js';
@@ -139,6 +141,8 @@ export { engineWireTarget, engineWireTargetFor, installEngineWireTarget, install
139
141
  export type { EngineWireTarget, } from './engineWireTarget.js';
140
142
  export * from './principalWire.js';
141
143
  export * from './wireErrorTriage.js';
144
+ export * from './corruptSession.js';
145
+ export * from './corruptSessionCopy.js';
142
146
  export * from './resumeRefusalCopy.js';
143
147
  export * from './wireRefusalCopy.js';
144
148
  export * from './decideReceipt.js';
@@ -187,6 +191,8 @@ export * from './agentSession/contract.js';
187
191
  export * from './agentSession/backgroundView.js';
188
192
  export { readEngineAgentRegistry, isEngineAgentRegistryListingSuperseded } from './agentSession/engineAgentRegistryRead.js';
189
193
  export type { EngineAgentRegistryClient } from './agentSession/engineAgentRegistryRead.js';
194
+ export { stopEngineSessionBackground, engineSessionBackgroundReceiptReadingOf, ENGINE_SESSION_BACKGROUND_RECEIPT_STATES, } from './agentSession/engineSessionBackgroundStop.js';
195
+ export type { EngineSessionBackgroundStopClient, EngineSessionBackgroundStopWire, EngineSessionBackgroundStopOptions, EngineSessionBackgroundReceipt, EngineSessionBackgroundStopUnavailableWhy, EngineSessionBackgroundStopRefusedWhy, EngineSessionBackgroundStopResult, EngineSessionBackgroundReceiptState, EngineSessionBackgroundReceiptReading, } from './agentSession/engineSessionBackgroundStop.js';
190
196
  export * from './model/catalog.js';
191
197
  export * from './model/catalogLoader.js';
192
198
  export * from './model/providerAuth.js';
package/dist/index.js CHANGED
@@ -18,7 +18,7 @@ export * from './fleetAgentPanelProjection.js';
18
18
  export { _resetLiveQuestionStore, hasLocalQuestionResponder, hasQuestionOverlay, hasQuestionOverlayFor, onQuestionFrame, onQuestionFrameFor, publishQuestionFrame, publishQuestionFrameFor, registerLocalQuestionResponder, respondToQuestion, setQuestionRespond, } from './liveQuestionStore.js';
19
19
  export * from './engineInlineTaskStats.js';
20
20
  export * from './printToolResultFrame.js';
21
- export * from './engineCapsCache.js';
21
+ export { __resetEngineCapsCacheForTests, engineCapState, engineCapString, engineCapsGeneration, engineCapsSettled, engineCapTrue, engineCapValue, invalidateEngineCaps, kickEngineCapsProbe, } from './engineCapsCache.js';
22
22
  export * from './sqlEngineCapability.js';
23
23
  export * from './writeProtectionCapability.js';
24
24
  export * from './webSearchBackendCapability.js';
@@ -65,7 +65,7 @@ export * from './engineWireSdk.js';
65
65
  export * from './classifierVerdictWire.js';
66
66
  export { stripSystemReminderBlocks, unwrapSystemReminder } from './systemReminderTag.js';
67
67
  export { findSystemReminderOpenTag } from './systemReminderTag.js';
68
- export { ACTIVE_RUN_BUSY_ERROR_CODE, asModelFallbackReason, CAPABILITY_SELF_ORCHESTRATION_REQUIRED, CONFIG_DELEGATION_ENTRY_CAPS, CONFIG_LEGACY_TOOL_NAME, 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, PARKED_RESUME_STARTUP_FAILED, 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';
68
+ export { ACTIVE_RUN_BUSY_ERROR_CODE, asModelFallbackReason, CAPABILITY_SELF_ORCHESTRATION_REQUIRED, CONFIG_DELEGATION_ENTRY_CAPS, CONFIG_LEGACY_TOOL_NAME, 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, CORRUPT_SESSION_ERROR_CODE, DECIDE_CLAIM_LOST, DECIDE_GATE_MOVED, DECIDE_NOT_PARKED, DECIDE_PARK_MOVED_CODES, 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, isCorruptSessionCode, isDecideParkMovedCode, isDelegationCapCode, isInterruptedToolEndCode, isLimitsExceededCode, isRewindFamilyCode, isStatusDerivedCoarseCode, 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, PARKED_RESUME_STARTUP_FAILED, 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, STATUS_DERIVED_COARSE_CODES, 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
69
  export * from './agentsWireCaps.js';
70
70
  export * from './attachmentsWireCaps.js';
71
71
  export * from './clientContextWireCaps.js';
@@ -81,6 +81,7 @@ export * from './oneShotWireCaps.js';
81
81
  export * from './rewindWireCaps.js';
82
82
  export * from './rewindArchiveCapability.js';
83
83
  export * from './fileHistoryCaptureCapability.js';
84
+ export * from './sealedKeyCapability.js';
84
85
  export * from './registryQuotaUsage.js';
85
86
  export * from './selfOrchestrationWireCaps.js';
86
87
  export * from './skillsWireCaps.js';
@@ -128,6 +129,8 @@ export * from './engineSessionParam.js';
128
129
  export { engineWireTarget, engineWireTargetFor, installEngineWireTarget, installEngineWireTargetFor, } from './engineWireTarget.js';
129
130
  export * from './principalWire.js';
130
131
  export * from './wireErrorTriage.js';
132
+ export * from './corruptSession.js';
133
+ export * from './corruptSessionCopy.js';
131
134
  export * from './resumeRefusalCopy.js';
132
135
  export * from './wireRefusalCopy.js';
133
136
  export * from './decideReceipt.js';
@@ -173,6 +176,7 @@ export * from './seatContract.js';
173
176
  export * from './agentSession/contract.js';
174
177
  export * from './agentSession/backgroundView.js';
175
178
  export { readEngineAgentRegistry, isEngineAgentRegistryListingSuperseded } from './agentSession/engineAgentRegistryRead.js';
179
+ export { stopEngineSessionBackground, engineSessionBackgroundReceiptReadingOf, ENGINE_SESSION_BACKGROUND_RECEIPT_STATES, } from './agentSession/engineSessionBackgroundStop.js';
176
180
  export * from './model/catalog.js';
177
181
  export * from './model/catalogLoader.js';
178
182
  export * from './model/providerAuth.js';
@@ -1,4 +1,5 @@
1
- export type PermissionMode = 'default' | 'plan' | 'acceptEdits' | 'bypassPermissions' | 'auto';
1
+ import { type TaskRequestPermissionMode } from './taskRequestWords.js';
2
+ export type PermissionMode = TaskRequestPermissionMode;
2
3
  export interface PermissionModeField {
3
4
  permissionMode?: PermissionMode;
4
5
  }
@@ -1,10 +1,5 @@
1
- const KNOWN = new Set([
2
- 'default',
3
- 'plan',
4
- 'acceptEdits',
5
- 'bypassPermissions',
6
- 'auto',
7
- ]);
1
+ import { PERMISSION_MODE_WORDS } from './taskRequestWords.js';
2
+ const KNOWN = new Set(PERMISSION_MODE_WORDS);
8
3
  export function permissionModeField(mode, opts) {
9
4
  if (typeof mode === 'string' && mode !== 'default' && KNOWN.has(mode)) {
10
5
  return { permissionMode: mode };
@@ -49,6 +49,7 @@ export interface TaskRequestInput {
49
49
  memoryCapture?: 'off';
50
50
  memory?: 'off';
51
51
  approverPosture?: NonNullable<TaskRequest['approverPosture']>;
52
+ fileHistory?: 'disabled';
52
53
  rewind?: Record<string, unknown>;
53
54
  repo?: string;
54
55
  council?: boolean;
@@ -102,6 +103,7 @@ export declare const APPROVER_POSTURE_BYPASS: "bypass";
102
103
  export declare function approverPostureDeclarationField(declared: boolean): {
103
104
  approverPosture: 'bypass';
104
105
  } | Record<string, never>;
106
+ export declare const FILE_HISTORY_DISABLED: "disabled";
105
107
  export declare function memoryOffDeclared(input: {
106
108
  flag?: unknown;
107
109
  settingsMemory?: unknown;
@@ -23,6 +23,7 @@ export const REQUEST_FIELD_MATRIX = [
23
23
  { field: 'memoryCapture', lanes: ['interactive', 'print', 'utility'], live: true, why: '本会话永远不进长期记忆的**声明形**(server §12.4 body 键,单成员闭集 "off");每条车道都是提交面 ⇒ 都能声明。与 memoryWrite:false 不是一个轴(那是「本 run 只读平面」)。⚠️ parked 续跑腿结构性拿不到声明(决策/续跑端点从持久 body 重建 spec),那是引擎侧事实,不是本层的漏', whyUtilityLane: '有座:side-channel 提交是壳自己的一次性问答,**绝不该**进用户的长期记忆 —— 这一位正是那句声明,且它是收紧方向,带上去只会更严' },
24
24
  { field: 'memory', lanes: ['interactive', 'print', 'utility'], live: true, why: '这一次运行不挂记忆面的**请求级**开关(server §12.7 body 键,单成员闭集 "off");每条车道都是提交面 ⇒ 都能声明。与 memoryCapture(采集面)不是一个轴、可并存;与 memoryWrite:false(只读平面)也不是一个轴', whyUtilityLane: '有座:side-channel 提交不需要挂记忆面(不挂记忆段 / 索引 / 三只记忆工具),省 token 且零记忆写入;与 memoryCapture 不是一个轴,两条都带' },
25
25
  { field: 'approverPosture', lanes: ['interactive', 'print'], live: true, why: '宿主对这个 run 的**审批姿态声明**(「这个 run 的审批卡由我自己自动答」;单成员闭集 `"bypass"`)。🔴 它不授权任何东西、也不是一只门:引擎只把这句声明**渲**给模型(它自己的标记块,首个回合),没有任何裁决腿读它 —— 与 `permissionMode` 的 `bypassPermissions`(选门的形状)**不是一回事**,两键在请求体上各自原样过境、**互不派生**:宿主完全可以一边留着缺省权限模式、一边自己自动答这个 run 的审批卡。🔴 **声明它的唯一条件是「宿主确实自己自动答这个 run 的审批卡」,不许据此推导或改动 `permissionMode`** —— 拿这一位当理由去把门放宽,是把一句只渲给模型看的话读成了授权。宿主并不自动答卡却声明了它 ⇒ 那是对模型说了一句与实际不符的话,修法是**别声明**,不是去动门。加座的理由是**一个事实一处铸点**:同样一句话,要么由引擎在它自己的标记块里说,要么由壳把提醒形文本拼进本 turn 的输入 —— 后者在模型眼里是一段**没有引擎标记**的提醒形副本,按标记声明它该当**数据**处理并报出来。所以壳从此停拼,交这一位。两条用户车道都是提交面 ⇒ 都能声明。坏词由引擎响亮拒(单成员闭集,打错字不许被折成缺席),本层同律在构造期就拒(见 `refuseBadApproverPosture`)。⚠️ 上游的**提交体**与**引擎规格**两层都真读这一键,而装着的 sdk 型面尚未镜像它 ⇒ 本层的字面按提交体的形声明,不从 sdk 取型', whyUtilityLane: '无座:审批姿态是**用户**对他自己那条会话的声明,而 side-channel 是壳自己的提交 —— 把用户的 bypass 姿态带进一条他没参与的提交,等于替他重申一句他没说过的话;况且零工具面根本产不出审批卡' },
26
+ { field: 'fileHistory', lanes: ['interactive', 'print'], live: true, why: '「这一次运行别捕获文件历史」的**请求级声明**(server 7.104.0 提交体键,单成员闭集 "disabled";`POST /v1/tasks` · `/v1/tasks/stream` · `/v1/runs` 同收,子代继承)。两条用户车道都是提交面、都跑在用户的文件上 ⇒ 都能声明;「本会话不捕获」= 每个提交都带(续跑腿重放同一个体)。🔴 只在能力读数 `on-optional` 时发(老 server 对表外键 400),值由片段口 `fileHistoryDeclarationField` 唯一铸出。与 rewind 还原键同交 ⇒ 上游 400 `request.field_conflict`', whyUtilityLane: '无座:side-channel 强制零工具面(`excludeAllTools`),不会改任何文件 ⇒ 没有可捕获的东西;带上它只会在不认识这一键的老 server 上给这条提交多一种 400' },
26
27
  { field: 'finalVerification', lanes: ['print'], live: true, why: 'P1-1 终验:无人值守车道才需要引擎自证;交互 REPL 由人当场看结果。#106 裁 B(让位+告知)后交互面默认关', whyUtilityLane: '无座:终验让引擎再跑一轮自证,而 side-channel 要的是一次小提交的即时答案;「无人值守才需要引擎自证」这条理由在本车道上让位给「小预算优先」' },
27
28
  { field: 'limits', lanes: ['print', 'utility'], live: true, why: 'P2-3-b:`-p` 的预算护栏(--max-* flag 族),交互 REPL 由人随时 Esc', whyUtilityLane: '有座:side-channel 必须带预算护栏(墙钟 / 输出 token / 轮数)—— 它同样没有人看着,而且没有后续回合可以中断' },
28
29
  { field: 'interactiveTools', lanes: ['print', 'utility'], live: true, why: '[909]B 件3:无人值守 stamp false,从 roster 源头灭掉 AskUserQuestion/plan 门。交互车道 stamp false 等于自废武功', whyUtilityLane: '有座:side-channel 绝不该弹交互问答 / plan 门(没有人在看这条提交)。它与 excludeAllTools 是**两条独立**的收紧声明、在这条车道上**并存**(本车道强制带卸载声明,见 `refuseUtilityWithoutToolUnload`;这一位是它旁边那条「连问都别问」的声明,不是它的降级替身)' },
@@ -125,6 +126,7 @@ const INPUT_KEY_ROUTES = {
125
126
  memoryCapture: row('memoryCapture'),
126
127
  memory: row('memory'),
127
128
  approverPosture: row('approverPosture'),
129
+ fileHistory: row('fileHistory'),
128
130
  rewind: row('resumeAt/resumeAtMode/restoreFiles/rewindFilesTo'),
129
131
  repo: row('repo'),
130
132
  council: row('council'),
@@ -197,6 +199,7 @@ const VALUE_LEVEL_IN_PLAY = Object.freeze({
197
199
  memoryCapture: (v) => v === 'off',
198
200
  memory: (v) => v === 'off',
199
201
  approverPosture: (v) => v === APPROVER_POSTURE_BYPASS,
202
+ fileHistory: (v) => v === FILE_HISTORY_DISABLED,
200
203
  rewind: (v) => typeof v === 'object' && v !== null && rewindSubKeys().some((k) => hasOwn(v, k) && present(v[k])),
201
204
  });
202
205
  const inPlay = (key, v) => present(v) && (VALUE_LEVEL_IN_PLAY[key]?.(v) ?? true);
@@ -377,6 +380,7 @@ void true;
377
380
  export function approverPostureDeclarationField(declared) {
378
381
  return declared ? { approverPosture: APPROVER_POSTURE_BYPASS } : {};
379
382
  }
383
+ export const FILE_HISTORY_DISABLED = 'disabled';
380
384
  export function memoryOffDeclared(input) {
381
385
  if (typeof input !== 'object' || input === null)
382
386
  return false;
@@ -426,6 +430,15 @@ const refuseBadApproverPosture = (v) => {
426
430
  '**响亮拒**,刻意不把打错的词折回缺席。本层若静默删键,这一次提交的模型不会被告知姿态,而声明人不会知道。' +
427
431
  '错误文本只报形状,不回显值。');
428
432
  };
433
+ const refuseBadFileHistory = (v) => {
434
+ if (v === undefined || v === null)
435
+ return;
436
+ if (v === FILE_HISTORY_DISABLED)
437
+ return;
438
+ throw new TypeError('buildTaskRequest: fileHistory 只接受字面量 `\'disabled\'` 或缺席(undefined/null)—— ' +
439
+ `收到 ${coarseShape(v)}。这一位是「这一次运行别捕获文件历史」的收紧声明,上游是**单成员闭集**(没有第二个词)且对坏值` +
440
+ '**响亮拒**。本层若静默删键,这一次运行照常捕获而声明人不会知道。错误文本只报形状,不回显值。');
441
+ };
429
442
  const refuseBadMaxTokens = (v) => {
430
443
  if (v === undefined || v === null)
431
444
  return;
@@ -495,7 +508,7 @@ export function parseMaxCostUsd(text) {
495
508
  return { ok: false, why: 'not_positive' };
496
509
  return { ok: true, value };
497
510
  }
498
- const ACCESSOR_READ_ORDER = ['live', 'memoryCapture', 'memory', 'settings', 'maxCostUsd', 'excludeAllTools', 'approverPosture', 'maxTokens', 'outputRetries'];
511
+ const ACCESSOR_READ_ORDER = ['live', 'memoryCapture', 'memory', 'settings', 'maxCostUsd', 'excludeAllTools', 'approverPosture', 'maxTokens', 'outputRetries', 'fileHistory'];
499
512
  function dataFirstSnapshot(input, afterData) {
500
513
  let descs;
501
514
  try {
@@ -563,6 +576,7 @@ export function assembleTaskRequest(input, lane) {
563
576
  const approverPostureIn = src.approverPosture;
564
577
  const maxTokensIn = src.maxTokens;
565
578
  const outputRetriesIn = src.outputRetries;
579
+ const fileHistoryIn = src.fileHistory;
566
580
  const INPUT_KEYS = Object.keys(INPUT_KEY_ROUTES);
567
581
  const i = snapshotByName(src, INPUT_KEYS, {
568
582
  live,
@@ -573,6 +587,7 @@ export function assembleTaskRequest(input, lane) {
573
587
  excludeAllTools: excludeAllToolsIn,
574
588
  approverPosture: approverPostureIn,
575
589
  outputRetries: outputRetriesIn,
590
+ fileHistory: fileHistoryIn,
576
591
  settings: settingsIn,
577
592
  });
578
593
  const SETTINGS_KEYS = Object.keys(SETTINGS_KEY_ROUTES);
@@ -584,6 +599,7 @@ export function assembleTaskRequest(input, lane) {
584
599
  refuseBadApproverPosture(approverPostureIn);
585
600
  refuseBadMaxTokens(maxTokensIn);
586
601
  refuseBadOutputRetries(outputRetriesIn);
602
+ refuseBadFileHistory(fileHistoryIn);
587
603
  const rewindRoute = INPUT_KEY_ROUTES.rewind;
588
604
  const RETIRED_REWIND_FILES_KEY = 'rewindFiles';
589
605
  const REWIND_KEYS = rewindRoute.via === 'matrix' ? rewindRoute.field.split('/') : [];
@@ -733,6 +749,7 @@ export function assembleTaskRequest(input, lane) {
733
749
  ...(on('memoryCapture') ? { memoryCapture: 'off' } : {}),
734
750
  ...(on('memory') ? { memory: 'off' } : {}),
735
751
  ...(on('approverPosture') ? { approverPosture: APPROVER_POSTURE_BYPASS } : {}),
752
+ ...(on('fileHistory') ? { fileHistory: FILE_HISTORY_DISABLED } : {}),
736
753
  ...(Object.keys(settingsOut).length > 0 ? { settings: settingsOut } : {}),
737
754
  };
738
755
  return Object.freeze({ request: out, omitted: Object.freeze([...omitted, ...lateOmitted]) });
@@ -1,5 +1,5 @@
1
1
  import { readErrorNumber, readErrorString } from './wireFailureShape.js';
2
- import { RESUME_CONTEXT_UNAVAILABLE, RESUME_PLACEMENT_MISMATCH, RESUME_PREFLIGHT_REJECTED, RESUME_REOPEN_CODES, RESUME_ENV_FAILED, RESUME_TOOL_UNAVAILABLE, RESUME_POLICY_FOLD_CODE, PARKED_RESUME_STARTUP_FAILED, } from './engineErrorCodes.js';
2
+ import { RESUME_CONTEXT_UNAVAILABLE, RESUME_PLACEMENT_MISMATCH, RESUME_PREFLIGHT_REJECTED, RESUME_REOPEN_CODES, RESUME_ENV_FAILED, RESUME_TOOL_UNAVAILABLE, RESUME_POLICY_FOLD_CODE, PARKED_RESUME_STARTUP_FAILED, isStatusDerivedCoarseCode, } from './engineErrorCodes.js';
3
3
  import { capForDisplay } from './fleetTaskDesc.js';
4
4
  import { resumeRetryLaterFromError } from './wireErrorTriage.js';
5
5
  export const RESUME_REFUSAL_CODES = Object.freeze([
@@ -73,7 +73,9 @@ export function resumePolicyBlockFromError(err) {
73
73
  export function resumePolicyBlockContent(detail) {
74
74
  const b = detail.blockedBy;
75
75
  const reason = b.kind === 'named'
76
- ? `The check that refused it: ${capForDisplay(b.code, 80)}`
76
+ ? isStatusDerivedCoarseCode(b.code)
77
+ ? `The refusal did not name a more specific check (it carried only the generic code for its HTTP status: ${b.code})`
78
+ : `The check that refused it: ${capForDisplay(b.code, 80)}`
77
79
  : b.kind === 'absent'
78
80
  ? 'The refusal did not name a more specific check'
79
81
  : 'The refusal carried a more specific reason that could not be read';
@@ -32,6 +32,10 @@ export function readRunTerminal(result) {
32
32
  const kind = str(c.kind);
33
33
  if (kind === undefined)
34
34
  return { kind: 'unknown', plane: 'cause' };
35
+ const parkWord = str(r.status);
36
+ if (parkWord !== undefined && FLAT_PAUSED_STATUSES.includes(parkWord)) {
37
+ return { kind: 'paused', plane: 'cause', flatStatus: parkWord, ...(kind === 'paused' ? (pauseOf(c) ?? {}) : {}) };
38
+ }
35
39
  switch (kind) {
36
40
  case 'completed':
37
41
  return { kind: 'completed', plane: 'cause' };
@@ -55,7 +55,7 @@ export function sandboxDegradeHint(err) {
55
55
  'Re-run without --sandbox (worker default image), or point the shell at a k8s-lane worker (sema cloud engine connect <url>).');
56
56
  }
57
57
  if (e.status === 400 && msg.includes(SANDBOX_NO_IMAGE_INDEX_400_ANCHOR)) {
58
- return ('This worker has no sandbox image index configured (sema-registry backend absent), so per-task profiles cannot resolve.\n' +
58
+ return ('This worker has no sandbox image index configured (the sema-web-admin config center is not attached), so per-task profiles cannot resolve.\n' +
59
59
  'Re-run without --sandbox, or use a worker with the image index enabled.');
60
60
  }
61
61
  if (e.status === 404 && msg.includes(SANDBOX_NO_PUBLISHED_IMAGE_404_ANCHOR)) {
@@ -0,0 +1,17 @@
1
+ export type SealedKeyReading = {
2
+ kind: 'unobserved';
3
+ } | {
4
+ kind: 'not_reported';
5
+ } | {
6
+ kind: 'present';
7
+ alg: string;
8
+ publicKeyId: string;
9
+ publicKey: string;
10
+ };
11
+ export declare function projectSealedKeyCapability(caps: unknown): SealedKeyReading | undefined;
12
+ export declare function noteEngineCapsForSealedKey(baseUrl: string, caps: unknown, opts?: {
13
+ generation?: number;
14
+ }): void;
15
+ export declare function observedSealedKey(baseUrl?: string | undefined): SealedKeyReading;
16
+ export declare function forgetSealedKeyReading(baseUrl: string | undefined): void;
17
+ export declare function __resetSealedKeyReadingsForTests(): void;
@@ -0,0 +1,42 @@
1
+ import { engineWireTarget } from './engineWireTarget.js';
2
+ import { createEngineCapReader } from './engineCapReader.js';
3
+ function ownNonEmpty(seg, key) {
4
+ if (!Object.hasOwn(seg, key))
5
+ return undefined;
6
+ const v = seg[key];
7
+ return typeof v === 'string' && v.length > 0 ? v : undefined;
8
+ }
9
+ export function projectSealedKeyCapability(caps) {
10
+ if (caps === null || typeof caps !== 'object' || Array.isArray(caps))
11
+ return undefined;
12
+ if (!Object.hasOwn(caps, 'sealedKey'))
13
+ return { kind: 'not_reported' };
14
+ const seg = caps.sealedKey;
15
+ if (seg === undefined)
16
+ return { kind: 'not_reported' };
17
+ if (seg === null || typeof seg !== 'object' || Array.isArray(seg))
18
+ return undefined;
19
+ const alg = ownNonEmpty(seg, 'alg');
20
+ const publicKeyId = ownNonEmpty(seg, 'publicKeyId');
21
+ const publicKey = ownNonEmpty(seg, 'publicKey');
22
+ if (alg === undefined || publicKeyId === undefined || publicKey === undefined)
23
+ return undefined;
24
+ return { kind: 'present', alg, publicKeyId, publicKey };
25
+ }
26
+ const reader = createEngineCapReader({
27
+ name: 'sealedKey',
28
+ project: projectSealedKeyCapability,
29
+ makeUnobserved: () => ({ kind: 'unobserved' }),
30
+ });
31
+ export function noteEngineCapsForSealedKey(baseUrl, caps, opts) {
32
+ reader.note(baseUrl, caps, opts);
33
+ }
34
+ export function observedSealedKey(baseUrl = engineWireTarget()?.baseUrl) {
35
+ return reader.observed(baseUrl);
36
+ }
37
+ export function forgetSealedKeyReading(baseUrl) {
38
+ reader.forget(baseUrl);
39
+ }
40
+ export function __resetSealedKeyReadingsForTests() {
41
+ reader.__resetForTests();
42
+ }
@@ -1,4 +1,5 @@
1
1
  import type { ReasoningEffort } from "./effortWire.js";
2
+ import type { PermissionMode } from "./permissionWireCaps.js";
2
3
  import type { LaneProof } from "./seam.js";
3
4
  import type { QuestionAnswer } from "./liveQuestionStore.js";
4
5
  import type { ToolApprovalDelegation } from "./hitl/toolApprovalWire.js";
@@ -101,7 +102,7 @@ export interface StartSessionOptions {
101
102
  cwd?: string;
102
103
  excludeTools?: string[];
103
104
  }
104
- export type PermissionModeIntent = "default" | "plan" | "acceptEdits" | "bypassPermissions" | "auto";
105
+ export type PermissionModeIntent = PermissionMode;
105
106
  export declare const PERMISSION_MODE_INTENTS: readonly PermissionModeIntent[];
106
107
  export declare const ATTACHMENT_IDS_PER_TASK_CAP = 16;
107
108
  export declare const SEAT_REASONING_EFFORTS: readonly ReasoningEffort[];
@@ -1,3 +1,4 @@
1
+ import { PERMISSION_MODE_WORDS, REASONING_EFFORT_WORDS } from "./taskRequestWords.js";
1
2
  const bad = (reason, field) => field === undefined ? { reason } : { reason, field };
2
3
  const nested = (prefix, verdict) => {
3
4
  const path = verdict.field === undefined
@@ -71,25 +72,9 @@ export const HITL_RESOLUTION_OUTCOMES = [
71
72
  "decline",
72
73
  "cancel",
73
74
  ];
74
- const PERMISSION_MODE_INTENT_TUPLE = [
75
- "default",
76
- "plan",
77
- "acceptEdits",
78
- "bypassPermissions",
79
- "auto",
80
- ];
81
- export const PERMISSION_MODE_INTENTS = PERMISSION_MODE_INTENT_TUPLE;
75
+ export const PERMISSION_MODE_INTENTS = [...PERMISSION_MODE_WORDS];
82
76
  export const ATTACHMENT_IDS_PER_TASK_CAP = 16;
83
- const SEAT_REASONING_EFFORT_TUPLE = [
84
- "off",
85
- "minimal",
86
- "low",
87
- "medium",
88
- "high",
89
- "xhigh",
90
- "max",
91
- ];
92
- export const SEAT_REASONING_EFFORTS = SEAT_REASONING_EFFORT_TUPLE;
77
+ export const SEAT_REASONING_EFFORTS = [...REASONING_EFFORT_WORDS];
93
78
  export const SEAT_TURN_SETTINGS_KEYS = ["ultracode"];
94
79
  export const ATTACHMENT_UPLOAD_REQUEST_KEYS = ["name", "mimeType", "bytes"];
95
80
  export const SESSION_SEARCH_RESULT_KEYS = ["sessionId", "title", "matches"];
@@ -224,8 +209,8 @@ const checkLocalSessionEvent = (v) => {
224
209
  }
225
210
  if (!isAbsent(v.permissionMode)) {
226
211
  const mode = v.permissionMode;
227
- if (typeof mode !== "string" || !inTuple(PERMISSION_MODE_INTENT_TUPLE, mode)) {
228
- return bad(`permissionMode must be one of ${PERMISSION_MODE_INTENT_TUPLE.join("|")}`, "permissionMode");
212
+ if (typeof mode !== "string" || !inTuple(PERMISSION_MODE_INTENTS, mode)) {
213
+ return bad(`permissionMode must be one of ${PERMISSION_MODE_INTENTS.join("|")}`, "permissionMode");
229
214
  }
230
215
  }
231
216
  if (!isAbsent(v.session)) {
@@ -718,7 +703,6 @@ const _seatContractPins = [
718
703
  true, true,
719
704
  true, true,
720
705
  true, true, true, true,
721
- true, true, true, true,
722
706
  true, true,
723
707
  true, true,
724
708
  true, true,
@@ -1,5 +1,16 @@
1
+ import type { AgentClient } from '@sema-agent/sdk';
2
+ import type { EngineWireInjection } from '../engineWireSdk.js';
3
+ export type EngineCompactWireClient = {
4
+ capabilities: AgentClient['capabilities'];
5
+ runs: Pick<AgentClient['runs'], 'compact'>;
6
+ };
7
+ export type EngineCompactWire = EngineWireInjection<EngineCompactWireClient>;
1
8
  export declare function isEngineCompactPending(sessionKey?: string): boolean;
2
9
  export declare function resetManualCompactCapability(): void;
3
10
  export declare function __resetEngineCompactArmForTests(): void;
4
- export declare function requestEngineCompact(sessionKey?: string): 'fired' | 'armed' | 'offline' | 'unsupported';
5
- export declare function onEngineTaskBound(taskId: string, sessionKey?: string): void;
11
+ export declare function requestEngineCompact(sessionKey?: string, opts?: {
12
+ wire?: EngineCompactWire;
13
+ }): 'fired' | 'armed' | 'offline' | 'unsupported';
14
+ export declare function onEngineTaskBound(taskId: string, sessionKey?: string, opts?: {
15
+ wire?: EngineCompactWire;
16
+ }): void;
@@ -1,34 +1,38 @@
1
1
  import { hostLog, hostTimersFor } from '../host.js';
2
- import { makeEngineWireClient } from '../engineWireSdk.js';
3
- import { engineWireTargetFor } from '../engineWireTarget.js';
2
+ import { clientHasVerbs, engineWireFor, INJECTED_WIRE_SETTLE_MS, settleInjected, } from '../engineWireFor.js';
4
3
  import { activeEngineRunIdFor, engineSessionParamFor } from '../engineSessionParam.js';
5
4
  import { DEFAULT_SESSION_KEY } from '../sessionSlot.js';
5
+ function usableCompactClient(client) {
6
+ return clientHasVerbs(client, [['capabilities'], ['runs', 'compact']]);
7
+ }
8
+ const COMPACT_PROBE_SETTLE_MS = 5000;
6
9
  const pendingCompactKeys = new Set();
7
10
  export function isEngineCompactPending(sessionKey = DEFAULT_SESSION_KEY) {
8
11
  return pendingCompactKeys.has(sessionKey);
9
12
  }
10
13
  const manualCompactCapableByBase = new Map();
11
14
  const capabilitiesProbeByBase = new Map();
12
- function probeManualCompactCapability(sessionKey = DEFAULT_SESSION_KEY) {
13
- const cfg = engineWireTargetFor(sessionKey);
14
- if (!cfg)
15
+ function probeManualCompactCapability(wire) {
16
+ const base = wire.kind === 'injected' ? wire.capsBaseUrl : wire.target.baseUrl;
17
+ if (base === undefined)
15
18
  return;
16
- const base = cfg.baseUrl;
17
19
  if (capabilitiesProbeByBase.has(base))
18
20
  return;
19
21
  capabilitiesProbeByBase.set(base, (async () => {
20
22
  try {
21
- const client = makeEngineWireClient({
22
- baseUrl: base,
23
- ...(cfg.token ? { token: cfg.token } : {}),
24
- principal: cfg.principal,
25
- timeoutMs: 5000,
26
- });
27
- if (!client) {
28
- capabilitiesProbeByBase.delete(base);
29
- return;
23
+ let caps;
24
+ if (wire.kind === 'injected') {
25
+ const injected = wire.client;
26
+ caps = await settleInjected(COMPACT_PROBE_SETTLE_MS, undefined, (signal) => injected.capabilities({ signal }));
27
+ }
28
+ else {
29
+ const client = wire.make({ timeoutMs: 5000 });
30
+ if (!client) {
31
+ capabilitiesProbeByBase.delete(base);
32
+ return;
33
+ }
34
+ caps = await client.capabilities();
30
35
  }
31
- const caps = await client.capabilities();
32
36
  if (typeof caps.manualCompact === 'boolean')
33
37
  manualCompactCapableByBase.set(base, caps.manualCompact);
34
38
  else
@@ -55,31 +59,35 @@ function deferFire(ms, fn, why, sessionKey) {
55
59
  timers.setTimer(ms, fn);
56
60
  return true;
57
61
  }
58
- function freezeCompactShot(taskId, sessionKey) {
59
- const cfg = engineWireTargetFor(sessionKey);
60
- if (!cfg)
62
+ function freezeCompactShot(taskId, sessionKey, wire) {
63
+ if (wire.kind === 'no-target' || wire.kind === 'injected-unusable')
61
64
  return null;
62
65
  const sid = engineSessionParamFor(sessionKey);
66
+ let client;
67
+ if (wire.kind === 'injected') {
68
+ const injected = wire.client;
69
+ client = () => injected;
70
+ }
71
+ else {
72
+ const make = wire.make;
73
+ client = () => make();
74
+ }
63
75
  return {
64
76
  taskId,
65
77
  sessionKey,
66
- baseUrl: cfg.baseUrl,
67
- ...(cfg.token !== undefined ? { token: cfg.token } : {}),
68
- ...(cfg.principal !== undefined ? { principal: cfg.principal } : {}),
78
+ client,
79
+ injected: wire.kind === 'injected',
69
80
  ...(sid !== undefined ? { session: sid } : {}),
70
81
  };
71
82
  }
72
83
  async function postCompact(shot, retriesLeft = 1) {
73
- const client = makeEngineWireClient({
74
- baseUrl: shot.baseUrl,
75
- ...(shot.token ? { token: shot.token } : {}),
76
- principal: shot.principal,
77
- });
84
+ const client = shot.client();
78
85
  if (!client)
79
86
  return;
80
87
  const taskId = shot.taskId;
81
88
  try {
82
- const ack = await client.runs.compact(taskId, shot.session !== undefined ? { session: shot.session } : {});
89
+ const fire = (signal) => client.runs.compact(taskId, { ...(shot.session !== undefined ? { session: shot.session } : {}), ...(signal ? { signal } : {}) });
90
+ const ack = shot.injected ? await settleInjected(INJECTED_WIRE_SETTLE_MS, undefined, fire) : await fire(undefined);
83
91
  hostLog('debug', `engineCompactWire: POST compact ${taskId} → ok${ack?.status ? ` (${ack.status})` : ''}`);
84
92
  }
85
93
  catch (e) {
@@ -94,18 +102,19 @@ async function postCompact(shot, retriesLeft = 1) {
94
102
  hostLog('debug', `engineCompactWire: compact fire failed (best-effort): ${String(e)}`);
95
103
  }
96
104
  }
97
- export function requestEngineCompact(sessionKey = DEFAULT_SESSION_KEY) {
98
- const cfg = engineWireTargetFor(sessionKey);
99
- if (!cfg)
105
+ export function requestEngineCompact(sessionKey = DEFAULT_SESSION_KEY, opts) {
106
+ const wire = engineWireFor(opts?.wire, sessionKey, usableCompactClient);
107
+ if (wire.kind === 'no-target' || wire.kind === 'injected-unusable')
100
108
  return 'offline';
101
- probeManualCompactCapability(sessionKey);
102
- if (manualCompactCapableByBase.get(cfg.baseUrl) === false) {
109
+ probeManualCompactCapability(wire);
110
+ const capsKey = wire.kind === 'injected' ? wire.capsBaseUrl : wire.target.baseUrl;
111
+ if (capsKey !== undefined && manualCompactCapableByBase.get(capsKey) === false) {
103
112
  hostLog('debug', 'engineCompactWire: engine capabilities report manualCompact:false — verb suppressed (TOC-local runStore-less engine, [488])');
104
113
  return 'unsupported';
105
114
  }
106
115
  const taskId = activeEngineRunIdFor(sessionKey);
107
116
  if (taskId) {
108
- const shot = freezeCompactShot(taskId, sessionKey);
117
+ const shot = freezeCompactShot(taskId, sessionKey, wire);
109
118
  if (shot !== null)
110
119
  void postCompact(shot);
111
120
  return 'fired';
@@ -114,11 +123,13 @@ export function requestEngineCompact(sessionKey = DEFAULT_SESSION_KEY) {
114
123
  return 'armed';
115
124
  }
116
125
  const BOUND_FIRE_DELAY_MS = 1500;
117
- export function onEngineTaskBound(taskId, sessionKey = DEFAULT_SESSION_KEY) {
118
- probeManualCompactCapability(sessionKey);
126
+ export function onEngineTaskBound(taskId, sessionKey = DEFAULT_SESSION_KEY, opts) {
127
+ const wire = engineWireFor(opts?.wire, sessionKey, usableCompactClient);
128
+ if (wire.kind !== 'no-target' && wire.kind !== 'injected-unusable')
129
+ probeManualCompactCapability(wire);
119
130
  if (!pendingCompactKeys.has(sessionKey))
120
131
  return;
121
- const shot = freezeCompactShot(taskId, sessionKey);
132
+ const shot = freezeCompactShot(taskId, sessionKey, wire);
122
133
  if (shot === null)
123
134
  return;
124
135
  if (deferFire(BOUND_FIRE_DELAY_MS, () => void postCompact(shot), 'bind 后发射', sessionKey)) {