@inbrowser/agent 0.1.0 → 0.3.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 +2 -2
- package/dist/cli/commands/run.js.map +1 -1
- package/dist/cli/fixtures.d.ts +2 -2
- package/dist/cli/fixtures.d.ts.map +1 -1
- package/dist/cli/fixtures.js +7 -16
- package/dist/cli/fixtures.js.map +1 -1
- package/dist/cli/llm/openrouter.d.ts +4 -4
- package/dist/cli/llm/openrouter.d.ts.map +1 -1
- package/dist/cli/llm/openrouter.js +20 -31
- package/dist/cli/llm/openrouter.js.map +1 -1
- package/dist/diagnostics/index.d.ts +5 -0
- package/dist/diagnostics/index.d.ts.map +1 -0
- package/dist/diagnostics/index.js +3 -0
- package/dist/diagnostics/index.js.map +1 -0
- package/dist/diagnostics/timing.d.ts +48 -0
- package/dist/diagnostics/timing.d.ts.map +1 -0
- package/dist/diagnostics/timing.js +85 -0
- package/dist/diagnostics/timing.js.map +1 -0
- package/dist/diagnostics/truthfulness.d.ts +36 -0
- package/dist/diagnostics/truthfulness.d.ts.map +1 -0
- package/dist/diagnostics/truthfulness.js +180 -0
- package/dist/diagnostics/truthfulness.js.map +1 -0
- package/dist/dispatch-memoization.d.ts +84 -0
- package/dist/dispatch-memoization.d.ts.map +1 -0
- package/dist/dispatch-memoization.js +197 -0
- package/dist/dispatch-memoization.js.map +1 -0
- package/dist/eval/comparison-report.d.ts +164 -0
- package/dist/eval/comparison-report.d.ts.map +1 -0
- package/dist/eval/comparison-report.js +316 -0
- package/dist/eval/comparison-report.js.map +1 -0
- package/dist/eval/fixture.d.ts +74 -0
- package/dist/eval/fixture.d.ts.map +1 -0
- package/dist/eval/fixture.js +217 -0
- package/dist/eval/fixture.js.map +1 -0
- package/dist/eval/index.d.ts +13 -0
- package/dist/eval/index.d.ts.map +1 -0
- package/dist/eval/index.js +7 -0
- package/dist/eval/index.js.map +1 -0
- package/dist/eval/load-node.d.ts +16 -0
- package/dist/eval/load-node.d.ts.map +1 -0
- package/dist/eval/load-node.js +58 -0
- package/dist/eval/load-node.js.map +1 -0
- package/dist/eval/metric-collector.d.ts +209 -0
- package/dist/eval/metric-collector.d.ts.map +1 -0
- package/dist/eval/metric-collector.js +293 -0
- package/dist/eval/metric-collector.js.map +1 -0
- package/dist/eval/run-record.d.ts +76 -0
- package/dist/eval/run-record.d.ts.map +1 -0
- package/dist/eval/run-record.js +32 -0
- package/dist/eval/run-record.js.map +1 -0
- package/dist/eval/runner.d.ts +140 -0
- package/dist/eval/runner.d.ts.map +1 -0
- package/dist/eval/runner.js +310 -0
- package/dist/eval/runner.js.map +1 -0
- package/dist/eval/spec-framework.d.ts +113 -0
- package/dist/eval/spec-framework.d.ts.map +1 -0
- package/dist/eval/spec-framework.js +100 -0
- package/dist/eval/spec-framework.js.map +1 -0
- package/dist/eval/spec-helpers.d.ts +245 -0
- package/dist/eval/spec-helpers.d.ts.map +1 -0
- package/dist/eval/spec-helpers.js +605 -0
- package/dist/eval/spec-helpers.js.map +1 -0
- package/dist/index.d.ts +32 -8
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +14 -3
- package/dist/index.js.map +1 -1
- package/dist/llm-adapter.d.ts +30 -34
- package/dist/llm-adapter.d.ts.map +1 -1
- package/dist/llm-adapter.js +61 -51
- package/dist/llm-adapter.js.map +1 -1
- package/dist/mcp/connect.d.ts +68 -0
- package/dist/mcp/connect.d.ts.map +1 -0
- package/dist/mcp/connect.js +111 -0
- package/dist/mcp/connect.js.map +1 -0
- package/dist/metrics.js +4 -4
- package/dist/metrics.js.map +1 -1
- package/dist/node.d.ts +3 -0
- package/dist/node.d.ts.map +1 -1
- package/dist/node.js +2 -0
- package/dist/node.js.map +1 -1
- package/dist/planner-executor.d.ts +132 -0
- package/dist/planner-executor.d.ts.map +1 -0
- package/dist/planner-executor.js +274 -0
- package/dist/planner-executor.js.map +1 -0
- package/dist/retrieval.d.ts +74 -0
- package/dist/retrieval.d.ts.map +1 -0
- package/dist/retrieval.js +287 -0
- package/dist/retrieval.js.map +1 -0
- package/dist/session.d.ts.map +1 -1
- package/dist/session.js +8 -2
- package/dist/session.js.map +1 -1
- package/dist/skill-catalog.d.ts +81 -0
- package/dist/skill-catalog.d.ts.map +1 -0
- package/dist/skill-catalog.js +388 -0
- package/dist/skill-catalog.js.map +1 -0
- package/dist/skill-router.d.ts +95 -0
- package/dist/skill-router.d.ts.map +1 -0
- package/dist/skill-router.js +130 -0
- package/dist/skill-router.js.map +1 -0
- package/dist/strategy.d.ts +22 -2
- package/dist/strategy.d.ts.map +1 -1
- package/dist/strategy.js +358 -28
- package/dist/strategy.js.map +1 -1
- package/dist/tools.d.ts +15 -1
- package/dist/tools.d.ts.map +1 -1
- package/dist/tools.js +18 -0
- package/dist/tools.js.map +1 -1
- package/dist/types/agent.d.ts +2 -3
- package/dist/types/agent.d.ts.map +1 -1
- package/dist/types/agent.js +1 -1
- package/dist/types/chat.d.ts +0 -15
- package/dist/types/chat.d.ts.map +1 -1
- package/dist/types/llm.d.ts +11 -64
- package/dist/types/llm.d.ts.map +1 -1
- package/dist/types/llm.js +7 -8
- package/dist/types/llm.js.map +1 -1
- package/dist/types/metrics.d.ts +2 -2
- package/dist/types/metrics.d.ts.map +1 -1
- package/dist/types/session.d.ts +2 -2
- package/dist/types/session.d.ts.map +1 -1
- package/dist/types/strategy.d.ts +60 -3
- package/dist/types/strategy.d.ts.map +1 -1
- package/dist/types/tools.d.ts +18 -0
- package/dist/types/tools.d.ts.map +1 -1
- package/dist/types/trace.d.ts +67 -15
- package/dist/types/trace.d.ts.map +1 -1
- package/dist/types/trace.js +5 -3
- package/dist/types/trace.js.map +1 -1
- package/package.json +3 -2
|
@@ -0,0 +1,605 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Starter library of common success specs.
|
|
3
|
+
*
|
|
4
|
+
* These helpers are intentionally crude. Golden-task authors compose
|
|
5
|
+
* them through `SuccessSpecReference.args`; custom specs are written
|
|
6
|
+
* only when crudeness is not enough.
|
|
7
|
+
*
|
|
8
|
+
* Registration is explicit. Callers create a registry and call
|
|
9
|
+
* `registerStarterSpecs(registry)` to get all six helpers under their
|
|
10
|
+
* documented names. No side-effect registration on import — that way
|
|
11
|
+
* a host can choose to register a subset, swap in stricter variants,
|
|
12
|
+
* or shadow a helper without monkey-patching this module.
|
|
13
|
+
*
|
|
14
|
+
* Each helper has a `family/spec-name` kebab-case identifier that
|
|
15
|
+
* matches the form `validateFixture` enforces on
|
|
16
|
+
* `SuccessSpecReference.name`. The constants below are exported so
|
|
17
|
+
* fixture authors and reviewers have a single place to import the
|
|
18
|
+
* canonical strings from.
|
|
19
|
+
*
|
|
20
|
+
* Argument shape and behavior are documented per-spec via JSDoc.
|
|
21
|
+
* The framework treats `args` as `unknown`; each spec validates its
|
|
22
|
+
* own shape and surfaces a clear `error` if the args are malformed,
|
|
23
|
+
* rather than throwing. (The evaluator catches throws too, but a
|
|
24
|
+
* structured error message is friendlier to read.)
|
|
25
|
+
*/
|
|
26
|
+
export const SPEC_REPORT_MENTIONS_AT_LEAST_ONE_OF = 'report-mentions/at-least-one-of';
|
|
27
|
+
export const SPEC_REPORT_MENTIONS_ALL_OF = 'report-mentions/all-of';
|
|
28
|
+
export const SPEC_TRACE_CONTAINS_TOOL_CALL_BY_NAME = 'trace-contains-tool-call/by-name';
|
|
29
|
+
export const SPEC_FINAL_RULES_INCLUDES_LITERAL = 'final-rules-includes/literal';
|
|
30
|
+
export const SPEC_FINAL_RULES_EXCLUDES_LITERAL = 'final-rules-excludes/literal';
|
|
31
|
+
export const SPEC_FINAL_RUNTIME_RUN_SUMMARY_OK = 'final-runtime/run-summary-ok';
|
|
32
|
+
export const SPEC_GAME_RULES_SIMULATOR_ACCEPTS_POSITIVE_AND_REJECTS_CHEAT = 'game-rules/simulator-accepts-positive-and-rejects-cheat';
|
|
33
|
+
export const SPEC_PYRIC_AGENTS_LINT_CLEAN_AND_RULE_REJECTS_CHEAT = 'pyric-agents/lint-clean-and-rule-rejects-cheat';
|
|
34
|
+
/**
|
|
35
|
+
* Args: `{ tokens: string[]; caseSensitive?: boolean }`.
|
|
36
|
+
*
|
|
37
|
+
* Passes when `assistantText` contains at least one of `tokens`.
|
|
38
|
+
* Empty / non-array `tokens` is a malformed-args error.
|
|
39
|
+
*
|
|
40
|
+
* Example fixture reference:
|
|
41
|
+
*
|
|
42
|
+
* {
|
|
43
|
+
* "name": "report-mentions/at-least-one-of",
|
|
44
|
+
* "args": { "tokens": ["open-write", "missing auth check"] }
|
|
45
|
+
* }
|
|
46
|
+
*/
|
|
47
|
+
export const reportMentionsAtLeastOneOf = (snapshot, args) => {
|
|
48
|
+
const parsed = parseTokensArgs(args, { defaultCaseSensitive: false });
|
|
49
|
+
if (!parsed.ok)
|
|
50
|
+
return parsed.err;
|
|
51
|
+
const haystack = parsed.caseSensitive
|
|
52
|
+
? snapshot.assistantText
|
|
53
|
+
: snapshot.assistantText.toLowerCase();
|
|
54
|
+
const needles = parsed.caseSensitive ? parsed.tokens : parsed.tokens.map((t) => t.toLowerCase());
|
|
55
|
+
const matched = needles.filter((needle) => haystack.includes(needle));
|
|
56
|
+
return {
|
|
57
|
+
ok: matched.length > 0,
|
|
58
|
+
detail: {
|
|
59
|
+
matched,
|
|
60
|
+
missing: needles.filter((needle) => !haystack.includes(needle)),
|
|
61
|
+
},
|
|
62
|
+
};
|
|
63
|
+
};
|
|
64
|
+
/**
|
|
65
|
+
* Args: `{ tokens: string[]; caseSensitive?: boolean }`.
|
|
66
|
+
*
|
|
67
|
+
* Passes when `assistantText` contains every entry in `tokens`.
|
|
68
|
+
* Empty / non-array `tokens` is a malformed-args error.
|
|
69
|
+
*
|
|
70
|
+
* Example fixture reference:
|
|
71
|
+
*
|
|
72
|
+
* {
|
|
73
|
+
* "name": "report-mentions/all-of",
|
|
74
|
+
* "args": { "tokens": ["users", "open-write", "fix"] }
|
|
75
|
+
* }
|
|
76
|
+
*/
|
|
77
|
+
export const reportMentionsAllOf = (snapshot, args) => {
|
|
78
|
+
const parsed = parseTokensArgs(args, { defaultCaseSensitive: false });
|
|
79
|
+
if (!parsed.ok)
|
|
80
|
+
return parsed.err;
|
|
81
|
+
const haystack = parsed.caseSensitive
|
|
82
|
+
? snapshot.assistantText
|
|
83
|
+
: snapshot.assistantText.toLowerCase();
|
|
84
|
+
const needles = parsed.caseSensitive ? parsed.tokens : parsed.tokens.map((t) => t.toLowerCase());
|
|
85
|
+
const missing = needles.filter((needle) => !haystack.includes(needle));
|
|
86
|
+
return {
|
|
87
|
+
ok: missing.length === 0,
|
|
88
|
+
detail: {
|
|
89
|
+
matched: needles.filter((needle) => haystack.includes(needle)),
|
|
90
|
+
missing,
|
|
91
|
+
},
|
|
92
|
+
};
|
|
93
|
+
};
|
|
94
|
+
/**
|
|
95
|
+
* Args: `{ tool: string; minCount?: number }`.
|
|
96
|
+
*
|
|
97
|
+
* Passes when the trace contains at least `minCount` (default 1)
|
|
98
|
+
* `tool_call` records emitted by the response trace for a tool named
|
|
99
|
+
* `tool`. Tool calls are read off `llm_response` trace events, which
|
|
100
|
+
* is where the agent loop records what the model asked for in each
|
|
101
|
+
* iteration.
|
|
102
|
+
*
|
|
103
|
+
* Example fixture reference:
|
|
104
|
+
*
|
|
105
|
+
* {
|
|
106
|
+
* "name": "trace-contains-tool-call/by-name",
|
|
107
|
+
* "args": { "tool": "rulesSimulator", "minCount": 1 }
|
|
108
|
+
* }
|
|
109
|
+
*/
|
|
110
|
+
export const traceContainsToolCallByName = (snapshot, args) => {
|
|
111
|
+
const parsed = parseToolCallArgs(args);
|
|
112
|
+
if (!parsed.ok)
|
|
113
|
+
return parsed.err;
|
|
114
|
+
let count = 0;
|
|
115
|
+
for (const event of snapshot.trace) {
|
|
116
|
+
if (event.kind !== 'llm_response')
|
|
117
|
+
continue;
|
|
118
|
+
for (const call of event.data.toolCalls) {
|
|
119
|
+
if (call.name === parsed.tool)
|
|
120
|
+
count += 1;
|
|
121
|
+
}
|
|
122
|
+
}
|
|
123
|
+
return {
|
|
124
|
+
ok: count >= parsed.minCount,
|
|
125
|
+
detail: { tool: parsed.tool, count, minCount: parsed.minCount },
|
|
126
|
+
};
|
|
127
|
+
};
|
|
128
|
+
/**
|
|
129
|
+
* Args: `{ literal: string; caseSensitive?: boolean }`.
|
|
130
|
+
*
|
|
131
|
+
* Passes when `finalWorkspace.rules` contains `literal` as a substring.
|
|
132
|
+
* `literal` must be a non-empty string.
|
|
133
|
+
*
|
|
134
|
+
* Example fixture reference:
|
|
135
|
+
*
|
|
136
|
+
* {
|
|
137
|
+
* "name": "final-rules-includes/literal",
|
|
138
|
+
* "args": { "literal": "request.auth != null" }
|
|
139
|
+
* }
|
|
140
|
+
*/
|
|
141
|
+
export const finalRulesIncludesLiteral = (snapshot, args) => {
|
|
142
|
+
return rulesContains(snapshot, args, /* shouldInclude */ true);
|
|
143
|
+
};
|
|
144
|
+
/**
|
|
145
|
+
* Args: `{ literal: string; caseSensitive?: boolean }`.
|
|
146
|
+
*
|
|
147
|
+
* Passes when `finalWorkspace.rules` does NOT contain `literal` as a
|
|
148
|
+
* substring. Useful for asserting that a planted antipattern has been
|
|
149
|
+
* removed.
|
|
150
|
+
*
|
|
151
|
+
* Example fixture reference:
|
|
152
|
+
*
|
|
153
|
+
* {
|
|
154
|
+
* "name": "final-rules-excludes/literal",
|
|
155
|
+
* "args": { "literal": "allow write: if true" }
|
|
156
|
+
* }
|
|
157
|
+
*/
|
|
158
|
+
export const finalRulesExcludesLiteral = (snapshot, args) => {
|
|
159
|
+
return rulesContains(snapshot, args, /* shouldInclude */ false);
|
|
160
|
+
};
|
|
161
|
+
/**
|
|
162
|
+
* Args: none (`undefined` or `{}`).
|
|
163
|
+
*
|
|
164
|
+
* Passes when `finalRuntime.runSummary` exists and `runSummary.ok` is
|
|
165
|
+
* true — i.e. the most recent `runCode` invocation succeeded. Fails
|
|
166
|
+
* when there is no run summary at all (the spec only makes sense for
|
|
167
|
+
* fixtures whose skill is expected to run code).
|
|
168
|
+
*
|
|
169
|
+
* Example fixture reference:
|
|
170
|
+
*
|
|
171
|
+
* { "name": "final-runtime/run-summary-ok" }
|
|
172
|
+
*/
|
|
173
|
+
export const finalRuntimeRunSummaryOk = (snapshot) => {
|
|
174
|
+
const summary = snapshot.finalRuntime.runSummary;
|
|
175
|
+
if (!summary) {
|
|
176
|
+
return {
|
|
177
|
+
ok: false,
|
|
178
|
+
detail: { reason: 'no run summary captured' },
|
|
179
|
+
};
|
|
180
|
+
}
|
|
181
|
+
return {
|
|
182
|
+
ok: summary.ok === true,
|
|
183
|
+
detail: {
|
|
184
|
+
ok: summary.ok,
|
|
185
|
+
durationMs: summary.durationMs,
|
|
186
|
+
docsTouched: summary.docsTouched,
|
|
187
|
+
errors: summary.errors,
|
|
188
|
+
...(summary.message ? { message: summary.message } : {}),
|
|
189
|
+
},
|
|
190
|
+
};
|
|
191
|
+
};
|
|
192
|
+
/**
|
|
193
|
+
* Args: `{ database?: 'firestore' | 'rtdb'; positive: PositiveArgs; cheat: CheatArgs }`.
|
|
194
|
+
*
|
|
195
|
+
* Both-direction check: the generated rules should accept a defined
|
|
196
|
+
* positive move AND reject a defined cheating attempt. The fixture
|
|
197
|
+
* supplies one side under `positive` and the other under `cheat`.
|
|
198
|
+
*
|
|
199
|
+
* V1 approximation: token-presence over `finalWorkspace.rules`. A
|
|
200
|
+
* future iteration would replace this with an actual Firestore /
|
|
201
|
+
* Realtime Database security-rules simulator call, exercising the
|
|
202
|
+
* `positive` move (expecting `allow`) and the `cheat` move
|
|
203
|
+
* (expecting `deny`). Wiring that simulator is out of scope for v1
|
|
204
|
+
* because it requires either the Firebase rules-emulator process
|
|
205
|
+
* (Node-only, slow to start, off-limits in a browser-safe surface)
|
|
206
|
+
* or a bundled WASM rules interpreter — neither of which the eval
|
|
207
|
+
* harness has today.
|
|
208
|
+
*
|
|
209
|
+
* The approximation supports two arg-shapes so it can serve both
|
|
210
|
+
* the brief's documented shape and the simulator-style shape the
|
|
211
|
+
* generative fixtures already use on disk:
|
|
212
|
+
*
|
|
213
|
+
* 1. Token shape (explicit, preferred for future-authored fixtures):
|
|
214
|
+
* positive: { description?: string; requiredTokens: string[] }
|
|
215
|
+
* cheat: { description?: string; rejectionTokens: string[] }
|
|
216
|
+
* Each token list is checked as case-sensitive substrings on
|
|
217
|
+
* `finalWorkspace.rules`.
|
|
218
|
+
*
|
|
219
|
+
* 2. Simulator shape (used by the existing fixtures):
|
|
220
|
+
* positive: { auth, path, op, data, expect: 'allow' }
|
|
221
|
+
* cheat: { auth, path, op, data, expect: 'deny' }
|
|
222
|
+
* Tokens are derived from the simulator-side `data` and `path`
|
|
223
|
+
* values — each string-valued leaf and the path segment are
|
|
224
|
+
* required to appear in the rules text. The expectation field
|
|
225
|
+
* (`allow` / `deny`) is recorded in the detail payload but is
|
|
226
|
+
* not used by the token check; the actual accept/reject
|
|
227
|
+
* decision is what the future simulator iteration would
|
|
228
|
+
* validate.
|
|
229
|
+
*
|
|
230
|
+
* Passes iff every derived positive token AND every derived cheat
|
|
231
|
+
* token appears in `finalWorkspace.rules`. Otherwise returns
|
|
232
|
+
* `{ ok: false, detail: { missingPositive, missingCheat } }`.
|
|
233
|
+
*
|
|
234
|
+
* Example fixture reference (simulator shape):
|
|
235
|
+
*
|
|
236
|
+
* {
|
|
237
|
+
* "name": "game-rules/simulator-accepts-positive-and-rejects-cheat",
|
|
238
|
+
* "args": {
|
|
239
|
+
* "database": "rtdb",
|
|
240
|
+
* "positive": { "auth": { "uid": "uidA" }, "path": "/games/g1",
|
|
241
|
+
* "op": "update", "data": { ... }, "expect": "allow" },
|
|
242
|
+
* "cheat": { "auth": { "uid": "uidB" }, "path": "/games/g1",
|
|
243
|
+
* "op": "update", "data": { ... }, "expect": "deny" }
|
|
244
|
+
* }
|
|
245
|
+
* }
|
|
246
|
+
*/
|
|
247
|
+
export const gameRulesSimulatorAcceptsPositiveAndRejectsCheat = (snapshot, args) => {
|
|
248
|
+
const parsed = parseGameRulesSimulatorArgs(args);
|
|
249
|
+
if (!parsed.ok)
|
|
250
|
+
return parsed.err;
|
|
251
|
+
const rules = snapshot.finalWorkspace.rules;
|
|
252
|
+
const missingPositive = parsed.positiveTokens.filter((token) => !rules.includes(token));
|
|
253
|
+
const missingCheat = parsed.cheatTokens.filter((token) => !rules.includes(token));
|
|
254
|
+
const ok = missingPositive.length === 0 && missingCheat.length === 0;
|
|
255
|
+
return {
|
|
256
|
+
ok,
|
|
257
|
+
detail: {
|
|
258
|
+
database: parsed.database,
|
|
259
|
+
positiveTokens: parsed.positiveTokens,
|
|
260
|
+
cheatTokens: parsed.cheatTokens,
|
|
261
|
+
missingPositive,
|
|
262
|
+
missingCheat,
|
|
263
|
+
approximation: 'token-presence (v1; future iteration: real rules simulator)',
|
|
264
|
+
},
|
|
265
|
+
};
|
|
266
|
+
};
|
|
267
|
+
/**
|
|
268
|
+
* Args: `{ lintToolName?: string; cheat?: CheatArgs; cheatAttempt?: CheatArgs }`.
|
|
269
|
+
*
|
|
270
|
+
* Two-part check: (1) the agent successfully called the pyric lint
|
|
271
|
+
* tool during the run, AND (2) the resulting rules text contains the
|
|
272
|
+
* tokens that should be present if the cheating attempt is
|
|
273
|
+
* structurally rejected by the rules.
|
|
274
|
+
*
|
|
275
|
+
* V1 approximation:
|
|
276
|
+
* - Step 1 walks `snapshot.trace` for any `llm_response` event
|
|
277
|
+
* containing a tool call whose name matches `lintToolName`
|
|
278
|
+
* (default `lint_firestore_rules`). If absent, returns
|
|
279
|
+
* `{ ok: false, detail: { reason: 'lint-not-called' } }`. The
|
|
280
|
+
* pyric lint tool's success/failure is observable in the
|
|
281
|
+
* assistant's reasoning and in the tool result, but capturing
|
|
282
|
+
* the precise `tool_result` event shape across providers is
|
|
283
|
+
* fragile — checking that the tool was *called* is the right
|
|
284
|
+
* v1 signal. A future iteration would also verify the lint
|
|
285
|
+
* tool's result was `ok: true` at the trace level.
|
|
286
|
+
* - Step 2 checks `finalWorkspace.rules` includes every token in
|
|
287
|
+
* the cheat's `rejectionTokens`. The cheat may be supplied
|
|
288
|
+
* under either `cheat` (the brief's name) or `cheatAttempt`
|
|
289
|
+
* (the name the existing fixture uses). When the cheat is
|
|
290
|
+
* simulator-shaped (no `rejectionTokens`, only `data` + `path`),
|
|
291
|
+
* tokens are derived from those leaves the same way as
|
|
292
|
+
* `gameRulesSimulatorAcceptsPositiveAndRejectsCheat`.
|
|
293
|
+
*
|
|
294
|
+
* Returns `{ ok: true }` on success, or
|
|
295
|
+
* `{ ok: false, detail: { reason: 'rejection-tokens-missing', missing } }`
|
|
296
|
+
* on the second-step failure.
|
|
297
|
+
*
|
|
298
|
+
* Example fixture reference:
|
|
299
|
+
*
|
|
300
|
+
* {
|
|
301
|
+
* "name": "pyric-agents/lint-clean-and-rule-rejects-cheat",
|
|
302
|
+
* "args": {
|
|
303
|
+
* "lintToolName": "lint_firestore_rules",
|
|
304
|
+
* "cheatAttempt": { "path": "/orders/orderA", "op": "create",
|
|
305
|
+
* "data": { ... }, "expect": "deny" }
|
|
306
|
+
* }
|
|
307
|
+
* }
|
|
308
|
+
*/
|
|
309
|
+
export const pyricAgentsLintCleanAndRuleRejectsCheat = (snapshot, args) => {
|
|
310
|
+
const parsed = parsePyricLintArgs(args);
|
|
311
|
+
if (!parsed.ok)
|
|
312
|
+
return parsed.err;
|
|
313
|
+
let lintCalled = false;
|
|
314
|
+
let lintCallCount = 0;
|
|
315
|
+
for (const event of snapshot.trace) {
|
|
316
|
+
if (event.kind !== 'llm_response')
|
|
317
|
+
continue;
|
|
318
|
+
for (const call of event.data.toolCalls) {
|
|
319
|
+
if (call.name === parsed.lintToolName) {
|
|
320
|
+
lintCalled = true;
|
|
321
|
+
lintCallCount += 1;
|
|
322
|
+
}
|
|
323
|
+
}
|
|
324
|
+
}
|
|
325
|
+
if (!lintCalled) {
|
|
326
|
+
return {
|
|
327
|
+
ok: false,
|
|
328
|
+
detail: {
|
|
329
|
+
reason: 'lint-not-called',
|
|
330
|
+
lintToolName: parsed.lintToolName,
|
|
331
|
+
approximation: 'lint-tool-called (v1; future iteration: also verify lint result ok:true)',
|
|
332
|
+
},
|
|
333
|
+
};
|
|
334
|
+
}
|
|
335
|
+
const rules = snapshot.finalWorkspace.rules;
|
|
336
|
+
const missing = parsed.rejectionTokens.filter((token) => !rules.includes(token));
|
|
337
|
+
if (missing.length > 0) {
|
|
338
|
+
return {
|
|
339
|
+
ok: false,
|
|
340
|
+
detail: {
|
|
341
|
+
reason: 'rejection-tokens-missing',
|
|
342
|
+
lintToolName: parsed.lintToolName,
|
|
343
|
+
lintCallCount,
|
|
344
|
+
rejectionTokens: parsed.rejectionTokens,
|
|
345
|
+
missing,
|
|
346
|
+
approximation: 'token-presence (v1; future iteration: real rules simulator)',
|
|
347
|
+
},
|
|
348
|
+
};
|
|
349
|
+
}
|
|
350
|
+
return {
|
|
351
|
+
ok: true,
|
|
352
|
+
detail: {
|
|
353
|
+
lintToolName: parsed.lintToolName,
|
|
354
|
+
lintCallCount,
|
|
355
|
+
rejectionTokens: parsed.rejectionTokens,
|
|
356
|
+
approximation: 'lint-called + token-presence (v1; future iteration: real lint result + rules simulator)',
|
|
357
|
+
},
|
|
358
|
+
};
|
|
359
|
+
};
|
|
360
|
+
/**
|
|
361
|
+
* Register every starter spec on a registry. Idempotency is not a
|
|
362
|
+
* design goal — calling this twice on the same registry throws (the
|
|
363
|
+
* registry rejects duplicate registrations on purpose). Callers that
|
|
364
|
+
* want a subset should call `registry.register()` themselves.
|
|
365
|
+
*/
|
|
366
|
+
export function registerStarterSpecs(registry) {
|
|
367
|
+
registry.register(SPEC_REPORT_MENTIONS_AT_LEAST_ONE_OF, reportMentionsAtLeastOneOf);
|
|
368
|
+
registry.register(SPEC_REPORT_MENTIONS_ALL_OF, reportMentionsAllOf);
|
|
369
|
+
registry.register(SPEC_TRACE_CONTAINS_TOOL_CALL_BY_NAME, traceContainsToolCallByName);
|
|
370
|
+
registry.register(SPEC_FINAL_RULES_INCLUDES_LITERAL, finalRulesIncludesLiteral);
|
|
371
|
+
registry.register(SPEC_FINAL_RULES_EXCLUDES_LITERAL, finalRulesExcludesLiteral);
|
|
372
|
+
registry.register(SPEC_FINAL_RUNTIME_RUN_SUMMARY_OK, finalRuntimeRunSummaryOk);
|
|
373
|
+
}
|
|
374
|
+
/**
|
|
375
|
+
* Register every custom (post-starter) spec on a registry. Sibling
|
|
376
|
+
* to `registerStarterSpecs`. Splitting the two keeps the meaning of
|
|
377
|
+
* "starter" stable as new custom specs are added.
|
|
378
|
+
*/
|
|
379
|
+
export function registerCustomSpecs(registry) {
|
|
380
|
+
registry.register(SPEC_GAME_RULES_SIMULATOR_ACCEPTS_POSITIVE_AND_REJECTS_CHEAT, gameRulesSimulatorAcceptsPositiveAndRejectsCheat);
|
|
381
|
+
registry.register(SPEC_PYRIC_AGENTS_LINT_CLEAN_AND_RULE_REJECTS_CHEAT, pyricAgentsLintCleanAndRuleRejectsCheat);
|
|
382
|
+
}
|
|
383
|
+
/**
|
|
384
|
+
* Umbrella that registers every spec the library ships — both the
|
|
385
|
+
* starter library and the custom helpers. Equivalent to calling
|
|
386
|
+
* `registerStarterSpecs(registry)` followed by
|
|
387
|
+
* `registerCustomSpecs(registry)`.
|
|
388
|
+
*/
|
|
389
|
+
export function registerAllSpecs(registry) {
|
|
390
|
+
registerStarterSpecs(registry);
|
|
391
|
+
registerCustomSpecs(registry);
|
|
392
|
+
}
|
|
393
|
+
/** Stable list of starter spec names, in registration order. */
|
|
394
|
+
export const STARTER_SPEC_NAMES = [
|
|
395
|
+
SPEC_REPORT_MENTIONS_AT_LEAST_ONE_OF,
|
|
396
|
+
SPEC_REPORT_MENTIONS_ALL_OF,
|
|
397
|
+
SPEC_TRACE_CONTAINS_TOOL_CALL_BY_NAME,
|
|
398
|
+
SPEC_FINAL_RULES_INCLUDES_LITERAL,
|
|
399
|
+
SPEC_FINAL_RULES_EXCLUDES_LITERAL,
|
|
400
|
+
SPEC_FINAL_RUNTIME_RUN_SUMMARY_OK,
|
|
401
|
+
];
|
|
402
|
+
/** Stable list of custom spec names, in registration order. */
|
|
403
|
+
export const CUSTOM_SPEC_NAMES = [
|
|
404
|
+
SPEC_GAME_RULES_SIMULATOR_ACCEPTS_POSITIVE_AND_REJECTS_CHEAT,
|
|
405
|
+
SPEC_PYRIC_AGENTS_LINT_CLEAN_AND_RULE_REJECTS_CHEAT,
|
|
406
|
+
];
|
|
407
|
+
function parseTokensArgs(args, opts) {
|
|
408
|
+
if (!isPlainObject(args)) {
|
|
409
|
+
return argsErr('args must be an object with a `tokens` string[] field');
|
|
410
|
+
}
|
|
411
|
+
const { tokens, caseSensitive } = args;
|
|
412
|
+
if (!Array.isArray(tokens) || tokens.length === 0) {
|
|
413
|
+
return argsErr('args.tokens must be a non-empty string[]');
|
|
414
|
+
}
|
|
415
|
+
if (!tokens.every((t) => typeof t === 'string' && t.length > 0)) {
|
|
416
|
+
return argsErr('args.tokens must contain only non-empty strings');
|
|
417
|
+
}
|
|
418
|
+
if (caseSensitive !== undefined && typeof caseSensitive !== 'boolean') {
|
|
419
|
+
return argsErr('args.caseSensitive must be a boolean when present');
|
|
420
|
+
}
|
|
421
|
+
return {
|
|
422
|
+
ok: true,
|
|
423
|
+
tokens,
|
|
424
|
+
caseSensitive: caseSensitive === undefined ? opts.defaultCaseSensitive : caseSensitive,
|
|
425
|
+
};
|
|
426
|
+
}
|
|
427
|
+
function parseToolCallArgs(args) {
|
|
428
|
+
if (!isPlainObject(args)) {
|
|
429
|
+
return argsErr('args must be an object with a `tool` string field');
|
|
430
|
+
}
|
|
431
|
+
const { tool, minCount } = args;
|
|
432
|
+
if (typeof tool !== 'string' || tool.length === 0) {
|
|
433
|
+
return argsErr('args.tool must be a non-empty string');
|
|
434
|
+
}
|
|
435
|
+
if (minCount !== undefined &&
|
|
436
|
+
(typeof minCount !== 'number' || !Number.isInteger(minCount) || minCount < 1)) {
|
|
437
|
+
return argsErr('args.minCount must be a positive integer when present');
|
|
438
|
+
}
|
|
439
|
+
return {
|
|
440
|
+
ok: true,
|
|
441
|
+
tool,
|
|
442
|
+
minCount: typeof minCount === 'number' ? minCount : 1,
|
|
443
|
+
};
|
|
444
|
+
}
|
|
445
|
+
function parseLiteralArgs(args) {
|
|
446
|
+
if (!isPlainObject(args)) {
|
|
447
|
+
return argsErr('args must be an object with a `literal` string field');
|
|
448
|
+
}
|
|
449
|
+
const { literal, caseSensitive } = args;
|
|
450
|
+
if (typeof literal !== 'string' || literal.length === 0) {
|
|
451
|
+
return argsErr('args.literal must be a non-empty string');
|
|
452
|
+
}
|
|
453
|
+
if (caseSensitive !== undefined && typeof caseSensitive !== 'boolean') {
|
|
454
|
+
return argsErr('args.caseSensitive must be a boolean when present');
|
|
455
|
+
}
|
|
456
|
+
return {
|
|
457
|
+
ok: true,
|
|
458
|
+
literal,
|
|
459
|
+
caseSensitive: caseSensitive === undefined ? true : caseSensitive,
|
|
460
|
+
};
|
|
461
|
+
}
|
|
462
|
+
function rulesContains(snapshot, args, shouldInclude) {
|
|
463
|
+
const parsed = parseLiteralArgs(args);
|
|
464
|
+
if (!parsed.ok)
|
|
465
|
+
return parsed.err;
|
|
466
|
+
const haystack = parsed.caseSensitive
|
|
467
|
+
? snapshot.finalWorkspace.rules
|
|
468
|
+
: snapshot.finalWorkspace.rules.toLowerCase();
|
|
469
|
+
const needle = parsed.caseSensitive ? parsed.literal : parsed.literal.toLowerCase();
|
|
470
|
+
const includes = haystack.includes(needle);
|
|
471
|
+
return {
|
|
472
|
+
ok: shouldInclude ? includes : !includes,
|
|
473
|
+
detail: { literal: parsed.literal, includes },
|
|
474
|
+
};
|
|
475
|
+
}
|
|
476
|
+
function parseGameRulesSimulatorArgs(args) {
|
|
477
|
+
if (!isPlainObject(args)) {
|
|
478
|
+
return argsErr('args must be an object with `positive` and `cheat` fields');
|
|
479
|
+
}
|
|
480
|
+
const { database, positive, cheat } = args;
|
|
481
|
+
if (database !== undefined && database !== 'firestore' && database !== 'rtdb') {
|
|
482
|
+
return argsErr('args.database must be "firestore" or "rtdb" when present');
|
|
483
|
+
}
|
|
484
|
+
if (!isPlainObject(positive)) {
|
|
485
|
+
return argsErr('args.positive must be an object');
|
|
486
|
+
}
|
|
487
|
+
if (!isPlainObject(cheat)) {
|
|
488
|
+
return argsErr('args.cheat must be an object');
|
|
489
|
+
}
|
|
490
|
+
const positiveTokens = deriveSideTokens(positive, 'positive', 'requiredTokens');
|
|
491
|
+
if (!positiveTokens.ok)
|
|
492
|
+
return positiveTokens;
|
|
493
|
+
const cheatTokens = deriveSideTokens(cheat, 'cheat', 'rejectionTokens');
|
|
494
|
+
if (!cheatTokens.ok)
|
|
495
|
+
return cheatTokens;
|
|
496
|
+
return {
|
|
497
|
+
ok: true,
|
|
498
|
+
database: database,
|
|
499
|
+
positiveTokens: positiveTokens.tokens,
|
|
500
|
+
cheatTokens: cheatTokens.tokens,
|
|
501
|
+
};
|
|
502
|
+
}
|
|
503
|
+
function parsePyricLintArgs(args) {
|
|
504
|
+
if (!isPlainObject(args)) {
|
|
505
|
+
return argsErr('args must be an object');
|
|
506
|
+
}
|
|
507
|
+
const obj = args;
|
|
508
|
+
if (obj.lintToolName !== undefined && typeof obj.lintToolName !== 'string') {
|
|
509
|
+
return argsErr('args.lintToolName must be a string when present');
|
|
510
|
+
}
|
|
511
|
+
if (typeof obj.lintToolName === 'string' && obj.lintToolName.length === 0) {
|
|
512
|
+
return argsErr('args.lintToolName must be a non-empty string when present');
|
|
513
|
+
}
|
|
514
|
+
const cheat = obj.cheat ?? obj.cheatAttempt;
|
|
515
|
+
if (!isPlainObject(cheat)) {
|
|
516
|
+
return argsErr('args.cheat (or args.cheatAttempt) must be an object');
|
|
517
|
+
}
|
|
518
|
+
const cheatTokens = deriveSideTokens(cheat, 'cheat', 'rejectionTokens');
|
|
519
|
+
if (!cheatTokens.ok)
|
|
520
|
+
return cheatTokens;
|
|
521
|
+
return {
|
|
522
|
+
ok: true,
|
|
523
|
+
lintToolName: typeof obj.lintToolName === 'string' ? obj.lintToolName : 'lint_firestore_rules',
|
|
524
|
+
rejectionTokens: cheatTokens.tokens,
|
|
525
|
+
};
|
|
526
|
+
}
|
|
527
|
+
/**
|
|
528
|
+
* Two arg-shapes are supported per the v1 approximation:
|
|
529
|
+
*
|
|
530
|
+
* 1. Explicit token list under `requiredTokens` / `rejectionTokens`.
|
|
531
|
+
* Validated as a non-empty string[] of non-empty entries.
|
|
532
|
+
* 2. Simulator-style payload with `data` (object) and/or `path`
|
|
533
|
+
* (string). String-valued leaves of `data` plus the `path`
|
|
534
|
+
* (when present) are treated as required tokens. Numeric or
|
|
535
|
+
* boolean leaves are intentionally skipped — they would
|
|
536
|
+
* collide with arbitrary numbers and `true`/`false` literals
|
|
537
|
+
* in the rules text and produce false-positive matches.
|
|
538
|
+
*
|
|
539
|
+
* An empty derived token list is a malformed-args error so a
|
|
540
|
+
* misconfigured fixture surfaces immediately rather than silently
|
|
541
|
+
* passing.
|
|
542
|
+
*/
|
|
543
|
+
function deriveSideTokens(side, label, tokensField) {
|
|
544
|
+
const explicit = side[tokensField];
|
|
545
|
+
if (explicit !== undefined) {
|
|
546
|
+
if (!Array.isArray(explicit) || explicit.length === 0) {
|
|
547
|
+
return argsErr(`args.${label}.${tokensField} must be a non-empty string[] when present`);
|
|
548
|
+
}
|
|
549
|
+
if (!explicit.every((t) => typeof t === 'string' && t.length > 0)) {
|
|
550
|
+
return argsErr(`args.${label}.${tokensField} must contain only non-empty strings`);
|
|
551
|
+
}
|
|
552
|
+
return { ok: true, tokens: explicit };
|
|
553
|
+
}
|
|
554
|
+
const collected = [];
|
|
555
|
+
const path = side.path;
|
|
556
|
+
if (typeof path === 'string' && path.length > 0) {
|
|
557
|
+
for (const segment of path.split('/')) {
|
|
558
|
+
if (segment.length > 0)
|
|
559
|
+
collected.push(segment);
|
|
560
|
+
}
|
|
561
|
+
}
|
|
562
|
+
if (side.data !== undefined) {
|
|
563
|
+
collectStringLeaves(side.data, collected);
|
|
564
|
+
}
|
|
565
|
+
if (collected.length === 0) {
|
|
566
|
+
return argsErr(`args.${label} must supply either ${tokensField}: string[] or a simulator-style payload ` +
|
|
567
|
+
`(path/data) from which tokens can be derived`);
|
|
568
|
+
}
|
|
569
|
+
// De-dup while preserving insertion order.
|
|
570
|
+
const seen = new Set();
|
|
571
|
+
const tokens = [];
|
|
572
|
+
for (const t of collected) {
|
|
573
|
+
if (!seen.has(t)) {
|
|
574
|
+
seen.add(t);
|
|
575
|
+
tokens.push(t);
|
|
576
|
+
}
|
|
577
|
+
}
|
|
578
|
+
return { ok: true, tokens };
|
|
579
|
+
}
|
|
580
|
+
function collectStringLeaves(value, sink) {
|
|
581
|
+
if (typeof value === 'string') {
|
|
582
|
+
if (value.length > 0)
|
|
583
|
+
sink.push(value);
|
|
584
|
+
return;
|
|
585
|
+
}
|
|
586
|
+
if (Array.isArray(value)) {
|
|
587
|
+
for (const item of value)
|
|
588
|
+
collectStringLeaves(item, sink);
|
|
589
|
+
return;
|
|
590
|
+
}
|
|
591
|
+
if (value !== null && typeof value === 'object') {
|
|
592
|
+
for (const key of Object.keys(value)) {
|
|
593
|
+
sink.push(key);
|
|
594
|
+
collectStringLeaves(value[key], sink);
|
|
595
|
+
}
|
|
596
|
+
}
|
|
597
|
+
// numbers, booleans, null, undefined: intentionally skipped.
|
|
598
|
+
}
|
|
599
|
+
function argsErr(message) {
|
|
600
|
+
return { ok: false, err: { ok: false, error: `invalid args: ${message}` } };
|
|
601
|
+
}
|
|
602
|
+
function isPlainObject(value) {
|
|
603
|
+
return typeof value === 'object' && value !== null && !Array.isArray(value);
|
|
604
|
+
}
|
|
605
|
+
//# sourceMappingURL=spec-helpers.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"spec-helpers.js","sourceRoot":"","sources":["../../src/eval/spec-helpers.ts"],"names":[],"mappings":"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"}
|