@agilno-tech/rivet 0.1.0-alpha.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 (283) hide show
  1. package/LICENSE +202 -0
  2. package/NOTICE +6 -0
  3. package/README.md +59 -0
  4. package/bin/cli.js +42 -0
  5. package/dist/agents/backend-django-agent/SKILL.md +35 -0
  6. package/dist/agents/backend-nestjs-agent/SKILL.md +36 -0
  7. package/dist/agents/boss-agent/SKILL.md +28 -0
  8. package/dist/agents/bounded-worker/SKILL.md +28 -0
  9. package/dist/agents/data-performance-agent/SKILL.md +32 -0
  10. package/dist/agents/delivery-ticketing-agent/SKILL.md +36 -0
  11. package/dist/agents/devops-agent/SKILL.md +34 -0
  12. package/dist/agents/engineering-manager/SKILL.md +28 -0
  13. package/dist/agents/frontend-nextjs-agent/SKILL.md +34 -0
  14. package/dist/agents/frontend-web-agent/SKILL.md +31 -0
  15. package/dist/agents/incident-response-agent/SKILL.md +42 -0
  16. package/dist/agents/jest-agent/SKILL.md +77 -0
  17. package/dist/agents/mobile-agent/SKILL.md +32 -0
  18. package/dist/agents/playwright-agent/SKILL.md +54 -0
  19. package/dist/agents/product-design-manager/SKILL.md +27 -0
  20. package/dist/agents/qa-agent/SKILL.md +29 -0
  21. package/dist/agents/quality-manager/SKILL.md +28 -0
  22. package/dist/agents/vitest-agent/SKILL.md +77 -0
  23. package/dist/governance/pre-push-rules.md +75 -0
  24. package/dist/governance/prompt-hygiene.md +22 -0
  25. package/dist/governance/review-checklist.md +24 -0
  26. package/dist/governance/safety-and-data.md +27 -0
  27. package/dist/governance/usage-rules.md +21 -0
  28. package/dist/mandatory/address-pr-feedback/SKILL.md +196 -0
  29. package/dist/mandatory/agentic-goal/SKILL.md +42 -0
  30. package/dist/mandatory/agentic-status/SKILL.md +74 -0
  31. package/dist/mandatory/apply-design/SKILL.md +228 -0
  32. package/dist/mandatory/check-ac/SKILL.md +124 -0
  33. package/dist/mandatory/create-pr-and-commit/SKILL.md +304 -0
  34. package/dist/mandatory/design/SKILL.md +312 -0
  35. package/dist/mandatory/feature-workflow/SKILL.md +87 -0
  36. package/dist/mandatory/hotfix/SKILL.md +195 -0
  37. package/dist/mandatory/pre-push/SKILL.md +272 -0
  38. package/dist/mandatory/project-context/SKILL.md +180 -0
  39. package/dist/mandatory/release-docs/SKILL.md +191 -0
  40. package/dist/mandatory/review-pr/SKILL.md +323 -0
  41. package/dist/mandatory/security-review/SKILL.md +157 -0
  42. package/dist/skills/api-contract/SKILL.md +77 -0
  43. package/dist/skills/backend-django/SKILL.md +27 -0
  44. package/dist/skills/backend-nestjs/SKILL.md +65 -0
  45. package/dist/skills/bug-ticket-creation/SKILL.md +43 -0
  46. package/dist/skills/cloudwatch-troubleshooting/SKILL.md +73 -0
  47. package/dist/skills/database-migration/SKILL.md +97 -0
  48. package/dist/skills/debugging/SKILL.md +32 -0
  49. package/dist/skills/devops-infra/SKILL.md +26 -0
  50. package/dist/skills/documentation/SKILL.md +24 -0
  51. package/dist/skills/frontend-nextjs/SKILL.md +27 -0
  52. package/dist/skills/incident-postmortem/SKILL.md +38 -0
  53. package/dist/skills/kubernetes-troubleshooting/SKILL.md +71 -0
  54. package/dist/skills/mobile-react-native/SKILL.md +37 -0
  55. package/dist/skills/postgres-analytics/SKILL.md +29 -0
  56. package/dist/skills/product-jira-ticketing/SKILL.md +28 -0
  57. package/dist/skills/qa-bug-analysis/SKILL.md +27 -0
  58. package/dist/skills/refactoring/SKILL.md +32 -0
  59. package/dist/skills/sprint-planning/SKILL.md +32 -0
  60. package/dist/skills/testing-quality/SKILL.md +62 -0
  61. package/dist/v2/protocols/agent-orchestration.md +49 -0
  62. package/dist/v2/protocols/delivery.md +45 -0
  63. package/dist/v2/protocols/design-authority.md +29 -0
  64. package/dist/v2/protocols/goal-graph.md +44 -0
  65. package/dist/v2/protocols/pattern-first-development.md +29 -0
  66. package/dist/v2/protocols/qa-evidence.md +29 -0
  67. package/dist/v2/protocols/security.md +29 -0
  68. package/dist/v2/schemas/event.schema.json +86 -0
  69. package/dist/v2/schemas/evidence.schema.json +94 -0
  70. package/dist/v2/schemas/feature-decomposition.schema.json +48 -0
  71. package/dist/v2/schemas/feature-plan.schema.json +95 -0
  72. package/dist/v2/schemas/goal-graph.schema.json +61 -0
  73. package/dist/v2/schemas/integration.schema.json +119 -0
  74. package/dist/v2/schemas/orchestration.schema.json +69 -0
  75. package/dist/v2/schemas/project.schema.json +209 -0
  76. package/dist/v2/schemas/providers.schema.json +142 -0
  77. package/dist/v2/schemas/quality.schema.json +50 -0
  78. package/dist/v2/schemas/work-action.schema.json +44 -0
  79. package/dist/v2/schemas/work-request.schema.json +253 -0
  80. package/dist/v2/templates/evidence/qa-bundle.json +194 -0
  81. package/dist/v2/templates/github-actions/rivet-deploy.yml +98 -0
  82. package/dist/v2/templates/harness/SKILL.md +90 -0
  83. package/dist/v2/templates/project/.rivet/orchestration.yaml +42 -0
  84. package/dist/v2/templates/project/.rivet/project.yaml +14 -0
  85. package/dist/v2/templates/project/.rivet/providers.yaml +8 -0
  86. package/dist/v2/templates/project/.rivet/quality.yaml +16 -0
  87. package/package.json +58 -0
  88. package/protocols/agent-orchestration.md +49 -0
  89. package/protocols/delivery.md +45 -0
  90. package/protocols/design-authority.md +29 -0
  91. package/protocols/goal-graph.md +44 -0
  92. package/protocols/pattern-first-development.md +29 -0
  93. package/protocols/qa-evidence.md +29 -0
  94. package/protocols/security.md +29 -0
  95. package/schemas/event.schema.json +86 -0
  96. package/schemas/evidence.schema.json +94 -0
  97. package/schemas/feature-decomposition.schema.json +48 -0
  98. package/schemas/feature-plan.schema.json +95 -0
  99. package/schemas/goal-graph.schema.json +61 -0
  100. package/schemas/integration.schema.json +119 -0
  101. package/schemas/orchestration.schema.json +69 -0
  102. package/schemas/project.schema.json +209 -0
  103. package/schemas/providers.schema.json +142 -0
  104. package/schemas/quality.schema.json +50 -0
  105. package/schemas/work-action.schema.json +44 -0
  106. package/schemas/work-request.schema.json +253 -0
  107. package/src/adapters/confluence.js +138 -0
  108. package/src/adapters/contract.js +657 -0
  109. package/src/adapters/factory.js +122 -0
  110. package/src/adapters/figma.js +178 -0
  111. package/src/adapters/fixtures.js +183 -0
  112. package/src/adapters/github.js +314 -0
  113. package/src/adapters/http.js +704 -0
  114. package/src/adapters/jira.js +195 -0
  115. package/src/adapters/linear.js +171 -0
  116. package/src/adapters/node-transport.js +59 -0
  117. package/src/cli/integration-setup-prompt.js +32 -0
  118. package/src/cli/interrupt.js +25 -0
  119. package/src/cli/main.js +596 -0
  120. package/src/cli/output.js +174 -0
  121. package/src/cli/parse-args.js +246 -0
  122. package/src/cli/project-discovery.js +70 -0
  123. package/src/cli/task-confirmation.js +38 -0
  124. package/src/cli/task-presentation.js +22 -0
  125. package/src/clients/claude.js +214 -0
  126. package/src/clients/codex.js +180 -0
  127. package/src/clients/compatibility.js +23 -0
  128. package/src/clients/contract.js +224 -0
  129. package/src/clients/fake.js +170 -0
  130. package/src/clients/process-runner.js +657 -0
  131. package/src/clients/result-contract.js +78 -0
  132. package/src/commands/delivery-publish.js +80 -0
  133. package/src/commands/delivery-remote.js +230 -0
  134. package/src/commands/delivery-review-update.js +39 -0
  135. package/src/commands/delivery-tracker.js +94 -0
  136. package/src/commands/delivery-transition.js +79 -0
  137. package/src/commands/delivery.js +223 -0
  138. package/src/commands/dependency-approval.js +21 -0
  139. package/src/commands/doctor.js +191 -0
  140. package/src/commands/evidence.js +44 -0
  141. package/src/commands/feature.js +212 -0
  142. package/src/commands/goals.js +231 -0
  143. package/src/commands/human-run.js +208 -0
  144. package/src/commands/human-task.js +278 -0
  145. package/src/commands/init.js +848 -0
  146. package/src/commands/install.js +814 -0
  147. package/src/commands/integration-setup.js +65 -0
  148. package/src/commands/integrations.js +54 -0
  149. package/src/commands/models.js +158 -0
  150. package/src/commands/orchestrate.js +61 -0
  151. package/src/commands/preflight.js +125 -0
  152. package/src/commands/protocols.js +228 -0
  153. package/src/commands/repositories.js +77 -0
  154. package/src/commands/setup-remote.js +41 -0
  155. package/src/commands/setup.js +214 -0
  156. package/src/commands/status.js +224 -0
  157. package/src/commands/support.js +44 -0
  158. package/src/commands/task-completion.js +104 -0
  159. package/src/commands/uninstall.js +234 -0
  160. package/src/commands/verify.js +171 -0
  161. package/src/commands/work.js +220 -0
  162. package/src/commands/worktrees.js +52 -0
  163. package/src/config/command-readiness.js +218 -0
  164. package/src/config/commands.js +206 -0
  165. package/src/config/defaults.js +55 -0
  166. package/src/config/load.js +230 -0
  167. package/src/config/validate.js +560 -0
  168. package/src/delivery/bitbucket-review.js +123 -0
  169. package/src/delivery/branch-publication.js +23 -0
  170. package/src/delivery/contract.js +379 -0
  171. package/src/delivery/github-deployment.js +132 -0
  172. package/src/delivery/github-review.js +5 -0
  173. package/src/delivery/github.js +382 -0
  174. package/src/delivery/gitlab-review.js +5 -0
  175. package/src/delivery/gitlab.js +395 -0
  176. package/src/delivery/prepare.js +90 -0
  177. package/src/delivery/publication-process.js +33 -0
  178. package/src/delivery/publication-transport.js +112 -0
  179. package/src/delivery/review-request.js +184 -0
  180. package/src/delivery/review-update.js +74 -0
  181. package/src/delivery/service.js +400 -0
  182. package/src/delivery/store.js +76 -0
  183. package/src/delivery/tracker-target.js +51 -0
  184. package/src/delivery/tracker-transition.js +158 -0
  185. package/src/delivery/tracker.js +164 -0
  186. package/src/discovery/git.js +85 -0
  187. package/src/discovery/portable.js +108 -0
  188. package/src/discovery/project.js +345 -0
  189. package/src/discovery/tools.js +145 -0
  190. package/src/evaluations/approval.js +20 -0
  191. package/src/evaluations/cost-policy.js +20 -0
  192. package/src/evaluations/harness-attempt.js +113 -0
  193. package/src/evaluations/live-runner.js +55 -0
  194. package/src/evaluations/profile.js +28 -0
  195. package/src/evaluations/report.js +11 -0
  196. package/src/evaluations/text-attempt.js +18 -0
  197. package/src/evidence/checksum.js +87 -0
  198. package/src/evidence/collect.js +727 -0
  199. package/src/evidence/validate.js +354 -0
  200. package/src/feature/accepted-integration.js +46 -0
  201. package/src/feature/actions.js +37 -0
  202. package/src/feature/client-profile.js +56 -0
  203. package/src/feature/decomposition-contract.js +58 -0
  204. package/src/feature/host-execution.js +633 -0
  205. package/src/feature/host-lock-recovery.js +96 -0
  206. package/src/feature/host-run-lock.js +32 -0
  207. package/src/feature/local-approval.js +183 -0
  208. package/src/feature/plan-contract.js +215 -0
  209. package/src/feature/planner.js +253 -0
  210. package/src/feature/run-store.js +241 -0
  211. package/src/feature/runtime-bridge.js +840 -0
  212. package/src/feature/verification-report.js +168 -0
  213. package/src/feature/workflow.js +375 -0
  214. package/src/git/client.js +509 -0
  215. package/src/git/integration-worktree.js +153 -0
  216. package/src/git/reconcile.js +222 -0
  217. package/src/git/reservations.js +450 -0
  218. package/src/git/worktrees.js +478 -0
  219. package/src/graph/completion.js +189 -0
  220. package/src/graph/fixtures.js +116 -0
  221. package/src/graph/reducer.js +124 -0
  222. package/src/graph/scheduler.js +252 -0
  223. package/src/graph/validate.js +106 -0
  224. package/src/install/managed.js +579 -0
  225. package/src/install/project-reference.js +33 -0
  226. package/src/install/project-runtime.js +142 -0
  227. package/src/install/runtime-integrity.cjs +141 -0
  228. package/src/integrations/capabilities.js +69 -0
  229. package/src/integrations/host-observation.js +26 -0
  230. package/src/integrations/registry.js +56 -0
  231. package/src/models/delegate.js +102 -0
  232. package/src/models/profiles.js +53 -0
  233. package/src/models/protocols.js +208 -0
  234. package/src/models/registry.js +83 -0
  235. package/src/models/transport.js +59 -0
  236. package/src/policy/approvals.js +251 -0
  237. package/src/policy/authority.js +282 -0
  238. package/src/policy/budget.js +149 -0
  239. package/src/policy/command-bootstrap.js +219 -0
  240. package/src/policy/commands.js +803 -0
  241. package/src/prompts/launch-contract.js +43 -0
  242. package/src/prompts/planning-contract.js +92 -0
  243. package/src/protocols/presentation.js +53 -0
  244. package/src/protocols/project.js +289 -0
  245. package/src/quality/runner.js +497 -0
  246. package/src/quality/traceability.js +215 -0
  247. package/src/repositories/identity.js +59 -0
  248. package/src/repositories/index.js +2 -0
  249. package/src/repositories/provider.js +210 -0
  250. package/src/runtime/application.js +353 -0
  251. package/src/runtime/dependency-directory.js +33 -0
  252. package/src/runtime/harness-discovery.js +121 -0
  253. package/src/runtime/heartbeat.js +47 -0
  254. package/src/runtime/instance-store.js +112 -0
  255. package/src/runtime/orchestrator.js +1133 -0
  256. package/src/runtime/portable-dependencies.js +94 -0
  257. package/src/runtime/recovery.js +190 -0
  258. package/src/runtime/retry.js +54 -0
  259. package/src/runtime/supervisor.js +166 -0
  260. package/src/runtime/worktree-bootstrap.js +169 -0
  261. package/src/state/event-store.js +333 -0
  262. package/src/state/lock.js +266 -0
  263. package/src/state/paths.js +274 -0
  264. package/src/state/redact.js +106 -0
  265. package/src/state/snapshot-store.js +310 -0
  266. package/src/status/public/app.js +96 -0
  267. package/src/status/public/index.html +37 -0
  268. package/src/status/public/styles.css +50 -0
  269. package/src/status/server.js +323 -0
  270. package/src/status/view-model.js +356 -0
  271. package/src/support/bundle.js +195 -0
  272. package/src/support/failure-report.js +96 -0
  273. package/src/work-request/contract.js +250 -0
  274. package/src/work-request/host.js +78 -0
  275. package/src/work-request/local.js +163 -0
  276. package/src/work-request/tracker.js +105 -0
  277. package/templates/evidence/qa-bundle.json +194 -0
  278. package/templates/github-actions/rivet-deploy.yml +98 -0
  279. package/templates/harness/SKILL.md +90 -0
  280. package/templates/project/.rivet/orchestration.yaml +42 -0
  281. package/templates/project/.rivet/project.yaml +14 -0
  282. package/templates/project/.rivet/providers.yaml +8 -0
  283. package/templates/project/.rivet/quality.yaml +16 -0
@@ -0,0 +1,170 @@
1
+ import { containsSecretMaterial, createLaunchContract, failAgent } from './contract.js';
2
+
3
+ const CONFIG_KEYS = new Set(['scripts', 'clock']);
4
+ const OPTION_KEYS = new Set(['signal']);
5
+ const SCRIPT_KEYS = new Set(['version', 'kind', 'delayMs', 'output', 'usage', 'payload']);
6
+ const RESULT_KINDS = new Map([
7
+ ['success', 'success'], ['retry', 'retry'], ['failed', 'failed'], ['blocked', 'blocked'],
8
+ ['budget-exhausted', 'budget-exhausted'],
9
+ ]);
10
+
11
+ function stable(reason, operation) {
12
+ try { return operation(); } catch { failAgent(reason); }
13
+ }
14
+
15
+ function capture(input, keys, required, reason = 'invalid-script') {
16
+ return stable(reason, () => {
17
+ if (!input || typeof input !== 'object' || Array.isArray(input)) failAgent(reason);
18
+ const ownKeys = Reflect.ownKeys(input);
19
+ if (ownKeys.length > keys.size || ownKeys.some(key => typeof key !== 'string' || !keys.has(key))) failAgent(reason);
20
+ const result = Object.create(null);
21
+ for (const key of ownKeys) {
22
+ const descriptor = Object.getOwnPropertyDescriptor(input, key);
23
+ if (!descriptor?.enumerable) failAgent(reason);
24
+ result[key] = input[key];
25
+ }
26
+ if (required.some(key => !Object.hasOwn(result, key))) failAgent(reason);
27
+ return result;
28
+ });
29
+ }
30
+
31
+ function captureArray(input, maximum, convert, reason = 'invalid-script') {
32
+ return stable(reason, () => {
33
+ if (!Array.isArray(input) || Object.getPrototypeOf(input) !== Array.prototype) failAgent(reason);
34
+ const length = input.length;
35
+ if (!Number.isSafeInteger(length) || length > maximum) failAgent(reason);
36
+ const result = [];
37
+ for (let index = 0; index < length; index += 1) {
38
+ const descriptor = Object.getOwnPropertyDescriptor(input, String(index));
39
+ if (!descriptor?.enumerable) failAgent(reason);
40
+ result.push(convert(input[index]));
41
+ }
42
+ return Object.freeze(result);
43
+ });
44
+ }
45
+
46
+ function boundedText(value, maximum, reason = 'invalid-script') {
47
+ if (typeof value !== 'string' || value.length === 0 || value.length > maximum || value.includes('\0') || containsSecretMaterial(value)) failAgent(reason);
48
+ return value;
49
+ }
50
+
51
+ function captureOutput(input) {
52
+ const value = capture(input, new Set(['summary', 'evidence']), ['summary', 'evidence']);
53
+ return Object.freeze({
54
+ summary: boundedText(value.summary, 16_384),
55
+ evidence: captureArray(value.evidence, 128, child => boundedText(child, 500)),
56
+ });
57
+ }
58
+
59
+ function captureUsage(input) {
60
+ const value = capture(input, new Set(['tokens', 'costUsd']), ['tokens', 'costUsd']);
61
+ if (!Number.isSafeInteger(value.tokens) || value.tokens < 0 || value.tokens > 10_000_000
62
+ || typeof value.costUsd !== 'number' || !Number.isFinite(value.costUsd) || value.costUsd < 0 || value.costUsd > 100_000) failAgent('invalid-script');
63
+ return Object.freeze({ tokens: value.tokens, costUsd: value.costUsd });
64
+ }
65
+
66
+ function snapshotScripts(input) {
67
+ const scripts = captureArray(input, 1024, child => {
68
+ const value = capture(child, SCRIPT_KEYS, ['version', 'kind']);
69
+ if (value.version !== 1 || ![...RESULT_KINDS.keys(), 'stall', 'malformed', 'cancel'].includes(value.kind)) failAgent('invalid-script');
70
+ const delayMs = value.delayMs ?? 0;
71
+ if (!Number.isSafeInteger(delayMs) || delayMs < 0 || delayMs > 3_600_000) failAgent('invalid-script');
72
+ const isResult = RESULT_KINDS.has(value.kind);
73
+ if (isResult !== (value.output !== undefined) || isResult !== (value.usage !== undefined)) failAgent('invalid-script');
74
+ if (value.kind === 'malformed' && (typeof value.payload !== 'string' || value.payload.length > 16_384)) failAgent('invalid-script');
75
+ if (value.kind !== 'malformed' && value.payload !== undefined) failAgent('invalid-script');
76
+ return Object.freeze({
77
+ version: 1, kind: value.kind, delayMs,
78
+ ...(isResult ? { output: captureOutput(value.output), usage: captureUsage(value.usage) } : {}),
79
+ ...(value.payload === undefined ? {} : { payload: value.payload }),
80
+ });
81
+ });
82
+ if (scripts.length === 0) failAgent('invalid-script');
83
+ return scripts;
84
+ }
85
+
86
+ function captureClock(input) {
87
+ if (input === undefined) return Object.freeze({ now: () => 0, wait: async () => {} });
88
+ const value = capture(input, new Set(['now', 'wait']), ['now', 'wait']);
89
+ if (typeof value.now !== 'function' || typeof value.wait !== 'function') failAgent('invalid-script');
90
+ return Object.freeze({ now: value.now, wait: value.wait });
91
+ }
92
+
93
+ export function createFakeClient(input) {
94
+ const config = capture(input, CONFIG_KEYS, ['scripts']);
95
+ const scripts = snapshotScripts(config.scripts);
96
+ const timing = captureClock(config.clock);
97
+ let cursor = 0;
98
+
99
+ function safeNow() {
100
+ return stable('invalid-script', () => {
101
+ const value = timing.now();
102
+ if (!Number.isSafeInteger(value) || value < 0) failAgent('invalid-script');
103
+ return value;
104
+ });
105
+ }
106
+
107
+ function signalIsAborted(signal) {
108
+ return signal ? stable('invalid-script', () => signal.aborted === true) : false;
109
+ }
110
+
111
+ async function safeWait(delayMs, signal, remainingMs) {
112
+ if (delayMs > remainingMs) failAgent('timeout');
113
+ let onAbort;
114
+ let watchdog;
115
+ try {
116
+ const aborted = new Promise(resolve => {
117
+ if (!signal) return;
118
+ onAbort = () => resolve('aborted');
119
+ signal.addEventListener('abort', onAbort, { once: true });
120
+ if (signalIsAborted(signal)) resolve('aborted');
121
+ });
122
+ const deadline = new Promise(resolve => {
123
+ watchdog = setTimeout(() => resolve('timeout'), Math.max(1, remainingMs));
124
+ });
125
+ return await Promise.race([
126
+ Promise.resolve().then(() => timing.wait(delayMs, signal)).then(() => 'completed'),
127
+ aborted, deadline,
128
+ ]);
129
+ } catch { failAgent('invalid-script'); }
130
+ finally {
131
+ clearTimeout(watchdog);
132
+ if (signal && onAbort) {
133
+ try { signal.removeEventListener('abort', onAbort); } catch { failAgent('invalid-script'); }
134
+ }
135
+ }
136
+ }
137
+
138
+ async function launch(contractInput, optionInput = {}) {
139
+ const contract = createLaunchContract(contractInput);
140
+ const options = capture(optionInput, OPTION_KEYS, []);
141
+ const signal = stable('invalid-script', () => {
142
+ const value = options.signal;
143
+ if (value !== undefined && !(value instanceof AbortSignal)) failAgent('invalid-script');
144
+ return value;
145
+ });
146
+ if (signalIsAborted(signal)) failAgent('aborted');
147
+ const startedAt = safeNow();
148
+ const deadline = startedAt + contract.budget.maxRuntimeMs;
149
+ if (!Number.isSafeInteger(deadline)) failAgent('invalid-script');
150
+ if (cursor >= scripts.length) failAgent('invalid-script');
151
+ const script = scripts[cursor];
152
+ cursor += 1;
153
+ if (script.delayMs > 0) {
154
+ const waitResult = await safeWait(script.delayMs, signal, deadline - startedAt);
155
+ if (waitResult === 'aborted') failAgent('aborted');
156
+ if (waitResult === 'timeout') failAgent('timeout');
157
+ }
158
+ const finishedAt = safeNow();
159
+ if (finishedAt < startedAt) failAgent('invalid-script');
160
+ if (finishedAt > deadline) failAgent('timeout');
161
+ if (signalIsAborted(signal) || script.kind === 'cancel') failAgent('aborted');
162
+ if (script.kind === 'malformed') failAgent('output-invalid');
163
+ if (script.kind === 'stall') failAgent('timeout');
164
+ if (script.kind !== 'budget-exhausted'
165
+ && (script.usage.tokens > contract.budget.maxTokens || script.usage.costUsd > contract.budget.maxCostUsd)) failAgent('output-invalid');
166
+ return Object.freeze({ version: 1, status: RESULT_KINDS.get(script.kind), output: script.output, usage: script.usage });
167
+ }
168
+
169
+ return Object.freeze({ provider: 'fake', launch });
170
+ }