agent-session-inspector 0.1.6 → 0.1.8
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/VERSION +1 -1
- package/app/.next/BUILD_ID +1 -1
- package/app/.next/app-path-routes-manifest.json +1 -0
- package/app/.next/build-manifest.json +3 -3
- package/app/.next/prerender-manifest.json +3 -3
- package/app/.next/required-server-files.json +1 -1
- package/app/.next/routes-manifest.json +9 -0
- package/app/.next/server/app/_global-error.html +1 -1
- package/app/.next/server/app/_global-error.rsc +1 -1
- package/app/.next/server/app/_global-error.segments/__PAGE__.segment.rsc +1 -1
- package/app/.next/server/app/_global-error.segments/_full.segment.rsc +1 -1
- package/app/.next/server/app/_global-error.segments/_tree.segment.rsc +1 -1
- package/app/.next/server/app/_not-found/page.js.nft.json +1 -1
- package/app/.next/server/app/_not-found/page_client-reference-manifest.js +1 -1
- package/app/.next/server/app/_not-found.html +1 -1
- package/app/.next/server/app/_not-found.rsc +2 -2
- package/app/.next/server/app/_not-found.segments/_full.segment.rsc +2 -2
- package/app/.next/server/app/_not-found.segments/_not-found/__PAGE__.segment.rsc +2 -2
- package/app/.next/server/app/_not-found.segments/_tree.segment.rsc +2 -2
- package/app/.next/server/app/api/analytics/route.js +2 -1
- package/app/.next/server/app/api/analytics/route.js.nft.json +1 -1
- package/app/.next/server/app/api/logs/route.js +2 -1
- package/app/.next/server/app/api/logs/route.js.nft.json +1 -1
- package/app/.next/server/app/api/pricing/route.js +2 -1
- package/app/.next/server/app/api/pricing/route.js.nft.json +1 -1
- package/app/.next/server/app/api/providers/route.js +2 -1
- package/app/.next/server/app/api/providers/route.js.nft.json +1 -1
- package/app/.next/server/app/api/search/route.js +3 -2
- package/app/.next/server/app/api/search/route.js.nft.json +1 -1
- package/app/.next/server/app/api/sessions/[provider]/[id]/record/route/app-paths-manifest.json +3 -0
- package/app/.next/server/app/api/sessions/[provider]/[id]/record/route/build-manifest.json +12 -0
- package/app/.next/server/app/api/sessions/[provider]/[id]/record/route/server-reference-manifest.json +4 -0
- package/app/.next/server/app/api/sessions/[provider]/[id]/record/route.js +8 -0
- package/app/.next/server/app/api/sessions/[provider]/[id]/record/route.js.map +5 -0
- package/app/.next/server/app/api/sessions/[provider]/[id]/record/route.js.nft.json +1 -0
- package/app/.next/server/app/api/sessions/[provider]/[id]/record/route_client-reference-manifest.js +3 -0
- package/app/.next/server/app/api/sessions/[provider]/[id]/reveal/route.js +2 -1
- package/app/.next/server/app/api/sessions/[provider]/[id]/reveal/route.js.nft.json +1 -1
- package/app/.next/server/app/api/sessions/[provider]/[id]/route.js +2 -1
- package/app/.next/server/app/api/sessions/[provider]/[id]/route.js.nft.json +1 -1
- package/app/.next/server/app/api/sessions/route.js +2 -1
- package/app/.next/server/app/api/sessions/route.js.nft.json +1 -1
- package/app/.next/server/app/index.html +1 -1
- package/app/.next/server/app/index.rsc +3 -3
- package/app/.next/server/app/index.segments/__PAGE__.segment.rsc +3 -3
- package/app/.next/server/app/index.segments/_full.segment.rsc +3 -3
- package/app/.next/server/app/index.segments/_tree.segment.rsc +2 -2
- package/app/.next/server/app/page.js.nft.json +1 -1
- package/app/.next/server/app/page_client-reference-manifest.js +1 -1
- package/app/.next/server/app/sessions/[provider]/[id]/page.js.nft.json +1 -1
- package/app/.next/server/app/sessions/[provider]/[id]/page_client-reference-manifest.js +1 -1
- package/app/.next/server/app-paths-manifest.json +1 -0
- package/app/.next/server/chunks/1oeh_server_app_api_sessions_[provider]_[id]_record_route_actions_13lvgh0.js +3 -0
- package/app/.next/server/chunks/[externals]__0xll52b._.js +3 -0
- package/app/.next/server/chunks/[root-of-the-server]__014br-h._.js +3 -0
- package/app/.next/server/chunks/[root-of-the-server]__03bee2l._.js +3 -0
- package/app/.next/server/chunks/[root-of-the-server]__093lyxv._.js +3 -0
- package/app/.next/server/chunks/[root-of-the-server]__0co499t._.js +3 -0
- package/app/.next/server/chunks/[root-of-the-server]__0ne74op._.js +3 -0
- package/app/.next/server/chunks/[root-of-the-server]__0p_hyq8._.js +3 -0
- package/app/.next/server/chunks/[root-of-the-server]__0ryrg2h._.js +3 -0
- package/app/.next/server/chunks/[root-of-the-server]__0uv5tnc._.js +3 -0
- package/app/.next/server/chunks/[root-of-the-server]__0yxic1z._.js +3 -3
- package/app/.next/server/chunks/[root-of-the-server]__1lfc-ga._.js +3 -0
- package/app/.next/server/chunks/[root-of-the-server]__1n_sepq._.js +3 -0
- package/app/.next/server/chunks/ssr/_0o294sf._.js +1 -1
- package/app/.next/server/chunks/ssr/_0wfo2z0._.js +1 -1
- package/app/.next/server/chunks/ssr/src_app_sessions_[provider]_[id]_page_tsx_0uf635h._.js +3 -3
- package/app/.next/server/middleware-build-manifest.js +3 -3
- package/app/.next/server/pages/404.html +1 -1
- package/app/.next/server/pages/500.html +1 -1
- package/app/.next/server/server-reference-manifest.js +1 -1
- package/app/.next/server/server-reference-manifest.json +1 -1
- package/app/.next/static/chunks/1lmw5sxsr57p6.css +1 -0
- package/app/.next/static/chunks/{1z_genu21d6mc.js → 1nuneih_2_kul.js} +1 -1
- package/app/.next/static/chunks/21ckxredfe3pr.js +6 -0
- package/app/package.json +1 -1
- package/app/server.js +1 -1
- package/cli/cli.mjs +159 -52
- package/package.json +1 -1
- package/app/.next/server/chunks/[root-of-the-server]__0dyq0rc._.js +0 -3
- package/app/.next/server/chunks/[root-of-the-server]__0kgkqhn._.js +0 -3
- package/app/.next/server/chunks/[root-of-the-server]__10p8y9z._.js +0 -3
- package/app/.next/server/chunks/[root-of-the-server]__1cceere._.js +0 -3
- package/app/.next/server/chunks/[root-of-the-server]__1eclfq8._.js +0 -3
- package/app/.next/server/chunks/[root-of-the-server]__1lz20wm._.js +0 -3
- package/app/.next/server/chunks/[root-of-the-server]__1zdh1mi._.js +0 -3
- package/app/.next/server/chunks/[root-of-the-server]__20epvou._.js +0 -3
- package/app/.next/static/chunks/1uvlni5bd236c.js +0 -6
- package/app/.next/static/chunks/3xq2kqjs_2byl.css +0 -1
- package/app/AGENTS.md +0 -9
- package/app/CLAUDE.md +0 -1
- package/app/CONTRIBUTING.md +0 -90
- package/app/Dockerfile +0 -34
- package/app/LICENSE +0 -21
- package/app/README.md +0 -369
- package/app/bin/agent-session-inspector.mjs +0 -185
- package/app/components.json +0 -25
- package/app/docs/screenshots/analytics-dark.png +0 -0
- package/app/docs/screenshots/analytics.png +0 -0
- package/app/docs/screenshots/session-overview-dark.png +0 -0
- package/app/docs/screenshots/session-overview.png +0 -0
- package/app/docs/screenshots/sessions-dark.png +0 -0
- package/app/docs/screenshots/sessions.png +0 -0
- package/app/docs/screenshots/timeline-dark.png +0 -0
- package/app/docs/screenshots/timeline.png +0 -0
- package/app/docs/screenshots/token-optimizer-dark.png +0 -0
- package/app/docs/screenshots/token-optimizer.png +0 -0
- package/app/docs/social-preview.png +0 -0
- package/app/eslint.config.mjs +0 -20
- package/app/install.sh +0 -85
- package/app/next.config.ts +0 -17
- package/app/pnpm-lock.yaml +0 -7031
- package/app/pnpm-workspace.yaml +0 -3
- package/app/postcss.config.mjs +0 -7
- package/app/scripts/build-cli.mjs +0 -26
- package/app/scripts/demo-data.mjs +0 -335
- package/app/scripts/deploy-docker.sh +0 -71
- package/app/scripts/package-release.sh +0 -86
- package/app/tsconfig.json +0 -34
- /package/app/.next/static/{rpBXcMOzD9z_w4Y9uQJJ- → muuOFZsnyOfIG_5aUuqFV}/_buildManifest.js +0 -0
- /package/app/.next/static/{rpBXcMOzD9z_w4Y9uQJJ- → muuOFZsnyOfIG_5aUuqFV}/_clientMiddlewareManifest.js +0 -0
- /package/app/.next/static/{rpBXcMOzD9z_w4Y9uQJJ- → muuOFZsnyOfIG_5aUuqFV}/_ssgManifest.js +0 -0
package/app/pnpm-workspace.yaml
DELETED
package/app/postcss.config.mjs
DELETED
|
@@ -1,26 +0,0 @@
|
|
|
1
|
-
#!/usr/bin/env node
|
|
2
|
-
// Bundles src/cli into the single file the launcher loads for report commands
|
|
3
|
-
// (usage, stats, sessions). Output defaults to cli/cli.mjs beside bin/, which
|
|
4
|
-
// is where bin/agent-session-inspector.mjs looks in a checkout and in the
|
|
5
|
-
// packaged build alike.
|
|
6
|
-
import { build } from "esbuild";
|
|
7
|
-
import path from "node:path";
|
|
8
|
-
import { fileURLToPath } from "node:url";
|
|
9
|
-
|
|
10
|
-
const ROOT = path.resolve(path.dirname(fileURLToPath(import.meta.url)), "..");
|
|
11
|
-
const outfile = path.resolve(process.argv[2] ?? path.join(ROOT, "cli", "cli.mjs"));
|
|
12
|
-
|
|
13
|
-
await build({
|
|
14
|
-
entryPoints: [path.join(ROOT, "src", "cli", "index.ts")],
|
|
15
|
-
outfile,
|
|
16
|
-
bundle: true,
|
|
17
|
-
platform: "node",
|
|
18
|
-
format: "esm",
|
|
19
|
-
target: "node22",
|
|
20
|
-
alias: { "@": path.join(ROOT, "src") },
|
|
21
|
-
// Bundled CommonJS dependencies call require() for Node built-ins.
|
|
22
|
-
banner: {
|
|
23
|
-
js: 'import { createRequire as __createRequire } from "node:module";\nconst require = __createRequire(import.meta.url);',
|
|
24
|
-
},
|
|
25
|
-
logLevel: "warning",
|
|
26
|
-
});
|
|
@@ -1,335 +0,0 @@
|
|
|
1
|
-
#!/usr/bin/env node
|
|
2
|
-
// Writes a fake $HOME with synthetic Claude Code, Codex, Copilot and Gemini CLI transcripts, so the
|
|
3
|
-
// UI can be demoed (and README screenshots retaken) without exposing real
|
|
4
|
-
// sessions. Usage:
|
|
5
|
-
// node scripts/demo-data.mjs /tmp/asi-demo
|
|
6
|
-
// HOME=/tmp/asi-demo pnpm dev
|
|
7
|
-
import fs from "fs";
|
|
8
|
-
import path from "path";
|
|
9
|
-
|
|
10
|
-
const root = path.resolve(process.argv[2] ?? ".demo-home");
|
|
11
|
-
fs.rmSync(root, { recursive: true, force: true });
|
|
12
|
-
|
|
13
|
-
const writeJsonl = (file, rows) => {
|
|
14
|
-
fs.mkdirSync(path.dirname(file), { recursive: true });
|
|
15
|
-
fs.writeFileSync(file, rows.map((r) => JSON.stringify(r)).join("\n") + "\n");
|
|
16
|
-
};
|
|
17
|
-
|
|
18
|
-
const clock = (start) => {
|
|
19
|
-
let t = new Date(start).getTime();
|
|
20
|
-
return (seconds = 3) => new Date((t += seconds * 1000)).toISOString();
|
|
21
|
-
};
|
|
22
|
-
|
|
23
|
-
// ---------------------------------------------------------------- Claude Code
|
|
24
|
-
|
|
25
|
-
function claudeSession({ id, cwd, branch, title, start, model, turns }) {
|
|
26
|
-
const at = clock(start);
|
|
27
|
-
const base = { sessionId: id, cwd, gitBranch: branch, version: "2.1.4", entrypoint: "cli" };
|
|
28
|
-
const rows = [{ type: "ai-title", aiTitle: title, sessionId: id }];
|
|
29
|
-
let n = 0;
|
|
30
|
-
let parent = null;
|
|
31
|
-
const uid = () => `${id.slice(0, 8)}-${String(n++).padStart(4, "0")}`;
|
|
32
|
-
const add = (rec) => {
|
|
33
|
-
const uuid = uid();
|
|
34
|
-
rows.push({ ...base, ...rec, uuid, parentUuid: parent });
|
|
35
|
-
parent = uuid;
|
|
36
|
-
};
|
|
37
|
-
let cache = 18_000;
|
|
38
|
-
const usage = (out) => {
|
|
39
|
-
const u = {
|
|
40
|
-
input_tokens: 40 + Math.floor(Math.random() * 400),
|
|
41
|
-
cache_creation_input_tokens: 600 + Math.floor(Math.random() * 2500),
|
|
42
|
-
cache_read_input_tokens: cache,
|
|
43
|
-
output_tokens: out,
|
|
44
|
-
};
|
|
45
|
-
cache += u.cache_creation_input_tokens;
|
|
46
|
-
return u;
|
|
47
|
-
};
|
|
48
|
-
|
|
49
|
-
let msg = 0;
|
|
50
|
-
for (const turn of turns) {
|
|
51
|
-
const turnStart = Date.now();
|
|
52
|
-
add({ type: "user", timestamp: at(20), message: { role: "user", content: turn.prompt } });
|
|
53
|
-
for (const step of turn.steps) {
|
|
54
|
-
const mid = `msg_${id.slice(0, 6)}${msg++}`;
|
|
55
|
-
if (step.thinking) {
|
|
56
|
-
add({
|
|
57
|
-
type: "assistant",
|
|
58
|
-
timestamp: at(4),
|
|
59
|
-
message: { id: mid, role: "assistant", model, content: [{ type: "thinking", thinking: step.thinking }], usage: usage(180) },
|
|
60
|
-
});
|
|
61
|
-
}
|
|
62
|
-
if (step.tool) {
|
|
63
|
-
const toolId = `toolu_${id.slice(0, 6)}${msg}`;
|
|
64
|
-
add({
|
|
65
|
-
type: "assistant",
|
|
66
|
-
timestamp: at(3),
|
|
67
|
-
message: {
|
|
68
|
-
id: mid,
|
|
69
|
-
role: "assistant",
|
|
70
|
-
model,
|
|
71
|
-
content: [{ type: "tool_use", id: toolId, name: step.tool, input: step.input }],
|
|
72
|
-
usage: usage(90 + Math.floor(Math.random() * 400)),
|
|
73
|
-
},
|
|
74
|
-
});
|
|
75
|
-
add({
|
|
76
|
-
type: "user",
|
|
77
|
-
timestamp: at(step.seconds ?? 2),
|
|
78
|
-
message: {
|
|
79
|
-
role: "user",
|
|
80
|
-
content: [{ type: "tool_result", tool_use_id: toolId, content: step.result, is_error: step.error === true }],
|
|
81
|
-
},
|
|
82
|
-
});
|
|
83
|
-
}
|
|
84
|
-
if (step.text) {
|
|
85
|
-
add({
|
|
86
|
-
type: "assistant",
|
|
87
|
-
timestamp: at(5),
|
|
88
|
-
message: { id: mid, role: "assistant", model, content: [{ type: "text", text: step.text }], usage: usage(350) },
|
|
89
|
-
});
|
|
90
|
-
}
|
|
91
|
-
}
|
|
92
|
-
add({ type: "system", subtype: "turn_duration", timestamp: at(1), durationMs: 40_000 + (Date.now() - turnStart) });
|
|
93
|
-
}
|
|
94
|
-
return rows;
|
|
95
|
-
}
|
|
96
|
-
|
|
97
|
-
const claudeProjects = path.join(root, ".claude", "projects");
|
|
98
|
-
|
|
99
|
-
const checkoutCwd = "/Users/demo/code/acme-shop";
|
|
100
|
-
writeJsonl(
|
|
101
|
-
path.join(claudeProjects, "-Users-demo-code-acme-shop", "7f3c2a10-5b1e-4c8d-9a42-1d6e8b0f3c21.jsonl"),
|
|
102
|
-
claudeSession({
|
|
103
|
-
id: "7f3c2a10-5b1e-4c8d-9a42-1d6e8b0f3c21",
|
|
104
|
-
cwd: checkoutCwd,
|
|
105
|
-
branch: "fix/cart-total-rounding",
|
|
106
|
-
title: "Fix cart total rounding bug",
|
|
107
|
-
start: "2026-09-24T09:12:00Z",
|
|
108
|
-
model: "claude-opus-5-5",
|
|
109
|
-
turns: [
|
|
110
|
-
{
|
|
111
|
-
prompt:
|
|
112
|
-
"Customers are reporting the cart total is sometimes off by a cent. Can you find out why and fix it? Tests are in src/cart/__tests__.",
|
|
113
|
-
steps: [
|
|
114
|
-
{ thinking: "Off-by-a-cent usually means floating point arithmetic on prices. Let me find where the total is computed." },
|
|
115
|
-
{ tool: "Grep", input: { pattern: "total", path: "src/cart" }, result: "src/cart/total.ts:12:export function cartTotal(items: CartItem[]) {\nsrc/cart/total.ts:18: return total;\nsrc/cart/summary.tsx:31: const total = cartTotal(items);" },
|
|
116
|
-
{ tool: "Read", input: { file_path: `${checkoutCwd}/src/cart/total.ts` }, result: "export function cartTotal(items: CartItem[]) {\n let total = 0;\n for (const item of items) {\n total += item.price * item.quantity * (1 - item.discount);\n }\n return Math.round(total * 100) / 100;\n}" },
|
|
117
|
-
{ text: "The total sums floating-point prices and rounds once at the end, so values like `0.1 + 0.2` drift before rounding. I'll switch to integer cents and round per line item." },
|
|
118
|
-
{ tool: "Edit", input: { file_path: `${checkoutCwd}/src/cart/total.ts`, old_string: "total += item.price * item.quantity * (1 - item.discount);", new_string: "total += Math.round(toCents(item.price) * item.quantity * (1 - item.discount));" }, result: "The file src/cart/total.ts has been updated." },
|
|
119
|
-
{ tool: "Edit", input: { file_path: `${checkoutCwd}/src/cart/__tests__/total.test.ts`, old_string: "});", new_string: " it('does not drift on fractional prices', () => {\n expect(cartTotal([{ price: 0.1, quantity: 3, discount: 0 }])).toBe(0.3);\n });\n});" }, result: "The file src/cart/__tests__/total.test.ts has been updated." },
|
|
120
|
-
{ tool: "Bash", input: { command: "pnpm test src/cart", description: "Run cart tests" }, seconds: 14, result: " PASS src/cart/__tests__/total.test.ts\n cartTotal\n ✓ sums line items (3 ms)\n ✓ applies discounts (1 ms)\n ✓ does not drift on fractional prices (1 ms)\n\nTest Suites: 1 passed, 1 total\nTests: 3 passed, 3 total" },
|
|
121
|
-
{ text: "Fixed. `cartTotal` now works in integer cents and rounds each line item, so totals no longer drift by a cent. I added a regression test for fractional prices; all 3 cart tests pass." },
|
|
122
|
-
],
|
|
123
|
-
},
|
|
124
|
-
{
|
|
125
|
-
prompt: "Nice. Does the same bug exist in the order summary on the checkout page?",
|
|
126
|
-
steps: [
|
|
127
|
-
{ tool: "Read", input: { file_path: `${checkoutCwd}/src/checkout/summary.tsx` }, result: "import { cartTotal } from '../cart/total';\n\nexport function OrderSummary({ items, shipping }) {\n const subtotal = cartTotal(items);\n const total = subtotal + shipping;\n return <Money value={total} />;\n}" },
|
|
128
|
-
{ tool: "Bash", input: { command: "pnpm test src/checkout", description: "Run checkout tests" }, seconds: 9, result: "Tests: 7 passed, 7 total" },
|
|
129
|
-
{ text: "The checkout summary calls `cartTotal`, so it picks up the fix automatically. Shipping is already stored in cents, so there's nothing else to change there." },
|
|
130
|
-
],
|
|
131
|
-
},
|
|
132
|
-
],
|
|
133
|
-
}),
|
|
134
|
-
);
|
|
135
|
-
|
|
136
|
-
const apiCwd = "/Users/demo/code/weather-api";
|
|
137
|
-
writeJsonl(
|
|
138
|
-
path.join(claudeProjects, "-Users-demo-code-weather-api", "c1d9e4b2-8a7f-4e21-b3c5-6f0a2d9e7b14.jsonl"),
|
|
139
|
-
claudeSession({
|
|
140
|
-
id: "c1d9e4b2-8a7f-4e21-b3c5-6f0a2d9e7b14",
|
|
141
|
-
cwd: apiCwd,
|
|
142
|
-
branch: "main",
|
|
143
|
-
title: "Add rate limiting to forecast endpoint",
|
|
144
|
-
start: "2026-09-23T15:40:00Z",
|
|
145
|
-
model: "claude-sonnet-5",
|
|
146
|
-
turns: [
|
|
147
|
-
{
|
|
148
|
-
prompt: "Add a simple per-IP rate limit (60 requests/minute) to GET /forecast.",
|
|
149
|
-
steps: [
|
|
150
|
-
{ tool: "Glob", input: { pattern: "src/routes/**/*.ts" }, result: "src/routes/forecast.ts\nsrc/routes/health.ts" },
|
|
151
|
-
{ tool: "Read", input: { file_path: `${apiCwd}/src/routes/forecast.ts` }, result: "router.get('/forecast', async (req, res) => {\n const data = await getForecast(req.query.city);\n res.json(data);\n});" },
|
|
152
|
-
{ tool: "Write", input: { file_path: `${apiCwd}/src/middleware/rate-limit.ts`, content: "export function rateLimit(limit: number, windowMs: number) { /* ... */ }" }, result: "File created successfully." },
|
|
153
|
-
{ tool: "Edit", input: { file_path: `${apiCwd}/src/routes/forecast.ts`, old_string: "router.get('/forecast',", new_string: "router.get('/forecast', rateLimit(60, 60_000)," }, result: "The file src/routes/forecast.ts has been updated." },
|
|
154
|
-
{ tool: "Bash", input: { command: "pnpm test", description: "Run test suite" }, seconds: 11, error: true, result: "FAIL src/routes/__tests__/forecast.test.ts\n ✕ returns 429 after limit (12 ms)\n Expected: 429\n Received: 200" },
|
|
155
|
-
{ thinking: "The limiter keys on req.ip, which is undefined behind the test client. Fall back to the socket address." },
|
|
156
|
-
{ tool: "Edit", input: { file_path: `${apiCwd}/src/middleware/rate-limit.ts`, old_string: "const key = req.ip;", new_string: "const key = req.ip ?? req.socket.remoteAddress ?? 'unknown';" }, result: "The file src/middleware/rate-limit.ts has been updated." },
|
|
157
|
-
{ tool: "Bash", input: { command: "pnpm test", description: "Run test suite" }, seconds: 10, result: "Tests: 18 passed, 18 total" },
|
|
158
|
-
{ text: "Added a `rateLimit` middleware (fixed window, keyed by client IP) and applied it to `GET /forecast` at 60 requests/minute. Clients over the limit get a 429 with a `Retry-After` header. All 18 tests pass." },
|
|
159
|
-
],
|
|
160
|
-
},
|
|
161
|
-
],
|
|
162
|
-
}),
|
|
163
|
-
);
|
|
164
|
-
|
|
165
|
-
writeJsonl(
|
|
166
|
-
path.join(claudeProjects, "-Users-demo-code-acme-shop", "a8e2f7c3-1d4b-4f9e-8c6a-3b5d7e9f1a02.jsonl"),
|
|
167
|
-
claudeSession({
|
|
168
|
-
id: "a8e2f7c3-1d4b-4f9e-8c6a-3b5d7e9f1a02",
|
|
169
|
-
cwd: checkoutCwd,
|
|
170
|
-
branch: "main",
|
|
171
|
-
title: "Explain the checkout flow",
|
|
172
|
-
start: "2026-09-22T11:05:00Z",
|
|
173
|
-
model: "claude-haiku-4-5-20251001",
|
|
174
|
-
turns: [
|
|
175
|
-
{
|
|
176
|
-
prompt: "Give me a quick tour of how checkout works in this repo.",
|
|
177
|
-
steps: [
|
|
178
|
-
{ tool: "Glob", input: { pattern: "src/checkout/**" }, result: "src/checkout/page.tsx\nsrc/checkout/summary.tsx\nsrc/checkout/payment.ts\nsrc/checkout/confirm.ts" },
|
|
179
|
-
{ tool: "Read", input: { file_path: `${checkoutCwd}/src/checkout/page.tsx` }, result: "export default function CheckoutPage() { /* address → payment → confirm */ }" },
|
|
180
|
-
{ text: "Checkout is a three-step flow in `src/checkout/page.tsx`: address, payment, confirm. `payment.ts` creates a payment intent, `confirm.ts` finalizes the order, and `summary.tsx` shows the running total using `cartTotal`." },
|
|
181
|
-
],
|
|
182
|
-
},
|
|
183
|
-
],
|
|
184
|
-
}),
|
|
185
|
-
);
|
|
186
|
-
|
|
187
|
-
// ---------------------------------------------------------------------- Codex
|
|
188
|
-
|
|
189
|
-
const codexId = "0199a3f2-7c41-7d20-9e8b-5a4c3b2d1e0f";
|
|
190
|
-
{
|
|
191
|
-
const at = clock("2026-09-24T17:30:00Z");
|
|
192
|
-
const cwd = "/Users/demo/code/cli-tools";
|
|
193
|
-
writeJsonl(path.join(root, ".codex", "session_index.jsonl"), [
|
|
194
|
-
{ id: codexId, thread_name: "Add --json flag to status command" },
|
|
195
|
-
]);
|
|
196
|
-
const tokens = (input, cached, output) => ({
|
|
197
|
-
type: "event_msg",
|
|
198
|
-
timestamp: at(1),
|
|
199
|
-
payload: {
|
|
200
|
-
type: "token_count",
|
|
201
|
-
info: {
|
|
202
|
-
total_token_usage: { input_tokens: input, cached_input_tokens: cached, output_tokens: output, total_tokens: input + output },
|
|
203
|
-
last_token_usage: { total_tokens: 9_000 },
|
|
204
|
-
model_context_window: 272_000,
|
|
205
|
-
},
|
|
206
|
-
},
|
|
207
|
-
});
|
|
208
|
-
writeJsonl(path.join(root, ".codex", "sessions", "2026", "09", "24", `rollout-2026-09-24T17-30-00-${codexId}.jsonl`), [
|
|
209
|
-
{
|
|
210
|
-
type: "session_meta",
|
|
211
|
-
timestamp: at(0),
|
|
212
|
-
payload: { id: codexId, cwd, originator: "codex_cli_rs", cli_version: "0.61.0", git: { branch: "feat/status-json", repository_url: "git@github.com:demo/cli-tools.git" } },
|
|
213
|
-
},
|
|
214
|
-
{ type: "turn_context", timestamp: at(1), payload: { model: "gpt-5-codex", effort: "medium", cwd } },
|
|
215
|
-
{ type: "event_msg", timestamp: at(1), payload: { type: "task_started", turn_id: "t1", model_context_window: 272_000 } },
|
|
216
|
-
{ type: "event_msg", timestamp: at(2), payload: { type: "user_message", message: "Add a --json flag to `status` that prints machine-readable output." } },
|
|
217
|
-
{ type: "event_msg", timestamp: at(4), payload: { type: "agent_reasoning", text: "Find the status command definition and its output formatter." } },
|
|
218
|
-
{ type: "response_item", timestamp: at(1), payload: { type: "function_call", name: "shell", call_id: "c1", arguments: JSON.stringify({ command: ["rg", "-n", "fn status", "src"] }) } },
|
|
219
|
-
{ type: "response_item", timestamp: at(2), payload: { type: "function_call_output", call_id: "c1", output: "src/commands/status.rs:14:pub fn status(args: StatusArgs) -> Result<()> {" } },
|
|
220
|
-
tokens(21_400, 12_800, 1_150),
|
|
221
|
-
{ type: "event_msg", timestamp: at(8), payload: { type: "patch_apply_end", call_id: "p1", success: true, stdout: "Success. Updated the following files:\nM src/commands/status.rs\nM src/cli.rs", stderr: "", changes: { [`${cwd}/src/commands/status.rs`]: { type: "update" }, [`${cwd}/src/cli.rs`]: { type: "update" } } } },
|
|
222
|
-
{ type: "response_item", timestamp: at(1), payload: { type: "function_call", name: "shell", call_id: "c2", arguments: JSON.stringify({ command: ["cargo", "test", "status"] }) } },
|
|
223
|
-
{ type: "response_item", timestamp: at(18), payload: { type: "function_call_output", call_id: "c2", output: "running 4 tests\ntest status::plain_output ... ok\ntest status::json_output ... ok\n\ntest result: ok. 4 passed; 0 failed" } },
|
|
224
|
-
tokens(48_900, 36_100, 2_870),
|
|
225
|
-
{ type: "event_msg", timestamp: at(4), payload: { type: "agent_message", message: "`status --json` now serializes the status struct with serde and prints it to stdout. Plain output is unchanged. Added a test for the JSON shape; all 4 status tests pass." } },
|
|
226
|
-
{ type: "event_msg", timestamp: at(1), payload: { type: "task_complete", turn_id: "t1", duration_ms: 44_000 } },
|
|
227
|
-
]);
|
|
228
|
-
}
|
|
229
|
-
|
|
230
|
-
// -------------------------------------------------------------------- Copilot
|
|
231
|
-
|
|
232
|
-
{
|
|
233
|
-
const id = "5e2b9c14-3f8a-4d61-a7e0-9c3d2b1f6a85";
|
|
234
|
-
const dir = path.join(root, ".copilot", "session-state", id);
|
|
235
|
-
const cwd = "/Users/demo/code/docs-site";
|
|
236
|
-
const start = "2026-09-24T12:05:00Z";
|
|
237
|
-
const at = clock(start);
|
|
238
|
-
fs.mkdirSync(dir, { recursive: true });
|
|
239
|
-
fs.writeFileSync(
|
|
240
|
-
path.join(dir, "workspace.yaml"),
|
|
241
|
-
[
|
|
242
|
-
`id: ${id}`,
|
|
243
|
-
`name: Fix broken links in docs sidebar`,
|
|
244
|
-
`cwd: ${cwd}`,
|
|
245
|
-
`repository: demo/docs-site`,
|
|
246
|
-
`branch: fix/sidebar-links`,
|
|
247
|
-
`created_at: ${start}`,
|
|
248
|
-
`updated_at: 2026-09-24T12:07:10Z`,
|
|
249
|
-
`host_type: cli`,
|
|
250
|
-
`client_name: copilot-cli`,
|
|
251
|
-
`user_named: true`,
|
|
252
|
-
].join("\n") + "\n",
|
|
253
|
-
);
|
|
254
|
-
|
|
255
|
-
let n = 0;
|
|
256
|
-
const ev = (type, data, seconds) => ({ type, data, id: `cp-${n++}`, timestamp: at(seconds), parentId: null });
|
|
257
|
-
const tool = (name, args, result, seconds = 2) => {
|
|
258
|
-
const toolCallId = `call_${n}`;
|
|
259
|
-
return [
|
|
260
|
-
ev("tool.execution_start", { toolName: name, toolCallId, arguments: args }, 3),
|
|
261
|
-
ev("tool.execution_complete", { toolName: name, toolCallId, success: true, result: { content: result } }, seconds),
|
|
262
|
-
];
|
|
263
|
-
};
|
|
264
|
-
writeJsonl(path.join(dir, "events.jsonl"), [
|
|
265
|
-
ev("session.start", { sessionId: id, selectedModel: "gpt-5.1", copilotVersion: "0.0.412", context: { cwd, branch: "fix/sidebar-links", repository: "demo/docs-site" } }, 0),
|
|
266
|
-
ev("user.message", { content: "Some links in the docs sidebar 404 after the folder rename. Find and fix them." }, 5),
|
|
267
|
-
ev("assistant.message", { content: "I'll check the sidebar config against the files that actually exist.", outputTokens: 120, inputTokens: 9_800 }, 4),
|
|
268
|
-
...tool("bash", { command: "node scripts/check-links.js sidebar.json" }, "3 broken links:\n /guides/setup -> guides/setup.md (missing)\n /guides/deploy -> guides/deploy.md (missing)\n /api/auth -> api/auth.md (missing)", 6),
|
|
269
|
-
...tool("glob", { pattern: "docs/**/*.md" }, "docs/getting-started/setup.md\ndocs/getting-started/deploy.md\ndocs/reference/auth.md\ndocs/index.md"),
|
|
270
|
-
...tool("edit", { path: `${cwd}/sidebar.json`, old_str: '"guides/setup"', new_str: '"getting-started/setup"' }, "File updated."),
|
|
271
|
-
...tool("bash", { command: "node scripts/check-links.js sidebar.json" }, "All links OK (24 checked).", 5),
|
|
272
|
-
ev("assistant.message", { content: "Updated three sidebar entries to the new `getting-started/` and `reference/` paths. The link checker now reports all 24 links OK.", outputTokens: 210, inputTokens: 14_600 }, 4),
|
|
273
|
-
ev("session.shutdown", {
|
|
274
|
-
totalApiDurationMs: 21_400,
|
|
275
|
-
totalPremiumRequests: 2,
|
|
276
|
-
modelMetrics: { "gpt-5.1": { usage: { inputTokens: 38_900, outputTokens: 1_640, cacheReadTokens: 27_300 } } },
|
|
277
|
-
}, 2),
|
|
278
|
-
]);
|
|
279
|
-
|
|
280
|
-
fs.mkdirSync(path.join(root, ".copilot", "logs"), { recursive: true });
|
|
281
|
-
fs.writeFileSync(
|
|
282
|
-
path.join(root, ".copilot", "logs", "process-1758715500000-4821.log"),
|
|
283
|
-
`${start} [INFO] Starting Copilot CLI 0.0.412\n${start} [INFO] Session ${id} created in ${cwd}\n2026-09-24T12:07:10Z [INFO] Session ${id} shut down\n`,
|
|
284
|
-
);
|
|
285
|
-
}
|
|
286
|
-
|
|
287
|
-
// ----------------------------------------------------------------- Gemini CLI
|
|
288
|
-
|
|
289
|
-
{
|
|
290
|
-
const id = "7c1e4a92-5b3d-4f08-9a6e-2d8f0b3c5e71";
|
|
291
|
-
const cwd = "/Users/demo/code/weather-api";
|
|
292
|
-
const start = "2026-09-25T09:10:00Z";
|
|
293
|
-
const at = clock(start);
|
|
294
|
-
const project = path.join(root, ".gemini", "tmp", "weather-api");
|
|
295
|
-
const model = "gemini-3.7-flash";
|
|
296
|
-
fs.mkdirSync(project, { recursive: true });
|
|
297
|
-
fs.writeFileSync(path.join(project, ".project_root"), cwd);
|
|
298
|
-
|
|
299
|
-
const tool = (callId, name, args, output) => ({
|
|
300
|
-
id: callId,
|
|
301
|
-
name,
|
|
302
|
-
args,
|
|
303
|
-
status: "success",
|
|
304
|
-
timestamp: at(2),
|
|
305
|
-
result: [{ functionResponse: { id: callId, name, response: { output } } }],
|
|
306
|
-
});
|
|
307
|
-
const reply = (messageId, fields) => ({ id: messageId, timestamp: at(4), type: "gemini", content: "", model, ...fields });
|
|
308
|
-
const prompt = { id: "m1", timestamp: at(3), type: "user", content: [{ text: "Forecast responses are cached for an hour. Make the TTL configurable." }] };
|
|
309
|
-
const grep = reply("m2", {
|
|
310
|
-
thoughts: [{ subject: "Locating the cache", description: "The forecast handler should own the TTL; search for it first.", timestamp: at(1) }],
|
|
311
|
-
tokens: { input: 11_200, output: 140, cached: 0, thoughts: 220, tool: 0, total: 11_560 },
|
|
312
|
-
});
|
|
313
|
-
writeJsonl(path.join(project, "chats", `session-2026-09-25T09-10-${id.slice(0, 8)}.jsonl`), [
|
|
314
|
-
{ sessionId: id, projectHash: "3f9a1c", startTime: start, lastUpdated: start },
|
|
315
|
-
prompt,
|
|
316
|
-
grep,
|
|
317
|
-
// The CLI writes a message again as its tool calls come in; the last copy wins.
|
|
318
|
-
{ ...grep, toolCalls: [tool("g1", "search_file_content", { pattern: "CACHE_TTL" }, "src/forecast/cache.ts:4:const CACHE_TTL = 3600;")] },
|
|
319
|
-
reply("m3", {
|
|
320
|
-
toolCalls: [
|
|
321
|
-
tool("g2", "replace", { file_path: `${cwd}/src/forecast/cache.ts`, old_string: "const CACHE_TTL = 3600;", new_string: "const CACHE_TTL = Number(process.env.FORECAST_TTL ?? 3600);" }, "Successfully modified file."),
|
|
322
|
-
tool("g3", "run_shell_command", { command: "npm test -- forecast" }, "Tests: 12 passed, 12 total"),
|
|
323
|
-
],
|
|
324
|
-
tokens: { input: 12_900, output: 310, cached: 10_400, thoughts: 90, tool: 0, total: 13_300 },
|
|
325
|
-
}),
|
|
326
|
-
reply("m4", {
|
|
327
|
-
content: "The TTL now reads `FORECAST_TTL` (seconds) and falls back to one hour. All 12 forecast tests pass.",
|
|
328
|
-
tokens: { input: 13_600, output: 95, cached: 12_100, thoughts: 0, tool: 0, total: 13_695 },
|
|
329
|
-
}),
|
|
330
|
-
{ $set: { lastUpdated: at(0), summary: "Make forecast cache TTL configurable" } },
|
|
331
|
-
]);
|
|
332
|
-
}
|
|
333
|
-
|
|
334
|
-
console.log(`Demo home written to ${root}`);
|
|
335
|
-
console.log(`Run: HOME=${root} pnpm dev`);
|
|
@@ -1,71 +0,0 @@
|
|
|
1
|
-
#!/usr/bin/env bash
|
|
2
|
-
set -euo pipefail
|
|
3
|
-
|
|
4
|
-
NAME=agent-session-inspector
|
|
5
|
-
|
|
6
|
-
docker build -t "$NAME" .
|
|
7
|
-
|
|
8
|
-
if docker container inspect "$NAME" >/dev/null 2>&1; then
|
|
9
|
-
docker rm -f "$NAME"
|
|
10
|
-
fi
|
|
11
|
-
|
|
12
|
-
# Mount only the transcript paths the app reads, read-only. Deliberately narrow:
|
|
13
|
-
# ~/.codex/auth.json, ~/.copilot/config.json, ~/.hermes/auth.json and
|
|
14
|
-
# ~/.gemini/oauth_creds.json hold credentials and stay out. So does Cursor's
|
|
15
|
-
# state.vscdb, which keeps its sign-in next to the chats: Cursor sessions are
|
|
16
|
-
# read from the transcripts under ~/.cursor/projects instead.
|
|
17
|
-
PATHS=(
|
|
18
|
-
".copilot/session-state"
|
|
19
|
-
".copilot/logs"
|
|
20
|
-
".copilot/session-store.db"
|
|
21
|
-
".copilot/session-store.db-shm"
|
|
22
|
-
".copilot/session-store.db-wal"
|
|
23
|
-
".claude/projects"
|
|
24
|
-
".codex/sessions"
|
|
25
|
-
".codex/session_index.jsonl"
|
|
26
|
-
".local/share/opencode/opencode.db"
|
|
27
|
-
".local/share/opencode/opencode.db-shm"
|
|
28
|
-
".local/share/opencode/opencode.db-wal"
|
|
29
|
-
".hermes/state.db"
|
|
30
|
-
".hermes/state.db-shm"
|
|
31
|
-
".hermes/state.db-wal"
|
|
32
|
-
".gemini/tmp"
|
|
33
|
-
".cursor/projects"
|
|
34
|
-
)
|
|
35
|
-
|
|
36
|
-
# Desktop apps keep their data somewhere else on each OS; inside the Linux
|
|
37
|
-
# container the app looks under ~/.config.
|
|
38
|
-
case "$(uname -s)" in
|
|
39
|
-
Darwin) APP_DATA="Library/Application Support" ;;
|
|
40
|
-
*) APP_DATA=".config" ;;
|
|
41
|
-
esac
|
|
42
|
-
APP_PATHS=(
|
|
43
|
-
"Code/User/workspaceStorage"
|
|
44
|
-
"Code/User/globalStorage/emptyWindowChatSessions"
|
|
45
|
-
"Code - Insiders/User/workspaceStorage"
|
|
46
|
-
"Code - Insiders/User/globalStorage/emptyWindowChatSessions"
|
|
47
|
-
"Claude/local-agent-mode-sessions"
|
|
48
|
-
)
|
|
49
|
-
|
|
50
|
-
mounts=()
|
|
51
|
-
for rel in "${PATHS[@]}"; do
|
|
52
|
-
if [ -e "$HOME/$rel" ]; then
|
|
53
|
-
mounts+=(-v "$HOME/$rel:/root/$rel:ro")
|
|
54
|
-
fi
|
|
55
|
-
done
|
|
56
|
-
for rel in "${APP_PATHS[@]}"; do
|
|
57
|
-
if [ -e "$HOME/$APP_DATA/$rel" ]; then
|
|
58
|
-
mounts+=(-v "$HOME/$APP_DATA/$rel:/root/.config/$rel:ro")
|
|
59
|
-
fi
|
|
60
|
-
done
|
|
61
|
-
|
|
62
|
-
if [ ${#mounts[@]} -eq 0 ]; then
|
|
63
|
-
echo "No agent session directories found under $HOME." >&2
|
|
64
|
-
exit 1
|
|
65
|
-
fi
|
|
66
|
-
|
|
67
|
-
# The app shows where each session is stored; tell it what the mounts are
|
|
68
|
-
# called out here, so the paths it shows are ones that exist on this machine.
|
|
69
|
-
docker run -d --name "$NAME" --restart unless-stopped --user root -e HOME=/root \
|
|
70
|
-
-e ASI_HOST_HOME="$HOME" -e ASI_HOST_APP_DATA="$HOME/$APP_DATA" \
|
|
71
|
-
"${mounts[@]}" "$NAME"
|
|
@@ -1,86 +0,0 @@
|
|
|
1
|
-
#!/usr/bin/env bash
|
|
2
|
-
# Build the standalone server and stage it in dist/agent-session-inspector, the
|
|
3
|
-
# folder `npm publish` uploads, then pack that into
|
|
4
|
-
# dist/agent-session-inspector.tar.gz, the archive install.sh downloads. The
|
|
5
|
-
# build has no native modules, so one package runs on any OS with Node.
|
|
6
|
-
set -euo pipefail
|
|
7
|
-
|
|
8
|
-
NAME=agent-session-inspector
|
|
9
|
-
ROOT="$(cd "$(dirname "$0")/.." && pwd)"
|
|
10
|
-
VERSION="${1:-$(node -p "require('$ROOT/package.json').version")}"
|
|
11
|
-
VERSION="${VERSION#v}"
|
|
12
|
-
OUT="$ROOT/dist"
|
|
13
|
-
STAGE="$OUT/$NAME"
|
|
14
|
-
# The server sits a level down: npm leaves a package's top-level node_modules
|
|
15
|
-
# out of the upload.
|
|
16
|
-
APP="$STAGE/app"
|
|
17
|
-
MODULES="$APP/node_modules"
|
|
18
|
-
|
|
19
|
-
cd "$ROOT"
|
|
20
|
-
# Clear the old output first, or the build traces it into the new one.
|
|
21
|
-
rm -rf "$OUT"
|
|
22
|
-
pnpm run build
|
|
23
|
-
|
|
24
|
-
mkdir -p "$APP"
|
|
25
|
-
|
|
26
|
-
# next build leaves .next/static out of the standalone folder.
|
|
27
|
-
cp -R .next/standalone/. "$APP/"
|
|
28
|
-
mkdir -p "$APP/.next"
|
|
29
|
-
cp -R .next/static "$APP/.next/static"
|
|
30
|
-
|
|
31
|
-
mkdir -p "$STAGE/bin"
|
|
32
|
-
cp "bin/$NAME.mjs" "$STAGE/bin/$NAME.mjs"
|
|
33
|
-
chmod +x "$STAGE/bin/$NAME.mjs"
|
|
34
|
-
# The report commands (usage, stats, sessions) run from their own bundle.
|
|
35
|
-
node scripts/build-cli.mjs "$STAGE/cli/cli.mjs"
|
|
36
|
-
echo "$VERSION" > "$STAGE/VERSION"
|
|
37
|
-
cp README.md LICENSE "$STAGE/"
|
|
38
|
-
|
|
39
|
-
# The tracer drags in sharp (unused: images are unoptimized) with its
|
|
40
|
-
# per-platform binaries and dependencies.
|
|
41
|
-
for dep in "$MODULES"/.pnpm/sharp@*/node_modules/*; do
|
|
42
|
-
if [ -L "$dep" ]; then
|
|
43
|
-
target="$(cd "$dep" 2>/dev/null && pwd -P)" || continue
|
|
44
|
-
rm -rf "${target%/node_modules/*}"
|
|
45
|
-
fi
|
|
46
|
-
done
|
|
47
|
-
rm -rf "$MODULES"/.pnpm/@img+* "$MODULES"/.pnpm/sharp@*
|
|
48
|
-
|
|
49
|
-
# npm never uploads symlinks, and pnpm's node_modules is built from them, so
|
|
50
|
-
# hoist every traced package into one flat node_modules.
|
|
51
|
-
find "$APP" -type l -delete
|
|
52
|
-
for dir in "$MODULES"/.pnpm/*/node_modules/* "$MODULES"/.pnpm/*/node_modules/@*/*; do
|
|
53
|
-
[ -d "$dir" ] || continue
|
|
54
|
-
name="${dir##*/node_modules/}"
|
|
55
|
-
case "$name" in @*/*) ;; @*) continue ;; esac
|
|
56
|
-
if [ -e "$MODULES/$name" ]; then
|
|
57
|
-
echo "error: two versions of $name in the build; a flat node_modules can hold one" >&2
|
|
58
|
-
exit 1
|
|
59
|
-
fi
|
|
60
|
-
mkdir -p "$(dirname "$MODULES/$name")"
|
|
61
|
-
mv "$dir" "$MODULES/$name"
|
|
62
|
-
done
|
|
63
|
-
rm -rf "$MODULES/.pnpm"
|
|
64
|
-
|
|
65
|
-
if find "$STAGE" -name '*.node' | grep -q .; then
|
|
66
|
-
echo "error: native module in build; the package would not be portable:" >&2
|
|
67
|
-
find "$STAGE" -name '*.node' >&2
|
|
68
|
-
exit 1
|
|
69
|
-
fi
|
|
70
|
-
|
|
71
|
-
# The manifest npm publishes: the built app has no dependencies left to install.
|
|
72
|
-
node -e '
|
|
73
|
-
const pkg = require(process.argv[1]);
|
|
74
|
-
const [name, version] = process.argv.slice(2);
|
|
75
|
-
const { description, keywords, author, license, homepage, bugs, repository, engines } = pkg;
|
|
76
|
-
console.log(JSON.stringify({
|
|
77
|
-
name, version, description, keywords, author, license, homepage, bugs, repository, engines,
|
|
78
|
-
bin: { [name]: `bin/${name}.mjs` },
|
|
79
|
-
files: ["app", "bin", "cli", "VERSION"],
|
|
80
|
-
}, null, 2));
|
|
81
|
-
' "$ROOT/package.json" "$NAME" "$VERSION" > "$STAGE/package.json"
|
|
82
|
-
|
|
83
|
-
tar -czf "$OUT/$NAME.tar.gz" -C "$OUT" "$NAME"
|
|
84
|
-
cp install.sh "$OUT/install.sh"
|
|
85
|
-
|
|
86
|
-
echo "Packed $NAME $VERSION -> dist/$NAME.tar.gz ($(du -h "$OUT/$NAME.tar.gz" | cut -f1))"
|
package/app/tsconfig.json
DELETED
|
@@ -1,34 +0,0 @@
|
|
|
1
|
-
{
|
|
2
|
-
"compilerOptions": {
|
|
3
|
-
"target": "ES2017",
|
|
4
|
-
"lib": ["dom", "dom.iterable", "esnext"],
|
|
5
|
-
"allowJs": true,
|
|
6
|
-
"skipLibCheck": true,
|
|
7
|
-
"strict": true,
|
|
8
|
-
"noEmit": true,
|
|
9
|
-
"esModuleInterop": true,
|
|
10
|
-
"module": "esnext",
|
|
11
|
-
"moduleResolution": "bundler",
|
|
12
|
-
"resolveJsonModule": true,
|
|
13
|
-
"isolatedModules": true,
|
|
14
|
-
"jsx": "react-jsx",
|
|
15
|
-
"incremental": true,
|
|
16
|
-
"plugins": [
|
|
17
|
-
{
|
|
18
|
-
"name": "next"
|
|
19
|
-
}
|
|
20
|
-
],
|
|
21
|
-
"paths": {
|
|
22
|
-
"@/*": ["./src/*"]
|
|
23
|
-
}
|
|
24
|
-
},
|
|
25
|
-
"include": [
|
|
26
|
-
"next-env.d.ts",
|
|
27
|
-
"**/*.ts",
|
|
28
|
-
"**/*.tsx",
|
|
29
|
-
".next/types/**/*.ts",
|
|
30
|
-
".next/dev/types/**/*.ts",
|
|
31
|
-
"**/*.mts"
|
|
32
|
-
],
|
|
33
|
-
"exclude": ["node_modules"]
|
|
34
|
-
}
|
|
File without changes
|
|
File without changes
|
|
File without changes
|