@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.
- package/LICENSE +202 -0
- package/NOTICE +6 -0
- package/README.md +59 -0
- package/bin/cli.js +42 -0
- package/dist/agents/backend-django-agent/SKILL.md +35 -0
- package/dist/agents/backend-nestjs-agent/SKILL.md +36 -0
- package/dist/agents/boss-agent/SKILL.md +28 -0
- package/dist/agents/bounded-worker/SKILL.md +28 -0
- package/dist/agents/data-performance-agent/SKILL.md +32 -0
- package/dist/agents/delivery-ticketing-agent/SKILL.md +36 -0
- package/dist/agents/devops-agent/SKILL.md +34 -0
- package/dist/agents/engineering-manager/SKILL.md +28 -0
- package/dist/agents/frontend-nextjs-agent/SKILL.md +34 -0
- package/dist/agents/frontend-web-agent/SKILL.md +31 -0
- package/dist/agents/incident-response-agent/SKILL.md +42 -0
- package/dist/agents/jest-agent/SKILL.md +77 -0
- package/dist/agents/mobile-agent/SKILL.md +32 -0
- package/dist/agents/playwright-agent/SKILL.md +54 -0
- package/dist/agents/product-design-manager/SKILL.md +27 -0
- package/dist/agents/qa-agent/SKILL.md +29 -0
- package/dist/agents/quality-manager/SKILL.md +28 -0
- package/dist/agents/vitest-agent/SKILL.md +77 -0
- package/dist/governance/pre-push-rules.md +75 -0
- package/dist/governance/prompt-hygiene.md +22 -0
- package/dist/governance/review-checklist.md +24 -0
- package/dist/governance/safety-and-data.md +27 -0
- package/dist/governance/usage-rules.md +21 -0
- package/dist/mandatory/address-pr-feedback/SKILL.md +196 -0
- package/dist/mandatory/agentic-goal/SKILL.md +42 -0
- package/dist/mandatory/agentic-status/SKILL.md +74 -0
- package/dist/mandatory/apply-design/SKILL.md +228 -0
- package/dist/mandatory/check-ac/SKILL.md +124 -0
- package/dist/mandatory/create-pr-and-commit/SKILL.md +304 -0
- package/dist/mandatory/design/SKILL.md +312 -0
- package/dist/mandatory/feature-workflow/SKILL.md +87 -0
- package/dist/mandatory/hotfix/SKILL.md +195 -0
- package/dist/mandatory/pre-push/SKILL.md +272 -0
- package/dist/mandatory/project-context/SKILL.md +180 -0
- package/dist/mandatory/release-docs/SKILL.md +191 -0
- package/dist/mandatory/review-pr/SKILL.md +323 -0
- package/dist/mandatory/security-review/SKILL.md +157 -0
- package/dist/skills/api-contract/SKILL.md +77 -0
- package/dist/skills/backend-django/SKILL.md +27 -0
- package/dist/skills/backend-nestjs/SKILL.md +65 -0
- package/dist/skills/bug-ticket-creation/SKILL.md +43 -0
- package/dist/skills/cloudwatch-troubleshooting/SKILL.md +73 -0
- package/dist/skills/database-migration/SKILL.md +97 -0
- package/dist/skills/debugging/SKILL.md +32 -0
- package/dist/skills/devops-infra/SKILL.md +26 -0
- package/dist/skills/documentation/SKILL.md +24 -0
- package/dist/skills/frontend-nextjs/SKILL.md +27 -0
- package/dist/skills/incident-postmortem/SKILL.md +38 -0
- package/dist/skills/kubernetes-troubleshooting/SKILL.md +71 -0
- package/dist/skills/mobile-react-native/SKILL.md +37 -0
- package/dist/skills/postgres-analytics/SKILL.md +29 -0
- package/dist/skills/product-jira-ticketing/SKILL.md +28 -0
- package/dist/skills/qa-bug-analysis/SKILL.md +27 -0
- package/dist/skills/refactoring/SKILL.md +32 -0
- package/dist/skills/sprint-planning/SKILL.md +32 -0
- package/dist/skills/testing-quality/SKILL.md +62 -0
- package/dist/v2/protocols/agent-orchestration.md +49 -0
- package/dist/v2/protocols/delivery.md +45 -0
- package/dist/v2/protocols/design-authority.md +29 -0
- package/dist/v2/protocols/goal-graph.md +44 -0
- package/dist/v2/protocols/pattern-first-development.md +29 -0
- package/dist/v2/protocols/qa-evidence.md +29 -0
- package/dist/v2/protocols/security.md +29 -0
- package/dist/v2/schemas/event.schema.json +86 -0
- package/dist/v2/schemas/evidence.schema.json +94 -0
- package/dist/v2/schemas/feature-decomposition.schema.json +48 -0
- package/dist/v2/schemas/feature-plan.schema.json +95 -0
- package/dist/v2/schemas/goal-graph.schema.json +61 -0
- package/dist/v2/schemas/integration.schema.json +119 -0
- package/dist/v2/schemas/orchestration.schema.json +69 -0
- package/dist/v2/schemas/project.schema.json +209 -0
- package/dist/v2/schemas/providers.schema.json +142 -0
- package/dist/v2/schemas/quality.schema.json +50 -0
- package/dist/v2/schemas/work-action.schema.json +44 -0
- package/dist/v2/schemas/work-request.schema.json +253 -0
- package/dist/v2/templates/evidence/qa-bundle.json +194 -0
- package/dist/v2/templates/github-actions/rivet-deploy.yml +98 -0
- package/dist/v2/templates/harness/SKILL.md +90 -0
- package/dist/v2/templates/project/.rivet/orchestration.yaml +42 -0
- package/dist/v2/templates/project/.rivet/project.yaml +14 -0
- package/dist/v2/templates/project/.rivet/providers.yaml +8 -0
- package/dist/v2/templates/project/.rivet/quality.yaml +16 -0
- package/package.json +58 -0
- package/protocols/agent-orchestration.md +49 -0
- package/protocols/delivery.md +45 -0
- package/protocols/design-authority.md +29 -0
- package/protocols/goal-graph.md +44 -0
- package/protocols/pattern-first-development.md +29 -0
- package/protocols/qa-evidence.md +29 -0
- package/protocols/security.md +29 -0
- package/schemas/event.schema.json +86 -0
- package/schemas/evidence.schema.json +94 -0
- package/schemas/feature-decomposition.schema.json +48 -0
- package/schemas/feature-plan.schema.json +95 -0
- package/schemas/goal-graph.schema.json +61 -0
- package/schemas/integration.schema.json +119 -0
- package/schemas/orchestration.schema.json +69 -0
- package/schemas/project.schema.json +209 -0
- package/schemas/providers.schema.json +142 -0
- package/schemas/quality.schema.json +50 -0
- package/schemas/work-action.schema.json +44 -0
- package/schemas/work-request.schema.json +253 -0
- package/src/adapters/confluence.js +138 -0
- package/src/adapters/contract.js +657 -0
- package/src/adapters/factory.js +122 -0
- package/src/adapters/figma.js +178 -0
- package/src/adapters/fixtures.js +183 -0
- package/src/adapters/github.js +314 -0
- package/src/adapters/http.js +704 -0
- package/src/adapters/jira.js +195 -0
- package/src/adapters/linear.js +171 -0
- package/src/adapters/node-transport.js +59 -0
- package/src/cli/integration-setup-prompt.js +32 -0
- package/src/cli/interrupt.js +25 -0
- package/src/cli/main.js +596 -0
- package/src/cli/output.js +174 -0
- package/src/cli/parse-args.js +246 -0
- package/src/cli/project-discovery.js +70 -0
- package/src/cli/task-confirmation.js +38 -0
- package/src/cli/task-presentation.js +22 -0
- package/src/clients/claude.js +214 -0
- package/src/clients/codex.js +180 -0
- package/src/clients/compatibility.js +23 -0
- package/src/clients/contract.js +224 -0
- package/src/clients/fake.js +170 -0
- package/src/clients/process-runner.js +657 -0
- package/src/clients/result-contract.js +78 -0
- package/src/commands/delivery-publish.js +80 -0
- package/src/commands/delivery-remote.js +230 -0
- package/src/commands/delivery-review-update.js +39 -0
- package/src/commands/delivery-tracker.js +94 -0
- package/src/commands/delivery-transition.js +79 -0
- package/src/commands/delivery.js +223 -0
- package/src/commands/dependency-approval.js +21 -0
- package/src/commands/doctor.js +191 -0
- package/src/commands/evidence.js +44 -0
- package/src/commands/feature.js +212 -0
- package/src/commands/goals.js +231 -0
- package/src/commands/human-run.js +208 -0
- package/src/commands/human-task.js +278 -0
- package/src/commands/init.js +848 -0
- package/src/commands/install.js +814 -0
- package/src/commands/integration-setup.js +65 -0
- package/src/commands/integrations.js +54 -0
- package/src/commands/models.js +158 -0
- package/src/commands/orchestrate.js +61 -0
- package/src/commands/preflight.js +125 -0
- package/src/commands/protocols.js +228 -0
- package/src/commands/repositories.js +77 -0
- package/src/commands/setup-remote.js +41 -0
- package/src/commands/setup.js +214 -0
- package/src/commands/status.js +224 -0
- package/src/commands/support.js +44 -0
- package/src/commands/task-completion.js +104 -0
- package/src/commands/uninstall.js +234 -0
- package/src/commands/verify.js +171 -0
- package/src/commands/work.js +220 -0
- package/src/commands/worktrees.js +52 -0
- package/src/config/command-readiness.js +218 -0
- package/src/config/commands.js +206 -0
- package/src/config/defaults.js +55 -0
- package/src/config/load.js +230 -0
- package/src/config/validate.js +560 -0
- package/src/delivery/bitbucket-review.js +123 -0
- package/src/delivery/branch-publication.js +23 -0
- package/src/delivery/contract.js +379 -0
- package/src/delivery/github-deployment.js +132 -0
- package/src/delivery/github-review.js +5 -0
- package/src/delivery/github.js +382 -0
- package/src/delivery/gitlab-review.js +5 -0
- package/src/delivery/gitlab.js +395 -0
- package/src/delivery/prepare.js +90 -0
- package/src/delivery/publication-process.js +33 -0
- package/src/delivery/publication-transport.js +112 -0
- package/src/delivery/review-request.js +184 -0
- package/src/delivery/review-update.js +74 -0
- package/src/delivery/service.js +400 -0
- package/src/delivery/store.js +76 -0
- package/src/delivery/tracker-target.js +51 -0
- package/src/delivery/tracker-transition.js +158 -0
- package/src/delivery/tracker.js +164 -0
- package/src/discovery/git.js +85 -0
- package/src/discovery/portable.js +108 -0
- package/src/discovery/project.js +345 -0
- package/src/discovery/tools.js +145 -0
- package/src/evaluations/approval.js +20 -0
- package/src/evaluations/cost-policy.js +20 -0
- package/src/evaluations/harness-attempt.js +113 -0
- package/src/evaluations/live-runner.js +55 -0
- package/src/evaluations/profile.js +28 -0
- package/src/evaluations/report.js +11 -0
- package/src/evaluations/text-attempt.js +18 -0
- package/src/evidence/checksum.js +87 -0
- package/src/evidence/collect.js +727 -0
- package/src/evidence/validate.js +354 -0
- package/src/feature/accepted-integration.js +46 -0
- package/src/feature/actions.js +37 -0
- package/src/feature/client-profile.js +56 -0
- package/src/feature/decomposition-contract.js +58 -0
- package/src/feature/host-execution.js +633 -0
- package/src/feature/host-lock-recovery.js +96 -0
- package/src/feature/host-run-lock.js +32 -0
- package/src/feature/local-approval.js +183 -0
- package/src/feature/plan-contract.js +215 -0
- package/src/feature/planner.js +253 -0
- package/src/feature/run-store.js +241 -0
- package/src/feature/runtime-bridge.js +840 -0
- package/src/feature/verification-report.js +168 -0
- package/src/feature/workflow.js +375 -0
- package/src/git/client.js +509 -0
- package/src/git/integration-worktree.js +153 -0
- package/src/git/reconcile.js +222 -0
- package/src/git/reservations.js +450 -0
- package/src/git/worktrees.js +478 -0
- package/src/graph/completion.js +189 -0
- package/src/graph/fixtures.js +116 -0
- package/src/graph/reducer.js +124 -0
- package/src/graph/scheduler.js +252 -0
- package/src/graph/validate.js +106 -0
- package/src/install/managed.js +579 -0
- package/src/install/project-reference.js +33 -0
- package/src/install/project-runtime.js +142 -0
- package/src/install/runtime-integrity.cjs +141 -0
- package/src/integrations/capabilities.js +69 -0
- package/src/integrations/host-observation.js +26 -0
- package/src/integrations/registry.js +56 -0
- package/src/models/delegate.js +102 -0
- package/src/models/profiles.js +53 -0
- package/src/models/protocols.js +208 -0
- package/src/models/registry.js +83 -0
- package/src/models/transport.js +59 -0
- package/src/policy/approvals.js +251 -0
- package/src/policy/authority.js +282 -0
- package/src/policy/budget.js +149 -0
- package/src/policy/command-bootstrap.js +219 -0
- package/src/policy/commands.js +803 -0
- package/src/prompts/launch-contract.js +43 -0
- package/src/prompts/planning-contract.js +92 -0
- package/src/protocols/presentation.js +53 -0
- package/src/protocols/project.js +289 -0
- package/src/quality/runner.js +497 -0
- package/src/quality/traceability.js +215 -0
- package/src/repositories/identity.js +59 -0
- package/src/repositories/index.js +2 -0
- package/src/repositories/provider.js +210 -0
- package/src/runtime/application.js +353 -0
- package/src/runtime/dependency-directory.js +33 -0
- package/src/runtime/harness-discovery.js +121 -0
- package/src/runtime/heartbeat.js +47 -0
- package/src/runtime/instance-store.js +112 -0
- package/src/runtime/orchestrator.js +1133 -0
- package/src/runtime/portable-dependencies.js +94 -0
- package/src/runtime/recovery.js +190 -0
- package/src/runtime/retry.js +54 -0
- package/src/runtime/supervisor.js +166 -0
- package/src/runtime/worktree-bootstrap.js +169 -0
- package/src/state/event-store.js +333 -0
- package/src/state/lock.js +266 -0
- package/src/state/paths.js +274 -0
- package/src/state/redact.js +106 -0
- package/src/state/snapshot-store.js +310 -0
- package/src/status/public/app.js +96 -0
- package/src/status/public/index.html +37 -0
- package/src/status/public/styles.css +50 -0
- package/src/status/server.js +323 -0
- package/src/status/view-model.js +356 -0
- package/src/support/bundle.js +195 -0
- package/src/support/failure-report.js +96 -0
- package/src/work-request/contract.js +250 -0
- package/src/work-request/host.js +78 -0
- package/src/work-request/local.js +163 -0
- package/src/work-request/tracker.js +105 -0
- package/templates/evidence/qa-bundle.json +194 -0
- package/templates/github-actions/rivet-deploy.yml +98 -0
- package/templates/harness/SKILL.md +90 -0
- package/templates/project/.rivet/orchestration.yaml +42 -0
- package/templates/project/.rivet/project.yaml +14 -0
- package/templates/project/.rivet/providers.yaml +8 -0
- 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
|
+
}
|