pyyol 1.2.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 +21 -0
- package/README.md +267 -0
- package/dist/adapter.d.ts +24 -0
- package/dist/adapter.d.ts.map +1 -0
- package/dist/adapter.js +68 -0
- package/dist/adapter.js.map +1 -0
- package/dist/cli.d.ts +20 -0
- package/dist/cli.d.ts.map +1 -0
- package/dist/cli.js +1325 -0
- package/dist/cli.js.map +1 -0
- package/dist/config.d.ts +28 -0
- package/dist/config.d.ts.map +1 -0
- package/dist/config.js +160 -0
- package/dist/config.js.map +1 -0
- package/dist/credentials.d.ts +13 -0
- package/dist/credentials.d.ts.map +1 -0
- package/dist/credentials.js +175 -0
- package/dist/credentials.js.map +1 -0
- package/dist/index.d.ts +26 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +21 -0
- package/dist/index.js.map +1 -0
- package/dist/login.d.ts +16 -0
- package/dist/login.d.ts.map +1 -0
- package/dist/login.js +107 -0
- package/dist/login.js.map +1 -0
- package/dist/mode.d.ts +12 -0
- package/dist/mode.d.ts.map +1 -0
- package/dist/mode.js +55 -0
- package/dist/mode.js.map +1 -0
- package/dist/models.d.ts +105 -0
- package/dist/models.d.ts.map +1 -0
- package/dist/models.js +68 -0
- package/dist/models.js.map +1 -0
- package/dist/rules.d.ts +4 -0
- package/dist/rules.d.ts.map +1 -0
- package/dist/rules.js +26 -0
- package/dist/rules.js.map +1 -0
- package/dist/runtime.d.ts +97 -0
- package/dist/runtime.d.ts.map +1 -0
- package/dist/runtime.js +372 -0
- package/dist/runtime.js.map +1 -0
- package/dist/server.d.ts +75 -0
- package/dist/server.d.ts.map +1 -0
- package/dist/server.js +174 -0
- package/dist/server.js.map +1 -0
- package/dist/signing.d.ts +42 -0
- package/dist/signing.d.ts.map +1 -0
- package/dist/signing.js +115 -0
- package/dist/signing.js.map +1 -0
- package/dist/simulator.d.ts +38 -0
- package/dist/simulator.d.ts.map +1 -0
- package/dist/simulator.js +109 -0
- package/dist/simulator.js.map +1 -0
- package/dist/telemetry.d.ts +81 -0
- package/dist/telemetry.d.ts.map +1 -0
- package/dist/telemetry.js +225 -0
- package/dist/telemetry.js.map +1 -0
- package/dist/version.d.ts +2 -0
- package/dist/version.d.ts.map +1 -0
- package/dist/version.js +4 -0
- package/dist/version.js.map +1 -0
- package/package.json +62 -0
- package/rules/games.md +349 -0
- package/rules/llms-full.txt +985 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"server.js","sourceRoot":"","sources":["../src/server.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
export declare const SIGNATURE_VERSION = "v1";
|
|
2
|
+
export declare const SIGNATURE_HEADER = "x-arena-signature";
|
|
3
|
+
export declare const TIMESTAMP_HEADER = "x-arena-timestamp";
|
|
4
|
+
export declare const REQUEST_ID_HEADER = "x-arena-request-id";
|
|
5
|
+
/** Default clock-skew tolerance for the timestamp, in seconds. */
|
|
6
|
+
export declare const DEFAULT_SKEW_SECONDS = 300;
|
|
7
|
+
export type Headers = Record<string, string | string[] | undefined>;
|
|
8
|
+
export type VerifyReason = "missing_signature" | "unsupported_version" | "stale_timestamp" | "replayed_nonce" | "bad_signature";
|
|
9
|
+
export declare class VerificationError extends Error {
|
|
10
|
+
reason: VerifyReason;
|
|
11
|
+
constructor(reason: VerifyReason, message?: string);
|
|
12
|
+
}
|
|
13
|
+
/** Build the canonical signing string. Matches the Go builder exactly. */
|
|
14
|
+
export declare function canonicalString(timestamp: string, nonce: string, method: string, path: string, body: Buffer): string;
|
|
15
|
+
/** Return the hex HMAC-SHA256 signature for a request. */
|
|
16
|
+
export declare function computeSignature(secret: string, timestamp: string, nonce: string, method: string, path: string, body: Buffer): string;
|
|
17
|
+
/**
|
|
18
|
+
* Bounded in-memory nonce cache that rejects replayed request ids. Nonces are
|
|
19
|
+
* held for `ttlSeconds` (>= the skew window); the cache is size-capped so a flood
|
|
20
|
+
* of unique nonces cannot exhaust memory (oldest evicted when full).
|
|
21
|
+
*/
|
|
22
|
+
export declare class ReplayGuard {
|
|
23
|
+
private ttlSeconds;
|
|
24
|
+
private maxSize;
|
|
25
|
+
private seen;
|
|
26
|
+
constructor(ttlSeconds?: number, maxSize?: number);
|
|
27
|
+
/** True if `nonce` is fresh (and remembers it); false if replayed. */
|
|
28
|
+
checkAndStore(nonce: string, now: number): boolean;
|
|
29
|
+
private evict;
|
|
30
|
+
}
|
|
31
|
+
export interface VerifyOptions {
|
|
32
|
+
skewSeconds?: number;
|
|
33
|
+
replayGuard?: ReplayGuard;
|
|
34
|
+
now?: number;
|
|
35
|
+
}
|
|
36
|
+
/**
|
|
37
|
+
* Verify a signed request or throw {@link VerificationError}. `path` must be the
|
|
38
|
+
* path the platform signed (the request path as received, no query). `body` is
|
|
39
|
+
* the exact raw request body bytes.
|
|
40
|
+
*/
|
|
41
|
+
export declare function verifyRequest(secret: string, headers: Headers, method: string, path: string, body: Buffer, opts?: VerifyOptions): void;
|
|
42
|
+
//# sourceMappingURL=signing.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"signing.d.ts","sourceRoot":"","sources":["../src/signing.ts"],"names":[],"mappings":"AAcA,eAAO,MAAM,iBAAiB,OAAO,CAAC;AACtC,eAAO,MAAM,gBAAgB,sBAAsB,CAAC;AACpD,eAAO,MAAM,gBAAgB,sBAAsB,CAAC;AACpD,eAAO,MAAM,iBAAiB,uBAAuB,CAAC;AAEtD,kEAAkE;AAClE,eAAO,MAAM,oBAAoB,MAAM,CAAC;AAExC,MAAM,MAAM,OAAO,GAAG,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,EAAE,GAAG,SAAS,CAAC,CAAC;AAEpE,MAAM,MAAM,YAAY,GACpB,mBAAmB,GACnB,qBAAqB,GACrB,iBAAiB,GACjB,gBAAgB,GAChB,eAAe,CAAC;AAEpB,qBAAa,iBAAkB,SAAQ,KAAK;IAC1C,MAAM,EAAE,YAAY,CAAC;gBACT,MAAM,EAAE,YAAY,EAAE,OAAO,CAAC,EAAE,MAAM;CAKnD;AAED,0EAA0E;AAC1E,wBAAgB,eAAe,CAC7B,SAAS,EAAE,MAAM,EACjB,KAAK,EAAE,MAAM,EACb,MAAM,EAAE,MAAM,EACd,IAAI,EAAE,MAAM,EACZ,IAAI,EAAE,MAAM,GACX,MAAM,CAGR;AAED,0DAA0D;AAC1D,wBAAgB,gBAAgB,CAC9B,MAAM,EAAE,MAAM,EACd,SAAS,EAAE,MAAM,EACjB,KAAK,EAAE,MAAM,EACb,MAAM,EAAE,MAAM,EACd,IAAI,EAAE,MAAM,EACZ,IAAI,EAAE,MAAM,GACX,MAAM,CAGR;AAED;;;;GAIG;AACH,qBAAa,WAAW;IAGpB,OAAO,CAAC,UAAU;IAClB,OAAO,CAAC,OAAO;IAHjB,OAAO,CAAC,IAAI,CAA6B;gBAE/B,UAAU,SAA2B,EACrC,OAAO,SAAS;IAG1B,sEAAsE;IACtE,aAAa,CAAC,KAAK,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,GAAG,OAAO;IAWlD,OAAO,CAAC,KAAK;CAOd;AASD,MAAM,WAAW,aAAa;IAC5B,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,WAAW,CAAC,EAAE,WAAW,CAAC;IAC1B,GAAG,CAAC,EAAE,MAAM,CAAC;CACd;AAED;;;;GAIG;AACH,wBAAgB,aAAa,CAC3B,MAAM,EAAE,MAAM,EACd,OAAO,EAAE,OAAO,EAChB,MAAM,EAAE,MAAM,EACd,IAAI,EAAE,MAAM,EACZ,IAAI,EAAE,MAAM,EACZ,IAAI,GAAE,aAAkB,GACvB,IAAI,CAiCN"}
|
package/dist/signing.js
ADDED
|
@@ -0,0 +1,115 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* HMAC request signing + verification for the Pyyol push protocol.
|
|
3
|
+
*
|
|
4
|
+
* Reproduces EXACTLY the platform's `agentclient.SignRequest` (Go):
|
|
5
|
+
*
|
|
6
|
+
* signingString = timestamp \n nonce \n METHOD \n path \n hex(sha256(body))
|
|
7
|
+
* signature = hex(hmacSHA256(secret, signingString))
|
|
8
|
+
*
|
|
9
|
+
* The shared secret is the agent's endpoint token (the manifest endpoint secret).
|
|
10
|
+
* An agent verifies the signature (constant-time), rejects stale timestamps
|
|
11
|
+
* (clock-skew window), and rejects already-seen nonces (replay protection).
|
|
12
|
+
*/
|
|
13
|
+
import { createHash, createHmac, timingSafeEqual } from "node:crypto";
|
|
14
|
+
export const SIGNATURE_VERSION = "v1";
|
|
15
|
+
export const SIGNATURE_HEADER = "x-arena-signature";
|
|
16
|
+
export const TIMESTAMP_HEADER = "x-arena-timestamp";
|
|
17
|
+
export const REQUEST_ID_HEADER = "x-arena-request-id";
|
|
18
|
+
/** Default clock-skew tolerance for the timestamp, in seconds. */
|
|
19
|
+
export const DEFAULT_SKEW_SECONDS = 300;
|
|
20
|
+
export class VerificationError extends Error {
|
|
21
|
+
reason;
|
|
22
|
+
constructor(reason, message) {
|
|
23
|
+
super(message ?? reason);
|
|
24
|
+
this.name = "VerificationError";
|
|
25
|
+
this.reason = reason;
|
|
26
|
+
}
|
|
27
|
+
}
|
|
28
|
+
/** Build the canonical signing string. Matches the Go builder exactly. */
|
|
29
|
+
export function canonicalString(timestamp, nonce, method, path, body) {
|
|
30
|
+
const bodyHash = createHash("sha256").update(body ?? Buffer.alloc(0)).digest("hex");
|
|
31
|
+
return [timestamp, nonce, method.toUpperCase(), path, bodyHash].join("\n");
|
|
32
|
+
}
|
|
33
|
+
/** Return the hex HMAC-SHA256 signature for a request. */
|
|
34
|
+
export function computeSignature(secret, timestamp, nonce, method, path, body) {
|
|
35
|
+
const signing = canonicalString(timestamp, nonce, method, path, body);
|
|
36
|
+
return createHmac("sha256", secret).update(signing).digest("hex");
|
|
37
|
+
}
|
|
38
|
+
/**
|
|
39
|
+
* Bounded in-memory nonce cache that rejects replayed request ids. Nonces are
|
|
40
|
+
* held for `ttlSeconds` (>= the skew window); the cache is size-capped so a flood
|
|
41
|
+
* of unique nonces cannot exhaust memory (oldest evicted when full).
|
|
42
|
+
*/
|
|
43
|
+
export class ReplayGuard {
|
|
44
|
+
ttlSeconds;
|
|
45
|
+
maxSize;
|
|
46
|
+
seen = new Map();
|
|
47
|
+
constructor(ttlSeconds = DEFAULT_SKEW_SECONDS * 2, maxSize = 50_000) {
|
|
48
|
+
this.ttlSeconds = ttlSeconds;
|
|
49
|
+
this.maxSize = maxSize;
|
|
50
|
+
}
|
|
51
|
+
/** True if `nonce` is fresh (and remembers it); false if replayed. */
|
|
52
|
+
checkAndStore(nonce, now) {
|
|
53
|
+
this.evict(now);
|
|
54
|
+
if (this.seen.has(nonce))
|
|
55
|
+
return false;
|
|
56
|
+
if (this.seen.size >= this.maxSize) {
|
|
57
|
+
const oldest = this.seen.keys().next().value; // Map preserves insertion order
|
|
58
|
+
if (oldest !== undefined)
|
|
59
|
+
this.seen.delete(oldest);
|
|
60
|
+
}
|
|
61
|
+
this.seen.set(nonce, now);
|
|
62
|
+
return true;
|
|
63
|
+
}
|
|
64
|
+
evict(now) {
|
|
65
|
+
const cutoff = now - this.ttlSeconds;
|
|
66
|
+
for (const [k, t] of this.seen) {
|
|
67
|
+
if (t < cutoff)
|
|
68
|
+
this.seen.delete(k);
|
|
69
|
+
else
|
|
70
|
+
break; // insertion order ~ time order; the rest are newer
|
|
71
|
+
}
|
|
72
|
+
}
|
|
73
|
+
}
|
|
74
|
+
function header(headers, name) {
|
|
75
|
+
const lower = name.toLowerCase();
|
|
76
|
+
const v = headers[lower] ?? headers[name];
|
|
77
|
+
if (Array.isArray(v))
|
|
78
|
+
return v[0] ?? "";
|
|
79
|
+
return v ?? "";
|
|
80
|
+
}
|
|
81
|
+
/**
|
|
82
|
+
* Verify a signed request or throw {@link VerificationError}. `path` must be the
|
|
83
|
+
* path the platform signed (the request path as received, no query). `body` is
|
|
84
|
+
* the exact raw request body bytes.
|
|
85
|
+
*/
|
|
86
|
+
export function verifyRequest(secret, headers, method, path, body, opts = {}) {
|
|
87
|
+
const sigHeader = header(headers, SIGNATURE_HEADER);
|
|
88
|
+
const ts = header(headers, TIMESTAMP_HEADER);
|
|
89
|
+
const nonce = header(headers, REQUEST_ID_HEADER);
|
|
90
|
+
if (!sigHeader || !ts || !nonce) {
|
|
91
|
+
throw new VerificationError("missing_signature", "missing signature/timestamp/nonce headers");
|
|
92
|
+
}
|
|
93
|
+
const eq = sigHeader.indexOf("=");
|
|
94
|
+
const version = eq >= 0 ? sigHeader.slice(0, eq) : "";
|
|
95
|
+
const provided = eq >= 0 ? sigHeader.slice(eq + 1) : "";
|
|
96
|
+
if (version !== SIGNATURE_VERSION || !provided) {
|
|
97
|
+
throw new VerificationError("unsupported_version", `unsupported signature version ${version}`);
|
|
98
|
+
}
|
|
99
|
+
const now = opts.now ?? Date.now() / 1000;
|
|
100
|
+
const skew = opts.skewSeconds ?? DEFAULT_SKEW_SECONDS;
|
|
101
|
+
const tsEpoch = Date.parse(ts) / 1000;
|
|
102
|
+
if (!Number.isFinite(tsEpoch) || Math.abs(now - tsEpoch) > skew) {
|
|
103
|
+
throw new VerificationError("stale_timestamp", "timestamp outside the allowed skew window");
|
|
104
|
+
}
|
|
105
|
+
if (opts.replayGuard && !opts.replayGuard.checkAndStore(nonce, now)) {
|
|
106
|
+
throw new VerificationError("replayed_nonce", "request id was already used");
|
|
107
|
+
}
|
|
108
|
+
const expected = computeSignature(secret, ts, nonce, method, path, body);
|
|
109
|
+
const a = Buffer.from(expected);
|
|
110
|
+
const b = Buffer.from(provided);
|
|
111
|
+
if (a.length !== b.length || !timingSafeEqual(a, b)) {
|
|
112
|
+
throw new VerificationError("bad_signature", "signature mismatch");
|
|
113
|
+
}
|
|
114
|
+
}
|
|
115
|
+
//# sourceMappingURL=signing.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"signing.js","sourceRoot":"","sources":["../src/signing.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Local simulation harness — test your agent without the platform.
|
|
3
|
+
*
|
|
4
|
+
* `simulateGoofspiel` runs a complete Goofspiel match in-process against a
|
|
5
|
+
* baseline opponent, driving your agent through its *real* dispatch path
|
|
6
|
+
* (`Agent.handle` with valid signatures) — validating routing, signature
|
|
7
|
+
* verification, parsing, and your handlers end to end, then reporting the result.
|
|
8
|
+
* It contains Goofspiel rules only (to referee); your handler decides every move.
|
|
9
|
+
*/
|
|
10
|
+
import type { Agent } from "./server.js";
|
|
11
|
+
export declare class SimulationError extends Error {
|
|
12
|
+
}
|
|
13
|
+
export interface GoofspielSimOptions {
|
|
14
|
+
handSize?: number;
|
|
15
|
+
seed?: number;
|
|
16
|
+
shufflePrizes?: boolean;
|
|
17
|
+
turnPath?: string;
|
|
18
|
+
}
|
|
19
|
+
export interface GoofspielSimResult {
|
|
20
|
+
winner: "agent" | "baseline" | "tie";
|
|
21
|
+
winnerSeat: number;
|
|
22
|
+
scores: {
|
|
23
|
+
agent: number;
|
|
24
|
+
baseline: number;
|
|
25
|
+
};
|
|
26
|
+
rounds: number;
|
|
27
|
+
moves: {
|
|
28
|
+
round: number;
|
|
29
|
+
prize: number;
|
|
30
|
+
pool: number;
|
|
31
|
+
dev: number;
|
|
32
|
+
opp: number;
|
|
33
|
+
}[];
|
|
34
|
+
}
|
|
35
|
+
/** Play one Goofspiel match: your agent (seat 0) vs a baseline (seat 1). Throws
|
|
36
|
+
* {@link SimulationError} if your agent returns an illegal or malformed move. */
|
|
37
|
+
export declare function simulateGoofspiel(agent: Agent, opts?: GoofspielSimOptions): Promise<GoofspielSimResult>;
|
|
38
|
+
//# sourceMappingURL=simulator.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"simulator.d.ts","sourceRoot":"","sources":["../src/simulator.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AACH,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,aAAa,CAAC;AAUzC,qBAAa,eAAgB,SAAQ,KAAK;CAAG;AAyB7C,MAAM,WAAW,mBAAmB;IAClC,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,aAAa,CAAC,EAAE,OAAO,CAAC;IACxB,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB;AAED,MAAM,WAAW,kBAAkB;IACjC,MAAM,EAAE,OAAO,GAAG,UAAU,GAAG,KAAK,CAAC;IACrC,UAAU,EAAE,MAAM,CAAC;IACnB,MAAM,EAAE;QAAE,KAAK,EAAE,MAAM,CAAC;QAAC,QAAQ,EAAE,MAAM,CAAA;KAAE,CAAC;IAC5C,MAAM,EAAE,MAAM,CAAC;IACf,KAAK,EAAE;QAAE,KAAK,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAC;QAAC,GAAG,EAAE,MAAM,CAAC;QAAC,GAAG,EAAE,MAAM,CAAA;KAAE,EAAE,CAAC;CACnF;AAED;kFACkF;AAClF,wBAAsB,iBAAiB,CAAC,KAAK,EAAE,KAAK,EAAE,IAAI,GAAE,mBAAwB,GAAG,OAAO,CAAC,kBAAkB,CAAC,CA0DjH"}
|
|
@@ -0,0 +1,109 @@
|
|
|
1
|
+
import { GOOFSPIEL, PROTOCOL_VERSION } from "./models.js";
|
|
2
|
+
import { REQUEST_ID_HEADER, SIGNATURE_HEADER, SIGNATURE_VERSION, TIMESTAMP_HEADER, computeSignature, } from "./signing.js";
|
|
3
|
+
export class SimulationError extends Error {
|
|
4
|
+
}
|
|
5
|
+
function signedHeaders(secret, method, path, body, nonce, ts) {
|
|
6
|
+
const h = {
|
|
7
|
+
[TIMESTAMP_HEADER]: ts,
|
|
8
|
+
[REQUEST_ID_HEADER]: nonce,
|
|
9
|
+
"content-type": "application/json",
|
|
10
|
+
};
|
|
11
|
+
if (secret) {
|
|
12
|
+
h[SIGNATURE_HEADER] = `${SIGNATURE_VERSION}=${computeSignature(secret, ts, nonce, method, path, body)}`;
|
|
13
|
+
h["authorization"] = `Bearer ${secret}`;
|
|
14
|
+
}
|
|
15
|
+
return h;
|
|
16
|
+
}
|
|
17
|
+
async function post(agent, path, payload, seq) {
|
|
18
|
+
const body = Buffer.from(JSON.stringify(payload));
|
|
19
|
+
const nonce = `sim_${seq}`;
|
|
20
|
+
const ts = new Date(Date.now()).toISOString().replace(/\.\d+Z$/, "Z");
|
|
21
|
+
const headers = signedHeaders(agent.secret, "POST", path, body, nonce, ts);
|
|
22
|
+
const { status, body: resp } = await agent.handle("POST", path, headers, body);
|
|
23
|
+
if (status !== 200)
|
|
24
|
+
throw new SimulationError(`agent returned ${status} for ${path}: ${JSON.stringify(resp)}`);
|
|
25
|
+
return resp;
|
|
26
|
+
}
|
|
27
|
+
/** Play one Goofspiel match: your agent (seat 0) vs a baseline (seat 1). Throws
|
|
28
|
+
* {@link SimulationError} if your agent returns an illegal or malformed move. */
|
|
29
|
+
export async function simulateGoofspiel(agent, opts = {}) {
|
|
30
|
+
const handSize = opts.handSize ?? 13;
|
|
31
|
+
const turnPath = opts.turnPath ?? "/turn";
|
|
32
|
+
const rng = mulberry32(opts.seed ?? 1);
|
|
33
|
+
const prizes = Array.from({ length: handSize }, (_, i) => i + 1);
|
|
34
|
+
if (opts.shufflePrizes)
|
|
35
|
+
shuffle(prizes, rng);
|
|
36
|
+
const devHand = Array.from({ length: handSize }, (_, i) => i + 1);
|
|
37
|
+
const oppHand = Array.from({ length: handSize }, (_, i) => i + 1);
|
|
38
|
+
const scores = [0, 0];
|
|
39
|
+
let carried = 0;
|
|
40
|
+
const moves = [];
|
|
41
|
+
let seq = 0;
|
|
42
|
+
await post(agent, "/initialize", { protocol: PROTOCOL_VERSION, match_id: "sim-goofspiel", game: GOOFSPIEL, seat: 0, players: 2 }, seq++);
|
|
43
|
+
for (let round = 0; round < prizes.length; round++) {
|
|
44
|
+
const prize = prizes[round];
|
|
45
|
+
const pool = prize + carried;
|
|
46
|
+
const view = {
|
|
47
|
+
game: GOOFSPIEL, match_id: "sim-goofspiel", seat: 0, round,
|
|
48
|
+
current_prize: prize, prize_pool: pool,
|
|
49
|
+
your_hand: [...devHand], scores: [...scores], legal_actions: [...devHand],
|
|
50
|
+
};
|
|
51
|
+
const resp = await post(agent, turnPath, view, seq++);
|
|
52
|
+
const devCard = resp.card;
|
|
53
|
+
if (!devHand.includes(devCard)) {
|
|
54
|
+
throw new SimulationError(`round ${round}: agent bid ${devCard}, not in hand [${devHand}]`);
|
|
55
|
+
}
|
|
56
|
+
const oppCard = baselineBid(oppHand, pool);
|
|
57
|
+
devHand.splice(devHand.indexOf(devCard), 1);
|
|
58
|
+
oppHand.splice(oppHand.indexOf(oppCard), 1);
|
|
59
|
+
moves.push({ round, prize, pool, dev: devCard, opp: oppCard });
|
|
60
|
+
if (devCard > oppCard) {
|
|
61
|
+
scores[0] += pool;
|
|
62
|
+
carried = 0;
|
|
63
|
+
}
|
|
64
|
+
else if (oppCard > devCard) {
|
|
65
|
+
scores[1] += pool;
|
|
66
|
+
carried = 0;
|
|
67
|
+
}
|
|
68
|
+
else
|
|
69
|
+
carried = pool;
|
|
70
|
+
await post(agent, "/event", {
|
|
71
|
+
protocol: PROTOCOL_VERSION, match_id: "sim-goofspiel", game: GOOFSPIEL,
|
|
72
|
+
seq: round, type: "round_revealed", payload: { prize, dev_card: devCard, opp_card: oppCard },
|
|
73
|
+
}, seq++);
|
|
74
|
+
}
|
|
75
|
+
const winnerSeat = scores[0] > scores[1] ? 0 : scores[1] > scores[0] ? 1 : -1;
|
|
76
|
+
await post(agent, "/game-end", {
|
|
77
|
+
protocol: PROTOCOL_VERSION, match_id: "sim-goofspiel", game: GOOFSPIEL,
|
|
78
|
+
result: { winner_seat: winnerSeat, scores },
|
|
79
|
+
}, seq++);
|
|
80
|
+
return {
|
|
81
|
+
winner: winnerSeat === 0 ? "agent" : winnerSeat === 1 ? "baseline" : "tie",
|
|
82
|
+
winnerSeat,
|
|
83
|
+
scores: { agent: scores[0], baseline: scores[1] },
|
|
84
|
+
rounds: prizes.length,
|
|
85
|
+
moves,
|
|
86
|
+
};
|
|
87
|
+
}
|
|
88
|
+
/** Deterministic opponent: bid the card nearest the pool value (ties -> lower). */
|
|
89
|
+
function baselineBid(hand, pool) {
|
|
90
|
+
return hand.reduce((best, c) => (Math.abs(c - pool) < Math.abs(best - pool) ? c : best), hand[0]);
|
|
91
|
+
}
|
|
92
|
+
// Small deterministic RNG so simulations are reproducible from a seed.
|
|
93
|
+
function mulberry32(seed) {
|
|
94
|
+
let a = seed >>> 0;
|
|
95
|
+
return () => {
|
|
96
|
+
a |= 0;
|
|
97
|
+
a = (a + 0x6d2b79f5) | 0;
|
|
98
|
+
let t = Math.imul(a ^ (a >>> 15), 1 | a);
|
|
99
|
+
t = (t + Math.imul(t ^ (t >>> 7), 61 | t)) ^ t;
|
|
100
|
+
return ((t ^ (t >>> 14)) >>> 0) / 4294967296;
|
|
101
|
+
};
|
|
102
|
+
}
|
|
103
|
+
function shuffle(arr, rng) {
|
|
104
|
+
for (let i = arr.length - 1; i > 0; i--) {
|
|
105
|
+
const j = Math.floor(rng() * (i + 1));
|
|
106
|
+
[arr[i], arr[j]] = [arr[j], arr[i]];
|
|
107
|
+
}
|
|
108
|
+
}
|
|
109
|
+
//# sourceMappingURL=simulator.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"simulator.js","sourceRoot":"","sources":["../src/simulator.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,81 @@
|
|
|
1
|
+
type Json = Record<string, unknown>;
|
|
2
|
+
/** Stable trace id shared with the platform engine (Go: MatchTraceID). */
|
|
3
|
+
export declare function matchTraceId(matchId: string): string;
|
|
4
|
+
export interface ModelCall {
|
|
5
|
+
provider?: string;
|
|
6
|
+
model?: string;
|
|
7
|
+
promptTokens?: number;
|
|
8
|
+
completionTokens?: number;
|
|
9
|
+
totalTokens?: number;
|
|
10
|
+
estimatedCost?: number;
|
|
11
|
+
latencyMs?: number;
|
|
12
|
+
[k: string]: unknown;
|
|
13
|
+
}
|
|
14
|
+
/** A live span; records child model/tool calls and free-form logs. Safe no-ops
|
|
15
|
+
* when telemetry is disabled. */
|
|
16
|
+
export declare class Span {
|
|
17
|
+
private readonly tracer;
|
|
18
|
+
private readonly base;
|
|
19
|
+
constructor(tracer: Tracer, base: Json);
|
|
20
|
+
logModelCall(c?: ModelCall): void;
|
|
21
|
+
logToolCall(name: string, o?: {
|
|
22
|
+
latencyMs?: number;
|
|
23
|
+
status?: string;
|
|
24
|
+
[k: string]: unknown;
|
|
25
|
+
}): void;
|
|
26
|
+
log(message: string, o?: {
|
|
27
|
+
level?: string;
|
|
28
|
+
[k: string]: unknown;
|
|
29
|
+
}): void;
|
|
30
|
+
}
|
|
31
|
+
/** The span for the turn currently being handled, or a no-op span outside one.
|
|
32
|
+
* Always safe to call and chain (never null). */
|
|
33
|
+
export declare function currentSpan(): Span;
|
|
34
|
+
export interface TracerOptions {
|
|
35
|
+
endpoint?: string;
|
|
36
|
+
apiKey?: string;
|
|
37
|
+
project?: string;
|
|
38
|
+
environment?: string;
|
|
39
|
+
organization?: string;
|
|
40
|
+
service?: string;
|
|
41
|
+
agentId?: string;
|
|
42
|
+
flushIntervalMs?: number;
|
|
43
|
+
maxBatch?: number;
|
|
44
|
+
bufferSize?: number;
|
|
45
|
+
timeoutMs?: number;
|
|
46
|
+
}
|
|
47
|
+
/** Batching, non-blocking emitter to the Pyyol Lens ingest. */
|
|
48
|
+
export declare class Tracer {
|
|
49
|
+
readonly enabled: boolean;
|
|
50
|
+
dropped: number;
|
|
51
|
+
private readonly endpoint;
|
|
52
|
+
private readonly key;
|
|
53
|
+
private readonly base;
|
|
54
|
+
private readonly flushIntervalMs;
|
|
55
|
+
private readonly maxBatch;
|
|
56
|
+
private readonly bufferSize;
|
|
57
|
+
private readonly timeoutMs;
|
|
58
|
+
private queue;
|
|
59
|
+
private timer?;
|
|
60
|
+
private readonly agentId;
|
|
61
|
+
constructor(o?: TracerOptions);
|
|
62
|
+
static fromEnv(o?: {
|
|
63
|
+
agentId?: string;
|
|
64
|
+
service?: string;
|
|
65
|
+
}): Tracer;
|
|
66
|
+
/** Bracket one agent turn: install a span as current for the duration of fn,
|
|
67
|
+
* emitting span_started → span_completed/failed. Correlated to the match
|
|
68
|
+
* trace via matchTraceId. Returns fn's result. */
|
|
69
|
+
runTurn<T>(o: {
|
|
70
|
+
matchId: string;
|
|
71
|
+
game?: string;
|
|
72
|
+
round?: number;
|
|
73
|
+
agentId?: string;
|
|
74
|
+
}, fn: () => T | Promise<T>): Promise<T>;
|
|
75
|
+
/** @internal */
|
|
76
|
+
_emit(ev: Json): void;
|
|
77
|
+
private flush;
|
|
78
|
+
close(): Promise<void>;
|
|
79
|
+
}
|
|
80
|
+
export {};
|
|
81
|
+
//# sourceMappingURL=telemetry.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"telemetry.d.ts","sourceRoot":"","sources":["../src/telemetry.ts"],"names":[],"mappings":"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"}
|