@peac/schema 0.10.9 → 0.10.10
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 +1 -1
- package/dist/attestation-receipt.cjs +127 -0
- package/dist/attestation-receipt.cjs.map +1 -0
- package/dist/attestation-receipt.mjs +113 -0
- package/dist/attestation-receipt.mjs.map +1 -0
- package/dist/attribution.cjs +249 -0
- package/dist/attribution.cjs.map +1 -0
- package/dist/attribution.mjs +227 -0
- package/dist/attribution.mjs.map +1 -0
- package/dist/dispute.d.ts.map +1 -1
- package/dist/index.cjs +2818 -0
- package/dist/index.cjs.map +1 -0
- package/dist/index.mjs +2577 -0
- package/dist/index.mjs.map +1 -0
- package/dist/interaction.cjs +619 -0
- package/dist/interaction.cjs.map +1 -0
- package/dist/interaction.mjs +583 -0
- package/dist/interaction.mjs.map +1 -0
- package/dist/normalize.cjs +84 -0
- package/dist/normalize.cjs.map +1 -0
- package/dist/normalize.d.ts +15 -9
- package/dist/normalize.d.ts.map +1 -1
- package/dist/normalize.mjs +82 -0
- package/dist/normalize.mjs.map +1 -0
- package/dist/receipt-parser.cjs +333 -0
- package/dist/receipt-parser.cjs.map +1 -0
- package/dist/receipt-parser.mjs +331 -0
- package/dist/receipt-parser.mjs.map +1 -0
- package/dist/workflow.cjs +321 -0
- package/dist/workflow.cjs.map +1 -0
- package/dist/workflow.mjs +292 -0
- package/dist/workflow.mjs.map +1 -0
- package/package.json +50 -6
- package/dist/agent-identity.js +0 -357
- package/dist/agent-identity.js.map +0 -1
- package/dist/attestation-receipt.js +0 -249
- package/dist/attestation-receipt.js.map +0 -1
- package/dist/attribution.js +0 -444
- package/dist/attribution.js.map +0 -1
- package/dist/constants.js +0 -73
- package/dist/constants.js.map +0 -1
- package/dist/control.js +0 -9
- package/dist/control.js.map +0 -1
- package/dist/dispute.js +0 -832
- package/dist/dispute.js.map +0 -1
- package/dist/envelope.js +0 -9
- package/dist/envelope.js.map +0 -1
- package/dist/errors.js +0 -116
- package/dist/errors.js.map +0 -1
- package/dist/evidence.js +0 -8
- package/dist/evidence.js.map +0 -1
- package/dist/index.js +0 -283
- package/dist/index.js.map +0 -1
- package/dist/interaction.js +0 -918
- package/dist/interaction.js.map +0 -1
- package/dist/json.js +0 -267
- package/dist/json.js.map +0 -1
- package/dist/normalize.js +0 -103
- package/dist/normalize.js.map +0 -1
- package/dist/obligations.js +0 -337
- package/dist/obligations.js.map +0 -1
- package/dist/purpose.js +0 -296
- package/dist/purpose.js.map +0 -1
- package/dist/receipt-parser.js +0 -89
- package/dist/receipt-parser.js.map +0 -1
- package/dist/schemas.js +0 -7
- package/dist/schemas.js.map +0 -1
- package/dist/subject.js +0 -9
- package/dist/subject.js.map +0 -1
- package/dist/types.js +0 -6
- package/dist/types.js.map +0 -1
- package/dist/validators.js +0 -421
- package/dist/validators.js.map +0 -1
- package/dist/version.js +0 -7
- package/dist/version.js.map +0 -1
- package/dist/workflow.js +0 -523
- package/dist/workflow.js.map +0 -1
|
@@ -0,0 +1,292 @@
|
|
|
1
|
+
import { z } from 'zod';
|
|
2
|
+
|
|
3
|
+
// src/workflow.ts
|
|
4
|
+
var WORKFLOW_EXTENSION_KEY = "org.peacprotocol/workflow";
|
|
5
|
+
var WORKFLOW_SUMMARY_TYPE = "peac/workflow-summary";
|
|
6
|
+
var WORKFLOW_STATUSES = ["in_progress", "completed", "failed", "cancelled"];
|
|
7
|
+
var WELL_KNOWN_FRAMEWORKS = [
|
|
8
|
+
"mcp",
|
|
9
|
+
"a2a",
|
|
10
|
+
"crewai",
|
|
11
|
+
"langgraph",
|
|
12
|
+
"autogen",
|
|
13
|
+
"custom"
|
|
14
|
+
];
|
|
15
|
+
var ORCHESTRATION_FRAMEWORKS = WELL_KNOWN_FRAMEWORKS;
|
|
16
|
+
var FRAMEWORK_ID_PATTERN = /^[a-z][a-z0-9_-]*$/;
|
|
17
|
+
var WORKFLOW_LIMITS = {
|
|
18
|
+
/** Maximum parent steps per step (DAG fan-in) */
|
|
19
|
+
maxParentSteps: 16,
|
|
20
|
+
/** Maximum workflow ID length */
|
|
21
|
+
maxWorkflowIdLength: 128,
|
|
22
|
+
/** Maximum step ID length */
|
|
23
|
+
maxStepIdLength: 128,
|
|
24
|
+
/** Maximum tool name length */
|
|
25
|
+
maxToolNameLength: 256,
|
|
26
|
+
/** Maximum framework identifier length */
|
|
27
|
+
maxFrameworkLength: 64,
|
|
28
|
+
/** Maximum agents in a workflow summary */
|
|
29
|
+
maxAgentsInvolved: 100,
|
|
30
|
+
/** Maximum receipt refs in a workflow summary */
|
|
31
|
+
maxReceiptRefs: 1e4,
|
|
32
|
+
/** Maximum error message length */
|
|
33
|
+
maxErrorMessageLength: 1024
|
|
34
|
+
};
|
|
35
|
+
var WORKFLOW_ID_PATTERN = /^wf_[a-zA-Z0-9_-]{20,48}$/;
|
|
36
|
+
var STEP_ID_PATTERN = /^step_[a-zA-Z0-9_-]{20,48}$/;
|
|
37
|
+
var WorkflowIdSchema = z.string().regex(WORKFLOW_ID_PATTERN, "Invalid workflow ID format (expected wf_{ulid|uuid})").max(WORKFLOW_LIMITS.maxWorkflowIdLength);
|
|
38
|
+
var StepIdSchema = z.string().regex(STEP_ID_PATTERN, "Invalid step ID format (expected step_{ulid|uuid})").max(WORKFLOW_LIMITS.maxStepIdLength);
|
|
39
|
+
var WorkflowStatusSchema = z.enum(WORKFLOW_STATUSES);
|
|
40
|
+
var OrchestrationFrameworkSchema = z.string().regex(
|
|
41
|
+
FRAMEWORK_ID_PATTERN,
|
|
42
|
+
"Invalid framework identifier (must be lowercase alphanumeric with hyphens/underscores, starting with a letter)"
|
|
43
|
+
).max(WORKFLOW_LIMITS.maxFrameworkLength);
|
|
44
|
+
var WorkflowContextSchema = z.object({
|
|
45
|
+
// Correlation
|
|
46
|
+
/** Globally unique workflow/run ID */
|
|
47
|
+
workflow_id: WorkflowIdSchema,
|
|
48
|
+
/** This step's unique ID */
|
|
49
|
+
step_id: StepIdSchema,
|
|
50
|
+
/** DAG parent step IDs (empty array for root step) */
|
|
51
|
+
parent_step_ids: z.array(StepIdSchema).max(WORKFLOW_LIMITS.maxParentSteps).default([]),
|
|
52
|
+
// Orchestration identity
|
|
53
|
+
/** Agent identity ref of the orchestrator (optional) */
|
|
54
|
+
orchestrator_id: z.string().max(256).optional(),
|
|
55
|
+
/** Receipt ID that initiated this workflow (optional) */
|
|
56
|
+
orchestrator_receipt_ref: z.string().max(256).optional(),
|
|
57
|
+
// Sequencing (for linear workflows)
|
|
58
|
+
/** 0-based position in sequential runs (optional) */
|
|
59
|
+
step_index: z.number().int().nonnegative().optional(),
|
|
60
|
+
/** Total steps if known upfront (optional) */
|
|
61
|
+
step_total: z.number().int().positive().optional(),
|
|
62
|
+
// Metadata
|
|
63
|
+
/** Tool or skill name (MCP tool, A2A skill, etc.) */
|
|
64
|
+
tool_name: z.string().max(WORKFLOW_LIMITS.maxToolNameLength).optional(),
|
|
65
|
+
/** Orchestration framework */
|
|
66
|
+
framework: OrchestrationFrameworkSchema.optional(),
|
|
67
|
+
// Hash chain (for streaming/progressive receipts)
|
|
68
|
+
/** SHA-256 hash of previous receipt in chain (for ordering) */
|
|
69
|
+
prev_receipt_hash: z.string().regex(/^sha256:[a-f0-9]{64}$/).optional()
|
|
70
|
+
}).strict();
|
|
71
|
+
var WorkflowErrorContextSchema = z.object({
|
|
72
|
+
/** Step ID where failure occurred */
|
|
73
|
+
failed_step_id: StepIdSchema,
|
|
74
|
+
/** Error code (E_* format preferred) */
|
|
75
|
+
error_code: z.string().max(64),
|
|
76
|
+
/** Human-readable error message */
|
|
77
|
+
error_message: z.string().max(WORKFLOW_LIMITS.maxErrorMessageLength)
|
|
78
|
+
}).strict();
|
|
79
|
+
var WorkflowSummaryEvidenceSchema = z.object({
|
|
80
|
+
/** Workflow ID this summary describes */
|
|
81
|
+
workflow_id: WorkflowIdSchema,
|
|
82
|
+
/** Workflow status */
|
|
83
|
+
status: WorkflowStatusSchema,
|
|
84
|
+
/** When the workflow started (ISO 8601) */
|
|
85
|
+
started_at: z.string().datetime(),
|
|
86
|
+
/** When the workflow completed (ISO 8601, undefined if in_progress) */
|
|
87
|
+
completed_at: z.string().datetime().optional(),
|
|
88
|
+
// Receipt commitment
|
|
89
|
+
/** Ordered list of receipt IDs (for small workflows) */
|
|
90
|
+
receipt_refs: z.array(z.string().max(256)).max(WORKFLOW_LIMITS.maxReceiptRefs).optional(),
|
|
91
|
+
/** Merkle root of receipt digests (for large workflows, RFC 6962 style) */
|
|
92
|
+
receipt_merkle_root: z.string().regex(/^sha256:[a-f0-9]{64}$/).optional(),
|
|
93
|
+
/** Total receipt count (required if using Merkle root) */
|
|
94
|
+
receipt_count: z.number().int().nonnegative().optional(),
|
|
95
|
+
// Orchestration
|
|
96
|
+
/** Agent identity ref of the orchestrator */
|
|
97
|
+
orchestrator_id: z.string().max(256),
|
|
98
|
+
/** List of agent IDs involved in the workflow */
|
|
99
|
+
agents_involved: z.array(z.string().max(256)).max(WORKFLOW_LIMITS.maxAgentsInvolved),
|
|
100
|
+
// Outcome
|
|
101
|
+
/** SHA-256 hash of final output artifact (optional) */
|
|
102
|
+
final_result_hash: z.string().regex(/^sha256:[a-f0-9]{64}$/).optional(),
|
|
103
|
+
/** Error context if workflow failed */
|
|
104
|
+
error_context: WorkflowErrorContextSchema.optional()
|
|
105
|
+
}).strict().refine(
|
|
106
|
+
(data) => {
|
|
107
|
+
return data.receipt_refs !== void 0 || data.receipt_merkle_root !== void 0;
|
|
108
|
+
},
|
|
109
|
+
{
|
|
110
|
+
message: "Workflow summary must include receipt_refs or receipt_merkle_root"
|
|
111
|
+
}
|
|
112
|
+
).refine(
|
|
113
|
+
(data) => {
|
|
114
|
+
if (data.receipt_merkle_root !== void 0 && data.receipt_count === void 0) {
|
|
115
|
+
return false;
|
|
116
|
+
}
|
|
117
|
+
return true;
|
|
118
|
+
},
|
|
119
|
+
{
|
|
120
|
+
message: "receipt_count is required when using receipt_merkle_root"
|
|
121
|
+
}
|
|
122
|
+
);
|
|
123
|
+
var WorkflowSummaryAttestationSchema = z.object({
|
|
124
|
+
/** Attestation type (must be 'peac/workflow-summary') */
|
|
125
|
+
type: z.literal(WORKFLOW_SUMMARY_TYPE),
|
|
126
|
+
/** Who issued this attestation (HTTPS URL) */
|
|
127
|
+
issuer: z.string().url().startsWith("https://"),
|
|
128
|
+
/** When this attestation was issued (ISO 8601) */
|
|
129
|
+
issued_at: z.string().datetime(),
|
|
130
|
+
/** When this attestation expires (ISO 8601, optional) */
|
|
131
|
+
expires_at: z.string().datetime().optional(),
|
|
132
|
+
/** The workflow summary evidence */
|
|
133
|
+
evidence: WorkflowSummaryEvidenceSchema
|
|
134
|
+
}).strict();
|
|
135
|
+
function validateWorkflowContextOrdered(input) {
|
|
136
|
+
if (typeof input !== "object" || input === null) {
|
|
137
|
+
return {
|
|
138
|
+
valid: false,
|
|
139
|
+
error_code: "E_WORKFLOW_CONTEXT_INVALID",
|
|
140
|
+
error: "Input must be an object"
|
|
141
|
+
};
|
|
142
|
+
}
|
|
143
|
+
const obj = input;
|
|
144
|
+
if (typeof obj.workflow_id !== "string" || !WORKFLOW_ID_PATTERN.test(obj.workflow_id) || obj.workflow_id.length > WORKFLOW_LIMITS.maxWorkflowIdLength) {
|
|
145
|
+
return {
|
|
146
|
+
valid: false,
|
|
147
|
+
error_code: "E_WORKFLOW_ID_INVALID",
|
|
148
|
+
error: "Invalid workflow ID format"
|
|
149
|
+
};
|
|
150
|
+
}
|
|
151
|
+
if (typeof obj.step_id !== "string" || !STEP_ID_PATTERN.test(obj.step_id) || obj.step_id.length > WORKFLOW_LIMITS.maxStepIdLength) {
|
|
152
|
+
return {
|
|
153
|
+
valid: false,
|
|
154
|
+
error_code: "E_WORKFLOW_STEP_ID_INVALID",
|
|
155
|
+
error: "Invalid step ID format"
|
|
156
|
+
};
|
|
157
|
+
}
|
|
158
|
+
const parentStepIds = obj.parent_step_ids;
|
|
159
|
+
if (Array.isArray(parentStepIds) && parentStepIds.length > WORKFLOW_LIMITS.maxParentSteps) {
|
|
160
|
+
return {
|
|
161
|
+
valid: false,
|
|
162
|
+
error_code: "E_WORKFLOW_LIMIT_EXCEEDED",
|
|
163
|
+
error: "Exceeds maximum parent steps"
|
|
164
|
+
};
|
|
165
|
+
}
|
|
166
|
+
if (obj.framework !== void 0) {
|
|
167
|
+
if (typeof obj.framework !== "string" || !FRAMEWORK_ID_PATTERN.test(obj.framework) || obj.framework.length > WORKFLOW_LIMITS.maxFrameworkLength) {
|
|
168
|
+
return {
|
|
169
|
+
valid: false,
|
|
170
|
+
error_code: "E_WORKFLOW_CONTEXT_INVALID",
|
|
171
|
+
error: "Invalid framework identifier grammar"
|
|
172
|
+
};
|
|
173
|
+
}
|
|
174
|
+
}
|
|
175
|
+
if (obj.prev_receipt_hash !== void 0) {
|
|
176
|
+
if (typeof obj.prev_receipt_hash !== "string" || !/^sha256:[a-f0-9]{64}$/.test(obj.prev_receipt_hash)) {
|
|
177
|
+
return {
|
|
178
|
+
valid: false,
|
|
179
|
+
error_code: "E_WORKFLOW_CONTEXT_INVALID",
|
|
180
|
+
error: "Invalid hash format"
|
|
181
|
+
};
|
|
182
|
+
}
|
|
183
|
+
}
|
|
184
|
+
if (Array.isArray(parentStepIds)) {
|
|
185
|
+
if (parentStepIds.includes(obj.step_id)) {
|
|
186
|
+
return {
|
|
187
|
+
valid: false,
|
|
188
|
+
error_code: "E_WORKFLOW_DAG_INVALID",
|
|
189
|
+
error: "Self-parent cycle detected"
|
|
190
|
+
};
|
|
191
|
+
}
|
|
192
|
+
const uniqueParents = new Set(parentStepIds);
|
|
193
|
+
if (uniqueParents.size !== parentStepIds.length) {
|
|
194
|
+
return {
|
|
195
|
+
valid: false,
|
|
196
|
+
error_code: "E_WORKFLOW_DAG_INVALID",
|
|
197
|
+
error: "Duplicate parent step IDs"
|
|
198
|
+
};
|
|
199
|
+
}
|
|
200
|
+
}
|
|
201
|
+
const result = WorkflowContextSchema.safeParse(input);
|
|
202
|
+
if (!result.success) {
|
|
203
|
+
return {
|
|
204
|
+
valid: false,
|
|
205
|
+
error_code: "E_WORKFLOW_CONTEXT_INVALID",
|
|
206
|
+
error: result.error.issues[0]?.message || "Schema validation failed"
|
|
207
|
+
};
|
|
208
|
+
}
|
|
209
|
+
return { valid: true, value: result.data };
|
|
210
|
+
}
|
|
211
|
+
function createWorkflowId(id) {
|
|
212
|
+
const workflowId = `wf_${id}`;
|
|
213
|
+
return WorkflowIdSchema.parse(workflowId);
|
|
214
|
+
}
|
|
215
|
+
function createStepId(id) {
|
|
216
|
+
const stepId = `step_${id}`;
|
|
217
|
+
return StepIdSchema.parse(stepId);
|
|
218
|
+
}
|
|
219
|
+
function validateWorkflowContext(context) {
|
|
220
|
+
return WorkflowContextSchema.parse(context);
|
|
221
|
+
}
|
|
222
|
+
function isValidWorkflowContext(context) {
|
|
223
|
+
return WorkflowContextSchema.safeParse(context).success;
|
|
224
|
+
}
|
|
225
|
+
function validateWorkflowSummaryAttestation(attestation) {
|
|
226
|
+
return WorkflowSummaryAttestationSchema.parse(attestation);
|
|
227
|
+
}
|
|
228
|
+
function isWorkflowSummaryAttestation(attestation) {
|
|
229
|
+
return WorkflowSummaryAttestationSchema.safeParse(attestation).success;
|
|
230
|
+
}
|
|
231
|
+
function isTerminalWorkflowStatus(status) {
|
|
232
|
+
return status === "completed" || status === "failed" || status === "cancelled";
|
|
233
|
+
}
|
|
234
|
+
function hasValidDagSemantics(context) {
|
|
235
|
+
if (context.parent_step_ids.includes(context.step_id)) {
|
|
236
|
+
return false;
|
|
237
|
+
}
|
|
238
|
+
const uniqueParents = new Set(context.parent_step_ids);
|
|
239
|
+
if (uniqueParents.size !== context.parent_step_ids.length) {
|
|
240
|
+
return false;
|
|
241
|
+
}
|
|
242
|
+
return true;
|
|
243
|
+
}
|
|
244
|
+
function createWorkflowContext(params) {
|
|
245
|
+
const context = {
|
|
246
|
+
workflow_id: params.workflow_id,
|
|
247
|
+
step_id: params.step_id,
|
|
248
|
+
parent_step_ids: params.parent_step_ids ?? [],
|
|
249
|
+
...params.orchestrator_id && { orchestrator_id: params.orchestrator_id },
|
|
250
|
+
...params.orchestrator_receipt_ref && {
|
|
251
|
+
orchestrator_receipt_ref: params.orchestrator_receipt_ref
|
|
252
|
+
},
|
|
253
|
+
...params.step_index !== void 0 && { step_index: params.step_index },
|
|
254
|
+
...params.step_total !== void 0 && { step_total: params.step_total },
|
|
255
|
+
...params.tool_name && { tool_name: params.tool_name },
|
|
256
|
+
...params.framework && { framework: params.framework },
|
|
257
|
+
...params.prev_receipt_hash && { prev_receipt_hash: params.prev_receipt_hash }
|
|
258
|
+
};
|
|
259
|
+
const validated = validateWorkflowContext(context);
|
|
260
|
+
if (!hasValidDagSemantics(validated)) {
|
|
261
|
+
throw new Error(
|
|
262
|
+
"Invalid DAG semantics: step cannot be its own parent or have duplicate parents"
|
|
263
|
+
);
|
|
264
|
+
}
|
|
265
|
+
return validated;
|
|
266
|
+
}
|
|
267
|
+
function createWorkflowSummaryAttestation(params) {
|
|
268
|
+
const attestation = {
|
|
269
|
+
type: WORKFLOW_SUMMARY_TYPE,
|
|
270
|
+
issuer: params.issuer,
|
|
271
|
+
issued_at: params.issued_at,
|
|
272
|
+
...params.expires_at && { expires_at: params.expires_at },
|
|
273
|
+
evidence: {
|
|
274
|
+
workflow_id: params.workflow_id,
|
|
275
|
+
status: params.status,
|
|
276
|
+
started_at: params.started_at,
|
|
277
|
+
...params.completed_at && { completed_at: params.completed_at },
|
|
278
|
+
...params.receipt_refs && { receipt_refs: params.receipt_refs },
|
|
279
|
+
...params.receipt_merkle_root && { receipt_merkle_root: params.receipt_merkle_root },
|
|
280
|
+
...params.receipt_count !== void 0 && { receipt_count: params.receipt_count },
|
|
281
|
+
orchestrator_id: params.orchestrator_id,
|
|
282
|
+
agents_involved: params.agents_involved,
|
|
283
|
+
...params.final_result_hash && { final_result_hash: params.final_result_hash },
|
|
284
|
+
...params.error_context && { error_context: params.error_context }
|
|
285
|
+
}
|
|
286
|
+
};
|
|
287
|
+
return validateWorkflowSummaryAttestation(attestation);
|
|
288
|
+
}
|
|
289
|
+
|
|
290
|
+
export { FRAMEWORK_ID_PATTERN, ORCHESTRATION_FRAMEWORKS, OrchestrationFrameworkSchema, STEP_ID_PATTERN, StepIdSchema, WELL_KNOWN_FRAMEWORKS, WORKFLOW_EXTENSION_KEY, WORKFLOW_ID_PATTERN, WORKFLOW_LIMITS, WORKFLOW_STATUSES, WORKFLOW_SUMMARY_TYPE, WorkflowContextSchema, WorkflowErrorContextSchema, WorkflowIdSchema, WorkflowStatusSchema, WorkflowSummaryAttestationSchema, WorkflowSummaryEvidenceSchema, createStepId, createWorkflowContext, createWorkflowId, createWorkflowSummaryAttestation, hasValidDagSemantics, isTerminalWorkflowStatus, isValidWorkflowContext, isWorkflowSummaryAttestation, validateWorkflowContext, validateWorkflowContextOrdered, validateWorkflowSummaryAttestation };
|
|
291
|
+
//# sourceMappingURL=workflow.mjs.map
|
|
292
|
+
//# sourceMappingURL=workflow.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/workflow.ts"],"names":[],"mappings":"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","file":"workflow.mjs","sourcesContent":["/**\n * PEAC Workflow Correlation Types (v0.10.2+)\n *\n * Workflow correlation primitives for multi-agent orchestration.\n * These types enable tracking and verification of multi-step agentic workflows\n * across different frameworks (MCP, A2A, CrewAI, LangGraph, etc.).\n *\n * Design principles:\n * - Non-breaking: Uses extensions mechanism (auth.extensions['org.peacprotocol/workflow'])\n * - DAG semantics: Parent linking for execution graph reconstruction\n * - Framework-agnostic: Works with any orchestration layer\n * - Deterministic: Supports offline verification and audit\n *\n * @see docs/specs/WORKFLOW-CORRELATION.md\n */\n\nimport { z } from 'zod';\n\n// ============================================================================\n// Constants\n// ============================================================================\n\n/**\n * Extension key for workflow context\n * Used in auth.extensions['org.peacprotocol/workflow']\n */\nexport const WORKFLOW_EXTENSION_KEY = 'org.peacprotocol/workflow';\n\n/**\n * Attestation type for workflow summaries\n */\nexport const WORKFLOW_SUMMARY_TYPE = 'peac/workflow-summary' as const;\n\n/**\n * Workflow status values\n */\nexport const WORKFLOW_STATUSES = ['in_progress', 'completed', 'failed', 'cancelled'] as const;\n\n/**\n * Well-known orchestration frameworks (informational, not normative)\n *\n * The framework field accepts any string matching the framework grammar.\n * These well-known values are listed in the PEAC registries for interop.\n * New frameworks do NOT require protocol updates - just use the name.\n *\n * @see docs/specs/registries.json - orchestration_frameworks section\n */\nexport const WELL_KNOWN_FRAMEWORKS = [\n 'mcp',\n 'a2a',\n 'crewai',\n 'langgraph',\n 'autogen',\n 'custom',\n] as const;\n\n/**\n * @deprecated Use WELL_KNOWN_FRAMEWORKS instead. Kept for backwards compatibility.\n */\nexport const ORCHESTRATION_FRAMEWORKS = WELL_KNOWN_FRAMEWORKS;\n\n/**\n * Framework identifier grammar pattern\n *\n * Lowercase letters, digits, hyphens, underscores.\n * Must start with a letter. Max 64 characters.\n * Examples: \"mcp\", \"a2a\", \"crewai\", \"langgraph\", \"dspy\", \"smolagents\"\n */\nexport const FRAMEWORK_ID_PATTERN = /^[a-z][a-z0-9_-]*$/;\n\n/**\n * Workflow correlation limits (DoS protection)\n */\nexport const WORKFLOW_LIMITS = {\n /** Maximum parent steps per step (DAG fan-in) */\n maxParentSteps: 16,\n /** Maximum workflow ID length */\n maxWorkflowIdLength: 128,\n /** Maximum step ID length */\n maxStepIdLength: 128,\n /** Maximum tool name length */\n maxToolNameLength: 256,\n /** Maximum framework identifier length */\n maxFrameworkLength: 64,\n /** Maximum agents in a workflow summary */\n maxAgentsInvolved: 100,\n /** Maximum receipt refs in a workflow summary */\n maxReceiptRefs: 10000,\n /** Maximum error message length */\n maxErrorMessageLength: 1024,\n} as const;\n\n// ============================================================================\n// ID Format Patterns\n// ============================================================================\n\n/**\n * Workflow ID format: wf_{ulid} or wf_{uuid}\n * Examples:\n * - wf_01HXYZ... (ULID)\n * - wf_550e8400-e29b-41d4-a716-446655440000 (UUID)\n */\nexport const WORKFLOW_ID_PATTERN = /^wf_[a-zA-Z0-9_-]{20,48}$/;\n\n/**\n * Step ID format: step_{ulid} or step_{uuid}\n * Examples:\n * - step_01HXYZ... (ULID)\n * - step_550e8400-e29b-41d4-a716-446655440000 (UUID)\n */\nexport const STEP_ID_PATTERN = /^step_[a-zA-Z0-9_-]{20,48}$/;\n\n// ============================================================================\n// Zod Schemas\n// ============================================================================\n\n/**\n * Workflow ID schema\n */\nexport const WorkflowIdSchema = z\n .string()\n .regex(WORKFLOW_ID_PATTERN, 'Invalid workflow ID format (expected wf_{ulid|uuid})')\n .max(WORKFLOW_LIMITS.maxWorkflowIdLength);\n\n/**\n * Step ID schema\n */\nexport const StepIdSchema = z\n .string()\n .regex(STEP_ID_PATTERN, 'Invalid step ID format (expected step_{ulid|uuid})')\n .max(WORKFLOW_LIMITS.maxStepIdLength);\n\n/**\n * Workflow status schema\n */\nexport const WorkflowStatusSchema = z.enum(WORKFLOW_STATUSES);\n\n/**\n * Orchestration framework schema\n *\n * Open string field with constrained grammar. Any lowercase identifier\n * matching the framework grammar is valid. Well-known values are listed\n * in WELL_KNOWN_FRAMEWORKS and the PEAC registries.\n *\n * Grammar: /^[a-z][a-z0-9_-]*$/ (max 64 chars)\n */\nexport const OrchestrationFrameworkSchema = z\n .string()\n .regex(\n FRAMEWORK_ID_PATTERN,\n 'Invalid framework identifier (must be lowercase alphanumeric with hyphens/underscores, starting with a letter)'\n )\n .max(WORKFLOW_LIMITS.maxFrameworkLength);\n\n/**\n * Workflow context schema - attached to individual receipts\n *\n * This is the core primitive that links receipts into a workflow DAG.\n * Place in auth.extensions['org.peacprotocol/workflow']\n */\nexport const WorkflowContextSchema = z\n .object({\n // Correlation\n /** Globally unique workflow/run ID */\n workflow_id: WorkflowIdSchema,\n\n /** This step's unique ID */\n step_id: StepIdSchema,\n\n /** DAG parent step IDs (empty array for root step) */\n parent_step_ids: z.array(StepIdSchema).max(WORKFLOW_LIMITS.maxParentSteps).default([]),\n\n // Orchestration identity\n /** Agent identity ref of the orchestrator (optional) */\n orchestrator_id: z.string().max(256).optional(),\n\n /** Receipt ID that initiated this workflow (optional) */\n orchestrator_receipt_ref: z.string().max(256).optional(),\n\n // Sequencing (for linear workflows)\n /** 0-based position in sequential runs (optional) */\n step_index: z.number().int().nonnegative().optional(),\n\n /** Total steps if known upfront (optional) */\n step_total: z.number().int().positive().optional(),\n\n // Metadata\n /** Tool or skill name (MCP tool, A2A skill, etc.) */\n tool_name: z.string().max(WORKFLOW_LIMITS.maxToolNameLength).optional(),\n\n /** Orchestration framework */\n framework: OrchestrationFrameworkSchema.optional(),\n\n // Hash chain (for streaming/progressive receipts)\n /** SHA-256 hash of previous receipt in chain (for ordering) */\n prev_receipt_hash: z\n .string()\n .regex(/^sha256:[a-f0-9]{64}$/)\n .optional(),\n })\n .strict();\n\n/**\n * Error context for failed workflows\n */\nexport const WorkflowErrorContextSchema = z\n .object({\n /** Step ID where failure occurred */\n failed_step_id: StepIdSchema,\n\n /** Error code (E_* format preferred) */\n error_code: z.string().max(64),\n\n /** Human-readable error message */\n error_message: z.string().max(WORKFLOW_LIMITS.maxErrorMessageLength),\n })\n .strict();\n\n/**\n * Workflow summary evidence - the \"proof of run\" artifact\n *\n * Used in peac/workflow-summary attestations.\n * This is the single handle auditors use to verify an entire workflow.\n */\nexport const WorkflowSummaryEvidenceSchema = z\n .object({\n /** Workflow ID this summary describes */\n workflow_id: WorkflowIdSchema,\n\n /** Workflow status */\n status: WorkflowStatusSchema,\n\n /** When the workflow started (ISO 8601) */\n started_at: z.string().datetime(),\n\n /** When the workflow completed (ISO 8601, undefined if in_progress) */\n completed_at: z.string().datetime().optional(),\n\n // Receipt commitment\n /** Ordered list of receipt IDs (for small workflows) */\n receipt_refs: z.array(z.string().max(256)).max(WORKFLOW_LIMITS.maxReceiptRefs).optional(),\n\n /** Merkle root of receipt digests (for large workflows, RFC 6962 style) */\n receipt_merkle_root: z\n .string()\n .regex(/^sha256:[a-f0-9]{64}$/)\n .optional(),\n\n /** Total receipt count (required if using Merkle root) */\n receipt_count: z.number().int().nonnegative().optional(),\n\n // Orchestration\n /** Agent identity ref of the orchestrator */\n orchestrator_id: z.string().max(256),\n\n /** List of agent IDs involved in the workflow */\n agents_involved: z.array(z.string().max(256)).max(WORKFLOW_LIMITS.maxAgentsInvolved),\n\n // Outcome\n /** SHA-256 hash of final output artifact (optional) */\n final_result_hash: z\n .string()\n .regex(/^sha256:[a-f0-9]{64}$/)\n .optional(),\n\n /** Error context if workflow failed */\n error_context: WorkflowErrorContextSchema.optional(),\n })\n .strict()\n .refine(\n (data) => {\n // Must have either receipt_refs or receipt_merkle_root (or both)\n return data.receipt_refs !== undefined || data.receipt_merkle_root !== undefined;\n },\n {\n message: 'Workflow summary must include receipt_refs or receipt_merkle_root',\n }\n )\n .refine(\n (data) => {\n // If using Merkle root, must include receipt_count\n if (data.receipt_merkle_root !== undefined && data.receipt_count === undefined) {\n return false;\n }\n return true;\n },\n {\n message: 'receipt_count is required when using receipt_merkle_root',\n }\n );\n\n/**\n * Workflow summary attestation schema\n *\n * A signed attestation containing the workflow summary evidence.\n */\nexport const WorkflowSummaryAttestationSchema = z\n .object({\n /** Attestation type (must be 'peac/workflow-summary') */\n type: z.literal(WORKFLOW_SUMMARY_TYPE),\n\n /** Who issued this attestation (HTTPS URL) */\n issuer: z.string().url().startsWith('https://'),\n\n /** When this attestation was issued (ISO 8601) */\n issued_at: z.string().datetime(),\n\n /** When this attestation expires (ISO 8601, optional) */\n expires_at: z.string().datetime().optional(),\n\n /** The workflow summary evidence */\n evidence: WorkflowSummaryEvidenceSchema,\n })\n .strict();\n\n// ============================================================================\n// TypeScript Types (inferred from Zod schemas)\n// ============================================================================\n\nexport type WorkflowId = z.infer<typeof WorkflowIdSchema>;\nexport type StepId = z.infer<typeof StepIdSchema>;\nexport type WorkflowStatus = z.infer<typeof WorkflowStatusSchema>;\nexport type OrchestrationFramework = z.infer<typeof OrchestrationFrameworkSchema>;\nexport type WorkflowContext = z.infer<typeof WorkflowContextSchema>;\nexport type WorkflowErrorContext = z.infer<typeof WorkflowErrorContextSchema>;\nexport type WorkflowSummaryEvidence = z.infer<typeof WorkflowSummaryEvidenceSchema>;\nexport type WorkflowSummaryAttestation = z.infer<typeof WorkflowSummaryAttestationSchema>;\n\n// ============================================================================\n// Ordered Validation (Conformance)\n// ============================================================================\n\n/**\n * Result of ordered workflow context validation.\n *\n * Returns a canonical error code per Section 6.5.1 validation ordering\n * instead of Zod error messages, enabling language-neutral conformance testing.\n */\nexport type WorkflowValidationResult =\n | { valid: true; value: WorkflowContext }\n | { valid: false; error_code: string; error: string };\n\n/**\n * Validate a WorkflowContext with explicit evaluation ordering.\n *\n * Implements Section 6.5.1 of WORKFLOW-CORRELATION.md:\n * 1. Required field format (rules 4, 5)\n * 2. Structural constraints (rule 3)\n * 3. Optional field format (rules 6, 7)\n * 4. Semantic DAG checks (rules 1, 2)\n *\n * This function does NOT depend on Zod's internal validation ordering.\n * Cross-language implementations MUST produce identical error_code values\n * for the same invalid input.\n *\n * @param input - Raw input to validate\n * @returns Validation result with canonical error code on failure\n */\nexport function validateWorkflowContextOrdered(input: unknown): WorkflowValidationResult {\n if (typeof input !== 'object' || input === null) {\n return {\n valid: false,\n error_code: 'E_WORKFLOW_CONTEXT_INVALID',\n error: 'Input must be an object',\n };\n }\n\n const obj = input as Record<string, unknown>;\n\n // Step 1: Required field format (rules 4, 5)\n if (\n typeof obj.workflow_id !== 'string' ||\n !WORKFLOW_ID_PATTERN.test(obj.workflow_id) ||\n obj.workflow_id.length > WORKFLOW_LIMITS.maxWorkflowIdLength\n ) {\n return {\n valid: false,\n error_code: 'E_WORKFLOW_ID_INVALID',\n error: 'Invalid workflow ID format',\n };\n }\n\n if (\n typeof obj.step_id !== 'string' ||\n !STEP_ID_PATTERN.test(obj.step_id) ||\n obj.step_id.length > WORKFLOW_LIMITS.maxStepIdLength\n ) {\n return {\n valid: false,\n error_code: 'E_WORKFLOW_STEP_ID_INVALID',\n error: 'Invalid step ID format',\n };\n }\n\n // Step 2: Structural constraints (rule 3)\n const parentStepIds = obj.parent_step_ids;\n if (Array.isArray(parentStepIds) && parentStepIds.length > WORKFLOW_LIMITS.maxParentSteps) {\n return {\n valid: false,\n error_code: 'E_WORKFLOW_LIMIT_EXCEEDED',\n error: 'Exceeds maximum parent steps',\n };\n }\n\n // Step 3: Optional field format (rules 6, 7)\n if (obj.framework !== undefined) {\n if (\n typeof obj.framework !== 'string' ||\n !FRAMEWORK_ID_PATTERN.test(obj.framework) ||\n obj.framework.length > WORKFLOW_LIMITS.maxFrameworkLength\n ) {\n return {\n valid: false,\n error_code: 'E_WORKFLOW_CONTEXT_INVALID',\n error: 'Invalid framework identifier grammar',\n };\n }\n }\n\n if (obj.prev_receipt_hash !== undefined) {\n if (\n typeof obj.prev_receipt_hash !== 'string' ||\n !/^sha256:[a-f0-9]{64}$/.test(obj.prev_receipt_hash)\n ) {\n return {\n valid: false,\n error_code: 'E_WORKFLOW_CONTEXT_INVALID',\n error: 'Invalid hash format',\n };\n }\n }\n\n // Step 4: Semantic DAG checks (rules 1, 2)\n if (Array.isArray(parentStepIds)) {\n if (parentStepIds.includes(obj.step_id)) {\n return {\n valid: false,\n error_code: 'E_WORKFLOW_DAG_INVALID',\n error: 'Self-parent cycle detected',\n };\n }\n const uniqueParents = new Set(parentStepIds);\n if (uniqueParents.size !== parentStepIds.length) {\n return {\n valid: false,\n error_code: 'E_WORKFLOW_DAG_INVALID',\n error: 'Duplicate parent step IDs',\n };\n }\n }\n\n // Full schema validation for remaining structural rules (types, strict mode, etc.)\n const result = WorkflowContextSchema.safeParse(input);\n if (!result.success) {\n return {\n valid: false,\n error_code: 'E_WORKFLOW_CONTEXT_INVALID',\n error: result.error.issues[0]?.message || 'Schema validation failed',\n };\n }\n\n return { valid: true, value: result.data };\n}\n\n// ============================================================================\n// Helper Functions\n// ============================================================================\n\n/**\n * Generate a workflow ID with the wf_ prefix\n *\n * @param id - ULID or UUID payload (without prefix)\n * @returns Prefixed workflow ID\n */\nexport function createWorkflowId(id: string): WorkflowId {\n const workflowId = `wf_${id}`;\n return WorkflowIdSchema.parse(workflowId);\n}\n\n/**\n * Generate a step ID with the step_ prefix\n *\n * @param id - ULID or UUID payload (without prefix)\n * @returns Prefixed step ID\n */\nexport function createStepId(id: string): StepId {\n const stepId = `step_${id}`;\n return StepIdSchema.parse(stepId);\n}\n\n/**\n * Validate a workflow context object\n *\n * @param context - Object to validate\n * @returns Validated WorkflowContext\n * @throws ZodError if validation fails\n */\nexport function validateWorkflowContext(context: unknown): WorkflowContext {\n return WorkflowContextSchema.parse(context);\n}\n\n/**\n * Check if an object is a valid workflow context (non-throwing)\n *\n * @param context - Object to check\n * @returns True if valid WorkflowContext\n */\nexport function isValidWorkflowContext(context: unknown): context is WorkflowContext {\n return WorkflowContextSchema.safeParse(context).success;\n}\n\n/**\n * Validate a workflow summary attestation\n *\n * @param attestation - Object to validate\n * @returns Validated WorkflowSummaryAttestation\n * @throws ZodError if validation fails\n */\nexport function validateWorkflowSummaryAttestation(\n attestation: unknown\n): WorkflowSummaryAttestation {\n return WorkflowSummaryAttestationSchema.parse(attestation);\n}\n\n/**\n * Check if an object is a workflow summary attestation (non-throwing)\n *\n * @param attestation - Object to check\n * @returns True if valid WorkflowSummaryAttestation\n */\nexport function isWorkflowSummaryAttestation(\n attestation: unknown\n): attestation is WorkflowSummaryAttestation {\n return WorkflowSummaryAttestationSchema.safeParse(attestation).success;\n}\n\n/**\n * Check if a workflow summary is in a terminal state\n *\n * @param status - Workflow status\n * @returns True if completed, failed, or cancelled\n */\nexport function isTerminalWorkflowStatus(status: WorkflowStatus): boolean {\n return status === 'completed' || status === 'failed' || status === 'cancelled';\n}\n\n/**\n * Check if workflow context has valid DAG semantics (no self-parent)\n *\n * @param context - Workflow context to check\n * @returns True if DAG semantics are valid\n */\nexport function hasValidDagSemantics(context: WorkflowContext): boolean {\n // Step cannot be its own parent\n if (context.parent_step_ids.includes(context.step_id)) {\n return false;\n }\n // No duplicate parents\n const uniqueParents = new Set(context.parent_step_ids);\n if (uniqueParents.size !== context.parent_step_ids.length) {\n return false;\n }\n return true;\n}\n\n/**\n * Create a workflow context for attaching to a receipt\n *\n * @param params - Workflow context parameters\n * @returns Validated WorkflowContext\n */\nexport function createWorkflowContext(params: {\n workflow_id: string;\n step_id: string;\n parent_step_ids?: string[];\n orchestrator_id?: string;\n orchestrator_receipt_ref?: string;\n step_index?: number;\n step_total?: number;\n tool_name?: string;\n framework?: string;\n prev_receipt_hash?: string;\n}): WorkflowContext {\n const context: WorkflowContext = {\n workflow_id: params.workflow_id as WorkflowId,\n step_id: params.step_id as StepId,\n parent_step_ids: (params.parent_step_ids ?? []) as StepId[],\n ...(params.orchestrator_id && { orchestrator_id: params.orchestrator_id }),\n ...(params.orchestrator_receipt_ref && {\n orchestrator_receipt_ref: params.orchestrator_receipt_ref,\n }),\n ...(params.step_index !== undefined && { step_index: params.step_index }),\n ...(params.step_total !== undefined && { step_total: params.step_total }),\n ...(params.tool_name && { tool_name: params.tool_name }),\n ...(params.framework && { framework: params.framework }),\n ...(params.prev_receipt_hash && { prev_receipt_hash: params.prev_receipt_hash }),\n };\n\n // Validate\n const validated = validateWorkflowContext(context);\n\n // Check DAG semantics\n if (!hasValidDagSemantics(validated)) {\n throw new Error(\n 'Invalid DAG semantics: step cannot be its own parent or have duplicate parents'\n );\n }\n\n return validated;\n}\n\n/**\n * Create parameters for a workflow summary attestation\n */\nexport interface CreateWorkflowSummaryParams {\n workflow_id: string;\n status: WorkflowStatus;\n started_at: string;\n completed_at?: string;\n orchestrator_id: string;\n agents_involved: string[];\n receipt_refs?: string[];\n receipt_merkle_root?: string;\n receipt_count?: number;\n final_result_hash?: string;\n error_context?: WorkflowErrorContext;\n issuer: string;\n issued_at: string;\n expires_at?: string;\n}\n\n/**\n * Create a workflow summary attestation\n *\n * @param params - Attestation parameters\n * @returns Validated WorkflowSummaryAttestation\n */\nexport function createWorkflowSummaryAttestation(\n params: CreateWorkflowSummaryParams\n): WorkflowSummaryAttestation {\n const attestation: WorkflowSummaryAttestation = {\n type: WORKFLOW_SUMMARY_TYPE,\n issuer: params.issuer,\n issued_at: params.issued_at,\n ...(params.expires_at && { expires_at: params.expires_at }),\n evidence: {\n workflow_id: params.workflow_id as WorkflowId,\n status: params.status,\n started_at: params.started_at,\n ...(params.completed_at && { completed_at: params.completed_at }),\n ...(params.receipt_refs && { receipt_refs: params.receipt_refs }),\n ...(params.receipt_merkle_root && { receipt_merkle_root: params.receipt_merkle_root }),\n ...(params.receipt_count !== undefined && { receipt_count: params.receipt_count }),\n orchestrator_id: params.orchestrator_id,\n agents_involved: params.agents_involved,\n ...(params.final_result_hash && { final_result_hash: params.final_result_hash }),\n ...(params.error_context && { error_context: params.error_context }),\n },\n };\n\n return validateWorkflowSummaryAttestation(attestation);\n}\n"]}
|
package/package.json
CHANGED
|
@@ -1,9 +1,48 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@peac/schema",
|
|
3
|
-
"version": "0.10.
|
|
3
|
+
"version": "0.10.10",
|
|
4
4
|
"description": "PEAC Protocol JSON schemas, OpenAPI specs, and TypeScript types",
|
|
5
|
-
"main": "dist/index.
|
|
5
|
+
"main": "dist/index.cjs",
|
|
6
6
|
"types": "dist/index.d.ts",
|
|
7
|
+
"exports": {
|
|
8
|
+
".": {
|
|
9
|
+
"types": "./dist/index.d.ts",
|
|
10
|
+
"import": "./dist/index.mjs",
|
|
11
|
+
"require": "./dist/index.cjs",
|
|
12
|
+
"default": "./dist/index.mjs"
|
|
13
|
+
},
|
|
14
|
+
"./receipt-parser": {
|
|
15
|
+
"types": "./dist/receipt-parser.d.ts",
|
|
16
|
+
"import": "./dist/receipt-parser.mjs",
|
|
17
|
+
"require": "./dist/receipt-parser.cjs"
|
|
18
|
+
},
|
|
19
|
+
"./attestation": {
|
|
20
|
+
"types": "./dist/attestation-receipt.d.ts",
|
|
21
|
+
"import": "./dist/attestation-receipt.mjs",
|
|
22
|
+
"require": "./dist/attestation-receipt.cjs"
|
|
23
|
+
},
|
|
24
|
+
"./workflow": {
|
|
25
|
+
"types": "./dist/workflow.d.ts",
|
|
26
|
+
"import": "./dist/workflow.mjs",
|
|
27
|
+
"require": "./dist/workflow.cjs"
|
|
28
|
+
},
|
|
29
|
+
"./interaction": {
|
|
30
|
+
"types": "./dist/interaction.d.ts",
|
|
31
|
+
"import": "./dist/interaction.mjs",
|
|
32
|
+
"require": "./dist/interaction.cjs"
|
|
33
|
+
},
|
|
34
|
+
"./attribution": {
|
|
35
|
+
"types": "./dist/attribution.d.ts",
|
|
36
|
+
"import": "./dist/attribution.mjs",
|
|
37
|
+
"require": "./dist/attribution.cjs"
|
|
38
|
+
},
|
|
39
|
+
"./normalize": {
|
|
40
|
+
"types": "./dist/normalize.d.ts",
|
|
41
|
+
"import": "./dist/normalize.mjs",
|
|
42
|
+
"require": "./dist/normalize.cjs"
|
|
43
|
+
},
|
|
44
|
+
"./package.json": "./package.json"
|
|
45
|
+
},
|
|
7
46
|
"repository": {
|
|
8
47
|
"type": "git",
|
|
9
48
|
"url": "https://github.com/peacprotocol/peac.git",
|
|
@@ -24,17 +63,22 @@
|
|
|
24
63
|
},
|
|
25
64
|
"dependencies": {
|
|
26
65
|
"zod": "^3.22.4",
|
|
27
|
-
"@peac/kernel": "0.10.
|
|
66
|
+
"@peac/kernel": "0.10.10"
|
|
28
67
|
},
|
|
29
68
|
"devDependencies": {
|
|
30
69
|
"@types/node": "^20.10.0",
|
|
31
70
|
"typescript": "^5.3.3",
|
|
32
|
-
"vitest": "^
|
|
71
|
+
"vitest": "^4.0.0",
|
|
72
|
+
"tsup": "^8.0.0"
|
|
33
73
|
},
|
|
34
74
|
"scripts": {
|
|
35
|
-
"
|
|
75
|
+
"prebuild": "rm -rf dist",
|
|
76
|
+
"build": "pnpm run build:js && pnpm run build:types",
|
|
36
77
|
"test": "vitest run",
|
|
37
78
|
"test:watch": "vitest",
|
|
38
|
-
"
|
|
79
|
+
"bench": "vitest bench --run",
|
|
80
|
+
"clean": "rm -rf dist",
|
|
81
|
+
"build:js": "tsup",
|
|
82
|
+
"build:types": "rm -f dist/.tsbuildinfo && tsc && rm -f dist/.tsbuildinfo"
|
|
39
83
|
}
|
|
40
84
|
}
|