@curatedmcp/tokenshield 0.2.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/README.md ADDED
@@ -0,0 +1,206 @@
1
+ # TokenShield
2
+
3
+ **Cut your Claude Code bill 40–70%.** Local proxy. Your API key never leaves your machine.
4
+
5
+ [![npm version](https://img.shields.io/npm/v/@curatedmcp/tokenshield.svg)](https://www.npmjs.com/package/@curatedmcp/tokenshield)
6
+ [![license](https://img.shields.io/npm/l/@curatedmcp/tokenshield.svg)](https://github.com/oneprofile-dev/tokenshield/blob/main/LICENSE)
7
+ [![node](https://img.shields.io/node/v/@curatedmcp/tokenshield.svg)](https://nodejs.org)
8
+ [![provenance](https://img.shields.io/badge/npm-provenance-blue.svg)](https://docs.npmjs.com/generating-provenance-statements)
9
+
10
+ ```bash
11
+ npm install -g @curatedmcp/tokenshield
12
+ tokenshield setup
13
+ ```
14
+
15
+ That's it. Your existing `ANTHROPIC_API_KEY`, your existing Claude Code workflow — now 40–70% cheaper.
16
+
17
+ ---
18
+
19
+ ## Why TokenShield exists
20
+
21
+ Claude Code is great. Claude Code is also expensive. A 25-turn agentic session that re-reads the same `auth.ts` five times and re-runs `gh pr list` three times burns ~$1.60 in tokens — even though 60% of the bytes flowing to Anthropic are exact duplicates.
22
+
23
+ TokenShield sits between your AI tool (Claude Code, Cursor, Windsurf, Aider, anything that speaks the Anthropic SDK) and `api.anthropic.com`. It deduplicates repeated tool results inside the conversation and caches deterministic responses. **Everything runs on your machine.** Your prompts never touch our servers.
24
+
25
+ ---
26
+
27
+ ## Measured savings (v0.2, real numbers)
28
+
29
+ These come from `tokenshield bench`, which replays three recorded sessions through the pipeline:
30
+
31
+ | Workload | What it looks like | Savings |
32
+ |----------|-------------------|---------|
33
+ | **Light** | 5-turn Q&A, no tool use | **0%** (dedup correctly doesn't trigger) |
34
+ | **Medium** | 12-turn coding session, 2 file re-reads | **27.7%** |
35
+ | **Heavy** | 25-turn agentic loop, 5 file re-reads + 3 `gh pr list` repeats | **62.1%** |
36
+ | **Aggregate** | All three above | **54.2%** |
37
+
38
+ **These four numbers are CI-asserted.** Every commit on `main` runs the bench and fails the build if any savings regress. We are not making this up — clone the repo and run `tokenshield bench` on your laptop.
39
+
40
+ ---
41
+
42
+ ## 60-second quickstart
43
+
44
+ ```bash
45
+ # 1. Install
46
+ npm install -g @curatedmcp/tokenshield
47
+
48
+ # 2. Start the proxy + local dashboard
49
+ tokenshield up
50
+ # ▸ Proxy: http://127.0.0.1:7777
51
+ # ▸ Dashboard: http://127.0.0.1:7778
52
+
53
+ # 3. In a fresh shell, point Claude Code at the proxy:
54
+ export ANTHROPIC_BASE_URL=http://127.0.0.1:7777
55
+ claude # your normal workflow — savings tick up in the dashboard
56
+ ```
57
+
58
+ Or let TokenShield write that `export` line into your `~/.zshrc` for you:
59
+
60
+ ```bash
61
+ tokenshield integrations enable claude-code
62
+ ```
63
+
64
+ ---
65
+
66
+ ## Works with everything that speaks Anthropic
67
+
68
+ | Tool | Status |
69
+ |------|--------|
70
+ | Claude Code | ✅ live |
71
+ | Cursor (Anthropic mode) | ✅ live |
72
+ | Windsurf (Anthropic mode) | ✅ live |
73
+ | Zed (Anthropic mode) | ✅ live |
74
+ | Aider (Anthropic mode) | ✅ live |
75
+ | Continue.dev, Cline, Roo, anything using `@anthropic-ai/sdk` | ✅ live |
76
+ | OpenAI endpoints | 🕒 v1.1 — [join the waitlist](https://curatedmcp.com/tokenshield#waitlist) |
77
+ | Google Gemini | 🕒 v1.2 — [join the waitlist](https://curatedmcp.com/tokenshield#waitlist) |
78
+
79
+ ---
80
+
81
+ ## How it works in 5 bullets
82
+
83
+ 1. **Transparent HTTP proxy** with byte-faithful SSE streaming preservation. Your client never knows it's not talking to Anthropic directly.
84
+ 2. **Conversation dedup** — every `tool_result` is content-hashed (SHA-256). Second and subsequent occurrences inside a conversation are replaced with a deterministic pointer. First occurrence is always kept verbatim.
85
+ 3. **Response cache** — conservative LRU+TTL cache for `temperature === 0 && stream === false` requests. Cache hits short-circuit without invoking Anthropic.
86
+ 4. **Fail-open middleware** — if any processor throws, the request goes through untouched. Per-processor circuit breaker disables flaky processors after 3 failures in 60s.
87
+ 5. **SQLite ledger** using Node 22's built-in `node:sqlite`. **Zero native dependencies.** No compile toolchain pain. No `node-gyp`. No `npm rebuild`.
88
+
89
+ Full architecture in 60 seconds:
90
+
91
+ ```
92
+ Claude Code ─▶ TokenShield proxy ─▶ api.anthropic.com
93
+ (or Cursor, 127.0.0.1:7777
94
+ Windsurf, (your machine)
95
+ Aider, …) │
96
+
97
+ ~/.tokenshield/ledger.db
98
+ http://127.0.0.1:7778
99
+ (live local dashboard)
100
+ ```
101
+
102
+ ---
103
+
104
+ ## CLI surface
105
+
106
+ ```text
107
+ tokenshield setup 60-second guided install
108
+ tokenshield up start in foreground (Ctrl-C to stop)
109
+ tokenshield up --daemon start in background
110
+ tokenshield status daemon state + last-24h spend
111
+ tokenshield logs --limit 20 recent requests with savings %
112
+ tokenshield bench replay built-in fixtures and report savings
113
+ tokenshield demo canned 8-turn savings replay (no network)
114
+ tokenshield doctor health check (Node, key, network, ports)
115
+ tokenshield stop stop the background daemon
116
+ tokenshield integrations list detect Claude Code / Cursor / Windsurf / Zed / Aider
117
+ tokenshield integrations enable claude-code # write managed block to shell rc
118
+ tokenshield telemetry status # show telemetry state + anonId
119
+ tokenshield telemetry off # opt out of anonymous usage stats
120
+ tokenshield telemetry show # show the exact privacy contract
121
+ ```
122
+
123
+ Every command supports `--json`, `--quiet`, and `--debug`. Exit codes are category-specific so scripts can react: `10` port-in-use, `11` daemon-not-running, `20` missing API key, `30` upstream unreachable, etc.
124
+
125
+ ---
126
+
127
+ ## Privacy — what actually leaves your machine
128
+
129
+ - **Your `ANTHROPIC_API_KEY`** stays in process memory. Never written to disk. Never sent to CuratedMCP.
130
+ - **Your prompts** stay between your machine and Anthropic. The proxy is transparent.
131
+ - **Optional cloud telemetry** (off by default) is aggregate-only: token counts and dollar savings. Schema-validated locally to reject any field whose name suggests content (`prompt`, `message`, `content`, `text`, `body`).
132
+ - **Default localhost binding** (`127.0.0.1`). Opt-in `--bind 0.0.0.0` for team deployments behind a VPN.
133
+
134
+ Read the full threat model: [docs/whitepaper.md](https://github.com/oneprofile-dev/tokenshield/blob/main/docs/whitepaper.md)
135
+
136
+ ---
137
+
138
+ ## Pricing
139
+
140
+ | Plan | Price | What you get |
141
+ |------|-------|--------------|
142
+ | **Free (local)** | $0 forever | Full proxy + dashboard + dedup + cache. Everything on this README works. Anonymous usage stats (token counts and $ saved — **never** prompt content) ship to CuratedMCP by default. Disable with `tokenshield telemetry off`. |
143
+ | **Solo Dev** | $19/mo | Cloud dashboard synced across machines, savings history, monthly PDF expense reports |
144
+ | **Team Standard** | $29/seat/mo | All of Solo Dev + governance + MCP audit logs |
145
+ | **Team Pro** | $59/seat/mo | All of Team Standard + Sentinel anomaly detection + priority routing |
146
+
147
+ > The free local version is a real product — it's not a teaser. If you never upgrade, you'll still save 40–70% on your Claude bill. We make money when you want savings visible to your finance team, or when you need governance across an engineering org.
148
+
149
+ ### What gets tracked
150
+
151
+ ```bash
152
+ tokenshield telemetry show # see the exact contract
153
+ tokenshield telemetry status # is it on or off right now?
154
+ tokenshield telemetry off # disable — no data leaves your machine
155
+ ```
156
+
157
+ **Sent (aggregate, batched every 50 requests or 5 min):** request count, total token counts, total $ saved estimate, CLI/Node version, OS, provider (anthropic/openai/gemini), most-used model.
158
+
159
+ **Never sent:** prompt content, responses, file contents, file paths, API keys, IP address, hostname, username, project names, command arguments. The server-side ingest validates this and rejects any payload containing fields named `prompt`, `message`, `content`, `text`, `body`, `args`, etc.
160
+
161
+ **Anonymous ID:** a deterministic SHA-256 of `hostname + username` — it's stable across runs on the same machine but **cannot** be reversed to identify a person or cross-correlated with other CuratedMCP products.
162
+
163
+ **Honors all standard kill switches:** `TOKENSHIELD_TELEMETRY=0`, `DO_NOT_TRACK=1`, `CI=true`.
164
+
165
+ Pricing & checkout: **[curatedmcp.com/tokenshield](https://curatedmcp.com/tokenshield)**
166
+
167
+ ---
168
+
169
+ ## Part of the CuratedMCP control plane
170
+
171
+ TokenShield is one of three products at **[curatedmcp.com](https://curatedmcp.com)** — the MCP governance control plane for engineering organizations:
172
+
173
+ - **🛡️ TokenShield** — cut your Claude Code bill 40–70% (you're reading the README)
174
+ - **🔍 [MCP Auditor](https://curatedmcp.com/auditor)** — static analysis for MCP server security, dependency drift, supply-chain risk
175
+ - **📊 [Sentinel](https://curatedmcp.com/sentinel)** — runtime anomaly detection for MCP server behavior in production
176
+
177
+ If you're an engineering leader trying to answer "what MCP servers are running across my org, what are they costing me, and what's the security posture?" — **[start a CuratedMCP pilot](https://curatedmcp.com/enterprise/pilot)**.
178
+
179
+ ---
180
+
181
+ ## Status
182
+
183
+ - **v0.2.x (today)**: conversation-dedup + response-cache + production-grade CLI. 64/64 tests green. Anthropic provider live.
184
+ - **v0.3** (week of 2026-05-24): diff-based file reads + streaming early-stop. Heavy workloads → 70%+ savings.
185
+ - **v1.0** (week of 2026-05-31): context auto-summarize + Stripe checkout + GA.
186
+ - **v1.1** (week of 2026-06-07): OpenAI provider live.
187
+ - **v1.2** (week of 2026-06-14): Google Gemini provider live.
188
+
189
+ ---
190
+
191
+ ## Links
192
+
193
+ - **Website:** [curatedmcp.com/tokenshield](https://curatedmcp.com/tokenshield)
194
+ - **Whitepaper** (CC BY 4.0): [docs/whitepaper.md](https://github.com/oneprofile-dev/tokenshield/blob/main/docs/whitepaper.md)
195
+ - **Source:** [github.com/oneprofile-dev/tokenshield](https://github.com/oneprofile-dev/tokenshield)
196
+ - **Issues:** [github.com/oneprofile-dev/tokenshield/issues](https://github.com/oneprofile-dev/tokenshield/issues)
197
+ - **npm:** [`@curatedmcp/tokenshield`](https://www.npmjs.com/package/@curatedmcp/tokenshield) · [`@curatedmcp/tokenshield-core`](https://www.npmjs.com/package/@curatedmcp/tokenshield-core)
198
+ - **Enterprise pilots:** [curatedmcp.com/enterprise/pilot](https://curatedmcp.com/enterprise/pilot)
199
+
200
+ ## License
201
+
202
+ MIT — see [LICENSE](https://github.com/oneprofile-dev/tokenshield/blob/main/LICENSE).
203
+
204
+ ---
205
+
206
+ <sub>Built by [CuratedMCP](https://curatedmcp.com) — the MCP governance control plane for engineering orgs.</sub>
package/dist/cli.js CHANGED
@@ -10,10 +10,11 @@ import { runStop } from "./commands/stop.js";
10
10
  import { runLogs } from "./commands/logs.js";
11
11
  import { runSetup } from "./commands/setup.js";
12
12
  import { runIntegrationsList, runIntegrationsEnable, runIntegrationsShow, runIntegrationsDisable, } from "./commands/integrations.js";
13
+ import { runTelemetry } from "./commands/telemetry.js";
13
14
  import { setOutputMode, c, dim, emit, isJson } from "./lib/ui.js";
14
15
  import { ensureNumber, runCommand, installProcessHandlers } from "./lib/errors.js";
15
16
  installProcessHandlers();
16
- const VERSION = "0.2.0";
17
+ const VERSION = "0.3.0";
17
18
  const program = new Command();
18
19
  program
19
20
  .name("tokenshield")
@@ -224,6 +225,26 @@ integrations
224
225
  .command("disable <target>")
225
226
  .description("Remove TokenShield config (currently: only 'shell')")
226
227
  .action((target) => runCommand(() => runIntegrationsDisable(target)));
228
+ // ── telemetry ─────────────────────────────────────────────────────────────────
229
+ const telemetryCmd = program
230
+ .command("telemetry")
231
+ .description("Manage anonymous usage telemetry (aggregate counters only — no prompt content)");
232
+ telemetryCmd
233
+ .command("on")
234
+ .description("Enable anonymous usage telemetry")
235
+ .action(() => runCommand(() => runTelemetry({ action: "on" })));
236
+ telemetryCmd
237
+ .command("off")
238
+ .description("Disable telemetry — no data sent")
239
+ .action(() => runCommand(() => runTelemetry({ action: "off" })));
240
+ telemetryCmd
241
+ .command("status")
242
+ .description("Show current telemetry state")
243
+ .action(() => runCommand(() => runTelemetry({ action: "status" })));
244
+ telemetryCmd
245
+ .command("show")
246
+ .description("Show exactly what telemetry sends — the privacy contract")
247
+ .action(() => runCommand(() => runTelemetry({ action: "show" })));
227
248
  // ── go ────────────────────────────────────────────────────────────────────────
228
249
  program.parseAsync(process.argv).catch((err) => {
229
250
  // Anything not caught by runCommand wrappers
package/dist/cli.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"cli.js","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"cli.js","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":"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"}
@@ -7,9 +7,9 @@ import { c, sym, dim, emit, emitJson, isJson, heading, table } from "../lib/ui.j
7
7
  import { TokenShieldError } from "../lib/errors.js";
8
8
  const TOKEN_PER_BYTE = 1 / 3.5; // industry rule-of-thumb for English+code
9
9
  function defaultFixturesDir() {
10
- // packages/cli/dist/commands/bench.js — fixtures at ../../../../test-fixtures/sessions
10
+ // packages/cli/dist/commands/bench.js — bundled fixtures at ../../fixtures/sessions
11
11
  const here = dirname(fileURLToPath(import.meta.url));
12
- return join(here, "..", "..", "..", "test-fixtures", "sessions");
12
+ return join(here, "..", "..", "fixtures", "sessions");
13
13
  }
14
14
  async function listFixtures(dir) {
15
15
  let entries;
@@ -1 +1 @@
1
- {"version":3,"file":"bench.js","sourceRoot":"","sources":["../../src/commands/bench.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"bench.js","sourceRoot":"","sources":["../../src/commands/bench.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,4 @@
1
+ export interface TelemetryOptions {
2
+ action: "on" | "off" | "status" | "show";
3
+ }
4
+ export declare function runTelemetry(opts: TelemetryOptions): Promise<void>;
@@ -0,0 +1,46 @@
1
+ import { isTelemetryEnabled, setTelemetryEnabled, getAnonId, firstRunBanner, } from "@curatedmcp/tokenshield-core";
2
+ import { c, dim, emit, emitJson, isJson } from "../lib/ui.js";
3
+ export async function runTelemetry(opts) {
4
+ switch (opts.action) {
5
+ case "on": {
6
+ setTelemetryEnabled(true);
7
+ if (isJson()) {
8
+ emitJson({ ok: true, telemetry: "on" });
9
+ }
10
+ else {
11
+ emit(c.green("✓") + " TokenShield telemetry enabled.");
12
+ emit(dim(" Anonymous aggregate counters only — see `tokenshield telemetry show`."));
13
+ }
14
+ return;
15
+ }
16
+ case "off": {
17
+ setTelemetryEnabled(false);
18
+ if (isJson()) {
19
+ emitJson({ ok: true, telemetry: "off" });
20
+ }
21
+ else {
22
+ emit(c.green("✓") + " TokenShield telemetry disabled.");
23
+ emit(dim(" No data will be sent. Re-enable with `tokenshield telemetry on`."));
24
+ }
25
+ return;
26
+ }
27
+ case "status": {
28
+ const on = isTelemetryEnabled();
29
+ if (isJson()) {
30
+ emitJson({ ok: true, telemetry: on ? "on" : "off", anonId: getAnonId() });
31
+ }
32
+ else {
33
+ emit(`TokenShield telemetry: ${on ? c.green("on") : c.bold("off")}`);
34
+ emit(dim(` anonId: ${getAnonId().slice(0, 16)}…`));
35
+ emit(dim(` endpoint: ${process.env["TOKENSHIELD_TELEMETRY_URL"] ?? "https://curatedmcp.com/api/v1/tokenshield/telemetry"}`));
36
+ }
37
+ return;
38
+ }
39
+ case "show": {
40
+ // Show exactly what gets sent — the privacy contract.
41
+ emit(firstRunBanner());
42
+ return;
43
+ }
44
+ }
45
+ }
46
+ //# sourceMappingURL=telemetry.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"telemetry.js","sourceRoot":"","sources":["../../src/commands/telemetry.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,kBAAkB,EAClB,mBAAmB,EACnB,SAAS,EACT,cAAc,GACf,MAAM,8BAA8B,CAAC;AACtC,OAAO,EAAE,CAAC,EAAE,GAAG,EAAE,IAAI,EAAE,QAAQ,EAAE,MAAM,EAAE,MAAM,cAAc,CAAC;AAM9D,MAAM,CAAC,KAAK,UAAU,YAAY,CAAC,IAAsB;IACvD,QAAQ,IAAI,CAAC,MAAM,EAAE,CAAC;QACpB,KAAK,IAAI,CAAC,CAAC,CAAC;YACV,mBAAmB,CAAC,IAAI,CAAC,CAAC;YAC1B,IAAI,MAAM,EAAE,EAAE,CAAC;gBACb,QAAQ,CAAC,EAAE,EAAE,EAAE,IAAI,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;YAC1C,CAAC;iBAAM,CAAC;gBACN,IAAI,CAAC,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC,GAAG,iCAAiC,CAAC,CAAC;gBACvD,IAAI,CAAC,GAAG,CAAC,yEAAyE,CAAC,CAAC,CAAC;YACvF,CAAC;YACD,OAAO;QACT,CAAC;QACD,KAAK,KAAK,CAAC,CAAC,CAAC;YACX,mBAAmB,CAAC,KAAK,CAAC,CAAC;YAC3B,IAAI,MAAM,EAAE,EAAE,CAAC;gBACb,QAAQ,CAAC,EAAE,EAAE,EAAE,IAAI,EAAE,SAAS,EAAE,KAAK,EAAE,CAAC,CAAC;YAC3C,CAAC;iBAAM,CAAC;gBACN,IAAI,CAAC,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC,GAAG,kCAAkC,CAAC,CAAC;gBACxD,IAAI,CAAC,GAAG,CAAC,oEAAoE,CAAC,CAAC,CAAC;YAClF,CAAC;YACD,OAAO;QACT,CAAC;QACD,KAAK,QAAQ,CAAC,CAAC,CAAC;YACd,MAAM,EAAE,GAAG,kBAAkB,EAAE,CAAC;YAChC,IAAI,MAAM,EAAE,EAAE,CAAC;gBACb,QAAQ,CAAC,EAAE,EAAE,EAAE,IAAI,EAAE,SAAS,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,KAAK,EAAE,MAAM,EAAE,SAAS,EAAE,EAAE,CAAC,CAAC;YAC5E,CAAC;iBAAM,CAAC;gBACN,IAAI,CAAC,0BAA0B,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC;gBACrE,IAAI,CAAC,GAAG,CAAC,aAAa,SAAS,EAAE,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC;gBACpD,IAAI,CAAC,GAAG,CAAC,eAAe,OAAO,CAAC,GAAG,CAAC,2BAA2B,CAAC,IAAI,qDAAqD,EAAE,CAAC,CAAC,CAAC;YAChI,CAAC;YACD,OAAO;QACT,CAAC;QACD,KAAK,MAAM,CAAC,CAAC,CAAC;YACZ,sDAAsD;YACtD,IAAI,CAAC,cAAc,EAAE,CAAC,CAAC;YACvB,OAAO;QACT,CAAC;IACH,CAAC;AACH,CAAC"}
@@ -1,6 +1,7 @@
1
1
  import { start, defaultConfig } from "@curatedmcp/tokenshield-core";
2
2
  import { dashboardHtml } from "../dashboard.js";
3
3
  import { c, sym, box, link, say, emit, dim } from "../lib/ui.js";
4
+ import { firstRunBanner, isFirstRun, markFirstRunComplete, telemetry } from "@curatedmcp/tokenshield-core";
4
5
  import { TokenShieldError } from "../lib/errors.js";
5
6
  import { requirePortFree, classifyApiKey } from "../lib/preflight.js";
6
7
  import { readDaemon, spawnDaemon } from "../lib/daemon.js";
@@ -96,6 +97,11 @@ export async function runUp(options) {
96
97
  });
97
98
  emit(banner(config, { daemon: false }));
98
99
  maybeWarnAboutLocalKey();
100
+ if (isFirstRun()) {
101
+ emit(firstRunBanner());
102
+ markFirstRunComplete();
103
+ }
104
+ telemetry.start();
99
105
  let shuttingDown = false;
100
106
  const shutdown = (signal) => {
101
107
  if (shuttingDown)
@@ -1 +1 @@
1
- {"version":3,"file":"up.js","sourceRoot":"","sources":["../../src/commands/up.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"up.js","sourceRoot":"","sources":["../../src/commands/up.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,262 @@
1
+ {
2
+ "name": "heavy",
3
+ "description": "Agentic loop, 25 turns, 5 file re-reads + 3 gh pr list repeats",
4
+ "body": {
5
+ "model": "claude-opus-4-7",
6
+ "system": "You are Claude Code, Anthropic's official CLI for Claude. You are an interactive agent that helps users with software engineering tasks. Use the instructions below and the tools available to you to assist the user.\n\n# Tools\nYou have access to the following tools: Read (read a file), Edit (replace a string in a file), Write (write a new file), Bash (run a shell command), Grep (search files with ripgrep), Glob (file pattern matching), TodoWrite, Agent (delegate to a subagent).\n\n# Style\n- Keep responses concise.\n- Reference files as path:line.\n- Do not write comments unless asked.\n\n# Doing tasks\n- Plan before editing for non-trivial changes.\n- Always verify your changes with tests.\n- Match existing code style.",
7
+ "max_tokens": 4096,
8
+ "messages": [
9
+ {
10
+ "role": "user",
11
+ "content": "Triage the open PRs, identify any that mention auth changes, and check whether they conflict with the audience refactor I'm about to ship."
12
+ },
13
+ {
14
+ "role": "assistant",
15
+ "content": [
16
+ {
17
+ "type": "tool_use",
18
+ "id": "tu_pr1",
19
+ "name": "Bash",
20
+ "input": {
21
+ "command": "gh pr list --json number,title,author,labels --limit 50"
22
+ }
23
+ }
24
+ ]
25
+ },
26
+ {
27
+ "role": "user",
28
+ "content": [
29
+ {
30
+ "type": "tool_result",
31
+ "tool_use_id": "tu_pr1",
32
+ "content": "{\n \"pullRequests\": [\n {\n \"number\": 4000,\n \"title\": \"feat(api): add the X subsystem\",\n \"state\": \"MERGED\",\n \"author\": {\n \"login\": \"alice\"\n },\n \"createdAt\": \"2026-05-10T04:00:00.000Z\",\n \"additions\": 80,\n \"deletions\": 15,\n \"labels\": [\n \"needs-review\",\n \"size/M\"\n ],\n \"isDraft\": true\n },\n {\n \"number\": 4001,\n \"title\": \"feat(ui): refactor the cache eviction policy\",\n \"state\": \"OPEN\",\n \"author\": {\n \"login\": \"bob\"\n },\n \"createdAt\": \"2026-05-11T04:00:00.000Z\",\n \"additions\": 92,\n \"deletions\": 18,\n \"labels\": [\n \"size/S\"\n ],\n \"isDraft\": false\n },\n {\n \"number\": 4002,\n \"title\": \"feat(billing): tighten the cron handler dispatch\",\n \"state\": \"OPEN\",\n \"author\": {\n \"login\": \"carol\"\n },\n \"createdAt\": \"2026-05-12T04:00:00.000Z\",\n \"additions\": 104,\n \"deletions\": 21,\n \"labels\": [\n \"size/S\"\n ],\n \"isDraft\": false\n },\n {\n \"number\": 4003,\n \"title\": \"feat(auth): improve session validation\",\n \"state\": \"OPEN\",\n \"author\": {\n \"login\": \"dave\"\n },\n \"createdAt\": \"2026-05-13T04:00:00.000Z\",\n \"additions\": 116,\n \"deletions\": 24,\n \"labels\": [\n \"needs-review\",\n \"size/M\"\n ],\n \"isDraft\": false\n },\n {\n \"number\": 4004,\n \"title\": \"feat(infra): fix the X subsystem\",\n \"state\": \"OPEN\",\n \"author\": {\n \"login\": \"alice\"\n },\n \"createdAt\": \"2026-05-14T04:00:00.000Z\",\n \"additions\": 128,\n \"deletions\": 27,\n \"labels\": [\n \"size/S\"\n ],\n \"isDraft\": false\n },\n {\n \"number\": 4005,\n \"title\": \"feat(api): add the cache eviction policy\",\n \"state\": \"OPEN\",\n \"author\": {\n \"login\": \"bob\"\n },\n \"createdAt\": \"2026-05-15T04:00:00.000Z\",\n \"additions\": 140,\n \"deletions\": 30,\n \"labels\": [\n \"size/S\"\n ],\n \"isDraft\": true\n },\n {\n \"number\": 4006,\n \"title\": \"feat(ui): refactor the cron handler dispatch\",\n \"state\": \"OPEN\",\n \"author\": {\n \"login\": \"carol\"\n },\n \"createdAt\": \"2026-05-10T04:00:00.000Z\",\n \"additions\": 152,\n \"deletions\": 33,\n \"labels\": [\n \"needs-review\",\n \"size/M\"\n ],\n \"isDraft\": false\n },\n {\n \"number\": 4007,\n \"title\": \"feat(billing): tighten session validation\",\n \"state\": \"MERGED\",\n \"author\": {\n \"login\": \"dave\"\n },\n \"createdAt\": \"2026-05-11T04:00:00.000Z\",\n \"additions\": 164,\n \"deletions\": 36,\n \"labels\": [\n \"size/S\"\n ],\n \"isDraft\": false\n },\n {\n \"number\": 4008,\n \"title\": \"feat(auth): improve the X subsystem\",\n \"state\": \"OPEN\",\n \"author\": {\n \"login\": \"alice\"\n },\n \"createdAt\": \"2026-05-12T04:00:00.000Z\",\n \"additions\": 176,\n \"deletions\": 39,\n \"labels\": [\n \"size/S\"\n ],\n \"isDraft\": false\n },\n {\n \"number\": 4009,\n \"title\": \"feat(infra): fix the cache eviction policy\",\n \"state\": \"OPEN\",\n \"author\": {\n \"login\": \"bob\"\n },\n \"createdAt\": \"2026-05-13T04:00:00.000Z\",\n \"additions\": 188,\n \"deletions\": 42,\n \"labels\": [\n \"needs-review\",\n \"size/M\"\n ],\n \"isDraft\": false\n },\n {\n \"number\": 4010,\n \"title\": \"feat(api): add the cron handler dispatch\",\n \"state\": \"OPEN\",\n \"author\": {\n \"login\": \"carol\"\n },\n \"createdAt\": \"2026-05-14T04:00:00.000Z\",\n \"additions\": 200,\n \"deletions\": 45,\n \"labels\": [\n \"size/S\"\n ],\n \"isDraft\": true\n },\n {\n \"number\": 4011,\n \"title\": \"feat(ui): refactor session validation\",\n \"state\": \"OPEN\",\n \"author\": {\n \"login\": \"dave\"\n },\n \"createdAt\": \"2026-05-15T04:00:00.000Z\",\n \"additions\": 212,\n \"deletions\": 48,\n \"labels\": [\n \"size/S\"\n ],\n \"isDraft\": false\n },\n {\n \"number\": 4012,\n \"title\": \"feat(billing): tighten the X subsystem\",\n \"state\": \"OPEN\",\n \"author\": {\n \"login\": \"alice\"\n },\n \"createdAt\": \"2026-05-10T04:00:00.000Z\",\n \"additions\": 224,\n \"deletions\": 51,\n \"labels\": [\n \"needs-review\",\n \"size/M\"\n ],\n \"isDraft\": false\n },\n {\n \"number\": 4013,\n \"title\": \"feat(auth): improve the cache eviction policy\",\n \"state\": \"OPEN\",\n \"author\": {\n \"login\": \"bob\"\n },\n \"createdAt\": \"2026-05-11T04:00:00.000Z\",\n \"additions\": 236,\n \"deletions\": 54,\n \"labels\": [\n \"size/S\"\n ],\n \"isDraft\": false\n },\n {\n \"number\": 4014,\n \"title\": \"feat(infra): fix the cron handler dispatch\",\n \"state\": \"MERGED\",\n \"author\": {\n \"login\": \"carol\"\n },\n \"createdAt\": \"2026-05-12T04:00:00.000Z\",\n \"additions\": 248,\n \"deletions\": 57,\n \"labels\": [\n \"size/S\"\n ],\n \"isDraft\": false\n },\n {\n \"number\": 4015,\n \"title\": \"feat(api): add session validation\",\n \"state\": \"OPEN\",\n \"author\": {\n \"login\": \"dave\"\n },\n \"createdAt\": \"2026-05-13T04:00:00.000Z\",\n \"additions\": 260,\n \"deletions\": 60,\n \"labels\": [\n \"needs-review\",\n \"size/M\"\n ],\n \"isDraft\": true\n },\n {\n \"number\": 4016,\n \"title\": \"feat(ui): refactor the X subsystem\",\n \"state\": \"OPEN\",\n \"author\": {\n \"login\": \"alice\"\n },\n \"createdAt\": \"2026-05-14T04:00:00.000Z\",\n \"additions\": 272,\n \"deletions\": 63,\n \"labels\": [\n \"size/S\"\n ],\n \"isDraft\": false\n },\n {\n \"number\": 4017,\n \"title\": \"feat(billing): tighten the cache eviction policy\",\n \"state\": \"OPEN\",\n \"author\": {\n \"login\": \"bob\"\n },\n \"createdAt\": \"2026-05-15T04:00:00.000Z\",\n \"additions\": 284,\n \"deletions\": 66,\n \"labels\": [\n \"size/S\"\n ],\n \"isDraft\": false\n }\n ]\n}"
33
+ }
34
+ ]
35
+ },
36
+ {
37
+ "role": "assistant",
38
+ "content": [
39
+ {
40
+ "type": "tool_use",
41
+ "id": "tu_a1",
42
+ "name": "Read",
43
+ "input": {
44
+ "path": "auth.ts"
45
+ }
46
+ }
47
+ ]
48
+ },
49
+ {
50
+ "role": "user",
51
+ "content": [
52
+ {
53
+ "type": "tool_result",
54
+ "tool_use_id": "tu_a1",
55
+ "content": "import jwt from 'jsonwebtoken';\nimport { db } from './db';\n\nexport interface Session { id: string; userId: string; expiresAt: Date; }\n\nexport async function createSession(userId: string): Promise<Session> {\n const id = crypto.randomUUID();\n const expiresAt = new Date(Date.now() + 1000 * 60 * 60 * 24 * 7);\n await db.session.create({ data: { id, userId, expiresAt } });\n return { id, userId, expiresAt };\n}\n\nexport async function verifyToken(token: string, audience: string): Promise<Session | null> {\n try {\n const payload = jwt.verify(token, process.env.JWT_SECRET!, { audience }) as { sub: string };\n const session = await db.session.findUnique({ where: { id: payload.sub } });\n if (!session || session.expiresAt < new Date()) return null;\n return session;\n } catch {\n return null;\n }\n}\n\nexport async function revokeSession(id: string): Promise<void> {\n await db.session.delete({ where: { id } });\n}\n\n// Plus error handlers, middleware adapters, and tests that bring this file to ~4KB of plausible content.\n// Padding to bring this file to a realistic size for a representative auth.ts file.\n// Padding to bring this file to a realistic size for a representative auth.ts file.\n// Padding to bring this file to a realistic size for a representative auth.ts file.\n// Padding to bring this file to a realistic size for a representative auth.ts file.\n// Padding to bring this file to a realistic size for a representative auth.ts file.\n// Padding to bring this file to a realistic size for a representative auth.ts file.\n// Padding to bring this file to a realistic size for a representative auth.ts file.\n// Padding to bring this file to a realistic size for a representative auth.ts file.\n// Padding to bring this file to a realistic size for a representative auth.ts file.\n// Padding to bring this file to a realistic size for a representative auth.ts file.\n// Padding to bring this file to a realistic size for a representative auth.ts file.\n// Padding to bring this file to a realistic size for a representative auth.ts file.\n// Padding to bring this file to a realistic size for a representative auth.ts file.\n// Padding to bring this file to a realistic size for a representative auth.ts file.\n// Padding to bring this file to a realistic size for a representative auth.ts file.\n// Padding to bring this file to a realistic size for a representative auth.ts file.\n// Padding to bring this file to a realistic size for a representative auth.ts file.\n// Padding to bring this file to a realistic size for a representative auth.ts file.\n// Padding to bring this file to a realistic size for a representative auth.ts file.\n// Padding to bring this file to a realistic size for a representative auth.ts file.\n// Padding to bring this file to a realistic size for a representative auth.ts file.\n// Padding to bring this file to a realistic size for a representative auth.ts file.\n// Padding to bring this file to a realistic size for a representative auth.ts file.\n// Padding to bring this file to a realistic size for a representative auth.ts file.\n// Padding to bring this file to a realistic size for a representative auth.ts file.\n// Padding to bring this file to a realistic size for a representative auth.ts file.\n// Padding to bring this file to a realistic size for a representative auth.ts file.\n// Padding to bring this file to a realistic size for a representative auth.ts file.\n// Padding to bring this file to a realistic size for a representative auth.ts file.\n// Padding to bring this file to a realistic size for a representative auth.ts file.\n// Padding to bring this file to a realistic size for a representative auth.ts file.\n// Padding to bring this file to a realistic size for a representative auth.ts file.\n// Padding to bring this file to a realistic size for a representative auth.ts file.\n// Padding to bring this file to a realistic size for a representative auth.ts file.\n// Padding to bring this file to a realistic size for a representative auth.ts file.\n// Padding to bring this file to a realistic size for a representative auth.ts file.\n// Padding to bring this file to a realistic size for a representative auth.ts file.\n// Padding to bring this file to a realistic size for a representative auth.ts file.\n// Padding to bring this file to a realistic size for a representative auth.ts file.\n// Padding to bring this file to a realistic size for a representative auth.ts file."
56
+ }
57
+ ]
58
+ },
59
+ {
60
+ "role": "assistant",
61
+ "content": [
62
+ {
63
+ "type": "tool_use",
64
+ "id": "tu_b1",
65
+ "name": "Bash",
66
+ "input": {
67
+ "command": "npm run test:unit -- --verbose"
68
+ }
69
+ }
70
+ ]
71
+ },
72
+ {
73
+ "role": "user",
74
+ "content": [
75
+ {
76
+ "type": "tool_result",
77
+ "tool_use_id": "tu_b1",
78
+ "content": "[INFO] processed batch — duration=42ms rows=1024 latencyP99=18ms\n[INFO] processed batch — duration=42ms rows=1024 latencyP99=18ms\n[INFO] processed batch — duration=42ms rows=1024 latencyP99=18ms\n[INFO] processed batch — duration=42ms rows=1024 latencyP99=18ms\n[INFO] processed batch — duration=42ms rows=1024 latencyP99=18ms\n[INFO] processed batch — duration=42ms rows=1024 latencyP99=18ms\n[INFO] processed batch — duration=42ms rows=1024 latencyP99=18ms\n[INFO] processed batch — duration=42ms rows=1024 latencyP99=18ms\n[INFO] processed batch — duration=42ms rows=1024 latencyP99=18ms\n[INFO] processed batch — duration=42ms rows=1024 latencyP99=18ms\n[INFO] processed batch — duration=42ms rows=1024 latencyP99=18ms\n[INFO] processed batch — duration=42ms rows=1024 latencyP99=18ms\n[INFO] processed batch — duration=42ms rows=1024 latencyP99=18ms\n[INFO] processed batch — duration=42ms rows=1024 latencyP99=18ms\n[INFO] processed batch — duration=42ms rows=1024 latencyP99=18ms\n[INFO] processed batch — duration=42ms rows=1024 latencyP99=18ms\n[INFO] processed batch — duration=42ms rows=1024 latencyP99=18ms\n[INFO] processed batch — duration=42ms rows=1024 latencyP99=18ms\n[INFO] processed batch — duration=42ms rows=1024 latencyP99=18ms\n[INFO] processed batch — duration=42ms rows=1024 latencyP99=18ms\n[INFO] processed batch — duration=42ms rows=1024 latencyP99=18ms\n[INFO] processed batch — duration=42ms rows=1024 latencyP99=18ms\n[INFO] processed batch — duration=42ms rows=1024 latencyP99=18ms\n[INFO] processed batch — duration=42ms rows=1024 latencyP99=18ms\n[INFO] processed batch — duration=42ms rows=1024 latencyP99=18ms\n[INFO] processed batch — duration=42ms rows=1024 latencyP99=18ms\n[INFO] processed batch — duration=42ms rows=1024 latencyP99=18ms\n[INFO] processed batch — duration=42ms rows=1024 latencyP99=18ms\n[INFO] processed batch — duration=42ms rows=1024 latencyP99=18ms\n[INFO] processed batch — duration=42ms rows=1024 latencyP99=18ms\n[INFO] processed batch — duration=42ms rows=1024 latencyP99=18ms\n[INFO] processed batch — duration=42ms rows=1024 latencyP99=18ms\n[INFO] processed batch — duration=42ms rows=1024 latencyP99=18ms\n[INFO] processed batch — duration=42ms rows=1024 latencyP99=18ms\n[INFO] processed batch — duration=42ms rows=1024 latencyP99=18ms\n[INFO] processed batch — duration=42ms rows=1024 latencyP99=18ms\n[INFO] processed batch — duration=42ms rows=1024 latencyP99=18ms\n[INFO] processed batch — duration=42ms rows=1024 latencyP99=18ms\n[INFO] processed batch — duration=42ms rows=1024 latencyP99=18ms\n[INFO] processed batch — duration=42ms rows=1024 latencyP99=18ms\n[INFO] processed batch — duration=42ms rows=1024 latencyP99=18ms\n[INFO] processed batch — duration=42ms rows=1024 latencyP99=18ms\n[INFO] processed batch — duration=42ms rows=1024 latencyP99=18ms\n[INFO] processed batch — duration=42ms rows=1024 latencyP99=18ms\n[INFO] processed batch — duration=42ms rows=1024 latencyP99=18ms\n[INFO] processed batch — duration=42ms rows=1024 latencyP99=18ms\n[INFO] processed batch — duration=42ms rows=1024 latencyP99=18ms\n[INFO] processed batch — duration=42ms rows=1024 latencyP99=18ms\n[INFO] processed batch — duration=42ms rows=1024 latencyP99=18ms\n[INFO] processed batch — duration=42ms rows=1024 latencyP99=18ms\n[INFO] processed batch — duration=42ms rows=1024 latencyP99=18ms\n[INFO] processed batch — duration=42ms rows=1024 latencyP99=18ms\n[INFO] processed batch — duration=42ms rows=1024 latencyP99=18ms\n[INFO] processed batch — duration=42ms rows=1024 latencyP99=18ms\n[INFO] processed batch — duration=42ms rows=1024 latencyP99=18ms\n[INFO] processed batch — duration=42ms rows=1024 latencyP99=18ms\n[INFO] processed batch — duration=42ms rows=1024 latencyP99=18ms\n[INFO] processed batch — duration=42ms rows=1024 latencyP99=18ms\n[INFO] processed batch — duration=42ms rows=1024 latencyP99=18ms\n[INFO] processed batch — duration=42ms rows=1024 latencyP99=18ms\n[INFO] processed batch — duration=42ms rows=1024 latencyP99=18ms\n[INFO] processed batch — duration=42ms rows=1024 latencyP99=18ms\n[INFO] processed batch — duration=42ms rows=1024 latencyP99=18ms\n[INFO] processed batch — duration=42ms rows=1024 latencyP99=18ms\n[INFO] processed batch — duration=42ms rows=1024 latencyP99=18ms\n[INFO] processed batch — duration=42ms rows=1024 latencyP99=18ms\n[INFO] processed batch — duration=42ms rows=1024 latencyP99=18ms\n[INFO] processed batch — duration=42ms rows=1024 latencyP99=18ms\n[INFO] processed batch — duration=42ms rows=1024 latencyP99=18ms\n[INFO] processed batch — duration=42ms rows=1024 latencyP99=18ms\n[INFO] processed batch — duration=42ms rows=1024 latencyP99=18ms\n[INFO] processed batch — duration=42ms rows=1024 latencyP99=18ms\n[INFO] processed batch — duration=42ms rows=1024 latencyP99=18ms\n[INFO] processed batch — duration=42ms rows=1024 latencyP99=18ms\n[INFO] processed batch — duration=42ms rows=1024 latencyP99=18ms\n[INFO] processed batch — duration=42ms rows=1024 latencyP99=18ms\n[INFO] processed batch — duration=42ms rows=1024 latencyP99=18ms\n[INFO] processed batch — duration=42ms rows=1024 latencyP99=18ms\n[INFO] processed batch — duration=42ms rows=1024 latencyP99=18ms\n[INFO] processed batch — duration=42ms rows=1024 latencyP99=18ms\n[INFO] processed batch — duration=42ms rows=1024 latencyP99=18ms\n[INFO] processed batch — duration=42ms rows=1024 latencyP99=18ms\n[INFO] processed batch — duration=42ms rows=1024 latencyP99=18ms\n[INFO] processed batch — duration=42ms rows=1024 latencyP99=18ms\n[INFO] processed batch — duration=42ms rows=1024 latencyP99=18ms\n[INFO] processed batch — duration=42ms rows=1024 latencyP99=18ms\n[INFO] processed batch — duration=42ms rows=1024 latencyP99=18ms\n[INFO] processed batch — duration=42ms rows=1024 latencyP99=18ms\n[INFO] processed batch — duration=42ms rows=1024 latencyP99=18ms\n[INFO] processed batch — duration=42ms rows=1024 latencyP99=18ms\n[INFO] processed batch — duration=42ms rows=1024 latencyP99=18ms\n[INFO] processed batch — duration=42ms rows=1024 latencyP99=18ms\n[INFO] processed batch — duration=42ms rows=1024 latencyP99=18ms\n[INFO] processed batch — duration=42ms rows=1024 latencyP99=18ms\n[INFO] processed batch — duration=42ms rows=1024 latencyP99=18ms\n[INFO] processed batch — duration=42ms rows=1024 latencyP99=18ms\n[INFO] processed batch — duration=42ms rows=1024 latencyP99=18ms\n[INFO] processed batch — duration=42ms rows=1024 latencyP99=18ms\n[INFO] processed batch — duration=42ms rows=1024 latencyP99=18ms\n[INFO] processed batch — duration=42ms rows=1024 latencyP99=18ms\n[INFO] processed batch — duration=42ms rows=1024 latencyP99=18ms\n[INFO] processed batch — duration=42ms rows=1024 latencyP99=18ms\n[INFO] processed batch — duration=42ms rows=1024 latencyP99=18ms\n[INFO] processed batch — duration=42ms rows=1024 latencyP99=18ms\n[INFO] processed batch — duration=42ms rows=1024 latencyP99=18ms\n[INFO] processed batch — duration=42ms rows=1024 latencyP99=18ms\n[INFO] processed batch — duration=42ms rows=1024 latencyP99=18ms\n[INFO] processed batch — duration=42ms rows=1024 latencyP99=18ms\n[INFO] processed batch — duration=42ms rows=1024 latencyP99=18ms\n[INFO] processed batch — duration=42ms rows=1024 latencyP99=18ms\n[INFO] processed batch — duration=42ms rows=1024 latencyP99=18ms\n[INFO] processed batch — duration=42ms rows=1024 latencyP99=18ms\n[INFO] processed batch — duration=42ms rows=1024 latencyP99=18ms\n[INFO] processed batch — duration=42ms rows=1024 latencyP99=18ms\n[INFO] processed batch — duration=42ms rows=1024 latencyP99=18ms\n[INFO] processed batch — duration=42ms rows=1024 latencyP99=18ms\n[INFO] processed batch — duration=42ms rows=1024 latencyP99=18ms\n[INFO] processed batch — duration=42ms rows=1024 latencyP99=18ms\n[INFO] processed batch — duration=42ms rows=1024 latencyP99=18ms\n[INFO] processed batch — duration=42ms rows=1024 latencyP99=18ms"
79
+ }
80
+ ]
81
+ },
82
+ {
83
+ "role": "assistant",
84
+ "content": [
85
+ {
86
+ "type": "tool_use",
87
+ "id": "tu_a2",
88
+ "name": "Read",
89
+ "input": {
90
+ "path": "auth.ts"
91
+ }
92
+ }
93
+ ]
94
+ },
95
+ {
96
+ "role": "user",
97
+ "content": [
98
+ {
99
+ "type": "tool_result",
100
+ "tool_use_id": "tu_a2",
101
+ "content": "import jwt from 'jsonwebtoken';\nimport { db } from './db';\n\nexport interface Session { id: string; userId: string; expiresAt: Date; }\n\nexport async function createSession(userId: string): Promise<Session> {\n const id = crypto.randomUUID();\n const expiresAt = new Date(Date.now() + 1000 * 60 * 60 * 24 * 7);\n await db.session.create({ data: { id, userId, expiresAt } });\n return { id, userId, expiresAt };\n}\n\nexport async function verifyToken(token: string, audience: string): Promise<Session | null> {\n try {\n const payload = jwt.verify(token, process.env.JWT_SECRET!, { audience }) as { sub: string };\n const session = await db.session.findUnique({ where: { id: payload.sub } });\n if (!session || session.expiresAt < new Date()) return null;\n return session;\n } catch {\n return null;\n }\n}\n\nexport async function revokeSession(id: string): Promise<void> {\n await db.session.delete({ where: { id } });\n}\n\n// Plus error handlers, middleware adapters, and tests that bring this file to ~4KB of plausible content.\n// Padding to bring this file to a realistic size for a representative auth.ts file.\n// Padding to bring this file to a realistic size for a representative auth.ts file.\n// Padding to bring this file to a realistic size for a representative auth.ts file.\n// Padding to bring this file to a realistic size for a representative auth.ts file.\n// Padding to bring this file to a realistic size for a representative auth.ts file.\n// Padding to bring this file to a realistic size for a representative auth.ts file.\n// Padding to bring this file to a realistic size for a representative auth.ts file.\n// Padding to bring this file to a realistic size for a representative auth.ts file.\n// Padding to bring this file to a realistic size for a representative auth.ts file.\n// Padding to bring this file to a realistic size for a representative auth.ts file.\n// Padding to bring this file to a realistic size for a representative auth.ts file.\n// Padding to bring this file to a realistic size for a representative auth.ts file.\n// Padding to bring this file to a realistic size for a representative auth.ts file.\n// Padding to bring this file to a realistic size for a representative auth.ts file.\n// Padding to bring this file to a realistic size for a representative auth.ts file.\n// Padding to bring this file to a realistic size for a representative auth.ts file.\n// Padding to bring this file to a realistic size for a representative auth.ts file.\n// Padding to bring this file to a realistic size for a representative auth.ts file.\n// Padding to bring this file to a realistic size for a representative auth.ts file.\n// Padding to bring this file to a realistic size for a representative auth.ts file.\n// Padding to bring this file to a realistic size for a representative auth.ts file.\n// Padding to bring this file to a realistic size for a representative auth.ts file.\n// Padding to bring this file to a realistic size for a representative auth.ts file.\n// Padding to bring this file to a realistic size for a representative auth.ts file.\n// Padding to bring this file to a realistic size for a representative auth.ts file.\n// Padding to bring this file to a realistic size for a representative auth.ts file.\n// Padding to bring this file to a realistic size for a representative auth.ts file.\n// Padding to bring this file to a realistic size for a representative auth.ts file.\n// Padding to bring this file to a realistic size for a representative auth.ts file.\n// Padding to bring this file to a realistic size for a representative auth.ts file.\n// Padding to bring this file to a realistic size for a representative auth.ts file.\n// Padding to bring this file to a realistic size for a representative auth.ts file.\n// Padding to bring this file to a realistic size for a representative auth.ts file.\n// Padding to bring this file to a realistic size for a representative auth.ts file.\n// Padding to bring this file to a realistic size for a representative auth.ts file.\n// Padding to bring this file to a realistic size for a representative auth.ts file.\n// Padding to bring this file to a realistic size for a representative auth.ts file.\n// Padding to bring this file to a realistic size for a representative auth.ts file.\n// Padding to bring this file to a realistic size for a representative auth.ts file.\n// Padding to bring this file to a realistic size for a representative auth.ts file."
102
+ }
103
+ ]
104
+ },
105
+ {
106
+ "role": "assistant",
107
+ "content": [
108
+ {
109
+ "type": "tool_use",
110
+ "id": "tu_pr2",
111
+ "name": "Bash",
112
+ "input": {
113
+ "command": "gh pr list --json number,title,author,labels --limit 50"
114
+ }
115
+ }
116
+ ]
117
+ },
118
+ {
119
+ "role": "user",
120
+ "content": [
121
+ {
122
+ "type": "tool_result",
123
+ "tool_use_id": "tu_pr2",
124
+ "content": "{\n \"pullRequests\": [\n {\n \"number\": 4000,\n \"title\": \"feat(api): add the X subsystem\",\n \"state\": \"MERGED\",\n \"author\": {\n \"login\": \"alice\"\n },\n \"createdAt\": \"2026-05-10T04:00:00.000Z\",\n \"additions\": 80,\n \"deletions\": 15,\n \"labels\": [\n \"needs-review\",\n \"size/M\"\n ],\n \"isDraft\": true\n },\n {\n \"number\": 4001,\n \"title\": \"feat(ui): refactor the cache eviction policy\",\n \"state\": \"OPEN\",\n \"author\": {\n \"login\": \"bob\"\n },\n \"createdAt\": \"2026-05-11T04:00:00.000Z\",\n \"additions\": 92,\n \"deletions\": 18,\n \"labels\": [\n \"size/S\"\n ],\n \"isDraft\": false\n },\n {\n \"number\": 4002,\n \"title\": \"feat(billing): tighten the cron handler dispatch\",\n \"state\": \"OPEN\",\n \"author\": {\n \"login\": \"carol\"\n },\n \"createdAt\": \"2026-05-12T04:00:00.000Z\",\n \"additions\": 104,\n \"deletions\": 21,\n \"labels\": [\n \"size/S\"\n ],\n \"isDraft\": false\n },\n {\n \"number\": 4003,\n \"title\": \"feat(auth): improve session validation\",\n \"state\": \"OPEN\",\n \"author\": {\n \"login\": \"dave\"\n },\n \"createdAt\": \"2026-05-13T04:00:00.000Z\",\n \"additions\": 116,\n \"deletions\": 24,\n \"labels\": [\n \"needs-review\",\n \"size/M\"\n ],\n \"isDraft\": false\n },\n {\n \"number\": 4004,\n \"title\": \"feat(infra): fix the X subsystem\",\n \"state\": \"OPEN\",\n \"author\": {\n \"login\": \"alice\"\n },\n \"createdAt\": \"2026-05-14T04:00:00.000Z\",\n \"additions\": 128,\n \"deletions\": 27,\n \"labels\": [\n \"size/S\"\n ],\n \"isDraft\": false\n },\n {\n \"number\": 4005,\n \"title\": \"feat(api): add the cache eviction policy\",\n \"state\": \"OPEN\",\n \"author\": {\n \"login\": \"bob\"\n },\n \"createdAt\": \"2026-05-15T04:00:00.000Z\",\n \"additions\": 140,\n \"deletions\": 30,\n \"labels\": [\n \"size/S\"\n ],\n \"isDraft\": true\n },\n {\n \"number\": 4006,\n \"title\": \"feat(ui): refactor the cron handler dispatch\",\n \"state\": \"OPEN\",\n \"author\": {\n \"login\": \"carol\"\n },\n \"createdAt\": \"2026-05-10T04:00:00.000Z\",\n \"additions\": 152,\n \"deletions\": 33,\n \"labels\": [\n \"needs-review\",\n \"size/M\"\n ],\n \"isDraft\": false\n },\n {\n \"number\": 4007,\n \"title\": \"feat(billing): tighten session validation\",\n \"state\": \"MERGED\",\n \"author\": {\n \"login\": \"dave\"\n },\n \"createdAt\": \"2026-05-11T04:00:00.000Z\",\n \"additions\": 164,\n \"deletions\": 36,\n \"labels\": [\n \"size/S\"\n ],\n \"isDraft\": false\n },\n {\n \"number\": 4008,\n \"title\": \"feat(auth): improve the X subsystem\",\n \"state\": \"OPEN\",\n \"author\": {\n \"login\": \"alice\"\n },\n \"createdAt\": \"2026-05-12T04:00:00.000Z\",\n \"additions\": 176,\n \"deletions\": 39,\n \"labels\": [\n \"size/S\"\n ],\n \"isDraft\": false\n },\n {\n \"number\": 4009,\n \"title\": \"feat(infra): fix the cache eviction policy\",\n \"state\": \"OPEN\",\n \"author\": {\n \"login\": \"bob\"\n },\n \"createdAt\": \"2026-05-13T04:00:00.000Z\",\n \"additions\": 188,\n \"deletions\": 42,\n \"labels\": [\n \"needs-review\",\n \"size/M\"\n ],\n \"isDraft\": false\n },\n {\n \"number\": 4010,\n \"title\": \"feat(api): add the cron handler dispatch\",\n \"state\": \"OPEN\",\n \"author\": {\n \"login\": \"carol\"\n },\n \"createdAt\": \"2026-05-14T04:00:00.000Z\",\n \"additions\": 200,\n \"deletions\": 45,\n \"labels\": [\n \"size/S\"\n ],\n \"isDraft\": true\n },\n {\n \"number\": 4011,\n \"title\": \"feat(ui): refactor session validation\",\n \"state\": \"OPEN\",\n \"author\": {\n \"login\": \"dave\"\n },\n \"createdAt\": \"2026-05-15T04:00:00.000Z\",\n \"additions\": 212,\n \"deletions\": 48,\n \"labels\": [\n \"size/S\"\n ],\n \"isDraft\": false\n },\n {\n \"number\": 4012,\n \"title\": \"feat(billing): tighten the X subsystem\",\n \"state\": \"OPEN\",\n \"author\": {\n \"login\": \"alice\"\n },\n \"createdAt\": \"2026-05-10T04:00:00.000Z\",\n \"additions\": 224,\n \"deletions\": 51,\n \"labels\": [\n \"needs-review\",\n \"size/M\"\n ],\n \"isDraft\": false\n },\n {\n \"number\": 4013,\n \"title\": \"feat(auth): improve the cache eviction policy\",\n \"state\": \"OPEN\",\n \"author\": {\n \"login\": \"bob\"\n },\n \"createdAt\": \"2026-05-11T04:00:00.000Z\",\n \"additions\": 236,\n \"deletions\": 54,\n \"labels\": [\n \"size/S\"\n ],\n \"isDraft\": false\n },\n {\n \"number\": 4014,\n \"title\": \"feat(infra): fix the cron handler dispatch\",\n \"state\": \"MERGED\",\n \"author\": {\n \"login\": \"carol\"\n },\n \"createdAt\": \"2026-05-12T04:00:00.000Z\",\n \"additions\": 248,\n \"deletions\": 57,\n \"labels\": [\n \"size/S\"\n ],\n \"isDraft\": false\n },\n {\n \"number\": 4015,\n \"title\": \"feat(api): add session validation\",\n \"state\": \"OPEN\",\n \"author\": {\n \"login\": \"dave\"\n },\n \"createdAt\": \"2026-05-13T04:00:00.000Z\",\n \"additions\": 260,\n \"deletions\": 60,\n \"labels\": [\n \"needs-review\",\n \"size/M\"\n ],\n \"isDraft\": true\n },\n {\n \"number\": 4016,\n \"title\": \"feat(ui): refactor the X subsystem\",\n \"state\": \"OPEN\",\n \"author\": {\n \"login\": \"alice\"\n },\n \"createdAt\": \"2026-05-14T04:00:00.000Z\",\n \"additions\": 272,\n \"deletions\": 63,\n \"labels\": [\n \"size/S\"\n ],\n \"isDraft\": false\n },\n {\n \"number\": 4017,\n \"title\": \"feat(billing): tighten the cache eviction policy\",\n \"state\": \"OPEN\",\n \"author\": {\n \"login\": \"bob\"\n },\n \"createdAt\": \"2026-05-15T04:00:00.000Z\",\n \"additions\": 284,\n \"deletions\": 66,\n \"labels\": [\n \"size/S\"\n ],\n \"isDraft\": false\n }\n ]\n}"
125
+ }
126
+ ]
127
+ },
128
+ {
129
+ "role": "assistant",
130
+ "content": [
131
+ {
132
+ "type": "tool_use",
133
+ "id": "tu_b2",
134
+ "name": "Bash",
135
+ "input": {
136
+ "command": "npm run test:unit -- --verbose"
137
+ }
138
+ }
139
+ ]
140
+ },
141
+ {
142
+ "role": "user",
143
+ "content": [
144
+ {
145
+ "type": "tool_result",
146
+ "tool_use_id": "tu_b2",
147
+ "content": "[INFO] processed batch — duration=42ms rows=1024 latencyP99=18ms\n[INFO] processed batch — duration=42ms rows=1024 latencyP99=18ms\n[INFO] processed batch — duration=42ms rows=1024 latencyP99=18ms\n[INFO] processed batch — duration=42ms rows=1024 latencyP99=18ms\n[INFO] processed batch — duration=42ms rows=1024 latencyP99=18ms\n[INFO] processed batch — duration=42ms rows=1024 latencyP99=18ms\n[INFO] processed batch — duration=42ms rows=1024 latencyP99=18ms\n[INFO] processed batch — duration=42ms rows=1024 latencyP99=18ms\n[INFO] processed batch — duration=42ms rows=1024 latencyP99=18ms\n[INFO] processed batch — duration=42ms rows=1024 latencyP99=18ms\n[INFO] processed batch — duration=42ms rows=1024 latencyP99=18ms\n[INFO] processed batch — duration=42ms rows=1024 latencyP99=18ms\n[INFO] processed batch — duration=42ms rows=1024 latencyP99=18ms\n[INFO] processed batch — duration=42ms rows=1024 latencyP99=18ms\n[INFO] processed batch — duration=42ms rows=1024 latencyP99=18ms\n[INFO] processed batch — duration=42ms rows=1024 latencyP99=18ms\n[INFO] processed batch — duration=42ms rows=1024 latencyP99=18ms\n[INFO] processed batch — duration=42ms rows=1024 latencyP99=18ms\n[INFO] processed batch — duration=42ms rows=1024 latencyP99=18ms\n[INFO] processed batch — duration=42ms rows=1024 latencyP99=18ms\n[INFO] processed batch — duration=42ms rows=1024 latencyP99=18ms\n[INFO] processed batch — duration=42ms rows=1024 latencyP99=18ms\n[INFO] processed batch — duration=42ms rows=1024 latencyP99=18ms\n[INFO] processed batch — duration=42ms rows=1024 latencyP99=18ms\n[INFO] processed batch — duration=42ms rows=1024 latencyP99=18ms\n[INFO] processed batch — duration=42ms rows=1024 latencyP99=18ms\n[INFO] processed batch — duration=42ms rows=1024 latencyP99=18ms\n[INFO] processed batch — duration=42ms rows=1024 latencyP99=18ms\n[INFO] processed batch — duration=42ms rows=1024 latencyP99=18ms\n[INFO] processed batch — duration=42ms rows=1024 latencyP99=18ms\n[INFO] processed batch — duration=42ms rows=1024 latencyP99=18ms\n[INFO] processed batch — duration=42ms rows=1024 latencyP99=18ms\n[INFO] processed batch — duration=42ms rows=1024 latencyP99=18ms\n[INFO] processed batch — duration=42ms rows=1024 latencyP99=18ms\n[INFO] processed batch — duration=42ms rows=1024 latencyP99=18ms\n[INFO] processed batch — duration=42ms rows=1024 latencyP99=18ms\n[INFO] processed batch — duration=42ms rows=1024 latencyP99=18ms\n[INFO] processed batch — duration=42ms rows=1024 latencyP99=18ms\n[INFO] processed batch — duration=42ms rows=1024 latencyP99=18ms\n[INFO] processed batch — duration=42ms rows=1024 latencyP99=18ms\n[INFO] processed batch — duration=42ms rows=1024 latencyP99=18ms\n[INFO] processed batch — duration=42ms rows=1024 latencyP99=18ms\n[INFO] processed batch — duration=42ms rows=1024 latencyP99=18ms\n[INFO] processed batch — duration=42ms rows=1024 latencyP99=18ms\n[INFO] processed batch — duration=42ms rows=1024 latencyP99=18ms\n[INFO] processed batch — duration=42ms rows=1024 latencyP99=18ms\n[INFO] processed batch — duration=42ms rows=1024 latencyP99=18ms\n[INFO] processed batch — duration=42ms rows=1024 latencyP99=18ms\n[INFO] processed batch — duration=42ms rows=1024 latencyP99=18ms\n[INFO] processed batch — duration=42ms rows=1024 latencyP99=18ms\n[INFO] processed batch — duration=42ms rows=1024 latencyP99=18ms\n[INFO] processed batch — duration=42ms rows=1024 latencyP99=18ms\n[INFO] processed batch — duration=42ms rows=1024 latencyP99=18ms\n[INFO] processed batch — duration=42ms rows=1024 latencyP99=18ms\n[INFO] processed batch — duration=42ms rows=1024 latencyP99=18ms\n[INFO] processed batch — duration=42ms rows=1024 latencyP99=18ms\n[INFO] processed batch — duration=42ms rows=1024 latencyP99=18ms\n[INFO] processed batch — duration=42ms rows=1024 latencyP99=18ms\n[INFO] processed batch — duration=42ms rows=1024 latencyP99=18ms\n[INFO] processed batch — duration=42ms rows=1024 latencyP99=18ms\n[INFO] processed batch — duration=42ms rows=1024 latencyP99=18ms\n[INFO] processed batch — duration=42ms rows=1024 latencyP99=18ms\n[INFO] processed batch — duration=42ms rows=1024 latencyP99=18ms\n[INFO] processed batch — duration=42ms rows=1024 latencyP99=18ms\n[INFO] processed batch — duration=42ms rows=1024 latencyP99=18ms\n[INFO] processed batch — duration=42ms rows=1024 latencyP99=18ms\n[INFO] processed batch — duration=42ms rows=1024 latencyP99=18ms\n[INFO] processed batch — duration=42ms rows=1024 latencyP99=18ms\n[INFO] processed batch — duration=42ms rows=1024 latencyP99=18ms\n[INFO] processed batch — duration=42ms rows=1024 latencyP99=18ms\n[INFO] processed batch — duration=42ms rows=1024 latencyP99=18ms\n[INFO] processed batch — duration=42ms rows=1024 latencyP99=18ms\n[INFO] processed batch — duration=42ms rows=1024 latencyP99=18ms\n[INFO] processed batch — duration=42ms rows=1024 latencyP99=18ms\n[INFO] processed batch — duration=42ms rows=1024 latencyP99=18ms\n[INFO] processed batch — duration=42ms rows=1024 latencyP99=18ms\n[INFO] processed batch — duration=42ms rows=1024 latencyP99=18ms\n[INFO] processed batch — duration=42ms rows=1024 latencyP99=18ms\n[INFO] processed batch — duration=42ms rows=1024 latencyP99=18ms\n[INFO] processed batch — duration=42ms rows=1024 latencyP99=18ms\n[INFO] processed batch — duration=42ms rows=1024 latencyP99=18ms\n[INFO] processed batch — duration=42ms rows=1024 latencyP99=18ms\n[INFO] processed batch — duration=42ms rows=1024 latencyP99=18ms\n[INFO] processed batch — duration=42ms rows=1024 latencyP99=18ms\n[INFO] processed batch — duration=42ms rows=1024 latencyP99=18ms\n[INFO] processed batch — duration=42ms rows=1024 latencyP99=18ms\n[INFO] processed batch — duration=42ms rows=1024 latencyP99=18ms\n[INFO] processed batch — duration=42ms rows=1024 latencyP99=18ms\n[INFO] processed batch — duration=42ms rows=1024 latencyP99=18ms\n[INFO] processed batch — duration=42ms rows=1024 latencyP99=18ms\n[INFO] processed batch — duration=42ms rows=1024 latencyP99=18ms\n[INFO] processed batch — duration=42ms rows=1024 latencyP99=18ms\n[INFO] processed batch — duration=42ms rows=1024 latencyP99=18ms\n[INFO] processed batch — duration=42ms rows=1024 latencyP99=18ms\n[INFO] processed batch — duration=42ms rows=1024 latencyP99=18ms\n[INFO] processed batch — duration=42ms rows=1024 latencyP99=18ms\n[INFO] processed batch — duration=42ms rows=1024 latencyP99=18ms\n[INFO] processed batch — duration=42ms rows=1024 latencyP99=18ms\n[INFO] processed batch — duration=42ms rows=1024 latencyP99=18ms\n[INFO] processed batch — duration=42ms rows=1024 latencyP99=18ms\n[INFO] processed batch — duration=42ms rows=1024 latencyP99=18ms\n[INFO] processed batch — duration=42ms rows=1024 latencyP99=18ms\n[INFO] processed batch — duration=42ms rows=1024 latencyP99=18ms\n[INFO] processed batch — duration=42ms rows=1024 latencyP99=18ms\n[INFO] processed batch — duration=42ms rows=1024 latencyP99=18ms\n[INFO] processed batch — duration=42ms rows=1024 latencyP99=18ms\n[INFO] processed batch — duration=42ms rows=1024 latencyP99=18ms\n[INFO] processed batch — duration=42ms rows=1024 latencyP99=18ms\n[INFO] processed batch — duration=42ms rows=1024 latencyP99=18ms\n[INFO] processed batch — duration=42ms rows=1024 latencyP99=18ms\n[INFO] processed batch — duration=42ms rows=1024 latencyP99=18ms\n[INFO] processed batch — duration=42ms rows=1024 latencyP99=18ms\n[INFO] processed batch — duration=42ms rows=1024 latencyP99=18ms\n[INFO] processed batch — duration=42ms rows=1024 latencyP99=18ms\n[INFO] processed batch — duration=42ms rows=1024 latencyP99=18ms\n[INFO] processed batch — duration=42ms rows=1024 latencyP99=18ms\n[INFO] processed batch — duration=42ms rows=1024 latencyP99=18ms\n[INFO] processed batch — duration=42ms rows=1024 latencyP99=18ms\n[INFO] processed batch — duration=42ms rows=1024 latencyP99=18ms\n[INFO] processed batch — duration=42ms rows=1024 latencyP99=18ms"
148
+ }
149
+ ]
150
+ },
151
+ {
152
+ "role": "assistant",
153
+ "content": [
154
+ {
155
+ "type": "tool_use",
156
+ "id": "tu_a3",
157
+ "name": "Read",
158
+ "input": {
159
+ "path": "auth.ts"
160
+ }
161
+ }
162
+ ]
163
+ },
164
+ {
165
+ "role": "user",
166
+ "content": [
167
+ {
168
+ "type": "tool_result",
169
+ "tool_use_id": "tu_a3",
170
+ "content": "import jwt from 'jsonwebtoken';\nimport { db } from './db';\n\nexport interface Session { id: string; userId: string; expiresAt: Date; }\n\nexport async function createSession(userId: string): Promise<Session> {\n const id = crypto.randomUUID();\n const expiresAt = new Date(Date.now() + 1000 * 60 * 60 * 24 * 7);\n await db.session.create({ data: { id, userId, expiresAt } });\n return { id, userId, expiresAt };\n}\n\nexport async function verifyToken(token: string, audience: string): Promise<Session | null> {\n try {\n const payload = jwt.verify(token, process.env.JWT_SECRET!, { audience }) as { sub: string };\n const session = await db.session.findUnique({ where: { id: payload.sub } });\n if (!session || session.expiresAt < new Date()) return null;\n return session;\n } catch {\n return null;\n }\n}\n\nexport async function revokeSession(id: string): Promise<void> {\n await db.session.delete({ where: { id } });\n}\n\n// Plus error handlers, middleware adapters, and tests that bring this file to ~4KB of plausible content.\n// Padding to bring this file to a realistic size for a representative auth.ts file.\n// Padding to bring this file to a realistic size for a representative auth.ts file.\n// Padding to bring this file to a realistic size for a representative auth.ts file.\n// Padding to bring this file to a realistic size for a representative auth.ts file.\n// Padding to bring this file to a realistic size for a representative auth.ts file.\n// Padding to bring this file to a realistic size for a representative auth.ts file.\n// Padding to bring this file to a realistic size for a representative auth.ts file.\n// Padding to bring this file to a realistic size for a representative auth.ts file.\n// Padding to bring this file to a realistic size for a representative auth.ts file.\n// Padding to bring this file to a realistic size for a representative auth.ts file.\n// Padding to bring this file to a realistic size for a representative auth.ts file.\n// Padding to bring this file to a realistic size for a representative auth.ts file.\n// Padding to bring this file to a realistic size for a representative auth.ts file.\n// Padding to bring this file to a realistic size for a representative auth.ts file.\n// Padding to bring this file to a realistic size for a representative auth.ts file.\n// Padding to bring this file to a realistic size for a representative auth.ts file.\n// Padding to bring this file to a realistic size for a representative auth.ts file.\n// Padding to bring this file to a realistic size for a representative auth.ts file.\n// Padding to bring this file to a realistic size for a representative auth.ts file.\n// Padding to bring this file to a realistic size for a representative auth.ts file.\n// Padding to bring this file to a realistic size for a representative auth.ts file.\n// Padding to bring this file to a realistic size for a representative auth.ts file.\n// Padding to bring this file to a realistic size for a representative auth.ts file.\n// Padding to bring this file to a realistic size for a representative auth.ts file.\n// Padding to bring this file to a realistic size for a representative auth.ts file.\n// Padding to bring this file to a realistic size for a representative auth.ts file.\n// Padding to bring this file to a realistic size for a representative auth.ts file.\n// Padding to bring this file to a realistic size for a representative auth.ts file.\n// Padding to bring this file to a realistic size for a representative auth.ts file.\n// Padding to bring this file to a realistic size for a representative auth.ts file.\n// Padding to bring this file to a realistic size for a representative auth.ts file.\n// Padding to bring this file to a realistic size for a representative auth.ts file.\n// Padding to bring this file to a realistic size for a representative auth.ts file.\n// Padding to bring this file to a realistic size for a representative auth.ts file.\n// Padding to bring this file to a realistic size for a representative auth.ts file.\n// Padding to bring this file to a realistic size for a representative auth.ts file.\n// Padding to bring this file to a realistic size for a representative auth.ts file.\n// Padding to bring this file to a realistic size for a representative auth.ts file.\n// Padding to bring this file to a realistic size for a representative auth.ts file.\n// Padding to bring this file to a realistic size for a representative auth.ts file."
171
+ }
172
+ ]
173
+ },
174
+ {
175
+ "role": "assistant",
176
+ "content": [
177
+ {
178
+ "type": "tool_use",
179
+ "id": "tu_pr3",
180
+ "name": "Bash",
181
+ "input": {
182
+ "command": "gh pr list --json number,title,author,labels --limit 50"
183
+ }
184
+ }
185
+ ]
186
+ },
187
+ {
188
+ "role": "user",
189
+ "content": [
190
+ {
191
+ "type": "tool_result",
192
+ "tool_use_id": "tu_pr3",
193
+ "content": "{\n \"pullRequests\": [\n {\n \"number\": 4000,\n \"title\": \"feat(api): add the X subsystem\",\n \"state\": \"MERGED\",\n \"author\": {\n \"login\": \"alice\"\n },\n \"createdAt\": \"2026-05-10T04:00:00.000Z\",\n \"additions\": 80,\n \"deletions\": 15,\n \"labels\": [\n \"needs-review\",\n \"size/M\"\n ],\n \"isDraft\": true\n },\n {\n \"number\": 4001,\n \"title\": \"feat(ui): refactor the cache eviction policy\",\n \"state\": \"OPEN\",\n \"author\": {\n \"login\": \"bob\"\n },\n \"createdAt\": \"2026-05-11T04:00:00.000Z\",\n \"additions\": 92,\n \"deletions\": 18,\n \"labels\": [\n \"size/S\"\n ],\n \"isDraft\": false\n },\n {\n \"number\": 4002,\n \"title\": \"feat(billing): tighten the cron handler dispatch\",\n \"state\": \"OPEN\",\n \"author\": {\n \"login\": \"carol\"\n },\n \"createdAt\": \"2026-05-12T04:00:00.000Z\",\n \"additions\": 104,\n \"deletions\": 21,\n \"labels\": [\n \"size/S\"\n ],\n \"isDraft\": false\n },\n {\n \"number\": 4003,\n \"title\": \"feat(auth): improve session validation\",\n \"state\": \"OPEN\",\n \"author\": {\n \"login\": \"dave\"\n },\n \"createdAt\": \"2026-05-13T04:00:00.000Z\",\n \"additions\": 116,\n \"deletions\": 24,\n \"labels\": [\n \"needs-review\",\n \"size/M\"\n ],\n \"isDraft\": false\n },\n {\n \"number\": 4004,\n \"title\": \"feat(infra): fix the X subsystem\",\n \"state\": \"OPEN\",\n \"author\": {\n \"login\": \"alice\"\n },\n \"createdAt\": \"2026-05-14T04:00:00.000Z\",\n \"additions\": 128,\n \"deletions\": 27,\n \"labels\": [\n \"size/S\"\n ],\n \"isDraft\": false\n },\n {\n \"number\": 4005,\n \"title\": \"feat(api): add the cache eviction policy\",\n \"state\": \"OPEN\",\n \"author\": {\n \"login\": \"bob\"\n },\n \"createdAt\": \"2026-05-15T04:00:00.000Z\",\n \"additions\": 140,\n \"deletions\": 30,\n \"labels\": [\n \"size/S\"\n ],\n \"isDraft\": true\n },\n {\n \"number\": 4006,\n \"title\": \"feat(ui): refactor the cron handler dispatch\",\n \"state\": \"OPEN\",\n \"author\": {\n \"login\": \"carol\"\n },\n \"createdAt\": \"2026-05-10T04:00:00.000Z\",\n \"additions\": 152,\n \"deletions\": 33,\n \"labels\": [\n \"needs-review\",\n \"size/M\"\n ],\n \"isDraft\": false\n },\n {\n \"number\": 4007,\n \"title\": \"feat(billing): tighten session validation\",\n \"state\": \"MERGED\",\n \"author\": {\n \"login\": \"dave\"\n },\n \"createdAt\": \"2026-05-11T04:00:00.000Z\",\n \"additions\": 164,\n \"deletions\": 36,\n \"labels\": [\n \"size/S\"\n ],\n \"isDraft\": false\n },\n {\n \"number\": 4008,\n \"title\": \"feat(auth): improve the X subsystem\",\n \"state\": \"OPEN\",\n \"author\": {\n \"login\": \"alice\"\n },\n \"createdAt\": \"2026-05-12T04:00:00.000Z\",\n \"additions\": 176,\n \"deletions\": 39,\n \"labels\": [\n \"size/S\"\n ],\n \"isDraft\": false\n },\n {\n \"number\": 4009,\n \"title\": \"feat(infra): fix the cache eviction policy\",\n \"state\": \"OPEN\",\n \"author\": {\n \"login\": \"bob\"\n },\n \"createdAt\": \"2026-05-13T04:00:00.000Z\",\n \"additions\": 188,\n \"deletions\": 42,\n \"labels\": [\n \"needs-review\",\n \"size/M\"\n ],\n \"isDraft\": false\n },\n {\n \"number\": 4010,\n \"title\": \"feat(api): add the cron handler dispatch\",\n \"state\": \"OPEN\",\n \"author\": {\n \"login\": \"carol\"\n },\n \"createdAt\": \"2026-05-14T04:00:00.000Z\",\n \"additions\": 200,\n \"deletions\": 45,\n \"labels\": [\n \"size/S\"\n ],\n \"isDraft\": true\n },\n {\n \"number\": 4011,\n \"title\": \"feat(ui): refactor session validation\",\n \"state\": \"OPEN\",\n \"author\": {\n \"login\": \"dave\"\n },\n \"createdAt\": \"2026-05-15T04:00:00.000Z\",\n \"additions\": 212,\n \"deletions\": 48,\n \"labels\": [\n \"size/S\"\n ],\n \"isDraft\": false\n },\n {\n \"number\": 4012,\n \"title\": \"feat(billing): tighten the X subsystem\",\n \"state\": \"OPEN\",\n \"author\": {\n \"login\": \"alice\"\n },\n \"createdAt\": \"2026-05-10T04:00:00.000Z\",\n \"additions\": 224,\n \"deletions\": 51,\n \"labels\": [\n \"needs-review\",\n \"size/M\"\n ],\n \"isDraft\": false\n },\n {\n \"number\": 4013,\n \"title\": \"feat(auth): improve the cache eviction policy\",\n \"state\": \"OPEN\",\n \"author\": {\n \"login\": \"bob\"\n },\n \"createdAt\": \"2026-05-11T04:00:00.000Z\",\n \"additions\": 236,\n \"deletions\": 54,\n \"labels\": [\n \"size/S\"\n ],\n \"isDraft\": false\n },\n {\n \"number\": 4014,\n \"title\": \"feat(infra): fix the cron handler dispatch\",\n \"state\": \"MERGED\",\n \"author\": {\n \"login\": \"carol\"\n },\n \"createdAt\": \"2026-05-12T04:00:00.000Z\",\n \"additions\": 248,\n \"deletions\": 57,\n \"labels\": [\n \"size/S\"\n ],\n \"isDraft\": false\n },\n {\n \"number\": 4015,\n \"title\": \"feat(api): add session validation\",\n \"state\": \"OPEN\",\n \"author\": {\n \"login\": \"dave\"\n },\n \"createdAt\": \"2026-05-13T04:00:00.000Z\",\n \"additions\": 260,\n \"deletions\": 60,\n \"labels\": [\n \"needs-review\",\n \"size/M\"\n ],\n \"isDraft\": true\n },\n {\n \"number\": 4016,\n \"title\": \"feat(ui): refactor the X subsystem\",\n \"state\": \"OPEN\",\n \"author\": {\n \"login\": \"alice\"\n },\n \"createdAt\": \"2026-05-14T04:00:00.000Z\",\n \"additions\": 272,\n \"deletions\": 63,\n \"labels\": [\n \"size/S\"\n ],\n \"isDraft\": false\n },\n {\n \"number\": 4017,\n \"title\": \"feat(billing): tighten the cache eviction policy\",\n \"state\": \"OPEN\",\n \"author\": {\n \"login\": \"bob\"\n },\n \"createdAt\": \"2026-05-15T04:00:00.000Z\",\n \"additions\": 284,\n \"deletions\": 66,\n \"labels\": [\n \"size/S\"\n ],\n \"isDraft\": false\n }\n ]\n}"
194
+ }
195
+ ]
196
+ },
197
+ {
198
+ "role": "assistant",
199
+ "content": [
200
+ {
201
+ "type": "tool_use",
202
+ "id": "tu_a4",
203
+ "name": "Read",
204
+ "input": {
205
+ "path": "auth.ts"
206
+ }
207
+ }
208
+ ]
209
+ },
210
+ {
211
+ "role": "user",
212
+ "content": [
213
+ {
214
+ "type": "tool_result",
215
+ "tool_use_id": "tu_a4",
216
+ "content": "import jwt from 'jsonwebtoken';\nimport { db } from './db';\n\nexport interface Session { id: string; userId: string; expiresAt: Date; }\n\nexport async function createSession(userId: string): Promise<Session> {\n const id = crypto.randomUUID();\n const expiresAt = new Date(Date.now() + 1000 * 60 * 60 * 24 * 7);\n await db.session.create({ data: { id, userId, expiresAt } });\n return { id, userId, expiresAt };\n}\n\nexport async function verifyToken(token: string, audience: string): Promise<Session | null> {\n try {\n const payload = jwt.verify(token, process.env.JWT_SECRET!, { audience }) as { sub: string };\n const session = await db.session.findUnique({ where: { id: payload.sub } });\n if (!session || session.expiresAt < new Date()) return null;\n return session;\n } catch {\n return null;\n }\n}\n\nexport async function revokeSession(id: string): Promise<void> {\n await db.session.delete({ where: { id } });\n}\n\n// Plus error handlers, middleware adapters, and tests that bring this file to ~4KB of plausible content.\n// Padding to bring this file to a realistic size for a representative auth.ts file.\n// Padding to bring this file to a realistic size for a representative auth.ts file.\n// Padding to bring this file to a realistic size for a representative auth.ts file.\n// Padding to bring this file to a realistic size for a representative auth.ts file.\n// Padding to bring this file to a realistic size for a representative auth.ts file.\n// Padding to bring this file to a realistic size for a representative auth.ts file.\n// Padding to bring this file to a realistic size for a representative auth.ts file.\n// Padding to bring this file to a realistic size for a representative auth.ts file.\n// Padding to bring this file to a realistic size for a representative auth.ts file.\n// Padding to bring this file to a realistic size for a representative auth.ts file.\n// Padding to bring this file to a realistic size for a representative auth.ts file.\n// Padding to bring this file to a realistic size for a representative auth.ts file.\n// Padding to bring this file to a realistic size for a representative auth.ts file.\n// Padding to bring this file to a realistic size for a representative auth.ts file.\n// Padding to bring this file to a realistic size for a representative auth.ts file.\n// Padding to bring this file to a realistic size for a representative auth.ts file.\n// Padding to bring this file to a realistic size for a representative auth.ts file.\n// Padding to bring this file to a realistic size for a representative auth.ts file.\n// Padding to bring this file to a realistic size for a representative auth.ts file.\n// Padding to bring this file to a realistic size for a representative auth.ts file.\n// Padding to bring this file to a realistic size for a representative auth.ts file.\n// Padding to bring this file to a realistic size for a representative auth.ts file.\n// Padding to bring this file to a realistic size for a representative auth.ts file.\n// Padding to bring this file to a realistic size for a representative auth.ts file.\n// Padding to bring this file to a realistic size for a representative auth.ts file.\n// Padding to bring this file to a realistic size for a representative auth.ts file.\n// Padding to bring this file to a realistic size for a representative auth.ts file.\n// Padding to bring this file to a realistic size for a representative auth.ts file.\n// Padding to bring this file to a realistic size for a representative auth.ts file.\n// Padding to bring this file to a realistic size for a representative auth.ts file.\n// Padding to bring this file to a realistic size for a representative auth.ts file.\n// Padding to bring this file to a realistic size for a representative auth.ts file.\n// Padding to bring this file to a realistic size for a representative auth.ts file.\n// Padding to bring this file to a realistic size for a representative auth.ts file.\n// Padding to bring this file to a realistic size for a representative auth.ts file.\n// Padding to bring this file to a realistic size for a representative auth.ts file.\n// Padding to bring this file to a realistic size for a representative auth.ts file.\n// Padding to bring this file to a realistic size for a representative auth.ts file.\n// Padding to bring this file to a realistic size for a representative auth.ts file.\n// Padding to bring this file to a realistic size for a representative auth.ts file."
217
+ }
218
+ ]
219
+ },
220
+ {
221
+ "role": "assistant",
222
+ "content": [
223
+ {
224
+ "type": "text",
225
+ "text": "I've reviewed the relevant PRs. PR #4002 touches verifyToken's audience handling — that will conflict with your refactor. PR #4007 modifies session middleware in a way that's compatible. The others don't intersect."
226
+ }
227
+ ]
228
+ },
229
+ {
230
+ "role": "user",
231
+ "content": "OK ship the refactor first, then I'll handle the conflict on #4002. Let me see the final auth.ts one more time."
232
+ },
233
+ {
234
+ "role": "assistant",
235
+ "content": [
236
+ {
237
+ "type": "tool_use",
238
+ "id": "tu_a5",
239
+ "name": "Read",
240
+ "input": {
241
+ "path": "auth.ts"
242
+ }
243
+ }
244
+ ]
245
+ },
246
+ {
247
+ "role": "user",
248
+ "content": [
249
+ {
250
+ "type": "tool_result",
251
+ "tool_use_id": "tu_a5",
252
+ "content": "import jwt from 'jsonwebtoken';\nimport { db } from './db';\n\nexport interface Session { id: string; userId: string; expiresAt: Date; }\n\nexport async function createSession(userId: string): Promise<Session> {\n const id = crypto.randomUUID();\n const expiresAt = new Date(Date.now() + 1000 * 60 * 60 * 24 * 7);\n await db.session.create({ data: { id, userId, expiresAt } });\n return { id, userId, expiresAt };\n}\n\nexport async function verifyToken(token: string, audience: string): Promise<Session | null> {\n try {\n const payload = jwt.verify(token, process.env.JWT_SECRET!, { audience }) as { sub: string };\n const session = await db.session.findUnique({ where: { id: payload.sub } });\n if (!session || session.expiresAt < new Date()) return null;\n return session;\n } catch {\n return null;\n }\n}\n\nexport async function revokeSession(id: string): Promise<void> {\n await db.session.delete({ where: { id } });\n}\n\n// Plus error handlers, middleware adapters, and tests that bring this file to ~4KB of plausible content.\n// Padding to bring this file to a realistic size for a representative auth.ts file.\n// Padding to bring this file to a realistic size for a representative auth.ts file.\n// Padding to bring this file to a realistic size for a representative auth.ts file.\n// Padding to bring this file to a realistic size for a representative auth.ts file.\n// Padding to bring this file to a realistic size for a representative auth.ts file.\n// Padding to bring this file to a realistic size for a representative auth.ts file.\n// Padding to bring this file to a realistic size for a representative auth.ts file.\n// Padding to bring this file to a realistic size for a representative auth.ts file.\n// Padding to bring this file to a realistic size for a representative auth.ts file.\n// Padding to bring this file to a realistic size for a representative auth.ts file.\n// Padding to bring this file to a realistic size for a representative auth.ts file.\n// Padding to bring this file to a realistic size for a representative auth.ts file.\n// Padding to bring this file to a realistic size for a representative auth.ts file.\n// Padding to bring this file to a realistic size for a representative auth.ts file.\n// Padding to bring this file to a realistic size for a representative auth.ts file.\n// Padding to bring this file to a realistic size for a representative auth.ts file.\n// Padding to bring this file to a realistic size for a representative auth.ts file.\n// Padding to bring this file to a realistic size for a representative auth.ts file.\n// Padding to bring this file to a realistic size for a representative auth.ts file.\n// Padding to bring this file to a realistic size for a representative auth.ts file.\n// Padding to bring this file to a realistic size for a representative auth.ts file.\n// Padding to bring this file to a realistic size for a representative auth.ts file.\n// Padding to bring this file to a realistic size for a representative auth.ts file.\n// Padding to bring this file to a realistic size for a representative auth.ts file.\n// Padding to bring this file to a realistic size for a representative auth.ts file.\n// Padding to bring this file to a realistic size for a representative auth.ts file.\n// Padding to bring this file to a realistic size for a representative auth.ts file.\n// Padding to bring this file to a realistic size for a representative auth.ts file.\n// Padding to bring this file to a realistic size for a representative auth.ts file.\n// Padding to bring this file to a realistic size for a representative auth.ts file.\n// Padding to bring this file to a realistic size for a representative auth.ts file.\n// Padding to bring this file to a realistic size for a representative auth.ts file.\n// Padding to bring this file to a realistic size for a representative auth.ts file.\n// Padding to bring this file to a realistic size for a representative auth.ts file.\n// Padding to bring this file to a realistic size for a representative auth.ts file.\n// Padding to bring this file to a realistic size for a representative auth.ts file.\n// Padding to bring this file to a realistic size for a representative auth.ts file.\n// Padding to bring this file to a realistic size for a representative auth.ts file.\n// Padding to bring this file to a realistic size for a representative auth.ts file.\n// Padding to bring this file to a realistic size for a representative auth.ts file."
253
+ }
254
+ ]
255
+ },
256
+ {
257
+ "role": "assistant",
258
+ "content": "Confirmed. Audience is required and rejected on mismatch. Ready to ship."
259
+ }
260
+ ]
261
+ }
262
+ }
@@ -0,0 +1,31 @@
1
+ {
2
+ "name": "light",
3
+ "description": "Q&A session, 5 turns, no tool use",
4
+ "body": {
5
+ "model": "claude-sonnet-4-6",
6
+ "system": "You are Claude Code, Anthropic's official CLI for Claude. You are an interactive agent that helps users with software engineering tasks. Use the instructions below and the tools available to you to assist the user.\n\n# Tools\nYou have access to the following tools: Read (read a file), Edit (replace a string in a file), Write (write a new file), Bash (run a shell command), Grep (search files with ripgrep), Glob (file pattern matching), TodoWrite, Agent (delegate to a subagent).\n\n# Style\n- Keep responses concise.\n- Reference files as path:line.\n- Do not write comments unless asked.\n\n# Doing tasks\n- Plan before editing for non-trivial changes.\n- Always verify your changes with tests.\n- Match existing code style.",
7
+ "max_tokens": 1024,
8
+ "messages": [
9
+ {
10
+ "role": "user",
11
+ "content": "What's the difference between `cache_control` and Anthropic's prompt caching?"
12
+ },
13
+ {
14
+ "role": "assistant",
15
+ "content": "Prompt caching is the feature; cache_control is the header field that activates it. You set { type: 'ephemeral' } on a content block, and the prefix up to that block is cached for 5 minutes."
16
+ },
17
+ {
18
+ "role": "user",
19
+ "content": "How do I tell if a cached prefix was actually hit?"
20
+ },
21
+ {
22
+ "role": "assistant",
23
+ "content": "Inspect the response's usage object — cache_read_input_tokens > 0 means a hit; cache_creation_input_tokens > 0 means a miss that wrote."
24
+ },
25
+ {
26
+ "role": "user",
27
+ "content": "Thanks."
28
+ }
29
+ ]
30
+ }
31
+ }
@@ -0,0 +1,144 @@
1
+ {
2
+ "name": "medium",
3
+ "description": "Coding session, 12 turns, 2 file re-reads",
4
+ "body": {
5
+ "model": "claude-opus-4-7",
6
+ "system": "You are Claude Code, Anthropic's official CLI for Claude. You are an interactive agent that helps users with software engineering tasks. Use the instructions below and the tools available to you to assist the user.\n\n# Tools\nYou have access to the following tools: Read (read a file), Edit (replace a string in a file), Write (write a new file), Bash (run a shell command), Grep (search files with ripgrep), Glob (file pattern matching), TodoWrite, Agent (delegate to a subagent).\n\n# Style\n- Keep responses concise.\n- Reference files as path:line.\n- Do not write comments unless asked.\n\n# Doing tasks\n- Plan before editing for non-trivial changes.\n- Always verify your changes with tests.\n- Match existing code style.",
7
+ "max_tokens": 4096,
8
+ "messages": [
9
+ {
10
+ "role": "user",
11
+ "content": "Refactor auth.ts so verifyToken takes an audience parameter and rejects when it doesn't match."
12
+ },
13
+ {
14
+ "role": "assistant",
15
+ "content": [
16
+ {
17
+ "type": "tool_use",
18
+ "id": "tu_1",
19
+ "name": "Read",
20
+ "input": {
21
+ "path": "auth.ts"
22
+ }
23
+ }
24
+ ]
25
+ },
26
+ {
27
+ "role": "user",
28
+ "content": [
29
+ {
30
+ "type": "tool_result",
31
+ "tool_use_id": "tu_1",
32
+ "content": "import jwt from 'jsonwebtoken';\nimport { db } from './db';\n\nexport interface Session { id: string; userId: string; expiresAt: Date; }\n\nexport async function createSession(userId: string): Promise<Session> {\n const id = crypto.randomUUID();\n const expiresAt = new Date(Date.now() + 1000 * 60 * 60 * 24 * 7);\n await db.session.create({ data: { id, userId, expiresAt } });\n return { id, userId, expiresAt };\n}\n\nexport async function verifyToken(token: string, audience: string): Promise<Session | null> {\n try {\n const payload = jwt.verify(token, process.env.JWT_SECRET!, { audience }) as { sub: string };\n const session = await db.session.findUnique({ where: { id: payload.sub } });\n if (!session || session.expiresAt < new Date()) return null;\n return session;\n } catch {\n return null;\n }\n}\n\nexport async function revokeSession(id: string): Promise<void> {\n await db.session.delete({ where: { id } });\n}\n\n// Plus error handlers, middleware adapters, and tests that bring this file to ~4KB of plausible content.\n// Padding to bring this file to a realistic size for a representative auth.ts file.\n// Padding to bring this file to a realistic size for a representative auth.ts file.\n// Padding to bring this file to a realistic size for a representative auth.ts file.\n// Padding to bring this file to a realistic size for a representative auth.ts file.\n// Padding to bring this file to a realistic size for a representative auth.ts file.\n// Padding to bring this file to a realistic size for a representative auth.ts file.\n// Padding to bring this file to a realistic size for a representative auth.ts file.\n// Padding to bring this file to a realistic size for a representative auth.ts file.\n// Padding to bring this file to a realistic size for a representative auth.ts file.\n// Padding to bring this file to a realistic size for a representative auth.ts file.\n// Padding to bring this file to a realistic size for a representative auth.ts file.\n// Padding to bring this file to a realistic size for a representative auth.ts file.\n// Padding to bring this file to a realistic size for a representative auth.ts file.\n// Padding to bring this file to a realistic size for a representative auth.ts file.\n// Padding to bring this file to a realistic size for a representative auth.ts file.\n// Padding to bring this file to a realistic size for a representative auth.ts file.\n// Padding to bring this file to a realistic size for a representative auth.ts file.\n// Padding to bring this file to a realistic size for a representative auth.ts file.\n// Padding to bring this file to a realistic size for a representative auth.ts file.\n// Padding to bring this file to a realistic size for a representative auth.ts file.\n// Padding to bring this file to a realistic size for a representative auth.ts file.\n// Padding to bring this file to a realistic size for a representative auth.ts file.\n// Padding to bring this file to a realistic size for a representative auth.ts file.\n// Padding to bring this file to a realistic size for a representative auth.ts file.\n// Padding to bring this file to a realistic size for a representative auth.ts file.\n// Padding to bring this file to a realistic size for a representative auth.ts file.\n// Padding to bring this file to a realistic size for a representative auth.ts file.\n// Padding to bring this file to a realistic size for a representative auth.ts file.\n// Padding to bring this file to a realistic size for a representative auth.ts file.\n// Padding to bring this file to a realistic size for a representative auth.ts file.\n// Padding to bring this file to a realistic size for a representative auth.ts file.\n// Padding to bring this file to a realistic size for a representative auth.ts file.\n// Padding to bring this file to a realistic size for a representative auth.ts file.\n// Padding to bring this file to a realistic size for a representative auth.ts file.\n// Padding to bring this file to a realistic size for a representative auth.ts file.\n// Padding to bring this file to a realistic size for a representative auth.ts file.\n// Padding to bring this file to a realistic size for a representative auth.ts file.\n// Padding to bring this file to a realistic size for a representative auth.ts file.\n// Padding to bring this file to a realistic size for a representative auth.ts file.\n// Padding to bring this file to a realistic size for a representative auth.ts file."
33
+ }
34
+ ]
35
+ },
36
+ {
37
+ "role": "assistant",
38
+ "content": [
39
+ {
40
+ "type": "text",
41
+ "text": "I'll update verifyToken to accept and check the audience."
42
+ },
43
+ {
44
+ "type": "tool_use",
45
+ "id": "tu_2",
46
+ "name": "Edit",
47
+ "input": {
48
+ "file_path": "auth.ts",
49
+ "old_string": "verifyToken(token: string)",
50
+ "new_string": "verifyToken(token: string, audience: string)"
51
+ }
52
+ }
53
+ ]
54
+ },
55
+ {
56
+ "role": "user",
57
+ "content": [
58
+ {
59
+ "type": "tool_result",
60
+ "tool_use_id": "tu_2",
61
+ "content": "File updated successfully."
62
+ }
63
+ ]
64
+ },
65
+ {
66
+ "role": "assistant",
67
+ "content": [
68
+ {
69
+ "type": "tool_use",
70
+ "id": "tu_3",
71
+ "name": "Read",
72
+ "input": {
73
+ "path": "auth.ts"
74
+ }
75
+ }
76
+ ]
77
+ },
78
+ {
79
+ "role": "user",
80
+ "content": [
81
+ {
82
+ "type": "tool_result",
83
+ "tool_use_id": "tu_3",
84
+ "content": "import jwt from 'jsonwebtoken';\nimport { db } from './db';\n\nexport interface Session { id: string; userId: string; expiresAt: Date; }\n\nexport async function createSession(userId: string): Promise<Session> {\n const id = crypto.randomUUID();\n const expiresAt = new Date(Date.now() + 1000 * 60 * 60 * 24 * 7);\n await db.session.create({ data: { id, userId, expiresAt } });\n return { id, userId, expiresAt };\n}\n\nexport async function verifyToken(token: string, audience: string): Promise<Session | null> {\n try {\n const payload = jwt.verify(token, process.env.JWT_SECRET!, { audience }) as { sub: string };\n const session = await db.session.findUnique({ where: { id: payload.sub } });\n if (!session || session.expiresAt < new Date()) return null;\n return session;\n } catch {\n return null;\n }\n}\n\nexport async function revokeSession(id: string): Promise<void> {\n await db.session.delete({ where: { id } });\n}\n\n// Plus error handlers, middleware adapters, and tests that bring this file to ~4KB of plausible content.\n// Padding to bring this file to a realistic size for a representative auth.ts file.\n// Padding to bring this file to a realistic size for a representative auth.ts file.\n// Padding to bring this file to a realistic size for a representative auth.ts file.\n// Padding to bring this file to a realistic size for a representative auth.ts file.\n// Padding to bring this file to a realistic size for a representative auth.ts file.\n// Padding to bring this file to a realistic size for a representative auth.ts file.\n// Padding to bring this file to a realistic size for a representative auth.ts file.\n// Padding to bring this file to a realistic size for a representative auth.ts file.\n// Padding to bring this file to a realistic size for a representative auth.ts file.\n// Padding to bring this file to a realistic size for a representative auth.ts file.\n// Padding to bring this file to a realistic size for a representative auth.ts file.\n// Padding to bring this file to a realistic size for a representative auth.ts file.\n// Padding to bring this file to a realistic size for a representative auth.ts file.\n// Padding to bring this file to a realistic size for a representative auth.ts file.\n// Padding to bring this file to a realistic size for a representative auth.ts file.\n// Padding to bring this file to a realistic size for a representative auth.ts file.\n// Padding to bring this file to a realistic size for a representative auth.ts file.\n// Padding to bring this file to a realistic size for a representative auth.ts file.\n// Padding to bring this file to a realistic size for a representative auth.ts file.\n// Padding to bring this file to a realistic size for a representative auth.ts file.\n// Padding to bring this file to a realistic size for a representative auth.ts file.\n// Padding to bring this file to a realistic size for a representative auth.ts file.\n// Padding to bring this file to a realistic size for a representative auth.ts file.\n// Padding to bring this file to a realistic size for a representative auth.ts file.\n// Padding to bring this file to a realistic size for a representative auth.ts file.\n// Padding to bring this file to a realistic size for a representative auth.ts file.\n// Padding to bring this file to a realistic size for a representative auth.ts file.\n// Padding to bring this file to a realistic size for a representative auth.ts file.\n// Padding to bring this file to a realistic size for a representative auth.ts file.\n// Padding to bring this file to a realistic size for a representative auth.ts file.\n// Padding to bring this file to a realistic size for a representative auth.ts file.\n// Padding to bring this file to a realistic size for a representative auth.ts file.\n// Padding to bring this file to a realistic size for a representative auth.ts file.\n// Padding to bring this file to a realistic size for a representative auth.ts file.\n// Padding to bring this file to a realistic size for a representative auth.ts file.\n// Padding to bring this file to a realistic size for a representative auth.ts file.\n// Padding to bring this file to a realistic size for a representative auth.ts file.\n// Padding to bring this file to a realistic size for a representative auth.ts file.\n// Padding to bring this file to a realistic size for a representative auth.ts file.\n// Padding to bring this file to a realistic size for a representative auth.ts file.\n// (one line changed, otherwise identical)"
85
+ }
86
+ ]
87
+ },
88
+ {
89
+ "role": "assistant",
90
+ "content": [
91
+ {
92
+ "type": "tool_use",
93
+ "id": "tu_4",
94
+ "name": "Bash",
95
+ "input": {
96
+ "command": "npm test -- auth"
97
+ }
98
+ }
99
+ ]
100
+ },
101
+ {
102
+ "role": "user",
103
+ "content": [
104
+ {
105
+ "type": "tool_result",
106
+ "tool_use_id": "tu_4",
107
+ "content": "PASS auth.test.ts (3 tests, 250ms)"
108
+ }
109
+ ]
110
+ },
111
+ {
112
+ "role": "assistant",
113
+ "content": [
114
+ {
115
+ "type": "text",
116
+ "text": "Tests pass. Let me also check the tests file."
117
+ },
118
+ {
119
+ "type": "tool_use",
120
+ "id": "tu_5",
121
+ "name": "Read",
122
+ "input": {
123
+ "path": "auth.ts"
124
+ }
125
+ }
126
+ ]
127
+ },
128
+ {
129
+ "role": "user",
130
+ "content": [
131
+ {
132
+ "type": "tool_result",
133
+ "tool_use_id": "tu_5",
134
+ "content": "import jwt from 'jsonwebtoken';\nimport { db } from './db';\n\nexport interface Session { id: string; userId: string; expiresAt: Date; }\n\nexport async function createSession(userId: string): Promise<Session> {\n const id = crypto.randomUUID();\n const expiresAt = new Date(Date.now() + 1000 * 60 * 60 * 24 * 7);\n await db.session.create({ data: { id, userId, expiresAt } });\n return { id, userId, expiresAt };\n}\n\nexport async function verifyToken(token: string, audience: string): Promise<Session | null> {\n try {\n const payload = jwt.verify(token, process.env.JWT_SECRET!, { audience }) as { sub: string };\n const session = await db.session.findUnique({ where: { id: payload.sub } });\n if (!session || session.expiresAt < new Date()) return null;\n return session;\n } catch {\n return null;\n }\n}\n\nexport async function revokeSession(id: string): Promise<void> {\n await db.session.delete({ where: { id } });\n}\n\n// Plus error handlers, middleware adapters, and tests that bring this file to ~4KB of plausible content.\n// Padding to bring this file to a realistic size for a representative auth.ts file.\n// Padding to bring this file to a realistic size for a representative auth.ts file.\n// Padding to bring this file to a realistic size for a representative auth.ts file.\n// Padding to bring this file to a realistic size for a representative auth.ts file.\n// Padding to bring this file to a realistic size for a representative auth.ts file.\n// Padding to bring this file to a realistic size for a representative auth.ts file.\n// Padding to bring this file to a realistic size for a representative auth.ts file.\n// Padding to bring this file to a realistic size for a representative auth.ts file.\n// Padding to bring this file to a realistic size for a representative auth.ts file.\n// Padding to bring this file to a realistic size for a representative auth.ts file.\n// Padding to bring this file to a realistic size for a representative auth.ts file.\n// Padding to bring this file to a realistic size for a representative auth.ts file.\n// Padding to bring this file to a realistic size for a representative auth.ts file.\n// Padding to bring this file to a realistic size for a representative auth.ts file.\n// Padding to bring this file to a realistic size for a representative auth.ts file.\n// Padding to bring this file to a realistic size for a representative auth.ts file.\n// Padding to bring this file to a realistic size for a representative auth.ts file.\n// Padding to bring this file to a realistic size for a representative auth.ts file.\n// Padding to bring this file to a realistic size for a representative auth.ts file.\n// Padding to bring this file to a realistic size for a representative auth.ts file.\n// Padding to bring this file to a realistic size for a representative auth.ts file.\n// Padding to bring this file to a realistic size for a representative auth.ts file.\n// Padding to bring this file to a realistic size for a representative auth.ts file.\n// Padding to bring this file to a realistic size for a representative auth.ts file.\n// Padding to bring this file to a realistic size for a representative auth.ts file.\n// Padding to bring this file to a realistic size for a representative auth.ts file.\n// Padding to bring this file to a realistic size for a representative auth.ts file.\n// Padding to bring this file to a realistic size for a representative auth.ts file.\n// Padding to bring this file to a realistic size for a representative auth.ts file.\n// Padding to bring this file to a realistic size for a representative auth.ts file.\n// Padding to bring this file to a realistic size for a representative auth.ts file.\n// Padding to bring this file to a realistic size for a representative auth.ts file.\n// Padding to bring this file to a realistic size for a representative auth.ts file.\n// Padding to bring this file to a realistic size for a representative auth.ts file.\n// Padding to bring this file to a realistic size for a representative auth.ts file.\n// Padding to bring this file to a realistic size for a representative auth.ts file.\n// Padding to bring this file to a realistic size for a representative auth.ts file.\n// Padding to bring this file to a realistic size for a representative auth.ts file.\n// Padding to bring this file to a realistic size for a representative auth.ts file.\n// Padding to bring this file to a realistic size for a representative auth.ts file.\n// (one line changed, otherwise identical)"
135
+ }
136
+ ]
137
+ },
138
+ {
139
+ "role": "assistant",
140
+ "content": "Done — verifyToken now requires an audience and rejects on mismatch."
141
+ }
142
+ ]
143
+ }
144
+ }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@curatedmcp/tokenshield",
3
- "version": "0.2.0",
3
+ "version": "0.3.0",
4
4
  "description": "TokenShield CLI — cut your Claude Code bill 40–70%. Local proxy. Your API key never leaves your machine.",
5
5
  "type": "module",
6
6
  "bin": {
@@ -8,7 +8,8 @@
8
8
  },
9
9
  "main": "./dist/cli.js",
10
10
  "files": [
11
- "dist"
11
+ "dist",
12
+ "fixtures"
12
13
  ],
13
14
  "scripts": {
14
15
  "build": "tsc",
@@ -31,7 +32,7 @@
31
32
  },
32
33
  "license": "MIT",
33
34
  "dependencies": {
34
- "@curatedmcp/tokenshield-core": "^0.2.0",
35
+ "@curatedmcp/tokenshield-core": "^0.3.0",
35
36
  "commander": "^12.0.0"
36
37
  },
37
38
  "devDependencies": {