@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.
Files changed (130) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +2 -2
  3. package/dist/cli/commands/run.js.map +1 -1
  4. package/dist/cli/fixtures.d.ts +2 -2
  5. package/dist/cli/fixtures.d.ts.map +1 -1
  6. package/dist/cli/fixtures.js +7 -16
  7. package/dist/cli/fixtures.js.map +1 -1
  8. package/dist/cli/llm/openrouter.d.ts +4 -4
  9. package/dist/cli/llm/openrouter.d.ts.map +1 -1
  10. package/dist/cli/llm/openrouter.js +20 -31
  11. package/dist/cli/llm/openrouter.js.map +1 -1
  12. package/dist/diagnostics/index.d.ts +5 -0
  13. package/dist/diagnostics/index.d.ts.map +1 -0
  14. package/dist/diagnostics/index.js +3 -0
  15. package/dist/diagnostics/index.js.map +1 -0
  16. package/dist/diagnostics/timing.d.ts +48 -0
  17. package/dist/diagnostics/timing.d.ts.map +1 -0
  18. package/dist/diagnostics/timing.js +85 -0
  19. package/dist/diagnostics/timing.js.map +1 -0
  20. package/dist/diagnostics/truthfulness.d.ts +36 -0
  21. package/dist/diagnostics/truthfulness.d.ts.map +1 -0
  22. package/dist/diagnostics/truthfulness.js +180 -0
  23. package/dist/diagnostics/truthfulness.js.map +1 -0
  24. package/dist/dispatch-memoization.d.ts +84 -0
  25. package/dist/dispatch-memoization.d.ts.map +1 -0
  26. package/dist/dispatch-memoization.js +197 -0
  27. package/dist/dispatch-memoization.js.map +1 -0
  28. package/dist/eval/comparison-report.d.ts +164 -0
  29. package/dist/eval/comparison-report.d.ts.map +1 -0
  30. package/dist/eval/comparison-report.js +316 -0
  31. package/dist/eval/comparison-report.js.map +1 -0
  32. package/dist/eval/fixture.d.ts +74 -0
  33. package/dist/eval/fixture.d.ts.map +1 -0
  34. package/dist/eval/fixture.js +217 -0
  35. package/dist/eval/fixture.js.map +1 -0
  36. package/dist/eval/index.d.ts +13 -0
  37. package/dist/eval/index.d.ts.map +1 -0
  38. package/dist/eval/index.js +7 -0
  39. package/dist/eval/index.js.map +1 -0
  40. package/dist/eval/load-node.d.ts +16 -0
  41. package/dist/eval/load-node.d.ts.map +1 -0
  42. package/dist/eval/load-node.js +58 -0
  43. package/dist/eval/load-node.js.map +1 -0
  44. package/dist/eval/metric-collector.d.ts +209 -0
  45. package/dist/eval/metric-collector.d.ts.map +1 -0
  46. package/dist/eval/metric-collector.js +293 -0
  47. package/dist/eval/metric-collector.js.map +1 -0
  48. package/dist/eval/run-record.d.ts +76 -0
  49. package/dist/eval/run-record.d.ts.map +1 -0
  50. package/dist/eval/run-record.js +32 -0
  51. package/dist/eval/run-record.js.map +1 -0
  52. package/dist/eval/runner.d.ts +140 -0
  53. package/dist/eval/runner.d.ts.map +1 -0
  54. package/dist/eval/runner.js +310 -0
  55. package/dist/eval/runner.js.map +1 -0
  56. package/dist/eval/spec-framework.d.ts +113 -0
  57. package/dist/eval/spec-framework.d.ts.map +1 -0
  58. package/dist/eval/spec-framework.js +100 -0
  59. package/dist/eval/spec-framework.js.map +1 -0
  60. package/dist/eval/spec-helpers.d.ts +245 -0
  61. package/dist/eval/spec-helpers.d.ts.map +1 -0
  62. package/dist/eval/spec-helpers.js +605 -0
  63. package/dist/eval/spec-helpers.js.map +1 -0
  64. package/dist/index.d.ts +32 -8
  65. package/dist/index.d.ts.map +1 -1
  66. package/dist/index.js +14 -3
  67. package/dist/index.js.map +1 -1
  68. package/dist/llm-adapter.d.ts +30 -34
  69. package/dist/llm-adapter.d.ts.map +1 -1
  70. package/dist/llm-adapter.js +61 -51
  71. package/dist/llm-adapter.js.map +1 -1
  72. package/dist/mcp/connect.d.ts +68 -0
  73. package/dist/mcp/connect.d.ts.map +1 -0
  74. package/dist/mcp/connect.js +111 -0
  75. package/dist/mcp/connect.js.map +1 -0
  76. package/dist/metrics.js +4 -4
  77. package/dist/metrics.js.map +1 -1
  78. package/dist/node.d.ts +3 -0
  79. package/dist/node.d.ts.map +1 -1
  80. package/dist/node.js +2 -0
  81. package/dist/node.js.map +1 -1
  82. package/dist/planner-executor.d.ts +132 -0
  83. package/dist/planner-executor.d.ts.map +1 -0
  84. package/dist/planner-executor.js +274 -0
  85. package/dist/planner-executor.js.map +1 -0
  86. package/dist/retrieval.d.ts +74 -0
  87. package/dist/retrieval.d.ts.map +1 -0
  88. package/dist/retrieval.js +287 -0
  89. package/dist/retrieval.js.map +1 -0
  90. package/dist/session.d.ts.map +1 -1
  91. package/dist/session.js +8 -2
  92. package/dist/session.js.map +1 -1
  93. package/dist/skill-catalog.d.ts +81 -0
  94. package/dist/skill-catalog.d.ts.map +1 -0
  95. package/dist/skill-catalog.js +388 -0
  96. package/dist/skill-catalog.js.map +1 -0
  97. package/dist/skill-router.d.ts +95 -0
  98. package/dist/skill-router.d.ts.map +1 -0
  99. package/dist/skill-router.js +130 -0
  100. package/dist/skill-router.js.map +1 -0
  101. package/dist/strategy.d.ts +22 -2
  102. package/dist/strategy.d.ts.map +1 -1
  103. package/dist/strategy.js +358 -28
  104. package/dist/strategy.js.map +1 -1
  105. package/dist/tools.d.ts +15 -1
  106. package/dist/tools.d.ts.map +1 -1
  107. package/dist/tools.js +18 -0
  108. package/dist/tools.js.map +1 -1
  109. package/dist/types/agent.d.ts +2 -3
  110. package/dist/types/agent.d.ts.map +1 -1
  111. package/dist/types/agent.js +1 -1
  112. package/dist/types/chat.d.ts +0 -15
  113. package/dist/types/chat.d.ts.map +1 -1
  114. package/dist/types/llm.d.ts +11 -64
  115. package/dist/types/llm.d.ts.map +1 -1
  116. package/dist/types/llm.js +7 -8
  117. package/dist/types/llm.js.map +1 -1
  118. package/dist/types/metrics.d.ts +2 -2
  119. package/dist/types/metrics.d.ts.map +1 -1
  120. package/dist/types/session.d.ts +2 -2
  121. package/dist/types/session.d.ts.map +1 -1
  122. package/dist/types/strategy.d.ts +60 -3
  123. package/dist/types/strategy.d.ts.map +1 -1
  124. package/dist/types/tools.d.ts +18 -0
  125. package/dist/types/tools.d.ts.map +1 -1
  126. package/dist/types/trace.d.ts +67 -15
  127. package/dist/types/trace.d.ts.map +1 -1
  128. package/dist/types/trace.js +5 -3
  129. package/dist/types/trace.js.map +1 -1
  130. 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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"}