@intent-engine/cli 0.1.26 → 0.1.27

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 (95) hide show
  1. package/assets/viperjs-judge.sha256 +1 -0
  2. package/assets/viperjs-judge.wasm +0 -0
  3. package/dist/src/admin-commands.d.ts +2 -1
  4. package/dist/src/admin-commands.js +47 -2
  5. package/dist/src/admin-commands.js.map +1 -1
  6. package/dist/src/agent/create.js +3 -1
  7. package/dist/src/agent/create.js.map +1 -1
  8. package/dist/src/agent/mandate-agent.js +3 -1
  9. package/dist/src/agent/mandate-agent.js.map +1 -1
  10. package/dist/src/agent/mcp.js +2 -0
  11. package/dist/src/agent/mcp.js.map +1 -1
  12. package/dist/src/agent/problems.d.ts +15 -0
  13. package/dist/src/agent/problems.js +15 -0
  14. package/dist/src/agent/problems.js.map +1 -1
  15. package/dist/src/agent/registry.js +2 -0
  16. package/dist/src/agent/registry.js.map +1 -1
  17. package/dist/src/agent/reputation.d.ts +4 -0
  18. package/dist/src/agent/reputation.js +127 -0
  19. package/dist/src/agent/reputation.js.map +1 -0
  20. package/dist/src/agent/sales.d.ts +1 -1
  21. package/dist/src/agent/sales.js +4 -4
  22. package/dist/src/agent/sales.js.map +1 -1
  23. package/dist/src/agent/signed-prepare.js +2 -5
  24. package/dist/src/agent/signed-prepare.js.map +1 -1
  25. package/dist/src/agent/signed-relay.d.ts +1 -1
  26. package/dist/src/agent/signed-relay.js +2 -1
  27. package/dist/src/agent/signed-relay.js.map +1 -1
  28. package/dist/src/agent/signed-submit.js +2 -2
  29. package/dist/src/agent/signed-submit.js.map +1 -1
  30. package/dist/src/agent/wallet/committee.d.ts +4 -0
  31. package/dist/src/agent/wallet/committee.js +155 -0
  32. package/dist/src/agent/wallet/committee.js.map +1 -0
  33. package/dist/src/agent/wallet/releases.js +12 -3
  34. package/dist/src/agent/wallet/releases.js.map +1 -1
  35. package/dist/src/agent/wallet.d.ts +1 -0
  36. package/dist/src/agent/wallet.js +6 -0
  37. package/dist/src/agent/wallet.js.map +1 -1
  38. package/dist/src/arg-options.d.ts +74 -2
  39. package/dist/src/arg-options.js +53 -2
  40. package/dist/src/arg-options.js.map +1 -1
  41. package/dist/src/arg-usage.d.ts +2 -2
  42. package/dist/src/arg-usage.js +10 -3
  43. package/dist/src/arg-usage.js.map +1 -1
  44. package/dist/src/arg-values.d.ts +1 -1
  45. package/dist/src/arg-values.js +10 -6
  46. package/dist/src/arg-values.js.map +1 -1
  47. package/dist/src/args.js +48 -3
  48. package/dist/src/args.js.map +1 -1
  49. package/dist/src/artifact.d.ts +7 -1
  50. package/dist/src/artifact.js +23 -9
  51. package/dist/src/artifact.js.map +1 -1
  52. package/dist/src/check-process.d.ts +7 -0
  53. package/dist/src/check-process.js +78 -0
  54. package/dist/src/check-process.js.map +1 -1
  55. package/dist/src/command-types.d.ts +59 -1
  56. package/dist/src/commands.js +17 -1
  57. package/dist/src/commands.js.map +1 -1
  58. package/dist/src/committee-commands.d.ts +31 -0
  59. package/dist/src/committee-commands.js +167 -0
  60. package/dist/src/committee-commands.js.map +1 -0
  61. package/dist/src/host-judge.d.ts +11 -0
  62. package/dist/src/host-judge.js +120 -0
  63. package/dist/src/host-judge.js.map +1 -0
  64. package/dist/src/judge.d.ts +15 -1
  65. package/dist/src/judge.js +75 -19
  66. package/dist/src/judge.js.map +1 -1
  67. package/dist/src/main.d.ts +1 -0
  68. package/dist/src/main.js +11 -0
  69. package/dist/src/main.js.map +1 -1
  70. package/dist/src/monitor-args.d.ts +11 -0
  71. package/dist/src/monitor-args.js +58 -0
  72. package/dist/src/monitor-args.js.map +1 -0
  73. package/dist/src/monitor-fills.d.ts +13 -0
  74. package/dist/src/monitor-fills.js +56 -0
  75. package/dist/src/monitor-fills.js.map +1 -0
  76. package/dist/src/monitor.d.ts +60 -0
  77. package/dist/src/monitor.js +295 -0
  78. package/dist/src/monitor.js.map +1 -0
  79. package/dist/src/reputation-commands.d.ts +8 -0
  80. package/dist/src/reputation-commands.js +20 -0
  81. package/dist/src/reputation-commands.js.map +1 -0
  82. package/dist/src/sandbox.d.ts +46 -0
  83. package/dist/src/sandbox.js +142 -0
  84. package/dist/src/sandbox.js.map +1 -0
  85. package/dist/src/solve-commands.js +12 -8
  86. package/dist/src/solve-commands.js.map +1 -1
  87. package/dist/src/trust-args.d.ts +6 -0
  88. package/dist/src/trust-args.js +76 -0
  89. package/dist/src/trust-args.js.map +1 -0
  90. package/dist/src/version.d.ts +1 -1
  91. package/dist/src/version.js +1 -1
  92. package/dist/src/viper.d.ts +66 -0
  93. package/dist/src/viper.js +282 -0
  94. package/dist/src/viper.js.map +1 -0
  95. package/package.json +9 -7
@@ -0,0 +1,167 @@
1
+ import { readFile, writeFile } from "node:fs/promises";
2
+ import { buildCreateCommittee, signCommitteeVote } from "@intent-engine/core";
3
+ import { createClient } from "@intent-engine/client";
4
+ import { previewed } from "./admin-commands.js";
5
+ import { parseAddress, parseU64 } from "./arg-values.js";
6
+ import { FlowRefused } from "./flows.js";
7
+ export const VOTE_KIND = "committee-vote";
8
+ export const VOTE_NOT_SIGNED = "nothing was signed; rerun with --yes to sign this vote, then pass the file to committee release";
9
+ const hex = (bytes) => Buffer.from(bytes).toString("hex");
10
+ function ballotLines(ballot, target) {
11
+ return [
12
+ `Releases: proof escrow ${ballot.intent} to ${target.payTo} (token account ${ballot.payee}) with result ${target.result}`,
13
+ `Judged by: committee ${ballot.committee.address}, ${ballot.committee.threshold} of ${ballot.committee.members.length} members must sign`,
14
+ ];
15
+ }
16
+ export async function memberVote(member, ballot, target) {
17
+ if (!ballot.committee.members.includes(member.address)) {
18
+ throw new FlowRefused(`${member.address} is not a member of committee ${ballot.committee.address}; nothing was signed`);
19
+ }
20
+ const { signature } = await signCommitteeVote(member, ballot.digest);
21
+ return {
22
+ kind: VOTE_KIND,
23
+ intent: ballot.intent,
24
+ committee: ballot.committee.address,
25
+ owner: target.owner,
26
+ nonce: target.nonce.toString(),
27
+ pay_to: target.payTo,
28
+ result: target.result.toString(),
29
+ member: member.address,
30
+ signature: hex(signature),
31
+ };
32
+ }
33
+ export function voteOf(text, file) {
34
+ let parsed;
35
+ try {
36
+ parsed = JSON.parse(text);
37
+ }
38
+ catch {
39
+ throw new FlowRefused(`${file} is not JSON`);
40
+ }
41
+ const held = parsed.vote ?? parsed;
42
+ const vote = held;
43
+ if (vote.kind !== VOTE_KIND || typeof vote.signature !== "string" || !/^[0-9a-f]{128}$/.test(vote.signature)) {
44
+ throw new FlowRefused(`${file} holds no committee vote`);
45
+ }
46
+ const field = (name) => {
47
+ const value = vote[name];
48
+ if (typeof value !== "string") {
49
+ throw new FlowRefused(`${file} holds a committee vote without ${name}`);
50
+ }
51
+ return value;
52
+ };
53
+ return {
54
+ kind: VOTE_KIND,
55
+ intent: parseAddress(field("intent"), "intent"),
56
+ committee: parseAddress(field("committee"), "committee"),
57
+ owner: parseAddress(field("owner"), "owner"),
58
+ nonce: parseU64(field("nonce"), "nonce").toString(),
59
+ pay_to: parseAddress(field("pay_to"), "pay_to"),
60
+ result: parseU64(field("result"), "result").toString(),
61
+ member: parseAddress(field("member"), "member"),
62
+ signature: vote.signature,
63
+ };
64
+ }
65
+ export function sameBallot(votes, files) {
66
+ const [first] = votes;
67
+ if (first === undefined) {
68
+ throw new FlowRefused("committee release needs at least one --vote");
69
+ }
70
+ votes.forEach((vote, i) => {
71
+ for (const name of ["intent", "committee", "owner", "nonce", "pay_to", "result"]) {
72
+ if (vote[name] !== first[name]) {
73
+ throw new FlowRefused(`${files[i]} votes on ${name} ${vote[name]}, but ${files[0]} votes on ${first[name]}`);
74
+ }
75
+ }
76
+ });
77
+ return { owner: first.owner, nonce: BigInt(first.nonce), payTo: first.pay_to, result: BigInt(first.result) };
78
+ }
79
+ export async function committeeCommand(command, runtime, transport) {
80
+ const client = createClient({ url: command.url, transport });
81
+ switch (command.name) {
82
+ case "committee-create": {
83
+ const payer = await runtime.loadSigner(command.keypair);
84
+ const terms = { members: command.members, threshold: command.threshold, feeWallet: command.feeWallet };
85
+ const { committee, instruction } = await buildCreateCommittee({ ...terms, payer });
86
+ const shown = {
87
+ committee: committee.address,
88
+ members: committee.members,
89
+ threshold: committee.threshold,
90
+ fee_wallet: committee.feeWallet,
91
+ };
92
+ if ((await client.committee(committee.address)) !== null) {
93
+ return { ...shown, sent: false, exists: true };
94
+ }
95
+ const summary = [
96
+ `Creates: committee ${committee.address}; any ${committee.threshold} of its ${committee.members.length} members release an escrow that names it`,
97
+ `Pays judge fees to: ${committee.feeWallet}`,
98
+ `Pays rent: ${payer.address}`,
99
+ ];
100
+ return previewed(transport, [instruction], payer, { ...shown, summary }, command.yes);
101
+ }
102
+ case "committee-show": {
103
+ const found = await client.committee(command.committee);
104
+ if (found === null) {
105
+ throw new FlowRefused(`${command.committee} is not a committee`);
106
+ }
107
+ return {
108
+ committee: found.address,
109
+ members: found.members,
110
+ threshold: found.threshold,
111
+ fee_wallet: found.feeWallet,
112
+ id: hex(found.id),
113
+ created_at: found.createdAt,
114
+ };
115
+ }
116
+ case "committee-vote": {
117
+ const member = await runtime.loadSigner(command.keypair);
118
+ const target = { owner: command.owner, nonce: command.nonce, payTo: command.payTo, result: command.result };
119
+ const ballot = await client.committeeBallot(target);
120
+ if (!ballot.committee.members.includes(member.address)) {
121
+ throw new FlowRefused(`${member.address} is not a member of committee ${ballot.committee.address}; nothing was signed`);
122
+ }
123
+ const summary = ballotLines(ballot, target);
124
+ if (!command.yes) {
125
+ return { intent: ballot.intent, digest: hex(ballot.digest), summary, signed: false, next: VOTE_NOT_SIGNED };
126
+ }
127
+ const vote = await memberVote(member, ballot, target);
128
+ if (command.out !== undefined) {
129
+ await writeFile(command.out, `${JSON.stringify(vote, null, 2)}\n`);
130
+ }
131
+ return { summary, signed: true, vote, ...(command.out === undefined ? {} : { written: command.out }) };
132
+ }
133
+ case "committee-release": {
134
+ const solver = await runtime.loadSigner(command.keypair);
135
+ const votes = await Promise.all(command.votes.map(async (file) => voteOf(await readFile(file, "utf8"), file)));
136
+ const target = sameBallot(votes, command.votes);
137
+ const cast = votes.map((v) => ({ member: v.member, signature: Uint8Array.from(Buffer.from(v.signature, "hex")) }));
138
+ const release = await client.prepareCommitteeRelease({
139
+ ...target,
140
+ solver,
141
+ votes: cast,
142
+ ...(command.sha256 === undefined ? {} : { deliveredSha256: command.sha256 }),
143
+ });
144
+ const [first] = votes;
145
+ if (first !== undefined && (first.intent !== release.intent || first.committee !== release.committee.address)) {
146
+ throw new FlowRefused(`the votes are for escrow ${first.intent} and committee ${first.committee}, not ${release.intent} and ${release.committee.address}`);
147
+ }
148
+ const summary = [
149
+ `Releases: proof escrow ${release.intent} to ${target.payTo} (token account ${release.payee}) with result ${target.result}`,
150
+ `Signed by: ${release.signers.join(", ")}, ${release.signers.length} of committee ${release.committee.address}, which needs ${release.committee.threshold}`,
151
+ `Pays the fee: ${solver.address}`,
152
+ ];
153
+ const shown = { intent: release.intent, committee: release.committee.address, signers: release.signers };
154
+ if (release.setup.length === 0) {
155
+ return previewed(transport, release.instructions, solver, { ...shown, summary }, command.yes);
156
+ }
157
+ const setupSummary = "Sets up first, in its own transaction: the token accounts the release pays into";
158
+ if (!command.yes) {
159
+ return previewed(transport, release.setup, solver, { ...shown, summary: [...summary, setupSummary] }, false);
160
+ }
161
+ const prepared = await previewed(transport, release.setup, solver, {}, true);
162
+ const sent = await previewed(transport, release.instructions, solver, { ...shown, summary: [...summary, setupSummary] }, true);
163
+ return { ...sent, setup_signature: prepared.signature };
164
+ }
165
+ }
166
+ }
167
+ //# sourceMappingURL=committee-commands.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"committee-commands.js","sourceRoot":"","sources":["../../src/committee-commands.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,11 @@
1
+ import { type Cases, type Failure } from "./viper.js";
2
+ export declare const HOST_ENGINE = "node-vm";
3
+ export declare const HOST_CALL_MS = 2000;
4
+ export type HostJudged = {
5
+ engine: typeof HOST_ENGINE;
6
+ total: number;
7
+ passed: number;
8
+ failures: Failure[];
9
+ };
10
+ export declare const HOST_RUNNER = "\nimport vm from \"node:vm\";\nprocess.on(\"unhandledRejection\", () => undefined);\nconst chunks = [];\nfor await (const chunk of process.stdin) chunks.push(chunk);\nconst { source, cases, callMs } = JSON.parse(Buffer.concat(chunks).toString(\"utf8\"));\nconst out = (results) => process.stdout.write(JSON.stringify(results));\nconst all = (verdict, detail) => out(cases.map(() => (detail === undefined ? { verdict } : { verdict, detail })));\nconst context = vm.createContext(vm.constants.DONT_CONTEXTIFY, { codeGeneration: { strings: false, wasm: false } });\nlet fn;\ntry {\n const module = new vm.SourceTextModule(source, { context, identifier: \"delivery.mjs\" });\n await module.link(() => {\n throw new Error(\"the delivery imports a module\");\n });\n await module.evaluate({ timeout: callMs });\n fn = module.namespace.default;\n} catch (error) {\n all(\"no-module\", String(error && error.message ? error.message : error).slice(0, 256));\n process.exit(0);\n}\nif (typeof fn !== \"function\") {\n all(\"no-module\", \"the delivery has no default export function\");\n process.exit(0);\n}\ncontext.__call = fn;\nconst primitive = (v) => v === null || typeof v === \"boolean\" || typeof v === \"number\" || typeof v === \"string\";\nconst same = (a, b) => a === b || (typeof a === \"number\" && typeof b === \"number\" && Number.isNaN(a) && Number.isNaN(b));\nconst results = cases.map((c) => {\n context.__json = JSON.stringify(c.args);\n let got;\n try {\n got = vm.runInContext(\"__call(...JSON.parse(__json))\", context, { timeout: callMs });\n } catch (error) {\n const stopped = error && error.code === \"ERR_SCRIPT_EXECUTION_TIMEOUT\";\n return stopped ? { verdict: \"stopped\" } : { verdict: \"threw\", detail: String(error && error.message ? error.message : error).slice(0, 256) };\n }\n if (!primitive(got)) return { verdict: \"not-primitive\" };\n return same(got, c.expected) ? { verdict: \"pass\" } : { verdict: \"wrong\", detail: got };\n});\nout(results);\n";
11
+ export declare function judgeHost(source: Uint8Array, cases: Cases, timeoutSeconds: number): Promise<HostJudged>;
@@ -0,0 +1,120 @@
1
+ import { spawn } from "node:child_process";
2
+ import { JudgeRefused } from "./judge-errors.js";
3
+ import { DIAGNOSTIC_BYTES, OUTPUT_BYTES, permissionFlag, REPORTED_FAILURES, } from "./viper.js";
4
+ export const HOST_ENGINE = "node-vm";
5
+ export const HOST_CALL_MS = 2_000;
6
+ export const HOST_RUNNER = `
7
+ import vm from "node:vm";
8
+ process.on("unhandledRejection", () => undefined);
9
+ const chunks = [];
10
+ for await (const chunk of process.stdin) chunks.push(chunk);
11
+ const { source, cases, callMs } = JSON.parse(Buffer.concat(chunks).toString("utf8"));
12
+ const out = (results) => process.stdout.write(JSON.stringify(results));
13
+ const all = (verdict, detail) => out(cases.map(() => (detail === undefined ? { verdict } : { verdict, detail })));
14
+ const context = vm.createContext(vm.constants.DONT_CONTEXTIFY, { codeGeneration: { strings: false, wasm: false } });
15
+ let fn;
16
+ try {
17
+ const module = new vm.SourceTextModule(source, { context, identifier: "delivery.mjs" });
18
+ await module.link(() => {
19
+ throw new Error("the delivery imports a module");
20
+ });
21
+ await module.evaluate({ timeout: callMs });
22
+ fn = module.namespace.default;
23
+ } catch (error) {
24
+ all("no-module", String(error && error.message ? error.message : error).slice(0, 256));
25
+ process.exit(0);
26
+ }
27
+ if (typeof fn !== "function") {
28
+ all("no-module", "the delivery has no default export function");
29
+ process.exit(0);
30
+ }
31
+ context.__call = fn;
32
+ const primitive = (v) => v === null || typeof v === "boolean" || typeof v === "number" || typeof v === "string";
33
+ const same = (a, b) => a === b || (typeof a === "number" && typeof b === "number" && Number.isNaN(a) && Number.isNaN(b));
34
+ const results = cases.map((c) => {
35
+ context.__json = JSON.stringify(c.args);
36
+ let got;
37
+ try {
38
+ got = vm.runInContext("__call(...JSON.parse(__json))", context, { timeout: callMs });
39
+ } catch (error) {
40
+ const stopped = error && error.code === "ERR_SCRIPT_EXECUTION_TIMEOUT";
41
+ return stopped ? { verdict: "stopped" } : { verdict: "threw", detail: String(error && error.message ? error.message : error).slice(0, 256) };
42
+ }
43
+ if (!primitive(got)) return { verdict: "not-primitive" };
44
+ return same(got, c.expected) ? { verdict: "pass" } : { verdict: "wrong", detail: got };
45
+ });
46
+ out(results);
47
+ `;
48
+ function runHost(input, timeoutSeconds) {
49
+ return new Promise((done) => {
50
+ const child = spawn(process.execPath, [permissionFlag(), "--experimental-vm-modules", "--no-warnings", "--input-type=module", "-e", HOST_RUNNER], {
51
+ env: {},
52
+ stdio: ["pipe", "pipe", "pipe"],
53
+ windowsHide: true,
54
+ });
55
+ let output = "";
56
+ let diagnostic = "";
57
+ let timedOut = false;
58
+ let over = false;
59
+ const timer = setTimeout(() => {
60
+ timedOut = true;
61
+ child.kill("SIGKILL");
62
+ }, timeoutSeconds * 1000);
63
+ child.stdout.on("data", (chunk) => {
64
+ if (output.length + chunk.length > OUTPUT_BYTES) {
65
+ over = true;
66
+ child.kill("SIGKILL");
67
+ return;
68
+ }
69
+ output += chunk.toString("utf8");
70
+ });
71
+ child.stderr.on("data", (chunk) => {
72
+ if (diagnostic.length < DIAGNOSTIC_BYTES)
73
+ diagnostic += chunk.toString("utf8").slice(0, DIAGNOSTIC_BYTES - diagnostic.length);
74
+ });
75
+ child.stdin.on("error", () => undefined);
76
+ child.stdin.end(input);
77
+ child.once("error", (error) => {
78
+ clearTimeout(timer);
79
+ done({ output: "", exitCode: null, timedOut, diagnostic: error.message });
80
+ });
81
+ child.once("close", (code) => {
82
+ clearTimeout(timer);
83
+ done({ output: over ? "" : output, exitCode: over ? null : code, timedOut, diagnostic });
84
+ });
85
+ });
86
+ }
87
+ function summarized(results) {
88
+ const failures = results.flatMap((result, index) => (result.verdict === "pass" ? [] : [{ case: index, ...result }]));
89
+ return { engine: HOST_ENGINE, total: results.length, passed: results.length - failures.length, failures: failures.slice(0, REPORTED_FAILURES) };
90
+ }
91
+ function failedAll(cases, verdict, detail) {
92
+ return { engine: HOST_ENGINE, total: cases.cases.length, passed: 0, failures: [{ case: 0, verdict, detail }] };
93
+ }
94
+ export async function judgeHost(source, cases, timeoutSeconds) {
95
+ let text;
96
+ try {
97
+ text = new TextDecoder("utf-8", { fatal: true }).decode(source);
98
+ }
99
+ catch {
100
+ throw new JudgeRefused("--artifact is not UTF-8 text, so it is not a module the judge can run; nothing was paid");
101
+ }
102
+ const ran = await runHost(JSON.stringify({ source: text, cases: cases.cases, callMs: HOST_CALL_MS }), timeoutSeconds);
103
+ if (ran.timedOut)
104
+ return failedAll(cases, "stopped", `the host engine did not finish within ${timeoutSeconds} s`);
105
+ if (ran.exitCode !== 0) {
106
+ return failedAll(cases, "crashed", `the host engine ended with exit code ${ran.exitCode}: ${ran.diagnostic.trim().slice(0, 256)}`);
107
+ }
108
+ let results;
109
+ try {
110
+ results = JSON.parse(ran.output);
111
+ }
112
+ catch {
113
+ return failedAll(cases, "crashed", "the host engine wrote no readable verdict");
114
+ }
115
+ if (!Array.isArray(results) || results.length !== cases.cases.length) {
116
+ return failedAll(cases, "crashed", "the host engine judged a different number of cases");
117
+ }
118
+ return summarized(results);
119
+ }
120
+ //# sourceMappingURL=host-judge.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"host-judge.js","sourceRoot":"","sources":["../../src/host-judge.ts"],"names":[],"mappings":"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"}
@@ -1,23 +1,37 @@
1
1
  import { type Address, type Signature } from "@solana/kit";
2
2
  import { type Transport } from "@intent-engine/client";
3
3
  import type { Command } from "./args.js";
4
+ import { type VoteFile } from "./committee-commands.js";
4
5
  import type { Runtime } from "./commands.js";
5
6
  import { type InterruptSignal } from "./judge-errors.js";
7
+ import { type HostJudged } from "./host-judge.js";
8
+ import { type Judged as CasesJudged } from "./viper.js";
6
9
  export { type InterruptSignal, JudgeInterrupted, JudgeRefused, SIGNAL_EXIT } from "./judge-errors.js";
7
- export { artifactSha256, CLEANUP_RETRIES, removeCopy, SKIPPED, SPEC_COPY } from "./artifact.js";
10
+ export { artifactSha256, CHECK_COPY, CLEANUP_RETRIES, removeCopy, SKIPPED, SPEC_COPY } from "./artifact.js";
8
11
  export { type Check, CHECK_ENV, checkEnv, type CheckOptions, claim, ENV_ARTIFACT_PATH, ENV_ARTIFACT_SHA256, ENV_SPEC_PATH, leftRunning, type Recorded, runCheck, type Running, stillRunning, } from "./check-process.js";
9
12
  export type JudgeCommand = Extract<Command, {
10
13
  name: "judge";
11
14
  }>;
15
+ export declare const VOTE_NEXT = "the check passed and this member's vote is in the verdict; nothing was sent. Pass this verdict file, with the other members' votes, to committee release --vote";
12
16
  export type Verdict = {
13
17
  intent: Address;
14
18
  specHash: string;
15
19
  artifactSha256: string;
16
20
  command: string;
21
+ sandbox: "docker" | "viper" | "none";
22
+ image?: string;
23
+ engine?: {
24
+ wasmSha256: string;
25
+ commit: string;
26
+ };
27
+ cases?: CasesJudged;
28
+ host?: HostJudged;
17
29
  exitCode: number | null;
18
30
  verdict: "pass" | "fail";
19
31
  payTo: Address;
20
32
  signature: Signature | null;
33
+ committee?: Address;
34
+ vote?: VoteFile;
21
35
  next?: string;
22
36
  cleanup?: string;
23
37
  };
package/dist/src/judge.js CHANGED
@@ -1,17 +1,22 @@
1
1
  import { createHash } from "node:crypto";
2
2
  import { readFile, rm, writeFile } from "node:fs/promises";
3
- import { resolve } from "node:path";
3
+ import { basename, resolve } from "node:path";
4
4
  import { getBase58Decoder } from "@solana/kit";
5
5
  import { decodeParams, IntentStatus, Kind } from "@intent-engine/core";
6
- import { chainTime, createClient, deliveryRecord, firstDelivery, loadIntent, SIGNATURE_PAGE } from "@intent-engine/client";
6
+ import { chainTime, createClient, deliveryRecord, firstDelivery, loadCommittee, loadIntent, SIGNATURE_PAGE, } from "@intent-engine/client";
7
7
  import { NOT_SENT } from "./flows.js";
8
+ import { memberVote } from "./committee-commands.js";
8
9
  import { JudgeInterrupted, JudgeRefused, SIGNAL_EXIT } from "./judge-errors.js";
9
10
  import { copyOf, readArtifact, removeCopy } from "./artifact.js";
10
- import { checkEnv, holdSignals, runCheck } from "./check-process.js";
11
+ import { checkEnv, holdSignals, runCheck, runContainer } from "./check-process.js";
12
+ import { containerArgs, containerName, dockerEnv, NO_SANDBOX, sandboxReady, shareable } from "./sandbox.js";
13
+ import { judgeHost } from "./host-judge.js";
14
+ import { casesOf, judgeViper, pinnedWasm, VIPER_ENGINE_COMMIT, VIPER_WASM_SHA256 } from "./viper.js";
11
15
  export { JudgeInterrupted, JudgeRefused, SIGNAL_EXIT } from "./judge-errors.js";
12
- export { artifactSha256, CLEANUP_RETRIES, removeCopy, SKIPPED, SPEC_COPY } from "./artifact.js";
16
+ export { artifactSha256, CHECK_COPY, CLEANUP_RETRIES, removeCopy, SKIPPED, SPEC_COPY } from "./artifact.js";
13
17
  export { CHECK_ENV, checkEnv, claim, ENV_ARTIFACT_PATH, ENV_ARTIFACT_SHA256, ENV_SPEC_PATH, leftRunning, runCheck, stillRunning, } from "./check-process.js";
14
18
  const FORCED_EXIT_MS = 200;
19
+ export const VOTE_NEXT = "the check passed and this member's vote is in the verdict; nothing was sent. Pass this verdict file, with the other members' votes, to committee release --vote";
15
20
  const hex = (bytes) => Buffer.from(bytes).toString("hex");
16
21
  const reasonOf = (error) => (error instanceof Error ? error.message : String(error));
17
22
  export const pagesRead = (pages) => `It read ${pages} ${pages === 1 ? "page" : "pages"} of ${SIGNATURE_PAGE} signatures; a higher --max-pages reads further, but does not help when the RPC node's ledger does not reach back to the escrow's creation or the node cannot page signatures or report its first available slot`;
@@ -25,17 +30,29 @@ async function escrowFor(transport, judge, owner, nonce) {
25
30
  if (intent.status !== IntentStatus.Open || intent.expiresAt <= (await chainTime(transport))) {
26
31
  throw new JudgeRefused(`intent ${address} is no longer open`);
27
32
  }
28
- if (params.attestor !== judge) {
33
+ const committee = params.attestor === judge ? null : await loadCommittee(transport, params.attestor);
34
+ if (params.attestor !== judge && committee === null) {
29
35
  throw new JudgeRefused(`intent ${address} names ${params.attestor} as its judge, not ${judge}`);
30
36
  }
31
- return { address, specHash: hex(params.specHash), minResult: params.minResult, maxResult: params.maxResult };
37
+ if (committee !== null && !committee.members.includes(judge)) {
38
+ throw new JudgeRefused(`intent ${address} names committee ${params.attestor} as its judge, and ${judge} is not one of its members`);
39
+ }
40
+ return {
41
+ address,
42
+ attestor: params.attestor,
43
+ committee,
44
+ specHash: hex(params.specHash),
45
+ minResult: params.minResult,
46
+ maxResult: params.maxResult,
47
+ };
32
48
  }
33
49
  export async function judge(command, runtime, transport) {
34
50
  if (command.verdict !== undefined) {
35
51
  await rm(command.verdict, { force: true });
36
52
  }
53
+ await sandboxReady(command.sandbox, dockerEnv(process.env));
37
54
  const signer = await runtime.loadSigner(command.keypair);
38
- const { address, specHash, minResult, maxResult } = await escrowFor(transport, signer.address, command.owner, command.nonce);
55
+ const { address, attestor, committee, specHash, minResult, maxResult } = await escrowFor(transport, signer.address, command.owner, command.nonce);
39
56
  const result = command.result ?? minResult;
40
57
  if (result < minResult || result > maxResult) {
41
58
  throw new JudgeRefused(resultOutside(result, address, minResult, maxResult));
@@ -45,10 +62,15 @@ export async function judge(command, runtime, transport) {
45
62
  if (specSha256 !== specHash) {
46
63
  throw new JudgeRefused(`--spec ${command.spec} has sha256 ${specSha256}, but intent ${address} commits ${specHash}`);
47
64
  }
65
+ const viper = command.sandbox.kind === "viper" ? { cases: casesOf(specBytes), wasm: await pinnedWasm() } : undefined;
48
66
  const artifact = resolve(command.artifact);
49
67
  const read = await readArtifact(artifact);
68
+ if (viper !== undefined && !read.single) {
69
+ throw new JudgeRefused(`--sandbox viper judges one module file, and --artifact ${command.artifact} is a directory; nothing was run or paid`);
70
+ }
50
71
  const sha256 = read.sha256;
51
- const record = await deliveryRecord(transport, signer.address, address, command.maxPages);
72
+ const check = command.check === undefined ? undefined : { name: basename(resolve(command.check)), read: await readArtifact(resolve(command.check)) };
73
+ const record = await deliveryRecord(transport, attestor, address, command.maxPages);
52
74
  if (!record.complete) {
53
75
  throw new JudgeRefused(`the delivery record is incomplete because the judge's history is too long to read in full or the RPC node cannot serve all of it, so the earliest announcer of the artifact with sha256 ${sha256} for intent ${address} cannot be known; nothing was run or paid. ${pagesRead(record.pages)}`);
54
76
  }
@@ -62,7 +84,7 @@ export async function judge(command, runtime, transport) {
62
84
  }
63
85
  const signals = holdSignals();
64
86
  try {
65
- return await checkAndSettle(command, transport, signer, signals, { address, specHash, sha256, payTo, result, read, specBytes });
87
+ return await checkAndSettle(command, transport, signer, signals, { address, committee, specHash, sha256, payTo, result, read, specBytes, check, viper });
66
88
  }
67
89
  finally {
68
90
  signals.release();
@@ -112,25 +134,53 @@ function sendRelease(command, transport, signer, signals, release) {
112
134
  }, failed);
113
135
  });
114
136
  }
115
- async function checkAndSettle(command, transport, signer, signals, { address, specHash, sha256, payTo, result, read, specBytes }) {
116
- const copy = await copyOf(read, specBytes);
137
+ async function checkAndSettle(command, transport, signer, signals, { address, committee, specHash, sha256, payTo, result, read, specBytes, check: checkFiles, viper }) {
138
+ const { sandbox } = command;
117
139
  let check = { exitCode: null, timedOut: false };
140
+ let cases;
141
+ let host;
118
142
  let cleanup;
119
- try {
143
+ if (viper !== undefined) {
144
+ const module = read.entries[0]?.bytes ?? new Uint8Array();
145
+ if (signals.caught() === undefined) {
146
+ cases = await judgeViper(viper.wasm, module, viper.cases, command.timeout);
147
+ }
120
148
  if (signals.caught() === undefined) {
121
- check = await runCheck(command.run, checkEnv(process.env, copy.spec, copy.path, sha256), command.timeout, { cwd: copy.root });
149
+ host = await judgeHost(module, viper.cases, command.timeout);
122
150
  }
123
151
  }
124
- finally {
125
- cleanup = await removeCopy(copy.root);
152
+ else {
153
+ const copy = await copyOf(read, specBytes, checkFiles);
154
+ const run = command.run ?? "";
155
+ try {
156
+ if (signals.caught() === undefined) {
157
+ if (sandbox.kind === "docker") {
158
+ await shareable(copy.root);
159
+ check = await runContainer(containerArgs(sandbox, copy, sha256, run), containerName(), dockerEnv(process.env), command.timeout);
160
+ }
161
+ else {
162
+ check = await runCheck(run, checkEnv(process.env, copy.spec, copy.path, sha256), command.timeout, { cwd: copy.root });
163
+ process.stderr.write(`${NO_SANDBOX}\n`);
164
+ }
165
+ }
166
+ }
167
+ finally {
168
+ cleanup = await removeCopy(copy.root);
169
+ }
126
170
  }
127
171
  const interrupted = check.interrupted ?? signals.caught();
128
172
  if (interrupted !== undefined) {
129
173
  throw new JudgeInterrupted(interrupted);
130
174
  }
131
- const passed = check.exitCode === 0;
175
+ const agreed = (judged) => judged !== undefined && judged.total > 0 && judged.passed === judged.total;
176
+ const passed = cases === undefined ? check.exitCode === 0 : agreed(cases) && agreed(host);
132
177
  let signature = null;
133
- if (passed && command.yes) {
178
+ let vote;
179
+ if (passed && committee !== null) {
180
+ const target = { owner: command.owner, nonce: command.nonce, payTo, result };
181
+ vote = await memberVote(signer, await createClient({ url: command.url, transport }).committeeBallot(target), target);
182
+ }
183
+ else if (passed && command.yes) {
134
184
  try {
135
185
  signature = await sendRelease(command, transport, signer, signals, { address, payTo, result, sha256 });
136
186
  }
@@ -149,12 +199,18 @@ async function checkAndSettle(command, transport, signer, signals, { address, sp
149
199
  intent: address,
150
200
  specHash,
151
201
  artifactSha256: sha256,
152
- command: command.run,
202
+ command: command.run ?? "viper",
203
+ sandbox: sandbox.kind,
204
+ ...(sandbox.kind === "docker" ? { image: sandbox.image } : {}),
205
+ ...(cases !== undefined ? { engine: { wasmSha256: VIPER_WASM_SHA256, commit: VIPER_ENGINE_COMMIT }, cases } : {}),
206
+ ...(host !== undefined ? { host } : {}),
153
207
  exitCode: check.exitCode,
154
208
  verdict: passed ? "pass" : "fail",
155
209
  payTo,
156
210
  signature,
157
- ...(passed && !command.yes ? { next: NOT_SENT } : {}),
211
+ ...(committee === null ? {} : { committee: committee.address }),
212
+ ...(vote === undefined ? {} : { vote, next: VOTE_NEXT }),
213
+ ...(passed && committee === null && !command.yes ? { next: NOT_SENT } : {}),
158
214
  ...(cleanup !== undefined ? { cleanup } : {}),
159
215
  };
160
216
  if (command.verdict !== undefined) {
@@ -1 +1 @@
1
- {"version":3,"file":"judge.js","sourceRoot":"","sources":["../../src/judge.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"judge.js","sourceRoot":"","sources":["../../src/judge.ts"],"names":[],"mappings":"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"}
@@ -5,6 +5,7 @@ export declare const EXIT_OK = 0;
5
5
  export declare const EXIT_FAILED = 1;
6
6
  export declare const EXIT_USAGE = 2;
7
7
  export declare const EXIT_PARTIAL = 3;
8
+ export { EXIT_ALERTED } from "./monitor-args.js";
8
9
  export declare const KEYPAIR_UNREADABLE = "--keypair must name a readable JSON file holding a 64-byte keypair";
9
10
  export declare const KEYPAIR_EXPOSED = "--keypair names a file other users can read or change; restrict it with chmod 600";
10
11
  type Io = {
package/dist/src/main.js CHANGED
@@ -11,10 +11,13 @@ import { JudgeInterrupted } from "./judge.js";
11
11
  import { printableLines, redactUrl, render, renderText } from "./render.js";
12
12
  import { expandHome, withSettings } from "./wallet.js";
13
13
  import { WALLET_NOTICE } from "./agent/wallet.js";
14
+ import { EXIT_ALERTED } from "./monitor-args.js";
15
+ import { monitor, writeBaseline } from "./monitor.js";
14
16
  export const EXIT_OK = 0;
15
17
  export const EXIT_FAILED = 1;
16
18
  export const EXIT_USAGE = 2;
17
19
  export const EXIT_PARTIAL = 3;
20
+ export { EXIT_ALERTED } from "./monitor-args.js";
18
21
  export const KEYPAIR_UNREADABLE = "--keypair must name a readable JSON file holding a 64-byte keypair";
19
22
  export const KEYPAIR_EXPOSED = "--keypair names a file other users can read or change; restrict it with chmod 600";
20
23
  export { render } from "./render.js";
@@ -39,6 +42,14 @@ export async function main(argv, runtime, io) {
39
42
  await follow(transport, runtime, command.limit, command.interval, show);
40
43
  return EXIT_OK;
41
44
  }
45
+ if (command.name === "monitor") {
46
+ const transport = runtime.transport(command.url);
47
+ if (command.watch === null) {
48
+ show(await writeBaseline(command.baseline, runtime, transport));
49
+ return EXIT_OK;
50
+ }
51
+ return (await monitor(command.url, command.baseline, command.watch, runtime, transport, io)) > 0 ? EXIT_ALERTED : EXIT_OK;
52
+ }
42
53
  if (command.name === "solve" && command.watch !== null) {
43
54
  await watchSolve(command, command.watch, runtime, show);
44
55
  return EXIT_OK;