@vendoai/apps 0.4.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 (203) hide show
  1. package/LICENSE +202 -0
  2. package/README.md +8 -0
  3. package/dist/adapter-conformance.d.ts +48 -0
  4. package/dist/adapter-conformance.d.ts.map +1 -0
  5. package/dist/adapter-conformance.js +196 -0
  6. package/dist/adapter-conformance.js.map +1 -0
  7. package/dist/agent-tools.d.ts +10 -0
  8. package/dist/agent-tools.d.ts.map +1 -0
  9. package/dist/agent-tools.js +252 -0
  10. package/dist/agent-tools.js.map +1 -0
  11. package/dist/app-data.d.ts +23 -0
  12. package/dist/app-data.d.ts.map +1 -0
  13. package/dist/app-data.js +129 -0
  14. package/dist/app-data.js.map +1 -0
  15. package/dist/app-token.d.ts +24 -0
  16. package/dist/app-token.d.ts.map +1 -0
  17. package/dist/app-token.js +61 -0
  18. package/dist/app-token.js.map +1 -0
  19. package/dist/audit.d.ts +11 -0
  20. package/dist/audit.d.ts.map +1 -0
  21. package/dist/audit.js +19 -0
  22. package/dist/audit.js.map +1 -0
  23. package/dist/automation-plan.d.ts +43 -0
  24. package/dist/automation-plan.d.ts.map +1 -0
  25. package/dist/automation-plan.js +212 -0
  26. package/dist/automation-plan.js.map +1 -0
  27. package/dist/bench/client.d.ts +43 -0
  28. package/dist/bench/client.d.ts.map +1 -0
  29. package/dist/bench/client.js +129 -0
  30. package/dist/bench/client.js.map +1 -0
  31. package/dist/bench/fixtures.d.ts +42 -0
  32. package/dist/bench/fixtures.d.ts.map +1 -0
  33. package/dist/bench/fixtures.js +146 -0
  34. package/dist/bench/fixtures.js.map +1 -0
  35. package/dist/bench/judge.d.ts +9 -0
  36. package/dist/bench/judge.d.ts.map +1 -0
  37. package/dist/bench/judge.js +71 -0
  38. package/dist/bench/judge.js.map +1 -0
  39. package/dist/bench/metrics.d.ts +32 -0
  40. package/dist/bench/metrics.d.ts.map +1 -0
  41. package/dist/bench/metrics.js +172 -0
  42. package/dist/bench/metrics.js.map +1 -0
  43. package/dist/bench/prompts.d.ts +17 -0
  44. package/dist/bench/prompts.d.ts.map +1 -0
  45. package/dist/bench/prompts.js +100 -0
  46. package/dist/bench/prompts.js.map +1 -0
  47. package/dist/bench/report.d.ts +43 -0
  48. package/dist/bench/report.d.ts.map +1 -0
  49. package/dist/bench/report.js +74 -0
  50. package/dist/bench/report.js.map +1 -0
  51. package/dist/bench/runner.d.ts +15 -0
  52. package/dist/bench/runner.d.ts.map +1 -0
  53. package/dist/bench/runner.js +26 -0
  54. package/dist/bench/runner.js.map +1 -0
  55. package/dist/bench/toolfork.d.ts +18 -0
  56. package/dist/bench/toolfork.d.ts.map +1 -0
  57. package/dist/bench/toolfork.js +125 -0
  58. package/dist/bench/toolfork.js.map +1 -0
  59. package/dist/box-agent.d.ts +78 -0
  60. package/dist/box-agent.d.ts.map +1 -0
  61. package/dist/box-agent.js +137 -0
  62. package/dist/box-agent.js.map +1 -0
  63. package/dist/box-env.d.ts +26 -0
  64. package/dist/box-env.d.ts.map +1 -0
  65. package/dist/box-env.js +52 -0
  66. package/dist/box-env.js.map +1 -0
  67. package/dist/call.d.ts +23 -0
  68. package/dist/call.d.ts.map +1 -0
  69. package/dist/call.js +45 -0
  70. package/dist/call.js.map +1 -0
  71. package/dist/cloud.d.ts +4917 -0
  72. package/dist/cloud.d.ts.map +1 -0
  73. package/dist/cloud.js +16 -0
  74. package/dist/cloud.js.map +1 -0
  75. package/dist/e2b/index.d.ts +30 -0
  76. package/dist/e2b/index.d.ts.map +1 -0
  77. package/dist/e2b/index.js +273 -0
  78. package/dist/e2b/index.js.map +1 -0
  79. package/dist/egress-approval.d.ts +73 -0
  80. package/dist/egress-approval.d.ts.map +1 -0
  81. package/dist/egress-approval.js +74 -0
  82. package/dist/egress-approval.js.map +1 -0
  83. package/dist/engine.d.ts +188 -0
  84. package/dist/engine.d.ts.map +1 -0
  85. package/dist/engine.js +1507 -0
  86. package/dist/engine.js.map +1 -0
  87. package/dist/fn.d.ts +22 -0
  88. package/dist/fn.d.ts.map +1 -0
  89. package/dist/fn.js +108 -0
  90. package/dist/fn.js.map +1 -0
  91. package/dist/history.d.ts +21 -0
  92. package/dist/history.d.ts.map +1 -0
  93. package/dist/history.js +158 -0
  94. package/dist/history.js.map +1 -0
  95. package/dist/inclient.d.ts +48 -0
  96. package/dist/inclient.d.ts.map +1 -0
  97. package/dist/inclient.js +68 -0
  98. package/dist/inclient.js.map +1 -0
  99. package/dist/index.d.ts +24 -0
  100. package/dist/index.d.ts.map +1 -0
  101. package/dist/index.js +25 -0
  102. package/dist/index.js.map +1 -0
  103. package/dist/interchange.d.ts +17 -0
  104. package/dist/interchange.d.ts.map +1 -0
  105. package/dist/interchange.js +133 -0
  106. package/dist/interchange.js.map +1 -0
  107. package/dist/machine-lifecycle.d.ts +102 -0
  108. package/dist/machine-lifecycle.d.ts.map +1 -0
  109. package/dist/machine-lifecycle.js +360 -0
  110. package/dist/machine-lifecycle.js.map +1 -0
  111. package/dist/manifest.d.ts +42 -0
  112. package/dist/manifest.d.ts.map +1 -0
  113. package/dist/manifest.js +53 -0
  114. package/dist/manifest.js.map +1 -0
  115. package/dist/open.d.ts +45 -0
  116. package/dist/open.d.ts.map +1 -0
  117. package/dist/open.js +245 -0
  118. package/dist/open.js.map +1 -0
  119. package/dist/parked-action.d.ts +51 -0
  120. package/dist/parked-action.d.ts.map +1 -0
  121. package/dist/parked-action.js +29 -0
  122. package/dist/parked-action.js.map +1 -0
  123. package/dist/persistence.d.ts +41 -0
  124. package/dist/persistence.d.ts.map +1 -0
  125. package/dist/persistence.js +86 -0
  126. package/dist/persistence.js.map +1 -0
  127. package/dist/pins.d.ts +231 -0
  128. package/dist/pins.d.ts.map +1 -0
  129. package/dist/pins.js +213 -0
  130. package/dist/pins.js.map +1 -0
  131. package/dist/pipeline.d.ts +142 -0
  132. package/dist/pipeline.d.ts.map +1 -0
  133. package/dist/pipeline.js +1014 -0
  134. package/dist/pipeline.js.map +1 -0
  135. package/dist/prewired-schema.d.ts +16 -0
  136. package/dist/prewired-schema.d.ts.map +1 -0
  137. package/dist/prewired-schema.js +48 -0
  138. package/dist/prewired-schema.js.map +1 -0
  139. package/dist/redaction.d.ts +13 -0
  140. package/dist/redaction.d.ts.map +1 -0
  141. package/dist/redaction.js +67 -0
  142. package/dist/redaction.js.map +1 -0
  143. package/dist/runtime.d.ts +463 -0
  144. package/dist/runtime.d.ts.map +1 -0
  145. package/dist/runtime.js +1715 -0
  146. package/dist/runtime.js.map +1 -0
  147. package/dist/sandbox.d.ts +90 -0
  148. package/dist/sandbox.d.ts.map +1 -0
  149. package/dist/sandbox.js +2 -0
  150. package/dist/sandbox.js.map +1 -0
  151. package/dist/schedules.d.ts +89 -0
  152. package/dist/schedules.d.ts.map +1 -0
  153. package/dist/schedules.js +334 -0
  154. package/dist/schedules.js.map +1 -0
  155. package/dist/secret-exposure.d.ts +55 -0
  156. package/dist/secret-exposure.d.ts.map +1 -0
  157. package/dist/secret-exposure.js +53 -0
  158. package/dist/secret-exposure.js.map +1 -0
  159. package/dist/ship-diff.d.ts +47 -0
  160. package/dist/ship-diff.d.ts.map +1 -0
  161. package/dist/ship-diff.js +39 -0
  162. package/dist/ship-diff.js.map +1 -0
  163. package/dist/testing/fake-box.d.ts +67 -0
  164. package/dist/testing/fake-box.d.ts.map +1 -0
  165. package/dist/testing/fake-box.js +166 -0
  166. package/dist/testing/fake-box.js.map +1 -0
  167. package/dist/testing/fake-sandbox-v2.d.ts +59 -0
  168. package/dist/testing/fake-sandbox-v2.d.ts.map +1 -0
  169. package/dist/testing/fake-sandbox-v2.js +121 -0
  170. package/dist/testing/fake-sandbox-v2.js.map +1 -0
  171. package/dist/testing/fake-sandbox.d.ts +94 -0
  172. package/dist/testing/fake-sandbox.d.ts.map +1 -0
  173. package/dist/testing/fake-sandbox.js +239 -0
  174. package/dist/testing/fake-sandbox.js.map +1 -0
  175. package/dist/testing/guard-fixture.d.ts +19 -0
  176. package/dist/testing/guard-fixture.d.ts.map +1 -0
  177. package/dist/testing/guard-fixture.js +134 -0
  178. package/dist/testing/guard-fixture.js.map +1 -0
  179. package/dist/testing/index.d.ts +8 -0
  180. package/dist/testing/index.d.ts.map +1 -0
  181. package/dist/testing/index.js +8 -0
  182. package/dist/testing/index.js.map +1 -0
  183. package/dist/testing/memory-store.d.ts +5 -0
  184. package/dist/testing/memory-store.d.ts.map +1 -0
  185. package/dist/testing/memory-store.js +4 -0
  186. package/dist/testing/memory-store.js.map +1 -0
  187. package/dist/testing/scripted-model.d.ts +32 -0
  188. package/dist/testing/scripted-model.d.ts.map +1 -0
  189. package/dist/testing/scripted-model.js +112 -0
  190. package/dist/testing/scripted-model.js.map +1 -0
  191. package/dist/testing/seed-app-row.d.ts +4 -0
  192. package/dist/testing/seed-app-row.d.ts.map +1 -0
  193. package/dist/testing/seed-app-row.js +7 -0
  194. package/dist/testing/seed-app-row.js.map +1 -0
  195. package/dist/unified-diff.d.ts +13 -0
  196. package/dist/unified-diff.d.ts.map +1 -0
  197. package/dist/unified-diff.js +127 -0
  198. package/dist/unified-diff.js.map +1 -0
  199. package/dist/version-hash.d.ts +9 -0
  200. package/dist/version-hash.d.ts.map +1 -0
  201. package/dist/version-hash.js +12 -0
  202. package/dist/version-hash.js.map +1 -0
  203. package/package.json +84 -0
@@ -0,0 +1,239 @@
1
+ // Fake provider state intentionally outlives one adapter object, matching the
2
+ // durable provider refs returned by the real adapters across process restarts.
3
+ const providerSnapshots = new Map();
4
+ let nextProviderMachine = 1;
5
+ let nextProviderSnapshot = 1;
6
+ const DEFAULT_PORT = 8080;
7
+ const textEncoder = new TextEncoder();
8
+ const textDecoder = new TextDecoder();
9
+ const toBytes = (value) => typeof value === "string" ? textEncoder.encode(value) : value.slice();
10
+ const parsePort = (env) => {
11
+ const port = Number(env.PORT ?? DEFAULT_PORT);
12
+ return Number.isInteger(port) && port > 0 && port <= 65_535 ? port : DEFAULT_PORT;
13
+ };
14
+ const cloneRequest = (request) => ({
15
+ ...request,
16
+ headers: request.headers === undefined ? undefined : { ...request.headers },
17
+ body: request.body instanceof Uint8Array ? request.body.slice() : request.body,
18
+ });
19
+ const bodyArgs = (body) => {
20
+ if (body === undefined)
21
+ return undefined;
22
+ try {
23
+ const parsed = JSON.parse(typeof body === "string" ? body : textDecoder.decode(body));
24
+ return typeof parsed === "object" && parsed !== null && "args" in parsed
25
+ ? parsed.args
26
+ : undefined;
27
+ }
28
+ catch {
29
+ return undefined;
30
+ }
31
+ };
32
+ /** The provider-native wildcard-aware allowlist rule the fake simulates. */
33
+ const domainAllowed = (allowedDomains, host) => allowedDomains === undefined || allowedDomains.some((rule) => rule === host || (rule.startsWith("*.") && host.endsWith(rule.slice(1))));
34
+ const defaultApp = (request, ctx) => {
35
+ const match = /^\/fn\/([A-Za-z_][A-Za-z0-9_-]*)$/.exec(request.path);
36
+ if (request.method.toUpperCase() === "POST" && match?.[1] !== undefined) {
37
+ return {
38
+ status: 200,
39
+ headers: { "content-type": "application/json" },
40
+ body: JSON.stringify({
41
+ result: {
42
+ name: match[1],
43
+ args: bodyArgs(request.body),
44
+ env: { ...ctx.env },
45
+ headers: { ...request.headers },
46
+ },
47
+ }),
48
+ };
49
+ }
50
+ return {
51
+ status: 200,
52
+ headers: { "content-type": "text/html; charset=utf-8" },
53
+ body: "<!doctype html><title>Fake Vendo app</title>",
54
+ };
55
+ };
56
+ const onePixelPng = new Uint8Array([
57
+ 137, 80, 78, 71, 13, 10, 26, 10, 0, 0, 0, 13, 73, 72, 68, 82,
58
+ 0, 0, 0, 1, 0, 0, 0, 1, 8, 4, 0, 0, 0, 181, 28, 12, 2,
59
+ 0, 0, 0, 11, 73, 68, 65, 84, 120, 218, 99, 252, 255, 31, 0, 3,
60
+ 3, 2, 0, 238, 254, 127, 217, 0, 0, 0, 0, 73, 69, 78, 68, 174,
61
+ 66, 96, 130,
62
+ ]);
63
+ /** Test machine with deterministic I/O and inspectable state. */
64
+ export class FakeSandboxMachine {
65
+ id;
66
+ allowedDomains;
67
+ template;
68
+ saveSnapshot;
69
+ requests = [];
70
+ commands = [];
71
+ execResults = [];
72
+ fileContents;
73
+ env;
74
+ port;
75
+ /** v2 sleep flag; also true once destroyed. Writable for test scripting. */
76
+ stopped = false;
77
+ /** v2 gone-for-good flag. */
78
+ destroyed = false;
79
+ app;
80
+ constructor(id, env, allowedDomains, template, files, app, saveSnapshot) {
81
+ this.id = id;
82
+ this.allowedDomains = allowedDomains;
83
+ this.template = template;
84
+ this.saveSnapshot = saveSnapshot;
85
+ this.env = Object.freeze({ ...env });
86
+ this.port = parsePort(this.env);
87
+ this.fileContents = new Map([...files].map(([path, bytes]) => [path, bytes.slice()]));
88
+ this.app = app;
89
+ }
90
+ appContext() {
91
+ return { env: this.env, allowedDomains: this.allowedDomains, port: this.port };
92
+ }
93
+ ensureRunning(operation) {
94
+ if (this.destroyed)
95
+ throw new Error(`Fake sandbox machine ${this.id} is destroyed; cannot ${operation}`);
96
+ if (this.stopped)
97
+ throw new Error(`Fake sandbox machine ${this.id} is stopped (asleep); cannot ${operation}`);
98
+ }
99
+ files = {
100
+ // Reads stay available after stop/destroy on purpose: the fake doubles as
101
+ // a post-mortem probe for tests asserting what a torn-down machine held.
102
+ // Every OPERATION (write/list/exec/screenshot/url/request/snapshot) is
103
+ // lifecycle-guarded like a real provider.
104
+ read: async (path) => {
105
+ const bytes = this.fileContents.get(path);
106
+ if (bytes === undefined)
107
+ throw new Error(`Unknown fake sandbox file: ${path}`);
108
+ return bytes.slice();
109
+ },
110
+ write: async (path, bytes) => {
111
+ this.ensureRunning("write a file");
112
+ this.fileContents.set(path, toBytes(bytes));
113
+ },
114
+ list: async (dir) => {
115
+ this.ensureRunning("list files");
116
+ const prefix = dir === "" || dir === "/" ? "" : `${dir.replace(/\/$/, "")}/`;
117
+ return [...new Set([...this.fileContents.keys()]
118
+ .filter((path) => path.startsWith(prefix))
119
+ .map((path) => path.slice(prefix.length).split("/")[0])
120
+ .filter((name) => name !== undefined && name !== ""))].sort();
121
+ },
122
+ };
123
+ async request(request) {
124
+ this.ensureRunning("serve a request");
125
+ const port = request.port ?? this.port;
126
+ if (port !== this.port) {
127
+ throw new Error(`Fake sandbox machine ${this.id} has no listener on port ${port} (the app's $PORT is ${this.port})`);
128
+ }
129
+ this.requests.push({ ...cloneRequest(request), port });
130
+ const response = await (this.app ?? defaultApp)(cloneRequest(request), this.appContext());
131
+ return {
132
+ status: response.status,
133
+ headers: { ...response.headers },
134
+ body: toBytes(response.body),
135
+ };
136
+ }
137
+ async exec(cmd, opts) {
138
+ this.ensureRunning("exec a command");
139
+ this.commands.push(opts === undefined ? { cmd } : { cmd, opts: { ...opts } });
140
+ const programmed = this.execResults.shift();
141
+ if (programmed !== undefined)
142
+ return programmed;
143
+ const printedEnv = /^printf\s+'%s'\s+"\$([A-Za-z_][A-Za-z0-9_]*)"$/.exec(cmd)?.[1];
144
+ if (printedEnv !== undefined) {
145
+ return { code: 0, stdout: this.env[printedEnv] ?? "", stderr: "" };
146
+ }
147
+ const fetchedHost = /fetch\(['"]https:\/\/([^/'"]+)/.exec(cmd)?.[1];
148
+ if (fetchedHost !== undefined) {
149
+ const allowed = domainAllowed(this.allowedDomains, fetchedHost);
150
+ const exits = /then\(\(\) => process\.exit\((\d+)\)\)\.catch\(\(\) => process\.exit\((\d+)\)\)/.exec(cmd);
151
+ return {
152
+ code: Number(allowed ? exits?.[1] ?? 0 : exits?.[2] ?? 1),
153
+ stdout: "",
154
+ stderr: "",
155
+ };
156
+ }
157
+ return { code: 0, stdout: "", stderr: "" };
158
+ }
159
+ programExec(...results) {
160
+ this.execResults.push(...results.map((result) => ({ ...result })));
161
+ }
162
+ setApp(app) {
163
+ this.app = app;
164
+ }
165
+ async snapshot() {
166
+ this.ensureRunning("snapshot");
167
+ return this.saveSnapshot(this);
168
+ }
169
+ async screenshot() {
170
+ this.ensureRunning("capture a screenshot");
171
+ return onePixelPng.slice();
172
+ }
173
+ async url(port) {
174
+ this.ensureRunning("resolve a serving URL");
175
+ return `http://fake-machine-${this.id}.local:${port ?? this.port}`;
176
+ }
177
+ async stop() {
178
+ this.stopped = true;
179
+ }
180
+ async destroy() {
181
+ this.stopped = true;
182
+ this.destroyed = true;
183
+ }
184
+ }
185
+ /** Create an in-process sandbox adapter whose requests dispatch to a machine app handler. */
186
+ export const fakeSandbox = (options = {}) => {
187
+ const machines = new Map();
188
+ let installedApp = options.app;
189
+ const saveSnapshot = (machine) => {
190
+ const ref = `fake:snap_${nextProviderSnapshot++}`;
191
+ providerSnapshots.set(ref, Object.freeze({
192
+ env: Object.freeze({ ...machine.env }),
193
+ ...(machine.allowedDomains === undefined ? {} : { allowedDomains: Object.freeze([...machine.allowedDomains]) }),
194
+ ...(machine.template === undefined ? {} : { template: machine.template }),
195
+ files: new Map([...machine.fileContents].map(([path, bytes]) => [path, bytes.slice()])),
196
+ app: machine.app,
197
+ }));
198
+ return ref;
199
+ };
200
+ const makeMachine = (env, allowedDomains, template, files, app) => {
201
+ const id = String(nextProviderMachine++);
202
+ const machine = new FakeSandboxMachine(id, env, allowedDomains === undefined ? undefined : Object.freeze([...allowedDomains]), template, files, app, saveSnapshot);
203
+ machines.set(id, machine);
204
+ return machine;
205
+ };
206
+ return {
207
+ machines,
208
+ setApp(app) {
209
+ installedApp = app;
210
+ for (const machine of machines.values())
211
+ machine.setApp(app);
212
+ },
213
+ async create(spec) {
214
+ const files = new Map();
215
+ // A template ref that names a stored snapshot seeds the machine from it,
216
+ // matching real providers where snapshots double as templates.
217
+ const seed = spec.template === undefined ? undefined : providerSnapshots.get(spec.template);
218
+ for (const [path, bytes] of seed?.files ?? [])
219
+ files.set(path, bytes.slice());
220
+ return makeMachine(spec.env, spec.allowedDomains, spec.template, files, installedApp ?? seed?.app);
221
+ },
222
+ async resume(snapshotRef, policy) {
223
+ const snapshot = providerSnapshots.get(snapshotRef);
224
+ if (snapshot === undefined)
225
+ throw new Error(`Unknown fake sandbox snapshot: ${snapshotRef}`);
226
+ return makeMachine({ ...snapshot.env },
227
+ // Lane E — a passed policy replaces the snapshot-time allowlist (seam rule).
228
+ policy === undefined ? snapshot.allowedDomains : policy.allowedDomains, snapshot.template, snapshot.files, snapshot.app);
229
+ },
230
+ async destroy(snapshotRef) {
231
+ if (!snapshotRef.startsWith("fake:")) {
232
+ throw new Error(`not a fake sandbox snapshot ref: ${snapshotRef}`);
233
+ }
234
+ // Idempotent by seam contract: deleting absent state is a no-op.
235
+ providerSnapshots.delete(snapshotRef);
236
+ },
237
+ };
238
+ };
239
+ //# sourceMappingURL=fake-sandbox.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"fake-sandbox.js","sourceRoot":"","sources":["../../src/testing/fake-sandbox.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,19 @@
1
+ import { type ApprovalId, type ApprovalRequest, type AuditEvent, type Guard, type PermissionGrant, type ToolRegistry } from "@vendoai/core";
2
+ export type ProgrammedAction = "run" | "ask" | "block";
3
+ export interface GuardFixtureOptions {
4
+ rules?: Record<string, ProgrammedAction>;
5
+ grants?: PermissionGrant[];
6
+ now?: () => Date;
7
+ }
8
+ export interface GuardFixture extends Guard {
9
+ readonly rules: Map<string, ProgrammedAction>;
10
+ readonly grants: PermissionGrant[];
11
+ readonly approvals: ApprovalRequest[];
12
+ readonly audit: AuditEvent[];
13
+ decide(id: ApprovalId, approved: boolean): void;
14
+ }
15
+ /** Create a deterministic Guard fixture with inspectable rules, approvals, grants, and audit. */
16
+ export declare const guardFixture: (options?: GuardFixtureOptions) => GuardFixture;
17
+ /** Bind a registry through decide → park/execute → report, matching 05-guard §2. */
18
+ export declare const bindTools: (guard: Guard, registry: ToolRegistry) => ToolRegistry;
19
+ //# sourceMappingURL=guard-fixture.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"guard-fixture.d.ts","sourceRoot":"","sources":["../../src/testing/guard-fixture.ts"],"names":[],"mappings":"AAAA,OAAO,EAEL,KAAK,UAAU,EACf,KAAK,eAAe,EACpB,KAAK,UAAU,EACf,KAAK,KAAK,EAEV,KAAK,eAAe,EAKpB,KAAK,YAAY,EAClB,MAAM,eAAe,CAAC;AAEvB,MAAM,MAAM,gBAAgB,GAAG,KAAK,GAAG,KAAK,GAAG,OAAO,CAAC;AAEvD,MAAM,WAAW,mBAAmB;IAClC,KAAK,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,gBAAgB,CAAC,CAAC;IACzC,MAAM,CAAC,EAAE,eAAe,EAAE,CAAC;IAC3B,GAAG,CAAC,EAAE,MAAM,IAAI,CAAC;CAClB;AAED,MAAM,WAAW,YAAa,SAAQ,KAAK;IACzC,QAAQ,CAAC,KAAK,EAAE,GAAG,CAAC,MAAM,EAAE,gBAAgB,CAAC,CAAC;IAC9C,QAAQ,CAAC,MAAM,EAAE,eAAe,EAAE,CAAC;IACnC,QAAQ,CAAC,SAAS,EAAE,eAAe,EAAE,CAAC;IACtC,QAAQ,CAAC,KAAK,EAAE,UAAU,EAAE,CAAC;IAC7B,MAAM,CAAC,EAAE,EAAE,UAAU,EAAE,QAAQ,EAAE,OAAO,GAAG,IAAI,CAAC;CACjD;AAwBD,iGAAiG;AACjG,eAAO,MAAM,YAAY,GAAI,UAAS,mBAAwB,KAAG,YAwEhE,CAAC;AAEF,oFAAoF;AACpF,eAAO,MAAM,SAAS,GAAI,OAAO,KAAK,EAAE,UAAU,YAAY,KAAG,YAwChE,CAAC"}
@@ -0,0 +1,134 @@
1
+ import { descriptorHash, } from "@vendoai/core";
2
+ const inputPreview = (args) => {
3
+ try {
4
+ return JSON.stringify(args) ?? "null";
5
+ }
6
+ catch {
7
+ return "[unserializable input]";
8
+ }
9
+ };
10
+ const grantMatches = (grant, descriptor, ctx, now) => {
11
+ if (grant.subject !== ctx.principal.subject || grant.tool !== descriptor.name)
12
+ return false;
13
+ if (grant.descriptorHash !== descriptorHash(descriptor) || grant.scope.kind !== "tool")
14
+ return false;
15
+ if (grant.revokedAt !== undefined || (grant.expiresAt !== undefined && grant.expiresAt <= now.toISOString()))
16
+ return false;
17
+ if (grant.appId !== undefined && grant.appId !== ctx.appId)
18
+ return false;
19
+ if ((grant.duration === "session" || grant.duration === "task") && grant.contextKey !== ctx.sessionId)
20
+ return false;
21
+ return true;
22
+ };
23
+ /** Create a deterministic Guard fixture with inspectable rules, approvals, grants, and audit. */
24
+ export const guardFixture = (options = {}) => {
25
+ const rules = new Map(Object.entries(options.rules ?? {}));
26
+ const grants = [...(options.grants ?? [])];
27
+ const approvals = [];
28
+ const audit = [];
29
+ const callbacks = new Set();
30
+ const now = options.now ?? (() => new Date());
31
+ let nextApproval = 1;
32
+ const approvalFor = (call, descriptor, ctx) => ({
33
+ id: `apr_fixture_${nextApproval++}`,
34
+ call: structuredClone(call),
35
+ descriptor: structuredClone(descriptor),
36
+ inputPreview: inputPreview(call.args),
37
+ ctx: {
38
+ principal: { ...ctx.principal },
39
+ venue: ctx.venue,
40
+ presence: ctx.presence,
41
+ appId: ctx.appId,
42
+ trigger: ctx.trigger === undefined ? undefined : { ...ctx.trigger },
43
+ },
44
+ createdAt: now().toISOString(),
45
+ });
46
+ return {
47
+ rules,
48
+ grants,
49
+ approvals,
50
+ audit,
51
+ async check(call, descriptor, ctx) {
52
+ if (descriptor.critical === true) {
53
+ const approval = approvalFor(call, descriptor, ctx);
54
+ approvals.push(approval);
55
+ return { action: "ask", approval, decidedBy: "critical" };
56
+ }
57
+ const grant = grants.find((candidate) => grantMatches(candidate, descriptor, ctx, now()));
58
+ if (grant !== undefined)
59
+ return { action: "run", decidedBy: "grant", grantId: grant.id };
60
+ const programmed = rules.get(descriptor.name);
61
+ if (programmed === "block") {
62
+ return { action: "block", reason: `Programmed block for ${descriptor.name}`, decidedBy: "rule" };
63
+ }
64
+ if (programmed === "ask") {
65
+ const approval = approvalFor(call, descriptor, ctx);
66
+ approvals.push(approval);
67
+ return { action: "ask", approval, decidedBy: "rule" };
68
+ }
69
+ if (programmed === "run")
70
+ return { action: "run", decidedBy: "rule" };
71
+ return { action: "run", decidedBy: "default" };
72
+ },
73
+ async report(event) {
74
+ audit.push(structuredClone(event));
75
+ },
76
+ async directions() {
77
+ return [];
78
+ },
79
+ onApprovalDecision(callback) {
80
+ callbacks.add(callback);
81
+ return () => callbacks.delete(callback);
82
+ },
83
+ decide(id, approved) {
84
+ const index = approvals.findIndex((approval) => approval.id === id);
85
+ if (index === -1)
86
+ throw new Error(`Unknown fixture approval: ${id}`);
87
+ approvals.splice(index, 1);
88
+ for (const callback of callbacks)
89
+ callback(id, approved);
90
+ },
91
+ };
92
+ };
93
+ /** Bind a registry through decide → park/execute → report, matching 05-guard §2. */
94
+ export const bindTools = (guard, registry) => {
95
+ let nextAudit = 1;
96
+ return {
97
+ descriptors: () => registry.descriptors(),
98
+ async execute(call, ctx) {
99
+ const descriptors = await registry.descriptors();
100
+ const descriptor = descriptors.find((candidate) => candidate.name === call.tool);
101
+ if (descriptor === undefined) {
102
+ return { status: "error", error: { code: "not-found", message: `Unknown tool: ${call.tool}` } };
103
+ }
104
+ const decision = await guard.check(call, descriptor, ctx);
105
+ let outcome;
106
+ if (decision.action === "run") {
107
+ outcome = await registry.execute(call, ctx);
108
+ }
109
+ else if (decision.action === "ask") {
110
+ outcome = { status: "pending-approval", approvalId: decision.approval.id };
111
+ }
112
+ else {
113
+ outcome = { status: "blocked", reason: decision.reason };
114
+ }
115
+ await guard.report({
116
+ id: `aud_fixture_${nextAudit++}`,
117
+ at: new Date().toISOString(),
118
+ kind: "tool-call",
119
+ principal: { ...ctx.principal },
120
+ venue: ctx.venue,
121
+ presence: ctx.presence,
122
+ appId: ctx.appId,
123
+ trigger: ctx.trigger === undefined ? undefined : { ...ctx.trigger },
124
+ tool: descriptor.name,
125
+ inputPreview: inputPreview(call.args),
126
+ outcome: outcome.status,
127
+ decidedBy: decision.decidedBy,
128
+ detail: { callId: call.id },
129
+ });
130
+ return outcome;
131
+ },
132
+ };
133
+ };
134
+ //# sourceMappingURL=guard-fixture.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"guard-fixture.js","sourceRoot":"","sources":["../../src/testing/guard-fixture.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,8 @@
1
+ export * from "./fake-sandbox.js";
2
+ export * from "./fake-sandbox-v2.js";
3
+ export * from "./fake-box.js";
4
+ export * from "./guard-fixture.js";
5
+ export * from "./memory-store.js";
6
+ export * from "./seed-app-row.js";
7
+ export * from "./scripted-model.js";
8
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/testing/index.ts"],"names":[],"mappings":"AAAA,cAAc,mBAAmB,CAAC;AAClC,cAAc,sBAAsB,CAAC;AACrC,cAAc,eAAe,CAAC;AAC9B,cAAc,oBAAoB,CAAC;AACnC,cAAc,mBAAmB,CAAC;AAClC,cAAc,mBAAmB,CAAC;AAClC,cAAc,qBAAqB,CAAC"}
@@ -0,0 +1,8 @@
1
+ export * from "./fake-sandbox.js";
2
+ export * from "./fake-sandbox-v2.js";
3
+ export * from "./fake-box.js";
4
+ export * from "./guard-fixture.js";
5
+ export * from "./memory-store.js";
6
+ export * from "./seed-app-row.js";
7
+ export * from "./scripted-model.js";
8
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/testing/index.ts"],"names":[],"mappings":"AAAA,cAAc,mBAAmB,CAAC;AAClC,cAAc,sBAAsB,CAAC;AACrC,cAAc,eAAe,CAAC;AAC9B,cAAc,oBAAoB,CAAC;AACnC,cAAc,mBAAmB,CAAC;AAClC,cAAc,mBAAmB,CAAC;AAClC,cAAc,qBAAqB,CAAC"}
@@ -0,0 +1,5 @@
1
+ import { memoryStoreAdapter } from "@vendoai/core/conformance";
2
+ /** Canonical test-only StoreAdapter shared by block fixtures. */
3
+ export declare const memoryStore: typeof memoryStoreAdapter;
4
+ export type MemoryStoreAdapter = ReturnType<typeof memoryStoreAdapter>;
5
+ //# sourceMappingURL=memory-store.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"memory-store.d.ts","sourceRoot":"","sources":["../../src/testing/memory-store.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,kBAAkB,EAAE,MAAM,2BAA2B,CAAC;AAE/D,iEAAiE;AACjE,eAAO,MAAM,WAAW,2BAAqB,CAAC;AAC9C,MAAM,MAAM,kBAAkB,GAAG,UAAU,CAAC,OAAO,kBAAkB,CAAC,CAAC"}
@@ -0,0 +1,4 @@
1
+ import { memoryStoreAdapter } from "@vendoai/core/conformance";
2
+ /** Canonical test-only StoreAdapter shared by block fixtures. */
3
+ export const memoryStore = memoryStoreAdapter;
4
+ //# sourceMappingURL=memory-store.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"memory-store.js","sourceRoot":"","sources":["../../src/testing/memory-store.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,kBAAkB,EAAE,MAAM,2BAA2B,CAAC;AAE/D,iEAAiE;AACjE,MAAM,CAAC,MAAM,WAAW,GAAG,kBAAkB,CAAC"}
@@ -0,0 +1,32 @@
1
+ import type { LanguageModel } from "ai";
2
+ export interface ScriptedModelCall {
3
+ prompt: Array<{
4
+ role: string;
5
+ content: string | Array<{
6
+ type?: string;
7
+ text?: string;
8
+ }>;
9
+ }>;
10
+ /** W4 pipeline — the tool definitions the caller passed (strict tool-use
11
+ * calls), so tests can assert on the generated fix-space schema. */
12
+ tools?: Array<{
13
+ name: string;
14
+ description?: string;
15
+ inputSchema?: unknown;
16
+ }>;
17
+ toolChoice?: unknown;
18
+ }
19
+ /** A scripted turn is either streamed text or one forced tool call
20
+ * (W4 pipeline — structured repair / outline are strict tool-use calls). */
21
+ export interface ScriptedToolCall {
22
+ tool: string;
23
+ input: unknown;
24
+ }
25
+ type ScriptedText = string | string[] | ScriptedToolCall;
26
+ export type ScriptedModelResponse = ScriptedText | ((call: ScriptedModelCall, index: number) => ScriptedText | Promise<ScriptedText>);
27
+ /** Deterministic LanguageModelV2 equivalent for AI SDK generateText e2e tests. */
28
+ export declare const scriptedLanguageModel: (...responses: ScriptedModelResponse[]) => LanguageModel;
29
+ /** Compatibility fixture for lifecycle/execution suites that only need valid generation. */
30
+ export declare const basicLanguageModel: () => LanguageModel;
31
+ export {};
32
+ //# sourceMappingURL=scripted-model.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"scripted-model.d.ts","sourceRoot":"","sources":["../../src/testing/scripted-model.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,IAAI,CAAC;AAExC,MAAM,WAAW,iBAAiB;IAChC,MAAM,EAAE,KAAK,CAAC;QACZ,IAAI,EAAE,MAAM,CAAC;QACb,OAAO,EAAE,MAAM,GAAG,KAAK,CAAC;YAAE,IAAI,CAAC,EAAE,MAAM,CAAC;YAAC,IAAI,CAAC,EAAE,MAAM,CAAA;SAAE,CAAC,CAAC;KAC3D,CAAC,CAAC;IACH;yEACqE;IACrE,KAAK,CAAC,EAAE,KAAK,CAAC;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,WAAW,CAAC,EAAE,MAAM,CAAC;QAAC,WAAW,CAAC,EAAE,OAAO,CAAA;KAAE,CAAC,CAAC;IAC7E,UAAU,CAAC,EAAE,OAAO,CAAC;CACtB;AAED;6EAC6E;AAC7E,MAAM,WAAW,gBAAgB;IAAG,IAAI,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,OAAO,CAAA;CAAE;AAElE,KAAK,YAAY,GAAG,MAAM,GAAG,MAAM,EAAE,GAAG,gBAAgB,CAAC;AAEzD,MAAM,MAAM,qBAAqB,GAAG,YAAY,GAAG,CAAC,CAClD,IAAI,EAAE,iBAAiB,EACvB,KAAK,EAAE,MAAM,KACV,YAAY,GAAG,OAAO,CAAC,YAAY,CAAC,CAAC,CAAC;AAW3C,kFAAkF;AAClF,eAAO,MAAM,qBAAqB,GAAI,GAAG,WAAW,qBAAqB,EAAE,KAAG,aA8E7E,CAAC;AAcF,4FAA4F;AAC5F,eAAO,MAAM,kBAAkB,QAAO,aAYpC,CAAC"}
@@ -0,0 +1,112 @@
1
+ const isToolCall = (value) => typeof value === "object" && !Array.isArray(value);
2
+ const responseText = (response, call, index) => typeof response === "function" ? response(call, index) : response;
3
+ /** Deterministic LanguageModelV2 equivalent for AI SDK generateText e2e tests. */
4
+ export const scriptedLanguageModel = (...responses) => {
5
+ let calls = 0;
6
+ const model = {
7
+ specificationVersion: "v2",
8
+ provider: "vendo-scripted",
9
+ modelId: "vendo-scripted-v1",
10
+ supportedUrls: {},
11
+ async doGenerate(call) {
12
+ const response = responses[Math.min(calls, responses.length - 1)];
13
+ if (response === undefined)
14
+ throw new Error("Scripted language model has no response");
15
+ const value = await responseText(response, call, calls);
16
+ calls += 1;
17
+ if (isToolCall(value)) {
18
+ return {
19
+ content: [{
20
+ type: "tool-call",
21
+ toolCallId: `call_${calls}`,
22
+ toolName: value.tool,
23
+ input: JSON.stringify(value.input),
24
+ }],
25
+ finishReason: "tool-calls",
26
+ usage: { inputTokens: 1, outputTokens: 1, totalTokens: 2 },
27
+ };
28
+ }
29
+ const text = Array.isArray(value) ? value.join("") : value;
30
+ return {
31
+ content: [{ type: "text", text }],
32
+ finishReason: "stop",
33
+ usage: { inputTokens: 1, outputTokens: 1, totalTokens: 2 },
34
+ };
35
+ },
36
+ async doStream(call) {
37
+ const response = responses[Math.min(calls, responses.length - 1)];
38
+ if (response === undefined)
39
+ throw new Error("Scripted language model has no response");
40
+ const value = await responseText(response, call, calls);
41
+ if (isToolCall(value)) {
42
+ calls += 1;
43
+ return {
44
+ stream: new ReadableStream({
45
+ start(controller) {
46
+ controller.enqueue({ type: "stream-start", warnings: [] });
47
+ controller.enqueue({
48
+ type: "tool-call",
49
+ toolCallId: `call_${calls}`,
50
+ toolName: value.tool,
51
+ input: JSON.stringify(value.input),
52
+ });
53
+ controller.enqueue({
54
+ type: "finish",
55
+ finishReason: "tool-calls",
56
+ usage: { inputTokens: 1, outputTokens: 1, totalTokens: 2 },
57
+ });
58
+ controller.close();
59
+ },
60
+ }),
61
+ };
62
+ }
63
+ const chunks = Array.isArray(value) ? value : [value];
64
+ calls += 1;
65
+ return {
66
+ stream: new ReadableStream({
67
+ start(controller) {
68
+ controller.enqueue({ type: "stream-start", warnings: [] });
69
+ controller.enqueue({ type: "text-start", id: "text_1" });
70
+ for (const delta of chunks)
71
+ controller.enqueue({ type: "text-delta", id: "text_1", delta });
72
+ controller.enqueue({ type: "text-end", id: "text_1" });
73
+ controller.enqueue({
74
+ type: "finish",
75
+ finishReason: "stop",
76
+ usage: { inputTokens: 1, outputTokens: 1, totalTokens: 2 },
77
+ });
78
+ controller.close();
79
+ },
80
+ }),
81
+ };
82
+ },
83
+ };
84
+ return model;
85
+ };
86
+ const textOf = (call) => call.prompt.map((message) => {
87
+ if (typeof message.content === "string")
88
+ return message.content;
89
+ return message.content.map((part) => part.text ?? "").join("");
90
+ }).join("\n");
91
+ const markedValue = (text, marker) => {
92
+ const start = text.lastIndexOf(marker);
93
+ if (start === -1)
94
+ return "Untitled app";
95
+ const value = text.slice(start + marker.length).split("\n")[0]?.trim() ?? "";
96
+ return value.slice(0, 60) || "Untitled app";
97
+ };
98
+ /** Compatibility fixture for lifecycle/execution suites that only need valid generation. */
99
+ export const basicLanguageModel = () => scriptedLanguageModel((call) => {
100
+ const prompt = textOf(call);
101
+ if (prompt.includes("TASK: EDIT_TREE")) {
102
+ const instruction = markedValue(prompt, "INSTRUCTION: ");
103
+ // v2 spec §5 — edits are wire patches; quotes in the derived name would
104
+ // break the attribute, so strip them.
105
+ return `<Edit><SetName name="${instruction.replaceAll('"', "'")}"/></Edit>`;
106
+ }
107
+ const name = markedValue(prompt, "USER_REQUEST: ");
108
+ // v2 spec §2 — creates are wire markup; quotes in the derived name would
109
+ // break the attribute, so strip them.
110
+ return `<App name="${name.replaceAll('"', "'")}"><Text text="${name.replaceAll('"', "'")}"/></App>`;
111
+ });
112
+ //# sourceMappingURL=scripted-model.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"scripted-model.js","sourceRoot":"","sources":["../../src/testing/scripted-model.ts"],"names":[],"mappings":"AAwBA,MAAM,UAAU,GAAG,CAAC,KAAmB,EAA6B,EAAE,CACpE,OAAO,KAAK,KAAK,QAAQ,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC;AAErD,MAAM,YAAY,GAAG,CACnB,QAA+B,EAC/B,IAAuB,EACvB,KAAa,EACyB,EAAE,CAAC,OAAO,QAAQ,KAAK,UAAU,CAAC,CAAC,CAAC,QAAQ,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC;AAE7G,kFAAkF;AAClF,MAAM,CAAC,MAAM,qBAAqB,GAAG,CAAC,GAAG,SAAkC,EAAiB,EAAE;IAC5F,IAAI,KAAK,GAAG,CAAC,CAAC;IACd,MAAM,KAAK,GAAG;QACZ,oBAAoB,EAAE,IAAa;QACnC,QAAQ,EAAE,gBAAgB;QAC1B,OAAO,EAAE,mBAAmB;QAC5B,aAAa,EAAE,EAAE;QACjB,KAAK,CAAC,UAAU,CAAC,IAAuB;YACtC,MAAM,QAAQ,GAAG,SAAS,CAAC,IAAI,CAAC,GAAG,CAAC,KAAK,EAAE,SAAS,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC;YAClE,IAAI,QAAQ,KAAK,SAAS;gBAAE,MAAM,IAAI,KAAK,CAAC,yCAAyC,CAAC,CAAC;YACvF,MAAM,KAAK,GAAG,MAAM,YAAY,CAAC,QAAQ,EAAE,IAAI,EAAE,KAAK,CAAC,CAAC;YACxD,KAAK,IAAI,CAAC,CAAC;YACX,IAAI,UAAU,CAAC,KAAK,CAAC,EAAE,CAAC;gBACtB,OAAO;oBACL,OAAO,EAAE,CAAC;4BACR,IAAI,EAAE,WAAoB;4BAC1B,UAAU,EAAE,QAAQ,KAAK,EAAE;4BAC3B,QAAQ,EAAE,KAAK,CAAC,IAAI;4BACpB,KAAK,EAAE,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,KAAK,CAAC;yBACnC,CAAC;oBACF,YAAY,EAAE,YAAqB;oBACnC,KAAK,EAAE,EAAE,WAAW,EAAE,CAAC,EAAE,YAAY,EAAE,CAAC,EAAE,WAAW,EAAE,CAAC,EAAE;iBAC3D,CAAC;YACJ,CAAC;YACD,MAAM,IAAI,GAAG,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC;YAC3D,OAAO;gBACL,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAe,EAAE,IAAI,EAAE,CAAC;gBAC1C,YAAY,EAAE,MAAe;gBAC7B,KAAK,EAAE,EAAE,WAAW,EAAE,CAAC,EAAE,YAAY,EAAE,CAAC,EAAE,WAAW,EAAE,CAAC,EAAE;aAC3D,CAAC;QACJ,CAAC;QACD,KAAK,CAAC,QAAQ,CAAC,IAAuB;YACpC,MAAM,QAAQ,GAAG,SAAS,CAAC,IAAI,CAAC,GAAG,CAAC,KAAK,EAAE,SAAS,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC;YAClE,IAAI,QAAQ,KAAK,SAAS;gBAAE,MAAM,IAAI,KAAK,CAAC,yCAAyC,CAAC,CAAC;YACvF,MAAM,KAAK,GAAG,MAAM,YAAY,CAAC,QAAQ,EAAE,IAAI,EAAE,KAAK,CAAC,CAAC;YACxD,IAAI,UAAU,CAAC,KAAK,CAAC,EAAE,CAAC;gBACtB,KAAK,IAAI,CAAC,CAAC;gBACX,OAAO;oBACL,MAAM,EAAE,IAAI,cAAc,CAAC;wBACzB,KAAK,CAAC,UAAU;4BACd,UAAU,CAAC,OAAO,CAAC,EAAE,IAAI,EAAE,cAAc,EAAE,QAAQ,EAAE,EAAE,EAAE,CAAC,CAAC;4BAC3D,UAAU,CAAC,OAAO,CAAC;gCACjB,IAAI,EAAE,WAAW;gCACjB,UAAU,EAAE,QAAQ,KAAK,EAAE;gCAC3B,QAAQ,EAAE,KAAK,CAAC,IAAI;gCACpB,KAAK,EAAE,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,KAAK,CAAC;6BACnC,CAAC,CAAC;4BACH,UAAU,CAAC,OAAO,CAAC;gCACjB,IAAI,EAAE,QAAQ;gCACd,YAAY,EAAE,YAAY;gCAC1B,KAAK,EAAE,EAAE,WAAW,EAAE,CAAC,EAAE,YAAY,EAAE,CAAC,EAAE,WAAW,EAAE,CAAC,EAAE;6BAC3D,CAAC,CAAC;4BACH,UAAU,CAAC,KAAK,EAAE,CAAC;wBACrB,CAAC;qBACF,CAAC;iBACH,CAAC;YACJ,CAAC;YACD,MAAM,MAAM,GAAG,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC;YACtD,KAAK,IAAI,CAAC,CAAC;YACX,OAAO;gBACL,MAAM,EAAE,IAAI,cAAc,CAAC;oBACzB,KAAK,CAAC,UAAU;wBACd,UAAU,CAAC,OAAO,CAAC,EAAE,IAAI,EAAE,cAAc,EAAE,QAAQ,EAAE,EAAE,EAAE,CAAC,CAAC;wBAC3D,UAAU,CAAC,OAAO,CAAC,EAAE,IAAI,EAAE,YAAY,EAAE,EAAE,EAAE,QAAQ,EAAE,CAAC,CAAC;wBACzD,KAAK,MAAM,KAAK,IAAI,MAAM;4BAAE,UAAU,CAAC,OAAO,CAAC,EAAE,IAAI,EAAE,YAAY,EAAE,EAAE,EAAE,QAAQ,EAAE,KAAK,EAAE,CAAC,CAAC;wBAC5F,UAAU,CAAC,OAAO,CAAC,EAAE,IAAI,EAAE,UAAU,EAAE,EAAE,EAAE,QAAQ,EAAE,CAAC,CAAC;wBACvD,UAAU,CAAC,OAAO,CAAC;4BACjB,IAAI,EAAE,QAAQ;4BACd,YAAY,EAAE,MAAM;4BACpB,KAAK,EAAE,EAAE,WAAW,EAAE,CAAC,EAAE,YAAY,EAAE,CAAC,EAAE,WAAW,EAAE,CAAC,EAAE;yBAC3D,CAAC,CAAC;wBACH,UAAU,CAAC,KAAK,EAAE,CAAC;oBACrB,CAAC;iBACF,CAAC;aACH,CAAC;QACJ,CAAC;KACF,CAAC;IACF,OAAO,KAAiC,CAAC;AAC3C,CAAC,CAAC;AAEF,MAAM,MAAM,GAAG,CAAC,IAAuB,EAAU,EAAE,CAAC,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,OAAO,EAAE,EAAE;IAC9E,IAAI,OAAO,OAAO,CAAC,OAAO,KAAK,QAAQ;QAAE,OAAO,OAAO,CAAC,OAAO,CAAC;IAChE,OAAO,OAAO,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,IAAI,IAAI,EAAE,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;AACjE,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AAEd,MAAM,WAAW,GAAG,CAAC,IAAY,EAAE,MAAc,EAAU,EAAE;IAC3D,MAAM,KAAK,GAAG,IAAI,CAAC,WAAW,CAAC,MAAM,CAAC,CAAC;IACvC,IAAI,KAAK,KAAK,CAAC,CAAC;QAAE,OAAO,cAAc,CAAC;IACxC,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,KAAK,GAAG,MAAM,CAAC,MAAM,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC;IAC7E,OAAO,KAAK,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,IAAI,cAAc,CAAC;AAC9C,CAAC,CAAC;AAEF,4FAA4F;AAC5F,MAAM,CAAC,MAAM,kBAAkB,GAAG,GAAkB,EAAE,CAAC,qBAAqB,CAAC,CAAC,IAAI,EAAE,EAAE;IACpF,MAAM,MAAM,GAAG,MAAM,CAAC,IAAI,CAAC,CAAC;IAC5B,IAAI,MAAM,CAAC,QAAQ,CAAC,iBAAiB,CAAC,EAAE,CAAC;QACvC,MAAM,WAAW,GAAG,WAAW,CAAC,MAAM,EAAE,eAAe,CAAC,CAAC;QACzD,wEAAwE;QACxE,sCAAsC;QACtC,OAAO,wBAAwB,WAAW,CAAC,UAAU,CAAC,GAAG,EAAE,GAAG,CAAC,YAAY,CAAC;IAC9E,CAAC;IACD,MAAM,IAAI,GAAG,WAAW,CAAC,MAAM,EAAE,gBAAgB,CAAC,CAAC;IACnD,yEAAyE;IACzE,sCAAsC;IACtC,OAAO,cAAc,IAAI,CAAC,UAAU,CAAC,GAAG,EAAE,GAAG,CAAC,iBAAiB,IAAI,CAAC,UAAU,CAAC,GAAG,EAAE,GAAG,CAAC,WAAW,CAAC;AACtG,CAAC,CAAC,CAAC"}
@@ -0,0 +1,4 @@
1
+ import type { AppDocument, StoreAdapter } from "@vendoai/core";
2
+ /** Seed an app using the reserved vendo_apps row shape. */
3
+ export declare const seedAppRow: (store: StoreAdapter, app: AppDocument, subject: string, enabled?: boolean) => Promise<import("@vendoai/core").VendoRecord>;
4
+ //# sourceMappingURL=seed-app-row.d.ts.map