@melra/protocol 0.3.0-alpha.10 → 0.3.0-alpha.12

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.
@@ -1,109 +0,0 @@
1
- // Copyright 2026 XAGI Labs Private Limited
2
- // SPDX-License-Identifier: Apache-2.0
3
- import { describe, expect, it } from "vitest";
4
- import { delegationChain, effectContract, LOCAL_IDENTITY, MelraReceiptInputSchema, PROTOCOL_VERSION, TaskRequestSchema, TOOL_NAMES, } from "./index.js";
5
- describe("public protocol schemas", () => {
6
- it("applies bounded task defaults", () => {
7
- const request = TaskRequestSchema.parse({
8
- goal: "Inspect the runtime",
9
- operation: { kind: "system", action: "info" },
10
- });
11
- expect(request.budget).toEqual({
12
- maxSteps: 10,
13
- maxDurationMs: 120_000,
14
- maxRetries: 2,
15
- });
16
- expect(request.constraints).toEqual([]);
17
- expect(request.requiredEvidence).toEqual([]);
18
- });
19
- it("rejects unknown fields and unknown effect names", () => {
20
- expect(() => TaskRequestSchema.parse({
21
- goal: "Reject schema smuggling",
22
- operation: {
23
- kind: "file",
24
- action: "read",
25
- path: "README.md",
26
- executeAnyway: true,
27
- },
28
- })).toThrow();
29
- expect(() => TaskRequestSchema.parse({
30
- goal: "Reject an unknown effect",
31
- operation: { kind: "system", action: "info" },
32
- forbiddenEffects: ["network"],
33
- })).toThrow();
34
- });
35
- it("keeps the compact tool and receipt lookup contracts strict", () => {
36
- expect(TOOL_NAMES).toEqual([
37
- "melra_capabilities",
38
- "melra_plan",
39
- "melra_execute",
40
- "melra_task_status",
41
- "melra_task_cancel",
42
- "melra_receipt",
43
- "melra_workflow_plan",
44
- "melra_workflow_advance",
45
- "melra_workflow_status",
46
- "melra_workflow_cancel",
47
- "melra_workflow_control",
48
- ]);
49
- expect(() => MelraReceiptInputSchema.parse({})).toThrow();
50
- expect(MelraReceiptInputSchema.parse({
51
- taskId: "8c73f2ad-f503-47c6-83d5-7a866a70bdf0",
52
- }).taskId).toBe("8c73f2ad-f503-47c6-83d5-7a866a70bdf0");
53
- });
54
- });
55
- describe("effect contract", () => {
56
- const record = (request, extra = {}) => ({
57
- id: "4c5a0130-71a5-4c48-b22d-c7901f12688f",
58
- request: TaskRequestSchema.parse(request),
59
- status: "planned",
60
- policyDecision: {
61
- outcome: "allow",
62
- effect: "read",
63
- risk: "low",
64
- reason: "read_only_operation",
65
- policyVersion: "1",
66
- traits: [],
67
- },
68
- receiptIds: [],
69
- createdAt: "2026-01-01T00:00:00.000Z",
70
- updatedAt: "2026-01-01T00:00:00.000Z",
71
- ...extra,
72
- });
73
- it("names the fields that already governed the task", () => {
74
- const contract = effectContract(record({
75
- goal: "Read the changelog",
76
- operation: { kind: "file", action: "read", path: "CHANGELOG.md" },
77
- }), { capability: "file.read", target: "CHANGELOG.md" });
78
- expect(contract).toMatchObject({
79
- contractVersion: PROTOCOL_VERSION,
80
- capability: "file.read",
81
- effect: "read",
82
- risk: "low",
83
- target: "CHANGELOG.md",
84
- identity: LOCAL_IDENTITY,
85
- metadata: { goal: "Read the changelog" },
86
- });
87
- // Absent rather than undefined: a contract with no approval attached has
88
- // nothing to authorize, and `exactOptionalPropertyTypes` keeps that visible.
89
- expect("authorization" in contract).toBe(false);
90
- expect("idempotencyKey" in contract).toBe(false);
91
- });
92
- it("carries the delegation chain the caller declared", () => {
93
- const identity = {
94
- principal: { kind: "agent", id: "claude-code" },
95
- onBehalfOf: [
96
- { kind: "organization", id: "acme" },
97
- { kind: "human", id: "dheeraj" },
98
- ],
99
- };
100
- const contract = effectContract(record({
101
- goal: "Read the changelog",
102
- operation: { kind: "file", action: "read", path: "CHANGELOG.md" },
103
- identity,
104
- }), { capability: "file.read", target: "CHANGELOG.md" });
105
- expect(contract.identity).toEqual(identity);
106
- expect(delegationChain(contract.identity)).toBe("organization:acme/human:dheeraj/agent:claude-code");
107
- });
108
- });
109
- //# sourceMappingURL=index.test.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"index.test.js","sourceRoot":"","sources":["../src/index.test.ts"],"names":[],"mappings":"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"}
@@ -1,2 +0,0 @@
1
- export {};
2
- //# sourceMappingURL=workflow.test.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"workflow.test.d.ts","sourceRoot":"","sources":["../src/workflow.test.ts"],"names":[],"mappings":""}
@@ -1,125 +0,0 @@
1
- // Copyright 2026 XAGI Labs Private Limited
2
- // SPDX-License-Identifier: Apache-2.0
3
- import { describe, expect, it } from "vitest";
4
- import { BoundedLoopNodeSchema, ConditionNodeSchema, EncryptedPayloadSchema, ParallelNodeSchema, WorkflowAdvanceInputSchema, WorkflowDefinitionSchema, WorkflowEventSchema, WorkflowRunSchema, WorkflowSnapshotSchema, } from "./index.js";
5
- const workflowId = "11111111-1111-4111-8111-111111111111";
6
- const traceId = "22222222-2222-4222-8222-222222222222";
7
- const occurredAt = "2026-07-30T12:00:00.000Z";
8
- describe("durable workflow protocol", () => {
9
- it("parses a bounded two-node workflow and rejects schema smuggling", () => {
10
- const definition = WorkflowDefinitionSchema.parse({
11
- schemaVersion: "1.0.0",
12
- id: workflowId,
13
- version: 1,
14
- name: "restart-safe",
15
- nodes: [
16
- {
17
- id: "inspect",
18
- type: "operation",
19
- dependsOn: [],
20
- request: {
21
- goal: "Inspect the runtime",
22
- operation: { kind: "system", action: "info" },
23
- },
24
- },
25
- { id: "checkpoint", type: "checkpoint", dependsOn: ["inspect"] },
26
- ],
27
- });
28
- expect(definition.nodes).toHaveLength(2);
29
- expect(() => WorkflowDefinitionSchema.parse({ ...definition, executeAnyway: true })).toThrow();
30
- });
31
- it.each([
32
- [
33
- BoundedLoopNodeSchema,
34
- {
35
- id: "loop",
36
- type: "bounded_loop",
37
- dependsOn: [],
38
- body: [
39
- {
40
- goal: "Inspect the runtime",
41
- operation: { kind: "system", action: "info" },
42
- },
43
- ],
44
- maxIterations: 0,
45
- },
46
- ],
47
- [
48
- ParallelNodeSchema,
49
- {
50
- id: "parallel",
51
- type: "parallel",
52
- dependsOn: [],
53
- branches: [],
54
- },
55
- ],
56
- [
57
- ConditionNodeSchema,
58
- {
59
- id: "condition",
60
- type: "condition",
61
- dependsOn: [],
62
- sourceNodeId: "",
63
- predicate: { type: "result_equals", path: "ready", value: true },
64
- },
65
- ],
66
- ])("rejects an invalid bounded control-flow node", (schema, value) => {
67
- expect(schema.safeParse(value).success).toBe(false);
68
- });
69
- it("validates events, snapshots, encrypted payloads, and advance inputs", () => {
70
- const run = WorkflowRunSchema.parse({
71
- schemaVersion: "1.0.0",
72
- id: workflowId,
73
- definitionId: "33333333-3333-4333-8333-333333333333",
74
- definitionVersion: 1,
75
- status: "running",
76
- stateVersion: 2,
77
- nodes: {
78
- inspect: {
79
- status: "verified_complete",
80
- taskIds: ["44444444-4444-4444-8444-444444444444"],
81
- },
82
- checkpoint: { status: "ready" },
83
- },
84
- traceId,
85
- createdAt: occurredAt,
86
- updatedAt: occurredAt,
87
- });
88
- expect(WorkflowEventSchema.parse({
89
- schemaVersion: "1.0.0",
90
- id: "55555555-5555-4555-8555-555555555555",
91
- aggregateId: workflowId,
92
- sequence: 2,
93
- traceId,
94
- type: "workflow.node_completed",
95
- data: { nodeId: "inspect" },
96
- occurredAt,
97
- }).type).toBe("workflow.node_completed");
98
- expect(EncryptedPayloadSchema.parse({
99
- version: 1,
100
- algorithm: "aes-256-gcm",
101
- iv: "AQIDBA",
102
- ciphertext: "BQYHCA",
103
- tag: "CQoLDA",
104
- }).algorithm).toBe("aes-256-gcm");
105
- expect(WorkflowAdvanceInputSchema.parse({
106
- workflowId,
107
- approvals: [],
108
- }).approvals).toEqual([]);
109
- expect(WorkflowSnapshotSchema.parse({
110
- schemaVersion: "1.0.0",
111
- workflowId,
112
- sequence: 2,
113
- run,
114
- createdAt: occurredAt,
115
- }).sequence).toBe(2);
116
- expect(() => WorkflowSnapshotSchema.parse({
117
- schemaVersion: "1.0.0",
118
- workflowId,
119
- sequence: 1,
120
- run,
121
- createdAt: occurredAt,
122
- })).toThrow();
123
- });
124
- });
125
- //# sourceMappingURL=workflow.test.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"workflow.test.js","sourceRoot":"","sources":["../src/workflow.test.ts"],"names":[],"mappings":"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"}