@moxxy/sdk 0.39.0 → 0.41.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 (67) hide show
  1. package/README.md +2 -2
  2. package/dist/computer-control.d.ts +81 -0
  3. package/dist/computer-control.d.ts.map +1 -0
  4. package/dist/computer-control.js +19 -0
  5. package/dist/computer-control.js.map +1 -0
  6. package/dist/events.d.ts +14 -0
  7. package/dist/events.d.ts.map +1 -1
  8. package/dist/index.d.ts +6 -2
  9. package/dist/index.d.ts.map +1 -1
  10. package/dist/index.js +2 -0
  11. package/dist/index.js.map +1 -1
  12. package/dist/mode/collect-stream.d.ts +3 -0
  13. package/dist/mode/collect-stream.d.ts.map +1 -1
  14. package/dist/mode/collect-stream.js +78 -60
  15. package/dist/mode/collect-stream.js.map +1 -1
  16. package/dist/mode/project-messages.d.ts.map +1 -1
  17. package/dist/mode/project-messages.js +4 -1
  18. package/dist/mode/project-messages.js.map +1 -1
  19. package/dist/mode/provider-timing.d.ts +11 -0
  20. package/dist/mode/provider-timing.d.ts.map +1 -0
  21. package/dist/mode/provider-timing.js +15 -0
  22. package/dist/mode/provider-timing.js.map +1 -0
  23. package/dist/mode/react-loop.d.ts.map +1 -1
  24. package/dist/mode/react-loop.js +5 -1
  25. package/dist/mode/react-loop.js.map +1 -1
  26. package/dist/mode.d.ts +3 -1
  27. package/dist/mode.d.ts.map +1 -1
  28. package/dist/permission.d.ts +3 -0
  29. package/dist/permission.d.ts.map +1 -1
  30. package/dist/provider-utils.js +41 -7
  31. package/dist/provider-utils.js.map +1 -1
  32. package/dist/session-like.d.ts +6 -1
  33. package/dist/session-like.d.ts.map +1 -1
  34. package/dist/tool-dispatch.d.ts +2 -1
  35. package/dist/tool-dispatch.d.ts.map +1 -1
  36. package/dist/tool-dispatch.js +15 -1
  37. package/dist/tool-dispatch.js.map +1 -1
  38. package/dist/tool.d.ts +6 -0
  39. package/dist/tool.d.ts.map +1 -1
  40. package/dist/workflow-approval.d.ts +135 -0
  41. package/dist/workflow-approval.d.ts.map +1 -0
  42. package/dist/workflow-approval.js +18 -0
  43. package/dist/workflow-approval.js.map +1 -0
  44. package/dist/workflow.d.ts +3 -3
  45. package/dist/workflow.d.ts.map +1 -1
  46. package/package.json +6 -2
  47. package/src/computer-control.test.ts +17 -0
  48. package/src/computer-control.ts +31 -0
  49. package/src/events.ts +15 -0
  50. package/src/index.ts +12 -0
  51. package/src/loop-helpers.test.ts +15 -0
  52. package/src/mode/collect-stream.ts +18 -0
  53. package/src/mode/project-messages.ts +4 -1
  54. package/src/mode/provider-timing.test.ts +16 -0
  55. package/src/mode/provider-timing.ts +19 -0
  56. package/src/mode/react-loop.ts +5 -1
  57. package/src/mode.ts +1 -1
  58. package/src/permission.ts +3 -0
  59. package/src/provider-schema-constraints.test.ts +29 -0
  60. package/src/provider-utils.test.ts +1 -1
  61. package/src/provider-utils.ts +33 -5
  62. package/src/session-like.ts +6 -1
  63. package/src/tool-dispatch.ts +27 -3
  64. package/src/tool.ts +7 -0
  65. package/src/workflow-approval.test.ts +12 -0
  66. package/src/workflow-approval.ts +41 -0
  67. package/src/workflow.ts +5 -3
@@ -1 +1 @@
1
- {"version":3,"file":"tool.d.ts","sourceRoot":"","sources":["../src/tool.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"tool.d.ts","sourceRoot":"","sources":["../src/tool.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAC7B,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,UAAU,CAAC;AAC/C,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,gBAAgB,CAAC;AAC/C,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,iBAAiB,CAAC;AACtD,OAAO,KAAK,EAAE,SAAS,EAAE,UAAU,EAAE,MAAM,EAAE,MAAM,UAAU,CAAC;AAC9D,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,eAAe,CAAC;AACrD,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,gBAAgB,CAAC;AAExD;;;;;;;GAOG;AACH,MAAM,MAAM,UAAU,GAAG;IAAE,QAAQ,CAAC,IAAI,EAAE,YAAY,CAAA;CAAE,CAAC;AAEzD,qFAAqF;AACrF,MAAM,WAAW,eAAe;IAC9B,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;IAC3B,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,QAAQ,CAAC,EAAE,MAAM,CAAC;CAC5B;AAED;;;;;;;;;;GAUG;AACH,MAAM,WAAW,UAAU;IACzB,uEAAuE;IACvE,QAAQ,CAAC,QAAQ,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE;QAAE,QAAQ,CAAC,EAAE,cAAc,CAAA;KAAE,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC;IAClF,mFAAmF;IACnF,SAAS,CAAC,QAAQ,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IACzD,qEAAqE;IACrE,OAAO,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,aAAa,CAAC,MAAM,CAAC,CAAC,CAAC;IACzD,qDAAqD;IACrD,IAAI,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,YAAY,CAAC,CAAC;CAC/C;AAED,MAAM,WAAW,YAAY;IAC3B,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IACzB,QAAQ,CAAC,MAAM,EAAE,OAAO,CAAC;IACzB,QAAQ,CAAC,WAAW,EAAE,OAAO,CAAC;CAC/B;AAED;;;;;;;GAOG;AACH,MAAM,WAAW,aAAa;IAC5B,CAAC,GAAG,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,iBAAiB,GAAG,OAAO,CAAC,qBAAqB,CAAC,CAAC;CACzE;AAED,MAAM,WAAW,iBAAiB;IAChC,QAAQ,CAAC,MAAM,CAAC,EAAE,KAAK,GAAG,MAAM,GAAG,MAAM,GAAG,KAAK,GAAG,QAAQ,GAAG,OAAO,CAAC;IACvE,QAAQ,CAAC,OAAO,CAAC,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,CAAC;IACpD,QAAQ,CAAC,IAAI,CAAC,EAAE,MAAM,CAAC;CACxB;AAED,MAAM,WAAW,qBAAqB;IACpC,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;IAC5B,QAAQ,CAAC,OAAO,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,CAAC;IACnD,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;CACvB;AAED;;;;;GAKG;AACH,MAAM,WAAW,YAAY;IAC3B,CACE,OAAO,EAAE,MAAM,EACf,IAAI,CAAC,EAAE,aAAa,CAAC,MAAM,CAAC,EAC5B,IAAI,CAAC,EAAE,gBAAgB,GACtB,OAAO,CAAC,kBAAkB,CAAC,CAAC;CAChC;AAED,MAAM,WAAW,gBAAgB;IAC/B,QAAQ,CAAC,GAAG,CAAC,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,GAAG,CAAC,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,CAAC;IAChD,QAAQ,CAAC,SAAS,CAAC,EAAE,MAAM,CAAC;CAC7B;AAED,MAAM,WAAW,kBAAkB;IACjC,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,QAAQ,EAAE,MAAM,GAAG,IAAI,CAAC;CAClC;AAED,MAAM,WAAW,WAAW;IAC1B,QAAQ,CAAC,SAAS,EAAE,SAAS,CAAC;IAC9B,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,MAAM,EAAE,UAAU,CAAC;IAC5B,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAC;IACrB,QAAQ,CAAC,MAAM,EAAE,WAAW,CAAC;IAC7B,QAAQ,CAAC,GAAG,EAAE,cAAc,CAAC;IAC7B,QAAQ,CAAC,MAAM,EAAE;QACf,KAAK,CAAC,GAAG,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,IAAI,CAAC;QACzD,IAAI,CAAC,GAAG,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,IAAI,CAAC;QACxD,IAAI,CAAC,GAAG,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,IAAI,CAAC;QACxD,KAAK,CAAC,GAAG,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,IAAI,CAAC;KAC1D,CAAC;IACF;;;;;OAKG;IACH,QAAQ,CAAC,SAAS,CAAC,EAAE,eAAe,CAAC;IACrC;;;;;;;OAOG;IACH,QAAQ,CAAC,EAAE,CAAC,EAAE,UAAU,CAAC;IACzB;;;;;OAKG;IACH,QAAQ,CAAC,KAAK,CAAC,EAAE,aAAa,CAAC;IAC/B;;;;OAIG;IACH,QAAQ,CAAC,IAAI,CAAC,EAAE,YAAY,CAAC;IAC7B;;;;;;;;;;;OAWG;IACH,QAAQ,CAAC,SAAS,CAAC,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,CAAC;CAC/D;AAED;;;;;;;;;;GAUG;AACH,MAAM,WAAW,uBAAuB;IACtC,gFAAgF;IAChF,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,6EAA6E;IAC7E,QAAQ,CAAC,IAAI,EAAE;QAAE,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAC;QAAC,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAA;KAAE,CAAC;IAChE;+EAC2E;IAC3E,QAAQ,CAAC,UAAU,CAAC,EAAE,MAAM,CAAC;CAC9B;AAED,MAAM,WAAW,OAAO;IACtB,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC;IAC7B,QAAQ,CAAC,WAAW,EAAE,CAAC,CAAC,UAAU,CAAC;IACnC;;;;;OAKG;IACH,QAAQ,CAAC,eAAe,CAAC,EAAE,OAAO,CAAC;IACnC,QAAQ,CAAC,YAAY,CAAC,EAAE,CAAC,CAAC,UAAU,CAAC;IACrC,8EAA8E;IAC9E,QAAQ,CAAC,MAAM,CAAC,EAAE,UAAU,CAAC;IAC7B,QAAQ,CAAC,UAAU,CAAC,EAAE,cAAc,CAAC;IACrC,QAAQ,CAAC,OAAO,EAAE,CAAC,KAAK,EAAE,OAAO,EAAE,GAAG,EAAE,WAAW,KAAK,OAAO,CAAC,OAAO,CAAC,GAAG,OAAO,CAAC;IACnF,+DAA+D;IAC/D,QAAQ,CAAC,OAAO,CAAC,EAAE,uBAAuB,CAAC;IAC3C;;;;;OAKG;IACH,QAAQ,CAAC,IAAI,CAAC,EAAE,QAAQ,CAAC;IACzB;;;;OAIG;IACH,QAAQ,CAAC,SAAS,CAAC,EAAE,iBAAiB,CAAC;CACxC"}
@@ -0,0 +1,135 @@
1
+ export interface WorkflowApprovalScope {
2
+ readonly workflowId: string;
3
+ readonly workflowName: string;
4
+ readonly revision: string;
5
+ readonly runId: string;
6
+ }
7
+ export type WorkflowApprovalChoice = 'allow_once' | 'allow_always' | 'deny';
8
+ export interface WorkflowApprovalItem extends WorkflowApprovalScope {
9
+ readonly id: string;
10
+ readonly tool: string;
11
+ readonly input: unknown;
12
+ readonly createdAt: number;
13
+ readonly status: 'pending' | 'allowed' | 'denied' | 'cancelled' | 'interrupted' | 'revoked';
14
+ readonly choice?: WorkflowApprovalChoice;
15
+ }
16
+ export interface WorkflowApprovalsView {
17
+ list(): Promise<ReadonlyArray<WorkflowApprovalItem>>;
18
+ decide(id: string, choice: WorkflowApprovalChoice): Promise<void>;
19
+ revoke(id: string): Promise<void>;
20
+ cancel(id: string): Promise<void>;
21
+ }
22
+ import { z } from 'zod';
23
+ export declare const workflowApprovalItemSchema: z.ZodEffects<z.ZodObject<{
24
+ id: z.ZodString;
25
+ workflowId: z.ZodString;
26
+ workflowName: z.ZodString;
27
+ revision: z.ZodString;
28
+ runId: z.ZodString;
29
+ tool: z.ZodString;
30
+ input: z.ZodUnknown;
31
+ createdAt: z.ZodNumber;
32
+ status: z.ZodEnum<["pending", "allowed", "denied", "cancelled", "interrupted", "revoked"]>;
33
+ choice: z.ZodOptional<z.ZodEnum<["allow_once", "allow_always", "deny"]>>;
34
+ }, "strict", z.ZodTypeAny, {
35
+ tool: string;
36
+ id: string;
37
+ status: "denied" | "pending" | "allowed" | "cancelled" | "interrupted" | "revoked";
38
+ workflowId: string;
39
+ workflowName: string;
40
+ revision: string;
41
+ runId: string;
42
+ createdAt: number;
43
+ input?: unknown;
44
+ choice?: "allow_always" | "deny" | "allow_once" | undefined;
45
+ }, {
46
+ tool: string;
47
+ id: string;
48
+ status: "denied" | "pending" | "allowed" | "cancelled" | "interrupted" | "revoked";
49
+ workflowId: string;
50
+ workflowName: string;
51
+ revision: string;
52
+ runId: string;
53
+ createdAt: number;
54
+ input?: unknown;
55
+ choice?: "allow_always" | "deny" | "allow_once" | undefined;
56
+ }>, {
57
+ input: unknown;
58
+ tool: string;
59
+ id: string;
60
+ status: "denied" | "pending" | "allowed" | "cancelled" | "interrupted" | "revoked";
61
+ workflowId: string;
62
+ workflowName: string;
63
+ revision: string;
64
+ runId: string;
65
+ createdAt: number;
66
+ choice?: "allow_always" | "deny" | "allow_once" | undefined;
67
+ }, {
68
+ tool: string;
69
+ id: string;
70
+ status: "denied" | "pending" | "allowed" | "cancelled" | "interrupted" | "revoked";
71
+ workflowId: string;
72
+ workflowName: string;
73
+ revision: string;
74
+ runId: string;
75
+ createdAt: number;
76
+ input?: unknown;
77
+ choice?: "allow_always" | "deny" | "allow_once" | undefined;
78
+ }>;
79
+ export declare const workflowApprovalItemsSchema: z.ZodArray<z.ZodEffects<z.ZodObject<{
80
+ id: z.ZodString;
81
+ workflowId: z.ZodString;
82
+ workflowName: z.ZodString;
83
+ revision: z.ZodString;
84
+ runId: z.ZodString;
85
+ tool: z.ZodString;
86
+ input: z.ZodUnknown;
87
+ createdAt: z.ZodNumber;
88
+ status: z.ZodEnum<["pending", "allowed", "denied", "cancelled", "interrupted", "revoked"]>;
89
+ choice: z.ZodOptional<z.ZodEnum<["allow_once", "allow_always", "deny"]>>;
90
+ }, "strict", z.ZodTypeAny, {
91
+ tool: string;
92
+ id: string;
93
+ status: "denied" | "pending" | "allowed" | "cancelled" | "interrupted" | "revoked";
94
+ workflowId: string;
95
+ workflowName: string;
96
+ revision: string;
97
+ runId: string;
98
+ createdAt: number;
99
+ input?: unknown;
100
+ choice?: "allow_always" | "deny" | "allow_once" | undefined;
101
+ }, {
102
+ tool: string;
103
+ id: string;
104
+ status: "denied" | "pending" | "allowed" | "cancelled" | "interrupted" | "revoked";
105
+ workflowId: string;
106
+ workflowName: string;
107
+ revision: string;
108
+ runId: string;
109
+ createdAt: number;
110
+ input?: unknown;
111
+ choice?: "allow_always" | "deny" | "allow_once" | undefined;
112
+ }>, {
113
+ input: unknown;
114
+ tool: string;
115
+ id: string;
116
+ status: "denied" | "pending" | "allowed" | "cancelled" | "interrupted" | "revoked";
117
+ workflowId: string;
118
+ workflowName: string;
119
+ revision: string;
120
+ runId: string;
121
+ createdAt: number;
122
+ choice?: "allow_always" | "deny" | "allow_once" | undefined;
123
+ }, {
124
+ tool: string;
125
+ id: string;
126
+ status: "denied" | "pending" | "allowed" | "cancelled" | "interrupted" | "revoked";
127
+ workflowId: string;
128
+ workflowName: string;
129
+ revision: string;
130
+ runId: string;
131
+ createdAt: number;
132
+ input?: unknown;
133
+ choice?: "allow_always" | "deny" | "allow_once" | undefined;
134
+ }>, "many">;
135
+ //# sourceMappingURL=workflow-approval.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"workflow-approval.d.ts","sourceRoot":"","sources":["../src/workflow-approval.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,qBAAqB;IACpC,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;IAC5B,QAAQ,CAAC,YAAY,EAAE,MAAM,CAAC;IAC9B,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;IAC1B,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;CACxB;AAED,MAAM,MAAM,sBAAsB,GAAG,YAAY,GAAG,cAAc,GAAG,MAAM,CAAC;AAC5E,MAAM,WAAW,oBAAqB,SAAQ,qBAAqB;IACjE,QAAQ,CAAC,EAAE,EAAE,MAAM,CAAC;IACpB,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,KAAK,EAAE,OAAO,CAAC;IACxB,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;IAC3B,QAAQ,CAAC,MAAM,EAAE,SAAS,GAAG,SAAS,GAAG,QAAQ,GAAG,WAAW,GAAG,aAAa,GAAG,SAAS,CAAC;IAC5F,QAAQ,CAAC,MAAM,CAAC,EAAE,sBAAsB,CAAC;CAC1C;AAED,MAAM,WAAW,qBAAqB;IACpC,IAAI,IAAI,OAAO,CAAC,aAAa,CAAC,oBAAoB,CAAC,CAAC,CAAC;IACrD,MAAM,CAAC,EAAE,EAAE,MAAM,EAAE,MAAM,EAAE,sBAAsB,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAClE,MAAM,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAClC,MAAM,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;CACnC;AACD,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB,eAAO,MAAM,0BAA0B;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAciB,CAAC;AACzD,eAAO,MAAM,2BAA2B;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;WAAsC,CAAC"}
@@ -0,0 +1,18 @@
1
+ import { z } from 'zod';
2
+ export const workflowApprovalItemSchema = z
3
+ .object({
4
+ id: z.string().uuid(),
5
+ workflowId: z.string().min(1),
6
+ workflowName: z.string().min(1),
7
+ revision: z.string().min(1),
8
+ runId: z.string().min(1),
9
+ tool: z.string().min(1),
10
+ input: z.unknown(),
11
+ createdAt: z.number().finite().positive(),
12
+ status: z.enum(['pending', 'allowed', 'denied', 'cancelled', 'interrupted', 'revoked']),
13
+ choice: z.enum(['allow_once', 'allow_always', 'deny']).optional(),
14
+ })
15
+ .strict()
16
+ .transform((item) => ({ ...item, input: item.input }));
17
+ export const workflowApprovalItemsSchema = z.array(workflowApprovalItemSchema);
18
+ //# sourceMappingURL=workflow-approval.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"workflow-approval.js","sourceRoot":"","sources":["../src/workflow-approval.ts"],"names":[],"mappings":"AAuBA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB,MAAM,CAAC,MAAM,0BAA0B,GAAG,CAAC;KACxC,MAAM,CAAC;IACN,EAAE,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,IAAI,EAAE;IACrB,UAAU,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC;IAC7B,YAAY,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC;IAC/B,QAAQ,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC;IAC3B,KAAK,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC;IACxB,IAAI,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC;IACvB,KAAK,EAAE,CAAC,CAAC,OAAO,EAAE;IAClB,SAAS,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;IACzC,MAAM,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,SAAS,EAAE,SAAS,EAAE,QAAQ,EAAE,WAAW,EAAE,aAAa,EAAE,SAAS,CAAC,CAAC;IACvF,MAAM,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,YAAY,EAAE,cAAc,EAAE,MAAM,CAAC,CAAC,CAAC,QAAQ,EAAE;CAClE,CAAC;KACD,MAAM,EAAE;KACR,SAAS,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC,EAAE,GAAG,IAAI,EAAE,KAAK,EAAE,IAAI,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC;AACzD,MAAM,CAAC,MAAM,2BAA2B,GAAG,CAAC,CAAC,KAAK,CAAC,0BAA0B,CAAC,CAAC"}
@@ -176,7 +176,7 @@ export interface WorkflowLookup {
176
176
  workflow(name: string): Workflow | undefined;
177
177
  }
178
178
  /** Lifecycle subtypes an executor emits as `plugin_event`s (mirrors plan_*). */
179
- export type WorkflowEventSubtype = 'workflow_started' | 'workflow_step_started' | 'workflow_step_completed' | 'workflow_step_skipped' | 'workflow_step_failed' | 'workflow_step_awaiting_input' | 'workflow_paused' | 'workflow_resumed' | 'workflow_completed' | 'workflow_failed';
179
+ export type WorkflowEventSubtype = 'workflow_started' | 'workflow_step_started' | 'workflow_step_completed' | 'workflow_step_skipped' | 'workflow_step_failed' | 'workflow_step_cancelled' | 'workflow_step_awaiting_input' | 'workflow_paused' | 'workflow_resumed' | 'workflow_completed' | 'workflow_failed' | 'workflow_cancelled';
180
180
  /**
181
181
  * Everything an executor needs to run a workflow, supplied by the caller.
182
182
  * The in-turn `workflow_run` tool wires `spawner` from `ctx.subagents`; the
@@ -203,8 +203,8 @@ export interface WorkflowRunDeps {
203
203
  /** Nested-workflow recursion depth; executors guard against runaway nesting. */
204
204
  readonly depth?: number;
205
205
  }
206
- export type WorkflowStepStatus = 'completed' | 'skipped' | 'failed' | 'awaiting_input';
207
- export type WorkflowRunStatus = 'completed' | 'paused' | 'failed';
206
+ export type WorkflowStepStatus = 'completed' | 'skipped' | 'failed' | 'awaiting_input' | 'cancelled';
207
+ export type WorkflowRunStatus = 'completed' | 'paused' | 'failed' | 'cancelled';
208
208
  export interface WorkflowStepResult {
209
209
  readonly id: string;
210
210
  readonly status: WorkflowStepStatus;
@@ -1 +1 @@
1
- {"version":3,"file":"workflow.d.ts","sourceRoot":"","sources":["../src/workflow.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"workflow.d.ts","sourceRoot":"","sources":["../src/workflow.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@moxxy/sdk",
3
- "version": "0.39.0",
3
+ "version": "0.41.0",
4
4
  "description": "Typed public surface for the moxxy framework: event types, define* factories, lifecycle hook signatures.",
5
5
  "keywords": [
6
6
  "moxxy",
@@ -34,7 +34,7 @@
34
34
  "author": "Michal Makowski <michal.makowski97@gmail.com>",
35
35
  "license": "MIT",
36
36
  "engines": {
37
- "node": ">=20.10.0"
37
+ "node": ">=20.19.0"
38
38
  },
39
39
  "sideEffects": false,
40
40
  "type": "module",
@@ -53,6 +53,10 @@
53
53
  "types": "./dist/tool-display.d.ts",
54
54
  "import": "./dist/tool-display.js"
55
55
  },
56
+ "./workflow-approval": {
57
+ "types": "./dist/workflow-approval.d.ts",
58
+ "import": "./dist/workflow-approval.js"
59
+ },
56
60
  "./transcriber": {
57
61
  "types": "./dist/transcriber.d.ts",
58
62
  "import": "./dist/transcriber.js"
@@ -0,0 +1,17 @@
1
+ import { expect, it } from 'vitest';
2
+ import { computerControlCommandSchema, computerControlSnapshotSchema } from './computer-control.js';
3
+
4
+ it('requires exact session and turn ownership for human control commands', () => {
5
+ const command={sessionId:'session-a',turnId:'turn-a',command:'stop'};
6
+ expect(computerControlCommandSchema.safeParse(command).success).toBe(true);
7
+ expect(computerControlCommandSchema.safeParse({turnId:'turn-a',command:'stop'}).success).toBe(false);
8
+ expect(computerControlCommandSchema.safeParse({...command,command:'restart'}).success).toBe(false);
9
+ expect(computerControlCommandSchema.safeParse({...command,workspaceId:'unexpected'}).success).toBe(false);
10
+ });
11
+
12
+ it('validates bounded control-state snapshots, never executable commands', () => {
13
+ const snapshot={sessionId:'s',turnId:'t',state:'waiting_for_focus',windowId:null};
14
+ expect(computerControlSnapshotSchema.safeParse(snapshot).success).toBe(true);
15
+ expect(computerControlSnapshotSchema.safeParse({...snapshot,state:'running arbitrary code'}).success).toBe(false);
16
+ expect(computerControlSnapshotSchema.safeParse({...snapshot,windowId:'x'.repeat(200)}).success).toBe(false);
17
+ });
@@ -0,0 +1,31 @@
1
+ import { z } from 'zod';
2
+
3
+ export const computerControlStateSchema = z.enum([
4
+ 'idle', 'background', 'foreground', 'waiting_for_focus',
5
+ 'paused_by_user', 'recovering', 'stopped', 'failed',
6
+ ]);
7
+ const identity = z.string().min(1).max(160);
8
+ export const computerControlOwnerSchema = z.object({ sessionId: identity, turnId: identity }).strict();
9
+ export const computerControlCommandSchema = computerControlOwnerSchema.extend({
10
+ command: z.enum(['pause', 'resume', 'stop']),
11
+ }).strict();
12
+ export const computerControlSnapshotSchema = computerControlOwnerSchema.extend({
13
+ state: computerControlStateSchema,
14
+ windowId: identity.nullable(),
15
+ }).strict();
16
+
17
+ export type ComputerControlState = z.infer<typeof computerControlStateSchema>;
18
+ export const computerApprovalFocusSchema = computerControlOwnerSchema.extend({
19
+ windowId: identity, callId: identity, hostPid: z.number().int().min(1).max(2147483647),
20
+ stage: z.enum(['begin', 'finish']), approved: z.boolean(),
21
+ }).strict();
22
+ export type ComputerApprovalFocus = z.infer<typeof computerApprovalFocusSchema>;
23
+ export type ComputerControlCommand = z.infer<typeof computerControlCommandSchema>;
24
+ export type ComputerControlSnapshot = z.infer<typeof computerControlSnapshotSchema>;
25
+ export interface ComputerControlService {
26
+ approvalFocus?(command: ComputerApprovalFocus): Promise<void>;
27
+ /** Empty when this session has no live Computer Use turn. */
28
+ snapshot(): Promise<ReadonlyArray<ComputerControlSnapshot>>;
29
+ /** Human control only: never starts a helper or grants tool permission. */
30
+ control(command: ComputerControlCommand): Promise<void>;
31
+ }
package/src/events.ts CHANGED
@@ -284,6 +284,21 @@ export interface ProviderResponseEvent extends EventBase {
284
284
  readonly outputTokens?: number;
285
285
  readonly cacheReadTokens?: number;
286
286
  readonly cacheCreationTokens?: number;
287
+ readonly timing?: ProviderCallTiming;
288
+ }
289
+
290
+ /** Local monotonic measurements, not a claim about server-side model compute. */
291
+ export interface ProviderCallTiming {
292
+ readonly contextProjectionMs: number;
293
+ readonly preparationMs: number;
294
+ readonly hooksMs: number;
295
+ readonly firstEventMs: number | null;
296
+ /** Iterator waiting includes the provider adapter, network and remote work. */
297
+ readonly providerWaitMs: number;
298
+ /** Local processing of stream events, including event-log subscribers. */
299
+ readonly consumerMs: number;
300
+ /** Sum of measured stages; excludes tools, permissions and focus waits. */
301
+ readonly totalMs: number;
287
302
  }
288
303
 
289
304
  export interface ErrorEvent extends EventBase {
package/src/index.ts CHANGED
@@ -35,12 +35,21 @@ export type {
35
35
  ElisionEvent,
36
36
  ProviderRequestEvent,
37
37
  ProviderResponseEvent,
38
+ ProviderCallTiming,
38
39
  ErrorEvent,
39
40
  AbortEvent,
40
41
  PluginEvent,
41
42
  } from './events.js';
42
43
 
43
44
  export type { EventLogReader } from './log.js';
45
+ export {
46
+ computerControlStateSchema, computerControlOwnerSchema,
47
+ computerControlCommandSchema, computerControlSnapshotSchema,
48
+ computerApprovalFocusSchema, type ComputerApprovalFocus,
49
+ } from './computer-control.js';
50
+ export type {
51
+ ComputerControlState, ComputerControlCommand, ComputerControlSnapshot, ComputerControlService,
52
+ } from './computer-control.js';
44
53
 
45
54
  // Identity. The type + pure helpers ride the main barrel; the OS resolver needs
46
55
  // `node:os` and is exported from `@moxxy/sdk/server`.
@@ -149,6 +158,7 @@ export type {
149
158
  ToolContext,
150
159
  ToolDef,
151
160
  HostedTool,
161
+ ToolImageResult,
152
162
  ToolCompactPresentation,
153
163
  BrokeredFs,
154
164
  BrokeredStat,
@@ -344,6 +354,7 @@ export {
344
354
  type CheckpointResult,
345
355
  type TurnCheckpoint,
346
356
  } from './mode-helpers.js';
357
+ export type { WorkflowApprovalScope, WorkflowApprovalChoice, WorkflowApprovalItem, WorkflowApprovalsView } from './workflow-approval.js';
347
358
  export {
348
359
  dispatchToolCall,
349
360
  executeToolUses,
@@ -595,3 +606,4 @@ export {
595
606
  } from './install-hints.js';
596
607
 
597
608
  export { z } from 'zod';
609
+ export { workflowApprovalItemSchema, workflowApprovalItemsSchema } from './workflow-approval.js';
@@ -222,6 +222,21 @@ describe('projectMessagesFromLog', () => {
222
222
  }
223
223
  });
224
224
 
225
+ it.each([
226
+ { mediaType: 'image/png', base64: 'AAAABBBB', forModel: 'capture=c1; window=w1; source=(-1920,0,1920,1080)' },
227
+ { type: 'image', mediaType: 'image/png', data: 'AAAABBBB', forModel: 'capture=c1; window=w1; source=(-1920,0,1920,1080)' },
228
+ ])('preserves image metadata as model-facing text without stringifying pixels', (output) => {
229
+ const log = reader([
230
+ event(0, { type: 'tool_call_requested', turnId: t1, source: 'model', callId: 'c1', name: 'computer_screenshot', input: {} }),
231
+ event(1, { type: 'tool_result', turnId: t1, source: 'tool', callId: 'c1', ok: true, output }),
232
+ ]);
233
+ const result = projectMessagesFromLog({ log }).find((message) => message.role === 'tool_result');
234
+ expect(result?.content).toEqual([
235
+ { type: 'tool_result', toolUseId: 'c1', content: output.forModel, isError: false },
236
+ { type: 'image', mediaType: 'image/png', data: 'AAAABBBB' },
237
+ ]);
238
+ });
239
+
225
240
  it('accepts the provider-native image shape { type:image, mediaType, data }', () => {
226
241
  const log = reader([
227
242
  event(0, { type: 'user_prompt', turnId: t1, source: 'user', text: 'grab' }),
@@ -2,6 +2,8 @@ import type { ProviderEvent, ProviderMessage, TokenUsage } from '../provider.js'
2
2
  import type { ModeContext } from '../mode.js';
3
3
  import type { StopReason } from '../provider-utils.js';
4
4
  import { applyLazyTools } from '../tool-gating.js';
5
+ import type { ProviderCallTiming } from '../events.js';
6
+ import { providerTiming } from './provider-timing.js';
5
7
 
6
8
  /**
7
9
  * Shared bits used by every loop strategy: a typed tool-use struct and a
@@ -38,6 +40,7 @@ function addUsage(a: TokenUsage, b: TokenUsage): TokenUsage {
38
40
  }
39
41
 
40
42
  export interface StreamResult {
43
+ readonly timing?: ProviderCallTiming;
41
44
  readonly text: string;
42
45
  readonly toolUses: ReadonlyArray<CollectedToolUse>;
43
46
  readonly stopReason: StopReason;
@@ -67,6 +70,7 @@ export async function collectProviderStream(
67
70
  ctx: ModeContext,
68
71
  messages: ReadonlyArray<ProviderMessage>,
69
72
  opts: {
73
+ projectionMs?: number;
70
74
  iteration?: number;
71
75
  includeTools?: boolean;
72
76
  maxTokens?: number;
@@ -89,6 +93,7 @@ export async function collectProviderStream(
89
93
  volatileTailCount?: number;
90
94
  } = {},
91
95
  ): Promise<StreamResult> {
96
+ const start=performance.now();
92
97
  const descriptor = ctx.provider.models.find((model) => model.id === ctx.model);
93
98
 
94
99
  // Tool schemas are useful only when both the caller requests them and the
@@ -148,6 +153,7 @@ export async function collectProviderStream(
148
153
  ...(reqReasoning ? { reasoning: reqReasoning } : {}),
149
154
  signal: ctx.signal,
150
155
  };
156
+ const prepared=performance.now();
151
157
  const transformed = await ctx.hooks.dispatchBeforeProviderCall(req, {
152
158
  sessionId: ctx.sessionId,
153
159
  // Thread the session's real cwd/env (mirrored on ModeContext) so path-based
@@ -160,6 +166,10 @@ export async function collectProviderStream(
160
166
  turnId: ctx.turnId,
161
167
  iteration: opts.iteration ?? 0,
162
168
  });
169
+ const hooked=performance.now();
170
+ let firstEvent:number|null=null;
171
+ let consumerMs=0;
172
+ const timing=() => providerTiming({start,prepared,hooked,end:performance.now(),firstEvent,consumerMs,projectionMs:opts.projectionMs ?? 0});
163
173
 
164
174
  let text = '';
165
175
  const toolUses = new Map<string, { name?: string; input?: unknown }>();
@@ -180,6 +190,7 @@ export async function collectProviderStream(
180
190
  stream = ctx.provider.stream(transformed);
181
191
  } catch (err) {
182
192
  return {
193
+ timing:timing(),
183
194
  text: '',
184
195
  toolUses: [],
185
196
  stopReason: 'error',
@@ -189,6 +200,9 @@ export async function collectProviderStream(
189
200
 
190
201
  try {
191
202
  for await (const event of stream) {
203
+ const processingStarted=performance.now();
204
+ if (firstEvent===null) firstEvent=processingStarted;
205
+ try {
192
206
  switch (event.type) {
193
207
  case 'text_delta': {
194
208
  text += event.delta;
@@ -247,6 +261,7 @@ export async function collectProviderStream(
247
261
  default:
248
262
  break;
249
263
  }
264
+ } finally { consumerMs+=performance.now()-processingStarted; }
250
265
  }
251
266
  } catch (err) {
252
267
  // A stream-level `error` event is the more authoritative classification —
@@ -260,6 +275,8 @@ export async function collectProviderStream(
260
275
  }
261
276
  }
262
277
 
278
+ const measuredTiming=timing();
279
+
263
280
  const finalToolUses: CollectedToolUse[] = [];
264
281
  for (const [id, partial] of toolUses) {
265
282
  if (!partial.name) continue;
@@ -277,6 +294,7 @@ export async function collectProviderStream(
277
294
  }
278
295
  : undefined;
279
296
  return {
297
+ timing:measuredTiming,
280
298
  text,
281
299
  toolUses: finalToolUses,
282
300
  stopReason,
@@ -420,7 +420,10 @@ export function projectMessages(
420
420
  } else if (e.ok && (image = imageBlockFromOutput(e.output))) {
421
421
  // Short marker satisfies the tool_use→tool_result pairing; the image
422
422
  // block (appended below) carries the actual pixels.
423
- text = '[image returned by tool — see attached image]';
423
+ const description = (e.output as { forModel?: unknown }).forModel;
424
+ text = typeof description === 'string'
425
+ ? description
426
+ : '[image returned by tool — see attached image]';
424
427
  } else {
425
428
  text = safeStringifyOutput(e.output);
426
429
  }
@@ -0,0 +1,16 @@
1
+ import { expect, it } from 'vitest';
2
+ import { providerTiming } from './provider-timing.js';
3
+
4
+ it('separates preparation, hooks, provider waiting and local stream handling without double counting', () => {
5
+ expect(providerTiming({start:100,prepared:110,hooked:140,end:240,firstEvent:180,consumerMs:25,projectionMs:7})).toEqual({
6
+ contextProjectionMs:7,preparationMs:10,hooksMs:30,firstEventMs:40,
7
+ providerWaitMs:75,consumerMs:25,totalMs:147,
8
+ });
9
+ });
10
+
11
+ it('keeps a missing first event distinct from an immediate response', () => {
12
+ const timing=providerTiming({start:0,prepared:0,hooked:1,end:5,firstEvent:null,consumerMs:0,projectionMs:0});
13
+ expect(timing.firstEventMs).toBeNull();
14
+ expect(timing.providerWaitMs).toBe(4);
15
+ expect(timing.totalMs).toBe(5);
16
+ });
@@ -0,0 +1,19 @@
1
+ import type { ProviderCallTiming } from '../events.js';
2
+
3
+ export function providerTiming(sample: {
4
+ start:number; prepared:number; hooked:number; end:number;
5
+ firstEvent:number|null; consumerMs:number; projectionMs:number;
6
+ }): ProviderCallTiming {
7
+ const duration=(end:number,start:number) => Math.max(0,end-start);
8
+ const streamMs=duration(sample.end,sample.hooked);
9
+ const consumerMs=Math.min(streamMs,Math.max(0,sample.consumerMs));
10
+ return {
11
+ contextProjectionMs:sample.projectionMs,
12
+ preparationMs:duration(sample.prepared,sample.start),
13
+ hooksMs:duration(sample.hooked,sample.prepared),
14
+ firstEventMs:sample.firstEvent===null ? null : duration(sample.firstEvent,sample.hooked),
15
+ providerWaitMs:streamMs-consumerMs,
16
+ consumerMs,
17
+ totalMs:duration(sample.end,sample.start)+sample.projectionMs,
18
+ };
19
+ }
@@ -267,6 +267,7 @@ export async function* runReactLoop(
267
267
  // selected model can actually execute the loader. Unknown/dynamic model ids
268
268
  // retain the historical tool-capable behavior, matching collect-stream's
269
269
  // conservative capability fallback.
270
+ const projectionStarted=performance.now();
270
271
  const descriptor = ctx.provider.models.find((candidate) => candidate.id === ctx.model);
271
272
  const availableSkills = descriptor?.supportsTools === false ? [] : ctx.skills.list();
272
273
  const systemPrompt = buildSystemPromptWithSkills(ctx.systemPrompt, availableSkills);
@@ -275,6 +276,7 @@ export async function* runReactLoop(
275
276
  ...(volatileText ? { trailingUserText: volatileText } : {}),
276
277
  });
277
278
 
279
+ const projectionMs=performance.now()-projectionStarted;
278
280
  yield await ctx.emit({
279
281
  type: 'provider_request',
280
282
  sessionId: ctx.sessionId,
@@ -284,11 +286,12 @@ export async function* runReactLoop(
284
286
  model: ctx.model,
285
287
  });
286
288
 
287
- const { text, toolUses, stopReason, error, usage, reasoning } = await collectProviderStream(
289
+ const { text, toolUses, stopReason, error, usage, reasoning, timing } = await collectProviderStream(
288
290
  ctx,
289
291
  messages,
290
292
  {
291
293
  iteration,
294
+ projectionMs,
292
295
  stablePrefixIndex,
293
296
  // Volatile text is injected for this call only, never appended to the
294
297
  // log — the cache strategy must keep its rolling tail breakpoint
@@ -317,6 +320,7 @@ export async function* runReactLoop(
317
320
  provider: ctx.provider.name,
318
321
  model: ctx.model,
319
322
  ...usageEventFields(usage),
323
+ ...(timing ? {timing} : {}),
320
324
  });
321
325
 
322
326
  if (error) {
package/src/mode.ts CHANGED
@@ -194,7 +194,7 @@ export interface ApprovalDecision {
194
194
 
195
195
  export interface ApprovalResolver {
196
196
  readonly name: string;
197
- confirm(req: ApprovalRequest): Promise<ApprovalDecision>;
197
+ confirm(req: ApprovalRequest, context?: { readonly turnId: string }): Promise<ApprovalDecision>;
198
198
  }
199
199
 
200
200
  /**
package/src/permission.ts CHANGED
@@ -39,6 +39,7 @@ export interface PendingToolCall {
39
39
  }
40
40
 
41
41
  export interface PermissionContext {
42
+ readonly turnId?: string;
42
43
  readonly toolDescription?: string;
43
44
  readonly skillContext?: string;
44
45
  readonly sessionId: string;
@@ -47,6 +48,8 @@ export interface PermissionContext {
47
48
  export interface PermissionResolver {
48
49
  readonly name: string;
49
50
  check(call: PendingToolCall, ctx: PermissionContext): Promise<PermissionDecision>;
51
+ /** Host-scoped approval that unattended modes must not bypass. */
52
+ mandatoryCheck?(call: PendingToolCall, ctx: PermissionContext): Promise<PermissionDecision | null>;
50
53
  /**
51
54
  * Optional prompt-free policy probe. Returns the decision the persistent
52
55
  * policy layer would make for this call (user deny/allow rules from
@@ -0,0 +1,29 @@
1
+ import { describe, expect, it } from 'vitest';
2
+ import { z } from 'zod';
3
+ import { zodToJsonSchema } from './provider-utils.js';
4
+
5
+ describe('model-visible validation constraints', () => {
6
+ it('preserves integer limits including exclusive positive bounds', () => {
7
+ expect(zodToJsonSchema(z.number().int().min(500).max(8000))).toEqual({ type: 'integer', minimum: 500, maximum: 8000 });
8
+ expect(zodToJsonSchema(z.number().positive().lt(10))).toEqual({ type: 'number', exclusiveMinimum: 0, exclusiveMaximum: 10 });
9
+ });
10
+ it('preserves string lengths and supported key patterns', () => {
11
+ expect(zodToJsonSchema(z.string().min(1).max(160))).toEqual({ type: 'string', minLength: 1, maxLength: 160 });
12
+ expect(zodToJsonSchema(z.string().regex(/^(enter|tab)$/))).toEqual({ type: 'string', pattern: '^(enter|tab)$' });
13
+ expect(zodToJsonSchema(z.string().length(3))).toEqual({ type: 'string', minLength: 3, maxLength: 3 });
14
+ });
15
+ it('preserves array bounds', () => {
16
+ expect(zodToJsonSchema(z.array(z.string()).min(1).max(4))).toEqual({ type: 'array', items: { type: 'string' }, minItems: 1, maxItems: 4 });
17
+ expect(zodToJsonSchema(z.array(z.number()).length(2))).toEqual({ type: 'array', items: { type: 'number' }, minItems: 2, maxItems: 2 });
18
+ });
19
+ it('preserves an explicit null alternative through optional and transform wrappers', () => {
20
+ const schema = z.object({ root: z.object({ id: z.string().min(1) }).nullable().optional().transform(value => value ?? undefined) });
21
+ expect(zodToJsonSchema(schema)).toMatchObject({
22
+ required: [], properties: { root: { anyOf: [
23
+ { type: 'object', properties: { id: { type: 'string', minLength: 1 } }, required: ['id'] },
24
+ { type: 'null' },
25
+ ] } },
26
+ });
27
+ expect(schema.parse({ root: null })).toEqual({ root: undefined });
28
+ });
29
+ });