failproofai 0.0.10-beta.2 → 0.0.10-beta.4
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/.next/standalone/.next/BUILD_ID +1 -1
- package/.next/standalone/.next/build-manifest.json +3 -3
- package/.next/standalone/.next/prerender-manifest.json +3 -3
- package/.next/standalone/.next/required-server-files.json +1 -1
- package/.next/standalone/.next/server/app/_global-error/page/server-reference-manifest.json +1 -1
- package/.next/standalone/.next/server/app/_global-error/page.js +2 -2
- package/.next/standalone/.next/server/app/_global-error/page.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/_global-error/page_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/_global-error.html +1 -1
- package/.next/standalone/.next/server/app/_global-error.rsc +7 -7
- package/.next/standalone/.next/server/app/_global-error.segments/__PAGE__.segment.rsc +2 -2
- package/.next/standalone/.next/server/app/_global-error.segments/_full.segment.rsc +7 -7
- package/.next/standalone/.next/server/app/_global-error.segments/_head.segment.rsc +3 -3
- package/.next/standalone/.next/server/app/_global-error.segments/_index.segment.rsc +3 -3
- package/.next/standalone/.next/server/app/_global-error.segments/_tree.segment.rsc +1 -1
- package/.next/standalone/.next/server/app/_not-found/page/server-reference-manifest.json +1 -1
- package/.next/standalone/.next/server/app/_not-found/page.js +2 -2
- package/.next/standalone/.next/server/app/_not-found/page.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/_not-found/page_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/_not-found.html +2 -2
- package/.next/standalone/.next/server/app/_not-found.rsc +15 -15
- package/.next/standalone/.next/server/app/_not-found.segments/_full.segment.rsc +15 -15
- package/.next/standalone/.next/server/app/_not-found.segments/_head.segment.rsc +4 -4
- package/.next/standalone/.next/server/app/_not-found.segments/_index.segment.rsc +10 -10
- package/.next/standalone/.next/server/app/_not-found.segments/_not-found/__PAGE__.segment.rsc +2 -2
- package/.next/standalone/.next/server/app/_not-found.segments/_not-found.segment.rsc +3 -3
- package/.next/standalone/.next/server/app/_not-found.segments/_tree.segment.rsc +1 -1
- package/.next/standalone/.next/server/app/api/download/[project]/[session]/route.js +1 -2
- package/.next/standalone/.next/server/app/api/download/[project]/[session]/route.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/index.html +1 -1
- package/.next/standalone/.next/server/app/index.rsc +15 -15
- package/.next/standalone/.next/server/app/index.segments/__PAGE__.segment.rsc +2 -2
- package/.next/standalone/.next/server/app/index.segments/_full.segment.rsc +15 -15
- package/.next/standalone/.next/server/app/index.segments/_head.segment.rsc +4 -4
- package/.next/standalone/.next/server/app/index.segments/_index.segment.rsc +10 -10
- package/.next/standalone/.next/server/app/index.segments/_tree.segment.rsc +1 -1
- package/.next/standalone/.next/server/app/page/server-reference-manifest.json +1 -1
- package/.next/standalone/.next/server/app/page.js +2 -2
- package/.next/standalone/.next/server/app/page.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/page_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/policies/page/server-reference-manifest.json +8 -8
- package/.next/standalone/.next/server/app/policies/page.js +2 -2
- package/.next/standalone/.next/server/app/policies/page.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/policies/page_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/project/[name]/page/server-reference-manifest.json +1 -1
- package/.next/standalone/.next/server/app/project/[name]/page.js +3 -3
- package/.next/standalone/.next/server/app/project/[name]/page.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/project/[name]/page_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/project/[name]/session/[sessionId]/page/react-loadable-manifest.json +2 -2
- package/.next/standalone/.next/server/app/project/[name]/session/[sessionId]/page/server-reference-manifest.json +2 -2
- package/.next/standalone/.next/server/app/project/[name]/session/[sessionId]/page.js +3 -3
- package/.next/standalone/.next/server/app/project/[name]/session/[sessionId]/page.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/project/[name]/session/[sessionId]/page_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/projects/page/server-reference-manifest.json +1 -1
- package/.next/standalone/.next/server/app/projects/page.js +2 -2
- package/.next/standalone/.next/server/app/projects/page.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/projects/page_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/chunks/[root-of-the-server]__06.arfm._.js +3 -0
- package/.next/standalone/.next/server/chunks/[root-of-the-server]__0__i0h0._.js +3 -0
- package/.next/standalone/.next/server/chunks/{[root-of-the-server]__0dtn9lr._.js → [root-of-the-server]__0d_ob4n._.js} +2 -2
- package/.next/standalone/.next/server/chunks/[root-of-the-server]__0fe7_q_._.js +3 -0
- package/.next/standalone/.next/server/chunks/[root-of-the-server]__0fjhqi9._.js +3 -0
- package/.next/standalone/.next/server/chunks/[root-of-the-server]__0fw.e.h._.js +3 -0
- package/.next/standalone/.next/server/chunks/[root-of-the-server]__0kjo7d_._.js +1 -1
- package/.next/standalone/.next/server/chunks/[root-of-the-server]__0pxn0e1._.js +3 -0
- package/.next/standalone/.next/server/chunks/[root-of-the-server]__0xv0jh2._.js +3 -0
- package/.next/standalone/.next/server/chunks/{[root-of-the-server]__010i6f5._.js → [root-of-the-server]__0z-180.._.js} +2 -2
- package/.next/standalone/.next/server/chunks/package_json_[json]_cjs_0z7w.hh._.js +1 -1
- package/.next/standalone/.next/server/chunks/ssr/{[root-of-the-server]__0dl0kgt._.js → [root-of-the-server]__01hj~sd._.js} +3 -3
- package/.next/standalone/.next/server/chunks/ssr/{[root-of-the-server]__0s~gy6y._.js → [root-of-the-server]__02r6nu-._.js} +2 -2
- package/.next/standalone/.next/server/chunks/ssr/{[root-of-the-server]__0bz245.._.js → [root-of-the-server]__04dywib._.js} +3 -3
- package/.next/standalone/.next/server/chunks/ssr/{[root-of-the-server]__0gmhxyo._.js → [root-of-the-server]__06sb2gn._.js} +3 -3
- package/.next/standalone/.next/server/chunks/ssr/{[root-of-the-server]__0tt8-uq._.js → [root-of-the-server]__092oklx._.js} +2 -2
- package/.next/standalone/.next/server/chunks/ssr/{[root-of-the-server]__0-2wr.c._.js → [root-of-the-server]__09jpajs._.js} +3 -3
- package/.next/standalone/.next/server/chunks/ssr/{[root-of-the-server]__0ils1oq._.js → [root-of-the-server]__0bemgh7._.js} +2 -2
- package/.next/standalone/.next/server/chunks/ssr/{[root-of-the-server]__0qbpe_v._.js → [root-of-the-server]__0jm6jnh._.js} +2 -2
- package/.next/standalone/.next/server/chunks/ssr/{[root-of-the-server]__0709m8.._.js → [root-of-the-server]__0joez.y._.js} +3 -3
- package/.next/standalone/.next/server/chunks/ssr/{[root-of-the-server]__0ohb3gc._.js → [root-of-the-server]__0mi5ejy._.js} +3 -3
- package/.next/standalone/.next/server/chunks/ssr/[root-of-the-server]__0u1i~9~._.js +4 -0
- package/.next/standalone/.next/server/chunks/ssr/{[root-of-the-server]__09y9okz._.js → [root-of-the-server]__0x5limi._.js} +2 -2
- package/.next/standalone/.next/server/chunks/ssr/[root-of-the-server]__0ymlddl._.js +5 -3
- package/.next/standalone/.next/server/chunks/ssr/_10lm7or._.js +2 -2
- package/.next/standalone/.next/server/chunks/ssr/app_0cdqd9w._.js +1 -1
- package/.next/standalone/.next/server/chunks/ssr/app_global-error_tsx_0xerkr6._.js +1 -1
- package/.next/standalone/.next/server/chunks/ssr/app_policies_hooks-client_tsx_0q-m0y-._.js +1 -1
- package/.next/standalone/.next/server/middleware-build-manifest.js +3 -3
- package/.next/standalone/.next/server/pages/404.html +2 -2
- package/.next/standalone/.next/server/pages/500.html +1 -1
- package/.next/standalone/.next/server/server-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/server-reference-manifest.json +9 -9
- package/.next/standalone/.next/static/chunks/{0yzl~f-qji0...js → 0csfsu88oqir8.js} +2 -2
- package/.next/standalone/.next/static/chunks/{0y8oyen~jnjl3.js → 0fvemi0q_n349.js} +1 -1
- package/.next/standalone/.next/static/chunks/{0a_w-lcg.0tl7.js → 0ilx6hm27porg.js} +1 -1
- package/.next/standalone/.next/static/chunks/0kxi65pnos15e.js +1 -0
- package/.next/standalone/.next/static/chunks/{0-dltnti0ew4y.js → 12mx5dzs_vf1w.js} +1 -1
- package/.next/standalone/.next/static/chunks/{17o7-pn_xzt-t.js → 14p_4ajxz0ifs.js} +1 -1
- package/.next/standalone/.next/static/chunks/{0lscbfo_2_h14.js → 16ydic9u8kagt.js} +2 -2
- package/.next/standalone/.next/static/chunks/{02h_cfxpk4x9..js → 18daqyhykpw8z.js} +1 -1
- package/.next/standalone/app/api/download/[project]/[session]/route.ts +26 -10
- package/.next/standalone/app/components/session-hooks-panel.tsx +3 -0
- package/.next/standalone/app/policies/hooks-client.tsx +3 -0
- package/.next/standalone/app/project/[name]/session/[sessionId]/page.tsx +8 -10
- package/.next/standalone/lib/download-session.ts +92 -0
- package/.next/standalone/lib/opencode-sessions.ts +42 -0
- package/.next/standalone/package.json +1 -1
- package/.next/standalone/server.js +1 -1
- package/dist/cli.mjs +1281 -305
- package/lib/download-session.ts +92 -0
- package/lib/opencode-sessions.ts +42 -0
- package/package.json +1 -1
- package/src/hooks/builtin-policies.ts +4 -3
- package/src/hooks/handler.ts +22 -12
- package/src/hooks/integrations.ts +2 -0
- package/src/hooks/policy-evaluator.ts +47 -6
- package/src/hooks/resolve-transcript-path.ts +69 -0
- package/src/hooks/types.ts +73 -0
- package/.next/standalone/.next/server/chunks/[root-of-the-server]__0b57.gk._.js +0 -3
- package/.next/standalone/.next/server/chunks/[root-of-the-server]__0z4c5dj._.js +0 -3
- package/.next/standalone/.next/server/chunks/ssr/[root-of-the-server]__0.~m-w2._.js +0 -4
- package/.next/standalone/.next/static/chunks/16k5y9ruha2v4.js +0 -1
- /package/.next/standalone/.next/static/{EBbXdrT2rHib3zGLSuY7Q → Z3pK8z9QuEdJFE28LwB5Y}/_buildManifest.js +0 -0
- /package/.next/standalone/.next/static/{EBbXdrT2rHib3zGLSuY7Q → Z3pK8z9QuEdJFE28LwB5Y}/_clientMiddlewareManifest.js +0 -0
- /package/.next/standalone/.next/static/{EBbXdrT2rHib3zGLSuY7Q → Z3pK8z9QuEdJFE28LwB5Y}/_ssgManifest.js +0 -0
|
@@ -161,16 +161,14 @@ export default async function SessionPage({ params }: SessionPageProps) {
|
|
|
161
161
|
<p className="text-muted-foreground">
|
|
162
162
|
<span className="font-medium">{rawLines.length}</span> log lines
|
|
163
163
|
</p>
|
|
164
|
-
|
|
165
|
-
|
|
166
|
-
|
|
167
|
-
|
|
168
|
-
|
|
169
|
-
|
|
170
|
-
|
|
171
|
-
|
|
172
|
-
</a>
|
|
173
|
-
)}
|
|
164
|
+
<a
|
|
165
|
+
href={`/api/download/${encodeURIComponent(name)}/${encodeURIComponent(decodedSessionId)}?cli=${cli}`}
|
|
166
|
+
download
|
|
167
|
+
className="inline-flex items-center gap-1.5 px-3 py-1.5 text-sm rounded-md bg-muted text-muted-foreground hover:bg-muted/80 hover:text-foreground transition-colors"
|
|
168
|
+
>
|
|
169
|
+
<Download className="w-4 h-4" />
|
|
170
|
+
Download Logs
|
|
171
|
+
</a>
|
|
174
172
|
</div>
|
|
175
173
|
)}
|
|
176
174
|
</div>
|
|
@@ -0,0 +1,92 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Per-CLI dispatcher for the dashboard's Download Logs endpoint.
|
|
3
|
+
*
|
|
4
|
+
* Returns either a real on-disk path (so the route can `createReadStream` and
|
|
5
|
+
* stream the bytes verbatim) or a synthesized JSONL body (used only by
|
|
6
|
+
* OpenCode, whose transcripts live in SQLite rather than on disk).
|
|
7
|
+
*
|
|
8
|
+
* Per-CLI session loaders / transcript finders already exist in their own
|
|
9
|
+
* files; this module is the thin glue that picks the right one. Imports of
|
|
10
|
+
* the per-CLI modules are dynamic so callers that only need the dispatch
|
|
11
|
+
* type can avoid pulling Node-only deps into client bundles.
|
|
12
|
+
*/
|
|
13
|
+
import { resolveSessionFilePath, UUID_RE } from "./projects";
|
|
14
|
+
import type { CliId } from "./cli-registry";
|
|
15
|
+
|
|
16
|
+
export const OPENCODE_SESSION_RE = /^ses_[A-Za-z0-9]+$/;
|
|
17
|
+
|
|
18
|
+
export type DownloadSource =
|
|
19
|
+
| { kind: "file"; path: string }
|
|
20
|
+
| { kind: "synthesized"; body: string; contentType: string; extension: string };
|
|
21
|
+
|
|
22
|
+
/** Validate a session ID against the per-CLI shape. OpenCode uses `ses_*`
|
|
23
|
+
* prefixes; everyone else is a UUID. */
|
|
24
|
+
export function isValidSessionId(cli: CliId, sessionId: string): boolean {
|
|
25
|
+
if (cli === "opencode") return OPENCODE_SESSION_RE.test(sessionId);
|
|
26
|
+
return UUID_RE.test(sessionId);
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
/**
|
|
30
|
+
* Resolve a download source for `(cli, sessionId)`. `project` is only
|
|
31
|
+
* meaningful for Claude (path-traversal validation under the projects root);
|
|
32
|
+
* the other CLIs key sessions by ID alone.
|
|
33
|
+
*
|
|
34
|
+
* Returns `null` when the session can't be located. Throws RangeError when
|
|
35
|
+
* the inputs fail validation (caller should map to 400).
|
|
36
|
+
*/
|
|
37
|
+
export async function resolveDownloadSource(
|
|
38
|
+
cli: CliId,
|
|
39
|
+
project: string,
|
|
40
|
+
sessionId: string,
|
|
41
|
+
): Promise<DownloadSource | null> {
|
|
42
|
+
if (!isValidSessionId(cli, sessionId)) {
|
|
43
|
+
throw new RangeError("Invalid session ID");
|
|
44
|
+
}
|
|
45
|
+
|
|
46
|
+
if (cli === "claude") {
|
|
47
|
+
// resolveSessionFilePath validates project and joins under the Claude root.
|
|
48
|
+
return { kind: "file", path: resolveSessionFilePath(project, sessionId) };
|
|
49
|
+
}
|
|
50
|
+
|
|
51
|
+
if (cli === "codex") {
|
|
52
|
+
const { findCodexTranscript } = await import("./codex-sessions");
|
|
53
|
+
const path = findCodexTranscript(sessionId);
|
|
54
|
+
return path ? { kind: "file", path } : null;
|
|
55
|
+
}
|
|
56
|
+
if (cli === "copilot") {
|
|
57
|
+
const { findCopilotTranscript } = await import("./copilot-sessions");
|
|
58
|
+
const path = findCopilotTranscript(sessionId);
|
|
59
|
+
return path ? { kind: "file", path } : null;
|
|
60
|
+
}
|
|
61
|
+
if (cli === "cursor") {
|
|
62
|
+
const { findCursorTranscript } = await import("./cursor-sessions");
|
|
63
|
+
const path = findCursorTranscript(sessionId);
|
|
64
|
+
return path ? { kind: "file", path } : null;
|
|
65
|
+
}
|
|
66
|
+
if (cli === "pi") {
|
|
67
|
+
const { findPiTranscript } = await import("./pi-sessions");
|
|
68
|
+
const path = findPiTranscript(sessionId);
|
|
69
|
+
return path ? { kind: "file", path } : null;
|
|
70
|
+
}
|
|
71
|
+
if (cli === "gemini") {
|
|
72
|
+
const { findGeminiTranscript } = await import("./gemini-sessions");
|
|
73
|
+
const path = findGeminiTranscript(sessionId);
|
|
74
|
+
return path ? { kind: "file", path } : null;
|
|
75
|
+
}
|
|
76
|
+
if (cli === "opencode") {
|
|
77
|
+
// OpenCode keeps sessions in SQLite (~/.local/share/opencode/opencode.db)
|
|
78
|
+
// across three tables: session / message / part. Export all three so
|
|
79
|
+
// users get a faithful snapshot of the underlying structure rather than
|
|
80
|
+
// a collapsed single-stream that loses parts.
|
|
81
|
+
const { getOpenCodeSessionExport } = await import("./opencode-sessions");
|
|
82
|
+
const result = await getOpenCodeSessionExport(sessionId);
|
|
83
|
+
if (!result) return null;
|
|
84
|
+
const body = JSON.stringify(result, null, 2) + "\n";
|
|
85
|
+
return { kind: "synthesized", body, contentType: "application/json", extension: "json" };
|
|
86
|
+
}
|
|
87
|
+
|
|
88
|
+
// Exhaustive — but TypeScript can't always see CliId is exhausted across the
|
|
89
|
+
// if-chain above, so guard with a runtime fallback.
|
|
90
|
+
const _exhaustive: never = cli;
|
|
91
|
+
return _exhaustive;
|
|
92
|
+
}
|
|
@@ -235,3 +235,45 @@ export const getCachedOpenCodeSessionLog = runtimeCache(
|
|
|
235
235
|
30,
|
|
236
236
|
{ maxSize: 50 },
|
|
237
237
|
);
|
|
238
|
+
|
|
239
|
+
// ── Export shape ──
|
|
240
|
+
|
|
241
|
+
/**
|
|
242
|
+
* Snapshot of an OpenCode session as it lives in the SQLite store: one
|
|
243
|
+
* `session` row, all of its `message` rows, all of its `part` rows. The JSON
|
|
244
|
+
* `data` column on each message/part is parsed (when valid) so consumers
|
|
245
|
+
* don't have to double-parse; malformed JSON survives as the raw string.
|
|
246
|
+
*
|
|
247
|
+
* Used by the dashboard's Download Logs feature so the export mirrors the
|
|
248
|
+
* underlying schema rather than collapsing parts into a single per-message
|
|
249
|
+
* record (which is what the viewer-facing `getOpenCodeSessionLog` does).
|
|
250
|
+
*/
|
|
251
|
+
export interface OpenCodeSessionExportData {
|
|
252
|
+
session: OpenCodeSessionRow;
|
|
253
|
+
messages: Array<Omit<OpenCodeMessageRow, "data"> & { data: Record<string, unknown> | string | null }>;
|
|
254
|
+
parts: Array<Omit<OpenCodePartRow, "data"> & { data: Record<string, unknown> | string | null }>;
|
|
255
|
+
}
|
|
256
|
+
|
|
257
|
+
export async function getOpenCodeSessionExport(sessionId: string): Promise<OpenCodeSessionExportData | null> {
|
|
258
|
+
if (!sessionId || !/^[A-Za-z0-9_-]+$/.test(sessionId)) return null;
|
|
259
|
+
const sessions = runOpenCodeDb<OpenCodeSessionRow>(
|
|
260
|
+
`SELECT id, project_id, slug, directory, title, time_created, time_updated FROM session WHERE id = '${sessionId}'`,
|
|
261
|
+
);
|
|
262
|
+
if (!sessions || sessions.length === 0) return null;
|
|
263
|
+
// Don't coalesce a `null` return (query failure) into `[]` — that would
|
|
264
|
+
// silently serve an "empty session" export. A genuinely empty session has
|
|
265
|
+
// an `[]` from the DB; a query failure has `null`. Treat the latter as
|
|
266
|
+
// not-found so the route returns 404 rather than a misleading 200.
|
|
267
|
+
const messages = runOpenCodeDb<OpenCodeMessageRow>(
|
|
268
|
+
`SELECT id, session_id, time_created, time_updated, data FROM message WHERE session_id = '${sessionId}' ORDER BY time_created ASC`,
|
|
269
|
+
);
|
|
270
|
+
const parts = runOpenCodeDb<OpenCodePartRow>(
|
|
271
|
+
`SELECT id, message_id, session_id, time_created, time_updated, data FROM part WHERE session_id = '${sessionId}' ORDER BY time_created ASC`,
|
|
272
|
+
);
|
|
273
|
+
if (messages === null || parts === null) return null;
|
|
274
|
+
return {
|
|
275
|
+
session: sessions[0],
|
|
276
|
+
messages: messages.map((m) => ({ ...m, data: parseDataColumn(m.data) ?? m.data })),
|
|
277
|
+
parts: parts.map((p) => ({ ...p, data: parseDataColumn(p.data) ?? p.data })),
|
|
278
|
+
};
|
|
279
|
+
}
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "failproofai",
|
|
3
|
-
"version": "0.0.10-beta.
|
|
3
|
+
"version": "0.0.10-beta.4",
|
|
4
4
|
"description": "The easiest way to manage policies that keep your AI agents reliable, on-task, and running autonomously — for Claude Code & the Agents SDK",
|
|
5
5
|
"bin": {
|
|
6
6
|
"failproofai": "./dist/cli.mjs"
|
|
@@ -9,7 +9,7 @@ const currentPort = parseInt(process.env.PORT, 10) || 3000
|
|
|
9
9
|
const hostname = process.env.HOSTNAME || '0.0.0.0'
|
|
10
10
|
|
|
11
11
|
let keepAliveTimeout = parseInt(process.env.KEEP_ALIVE_TIMEOUT, 10)
|
|
12
|
-
const nextConfig = {"env":{"NEXT_PUBLIC_APP_VERSION":"0.0.10-beta.
|
|
12
|
+
const nextConfig = {"env":{"NEXT_PUBLIC_APP_VERSION":"0.0.10-beta.4"},"typescript":{"ignoreBuildErrors":false},"typedRoutes":false,"distDir":"./.next","cleanDistDir":true,"assetPrefix":"","cacheMaxMemorySize":52428800,"configOrigin":"next.config.ts","useFileSystemPublicRoutes":true,"generateEtags":true,"pageExtensions":["tsx","ts","jsx","js"],"poweredByHeader":true,"compress":true,"images":{"deviceSizes":[640,750,828,1080,1200,1920,2048,3840],"imageSizes":[32,48,64,96,128,256,384],"path":"/_next/image","loader":"default","loaderFile":"","domains":[],"disableStaticImages":false,"minimumCacheTTL":14400,"formats":["image/webp"],"maximumRedirects":3,"maximumResponseBody":50000000,"dangerouslyAllowLocalIP":false,"dangerouslyAllowSVG":false,"contentSecurityPolicy":"script-src 'none'; frame-src 'none'; sandbox;","contentDispositionType":"attachment","localPatterns":[{"pathname":"**","search":""}],"remotePatterns":[],"qualities":[75],"unoptimized":true,"customCacheHandler":false},"devIndicators":{"position":"bottom-left"},"onDemandEntries":{"maxInactiveAge":60000,"pagesBufferLength":5},"basePath":"","sassOptions":{},"trailingSlash":false,"i18n":null,"productionBrowserSourceMaps":false,"excludeDefaultMomentLocales":true,"reactProductionProfiling":false,"reactStrictMode":null,"reactMaxHeadersLength":6000,"httpAgentOptions":{"keepAlive":true},"logging":{"serverFunctions":true,"browserToTerminal":"warn"},"compiler":{},"expireTime":31536000,"staticPageGenerationTimeout":60,"output":"standalone","modularizeImports":{"@mui/icons-material":{"transform":"@mui/icons-material/{{member}}"},"lodash":{"transform":"lodash/{{member}}"}},"outputFileTracingRoot":"/home/runner/work/failproofai/failproofai","cacheComponents":false,"cacheLife":{"default":{"stale":300,"revalidate":900,"expire":4294967294},"seconds":{"stale":30,"revalidate":1,"expire":60},"minutes":{"stale":300,"revalidate":60,"expire":3600},"hours":{"stale":300,"revalidate":3600,"expire":86400},"days":{"stale":300,"revalidate":86400,"expire":604800},"weeks":{"stale":300,"revalidate":604800,"expire":2592000},"max":{"stale":300,"revalidate":2592000,"expire":31536000}},"cacheHandlers":{},"experimental":{"appNewScrollHandler":false,"useSkewCookie":false,"cssChunking":true,"multiZoneDraftMode":false,"appNavFailHandling":false,"prerenderEarlyExit":true,"serverMinification":true,"linkNoTouchStart":false,"caseSensitiveRoutes":false,"cachedNavigations":false,"partialFallbacks":false,"dynamicOnHover":false,"varyParams":false,"prefetchInlining":false,"preloadEntriesOnStart":true,"clientRouterFilter":true,"clientRouterFilterRedirects":false,"fetchCacheKeyPrefix":"","proxyPrefetch":"flexible","optimisticClientCache":true,"manualClientBasePath":false,"cpus":3,"memoryBasedWorkersCount":false,"imgOptConcurrency":null,"imgOptTimeoutInSeconds":7,"imgOptMaxInputPixels":268402689,"imgOptSequentialRead":null,"imgOptSkipMetadata":null,"isrFlushToDisk":true,"workerThreads":false,"optimizeCss":false,"nextScriptWorkers":false,"scrollRestoration":false,"externalDir":false,"disableOptimizedLoading":false,"gzipSize":true,"craCompat":false,"esmExternals":true,"fullySpecified":false,"swcTraceProfiling":false,"forceSwcTransforms":false,"largePageDataBytes":128000,"typedEnv":false,"parallelServerCompiles":false,"parallelServerBuildTraces":false,"ppr":false,"authInterrupts":false,"webpackMemoryOptimizations":false,"optimizeServerReact":true,"strictRouteTypes":false,"viewTransition":false,"removeUncaughtErrorAndRejectionListeners":false,"validateRSCRequestHeaders":false,"staleTimes":{"dynamic":0,"static":300},"reactDebugChannel":true,"serverComponentsHmrCache":true,"staticGenerationMaxConcurrency":8,"staticGenerationMinPagesPerWorker":25,"transitionIndicator":false,"gestureTransition":false,"inlineCss":false,"useCache":false,"globalNotFound":false,"browserDebugInfoInTerminal":"warn","lockDistDir":true,"proxyClientMaxBodySize":10485760,"hideLogsAfterAbort":false,"mcpServer":true,"turbopackFileSystemCacheForDev":true,"turbopackFileSystemCacheForBuild":false,"turbopackInferModuleSideEffects":true,"turbopackPluginRuntimeStrategy":"childProcesses","optimizePackageImports":["lucide-react","date-fns","lodash-es","ramda","antd","react-bootstrap","ahooks","@ant-design/icons","@headlessui/react","@headlessui-float/react","@heroicons/react/20/solid","@heroicons/react/24/solid","@heroicons/react/24/outline","@visx/visx","@tremor/react","rxjs","@mui/material","@mui/icons-material","recharts","react-use","effect","@effect/schema","@effect/platform","@effect/platform-node","@effect/platform-browser","@effect/platform-bun","@effect/sql","@effect/sql-mssql","@effect/sql-mysql2","@effect/sql-pg","@effect/sql-sqlite-node","@effect/sql-sqlite-bun","@effect/sql-sqlite-wasm","@effect/sql-sqlite-react-native","@effect/rpc","@effect/rpc-http","@effect/typeclass","@effect/experimental","@effect/opentelemetry","@material-ui/core","@material-ui/icons","@tabler/icons-react","mui-core","react-icons/ai","react-icons/bi","react-icons/bs","react-icons/cg","react-icons/ci","react-icons/di","react-icons/fa","react-icons/fa6","react-icons/fc","react-icons/fi","react-icons/gi","react-icons/go","react-icons/gr","react-icons/hi","react-icons/hi2","react-icons/im","react-icons/io","react-icons/io5","react-icons/lia","react-icons/lib","react-icons/lu","react-icons/md","react-icons/pi","react-icons/ri","react-icons/rx","react-icons/si","react-icons/sl","react-icons/tb","react-icons/tfi","react-icons/ti","react-icons/vsc","react-icons/wi"],"trustHostHeader":false,"isExperimentalCompile":false},"htmlLimitedBots":"[\\w-]+-Google|Google-[\\w-]+|Chrome-Lighthouse|Slurp|DuckDuckBot|baiduspider|yandex|sogou|bitlybot|tumblr|vkShare|quora link preview|redditbot|ia_archiver|Bingbot|BingPreview|applebot|facebookexternalhit|facebookcatalog|Twitterbot|LinkedInBot|Slackbot|Discordbot|WhatsApp|SkypeUriPreview|Yeti|googleweblight","bundlePagesRouterDependencies":false,"configFileName":"next.config.ts","outputFileTracingExcludes":{"*":["node_modules/@img/**","node_modules/sharp/**"]},"turbopack":{"root":"/home/runner/work/failproofai/failproofai"},"distDirRoot":".next"}
|
|
13
13
|
|
|
14
14
|
process.env.__NEXT_PRIVATE_STANDALONE_CONFIG = JSON.stringify(nextConfig)
|
|
15
15
|
|