@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,212 @@
1
+ import { describeShapeWithSemantics, triggerSchema, } from "@vendoai/core";
2
+ import { Cron } from "croner";
3
+ import { distinctIssues } from "./engine.js";
4
+ const RESULTS_TOOL = "vendo_apps_data_put";
5
+ const COLLECTION_NAME = /^[a-z][a-z0-9_-]{0,40}$/i;
6
+ // n > 0, matching the automations engine's durationMs rule exactly — "0s"
7
+ // would validate here and then never fire.
8
+ const EVERY_DURATION = /^[1-9]\d*[smhd]$/;
9
+ /** The planning surface: host + connected tools, plus ONLY the results-publish
10
+ * tool from the vendo_apps_* family — an automation's job is host effects and
11
+ * one published result, never app lifecycle operations (and live data comes
12
+ * from host tools, not from reading app data collections). */
13
+ const plannerTools = (tools) => tools.filter((tool) => !tool.name.startsWith("vendo_apps_") || tool.name === RESULTS_TOOL);
14
+ const toolLine = ({ name, description, risk, inputSchema }, shape) => {
15
+ const properties = inputSchema?.properties;
16
+ const fields = typeof properties === "object" && properties !== null
17
+ ? Object.keys(properties)
18
+ : [];
19
+ return `- ${name} [${risk}]${fields.length === 0 ? "" : ` (input fields: ${fields.join(", ")})`}: ${description}${shape === undefined ? "" : `\n result shape: ${describeShapeWithSemantics(shape, {})}`}`;
20
+ };
21
+ const stepsContract = (input) => `RUN MODEL (this instruction is DETERMINISTIC tool work):
22
+ "run" is {"kind":"steps","steps":[{"id":"<bare identifier>","tool":"<tool name>","args":{...}?,"if":"<jsonata>"?,"forEach":"<jsonata>"?}, ...]}.
23
+ - Every step's "tool" MUST be a name from the TOOLS list; anything else is invalid. Steps run in order.
24
+ - Choose tools that FULFILL the instruction: read live data with the host/connected READ tools (live data NEVER comes from "${RESULTS_TOOL}"-style app collections), and perform each requested effect (email, message, notify, create) with a matching tool from the list when one exists. When no tool can perform a requested effect, skip that effect — the published result still lands on the board.
25
+ - EVERY value inside "args" is a JSON STRING containing a JSONATA expression evaluated against {event, steps, item} — never a bare number, boolean, object, or array. A prior step's output is "steps.<stepId>...". A literal string is single-quoted INSIDE the string ("'like this'"); a literal number is written as its expression ("20"); an object is built in jsonata ("{\\"count\\": $count(steps.rows.items)}").
26
+ - "if" skips the step unless the jsonata expression is truthy. "forEach" is a jsonata expression producing an array; the step runs once per element with that element bound to item (max 1000).
27
+ - RESULTS: the app's board reads STORE ROWS, not run logs. The LAST step MUST persist the displayable result through tool "${RESULTS_TOOL}" with args {"appId":"'${input.appId}'","collection":"'<collection>'","id":"'latest'","data":"<jsonata for the displayable result>"} — and set the top-level "resultsCollection" to that collection name.
28
+ EXAMPLE (shape only — use the real tools and the real request):
29
+ {"name":"Morning digest","trigger":{"on":{"kind":"schedule","cron":"0 8 * * *"},"run":{"kind":"steps","steps":[{"id":"rows","tool":"host_list_things"},{"id":"notify","tool":"host_send_message","args":{"subject":"'Daily digest'","body":"$string($count(steps.rows.items)) & ' items today'"}},{"id":"publish","tool":"${RESULTS_TOOL}","args":{"appId":"'${input.appId}'","collection":"'digest'","id":"'latest'","data":"steps.rows"}}]}},"resultsCollection":"digest"}`;
30
+ const agenticContract = (input) => `RUN MODEL (this instruction needs PER-RUN JUDGMENT):
31
+ "run" is {"kind":"agentic","prompt":"<the instructions an away agent follows on every firing>","budget":{"maxToolCalls":<n>}?}.
32
+ - The prompt must be self-contained (the agent sees only it plus the tools), name the tools to use from the TOOLS list, and state the judgment to exercise each run.
33
+ - RESULTS: when the app's board should show the outcome, the prompt must ALSO instruct the agent to persist the displayable result through tool "${RESULTS_TOOL}" with appId "${input.appId}", a stable collection, and id "latest" — and set the top-level "resultsCollection" to that collection name.`;
34
+ const planContract = (input) => `You are the Vendo automation planner. Return ONLY one JSON object — no prose, no markdown fences.
35
+ Shape: {"name":"<short automation name>","trigger":{"on":<trigger source>,"run":<run model>},"resultsCollection":"<records collection>"?}
36
+
37
+ TRIGGER SOURCE "on" (exactly one form):
38
+ - {"kind":"schedule","cron":"<5-field cron, UTC>"} for clock times (e.g. daily 8am = "0 8 * * *"),
39
+ - {"kind":"schedule","every":"<n><s|m|h|d>"} for plain intervals,
40
+ - {"kind":"schedule","at":"<ISO date-time>"} for a one-shot,
41
+ - {"kind":"host-event","event":"<event name>"} ONLY when the instruction reacts to a named host product event.
42
+ External webhook connectors are NOT available to this planner.
43
+
44
+ ${input.mode === "steps" ? stepsContract(input) : agenticContract(input)}
45
+
46
+ TOOLS (the ONLY tools available). Where a "result shape" is shown, a jsonata expression may reference ONLY those fields (steps.<id>.<field>); when a tool has no shape shown, pass its WHOLE output along (steps.<id>) instead of guessing field names:
47
+ ${plannerTools(input.tools).map((tool) => toolLine(tool, input.toolShapes?.[tool.name])).join("\n") || "(none)"}`;
48
+ const repairPrompt = (issues) => issues.length === 0 ? "" : `\nREPAIR_THESE_ISSUES: ${JSON.stringify(issues)}`;
49
+ /** Models wrap JSON in prose/fences despite instructions — take the outermost
50
+ * object deterministically (same tolerance class as engine.extractWire). */
51
+ const extractJson = (text) => {
52
+ const start = text.indexOf("{");
53
+ const end = text.lastIndexOf("}");
54
+ return start === -1 || end <= start ? text : text.slice(start, end + 1);
55
+ };
56
+ const generatePlanText = async (model, system, prompt) => {
57
+ try {
58
+ const { streamText } = await import("ai");
59
+ const result = streamText({ model, system, prompt, temperature: 0, maxRetries: 0 });
60
+ let text = "";
61
+ for await (const delta of result.textStream)
62
+ text += delta;
63
+ return { text, issues: [] };
64
+ }
65
+ catch (error) {
66
+ return { issues: [`model generation failed: ${error instanceof Error ? error.message : "unknown error"}`] };
67
+ }
68
+ };
69
+ /** The same schedule constraints the automations engine enforces at
70
+ * validateTrigger — checked HERE so an unfireable trigger is repaired at
71
+ * authoring time instead of silently never firing on the tick. */
72
+ const scheduleIssues = (trigger) => {
73
+ if (trigger.on.kind !== "schedule")
74
+ return [];
75
+ const issues = [];
76
+ if (trigger.on.every !== undefined && !EVERY_DURATION.test(trigger.on.every)) {
77
+ issues.push('schedule "every" must match <n><s|m|h|d> with n > 0');
78
+ }
79
+ if (trigger.on.cron !== undefined) {
80
+ if (trigger.on.cron.trim().split(/\s+/).length !== 5) {
81
+ issues.push('schedule "cron" must contain exactly 5 fields');
82
+ }
83
+ else {
84
+ try {
85
+ new Cron(trigger.on.cron, { timezone: "UTC", paused: true });
86
+ }
87
+ catch (error) {
88
+ issues.push(`invalid schedule cron: ${error instanceof Error ? error.message : "unparseable"}`);
89
+ }
90
+ }
91
+ }
92
+ if (trigger.on.at !== undefined && !Number.isFinite(Date.parse(trigger.on.at))) {
93
+ issues.push('schedule "at" must be an ISO date-time');
94
+ }
95
+ return issues;
96
+ };
97
+ const validatePlan = (raw, input) => {
98
+ let parsed;
99
+ try {
100
+ parsed = JSON.parse(extractJson(raw));
101
+ }
102
+ catch (error) {
103
+ return { issues: [`the response was not a single valid JSON object (${error instanceof Error ? error.message.split("\n")[0] : "parse error"}) — return ONLY the JSON object, no prose or fences`] };
104
+ }
105
+ if (typeof parsed !== "object" || parsed === null || Array.isArray(parsed)) {
106
+ return { issues: ["the response must be one JSON object"] };
107
+ }
108
+ const candidate = parsed;
109
+ const issues = [];
110
+ const triggerResult = triggerSchema.safeParse(candidate.trigger);
111
+ if (!triggerResult.success) {
112
+ const first = triggerResult.error.issues[0];
113
+ const at = first === undefined || first.path.length === 0 ? "" : ` at trigger.${first.path.join(".")}`;
114
+ return { issues: [`invalid trigger${at}: ${first?.message ?? "does not match the trigger schema"} — remember every steps args value is a JSON STRING containing a jsonata expression`] };
115
+ }
116
+ const trigger = triggerResult.data;
117
+ if (trigger.on.kind === "external") {
118
+ issues.push('trigger "on" cannot be an external connector here — use a schedule or a host-event');
119
+ }
120
+ issues.push(...scheduleIssues(trigger));
121
+ if (trigger.run.kind !== input.mode) {
122
+ issues.push(`run.kind must be "${input.mode}" for this instruction`);
123
+ }
124
+ const resultsCollection = candidate.resultsCollection;
125
+ if (resultsCollection !== undefined) {
126
+ if (typeof resultsCollection !== "string" || !COLLECTION_NAME.test(resultsCollection) || resultsCollection === "state") {
127
+ issues.push('resultsCollection must be a short bare identifier (and never the reserved "state")');
128
+ }
129
+ }
130
+ if (trigger.run.kind === "steps") {
131
+ const steps = trigger.run.steps;
132
+ if (steps.length === 0)
133
+ issues.push("steps must not be empty");
134
+ // The planning surface is the whole legal tool universe here: fn: refs
135
+ // are NOT accepted — the ladder only authors automations for machine-less
136
+ // apps this wave, and a machine-less app has no fn: to call.
137
+ const known = new Set(plannerTools(input.tools).map(({ name }) => name));
138
+ const seen = new Set();
139
+ const priorIds = new Set();
140
+ let publishesDeclaredCollection = false;
141
+ for (const step of steps) {
142
+ // Bare-identifier ids only: a hyphenated id referenced as
143
+ // steps.invoice-rows parses as SUBTRACTION in jsonata, so the reference
144
+ // silently evaluates to nothing at run time.
145
+ if (!/^[A-Za-z_][A-Za-z0-9_]*$/.test(step.id) || seen.has(step.id)) {
146
+ issues.push(`step ids must be unique bare identifiers ([A-Za-z_][A-Za-z0-9_]*) — "${step.id}" is not`);
147
+ }
148
+ seen.add(step.id);
149
+ if (!known.has(step.tool)) {
150
+ issues.push(`step "${step.id}" names unknown tool "${step.tool}"; the available tools are: ${[...known].join(", ") || "(none)"}`);
151
+ }
152
+ // Law 1 for automations: a published result must be BUILT from a PRIOR
153
+ // step's output (or the trigger event) — a hand-typed data payload is
154
+ // invented data on the board. Quoted jsonata string literals (BOTH legal
155
+ // quote forms) are stripped first so 'a steps guide' or "steps.rows"
156
+ // cannot smuggle past the check, and the referenced step id must be one
157
+ // that ran EARLIER (a bare "steps" token or a forward reference
158
+ // publishes nothing at run time).
159
+ if (step.tool === RESULTS_TOOL) {
160
+ const dataExpression = (step.args?.data ?? "").replace(/'[^']*'|"[^"]*"/g, "");
161
+ const referencedPrior = [...dataExpression.matchAll(/\bsteps\.([A-Za-z_][A-Za-z0-9_]*)/g)]
162
+ .some((match) => priorIds.has(match[1]));
163
+ if (!referencedPrior && !/\bevent\b/.test(dataExpression)) {
164
+ issues.push(`step "${step.id}" publishes hand-typed data — the "${RESULTS_TOOL}" data expression must derive from an EARLIER step's output (steps.<priorStepId>...) or the trigger event; add the read step that fetches the live data first`);
165
+ }
166
+ if (typeof resultsCollection === "string"
167
+ && step.args?.collection?.trim() === `'${resultsCollection}'`
168
+ && step.args?.appId?.trim() === `'${input.appId}'`) {
169
+ publishesDeclaredCollection = true;
170
+ }
171
+ }
172
+ priorIds.add(step.id);
173
+ }
174
+ // A declared results collection the run never writes leaves the rebound
175
+ // board permanently empty — require the publish step to target exactly
176
+ // this app and that collection (literal jsonata strings).
177
+ if (typeof resultsCollection === "string" && !publishesDeclaredCollection) {
178
+ issues.push(`resultsCollection "${resultsCollection}" is declared but no step publishes it — add a "${RESULTS_TOOL}" step with args {"appId":"'${input.appId}'","collection":"'${resultsCollection}'","id":"'latest'","data":...}`);
179
+ }
180
+ }
181
+ const name = candidate.name;
182
+ if (name !== undefined && (typeof name !== "string" || name.trim() === "" || name.length > 80)) {
183
+ issues.push("name must be a non-empty string of at most 80 characters");
184
+ }
185
+ if (issues.length > 0)
186
+ return { issues };
187
+ return {
188
+ plan: {
189
+ trigger,
190
+ ...(typeof name === "string" ? { name: name.trim() } : {}),
191
+ ...(typeof resultsCollection === "string" ? { resultsCollection } : {}),
192
+ },
193
+ issues: [],
194
+ };
195
+ };
196
+ /** Author the automation for one ladder rung: up to 3 model attempts, each
197
+ * repair fed the accumulated issues (the engine's create/edit loop shape). */
198
+ export const planAutomation = async (input, model) => {
199
+ let issues = [];
200
+ for (let attempt = 0; attempt < 3; attempt += 1) {
201
+ const output = await generatePlanText(model, planContract(input), `TASK: PLAN_AUTOMATION\nAPP_ID: ${input.appId}\nAPP_NAME: ${input.appName}\nINSTRUCTION: ${input.instruction}${repairPrompt(issues)}`);
202
+ issues = distinctIssues(issues, output.issues);
203
+ if (output.text === undefined)
204
+ continue;
205
+ const validated = validatePlan(output.text, input);
206
+ if (validated.plan !== undefined)
207
+ return { kind: "plan", plan: validated.plan };
208
+ issues = distinctIssues(issues, validated.issues);
209
+ }
210
+ return { kind: "failure", issues: issues.length === 0 ? ["automation planning failed"] : issues };
211
+ };
212
+ //# sourceMappingURL=automation-plan.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"automation-plan.js","sourceRoot":"","sources":["../src/automation-plan.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,43 @@
1
+ import { type LanguageModel, type ToolSet } from "ai";
2
+ export declare const GEN_MODEL: string;
3
+ export declare const JUDGE_MODEL: string;
4
+ export declare const genModel: () => LanguageModel;
5
+ export declare const judgeModel: () => LanguageModel;
6
+ export interface GenResult {
7
+ text: string;
8
+ wire: string;
9
+ inputTokens: number;
10
+ outputTokens: number;
11
+ ms: number;
12
+ error?: string;
13
+ }
14
+ /** Extract the wire: everything from the first `<App` through the last `</App>`. */
15
+ export declare const extractWire: (text: string) => string;
16
+ export interface GenOptions {
17
+ thinkingBudget?: number;
18
+ maxOutputTokens?: number;
19
+ maxSteps?: number;
20
+ }
21
+ export declare const generateWire: (system: string, prompt: string, opts?: GenOptions) => Promise<GenResult>;
22
+ /** Tool-call generation (Experiment 2 Arm B): one assistant turn, extended
23
+ * thinking on, strict tools. Returns the ordered tool calls + usage. */
24
+ export interface ToolCallResult {
25
+ calls: {
26
+ toolName: string;
27
+ input: Record<string, unknown>;
28
+ }[];
29
+ inputTokens: number;
30
+ outputTokens: number;
31
+ ms: number;
32
+ error?: string;
33
+ }
34
+ export declare const generateToolCalls: (system: string, prompt: string, tools: ToolSet, opts?: GenOptions) => Promise<ToolCallResult>;
35
+ /** Phase-1 read planner: ask the model for a JSON array (no thinking) and
36
+ * parse it leniently. Returns [] on any failure. */
37
+ export declare const generateModelJsonList: (system: string, prompt: string) => Promise<{
38
+ tool?: string;
39
+ input?: Record<string, unknown>;
40
+ }[]>;
41
+ /** Bounded-concurrency map over async work. */
42
+ export declare const pool: <T, R>(items: T[], concurrency: number, fn: (item: T, i: number) => Promise<R>) => Promise<R[]>;
43
+ //# sourceMappingURL=client.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"client.d.ts","sourceRoot":"","sources":["../../src/bench/client.ts"],"names":[],"mappings":"AAOA,OAAO,EAA6B,KAAK,aAAa,EAAqB,KAAK,OAAO,EAAE,MAAM,IAAI,CAAC;AAEpG,eAAO,MAAM,SAAS,QAAkD,CAAC;AACzE,eAAO,MAAM,WAAW,QAAkD,CAAC;AAI3E,eAAO,MAAM,QAAQ,QAAO,aAAsD,CAAC;AACnF,eAAO,MAAM,UAAU,QAAO,aAAwD,CAAC;AAEvF,MAAM,WAAW,SAAS;IACxB,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,EAAE,MAAM,CAAC;IACpB,YAAY,EAAE,MAAM,CAAC;IACrB,EAAE,EAAE,MAAM,CAAC;IACX,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED,oFAAoF;AACpF,eAAO,MAAM,WAAW,GAAI,MAAM,MAAM,KAAG,MAM1C,CAAC;AAiBF,MAAM,WAAW,UAAU;IACzB,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB;AAED,eAAO,MAAM,YAAY,GACvB,QAAQ,MAAM,EACd,QAAQ,MAAM,EACd,OAAM,UAAe,KACpB,OAAO,CAAC,SAAS,CAwBnB,CAAC;AAEF;yEACyE;AACzE,MAAM,WAAW,cAAc;IAC7B,KAAK,EAAE;QAAE,QAAQ,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;KAAE,EAAE,CAAC;IAC9D,WAAW,EAAE,MAAM,CAAC;IACpB,YAAY,EAAE,MAAM,CAAC;IACrB,EAAE,EAAE,MAAM,CAAC;IACX,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED,eAAO,MAAM,iBAAiB,GAC5B,QAAQ,MAAM,EACd,QAAQ,MAAM,EACd,OAAO,OAAO,EACd,OAAM,UAAe,KACpB,OAAO,CAAC,cAAc,CAkCxB,CAAC;AAEF;qDACqD;AACrD,eAAO,MAAM,qBAAqB,GAChC,QAAQ,MAAM,EACd,QAAQ,MAAM,KACb,OAAO,CAAC;IAAE,IAAI,CAAC,EAAE,MAAM,CAAC;IAAC,KAAK,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;CAAE,EAAE,CAW9D,CAAC;AAEF,+CAA+C;AAC/C,eAAO,MAAM,IAAI,GAAU,CAAC,EAAE,CAAC,EAAE,OAAO,CAAC,EAAE,EAAE,aAAa,MAAM,EAAE,IAAI,CAAC,IAAI,EAAE,CAAC,EAAE,CAAC,EAAE,MAAM,KAAK,OAAO,CAAC,CAAC,CAAC,KAAG,OAAO,CAAC,CAAC,EAAE,CAYrH,CAAC"}
@@ -0,0 +1,129 @@
1
+ /**
2
+ * W1-bench (docs/verification/w1-bench) — the live-model client. Generation
3
+ * runs on the production full-lane model (claude-sonnet-4-6); the LLM judge
4
+ * runs on an independent stronger model (claude-opus-4-8) to avoid
5
+ * self-preference bias. A/B arms always share the generator model.
6
+ */
7
+ import { createAnthropic } from "@ai-sdk/anthropic";
8
+ import { generateText, stepCountIs } from "ai";
9
+ export const GEN_MODEL = process.env.W1_GEN_MODEL ?? "claude-sonnet-4-6";
10
+ export const JUDGE_MODEL = process.env.W1_JUDGE_MODEL ?? "claude-opus-4-8";
11
+ const anthropic = createAnthropic({ apiKey: process.env.ANTHROPIC_API_KEY });
12
+ export const genModel = () => anthropic(GEN_MODEL);
13
+ export const judgeModel = () => anthropic(JUDGE_MODEL);
14
+ /** Extract the wire: everything from the first `<App` through the last `</App>`. */
15
+ export const extractWire = (text) => {
16
+ const start = text.indexOf("<App");
17
+ if (start === -1)
18
+ return text.trim();
19
+ const closeTag = "</App>";
20
+ const close = text.lastIndexOf(closeTag);
21
+ return close === -1 ? text.slice(start) : text.slice(start, close + closeTag.length);
22
+ };
23
+ const withRetry = async (fn, label) => {
24
+ let lastErr;
25
+ for (let attempt = 0; attempt < 4; attempt++) {
26
+ try {
27
+ return await fn();
28
+ }
29
+ catch (err) {
30
+ lastErr = err;
31
+ const msg = String(err?.message ?? err);
32
+ if (!/429|overloaded|529|rate|ECONNRESET|timeout|fetch failed/i.test(msg))
33
+ throw err;
34
+ await new Promise((r) => setTimeout(r, 1500 * (attempt + 1) + Math.random() * 1000));
35
+ }
36
+ }
37
+ throw new Error(`${label}: exhausted retries: ${String(lastErr)}`);
38
+ };
39
+ export const generateWire = async (system, prompt, opts = {}) => {
40
+ const started = Date.now();
41
+ try {
42
+ const res = await withRetry(() => generateText({
43
+ model: genModel(),
44
+ system,
45
+ prompt,
46
+ maxOutputTokens: opts.maxOutputTokens ?? 6000,
47
+ maxRetries: 0,
48
+ ...(opts.thinkingBudget
49
+ ? { providerOptions: { anthropic: { thinking: { type: "enabled", budgetTokens: opts.thinkingBudget } } } }
50
+ : {}),
51
+ }), "generateWire");
52
+ return {
53
+ text: res.text,
54
+ wire: extractWire(res.text),
55
+ inputTokens: res.usage?.inputTokens ?? 0,
56
+ outputTokens: res.usage?.outputTokens ?? 0,
57
+ ms: Date.now() - started,
58
+ };
59
+ }
60
+ catch (err) {
61
+ return { text: "", wire: "", inputTokens: 0, outputTokens: 0, ms: Date.now() - started, error: String(err?.message ?? err) };
62
+ }
63
+ };
64
+ export const generateToolCalls = async (system, prompt, tools, opts = {}) => {
65
+ const started = Date.now();
66
+ try {
67
+ const messages = [{ role: "user", content: prompt }];
68
+ const res = await withRetry(() => generateText({
69
+ model: genModel(),
70
+ system,
71
+ messages,
72
+ tools,
73
+ toolChoice: "auto",
74
+ // The builder emits a batch of calls, gets no-op results, and continues
75
+ // until the app is fully composed (or the step cap). This is how "one
76
+ // logical build" maps onto the tool-use protocol.
77
+ stopWhen: stepCountIs(opts.maxSteps ?? 16),
78
+ maxOutputTokens: opts.maxOutputTokens ?? 12000,
79
+ maxRetries: 0,
80
+ ...(opts.thinkingBudget
81
+ ? { providerOptions: { anthropic: { thinking: { type: "enabled", budgetTokens: opts.thinkingBudget } } } }
82
+ : {}),
83
+ }), "generateToolCalls");
84
+ const calls = (res.steps ?? []).flatMap((s) => s.toolCalls ?? []).map((c) => ({
85
+ toolName: c.toolName,
86
+ input: (c.input ?? {}),
87
+ }));
88
+ return {
89
+ calls,
90
+ inputTokens: res.usage?.inputTokens ?? 0,
91
+ outputTokens: res.usage?.outputTokens ?? 0,
92
+ ms: Date.now() - started,
93
+ };
94
+ }
95
+ catch (err) {
96
+ return { calls: [], inputTokens: 0, outputTokens: 0, ms: Date.now() - started, error: String(err?.message ?? err) };
97
+ }
98
+ };
99
+ /** Phase-1 read planner: ask the model for a JSON array (no thinking) and
100
+ * parse it leniently. Returns [] on any failure. */
101
+ export const generateModelJsonList = async (system, prompt) => {
102
+ try {
103
+ const res = await withRetry(() => generateText({ model: genModel(), system, prompt, maxOutputTokens: 800, maxRetries: 0 }), "planner");
104
+ const m = res.text.match(/\[[\s\S]*\]/);
105
+ if (!m)
106
+ return [];
107
+ const parsed = JSON.parse(m[0]);
108
+ return Array.isArray(parsed) ? parsed : [];
109
+ }
110
+ catch {
111
+ return [];
112
+ }
113
+ };
114
+ /** Bounded-concurrency map over async work. */
115
+ export const pool = async (items, concurrency, fn) => {
116
+ const results = new Array(items.length);
117
+ let next = 0;
118
+ const workers = Array.from({ length: Math.min(concurrency, items.length) }, async () => {
119
+ for (;;) {
120
+ const i = next++;
121
+ if (i >= items.length)
122
+ break;
123
+ results[i] = await fn(items[i], i);
124
+ }
125
+ });
126
+ await Promise.all(workers);
127
+ return results;
128
+ };
129
+ //# sourceMappingURL=client.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"client.js","sourceRoot":"","sources":["../../src/bench/client.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,42 @@
1
+ /**
2
+ * W1-bench (docs/verification/w1-bench) — a realistic single-host domain
3
+ * ("Maple", a bank/AP host) used across all format experiments: cents money,
4
+ * ISO dates, enum statuses, nested client objects, arrays, and read + write
5
+ * tools. Shapes are DERIVED from representative sample rows (deriveShape), the
6
+ * same path production uses (`vendo sync` sampling).
7
+ *
8
+ * NOT the frozen 30-prompt held-out corpus. These are lane-authored dev
9
+ * fixtures for measurement only.
10
+ */
11
+ import { type Json, type ShapeType } from "@vendoai/core";
12
+ export interface BenchTool {
13
+ name: string;
14
+ description: string;
15
+ risk: "read" | "write";
16
+ /** One representative response used to derive the shape and to feed the
17
+ * fetch-then-generate arm (Experiment 3). */
18
+ sample: Json;
19
+ }
20
+ export declare const MAPLE_TOOLS: BenchTool[];
21
+ export declare const MAPLE_TOOL_SHAPES: Readonly<Record<string, ShapeType>>;
22
+ export declare const KNOWN_TOOL_NAMES: ReadonlySet<string>;
23
+ /** The Kit host catalog surface (Wave-2 components), name + when-to-use + a
24
+ * compact prop signature — modeled on the spec's Kit inventory. */
25
+ export interface KitComponent {
26
+ name: string;
27
+ signature: string;
28
+ }
29
+ export declare const MAPLE_CATALOG: KitComponent[];
30
+ export declare const CATALOG_COMPONENT_NAMES: ReadonlySet<string>;
31
+ export declare const THEME: {
32
+ colors: {
33
+ background: string;
34
+ surface: string;
35
+ text: string;
36
+ accent: string;
37
+ danger: string;
38
+ border: string;
39
+ };
40
+ fontFamily: string;
41
+ };
42
+ //# sourceMappingURL=fixtures.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"fixtures.d.ts","sourceRoot":"","sources":["../../src/bench/fixtures.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AACH,OAAO,EAAe,KAAK,IAAI,EAAE,KAAK,SAAS,EAAE,MAAM,eAAe,CAAC;AAEvE,MAAM,WAAW,SAAS;IACxB,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,EAAE,MAAM,CAAC;IACpB,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC;IACvB;kDAC8C;IAC9C,MAAM,EAAE,IAAI,CAAC;CACd;AAID,eAAO,MAAM,WAAW,EAAE,SAAS,EAkHlC,CAAC;AAEF,eAAO,MAAM,iBAAiB,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,SAAS,CAAC,CAEjE,CAAC;AAEF,eAAO,MAAM,gBAAgB,EAAE,WAAW,CAAC,MAAM,CAA2C,CAAC;AAE7F;oEACoE;AACpE,MAAM,WAAW,YAAY;IAC3B,IAAI,EAAE,MAAM,CAAC;IACb,SAAS,EAAE,MAAM,CAAC;CACnB;AAED,eAAO,MAAM,aAAa,EAAE,YAAY,EAUvC,CAAC;AAEF,eAAO,MAAM,uBAAuB,EAAE,WAAW,CAAC,MAAM,CAA6C,CAAC;AAEtG,eAAO,MAAM,KAAK;;;;;;;;;;CAGjB,CAAC"}
@@ -0,0 +1,146 @@
1
+ /**
2
+ * W1-bench (docs/verification/w1-bench) — a realistic single-host domain
3
+ * ("Maple", a bank/AP host) used across all format experiments: cents money,
4
+ * ISO dates, enum statuses, nested client objects, arrays, and read + write
5
+ * tools. Shapes are DERIVED from representative sample rows (deriveShape), the
6
+ * same path production uses (`vendo sync` sampling).
7
+ *
8
+ * NOT the frozen 30-prompt held-out corpus. These are lane-authored dev
9
+ * fixtures for measurement only.
10
+ */
11
+ import { deriveShape } from "@vendoai/core";
12
+ const cents = (n) => n;
13
+ export const MAPLE_TOOLS = [
14
+ {
15
+ name: "invoices.list",
16
+ description: "List invoices, optionally filtered by status (draft|sent|overdue|paid).",
17
+ risk: "read",
18
+ sample: {
19
+ data: [
20
+ { id: "inv_1", client: { id: "cl_1", name: "Northwind Traders" }, amountCents: cents(285000), dueDate: "2026-07-02T00:00:00Z", status: "overdue" },
21
+ { id: "inv_2", client: { id: "cl_2", name: "Contoso Ltd" }, amountCents: cents(142000), dueDate: "2026-07-11T00:00:00Z", status: "overdue" },
22
+ { id: "inv_3", client: { id: "cl_3", name: "Fabrikam Inc" }, amountCents: cents(98000), dueDate: "2026-07-19T00:00:00Z", status: "sent" },
23
+ ],
24
+ totalCents: cents(525000),
25
+ count: 3,
26
+ },
27
+ },
28
+ {
29
+ name: "invoices.get",
30
+ description: "Fetch one invoice with its line items by id.",
31
+ risk: "read",
32
+ sample: {
33
+ id: "inv_1",
34
+ client: { id: "cl_1", name: "Northwind Traders", email: "ap@northwind.example" },
35
+ amountCents: cents(285000),
36
+ dueDate: "2026-07-02T00:00:00Z",
37
+ status: "overdue",
38
+ lineItems: [
39
+ { description: "Consulting — June", amountCents: cents(180000) },
40
+ { description: "Licenses", amountCents: cents(105000) },
41
+ ],
42
+ },
43
+ },
44
+ {
45
+ name: "invoices.sendReminders",
46
+ description: "Send a payment reminder for the given invoice ids. Mutation.",
47
+ risk: "write",
48
+ sample: { sent: 2, failed: 0 },
49
+ },
50
+ {
51
+ name: "invoices.markPaid",
52
+ description: "Mark an invoice paid by id. Mutation.",
53
+ risk: "write",
54
+ sample: { ok: true, id: "inv_1" },
55
+ },
56
+ {
57
+ name: "clients.list",
58
+ description: "List clients with balances and tier.",
59
+ risk: "read",
60
+ sample: {
61
+ data: [
62
+ { id: "cl_1", name: "Northwind Traders", balanceCents: cents(285000), email: "ap@northwind.example", tier: "gold" },
63
+ { id: "cl_2", name: "Contoso Ltd", balanceCents: cents(142000), email: "ap@contoso.example", tier: "silver" },
64
+ ],
65
+ },
66
+ },
67
+ {
68
+ name: "clients.search",
69
+ description: "Search clients by name/email substring; returns matches.",
70
+ risk: "read",
71
+ sample: { data: [{ id: "cl_1", name: "Northwind Traders", balanceCents: cents(285000) }] },
72
+ },
73
+ {
74
+ name: "accounts.list",
75
+ description: "List bank accounts with balances, type, and a 12-point sparkline.",
76
+ risk: "read",
77
+ sample: {
78
+ data: [
79
+ { id: "ac_1", name: "Operating", balanceCents: cents(4820000), type: "checking", sparkline: [41, 43, 40, 45, 48, 47, 49, 46, 48, 50, 49, 48] },
80
+ { id: "ac_2", name: "Reserve", balanceCents: cents(12500000), type: "savings", sparkline: [120, 121, 122, 123, 124, 124, 125, 125, 125, 125, 125, 125] },
81
+ ],
82
+ },
83
+ },
84
+ {
85
+ name: "accounts.transactions",
86
+ description: "Recent transactions, optionally for one account id.",
87
+ risk: "read",
88
+ sample: {
89
+ data: [
90
+ { id: "tx_1", description: "AWS", amountCents: cents(-120400), date: "2026-07-15T00:00:00Z", category: "software" },
91
+ { id: "tx_2", description: "Client payment — Contoso", amountCents: cents(142000), date: "2026-07-14T00:00:00Z", category: "income" },
92
+ ],
93
+ count: 2,
94
+ },
95
+ },
96
+ {
97
+ name: "payments.create",
98
+ description: "Create a payment from an account to a client. Mutation; needs accountId, amountCents, toClientId.",
99
+ risk: "write",
100
+ sample: { id: "pay_1", status: "pending" },
101
+ },
102
+ {
103
+ name: "spending.byCategory",
104
+ description: "Spending grouped by category for a period (month|quarter|year).",
105
+ risk: "read",
106
+ sample: {
107
+ data: [
108
+ { category: "software", amountCents: cents(482000), pct: 0.34 },
109
+ { category: "payroll", amountCents: cents(690000), pct: 0.49 },
110
+ { category: "travel", amountCents: cents(240000), pct: 0.17 },
111
+ ],
112
+ totalCents: cents(1412000),
113
+ },
114
+ },
115
+ {
116
+ name: "revenue.monthly",
117
+ description: "Monthly revenue for the trailing 6 months.",
118
+ risk: "read",
119
+ sample: {
120
+ data: [
121
+ { month: "2026-02", revenueCents: cents(3200000) },
122
+ { month: "2026-03", revenueCents: cents(3550000) },
123
+ { month: "2026-04", revenueCents: cents(3410000) },
124
+ ],
125
+ },
126
+ },
127
+ ];
128
+ export const MAPLE_TOOL_SHAPES = Object.fromEntries(MAPLE_TOOLS.map((t) => [t.name, deriveShape(t.sample)]));
129
+ export const KNOWN_TOOL_NAMES = new Set(MAPLE_TOOLS.map((t) => t.name));
130
+ export const MAPLE_CATALOG = [
131
+ { name: "DataTable", signature: `DataTable(rows: object[], columns: {key,label?,format?}[], sortBy?, limit?, filterableBy?: string[], emptyLabel?) — self sorts/filters/paginates; columns take dot-path keys and a format ("money"|"date"|"percent"|"number")` },
132
+ { name: "Stat", signature: `Stat(label: string, value?, format?: "money"|"date"|"percent"|"number", trend?, tone?)` },
133
+ { name: "CardList", signature: `CardList(items: object[], titleKey, subtitleKey?, valueKey?, valueFormat?)` },
134
+ { name: "LineChart", signature: `LineChart(points: {label,value}[], label?) — data prop only; RAW numbers` },
135
+ { name: "BarChart", signature: `BarChart(series: {label,value}[], label?)` },
136
+ { name: "Donut", signature: `Donut(slices: {label,value}[], label?) — RAW numbers, never formatted` },
137
+ { name: "Sparkline", signature: `Sparkline(values: number[])` },
138
+ { name: "EnumBadge", signature: `EnumBadge(value: string, kind?) — renders a host enum as a branded badge` },
139
+ { name: "Disclaimer", signature: `Disclaimer(text: string) — the legal move when NO host tool supplies the ask` },
140
+ ];
141
+ export const CATALOG_COMPONENT_NAMES = new Set(MAPLE_CATALOG.map((c) => c.name));
142
+ export const THEME = {
143
+ colors: { background: "#FBFAF7", surface: "#FFFFFF", text: "#1A1A1A", accent: "#2B5CE6", danger: "#C0392B", border: "#E6E3DC" },
144
+ fontFamily: "Inter, sans-serif",
145
+ };
146
+ //# sourceMappingURL=fixtures.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"fixtures.js","sourceRoot":"","sources":["../../src/bench/fixtures.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,9 @@
1
+ export interface Judgement {
2
+ quality: number;
3
+ answersAsk: boolean;
4
+ fabricated: boolean;
5
+ notes: string;
6
+ error?: string;
7
+ }
8
+ export declare const judge: (prompt: string, wire: string) => Promise<Judgement>;
9
+ //# sourceMappingURL=judge.d.ts.map