@sema-agent/client-core 0.84.0 → 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 (101) hide show
  1. package/CHANGELOG.md +247 -0
  2. package/README.md +27 -13
  3. package/dist/abortableSleep.d.ts +10 -0
  4. package/dist/abortableSleep.js +37 -0
  5. package/dist/adapt/arms.js +1 -1
  6. package/dist/adapt.d.ts +1 -1
  7. package/dist/adapt.js +1 -1
  8. package/dist/adapter/downstream/terminalToSdkResult.d.ts +1 -0
  9. package/dist/adapter/downstream/terminalToSdkResult.js +19 -10
  10. package/dist/adapter/runStream.js +6 -2
  11. package/dist/agentSession/engineSessionBackgroundStop.d.ts +50 -0
  12. package/dist/agentSession/engineSessionBackgroundStop.js +291 -0
  13. package/dist/agentsWireCaps.d.ts +2 -1
  14. package/dist/agentsWireCaps.js +8 -0
  15. package/dist/cloudConfigWireCaps.js +2 -1
  16. package/dist/corruptSession.d.ts +3 -0
  17. package/dist/corruptSession.js +29 -0
  18. package/dist/corruptSessionCopy.d.ts +1 -0
  19. package/dist/corruptSessionCopy.js +4 -0
  20. package/dist/decideFailureNote.d.ts +2 -1
  21. package/dist/decideFailureNote.js +8 -3
  22. package/dist/decideReceipt.d.ts +6 -0
  23. package/dist/decideReceipt.js +30 -1
  24. package/dist/detachWire.d.ts +1 -0
  25. package/dist/detachWire.js +13 -5
  26. package/dist/displayUntrusted.js +114 -18
  27. package/dist/effortWire.d.ts +2 -1
  28. package/dist/effortWire.js +2 -4
  29. package/dist/engineErrorCodes.d.ts +11 -0
  30. package/dist/engineErrorCodes.js +32 -0
  31. package/dist/engineNoticeCodes.d.ts +39 -4
  32. package/dist/engineNoticeCodes.js +117 -161
  33. package/dist/engineWireFor.d.ts +43 -0
  34. package/dist/engineWireFor.js +399 -0
  35. package/dist/engineWireSdk.d.ts +6 -0
  36. package/dist/fileHistoryCaptureCapability.d.ts +4 -1
  37. package/dist/fileHistoryCaptureCapability.js +43 -9
  38. package/dist/gateVocabulary.d.ts +1 -2
  39. package/dist/gateVocabulary.js +1 -22
  40. package/dist/generated/engineNoticeTables.d.ts +3 -0
  41. package/dist/generated/engineNoticeTables.js +156 -0
  42. package/dist/generated/toolNameTables.d.ts +2 -0
  43. package/dist/generated/toolNameTables.js +43 -0
  44. package/dist/headlessPermissionModeWire.js +2 -4
  45. package/dist/hitl/askGateWire.d.ts +1 -1
  46. package/dist/hitl/askGateWire.js +1 -1
  47. package/dist/hitl/frameRouter.js +4 -2
  48. package/dist/hitl/hitlHostSurface.js +1 -1
  49. package/dist/hitl/parkResolver.d.ts +1 -0
  50. package/dist/hitl/parkResolver.js +11 -3
  51. package/dist/hitl/planReviewWire.d.ts +41 -3
  52. package/dist/hitl/planReviewWire.js +264 -49
  53. package/dist/hitl/rosterMountedNames.d.ts +2 -0
  54. package/dist/hitl/rosterMountedNames.js +38 -0
  55. package/dist/hitl/sessionPolicyDeliverable.d.ts +8 -2
  56. package/dist/hitl/sessionPolicyDeliverable.js +39 -48
  57. package/dist/hitl/sessionPolicyWire.d.ts +40 -0
  58. package/dist/hitl/sessionPolicyWire.js +173 -0
  59. package/dist/hitl/toolApprovalWire.d.ts +4 -2
  60. package/dist/hitl/toolApprovalWire.js +6 -4
  61. package/dist/index.d.ts +10 -3
  62. package/dist/index.js +7 -2
  63. package/dist/liveInitToolFace.js +28 -10
  64. package/dist/permissionWireCaps.d.ts +2 -1
  65. package/dist/permissionWireCaps.js +2 -7
  66. package/dist/request/taskRequest.d.ts +2 -0
  67. package/dist/request/taskRequest.js +18 -1
  68. package/dist/resumeRefusalCopy.d.ts +11 -0
  69. package/dist/resumeRefusalCopy.js +42 -2
  70. package/dist/runTerminal.js +4 -0
  71. package/dist/sandboxWire.js +1 -1
  72. package/dist/sealedKeyCapability.d.ts +17 -0
  73. package/dist/sealedKeyCapability.js +42 -0
  74. package/dist/seatContract.d.ts +2 -1
  75. package/dist/seatContract.js +5 -21
  76. package/dist/subagent/engineCompactWire.d.ts +13 -2
  77. package/dist/subagent/engineCompactWire.js +48 -37
  78. package/dist/subagent/engineDelegatedPrompt.d.ts +9 -1
  79. package/dist/subagent/engineDelegatedPrompt.js +16 -16
  80. package/dist/subagent/engineRowStopGate.d.ts +2 -2
  81. package/dist/subagent/engineRowStopGate.js +4 -4
  82. package/dist/subagent/engineSubagentOutput.d.ts +8 -0
  83. package/dist/subagent/engineSubagentOutput.js +37 -18
  84. package/dist/subagent/engineSubagentResume.d.ts +11 -2
  85. package/dist/subagent/engineSubagentResume.js +28 -14
  86. package/dist/subagent/engineSubagentSteer.d.ts +10 -1
  87. package/dist/subagent/engineSubagentSteer.js +16 -11
  88. package/dist/subagent/engineSubagentTail.d.ts +10 -1
  89. package/dist/subagent/engineSubagentTail.js +35 -17
  90. package/dist/subagent/engineTaskHandleWire.d.ts +13 -0
  91. package/dist/subagent/engineTaskHandleWire.js +41 -20
  92. package/dist/systemReminderTag.d.ts +5 -0
  93. package/dist/systemReminderTag.js +20 -9
  94. package/dist/taskRequestWords.d.ts +5 -0
  95. package/dist/taskRequestWords.js +4 -0
  96. package/dist/wireErrorTriage.d.ts +1 -0
  97. package/dist/wireErrorTriage.js +3 -1
  98. package/dist/wireRefusalCopy.d.ts +10 -0
  99. package/dist/wireRefusalCopy.js +62 -2
  100. package/docs/INTEGRATION-CLIENTS.md +1128 -22
  101. package/package.json +1 -1
@@ -1,169 +1,24 @@
1
- export const ENGINE_NOTICE_CODES = Object.freeze([
2
- 'config.autocompact_window_clamped',
3
- 'config.env_timeout_discarded',
4
- 'config.materialize_env_discarded',
5
- 'config.models_swapped',
6
- 'config.context_settings_swapped',
7
- 'config.read_face_swapped',
8
- 'config.read_face_deployment_clamped',
9
- 'config.write_face_swapped',
10
- 'config.write_face_deployment_clamped',
11
- 'config.tool_model_gate_removed',
12
- 'config.tool_model_gate_unknown_class',
13
- 'config.tool_model_gate_env_invalid',
14
- 'config.artifact_host_invalid',
15
- 'config.task_root_not_canonical',
16
- 'config.write_protection_target_view_absent',
17
- 'config.write_protection_unresolved',
18
- 'config.execution_env_capability_invalid',
19
- 'config.tool_card_undeclared',
20
- 'config.tool_face_undeclared',
21
- 'config.tool_face_invalid',
22
- 'config.forward_sink_failed',
23
- 'config.durable_gate_unavailable',
24
- 'config.peer_admission_out_of_range',
25
- 'config.peer_lane_unmounted',
26
- 'config.secret_env_scrubbed',
27
- 'peer.inbound_disposition',
28
- 'peer.held_settled',
29
- 'peer.idle_subscription',
30
- 'classifier.denial_limit',
31
- 'classifier.fallback',
32
- 'classifier.role_defaulted',
33
- 'classifier.contract_broken',
34
- 'checkpoint.execution_outcome_unrecorded',
35
- 'delegation.transcript_integrity',
36
- 'delegation.ask_unresolvable',
37
- 'mcp.injection_dropped',
38
- 'mcp.revocation_probe_failed',
39
- 'mcp.server_redialed',
40
- 'workflow.governance_key_stripped',
41
- 'workflow.agent_option_ignored',
42
- 'memory.session_polluted',
43
- 'memory.harvest_quarantined',
44
- 'memory.delegation_static_mark_waived',
45
- 'memory.content_class_declared',
46
- 'memory.hold_opened',
47
- 'memory.hold_released',
48
- 'memory.hold_disposed',
49
- 'memory.consolidation_recommended',
50
- 'memory.consolidation_committed',
51
- 'memory.consolidation_conflict',
52
- 'memory.consolidation_incomplete',
53
- 'memory.consolidation_refused',
54
- 'memory.consolidation_withheld',
55
- 'memory.restore_withheld',
56
- 'memory.project_scope_absent',
57
- 'route.fallback_to_primary',
58
- 'route.classifier_unroutable',
59
- 'route.base_url_changed_key_unchanged',
60
- 'route.response_model_mismatch',
61
- 'task.user_steer_undrained',
62
- 'task.user_followup_undrained',
63
- 'steering.parked_input_blocked',
64
- 'task.turn_interrupted',
65
- 'task.halt_unconsumed',
66
- 'task.late_approval',
67
- 'task.interrupt_unconsumed',
68
- 'approval.read_root_granted',
69
- 'approval.read_root_grant_rejected',
70
- 'memory.capture_opted_out',
71
- 'memory.capture_optout_unpersisted',
72
- 'skills.listing_truncated',
73
- 'agents.listing_truncated',
74
- 'tool_result.offload_put_failed',
75
- ]);
1
+ import { CORE_ENGINE_NOTICE_CODES, CORE_MCP_INJECTION_DROP_REASONS, CORE_NOTICE_AUDIENCE } from './generated/engineNoticeTables.js';
2
+ export const ENGINE_NOTICE_CODES = CORE_ENGINE_NOTICE_CODES;
76
3
  const CATALOG = new Set(ENGINE_NOTICE_CODES);
4
+ export const SERVER_NOTICE_AUDIENCE = Object.freeze({
5
+ 'instructions.source_changed': 'user',
6
+ 'memory.layer_locked_legacy': 'operator',
7
+ 'session.records_skipped': 'user',
8
+ });
9
+ function audienceRow(table, code) {
10
+ return Object.hasOwn(table, code) ? table[code] : undefined;
11
+ }
77
12
  export function engineNoticeInCatalog(code) {
78
- return typeof code === 'string' && CATALOG.has(code);
13
+ return typeof code === 'string' && (CATALOG.has(code) || Object.hasOwn(SERVER_NOTICE_AUDIENCE, code));
79
14
  }
80
- export const ENGINE_NOTICE_AUDIENCE = Object.freeze({
81
- 'config.autocompact_window_clamped': 'operator',
82
- 'config.env_timeout_discarded': 'operator',
83
- 'config.materialize_env_discarded': 'operator',
84
- 'config.models_swapped': 'operator',
85
- 'config.context_settings_swapped': 'operator',
86
- 'config.read_face_swapped': 'operator',
87
- 'config.read_face_deployment_clamped': 'operator',
88
- 'config.write_face_swapped': 'operator',
89
- 'config.write_face_deployment_clamped': 'operator',
90
- 'config.tool_model_gate_removed': 'operator',
91
- 'config.tool_model_gate_unknown_class': 'operator',
92
- 'config.tool_model_gate_env_invalid': 'operator',
93
- 'config.artifact_host_invalid': 'operator',
94
- 'config.task_root_not_canonical': 'operator',
95
- 'config.write_protection_target_view_absent': 'operator',
96
- 'config.write_protection_unresolved': 'operator',
97
- 'config.execution_env_capability_invalid': 'operator',
98
- 'config.tool_card_undeclared': 'operator',
99
- 'config.tool_face_undeclared': 'operator',
100
- 'config.tool_face_invalid': 'operator',
101
- 'config.forward_sink_failed': 'operator',
102
- 'config.durable_gate_unavailable': 'user',
103
- 'config.peer_admission_out_of_range': 'operator',
104
- 'config.peer_lane_unmounted': 'operator',
105
- 'config.secret_env_scrubbed': 'operator',
106
- 'peer.inbound_disposition': 'user',
107
- 'peer.held_settled': 'user',
108
- 'peer.idle_subscription': 'user',
109
- 'classifier.denial_limit': 'user',
110
- 'classifier.fallback': 'operator',
111
- 'classifier.role_defaulted': 'operator',
112
- 'classifier.contract_broken': 'operator',
113
- 'checkpoint.execution_outcome_unrecorded': 'operator',
114
- 'delegation.transcript_integrity': 'operator',
115
- 'delegation.ask_unresolvable': 'user',
116
- 'mcp.injection_dropped': 'user',
117
- 'mcp.revocation_probe_failed': 'operator',
118
- 'mcp.server_redialed': 'operator',
119
- 'workflow.governance_key_stripped': 'operator',
120
- 'workflow.agent_option_ignored': 'operator',
121
- 'memory.session_polluted': 'user',
122
- 'memory.harvest_quarantined': 'user',
123
- 'memory.delegation_static_mark_waived': 'user',
124
- 'memory.content_class_declared': 'operator',
125
- 'memory.hold_opened': 'user',
126
- 'memory.hold_released': 'user',
127
- 'memory.hold_disposed': 'user',
128
- 'memory.consolidation_recommended': 'operator',
129
- 'memory.consolidation_committed': 'operator',
130
- 'memory.consolidation_conflict': 'operator',
131
- 'memory.consolidation_incomplete': 'operator',
132
- 'memory.consolidation_refused': 'operator',
133
- 'memory.consolidation_withheld': 'operator',
134
- 'memory.restore_withheld': 'operator',
135
- 'memory.project_scope_absent': 'operator',
136
- 'route.fallback_to_primary': 'operator',
137
- 'route.classifier_unroutable': 'operator',
138
- 'route.base_url_changed_key_unchanged': 'operator',
139
- 'route.response_model_mismatch': 'operator',
140
- 'task.user_steer_undrained': 'user',
141
- 'task.user_followup_undrained': 'user',
142
- 'steering.parked_input_blocked': 'user',
143
- 'task.turn_interrupted': 'user',
144
- 'task.halt_unconsumed': 'user',
145
- 'task.late_approval': 'user',
146
- 'task.interrupt_unconsumed': 'user',
147
- 'approval.read_root_granted': 'user',
148
- 'approval.read_root_grant_rejected': 'user',
149
- 'memory.capture_opted_out': 'user',
150
- 'memory.capture_optout_unpersisted': 'user',
151
- 'skills.listing_truncated': 'operator',
152
- 'agents.listing_truncated': 'operator',
153
- 'tool_result.offload_put_failed': 'operator',
154
- });
15
+ export const ENGINE_NOTICE_AUDIENCE = CORE_NOTICE_AUDIENCE;
155
16
  export function noticeAudienceOf(code) {
156
- const row = typeof code === 'string' && Object.hasOwn(ENGINE_NOTICE_AUDIENCE, code)
157
- ? ENGINE_NOTICE_AUDIENCE[code]
158
- : undefined;
159
- return row ?? 'operator';
17
+ if (typeof code !== 'string')
18
+ return 'operator';
19
+ return audienceRow(ENGINE_NOTICE_AUDIENCE, code) ?? audienceRow(SERVER_NOTICE_AUDIENCE, code) ?? 'operator';
160
20
  }
161
- export const MCP_INJECTION_DROP_REASONS = Object.freeze([
162
- 'malformed_entry',
163
- 'name_reserved_by_deployment',
164
- 'gate_closed',
165
- 'over_cap',
166
- ]);
21
+ export const MCP_INJECTION_DROP_REASONS = CORE_MCP_INJECTION_DROP_REASONS;
167
22
  const DROP_REASONS = new Set(MCP_INJECTION_DROP_REASONS);
168
23
  export function readMcpInjectionDrop(notice) {
169
24
  if (typeof notice !== 'object' || notice === null || Array.isArray(notice))
@@ -348,3 +203,104 @@ function readRootGrantNoticeOf(notice) {
348
203
  const reason = str(o.reason);
349
204
  return { outcome: 'rejected', toolCallId, ...(reason !== undefined ? { reason } : {}), ...(sessionId !== undefined ? { sessionId } : {}) };
350
205
  }
206
+ function ownPathOrNull(o, key) {
207
+ if (!Object.hasOwn(o, key))
208
+ return undefined;
209
+ const v = o[key];
210
+ if (v === null)
211
+ return null;
212
+ return typeof v === 'string' && v.length > 0 ? v : undefined;
213
+ }
214
+ export function readInstructionsSourceChanged(notice) {
215
+ if (typeof notice !== 'object' || notice === null || Array.isArray(notice))
216
+ return undefined;
217
+ try {
218
+ const n = notice;
219
+ if (n.code !== 'instructions.source_changed')
220
+ return undefined;
221
+ const d = n.detail;
222
+ if (typeof d !== 'object' || d === null || Array.isArray(d))
223
+ return undefined;
224
+ const o = d;
225
+ const previous = ownPathOrNull(o, 'previous');
226
+ const current = ownPathOrNull(o, 'current');
227
+ const sessionId = typeof o.sessionId === 'string' && o.sessionId.length > 0 ? o.sessionId : undefined;
228
+ if (previous === undefined || current === undefined || sessionId === undefined)
229
+ return undefined;
230
+ return { previous, current, sessionId };
231
+ }
232
+ catch {
233
+ return undefined;
234
+ }
235
+ }
236
+ function countReading(v) {
237
+ return typeof v === 'number' && Number.isInteger(v) && v >= 0 ? v : 'unknown';
238
+ }
239
+ export function readSessionRecordsSkipped(notice) {
240
+ if (typeof notice !== 'object' || notice === null || Array.isArray(notice))
241
+ return undefined;
242
+ try {
243
+ const n = notice;
244
+ if (n.code !== 'session.records_skipped')
245
+ return undefined;
246
+ const d = n.detail;
247
+ if (typeof d !== 'object' || d === null || Array.isArray(d))
248
+ return undefined;
249
+ const o = d;
250
+ const own = (k) => (Object.hasOwn(o, k) ? o[k] : undefined);
251
+ const sid = own('sessionId');
252
+ const sessionId = typeof sid === 'string' && sid.length > 0 ? sid : undefined;
253
+ if (sessionId === undefined)
254
+ return undefined;
255
+ return { dropped: countReading(own('dropped')), entriesKept: countReading(own('entriesKept')), sessionId };
256
+ }
257
+ catch {
258
+ return undefined;
259
+ }
260
+ }
261
+ export function sessionRecordsSkippedNote(facts) {
262
+ let kept;
263
+ try {
264
+ kept = facts !== null && typeof facts === 'object' ? facts.entriesKept : undefined;
265
+ }
266
+ catch {
267
+ kept = undefined;
268
+ }
269
+ if (kept !== 0)
270
+ return undefined;
271
+ return ("None of this session's earlier entries could be read, so this turn runs with an empty context — the model sees nothing of the earlier conversation. " +
272
+ 'If that history matters, whoever operates this engine has to repair the stored log of this session.');
273
+ }
274
+ export const ENGINE_NOTICE_FACT_READERS = Object.freeze({
275
+ 'mcp.injection_dropped': readMcpInjectionDrop,
276
+ 'delegation.ask_unresolvable': readAskUnresolvable,
277
+ 'config.durable_gate_unavailable': readDurableGateUnavailable,
278
+ 'skills.listing_truncated': readSkillsListingTruncated,
279
+ 'mcp.server_redialed': readMcpServerRedialed,
280
+ 'instructions.source_changed': readInstructionsSourceChanged,
281
+ 'approval.read_root_granted': readReadRootGrantNotice,
282
+ 'approval.read_root_grant_rejected': readReadRootGrantNotice,
283
+ 'session.records_skipped': readSessionRecordsSkipped,
284
+ });
285
+ const _factReaderTablePin = true;
286
+ void _factReaderTablePin;
287
+ export function readEngineNoticeFacts(notice) {
288
+ if (typeof notice !== 'object' || notice === null || Array.isArray(notice))
289
+ return undefined;
290
+ let code;
291
+ let detail;
292
+ try {
293
+ code = notice.code;
294
+ if (typeof code !== 'string' || !Object.hasOwn(ENGINE_NOTICE_FACT_READERS, code))
295
+ return undefined;
296
+ detail = notice.detail;
297
+ }
298
+ catch {
299
+ return undefined;
300
+ }
301
+ const k = code;
302
+ const facts = ENGINE_NOTICE_FACT_READERS[k]({ code: k, detail });
303
+ if (facts === undefined)
304
+ return undefined;
305
+ return { code: k, audience: noticeAudienceOf(k), facts };
306
+ }
@@ -0,0 +1,43 @@
1
+ import type { AgentClient } from '@sema-agent/sdk';
2
+ import { type EngineWireClientConfig, type EngineWireInjection } from './engineWireSdk.js';
3
+ import { type EngineWireTarget } from './engineWireTarget.js';
4
+ export declare const INJECTED_WIRE_SETTLE_MS = 60000;
5
+ export type EngineWireTargetClientOptions = Pick<EngineWireClientConfig, 'timeoutMs' | 'maxRetries'>;
6
+ export interface EngineWireInjected<C> {
7
+ kind: 'injected';
8
+ client: C;
9
+ capsBaseUrl: string | undefined;
10
+ }
11
+ export interface EngineWireFromTarget {
12
+ kind: 'target';
13
+ target: EngineWireTarget;
14
+ make: (opts?: EngineWireTargetClientOptions) => AgentClient | null;
15
+ }
16
+ export interface EngineWireInjectedUnusable {
17
+ kind: 'injected-unusable';
18
+ }
19
+ export interface EngineWireNoTarget {
20
+ kind: 'no-target';
21
+ }
22
+ export type EngineWireResolution<C> = EngineWireInjected<C> | EngineWireFromTarget | EngineWireInjectedUnusable | EngineWireNoTarget;
23
+ export declare function engineWireFor<C extends object>(wire: EngineWireInjection<C> | undefined, sessionKey: string, usable: (client: object) => client is C): EngineWireResolution<C>;
24
+ export declare function clientHasVerbs(client: object, verbs: ReadonlyArray<ReadonlyArray<string>>): boolean;
25
+ export interface LinkedAbortSignal {
26
+ signal: AbortSignal;
27
+ dispose: () => void;
28
+ }
29
+ export declare function linkedAbortSignal(caller: AbortSignal | null | undefined, deadline: AbortSignal): LinkedAbortSignal;
30
+ export declare function injectedDeadlineDetail(ms?: number): string;
31
+ export declare class EngineWireNoAnswerError extends Error {
32
+ constructor(message: string);
33
+ }
34
+ export declare function cancelledWaitDetail(): string;
35
+ export declare class EngineWireCancelledError extends Error {
36
+ constructor();
37
+ }
38
+ export declare function connectionLostDetail(): string;
39
+ export type EngineWireNoAnswerKind = 'deadline' | 'time-limit' | 'connection-lost' | 'cancelled';
40
+ export declare function noAnswerKindOf(e: object | null | undefined): EngineWireNoAnswerKind | null;
41
+ export declare function noAnswerDetailFrom(e: object | null | undefined): string | null;
42
+ export declare function sendOnce<T>(signal: AbortSignal | null | undefined, run: () => Promise<T>): Promise<T>;
43
+ export declare function settleInjected<T>(ms: number, signal: AbortSignal | null | undefined, run: (signal: AbortSignal) => Promise<T>): Promise<T>;