@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,252 @@
1
+ import { VENDO_APPS_CREATE_TOOL, VENDO_VIEW_STREAM, VendoError, vendoViewStreamId, } from "@vendoai/core";
2
+ const DRAFT_2020_12 = "https://json-schema.org/draft/2020-12/schema";
3
+ const descriptors = [
4
+ {
5
+ // The agent's streaming-view bridge keys on this exact core-defined name.
6
+ name: VENDO_APPS_CREATE_TOOL,
7
+ description: "Create a Vendo app from a natural-language prompt.",
8
+ inputSchema: {
9
+ $schema: DRAFT_2020_12,
10
+ type: "object",
11
+ properties: { prompt: { type: "string", minLength: 1 } },
12
+ required: ["prompt"],
13
+ additionalProperties: false,
14
+ },
15
+ // Creation is structurally rung 1: a jailed document render with no server,
16
+ // host-tool execution, or egress. The lifecycle write is only to Vendo's
17
+ // own app store, so consent policy treats it like opening a local view.
18
+ risk: "read",
19
+ },
20
+ {
21
+ name: "vendo_apps_edit",
22
+ description: "Edit an existing Vendo app with one natural-language instruction. If the result has failure.retryable=true, retry vendo_apps_edit on the same appId with a narrower instruction; do not rebuild it with vendo_apps_create.",
23
+ inputSchema: {
24
+ $schema: DRAFT_2020_12,
25
+ type: "object",
26
+ properties: {
27
+ appId: { type: "string", minLength: 1 },
28
+ instruction: { type: "string", minLength: 1 },
29
+ },
30
+ required: ["appId", "instruction"],
31
+ additionalProperties: false,
32
+ },
33
+ risk: "write",
34
+ },
35
+ {
36
+ name: "vendo_apps_rebase_pin",
37
+ description: "Rebase one drifted remixed pin of a Vendo app onto the host's updated component: re-fork the new captured baseline and replay the recorded edit intents in order. Use when an edit result or open() payload reports drifted pins and the user asks to update the remix. If the result has status \"failed\", nothing was changed; it lists which intents replayed and which failed.",
38
+ inputSchema: {
39
+ $schema: DRAFT_2020_12,
40
+ type: "object",
41
+ properties: {
42
+ appId: { type: "string", minLength: 1 },
43
+ slot: { type: "string", minLength: 1 },
44
+ },
45
+ required: ["appId", "slot"],
46
+ additionalProperties: false,
47
+ },
48
+ risk: "write",
49
+ },
50
+ {
51
+ name: "vendo_apps_open",
52
+ description: "Open the latest serving surface for a Vendo app.",
53
+ inputSchema: {
54
+ $schema: DRAFT_2020_12,
55
+ type: "object",
56
+ properties: { appId: { type: "string", minLength: 1 } },
57
+ required: ["appId"],
58
+ additionalProperties: false,
59
+ },
60
+ risk: "read",
61
+ },
62
+ {
63
+ name: "vendo_apps_data_list",
64
+ description: "List records from a declared Vendo app data collection.",
65
+ inputSchema: {
66
+ $schema: DRAFT_2020_12,
67
+ type: "object",
68
+ properties: {
69
+ appId: { type: "string", minLength: 1 },
70
+ collection: { type: "string", minLength: 1 },
71
+ refs: { type: "object", additionalProperties: { type: "string", minLength: 1 } },
72
+ limit: { type: "integer", minimum: 1 },
73
+ cursor: { type: "string", minLength: 1 },
74
+ },
75
+ required: ["appId", "collection"],
76
+ additionalProperties: false,
77
+ },
78
+ risk: "read",
79
+ },
80
+ {
81
+ name: "vendo_apps_data_put",
82
+ description: "Create or replace a record in a declared Vendo app data collection.",
83
+ inputSchema: {
84
+ $schema: DRAFT_2020_12,
85
+ type: "object",
86
+ properties: {
87
+ appId: { type: "string", minLength: 1 },
88
+ collection: { type: "string", minLength: 1 },
89
+ id: { type: "string", minLength: 1 },
90
+ data: {},
91
+ refs: { type: "object", additionalProperties: { type: "string", minLength: 1 } },
92
+ },
93
+ required: ["appId", "collection", "id", "data"],
94
+ additionalProperties: false,
95
+ },
96
+ risk: "write",
97
+ },
98
+ {
99
+ name: "vendo_apps_data_delete",
100
+ description: "Delete a record from a declared Vendo app data collection.",
101
+ inputSchema: {
102
+ $schema: DRAFT_2020_12,
103
+ type: "object",
104
+ properties: {
105
+ appId: { type: "string", minLength: 1 },
106
+ collection: { type: "string", minLength: 1 },
107
+ id: { type: "string", minLength: 1 },
108
+ },
109
+ required: ["appId", "collection", "id"],
110
+ additionalProperties: false,
111
+ },
112
+ risk: "write",
113
+ },
114
+ ];
115
+ const input = (value, required, optional = []) => {
116
+ if (typeof value !== "object" || value === null || Array.isArray(value)) {
117
+ throw new VendoError("validation", "tool input must be an object");
118
+ }
119
+ const record = value;
120
+ const allowed = new Set([...required, ...optional]);
121
+ const unexpected = Object.keys(record).find((key) => !allowed.has(key));
122
+ if (unexpected !== undefined)
123
+ throw new VendoError("validation", `unexpected input property: ${unexpected}`);
124
+ for (const key of required) {
125
+ if (typeof record[key] !== "string" || record[key].trim() === "") {
126
+ throw new VendoError("validation", `${key} must be a non-empty string`);
127
+ }
128
+ }
129
+ return record;
130
+ };
131
+ const optionalRefs = (value) => {
132
+ if (value === undefined)
133
+ return undefined;
134
+ if (typeof value !== "object" || value === null || Array.isArray(value)) {
135
+ throw new VendoError("validation", "refs must be an object");
136
+ }
137
+ const refs = {};
138
+ for (const [key, item] of Object.entries(value)) {
139
+ if (key === "" || typeof item !== "string" || item.trim() === "") {
140
+ throw new VendoError("validation", "refs must have non-empty string keys and values");
141
+ }
142
+ refs[key] = item;
143
+ }
144
+ return refs;
145
+ };
146
+ const optionalLimit = (value) => {
147
+ if (value === undefined)
148
+ return undefined;
149
+ if (typeof value !== "number" || !Number.isSafeInteger(value) || value < 1) {
150
+ throw new VendoError("validation", "limit must be a positive integer");
151
+ }
152
+ return value;
153
+ };
154
+ const errorOutcome = (error) => ({
155
+ status: "error",
156
+ error: error instanceof VendoError
157
+ ? { code: error.code, message: error.message }
158
+ : { code: "internal", message: error instanceof Error ? error.message : "unknown apps error" },
159
+ });
160
+ /** 06-apps §§1,5 — unbound Vendo app capabilities; the umbrella binds this registry. */
161
+ export const createAgentTools = (runtime, dependencies) => ({
162
+ async descriptors() {
163
+ return structuredClone(descriptors);
164
+ },
165
+ async execute(call, ctx) {
166
+ try {
167
+ if (call.tool === "vendo_apps_create") {
168
+ const args = input(call.args, ["prompt"]);
169
+ const stream = call[VENDO_VIEW_STREAM];
170
+ const app = await runtime.create({
171
+ prompt: args.prompt,
172
+ ...(stream === undefined ? {} : {
173
+ onView: (part) => stream({ id: vendoViewStreamId(part.appId), part }),
174
+ }),
175
+ }, ctx);
176
+ return { status: "ok", output: app };
177
+ }
178
+ if (call.tool === "vendo_apps_edit") {
179
+ const args = input(call.args, ["appId", "instruction"]);
180
+ const result = await runtime.edit(args.appId, args.instruction, ctx);
181
+ return {
182
+ status: "ok",
183
+ output: {
184
+ app: result.app,
185
+ ...(result.issues === undefined ? {} : { issues: result.issues }),
186
+ ...(result.failure === undefined ? {} : { failure: result.failure }),
187
+ ...(result.driftedPins === undefined ? {} : { driftedPins: result.driftedPins }),
188
+ // Wave 9 — a ladder-authored automation (mode, trigger, pending
189
+ // standing-grant approvals) so the agent can narrate what was set
190
+ // up and which approvals are waiting.
191
+ ...(result.automation === undefined ? {} : { automation: result.automation }),
192
+ },
193
+ };
194
+ }
195
+ if (call.tool === "vendo_apps_rebase_pin") {
196
+ const args = input(call.args, ["appId", "slot"]);
197
+ const result = await runtime.pins.rebase({
198
+ appId: args.appId,
199
+ slot: args.slot,
200
+ }, ctx);
201
+ return { status: "ok", output: result };
202
+ }
203
+ if (call.tool === "vendo_apps_open") {
204
+ const args = input(call.args, ["appId"]);
205
+ return { status: "ok", output: await runtime.open(args.appId, ctx) };
206
+ }
207
+ if (call.tool === "vendo_apps_data_list") {
208
+ const args = input(call.args, ["appId", "collection"], ["refs", "limit", "cursor"]);
209
+ const app = await dependencies.requireOwned(args.appId, ctx.principal.subject);
210
+ const refs = optionalRefs(args.refs);
211
+ const limit = optionalLimit(args.limit);
212
+ if (args.cursor !== undefined && (typeof args.cursor !== "string" || args.cursor.trim() === "")) {
213
+ throw new VendoError("validation", "cursor must be a non-empty string");
214
+ }
215
+ const query = {
216
+ ...(refs === undefined ? {} : { refs }),
217
+ ...(limit === undefined ? {} : { limit }),
218
+ ...(args.cursor === undefined ? {} : { cursor: args.cursor }),
219
+ };
220
+ return {
221
+ status: "ok",
222
+ output: await dependencies.data.records(app, args.collection).list(query),
223
+ };
224
+ }
225
+ if (call.tool === "vendo_apps_data_put") {
226
+ const args = input(call.args, ["appId", "collection", "id"], ["data", "refs"]);
227
+ if (!Object.prototype.hasOwnProperty.call(args, "data") || args.data === undefined) {
228
+ throw new VendoError("validation", "data is required");
229
+ }
230
+ const app = await dependencies.requireOwned(args.appId, ctx.principal.subject);
231
+ const refs = optionalRefs(args.refs);
232
+ const record = await dependencies.data.records(app, args.collection).put({
233
+ id: args.id,
234
+ data: args.data,
235
+ ...(refs === undefined ? {} : { refs }),
236
+ });
237
+ return { status: "ok", output: record };
238
+ }
239
+ if (call.tool === "vendo_apps_data_delete") {
240
+ const args = input(call.args, ["appId", "collection", "id"]);
241
+ const app = await dependencies.requireOwned(args.appId, ctx.principal.subject);
242
+ await dependencies.data.records(app, args.collection).delete(args.id);
243
+ return { status: "ok", output: { status: "ok" } };
244
+ }
245
+ return { status: "error", error: { code: "not-found", message: `Unknown tool: ${call.tool}` } };
246
+ }
247
+ catch (error) {
248
+ return errorOutcome(error);
249
+ }
250
+ },
251
+ });
252
+ //# sourceMappingURL=agent-tools.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"agent-tools.js","sourceRoot":"","sources":["../src/agent-tools.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,23 @@
1
+ import type { AppDocument, AppId, BlobStore, Json, RecordStore, StorageDecl, StoreAdapter } from "@vendoai/core";
2
+ export declare const APP_RECORD_MAX_BYTES: number;
3
+ /** ENG-289 M1 — app-declared file collections accept blobs up to 5 MB each. */
4
+ export declare const APP_BLOB_MAX_BYTES: number;
5
+ export type AppStorage = {
6
+ kind: "records";
7
+ records: RecordStore;
8
+ } | {
9
+ kind: "files";
10
+ blobs: BlobStore;
11
+ };
12
+ /** 06-apps §6 — resolve an app declaration onto its isolated store collection. */
13
+ export declare const resolveAppStorage: (store: StoreAdapter, appId: AppId, name: string, declaration: StorageDecl) => AppStorage;
14
+ export interface AppDataAccess {
15
+ getState(appId: AppId, subject: string): Promise<Json | null>;
16
+ setState(appId: AppId, subject: string, data: Json): Promise<void>;
17
+ records(app: AppDocument, name: string): RecordStore;
18
+ blobs(app: AppDocument, name: string): BlobStore;
19
+ clear(app: AppDocument, subject: string, historical?: readonly AppDocument[]): Promise<void>;
20
+ }
21
+ /** 06-apps §6 — private app-data API consumed by lifecycle and later execution lanes. */
22
+ export declare const createAppData: (store: StoreAdapter) => AppDataAccess;
23
+ //# sourceMappingURL=app-data.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"app-data.d.ts","sourceRoot":"","sources":["../src/app-data.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,WAAW,EACX,KAAK,EACL,SAAS,EACT,IAAI,EACJ,WAAW,EACX,WAAW,EACX,YAAY,EACb,MAAM,eAAe,CAAC;AAIvB,eAAO,MAAM,oBAAoB,QAAa,CAAC;AAC/C,+EAA+E;AAC/E,eAAO,MAAM,kBAAkB,QAAkB,CAAC;AAIlD,MAAM,MAAM,UAAU,GAClB;IAAE,IAAI,EAAE,SAAS,CAAC;IAAC,OAAO,EAAE,WAAW,CAAA;CAAE,GACzC;IAAE,IAAI,EAAE,OAAO,CAAC;IAAC,KAAK,EAAE,SAAS,CAAA;CAAE,CAAC;AAExC,kFAAkF;AAClF,eAAO,MAAM,iBAAiB,GAC5B,OAAO,YAAY,EACnB,OAAO,KAAK,EACZ,MAAM,MAAM,EACZ,aAAa,WAAW,KACvB,UAEoE,CAAC;AAaxE,MAAM,WAAW,aAAa;IAC5B,QAAQ,CAAC,KAAK,EAAE,KAAK,EAAE,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,GAAG,IAAI,CAAC,CAAC;IAC9D,QAAQ,CAAC,KAAK,EAAE,KAAK,EAAE,OAAO,EAAE,MAAM,EAAE,IAAI,EAAE,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IACnE,OAAO,CAAC,GAAG,EAAE,WAAW,EAAE,IAAI,EAAE,MAAM,GAAG,WAAW,CAAC;IACrD,KAAK,CAAC,GAAG,EAAE,WAAW,EAAE,IAAI,EAAE,MAAM,GAAG,SAAS,CAAC;IACjD,KAAK,CAAC,GAAG,EAAE,WAAW,EAAE,OAAO,EAAE,MAAM,EAAE,UAAU,CAAC,EAAE,SAAS,WAAW,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;CAC9F;AAgDD,yFAAyF;AACzF,eAAO,MAAM,aAAa,GAAI,OAAO,YAAY,KAAG,aAiElD,CAAC"}
@@ -0,0 +1,129 @@
1
+ import { VendoError } from "@vendoai/core";
2
+ import { listAllRecords } from "./persistence.js";
3
+ export const APP_RECORD_MAX_BYTES = 256 * 1024;
4
+ /** ENG-289 M1 — app-declared file collections accept blobs up to 5 MB each. */
5
+ export const APP_BLOB_MAX_BYTES = 5 * 1024 * 1024;
6
+ const encoder = new TextEncoder();
7
+ /** 06-apps §6 — resolve an app declaration onto its isolated store collection. */
8
+ export const resolveAppStorage = (store, appId, name, declaration) => declaration.kind === "files"
9
+ ? { kind: "files", blobs: store.blobs(`app:${appId}:${name}`) }
10
+ : { kind: "records", records: store.records(`app:${appId}:${name}`) };
11
+ const allRecordIds = async (records) => (await listAllRecords(records)).map((record) => record.id);
12
+ const clearRecords = async (records) => {
13
+ for (const id of await allRecordIds(records))
14
+ await records.delete(id);
15
+ };
16
+ const clearBlobs = async (blobs) => {
17
+ for (const key of await blobs.list())
18
+ await blobs.delete(key);
19
+ };
20
+ const declaredStorage = (app, name, kind) => {
21
+ if (name === "state")
22
+ throw new VendoError("validation", 'storage collection "state" is reserved');
23
+ const declaration = app.storage !== undefined
24
+ && Object.prototype.hasOwnProperty.call(app.storage, name)
25
+ ? app.storage[name]
26
+ : undefined;
27
+ const actualKind = declaration?.kind ?? "records";
28
+ if (declaration === undefined || actualKind !== kind) {
29
+ throw new VendoError("not-found", `${kind} collection not found: ${name}`);
30
+ }
31
+ return declaration;
32
+ };
33
+ const validateRecordRefs = (declaration, refs) => {
34
+ if (refs === undefined)
35
+ return;
36
+ if (typeof refs !== "object" || refs === null || Array.isArray(refs)) {
37
+ throw new VendoError("validation", "record refs must be an object");
38
+ }
39
+ const declared = declaration.refs ?? {};
40
+ for (const [key, value] of Object.entries(refs)) {
41
+ if (!Object.prototype.hasOwnProperty.call(declared, key)) {
42
+ throw new VendoError("validation", `undeclared record ref: ${key}`);
43
+ }
44
+ if (typeof value !== "string" || value.trim() === "") {
45
+ throw new VendoError("validation", `record ref ${key} must be a non-empty string`);
46
+ }
47
+ }
48
+ };
49
+ const recordByteLength = (record) => {
50
+ try {
51
+ const serialized = JSON.stringify(record);
52
+ if (serialized === undefined)
53
+ throw new Error("record is not JSON serializable");
54
+ return encoder.encode(serialized).byteLength;
55
+ }
56
+ catch {
57
+ throw new VendoError("validation", "record must be valid JSON");
58
+ }
59
+ };
60
+ /** 06-apps §6 — private app-data API consumed by lifecycle and later execution lanes. */
61
+ export const createAppData = (store) => ({
62
+ async getState(appId, subject) {
63
+ const record = await store.records("vendo_state").get(`${appId}:${subject}`);
64
+ return record === null ? null : structuredClone(record.data);
65
+ },
66
+ async setState(appId, subject, data) {
67
+ await store.records("vendo_state").put({
68
+ id: `${appId}:${subject}`,
69
+ data: structuredClone(data),
70
+ refs: { subject, app_id: appId },
71
+ });
72
+ },
73
+ records(app, name) {
74
+ const declaration = declaredStorage(app, name, "records");
75
+ const storage = resolveAppStorage(store, app.id, name, declaration);
76
+ if (storage.kind !== "records") {
77
+ throw new VendoError("not-found", `records collection not found: ${name}`);
78
+ }
79
+ return {
80
+ get: (id) => storage.records.get(id),
81
+ async put(record) {
82
+ validateRecordRefs(declaration, record.refs);
83
+ if (recordByteLength(record) > APP_RECORD_MAX_BYTES) {
84
+ throw new VendoError("validation", "record exceeds 256 KB size limit");
85
+ }
86
+ return storage.records.put(record);
87
+ },
88
+ delete: (id) => storage.records.delete(id),
89
+ list: (query) => storage.records.list(query),
90
+ };
91
+ },
92
+ blobs(app, name) {
93
+ const declaration = declaredStorage(app, name, "files");
94
+ const storage = resolveAppStorage(store, app.id, name, declaration);
95
+ if (storage.kind !== "files") {
96
+ throw new VendoError("not-found", `files collection not found: ${name}`);
97
+ }
98
+ return {
99
+ async put(key, bytes, meta) {
100
+ if (bytes.byteLength > APP_BLOB_MAX_BYTES) {
101
+ throw new VendoError("validation", "blob exceeds 5 MB size limit");
102
+ }
103
+ await storage.blobs.put(key, bytes, meta);
104
+ },
105
+ get: (key) => storage.blobs.get(key),
106
+ delete: (key) => storage.blobs.delete(key),
107
+ list: (prefix) => storage.blobs.list(prefix),
108
+ };
109
+ },
110
+ async clear(app, subject, historical = []) {
111
+ const declarations = new Map();
112
+ for (const document of [...historical, app]) {
113
+ for (const [name, declaration] of Object.entries(document.storage ?? {})) {
114
+ declarations.set(`${name}:${declaration.kind ?? "records"}`, declaration);
115
+ }
116
+ }
117
+ for (const [key, declaration] of declarations) {
118
+ const name = key.slice(0, key.lastIndexOf(":"));
119
+ const storage = resolveAppStorage(store, app.id, name, declaration);
120
+ if (storage.kind === "records")
121
+ await clearRecords(storage.records);
122
+ else
123
+ await clearBlobs(storage.blobs);
124
+ }
125
+ await store.records("vendo_state").delete(`${app.id}:${subject}`);
126
+ await clearBlobs(store.blobs(`app:${app.id}`));
127
+ },
128
+ });
129
+ //# sourceMappingURL=app-data.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"app-data.js","sourceRoot":"","sources":["../src/app-data.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,24 @@
1
+ import { type AppId, type StoreAdapter } from "@vendoai/core";
2
+ /** execution-v2 skin contract — the per-app bearer the box calls back with.
3
+ * Minted at provision (Lane B) and presented on every callback-surface request
4
+ * (VENDO_STORE_URL rows + VENDO_HOST_URL tools). Follows the house de-HMAC
5
+ * pattern (wire/context.ts anon cookie): the token itself is an opaque 256-bit
6
+ * random value and the STORE ROW IS THE AUTHORITY — only its SHA-256 hash is
7
+ * persisted (row id = hash), so a store dump never yields a usable bearer and
8
+ * guessing a live token is a 2^256 search. Rotation = re-mint (the old hash
9
+ * row is deleted); revocation = delete the app's rows. */
10
+ export declare const APP_TOKEN_COLLECTION = "vendo_app_tokens";
11
+ export interface AppTokenIdentity {
12
+ appId: AppId;
13
+ subject: string;
14
+ }
15
+ export interface AppTokens {
16
+ /** Mint (and rotate: any previous token for the app stops verifying). */
17
+ mint(appId: AppId, subject: string): Promise<string>;
18
+ /** Resolve a presented bearer to its app + owner, or null. Never throws. */
19
+ verify(token: string): Promise<AppTokenIdentity | null>;
20
+ /** Delete every token for the app (app deletion / de-provision). */
21
+ revoke(appId: AppId): Promise<void>;
22
+ }
23
+ export declare const createAppTokens: (store: StoreAdapter) => AppTokens;
24
+ //# sourceMappingURL=app-token.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"app-token.d.ts","sourceRoot":"","sources":["../src/app-token.ts"],"names":[],"mappings":"AAAA,OAAO,EAAa,KAAK,KAAK,EAAE,KAAK,YAAY,EAAE,MAAM,eAAe,CAAC;AAEzE;;;;;;;0DAO0D;AAE1D,eAAO,MAAM,oBAAoB,qBAAqB,CAAC;AAIvD,MAAM,WAAW,gBAAgB;IAC/B,KAAK,EAAE,KAAK,CAAC;IACb,OAAO,EAAE,MAAM,CAAC;CACjB;AAED,MAAM,WAAW,SAAS;IACxB,yEAAyE;IACzE,IAAI,CAAC,KAAK,EAAE,KAAK,EAAE,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC;IACrD,4EAA4E;IAC5E,MAAM,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,gBAAgB,GAAG,IAAI,CAAC,CAAC;IACxD,oEAAoE;IACpE,MAAM,CAAC,KAAK,EAAE,KAAK,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;CACrC;AAED,eAAO,MAAM,eAAe,GAAI,OAAO,YAAY,KAAG,SA6CrD,CAAC"}
@@ -0,0 +1,61 @@
1
+ import { sha256Hex } from "@vendoai/core";
2
+ /** execution-v2 skin contract — the per-app bearer the box calls back with.
3
+ * Minted at provision (Lane B) and presented on every callback-surface request
4
+ * (VENDO_STORE_URL rows + VENDO_HOST_URL tools). Follows the house de-HMAC
5
+ * pattern (wire/context.ts anon cookie): the token itself is an opaque 256-bit
6
+ * random value and the STORE ROW IS THE AUTHORITY — only its SHA-256 hash is
7
+ * persisted (row id = hash), so a store dump never yields a usable bearer and
8
+ * guessing a live token is a 2^256 search. Rotation = re-mint (the old hash
9
+ * row is deleted); revocation = delete the app's rows. */
10
+ export const APP_TOKEN_COLLECTION = "vendo_app_tokens";
11
+ const TOKEN_PATTERN = /^vat_[0-9a-f]{64}$/;
12
+ export const createAppTokens = (store) => {
13
+ const records = store.records(APP_TOKEN_COLLECTION);
14
+ const revoke = async (appId) => {
15
+ // Re-list from the start after each deleted page instead of following the
16
+ // cursor: deleting mid-pagination can skip rows under an offset-shaped
17
+ // cursor. Terminates because every pass deletes everything it saw.
18
+ for (;;) {
19
+ const page = await records.list({ refs: { app_id: appId } });
20
+ if (page.records.length === 0)
21
+ return;
22
+ for (const record of page.records)
23
+ await records.delete(record.id);
24
+ if (page.cursor === undefined)
25
+ return;
26
+ }
27
+ };
28
+ return {
29
+ async mint(appId, subject) {
30
+ // One live token per app: minting rotates, so a leaked pre-rotation
31
+ // bearer dies with the re-provision instead of accumulating. Rotation is
32
+ // revoke-then-put without a store transaction; the provision path that
33
+ // calls mint is single-flighted per app (machine lifecycle), so
34
+ // concurrent mints for one app do not occur in practice — racing mints
35
+ // could each leave a verifiable row until the next rotation.
36
+ await revoke(appId);
37
+ const bytes = globalThis.crypto.getRandomValues(new Uint8Array(32));
38
+ const token = `vat_${[...bytes].map((byte) => byte.toString(16).padStart(2, "0")).join("")}`;
39
+ await records.put({
40
+ id: sha256Hex(token),
41
+ data: { mintedAt: new Date().toISOString() },
42
+ refs: { app_id: appId, subject },
43
+ });
44
+ return token;
45
+ },
46
+ async verify(token) {
47
+ if (!TOKEN_PATTERN.test(token))
48
+ return null;
49
+ // Constant-work by construction: the hash lookup is a store key equality
50
+ // on a value the caller cannot choose collisions for (cf. run-token HMAC).
51
+ const record = await records.get(sha256Hex(token));
52
+ const appId = record?.refs?.["app_id"];
53
+ const subject = record?.refs?.["subject"];
54
+ if (typeof appId !== "string" || typeof subject !== "string")
55
+ return null;
56
+ return { appId, subject };
57
+ },
58
+ revoke,
59
+ };
60
+ };
61
+ //# sourceMappingURL=app-token.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"app-token.js","sourceRoot":"","sources":["../src/app-token.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAiC,MAAM,eAAe,CAAC;AAEzE;;;;;;;0DAO0D;AAE1D,MAAM,CAAC,MAAM,oBAAoB,GAAG,kBAAkB,CAAC;AAEvD,MAAM,aAAa,GAAG,oBAAoB,CAAC;AAgB3C,MAAM,CAAC,MAAM,eAAe,GAAG,CAAC,KAAmB,EAAa,EAAE;IAChE,MAAM,OAAO,GAAG,KAAK,CAAC,OAAO,CAAC,oBAAoB,CAAC,CAAC;IAEpD,MAAM,MAAM,GAAG,KAAK,EAAE,KAAY,EAAiB,EAAE;QACnD,0EAA0E;QAC1E,uEAAuE;QACvE,mEAAmE;QACnE,SAAS,CAAC;YACR,MAAM,IAAI,GAAG,MAAM,OAAO,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,EAAE,MAAM,EAAE,KAAK,EAAE,EAAE,CAAC,CAAC;YAC7D,IAAI,IAAI,CAAC,OAAO,CAAC,MAAM,KAAK,CAAC;gBAAE,OAAO;YACtC,KAAK,MAAM,MAAM,IAAI,IAAI,CAAC,OAAO;gBAAE,MAAM,OAAO,CAAC,MAAM,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;YACnE,IAAI,IAAI,CAAC,MAAM,KAAK,SAAS;gBAAE,OAAO;QACxC,CAAC;IACH,CAAC,CAAC;IAEF,OAAO;QACL,KAAK,CAAC,IAAI,CAAC,KAAK,EAAE,OAAO;YACvB,oEAAoE;YACpE,yEAAyE;YACzE,uEAAuE;YACvE,gEAAgE;YAChE,uEAAuE;YACvE,6DAA6D;YAC7D,MAAM,MAAM,CAAC,KAAK,CAAC,CAAC;YACpB,MAAM,KAAK,GAAG,UAAU,CAAC,MAAM,CAAC,eAAe,CAAC,IAAI,UAAU,CAAC,EAAE,CAAC,CAAC,CAAC;YACpE,MAAM,KAAK,GAAG,OAAO,CAAC,GAAG,KAAK,CAAC,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC,QAAQ,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC,EAAE,CAAC;YAC7F,MAAM,OAAO,CAAC,GAAG,CAAC;gBAChB,EAAE,EAAE,SAAS,CAAC,KAAK,CAAC;gBACpB,IAAI,EAAE,EAAE,QAAQ,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,EAAE;gBAC5C,IAAI,EAAE,EAAE,MAAM,EAAE,KAAK,EAAE,OAAO,EAAE;aACjC,CAAC,CAAC;YACH,OAAO,KAAK,CAAC;QACf,CAAC;QACD,KAAK,CAAC,MAAM,CAAC,KAAK;YAChB,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC,KAAK,CAAC;gBAAE,OAAO,IAAI,CAAC;YAC5C,yEAAyE;YACzE,2EAA2E;YAC3E,MAAM,MAAM,GAAG,MAAM,OAAO,CAAC,GAAG,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC,CAAC;YACnD,MAAM,KAAK,GAAG,MAAM,EAAE,IAAI,EAAE,CAAC,QAAQ,CAAC,CAAC;YACvC,MAAM,OAAO,GAAG,MAAM,EAAE,IAAI,EAAE,CAAC,SAAS,CAAC,CAAC;YAC1C,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,OAAO,OAAO,KAAK,QAAQ;gBAAE,OAAO,IAAI,CAAC;YAC1E,OAAO,EAAE,KAAK,EAAE,OAAO,EAAE,CAAC;QAC5B,CAAC;QACD,MAAM;KACP,CAAC;AACJ,CAAC,CAAC"}
@@ -0,0 +1,11 @@
1
+ import type { AppId, AuditEvent, Json, Principal, RunContext, TriggerRef } from "@vendoai/core";
2
+ /**
3
+ * 01-core §7 — the one mint for this package's "app-lifecycle" audit events
4
+ * (runtime guard/lifecycle reports, interchange export/import, schedule
5
+ * fires). Copies the principal and trigger so a caller's context object never
6
+ * aliases the emitted event.
7
+ */
8
+ export declare const appLifecycleEvent: (principal: Principal, ctx: Pick<RunContext, "venue" | "presence"> & {
9
+ trigger?: TriggerRef;
10
+ }, appId: AppId, detail: Record<string, Json>, outcome?: AuditEvent["outcome"]) => AuditEvent;
11
+ //# sourceMappingURL=audit.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"audit.d.ts","sourceRoot":"","sources":["../src/audit.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,KAAK,EACL,UAAU,EACV,IAAI,EACJ,SAAS,EACT,UAAU,EACV,UAAU,EACX,MAAM,eAAe,CAAC;AAEvB;;;;;GAKG;AACH,eAAO,MAAM,iBAAiB,GAC5B,WAAW,SAAS,EACpB,KAAK,IAAI,CAAC,UAAU,EAAE,OAAO,GAAG,UAAU,CAAC,GAAG;IAAE,OAAO,CAAC,EAAE,UAAU,CAAA;CAAE,EACtE,OAAO,KAAK,EACZ,QAAQ,MAAM,CAAC,MAAM,EAAE,IAAI,CAAC,EAC5B,UAAS,UAAU,CAAC,SAAS,CAAQ,KACpC,UAWD,CAAC"}
package/dist/audit.js ADDED
@@ -0,0 +1,19 @@
1
+ /**
2
+ * 01-core §7 — the one mint for this package's "app-lifecycle" audit events
3
+ * (runtime guard/lifecycle reports, interchange export/import, schedule
4
+ * fires). Copies the principal and trigger so a caller's context object never
5
+ * aliases the emitted event.
6
+ */
7
+ export const appLifecycleEvent = (principal, ctx, appId, detail, outcome = "ok") => ({
8
+ id: `aud_${globalThis.crypto.randomUUID()}`,
9
+ at: new Date().toISOString(),
10
+ kind: "app-lifecycle",
11
+ principal: { ...principal },
12
+ venue: ctx.venue,
13
+ presence: ctx.presence,
14
+ appId,
15
+ ...(ctx.trigger === undefined ? {} : { trigger: { ...ctx.trigger } }),
16
+ outcome,
17
+ detail,
18
+ });
19
+ //# sourceMappingURL=audit.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"audit.js","sourceRoot":"","sources":["../src/audit.ts"],"names":[],"mappings":"AASA;;;;;GAKG;AACH,MAAM,CAAC,MAAM,iBAAiB,GAAG,CAC/B,SAAoB,EACpB,GAAsE,EACtE,KAAY,EACZ,MAA4B,EAC5B,UAAiC,IAAI,EACzB,EAAE,CAAC,CAAC;IAChB,EAAE,EAAE,OAAO,UAAU,CAAC,MAAM,CAAC,UAAU,EAAE,EAAE;IAC3C,EAAE,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;IAC5B,IAAI,EAAE,eAAe;IACrB,SAAS,EAAE,EAAE,GAAG,SAAS,EAAE;IAC3B,KAAK,EAAE,GAAG,CAAC,KAAK;IAChB,QAAQ,EAAE,GAAG,CAAC,QAAQ;IACtB,KAAK;IACL,GAAG,CAAC,GAAG,CAAC,OAAO,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,OAAO,EAAE,EAAE,GAAG,GAAG,CAAC,OAAO,EAAE,EAAE,CAAC;IACrE,OAAO;IACP,MAAM;CACP,CAAC,CAAC"}
@@ -0,0 +1,43 @@
1
+ import { type ShapeType, type Trigger } from "@vendoai/core";
2
+ import type { LanguageModel } from "ai";
3
+ import { type HostToolInfo } from "./engine.js";
4
+ /**
5
+ * execution-v2 Wave 9 — the escalation ladder's automation authoring: ONE
6
+ * structured model call turns a server-shaped instruction into a Trigger the
7
+ * EXISTING automations engine runs (07-automations), plus the results
8
+ * collection the tree binds. No new automation machinery — the plan is just
9
+ * the document fields (`trigger`, a `storage` declaration) the engine already
10
+ * consumes; setup completes in seconds because no machine is involved.
11
+ */
12
+ export interface AutomationPlanInput {
13
+ appId: string;
14
+ appName: string;
15
+ instruction: string;
16
+ /** The judge's rung: (a) steps or (b) agentic (see engine.serverWorkRung). */
17
+ mode: "steps" | "agentic";
18
+ /** The tools steps may name / the agentic prompt may reference — the SAME
19
+ * guard-bound surface the automations engine executes through. */
20
+ tools: readonly HostToolInfo[];
21
+ /** Sampled result shapes (the engine's shape cards, keyed by tool name):
22
+ * without them the model guesses output fields and the jsonata reads
23
+ * nothing (the live-gate "steps.unpaid.items" class). */
24
+ toolShapes?: Readonly<Record<string, ShapeType>>;
25
+ }
26
+ export interface AutomationPlan {
27
+ trigger: Trigger;
28
+ name?: string;
29
+ /** The app records collection the automation writes displayable results
30
+ * into (the store rows the tree queries via vendo_apps_data_list). */
31
+ resultsCollection?: string;
32
+ }
33
+ export type AutomationPlanResult = {
34
+ kind: "plan";
35
+ plan: AutomationPlan;
36
+ } | {
37
+ kind: "failure";
38
+ issues: string[];
39
+ };
40
+ /** Author the automation for one ladder rung: up to 3 model attempts, each
41
+ * repair fed the accumulated issues (the engine's create/edit loop shape). */
42
+ export declare const planAutomation: (input: AutomationPlanInput, model: LanguageModel) => Promise<AutomationPlanResult>;
43
+ //# sourceMappingURL=automation-plan.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"automation-plan.d.ts","sourceRoot":"","sources":["../src/automation-plan.ts"],"names":[],"mappings":"AAAA,OAAO,EAGL,KAAK,SAAS,EACd,KAAK,OAAO,EACb,MAAM,eAAe,CAAC;AACvB,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,IAAI,CAAC;AAExC,OAAO,EAAkB,KAAK,YAAY,EAAE,MAAM,aAAa,CAAC;AAEhE;;;;;;;GAOG;AAEH,MAAM,WAAW,mBAAmB;IAClC,KAAK,EAAE,MAAM,CAAC;IACd,OAAO,EAAE,MAAM,CAAC;IAChB,WAAW,EAAE,MAAM,CAAC;IACpB,8EAA8E;IAC9E,IAAI,EAAE,OAAO,GAAG,SAAS,CAAC;IAC1B;uEACmE;IACnE,KAAK,EAAE,SAAS,YAAY,EAAE,CAAC;IAC/B;;8DAE0D;IAC1D,UAAU,CAAC,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,SAAS,CAAC,CAAC,CAAC;CAClD;AAED,MAAM,WAAW,cAAc;IAC7B,OAAO,EAAE,OAAO,CAAC;IACjB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd;2EACuE;IACvE,iBAAiB,CAAC,EAAE,MAAM,CAAC;CAC5B;AAED,MAAM,MAAM,oBAAoB,GAC5B;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,cAAc,CAAA;CAAE,GACtC;IAAE,IAAI,EAAE,SAAS,CAAC;IAAC,MAAM,EAAE,MAAM,EAAE,CAAA;CAAE,CAAC;AAiN1C;+EAC+E;AAC/E,eAAO,MAAM,cAAc,GACzB,OAAO,mBAAmB,EAC1B,OAAO,aAAa,KACnB,OAAO,CAAC,oBAAoB,CAe9B,CAAC"}