@osstack/protocol 0.10.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (58) hide show
  1. package/dist/approval.d.ts +102 -0
  2. package/dist/approval.d.ts.map +1 -0
  3. package/dist/approval.js +52 -0
  4. package/dist/approval.js.map +1 -0
  5. package/dist/envelope.d.ts +882 -0
  6. package/dist/envelope.d.ts.map +1 -0
  7. package/dist/envelope.js +210 -0
  8. package/dist/envelope.js.map +1 -0
  9. package/dist/event.d.ts +36 -0
  10. package/dist/event.d.ts.map +1 -0
  11. package/dist/event.js +28 -0
  12. package/dist/event.js.map +1 -0
  13. package/dist/evidence.d.ts +51 -0
  14. package/dist/evidence.d.ts.map +1 -0
  15. package/dist/evidence.js +34 -0
  16. package/dist/evidence.js.map +1 -0
  17. package/dist/generate.d.ts +16 -0
  18. package/dist/generate.d.ts.map +1 -0
  19. package/dist/generate.js +60 -0
  20. package/dist/generate.js.map +1 -0
  21. package/dist/index.d.ts +9 -0
  22. package/dist/index.d.ts.map +1 -0
  23. package/dist/index.js +16 -0
  24. package/dist/index.js.map +1 -0
  25. package/dist/policy.d.ts +284 -0
  26. package/dist/policy.d.ts.map +1 -0
  27. package/dist/policy.js +58 -0
  28. package/dist/policy.js.map +1 -0
  29. package/dist/protocol.test.d.ts +2 -0
  30. package/dist/protocol.test.d.ts.map +1 -0
  31. package/dist/protocol.test.js +251 -0
  32. package/dist/protocol.test.js.map +1 -0
  33. package/dist/run.d.ts +34 -0
  34. package/dist/run.d.ts.map +1 -0
  35. package/dist/run.js +25 -0
  36. package/dist/run.js.map +1 -0
  37. package/dist/schemas.test.d.ts +2 -0
  38. package/dist/schemas.test.d.ts.map +1 -0
  39. package/dist/schemas.test.js +34 -0
  40. package/dist/schemas.test.js.map +1 -0
  41. package/dist/task.d.ts +40 -0
  42. package/dist/task.d.ts.map +1 -0
  43. package/dist/task.js +40 -0
  44. package/dist/task.js.map +1 -0
  45. package/dist/version.d.ts +11 -0
  46. package/dist/version.d.ts.map +1 -0
  47. package/dist/version.js +18 -0
  48. package/dist/version.js.map +1 -0
  49. package/package.json +38 -0
  50. package/schemas/agent-command-result.schema.json +163 -0
  51. package/schemas/agent-command.schema.json +69 -0
  52. package/schemas/approval-decision.schema.json +49 -0
  53. package/schemas/approval-request.schema.json +38 -0
  54. package/schemas/event-envelope.schema.json +48 -0
  55. package/schemas/evidence-ref.schema.json +34 -0
  56. package/schemas/policy-decision.schema.json +166 -0
  57. package/schemas/run-summary.schema.json +50 -0
  58. package/schemas/task.schema.json +51 -0
@@ -0,0 +1,284 @@
1
+ import { z } from "zod";
2
+ /** Cost tier of a candidate agent (mirrors core CostTier). */
3
+ export declare const CostTier: z.ZodEnum<["low", "mid", "high"]>;
4
+ export type CostTier = z.infer<typeof CostTier>;
5
+ /** A rule's partial contribution to a candidate's total score. */
6
+ export declare const PolicyScore: z.ZodObject<{
7
+ value: z.ZodNumber;
8
+ reason: z.ZodString;
9
+ }, "strict", z.ZodTypeAny, {
10
+ value: number;
11
+ reason: string;
12
+ }, {
13
+ value: number;
14
+ reason: string;
15
+ }>;
16
+ export type PolicyScore = z.infer<typeof PolicyScore>;
17
+ export declare const PolicyCandidate: z.ZodObject<{
18
+ agent_id: z.ZodString;
19
+ cost_tier: z.ZodEnum<["low", "mid", "high"]>;
20
+ /** Opaque in v1 — core's Capability schema is not pre-imported. */
21
+ capabilities: z.ZodArray<z.ZodUnknown, "many">;
22
+ }, "strict", z.ZodTypeAny, {
23
+ agent_id: string;
24
+ cost_tier: "low" | "high" | "mid";
25
+ capabilities: unknown[];
26
+ }, {
27
+ agent_id: string;
28
+ cost_tier: "low" | "high" | "mid";
29
+ capabilities: unknown[];
30
+ }>;
31
+ export type PolicyCandidate = z.infer<typeof PolicyCandidate>;
32
+ export declare const PolicyOutcome: z.ZodObject<{
33
+ candidate: z.ZodObject<{
34
+ agent_id: z.ZodString;
35
+ cost_tier: z.ZodEnum<["low", "mid", "high"]>;
36
+ /** Opaque in v1 — core's Capability schema is not pre-imported. */
37
+ capabilities: z.ZodArray<z.ZodUnknown, "many">;
38
+ }, "strict", z.ZodTypeAny, {
39
+ agent_id: string;
40
+ cost_tier: "low" | "high" | "mid";
41
+ capabilities: unknown[];
42
+ }, {
43
+ agent_id: string;
44
+ cost_tier: "low" | "high" | "mid";
45
+ capabilities: unknown[];
46
+ }>;
47
+ total: z.ZodNumber;
48
+ breakdown: z.ZodArray<z.ZodObject<{
49
+ rule_id: z.ZodString;
50
+ value: z.ZodNumber;
51
+ reason: z.ZodString;
52
+ }, "strict", z.ZodTypeAny, {
53
+ value: number;
54
+ reason: string;
55
+ rule_id: string;
56
+ }, {
57
+ value: number;
58
+ reason: string;
59
+ rule_id: string;
60
+ }>, "many">;
61
+ }, "strict", z.ZodTypeAny, {
62
+ candidate: {
63
+ agent_id: string;
64
+ cost_tier: "low" | "high" | "mid";
65
+ capabilities: unknown[];
66
+ };
67
+ total: number;
68
+ breakdown: {
69
+ value: number;
70
+ reason: string;
71
+ rule_id: string;
72
+ }[];
73
+ }, {
74
+ candidate: {
75
+ agent_id: string;
76
+ cost_tier: "low" | "high" | "mid";
77
+ capabilities: unknown[];
78
+ };
79
+ total: number;
80
+ breakdown: {
81
+ value: number;
82
+ reason: string;
83
+ rule_id: string;
84
+ }[];
85
+ }>;
86
+ export type PolicyOutcome = z.infer<typeof PolicyOutcome>;
87
+ /** Handoff gate: when triggered, dispatch pauses for human approval. */
88
+ export declare const PolicyHandoff: z.ZodObject<{
89
+ triggered: z.ZodBoolean;
90
+ reason: z.ZodOptional<z.ZodString>;
91
+ }, "strict", z.ZodTypeAny, {
92
+ triggered: boolean;
93
+ reason?: string | undefined;
94
+ }, {
95
+ triggered: boolean;
96
+ reason?: string | undefined;
97
+ }>;
98
+ export type PolicyHandoff = z.infer<typeof PolicyHandoff>;
99
+ export declare const PolicyDecision: z.ZodObject<{
100
+ /** Winning outcome, or null when no candidate qualified. */
101
+ winner: z.ZodNullable<z.ZodObject<{
102
+ candidate: z.ZodObject<{
103
+ agent_id: z.ZodString;
104
+ cost_tier: z.ZodEnum<["low", "mid", "high"]>;
105
+ /** Opaque in v1 — core's Capability schema is not pre-imported. */
106
+ capabilities: z.ZodArray<z.ZodUnknown, "many">;
107
+ }, "strict", z.ZodTypeAny, {
108
+ agent_id: string;
109
+ cost_tier: "low" | "high" | "mid";
110
+ capabilities: unknown[];
111
+ }, {
112
+ agent_id: string;
113
+ cost_tier: "low" | "high" | "mid";
114
+ capabilities: unknown[];
115
+ }>;
116
+ total: z.ZodNumber;
117
+ breakdown: z.ZodArray<z.ZodObject<{
118
+ rule_id: z.ZodString;
119
+ value: z.ZodNumber;
120
+ reason: z.ZodString;
121
+ }, "strict", z.ZodTypeAny, {
122
+ value: number;
123
+ reason: string;
124
+ rule_id: string;
125
+ }, {
126
+ value: number;
127
+ reason: string;
128
+ rule_id: string;
129
+ }>, "many">;
130
+ }, "strict", z.ZodTypeAny, {
131
+ candidate: {
132
+ agent_id: string;
133
+ cost_tier: "low" | "high" | "mid";
134
+ capabilities: unknown[];
135
+ };
136
+ total: number;
137
+ breakdown: {
138
+ value: number;
139
+ reason: string;
140
+ rule_id: string;
141
+ }[];
142
+ }, {
143
+ candidate: {
144
+ agent_id: string;
145
+ cost_tier: "low" | "high" | "mid";
146
+ capabilities: unknown[];
147
+ };
148
+ total: number;
149
+ breakdown: {
150
+ value: number;
151
+ reason: string;
152
+ rule_id: string;
153
+ }[];
154
+ }>>;
155
+ /** All candidates, sorted desc by total score. */
156
+ ranked: z.ZodArray<z.ZodObject<{
157
+ candidate: z.ZodObject<{
158
+ agent_id: z.ZodString;
159
+ cost_tier: z.ZodEnum<["low", "mid", "high"]>;
160
+ /** Opaque in v1 — core's Capability schema is not pre-imported. */
161
+ capabilities: z.ZodArray<z.ZodUnknown, "many">;
162
+ }, "strict", z.ZodTypeAny, {
163
+ agent_id: string;
164
+ cost_tier: "low" | "high" | "mid";
165
+ capabilities: unknown[];
166
+ }, {
167
+ agent_id: string;
168
+ cost_tier: "low" | "high" | "mid";
169
+ capabilities: unknown[];
170
+ }>;
171
+ total: z.ZodNumber;
172
+ breakdown: z.ZodArray<z.ZodObject<{
173
+ rule_id: z.ZodString;
174
+ value: z.ZodNumber;
175
+ reason: z.ZodString;
176
+ }, "strict", z.ZodTypeAny, {
177
+ value: number;
178
+ reason: string;
179
+ rule_id: string;
180
+ }, {
181
+ value: number;
182
+ reason: string;
183
+ rule_id: string;
184
+ }>, "many">;
185
+ }, "strict", z.ZodTypeAny, {
186
+ candidate: {
187
+ agent_id: string;
188
+ cost_tier: "low" | "high" | "mid";
189
+ capabilities: unknown[];
190
+ };
191
+ total: number;
192
+ breakdown: {
193
+ value: number;
194
+ reason: string;
195
+ rule_id: string;
196
+ }[];
197
+ }, {
198
+ candidate: {
199
+ agent_id: string;
200
+ cost_tier: "low" | "high" | "mid";
201
+ capabilities: unknown[];
202
+ };
203
+ total: number;
204
+ breakdown: {
205
+ value: number;
206
+ reason: string;
207
+ rule_id: string;
208
+ }[];
209
+ }>, "many">;
210
+ handoff: z.ZodObject<{
211
+ triggered: z.ZodBoolean;
212
+ reason: z.ZodOptional<z.ZodString>;
213
+ }, "strict", z.ZodTypeAny, {
214
+ triggered: boolean;
215
+ reason?: string | undefined;
216
+ }, {
217
+ triggered: boolean;
218
+ reason?: string | undefined;
219
+ }>;
220
+ }, "strict", z.ZodTypeAny, {
221
+ winner: {
222
+ candidate: {
223
+ agent_id: string;
224
+ cost_tier: "low" | "high" | "mid";
225
+ capabilities: unknown[];
226
+ };
227
+ total: number;
228
+ breakdown: {
229
+ value: number;
230
+ reason: string;
231
+ rule_id: string;
232
+ }[];
233
+ } | null;
234
+ ranked: {
235
+ candidate: {
236
+ agent_id: string;
237
+ cost_tier: "low" | "high" | "mid";
238
+ capabilities: unknown[];
239
+ };
240
+ total: number;
241
+ breakdown: {
242
+ value: number;
243
+ reason: string;
244
+ rule_id: string;
245
+ }[];
246
+ }[];
247
+ handoff: {
248
+ triggered: boolean;
249
+ reason?: string | undefined;
250
+ };
251
+ }, {
252
+ winner: {
253
+ candidate: {
254
+ agent_id: string;
255
+ cost_tier: "low" | "high" | "mid";
256
+ capabilities: unknown[];
257
+ };
258
+ total: number;
259
+ breakdown: {
260
+ value: number;
261
+ reason: string;
262
+ rule_id: string;
263
+ }[];
264
+ } | null;
265
+ ranked: {
266
+ candidate: {
267
+ agent_id: string;
268
+ cost_tier: "low" | "high" | "mid";
269
+ capabilities: unknown[];
270
+ };
271
+ total: number;
272
+ breakdown: {
273
+ value: number;
274
+ reason: string;
275
+ rule_id: string;
276
+ }[];
277
+ }[];
278
+ handoff: {
279
+ triggered: boolean;
280
+ reason?: string | undefined;
281
+ };
282
+ }>;
283
+ export type PolicyDecision = z.infer<typeof PolicyDecision>;
284
+ //# sourceMappingURL=policy.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"policy.d.ts","sourceRoot":"","sources":["../src/policy.ts"],"names":[],"mappings":"AAUA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB,8DAA8D;AAC9D,eAAO,MAAM,QAAQ,mCAAiC,CAAC;AACvD,MAAM,MAAM,QAAQ,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,QAAQ,CAAC,CAAC;AAEhD,kEAAkE;AAClE,eAAO,MAAM,WAAW;;;;;;;;;EAKb,CAAC;AACZ,MAAM,MAAM,WAAW,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,WAAW,CAAC,CAAC;AAEtD,eAAO,MAAM,eAAe;;;IAIxB,mEAAmE;;;;;;;;;;EAG5D,CAAC;AACZ,MAAM,MAAM,eAAe,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,eAAe,CAAC,CAAC;AAU9D,eAAO,MAAM,aAAa;;;;QAdtB,mEAAmE;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAoB5D,CAAC;AACZ,MAAM,MAAM,aAAa,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,aAAa,CAAC,CAAC;AAE1D,wEAAwE;AACxE,eAAO,MAAM,aAAa;;;;;;;;;EAKf,CAAC;AACZ,MAAM,MAAM,aAAa,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,aAAa,CAAC,CAAC;AAE1D,eAAO,MAAM,cAAc;IAEvB,4DAA4D;;;;;YAlC5D,mEAAmE;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;IAoCnE,kDAAkD;;;;;YApClD,mEAAmE;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAwC5D,CAAC;AACZ,MAAM,MAAM,cAAc,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,cAAc,CAAC,CAAC"}
package/dist/policy.js ADDED
@@ -0,0 +1,58 @@
1
+ // PolicyDecision — the router/policy engine decision, as a Zod schema.
2
+ //
3
+ // Extraction (architecture §1): core/policy/types.ts `PolicyDecision` is an
4
+ // interface today; protocol makes it executable Zod (core re-exports later in
5
+ // R1.2). Structure preserved verbatim: { winner, ranked, handoff }.
6
+ //
7
+ // Domain-neutrality: a PolicyCandidate's `capabilities` are kept OPAQUE
8
+ // (z.unknown()) in v1 — the full @osstack/core Capability schema is deliberately
9
+ // NOT pre-imported (owner constraint, same discipline as Task.evaluation).
10
+ import { z } from "zod";
11
+ /** Cost tier of a candidate agent (mirrors core CostTier). */
12
+ export const CostTier = z.enum(["low", "mid", "high"]);
13
+ /** A rule's partial contribution to a candidate's total score. */
14
+ export const PolicyScore = z
15
+ .object({
16
+ value: z.number(),
17
+ reason: z.string(),
18
+ })
19
+ .strict();
20
+ export const PolicyCandidate = z
21
+ .object({
22
+ agent_id: z.string().min(1),
23
+ cost_tier: CostTier,
24
+ /** Opaque in v1 — core's Capability schema is not pre-imported. */
25
+ capabilities: z.array(z.unknown()),
26
+ })
27
+ .strict();
28
+ const PolicyBreakdownEntry = z
29
+ .object({
30
+ rule_id: z.string(),
31
+ value: z.number(),
32
+ reason: z.string(),
33
+ })
34
+ .strict();
35
+ export const PolicyOutcome = z
36
+ .object({
37
+ candidate: PolicyCandidate,
38
+ total: z.number(),
39
+ breakdown: z.array(PolicyBreakdownEntry),
40
+ })
41
+ .strict();
42
+ /** Handoff gate: when triggered, dispatch pauses for human approval. */
43
+ export const PolicyHandoff = z
44
+ .object({
45
+ triggered: z.boolean(),
46
+ reason: z.string().optional(),
47
+ })
48
+ .strict();
49
+ export const PolicyDecision = z
50
+ .object({
51
+ /** Winning outcome, or null when no candidate qualified. */
52
+ winner: PolicyOutcome.nullable(),
53
+ /** All candidates, sorted desc by total score. */
54
+ ranked: z.array(PolicyOutcome),
55
+ handoff: PolicyHandoff,
56
+ })
57
+ .strict();
58
+ //# sourceMappingURL=policy.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"policy.js","sourceRoot":"","sources":["../src/policy.ts"],"names":[],"mappings":"AAAA,uEAAuE;AACvE,EAAE;AACF,4EAA4E;AAC5E,8EAA8E;AAC9E,oEAAoE;AACpE,EAAE;AACF,wEAAwE;AACxE,iFAAiF;AACjF,2EAA2E;AAE3E,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB,8DAA8D;AAC9D,MAAM,CAAC,MAAM,QAAQ,GAAG,CAAC,CAAC,IAAI,CAAC,CAAC,KAAK,EAAE,KAAK,EAAE,MAAM,CAAC,CAAC,CAAC;AAGvD,kEAAkE;AAClE,MAAM,CAAC,MAAM,WAAW,GAAG,CAAC;KACzB,MAAM,CAAC;IACN,KAAK,EAAE,CAAC,CAAC,MAAM,EAAE;IACjB,MAAM,EAAE,CAAC,CAAC,MAAM,EAAE;CACnB,CAAC;KACD,MAAM,EAAE,CAAC;AAGZ,MAAM,CAAC,MAAM,eAAe,GAAG,CAAC;KAC7B,MAAM,CAAC;IACN,QAAQ,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC;IAC3B,SAAS,EAAE,QAAQ;IACnB,mEAAmE;IACnE,YAAY,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,OAAO,EAAE,CAAC;CACnC,CAAC;KACD,MAAM,EAAE,CAAC;AAGZ,MAAM,oBAAoB,GAAG,CAAC;KAC3B,MAAM,CAAC;IACN,OAAO,EAAE,CAAC,CAAC,MAAM,EAAE;IACnB,KAAK,EAAE,CAAC,CAAC,MAAM,EAAE;IACjB,MAAM,EAAE,CAAC,CAAC,MAAM,EAAE;CACnB,CAAC;KACD,MAAM,EAAE,CAAC;AAEZ,MAAM,CAAC,MAAM,aAAa,GAAG,CAAC;KAC3B,MAAM,CAAC;IACN,SAAS,EAAE,eAAe;IAC1B,KAAK,EAAE,CAAC,CAAC,MAAM,EAAE;IACjB,SAAS,EAAE,CAAC,CAAC,KAAK,CAAC,oBAAoB,CAAC;CACzC,CAAC;KACD,MAAM,EAAE,CAAC;AAGZ,wEAAwE;AACxE,MAAM,CAAC,MAAM,aAAa,GAAG,CAAC;KAC3B,MAAM,CAAC;IACN,SAAS,EAAE,CAAC,CAAC,OAAO,EAAE;IACtB,MAAM,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;CAC9B,CAAC;KACD,MAAM,EAAE,CAAC;AAGZ,MAAM,CAAC,MAAM,cAAc,GAAG,CAAC;KAC5B,MAAM,CAAC;IACN,4DAA4D;IAC5D,MAAM,EAAE,aAAa,CAAC,QAAQ,EAAE;IAChC,kDAAkD;IAClD,MAAM,EAAE,CAAC,CAAC,KAAK,CAAC,aAAa,CAAC;IAC9B,OAAO,EAAE,aAAa;CACvB,CAAC;KACD,MAAM,EAAE,CAAC"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=protocol.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"protocol.test.d.ts","sourceRoot":"","sources":["../src/protocol.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,251 @@
1
+ // Protocol contract tests: fixture parsing, invalid rejection, backward-compat
2
+ // corpus, consumer-lenient parsing, and the A-003 status<->code mapping.
3
+ import { readFileSync, readdirSync } from "node:fs";
4
+ import { fileURLToPath } from "node:url";
5
+ import { describe, expect, it } from "vitest";
6
+ import { AgentCommand, AgentCommandResult, ApprovalDecision, ApprovalRequest, EventEnvelope, EvidenceRef, parseInboundAgentCommand, parseInboundAgentCommandResult, PolicyDecision, RunSummary, Task, } from "./index.js";
7
+ const VALID_DIR = fileURLToPath(new URL("../fixtures/valid", import.meta.url));
8
+ const INVALID_DIR = fileURLToPath(new URL("../fixtures/invalid", import.meta.url));
9
+ /** Maps a fixture's schema key to the strict schema that must validate it. */
10
+ const SCHEMA_BY_KEY = {
11
+ task: Task,
12
+ "run-summary": RunSummary,
13
+ "event-envelope": EventEnvelope,
14
+ "evidence-ref": EvidenceRef,
15
+ "approval-request": ApprovalRequest,
16
+ "approval-decision": ApprovalDecision,
17
+ "policy-decision": PolicyDecision,
18
+ "agent-command": AgentCommand,
19
+ "agent-command-result": AgentCommandResult,
20
+ };
21
+ /** Fixture filename -> schema key: strip the .(valid|invalid).json suffix, then
22
+ * drop any `__variant` discriminator (e.g. agent-command-result__blocked). */
23
+ function schemaKeyOf(filename) {
24
+ const base = filename.replace(/\.(valid|invalid)\.json$/, "");
25
+ return base.split("__")[0];
26
+ }
27
+ function readJson(dir, filename) {
28
+ return JSON.parse(readFileSync(`${dir}/${filename}`, "utf-8"));
29
+ }
30
+ function schemaFor(filename) {
31
+ const key = schemaKeyOf(filename);
32
+ const schema = SCHEMA_BY_KEY[key];
33
+ if (!schema)
34
+ throw new Error(`no schema registered for key '${key}' (fixture ${filename})`);
35
+ return schema;
36
+ }
37
+ const validFiles = readdirSync(VALID_DIR).filter((f) => f.endsWith(".valid.json")).sort();
38
+ const invalidFiles = readdirSync(INVALID_DIR).filter((f) => f.endsWith(".invalid.json")).sort();
39
+ // ── Backward-compatibility corpus (A-007) ─────────────────────────────────
40
+ // APPEND-ONLY. Every fixture published for protocol major 1 MUST parse against
41
+ // all later minors, forever. Never delete or mutate an entry; a breaking change
42
+ // is a new MAJOR with a new fixture directory. Adding a row is allowed.
43
+ const FROZEN_V1_FIXTURES = [
44
+ "agent-command-result.valid.json",
45
+ "agent-command-result__blocked.valid.json",
46
+ "agent-command-result__error.valid.json",
47
+ "agent-command-result__needs-approval.valid.json",
48
+ "agent-command.valid.json",
49
+ "approval-decision.valid.json",
50
+ "approval-request.valid.json",
51
+ "event-envelope.valid.json",
52
+ "evidence-ref.valid.json",
53
+ "policy-decision.valid.json",
54
+ "run-summary.valid.json",
55
+ "task.valid.json",
56
+ ];
57
+ describe("valid fixtures parse with their schema", () => {
58
+ it("covers at least one fixture per protocol type", () => {
59
+ const keys = new Set(validFiles.map(schemaKeyOf));
60
+ for (const key of Object.keys(SCHEMA_BY_KEY)) {
61
+ expect(keys, `missing a valid fixture for '${key}'`).toContain(key);
62
+ }
63
+ });
64
+ for (const filename of validFiles) {
65
+ it(`parses ${filename}`, () => {
66
+ const result = schemaFor(filename).safeParse(readJson(VALID_DIR, filename));
67
+ if (!result.success) {
68
+ throw new Error(`${filename} should parse but failed:\n${result.error.toString()}`);
69
+ }
70
+ expect(result.success).toBe(true);
71
+ });
72
+ }
73
+ });
74
+ describe("invalid fixtures are rejected and document why", () => {
75
+ it("covers at least one invalid fixture per protocol type", () => {
76
+ const keys = new Set(invalidFiles.map(schemaKeyOf));
77
+ for (const key of Object.keys(SCHEMA_BY_KEY)) {
78
+ expect(keys, `missing an invalid fixture for '${key}'`).toContain(key);
79
+ }
80
+ });
81
+ for (const filename of invalidFiles) {
82
+ it(`rejects ${filename}`, () => {
83
+ const fixture = readJson(INVALID_DIR, filename);
84
+ expect(typeof fixture.$reason, `${filename} must document a $reason`).toBe("string");
85
+ expect(fixture.$reason.length).toBeGreaterThan(0);
86
+ expect("value" in fixture, `${filename} must carry a value`).toBe(true);
87
+ const result = schemaFor(filename).safeParse(fixture.value);
88
+ expect(result.success, `${filename} should be rejected but parsed`).toBe(false);
89
+ });
90
+ }
91
+ });
92
+ describe("backward-compatibility corpus (A-007, append-only)", () => {
93
+ it("the on-disk valid corpus exactly matches FROZEN_V1_FIXTURES", () => {
94
+ // Two-way equality: nothing added without registering, nothing frozen removed.
95
+ expect(validFiles).toEqual([...FROZEN_V1_FIXTURES].sort());
96
+ });
97
+ it("every frozen fixture still parses under the current schemas", () => {
98
+ for (const filename of FROZEN_V1_FIXTURES) {
99
+ const result = schemaFor(filename).safeParse(readJson(VALID_DIR, filename));
100
+ expect(result.success, `${filename} broke backward compatibility`).toBe(true);
101
+ }
102
+ });
103
+ });
104
+ describe("consumer-lenient vs producer-strict (A-007)", () => {
105
+ it("an unknown extra field fails the strict schema but passes the lenient parser", () => {
106
+ const fixture = readJson(INVALID_DIR, "agent-command__unknown-field.invalid.json");
107
+ // Producer-strict rejects the unknown field.
108
+ expect(AgentCommand.safeParse(fixture.value).success).toBe(false);
109
+ // Consumer-lenient accepts it and preserves the passthrough field.
110
+ const parsed = parseInboundAgentCommand(fixture.value);
111
+ expect(parsed.command).toBe("portfolio.daily");
112
+ expect(parsed.debug).toBe(true);
113
+ });
114
+ it("the lenient result parser tolerates unknown fields but still enforces A-003", () => {
115
+ const okWithExtra = {
116
+ protocol_version: "1.0",
117
+ status: "ok",
118
+ result: {},
119
+ trace_id: "abc",
120
+ };
121
+ expect(AgentCommandResult.safeParse(okWithExtra).success).toBe(false); // strict rejects extra
122
+ expect(() => parseInboundAgentCommandResult(okWithExtra)).not.toThrow(); // lenient accepts
123
+ // Business rule still enforced by the lenient parser.
124
+ expect(() => parseInboundAgentCommandResult({ protocol_version: "1.0", status: "error", trace_id: "x" })).toThrow();
125
+ });
126
+ });
127
+ describe("deep consumer leniency (A-007 — unknown fields in NESTED objects)", () => {
128
+ it("v1.1-style unknown field inside actor: lenient accepts, strict rejects", () => {
129
+ const command = {
130
+ protocol_version: "1.1",
131
+ command: "portfolio.daily",
132
+ actor: { type: "human", id: "osborn", display_name: "Osborn" },
133
+ input: {},
134
+ };
135
+ expect(AgentCommand.safeParse(command).success).toBe(false);
136
+ const parsed = parseInboundAgentCommand(command);
137
+ expect(parsed.actor.id).toBe("osborn");
138
+ expect(parsed.actor.display_name).toBe("Osborn");
139
+ });
140
+ it("unknown field inside scope: lenient accepts, strict rejects", () => {
141
+ const command = {
142
+ protocol_version: "1.1",
143
+ command: "delivery.start",
144
+ actor: { type: "agent", id: "claude-code" },
145
+ scope: { repo_id: "osborn-pa", branch: "main" },
146
+ input: {},
147
+ };
148
+ expect(AgentCommand.safeParse(command).success).toBe(false);
149
+ expect(() => parseInboundAgentCommand(command)).not.toThrow();
150
+ });
151
+ it("unknown field inside an ApprovalRequest item: lenient accepts, strict rejects", () => {
152
+ const result = {
153
+ protocol_version: "1.1",
154
+ status: "needs_approval",
155
+ required_approvals: [
156
+ {
157
+ approval_id: "appr_01",
158
+ action: "Deploy to production",
159
+ risk: "high",
160
+ requested_at: "2026-07-11T09:05:00.000Z",
161
+ expires_at: "2026-07-12T09:05:00.000Z",
162
+ },
163
+ ],
164
+ };
165
+ expect(AgentCommandResult.safeParse(result).success).toBe(false);
166
+ expect(() => parseInboundAgentCommandResult(result)).not.toThrow();
167
+ });
168
+ it("unknown field inside an EvidenceRef item: lenient accepts, strict rejects", () => {
169
+ const result = {
170
+ protocol_version: "1.1",
171
+ status: "ok",
172
+ evidence_refs: [{ kind: "proof", ref: "release/proof/", bytes: 1024 }],
173
+ };
174
+ expect(AgentCommandResult.safeParse(result).success).toBe(false);
175
+ expect(() => parseInboundAgentCommandResult(result)).not.toThrow();
176
+ });
177
+ it("unknown field inside the error object: lenient accepts, strict rejects", () => {
178
+ const result = {
179
+ protocol_version: "1.1",
180
+ status: "error",
181
+ error: { code: "internal", message: "boom", retryable: true, trace_id: "t_1" },
182
+ };
183
+ expect(AgentCommandResult.safeParse(result).success).toBe(false);
184
+ expect(() => parseInboundAgentCommandResult(result)).not.toThrow();
185
+ });
186
+ it("deep leniency does not weaken A-003: nested-lenient blocked result still needs a blocked code", () => {
187
+ const result = {
188
+ protocol_version: "1.1",
189
+ status: "blocked",
190
+ error: { code: "internal", message: "boom", retryable: true, trace_id: "t_1" },
191
+ };
192
+ expect(() => parseInboundAgentCommandResult(result)).toThrow();
193
+ });
194
+ });
195
+ describe("A-003 / A-006 status<->code mapping", () => {
196
+ it("accepts status ok without an error object", () => {
197
+ expect(AgentCommandResult.safeParse({ protocol_version: "1.0", status: "ok", result: {} }).success).toBe(true);
198
+ });
199
+ it("rejects status error without an error object", () => {
200
+ expect(AgentCommandResult.safeParse({ protocol_version: "1.0", status: "error" }).success).toBe(false);
201
+ });
202
+ it("rejects status blocked with an internal (non-blocked) error code", () => {
203
+ expect(AgentCommandResult.safeParse({
204
+ protocol_version: "1.0",
205
+ status: "blocked",
206
+ error: { code: "internal", message: "boom", retryable: true },
207
+ }).success).toBe(false);
208
+ });
209
+ it("accepts status blocked with policy_denied and budget_exceeded", () => {
210
+ for (const code of ["policy_denied", "budget_exceeded"]) {
211
+ expect(AgentCommandResult.safeParse({
212
+ protocol_version: "1.0",
213
+ status: "blocked",
214
+ error: { code, message: "denied", retryable: false },
215
+ }).success, `blocked+${code} should be accepted`).toBe(true);
216
+ }
217
+ });
218
+ it("rejects status error carrying a blocked-only code (A-006)", () => {
219
+ expect(AgentCommandResult.safeParse({
220
+ protocol_version: "1.0",
221
+ status: "error",
222
+ error: { code: "policy_denied", message: "denied", retryable: false },
223
+ }).success).toBe(false);
224
+ });
225
+ it("rejects status needs_approval with an empty required_approvals", () => {
226
+ expect(AgentCommandResult.safeParse({
227
+ protocol_version: "1.0",
228
+ status: "needs_approval",
229
+ required_approvals: [],
230
+ }).success).toBe(false);
231
+ });
232
+ it("rejects retryable:true on a non-transient code (A-006), strict and lenient", () => {
233
+ const result = {
234
+ protocol_version: "1.0",
235
+ status: "error",
236
+ error: { code: "not_found", message: "no such run", retryable: true },
237
+ };
238
+ expect(AgentCommandResult.safeParse(result).success).toBe(false);
239
+ expect(() => parseInboundAgentCommandResult(result)).toThrow();
240
+ });
241
+ it("accepts retryable:true for the transient codes internal and conflict (A-006)", () => {
242
+ for (const code of ["internal", "conflict"]) {
243
+ expect(AgentCommandResult.safeParse({
244
+ protocol_version: "1.0",
245
+ status: "error",
246
+ error: { code, message: "transient", retryable: true },
247
+ }).success, `error+${code}+retryable should be accepted`).toBe(true);
248
+ }
249
+ });
250
+ });
251
+ //# sourceMappingURL=protocol.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"protocol.test.js","sourceRoot":"","sources":["../src/protocol.test.ts"],"names":[],"mappings":"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"}
package/dist/run.d.ts ADDED
@@ -0,0 +1,34 @@
1
+ import { z } from "zod";
2
+ /** Terminal outcome of a run (common denominator of executor AgentRun outcomes). */
3
+ export declare const RunOutcome: z.ZodEnum<["completed", "failed", "cancelled"]>;
4
+ export type RunOutcome = z.infer<typeof RunOutcome>;
5
+ export declare const RunSummary: z.ZodObject<{
6
+ run_id: z.ZodString;
7
+ task_id: z.ZodString;
8
+ agent_id: z.ZodString;
9
+ outcome: z.ZodEnum<["completed", "failed", "cancelled"]>;
10
+ started_at: z.ZodString;
11
+ completed_at: z.ZodOptional<z.ZodString>;
12
+ duration_ms: z.ZodOptional<z.ZodNumber>;
13
+ summary: z.ZodOptional<z.ZodString>;
14
+ }, "strict", z.ZodTypeAny, {
15
+ run_id: string;
16
+ agent_id: string;
17
+ task_id: string;
18
+ outcome: "completed" | "failed" | "cancelled";
19
+ started_at: string;
20
+ completed_at?: string | undefined;
21
+ duration_ms?: number | undefined;
22
+ summary?: string | undefined;
23
+ }, {
24
+ run_id: string;
25
+ agent_id: string;
26
+ task_id: string;
27
+ outcome: "completed" | "failed" | "cancelled";
28
+ started_at: string;
29
+ completed_at?: string | undefined;
30
+ duration_ms?: number | undefined;
31
+ summary?: string | undefined;
32
+ }>;
33
+ export type RunSummary = z.infer<typeof RunSummary>;
34
+ //# sourceMappingURL=run.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"run.d.ts","sourceRoot":"","sources":["../src/run.ts"],"names":[],"mappings":"AAUA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB,oFAAoF;AACpF,eAAO,MAAM,UAAU,iDAA+C,CAAC;AACvE,MAAM,MAAM,UAAU,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,UAAU,CAAC,CAAC;AAEpD,eAAO,MAAM,UAAU;;;;;;;;;;;;;;;;;;;;;;;;;;;EAWZ,CAAC;AACZ,MAAM,MAAM,UAAU,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,UAAU,CAAC,CAAC"}