@work-shape/catalyst-asset-schemas 0.0.0-stage → 0.8.0-rc.2
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/LICENSE +21 -0
- package/dist/index.d.ts +759 -0
- package/dist/index.js +1200 -0
- package/package.json +41 -3
- package/README.md +0 -3
package/dist/index.js
ADDED
|
@@ -0,0 +1,1200 @@
|
|
|
1
|
+
// src/asset-types.ts
|
|
2
|
+
var localeCodes = ["en", "de"];
|
|
3
|
+
var REASONING_EFFORTS = ["none", "low", "medium", "high", "xhigh", "max"];
|
|
4
|
+
var SKILL_STARTERS_MAX = 2;
|
|
5
|
+
var AGENT_STARTERS_MAX = 4;
|
|
6
|
+
var SKILL_STARTER_LINE_MAX_LENGTH = 60;
|
|
7
|
+
var SKILL_SUMMARY_MAX_LENGTH = 120;
|
|
8
|
+
var SKILL_ORIGINS = ["instance", "release"];
|
|
9
|
+
var SKILL_RESOURCE_MEDIA_TYPES = [
|
|
10
|
+
"text/markdown",
|
|
11
|
+
"text/plain",
|
|
12
|
+
"application/json",
|
|
13
|
+
"application/yaml"
|
|
14
|
+
];
|
|
15
|
+
|
|
16
|
+
// src/contract-values.ts
|
|
17
|
+
var AUTH_SCOPE_WILDCARD = "*";
|
|
18
|
+
var CHAT_SESSION_AUTH_SCOPES = [
|
|
19
|
+
"me:read",
|
|
20
|
+
"me:delete",
|
|
21
|
+
"config:read",
|
|
22
|
+
"conversation:read",
|
|
23
|
+
"conversation:write",
|
|
24
|
+
"run:start",
|
|
25
|
+
"run:observe",
|
|
26
|
+
"run:cancel",
|
|
27
|
+
"run:command"
|
|
28
|
+
];
|
|
29
|
+
var FIRST_PARTY_AUTH_SCOPES = [
|
|
30
|
+
AUTH_SCOPE_WILDCARD,
|
|
31
|
+
...CHAT_SESSION_AUTH_SCOPES,
|
|
32
|
+
"collaboration_workspace:read",
|
|
33
|
+
"collaboration_workspace:manage",
|
|
34
|
+
"me:write",
|
|
35
|
+
"governance:read",
|
|
36
|
+
"governance:write",
|
|
37
|
+
"user_admin:read",
|
|
38
|
+
"user_admin:write",
|
|
39
|
+
"api_access:read",
|
|
40
|
+
"api_access:write",
|
|
41
|
+
"config_assets:read",
|
|
42
|
+
"config_assets:write",
|
|
43
|
+
// Moving the published pointer of an asset. A credential that writes drafts with
|
|
44
|
+
// `config_assets:write` publishes none of them without this one.
|
|
45
|
+
"config_assets:publish",
|
|
46
|
+
"config_assets:release",
|
|
47
|
+
// The rows of a Data Store: reading them, and adding or loading them. The definition of a
|
|
48
|
+
// store and its migrations stay under `config_assets:*`. A scope caps what a key may be
|
|
49
|
+
// used for; whether its holder may do it is decided by the grants.
|
|
50
|
+
"data_store_rows:read",
|
|
51
|
+
"data_store_rows:write"
|
|
52
|
+
];
|
|
53
|
+
var ACTIONS = [
|
|
54
|
+
"agent.read",
|
|
55
|
+
"agent.write",
|
|
56
|
+
"agent.delete",
|
|
57
|
+
"skill.read",
|
|
58
|
+
"skill.write",
|
|
59
|
+
"skill.delete",
|
|
60
|
+
"skill.approve",
|
|
61
|
+
"connection.read",
|
|
62
|
+
"connection.use",
|
|
63
|
+
"connection.write",
|
|
64
|
+
"connection.delete",
|
|
65
|
+
"connection.approve",
|
|
66
|
+
"app.read",
|
|
67
|
+
"app.write",
|
|
68
|
+
"app.publish",
|
|
69
|
+
"app.approve",
|
|
70
|
+
"app.delete",
|
|
71
|
+
"app.use",
|
|
72
|
+
"workflow.read",
|
|
73
|
+
"workflow.write",
|
|
74
|
+
"workflow.publish",
|
|
75
|
+
"workflow.approve",
|
|
76
|
+
"workflow.delete",
|
|
77
|
+
"workflow.use",
|
|
78
|
+
"workflow.read_run_data",
|
|
79
|
+
"data_store.read",
|
|
80
|
+
"data_store.write",
|
|
81
|
+
"data_store.publish",
|
|
82
|
+
"data_store.delete",
|
|
83
|
+
"data_store.insert",
|
|
84
|
+
"data_store.execute",
|
|
85
|
+
"knowledge_base.read",
|
|
86
|
+
"knowledge_base.write",
|
|
87
|
+
"knowledge_base.publish",
|
|
88
|
+
"knowledge_base.delete",
|
|
89
|
+
"knowledge_base.use",
|
|
90
|
+
"guardrail.read",
|
|
91
|
+
"guardrail.write",
|
|
92
|
+
"guardrail.publish",
|
|
93
|
+
"guardrail.delete",
|
|
94
|
+
"operations.approve",
|
|
95
|
+
"users.manage",
|
|
96
|
+
"usage.view",
|
|
97
|
+
"audit.view",
|
|
98
|
+
"api_access.manage",
|
|
99
|
+
// Creating service principals, giving and taking their rights, enabling and disabling them.
|
|
100
|
+
// Their keys stay with `api_access.manage`.
|
|
101
|
+
"service_principals.manage",
|
|
102
|
+
"agent_models.manage",
|
|
103
|
+
"assets.release"
|
|
104
|
+
];
|
|
105
|
+
var NAMESPACE_PREFIX_PATTERN = /^[a-z][a-z0-9]*(-[a-z0-9]+)*-$/u;
|
|
106
|
+
var NAMESPACE_PREFIX_MIN_LENGTH = 2;
|
|
107
|
+
var NAMESPACE_PREFIX_MAX_LENGTH = 32;
|
|
108
|
+
var APP_ERROR_STATUS_CODES = {
|
|
109
|
+
BAD_REQUEST: 400,
|
|
110
|
+
UNAUTHENTICATED: 401,
|
|
111
|
+
FORBIDDEN: 403,
|
|
112
|
+
NOT_FOUND: 404,
|
|
113
|
+
CONFLICT: 409,
|
|
114
|
+
REVISION_CONFLICT: 412,
|
|
115
|
+
PRECONDITION_REQUIRED: 428,
|
|
116
|
+
TIMEOUT: 504,
|
|
117
|
+
VALIDATION_FAILED: 422,
|
|
118
|
+
RATE_LIMITED: 429,
|
|
119
|
+
POLICY_DENIED: 403,
|
|
120
|
+
GUARDRAIL_BLOCKED: 403,
|
|
121
|
+
DECLINED: 403,
|
|
122
|
+
IDEMPOTENCY_KEY_REUSED: 409,
|
|
123
|
+
OPERATION_IN_PROGRESS: 409,
|
|
124
|
+
OPERATION_EXPIRED: 409,
|
|
125
|
+
OUTPUT_NOT_RETAINED: 409,
|
|
126
|
+
INTERNAL: 500
|
|
127
|
+
};
|
|
128
|
+
var IDEMPOTENCY_KEY_MAX_LENGTH = 255;
|
|
129
|
+
var PROVIDER_PORTS = ["models", "mail", "objectStorage", "sandbox", "secrets"];
|
|
130
|
+
var PROVIDER_REGIONS = ["eu", "global"];
|
|
131
|
+
var PROVIDER_CHECK_ERROR_CLASSES = [
|
|
132
|
+
"unreachable",
|
|
133
|
+
"timeout",
|
|
134
|
+
"access_denied",
|
|
135
|
+
"not_found",
|
|
136
|
+
// The bucket an object store is configured with does not exist. The check creates none.
|
|
137
|
+
"bucket_missing",
|
|
138
|
+
"rejected",
|
|
139
|
+
"failed"
|
|
140
|
+
];
|
|
141
|
+
var CONNECTION_NAME_PATTERN = /^[a-z][a-z0-9]*([_-][a-z0-9]+)*$/u;
|
|
142
|
+
var CONNECTION_NAME_MAX_LENGTH = 64;
|
|
143
|
+
var GUARDRAIL_NAME_PATTERN = /^[a-z][a-z0-9]*([_-][a-z0-9]+)*$/u;
|
|
144
|
+
var GUARDRAIL_NAME_MAX_LENGTH = 64;
|
|
145
|
+
var CONNECTION_EXPOSURES = ["agent", "bridge", "workflow", "outside"];
|
|
146
|
+
var CONNECTION_HEALTH_STATES = [
|
|
147
|
+
"unknown",
|
|
148
|
+
"ok",
|
|
149
|
+
"failed",
|
|
150
|
+
"needs_configuration",
|
|
151
|
+
"secret_unreadable"
|
|
152
|
+
];
|
|
153
|
+
var GRANT_HOLDER_KINDS = ["user", "service_principal", "role", "group"];
|
|
154
|
+
var GRANT_SCOPE_KINDS = ["instance", "workspace", "namespace", "asset"];
|
|
155
|
+
var GRANT_EFFECTS = ["allow", "deny"];
|
|
156
|
+
var ACCESS_SOURCES = ["role", "legacy_ref", "grant", "membership"];
|
|
157
|
+
var POLICY_VALUES = ["allow", "confirm", "approval", "deny"];
|
|
158
|
+
var AUTH_PRINCIPAL_KINDS = ["user", "service"];
|
|
159
|
+
var ADMINISTERED_USER_STATUSES = ["active", "disabled", "deleting"];
|
|
160
|
+
var SERVICE_PRINCIPAL_STATUSES = ["active", "disabled"];
|
|
161
|
+
var SERVICE_PRINCIPAL_PERMISSIONS = [
|
|
162
|
+
"config_assets.read",
|
|
163
|
+
"config_assets.release"
|
|
164
|
+
];
|
|
165
|
+
var API_CREDENTIAL_SCOPES = [
|
|
166
|
+
"config_assets:read",
|
|
167
|
+
"config_assets:release"
|
|
168
|
+
];
|
|
169
|
+
var APP_ERROR_CODES = [
|
|
170
|
+
"BAD_REQUEST",
|
|
171
|
+
"UNAUTHENTICATED",
|
|
172
|
+
"FORBIDDEN",
|
|
173
|
+
"NOT_FOUND",
|
|
174
|
+
"CONFLICT",
|
|
175
|
+
"REVISION_CONFLICT",
|
|
176
|
+
"PRECONDITION_REQUIRED",
|
|
177
|
+
"TIMEOUT",
|
|
178
|
+
"VALIDATION_FAILED",
|
|
179
|
+
"RATE_LIMITED",
|
|
180
|
+
"POLICY_DENIED",
|
|
181
|
+
"GUARDRAIL_BLOCKED",
|
|
182
|
+
"DECLINED",
|
|
183
|
+
"IDEMPOTENCY_KEY_REUSED",
|
|
184
|
+
"OPERATION_IN_PROGRESS",
|
|
185
|
+
"OPERATION_EXPIRED",
|
|
186
|
+
"OUTPUT_NOT_RETAINED",
|
|
187
|
+
"INTERNAL"
|
|
188
|
+
];
|
|
189
|
+
var OPERATION_EFFECTS = ["reading", "changing"];
|
|
190
|
+
var OPERATION_TARGETS = ["live", "test", "dry_run"];
|
|
191
|
+
var OPERATION_RUN_STATUSES = [
|
|
192
|
+
"running",
|
|
193
|
+
"pending_confirmation",
|
|
194
|
+
"pending_approval",
|
|
195
|
+
"done",
|
|
196
|
+
"failed",
|
|
197
|
+
"denied",
|
|
198
|
+
"expired"
|
|
199
|
+
];
|
|
200
|
+
var OPERATION_ORIGIN_KINDS = [
|
|
201
|
+
"agent",
|
|
202
|
+
"user",
|
|
203
|
+
"cli",
|
|
204
|
+
"mcp",
|
|
205
|
+
"app",
|
|
206
|
+
"workflow",
|
|
207
|
+
"schedule"
|
|
208
|
+
];
|
|
209
|
+
var OPERATION_RUN_DECISION_MODES = [
|
|
210
|
+
"direct",
|
|
211
|
+
"confirmed",
|
|
212
|
+
"approved",
|
|
213
|
+
"declined"
|
|
214
|
+
];
|
|
215
|
+
var OPERATION_RUN_DECISION_REASONS = [
|
|
216
|
+
"inherited_approval_not_applied",
|
|
217
|
+
"workflow_publish",
|
|
218
|
+
"approved_by_caller"
|
|
219
|
+
];
|
|
220
|
+
var OPERATION_DENIAL_REASONS = [
|
|
221
|
+
"no_grant",
|
|
222
|
+
"denied",
|
|
223
|
+
"unknown_action",
|
|
224
|
+
"holder_inactive",
|
|
225
|
+
"holder_not_administrable",
|
|
226
|
+
"user_only",
|
|
227
|
+
"outside_key_scope"
|
|
228
|
+
];
|
|
229
|
+
var APPROVAL_REQUEST_STATUSES = [
|
|
230
|
+
"pending",
|
|
231
|
+
"approved",
|
|
232
|
+
"rejected",
|
|
233
|
+
"changes_requested",
|
|
234
|
+
"superseded",
|
|
235
|
+
"withdrawn",
|
|
236
|
+
"reverted"
|
|
237
|
+
];
|
|
238
|
+
var APPROVAL_CHECK_STATUSES = ["passed", "warned", "blocked"];
|
|
239
|
+
var APPROVAL_EXECUTIONS = [
|
|
240
|
+
"queued",
|
|
241
|
+
"done",
|
|
242
|
+
"failed",
|
|
243
|
+
"interrupted",
|
|
244
|
+
"refused",
|
|
245
|
+
"expired"
|
|
246
|
+
];
|
|
247
|
+
var SKILL_CHANGE_TYPES = ["replace", "add", "new_resource"];
|
|
248
|
+
var GUARDRAIL_OUTCOMES = ["allow", "warn", "require_approval", "block"];
|
|
249
|
+
var APP_MODES = ["published", "draft"];
|
|
250
|
+
var ASSET_NAME_REFUSAL_REASONS = ["name_invalid", "name_taken"];
|
|
251
|
+
var ASSET_SYNC_CHANGE_TYPES = ["put", "delete"];
|
|
252
|
+
var ASSET_LIFECYCLES = ["active", "draft_published"];
|
|
253
|
+
var ASSET_REPRESENTATIONS = ["config", "files"];
|
|
254
|
+
var CONFIG_ASSET_KINDS = ["agent", "skill"];
|
|
255
|
+
var CONFIG_ASSET_CHANGE_OPERATIONS = ["create", "update", "delete", "revert"];
|
|
256
|
+
var AGENT_AVAILABILITY_MODES = ["all", "selected"];
|
|
257
|
+
var AGENT_EDITABLE_FIELDS = [
|
|
258
|
+
"displayName",
|
|
259
|
+
"description",
|
|
260
|
+
"welcomeMessage",
|
|
261
|
+
"welcomeSubtitle",
|
|
262
|
+
"instructions",
|
|
263
|
+
"modelBindingId",
|
|
264
|
+
"reasoningEffort",
|
|
265
|
+
"maxSteps",
|
|
266
|
+
"toolNames",
|
|
267
|
+
"skillNames",
|
|
268
|
+
"knowledgeBases",
|
|
269
|
+
"initialPrompts"
|
|
270
|
+
];
|
|
271
|
+
var ASSET_REPO_BUNDLE_KINDS = ["full", "incremental"];
|
|
272
|
+
var WORKSPACE_FILE_KINDS = ["page", "upload", "generated_file"];
|
|
273
|
+
var WORKSPACE_VISIBILITIES = ["discoverable", "private"];
|
|
274
|
+
var WORKSPACE_MEMBERSHIP_ROLES = ["owner", "admin", "member"];
|
|
275
|
+
var WORKSPACE_ACCENT_COLORS = [
|
|
276
|
+
"garnet",
|
|
277
|
+
"ruby",
|
|
278
|
+
"mahogany",
|
|
279
|
+
"copper",
|
|
280
|
+
"amber",
|
|
281
|
+
"olive",
|
|
282
|
+
"jade",
|
|
283
|
+
"emerald",
|
|
284
|
+
"teal",
|
|
285
|
+
"turquoise",
|
|
286
|
+
"azure",
|
|
287
|
+
"sapphire",
|
|
288
|
+
"indigo",
|
|
289
|
+
"violet",
|
|
290
|
+
"magenta",
|
|
291
|
+
"rose",
|
|
292
|
+
"stone",
|
|
293
|
+
"slate"
|
|
294
|
+
];
|
|
295
|
+
var COLLABORATION_WORKSPACE_KINDS = ["personal", "shared"];
|
|
296
|
+
var WORKSPACE_ACCESS_STATES = ["member", "request_pending", "can_request"];
|
|
297
|
+
var DELETION_STATES = ["deleting", "deleted"];
|
|
298
|
+
var WORKSPACE_SECTIONS = ["agents", "apps"];
|
|
299
|
+
var MODEL_USAGE_TIERS = [
|
|
300
|
+
"very_low",
|
|
301
|
+
"low",
|
|
302
|
+
"moderate",
|
|
303
|
+
"elevated",
|
|
304
|
+
"high",
|
|
305
|
+
"very_high"
|
|
306
|
+
];
|
|
307
|
+
var THEME_MODE_PREFERENCES = ["light", "dark", "system"];
|
|
308
|
+
var TOOL_GROUPS = [
|
|
309
|
+
"documents",
|
|
310
|
+
"web",
|
|
311
|
+
"files",
|
|
312
|
+
"results",
|
|
313
|
+
"skills",
|
|
314
|
+
"platform",
|
|
315
|
+
"instance"
|
|
316
|
+
];
|
|
317
|
+
var INFRASTRUCTURE_SECRET_STATES = ["set", "missing"];
|
|
318
|
+
var INFRASTRUCTURE_WITHHELD_FIELDS = ["endpointHost", "bucket"];
|
|
319
|
+
var OPENAI_COMPATIBLE_APIS = ["chat_completions", "responses"];
|
|
320
|
+
var MODEL_PROVIDER_AUTH_MODES = ["bearer", "api-key"];
|
|
321
|
+
var CONVERSATION_VISIBILITIES = ["workspace", "private"];
|
|
322
|
+
var WEB_SOURCE_PROVIDERS = [
|
|
323
|
+
"openai-native",
|
|
324
|
+
"serper",
|
|
325
|
+
"tavily",
|
|
326
|
+
"firecrawl",
|
|
327
|
+
"browserbase",
|
|
328
|
+
"direct"
|
|
329
|
+
];
|
|
330
|
+
var CHAT_MESSAGE_ROLES = ["user", "assistant", "system", "tool"];
|
|
331
|
+
var CONVERSATION_ATTACHMENT_STATUSES = [
|
|
332
|
+
"queued",
|
|
333
|
+
"preprocessing",
|
|
334
|
+
"ready",
|
|
335
|
+
"failed",
|
|
336
|
+
"unsupported",
|
|
337
|
+
"deleted"
|
|
338
|
+
];
|
|
339
|
+
var ATTACHMENT_CREATE_OUTCOMES = ["created", "already_available"];
|
|
340
|
+
var STRUCTURED_DATA_REVIEW_REASONS = ["uncertain", "conflicting"];
|
|
341
|
+
var AGENT_RUN_STATUSES = [
|
|
342
|
+
"queued",
|
|
343
|
+
"running",
|
|
344
|
+
"waiting_for_decision",
|
|
345
|
+
"cancelling",
|
|
346
|
+
"completed",
|
|
347
|
+
"cancelled",
|
|
348
|
+
"failed"
|
|
349
|
+
];
|
|
350
|
+
var AGENT_RUN_FAILURE_CATEGORIES = [
|
|
351
|
+
"app_error",
|
|
352
|
+
"internal_error",
|
|
353
|
+
"runtime_interrupted",
|
|
354
|
+
"abort_error",
|
|
355
|
+
"unknown_error"
|
|
356
|
+
];
|
|
357
|
+
var TOOL_INPUT_PARSE_ERROR_CODES = ["invalid_json", "invalid_text"];
|
|
358
|
+
var WAITING_OPERATION_RUN_STATUSES = [
|
|
359
|
+
"pending_confirmation",
|
|
360
|
+
"pending_approval"
|
|
361
|
+
];
|
|
362
|
+
var OPERATION_CONFIRMATION_DECISIONS = ["confirm", "decline"];
|
|
363
|
+
var TOOL_DECISION_MODES = ["confirm", "approval"];
|
|
364
|
+
var TOOL_DECISION_OUTCOMES = ["confirmed", "declined", "expired", "cancelled"];
|
|
365
|
+
var TOOL_CALL_STATES = [
|
|
366
|
+
"input_available",
|
|
367
|
+
"waiting_for_decision",
|
|
368
|
+
"output_available",
|
|
369
|
+
"output_error"
|
|
370
|
+
];
|
|
371
|
+
var SUPPORTED_IMAGE_MIME_TYPES = [
|
|
372
|
+
"image/png",
|
|
373
|
+
"image/jpeg",
|
|
374
|
+
"image/webp",
|
|
375
|
+
"image/gif"
|
|
376
|
+
];
|
|
377
|
+
var ARTIFACT_PREVIEW_IMAGE_FORMATS = ["png", "webp", "jpeg"];
|
|
378
|
+
var ARTIFACT_PREVIEW_STATUSES = ["ready", "pending", "failed", "unsupported"];
|
|
379
|
+
var WORKSPACE_COMMAND_STATUSES = [
|
|
380
|
+
"queued",
|
|
381
|
+
"running",
|
|
382
|
+
"cancelling",
|
|
383
|
+
"completed",
|
|
384
|
+
"failed",
|
|
385
|
+
"cancelled"
|
|
386
|
+
];
|
|
387
|
+
var TOOL_DISPLAY_MODES = ["inline", "side_panel", "fullscreen"];
|
|
388
|
+
var JOB_STATUSES = [
|
|
389
|
+
"queued",
|
|
390
|
+
"running",
|
|
391
|
+
"succeeded",
|
|
392
|
+
"failed",
|
|
393
|
+
"dead",
|
|
394
|
+
"cancelled"
|
|
395
|
+
];
|
|
396
|
+
var AUDIT_ACTOR_KINDS = ["user", "assistant", "service", "system"];
|
|
397
|
+
var AUDIT_TIERS = ["governance", "workflow", "runtime", "telemetry"];
|
|
398
|
+
var AUDIT_OUTCOMES = ["success", "failed", "denied", "warning"];
|
|
399
|
+
var MODEL_USAGE_EVENT_STATUSES = ["pending", "settled", "failed", "abandoned"];
|
|
400
|
+
var MODEL_USAGE_SOURCES = ["provider_reported", "not_reported", "estimated"];
|
|
401
|
+
var USAGE_COST_STATUSES = ["settled", "incomplete", "unpriced"];
|
|
402
|
+
var CONNECTION_OPERATION_STATUSES = [
|
|
403
|
+
"ready",
|
|
404
|
+
"awaiting_discovery",
|
|
405
|
+
"needs_review",
|
|
406
|
+
"unknown",
|
|
407
|
+
"disabled"
|
|
408
|
+
];
|
|
409
|
+
var CONNECTION_SECRET_STATES = ["set", "not_set", "unreadable"];
|
|
410
|
+
var CONNECTOR_TEST_STATUSES = [
|
|
411
|
+
"ready",
|
|
412
|
+
"unauthorized",
|
|
413
|
+
"network_denied",
|
|
414
|
+
"unavailable"
|
|
415
|
+
];
|
|
416
|
+
var CONNECTION_ORIGINS = ["release", "runtime"];
|
|
417
|
+
var CONNECTION_NETWORKS = ["public", "private"];
|
|
418
|
+
var DATA_STORE_SCALAR_TYPES = [
|
|
419
|
+
"text",
|
|
420
|
+
"integer",
|
|
421
|
+
"number",
|
|
422
|
+
"boolean",
|
|
423
|
+
"date",
|
|
424
|
+
"timestamp"
|
|
425
|
+
];
|
|
426
|
+
var DATA_STORE_LOAD_CONFLICT_MODES = ["fail", "skip", "update"];
|
|
427
|
+
var DATA_STORE_INSERT_CONFLICT_MODES = [
|
|
428
|
+
"fail",
|
|
429
|
+
"skip"
|
|
430
|
+
];
|
|
431
|
+
var DATA_STORE_CONDITIONS = [
|
|
432
|
+
"server_databases_open",
|
|
433
|
+
"sessions_open",
|
|
434
|
+
"temp_files_unbounded"
|
|
435
|
+
];
|
|
436
|
+
var DATA_STORE_STATUSES = ["provisioning", "ready", "retired"];
|
|
437
|
+
var DATA_STORE_MIGRATION_OUTCOMES = ["none", "pending", "applied", "failed"];
|
|
438
|
+
var KNOWLEDGE_BASE_STATUSES = ["unchecked", "ok", "needs_attention"];
|
|
439
|
+
var DATABASE_RELATION_TYPES = [
|
|
440
|
+
"table",
|
|
441
|
+
"view",
|
|
442
|
+
"materialized_view",
|
|
443
|
+
"foreign_table"
|
|
444
|
+
];
|
|
445
|
+
var WORKFLOW_RUN_STATUSES = [
|
|
446
|
+
"queued",
|
|
447
|
+
"running",
|
|
448
|
+
"waiting",
|
|
449
|
+
"done",
|
|
450
|
+
"failed",
|
|
451
|
+
"cancelled",
|
|
452
|
+
"limit_reached"
|
|
453
|
+
];
|
|
454
|
+
var WORKFLOW_STEP_TYPES = [
|
|
455
|
+
"trigger",
|
|
456
|
+
"operation",
|
|
457
|
+
"loop",
|
|
458
|
+
"code",
|
|
459
|
+
"output",
|
|
460
|
+
"agent",
|
|
461
|
+
"notify",
|
|
462
|
+
"workflow"
|
|
463
|
+
];
|
|
464
|
+
var WORKFLOW_RESERVED_STEP_TYPES = ["condition", "parallel"];
|
|
465
|
+
var WORKFLOW_TRIGGER_KINDS = ["manual", "schedule", "parent"];
|
|
466
|
+
var NOTIFY_CHANNELS = ["inbox", "mail"];
|
|
467
|
+
var PRINCIPAL_HOLDER_KINDS = [
|
|
468
|
+
"user",
|
|
469
|
+
"service_principal"
|
|
470
|
+
];
|
|
471
|
+
var ASSET_OWNER_KINDS = [
|
|
472
|
+
"instance",
|
|
473
|
+
"workspace"
|
|
474
|
+
];
|
|
475
|
+
var READING_POLICY_VALUES = ["allow", "deny"];
|
|
476
|
+
var CONNECTION_OPERATION_POLICIES = [
|
|
477
|
+
"deny",
|
|
478
|
+
"approval"
|
|
479
|
+
];
|
|
480
|
+
var WORKFLOW_RUN_MODES = ["live", "test"];
|
|
481
|
+
var APP_ACTION_CALL_STATUSES = [
|
|
482
|
+
"done",
|
|
483
|
+
"pending_approval"
|
|
484
|
+
];
|
|
485
|
+
var OPERATIONS_AUDIENCES = [
|
|
486
|
+
"workflow",
|
|
487
|
+
"app"
|
|
488
|
+
];
|
|
489
|
+
var DECIDED_APPROVAL_REQUEST_STATUSES = [
|
|
490
|
+
"approved",
|
|
491
|
+
"rejected",
|
|
492
|
+
"changes_requested",
|
|
493
|
+
"superseded",
|
|
494
|
+
"withdrawn",
|
|
495
|
+
"reverted"
|
|
496
|
+
];
|
|
497
|
+
var ENDED_APPROVAL_EXECUTIONS = [
|
|
498
|
+
"done",
|
|
499
|
+
"failed",
|
|
500
|
+
"interrupted",
|
|
501
|
+
"refused",
|
|
502
|
+
"expired"
|
|
503
|
+
];
|
|
504
|
+
var GUARDRAIL_HIT_OUTCOMES = [
|
|
505
|
+
"warn",
|
|
506
|
+
"require_approval",
|
|
507
|
+
"block"
|
|
508
|
+
];
|
|
509
|
+
var APPROVAL_CHECK_FAILURE_OUTCOMES = [
|
|
510
|
+
"warn",
|
|
511
|
+
"block"
|
|
512
|
+
];
|
|
513
|
+
var THEME_MODES = ["light", "dark"];
|
|
514
|
+
var USER_STATUSES = [
|
|
515
|
+
"active",
|
|
516
|
+
"disabled"
|
|
517
|
+
];
|
|
518
|
+
var MESSAGE_FINISH_STATUSES = [
|
|
519
|
+
"completed",
|
|
520
|
+
"cancelled"
|
|
521
|
+
];
|
|
522
|
+
var ENDED_AGENT_RUN_STATUSES = [
|
|
523
|
+
"completed",
|
|
524
|
+
"cancelled",
|
|
525
|
+
"failed"
|
|
526
|
+
];
|
|
527
|
+
var ACTIVE_AGENT_RUN_STATUSES = [
|
|
528
|
+
"queued",
|
|
529
|
+
"running",
|
|
530
|
+
"waiting_for_decision",
|
|
531
|
+
"cancelling"
|
|
532
|
+
];
|
|
533
|
+
var ARTIFACT_PREVIEW_IMAGE_MIME_TYPES = [
|
|
534
|
+
"image/png",
|
|
535
|
+
"image/jpeg",
|
|
536
|
+
"image/webp"
|
|
537
|
+
];
|
|
538
|
+
var LIVE_JOB_STATUSES = ["queued", "running"];
|
|
539
|
+
var FAILED_JOB_STATUSES = ["failed", "dead"];
|
|
540
|
+
var AUDIT_EVENT_STATUSES = [
|
|
541
|
+
"success",
|
|
542
|
+
"failed",
|
|
543
|
+
"denied"
|
|
544
|
+
];
|
|
545
|
+
var LISTED_DATA_STORE_STATUSES = [
|
|
546
|
+
"provisioning",
|
|
547
|
+
"ready"
|
|
548
|
+
];
|
|
549
|
+
var KNOWLEDGE_CHECK_STATUSES = [
|
|
550
|
+
"ok",
|
|
551
|
+
"needs_attention"
|
|
552
|
+
];
|
|
553
|
+
var WORKFLOW_STEP_RUN_STATUSES = [
|
|
554
|
+
"queued",
|
|
555
|
+
"running",
|
|
556
|
+
"waiting",
|
|
557
|
+
"done",
|
|
558
|
+
"failed",
|
|
559
|
+
"cancelled"
|
|
560
|
+
];
|
|
561
|
+
var WORKFLOW_ENDED_STATUSES = [
|
|
562
|
+
"done",
|
|
563
|
+
"failed",
|
|
564
|
+
"cancelled",
|
|
565
|
+
"limit_reached"
|
|
566
|
+
];
|
|
567
|
+
|
|
568
|
+
// src/schemas.ts
|
|
569
|
+
import { z } from "zod";
|
|
570
|
+
|
|
571
|
+
// src/yaml-bounds.ts
|
|
572
|
+
function yamlValueIssue(value, maxDepth = Number.POSITIVE_INFINITY) {
|
|
573
|
+
const seen = /* @__PURE__ */ new Set();
|
|
574
|
+
const open = [{ value, depth: 0 }];
|
|
575
|
+
let deepest = 0;
|
|
576
|
+
for (let next = open.pop(); next !== void 0; next = open.pop()) {
|
|
577
|
+
if (typeof next.value !== "object" || next.value === null) continue;
|
|
578
|
+
if (seen.has(next.value)) return "alias";
|
|
579
|
+
seen.add(next.value);
|
|
580
|
+
deepest = Math.max(deepest, next.depth + 1);
|
|
581
|
+
for (const child of Array.isArray(next.value) ? next.value : Object.values(next.value)) {
|
|
582
|
+
open.push({ value: child, depth: next.depth + 1 });
|
|
583
|
+
}
|
|
584
|
+
}
|
|
585
|
+
return deepest > maxDepth ? "depth" : void 0;
|
|
586
|
+
}
|
|
587
|
+
function yamlValueIssueSentence(issue, maxDepth) {
|
|
588
|
+
return issue === "alias" ? "it uses a YAML anchor with an alias or a merge key, which is not read: write the value out where it is used" : `it nests deeper than ${maxDepth ?? "its reader takes"} levels`;
|
|
589
|
+
}
|
|
590
|
+
|
|
591
|
+
// src/schemas.ts
|
|
592
|
+
var localizedStringMapSchema = z.object({
|
|
593
|
+
en: z.string().min(1).optional(),
|
|
594
|
+
de: z.string().min(1).optional()
|
|
595
|
+
}).strict().refine((value) => value.en !== void 0 || value.de !== void 0, {
|
|
596
|
+
message: "At least one localized value is required"
|
|
597
|
+
});
|
|
598
|
+
var localizedStringSchema = z.union([z.string().min(1), localizedStringMapSchema]);
|
|
599
|
+
var SKILL_NAME_PATTERN = /^[A-Za-z0-9][A-Za-z0-9_.-]*$/u;
|
|
600
|
+
var SKILL_NAME_RULE = "Skill name must start with a letter or a number and contain only letters, numbers, dots, underscores, or hyphens";
|
|
601
|
+
var SKILL_PORTABLE_NAME_MAX_CHARS = 64;
|
|
602
|
+
var SKILL_PORTABLE_DESCRIPTION_MAX_CHARS = 1024;
|
|
603
|
+
var SKILL_PORTABLE_NAME_PATTERN = /^[a-z0-9]+(-[a-z0-9]+)*$/u;
|
|
604
|
+
function skillPortabilityIssues(skill) {
|
|
605
|
+
const issues = [];
|
|
606
|
+
if (typeof skill.name === "string" && (!SKILL_PORTABLE_NAME_PATTERN.test(skill.name) || skill.name.length > SKILL_PORTABLE_NAME_MAX_CHARS)) {
|
|
607
|
+
issues.push({
|
|
608
|
+
code: "skill_name_not_portable",
|
|
609
|
+
message: `The name '${skill.name}' is outside the public skill convention: lowercase letters, digits and single hyphens, at most ${SKILL_PORTABLE_NAME_MAX_CHARS} characters. The skill works here and may not be taken as it is elsewhere.`
|
|
610
|
+
});
|
|
611
|
+
}
|
|
612
|
+
if (typeof skill.description === "string" && skill.description.length > SKILL_PORTABLE_DESCRIPTION_MAX_CHARS) {
|
|
613
|
+
issues.push({
|
|
614
|
+
code: "skill_description_not_portable",
|
|
615
|
+
message: `The description has ${skill.description.length} characters. The public skill convention takes at most ${SKILL_PORTABLE_DESCRIPTION_MAX_CHARS}.`
|
|
616
|
+
});
|
|
617
|
+
}
|
|
618
|
+
return issues;
|
|
619
|
+
}
|
|
620
|
+
var skillNameSchema = z.string().min(1).regex(SKILL_NAME_PATTERN, { message: SKILL_NAME_RULE });
|
|
621
|
+
var skillResourcePathSchema = z.string().min(1).superRefine((path, context) => {
|
|
622
|
+
const segments = path.split("/");
|
|
623
|
+
if (path.startsWith("/") || /^[A-Za-z]:/u.test(path) || path.includes("\\") || /[\u0000-\u001f\u007f]/u.test(path) || segments.some((segment) => segment === "" || segment === "." || segment === "..")) {
|
|
624
|
+
context.addIssue({
|
|
625
|
+
code: "custom",
|
|
626
|
+
message: "Skill resource path must be a normalized relative path"
|
|
627
|
+
});
|
|
628
|
+
}
|
|
629
|
+
if (path.toLowerCase() === "skill.md" || path.toLowerCase().endsWith("/skill.md")) {
|
|
630
|
+
context.addIssue({
|
|
631
|
+
code: "custom",
|
|
632
|
+
message: "SKILL.md is the skill root and cannot also be a resource"
|
|
633
|
+
});
|
|
634
|
+
}
|
|
635
|
+
});
|
|
636
|
+
function skillResourceMediaTypeForPath(path) {
|
|
637
|
+
const extension = path.slice(path.lastIndexOf(".")).toLowerCase();
|
|
638
|
+
switch (extension) {
|
|
639
|
+
case ".md":
|
|
640
|
+
return "text/markdown";
|
|
641
|
+
case ".txt":
|
|
642
|
+
return "text/plain";
|
|
643
|
+
case ".json":
|
|
644
|
+
return "application/json";
|
|
645
|
+
case ".yaml":
|
|
646
|
+
case ".yml":
|
|
647
|
+
return "application/yaml";
|
|
648
|
+
default:
|
|
649
|
+
return void 0;
|
|
650
|
+
}
|
|
651
|
+
}
|
|
652
|
+
var skillResourceConfigSchema = z.object({
|
|
653
|
+
path: skillResourcePathSchema,
|
|
654
|
+
mediaType: z.enum(SKILL_RESOURCE_MEDIA_TYPES),
|
|
655
|
+
content: z.string().refine((content) => !content.includes("\0"), {
|
|
656
|
+
message: "Skill resources must contain text, not binary data"
|
|
657
|
+
})
|
|
658
|
+
}).superRefine((resource, context) => {
|
|
659
|
+
const expectedMediaType = skillResourceMediaTypeForPath(resource.path);
|
|
660
|
+
if (!expectedMediaType) {
|
|
661
|
+
context.addIssue({
|
|
662
|
+
code: "custom",
|
|
663
|
+
path: ["path"],
|
|
664
|
+
message: "Unsupported skill resource extension"
|
|
665
|
+
});
|
|
666
|
+
} else if (resource.mediaType !== expectedMediaType) {
|
|
667
|
+
context.addIssue({
|
|
668
|
+
code: "custom",
|
|
669
|
+
path: ["mediaType"],
|
|
670
|
+
message: `Skill resource '${resource.path}' must use media type '${expectedMediaType}'`
|
|
671
|
+
});
|
|
672
|
+
}
|
|
673
|
+
});
|
|
674
|
+
var starterLineSchema = localizedStringSchema.refine(
|
|
675
|
+
(value) => (typeof value === "string" ? [value] : Object.values(value)).every(
|
|
676
|
+
(line) => line.length <= SKILL_STARTER_LINE_MAX_LENGTH && !/[\r\n]/u.test(line)
|
|
677
|
+
),
|
|
678
|
+
{ message: `Must be one line of at most ${SKILL_STARTER_LINE_MAX_LENGTH} characters` }
|
|
679
|
+
);
|
|
680
|
+
var skillStarterSchema = z.strictObject({
|
|
681
|
+
title: starterLineSchema,
|
|
682
|
+
hint: starterLineSchema.optional(),
|
|
683
|
+
prompt: localizedStringSchema,
|
|
684
|
+
tools: z.array(z.string().min(1)).optional()
|
|
685
|
+
});
|
|
686
|
+
var SKILL_FRONTMATTER_MAX_BYTES = 8192;
|
|
687
|
+
var SKILL_FRONTMATTER_MAX_DEPTH = 8;
|
|
688
|
+
var SKILL_FRONTMATTER_FIELDS = [
|
|
689
|
+
"name",
|
|
690
|
+
"title",
|
|
691
|
+
"description",
|
|
692
|
+
"summary",
|
|
693
|
+
"starters"
|
|
694
|
+
];
|
|
695
|
+
var skillFileEntrySchema = z.object({
|
|
696
|
+
path: z.string().min(1),
|
|
697
|
+
sha256: z.string().regex(/^[0-9a-f]{64}$/u),
|
|
698
|
+
bytes: z.number().int().min(0),
|
|
699
|
+
mediaType: z.string().min(1)
|
|
700
|
+
});
|
|
701
|
+
var skillConfigObjectSchema = z.object({
|
|
702
|
+
name: skillNameSchema,
|
|
703
|
+
title: z.string().min(1),
|
|
704
|
+
description: z.string().min(1),
|
|
705
|
+
summary: z.string().min(1).max(SKILL_SUMMARY_MAX_LENGTH, {
|
|
706
|
+
message: `Skill summary must be at most ${SKILL_SUMMARY_MAX_LENGTH} characters`
|
|
707
|
+
}).refine((summary) => !/[\r\n]/u.test(summary), {
|
|
708
|
+
message: "Skill summary must be one line"
|
|
709
|
+
}).optional(),
|
|
710
|
+
starters: z.array(skillStarterSchema).max(SKILL_STARTERS_MAX, {
|
|
711
|
+
message: `A skill carries at most ${SKILL_STARTERS_MAX} starters`
|
|
712
|
+
}).optional(),
|
|
713
|
+
content: z.string().min(1),
|
|
714
|
+
resources: z.array(skillResourceConfigSchema).optional(),
|
|
715
|
+
files: z.array(skillFileEntrySchema).optional(),
|
|
716
|
+
frontmatter: z.record(z.string(), z.unknown()).optional().refine(
|
|
717
|
+
(frontmatter) => frontmatter === void 0 || yamlValueIssue(frontmatter, SKILL_FRONTMATTER_MAX_DEPTH) === void 0 && JSON.stringify(frontmatter).length <= SKILL_FRONTMATTER_MAX_BYTES,
|
|
718
|
+
{
|
|
719
|
+
message: `Skill frontmatter holds at most ${SKILL_FRONTMATTER_MAX_BYTES} characters as JSON, nested at most ${SKILL_FRONTMATTER_MAX_DEPTH} levels`
|
|
720
|
+
}
|
|
721
|
+
),
|
|
722
|
+
origin: z.literal("release").optional(),
|
|
723
|
+
icon: z.string().min(1).optional()
|
|
724
|
+
});
|
|
725
|
+
var skillConfigSchema = skillConfigObjectSchema.superRefine((skill, context) => {
|
|
726
|
+
for (const key of SKILL_FRONTMATTER_FIELDS) {
|
|
727
|
+
if (skill.frontmatter && Object.hasOwn(skill.frontmatter, key)) {
|
|
728
|
+
context.addIssue({
|
|
729
|
+
code: "custom",
|
|
730
|
+
path: ["frontmatter", key],
|
|
731
|
+
message: `Skill frontmatter cannot hold '${key}': it is a field of the skill itself`
|
|
732
|
+
});
|
|
733
|
+
}
|
|
734
|
+
}
|
|
735
|
+
const seen = /* @__PURE__ */ new Set();
|
|
736
|
+
for (const [index, resource] of (skill.resources ?? []).entries()) {
|
|
737
|
+
const pathKey = resource.path.toLowerCase();
|
|
738
|
+
if (seen.has(pathKey)) {
|
|
739
|
+
context.addIssue({
|
|
740
|
+
code: "custom",
|
|
741
|
+
path: ["resources", index, "path"],
|
|
742
|
+
message: `Duplicate skill resource path: ${resource.path}`
|
|
743
|
+
});
|
|
744
|
+
}
|
|
745
|
+
seen.add(pathKey);
|
|
746
|
+
}
|
|
747
|
+
});
|
|
748
|
+
var skillFileFrontmatterSchema = z.looseObject({
|
|
749
|
+
name: skillNameSchema.optional(),
|
|
750
|
+
title: z.string().min(1).optional(),
|
|
751
|
+
description: z.string().min(1),
|
|
752
|
+
summary: skillConfigObjectSchema.shape.summary,
|
|
753
|
+
starters: skillConfigObjectSchema.shape.starters
|
|
754
|
+
});
|
|
755
|
+
var welcomeSubtitleSchema = z.union([
|
|
756
|
+
z.string(),
|
|
757
|
+
z.object({
|
|
758
|
+
en: z.string().optional(),
|
|
759
|
+
de: z.string().optional()
|
|
760
|
+
}).strict().refine((value) => value.en !== void 0 || value.de !== void 0, {
|
|
761
|
+
message: "At least one localized value is required"
|
|
762
|
+
})
|
|
763
|
+
]);
|
|
764
|
+
var agentNameSchema = z.string().min(1).refine((name) => name !== "." && name !== "..", {
|
|
765
|
+
message: "Agent name must not be '.' or '..'"
|
|
766
|
+
});
|
|
767
|
+
var agentConfigSchema = z.object({
|
|
768
|
+
name: agentNameSchema,
|
|
769
|
+
displayName: localizedStringSchema,
|
|
770
|
+
description: localizedStringSchema.optional(),
|
|
771
|
+
welcomeMessage: localizedStringSchema.optional(),
|
|
772
|
+
welcomeSubtitle: welcomeSubtitleSchema.optional(),
|
|
773
|
+
instructions: z.string().min(1),
|
|
774
|
+
modelProviderId: z.string().min(1).optional(),
|
|
775
|
+
modelBindingId: z.string().min(1).optional(),
|
|
776
|
+
reasoningEffort: z.enum(REASONING_EFFORTS).optional(),
|
|
777
|
+
fastMode: z.boolean().optional(),
|
|
778
|
+
userSelectableModelBindingIds: z.array(z.string().min(1)).optional(),
|
|
779
|
+
modelReasoningEfforts: z.record(z.string().min(1), z.enum(REASONING_EFFORTS)).optional(),
|
|
780
|
+
maxSteps: z.number().int().positive().optional(),
|
|
781
|
+
toolNames: z.array(z.string().min(1)).default([]),
|
|
782
|
+
skillNames: z.array(skillNameSchema).default([]),
|
|
783
|
+
knowledgeBases: z.array(z.string().min(1)).refine((names) => new Set(names).size === names.length, {
|
|
784
|
+
message: "A Knowledge Base is listed once"
|
|
785
|
+
}).optional(),
|
|
786
|
+
initialPrompts: z.array(
|
|
787
|
+
z.object({
|
|
788
|
+
title: localizedStringSchema,
|
|
789
|
+
prompt: localizedStringSchema
|
|
790
|
+
})
|
|
791
|
+
).default([])
|
|
792
|
+
});
|
|
793
|
+
var WORKFLOW_NAME_PATTERN = /^[a-z][a-z0-9_-]{0,62}$/u;
|
|
794
|
+
var WORKFLOW_NAME_RULE = "A Workflow id starts with a lowercase letter and holds lowercase letters, digits, '_' and '-', at most 63 characters";
|
|
795
|
+
var workflowConfigSchema = z.strictObject({
|
|
796
|
+
name: z.string(),
|
|
797
|
+
manifest: z.looseObject({
|
|
798
|
+
id: z.string(),
|
|
799
|
+
name: z.string().min(1),
|
|
800
|
+
description: z.string().optional()
|
|
801
|
+
}),
|
|
802
|
+
files: z.array(z.strictObject({ path: z.string(), content: z.string() })).optional()
|
|
803
|
+
});
|
|
804
|
+
|
|
805
|
+
// src/skill-markdown.ts
|
|
806
|
+
import yaml from "js-yaml";
|
|
807
|
+
|
|
808
|
+
// src/yaml-data.ts
|
|
809
|
+
import { JSON_SCHEMA, YAMLException, load } from "js-yaml";
|
|
810
|
+
var YAML_DATA_MAX_VALUES = 1e5;
|
|
811
|
+
function isStorableText(text) {
|
|
812
|
+
return !text.includes("\0") && !/\p{Surrogate}/u.test(text);
|
|
813
|
+
}
|
|
814
|
+
function checkStorableTexts(value, maxValues) {
|
|
815
|
+
const pending = [value];
|
|
816
|
+
for (let seen = 1; pending.length > 0; seen += 1) {
|
|
817
|
+
if (seen > maxValues) return "too_large";
|
|
818
|
+
const next = pending.pop();
|
|
819
|
+
if (typeof next === "string") {
|
|
820
|
+
if (!isStorableText(next)) return "unstorable";
|
|
821
|
+
} else if (Array.isArray(next)) {
|
|
822
|
+
for (const entry of next) pending.push(entry);
|
|
823
|
+
} else if (typeof next === "object" && next !== null) {
|
|
824
|
+
for (const [key, entry] of Object.entries(next)) {
|
|
825
|
+
if (!isStorableText(key)) return "unstorable";
|
|
826
|
+
pending.push(entry);
|
|
827
|
+
}
|
|
828
|
+
}
|
|
829
|
+
}
|
|
830
|
+
return "storable";
|
|
831
|
+
}
|
|
832
|
+
function readYamlData(text, file, options = {}) {
|
|
833
|
+
const fail = (code, message, line, column) => ({
|
|
834
|
+
ok: false,
|
|
835
|
+
issue: {
|
|
836
|
+
code,
|
|
837
|
+
message,
|
|
838
|
+
...line === void 0 ? {} : { line },
|
|
839
|
+
...column === void 0 ? {} : { column }
|
|
840
|
+
}
|
|
841
|
+
});
|
|
842
|
+
let value;
|
|
843
|
+
try {
|
|
844
|
+
value = load(text, { schema: JSON_SCHEMA, filename: file });
|
|
845
|
+
} catch (error) {
|
|
846
|
+
if (error instanceof YAMLException) {
|
|
847
|
+
const markLine = error.mark?.line;
|
|
848
|
+
const line = markLine === void 0 ? void 0 : markLine + 1;
|
|
849
|
+
const markColumn = error.mark?.column;
|
|
850
|
+
const column = markColumn === void 0 ? void 0 : markColumn + 1;
|
|
851
|
+
return error.reason.startsWith("nesting exceeded") ? fail("yaml_too_deep", `'${file}' ${error.reason}.`, line) : fail("yaml_invalid", `'${file}' is not valid YAML: ${error.reason}.`, line, column);
|
|
852
|
+
}
|
|
853
|
+
throw error;
|
|
854
|
+
}
|
|
855
|
+
if (options.refuseAliases && yamlValueIssue(value) === "alias") {
|
|
856
|
+
return fail("yaml_alias", `'${file}' is not read: ${yamlValueIssueSentence("alias")}.`);
|
|
857
|
+
}
|
|
858
|
+
const texts = checkStorableTexts(value, YAML_DATA_MAX_VALUES);
|
|
859
|
+
if (texts === "too_large") {
|
|
860
|
+
return fail(
|
|
861
|
+
"yaml_too_large",
|
|
862
|
+
`'${file}' holds more than ${YAML_DATA_MAX_VALUES} values once its aliases are followed (YAML_DATA_MAX_VALUES).`
|
|
863
|
+
);
|
|
864
|
+
}
|
|
865
|
+
if (texts === "unstorable") {
|
|
866
|
+
return fail(
|
|
867
|
+
"text_invalid",
|
|
868
|
+
`'${file}' holds a NUL character or half of a surrogate pair, which cannot be stored.`
|
|
869
|
+
);
|
|
870
|
+
}
|
|
871
|
+
return { ok: true, value };
|
|
872
|
+
}
|
|
873
|
+
var YamlDataError = class extends Error {
|
|
874
|
+
issue;
|
|
875
|
+
constructor(issue) {
|
|
876
|
+
super(issue.message);
|
|
877
|
+
this.name = "YamlDataError";
|
|
878
|
+
this.issue = issue;
|
|
879
|
+
}
|
|
880
|
+
};
|
|
881
|
+
function loadYamlData(text, file) {
|
|
882
|
+
const read = readYamlData(text, file);
|
|
883
|
+
if (!read.ok) throw new YamlDataError(read.issue);
|
|
884
|
+
return read.value;
|
|
885
|
+
}
|
|
886
|
+
|
|
887
|
+
// src/skill-markdown.ts
|
|
888
|
+
var SkillMarkdownError = class extends Error {
|
|
889
|
+
details;
|
|
890
|
+
reason;
|
|
891
|
+
constructor(message, details, reason) {
|
|
892
|
+
super(message);
|
|
893
|
+
this.name = "SkillMarkdownError";
|
|
894
|
+
this.details = details;
|
|
895
|
+
this.reason = reason;
|
|
896
|
+
}
|
|
897
|
+
};
|
|
898
|
+
function parseSkillMarkdown(contents, skillFile, skillPath) {
|
|
899
|
+
const match = /^---\r?\n([\s\S]*?)\r?\n---\r?\n?([\s\S]*)$/u.exec(contents);
|
|
900
|
+
if (!match) {
|
|
901
|
+
throw new SkillMarkdownError(`Skill file '${skillFile}' must start with YAML frontmatter`);
|
|
902
|
+
}
|
|
903
|
+
const frontmatterRaw = loadFrontmatter(match[1] ?? "", skillFile);
|
|
904
|
+
if (yamlValueIssue(frontmatterRaw, SKILL_FRONTMATTER_MAX_DEPTH) === "depth") {
|
|
905
|
+
throw new SkillMarkdownError(
|
|
906
|
+
`Skill file '${skillFile}' frontmatter is not read: ${yamlValueIssueSentence("depth", SKILL_FRONTMATTER_MAX_DEPTH)}`,
|
|
907
|
+
void 0,
|
|
908
|
+
"skill_frontmatter_too_deep"
|
|
909
|
+
);
|
|
910
|
+
}
|
|
911
|
+
const frontmatter = skillFileFrontmatterSchema.safeParse(frontmatterRaw);
|
|
912
|
+
if (!frontmatter.success) {
|
|
913
|
+
throw new SkillMarkdownError(`Skill file '${skillFile}' frontmatter is invalid`, {
|
|
914
|
+
issues: frontmatter.error.issues
|
|
915
|
+
});
|
|
916
|
+
}
|
|
917
|
+
const content = (match[2] ?? "").trim();
|
|
918
|
+
const { name: named, title, description, summary, starters, ...others } = frontmatter.data;
|
|
919
|
+
const name = named ?? deriveSkillName(skillPath);
|
|
920
|
+
const json = JSON.stringify(others);
|
|
921
|
+
if (json.length > SKILL_FRONTMATTER_MAX_BYTES) {
|
|
922
|
+
throw new SkillMarkdownError(
|
|
923
|
+
`Skill file '${skillFile}' holds ${json.length} characters of frontmatter beside the fields of the skill (${SKILL_FRONTMATTER_FIELDS.join(", ")}). It holds at most ${SKILL_FRONTMATTER_MAX_BYTES} (SKILL_FRONTMATTER_MAX_BYTES)`,
|
|
924
|
+
void 0,
|
|
925
|
+
"skill_frontmatter_too_large"
|
|
926
|
+
);
|
|
927
|
+
}
|
|
928
|
+
const kept = JSON.parse(json);
|
|
929
|
+
return {
|
|
930
|
+
name,
|
|
931
|
+
title: title ?? deriveSkillTitle(name, content),
|
|
932
|
+
description,
|
|
933
|
+
...summary === void 0 ? {} : { summary },
|
|
934
|
+
...starters === void 0 ? {} : { starters },
|
|
935
|
+
content,
|
|
936
|
+
...Object.keys(others).length > 0 ? { frontmatter: kept } : {}
|
|
937
|
+
};
|
|
938
|
+
}
|
|
939
|
+
function loadFrontmatter(text, skillFile) {
|
|
940
|
+
const read = readYamlData(text, skillFile, { refuseAliases: true });
|
|
941
|
+
if (read.ok) return read.value;
|
|
942
|
+
const { issue } = read;
|
|
943
|
+
if (issue.code === "yaml_alias") {
|
|
944
|
+
throw new SkillMarkdownError(
|
|
945
|
+
`Skill file '${skillFile}' frontmatter is not read: ${yamlValueIssueSentence("alias")}`,
|
|
946
|
+
void 0,
|
|
947
|
+
"skill_frontmatter_alias"
|
|
948
|
+
);
|
|
949
|
+
}
|
|
950
|
+
if (issue.code === "yaml_too_deep") {
|
|
951
|
+
throw new SkillMarkdownError(
|
|
952
|
+
`Skill file '${skillFile}' frontmatter is not read: ${yamlValueIssueSentence("depth", SKILL_FRONTMATTER_MAX_DEPTH)}`,
|
|
953
|
+
void 0,
|
|
954
|
+
"skill_frontmatter_too_deep"
|
|
955
|
+
);
|
|
956
|
+
}
|
|
957
|
+
if (issue.code !== "yaml_invalid" || issue.line === void 0 || issue.column === void 0) {
|
|
958
|
+
throw new SkillMarkdownError(`Skill file '${skillFile}' frontmatter: ${issue.message}`);
|
|
959
|
+
}
|
|
960
|
+
const line = issue.line + 1;
|
|
961
|
+
const { column } = issue;
|
|
962
|
+
throw new SkillMarkdownError(
|
|
963
|
+
`Skill file '${skillFile}' frontmatter is not valid YAML at line ${line}, column ${column}: ${issue.message} A value that holds a colon and a space, as a description often does, is written in quotes: description: "Use this when: the user asks"`,
|
|
964
|
+
{ issues: [{ message: issue.message, path: [], line, column }] }
|
|
965
|
+
);
|
|
966
|
+
}
|
|
967
|
+
function deriveSkillTitle(name, content) {
|
|
968
|
+
let fence;
|
|
969
|
+
for (const line of content.split(/\r?\n/u)) {
|
|
970
|
+
const marker = /^\s{0,3}(`{3,}|~{3,})/u.exec(line)?.[1];
|
|
971
|
+
if (marker) {
|
|
972
|
+
fence = fence === void 0 ? marker : marker.startsWith(fence) ? void 0 : fence;
|
|
973
|
+
continue;
|
|
974
|
+
}
|
|
975
|
+
const heading = fence === void 0 ? /^ {0,3}#{1,6}\s+(.+?)(?:\s+#+)?\s*$/u.exec(line) : null;
|
|
976
|
+
if (heading?.[1]) return heading[1];
|
|
977
|
+
}
|
|
978
|
+
const words = name.replace(/[-_]+/gu, " ").trim();
|
|
979
|
+
return words === "" ? name : words.charAt(0).toUpperCase() + words.slice(1);
|
|
980
|
+
}
|
|
981
|
+
function formatSkillMarkdown(skill) {
|
|
982
|
+
const content = skill.content.trim();
|
|
983
|
+
const frontmatter = yaml.dump(
|
|
984
|
+
{
|
|
985
|
+
name: skill.name,
|
|
986
|
+
...skill.title === deriveSkillTitle(skill.name, content) ? {} : { title: skill.title },
|
|
987
|
+
description: skill.description,
|
|
988
|
+
...skill.summary === void 0 ? {} : { summary: skill.summary },
|
|
989
|
+
...skill.starters === void 0 ? {} : { starters: skill.starters },
|
|
990
|
+
...skill.frontmatter
|
|
991
|
+
},
|
|
992
|
+
{ lineWidth: -1, noCompatMode: true, noRefs: true, sortKeys: false }
|
|
993
|
+
);
|
|
994
|
+
return `---
|
|
995
|
+
${frontmatter}---
|
|
996
|
+
|
|
997
|
+
${content}
|
|
998
|
+
`;
|
|
999
|
+
}
|
|
1000
|
+
function deriveSkillName(skillPath) {
|
|
1001
|
+
const filename = lastSegment(skillPath);
|
|
1002
|
+
const sourceName = filename.toLowerCase() === "skill.md" ? lastSegment(parentPath(skillPath)) : withoutExtension(filename);
|
|
1003
|
+
return sourceName.trim().toLowerCase().replace(/[^a-z0-9]+/gu, "_").replace(/^_+|_+$/gu, "");
|
|
1004
|
+
}
|
|
1005
|
+
function withoutTrailingSeparators(path) {
|
|
1006
|
+
let end = path.length;
|
|
1007
|
+
while (end > 0 && path[end - 1] === "/") {
|
|
1008
|
+
end -= 1;
|
|
1009
|
+
}
|
|
1010
|
+
return path.slice(0, end);
|
|
1011
|
+
}
|
|
1012
|
+
function lastSegment(path) {
|
|
1013
|
+
const trimmed = withoutTrailingSeparators(path);
|
|
1014
|
+
return trimmed.slice(trimmed.lastIndexOf("/") + 1);
|
|
1015
|
+
}
|
|
1016
|
+
function parentPath(path) {
|
|
1017
|
+
const trimmed = withoutTrailingSeparators(path);
|
|
1018
|
+
return trimmed.slice(0, Math.max(trimmed.lastIndexOf("/"), 0));
|
|
1019
|
+
}
|
|
1020
|
+
function withoutExtension(filename) {
|
|
1021
|
+
const dot = filename.lastIndexOf(".");
|
|
1022
|
+
return dot > 0 ? filename.slice(0, dot) : filename;
|
|
1023
|
+
}
|
|
1024
|
+
export {
|
|
1025
|
+
ACCESS_SOURCES,
|
|
1026
|
+
ACTIONS,
|
|
1027
|
+
ACTIVE_AGENT_RUN_STATUSES,
|
|
1028
|
+
ADMINISTERED_USER_STATUSES,
|
|
1029
|
+
AGENT_AVAILABILITY_MODES,
|
|
1030
|
+
AGENT_EDITABLE_FIELDS,
|
|
1031
|
+
AGENT_RUN_FAILURE_CATEGORIES,
|
|
1032
|
+
AGENT_RUN_STATUSES,
|
|
1033
|
+
AGENT_STARTERS_MAX,
|
|
1034
|
+
API_CREDENTIAL_SCOPES,
|
|
1035
|
+
APPROVAL_CHECK_FAILURE_OUTCOMES,
|
|
1036
|
+
APPROVAL_CHECK_STATUSES,
|
|
1037
|
+
APPROVAL_EXECUTIONS,
|
|
1038
|
+
APPROVAL_REQUEST_STATUSES,
|
|
1039
|
+
APP_ACTION_CALL_STATUSES,
|
|
1040
|
+
APP_ERROR_CODES,
|
|
1041
|
+
APP_ERROR_STATUS_CODES,
|
|
1042
|
+
APP_MODES,
|
|
1043
|
+
ARTIFACT_PREVIEW_IMAGE_FORMATS,
|
|
1044
|
+
ARTIFACT_PREVIEW_IMAGE_MIME_TYPES,
|
|
1045
|
+
ARTIFACT_PREVIEW_STATUSES,
|
|
1046
|
+
ASSET_LIFECYCLES,
|
|
1047
|
+
ASSET_NAME_REFUSAL_REASONS,
|
|
1048
|
+
ASSET_OWNER_KINDS,
|
|
1049
|
+
ASSET_REPO_BUNDLE_KINDS,
|
|
1050
|
+
ASSET_REPRESENTATIONS,
|
|
1051
|
+
ASSET_SYNC_CHANGE_TYPES,
|
|
1052
|
+
ATTACHMENT_CREATE_OUTCOMES,
|
|
1053
|
+
AUDIT_ACTOR_KINDS,
|
|
1054
|
+
AUDIT_EVENT_STATUSES,
|
|
1055
|
+
AUDIT_OUTCOMES,
|
|
1056
|
+
AUDIT_TIERS,
|
|
1057
|
+
AUTH_PRINCIPAL_KINDS,
|
|
1058
|
+
AUTH_SCOPE_WILDCARD,
|
|
1059
|
+
CHAT_MESSAGE_ROLES,
|
|
1060
|
+
CHAT_SESSION_AUTH_SCOPES,
|
|
1061
|
+
COLLABORATION_WORKSPACE_KINDS,
|
|
1062
|
+
CONFIG_ASSET_CHANGE_OPERATIONS,
|
|
1063
|
+
CONFIG_ASSET_KINDS,
|
|
1064
|
+
CONNECTION_EXPOSURES,
|
|
1065
|
+
CONNECTION_HEALTH_STATES,
|
|
1066
|
+
CONNECTION_NAME_MAX_LENGTH,
|
|
1067
|
+
CONNECTION_NAME_PATTERN,
|
|
1068
|
+
CONNECTION_NETWORKS,
|
|
1069
|
+
CONNECTION_OPERATION_POLICIES,
|
|
1070
|
+
CONNECTION_OPERATION_STATUSES,
|
|
1071
|
+
CONNECTION_ORIGINS,
|
|
1072
|
+
CONNECTION_SECRET_STATES,
|
|
1073
|
+
CONNECTOR_TEST_STATUSES,
|
|
1074
|
+
CONVERSATION_ATTACHMENT_STATUSES,
|
|
1075
|
+
CONVERSATION_VISIBILITIES,
|
|
1076
|
+
DATABASE_RELATION_TYPES,
|
|
1077
|
+
DATA_STORE_CONDITIONS,
|
|
1078
|
+
DATA_STORE_INSERT_CONFLICT_MODES,
|
|
1079
|
+
DATA_STORE_LOAD_CONFLICT_MODES,
|
|
1080
|
+
DATA_STORE_MIGRATION_OUTCOMES,
|
|
1081
|
+
DATA_STORE_SCALAR_TYPES,
|
|
1082
|
+
DATA_STORE_STATUSES,
|
|
1083
|
+
DECIDED_APPROVAL_REQUEST_STATUSES,
|
|
1084
|
+
DELETION_STATES,
|
|
1085
|
+
ENDED_AGENT_RUN_STATUSES,
|
|
1086
|
+
ENDED_APPROVAL_EXECUTIONS,
|
|
1087
|
+
FAILED_JOB_STATUSES,
|
|
1088
|
+
FIRST_PARTY_AUTH_SCOPES,
|
|
1089
|
+
GRANT_EFFECTS,
|
|
1090
|
+
GRANT_HOLDER_KINDS,
|
|
1091
|
+
GRANT_SCOPE_KINDS,
|
|
1092
|
+
GUARDRAIL_HIT_OUTCOMES,
|
|
1093
|
+
GUARDRAIL_NAME_MAX_LENGTH,
|
|
1094
|
+
GUARDRAIL_NAME_PATTERN,
|
|
1095
|
+
GUARDRAIL_OUTCOMES,
|
|
1096
|
+
IDEMPOTENCY_KEY_MAX_LENGTH,
|
|
1097
|
+
INFRASTRUCTURE_SECRET_STATES,
|
|
1098
|
+
INFRASTRUCTURE_WITHHELD_FIELDS,
|
|
1099
|
+
JOB_STATUSES,
|
|
1100
|
+
KNOWLEDGE_BASE_STATUSES,
|
|
1101
|
+
KNOWLEDGE_CHECK_STATUSES,
|
|
1102
|
+
LISTED_DATA_STORE_STATUSES,
|
|
1103
|
+
LIVE_JOB_STATUSES,
|
|
1104
|
+
MESSAGE_FINISH_STATUSES,
|
|
1105
|
+
MODEL_PROVIDER_AUTH_MODES,
|
|
1106
|
+
MODEL_USAGE_EVENT_STATUSES,
|
|
1107
|
+
MODEL_USAGE_SOURCES,
|
|
1108
|
+
MODEL_USAGE_TIERS,
|
|
1109
|
+
NAMESPACE_PREFIX_MAX_LENGTH,
|
|
1110
|
+
NAMESPACE_PREFIX_MIN_LENGTH,
|
|
1111
|
+
NAMESPACE_PREFIX_PATTERN,
|
|
1112
|
+
NOTIFY_CHANNELS,
|
|
1113
|
+
OPENAI_COMPATIBLE_APIS,
|
|
1114
|
+
OPERATIONS_AUDIENCES,
|
|
1115
|
+
OPERATION_CONFIRMATION_DECISIONS,
|
|
1116
|
+
OPERATION_DENIAL_REASONS,
|
|
1117
|
+
OPERATION_EFFECTS,
|
|
1118
|
+
OPERATION_ORIGIN_KINDS,
|
|
1119
|
+
OPERATION_RUN_DECISION_MODES,
|
|
1120
|
+
OPERATION_RUN_DECISION_REASONS,
|
|
1121
|
+
OPERATION_RUN_STATUSES,
|
|
1122
|
+
OPERATION_TARGETS,
|
|
1123
|
+
POLICY_VALUES,
|
|
1124
|
+
PRINCIPAL_HOLDER_KINDS,
|
|
1125
|
+
PROVIDER_CHECK_ERROR_CLASSES,
|
|
1126
|
+
PROVIDER_PORTS,
|
|
1127
|
+
PROVIDER_REGIONS,
|
|
1128
|
+
READING_POLICY_VALUES,
|
|
1129
|
+
REASONING_EFFORTS,
|
|
1130
|
+
SERVICE_PRINCIPAL_PERMISSIONS,
|
|
1131
|
+
SERVICE_PRINCIPAL_STATUSES,
|
|
1132
|
+
SKILL_CHANGE_TYPES,
|
|
1133
|
+
SKILL_FRONTMATTER_FIELDS,
|
|
1134
|
+
SKILL_FRONTMATTER_MAX_BYTES,
|
|
1135
|
+
SKILL_FRONTMATTER_MAX_DEPTH,
|
|
1136
|
+
SKILL_NAME_PATTERN,
|
|
1137
|
+
SKILL_NAME_RULE,
|
|
1138
|
+
SKILL_ORIGINS,
|
|
1139
|
+
SKILL_PORTABLE_DESCRIPTION_MAX_CHARS,
|
|
1140
|
+
SKILL_PORTABLE_NAME_MAX_CHARS,
|
|
1141
|
+
SKILL_RESOURCE_MEDIA_TYPES,
|
|
1142
|
+
SKILL_STARTERS_MAX,
|
|
1143
|
+
SKILL_STARTER_LINE_MAX_LENGTH,
|
|
1144
|
+
SKILL_SUMMARY_MAX_LENGTH,
|
|
1145
|
+
STRUCTURED_DATA_REVIEW_REASONS,
|
|
1146
|
+
SUPPORTED_IMAGE_MIME_TYPES,
|
|
1147
|
+
SkillMarkdownError,
|
|
1148
|
+
THEME_MODES,
|
|
1149
|
+
THEME_MODE_PREFERENCES,
|
|
1150
|
+
TOOL_CALL_STATES,
|
|
1151
|
+
TOOL_DECISION_MODES,
|
|
1152
|
+
TOOL_DECISION_OUTCOMES,
|
|
1153
|
+
TOOL_DISPLAY_MODES,
|
|
1154
|
+
TOOL_GROUPS,
|
|
1155
|
+
TOOL_INPUT_PARSE_ERROR_CODES,
|
|
1156
|
+
USAGE_COST_STATUSES,
|
|
1157
|
+
USER_STATUSES,
|
|
1158
|
+
WAITING_OPERATION_RUN_STATUSES,
|
|
1159
|
+
WEB_SOURCE_PROVIDERS,
|
|
1160
|
+
WORKFLOW_ENDED_STATUSES,
|
|
1161
|
+
WORKFLOW_NAME_PATTERN,
|
|
1162
|
+
WORKFLOW_NAME_RULE,
|
|
1163
|
+
WORKFLOW_RESERVED_STEP_TYPES,
|
|
1164
|
+
WORKFLOW_RUN_MODES,
|
|
1165
|
+
WORKFLOW_RUN_STATUSES,
|
|
1166
|
+
WORKFLOW_STEP_RUN_STATUSES,
|
|
1167
|
+
WORKFLOW_STEP_TYPES,
|
|
1168
|
+
WORKFLOW_TRIGGER_KINDS,
|
|
1169
|
+
WORKSPACE_ACCENT_COLORS,
|
|
1170
|
+
WORKSPACE_ACCESS_STATES,
|
|
1171
|
+
WORKSPACE_COMMAND_STATUSES,
|
|
1172
|
+
WORKSPACE_FILE_KINDS,
|
|
1173
|
+
WORKSPACE_MEMBERSHIP_ROLES,
|
|
1174
|
+
WORKSPACE_SECTIONS,
|
|
1175
|
+
WORKSPACE_VISIBILITIES,
|
|
1176
|
+
YAML_DATA_MAX_VALUES,
|
|
1177
|
+
YamlDataError,
|
|
1178
|
+
agentConfigSchema,
|
|
1179
|
+
checkStorableTexts,
|
|
1180
|
+
deriveSkillTitle,
|
|
1181
|
+
formatSkillMarkdown,
|
|
1182
|
+
isStorableText,
|
|
1183
|
+
loadYamlData,
|
|
1184
|
+
localeCodes,
|
|
1185
|
+
localizedStringSchema,
|
|
1186
|
+
parseSkillMarkdown,
|
|
1187
|
+
readYamlData,
|
|
1188
|
+
skillConfigSchema,
|
|
1189
|
+
skillFileEntrySchema,
|
|
1190
|
+
skillFileFrontmatterSchema,
|
|
1191
|
+
skillNameSchema,
|
|
1192
|
+
skillPortabilityIssues,
|
|
1193
|
+
skillResourceConfigSchema,
|
|
1194
|
+
skillResourceMediaTypeForPath,
|
|
1195
|
+
skillResourcePathSchema,
|
|
1196
|
+
skillStarterSchema,
|
|
1197
|
+
workflowConfigSchema,
|
|
1198
|
+
yamlValueIssue,
|
|
1199
|
+
yamlValueIssueSentence
|
|
1200
|
+
};
|