@sema-agent/client-core 0.91.0 → 0.93.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 (195) hide show
  1. package/CHANGELOG.md +351 -0
  2. package/README.md +51 -34
  3. package/dist/adapt/arms.js +6 -12
  4. package/dist/adapt/panelTasks.d.ts +0 -2
  5. package/dist/adapt/panelTasks.js +6 -26
  6. package/dist/adapt/toolCards.js +6 -4
  7. package/dist/adapt.d.ts +1 -1
  8. package/dist/adapt.js +3 -3
  9. package/dist/adapter/activeRunSelfHeal.d.ts +0 -2
  10. package/dist/adapter/activeRunSelfHeal.js +5 -27
  11. package/dist/adapter/downstream/terminalToSdkResult.js +16 -7
  12. package/dist/adapter/runStream.js +6 -2
  13. package/dist/agentsWireCaps.js +1 -1
  14. package/dist/approvalDecidedByCapability.d.ts +16 -0
  15. package/dist/approvalDecidedByCapability.js +47 -0
  16. package/dist/approvalsStreamLiveCapability.js +3 -3
  17. package/dist/askSurvivesStandingAnswer.d.ts +4 -1
  18. package/dist/askSurvivesStandingAnswer.js +13 -0
  19. package/dist/autoModeUnavailable.js +3 -2
  20. package/dist/centerWiringCapability.js +1 -1
  21. package/dist/cloudConfigWireCaps.js +10 -9
  22. package/dist/compensations.js +7 -7
  23. package/dist/controlRouter.d.ts +23 -23
  24. package/dist/controlRouter.js +114 -49
  25. package/dist/coreValuePorts.d.ts +4 -2
  26. package/dist/coreValuePorts.js +5 -0
  27. package/dist/decideFailureNote.js +4 -2
  28. package/dist/decideReceipt.d.ts +11 -0
  29. package/dist/decideReceipt.js +95 -9
  30. package/dist/detachWire.d.ts +2 -14
  31. package/dist/detachWire.js +1 -47
  32. package/dist/deviceExecutorManagementCapability.d.ts +6 -2
  33. package/dist/deviceExecutorManagementCapability.js +61 -15
  34. package/dist/displayUntrusted.js +2 -1
  35. package/dist/effectiveFacts.d.ts +14 -4
  36. package/dist/effectiveFacts.js +45 -5
  37. package/dist/engineAgentAbsence.js +2 -1
  38. package/dist/engineCapReader.js +16 -10
  39. package/dist/engineCapsCache.d.ts +2 -0
  40. package/dist/engineCapsCache.js +13 -2
  41. package/dist/engineConfigDrift.d.ts +20 -0
  42. package/dist/engineConfigDrift.js +54 -0
  43. package/dist/engineErrorCodes.d.ts +17 -0
  44. package/dist/engineErrorCodes.js +45 -0
  45. package/dist/engineInlineTaskStats.d.ts +1 -0
  46. package/dist/engineNoticeCodes.d.ts +16 -2
  47. package/dist/engineNoticeCodes.js +71 -0
  48. package/dist/engineWireFor.d.ts +22 -0
  49. package/dist/engineWireFor.js +154 -9
  50. package/dist/engineWireSdk.d.ts +0 -1
  51. package/dist/engineWireSdk.js +0 -3
  52. package/dist/executionLaneCapability.js +4 -2
  53. package/dist/fileHistoryCaptureCapability.d.ts +1 -1
  54. package/dist/fileHistoryCaptureCapability.js +1 -6
  55. package/dist/fileHistoryLegNotice.d.ts +1 -1
  56. package/dist/fileHistoryLegNotice.js +1 -6
  57. package/dist/gateOutcome.js +2 -17
  58. package/dist/gateVocabulary.d.ts +2 -8
  59. package/dist/gateVocabulary.js +6 -32
  60. package/dist/generated/engineFactTables.d.ts +17 -1
  61. package/dist/generated/engineFactTables.js +91 -0
  62. package/dist/generated/engineNoticeTables.d.ts +1 -1
  63. package/dist/generated/engineNoticeTables.js +4 -1
  64. package/dist/generated/settingsSchemaTables.d.ts +8 -0
  65. package/dist/generated/settingsSchemaTables.js +40 -0
  66. package/dist/goalStopHook.d.ts +1 -8
  67. package/dist/goalStopHook.js +2 -58
  68. package/dist/headlessPermissionModeWire.d.ts +3 -2
  69. package/dist/headlessPermissionModeWire.js +46 -5
  70. package/dist/hitl/allowRuleShadow.d.ts +21 -0
  71. package/dist/hitl/allowRuleShadow.js +167 -0
  72. package/dist/hitl/askClassPair.d.ts +14 -0
  73. package/dist/hitl/askClassPair.js +42 -0
  74. package/dist/hitl/askGateWire.js +1 -0
  75. package/dist/hitl/askParkRowRouting.js +2 -2
  76. package/dist/hitl/askSurvivesPosture.d.ts +5 -0
  77. package/dist/hitl/askSurvivesPosture.js +17 -0
  78. package/dist/hitl/automaticAnswerVerdict.d.ts +21 -0
  79. package/dist/hitl/automaticAnswerVerdict.js +143 -0
  80. package/dist/hitl/crashConverged.d.ts +1 -0
  81. package/dist/hitl/crashConverged.js +1 -1
  82. package/dist/hitl/frameRouter.d.ts +2 -0
  83. package/dist/hitl/frameRouter.js +73 -16
  84. package/dist/hitl/gateLedger.d.ts +7 -0
  85. package/dist/hitl/gateLedger.js +37 -5
  86. package/dist/hitl/hitlBridge.d.ts +1 -0
  87. package/dist/hitl/hitlBridge.js +6 -1
  88. package/dist/hitl/hitlHostSurface.d.ts +5 -2
  89. package/dist/hitl/hitlHostSurface.js +25 -3
  90. package/dist/hitl/livePendingAsk.js +24 -5
  91. package/dist/hitl/parkResolver.js +24 -4
  92. package/dist/hitl/persistedRulesWire.d.ts +4 -1
  93. package/dist/hitl/persistedRulesWire.js +38 -19
  94. package/dist/hitl/planReviewWire.d.ts +0 -2
  95. package/dist/hitl/planReviewWire.js +3 -20
  96. package/dist/hitl/replayedApproval.d.ts +21 -0
  97. package/dist/hitl/replayedApproval.js +89 -0
  98. package/dist/hitl/sessionPolicyDeliverable.js +20 -2
  99. package/dist/hitl/sessionPolicyWire.d.ts +10 -0
  100. package/dist/hitl/sessionPolicyWire.js +19 -6
  101. package/dist/hitl/toolApprovalWire.d.ts +27 -7
  102. package/dist/hitl/toolApprovalWire.js +153 -94
  103. package/dist/hookMatcherVerdict.js +2 -1
  104. package/dist/hooksWireCaps.d.ts +1 -1
  105. package/dist/hooksWireCaps.js +1 -1
  106. package/dist/humanTurn.js +3 -4
  107. package/dist/index.d.ts +21 -6
  108. package/dist/index.js +17 -4
  109. package/dist/inheritEnvWire.d.ts +1 -4
  110. package/dist/inheritEnvWire.js +3 -22
  111. package/dist/limitsWire.d.ts +0 -6
  112. package/dist/limitsWire.js +0 -38
  113. package/dist/mcpLiveness.js +2 -1
  114. package/dist/mcpProbeCapability.js +1 -1
  115. package/dist/mcpProbeWire.js +10 -12
  116. package/dist/mcpReconnect.d.ts +5 -0
  117. package/dist/mcpReconnect.js +28 -0
  118. package/dist/memoryComplianceCapability.js +2 -2
  119. package/dist/memoryOriginCapability.js +2 -2
  120. package/dist/memoryVerbsWire.d.ts +1 -1
  121. package/dist/memoryVerbsWire.js +17 -13
  122. package/dist/model/catalog.js +2 -1
  123. package/dist/model/providerPresets.d.ts +3 -1
  124. package/dist/model/tierVocabulary.d.ts +2 -1
  125. package/dist/model/tierVocabulary.js +3 -8
  126. package/dist/ownKey.d.ts +2 -0
  127. package/dist/ownKey.js +15 -0
  128. package/dist/peerFrames.js +2 -2
  129. package/dist/peerLaneCapability.js +2 -2
  130. package/dist/permissionModesCapability.d.ts +16 -0
  131. package/dist/permissionModesCapability.js +71 -0
  132. package/dist/permissionRuleIssue.js +10 -7
  133. package/dist/permissionRulesWriteCapability.js +2 -2
  134. package/dist/permissionWireCaps.d.ts +2 -0
  135. package/dist/permissionWireCaps.js +8 -1
  136. package/dist/permissionsAllowGrantCapability.js +7 -2
  137. package/dist/permissionsDeclaration.d.ts +7 -1
  138. package/dist/permissionsDeclaration.js +29 -20
  139. package/dist/pluginHooksWire.js +2 -11
  140. package/dist/postureKnob.js +1 -1
  141. package/dist/promptProfileWireCaps.d.ts +2 -1
  142. package/dist/protocolSegment.d.ts +11 -0
  143. package/dist/protocolSegment.js +31 -0
  144. package/dist/readFacePosture.js +1 -1
  145. package/dist/request/taskRequest.js +1 -15
  146. package/dist/resumeRefusalCopy.d.ts +1 -0
  147. package/dist/resumeRefusalCopy.js +26 -3
  148. package/dist/retryStatus.js +2 -1
  149. package/dist/rewindArchiveCapability.js +2 -2
  150. package/dist/ruleCompileVerdict.d.ts +2 -0
  151. package/dist/ruleCompileVerdict.js +13 -0
  152. package/dist/ruleRemovalConsequence.d.ts +2 -1
  153. package/dist/runCancelContext.d.ts +12 -0
  154. package/dist/runCancelContext.js +83 -1
  155. package/dist/runTerminal.d.ts +16 -0
  156. package/dist/runTerminal.js +32 -3
  157. package/dist/seam.d.ts +1 -0
  158. package/dist/seam.js +1 -1
  159. package/dist/seatContract.d.ts +2 -1
  160. package/dist/sessionMemoryStatus.d.ts +2 -4
  161. package/dist/sessionPolicyCapability.js +1 -1
  162. package/dist/sessionSyncFileHistoryCapability.d.ts +18 -0
  163. package/dist/sessionSyncFileHistoryCapability.js +50 -0
  164. package/dist/skillToolListsCapability.d.ts +18 -0
  165. package/dist/skillToolListsCapability.js +50 -0
  166. package/dist/sqlEngineCapability.js +2 -9
  167. package/dist/steerPriorityCapability.d.ts +18 -0
  168. package/dist/steerPriorityCapability.js +80 -0
  169. package/dist/steerReceipt.d.ts +9 -0
  170. package/dist/steerReceipt.js +25 -0
  171. package/dist/storePostureCapability.js +2 -2
  172. package/dist/subagent/engineSubagentSteer.js +2 -9
  173. package/dist/supportFloor.d.ts +1 -0
  174. package/dist/supportFloor.js +15 -5
  175. package/dist/taskRequestWords.d.ts +4 -2
  176. package/dist/taskRequestWords.js +1 -1
  177. package/dist/toolHistoryBadTurn.js +1 -2
  178. package/dist/toolResult.d.ts +10 -1
  179. package/dist/toolResult.js +80 -6
  180. package/dist/types/engineState.d.ts +2 -12
  181. package/dist/userInvokedSkillsCapability.d.ts +18 -0
  182. package/dist/userInvokedSkillsCapability.js +50 -0
  183. package/dist/webSearchBackendCapability.js +2 -2
  184. package/dist/webSearchWireCaps.d.ts +1 -1
  185. package/dist/webSearchWireCaps.js +40 -2
  186. package/dist/wireFailureShape.d.ts +2 -0
  187. package/dist/wireFailureShape.js +6 -2
  188. package/dist/wireRefusalCopy.d.ts +9 -3
  189. package/dist/wireRefusalCopy.js +41 -4
  190. package/dist/workflowsJournalCapability.d.ts +18 -0
  191. package/dist/workflowsJournalCapability.js +50 -0
  192. package/dist/writeProtectionCapability.d.ts +2 -4
  193. package/dist/writeProtectionCapability.js +1 -1
  194. package/docs/INTEGRATION-CLIENTS.md +1516 -18
  195. package/package.json +2 -2
@@ -151,6 +151,8 @@ export const CORE_MODE_ARBITRATION = Object.freeze({
151
151
  "rule_unreadable": Object.freeze({ bypassImmune: false, classifierEligible: false, sandboxAdmission: false, ruleMayClear: false, hookAskFloor: false }),
152
152
  "ask_rule": Object.freeze({ bypassImmune: true, classifierEligible: false, sandboxAdmission: false, ruleMayClear: false, hookAskFloor: true }),
153
153
  "denial_limit_fallback": Object.freeze({ bypassImmune: true, classifierEligible: false, sandboxAdmission: false, ruleMayClear: false, hookAskFloor: false }),
154
+ "classifier_no_ruling": Object.freeze({ bypassImmune: true, classifierEligible: false, sandboxAdmission: false, ruleMayClear: false, hookAskFloor: false }),
155
+ "requires_user_interaction": Object.freeze({ bypassImmune: true, classifierEligible: false, sandboxAdmission: false, ruleMayClear: false, hookAskFloor: true }),
154
156
  "operator_forced": Object.freeze({ bypassImmune: true, classifierEligible: true, sandboxAdmission: true, ruleMayClear: false, hookAskFloor: false }),
155
157
  "shell_floor": Object.freeze({ bypassImmune: true, classifierEligible: true, sandboxAdmission: true, ruleMayClear: false, hookAskFloor: false }),
156
158
  "write_protection_unresolved": Object.freeze({ bypassImmune: true, classifierEligible: false, sandboxAdmission: true, ruleMayClear: false, hookAskFloor: true }),
@@ -164,3 +166,92 @@ export const CORE_MODE_ARBITRATION = Object.freeze({
164
166
  "unstated": Object.freeze({ bypassImmune: false, classifierEligible: true, sandboxAdmission: false, ruleMayClear: true, hookAskFloor: false }),
165
167
  "ordinary": Object.freeze({ bypassImmune: false, classifierEligible: true, sandboxAdmission: true, ruleMayClear: true, hookAskFloor: false }),
166
168
  });
169
+ export const CORE_SKILL_GRANT_ORIGINS = Object.freeze([
170
+ "model",
171
+ "user",
172
+ "inherited",
173
+ ]);
174
+ export const CORE_ALLOW_ENTRY_INERT_REASONS = Object.freeze([
175
+ "wildcard_all",
176
+ "namespace_wildcard",
177
+ "path_pattern",
178
+ "domain",
179
+ "content_unsupported",
180
+ "grammar",
181
+ "tool_name",
182
+ "near_miss",
183
+ ]);
184
+ export const CORE_ALLOW_RULE_MEMBERS = Object.freeze([
185
+ "hook",
186
+ "deployment",
187
+ "persisted",
188
+ "skill",
189
+ "request",
190
+ ]);
191
+ export const CORE_RULE_TOOL_NAME_VERDICTS = Object.freeze([
192
+ "current",
193
+ "retired",
194
+ "unprefixed_namespace",
195
+ "unmintable_segment",
196
+ ]);
197
+ export const CORE_SETTLEMENT_KINDS = Object.freeze([
198
+ "human_allowed",
199
+ "human_refused",
200
+ "approval_window_expired",
201
+ "denial_limit_window_expired",
202
+ "park_sla_expired",
203
+ "no_approver",
204
+ "approver_unavailable",
205
+ "approver_error",
206
+ "approver_contract",
207
+ "presentation_failed",
208
+ "blanket_allow_refused",
209
+ "policy_allowed",
210
+ "policy_refused",
211
+ "task_aborted",
212
+ ]);
213
+ export const CORE_CLASSIFIER_DENY_CAUSES = Object.freeze([
214
+ "unavailable",
215
+ "parse_error",
216
+ ]);
217
+ export const CORE_AUTO_MODE_UNAVAILABLE_CAUSES = Object.freeze([
218
+ "error",
219
+ "timeout",
220
+ ]);
221
+ export const CORE_DEFAULT_TIER_ORDER = Object.freeze([
222
+ "ultra",
223
+ "max",
224
+ "pro",
225
+ "flash",
226
+ "lite",
227
+ ]);
228
+ export const CORE_CC_MODEL_TIER_ALIASES = Object.freeze({
229
+ "fable": "max",
230
+ "mythos": "max",
231
+ "opus": "pro",
232
+ "sonnet": "flash",
233
+ "haiku": "lite",
234
+ });
235
+ export const CORE_DURABLE_AGENT_HANDLE_RE = Object.freeze(/^a[0-9a-f]{6,32}$/);
236
+ export const CORE_PERMISSION_MODE_CLASSES = Object.freeze([
237
+ "bypass",
238
+ "prompting",
239
+ ]);
240
+ export const CORE_MCP_LIVENESS_STATES = Object.freeze([
241
+ "reachable",
242
+ "unreachable",
243
+ "unknown",
244
+ ]);
245
+ export const CORE_RULE_BEHAVIORS = Object.freeze([
246
+ "deny",
247
+ "ask",
248
+ "allow",
249
+ ]);
250
+ export const CORE_MCP_IMAGE_MAX_BASE64 = 5242880;
251
+ export const CORE_MAX_PENDING_STEER_CHARS = 16000;
252
+ export const CORE_PROMPT_BLOCK_CAUSES = Object.freeze([
253
+ "block",
254
+ "crashed",
255
+ "timeout",
256
+ "cancelled",
257
+ ]);
@@ -2,5 +2,5 @@ export declare const CORE_ENGINE_NOTICE_CODES: readonly string[];
2
2
  export declare const CORE_NOTICE_AUDIENCE: Readonly<Record<string, 'user' | 'operator'>>;
3
3
  export declare const CORE_MCP_INJECTION_DROP_REASONS: readonly string[];
4
4
  export declare const CORE_NOTICE_MINTER: Readonly<Record<string, 'engine' | 'server'>>;
5
- export declare const CORE_USER_STEER_UNDRAINED_CAUSES: readonly ["leg_end", "crashed"];
5
+ export declare const CORE_USER_INPUT_UNDRAINED_CAUSES: readonly ["leg_end", "crashed"];
6
6
  export declare const CORE_TOOL_TURN_INCOMPLETE_CAUSES: readonly ["truncated", "unnamed", "bad_frame", "missing_result_synthesized"];
@@ -28,6 +28,7 @@ export const CORE_ENGINE_NOTICE_CODES = Object.freeze([
28
28
  "permission.ask_released_by_mode",
29
29
  "permission.read_deny_unapplied",
30
30
  "permission.rule_store_unavailable",
31
+ "permission.allowed_tool_not_granted",
31
32
  "peer.inbound_disposition",
32
33
  "peer.held_settled",
33
34
  "peer.idle_subscription",
@@ -115,6 +116,7 @@ export const CORE_NOTICE_AUDIENCE = Object.freeze({
115
116
  "permission.ask_released_by_mode": "user",
116
117
  "permission.read_deny_unapplied": "user",
117
118
  "permission.rule_store_unavailable": "user",
119
+ "permission.allowed_tool_not_granted": "user",
118
120
  "peer.inbound_disposition": "user",
119
121
  "peer.held_settled": "user",
120
122
  "peer.idle_subscription": "user",
@@ -208,6 +210,7 @@ export const CORE_NOTICE_MINTER = Object.freeze({
208
210
  "permission.ask_released_by_mode": "engine",
209
211
  "permission.read_deny_unapplied": "engine",
210
212
  "permission.rule_store_unavailable": "engine",
213
+ "permission.allowed_tool_not_granted": "engine",
211
214
  "peer.inbound_disposition": "engine",
212
215
  "peer.held_settled": "engine",
213
216
  "peer.idle_subscription": "engine",
@@ -265,7 +268,7 @@ export const CORE_NOTICE_MINTER = Object.freeze({
265
268
  "memory.layer_locked_legacy": "server",
266
269
  "server.model_unreachable": "server",
267
270
  });
268
- export const CORE_USER_STEER_UNDRAINED_CAUSES = Object.freeze([
271
+ export const CORE_USER_INPUT_UNDRAINED_CAUSES = Object.freeze([
269
272
  "leg_end",
270
273
  "crashed",
271
274
  ]);
@@ -0,0 +1,8 @@
1
+ export declare const SETTINGS_ENGINE_OWNED_HOOK_EVENTS: readonly ["PreToolUse", "PostToolUse", "PostToolUseFailure", "PostToolBatch", "PreCompact", "PostCompact", "Stop", "StopFailure", "UserPromptSubmit"];
2
+ export declare const SETTINGS_SECRET_LITERAL_RE: RegExp;
3
+ export declare const SETTINGS_TIER_GROUP_NAME_RE: RegExp;
4
+ export declare const SETTINGS_BUDGET_NUMBER_KEYS: readonly ["maxBudgetUsd", "tpmLimit", "rpmLimit", "maxParallelRequests", "maxRunCostUsd", "maxIterations"];
5
+ export declare const SETTINGS_BUDGET_STRING_KEYS: readonly ["mode", "budgetDuration", "enforcement"];
6
+ export declare const SETTINGS_BUDGET_PER_MODEL_NUMBER_KEYS: readonly ["maxBudgetUsd", "tpmLimit", "rpmLimit"];
7
+ export declare const SETTINGS_MODEL_API_WORDS: readonly ["openai-completions", "anthropic-messages"];
8
+ export declare const SETTINGS_TOOL_NAME_MATCHER_EVENTS: readonly ["PreToolUse", "PostToolUse", "PostToolUseFailure"];
@@ -0,0 +1,40 @@
1
+ export const SETTINGS_ENGINE_OWNED_HOOK_EVENTS = Object.freeze([
2
+ "PreToolUse",
3
+ "PostToolUse",
4
+ "PostToolUseFailure",
5
+ "PostToolBatch",
6
+ "PreCompact",
7
+ "PostCompact",
8
+ "Stop",
9
+ "StopFailure",
10
+ "UserPromptSubmit",
11
+ ]);
12
+ export const SETTINGS_SECRET_LITERAL_RE = Object.freeze(/^(sk-|gh[opus]_|github_pat_|xox[baprse]-|xapp-|bearer\s|basic\s|eyJ[A-Za-z0-9_-]{10,}\.|AKIA[0-9A-Z]{12,}|AIza[0-9A-Za-z_-]{20,}|-----BEGIN[A-Z0-9 ]*PRIVATE KEY)/i);
13
+ export const SETTINGS_TIER_GROUP_NAME_RE = Object.freeze(/^[a-z0-9][a-z0-9._-]*$/i);
14
+ export const SETTINGS_BUDGET_NUMBER_KEYS = Object.freeze([
15
+ "maxBudgetUsd",
16
+ "tpmLimit",
17
+ "rpmLimit",
18
+ "maxParallelRequests",
19
+ "maxRunCostUsd",
20
+ "maxIterations",
21
+ ]);
22
+ export const SETTINGS_BUDGET_STRING_KEYS = Object.freeze([
23
+ "mode",
24
+ "budgetDuration",
25
+ "enforcement",
26
+ ]);
27
+ export const SETTINGS_BUDGET_PER_MODEL_NUMBER_KEYS = Object.freeze([
28
+ "maxBudgetUsd",
29
+ "tpmLimit",
30
+ "rpmLimit",
31
+ ]);
32
+ export const SETTINGS_MODEL_API_WORDS = Object.freeze([
33
+ "openai-completions",
34
+ "anthropic-messages",
35
+ ]);
36
+ export const SETTINGS_TOOL_NAME_MATCHER_EVENTS = Object.freeze([
37
+ "PreToolUse",
38
+ "PostToolUse",
39
+ "PostToolUseFailure",
40
+ ]);
@@ -1,15 +1,8 @@
1
1
  import { type EnvLike } from './hostEnv.js';
2
2
  import type { WireHooksConfig } from './finalVerifyWire.js';
3
3
  export declare const GOAL_STOP_HOOK_WIRE_ENV = "SEMA_GOAL_STOP_HOOK_WIRE";
4
- export declare const CC_STOP_SEMANTICS_MIN_SERVER = "1.279.3";
5
- export declare function ccStopSemanticsFromVersion(version: string | undefined | null): boolean;
6
- export declare function engineCcStopSemantics(env?: EnvLike): boolean;
7
4
  export declare function isGoalStopHookWireArmed(env?: EnvLike): boolean;
8
- export declare function setWireSessionStopHook(prompt: string | null, opts?: {
9
- ccSemantics?: boolean;
10
- }): void;
5
+ export declare function setWireSessionStopHook(prompt: string | null): void;
11
6
  export declare function getWireSessionStopHook(): string | null;
12
- export declare function getWireSessionStopHookCcSemantics(): boolean;
13
- export declare function buildGoalStopHookPrompt(condition: string): string;
14
7
  export declare function goalStopHookMatcher(managedOnly: boolean): NonNullable<WireHooksConfig[string]>[number] | null;
15
8
  export declare function __resetGoalStopHookForTests(): void;
@@ -1,80 +1,24 @@
1
1
  import { hostEnv } from './hostEnv.js';
2
2
  import { envFlagOff } from './envFlag.js';
3
- import { engineCapString } from './engineCapsCache.js';
4
3
  let wireSessionStopHookPrompt = null;
5
- let wireSessionStopHookCcSemantics = false;
6
4
  export const GOAL_STOP_HOOK_WIRE_ENV = 'SEMA_GOAL_STOP_HOOK_WIRE';
7
- export const CC_STOP_SEMANTICS_MIN_SERVER = '1.279.3';
8
- function parseSemverCore(v) {
9
- const m = /^(\d+)\.(\d+)\.(\d+)$/.exec(v.trim());
10
- return m ? [Number(m[1]), Number(m[2]), Number(m[3])] : null;
11
- }
12
- export function ccStopSemanticsFromVersion(version) {
13
- if (typeof version !== 'string' || version.length === 0)
14
- return false;
15
- const got = parseSemverCore(version);
16
- const min = parseSemverCore(CC_STOP_SEMANTICS_MIN_SERVER);
17
- if (got === null || min === null)
18
- return false;
19
- const [gotMajor, gotMinor, gotPatch] = got;
20
- const [minMajor, minMinor, minPatch] = min;
21
- if (gotMajor !== minMajor)
22
- return gotMajor > minMajor;
23
- if (gotMinor !== minMinor)
24
- return gotMinor > minMinor;
25
- if (gotPatch !== minPatch)
26
- return gotPatch > minPatch;
27
- return true;
28
- }
29
- export function engineCcStopSemantics(env = hostEnv()) {
30
- const base = env.SEMA_LIVE_BASEURL;
31
- if (!base)
32
- return false;
33
- return ccStopSemanticsFromVersion(engineCapString(base, 'version'));
34
- }
35
5
  export function isGoalStopHookWireArmed(env = hostEnv()) {
36
6
  return !envFlagOff(env[GOAL_STOP_HOOK_WIRE_ENV]);
37
7
  }
38
- export function setWireSessionStopHook(prompt, opts) {
8
+ export function setWireSessionStopHook(prompt) {
39
9
  wireSessionStopHookPrompt = prompt && prompt.length > 0 ? prompt : null;
40
- wireSessionStopHookCcSemantics = wireSessionStopHookPrompt === null ? false : opts?.ccSemantics === true;
41
10
  }
42
11
  export function getWireSessionStopHook() {
43
12
  return wireSessionStopHookPrompt;
44
13
  }
45
- export function getWireSessionStopHookCcSemantics() {
46
- return wireSessionStopHookCcSemantics;
47
- }
48
- export function buildGoalStopHookPrompt(condition) {
49
- const reason = `[session goal] Before you stop: verify that this goal actually holds — ${condition}. ` +
50
- `If it does hold, say so plainly and finish. If it does not, keep working toward it and do not ` +
51
- `pause to ask the user what to do.`;
52
- return ('You are the Stop gate for an autonomous coding agent session. The user set this session goal, ' +
53
- 'which the agent is supposed to satisfy before it stops:\n' +
54
- `<goal>\n${condition}\n</goal>\n` +
55
- 'Stop-hook input JSON: $ARGUMENTS\n' +
56
- 'Reply with RAW JSON only — no prose, no explanation, no code fences.\n' +
57
- 'If the input JSON has "stop_hook_active" set to true, this gate already fired once for this turn: ' +
58
- 'reply with exactly {"continue":true} so the agent may stop.\n' +
59
- 'Otherwise reply with exactly:\n' +
60
- JSON.stringify({ decision: 'block', reason }));
61
- }
62
14
  export function goalStopHookMatcher(managedOnly) {
63
15
  if (wireSessionStopHookPrompt === null || managedOnly || !isGoalStopHookWireArmed())
64
16
  return null;
65
17
  return {
66
18
  matcher: '',
67
- hooks: [
68
- {
69
- type: 'prompt',
70
- prompt: wireSessionStopHookCcSemantics
71
- ? wireSessionStopHookPrompt
72
- : buildGoalStopHookPrompt(wireSessionStopHookPrompt),
73
- },
74
- ],
19
+ hooks: [{ type: 'prompt', prompt: wireSessionStopHookPrompt }],
75
20
  };
76
21
  }
77
22
  export function __resetGoalStopHookForTests() {
78
23
  wireSessionStopHookPrompt = null;
79
- wireSessionStopHookCcSemantics = false;
80
24
  }
@@ -1,13 +1,14 @@
1
1
  import { type PermissionMode, type PermissionModeField } from './permissionWireCaps.js';
2
+ import { type PermissionModesReading } from './permissionModesCapability.js';
2
3
  import { type EnvLike } from './hostEnv.js';
3
4
  export declare const HEADLESS_PERMISSION_MODE_ENV = "SEMA_HEADLESS_PERMISSION_MODE";
4
5
  export declare const HEADLESS_PERMISSION_WIRE_MODES: readonly PermissionMode[];
5
- export declare function normalizeShellPermissionModeForWire(mode: string | undefined): string | undefined;
6
+ export declare function normalizeShellPermissionModeForWire(mode: string | undefined, permissionModes?: PermissionModesReading): string | undefined;
6
7
  export type HeadlessPermissionResolution = {
7
8
  fields: PermissionModeField;
8
9
  source: 'flag' | 'env' | 'default' | 'absent';
9
10
  warning?: string;
10
11
  };
11
12
  export declare function permissionModeFromArgv(argv: readonly string[]): string | undefined;
12
- export declare function resolveHeadlessPermissionMode(argv: readonly string[], env?: EnvLike): HeadlessPermissionResolution;
13
+ export declare function resolveHeadlessPermissionMode(argv: readonly string[], env?: EnvLike, permissionModes?: PermissionModesReading): HeadlessPermissionResolution;
13
14
  export declare function _resetHeadlessPermissionModeWireForTest(): void;
@@ -1,16 +1,20 @@
1
1
  import { permissionModeField } from './permissionWireCaps.js';
2
+ import { permissionModeAdmitted } from './permissionModesCapability.js';
2
3
  import { hostEnv } from './hostEnv.js';
3
4
  import { lastFlagValue } from './argvFlagValue.js';
4
5
  import { PERMISSION_MODE_WORDS } from './taskRequestWords.js';
6
+ import { readOwnDataValue } from './ownKey.js';
5
7
  export const HEADLESS_PERMISSION_MODE_ENV = 'SEMA_HEADLESS_PERMISSION_MODE';
6
8
  export const HEADLESS_PERMISSION_WIRE_MODES = [...PERMISSION_MODE_WORDS];
7
9
  const SHELL_INTERNAL_MODE_TO_WIRE = new Map([
8
10
  ['manual', 'default'],
9
11
  ['dontAsk', 'default'],
10
12
  ]);
11
- export function normalizeShellPermissionModeForWire(mode) {
13
+ export function normalizeShellPermissionModeForWire(mode, permissionModes) {
12
14
  if (mode === undefined)
13
15
  return undefined;
16
+ if (mode === 'dontAsk' && permissionModeAdmitted(permissionModes, mode))
17
+ return mode;
14
18
  return SHELL_INTERNAL_MODE_TO_WIRE.get(mode) ?? mode;
15
19
  }
16
20
  export function permissionModeFromArgv(argv) {
@@ -27,19 +31,32 @@ export function permissionModeFromArgv(argv) {
27
31
  return undefined;
28
32
  }
29
33
  let warnedInvalidEnv = false;
30
- export function resolveHeadlessPermissionMode(argv, env = hostEnv()) {
34
+ export function resolveHeadlessPermissionMode(argv, env = hostEnv(), permissionModes) {
31
35
  const flagMode = permissionModeFromArgv(argv);
32
36
  if (flagMode !== undefined) {
33
- const normalized = normalizeShellPermissionModeForWire(flagMode);
34
- return { fields: permissionModeField(normalized, { stampDefault: true }), source: 'flag' };
37
+ const snap = flagMode === 'dontAsk' ? dontAskSnapshot(permissionModes) : undefined;
38
+ const normalized = normalizeShellPermissionModeForWire(flagMode, snap);
39
+ return { fields: permissionModeField(normalized, { stampDefault: true, permissionModes: snap }), source: 'flag' };
35
40
  }
36
41
  const raw = env[HEADLESS_PERMISSION_MODE_ENV]?.trim();
37
42
  if (raw === undefined || raw === '') {
38
43
  return { fields: permissionModeField('default', { stampDefault: true }), source: 'default' };
39
44
  }
40
45
  if (HEADLESS_PERMISSION_WIRE_MODES.includes(raw)) {
46
+ const snap = raw === 'dontAsk' ? dontAskSnapshot(permissionModes) : undefined;
47
+ if (raw === 'dontAsk' && snap === undefined) {
48
+ const downgraded = {
49
+ fields: permissionModeField('default', { stampDefault: true }),
50
+ source: 'env',
51
+ };
52
+ if (!warnedInvalidEnv) {
53
+ warnedInvalidEnv = true;
54
+ downgraded.warning = `sema: ${HEADLESS_PERMISSION_MODE_ENV}="dontAsk" is only sent once this client knows the engine accepts that mode, and ${dontAskWithheldClause(permissionModes)} — this run uses "default"`;
55
+ }
56
+ return downgraded;
57
+ }
41
58
  return {
42
- fields: permissionModeField(raw, { stampDefault: true }),
59
+ fields: permissionModeField(raw, { stampDefault: true, permissionModes: snap }),
43
60
  source: 'env',
44
61
  };
45
62
  }
@@ -53,6 +70,30 @@ export function resolveHeadlessPermissionMode(argv, env = hostEnv()) {
53
70
  }
54
71
  return resolution;
55
72
  }
73
+ function dontAskSnapshot(reading) {
74
+ return permissionModeAdmitted(reading, 'dontAsk') ? { kind: 'present', modes: Object.freeze(['dontAsk']) } : undefined;
75
+ }
76
+ function dontAskWithheldClause(reading) {
77
+ if (reading === undefined)
78
+ return 'no such reading was supplied for this run';
79
+ let kind;
80
+ try {
81
+ kind = typeof reading === 'object' && reading !== null ? readOwnDataValue(reading, 'kind') : undefined;
82
+ }
83
+ catch {
84
+ kind = undefined;
85
+ }
86
+ switch (kind) {
87
+ case 'unobserved':
88
+ return "this engine's capabilities have not been read yet (wait for them before the first request)";
89
+ case 'not_reported':
90
+ return 'this engine does not report which modes it accepts';
91
+ case 'present':
92
+ return "this engine's list of accepted modes does not include it";
93
+ default:
94
+ return 'the reading supplied for it could not be read';
95
+ }
96
+ }
56
97
  export function _resetHeadlessPermissionModeWireForTest() {
57
98
  warnedInvalidEnv = false;
58
99
  }
@@ -0,0 +1,21 @@
1
+ export interface ApprovalAllowRuleShadowMember {
2
+ readonly member?: string;
3
+ readonly known: boolean;
4
+ readonly entries?: readonly string[];
5
+ readonly omitted?: number;
6
+ readonly malformed?: true;
7
+ }
8
+ export interface AllowRuleShadowedWireMember {
9
+ readonly member: string;
10
+ readonly entries: readonly string[];
11
+ readonly omitted?: number;
12
+ }
13
+ export interface ApprovalAllowRuleShadow {
14
+ readonly source: 'allow_rule_shadowed' | 'legacy_shadowed_rule';
15
+ readonly members: readonly ApprovalAllowRuleShadowMember[];
16
+ readonly unreadable?: true;
17
+ }
18
+ export declare function readAllowRuleShadowFromWire(carrier: object | null | undefined, leg: 'frame' | 'row'): ApprovalAllowRuleShadow | undefined;
19
+ export declare function readApprovalAllowRuleShadow(card: object | null | undefined): ApprovalAllowRuleShadow | undefined;
20
+ export declare function approvalAllowRuleShadowed(card: object | null | undefined): boolean;
21
+ export declare function legacyShadowedRuleTextOf(r: ApprovalAllowRuleShadow | undefined): string | undefined;
@@ -0,0 +1,167 @@
1
+ import { CORE_ALLOW_RULE_MEMBERS } from '../generated/engineFactTables.js';
2
+ const KNOWN_MEMBERS = new Set(CORE_ALLOW_RULE_MEMBERS);
3
+ function freezeMember(m) {
4
+ return Object.freeze({ ...m });
5
+ }
6
+ function unreadable() {
7
+ return Object.freeze({ source: 'allow_rule_shadowed', members: Object.freeze([]), unreadable: true });
8
+ }
9
+ function readMemberRecord(r) {
10
+ if (typeof r !== 'object' || r === null || Array.isArray(r))
11
+ return freezeMember({ known: false, malformed: true });
12
+ let malformed = false;
13
+ const rawMember = Object.hasOwn(r, 'member') ? r.member : undefined;
14
+ const member = typeof rawMember === 'string' && rawMember !== '' ? rawMember : undefined;
15
+ if (member === undefined)
16
+ malformed = true;
17
+ let entries;
18
+ const rawEntries = Object.hasOwn(r, 'entries') ? r.entries : undefined;
19
+ if (Array.isArray(rawEntries)) {
20
+ const length = rawEntries.length;
21
+ if (typeof length === 'number' && Number.isSafeInteger(length) && length >= 0) {
22
+ const out = [];
23
+ let ok = true;
24
+ for (let i = 0; i < length; i++) {
25
+ const d = Object.getOwnPropertyDescriptor(rawEntries, i);
26
+ if (d === undefined || !('value' in d)) {
27
+ ok = false;
28
+ break;
29
+ }
30
+ const e = d.value;
31
+ if (typeof e !== 'string') {
32
+ ok = false;
33
+ break;
34
+ }
35
+ out.push(e);
36
+ }
37
+ if (ok && rawEntries.length === length)
38
+ entries = Object.freeze(out);
39
+ else
40
+ malformed = true;
41
+ }
42
+ else
43
+ malformed = true;
44
+ }
45
+ else
46
+ malformed = true;
47
+ let omitted;
48
+ if (Object.hasOwn(r, 'omitted')) {
49
+ const o = r.omitted;
50
+ if (typeof o === 'number' && Number.isSafeInteger(o) && o > 0)
51
+ omitted = o;
52
+ else if (o !== undefined)
53
+ malformed = true;
54
+ }
55
+ return freezeMember({
56
+ ...(member !== undefined ? { member } : {}),
57
+ known: member !== undefined && KNOWN_MEMBERS.has(member),
58
+ ...(entries !== undefined ? { entries } : {}),
59
+ ...(omitted !== undefined ? { omitted } : {}),
60
+ ...(malformed ? { malformed: true } : {}),
61
+ });
62
+ }
63
+ function readNewKeyValue(raw) {
64
+ if (raw === undefined)
65
+ return undefined;
66
+ if (!Array.isArray(raw))
67
+ return unreadable();
68
+ const length = raw.length;
69
+ if (typeof length !== 'number' || !Number.isSafeInteger(length) || length <= 0)
70
+ return unreadable();
71
+ const members = [];
72
+ for (let i = 0; i < length; i++)
73
+ members.push(readMemberAt(raw, i));
74
+ if (raw.length !== length)
75
+ return unreadable();
76
+ return Object.freeze({ source: 'allow_rule_shadowed', members: Object.freeze(members) });
77
+ }
78
+ function readLegacyValue(raw) {
79
+ if (typeof raw !== 'string' || raw.trim() === '')
80
+ return undefined;
81
+ return Object.freeze({
82
+ source: 'legacy_shadowed_rule',
83
+ members: Object.freeze([freezeMember({ member: 'persisted', known: true, entries: Object.freeze([raw]) })]),
84
+ });
85
+ }
86
+ function ownValue(v, key) {
87
+ return Object.hasOwn(v, key) ? v[key] : undefined;
88
+ }
89
+ function keyValue(v, key) {
90
+ return v[key];
91
+ }
92
+ function readMemberAt(arr, i) {
93
+ const d = Object.getOwnPropertyDescriptor(arr, i);
94
+ return d !== undefined && 'value' in d ? readMemberRecord(d.value) : freezeMember({ known: false, malformed: true });
95
+ }
96
+ export function readAllowRuleShadowFromWire(carrier, leg) {
97
+ try {
98
+ if (typeof carrier !== 'object' || carrier === null)
99
+ return undefined;
100
+ let host = carrier;
101
+ if (leg === 'row') {
102
+ const rd = keyValue(carrier, 'riskDescriptor');
103
+ host = typeof rd === 'object' && rd !== null ? rd : undefined;
104
+ }
105
+ if (host === undefined)
106
+ return undefined;
107
+ const fresh = readNewKeyValue(keyValue(host, 'allowRuleShadowed'));
108
+ if (fresh !== undefined)
109
+ return fresh;
110
+ return readLegacyValue(keyValue(host, leg === 'row' ? 'shadowedRule' : 'persistedRuleShadowed'));
111
+ }
112
+ catch {
113
+ return unreadable();
114
+ }
115
+ }
116
+ function readStampedValue(raw) {
117
+ if (typeof raw !== 'object' || raw === null)
118
+ return unreadable();
119
+ const source = ownValue(raw, 'source');
120
+ const members = ownValue(raw, 'members');
121
+ if ((source !== 'allow_rule_shadowed' && source !== 'legacy_shadowed_rule') || !Array.isArray(members))
122
+ return unreadable();
123
+ const length = members.length;
124
+ if (typeof length !== 'number' || !Number.isSafeInteger(length))
125
+ return unreadable();
126
+ const out = [];
127
+ for (let i = 0; i < length; i++) {
128
+ const r = readMemberAt(members, i);
129
+ const d = Object.getOwnPropertyDescriptor(members, i);
130
+ const was = d !== undefined && 'value' in d && typeof d.value === 'object' && d.value !== null && d.value.malformed === true;
131
+ out.push(was && r.malformed !== true ? freezeMember({ ...r, malformed: true }) : r);
132
+ }
133
+ if (members.length !== length)
134
+ return unreadable();
135
+ return Object.freeze({
136
+ source,
137
+ members: Object.freeze(out),
138
+ ...(ownValue(raw, 'unreadable') === true || out.length === 0 ? { unreadable: true } : {}),
139
+ });
140
+ }
141
+ export function readApprovalAllowRuleShadow(card) {
142
+ try {
143
+ if (typeof card !== 'object' || card === null)
144
+ return undefined;
145
+ const stamped = keyValue(card, 'allowRuleShadow');
146
+ if (stamped !== undefined)
147
+ return readStampedValue(stamped);
148
+ return readAllowRuleShadowFromWire(card, 'frame');
149
+ }
150
+ catch {
151
+ return unreadable();
152
+ }
153
+ }
154
+ export function approvalAllowRuleShadowed(card) {
155
+ return readApprovalAllowRuleShadow(card) !== undefined;
156
+ }
157
+ export function legacyShadowedRuleTextOf(r) {
158
+ if (r === undefined)
159
+ return undefined;
160
+ for (const m of r.members) {
161
+ if (m.member !== 'persisted' || m.entries === undefined)
162
+ continue;
163
+ const first = m.entries[0];
164
+ return typeof first === 'string' && first.trim() !== '' ? first : undefined;
165
+ }
166
+ return undefined;
167
+ }
@@ -0,0 +1,14 @@
1
+ export type AskClassPairReading = {
2
+ readonly state: 'pair';
3
+ readonly askClass: string;
4
+ readonly classes: readonly string[];
5
+ } | {
6
+ readonly state: 'absent';
7
+ } | {
8
+ readonly state: 'malformed';
9
+ };
10
+ export declare function readAskClassPairState(v: object | null | undefined): AskClassPairReading;
11
+ export declare function readAskClassPair(v: object | null | undefined): {
12
+ askClass: string;
13
+ classes: readonly string[];
14
+ } | undefined;
@@ -0,0 +1,42 @@
1
+ const ABSENT = Object.freeze({ state: 'absent' });
2
+ const MALFORMED = Object.freeze({ state: 'malformed' });
3
+ export function readAskClassPairState(v) {
4
+ if (typeof v !== 'object' || v === null)
5
+ return ABSENT;
6
+ const hasAskClass = Object.hasOwn(v, 'askClass');
7
+ const hasClasses = Object.hasOwn(v, 'classes');
8
+ if (!hasAskClass && !hasClasses)
9
+ return ABSENT;
10
+ if (!hasAskClass || !hasClasses)
11
+ return MALFORMED;
12
+ const askClass = v.askClass;
13
+ if (typeof askClass !== 'string' || askClass === '')
14
+ return MALFORMED;
15
+ const raw = v.classes;
16
+ if (!Array.isArray(raw))
17
+ return MALFORMED;
18
+ const length = raw.length;
19
+ if (typeof length !== 'number' || !Number.isSafeInteger(length) || length <= 0)
20
+ return MALFORMED;
21
+ const classes = [];
22
+ const seen = new Set();
23
+ for (let i = 0; i < length; i++) {
24
+ const d = Object.getOwnPropertyDescriptor(raw, i);
25
+ if (d === undefined || !('value' in d))
26
+ return MALFORMED;
27
+ const c = d.value;
28
+ if (typeof c !== 'string' || c === '' || seen.has(c))
29
+ return MALFORMED;
30
+ seen.add(c);
31
+ classes.push(c);
32
+ }
33
+ if (raw.length !== length)
34
+ return MALFORMED;
35
+ if (classes[0] !== askClass)
36
+ return MALFORMED;
37
+ return Object.freeze({ state: 'pair', askClass, classes: Object.freeze(classes) });
38
+ }
39
+ export function readAskClassPair(v) {
40
+ const r = readAskClassPairState(v);
41
+ return r.state === 'pair' ? { askClass: r.askClass, classes: r.classes } : undefined;
42
+ }
@@ -116,6 +116,7 @@ export async function* bridgeAskUserQuestionGates(source, deps, opts) {
116
116
  led.forgetRunScopedState();
117
117
  }
118
118
  const seq = handoff !== undefined ? undefined : led.lastSeq();
119
+ led.beginStreamSegment();
119
120
  stream = deps.runsEvents(taskId.current, {
120
121
  ...(seq !== undefined ? { lastEventId: seq } : {}),
121
122
  ...(opts?.signal ? { signal: opts.signal } : {}),