@sema-agent/client-core 0.102.0 → 0.104.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +172 -0
- package/README.md +23 -17
- package/dist/adapt/toolCards.d.ts +2 -1
- package/dist/adapt/toolCards.js +3 -1
- package/dist/adapter/downstream/eventToSdkMessage.d.ts +5 -1
- package/dist/adapter/downstream/eventToSdkMessage.js +23 -3
- package/dist/adapter/downstream/terminalToSdkResult.d.ts +0 -1
- package/dist/adapter/downstream/terminalToSdkResult.js +3 -2
- package/dist/adapter/downstream/wiringManifestView.js +4 -1
- package/dist/agentSession/engineAgentRegistryRead.js +3 -0
- package/dist/cloudConfigWireCaps.js +6 -3
- package/dist/coreValuePorts.d.ts +3 -1
- package/dist/coreValuePorts.js +5 -0
- package/dist/credentialPlaneCapability.d.ts +22 -0
- package/dist/credentialPlaneCapability.js +75 -0
- package/dist/deviceExecutorManagementCapability.d.ts +1 -0
- package/dist/deviceExecutorManagementCapability.js +3 -1
- package/dist/deviceRebind.d.ts +17 -4
- package/dist/deviceRebind.js +43 -14
- package/dist/engineAgentAbsence.d.ts +1 -0
- package/dist/engineErrorCodes.d.ts +1 -0
- package/dist/engineErrorCodes.js +3 -1
- package/dist/engineNoticeCodes.d.ts +26 -0
- package/dist/engineNoticeCodes.js +121 -12
- package/dist/engineRowRef.js +1 -0
- package/dist/errorSupplementRoles.js +1 -3
- package/dist/eventLeg.js +2 -1
- package/dist/executionPlacementWords.d.ts +3 -0
- package/dist/executionPlacementWords.js +2 -0
- package/dist/fleet/fleetProjection.js +15 -9
- package/dist/gateOutcome.d.ts +20 -0
- package/dist/gateOutcome.js +89 -0
- package/dist/generated/engineAskFaceTables.js +2 -2
- package/dist/generated/engineFactTables.d.ts +8 -3
- package/dist/generated/engineFactTables.js +58 -2
- package/dist/generated/engineNoticeTables.js +30 -0
- package/dist/generated/settingsSchemaDefaultModel.d.ts +1 -1
- package/dist/generated/settingsSchemaDefaultModel.js +2 -2
- package/dist/generated/settingsSchemaFns.d.ts +15 -0
- package/dist/generated/settingsSchemaFns.js +25 -2
- package/dist/generated/settingsSchemaHooksClassifier.js +109 -29
- package/dist/generated/settingsSchemaMcpRequestEntry.d.ts +1 -1
- package/dist/generated/settingsSchemaMcpRequestEntry.js +213 -93
- package/dist/generated/settingsSchemaMcpServerName.d.ts +1 -0
- package/dist/generated/settingsSchemaMcpServerName.js +8 -0
- package/dist/generated/settingsSchemaOwnKeyRead.d.ts +1 -0
- package/dist/generated/settingsSchemaOwnKeyRead.js +172 -0
- package/dist/generated/settingsSchemaPlainJsonObject.d.ts +1 -0
- package/dist/generated/settingsSchemaPlainJsonObject.js +28 -0
- package/dist/generated/settingsSchemaSafetyMergeSpec.js +10 -7
- package/dist/generated/settingsSchemaTierWords.d.ts +1 -0
- package/dist/generated/settingsSchemaTierWords.js +7 -0
- package/dist/generated/settingsSchemaTypes.d.ts +3 -1
- package/dist/hitl/automaticAnswerVerdict.d.ts +1 -1
- package/dist/hitl/automaticAnswerVerdict.js +47 -11
- package/dist/hitl/decisionConflict.js +11 -11
- package/dist/hitl/decisionRefusal.d.ts +1 -0
- package/dist/hitl/decisionRefusal.js +4 -2
- package/dist/hitl/editedRuleTextPrecheck.d.ts +1 -0
- package/dist/hitl/editedRuleTextPrecheck.js +26 -1
- package/dist/hitl/persistedRulesWire.js +1 -0
- package/dist/hitl/planReviewWire.d.ts +2 -1
- package/dist/hitl/planReviewWire.js +8 -12
- package/dist/hitl/sessionPolicyDeliverable.d.ts +0 -1
- package/dist/hitl/sessionPolicyDeliverable.js +31 -10
- package/dist/hitl/sessionPolicyWire.js +1 -1
- package/dist/hitl/toolApprovalWire.d.ts +20 -7
- package/dist/hitl/toolApprovalWire.js +171 -19
- package/dist/host.d.ts +0 -3
- package/dist/hostTurnSettings.js +3 -1
- package/dist/humanTurn.js +2 -2
- package/dist/i18n/messages.en.d.ts +5 -0
- package/dist/i18n/messages.en.js +6 -1
- package/dist/i18n/messages.zh.js +6 -1
- package/dist/index.d.ts +8 -4
- package/dist/index.js +3 -1
- package/dist/inheritEnvWire.d.ts +1 -0
- package/dist/inheritEnvWire.js +8 -5
- package/dist/jsonFaithful.js +5 -3
- package/dist/mcpEngineLeg.d.ts +3 -0
- package/dist/mcpEngineLeg.js +4 -1
- package/dist/mcpLiveness.d.ts +18 -0
- package/dist/mcpLiveness.js +48 -1
- package/dist/mcpReconnect.d.ts +3 -0
- package/dist/mcpReconnect.js +6 -0
- package/dist/mcpStatusSupersetKeys.js +24 -1
- package/dist/mcpWireCaps.d.ts +2 -3
- package/dist/mcpWireCaps.js +10 -9
- package/dist/memoryEntriesWire.d.ts +35 -1
- package/dist/memoryEntriesWire.js +110 -14
- package/dist/modsFace.js +7 -3
- package/dist/postureKnob.js +1 -1
- package/dist/prepareRefusal.d.ts +0 -1
- package/dist/prepareRefusal.js +0 -3
- package/dist/printModelStatus.d.ts +1 -0
- package/dist/printModelStatus.js +6 -2
- package/dist/promptProfileWireCaps.d.ts +1 -3
- package/dist/promptProfileWireCaps.js +2 -2
- package/dist/request/taskRequest.d.ts +1 -1
- package/dist/request/taskRequest.js +3 -3
- package/dist/retryStatus.d.ts +20 -1
- package/dist/retryStatus.js +31 -7
- package/dist/ruleCompileVerdict.d.ts +1 -0
- package/dist/ruleCompileVerdict.js +3 -1
- package/dist/seatContract.d.ts +7 -7
- package/dist/seatContract.js +49 -10
- package/dist/sessionMemoryErase.js +24 -2
- package/dist/sessionRowTag.d.ts +24 -0
- package/dist/sessionRowTag.js +77 -0
- package/dist/systemReminderTag.js +14 -4
- package/dist/turnFailurePresentation.js +8 -1
- package/dist/wireFailureShape.d.ts +12 -1
- package/dist/wireFailureShape.js +58 -24
- package/dist/wireRefusalCopy.d.ts +0 -3
- package/dist/wireRefusalCopy.js +0 -17
- package/docs/INTEGRATION-CLIENTS.md +400 -14
- package/package.json +5 -5
|
@@ -59,6 +59,7 @@ export const CORE_ENGINE_CARD_TYPES = Object.freeze([
|
|
|
59
59
|
"read_path_denied",
|
|
60
60
|
"readonly_out_of_root",
|
|
61
61
|
"read_unestablished",
|
|
62
|
+
"bash_self_kill_refused",
|
|
62
63
|
"text",
|
|
63
64
|
"notebook",
|
|
64
65
|
"file_unchanged",
|
|
@@ -160,6 +161,7 @@ export const CORE_ASK_CLASSES = Object.freeze([
|
|
|
160
161
|
"shell_floor",
|
|
161
162
|
"target_unresolved",
|
|
162
163
|
"probe",
|
|
164
|
+
"write_protection_on_disk",
|
|
163
165
|
"write_protection",
|
|
164
166
|
"tool_marks_mcp",
|
|
165
167
|
"tool_marks_a2a",
|
|
@@ -188,6 +190,7 @@ export const CORE_MODE_ARBITRATION = Object.freeze({
|
|
|
188
190
|
"shell_floor": Object.freeze({ bypassImmune: true, classifierEligible: true, sandboxAdmission: true, ruleMayClear: false, hookAskFloor: false }),
|
|
189
191
|
"target_unresolved": Object.freeze({ bypassImmune: true, classifierEligible: false, sandboxAdmission: true, ruleMayClear: false, hookAskFloor: true }),
|
|
190
192
|
"probe": Object.freeze({ bypassImmune: false, classifierEligible: true, sandboxAdmission: false, ruleMayClear: false, hookAskFloor: false }),
|
|
193
|
+
"write_protection_on_disk": Object.freeze({ bypassImmune: false, classifierEligible: false, sandboxAdmission: true, ruleMayClear: false, hookAskFloor: true }),
|
|
191
194
|
"write_protection": Object.freeze({ bypassImmune: false, classifierEligible: true, sandboxAdmission: true, ruleMayClear: false, hookAskFloor: true }),
|
|
192
195
|
"tool_marks_mcp": Object.freeze({ bypassImmune: false, classifierEligible: true, sandboxAdmission: true, ruleMayClear: false, hookAskFloor: false }),
|
|
193
196
|
"tool_marks_a2a": Object.freeze({ bypassImmune: false, classifierEligible: true, sandboxAdmission: true, ruleMayClear: false, hookAskFloor: false }),
|
|
@@ -197,6 +200,21 @@ export const CORE_MODE_ARBITRATION = Object.freeze({
|
|
|
197
200
|
"unstated": Object.freeze({ bypassImmune: false, classifierEligible: true, sandboxAdmission: false, ruleMayClear: true, hookAskFloor: false }),
|
|
198
201
|
"ordinary": Object.freeze({ bypassImmune: false, classifierEligible: true, sandboxAdmission: true, ruleMayClear: true, hookAskFloor: false }),
|
|
199
202
|
});
|
|
203
|
+
export const CORE_REAL_APPROVAL_ASK_CLASSES = Object.freeze([
|
|
204
|
+
"ancestor",
|
|
205
|
+
"dangerous_delete",
|
|
206
|
+
"unverifiable_delete",
|
|
207
|
+
"unverifiable_shell_text",
|
|
208
|
+
"transcript_write",
|
|
209
|
+
"org_rule",
|
|
210
|
+
"rule_unreadable",
|
|
211
|
+
"denial_limit_fallback",
|
|
212
|
+
"classifier_no_ruling",
|
|
213
|
+
"requires_user_interaction",
|
|
214
|
+
"cross_boundary",
|
|
215
|
+
"policy_rra",
|
|
216
|
+
"artifact_shared_read",
|
|
217
|
+
]);
|
|
200
218
|
export const CORE_SKILL_GRANT_ORIGINS = Object.freeze([
|
|
201
219
|
"model",
|
|
202
220
|
"user",
|
|
@@ -283,7 +301,7 @@ export const CORE_RULE_BEHAVIORS = Object.freeze([
|
|
|
283
301
|
"ask",
|
|
284
302
|
"allow",
|
|
285
303
|
]);
|
|
286
|
-
export const
|
|
304
|
+
export const CORE_IMAGE_ADMISSION_HARD_IMAGE_BASE64_CHARS = 5242880;
|
|
287
305
|
export const CORE_MAX_PENDING_STEER_CHARS = 16000;
|
|
288
306
|
export const CORE_PROMPT_BLOCK_CAUSES = Object.freeze([
|
|
289
307
|
"block",
|
|
@@ -349,12 +367,49 @@ export const CORE_TOOL_APPROVAL_CARDS = Object.freeze([
|
|
|
349
367
|
"question",
|
|
350
368
|
"generic",
|
|
351
369
|
]);
|
|
370
|
+
export const CORE_MCP_FAILURE_KINDS = Object.freeze([
|
|
371
|
+
"connect_refused",
|
|
372
|
+
"connection_failed",
|
|
373
|
+
"connection_closed",
|
|
374
|
+
"unauthorized",
|
|
375
|
+
"http_status",
|
|
376
|
+
"not_mcp_response",
|
|
377
|
+
"spawn_failed",
|
|
378
|
+
"timeout",
|
|
379
|
+
"protocol",
|
|
380
|
+
"invalid_config",
|
|
381
|
+
"credential_unavailable",
|
|
382
|
+
"host_refused",
|
|
383
|
+
"unknown",
|
|
384
|
+
]);
|
|
385
|
+
export const CORE_MCP_AUTHORIZATION_REASONS = Object.freeze([
|
|
386
|
+
"rejected",
|
|
387
|
+
"scope",
|
|
388
|
+
"none",
|
|
389
|
+
]);
|
|
390
|
+
export const CORE_PERSISTED_RULE_MATCHES = Object.freeze([
|
|
391
|
+
"exact",
|
|
392
|
+
"prefix",
|
|
393
|
+
"wildcard",
|
|
394
|
+
"pattern",
|
|
395
|
+
"subpath",
|
|
396
|
+
"path",
|
|
397
|
+
"name",
|
|
398
|
+
"name_prefix",
|
|
399
|
+
"host",
|
|
400
|
+
"subdomain",
|
|
401
|
+
"tool",
|
|
402
|
+
]);
|
|
403
|
+
export const CORE_APPROVAL_REMEDY_KINDS = Object.freeze([
|
|
404
|
+
"approver",
|
|
405
|
+
"permission_mode",
|
|
406
|
+
]);
|
|
352
407
|
export const CORE_ASK_CLASSES_WITHOUT_REASON_ROW = Object.freeze([
|
|
353
408
|
"probe",
|
|
354
409
|
]);
|
|
355
410
|
export const CORE_ASK_CLASS_REASONS = Object.freeze({
|
|
356
411
|
"content_question": "the call is the engine's own question to a person",
|
|
357
|
-
"hook": "
|
|
412
|
+
"hook": "an extension's screening asks about this call (a PreToolUse hook or a tool.check station) — the deployment's own screening is answered by a person",
|
|
358
413
|
"ancestor": "the task that delegated this one owns this question",
|
|
359
414
|
"dangerous_delete": "this removal targets a protected location (the filesystem root, a top-level directory, a home directory, or a workspace directory or one of its ancestors) — it is cleared by confirming this call, never by an allow rule",
|
|
360
415
|
"unverifiable_delete": "this removal could not be verified safe — it is cleared by confirming this call, never by an allow rule",
|
|
@@ -370,6 +425,7 @@ export const CORE_ASK_CLASS_REASONS = Object.freeze({
|
|
|
370
425
|
"operator_forced": "this call arrived already marked as requiring confirmation (an earlier layer of this run, or the task that delegated it, judged it so) — it is cleared by confirming this call, never by a standing allow rule",
|
|
371
426
|
"shell_floor": "this deployment mandates per-call confirmation for shell commands (shellGate: always)",
|
|
372
427
|
"target_unresolved": "where this write leads on disk could not be determined (a link on the way could not be examined, or the environment could not resolve the target), so whether it lands on a guarded path is unknown — it is cleared by confirming this call: no standing rule and no automatic decider answers for it, though a wired approver seat can",
|
|
428
|
+
"write_protection_on_disk": "this write's target is on the deployment's write-protection table (the agent's own configuration is guarded one look per write) — it is cleared by confirming this call, never by a standing allow rule",
|
|
373
429
|
"write_protection": "this write's target is on the deployment's write-protection table (the agent's own configuration is guarded one look per write) — it is cleared by confirming this call, never by a standing allow rule",
|
|
374
430
|
"tool_marks_mcp": "this tool carries egress/irreversibility/interaction marks (a mandated confirmation a rule cannot clear)",
|
|
375
431
|
"tool_marks_a2a": "this tool carries egress/irreversibility/interaction marks (a mandated confirmation a rule cannot clear)",
|
|
@@ -17,6 +17,7 @@ export const CORE_ENGINE_NOTICE_CODES = Object.freeze([
|
|
|
17
17
|
"config.write_protection_target_view_absent",
|
|
18
18
|
"config.path_view_unresolved",
|
|
19
19
|
"config.execution_env_capability_invalid",
|
|
20
|
+
"config.read_deny_floor_unkept",
|
|
20
21
|
"config.tool_card_undeclared",
|
|
21
22
|
"config.tool_face_undeclared",
|
|
22
23
|
"config.tool_face_invalid",
|
|
@@ -25,6 +26,7 @@ export const CORE_ENGINE_NOTICE_CODES = Object.freeze([
|
|
|
25
26
|
"config.peer_admission_out_of_range",
|
|
26
27
|
"config.peer_lane_unmounted",
|
|
27
28
|
"config.secret_env_scrubbed",
|
|
29
|
+
"inherit_env.names_withheld",
|
|
28
30
|
"config.credential_not_withheld",
|
|
29
31
|
"config.cross_boundary_posture_undeclared",
|
|
30
32
|
"config.cross_boundary_record_unwritten",
|
|
@@ -41,6 +43,7 @@ export const CORE_ENGINE_NOTICE_CODES = Object.freeze([
|
|
|
41
43
|
"peer.idle_subscription",
|
|
42
44
|
"classifier.denial_limit",
|
|
43
45
|
"classifier.fallback",
|
|
46
|
+
"classifier.seat_rate_limited",
|
|
44
47
|
"classifier.role_defaulted",
|
|
45
48
|
"classifier.contract_broken",
|
|
46
49
|
"classifier.unavailable",
|
|
@@ -50,6 +53,8 @@ export const CORE_ENGINE_NOTICE_CODES = Object.freeze([
|
|
|
50
53
|
"mcp.injection_dropped",
|
|
51
54
|
"mcp.revocation_probe_failed",
|
|
52
55
|
"mcp.server_redialed",
|
|
56
|
+
"mcp.authorization_required",
|
|
57
|
+
"mcp.credential_echoed",
|
|
53
58
|
"workflow.governance_key_stripped",
|
|
54
59
|
"workflow.agent_option_ignored",
|
|
55
60
|
"memory.session_polluted",
|
|
@@ -72,12 +77,16 @@ export const CORE_ENGINE_NOTICE_CODES = Object.freeze([
|
|
|
72
77
|
"route.seat_detached",
|
|
73
78
|
"advisor.not_attached",
|
|
74
79
|
"route.credential_origin_mismatch",
|
|
80
|
+
"route.credential_rebound",
|
|
75
81
|
"route.response_model_mismatch",
|
|
76
82
|
"route.tool_call_id_folded",
|
|
77
83
|
"route.finish_reason_unknown",
|
|
78
84
|
"route.stream_end_ignored",
|
|
79
85
|
"route.extra_body_reserved_dropped",
|
|
86
|
+
"model.capability_downgraded",
|
|
87
|
+
"model.role_defaulted",
|
|
80
88
|
"context.tool_turn_repaired",
|
|
89
|
+
"context.image_removed",
|
|
81
90
|
"task.user_steer_undrained",
|
|
82
91
|
"task.user_followup_undrained",
|
|
83
92
|
"steering.parked_input_blocked",
|
|
@@ -94,6 +103,7 @@ export const CORE_ENGINE_NOTICE_CODES = Object.freeze([
|
|
|
94
103
|
"agents.listing_truncated",
|
|
95
104
|
"tool_result.offload_put_failed",
|
|
96
105
|
"tool_result.media_refused",
|
|
106
|
+
"config.image_processor_unavailable",
|
|
97
107
|
"instructions.source_changed",
|
|
98
108
|
"session.records_skipped",
|
|
99
109
|
"memory.layer_locked_legacy",
|
|
@@ -119,6 +129,7 @@ export const CORE_NOTICE_AUDIENCE = Object.freeze({
|
|
|
119
129
|
"config.write_protection_target_view_absent": "operator",
|
|
120
130
|
"config.path_view_unresolved": "operator",
|
|
121
131
|
"config.execution_env_capability_invalid": "operator",
|
|
132
|
+
"config.read_deny_floor_unkept": "operator",
|
|
122
133
|
"config.tool_card_undeclared": "operator",
|
|
123
134
|
"config.tool_face_undeclared": "operator",
|
|
124
135
|
"config.tool_face_invalid": "operator",
|
|
@@ -127,6 +138,7 @@ export const CORE_NOTICE_AUDIENCE = Object.freeze({
|
|
|
127
138
|
"config.peer_admission_out_of_range": "operator",
|
|
128
139
|
"config.peer_lane_unmounted": "operator",
|
|
129
140
|
"config.secret_env_scrubbed": "operator",
|
|
141
|
+
"inherit_env.names_withheld": "user",
|
|
130
142
|
"config.credential_not_withheld": "operator",
|
|
131
143
|
"config.cross_boundary_posture_undeclared": "operator",
|
|
132
144
|
"config.cross_boundary_record_unwritten": "operator",
|
|
@@ -143,6 +155,7 @@ export const CORE_NOTICE_AUDIENCE = Object.freeze({
|
|
|
143
155
|
"peer.idle_subscription": "user",
|
|
144
156
|
"classifier.denial_limit": "user",
|
|
145
157
|
"classifier.fallback": "operator",
|
|
158
|
+
"classifier.seat_rate_limited": "operator",
|
|
146
159
|
"classifier.role_defaulted": "operator",
|
|
147
160
|
"classifier.contract_broken": "operator",
|
|
148
161
|
"classifier.unavailable": "user",
|
|
@@ -152,6 +165,8 @@ export const CORE_NOTICE_AUDIENCE = Object.freeze({
|
|
|
152
165
|
"mcp.injection_dropped": "user",
|
|
153
166
|
"mcp.revocation_probe_failed": "operator",
|
|
154
167
|
"mcp.server_redialed": "operator",
|
|
168
|
+
"mcp.authorization_required": "user",
|
|
169
|
+
"mcp.credential_echoed": "operator",
|
|
155
170
|
"workflow.governance_key_stripped": "operator",
|
|
156
171
|
"workflow.agent_option_ignored": "operator",
|
|
157
172
|
"memory.session_polluted": "user",
|
|
@@ -174,12 +189,16 @@ export const CORE_NOTICE_AUDIENCE = Object.freeze({
|
|
|
174
189
|
"route.seat_detached": "operator",
|
|
175
190
|
"advisor.not_attached": "user",
|
|
176
191
|
"route.credential_origin_mismatch": "user",
|
|
192
|
+
"route.credential_rebound": "operator",
|
|
177
193
|
"route.response_model_mismatch": "operator",
|
|
178
194
|
"route.tool_call_id_folded": "operator",
|
|
179
195
|
"route.finish_reason_unknown": "user",
|
|
180
196
|
"route.stream_end_ignored": "user",
|
|
181
197
|
"route.extra_body_reserved_dropped": "operator",
|
|
198
|
+
"model.capability_downgraded": "user",
|
|
199
|
+
"model.role_defaulted": "operator",
|
|
182
200
|
"context.tool_turn_repaired": "operator",
|
|
201
|
+
"context.image_removed": "user",
|
|
183
202
|
"task.user_steer_undrained": "user",
|
|
184
203
|
"task.user_followup_undrained": "user",
|
|
185
204
|
"steering.parked_input_blocked": "user",
|
|
@@ -196,6 +215,7 @@ export const CORE_NOTICE_AUDIENCE = Object.freeze({
|
|
|
196
215
|
"agents.listing_truncated": "operator",
|
|
197
216
|
"tool_result.offload_put_failed": "operator",
|
|
198
217
|
"tool_result.media_refused": "operator",
|
|
218
|
+
"config.image_processor_unavailable": "operator",
|
|
199
219
|
"instructions.source_changed": "user",
|
|
200
220
|
"session.records_skipped": "user",
|
|
201
221
|
"memory.layer_locked_legacy": "operator",
|
|
@@ -227,6 +247,7 @@ export const CORE_NOTICE_MINTER = Object.freeze({
|
|
|
227
247
|
"config.write_protection_target_view_absent": "engine",
|
|
228
248
|
"config.path_view_unresolved": "engine",
|
|
229
249
|
"config.execution_env_capability_invalid": "engine",
|
|
250
|
+
"config.read_deny_floor_unkept": "engine",
|
|
230
251
|
"config.tool_card_undeclared": "engine",
|
|
231
252
|
"config.tool_face_undeclared": "engine",
|
|
232
253
|
"config.tool_face_invalid": "engine",
|
|
@@ -235,6 +256,7 @@ export const CORE_NOTICE_MINTER = Object.freeze({
|
|
|
235
256
|
"config.peer_admission_out_of_range": "engine",
|
|
236
257
|
"config.peer_lane_unmounted": "engine",
|
|
237
258
|
"config.secret_env_scrubbed": "engine",
|
|
259
|
+
"inherit_env.names_withheld": "engine",
|
|
238
260
|
"config.credential_not_withheld": "engine",
|
|
239
261
|
"config.cross_boundary_posture_undeclared": "engine",
|
|
240
262
|
"config.cross_boundary_record_unwritten": "engine",
|
|
@@ -251,6 +273,7 @@ export const CORE_NOTICE_MINTER = Object.freeze({
|
|
|
251
273
|
"peer.idle_subscription": "engine",
|
|
252
274
|
"classifier.denial_limit": "engine",
|
|
253
275
|
"classifier.fallback": "engine",
|
|
276
|
+
"classifier.seat_rate_limited": "engine",
|
|
254
277
|
"classifier.role_defaulted": "engine",
|
|
255
278
|
"classifier.contract_broken": "engine",
|
|
256
279
|
"classifier.unavailable": "engine",
|
|
@@ -260,6 +283,8 @@ export const CORE_NOTICE_MINTER = Object.freeze({
|
|
|
260
283
|
"mcp.injection_dropped": "engine",
|
|
261
284
|
"mcp.revocation_probe_failed": "engine",
|
|
262
285
|
"mcp.server_redialed": "engine",
|
|
286
|
+
"mcp.authorization_required": "engine",
|
|
287
|
+
"mcp.credential_echoed": "engine",
|
|
263
288
|
"workflow.governance_key_stripped": "engine",
|
|
264
289
|
"workflow.agent_option_ignored": "engine",
|
|
265
290
|
"memory.session_polluted": "engine",
|
|
@@ -282,12 +307,16 @@ export const CORE_NOTICE_MINTER = Object.freeze({
|
|
|
282
307
|
"route.seat_detached": "engine",
|
|
283
308
|
"advisor.not_attached": "engine",
|
|
284
309
|
"route.credential_origin_mismatch": "engine",
|
|
310
|
+
"route.credential_rebound": "engine",
|
|
285
311
|
"route.response_model_mismatch": "engine",
|
|
286
312
|
"route.tool_call_id_folded": "engine",
|
|
287
313
|
"route.finish_reason_unknown": "engine",
|
|
288
314
|
"route.stream_end_ignored": "engine",
|
|
289
315
|
"route.extra_body_reserved_dropped": "engine",
|
|
316
|
+
"model.capability_downgraded": "engine",
|
|
317
|
+
"model.role_defaulted": "engine",
|
|
290
318
|
"context.tool_turn_repaired": "engine",
|
|
319
|
+
"context.image_removed": "engine",
|
|
291
320
|
"task.user_steer_undrained": "engine",
|
|
292
321
|
"task.user_followup_undrained": "engine",
|
|
293
322
|
"steering.parked_input_blocked": "engine",
|
|
@@ -304,6 +333,7 @@ export const CORE_NOTICE_MINTER = Object.freeze({
|
|
|
304
333
|
"agents.listing_truncated": "engine",
|
|
305
334
|
"tool_result.offload_put_failed": "engine",
|
|
306
335
|
"tool_result.media_refused": "engine",
|
|
336
|
+
"config.image_processor_unavailable": "engine",
|
|
307
337
|
"instructions.source_changed": "server",
|
|
308
338
|
"session.records_skipped": "server",
|
|
309
339
|
"memory.layer_locked_legacy": "server",
|
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
export const SETTINGS_DEFAULT_MODEL_CLOSURE = (resolveActiveTiers) => {
|
|
2
|
-
const DEFAULT_ROLE_TIER_LADDER =
|
|
1
|
+
export const SETTINGS_DEFAULT_MODEL_CLOSURE = (resolveActiveTiers, tierLadderFrom) => {
|
|
2
|
+
const DEFAULT_ROLE_TIER_LADDER = tierLadderFrom("pro");
|
|
3
3
|
function resolveCatalogDefaultModel(models, has, fallback) {
|
|
4
4
|
const target = models.roles?.default;
|
|
5
5
|
const named = target !== undefined && "model" in target ? target.model : undefined;
|
|
@@ -22,6 +22,18 @@ export declare const SETTINGS_CLASSIFY_HOOKS_CONFIG: (settingsDoc: unknown) => H
|
|
|
22
22
|
export declare const SETTINGS_STRIP_CONTROL_AND_BIDI: (text: string) => string;
|
|
23
23
|
export declare const SETTINGS_CONTROL_AND_BIDI_CHARS: string;
|
|
24
24
|
export declare const SETTINGS_ECHO_CALLER_TEXT: (text: string) => string;
|
|
25
|
+
export declare const SETTINGS_IS_JSON_ARRAY: (v: unknown) => v is unknown[];
|
|
26
|
+
export declare const SETTINGS_JSON_SHAPE_OF: (v: unknown) => "plain" | "non_plain_object" | "array" | "null" | "primitive" | "uninspectable";
|
|
27
|
+
export declare const SETTINGS_CAPTURE_STRING_ARRAY: (v: unknown, classification: "strict" | "wide") => string[] | undefined;
|
|
28
|
+
export declare const SETTINGS_UNINSPECTABLE: "an object that could not be inspected (a proxy trap threw)";
|
|
29
|
+
export declare const SETTINGS_DATA_DESCRIPTOR: (value: unknown) => PropertyDescriptor;
|
|
30
|
+
export declare const SETTINGS_INSPECT: (read: () => unknown) => object;
|
|
31
|
+
export declare const SETTINGS_OWN_FIELDS_OF: (record: object, keys: readonly string[]) => object;
|
|
32
|
+
export declare const SETTINGS_OWN_VALUE_OF: (record: object, key: string) => object;
|
|
33
|
+
export declare const SETTINGS_READ_KEY: (record: object, key: PropertyKey) => object;
|
|
34
|
+
export declare const SETTINGS_IS_RESERVED_MCP_SERVER_NAME: (name: string) => boolean;
|
|
35
|
+
export declare const SETTINGS_REMOTE_MCP_SERVER_NAME_PREFIX: "remote-";
|
|
36
|
+
export declare const SETTINGS_RESERVED_MCP_SERVER_NAME_REASON: "the \"remote-\" prefix is reserved for the remote MCP servers a device executor offers";
|
|
25
37
|
export declare const SETTINGS_READ_REQUEST_MCP_TRANSPORT: (t: unknown) => RequestMcpTransportRead;
|
|
26
38
|
export declare const SETTINGS_READ_MCP_IDENTITY_HEADERS: (transport: Record<string, unknown>) => {
|
|
27
39
|
principalHeader?: string;
|
|
@@ -29,6 +41,8 @@ export declare const SETTINGS_READ_MCP_IDENTITY_HEADERS: (transport: Record<stri
|
|
|
29
41
|
};
|
|
30
42
|
export declare const SETTINGS_IS_USABLE_WIRE_NAME: (v: unknown) => v is string;
|
|
31
43
|
export declare const SETTINGS_DESCRIBE_BAD_WIRE_NAME: (v: unknown) => string;
|
|
44
|
+
export declare const SETTINGS_IS_USABLE_MCP_SERVER_NAME: (v: unknown) => v is string;
|
|
45
|
+
export declare const SETTINGS_DESCRIBE_BAD_MCP_SERVER_NAME: (v: unknown) => string;
|
|
32
46
|
export declare const SETTINGS_IS_CONTENT_ORIGIN_WORD: (v: unknown) => v is McpContentOrigin;
|
|
33
47
|
export declare const SETTINGS_DESCRIBE_BAD_CONTENT_ORIGIN: (v: unknown) => string;
|
|
34
48
|
export declare const SETTINGS_TOOL_WIRE_NAME_MAX_CHARS: 128;
|
|
@@ -48,6 +62,7 @@ export declare const SETTINGS_RESOLVE_ACTIVE_TIERS: (models: {
|
|
|
48
62
|
}) => {
|
|
49
63
|
[tier: string]: string;
|
|
50
64
|
} | undefined;
|
|
65
|
+
export declare const SETTINGS_TIER_LADDER_FROM: (tier: string) => string[];
|
|
51
66
|
export declare const SETTINGS_RESOLVE_CATALOG_DEFAULT_MODEL: (models: {
|
|
52
67
|
readonly roles?: {
|
|
53
68
|
readonly default?: {
|
|
@@ -1,6 +1,9 @@
|
|
|
1
1
|
import { SETTINGS_CLASSIFY_HOOKS_CONFIG_CLOSURE } from './settingsSchemaHooksClassifier.js';
|
|
2
2
|
import { SETTINGS_CONTROL_AND_BIDI_CLOSURE } from './settingsSchemaControlAndBidi.js';
|
|
3
3
|
import { SETTINGS_CALLER_TEXT_ECHO_CLOSURE } from './settingsSchemaCallerTextEcho.js';
|
|
4
|
+
import { SETTINGS_PLAIN_JSON_OBJECT_CLOSURE } from './settingsSchemaPlainJsonObject.js';
|
|
5
|
+
import { SETTINGS_OWN_KEY_READ_CLOSURE } from './settingsSchemaOwnKeyRead.js';
|
|
6
|
+
import { SETTINGS_MCP_SERVER_NAME_CLOSURE } from './settingsSchemaMcpServerName.js';
|
|
4
7
|
import { SETTINGS_MCP_REQUEST_ENTRY_CLOSURE } from './settingsSchemaMcpRequestEntry.js';
|
|
5
8
|
import { SETTINGS_MCP_CONTENT_ORIGINS } from './settingsSchemaTables.js';
|
|
6
9
|
import { SETTINGS_URL_ALLOW_PATTERN_MATCHES_CLOSURE } from './settingsSchemaUrlPattern.js';
|
|
@@ -8,6 +11,7 @@ import { SETTINGS_SAFETY_MERGE_CLOSURE } from './settingsSchemaSafetyMergeSpec.j
|
|
|
8
11
|
import { SETTINGS_MIN_TRUST_WORDS } from './settingsSchemaTables.js';
|
|
9
12
|
import { SETTINGS_LAYER_SOURCES_CLOSURE } from './settingsSchemaSettingsSources.js';
|
|
10
13
|
import { SETTINGS_ACTIVE_TIERS_CLOSURE } from './settingsSchemaActiveTiers.js';
|
|
14
|
+
import { SETTINGS_TIER_WORDS_CLOSURE } from './settingsSchemaTierWords.js';
|
|
11
15
|
import { SETTINGS_DEFAULT_MODEL_CLOSURE } from './settingsSchemaDefaultModel.js';
|
|
12
16
|
export const SETTINGS_AT_MENTION_MODES = Object.freeze([
|
|
13
17
|
"all",
|
|
@@ -148,11 +152,28 @@ export const SETTINGS_STRIP_CONTROL_AND_BIDI = SETTINGS_CONTROL_AND_BIDI.stripCo
|
|
|
148
152
|
export const SETTINGS_CONTROL_AND_BIDI_CHARS = SETTINGS_CONTROL_AND_BIDI.CONTROL_AND_BIDI_CHARS;
|
|
149
153
|
const SETTINGS_CALLER_TEXT_ECHO = SETTINGS_CALLER_TEXT_ECHO_CLOSURE(SETTINGS_STRIP_CONTROL_AND_BIDI);
|
|
150
154
|
export const SETTINGS_ECHO_CALLER_TEXT = SETTINGS_CALLER_TEXT_ECHO.echoCallerText;
|
|
151
|
-
const
|
|
155
|
+
const SETTINGS_PLAIN_JSON_OBJECT = SETTINGS_PLAIN_JSON_OBJECT_CLOSURE();
|
|
156
|
+
export const SETTINGS_IS_JSON_ARRAY = SETTINGS_PLAIN_JSON_OBJECT.isJsonArray;
|
|
157
|
+
export const SETTINGS_JSON_SHAPE_OF = SETTINGS_PLAIN_JSON_OBJECT.jsonShapeOf;
|
|
158
|
+
const SETTINGS_OWN_KEY_READ = SETTINGS_OWN_KEY_READ_CLOSURE(SETTINGS_IS_JSON_ARRAY);
|
|
159
|
+
export const SETTINGS_CAPTURE_STRING_ARRAY = SETTINGS_OWN_KEY_READ.captureStringArray;
|
|
160
|
+
export const SETTINGS_UNINSPECTABLE = SETTINGS_OWN_KEY_READ.UNINSPECTABLE;
|
|
161
|
+
export const SETTINGS_DATA_DESCRIPTOR = SETTINGS_OWN_KEY_READ.dataDescriptor;
|
|
162
|
+
export const SETTINGS_INSPECT = SETTINGS_OWN_KEY_READ.inspect;
|
|
163
|
+
export const SETTINGS_OWN_FIELDS_OF = SETTINGS_OWN_KEY_READ.ownFieldsOf;
|
|
164
|
+
export const SETTINGS_OWN_VALUE_OF = SETTINGS_OWN_KEY_READ.ownValueOf;
|
|
165
|
+
export const SETTINGS_READ_KEY = SETTINGS_OWN_KEY_READ.readKey;
|
|
166
|
+
const SETTINGS_MCP_SERVER_NAME = SETTINGS_MCP_SERVER_NAME_CLOSURE();
|
|
167
|
+
export const SETTINGS_IS_RESERVED_MCP_SERVER_NAME = SETTINGS_MCP_SERVER_NAME.isReservedMcpServerName;
|
|
168
|
+
export const SETTINGS_REMOTE_MCP_SERVER_NAME_PREFIX = SETTINGS_MCP_SERVER_NAME.REMOTE_MCP_SERVER_NAME_PREFIX;
|
|
169
|
+
export const SETTINGS_RESERVED_MCP_SERVER_NAME_REASON = SETTINGS_MCP_SERVER_NAME.RESERVED_MCP_SERVER_NAME_REASON;
|
|
170
|
+
const SETTINGS_MCP_REQUEST_ENTRY = SETTINGS_MCP_REQUEST_ENTRY_CLOSURE(SETTINGS_MCP_CONTENT_ORIGINS, SETTINGS_STARTS_WITH_HTTP_SCHEME, SETTINGS_ECHO_CALLER_TEXT, SETTINGS_UNINSPECTABLE, SETTINGS_CAPTURE_STRING_ARRAY, SETTINGS_DATA_DESCRIPTOR, SETTINGS_INSPECT, SETTINGS_OWN_FIELDS_OF, SETTINGS_OWN_VALUE_OF, SETTINGS_READ_KEY, SETTINGS_IS_JSON_ARRAY, SETTINGS_JSON_SHAPE_OF, SETTINGS_IS_RESERVED_MCP_SERVER_NAME, SETTINGS_RESERVED_MCP_SERVER_NAME_REASON);
|
|
152
171
|
export const SETTINGS_READ_REQUEST_MCP_TRANSPORT = SETTINGS_MCP_REQUEST_ENTRY.readRequestMcpTransport;
|
|
153
172
|
export const SETTINGS_READ_MCP_IDENTITY_HEADERS = SETTINGS_MCP_REQUEST_ENTRY.readMcpIdentityHeaders;
|
|
154
173
|
export const SETTINGS_IS_USABLE_WIRE_NAME = SETTINGS_MCP_REQUEST_ENTRY.isUsableWireName;
|
|
155
174
|
export const SETTINGS_DESCRIBE_BAD_WIRE_NAME = SETTINGS_MCP_REQUEST_ENTRY.describeBadWireName;
|
|
175
|
+
export const SETTINGS_IS_USABLE_MCP_SERVER_NAME = SETTINGS_MCP_REQUEST_ENTRY.isUsableMcpServerName;
|
|
176
|
+
export const SETTINGS_DESCRIBE_BAD_MCP_SERVER_NAME = SETTINGS_MCP_REQUEST_ENTRY.describeBadMcpServerName;
|
|
156
177
|
export const SETTINGS_IS_CONTENT_ORIGIN_WORD = SETTINGS_MCP_REQUEST_ENTRY.isContentOriginWord;
|
|
157
178
|
export const SETTINGS_DESCRIBE_BAD_CONTENT_ORIGIN = SETTINGS_MCP_REQUEST_ENTRY.describeBadContentOrigin;
|
|
158
179
|
export const SETTINGS_TOOL_WIRE_NAME_MAX_CHARS = SETTINGS_MCP_REQUEST_ENTRY.TOOL_WIRE_NAME_MAX_CHARS;
|
|
@@ -165,6 +186,8 @@ const SETTINGS_LAYER_SOURCES = SETTINGS_LAYER_SOURCES_CLOSURE(SETTINGS_SAFETY_ME
|
|
|
165
186
|
export const SETTINGS_LAYER_ADMISSION = SETTINGS_LAYER_SOURCES.layerAdmission;
|
|
166
187
|
const SETTINGS_ACTIVE_TIERS = SETTINGS_ACTIVE_TIERS_CLOSURE();
|
|
167
188
|
export const SETTINGS_RESOLVE_ACTIVE_TIERS = SETTINGS_ACTIVE_TIERS.resolveActiveTiers;
|
|
168
|
-
const
|
|
189
|
+
const SETTINGS_TIER_WORDS = SETTINGS_TIER_WORDS_CLOSURE();
|
|
190
|
+
export const SETTINGS_TIER_LADDER_FROM = SETTINGS_TIER_WORDS.tierLadderFrom;
|
|
191
|
+
const SETTINGS_DEFAULT_MODEL = SETTINGS_DEFAULT_MODEL_CLOSURE(SETTINGS_RESOLVE_ACTIVE_TIERS, SETTINGS_TIER_LADDER_FROM);
|
|
169
192
|
export const SETTINGS_RESOLVE_CATALOG_DEFAULT_MODEL = SETTINGS_DEFAULT_MODEL.resolveCatalogDefaultModel;
|
|
170
193
|
export const SETTINGS_DEFAULT_ROLE_TIER_LADDER = SETTINGS_DEFAULT_MODEL.DEFAULT_ROLE_TIER_LADDER;
|
|
@@ -9,18 +9,64 @@ export const SETTINGS_CLASSIFY_HOOKS_CONFIG_CLOSURE = (HOOK_EVENTS) => {
|
|
|
9
9
|
http: { url: "text", headers: "stringRecord?", allowedEnvVars: "stringList?", ...HOOK_ENTRY_COMMON_FIELDS },
|
|
10
10
|
mcp_tool: { server: "string", tool: "string", input: "record?", ...HOOK_ENTRY_COMMON_FIELDS },
|
|
11
11
|
};
|
|
12
|
-
function
|
|
13
|
-
|
|
12
|
+
function hookShapeOf(v) {
|
|
13
|
+
try {
|
|
14
|
+
if (v === null)
|
|
15
|
+
return "null";
|
|
16
|
+
if (Array.isArray(v))
|
|
17
|
+
return "array";
|
|
18
|
+
if (typeof v === "function")
|
|
19
|
+
return "non_plain_object";
|
|
20
|
+
if (typeof v !== "object")
|
|
21
|
+
return "primitive";
|
|
22
|
+
const proto = Object.getPrototypeOf(v);
|
|
23
|
+
return proto === null || Object.getPrototypeOf(proto) === null ? "plain" : "non_plain_object";
|
|
24
|
+
}
|
|
25
|
+
catch {
|
|
26
|
+
return "uninspectable";
|
|
27
|
+
}
|
|
28
|
+
}
|
|
29
|
+
function hookIsRecord(v) {
|
|
30
|
+
const shape = hookShapeOf(v);
|
|
31
|
+
return shape === "plain";
|
|
32
|
+
}
|
|
33
|
+
function hookIsObjectLike(v) {
|
|
34
|
+
const shape = hookShapeOf(v);
|
|
35
|
+
switch (shape) {
|
|
36
|
+
case "null":
|
|
37
|
+
case "primitive":
|
|
38
|
+
return false;
|
|
39
|
+
case "plain":
|
|
40
|
+
case "non_plain_object":
|
|
41
|
+
case "array":
|
|
42
|
+
case "uninspectable":
|
|
43
|
+
return true;
|
|
44
|
+
default: {
|
|
45
|
+
const unhandled = shape;
|
|
46
|
+
throw new Error(`hookIsObjectLike: unhandled shape ${String(unhandled)}`);
|
|
47
|
+
}
|
|
48
|
+
}
|
|
49
|
+
}
|
|
50
|
+
function hookIsArray(v) {
|
|
51
|
+
try {
|
|
52
|
+
return Array.isArray(v);
|
|
53
|
+
}
|
|
54
|
+
catch {
|
|
14
55
|
return false;
|
|
15
|
-
|
|
16
|
-
return proto === Object.prototype || proto === null;
|
|
56
|
+
}
|
|
17
57
|
}
|
|
58
|
+
const HOOK_ITERATOR_SYMBOL = (() => {
|
|
59
|
+
const found = Object.getOwnPropertySymbols(Array.prototype).find((s) => s.description === "Symbol.iterator");
|
|
60
|
+
if (found === undefined)
|
|
61
|
+
throw new Error("hooks classifier: Array.prototype has no Symbol.iterator");
|
|
62
|
+
return found;
|
|
63
|
+
})();
|
|
18
64
|
function hookGuardKeyOf(node) {
|
|
19
65
|
for (const key of Object.keys(node)) {
|
|
20
66
|
if (!HOOK_GUARD_EVENTS.includes(key))
|
|
21
67
|
continue;
|
|
22
68
|
const value = node[key];
|
|
23
|
-
if (value !== null && value !== undefined && !(
|
|
69
|
+
if (value !== null && value !== undefined && !(hookIsArray(value) && value.length === 0))
|
|
24
70
|
return key;
|
|
25
71
|
}
|
|
26
72
|
return undefined;
|
|
@@ -29,9 +75,9 @@ export const SETTINGS_CLASSIFY_HOOKS_CONFIG_CLOSURE = (HOOK_EVENTS) => {
|
|
|
29
75
|
if (!hookIsRecord(value))
|
|
30
76
|
return false;
|
|
31
77
|
const inner = Object.hasOwn(value, "hooks") ? value.hooks : undefined;
|
|
32
|
-
if (
|
|
78
|
+
if (hookIsArray(inner))
|
|
33
79
|
return inner.length > 0;
|
|
34
|
-
return hookIsRecord(inner) && (Object.hasOwn(value, "matcher") || typeof inner.type === "string");
|
|
80
|
+
return hookIsRecord(inner) && (Object.hasOwn(value, "matcher") || (Object.hasOwn(inner, "type") && typeof inner.type === "string"));
|
|
35
81
|
}
|
|
36
82
|
function hookGuardSignIn(root, rootPath, place) {
|
|
37
83
|
const frames = [];
|
|
@@ -45,25 +91,49 @@ export const SETTINGS_CLASSIFY_HOOKS_CONFIG_CLOSURE = (HOOK_EVENTS) => {
|
|
|
45
91
|
};
|
|
46
92
|
while (pending.length > 0) {
|
|
47
93
|
const [node, frame, at] = pending.pop();
|
|
48
|
-
|
|
94
|
+
const shape = hookShapeOf(node);
|
|
95
|
+
let isList = false;
|
|
96
|
+
switch (shape) {
|
|
97
|
+
case "null":
|
|
98
|
+
case "primitive":
|
|
99
|
+
continue;
|
|
100
|
+
case "uninspectable":
|
|
101
|
+
return pathTo(frame, []);
|
|
102
|
+
case "array":
|
|
103
|
+
isList = true;
|
|
104
|
+
break;
|
|
105
|
+
case "plain":
|
|
106
|
+
break;
|
|
107
|
+
case "non_plain_object":
|
|
108
|
+
if (HOOK_ITERATOR_SYMBOL in node)
|
|
109
|
+
return pathTo(frame, []);
|
|
110
|
+
break;
|
|
111
|
+
default: {
|
|
112
|
+
const unhandled = shape;
|
|
113
|
+
throw new Error(`hookGuardSignIn: unhandled shape ${String(unhandled)}`);
|
|
114
|
+
}
|
|
115
|
+
}
|
|
116
|
+
const visited = node;
|
|
117
|
+
if (seen[at].has(visited))
|
|
49
118
|
continue;
|
|
50
|
-
seen[at].add(
|
|
51
|
-
if (
|
|
52
|
-
|
|
119
|
+
seen[at].add(visited);
|
|
120
|
+
if (isList) {
|
|
121
|
+
const list = node;
|
|
122
|
+
for (let i = list.length - 1; i >= 0; i--) {
|
|
53
123
|
frames.push({ key: i, parent: frame });
|
|
54
|
-
pending.push([
|
|
124
|
+
pending.push([list[i], frames.length - 1, at === "matcherList" ? "matcher" : "other"]);
|
|
55
125
|
}
|
|
56
126
|
continue;
|
|
57
127
|
}
|
|
58
|
-
const guardKey = hookGuardKeyOf(
|
|
128
|
+
const guardKey = hookGuardKeyOf(visited);
|
|
59
129
|
if (guardKey !== undefined)
|
|
60
130
|
return pathTo(frame, [guardKey]);
|
|
61
|
-
if (at !== "matcher" && hookLooksLikeMatcher(
|
|
131
|
+
if (at !== "matcher" && hookLooksLikeMatcher(visited))
|
|
62
132
|
return pathTo(frame, []);
|
|
63
|
-
const keys = Object.keys(
|
|
133
|
+
const keys = Object.keys(visited);
|
|
64
134
|
for (let i = keys.length - 1; i >= 0; i--) {
|
|
65
135
|
frames.push({ key: keys[i], parent: frame });
|
|
66
|
-
pending.push([
|
|
136
|
+
pending.push([visited[keys[i]], frames.length - 1, "other"]);
|
|
67
137
|
}
|
|
68
138
|
}
|
|
69
139
|
return undefined;
|
|
@@ -87,7 +157,7 @@ export const SETTINGS_CLASSIFY_HOOKS_CONFIG_CLOSURE = (HOOK_EVENTS) => {
|
|
|
87
157
|
case "stringRecord":
|
|
88
158
|
return hookIsRecord(value) && Object.values(value).every((v) => typeof v === "string");
|
|
89
159
|
case "stringList":
|
|
90
|
-
if (!
|
|
160
|
+
if (!hookIsArray(value))
|
|
91
161
|
return false;
|
|
92
162
|
for (let i = 0; i < value.length; i++)
|
|
93
163
|
if (typeof value[i] !== "string")
|
|
@@ -121,7 +191,7 @@ export const SETTINGS_CLASSIFY_HOOKS_CONFIG_CLOSURE = (HOOK_EVENTS) => {
|
|
|
121
191
|
const base = (optional ? kind.slice(0, -1) : kind);
|
|
122
192
|
if (!hookFieldFits(base, value))
|
|
123
193
|
return { field };
|
|
124
|
-
out[field] =
|
|
194
|
+
out[field] = hookIsArray(value) ? value.slice() : hookIsRecord(value) ? Object.fromEntries(Object.entries(value)) : value;
|
|
125
195
|
}
|
|
126
196
|
return { entry: out };
|
|
127
197
|
}
|
|
@@ -135,18 +205,18 @@ export const SETTINGS_CLASSIFY_HOOKS_CONFIG_CLOSURE = (HOOK_EVENTS) => {
|
|
|
135
205
|
}
|
|
136
206
|
const entries = Object.hasOwn(matcher, "hooks") ? matcher.hooks : undefined;
|
|
137
207
|
const signField = hookGuardKeyOf(matcher) ??
|
|
138
|
-
Object.keys(matcher).find((key) => !(key === "hooks" &&
|
|
208
|
+
Object.keys(matcher).find((key) => !(key === "hooks" && hookIsArray(entries)) && hookGuardSignIn(matcher[key], [...at, key], "other") !== undefined);
|
|
139
209
|
if (signField !== undefined) {
|
|
140
210
|
reject("guard-matcher-invalid", at, signField);
|
|
141
211
|
return undefined;
|
|
142
212
|
}
|
|
143
213
|
const entrySigns = [];
|
|
144
|
-
if (
|
|
214
|
+
if (hookIsArray(entries))
|
|
145
215
|
for (let j = 0; j < entries.length; j++)
|
|
146
216
|
entrySigns.push(hookGuardSignIn(entries[j], [...at, "hooks", j], "other"));
|
|
147
217
|
const name = Object.hasOwn(matcher, "matcher") ? matcher.matcher : undefined;
|
|
148
|
-
const badField = name !== undefined && typeof name !== "string" ? "matcher" : !
|
|
149
|
-
if (badField !== undefined || !
|
|
218
|
+
const badField = name !== undefined && typeof name !== "string" ? "matcher" : !hookIsArray(entries) ? "hooks" : undefined;
|
|
219
|
+
if (badField !== undefined || !hookIsArray(entries)) {
|
|
150
220
|
if (guardEvent || entrySigns.some((sign) => sign !== undefined))
|
|
151
221
|
reject("guard-matcher-invalid", at, badField);
|
|
152
222
|
else
|
|
@@ -173,13 +243,15 @@ export const SETTINGS_CLASSIFY_HOOKS_CONFIG_CLOSURE = (HOOK_EVENTS) => {
|
|
|
173
243
|
}
|
|
174
244
|
function hookBlockRead(hooks, reject, drop) {
|
|
175
245
|
if (!hookIsRecord(hooks)) {
|
|
176
|
-
if (
|
|
246
|
+
if (hookIsArray(hooks) && hooks.some(hookIsObjectLike))
|
|
247
|
+
reject("hooks-is-matcher", ["hooks"]);
|
|
248
|
+
else if (hookGuardSignIn(hooks, ["hooks"], "other") !== undefined)
|
|
177
249
|
reject("hooks-is-matcher", ["hooks"]);
|
|
178
250
|
else
|
|
179
251
|
drop("hooks-not-object", ["hooks"]);
|
|
180
252
|
return undefined;
|
|
181
253
|
}
|
|
182
|
-
if (hookLooksLikeMatcher(hooks) || typeof hooks.type === "string") {
|
|
254
|
+
if (hookLooksLikeMatcher(hooks) || (Object.hasOwn(hooks, "type") && typeof hooks.type === "string")) {
|
|
183
255
|
reject("hooks-is-matcher", ["hooks"]);
|
|
184
256
|
return undefined;
|
|
185
257
|
}
|
|
@@ -188,14 +260,14 @@ export const SETTINGS_CLASSIFY_HOOKS_CONFIG_CLOSURE = (HOOK_EVENTS) => {
|
|
|
188
260
|
const value = hooks[event];
|
|
189
261
|
const at = ["hooks", event];
|
|
190
262
|
if (!HOOK_EVENTS.includes(event)) {
|
|
191
|
-
if (hookGuardSignIn(value, at,
|
|
263
|
+
if (hookGuardSignIn(value, at, hookIsArray(value) ? "matcherList" : "other") !== undefined)
|
|
192
264
|
reject("guard-under-unknown-event", at);
|
|
193
265
|
else
|
|
194
266
|
drop("unknown-event", at);
|
|
195
267
|
continue;
|
|
196
268
|
}
|
|
197
269
|
const guardEvent = HOOK_GUARD_EVENTS.includes(event);
|
|
198
|
-
if (!
|
|
270
|
+
if (!hookIsArray(value)) {
|
|
199
271
|
if ((guardEvent && value !== null) || hookGuardSignIn(value, at, "other") !== undefined)
|
|
200
272
|
reject("guard-event-not-array", at);
|
|
201
273
|
else
|
|
@@ -212,7 +284,7 @@ export const SETTINGS_CLASSIFY_HOOKS_CONFIG_CLOSURE = (HOOK_EVENTS) => {
|
|
|
212
284
|
}
|
|
213
285
|
return loaded;
|
|
214
286
|
}
|
|
215
|
-
function
|
|
287
|
+
function hookClassify(settingsDoc) {
|
|
216
288
|
const rejections = [];
|
|
217
289
|
const dropped = [];
|
|
218
290
|
const reject = (code, path, field) => {
|
|
@@ -222,7 +294,7 @@ export const SETTINGS_CLASSIFY_HOOKS_CONFIG_CLOSURE = (HOOK_EVENTS) => {
|
|
|
222
294
|
dropped.push(field === undefined ? { code, path } : { code, path, field });
|
|
223
295
|
};
|
|
224
296
|
let hooks;
|
|
225
|
-
if (
|
|
297
|
+
if (hookIsRecord(settingsDoc)) {
|
|
226
298
|
const doc = settingsDoc;
|
|
227
299
|
for (const key of Object.keys(doc)) {
|
|
228
300
|
const value = doc[key];
|
|
@@ -232,7 +304,7 @@ export const SETTINGS_CLASSIFY_HOOKS_CONFIG_CLOSURE = (HOOK_EVENTS) => {
|
|
|
232
304
|
}
|
|
233
305
|
const sign = key === "matcher" && hookLooksLikeMatcher(doc)
|
|
234
306
|
? [key]
|
|
235
|
-
: HOOK_GUARD_EVENTS.includes(key) && value !== null && value !== undefined && !(
|
|
307
|
+
: HOOK_GUARD_EVENTS.includes(key) && value !== null && value !== undefined && !(hookIsArray(value) && value.length === 0)
|
|
236
308
|
? [key]
|
|
237
309
|
: hookGuardSignIn(value, [key], "other");
|
|
238
310
|
if (sign !== undefined)
|
|
@@ -250,5 +322,13 @@ export const SETTINGS_CLASSIFY_HOOKS_CONFIG_CLOSURE = (HOOK_EVENTS) => {
|
|
|
250
322
|
return { outcome: "loaded-partial", hooks, dropped, rejections: [] };
|
|
251
323
|
return { outcome: "loaded", hooks, dropped: [], rejections: [] };
|
|
252
324
|
}
|
|
325
|
+
function classifyHooksConfig(settingsDoc) {
|
|
326
|
+
try {
|
|
327
|
+
return hookClassify(settingsDoc);
|
|
328
|
+
}
|
|
329
|
+
catch {
|
|
330
|
+
return { outcome: "rejected", hooks: undefined, dropped: [], rejections: [{ code: "guard-outside-hooks", path: [] }] };
|
|
331
|
+
}
|
|
332
|
+
}
|
|
253
333
|
return classifyHooksConfig;
|
|
254
334
|
};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
export declare const SETTINGS_MCP_REQUEST_ENTRY_CLOSURE: (MCP_CONTENT_ORIGINS: readonly ["local", "execution", "external"], startsWithHttpScheme: (raw: string) => boolean, echoCallerText: (text: string) => string) => any;
|
|
1
|
+
export declare const SETTINGS_MCP_REQUEST_ENTRY_CLOSURE: (MCP_CONTENT_ORIGINS: readonly ["local", "execution", "external"], startsWithHttpScheme: (raw: string) => boolean, echoCallerText: (text: string) => string, UNINSPECTABLE: "an object that could not be inspected (a proxy trap threw)", captureStringArray: (v: unknown, classification: "strict" | "wide") => string[] | undefined, dataDescriptor: (value: unknown) => PropertyDescriptor, inspect: (read: () => unknown) => object, ownFieldsOf: (record: object, keys: readonly string[]) => object, ownValueOf: (record: object, key: string) => object, readKey: (record: object, key: PropertyKey) => object, isJsonArray: (v: unknown) => v is unknown[], jsonShapeOf: (v: unknown) => "plain" | "non_plain_object" | "array" | "null" | "primitive" | "uninspectable", isReservedMcpServerName: (name: string) => boolean, RESERVED_MCP_SERVER_NAME_REASON: "the \"remote-\" prefix is reserved for the remote MCP servers a device executor offers") => any;
|