@perkos/agent-sdk 0.7.0 → 0.8.0-rc.1
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/CHANGELOG.md +74 -0
- package/README.md +98 -44
- package/dist/builders.d.ts +5 -1
- package/dist/builders.d.ts.map +1 -1
- package/dist/builders.js +155 -11
- package/dist/builders.js.map +1 -1
- package/dist/client.d.ts +8 -1
- package/dist/client.d.ts.map +1 -1
- package/dist/client.js +168 -26
- package/dist/client.js.map +1 -1
- package/dist/constants.d.ts.map +1 -1
- package/dist/constants.js +6 -4
- package/dist/constants.js.map +1 -1
- package/dist/custody/backend.d.ts +4 -0
- package/dist/custody/backend.d.ts.map +1 -0
- package/dist/custody/backend.js +149 -0
- package/dist/custody/backend.js.map +1 -0
- package/dist/custody/cli.d.ts +3 -0
- package/dist/custody/cli.d.ts.map +1 -0
- package/dist/custody/cli.js +43 -0
- package/dist/custody/cli.js.map +1 -0
- package/dist/custody/engine.d.ts +54 -0
- package/dist/custody/engine.d.ts.map +1 -0
- package/dist/custody/engine.js +115 -0
- package/dist/custody/engine.js.map +1 -0
- package/dist/custody/ledger.d.ts +24 -0
- package/dist/custody/ledger.d.ts.map +1 -0
- package/dist/custody/ledger.js +122 -0
- package/dist/custody/ledger.js.map +1 -0
- package/dist/custody/permit.d.ts +42 -0
- package/dist/custody/permit.d.ts.map +1 -0
- package/dist/custody/permit.js +91 -0
- package/dist/custody/permit.js.map +1 -0
- package/dist/custody/socket.d.ts +11 -0
- package/dist/custody/socket.d.ts.map +1 -0
- package/dist/custody/socket.js +118 -0
- package/dist/custody/socket.js.map +1 -0
- package/dist/evaluation-commitments.d.ts +47 -0
- package/dist/evaluation-commitments.d.ts.map +1 -0
- package/dist/evaluation-commitments.js +96 -0
- package/dist/evaluation-commitments.js.map +1 -0
- package/dist/index.d.ts +6 -2
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +3 -1
- package/dist/index.js.map +1 -1
- package/dist/mcp/cli.d.ts +3 -0
- package/dist/mcp/cli.d.ts.map +1 -0
- package/dist/mcp/cli.js +36 -0
- package/dist/mcp/cli.js.map +1 -0
- package/dist/mcp/evaluation.d.ts +33 -0
- package/dist/mcp/evaluation.d.ts.map +1 -0
- package/dist/mcp/evaluation.js +141 -0
- package/dist/mcp/evaluation.js.map +1 -0
- package/dist/mcp/server.d.ts +27 -0
- package/dist/mcp/server.d.ts.map +1 -0
- package/dist/mcp/server.js +207 -0
- package/dist/mcp/server.js.map +1 -0
- package/dist/policy.d.ts.map +1 -1
- package/dist/policy.js +7 -2
- package/dist/policy.js.map +1 -1
- package/dist/service-fees.d.ts +15 -0
- package/dist/service-fees.d.ts.map +1 -0
- package/dist/service-fees.js +109 -0
- package/dist/service-fees.js.map +1 -0
- package/dist/types.d.ts +66 -2
- package/dist/types.d.ts.map +1 -1
- package/docs/ARCHITECTURE.md +31 -15
- package/docs/EXISTING_AGENT.md +123 -0
- package/docs/HERMES_BUYER.md +91 -0
- package/docs/HERMES_CHECKPOINTS.md +88 -0
- package/docs/HERMES_CUSTODY.md +164 -0
- package/docs/HERMES_MCP.md +157 -0
- package/docs/HERMES_PROVIDER.md +98 -0
- package/docs/RELEASE_0.8.0_RC1.md +60 -0
- package/docs/SERVICE_FEES.md +108 -0
- package/docs/TESTNET_QUICKSTART.md +123 -0
- package/docs/VALIDATION_AND_RELEASE.md +82 -0
- package/docs/WALLET_SIGNER_SETUP.md +52 -0
- package/examples/service-fees.ts +36 -0
- package/examples/testnet-journal.ts +57 -0
- package/examples/testnet-lifecycle.ts +188 -294
- package/examples/testnet.env.example +12 -14
- package/package.json +7 -1
|
@@ -0,0 +1,91 @@
|
|
|
1
|
+
/** Operator-owned QA authorization. Never constructed from an LLM tool argument. */
|
|
2
|
+
import { createHash } from "node:crypto";
|
|
3
|
+
import { parseProfile, QA_CONTRACTS } from "../mcp/server.js";
|
|
4
|
+
import { prepareEvaluationJob, prepareEvaluationSubmission } from "../evaluation-commitments.js";
|
|
5
|
+
export const GAS_PER_ACTION = 5000n;
|
|
6
|
+
export const ACTIONS = ["register", "create", "set-budget", "fund", "assign", "submit", "finalize"];
|
|
7
|
+
export function guard(ok) { if (!ok)
|
|
8
|
+
throw new Error("custody_guard_failed"); }
|
|
9
|
+
export function object(value, keys) {
|
|
10
|
+
guard(value && typeof value === "object" && !Array.isArray(value));
|
|
11
|
+
const r = value;
|
|
12
|
+
guard(Object.keys(r).length === keys.length && keys.every(k => Object.hasOwn(r, k)));
|
|
13
|
+
return r;
|
|
14
|
+
}
|
|
15
|
+
export function positive(value) {
|
|
16
|
+
guard(typeof value === "string" && /^[1-9][0-9]{0,38}$/.test(value));
|
|
17
|
+
const n = BigInt(value);
|
|
18
|
+
guard(n < 2n ** 128n);
|
|
19
|
+
return n;
|
|
20
|
+
}
|
|
21
|
+
export function hash(value) {
|
|
22
|
+
// Objects entering this function are reconstructed in a fixed field order.
|
|
23
|
+
return createHash("sha256").update(JSON.stringify(value)).digest("hex");
|
|
24
|
+
}
|
|
25
|
+
export function commitmentInput(p) {
|
|
26
|
+
return { network: "testnet", asset: p.asset,
|
|
27
|
+
contract: p.asset === "stx" ? QA_CONTRACTS.stxCommerce : QA_CONTRACTS.sbtcCommerce,
|
|
28
|
+
client: p.profile.client, evaluator: p.profile.evaluator,
|
|
29
|
+
description: p.description, acceptanceCriteria: p.acceptanceCriteria };
|
|
30
|
+
}
|
|
31
|
+
export async function parsePermit(value) {
|
|
32
|
+
const r = object(value, ["version", "id", "profile", "asset", "amount", "gasBudget", "expiresAt",
|
|
33
|
+
"expiredAt", "jobId", "description", "acceptanceCriteria", "agentName", "actions", "evidenceOrigins", "serviceFeeConsent"]);
|
|
34
|
+
guard(r.version === 1 && typeof r.id === "string" && /^[a-z0-9-]{1,64}$/.test(r.id));
|
|
35
|
+
const profile = parseProfile(r.profile);
|
|
36
|
+
guard(r.asset === "stx" || r.asset === "sbtc");
|
|
37
|
+
guard(positive(r.amount) <= (r.asset === "stx" ? 100000n : 1000n));
|
|
38
|
+
guard(positive(r.gasBudget) <= GAS_PER_ACTION * 7n);
|
|
39
|
+
positive(r.expiredAt);
|
|
40
|
+
guard(r.jobId === null || positive(r.jobId) > 0n);
|
|
41
|
+
guard(typeof r.expiresAt === "string" && /^\d{4}-\d\d-\d\dT\d\d:\d\d:\d\d\.000Z$/.test(r.expiresAt)
|
|
42
|
+
&& Number.isFinite(Date.parse(r.expiresAt)) && new Date(r.expiresAt).toISOString() === r.expiresAt);
|
|
43
|
+
guard(typeof r.description === "string" && typeof r.agentName === "string" && /^[\w -]{1,64}$/.test(r.agentName));
|
|
44
|
+
guard(r.serviceFeeConsent === "200bps-net-after-evaluation");
|
|
45
|
+
guard(Array.isArray(r.actions) && r.actions.length > 0 && new Set(r.actions).size === r.actions.length);
|
|
46
|
+
const allowed = profile.role === "client" ? ACTIONS.filter(a => a !== "submit") : ["register", "submit"];
|
|
47
|
+
guard(r.actions.every(a => allowed.includes(a)));
|
|
48
|
+
guard(profile.role !== "provider" || r.jobId !== null);
|
|
49
|
+
guard(r.jobId === null ? r.actions.includes("create") : !r.actions.includes("create"));
|
|
50
|
+
guard(Array.isArray(r.evidenceOrigins) && r.evidenceOrigins.length <= 5 && r.evidenceOrigins.every(o => {
|
|
51
|
+
if (typeof o !== "string")
|
|
52
|
+
return false;
|
|
53
|
+
const url = new URL(o);
|
|
54
|
+
return url.protocol === "https:" && url.origin === o && !url.username && !url.password;
|
|
55
|
+
}));
|
|
56
|
+
guard(Array.isArray(r.acceptanceCriteria));
|
|
57
|
+
const criteria = r.acceptanceCriteria.map(v => {
|
|
58
|
+
const c = object(v, ["id", "requirement", "verification"]);
|
|
59
|
+
guard([c.id, c.requirement, c.verification].every(v => typeof v === "string"));
|
|
60
|
+
return Object.freeze({ id: c.id, requirement: c.requirement, verification: c.verification });
|
|
61
|
+
});
|
|
62
|
+
const p = { version: 1, id: r.id, profile, asset: r.asset, amount: r.amount,
|
|
63
|
+
gasBudget: r.gasBudget, expiresAt: r.expiresAt, expiredAt: r.expiredAt,
|
|
64
|
+
jobId: r.jobId, description: r.description, acceptanceCriteria: Object.freeze(criteria),
|
|
65
|
+
agentName: r.agentName, actions: Object.freeze([...r.actions]),
|
|
66
|
+
evidenceOrigins: Object.freeze([...r.evidenceOrigins]), serviceFeeConsent: r.serviceFeeConsent };
|
|
67
|
+
await prepareEvaluationJob(commitmentInput(p));
|
|
68
|
+
return Object.freeze(p);
|
|
69
|
+
}
|
|
70
|
+
export async function parseExecution(value, p, jobId) {
|
|
71
|
+
guard(value && typeof value === "object");
|
|
72
|
+
const action = value.action;
|
|
73
|
+
const r = object(value, action === "submit" ? ["action", "evidence"] : ["action"]);
|
|
74
|
+
guard(p.actions.includes(r.action));
|
|
75
|
+
if (r.action !== "submit")
|
|
76
|
+
return { action: r.action };
|
|
77
|
+
guard(jobId && Array.isArray(r.evidence) && r.evidence.length > 0 && r.evidence.length <= 5);
|
|
78
|
+
let bytes = 0;
|
|
79
|
+
const evidence = r.evidence.map(item => {
|
|
80
|
+
const e = object(item, ["id", "uri", "sha256", "mediaType", "sizeBytes"]);
|
|
81
|
+
guard(typeof e.uri === "string" && p.evidenceOrigins.includes(new URL(e.uri).origin));
|
|
82
|
+
guard(e.mediaType === "text/plain" || e.mediaType === "application/json");
|
|
83
|
+
guard(Number.isSafeInteger(e.sizeBytes) && Number(e.sizeBytes) >= 0 && Number(e.sizeBytes) <= 8192);
|
|
84
|
+
bytes += Number(e.sizeBytes);
|
|
85
|
+
return { id: e.id, uri: e.uri, sha256: e.sha256, mediaType: e.mediaType, sizeBytes: e.sizeBytes };
|
|
86
|
+
});
|
|
87
|
+
guard(bytes <= 16000);
|
|
88
|
+
await prepareEvaluationSubmission({ ...commitmentInput(p), provider: p.profile.provider, jobId, evidence });
|
|
89
|
+
return { action: "submit", evidence };
|
|
90
|
+
}
|
|
91
|
+
//# sourceMappingURL=permit.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"permit.js","sourceRoot":"","sources":["../../src/custody/permit.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import { type Server } from "node:net";
|
|
2
|
+
import type { CustodyEngine } from "./engine.js";
|
|
3
|
+
import type { HermesProfile } from "../mcp/server.js";
|
|
4
|
+
export interface CustodyPort {
|
|
5
|
+
status(): Promise<unknown>;
|
|
6
|
+
execute(request: unknown): Promise<unknown>;
|
|
7
|
+
}
|
|
8
|
+
/** No TCP listener. Parent must be signer-owned, group-traversable but not group-writable. */
|
|
9
|
+
export declare function listenCustody(path: string, engine: CustodyEngine): Promise<Server>;
|
|
10
|
+
export declare function custodyPort(path: string, permitHash: string, profile: Readonly<HermesProfile>): CustodyPort;
|
|
11
|
+
//# sourceMappingURL=socket.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"socket.d.ts","sourceRoot":"","sources":["../../src/custody/socket.ts"],"names":[],"mappings":"AAAA,OAAO,EAAkC,KAAK,MAAM,EAAE,MAAM,UAAU,CAAC;AAIvE,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AACjD,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,kBAAkB,CAAC;AAEtD,MAAM,WAAW,WAAW;IAC1B,MAAM,IAAI,OAAO,CAAC,OAAO,CAAC,CAAC;IAC3B,OAAO,CAAC,OAAO,EAAE,OAAO,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC;CAC7C;AAKD,8FAA8F;AAC9F,wBAAsB,aAAa,CAAC,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,aAAa,GAAG,OAAO,CAAC,MAAM,CAAC,CAqCxF;AACD,wBAAgB,WAAW,CAAC,IAAI,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,EAAE,OAAO,EAAE,QAAQ,CAAC,aAAa,CAAC,GAAG,WAAW,CA4B3G"}
|
|
@@ -0,0 +1,118 @@
|
|
|
1
|
+
import { createServer, createConnection } from "node:net";
|
|
2
|
+
import { chmodSync, lstatSync, realpathSync } from "node:fs";
|
|
3
|
+
import { dirname, isAbsolute } from "node:path";
|
|
4
|
+
import { guard, object } from "./permit.js";
|
|
5
|
+
const MAX = 32768;
|
|
6
|
+
function pathGuard(path) {
|
|
7
|
+
guard(isAbsolute(path) && Buffer.byteLength(path) <= 100 && realpathSync(dirname(path)) === dirname(path));
|
|
8
|
+
}
|
|
9
|
+
/** No TCP listener. Parent must be signer-owned, group-traversable but not group-writable. */
|
|
10
|
+
export async function listenCustody(path, engine) {
|
|
11
|
+
pathGuard(path);
|
|
12
|
+
const parent = lstatSync(dirname(path));
|
|
13
|
+
guard(parent.isDirectory() && parent.uid === process.getuid?.() && (parent.mode & 0o777) === 0o710);
|
|
14
|
+
const server = createServer(socket => {
|
|
15
|
+
let bytes = Buffer.alloc(0), used = false;
|
|
16
|
+
socket.setTimeout(30000, () => socket.destroy());
|
|
17
|
+
socket.on("error", () => { });
|
|
18
|
+
socket.on("data", async (chunk) => {
|
|
19
|
+
if (used) {
|
|
20
|
+
socket.destroy();
|
|
21
|
+
return;
|
|
22
|
+
}
|
|
23
|
+
bytes = Buffer.concat([bytes, chunk]);
|
|
24
|
+
if (bytes.length > MAX) {
|
|
25
|
+
socket.destroy();
|
|
26
|
+
return;
|
|
27
|
+
}
|
|
28
|
+
if (!bytes.includes(10))
|
|
29
|
+
return;
|
|
30
|
+
used = true;
|
|
31
|
+
try {
|
|
32
|
+
guard(bytes.at(-1) === 10 && bytes.indexOf(10) === bytes.length - 1);
|
|
33
|
+
const input = JSON.parse(bytes.toString("utf8"));
|
|
34
|
+
const r = object(input, ["permitHash", "method", "request"]);
|
|
35
|
+
guard(r.permitHash === engine.status().permitHash);
|
|
36
|
+
let result;
|
|
37
|
+
if (r.method === "status") {
|
|
38
|
+
object(r.request, []);
|
|
39
|
+
result = await engine.reconcile();
|
|
40
|
+
}
|
|
41
|
+
else {
|
|
42
|
+
guard(r.method === "execute");
|
|
43
|
+
result = await engine.execute(r.request);
|
|
44
|
+
}
|
|
45
|
+
socket.end(JSON.stringify({ ok: true, result }) + "\n");
|
|
46
|
+
}
|
|
47
|
+
catch {
|
|
48
|
+
socket.end(JSON.stringify({ ok: false, error: "Reconcile custody status before retrying. An operation may already be signed or broadcast." }) + "\n");
|
|
49
|
+
}
|
|
50
|
+
});
|
|
51
|
+
});
|
|
52
|
+
server.maxConnections = 8;
|
|
53
|
+
await new Promise((resolve, reject) => {
|
|
54
|
+
const error = (e) => reject(e);
|
|
55
|
+
server.once("error", error);
|
|
56
|
+
server.listen(path, () => {
|
|
57
|
+
try {
|
|
58
|
+
chmodSync(path, 0o660);
|
|
59
|
+
server.off("error", error);
|
|
60
|
+
resolve();
|
|
61
|
+
}
|
|
62
|
+
catch (e) {
|
|
63
|
+
server.close();
|
|
64
|
+
reject(e);
|
|
65
|
+
}
|
|
66
|
+
});
|
|
67
|
+
});
|
|
68
|
+
return server;
|
|
69
|
+
}
|
|
70
|
+
export function custodyPort(path, permitHash, profile) {
|
|
71
|
+
pathGuard(path);
|
|
72
|
+
guard(/^[a-f0-9]{64}$/.test(permitHash));
|
|
73
|
+
async function call(method, request) {
|
|
74
|
+
const message = JSON.stringify({ permitHash, method, request }) + "\n";
|
|
75
|
+
guard(Buffer.byteLength(message) <= MAX);
|
|
76
|
+
const result = await new Promise((resolve, reject) => {
|
|
77
|
+
const socket = createConnection(path);
|
|
78
|
+
let bytes = Buffer.alloc(0), done = false;
|
|
79
|
+
const fail = () => { if (!done) {
|
|
80
|
+
done = true;
|
|
81
|
+
socket.destroy();
|
|
82
|
+
reject(new Error("custody_unavailable_reconcile"));
|
|
83
|
+
} };
|
|
84
|
+
socket.setTimeout(30000, fail);
|
|
85
|
+
socket.on("error", fail);
|
|
86
|
+
socket.on("end", () => { if (!done)
|
|
87
|
+
fail(); });
|
|
88
|
+
socket.on("connect", () => socket.write(message));
|
|
89
|
+
socket.on("data", chunk => {
|
|
90
|
+
bytes = Buffer.concat([bytes, chunk]);
|
|
91
|
+
if (bytes.length > MAX)
|
|
92
|
+
return fail();
|
|
93
|
+
if (!bytes.includes(10))
|
|
94
|
+
return;
|
|
95
|
+
try {
|
|
96
|
+
guard(bytes.at(-1) === 10 && bytes.indexOf(10) === bytes.length - 1);
|
|
97
|
+
const data = JSON.parse(bytes.toString("utf8"));
|
|
98
|
+
guard(data.ok === true && data.result);
|
|
99
|
+
done = true;
|
|
100
|
+
socket.destroy();
|
|
101
|
+
resolve(data.result);
|
|
102
|
+
}
|
|
103
|
+
catch {
|
|
104
|
+
fail();
|
|
105
|
+
}
|
|
106
|
+
});
|
|
107
|
+
});
|
|
108
|
+
const r = result;
|
|
109
|
+
guard(r.permitHash === permitHash && r.profile && Object.entries(profile).every(([k, v]) => r.profile[k] === v));
|
|
110
|
+
return result;
|
|
111
|
+
}
|
|
112
|
+
return { status: () => call("status", {}), execute: async (request) => {
|
|
113
|
+
// Verify role binding before sending a mutating request to the separate signer.
|
|
114
|
+
await call("status", {});
|
|
115
|
+
return call("execute", request);
|
|
116
|
+
} };
|
|
117
|
+
}
|
|
118
|
+
//# sourceMappingURL=socket.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"socket.js","sourceRoot":"","sources":["../../src/custody/socket.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Nayori commitment profile v1. Kept byte-identical in SDK and Evaluator.
|
|
3
|
+
* Only JSON primitives, lexicographic ASCII keys, ordered arrays and UTF-8.
|
|
4
|
+
* Hashes bind manifests; they do not prove evidence truth or authorize wallet spending.
|
|
5
|
+
*/
|
|
6
|
+
export interface EvaluationCriterion {
|
|
7
|
+
readonly id: string;
|
|
8
|
+
readonly requirement: string;
|
|
9
|
+
readonly verification: string;
|
|
10
|
+
}
|
|
11
|
+
export interface EvaluationEvidence {
|
|
12
|
+
readonly id: string;
|
|
13
|
+
readonly uri: string;
|
|
14
|
+
readonly sha256: string;
|
|
15
|
+
readonly mediaType: string;
|
|
16
|
+
readonly sizeBytes: number;
|
|
17
|
+
}
|
|
18
|
+
export interface CriteriaCommitmentInput {
|
|
19
|
+
readonly network: "testnet";
|
|
20
|
+
readonly asset: "stx" | "sbtc";
|
|
21
|
+
readonly contract: string;
|
|
22
|
+
readonly client: string;
|
|
23
|
+
readonly evaluator: string;
|
|
24
|
+
readonly description: string;
|
|
25
|
+
readonly acceptanceCriteria: readonly EvaluationCriterion[];
|
|
26
|
+
}
|
|
27
|
+
export interface EvidenceCommitmentInput extends CriteriaCommitmentInput {
|
|
28
|
+
readonly jobId: string;
|
|
29
|
+
readonly provider: string;
|
|
30
|
+
readonly evidence: readonly EvaluationEvidence[];
|
|
31
|
+
}
|
|
32
|
+
export declare function prepareEvaluationJob(input: CriteriaCommitmentInput): Promise<{
|
|
33
|
+
criteriaHash: string;
|
|
34
|
+
description: string;
|
|
35
|
+
}>;
|
|
36
|
+
export declare function parseEvaluationDescription(description: string): {
|
|
37
|
+
description: string;
|
|
38
|
+
criteriaHash: string;
|
|
39
|
+
};
|
|
40
|
+
export declare function prepareEvaluationSubmission(input: EvidenceCommitmentInput): Promise<{
|
|
41
|
+
evidenceHash: string;
|
|
42
|
+
deliverable: Uint8Array<ArrayBuffer>;
|
|
43
|
+
criteriaHash: string;
|
|
44
|
+
description: string;
|
|
45
|
+
}>;
|
|
46
|
+
export declare function evaluationJobId(input: Pick<EvidenceCommitmentInput, "network" | "contract" | "jobId">): Promise<string>;
|
|
47
|
+
//# sourceMappingURL=evaluation-commitments.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"evaluation-commitments.d.ts","sourceRoot":"","sources":["../src/evaluation-commitments.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AACH,MAAM,WAAW,mBAAmB;IAClC,QAAQ,CAAC,EAAE,EAAE,MAAM,CAAC;IACpB,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC;IAC7B,QAAQ,CAAC,YAAY,EAAE,MAAM,CAAC;CAC/B;AACD,MAAM,WAAW,kBAAkB;IACjC,QAAQ,CAAC,EAAE,EAAE,MAAM,CAAC;IACpB,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAC;IACrB,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;IAC3B,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;CAC5B;AACD,MAAM,WAAW,uBAAuB;IACtC,QAAQ,CAAC,OAAO,EAAE,SAAS,CAAC;IAC5B,QAAQ,CAAC,KAAK,EAAE,KAAK,GAAG,MAAM,CAAC;IAC/B,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;IAC1B,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;IAC3B,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC;IAC7B,QAAQ,CAAC,kBAAkB,EAAE,SAAS,mBAAmB,EAAE,CAAC;CAC7D;AACD,MAAM,WAAW,uBAAwB,SAAQ,uBAAuB;IACtE,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;IAC1B,QAAQ,CAAC,QAAQ,EAAE,SAAS,kBAAkB,EAAE,CAAC;CAClD;AA2CD,wBAAsB,oBAAoB,CAAC,KAAK,EAAE,uBAAuB;;;GAGxE;AACD,wBAAgB,0BAA0B,CAAC,WAAW,EAAE,MAAM;;;EAQ7D;AACD,wBAAsB,2BAA2B,CAAC,KAAK,EAAE,uBAAuB;;;;;GA0B/E;AACD,wBAAsB,eAAe,CAAC,KAAK,EAAE,IAAI,CAAC,uBAAuB,EAAE,SAAS,GAAG,UAAU,GAAG,OAAO,CAAC,GAAG,OAAO,CAAC,MAAM,CAAC,CAS7H"}
|
|
@@ -0,0 +1,96 @@
|
|
|
1
|
+
const CRITERIA = "\nnayori-criteria-v1:";
|
|
2
|
+
const EVIDENCE = "ny1:";
|
|
3
|
+
const HASH = /^[0-9a-f]{64}$/;
|
|
4
|
+
const PRINCIPAL = /^ST[A-Z0-9]{20,41}$/;
|
|
5
|
+
function ensure(condition) {
|
|
6
|
+
if (!condition)
|
|
7
|
+
throw new Error("invalid_evaluation_commitment");
|
|
8
|
+
}
|
|
9
|
+
function text(value, max) {
|
|
10
|
+
ensure(typeof value === "string" && value.length > 0 && value.length <= max);
|
|
11
|
+
// Reject lone surrogates instead of hashing lossy UTF-8 replacements.
|
|
12
|
+
ensure(!/[\uD800-\uDFFF]/u.test(value));
|
|
13
|
+
}
|
|
14
|
+
function canonical(value) {
|
|
15
|
+
if (Array.isArray(value))
|
|
16
|
+
return "[" + value.map(canonical).join(",") + "]";
|
|
17
|
+
if (value !== null && typeof value === "object") {
|
|
18
|
+
const record = value;
|
|
19
|
+
return "{" + Object.keys(record).sort().map(k => JSON.stringify(k) + ":" + canonical(record[k])).join(",") + "}";
|
|
20
|
+
}
|
|
21
|
+
return JSON.stringify(value);
|
|
22
|
+
}
|
|
23
|
+
async function digest(domain, value) {
|
|
24
|
+
const bytes = new TextEncoder().encode(domain + "\n" + canonical(value));
|
|
25
|
+
return Array.from(new Uint8Array(await globalThis.crypto.subtle.digest("SHA-256", bytes)), byte => byte.toString(16).padStart(2, "0")).join("");
|
|
26
|
+
}
|
|
27
|
+
function criteriaManifest(input) {
|
|
28
|
+
ensure(input.network === "testnet" && ["stx", "sbtc"].includes(input.asset));
|
|
29
|
+
ensure(/^ST[A-Z0-9]{20,41}\.[a-z][a-z0-9-]{0,39}$/.test(input.contract));
|
|
30
|
+
ensure(PRINCIPAL.test(input.client) && PRINCIPAL.test(input.evaluator) && input.client !== input.evaluator);
|
|
31
|
+
text(input.description, 512 - CRITERIA.length - 64);
|
|
32
|
+
ensure(/^[\x20-\x7e\n\r\t]+$/.test(input.description) && !input.description.includes("nayori-criteria-"));
|
|
33
|
+
ensure(Array.isArray(input.acceptanceCriteria) && input.acceptanceCriteria.length >= 1 && input.acceptanceCriteria.length <= 20);
|
|
34
|
+
const acceptanceCriteria = input.acceptanceCriteria.map(item => {
|
|
35
|
+
text(item.id, 64);
|
|
36
|
+
ensure(/^[a-zA-Z0-9._-]+$/.test(item.id));
|
|
37
|
+
text(item.requirement, 1024);
|
|
38
|
+
text(item.verification, 1024);
|
|
39
|
+
return { id: item.id, requirement: item.requirement, verification: item.verification };
|
|
40
|
+
});
|
|
41
|
+
ensure(new Set(acceptanceCriteria.map(item => item.id)).size === acceptanceCriteria.length);
|
|
42
|
+
return { schemaVersion: "1", network: input.network, asset: input.asset, contract: input.contract,
|
|
43
|
+
client: input.client, evaluator: input.evaluator, description: input.description, acceptanceCriteria };
|
|
44
|
+
}
|
|
45
|
+
export async function prepareEvaluationJob(input) {
|
|
46
|
+
const criteriaHash = await digest("nayori/criteria/v1", criteriaManifest(input));
|
|
47
|
+
return { criteriaHash, description: input.description + CRITERIA + criteriaHash };
|
|
48
|
+
}
|
|
49
|
+
export function parseEvaluationDescription(description) {
|
|
50
|
+
text(description, 512);
|
|
51
|
+
const index = description.lastIndexOf(CRITERIA);
|
|
52
|
+
ensure(index > 0);
|
|
53
|
+
const plainDescription = description.slice(0, index);
|
|
54
|
+
const criteriaHash = description.slice(index + CRITERIA.length);
|
|
55
|
+
ensure(HASH.test(criteriaHash) && !plainDescription.includes("nayori-criteria-"));
|
|
56
|
+
return { description: plainDescription, criteriaHash };
|
|
57
|
+
}
|
|
58
|
+
export async function prepareEvaluationSubmission(input) {
|
|
59
|
+
const criteria = await prepareEvaluationJob(input);
|
|
60
|
+
ensure(/^[1-9][0-9]{0,38}$/.test(input.jobId) && BigInt(input.jobId) < 2n ** 128n);
|
|
61
|
+
ensure(PRINCIPAL.test(input.provider) && ![input.client, input.evaluator].includes(input.provider));
|
|
62
|
+
ensure(Array.isArray(input.evidence) && input.evidence.length >= 1 && input.evidence.length <= 50);
|
|
63
|
+
const evidence = input.evidence.map(item => {
|
|
64
|
+
text(item.id, 64);
|
|
65
|
+
ensure(/^[a-zA-Z0-9._-]+$/.test(item.id));
|
|
66
|
+
text(item.uri, 2048);
|
|
67
|
+
const uri = new URL(item.uri);
|
|
68
|
+
ensure(uri.protocol === "https:" && !uri.username && !uri.password && !uri.hash);
|
|
69
|
+
ensure(HASH.test(item.sha256) && !/^0+$/.test(item.sha256));
|
|
70
|
+
text(item.mediaType, 128);
|
|
71
|
+
ensure(Number.isSafeInteger(item.sizeBytes) && item.sizeBytes >= 0 && item.sizeBytes <= 25_000_000);
|
|
72
|
+
return { id: item.id, uri: item.uri, sha256: item.sha256, mediaType: item.mediaType, sizeBytes: item.sizeBytes };
|
|
73
|
+
});
|
|
74
|
+
ensure(new Set(evidence.map(item => item.id)).size === evidence.length);
|
|
75
|
+
const evidenceHash = await digest("nayori/evidence/v1", {
|
|
76
|
+
schemaVersion: "1", network: input.network, asset: input.asset, contract: input.contract,
|
|
77
|
+
jobId: input.jobId, client: input.client, provider: input.provider, evaluator: input.evaluator,
|
|
78
|
+
criteriaHash: criteria.criteriaHash, evidence,
|
|
79
|
+
});
|
|
80
|
+
// Existing submit-work ABI is (buff 64): four ASCII version bytes + 32 raw digest bytes.
|
|
81
|
+
const deliverable = new Uint8Array(36);
|
|
82
|
+
deliverable.set(new TextEncoder().encode(EVIDENCE));
|
|
83
|
+
deliverable.set(Uint8Array.from(evidenceHash.match(/../g), pair => parseInt(pair, 16)), 4);
|
|
84
|
+
return { ...criteria, evidenceHash, deliverable };
|
|
85
|
+
}
|
|
86
|
+
export async function evaluationJobId(input) {
|
|
87
|
+
ensure(input.network === "testnet" && /^ST[A-Z0-9]{20,41}\.[a-z][a-z0-9-]{0,39}$/.test(input.contract));
|
|
88
|
+
ensure(/^[1-9][0-9]{0,38}$/.test(input.jobId) && BigInt(input.jobId) < 2n ** 128n);
|
|
89
|
+
const hash = await digest("nayori/evaluation-id/v1", {
|
|
90
|
+
network: input.network, contract: input.contract, jobId: input.jobId,
|
|
91
|
+
});
|
|
92
|
+
// Deterministic UUID-shaped identifier, not a credential.
|
|
93
|
+
return hash.slice(0, 8) + "-" + hash.slice(8, 12) + "-5" + hash.slice(13, 16) +
|
|
94
|
+
"-a" + hash.slice(17, 20) + "-" + hash.slice(20, 32);
|
|
95
|
+
}
|
|
96
|
+
//# sourceMappingURL=evaluation-commitments.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"evaluation-commitments.js","sourceRoot":"","sources":["../src/evaluation-commitments.ts"],"names":[],"mappings":"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"}
|
package/dist/index.d.ts
CHANGED
|
@@ -1,11 +1,15 @@
|
|
|
1
1
|
export { PerkOSClient } from "./client.js";
|
|
2
|
+
export { prepareEvaluationJob, prepareEvaluationSubmission, parseEvaluationDescription, evaluationJobId } from "./evaluation-commitments.js";
|
|
3
|
+
export type { EvaluationCriterion, EvaluationEvidence, CriteriaCommitmentInput, EvidenceCommitmentInput } from "./evaluation-commitments.js";
|
|
4
|
+
export { SERVICE_FEE_BASIS_POINTS, quoteServiceFee, supportsServiceFees, } from "./service-fees.js";
|
|
5
|
+
export type { ServiceFeeAcceptance, ServiceFeeSplit, ServiceFeePolicy, ServiceFeeSettlement, JobServiceFeeRecord, InitializeServiceFeeProtocolInput, WaiveServiceFeeInput, WaiveServiceFeePlanInput, RefundServiceFeePlanInput, } from "./types.js";
|
|
2
6
|
export { PerkOSTransactionBuilder } from "./builders.js";
|
|
3
7
|
export { SpendingPolicy } from "./policy.js";
|
|
4
8
|
export { HeadlessSigner, StacksConnectSigner } from "./signers.js";
|
|
5
9
|
export { TransactionTracker } from "./tracker.js";
|
|
6
10
|
export { PerkOSError } from "./errors.js";
|
|
7
11
|
export { NAYORI_PARTNER_SCOPES, NayoriPartnerApiError, NayoriPartnerClient, createStacksConnectPartnerSigner, } from "./partner.js";
|
|
8
|
-
export { DEFAULT_DEPLOYMENTS, JOB_STATUS, CLARITY_ERROR_MESSAGES } from "./constants.js";
|
|
12
|
+
export { DEFAULT_DEPLOYMENTS, JOB_STATUS, CLARITY_ERROR_MESSAGES, } from "./constants.js";
|
|
9
13
|
export { resolveConfig, toHash32, toUint } from "./validation.js";
|
|
10
14
|
export { normalizeTxid } from "./txid.js";
|
|
11
15
|
export { PERKOS_X402_ASSET_TRANSFER_METHOD, PERKOS_X402_PAYMENT_FLOW, PERKOS_X402_SCHEME, PerkOSX402SchemeClient, STACKS_X402_NETWORKS, X402_VERSION, createPerkOSX402PaymentRequired, decodePaymentRequiredHeader, decodePaymentResponseHeader, decodePaymentSignatureHeader, encodePaymentRequiredHeader, encodePaymentResponseHeader, encodePaymentSignatureHeader, fromStacksX402Network, parsePerkOSX402PaymentPayload, parsePerkOSX402Requirement, toStacksX402Network, } from "./x402.js";
|
|
@@ -14,7 +18,7 @@ export { NAYORI_X402_DIRECT_ASSETS, NAYORI_X402_DIRECT_ASSET_TRANSFER_METHOD, NA
|
|
|
14
18
|
export { LeatherSigner, NAYORI_X402_PAYMENT_INTENT_PREFIX, NAYORI_X402_PAYMENT_INTENT_VERSION, NayoriX402PaymentClient, NayoriX402PaymentPolicy, PolicySigner, buildNayoriX402UnsignedPaymentTransaction, createNayoriX402PaymentIntent, } from "./x402-paying.js";
|
|
15
19
|
export { MPP_PAYMENT_SCHEME, NAYORI_MPP_CREDENTIAL_HEADER, NAYORI_MPP_INTENT, NAYORI_MPP_METHOD, NAYORI_MPP_PROFILE, NAYORI_MPP_TRANSACTION_FORMAT, NayoriMppVerificationError, buildNayoriMppUnsignedPaymentTransaction, canonicalizeNayoriMppJson, createNayoriMppUsdcStacksChallenge, createNayoriMppUsdcStacksCredential, createNayoriMppUsdcStacksReceipt, decodeNayoriMppChallengeHeader, decodeNayoriMppCredentialHeader, decodeNayoriMppJson, decodeNayoriMppReceiptHeader, decodeNayoriMppUsdcStacksRequest, encodeNayoriMppChallengeHeader, encodeNayoriMppCredentialHeader, encodeNayoriMppJson, encodeNayoriMppReceiptHeader, nayoriMppStacksReplayKey, verifyNayoriMppUsdcStacksPayment, } from "./mpp.js";
|
|
16
20
|
export type { HeadlessSignerOptions, HeadlessTransactionExecutor, HeadlessTransactionRequest, PrivateKeyMaterial, PrivateKeyProvider, StacksConnectContractCallParams, StacksConnectRequest, StacksConnectSignerOptions, } from "./signers.js";
|
|
17
|
-
export type { TrackerFetch, TransactionTrackerOptions
|
|
21
|
+
export type { TrackerFetch, TransactionTrackerOptions } from "./tracker.js";
|
|
18
22
|
export type { AgentEndpoint, AgentRecord, AppealDecisionInput, Amount, AmountLike, AssignProviderInput, ConfirmationOptions, ConfirmedTransactionReceipt, ContractCallPlan, ContractId, CreateJobInput, DecisionRecord, DecisionSettlementInput, FundJobInput, Hash32Input, JobAmountInput, JobDecision, JobRecord, JobStatus, PaymentAsset, PerkOSConfig, PerkOSContracts, PerkOSNetwork, PerkOSOperation, PerkOSSigner, RateProviderInput, ReadOnlyCall, ReadOnlyTransport, RecordDecisionInput, RegisterAgentInput, ReputationRecord, ReputationSyncRecord, ResolvedPerkOSConfig, ResolveAppealInput, ResolveAppealPlanInput, SettleJobInput, SignerResult, SpendingApproval, SpendingPolicyInput, SubmitWorkInput, TransactionIntent, TransactionConfirmation, TransactionConfirmationStatus, TransactionReceipt, TransactionResultValue, TransactionTrackerLike, UpdateAgentInput, } from "./types.js";
|
|
19
23
|
export type { PerkOSErrorCode, PerkOSErrorDetails } from "./errors.js";
|
|
20
24
|
export type { NayoriPartnerAccessToken, NayoriPartnerChallenge, NayoriPartnerCredentials, NayoriPartnerFetch, NayoriPartnerMessageSignature, NayoriPartnerMessageSigner, NayoriPartnerNetwork, NayoriPartnerScope, StacksConnectMessageRequest, } from "./partner.js";
|
package/dist/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAC3C,OAAO,EAAE,wBAAwB,EAAE,MAAM,eAAe,CAAC;AACzD,OAAO,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC;AAC7C,OAAO,EAAE,cAAc,EAAE,mBAAmB,EAAE,MAAM,cAAc,CAAC;AACnE,OAAO,EAAE,kBAAkB,EAAE,MAAM,cAAc,CAAC;AAClD,OAAO,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAC1C,OAAO,EACL,qBAAqB,EACrB,qBAAqB,EACrB,mBAAmB,EACnB,gCAAgC,GACjC,MAAM,cAAc,CAAC;AACtB,OAAO,
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
|
package/dist/index.js
CHANGED
|
@@ -1,11 +1,13 @@
|
|
|
1
1
|
export { PerkOSClient } from "./client.js";
|
|
2
|
+
export { prepareEvaluationJob, prepareEvaluationSubmission, parseEvaluationDescription, evaluationJobId } from "./evaluation-commitments.js";
|
|
3
|
+
export { SERVICE_FEE_BASIS_POINTS, quoteServiceFee, supportsServiceFees, } from "./service-fees.js";
|
|
2
4
|
export { PerkOSTransactionBuilder } from "./builders.js";
|
|
3
5
|
export { SpendingPolicy } from "./policy.js";
|
|
4
6
|
export { HeadlessSigner, StacksConnectSigner } from "./signers.js";
|
|
5
7
|
export { TransactionTracker } from "./tracker.js";
|
|
6
8
|
export { PerkOSError } from "./errors.js";
|
|
7
9
|
export { NAYORI_PARTNER_SCOPES, NayoriPartnerApiError, NayoriPartnerClient, createStacksConnectPartnerSigner, } from "./partner.js";
|
|
8
|
-
export { DEFAULT_DEPLOYMENTS, JOB_STATUS, CLARITY_ERROR_MESSAGES } from "./constants.js";
|
|
10
|
+
export { DEFAULT_DEPLOYMENTS, JOB_STATUS, CLARITY_ERROR_MESSAGES, } from "./constants.js";
|
|
9
11
|
export { resolveConfig, toHash32, toUint } from "./validation.js";
|
|
10
12
|
export { normalizeTxid } from "./txid.js";
|
|
11
13
|
export { PERKOS_X402_ASSET_TRANSFER_METHOD, PERKOS_X402_PAYMENT_FLOW, PERKOS_X402_SCHEME, PerkOSX402SchemeClient, STACKS_X402_NETWORKS, X402_VERSION, createPerkOSX402PaymentRequired, decodePaymentRequiredHeader, decodePaymentResponseHeader, decodePaymentSignatureHeader, encodePaymentRequiredHeader, encodePaymentResponseHeader, encodePaymentSignatureHeader, fromStacksX402Network, parsePerkOSX402PaymentPayload, parsePerkOSX402Requirement, toStacksX402Network, } from "./x402.js";
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAC3C,OAAO,EAAE,wBAAwB,EAAE,MAAM,eAAe,CAAC;AACzD,OAAO,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC;AAC7C,OAAO,EAAE,cAAc,EAAE,mBAAmB,EAAE,MAAM,cAAc,CAAC;AACnE,OAAO,EAAE,kBAAkB,EAAE,MAAM,cAAc,CAAC;AAClD,OAAO,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAC1C,OAAO,EACL,qBAAqB,EACrB,qBAAqB,EACrB,mBAAmB,EACnB,gCAAgC,GACjC,MAAM,cAAc,CAAC;AACtB,OAAO,
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAC3C,OAAO,EAAE,oBAAoB,EAAE,2BAA2B,EAAE,0BAA0B,EAAE,eAAe,EAAE,MAAM,6BAA6B,CAAC;AAE7I,OAAO,EACL,wBAAwB,EACxB,eAAe,EACf,mBAAmB,GACpB,MAAM,mBAAmB,CAAC;AAY3B,OAAO,EAAE,wBAAwB,EAAE,MAAM,eAAe,CAAC;AACzD,OAAO,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC;AAC7C,OAAO,EAAE,cAAc,EAAE,mBAAmB,EAAE,MAAM,cAAc,CAAC;AACnE,OAAO,EAAE,kBAAkB,EAAE,MAAM,cAAc,CAAC;AAClD,OAAO,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAC1C,OAAO,EACL,qBAAqB,EACrB,qBAAqB,EACrB,mBAAmB,EACnB,gCAAgC,GACjC,MAAM,cAAc,CAAC;AACtB,OAAO,EACL,mBAAmB,EACnB,UAAU,EACV,sBAAsB,GACvB,MAAM,gBAAgB,CAAC;AACxB,OAAO,EAAE,aAAa,EAAE,QAAQ,EAAE,MAAM,EAAE,MAAM,iBAAiB,CAAC;AAClE,OAAO,EAAE,aAAa,EAAE,MAAM,WAAW,CAAC;AAC1C,OAAO,EACL,iCAAiC,EACjC,wBAAwB,EACxB,kBAAkB,EAClB,sBAAsB,EACtB,oBAAoB,EACpB,YAAY,EACZ,+BAA+B,EAC/B,2BAA2B,EAC3B,2BAA2B,EAC3B,4BAA4B,EAC5B,2BAA2B,EAC3B,2BAA2B,EAC3B,4BAA4B,EAC5B,qBAAqB,EACrB,6BAA6B,EAC7B,0BAA0B,EAC1B,mBAAmB,GACpB,MAAM,WAAW,CAAC;AACnB,OAAO,EACL,yBAAyB,EACzB,uBAAuB,EACvB,qBAAqB,EACrB,2BAA2B,EAC3B,mBAAmB,GACpB,MAAM,uBAAuB,CAAC;AAC/B,OAAO,EACL,yBAAyB,EACzB,wCAAwC,EACxC,+BAA+B,EAC/B,oCAAoC,EACpC,yBAAyB,EACzB,iCAAiC,EACjC,2BAA2B,EAC3B,iCAAiC,EACjC,oCAAoC,EACpC,mCAAmC,EACnC,qBAAqB,EACrB,gCAAgC,EAChC,kBAAkB,EAClB,yBAAyB,EACzB,6BAA6B,EAC7B,gCAAgC,GACjC,MAAM,kBAAkB,CAAC;AAC1B,OAAO,EACL,aAAa,EACb,iCAAiC,EACjC,kCAAkC,EAClC,uBAAuB,EACvB,uBAAuB,EACvB,YAAY,EACZ,yCAAyC,EACzC,6BAA6B,GAC9B,MAAM,kBAAkB,CAAC;AAC1B,OAAO,EACL,kBAAkB,EAClB,4BAA4B,EAC5B,iBAAiB,EACjB,iBAAiB,EACjB,kBAAkB,EAClB,6BAA6B,EAC7B,0BAA0B,EAC1B,wCAAwC,EACxC,yBAAyB,EACzB,kCAAkC,EAClC,mCAAmC,EACnC,gCAAgC,EAChC,8BAA8B,EAC9B,+BAA+B,EAC/B,mBAAmB,EACnB,4BAA4B,EAC5B,gCAAgC,EAChC,8BAA8B,EAC9B,+BAA+B,EAC/B,mBAAmB,EACnB,4BAA4B,EAC5B,wBAAwB,EACxB,gCAAgC,GACjC,MAAM,UAAU,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cli.d.ts","sourceRoot":"","sources":["../../src/mcp/cli.ts"],"names":[],"mappings":""}
|
package/dist/mcp/cli.js
ADDED
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
import { constants, openSync, closeSync, fstatSync, readFileSync } from "node:fs";
|
|
3
|
+
import { isAbsolute } from "node:path";
|
|
4
|
+
import { StdioServerTransport } from "@modelcontextprotocol/sdk/server/stdio.js";
|
|
5
|
+
import { createHermesMcp, parseProfile } from "./server.js";
|
|
6
|
+
import { custodyPort } from "../custody/socket.js";
|
|
7
|
+
async function main() {
|
|
8
|
+
const args = process.argv.slice(2);
|
|
9
|
+
if (args.length === 1 && args[0] === "--help") {
|
|
10
|
+
console.log("nayori-mcp --config /absolute/public-profile.json [--custody-socket /ipc/nayori.sock --permit-hash SHA256 [--enable-qa-evaluation]]\nDefault: QA read/prepare only. Evaluation requires provider custody. Never provide private keys to MCP.");
|
|
11
|
+
return;
|
|
12
|
+
}
|
|
13
|
+
const enableEvaluation = args.at(-1) === "--enable-qa-evaluation";
|
|
14
|
+
if (enableEvaluation)
|
|
15
|
+
args.pop();
|
|
16
|
+
if (![2, 6].includes(args.length) || args[0] !== "--config" || !isAbsolute(args[1]) ||
|
|
17
|
+
args.length === 6 && (args[2] !== "--custody-socket" || args[4] !== "--permit-hash"))
|
|
18
|
+
throw new Error("config_required");
|
|
19
|
+
const fd = openSync(args[1], constants.O_RDONLY | constants.O_NOFOLLOW);
|
|
20
|
+
let profile;
|
|
21
|
+
try {
|
|
22
|
+
const s = fstatSync(fd);
|
|
23
|
+
if (!s.isFile() || s.size > 4096)
|
|
24
|
+
throw new Error("invalid_profile");
|
|
25
|
+
profile = JSON.parse(readFileSync(fd, "utf8"));
|
|
26
|
+
}
|
|
27
|
+
finally {
|
|
28
|
+
closeSync(fd);
|
|
29
|
+
}
|
|
30
|
+
const parsed = parseProfile(profile);
|
|
31
|
+
const custody = args.length === 6 ? custodyPort(args[3], args[5], parsed) : undefined;
|
|
32
|
+
const server = createHermesMcp(parsed, undefined, custody, enableEvaluation);
|
|
33
|
+
await server.connect(new StdioServerTransport());
|
|
34
|
+
}
|
|
35
|
+
main().catch(() => { console.error("Nayori MCP could not start. Supply a valid public QA profile; never include private keys."); process.exitCode = 1; });
|
|
36
|
+
//# sourceMappingURL=cli.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cli.js","sourceRoot":"","sources":["../../src/mcp/cli.ts"],"names":[],"mappings":";AACA,OAAO,EAAE,SAAS,EAAE,QAAQ,EAAE,SAAS,EAAE,SAAS,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AAClF,OAAO,EAAE,UAAU,EAAE,MAAM,WAAW,CAAC;AACvC,OAAO,EAAE,oBAAoB,EAAE,MAAM,2CAA2C,CAAC;AACjF,OAAO,EAAE,eAAe,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAC5D,OAAO,EAAE,WAAW,EAAE,MAAM,sBAAsB,CAAC;AAEnD,KAAK,UAAU,IAAI;IACjB,MAAM,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;IACnC,IAAI,IAAI,CAAC,MAAM,KAAK,CAAC,IAAI,IAAI,CAAC,CAAC,CAAC,KAAK,QAAQ,EAAE,CAAC;QAC9C,OAAO,CAAC,GAAG,CAAC,8OAA8O,CAAC,CAAC;QAAC,OAAO;IACtQ,CAAC;IACD,MAAM,gBAAgB,GAAG,IAAI,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,KAAK,wBAAwB,CAAC;IAClE,IAAI,gBAAgB;QAAE,IAAI,CAAC,GAAG,EAAE,CAAC;IACjC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,QAAQ,CAAC,IAAI,CAAC,MAAM,CAAC,IAAI,IAAI,CAAC,CAAC,CAAC,KAAK,UAAU,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC,CAAE,CAAC;QAClF,IAAI,CAAC,MAAM,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,KAAK,kBAAkB,IAAI,IAAI,CAAC,CAAC,CAAC,KAAK,eAAe,CAAC;QAAE,MAAM,IAAI,KAAK,CAAC,iBAAiB,CAAC,CAAC;IAC3H,MAAM,EAAE,GAAG,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAE,EAAE,SAAS,CAAC,QAAQ,GAAG,SAAS,CAAC,UAAU,CAAC,CAAC;IACzE,IAAI,OAAgB,CAAC;IACrB,IAAI,CAAC;QACH,MAAM,CAAC,GAAG,SAAS,CAAC,EAAE,CAAC,CAAC;QACxB,IAAI,CAAC,CAAC,CAAC,MAAM,EAAE,IAAI,CAAC,CAAC,IAAI,GAAG,IAAI;YAAE,MAAM,IAAI,KAAK,CAAC,iBAAiB,CAAC,CAAC;QACrE,OAAO,GAAG,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC,EAAE,EAAE,MAAM,CAAC,CAAC,CAAC;IACjD,CAAC;YAAS,CAAC;QAAC,SAAS,CAAC,EAAE,CAAC,CAAC;IAAC,CAAC;IAC5B,MAAM,MAAM,GAAG,YAAY,CAAC,OAAO,CAAC,CAAC;IACrC,MAAM,OAAO,GAAG,IAAI,CAAC,MAAM,KAAK,CAAC,CAAC,CAAC,CAAC,WAAW,CAAC,IAAI,CAAC,CAAC,CAAE,EAAE,IAAI,CAAC,CAAC,CAAE,EAAE,MAAM,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;IACxF,MAAM,MAAM,GAAG,eAAe,CAAC,MAAM,EAAE,SAAS,EAAE,OAAO,EAAE,gBAAgB,CAAC,CAAC;IAC7E,MAAM,MAAM,CAAC,OAAO,CAAC,IAAI,oBAAoB,EAAE,CAAC,CAAC;AACnD,CAAC;AACD,IAAI,EAAE,CAAC,KAAK,CAAC,GAAG,EAAE,GAAG,OAAO,CAAC,KAAK,CAAC,2FAA2F,CAAC,CAAC,CAAC,OAAO,CAAC,QAAQ,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC"}
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
/** Optional public QA admission. Never holds evaluator credentials or wallet keys. */
|
|
2
|
+
import { type EvaluationCriterion, type EvaluationEvidence } from "../evaluation-commitments.js";
|
|
3
|
+
import type { PerkOSClient } from "../client.js";
|
|
4
|
+
import type { CustodyPort } from "../custody/socket.js";
|
|
5
|
+
import type { HermesProfile } from "./server.js";
|
|
6
|
+
export declare const QA_EVALUATOR = "https://evaluator.qa.nayori.ai";
|
|
7
|
+
declare const SAFE_ERRORS: {
|
|
8
|
+
readonly admission_limit: "QA evaluation quota reached. Ask the operator to review capacity; do not automatically retry or change budgets.";
|
|
9
|
+
readonly ineligible: "QA evaluation is not eligible. Check the on-chain job, commitments and review deadline before taking another action.";
|
|
10
|
+
readonly unavailable: "QA evaluator is unavailable. Query evaluation status before any retry; admission may be uncertain.";
|
|
11
|
+
readonly transport: "QA evaluation transport failed or timed out. Query the deterministic evaluation status before any retry; do not repeat a signed operation.";
|
|
12
|
+
};
|
|
13
|
+
export declare class QaEvaluationError extends Error {
|
|
14
|
+
readonly code: keyof typeof SAFE_ERRORS;
|
|
15
|
+
constructor(code: keyof typeof SAFE_ERRORS);
|
|
16
|
+
}
|
|
17
|
+
export interface EvaluationInput {
|
|
18
|
+
asset: "stx" | "sbtc";
|
|
19
|
+
jobId: string;
|
|
20
|
+
description: string;
|
|
21
|
+
acceptanceCriteria: EvaluationCriterion[];
|
|
22
|
+
evidence: EvaluationEvidence[];
|
|
23
|
+
}
|
|
24
|
+
export interface EvaluationPort {
|
|
25
|
+
request(input: EvaluationInput): Promise<unknown>;
|
|
26
|
+
status(asset: "stx" | "sbtc", jobId: string): Promise<unknown>;
|
|
27
|
+
}
|
|
28
|
+
export declare function qaEvaluation(profile: Readonly<HermesProfile>, custody: CustodyPort, reader: Pick<PerkOSClient, "getJob" | "getEscrowBalance">, contracts: {
|
|
29
|
+
stxCommerce: string;
|
|
30
|
+
sbtcCommerce: string;
|
|
31
|
+
}, fetchImpl?: typeof fetch): EvaluationPort;
|
|
32
|
+
export {};
|
|
33
|
+
//# sourceMappingURL=evaluation.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"evaluation.d.ts","sourceRoot":"","sources":["../../src/mcp/evaluation.ts"],"names":[],"mappings":"AAAA,sFAAsF;AACtF,OAAO,EACL,KAAK,mBAAmB,EAAE,KAAK,kBAAkB,EAAE,MAAM,8BAA8B,CAAC;AAC1F,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,cAAc,CAAC;AACjD,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,sBAAsB,CAAC;AACxD,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAEjD,eAAO,MAAM,YAAY,mCAAmC,CAAC;AAK7D,QAAA,MAAM,WAAW;;;;;CAKP,CAAC;AACX,qBAAa,iBAAkB,SAAQ,KAAK;IAC9B,QAAQ,CAAC,IAAI,EAAE,MAAM,OAAO,WAAW;gBAA9B,IAAI,EAAE,MAAM,OAAO,WAAW;CACpD;AAED,MAAM,WAAW,eAAe;IAC9B,KAAK,EAAE,KAAK,GAAG,MAAM,CAAC;IAAC,KAAK,EAAE,MAAM,CAAC;IAAC,WAAW,EAAE,MAAM,CAAC;IAC1D,kBAAkB,EAAE,mBAAmB,EAAE,CAAC;IAAC,QAAQ,EAAE,kBAAkB,EAAE,CAAC;CAC3E;AACD,MAAM,WAAW,cAAc;IAC7B,OAAO,CAAC,KAAK,EAAE,eAAe,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC;IAClD,MAAM,CAAC,KAAK,EAAE,KAAK,GAAG,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC;CAChE;AACD,wBAAgB,YAAY,CAAC,OAAO,EAAE,QAAQ,CAAC,aAAa,CAAC,EAAE,OAAO,EAAE,WAAW,EACjF,MAAM,EAAE,IAAI,CAAC,YAAY,EAAE,QAAQ,GAAG,kBAAkB,CAAC,EACzD,SAAS,EAAE;IAAE,WAAW,EAAE,MAAM,CAAC;IAAC,YAAY,EAAE,MAAM,CAAA;CAAE,EACxD,SAAS,GAAE,OAAO,KAAyC,GAAG,cAAc,CA4F7E"}
|