@circuitwall/jarela 1.3.0 → 1.4.1
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/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 +1 -1
- package/.next/standalone/.next/server/app/_global-error.segments/_full.segment.rsc +1 -1
- package/.next/standalone/.next/server/app/_global-error.segments/_global-error/__PAGE__.segment.rsc +1 -1
- package/.next/standalone/.next/server/app/_global-error.segments/_global-error.segment.rsc +1 -1
- package/.next/standalone/.next/server/app/_global-error.segments/_head.segment.rsc +1 -1
- package/.next/standalone/.next/server/app/_global-error.segments/_index.segment.rsc +1 -1
- package/.next/standalone/.next/server/app/_global-error.segments/_tree.segment.rsc +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 +1 -1
- package/.next/standalone/.next/server/app/_not-found.segments/_full.segment.rsc +1 -1
- package/.next/standalone/.next/server/app/_not-found.segments/_head.segment.rsc +1 -1
- package/.next/standalone/.next/server/app/_not-found.segments/_index.segment.rsc +1 -1
- package/.next/standalone/.next/server/app/_not-found.segments/_not-found/__PAGE__.segment.rsc +1 -1
- package/.next/standalone/.next/server/app/_not-found.segments/_not-found.segment.rsc +1 -1
- package/.next/standalone/.next/server/app/_not-found.segments/_tree.segment.rsc +1 -1
- package/.next/standalone/.next/server/app/api/v1/builtin-tools/route.js +10 -1
- package/.next/standalone/.next/server/app/api/v1/builtin-tools/route.js.map +1 -1
- package/.next/standalone/.next/server/app/api/v1/dashboard/currency/route.js +10 -5
- package/.next/standalone/.next/server/app/api/v1/dashboard/currency/route.js.map +1 -1
- package/.next/standalone/.next/server/app/api/v1/page-capture/route.js +37 -3
- package/.next/standalone/.next/server/app/api/v1/page-capture/route.js.map +1 -1
- package/.next/standalone/.next/server/app/api/v1/providers/[provider]/probe/route.js +9 -1
- package/.next/standalone/.next/server/app/api/v1/providers/[provider]/probe/route.js.map +1 -1
- package/.next/standalone/.next/server/app/api/v1/threads/[thread_id]/run/route.js +33 -8
- package/.next/standalone/.next/server/app/api/v1/threads/[thread_id]/run/route.js.map +1 -1
- package/.next/standalone/.next/server/app/page.js +73 -204
- package/.next/standalone/.next/server/app/page.js.map +1 -1
- 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/setup/page.js +1 -1
- package/.next/standalone/.next/server/app/setup/page.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/setup/page_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/chunks/1718.js +159 -0
- package/.next/standalone/.next/server/chunks/1718.js.map +1 -0
- package/.next/standalone/.next/server/chunks/2082.js +6 -3
- package/.next/standalone/.next/server/chunks/2082.js.map +1 -1
- package/.next/standalone/.next/server/chunks/210.js +28 -0
- package/.next/standalone/.next/server/chunks/210.js.map +1 -1
- package/.next/standalone/.next/server/chunks/423.js +6 -3
- package/.next/standalone/.next/server/chunks/423.js.map +1 -1
- package/.next/standalone/.next/server/chunks/4631.js +37 -5
- package/.next/standalone/.next/server/chunks/4631.js.map +1 -1
- package/.next/standalone/.next/server/chunks/8167.js +255 -204
- package/.next/standalone/.next/server/chunks/8167.js.map +1 -1
- package/.next/standalone/.next/server/chunks/8866.js +38 -5
- package/.next/standalone/.next/server/chunks/8866.js.map +1 -1
- package/.next/standalone/.next/server/chunks/9032.js +8 -0
- package/.next/standalone/.next/server/chunks/9032.js.map +1 -1
- package/.next/standalone/.next/server/chunks/{7883.js → 9557.js} +15 -3
- package/.next/standalone/.next/server/chunks/9557.js.map +1 -0
- package/.next/standalone/.next/server/middleware-build-manifest.js +3 -3
- package/.next/standalone/.next/server/middleware.js +6 -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/proxy.js.map +1 -1
- package/.next/standalone/.next/server/server-reference-manifest.json +1 -1
- package/.next/standalone/.next/static/chunks/{2351-68d8987bbe17ba2d.js → 2351-1ab119fb3b48f4c9.js} +258 -205
- package/.next/standalone/.next/static/chunks/2351-1ab119fb3b48f4c9.js.map +1 -0
- package/.next/standalone/.next/static/chunks/{9209-0d46118e502f8bf5.js → 4097-64691f9110cf167c.js} +14 -2
- package/.next/standalone/.next/static/chunks/4097-64691f9110cf167c.js.map +1 -0
- package/.next/standalone/.next/static/chunks/app/{page-2ab710949b62a638.js → page-145150e0468544e7.js} +74 -205
- package/.next/standalone/.next/static/chunks/app/page-145150e0468544e7.js.map +1 -0
- package/.next/standalone/.next/static/chunks/app/setup/{page-9a465b5fa755b3c3.js → page-a1463a9ace439ff7.js} +2 -2
- package/.next/standalone/.next/static/chunks/app/setup/{page-9a465b5fa755b3c3.js.map → page-a1463a9ace439ff7.js.map} +1 -1
- package/.next/standalone/.next/static/chunks/{webpack-ff5627013a5e3842.js → webpack-f4ac5c5f92cfd1c1.js} +13 -1
- package/.next/standalone/.next/static/chunks/webpack-f4ac5c5f92cfd1c1.js.map +1 -0
- package/.next/standalone/package.json +2 -1
- package/CHANGELOG.md +84 -0
- package/README.md +51 -26
- package/api/client.ts +10 -9
- package/app/api/v1/dashboard/currency/route.ts +7 -2
- package/app/api/v1/providers/[provider]/probe/route.ts +12 -1
- package/app/api/v1/threads/[thread_id]/run/route.ts +22 -8
- package/components/chat/InputBar.tsx +10 -1
- package/components/layout/AppShell.tsx +53 -17
- package/components/setup/PinKeypad.tsx +238 -0
- package/components/setup/ScreenLock.tsx +8 -173
- package/components/setup/UnlockScreen.tsx +25 -192
- package/lib/api/page-capture.test.ts +58 -0
- package/lib/api/page-capture.ts +31 -1
- package/lib/documents/remote/github.ts +16 -2
- package/lib/documents/remote/mail.ts +11 -2
- package/lib/lifecycle/shutdown.ts +9 -0
- package/lib/providers/github-copilot-auth.ts +2 -0
- package/lib/providers/github-copilot.ts +1 -0
- package/lib/tools/async-results.ts +11 -0
- package/package.json +2 -1
- package/scripts/install-to-system.ps1 +2 -2
- package/scripts/installed-launcher.ps1 +81 -17
- package/.next/standalone/.next/server/chunks/7883.js.map +0 -1
- package/.next/standalone/.next/static/chunks/2351-68d8987bbe17ba2d.js.map +0 -1
- package/.next/standalone/.next/static/chunks/9209-0d46118e502f8bf5.js.map +0 -1
- package/.next/standalone/.next/static/chunks/app/page-2ab710949b62a638.js.map +0 -1
- package/.next/standalone/.next/static/chunks/webpack-ff5627013a5e3842.js.map +0 -1
- /package/.next/standalone/.next/static/{ZKy7LJ3KXj2TIyKOg_fBH → WQdcnm9NyqpeNc0Z8_woo}/_buildManifest.js +0 -0
- /package/.next/standalone/.next/static/{ZKy7LJ3KXj2TIyKOg_fBH → WQdcnm9NyqpeNc0Z8_woo}/_ssgManifest.js +0 -0
|
@@ -151,6 +151,14 @@ async function runShutdown() {
|
|
|
151
151
|
} catch (err) {
|
|
152
152
|
console.error("[jarela] waiting for runs failed:", err);
|
|
153
153
|
}
|
|
154
|
+
// 4b. Stop the async-tool-results sweeper. Holds a setInterval that
|
|
155
|
+
// would otherwise keep the event loop alive past closeDb().
|
|
156
|
+
try {
|
|
157
|
+
const { stopAsyncResults } = await __webpack_require__.e(/* import() */ 1718).then(__webpack_require__.bind(__webpack_require__, 31718));
|
|
158
|
+
stopAsyncResults();
|
|
159
|
+
} catch (err) {
|
|
160
|
+
console.error("[jarela] stopping async-results sweeper failed:", err);
|
|
161
|
+
}
|
|
154
162
|
// 5. Close the DB. WAL is checkpointed so the next boot is fast and we
|
|
155
163
|
// leave no stale -shm/-wal sidecars on disk.
|
|
156
164
|
try {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"9032.js","mappings":"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","sources":["webpack://@circuitwall/jarela/./lib/utils/global-state.ts","webpack://@circuitwall/jarela/./lib/lifecycle/shutdown.ts","webpack://@circuitwall/jarela/./lib/env/app-config.ts","webpack://@circuitwall/jarela/./lib/env/config.ts"],"sourcesContent":["// Pin a piece of state to globalThis so it survives Next.js dev hot-reload.\n//\n// Without this, every code edit re-evaluates the module, replacing the\n// in-memory state with empty containers — but any active closure still\n// references the OLD set, so listeners/timers/maps go silently dead.\n// The globalThis trick is the standard Next pattern for singletons.\n//\n// `key` must be unique across the app (it lives on globalThis); pick a\n// \"__jarela_<name>\" prefix to keep the namespace tidy.\nexport function getOrCreateGlobal<T>(key: string, factory: () => T): T {\n const g = globalThis as unknown as Record<string, unknown>;\n if (g[key] === undefined) g[key] = factory();\n return g[key] as T;\n}\n","// Graceful shutdown coordinator.\n//\n// Registers SIGINT / SIGTERM (and SIGBREAK on Windows) so Ctrl-C in the\n// foreground and `kill`/`systemctl stop`/Task Scheduler \"End task\" all\n// trigger the same drain sequence:\n//\n// 1. abort every in-flight LangGraph run so stream loops bail out\n// 2. stop the scheduler tick so no new firings start\n// 3. close every bridge adapter (WhatsApp WS, future kinds) cleanly\n// 4. wait briefly for the runs to actually finish flushing\n// 5. close the SQLite handle so WAL is checkpointed\n// 6. exit 0\n//\n// A hard timeout aborts the drain if any subsystem hangs — the supervisor\n// (Task Scheduler / systemd / installed-launcher.ps1) will then restart us\n// instead of leaving a zombie holding the port.\n//\n// Wired from `instrumentation.ts` so it runs once per server process at\n// boot. Idempotent: only the first call installs handlers.\n\nimport { getOrCreateGlobal } from \"@/lib/utils/global-state\";\nimport { getConfig } from \"@/lib/env/config\";\n\ninterface ShutdownState {\n registered: boolean;\n shuttingDown: boolean;\n}\nconst state = getOrCreateGlobal<ShutdownState>(\"__jarela_shutdown\", () => ({\n registered: false,\n shuttingDown: false,\n}));\n\n// JARELA_SHUTDOWN_DRAIN_MS / JARELA_SHUTDOWN_SETTLE_MS override these.\n// Captured at handler-install time (boot); these don't hot-reload because\n// the handlers close over the values.\nconst HARD_TIMEOUT_MS = getConfig().shutdownDrainMs;\nconst RUN_DRAIN_MS = getConfig().shutdownSettleMs;\n\nexport function registerShutdownHandlers(): void {\n if (state.registered) return;\n state.registered = true;\n\n const handler = (signal: NodeJS.Signals) => {\n if (state.shuttingDown) {\n // Second signal while already draining: operator is impatient, exit\n // immediately. Mirrors the behaviour every well-behaved daemon has —\n // first Ctrl-C drains, second Ctrl-C kills.\n console.log(`[jarela] received ${signal} during shutdown; forcing exit.`);\n process.exit(130);\n }\n state.shuttingDown = true;\n console.log(`[jarela] ${signal} received, draining…`);\n void runShutdown().catch((err) => {\n console.error(`[jarela] shutdown error:`, err);\n process.exit(1);\n });\n };\n\n // Replace any default handlers Next's standalone server may have\n // installed for these signals. Next's default just calls\n // `server.close(() => process.exit(0))`, which races our drain and can\n // exit the process before bridges/DB have flushed. We take over and\n // exit ourselves once drain completes.\n process.removeAllListeners(\"SIGINT\");\n process.removeAllListeners(\"SIGTERM\");\n process.on(\"SIGINT\", handler);\n process.on(\"SIGTERM\", handler);\n if (process.platform === \"win32\") {\n // Ctrl-Break in a foreground PowerShell session lands as SIGBREAK,\n // not SIGINT. Task Scheduler \"End task\" delivers SIGBREAK as well.\n process.removeAllListeners(\"SIGBREAK\");\n process.on(\"SIGBREAK\", handler);\n }\n}\n\nasync function runShutdown(): Promise<void> {\n // Safety net: if any drain step deadlocks (e.g. a bridge adapter's\n // socket.close() never resolves), force-exit so the supervisor can\n // restart cleanly instead of holding the port forever.\n const forceExit = setTimeout(() => {\n console.warn(`[jarela] drain exceeded ${HARD_TIMEOUT_MS}ms; forcing exit.`);\n process.exit(130);\n }, HARD_TIMEOUT_MS);\n forceExit.unref?.();\n\n // 1. Abort in-flight LLM runs. The route's stream loop watches this\n // AbortController and exits early, emitting a trailing error chunk.\n try {\n const { abortAllRuns } = await import(\"@/lib/agents/run-registry\");\n const n = abortAllRuns(\"server_shutdown\");\n if (n > 0) console.log(`[jarela] aborted ${n} in-flight run(s).`);\n } catch (err) {\n console.error(\"[jarela] aborting runs failed:\", err);\n }\n\n // 2. Stop the scheduler so no firing kicks off mid-drain.\n try {\n const { stopScheduler } = await import(\"@/lib/scheduler\");\n stopScheduler();\n } catch (err) {\n console.error(\"[jarela] stopping scheduler failed:\", err);\n }\n\n // 2b. Drain trigger handlers — closes fs.watch watchers and any other\n // handler that has timers / sockets attached. Independent of the\n // scheduler tick (those are run-loop ownership; this is per-handler\n // ownership of OS resources).\n try {\n const { stopAllTriggerHandlers } = await import(\"@/lib/triggers\");\n await stopAllTriggerHandlers();\n } catch (err) {\n console.error(\"[jarela] stopping trigger handlers failed:\", err);\n }\n\n // 3. Close bridges (WhatsApp Baileys WS, etc).\n try {\n const { stopAllBridges } = await import(\"@/lib/bridges/runtime\");\n await stopAllBridges();\n } catch (err) {\n console.error(\"[jarela] stopping bridges failed:\", err);\n }\n\n // 4. Give aborted runs a beat to actually finish — they were signalled\n // in step 1, but the `finally` blocks need ticks to flush trailing\n // events and persist the partial assistant message.\n try {\n const { waitForRunsToSettle } = await import(\"@/lib/agents/run-registry\");\n const stuck = await waitForRunsToSettle(RUN_DRAIN_MS);\n if (stuck > 0) console.warn(`[jarela] ${stuck} run(s) still active after drain window.`);\n } catch (err) {\n console.error(\"[jarela] waiting for runs failed:\", err);\n }\n\n // 5. Close the DB. WAL is checkpointed so the next boot is fast and we\n // leave no stale -shm/-wal sidecars on disk.\n try {\n const { closeDb } = await import(\"@/lib/db\");\n closeDb();\n } catch (err) {\n console.error(\"[jarela] closing db failed:\", err);\n }\n\n clearTimeout(forceExit);\n console.log(\"[jarela] shutdown complete.\");\n process.exit(0);\n}\n","// Branding knobs sourced from NEXT_PUBLIC_* env vars so forks can rebrand\n// the app without patching source. NEXT_PUBLIC_* is the right\n// channel here because Next.js inlines these at build time, which lets\n// client components read them directly (no React Context, no server\n// round-trip). Server-only modules read the same keys at runtime.\n//\n// Keep this module client-safe — no Node-only imports, no DB/FS access.\n\nconst DEFAULT_APP_NAME = \"Jarela\";\nconst DEFAULT_APP_DESCRIPTION = \"Jarela — local chat interface for LangGraph agents\";\nconst DEFAULT_ISSUE_URL = \"https://github.com/CircuitWall/jarela/issues/new\";\n\nexport function getAppName(): string {\n return process.env.NEXT_PUBLIC_APP_NAME?.trim() || DEFAULT_APP_NAME;\n}\n\nexport function getAppDescription(): string {\n return process.env.NEXT_PUBLIC_APP_DESCRIPTION?.trim() || DEFAULT_APP_DESCRIPTION;\n}\n\nexport function getAppIssueUrl(): string {\n return process.env.NEXT_PUBLIC_APP_ISSUE_URL?.trim() || DEFAULT_ISSUE_URL;\n}\n","// Central runtime configuration, resolved from environment variables.\n//\n// All operational knobs (port, host, data dir, timeouts, agent limits) flow\n// through this module so there is exactly one place documenting which env\n// vars Jarela respects and what the defaults are. Code MUST NOT read these\n// `process.env` keys directly — import `config` instead.\n//\n// Resolution order for every entry: explicit JARELA_* var → legacy/standard\n// var (where one exists, e.g. PORT/HOSTNAME for Next.js compatibility) →\n// schema default (lib/env/schema.ts).\n//\n// Values are resolved lazily on first read and cached. Tests + the env-\n// override PATCH endpoint must call `resetConfigCache()` between cases.\n\nimport { getDataDir } from \"@/lib/db/data-dir\";\nimport { getAppName, getAppDescription, getAppIssueUrl } from \"./app-config\";\nimport { ENV_DEFAULTS } from \"./schema\";\nimport { join } from \"node:path\";\nimport { homedir } from \"node:os\";\n\nexport interface JarelaConfig {\n // network\n readonly port: number;\n readonly hostname: string;\n readonly dataDir: string;\n readonly toolsDir: string;\n readonly httpRequestTimeoutMs: number;\n readonly sseConnectTimeoutMs: number;\n readonly healthCheckTimeoutMs: number;\n readonly httpMaxAttempts: number;\n\n // agent\n readonly recursionLimit: number;\n readonly llmStreamMaxMs: number;\n readonly runIdleMs: number;\n readonly runMaxMs: number;\n readonly runRegistryTtlMs: number;\n readonly runBufferSize: number;\n readonly maxStallRetries: number;\n readonly maxTransientRetries: number;\n readonly maxDelegationDepth: number;\n readonly streamParseTripwire: number;\n\n // tools\n readonly voiceTimeoutMs: number;\n readonly imageTimeoutMs: number;\n readonly fetchToolMaxBytes: number;\n readonly mcpRegistryTimeoutMs: number;\n readonly execMaxOutputBytes: number;\n readonly filesMaxReadBytes: number;\n readonly filesMaxWriteBytes: number;\n\n // lifecycle\n readonly updateCheckTimeoutMs: number;\n readonly shutdownDrainMs: number;\n readonly shutdownSettleMs: number;\n readonly disableUpdateCheck: boolean;\n\n // limits\n readonly notificationRingSize: number;\n\n // logging\n readonly logsRingSize: number;\n readonly logLevel: \"debug\" | \"info\" | \"warn\" | \"error\";\n\n // scheduler\n readonly schedulerTickMs: number;\n readonly fastRemoteSweepMs: number;\n\n // documents\n readonly docMaxFileBytes: number;\n readonly docMaxFilesPerSource: number;\n\n // anti-hallucination detector\n readonly hallucinationDetectorMode: \"off\" | \"regex\" | \"model\";\n readonly hallucinationDetectorModel: string;\n readonly citationCheckerTailChars: number;\n readonly citationManifestMax: number;\n\n // app metadata\n readonly appName: string;\n readonly appDescription: string;\n readonly issueUrl: string;\n}\n\nfunction parsePositiveInt(value: string | undefined, fallback: number): number {\n if (!value) return fallback;\n const n = Number(value);\n return Number.isFinite(n) && n > 0 ? Math.floor(n) : fallback;\n}\n\n// Like parsePositiveInt but accepts 0 as a valid value (used to disable\n// deadlines explicitly). Negative / NaN still fall through to the default.\nfunction parseNonNegativeInt(value: string | undefined, fallback: number): number {\n if (value === undefined) return fallback;\n const n = Number(value);\n return Number.isFinite(n) && n >= 0 ? Math.floor(n) : fallback;\n}\n\nfunction parsePort(value: string | undefined, fallback: number): number {\n const n = parsePositiveInt(value, fallback);\n return n >= 1 && n <= 65_535 ? n : fallback;\n}\n\nfunction parseBool(value: string | undefined, fallback: boolean): boolean {\n if (value === undefined) return fallback;\n const v = value.trim().toLowerCase();\n if (v === \"1\" || v === \"true\") return true;\n if (v === \"0\" || v === \"false\") return false;\n return fallback;\n}\n\nfunction parseHallucinationMode(\n value: string | undefined,\n fallback: JarelaConfig[\"hallucinationDetectorMode\"],\n): JarelaConfig[\"hallucinationDetectorMode\"] {\n if (!value) return fallback;\n const v = value.trim().toLowerCase();\n if (v === \"off\" || v === \"regex\" || v === \"model\") return v;\n return fallback;\n}\n\nfunction parseLogLevel(value: string | undefined, fallback: \"debug\" | \"info\" | \"warn\" | \"error\"): JarelaConfig[\"logLevel\"] {\n if (!value) return fallback;\n const v = value.trim().toLowerCase();\n if (v === \"debug\" || v === \"info\" || v === \"warn\" || v === \"error\") return v;\n return fallback;\n}\n\nlet cached: JarelaConfig | null = null;\n\nfunction expandHome(p: string): string {\n return p.startsWith(\"~\") ? p.replace(/^~/, homedir()) : p;\n}\n\nexport function getConfig(): JarelaConfig {\n if (cached) return cached;\n const env = process.env;\n const dataDir = getDataDir();\n cached = {\n // network\n port: parsePort(env.JARELA_PORT ?? env.PORT, ENV_DEFAULTS.port),\n hostname: (env.JARELA_HOSTNAME ?? env.HOSTNAME ?? ENV_DEFAULTS.hostname).trim() || ENV_DEFAULTS.hostname,\n dataDir,\n toolsDir: env.JARELA_TOOLS_DIR ? expandHome(env.JARELA_TOOLS_DIR) : join(dataDir, \"tools\"),\n httpRequestTimeoutMs: parsePositiveInt(env.JARELA_HTTP_REQUEST_TIMEOUT_MS, ENV_DEFAULTS.httpRequestTimeoutMs),\n sseConnectTimeoutMs: parsePositiveInt(env.JARELA_SSE_CONNECT_TIMEOUT_MS, ENV_DEFAULTS.sseConnectTimeoutMs),\n healthCheckTimeoutMs: parsePositiveInt(env.JARELA_HEALTH_CHECK_TIMEOUT_MS, ENV_DEFAULTS.healthCheckTimeoutMs),\n httpMaxAttempts: parsePositiveInt(env.JARELA_HTTP_MAX_ATTEMPTS, ENV_DEFAULTS.httpMaxAttempts),\n\n // agent\n recursionLimit: parsePositiveInt(env.JARELA_RECURSION_LIMIT, ENV_DEFAULTS.recursionLimit),\n llmStreamMaxMs: parseNonNegativeInt(env.JARELA_LLM_STREAM_MAX_MS, ENV_DEFAULTS.llmStreamMaxMs),\n runIdleMs: parsePositiveInt(env.JARELA_RUN_IDLE_MS, ENV_DEFAULTS.runIdleMs),\n runMaxMs: parsePositiveInt(env.JARELA_RUN_MAX_MS, ENV_DEFAULTS.runMaxMs),\n runRegistryTtlMs: parsePositiveInt(env.JARELA_RUN_REGISTRY_TTL_MS, ENV_DEFAULTS.runRegistryTtlMs),\n runBufferSize: parsePositiveInt(env.JARELA_RUN_BUFFER_SIZE, ENV_DEFAULTS.runBufferSize),\n maxStallRetries: parseNonNegativeInt(env.JARELA_MAX_STALL_RETRIES, ENV_DEFAULTS.maxStallRetries),\n maxTransientRetries: parseNonNegativeInt(env.JARELA_MAX_TRANSIENT_RETRIES, ENV_DEFAULTS.maxTransientRetries),\n maxDelegationDepth: parseNonNegativeInt(env.JARELA_MAX_DELEGATION_DEPTH, ENV_DEFAULTS.maxDelegationDepth),\n streamParseTripwire: parsePositiveInt(env.JARELA_STREAM_PARSE_TRIPWIRE, ENV_DEFAULTS.streamParseTripwire),\n\n // tools\n voiceTimeoutMs: parsePositiveInt(env.JARELA_VOICE_TIMEOUT_MS, ENV_DEFAULTS.voiceTimeoutMs),\n imageTimeoutMs: parsePositiveInt(env.JARELA_IMAGE_TIMEOUT_MS, ENV_DEFAULTS.imageTimeoutMs),\n fetchToolMaxBytes: parsePositiveInt(env.JARELA_FETCH_TOOL_MAX_BYTES, ENV_DEFAULTS.fetchToolMaxBytes),\n mcpRegistryTimeoutMs: parsePositiveInt(env.JARELA_MCP_REGISTRY_TIMEOUT_MS, ENV_DEFAULTS.mcpRegistryTimeoutMs),\n execMaxOutputBytes: parsePositiveInt(env.JARELA_EXEC_MAX_OUTPUT_BYTES, ENV_DEFAULTS.execMaxOutputBytes),\n filesMaxReadBytes: parsePositiveInt(env.JARELA_FILES_MAX_READ_BYTES, ENV_DEFAULTS.filesMaxReadBytes),\n filesMaxWriteBytes: parsePositiveInt(env.JARELA_FILES_MAX_WRITE_BYTES, ENV_DEFAULTS.filesMaxWriteBytes),\n\n // lifecycle\n updateCheckTimeoutMs: parsePositiveInt(env.JARELA_UPDATE_CHECK_TIMEOUT_MS, ENV_DEFAULTS.updateCheckTimeoutMs),\n shutdownDrainMs: parsePositiveInt(env.JARELA_SHUTDOWN_DRAIN_MS, ENV_DEFAULTS.shutdownDrainMs),\n shutdownSettleMs: parseNonNegativeInt(env.JARELA_SHUTDOWN_SETTLE_MS, ENV_DEFAULTS.shutdownSettleMs),\n disableUpdateCheck: parseBool(env.JARELA_DISABLE_UPDATE_CHECK, false),\n\n // limits\n notificationRingSize: parsePositiveInt(env.JARELA_NOTIFICATION_RING_SIZE, ENV_DEFAULTS.notificationRingSize),\n\n // logging\n logsRingSize: parsePositiveInt(env.JARELA_LOGS_RING_SIZE, ENV_DEFAULTS.logsRingSize),\n logLevel: parseLogLevel(env.JARELA_LOG_LEVEL, ENV_DEFAULTS.logLevel),\n\n // scheduler\n schedulerTickMs: parsePositiveInt(env.JARELA_SCHEDULER_TICK_MS, ENV_DEFAULTS.schedulerTickMs),\n fastRemoteSweepMs: parsePositiveInt(env.JARELA_FAST_REMOTE_SWEEP_MS, ENV_DEFAULTS.fastRemoteSweepMs),\n\n // documents\n docMaxFileBytes: parsePositiveInt(env.JARELA_DOC_MAX_FILE_BYTES, ENV_DEFAULTS.docMaxFileBytes),\n docMaxFilesPerSource: parsePositiveInt(env.JARELA_DOC_MAX_FILES_PER_SOURCE, ENV_DEFAULTS.docMaxFilesPerSource),\n\n // anti-hallucination classifier\n hallucinationDetectorMode: parseHallucinationMode(\n env.JARELA_HALLUCINATION_DETECTOR_MODE,\n ENV_DEFAULTS.hallucinationDetectorMode,\n ),\n hallucinationDetectorModel: (env.JARELA_HALLUCINATION_DETECTOR_MODEL ?? ENV_DEFAULTS.hallucinationDetectorModel).trim(),\n citationCheckerTailChars: parseNonNegativeInt(env.JARELA_CITATION_CHECKER_TAIL_CHARS, ENV_DEFAULTS.citationCheckerTailChars),\n citationManifestMax: parseNonNegativeInt(env.JARELA_CITATION_MANIFEST_MAX, ENV_DEFAULTS.citationManifestMax),\n\n // app metadata\n appName: getAppName(),\n appDescription: getAppDescription(),\n issueUrl: getAppIssueUrl(),\n };\n return cached;\n}\n\n/** Drop the memoised config so the next read picks up env edits. Used by tests + the env-override PATCH endpoint. */\nexport function resetConfigCache(): void {\n cached = null;\n}\n"],"names":["getOrCreateGlobal","key","factory","g","globalThis","undefined","getConfig","state","registered","shuttingDown","HARD_TIMEOUT_MS","shutdownDrainMs","RUN_DRAIN_MS","shutdownSettleMs","registerShutdownHandlers","handler","signal","console","log","process","exit","runShutdown","catch","err","error","removeAllListeners","on","platform","forceExit","setTimeout","warn","unref","abortAllRuns","n","stopScheduler","stopAllTriggerHandlers","stopAllBridges","waitForRunsToSettle","stuck","closeDb","clearTimeout","DEFAULT_APP_NAME","DEFAULT_APP_DESCRIPTION","DEFAULT_ISSUE_URL","getAppName","env","NEXT_PUBLIC_APP_NAME","trim","getAppDescription","NEXT_PUBLIC_APP_DESCRIPTION","getAppIssueUrl","NEXT_PUBLIC_APP_ISSUE_URL","getDataDir","ENV_DEFAULTS","join","homedir","parsePositiveInt","value","fallback","Number","isFinite","Math","floor","parseNonNegativeInt","parsePort","parseBool","v","toLowerCase","parseHallucinationMode","parseLogLevel","cached","expandHome","p","startsWith","replace","dataDir","port","JARELA_PORT","PORT","hostname","JARELA_HOSTNAME","HOSTNAME","toolsDir","JARELA_TOOLS_DIR","httpRequestTimeoutMs","JARELA_HTTP_REQUEST_TIMEOUT_MS","sseConnectTimeoutMs","JARELA_SSE_CONNECT_TIMEOUT_MS","healthCheckTimeoutMs","JARELA_HEALTH_CHECK_TIMEOUT_MS","httpMaxAttempts","JARELA_HTTP_MAX_ATTEMPTS","recursionLimit","JARELA_RECURSION_LIMIT","llmStreamMaxMs","JARELA_LLM_STREAM_MAX_MS","runIdleMs","JARELA_RUN_IDLE_MS","runMaxMs","JARELA_RUN_MAX_MS","runRegistryTtlMs","JARELA_RUN_REGISTRY_TTL_MS","runBufferSize","JARELA_RUN_BUFFER_SIZE","maxStallRetries","JARELA_MAX_STALL_RETRIES","maxTransientRetries","JARELA_MAX_TRANSIENT_RETRIES","maxDelegationDepth","JARELA_MAX_DELEGATION_DEPTH","streamParseTripwire","JARELA_STREAM_PARSE_TRIPWIRE","voiceTimeoutMs","JARELA_VOICE_TIMEOUT_MS","imageTimeoutMs","JARELA_IMAGE_TIMEOUT_MS","fetchToolMaxBytes","JARELA_FETCH_TOOL_MAX_BYTES","mcpRegistryTimeoutMs","JARELA_MCP_REGISTRY_TIMEOUT_MS","execMaxOutputBytes","JARELA_EXEC_MAX_OUTPUT_BYTES","filesMaxReadBytes","JARELA_FILES_MAX_READ_BYTES","filesMaxWriteBytes","JARELA_FILES_MAX_WRITE_BYTES","updateCheckTimeoutMs","JARELA_UPDATE_CHECK_TIMEOUT_MS","JARELA_SHUTDOWN_DRAIN_MS","JARELA_SHUTDOWN_SETTLE_MS","disableUpdateCheck","JARELA_DISABLE_UPDATE_CHECK","notificationRingSize","JARELA_NOTIFICATION_RING_SIZE","logsRingSize","JARELA_LOGS_RING_SIZE","logLevel","JARELA_LOG_LEVEL","schedulerTickMs","JARELA_SCHEDULER_TICK_MS","fastRemoteSweepMs","JARELA_FAST_REMOTE_SWEEP_MS","docMaxFileBytes","JARELA_DOC_MAX_FILE_BYTES","docMaxFilesPerSource","JARELA_DOC_MAX_FILES_PER_SOURCE","hallucinationDetectorMode","JARELA_HALLUCINATION_DETECTOR_MODE","hallucinationDetectorModel","JARELA_HALLUCINATION_DETECTOR_MODEL","citationCheckerTailChars","JARELA_CITATION_CHECKER_TAIL_CHARS","citationManifestMax","JARELA_CITATION_MANIFEST_MAX","appName","appDescription","issueUrl","resetConfigCache"],"sourceRoot":"","ignoreList":[]}
|
|
1
|
+
{"version":3,"file":"9032.js","mappings":";;;;;;;;;;;AAAA,4EAA4E;AAC5E,EAAE;AACF,uEAAuE;AACvE,uEAAuE;AACvE,qEAAqE;AACrE,oEAAoE;AACpE,EAAE;AACF,uEAAuE;AACvE,uDAAuD;AAChD,SAASA,kBAAqBC,GAAW,EAAEC,OAAgB;IAChE,MAAMC,IAAIC;IACV,IAAID,CAAC,CAACF,IAAI,KAAKI,WAAWF,CAAC,CAACF,IAAI,GAAGC;IACnC,OAAOC,CAAC,CAACF,IAAI;AACf;;;;;;;;;;;;;ACbA,iCAAiC;AACjC,EAAE;AACF,wEAAwE;AACxE,uEAAuE;AACvE,mCAAmC;AACnC,EAAE;AACF,oEAAoE;AACpE,uDAAuD;AACvD,sEAAsE;AACtE,6DAA6D;AAC7D,sDAAsD;AACtD,cAAc;AACd,EAAE;AACF,0EAA0E;AAC1E,2EAA2E;AAC3E,gDAAgD;AAChD,EAAE;AACF,wEAAwE;AACxE,2DAA2D;AAEE;AAChB;AAM7C,MAAMM,QAAQP,mFAAiBA,CAAgB,qBAAqB,IAAO;QACzEQ,YAAY;QACZC,cAAc;IAChB;AAEA,uEAAuE;AACvE,0EAA0E;AAC1E,sCAAsC;AACtC,MAAMC,kBAAkBJ,mEAASA,GAAGK,eAAe;AACnD,MAAMC,eAAeN,mEAASA,GAAGO,gBAAgB;AAE1C,SAASC;IACd,IAAIP,MAAMC,UAAU,EAAE;IACtBD,MAAMC,UAAU,GAAG;IAEnB,MAAMO,UAAU,CAACC;QACf,IAAIT,MAAME,YAAY,EAAE;YACtB,oEAAoE;YACpE,qEAAqE;YACrE,4CAA4C;YAC5CQ,QAAQC,GAAG,CAAC,CAAC,kBAAkB,EAAEF,OAAO,+BAA+B,CAAC;YACxEG,QAAQC,IAAI,CAAC;QACf;QACAb,MAAME,YAAY,GAAG;QACrBQ,QAAQC,GAAG,CAAC,CAAC,SAAS,EAAEF,OAAO,oBAAoB,CAAC;QACpD,KAAKK,cAAcC,KAAK,CAAC,CAACC;YACxBN,QAAQO,KAAK,CAAC,CAAC,wBAAwB,CAAC,EAAED;YAC1CJ,QAAQC,IAAI,CAAC;QACf;IACF;IAEA,iEAAiE;IACjE,yDAAyD;IACzD,uEAAuE;IACvE,oEAAoE;IACpE,uCAAuC;IACvCD,QAAQM,kBAAkB,CAAC;IAC3BN,QAAQM,kBAAkB,CAAC;IAC3BN,QAAQO,EAAE,CAAC,UAAUX;IACrBI,QAAQO,EAAE,CAAC,WAAWX;IACtB,IAAII,QAAQQ,QAAQ,KAAK,SAAS;QAChC,mEAAmE;QACnE,mEAAmE;QACnER,QAAQM,kBAAkB,CAAC;QAC3BN,QAAQO,EAAE,CAAC,YAAYX;IACzB;AACF;AAEA,eAAeM;IACb,mEAAmE;IACnE,mEAAmE;IACnE,uDAAuD;IACvD,MAAMO,YAAYC,WAAW;QAC3BZ,QAAQa,IAAI,CAAC,CAAC,wBAAwB,EAAEpB,gBAAgB,iBAAiB,CAAC;QAC1ES,QAAQC,IAAI,CAAC;IACf,GAAGV;IACHkB,UAAUG,KAAK;IAEf,oEAAoE;IACpE,uEAAuE;IACvE,IAAI;QACF,MAAM,EAAEC,YAAY,EAAE,GAAG,MAAM,qGAAmC;QAClE,MAAMC,IAAID,aAAa;QACvB,IAAIC,IAAI,GAAGhB,QAAQC,GAAG,CAAC,CAAC,iBAAiB,EAAEe,EAAE,kBAAkB,CAAC;IAClE,EAAE,OAAOV,KAAK;QACZN,QAAQO,KAAK,CAAC,kCAAkCD;IAClD;IAEA,0DAA0D;IAC1D,IAAI;QACF,MAAM,EAAEW,aAAa,EAAE,GAAG,MAAM,iQAAyB;QACzDA;IACF,EAAE,OAAOX,KAAK;QACZN,QAAQO,KAAK,CAAC,uCAAuCD;IACvD;IAEA,sEAAsE;IACtE,qEAAqE;IACrE,wEAAwE;IACxE,kCAAkC;IAClC,IAAI;QACF,MAAM,EAAEY,sBAAsB,EAAE,GAAG,MAAM,kQAAwB;QACjE,MAAMA;IACR,EAAE,OAAOZ,KAAK;QACZN,QAAQO,KAAK,CAAC,8CAA8CD;IAC9D;IAEA,+CAA+C;IAC/C,IAAI;QACF,MAAM,EAAEa,cAAc,EAAE,GAAG,MAAM,8RAA+B;QAChE,MAAMA;IACR,EAAE,OAAOb,KAAK;QACZN,QAAQO,KAAK,CAAC,qCAAqCD;IACrD;IAEA,uEAAuE;IACvE,sEAAsE;IACtE,uDAAuD;IACvD,IAAI;QACF,MAAM,EAAEc,mBAAmB,EAAE,GAAG,MAAM,qGAAmC;QACzE,MAAMC,QAAQ,MAAMD,oBAAoBzB;QACxC,IAAI0B,QAAQ,GAAGrB,QAAQa,IAAI,CAAC,CAAC,SAAS,EAAEQ,MAAM,wCAAwC,CAAC;IACzF,EAAE,OAAOf,KAAK;QACZN,QAAQO,KAAK,CAAC,qCAAqCD;IACrD;IAEA,oEAAoE;IACpE,gEAAgE;IAChE,IAAI;QACF,MAAM,EAAEgB,gBAAgB,EAAE,GAAG,MAAM,qGAAmC;QACtEA;IACF,EAAE,OAAOhB,KAAK;QACZN,QAAQO,KAAK,CAAC,mDAAmDD;IACnE;IAEA,uEAAuE;IACvE,gDAAgD;IAChD,IAAI;QACF,MAAM,EAAEiB,OAAO,EAAE,GAAG,MAAM,+IAAkB;QAC5CA;IACF,EAAE,OAAOjB,KAAK;QACZN,QAAQO,KAAK,CAAC,+BAA+BD;IAC/C;IAEAkB,aAAab;IACbX,QAAQC,GAAG,CAAC;IACZC,QAAQC,IAAI,CAAC;AACf;;;;;;;;;;;;;AC1JA,0EAA0E;AAC1E,8DAA8D;AAC9D,uEAAuE;AACvE,oEAAoE;AACpE,kEAAkE;AAClE,EAAE;AACF,wEAAwE;AAExE,MAAMsB,mBAAmB;AACzB,MAAMC,0BAA0B;AAChC,MAAMC,oBAAoB;AAEnB,SAASC;IACd,OAAO1B,QAAQ2B,GAAG,CAACC,oBAAoB,EAAEC,UAAUN;AACrD;AAEO,SAASO;IACd,OAAO9B,QAAQ2B,GAAG,CAACI,2BAA2B,EAAEF,UAAUL;AAC5D;AAEO,SAASQ;IACd,OAAOhC,QAAQ2B,GAAG,CAACM,yBAAyB,EAAEJ,UAAUJ;AAC1D;;;;;;;;;;;;;;;;;;;ACtBA,sEAAsE;AACtE,EAAE;AACF,4EAA4E;AAC5E,0EAA0E;AAC1E,2EAA2E;AAC3E,yDAAyD;AACzD,EAAE;AACF,4EAA4E;AAC5E,yEAAyE;AACzE,sCAAsC;AACtC,EAAE;AACF,wEAAwE;AACxE,wEAAwE;AAEzB;AAC8B;AACrC;AACP;AACC;AAmElC,SAASa,iBAAiBC,KAAyB,EAAEC,QAAgB;IACnE,IAAI,CAACD,OAAO,OAAOC;IACnB,MAAM1B,IAAI2B,OAAOF;IACjB,OAAOE,OAAOC,QAAQ,CAAC5B,MAAMA,IAAI,IAAI6B,KAAKC,KAAK,CAAC9B,KAAK0B;AACvD;AAEA,wEAAwE;AACxE,2EAA2E;AAC3E,SAASK,oBAAoBN,KAAyB,EAAEC,QAAgB;IACtE,IAAID,UAAUrD,WAAW,OAAOsD;IAChC,MAAM1B,IAAI2B,OAAOF;IACjB,OAAOE,OAAOC,QAAQ,CAAC5B,MAAMA,KAAK,IAAI6B,KAAKC,KAAK,CAAC9B,KAAK0B;AACxD;AAEA,SAASM,UAAUP,KAAyB,EAAEC,QAAgB;IAC5D,MAAM1B,IAAIwB,iBAAiBC,OAAOC;IAClC,OAAO1B,KAAK,KAAKA,KAAK,QAASA,IAAI0B;AACrC;AAEA,SAASO,UAAUR,KAAyB,EAAEC,QAAiB;IAC7D,IAAID,UAAUrD,WAAW,OAAOsD;IAChC,MAAMQ,IAAIT,MAAMV,IAAI,GAAGoB,WAAW;IAClC,IAAID,MAAM,OAAOA,MAAM,QAAQ,OAAO;IACtC,IAAIA,MAAM,OAAOA,MAAM,SAAS,OAAO;IACvC,OAAOR;AACT;AAEA,SAASU,uBACPX,KAAyB,EACzBC,QAAmD;IAEnD,IAAI,CAACD,OAAO,OAAOC;IACnB,MAAMQ,IAAIT,MAAMV,IAAI,GAAGoB,WAAW;IAClC,IAAID,MAAM,SAASA,MAAM,WAAWA,MAAM,SAAS,OAAOA;IAC1D,OAAOR;AACT;AAEA,SAASW,cAAcZ,KAAyB,EAAEC,QAA6C;IAC7F,IAAI,CAACD,OAAO,OAAOC;IACnB,MAAMQ,IAAIT,MAAMV,IAAI,GAAGoB,WAAW;IAClC,IAAID,MAAM,WAAWA,MAAM,UAAUA,MAAM,UAAUA,MAAM,SAAS,OAAOA;IAC3E,OAAOR;AACT;AAEA,IAAIY,SAA8B;AAElC,SAASC,WAAWC,CAAS;IAC3B,OAAOA,EAAEC,UAAU,CAAC,OAAOD,EAAEE,OAAO,CAAC,MAAMnB,gDAAOA,MAAMiB;AAC1D;AAEO,SAASnE;IACd,IAAIiE,QAAQ,OAAOA;IACnB,MAAMzB,MAAM3B,QAAQ2B,GAAG;IACvB,MAAM8B,UAAUvB,qEAAUA;IAC1BkB,SAAS;QACP,UAAU;QACVM,MAAMZ,UAAUnB,IAAIgC,WAAW,IAAIhC,IAAIiC,IAAI,EAAEzB,2DAAYA,CAACuB,IAAI;QAC9DG,UAAU,CAAClC,IAAImC,eAAe,IAAInC,IAAIoC,QAAQ,IAAI5B,2DAAYA,CAAC0B,QAAQ,EAAEhC,IAAI,MAAMM,2DAAYA,CAAC0B,QAAQ;QACxGJ;QACAO,UAAUrC,IAAIsC,gBAAgB,GAAGZ,WAAW1B,IAAIsC,gBAAgB,IAAI7B,+CAAIA,CAACqB,SAAS;QAClFS,sBAAsB5B,iBAAiBX,IAAIwC,8BAA8B,EAAEhC,2DAAYA,CAAC+B,oBAAoB;QAC5GE,qBAAqB9B,iBAAiBX,IAAI0C,6BAA6B,EAAElC,2DAAYA,CAACiC,mBAAmB;QACzGE,sBAAsBhC,iBAAiBX,IAAI4C,8BAA8B,EAAEpC,2DAAYA,CAACmC,oBAAoB;QAC5GE,iBAAiBlC,iBAAiBX,IAAI8C,wBAAwB,EAAEtC,2DAAYA,CAACqC,eAAe;QAE5F,QAAQ;QACRE,gBAAgBpC,iBAAiBX,IAAIgD,sBAAsB,EAAExC,2DAAYA,CAACuC,cAAc;QACxFE,gBAAgB/B,oBAAoBlB,IAAIkD,wBAAwB,EAAE1C,2DAAYA,CAACyC,cAAc;QAC7FE,WAAWxC,iBAAiBX,IAAIoD,kBAAkB,EAAE5C,2DAAYA,CAAC2C,SAAS;QAC1EE,UAAU1C,iBAAiBX,IAAIsD,iBAAiB,EAAE9C,2DAAYA,CAAC6C,QAAQ;QACvEE,kBAAkB5C,iBAAiBX,IAAIwD,0BAA0B,EAAEhD,2DAAYA,CAAC+C,gBAAgB;QAChGE,eAAe9C,iBAAiBX,IAAI0D,sBAAsB,EAAElD,2DAAYA,CAACiD,aAAa;QACtFE,iBAAiBzC,oBAAoBlB,IAAI4D,wBAAwB,EAAEpD,2DAAYA,CAACmD,eAAe;QAC/FE,qBAAqB3C,oBAAoBlB,IAAI8D,4BAA4B,EAAEtD,2DAAYA,CAACqD,mBAAmB;QAC3GE,oBAAoB7C,oBAAoBlB,IAAIgE,2BAA2B,EAAExD,2DAAYA,CAACuD,kBAAkB;QACxGE,qBAAqBtD,iBAAiBX,IAAIkE,4BAA4B,EAAE1D,2DAAYA,CAACyD,mBAAmB;QAExG,QAAQ;QACRE,gBAAgBxD,iBAAiBX,IAAIoE,uBAAuB,EAAE5D,2DAAYA,CAAC2D,cAAc;QACzFE,gBAAgB1D,iBAAiBX,IAAIsE,uBAAuB,EAAE9D,2DAAYA,CAAC6D,cAAc;QACzFE,mBAAmB5D,iBAAiBX,IAAIwE,2BAA2B,EAAEhE,2DAAYA,CAAC+D,iBAAiB;QACnGE,sBAAsB9D,iBAAiBX,IAAI0E,8BAA8B,EAAElE,2DAAYA,CAACiE,oBAAoB;QAC5GE,oBAAoBhE,iBAAiBX,IAAI4E,4BAA4B,EAAEpE,2DAAYA,CAACmE,kBAAkB;QACtGE,mBAAmBlE,iBAAiBX,IAAI8E,2BAA2B,EAAEtE,2DAAYA,CAACqE,iBAAiB;QACnGE,oBAAoBpE,iBAAiBX,IAAIgF,4BAA4B,EAAExE,2DAAYA,CAACuE,kBAAkB;QAEtG,YAAY;QACZE,sBAAsBtE,iBAAiBX,IAAIkF,8BAA8B,EAAE1E,2DAAYA,CAACyE,oBAAoB;QAC5GpH,iBAAiB8C,iBAAiBX,IAAImF,wBAAwB,EAAE3E,2DAAYA,CAAC3C,eAAe;QAC5FE,kBAAkBmD,oBAAoBlB,IAAIoF,yBAAyB,EAAE5E,2DAAYA,CAACzC,gBAAgB;QAClGsH,oBAAoBjE,UAAUpB,IAAIsF,2BAA2B,EAAE;QAE/D,SAAS;QACTC,sBAAsB5E,iBAAiBX,IAAIwF,6BAA6B,EAAEhF,2DAAYA,CAAC+E,oBAAoB;QAE3G,UAAU;QACVE,cAAc9E,iBAAiBX,IAAI0F,qBAAqB,EAAElF,2DAAYA,CAACiF,YAAY;QACnFE,UAAUnE,cAAcxB,IAAI4F,gBAAgB,EAAEpF,2DAAYA,CAACmF,QAAQ;QAEnE,YAAY;QACZE,iBAAiBlF,iBAAiBX,IAAI8F,wBAAwB,EAAEtF,2DAAYA,CAACqF,eAAe;QAC5FE,mBAAmBpF,iBAAiBX,IAAIgG,2BAA2B,EAAExF,2DAAYA,CAACuF,iBAAiB;QAEnG,YAAY;QACZE,iBAAiBtF,iBAAiBX,IAAIkG,yBAAyB,EAAE1F,2DAAYA,CAACyF,eAAe;QAC7FE,sBAAsBxF,iBAAiBX,IAAIoG,+BAA+B,EAAE5F,2DAAYA,CAAC2F,oBAAoB;QAE7G,gCAAgC;QAChCE,2BAA2B9E,uBACzBvB,IAAIsG,kCAAkC,EACtC9F,2DAAYA,CAAC6F,yBAAyB;QAExCE,4BAA4B,CAACvG,IAAIwG,mCAAmC,IAAIhG,2DAAYA,CAAC+F,0BAA0B,EAAErG,IAAI;QACrHuG,0BAA0BvF,oBAAoBlB,IAAI0G,kCAAkC,EAAElG,2DAAYA,CAACiG,wBAAwB;QAC3HE,qBAAqBzF,oBAAoBlB,IAAI4G,4BAA4B,EAAEpG,2DAAYA,CAACmG,mBAAmB;QAE3G,eAAe;QACfE,SAAS9G,iEAAUA;QACnB+G,gBAAgB3G,wEAAiBA;QACjC4G,UAAU1G,qEAAcA;IAC1B;IACA,OAAOoB;AACT;AAEA,mHAAmH,GAC5G,SAASuF;IACdvF,SAAS;AACX","sources":["webpack://@circuitwall/jarela/./lib/utils/global-state.ts","webpack://@circuitwall/jarela/./lib/lifecycle/shutdown.ts","webpack://@circuitwall/jarela/./lib/env/app-config.ts","webpack://@circuitwall/jarela/./lib/env/config.ts"],"sourcesContent":["// Pin a piece of state to globalThis so it survives Next.js dev hot-reload.\n//\n// Without this, every code edit re-evaluates the module, replacing the\n// in-memory state with empty containers — but any active closure still\n// references the OLD set, so listeners/timers/maps go silently dead.\n// The globalThis trick is the standard Next pattern for singletons.\n//\n// `key` must be unique across the app (it lives on globalThis); pick a\n// \"__jarela_<name>\" prefix to keep the namespace tidy.\nexport function getOrCreateGlobal<T>(key: string, factory: () => T): T {\n const g = globalThis as unknown as Record<string, unknown>;\n if (g[key] === undefined) g[key] = factory();\n return g[key] as T;\n}\n","// Graceful shutdown coordinator.\n//\n// Registers SIGINT / SIGTERM (and SIGBREAK on Windows) so Ctrl-C in the\n// foreground and `kill`/`systemctl stop`/Task Scheduler \"End task\" all\n// trigger the same drain sequence:\n//\n// 1. abort every in-flight LangGraph run so stream loops bail out\n// 2. stop the scheduler tick so no new firings start\n// 3. close every bridge adapter (WhatsApp WS, future kinds) cleanly\n// 4. wait briefly for the runs to actually finish flushing\n// 5. close the SQLite handle so WAL is checkpointed\n// 6. exit 0\n//\n// A hard timeout aborts the drain if any subsystem hangs — the supervisor\n// (Task Scheduler / systemd / installed-launcher.ps1) will then restart us\n// instead of leaving a zombie holding the port.\n//\n// Wired from `instrumentation.ts` so it runs once per server process at\n// boot. Idempotent: only the first call installs handlers.\n\nimport { getOrCreateGlobal } from \"@/lib/utils/global-state\";\nimport { getConfig } from \"@/lib/env/config\";\n\ninterface ShutdownState {\n registered: boolean;\n shuttingDown: boolean;\n}\nconst state = getOrCreateGlobal<ShutdownState>(\"__jarela_shutdown\", () => ({\n registered: false,\n shuttingDown: false,\n}));\n\n// JARELA_SHUTDOWN_DRAIN_MS / JARELA_SHUTDOWN_SETTLE_MS override these.\n// Captured at handler-install time (boot); these don't hot-reload because\n// the handlers close over the values.\nconst HARD_TIMEOUT_MS = getConfig().shutdownDrainMs;\nconst RUN_DRAIN_MS = getConfig().shutdownSettleMs;\n\nexport function registerShutdownHandlers(): void {\n if (state.registered) return;\n state.registered = true;\n\n const handler = (signal: NodeJS.Signals) => {\n if (state.shuttingDown) {\n // Second signal while already draining: operator is impatient, exit\n // immediately. Mirrors the behaviour every well-behaved daemon has —\n // first Ctrl-C drains, second Ctrl-C kills.\n console.log(`[jarela] received ${signal} during shutdown; forcing exit.`);\n process.exit(130);\n }\n state.shuttingDown = true;\n console.log(`[jarela] ${signal} received, draining…`);\n void runShutdown().catch((err) => {\n console.error(`[jarela] shutdown error:`, err);\n process.exit(1);\n });\n };\n\n // Replace any default handlers Next's standalone server may have\n // installed for these signals. Next's default just calls\n // `server.close(() => process.exit(0))`, which races our drain and can\n // exit the process before bridges/DB have flushed. We take over and\n // exit ourselves once drain completes.\n process.removeAllListeners(\"SIGINT\");\n process.removeAllListeners(\"SIGTERM\");\n process.on(\"SIGINT\", handler);\n process.on(\"SIGTERM\", handler);\n if (process.platform === \"win32\") {\n // Ctrl-Break in a foreground PowerShell session lands as SIGBREAK,\n // not SIGINT. Task Scheduler \"End task\" delivers SIGBREAK as well.\n process.removeAllListeners(\"SIGBREAK\");\n process.on(\"SIGBREAK\", handler);\n }\n}\n\nasync function runShutdown(): Promise<void> {\n // Safety net: if any drain step deadlocks (e.g. a bridge adapter's\n // socket.close() never resolves), force-exit so the supervisor can\n // restart cleanly instead of holding the port forever.\n const forceExit = setTimeout(() => {\n console.warn(`[jarela] drain exceeded ${HARD_TIMEOUT_MS}ms; forcing exit.`);\n process.exit(130);\n }, HARD_TIMEOUT_MS);\n forceExit.unref?.();\n\n // 1. Abort in-flight LLM runs. The route's stream loop watches this\n // AbortController and exits early, emitting a trailing error chunk.\n try {\n const { abortAllRuns } = await import(\"@/lib/agents/run-registry\");\n const n = abortAllRuns(\"server_shutdown\");\n if (n > 0) console.log(`[jarela] aborted ${n} in-flight run(s).`);\n } catch (err) {\n console.error(\"[jarela] aborting runs failed:\", err);\n }\n\n // 2. Stop the scheduler so no firing kicks off mid-drain.\n try {\n const { stopScheduler } = await import(\"@/lib/scheduler\");\n stopScheduler();\n } catch (err) {\n console.error(\"[jarela] stopping scheduler failed:\", err);\n }\n\n // 2b. Drain trigger handlers — closes fs.watch watchers and any other\n // handler that has timers / sockets attached. Independent of the\n // scheduler tick (those are run-loop ownership; this is per-handler\n // ownership of OS resources).\n try {\n const { stopAllTriggerHandlers } = await import(\"@/lib/triggers\");\n await stopAllTriggerHandlers();\n } catch (err) {\n console.error(\"[jarela] stopping trigger handlers failed:\", err);\n }\n\n // 3. Close bridges (WhatsApp Baileys WS, etc).\n try {\n const { stopAllBridges } = await import(\"@/lib/bridges/runtime\");\n await stopAllBridges();\n } catch (err) {\n console.error(\"[jarela] stopping bridges failed:\", err);\n }\n\n // 4. Give aborted runs a beat to actually finish — they were signalled\n // in step 1, but the `finally` blocks need ticks to flush trailing\n // events and persist the partial assistant message.\n try {\n const { waitForRunsToSettle } = await import(\"@/lib/agents/run-registry\");\n const stuck = await waitForRunsToSettle(RUN_DRAIN_MS);\n if (stuck > 0) console.warn(`[jarela] ${stuck} run(s) still active after drain window.`);\n } catch (err) {\n console.error(\"[jarela] waiting for runs failed:\", err);\n }\n\n // 4b. Stop the async-tool-results sweeper. Holds a setInterval that\n // would otherwise keep the event loop alive past closeDb().\n try {\n const { stopAsyncResults } = await import(\"@/lib/tools/async-results\");\n stopAsyncResults();\n } catch (err) {\n console.error(\"[jarela] stopping async-results sweeper failed:\", err);\n }\n\n // 5. Close the DB. WAL is checkpointed so the next boot is fast and we\n // leave no stale -shm/-wal sidecars on disk.\n try {\n const { closeDb } = await import(\"@/lib/db\");\n closeDb();\n } catch (err) {\n console.error(\"[jarela] closing db failed:\", err);\n }\n\n clearTimeout(forceExit);\n console.log(\"[jarela] shutdown complete.\");\n process.exit(0);\n}\n","// Branding knobs sourced from NEXT_PUBLIC_* env vars so forks can rebrand\n// the app without patching source. NEXT_PUBLIC_* is the right\n// channel here because Next.js inlines these at build time, which lets\n// client components read them directly (no React Context, no server\n// round-trip). Server-only modules read the same keys at runtime.\n//\n// Keep this module client-safe — no Node-only imports, no DB/FS access.\n\nconst DEFAULT_APP_NAME = \"Jarela\";\nconst DEFAULT_APP_DESCRIPTION = \"Jarela — local chat interface for LangGraph agents\";\nconst DEFAULT_ISSUE_URL = \"https://github.com/CircuitWall/jarela/issues/new\";\n\nexport function getAppName(): string {\n return process.env.NEXT_PUBLIC_APP_NAME?.trim() || DEFAULT_APP_NAME;\n}\n\nexport function getAppDescription(): string {\n return process.env.NEXT_PUBLIC_APP_DESCRIPTION?.trim() || DEFAULT_APP_DESCRIPTION;\n}\n\nexport function getAppIssueUrl(): string {\n return process.env.NEXT_PUBLIC_APP_ISSUE_URL?.trim() || DEFAULT_ISSUE_URL;\n}\n","// Central runtime configuration, resolved from environment variables.\n//\n// All operational knobs (port, host, data dir, timeouts, agent limits) flow\n// through this module so there is exactly one place documenting which env\n// vars Jarela respects and what the defaults are. Code MUST NOT read these\n// `process.env` keys directly — import `config` instead.\n//\n// Resolution order for every entry: explicit JARELA_* var → legacy/standard\n// var (where one exists, e.g. PORT/HOSTNAME for Next.js compatibility) →\n// schema default (lib/env/schema.ts).\n//\n// Values are resolved lazily on first read and cached. Tests + the env-\n// override PATCH endpoint must call `resetConfigCache()` between cases.\n\nimport { getDataDir } from \"@/lib/db/data-dir\";\nimport { getAppName, getAppDescription, getAppIssueUrl } from \"./app-config\";\nimport { ENV_DEFAULTS } from \"./schema\";\nimport { join } from \"node:path\";\nimport { homedir } from \"node:os\";\n\nexport interface JarelaConfig {\n // network\n readonly port: number;\n readonly hostname: string;\n readonly dataDir: string;\n readonly toolsDir: string;\n readonly httpRequestTimeoutMs: number;\n readonly sseConnectTimeoutMs: number;\n readonly healthCheckTimeoutMs: number;\n readonly httpMaxAttempts: number;\n\n // agent\n readonly recursionLimit: number;\n readonly llmStreamMaxMs: number;\n readonly runIdleMs: number;\n readonly runMaxMs: number;\n readonly runRegistryTtlMs: number;\n readonly runBufferSize: number;\n readonly maxStallRetries: number;\n readonly maxTransientRetries: number;\n readonly maxDelegationDepth: number;\n readonly streamParseTripwire: number;\n\n // tools\n readonly voiceTimeoutMs: number;\n readonly imageTimeoutMs: number;\n readonly fetchToolMaxBytes: number;\n readonly mcpRegistryTimeoutMs: number;\n readonly execMaxOutputBytes: number;\n readonly filesMaxReadBytes: number;\n readonly filesMaxWriteBytes: number;\n\n // lifecycle\n readonly updateCheckTimeoutMs: number;\n readonly shutdownDrainMs: number;\n readonly shutdownSettleMs: number;\n readonly disableUpdateCheck: boolean;\n\n // limits\n readonly notificationRingSize: number;\n\n // logging\n readonly logsRingSize: number;\n readonly logLevel: \"debug\" | \"info\" | \"warn\" | \"error\";\n\n // scheduler\n readonly schedulerTickMs: number;\n readonly fastRemoteSweepMs: number;\n\n // documents\n readonly docMaxFileBytes: number;\n readonly docMaxFilesPerSource: number;\n\n // anti-hallucination detector\n readonly hallucinationDetectorMode: \"off\" | \"regex\" | \"model\";\n readonly hallucinationDetectorModel: string;\n readonly citationCheckerTailChars: number;\n readonly citationManifestMax: number;\n\n // app metadata\n readonly appName: string;\n readonly appDescription: string;\n readonly issueUrl: string;\n}\n\nfunction parsePositiveInt(value: string | undefined, fallback: number): number {\n if (!value) return fallback;\n const n = Number(value);\n return Number.isFinite(n) && n > 0 ? Math.floor(n) : fallback;\n}\n\n// Like parsePositiveInt but accepts 0 as a valid value (used to disable\n// deadlines explicitly). Negative / NaN still fall through to the default.\nfunction parseNonNegativeInt(value: string | undefined, fallback: number): number {\n if (value === undefined) return fallback;\n const n = Number(value);\n return Number.isFinite(n) && n >= 0 ? Math.floor(n) : fallback;\n}\n\nfunction parsePort(value: string | undefined, fallback: number): number {\n const n = parsePositiveInt(value, fallback);\n return n >= 1 && n <= 65_535 ? n : fallback;\n}\n\nfunction parseBool(value: string | undefined, fallback: boolean): boolean {\n if (value === undefined) return fallback;\n const v = value.trim().toLowerCase();\n if (v === \"1\" || v === \"true\") return true;\n if (v === \"0\" || v === \"false\") return false;\n return fallback;\n}\n\nfunction parseHallucinationMode(\n value: string | undefined,\n fallback: JarelaConfig[\"hallucinationDetectorMode\"],\n): JarelaConfig[\"hallucinationDetectorMode\"] {\n if (!value) return fallback;\n const v = value.trim().toLowerCase();\n if (v === \"off\" || v === \"regex\" || v === \"model\") return v;\n return fallback;\n}\n\nfunction parseLogLevel(value: string | undefined, fallback: \"debug\" | \"info\" | \"warn\" | \"error\"): JarelaConfig[\"logLevel\"] {\n if (!value) return fallback;\n const v = value.trim().toLowerCase();\n if (v === \"debug\" || v === \"info\" || v === \"warn\" || v === \"error\") return v;\n return fallback;\n}\n\nlet cached: JarelaConfig | null = null;\n\nfunction expandHome(p: string): string {\n return p.startsWith(\"~\") ? p.replace(/^~/, homedir()) : p;\n}\n\nexport function getConfig(): JarelaConfig {\n if (cached) return cached;\n const env = process.env;\n const dataDir = getDataDir();\n cached = {\n // network\n port: parsePort(env.JARELA_PORT ?? env.PORT, ENV_DEFAULTS.port),\n hostname: (env.JARELA_HOSTNAME ?? env.HOSTNAME ?? ENV_DEFAULTS.hostname).trim() || ENV_DEFAULTS.hostname,\n dataDir,\n toolsDir: env.JARELA_TOOLS_DIR ? expandHome(env.JARELA_TOOLS_DIR) : join(dataDir, \"tools\"),\n httpRequestTimeoutMs: parsePositiveInt(env.JARELA_HTTP_REQUEST_TIMEOUT_MS, ENV_DEFAULTS.httpRequestTimeoutMs),\n sseConnectTimeoutMs: parsePositiveInt(env.JARELA_SSE_CONNECT_TIMEOUT_MS, ENV_DEFAULTS.sseConnectTimeoutMs),\n healthCheckTimeoutMs: parsePositiveInt(env.JARELA_HEALTH_CHECK_TIMEOUT_MS, ENV_DEFAULTS.healthCheckTimeoutMs),\n httpMaxAttempts: parsePositiveInt(env.JARELA_HTTP_MAX_ATTEMPTS, ENV_DEFAULTS.httpMaxAttempts),\n\n // agent\n recursionLimit: parsePositiveInt(env.JARELA_RECURSION_LIMIT, ENV_DEFAULTS.recursionLimit),\n llmStreamMaxMs: parseNonNegativeInt(env.JARELA_LLM_STREAM_MAX_MS, ENV_DEFAULTS.llmStreamMaxMs),\n runIdleMs: parsePositiveInt(env.JARELA_RUN_IDLE_MS, ENV_DEFAULTS.runIdleMs),\n runMaxMs: parsePositiveInt(env.JARELA_RUN_MAX_MS, ENV_DEFAULTS.runMaxMs),\n runRegistryTtlMs: parsePositiveInt(env.JARELA_RUN_REGISTRY_TTL_MS, ENV_DEFAULTS.runRegistryTtlMs),\n runBufferSize: parsePositiveInt(env.JARELA_RUN_BUFFER_SIZE, ENV_DEFAULTS.runBufferSize),\n maxStallRetries: parseNonNegativeInt(env.JARELA_MAX_STALL_RETRIES, ENV_DEFAULTS.maxStallRetries),\n maxTransientRetries: parseNonNegativeInt(env.JARELA_MAX_TRANSIENT_RETRIES, ENV_DEFAULTS.maxTransientRetries),\n maxDelegationDepth: parseNonNegativeInt(env.JARELA_MAX_DELEGATION_DEPTH, ENV_DEFAULTS.maxDelegationDepth),\n streamParseTripwire: parsePositiveInt(env.JARELA_STREAM_PARSE_TRIPWIRE, ENV_DEFAULTS.streamParseTripwire),\n\n // tools\n voiceTimeoutMs: parsePositiveInt(env.JARELA_VOICE_TIMEOUT_MS, ENV_DEFAULTS.voiceTimeoutMs),\n imageTimeoutMs: parsePositiveInt(env.JARELA_IMAGE_TIMEOUT_MS, ENV_DEFAULTS.imageTimeoutMs),\n fetchToolMaxBytes: parsePositiveInt(env.JARELA_FETCH_TOOL_MAX_BYTES, ENV_DEFAULTS.fetchToolMaxBytes),\n mcpRegistryTimeoutMs: parsePositiveInt(env.JARELA_MCP_REGISTRY_TIMEOUT_MS, ENV_DEFAULTS.mcpRegistryTimeoutMs),\n execMaxOutputBytes: parsePositiveInt(env.JARELA_EXEC_MAX_OUTPUT_BYTES, ENV_DEFAULTS.execMaxOutputBytes),\n filesMaxReadBytes: parsePositiveInt(env.JARELA_FILES_MAX_READ_BYTES, ENV_DEFAULTS.filesMaxReadBytes),\n filesMaxWriteBytes: parsePositiveInt(env.JARELA_FILES_MAX_WRITE_BYTES, ENV_DEFAULTS.filesMaxWriteBytes),\n\n // lifecycle\n updateCheckTimeoutMs: parsePositiveInt(env.JARELA_UPDATE_CHECK_TIMEOUT_MS, ENV_DEFAULTS.updateCheckTimeoutMs),\n shutdownDrainMs: parsePositiveInt(env.JARELA_SHUTDOWN_DRAIN_MS, ENV_DEFAULTS.shutdownDrainMs),\n shutdownSettleMs: parseNonNegativeInt(env.JARELA_SHUTDOWN_SETTLE_MS, ENV_DEFAULTS.shutdownSettleMs),\n disableUpdateCheck: parseBool(env.JARELA_DISABLE_UPDATE_CHECK, false),\n\n // limits\n notificationRingSize: parsePositiveInt(env.JARELA_NOTIFICATION_RING_SIZE, ENV_DEFAULTS.notificationRingSize),\n\n // logging\n logsRingSize: parsePositiveInt(env.JARELA_LOGS_RING_SIZE, ENV_DEFAULTS.logsRingSize),\n logLevel: parseLogLevel(env.JARELA_LOG_LEVEL, ENV_DEFAULTS.logLevel),\n\n // scheduler\n schedulerTickMs: parsePositiveInt(env.JARELA_SCHEDULER_TICK_MS, ENV_DEFAULTS.schedulerTickMs),\n fastRemoteSweepMs: parsePositiveInt(env.JARELA_FAST_REMOTE_SWEEP_MS, ENV_DEFAULTS.fastRemoteSweepMs),\n\n // documents\n docMaxFileBytes: parsePositiveInt(env.JARELA_DOC_MAX_FILE_BYTES, ENV_DEFAULTS.docMaxFileBytes),\n docMaxFilesPerSource: parsePositiveInt(env.JARELA_DOC_MAX_FILES_PER_SOURCE, ENV_DEFAULTS.docMaxFilesPerSource),\n\n // anti-hallucination classifier\n hallucinationDetectorMode: parseHallucinationMode(\n env.JARELA_HALLUCINATION_DETECTOR_MODE,\n ENV_DEFAULTS.hallucinationDetectorMode,\n ),\n hallucinationDetectorModel: (env.JARELA_HALLUCINATION_DETECTOR_MODEL ?? ENV_DEFAULTS.hallucinationDetectorModel).trim(),\n citationCheckerTailChars: parseNonNegativeInt(env.JARELA_CITATION_CHECKER_TAIL_CHARS, ENV_DEFAULTS.citationCheckerTailChars),\n citationManifestMax: parseNonNegativeInt(env.JARELA_CITATION_MANIFEST_MAX, ENV_DEFAULTS.citationManifestMax),\n\n // app metadata\n appName: getAppName(),\n appDescription: getAppDescription(),\n issueUrl: getAppIssueUrl(),\n };\n return cached;\n}\n\n/** Drop the memoised config so the next read picks up env edits. Used by tests + the env-override PATCH endpoint. */\nexport function resetConfigCache(): void {\n cached = null;\n}\n"],"names":["getOrCreateGlobal","key","factory","g","globalThis","undefined","getConfig","state","registered","shuttingDown","HARD_TIMEOUT_MS","shutdownDrainMs","RUN_DRAIN_MS","shutdownSettleMs","registerShutdownHandlers","handler","signal","console","log","process","exit","runShutdown","catch","err","error","removeAllListeners","on","platform","forceExit","setTimeout","warn","unref","abortAllRuns","n","stopScheduler","stopAllTriggerHandlers","stopAllBridges","waitForRunsToSettle","stuck","stopAsyncResults","closeDb","clearTimeout","DEFAULT_APP_NAME","DEFAULT_APP_DESCRIPTION","DEFAULT_ISSUE_URL","getAppName","env","NEXT_PUBLIC_APP_NAME","trim","getAppDescription","NEXT_PUBLIC_APP_DESCRIPTION","getAppIssueUrl","NEXT_PUBLIC_APP_ISSUE_URL","getDataDir","ENV_DEFAULTS","join","homedir","parsePositiveInt","value","fallback","Number","isFinite","Math","floor","parseNonNegativeInt","parsePort","parseBool","v","toLowerCase","parseHallucinationMode","parseLogLevel","cached","expandHome","p","startsWith","replace","dataDir","port","JARELA_PORT","PORT","hostname","JARELA_HOSTNAME","HOSTNAME","toolsDir","JARELA_TOOLS_DIR","httpRequestTimeoutMs","JARELA_HTTP_REQUEST_TIMEOUT_MS","sseConnectTimeoutMs","JARELA_SSE_CONNECT_TIMEOUT_MS","healthCheckTimeoutMs","JARELA_HEALTH_CHECK_TIMEOUT_MS","httpMaxAttempts","JARELA_HTTP_MAX_ATTEMPTS","recursionLimit","JARELA_RECURSION_LIMIT","llmStreamMaxMs","JARELA_LLM_STREAM_MAX_MS","runIdleMs","JARELA_RUN_IDLE_MS","runMaxMs","JARELA_RUN_MAX_MS","runRegistryTtlMs","JARELA_RUN_REGISTRY_TTL_MS","runBufferSize","JARELA_RUN_BUFFER_SIZE","maxStallRetries","JARELA_MAX_STALL_RETRIES","maxTransientRetries","JARELA_MAX_TRANSIENT_RETRIES","maxDelegationDepth","JARELA_MAX_DELEGATION_DEPTH","streamParseTripwire","JARELA_STREAM_PARSE_TRIPWIRE","voiceTimeoutMs","JARELA_VOICE_TIMEOUT_MS","imageTimeoutMs","JARELA_IMAGE_TIMEOUT_MS","fetchToolMaxBytes","JARELA_FETCH_TOOL_MAX_BYTES","mcpRegistryTimeoutMs","JARELA_MCP_REGISTRY_TIMEOUT_MS","execMaxOutputBytes","JARELA_EXEC_MAX_OUTPUT_BYTES","filesMaxReadBytes","JARELA_FILES_MAX_READ_BYTES","filesMaxWriteBytes","JARELA_FILES_MAX_WRITE_BYTES","updateCheckTimeoutMs","JARELA_UPDATE_CHECK_TIMEOUT_MS","JARELA_SHUTDOWN_DRAIN_MS","JARELA_SHUTDOWN_SETTLE_MS","disableUpdateCheck","JARELA_DISABLE_UPDATE_CHECK","notificationRingSize","JARELA_NOTIFICATION_RING_SIZE","logsRingSize","JARELA_LOGS_RING_SIZE","logLevel","JARELA_LOG_LEVEL","schedulerTickMs","JARELA_SCHEDULER_TICK_MS","fastRemoteSweepMs","JARELA_FAST_REMOTE_SWEEP_MS","docMaxFileBytes","JARELA_DOC_MAX_FILE_BYTES","docMaxFilesPerSource","JARELA_DOC_MAX_FILES_PER_SOURCE","hallucinationDetectorMode","JARELA_HALLUCINATION_DETECTOR_MODE","hallucinationDetectorModel","JARELA_HALLUCINATION_DETECTOR_MODEL","citationCheckerTailChars","JARELA_CITATION_CHECKER_TAIL_CHARS","citationManifestMax","JARELA_CITATION_MANIFEST_MAX","appName","appDescription","issueUrl","resetConfigCache"],"sourceRoot":"","ignoreList":[]}
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
"use strict";
|
|
2
|
-
exports.id =
|
|
3
|
-
exports.ids = [
|
|
2
|
+
exports.id = 9557;
|
|
3
|
+
exports.ids = [9557];
|
|
4
4
|
exports.modules = {
|
|
5
5
|
|
|
6
6
|
/***/ 108:
|
|
@@ -774,6 +774,18 @@ const Globe = (0,_createLucideIcon_mjs__WEBPACK_IMPORTED_MODULE_0__/* ["default"
|
|
|
774
774
|
//# sourceMappingURL=globe.mjs.map
|
|
775
775
|
|
|
776
776
|
|
|
777
|
+
/***/ }),
|
|
778
|
+
|
|
779
|
+
/***/ 19099:
|
|
780
|
+
/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
|
|
781
|
+
|
|
782
|
+
/* harmony import */ var _client_components_navigation__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(54839);
|
|
783
|
+
/* harmony import */ var _client_components_navigation__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(_client_components_navigation__WEBPACK_IMPORTED_MODULE_0__);
|
|
784
|
+
/* harmony reexport (checked) */ if(__webpack_require__.o(_client_components_navigation__WEBPACK_IMPORTED_MODULE_0__, "useRouter")) __webpack_require__.d(__webpack_exports__, { useRouter: function() { return _client_components_navigation__WEBPACK_IMPORTED_MODULE_0__.useRouter; } });
|
|
785
|
+
|
|
786
|
+
|
|
787
|
+
//# sourceMappingURL=navigation.js.map
|
|
788
|
+
|
|
777
789
|
/***/ }),
|
|
778
790
|
|
|
779
791
|
/***/ 29503:
|
|
@@ -30358,4 +30370,4 @@ const CircleCheck = (0,_createLucideIcon_mjs__WEBPACK_IMPORTED_MODULE_0__/* ["de
|
|
|
30358
30370
|
|
|
30359
30371
|
};
|
|
30360
30372
|
;
|
|
30361
|
-
//# sourceMappingURL=
|
|
30373
|
+
//# sourceMappingURL=9557.js.map
|