@circuitwall/jarela 0.7.2 → 0.7.3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (91) hide show
  1. package/.next/standalone/.next/BUILD_ID +1 -1
  2. package/.next/standalone/.next/build-manifest.json +2 -2
  3. package/.next/standalone/.next/prerender-manifest.json +3 -3
  4. package/.next/standalone/.next/server/app/_global-error/page_client-reference-manifest.js +1 -1
  5. package/.next/standalone/.next/server/app/_global-error.html +1 -1
  6. package/.next/standalone/.next/server/app/_global-error.rsc +1 -1
  7. package/.next/standalone/.next/server/app/_global-error.segments/_full.segment.rsc +1 -1
  8. package/.next/standalone/.next/server/app/_global-error.segments/_global-error/__PAGE__.segment.rsc +1 -1
  9. package/.next/standalone/.next/server/app/_global-error.segments/_global-error.segment.rsc +1 -1
  10. package/.next/standalone/.next/server/app/_global-error.segments/_head.segment.rsc +1 -1
  11. package/.next/standalone/.next/server/app/_global-error.segments/_index.segment.rsc +1 -1
  12. package/.next/standalone/.next/server/app/_global-error.segments/_tree.segment.rsc +1 -1
  13. package/.next/standalone/.next/server/app/_not-found/page_client-reference-manifest.js +1 -1
  14. package/.next/standalone/.next/server/app/_not-found.html +2 -2
  15. package/.next/standalone/.next/server/app/_not-found.rsc +2 -2
  16. package/.next/standalone/.next/server/app/_not-found.segments/_full.segment.rsc +2 -2
  17. package/.next/standalone/.next/server/app/_not-found.segments/_head.segment.rsc +1 -1
  18. package/.next/standalone/.next/server/app/_not-found.segments/_index.segment.rsc +2 -2
  19. package/.next/standalone/.next/server/app/_not-found.segments/_not-found/__PAGE__.segment.rsc +1 -1
  20. package/.next/standalone/.next/server/app/_not-found.segments/_not-found.segment.rsc +1 -1
  21. package/.next/standalone/.next/server/app/_not-found.segments/_tree.segment.rsc +2 -2
  22. package/.next/standalone/.next/server/app/api/v1/agents/[id]/compact/route.js +51 -35
  23. package/.next/standalone/.next/server/app/api/v1/agents/[id]/compact/route.js.map +1 -1
  24. package/.next/standalone/.next/server/app/api/v1/threads/[thread_id]/run/route.js +2 -2
  25. package/.next/standalone/.next/server/app/index.html +2 -2
  26. package/.next/standalone/.next/server/app/index.rsc +3 -3
  27. package/.next/standalone/.next/server/app/index.segments/__PAGE__.segment.rsc +2 -2
  28. package/.next/standalone/.next/server/app/index.segments/_full.segment.rsc +3 -3
  29. package/.next/standalone/.next/server/app/index.segments/_head.segment.rsc +1 -1
  30. package/.next/standalone/.next/server/app/index.segments/_index.segment.rsc +2 -2
  31. package/.next/standalone/.next/server/app/index.segments/_tree.segment.rsc +2 -2
  32. package/.next/standalone/.next/server/app/page.js +515 -104
  33. package/.next/standalone/.next/server/app/page.js.map +1 -1
  34. package/.next/standalone/.next/server/app/page_client-reference-manifest.js +1 -1
  35. package/.next/standalone/.next/server/app/setup/page_client-reference-manifest.js +1 -1
  36. package/.next/standalone/.next/server/app/setup.html +1 -1
  37. package/.next/standalone/.next/server/app/setup.rsc +2 -2
  38. package/.next/standalone/.next/server/app/setup.segments/_full.segment.rsc +2 -2
  39. package/.next/standalone/.next/server/app/setup.segments/_head.segment.rsc +1 -1
  40. package/.next/standalone/.next/server/app/setup.segments/_index.segment.rsc +2 -2
  41. package/.next/standalone/.next/server/app/setup.segments/_tree.segment.rsc +2 -2
  42. package/.next/standalone/.next/server/app/setup.segments/setup/__PAGE__.segment.rsc +1 -1
  43. package/.next/standalone/.next/server/app/setup.segments/setup.segment.rsc +1 -1
  44. package/.next/standalone/.next/server/chunks/1683.js +26 -16
  45. package/.next/standalone/.next/server/chunks/1683.js.map +1 -1
  46. package/.next/standalone/.next/server/chunks/{317.js → 5432.js} +11100 -10858
  47. package/.next/standalone/.next/server/chunks/5432.js.map +1 -0
  48. package/.next/standalone/.next/server/chunks/7885.js +606 -353
  49. package/.next/standalone/.next/server/chunks/7885.js.map +1 -1
  50. package/.next/standalone/.next/server/chunks/8135.js +59 -16
  51. package/.next/standalone/.next/server/chunks/8135.js.map +1 -1
  52. package/.next/standalone/.next/server/chunks/9032.js +3 -3
  53. package/.next/standalone/.next/server/chunks/9032.js.map +1 -1
  54. package/.next/standalone/.next/server/instrumentation.js +3 -3
  55. package/.next/standalone/.next/server/instrumentation.js.map +1 -1
  56. package/.next/standalone/.next/server/middleware-build-manifest.js +2 -2
  57. package/.next/standalone/.next/server/pages/404.html +2 -2
  58. package/.next/standalone/.next/server/pages/500.html +1 -1
  59. package/.next/standalone/.next/server/server-reference-manifest.json +1 -1
  60. package/.next/standalone/.next/static/chunks/app/{page-a20902703c0a4f10.js → page-9fb006074fb13526.js} +582 -171
  61. package/.next/standalone/.next/static/chunks/app/page-9fb006074fb13526.js.map +1 -0
  62. package/.next/standalone/.next/static/css/5507dbe1cdc6c599.css +5 -0
  63. package/.next/standalone/.next/static/css/5507dbe1cdc6c599.css.map +1 -0
  64. package/.next/standalone/package.json +1 -1
  65. package/CHANGELOG.md +11 -0
  66. package/README.md +83 -1
  67. package/api/types.ts +7 -0
  68. package/app/api/v1/agents/[id]/compact/route.ts +2 -40
  69. package/components/bridges/BridgeEditor.tsx +8 -0
  70. package/components/chat/MessageBubble.tsx +3 -36
  71. package/components/models/ModelEditor.tsx +141 -0
  72. package/components/scheduled-tasks/ScheduledTasksPanel.tsx +5 -0
  73. package/components/scheduled-tasks/WatchersSection.tsx +5 -0
  74. package/lib/agents/context-budget.test.ts +128 -0
  75. package/lib/agents/context-budget.ts +128 -0
  76. package/lib/agents/conversation-summary.test.ts +68 -0
  77. package/lib/agents/conversation-summary.ts +51 -0
  78. package/lib/agents/run-thread.ts +112 -2
  79. package/lib/bridges/dispatcher.test.ts +134 -0
  80. package/lib/bridges/dispatcher.ts +34 -16
  81. package/lib/bridges/message-role.test.ts +83 -0
  82. package/lib/bridges/message-role.ts +46 -0
  83. package/lib/triggers/handlers/watcher.test.ts +23 -4
  84. package/lib/triggers/handlers/watcher.ts +56 -8
  85. package/package.json +1 -1
  86. package/.next/standalone/.next/server/chunks/317.js.map +0 -1
  87. package/.next/standalone/.next/static/chunks/app/page-a20902703c0a4f10.js.map +0 -1
  88. package/.next/standalone/.next/static/css/cc66c456aba91258.css +0 -5
  89. package/.next/standalone/.next/static/css/cc66c456aba91258.css.map +0 -1
  90. /package/.next/standalone/.next/static/{IauO0rNZkUVPX834k-SBa → AbCOWpaxP4v4lUSeFWWYz}/_buildManifest.js +0 -0
  91. /package/.next/standalone/.next/static/{IauO0rNZkUVPX834k-SBa → AbCOWpaxP4v4lUSeFWWYz}/_ssgManifest.js +0 -0
@@ -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"],"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\";\n\ninterface ShutdownState {\n registered: boolean;\n shuttingDown: boolean;\n}\nconst state = getOrCreateGlobal<ShutdownState>(\"__jarela_shutdown\", () => ({\n registered: false,\n shuttingDown: false,\n}));\n\nconst HARD_TIMEOUT_MS = 10_000;\nconst RUN_DRAIN_MS = 3_000;\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"],"names":["getOrCreateGlobal","key","factory","g","globalThis","undefined","state","registered","shuttingDown","HARD_TIMEOUT_MS","RUN_DRAIN_MS","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"],"sourceRoot":"","ignoreList":[]}
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"],"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\";\n\ninterface ShutdownState {\n registered: boolean;\n shuttingDown: boolean;\n}\nconst state = getOrCreateGlobal<ShutdownState>(\"__jarela_shutdown\", () => ({\n registered: false,\n shuttingDown: false,\n}));\n\nconst HARD_TIMEOUT_MS = 10_000;\nconst RUN_DRAIN_MS = 3_000;\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"],"names":["getOrCreateGlobal","key","factory","g","globalThis","undefined","state","registered","shuttingDown","HARD_TIMEOUT_MS","RUN_DRAIN_MS","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"],"sourceRoot":"","ignoreList":[]}
@@ -145,18 +145,18 @@ async function register() {
145
145
  const { registerShutdownHandlers } = await __webpack_require__.e(/* import() */ 9032).then(__webpack_require__.bind(__webpack_require__, 39032));
146
146
  registerShutdownHandlers();
147
147
  // Dynamic import so this module stays edge-safe.
148
- const { initTools } = await Promise.all(/* import() */[__webpack_require__.e(1218), __webpack_require__.e(6447), __webpack_require__.e(5300), __webpack_require__.e(292), __webpack_require__.e(423), __webpack_require__.e(317), __webpack_require__.e(8370)]).then(__webpack_require__.bind(__webpack_require__, 63609));
148
+ const { initTools } = await Promise.all(/* import() */[__webpack_require__.e(1218), __webpack_require__.e(6447), __webpack_require__.e(5300), __webpack_require__.e(292), __webpack_require__.e(423), __webpack_require__.e(5432), __webpack_require__.e(8370)]).then(__webpack_require__.bind(__webpack_require__, 63609));
149
149
  initTools();
150
150
  // Boot trigger handlers (scheduled-task is registered eagerly; the
151
151
  // fs-watch + fast-sweep handlers need an explicit start() call to
152
152
  // attach their watchers). Importing the module also wires the
153
153
  // built-in scripts.
154
- const triggers = await Promise.all(/* import() */[__webpack_require__.e(1218), __webpack_require__.e(6447), __webpack_require__.e(5300), __webpack_require__.e(292), __webpack_require__.e(423), __webpack_require__.e(317), __webpack_require__.e(8370)]).then(__webpack_require__.bind(__webpack_require__, 78436));
154
+ const triggers = await Promise.all(/* import() */[__webpack_require__.e(1218), __webpack_require__.e(6447), __webpack_require__.e(5300), __webpack_require__.e(292), __webpack_require__.e(423), __webpack_require__.e(5432), __webpack_require__.e(8370)]).then(__webpack_require__.bind(__webpack_require__, 78436));
155
155
  await triggers.startAllTriggerHandlers();
156
156
  // Boot the scheduler unconditionally so trigger handlers (fs-watch,
157
157
  // fast remote sweep) get fan-out ticks even if no thread / event /
158
158
  // scheduled-task call has lazily started it yet.
159
- const { startScheduler } = await Promise.all(/* import() */[__webpack_require__.e(1218), __webpack_require__.e(6447), __webpack_require__.e(5300), __webpack_require__.e(292), __webpack_require__.e(423), __webpack_require__.e(317), __webpack_require__.e(8370)]).then(__webpack_require__.bind(__webpack_require__, 51509));
159
+ const { startScheduler } = await Promise.all(/* import() */[__webpack_require__.e(1218), __webpack_require__.e(6447), __webpack_require__.e(5300), __webpack_require__.e(292), __webpack_require__.e(423), __webpack_require__.e(5432), __webpack_require__.e(8370)]).then(__webpack_require__.bind(__webpack_require__, 51509));
160
160
  startScheduler();
161
161
  // Loud warning if the server is bound to a non-loopback interface
162
162
  // without being inside a container. The auth middleware
@@ -1 +1 @@
1
- {"version":3,"file":"../instrumentation.js","mappings":";;;;;;;;;;AAAA;;;;;;;ACAA;;;;;;;ACAA;;;;;;;ACAA;;;;;;;ACAA;;;;;;;ACAA;;;;;;;ACAA;;;;;;;ACAA;;;;;;;ACAA;;;;;;;ACAA;;;;;;;ACAA;;;;;;;ACAA;;;;;;;ACAA;;;;;;;ACAA;;;;;;;ACAA;;;;;;;ACAA;;;;;;;ACAA;;;;;;;;;;;ACAA,0EAA0E;AAC1E,mFAAmF;AACnF,EAAE;AACF,wEAAwE;AACxE,uEAAuE;AAEhE,eAAeA;IACpB,0EAA0E;IAC1E,6BAA6B;IAC7B,IAAIC,KAAqC,EAAE,EAAO;IAElD,qEAAqE;IACrE,wDAAwD;IACxD,MAAM,EAAEG,wBAAwB,EAAE,GAAG,MAAM,qGAAkC;IAC7EA;IAEA,iDAAiD;IACjD,MAAM,EAAEC,SAAS,EAAE,GAAG,MAAM,8RAAqB;IACjDA;IAEA,mEAAmE;IACnE,kEAAkE;IAClE,8DAA8D;IAC9D,oBAAoB;IACpB,MAAMC,WAAW,MAAM,8RAAwB;IAC/C,MAAMA,SAASC,uBAAuB;IAEtC,oEAAoE;IACpE,mEAAmE;IACnE,iDAAiD;IACjD,MAAM,EAAEC,cAAc,EAAE,GAAG,MAAM,8RAAyB;IAC1DA;IAEA,kEAAkE;IAClE,wDAAwD;IACxD,2DAA2D;IAC3D,kEAAkE;IAClE,kEAAkE;IAClE,gEAAgE;IAChE,qEAAqE;IACrE,0CAA0C;IAC1CC;AACF;AAEA,SAASA;IACP,MAAMC,OAAO,CAACT,QAAQC,GAAG,CAACS,QAAQ,IAAI,EAAC,EAAGC,IAAI;IAC9C,IAAI,CAACF,MAAM;IACX,MAAMG,aACJH,SAAS,eACTA,SAAS,SACTA,SAAS,eACTA,KAAKI,UAAU,CAAC;IAClB,IAAID,YAAY;IAChB,IAAIZ,QAAQC,GAAG,CAACa,6BAA6B,KAAK,KAAK;IACvD,qEAAqE;IACrE,uEAAuE;IACvE,sEAAsE;IACtE,kBAAkB;IAClB,IAAI;QAEF,MAAMC,KAA+BC,mBAAOA,CAAC,KAAS;QACtD,IAAID,GAAGE,UAAU,CAAC,gBAAgB;IACpC,EAAE,OAAM;IACN,iCAAiC;IACnC;IACA,IAAIjB,QAAQC,GAAG,CAACiB,uBAAuB,EAAE;IACzCC,QAAQC,IAAI,CACV,CAAC,EAAE,CAAC,GACF,CAAC,8BAA8B,EAAEX,KAAK,0BAA0B,CAAC,GACjE,CAAC,4EAA4E,CAAC,GAC9E,CAAC,sEAAsE,CAAC,GACxE,CAAC,wEAAwE,CAAC,GAC1E,CAAC,oDAAoD,CAAC,GACtD,CAAC,wEAAwE,CAAC,GAC1E,CAAC,kCAAkC,CAAC;AAE1C;;;;;;;;AC5EA;;;;;;;ACAA;;;;;;;ACAA;;;;;;;ACAA;;;;;;;ACAA;;;;;;;ACAA;;;;;;;ACAA;;;;;;;ACAA;;;;;;;ACAA;;;;;;;ACAA;;;;;;;ACAA;;;;;;;ACAA;;;;;;;ACAA;;;;;;;ACAA;;;;;;;ACAA;;;;;;;ACAA;;;;;;;ACAA;;;;;;;ACAA","sources":["webpack://@circuitwall/jarela/external node-commonjs \"node:process\"","webpack://@circuitwall/jarela/external commonjs2 \"url\"","webpack://@circuitwall/jarela/external commonjs \"undici\"","webpack://@circuitwall/jarela/external commonjs2 \"assert\"","webpack://@circuitwall/jarela/external module \"@whiskeysockets/baileys\"","webpack://@circuitwall/jarela/external node-commonjs \"node:async_hooks\"","webpack://@circuitwall/jarela/external commonjs2 \"os\"","webpack://@circuitwall/jarela/external commonjs2 \"stream\"","webpack://@circuitwall/jarela/external commonjs2 \"util\"","webpack://@circuitwall/jarela/external commonjs2 \"fs\"","webpack://@circuitwall/jarela/external node-commonjs \"node:child_process\"","webpack://@circuitwall/jarela/external commonjs2 \"path\"","webpack://@circuitwall/jarela/external node-commonjs \"node:http\"","webpack://@circuitwall/jarela/external node-commonjs \"node:dns\"","webpack://@circuitwall/jarela/external node-commonjs \"node:https\"","webpack://@circuitwall/jarela/external node-commonjs \"node:os\"","webpack://@circuitwall/jarela/external node-commonjs \"node:fs/promises\"","webpack://@circuitwall/jarela/./instrumentation.ts","webpack://@circuitwall/jarela/external commonjs2 \"crypto\"","webpack://@circuitwall/jarela/external commonjs2 \"https\"","webpack://@circuitwall/jarela/external node-commonjs \"node:stream\"","webpack://@circuitwall/jarela/external node-commonjs \"node:util\"","webpack://@circuitwall/jarela/external node-commonjs \"node:fs\"","webpack://@circuitwall/jarela/external node-commonjs \"node:url\"","webpack://@circuitwall/jarela/external commonjs2 \"zlib\"","webpack://@circuitwall/jarela/external node-commonjs \"node:worker_threads\"","webpack://@circuitwall/jarela/external node-commonjs \"node:path\"","webpack://@circuitwall/jarela/external node-commonjs \"node:net\"","webpack://@circuitwall/jarela/external node-commonjs \"node:crypto\"","webpack://@circuitwall/jarela/external commonjs2 \"buffer\"","webpack://@circuitwall/jarela/external commonjs2 \"child_process\"","webpack://@circuitwall/jarela/external commonjs2 \"fs/promises\"","webpack://@circuitwall/jarela/external node-commonjs \"node:sqlite\"","webpack://@circuitwall/jarela/external commonjs2 \"http\"","webpack://@circuitwall/jarela/external commonjs2 \"tty\"","webpack://@circuitwall/jarela/external commonjs2 \"events\""],"sourcesContent":["module.exports = require(\"node:process\");","module.exports = require(\"url\");","module.exports = require(\"undici\");","module.exports = require(\"assert\");","module.exports = import(\"@whiskeysockets/baileys\");;","module.exports = require(\"node:async_hooks\");","module.exports = require(\"os\");","module.exports = require(\"stream\");","module.exports = require(\"util\");","module.exports = require(\"fs\");","module.exports = require(\"node:child_process\");","module.exports = require(\"path\");","module.exports = require(\"node:http\");","module.exports = require(\"node:dns\");","module.exports = require(\"node:https\");","module.exports = require(\"node:os\");","module.exports = require(\"node:fs/promises\");","// Next.js instrumentation hook — runs once per server process at startup.\n// https://nextjs.org/docs/app/building-your-application/optimizing/instrumentation\n//\n// We use it to eagerly load external tools so their files are validated\n// and any errors are surfaced at boot rather than on first agent turn.\n\nexport async function register() {\n // Only run server-side (nodejs runtime); the edge runtime can't `require`\n // arbitrary files from disk.\n if (process.env.NEXT_RUNTIME !== \"nodejs\") return;\n\n // Install SIGINT/SIGTERM handlers before any subsystem spins up so a\n // signal that arrives during boot still drains cleanly.\n const { registerShutdownHandlers } = await import(\"@/lib/lifecycle/shutdown\");\n registerShutdownHandlers();\n\n // Dynamic import so this module stays edge-safe.\n const { initTools } = await import(\"@/lib/tools\");\n initTools();\n\n // Boot trigger handlers (scheduled-task is registered eagerly; the\n // fs-watch + fast-sweep handlers need an explicit start() call to\n // attach their watchers). Importing the module also wires the\n // built-in scripts.\n const triggers = await import(\"@/lib/triggers\");\n await triggers.startAllTriggerHandlers();\n\n // Boot the scheduler unconditionally so trigger handlers (fs-watch,\n // fast remote sweep) get fan-out ticks even if no thread / event /\n // scheduled-task call has lazily started it yet.\n const { startScheduler } = await import(\"@/lib/scheduler\");\n startScheduler();\n\n // Loud warning if the server is bound to a non-loopback interface\n // without being inside a container. The auth middleware\n // (lib/auth/access.ts) gates non-loopback callers behind a\n // `Tailscale-User-Login` header — which is trivially forgeable by\n // anyone on the LAN if Tailscale Serve isn't doing the SNI/header\n // injection in front of us. The Docker image legitimately binds\n // 0.0.0.0 because the container's network namespace contains nothing\n // else, so we suppress the warning there.\n warnIfExposedBind();\n}\n\nfunction warnIfExposedBind(): void {\n const host = (process.env.HOSTNAME || \"\").trim();\n if (!host) return;\n const isLoopback =\n host === \"127.0.0.1\" ||\n host === \"::1\" ||\n host === \"localhost\" ||\n host.startsWith(\"127.\");\n if (isLoopback) return;\n if (process.env.JARELA_ALLOW_NONLOOPBACK_BIND === \"1\") return;\n // Container heuristics: Docker sets /.dockerenv; Kubernetes/runc set\n // KUBERNETES_SERVICE_HOST. In both cases the operator is intentionally\n // binding 0.0.0.0 to the pod's network namespace and reverse-proxying\n // in front of it.\n try {\n \n const fs: typeof import(\"node:fs\") = require(\"node:fs\");\n if (fs.existsSync(\"/.dockerenv\")) return;\n } catch {\n // not on a POSIX runtime, ignore\n }\n if (process.env.KUBERNETES_SERVICE_HOST) return;\n console.warn(\n `\\n` +\n `[security] Jarela is bound to ${host}, which is NOT loopback.\\n` +\n ` Non-loopback callers are only gated by the Tailscale-User-Login\\n` +\n ` header, which can be forged by anyone on the LAN unless a\\n` +\n ` Tailscale-Serve (or equivalent reverse proxy) is sitting in\\n` +\n ` front of this process and injecting it.\\n` +\n ` Bind to 127.0.0.1 or set JARELA_ALLOW_NONLOOPBACK_BIND=1 to\\n` +\n ` silence this warning.\\n`,\n );\n}\n","module.exports = require(\"crypto\");","module.exports = require(\"https\");","module.exports = require(\"node:stream\");","module.exports = require(\"node:util\");","module.exports = require(\"node:fs\");","module.exports = require(\"node:url\");","module.exports = require(\"zlib\");","module.exports = require(\"node:worker_threads\");","module.exports = require(\"node:path\");","module.exports = require(\"node:net\");","module.exports = require(\"node:crypto\");","module.exports = require(\"buffer\");","module.exports = require(\"child_process\");","module.exports = require(\"fs/promises\");","module.exports = require(\"node:sqlite\");","module.exports = require(\"http\");","module.exports = require(\"tty\");","module.exports = require(\"events\");"],"names":["register","process","env","NEXT_RUNTIME","registerShutdownHandlers","initTools","triggers","startAllTriggerHandlers","startScheduler","warnIfExposedBind","host","HOSTNAME","trim","isLoopback","startsWith","JARELA_ALLOW_NONLOOPBACK_BIND","fs","require","existsSync","KUBERNETES_SERVICE_HOST","console","warn"],"sourceRoot":"","ignoreList":[]}
1
+ {"version":3,"file":"../instrumentation.js","mappings":";;;;;;;;;;AAAA;;;;;;;ACAA;;;;;;;ACAA;;;;;;;ACAA;;;;;;;ACAA;;;;;;;ACAA;;;;;;;ACAA;;;;;;;ACAA;;;;;;;ACAA;;;;;;;ACAA;;;;;;;ACAA;;;;;;;ACAA;;;;;;;ACAA;;;;;;;ACAA;;;;;;;ACAA;;;;;;;ACAA;;;;;;;ACAA;;;;;;;;;;;ACAA,0EAA0E;AAC1E,mFAAmF;AACnF,EAAE;AACF,wEAAwE;AACxE,uEAAuE;AAEhE,eAAeA;IACpB,0EAA0E;IAC1E,6BAA6B;IAC7B,IAAIC,KAAqC,EAAE,EAAO;IAElD,qEAAqE;IACrE,wDAAwD;IACxD,MAAM,EAAEG,wBAAwB,EAAE,GAAG,MAAM,qGAAkC;IAC7EA;IAEA,iDAAiD;IACjD,MAAM,EAAEC,SAAS,EAAE,GAAG,MAAM,+RAAqB;IACjDA;IAEA,mEAAmE;IACnE,kEAAkE;IAClE,8DAA8D;IAC9D,oBAAoB;IACpB,MAAMC,WAAW,MAAM,+RAAwB;IAC/C,MAAMA,SAASC,uBAAuB;IAEtC,oEAAoE;IACpE,mEAAmE;IACnE,iDAAiD;IACjD,MAAM,EAAEC,cAAc,EAAE,GAAG,MAAM,+RAAyB;IAC1DA;IAEA,kEAAkE;IAClE,wDAAwD;IACxD,2DAA2D;IAC3D,kEAAkE;IAClE,kEAAkE;IAClE,gEAAgE;IAChE,qEAAqE;IACrE,0CAA0C;IAC1CC;AACF;AAEA,SAASA;IACP,MAAMC,OAAO,CAACT,QAAQC,GAAG,CAACS,QAAQ,IAAI,EAAC,EAAGC,IAAI;IAC9C,IAAI,CAACF,MAAM;IACX,MAAMG,aACJH,SAAS,eACTA,SAAS,SACTA,SAAS,eACTA,KAAKI,UAAU,CAAC;IAClB,IAAID,YAAY;IAChB,IAAIZ,QAAQC,GAAG,CAACa,6BAA6B,KAAK,KAAK;IACvD,qEAAqE;IACrE,uEAAuE;IACvE,sEAAsE;IACtE,kBAAkB;IAClB,IAAI;QAEF,MAAMC,KAA+BC,mBAAOA,CAAC,KAAS;QACtD,IAAID,GAAGE,UAAU,CAAC,gBAAgB;IACpC,EAAE,OAAM;IACN,iCAAiC;IACnC;IACA,IAAIjB,QAAQC,GAAG,CAACiB,uBAAuB,EAAE;IACzCC,QAAQC,IAAI,CACV,CAAC,EAAE,CAAC,GACF,CAAC,8BAA8B,EAAEX,KAAK,0BAA0B,CAAC,GACjE,CAAC,4EAA4E,CAAC,GAC9E,CAAC,sEAAsE,CAAC,GACxE,CAAC,wEAAwE,CAAC,GAC1E,CAAC,oDAAoD,CAAC,GACtD,CAAC,wEAAwE,CAAC,GAC1E,CAAC,kCAAkC,CAAC;AAE1C;;;;;;;;AC5EA;;;;;;;ACAA;;;;;;;ACAA;;;;;;;ACAA;;;;;;;ACAA;;;;;;;ACAA;;;;;;;ACAA;;;;;;;ACAA;;;;;;;ACAA;;;;;;;ACAA;;;;;;;ACAA;;;;;;;ACAA;;;;;;;ACAA;;;;;;;ACAA;;;;;;;ACAA;;;;;;;ACAA;;;;;;;ACAA;;;;;;;ACAA","sources":["webpack://@circuitwall/jarela/external node-commonjs \"node:process\"","webpack://@circuitwall/jarela/external commonjs2 \"url\"","webpack://@circuitwall/jarela/external commonjs \"undici\"","webpack://@circuitwall/jarela/external commonjs2 \"assert\"","webpack://@circuitwall/jarela/external module \"@whiskeysockets/baileys\"","webpack://@circuitwall/jarela/external node-commonjs \"node:async_hooks\"","webpack://@circuitwall/jarela/external commonjs2 \"os\"","webpack://@circuitwall/jarela/external commonjs2 \"stream\"","webpack://@circuitwall/jarela/external commonjs2 \"util\"","webpack://@circuitwall/jarela/external commonjs2 \"fs\"","webpack://@circuitwall/jarela/external node-commonjs \"node:child_process\"","webpack://@circuitwall/jarela/external commonjs2 \"path\"","webpack://@circuitwall/jarela/external node-commonjs \"node:http\"","webpack://@circuitwall/jarela/external node-commonjs \"node:dns\"","webpack://@circuitwall/jarela/external node-commonjs \"node:https\"","webpack://@circuitwall/jarela/external node-commonjs \"node:os\"","webpack://@circuitwall/jarela/external node-commonjs \"node:fs/promises\"","webpack://@circuitwall/jarela/./instrumentation.ts","webpack://@circuitwall/jarela/external commonjs2 \"crypto\"","webpack://@circuitwall/jarela/external commonjs2 \"https\"","webpack://@circuitwall/jarela/external node-commonjs \"node:stream\"","webpack://@circuitwall/jarela/external node-commonjs \"node:util\"","webpack://@circuitwall/jarela/external node-commonjs \"node:fs\"","webpack://@circuitwall/jarela/external node-commonjs \"node:url\"","webpack://@circuitwall/jarela/external commonjs2 \"zlib\"","webpack://@circuitwall/jarela/external node-commonjs \"node:worker_threads\"","webpack://@circuitwall/jarela/external node-commonjs \"node:path\"","webpack://@circuitwall/jarela/external node-commonjs \"node:net\"","webpack://@circuitwall/jarela/external node-commonjs \"node:crypto\"","webpack://@circuitwall/jarela/external commonjs2 \"buffer\"","webpack://@circuitwall/jarela/external commonjs2 \"child_process\"","webpack://@circuitwall/jarela/external commonjs2 \"fs/promises\"","webpack://@circuitwall/jarela/external node-commonjs \"node:sqlite\"","webpack://@circuitwall/jarela/external commonjs2 \"http\"","webpack://@circuitwall/jarela/external commonjs2 \"tty\"","webpack://@circuitwall/jarela/external commonjs2 \"events\""],"sourcesContent":["module.exports = require(\"node:process\");","module.exports = require(\"url\");","module.exports = require(\"undici\");","module.exports = require(\"assert\");","module.exports = import(\"@whiskeysockets/baileys\");;","module.exports = require(\"node:async_hooks\");","module.exports = require(\"os\");","module.exports = require(\"stream\");","module.exports = require(\"util\");","module.exports = require(\"fs\");","module.exports = require(\"node:child_process\");","module.exports = require(\"path\");","module.exports = require(\"node:http\");","module.exports = require(\"node:dns\");","module.exports = require(\"node:https\");","module.exports = require(\"node:os\");","module.exports = require(\"node:fs/promises\");","// Next.js instrumentation hook — runs once per server process at startup.\n// https://nextjs.org/docs/app/building-your-application/optimizing/instrumentation\n//\n// We use it to eagerly load external tools so their files are validated\n// and any errors are surfaced at boot rather than on first agent turn.\n\nexport async function register() {\n // Only run server-side (nodejs runtime); the edge runtime can't `require`\n // arbitrary files from disk.\n if (process.env.NEXT_RUNTIME !== \"nodejs\") return;\n\n // Install SIGINT/SIGTERM handlers before any subsystem spins up so a\n // signal that arrives during boot still drains cleanly.\n const { registerShutdownHandlers } = await import(\"@/lib/lifecycle/shutdown\");\n registerShutdownHandlers();\n\n // Dynamic import so this module stays edge-safe.\n const { initTools } = await import(\"@/lib/tools\");\n initTools();\n\n // Boot trigger handlers (scheduled-task is registered eagerly; the\n // fs-watch + fast-sweep handlers need an explicit start() call to\n // attach their watchers). Importing the module also wires the\n // built-in scripts.\n const triggers = await import(\"@/lib/triggers\");\n await triggers.startAllTriggerHandlers();\n\n // Boot the scheduler unconditionally so trigger handlers (fs-watch,\n // fast remote sweep) get fan-out ticks even if no thread / event /\n // scheduled-task call has lazily started it yet.\n const { startScheduler } = await import(\"@/lib/scheduler\");\n startScheduler();\n\n // Loud warning if the server is bound to a non-loopback interface\n // without being inside a container. The auth middleware\n // (lib/auth/access.ts) gates non-loopback callers behind a\n // `Tailscale-User-Login` header — which is trivially forgeable by\n // anyone on the LAN if Tailscale Serve isn't doing the SNI/header\n // injection in front of us. The Docker image legitimately binds\n // 0.0.0.0 because the container's network namespace contains nothing\n // else, so we suppress the warning there.\n warnIfExposedBind();\n}\n\nfunction warnIfExposedBind(): void {\n const host = (process.env.HOSTNAME || \"\").trim();\n if (!host) return;\n const isLoopback =\n host === \"127.0.0.1\" ||\n host === \"::1\" ||\n host === \"localhost\" ||\n host.startsWith(\"127.\");\n if (isLoopback) return;\n if (process.env.JARELA_ALLOW_NONLOOPBACK_BIND === \"1\") return;\n // Container heuristics: Docker sets /.dockerenv; Kubernetes/runc set\n // KUBERNETES_SERVICE_HOST. In both cases the operator is intentionally\n // binding 0.0.0.0 to the pod's network namespace and reverse-proxying\n // in front of it.\n try {\n \n const fs: typeof import(\"node:fs\") = require(\"node:fs\");\n if (fs.existsSync(\"/.dockerenv\")) return;\n } catch {\n // not on a POSIX runtime, ignore\n }\n if (process.env.KUBERNETES_SERVICE_HOST) return;\n console.warn(\n `\\n` +\n `[security] Jarela is bound to ${host}, which is NOT loopback.\\n` +\n ` Non-loopback callers are only gated by the Tailscale-User-Login\\n` +\n ` header, which can be forged by anyone on the LAN unless a\\n` +\n ` Tailscale-Serve (or equivalent reverse proxy) is sitting in\\n` +\n ` front of this process and injecting it.\\n` +\n ` Bind to 127.0.0.1 or set JARELA_ALLOW_NONLOOPBACK_BIND=1 to\\n` +\n ` silence this warning.\\n`,\n );\n}\n","module.exports = require(\"crypto\");","module.exports = require(\"https\");","module.exports = require(\"node:stream\");","module.exports = require(\"node:util\");","module.exports = require(\"node:fs\");","module.exports = require(\"node:url\");","module.exports = require(\"zlib\");","module.exports = require(\"node:worker_threads\");","module.exports = require(\"node:path\");","module.exports = require(\"node:net\");","module.exports = require(\"node:crypto\");","module.exports = require(\"buffer\");","module.exports = require(\"child_process\");","module.exports = require(\"fs/promises\");","module.exports = require(\"node:sqlite\");","module.exports = require(\"http\");","module.exports = require(\"tty\");","module.exports = require(\"events\");"],"names":["register","process","env","NEXT_RUNTIME","registerShutdownHandlers","initTools","triggers","startAllTriggerHandlers","startScheduler","warnIfExposedBind","host","HOSTNAME","trim","isLoopback","startsWith","JARELA_ALLOW_NONLOOPBACK_BIND","fs","require","existsSync","KUBERNETES_SERVICE_HOST","console","warn"],"sourceRoot":"","ignoreList":[]}
@@ -4,8 +4,8 @@ globalThis.__BUILD_MANIFEST = {
4
4
  ],
5
5
  "devFiles": [],
6
6
  "lowPriorityFiles": [
7
- "static/IauO0rNZkUVPX834k-SBa/_buildManifest.js",
8
- "static/IauO0rNZkUVPX834k-SBa/_ssgManifest.js"
7
+ "static/AbCOWpaxP4v4lUSeFWWYz/_buildManifest.js",
8
+ "static/AbCOWpaxP4v4lUSeFWWYz/_ssgManifest.js"
9
9
  ],
10
10
  "rootMainFiles": [
11
11
  "static/chunks/webpack-ff5627013a5e3842.js",
@@ -1,4 +1,4 @@
1
- <!DOCTYPE html><html lang="en" data-theme="system"><head><meta charSet="utf-8"/><meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1, viewport-fit=cover"/><link rel="stylesheet" href="/_next/static/css/cc66c456aba91258.css" data-precedence="next"/><link rel="preload" as="script" fetchPriority="low" href="/_next/static/chunks/webpack-ff5627013a5e3842.js"/><script src="/_next/static/chunks/4bd1b696-f4afdf0ad1d556a5.js" async=""></script><script src="/_next/static/chunks/3457-5218e06617c4db2a.js" async=""></script><script src="/_next/static/chunks/main-app-3f37bcefd1eaffaf.js" async=""></script><script src="/_next/static/chunks/app/layout-0814b4dde82d031c.js" async=""></script><meta name="robots" content="noindex"/><title>404: This page could not be found.</title><meta name="theme-color" content="#2563eb"/><title>Jarela</title><meta name="description" content="Jarela — local chat interface for LangGraph agents"/><link rel="manifest" href="/manifest.json"/><link rel="icon" href="/favicon.ico" sizes="any"/><link rel="icon" href="/icon-192.png" type="image/png" sizes="192x192"/><link rel="icon" href="/icon-512.png" type="image/png" sizes="512x512"/><link rel="apple-touch-icon" href="/apple-touch-icon.png" sizes="180x180"/><script>(() => {
1
+ <!DOCTYPE html><html lang="en" data-theme="system"><head><meta charSet="utf-8"/><meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1, viewport-fit=cover"/><link rel="stylesheet" href="/_next/static/css/5507dbe1cdc6c599.css" data-precedence="next"/><link rel="preload" as="script" fetchPriority="low" href="/_next/static/chunks/webpack-ff5627013a5e3842.js"/><script src="/_next/static/chunks/4bd1b696-f4afdf0ad1d556a5.js" async=""></script><script src="/_next/static/chunks/3457-5218e06617c4db2a.js" async=""></script><script src="/_next/static/chunks/main-app-3f37bcefd1eaffaf.js" async=""></script><script src="/_next/static/chunks/app/layout-0814b4dde82d031c.js" async=""></script><meta name="robots" content="noindex"/><title>404: This page could not be found.</title><meta name="theme-color" content="#2563eb"/><title>Jarela</title><meta name="description" content="Jarela — local chat interface for LangGraph agents"/><link rel="manifest" href="/manifest.json"/><link rel="icon" href="/favicon.ico" sizes="any"/><link rel="icon" href="/icon-192.png" type="image/png" sizes="192x192"/><link rel="icon" href="/icon-512.png" type="image/png" sizes="512x512"/><link rel="apple-touch-icon" href="/apple-touch-icon.png" sizes="180x180"/><script>(() => {
2
2
  try {
3
3
  var t = localStorage.getItem("jarela-theme");
4
4
  if (t !== "light" && t !== "dark" && t !== "system") t = "system";
@@ -6,4 +6,4 @@
6
6
  } catch (e) {
7
7
  document.documentElement.setAttribute("data-theme", "system");
8
8
  }
9
- })();</script><script src="/_next/static/chunks/polyfills-42372ed130431b0a.js" noModule=""></script></head><body><div hidden=""><!--$--><!--/$--></div><div style="font-family:system-ui,&quot;Segoe UI&quot;,Roboto,Helvetica,Arial,sans-serif,&quot;Apple Color Emoji&quot;,&quot;Segoe UI Emoji&quot;;height:100vh;text-align:center;display:flex;flex-direction:column;align-items:center;justify-content:center"><div><style>body{color:#000;background:#fff;margin:0}.next-error-h1{border-right:1px solid rgba(0,0,0,.3)}@media (prefers-color-scheme:dark){body{color:#fff;background:#000}.next-error-h1{border-right:1px solid rgba(255,255,255,.3)}}</style><h1 class="next-error-h1" style="display:inline-block;margin:0 20px 0 0;padding:0 23px 0 0;font-size:24px;font-weight:500;vertical-align:top;line-height:49px">404</h1><div style="display:inline-block"><h2 style="font-size:14px;font-weight:400;line-height:49px;margin:0">This page could not be found.</h2></div></div></div><!--$--><!--/$--><script src="/_next/static/chunks/webpack-ff5627013a5e3842.js" id="_R_" async=""></script><script>(self.__next_f=self.__next_f||[]).push([0])</script><script>self.__next_f.push([1,"1:\"$Sreact.fragment\"\n2:I[737,[\"7177\",\"static/chunks/app/layout-0814b4dde82d031c.js\"],\"ThemeProvider\"]\n3:I[3639,[\"7177\",\"static/chunks/app/layout-0814b4dde82d031c.js\"],\"AppProvider\"]\n4:I[7121,[],\"\"]\n5:I[4581,[],\"\"]\n6:I[722,[\"7177\",\"static/chunks/app/layout-0814b4dde82d031c.js\"],\"ServiceWorkerRegistration\"]\n7:I[484,[],\"OutletBoundary\"]\n8:\"$Sreact.suspense\"\nb:I[484,[],\"ViewportBoundary\"]\nd:I[484,[],\"MetadataBoundary\"]\nf:I[7123,[],\"default\",1]\n:HL[\"/_next/static/css/cc66c456aba91258.css\",\"style\"]\n"])</script><script>self.__next_f.push([1,"0:{\"P\":null,\"c\":[\"\",\"_not-found\"],\"q\":\"\",\"i\":false,\"f\":[[[\"\",{\"children\":[\"_not-found\",{\"children\":[\"__PAGE__\",{}]}]},\"$undefined\",\"$undefined\",16],[[\"$\",\"$1\",\"c\",{\"children\":[[[\"$\",\"link\",\"0\",{\"rel\":\"stylesheet\",\"href\":\"/_next/static/css/cc66c456aba91258.css\",\"precedence\":\"next\",\"crossOrigin\":\"$undefined\",\"nonce\":\"$undefined\"}]],[\"$\",\"html\",null,{\"lang\":\"en\",\"data-theme\":\"system\",\"suppressHydrationWarning\":true,\"children\":[[\"$\",\"head\",null,{\"children\":[\"$\",\"script\",null,{\"dangerouslySetInnerHTML\":{\"__html\":\"(() =\u003e {\\n try {\\n var t = localStorage.getItem(\\\"jarela-theme\\\");\\n if (t !== \\\"light\\\" \u0026\u0026 t !== \\\"dark\\\" \u0026\u0026 t !== \\\"system\\\") t = \\\"system\\\";\\n document.documentElement.setAttribute(\\\"data-theme\\\", t);\\n } catch (e) {\\n document.documentElement.setAttribute(\\\"data-theme\\\", \\\"system\\\");\\n }\\n})();\"}}]}],[\"$\",\"body\",null,{\"children\":[[\"$\",\"$L2\",null,{\"children\":[\"$\",\"$L3\",null,{\"children\":[\"$\",\"$L4\",null,{\"parallelRouterKey\":\"children\",\"error\":\"$undefined\",\"errorStyles\":\"$undefined\",\"errorScripts\":\"$undefined\",\"template\":[\"$\",\"$L5\",null,{}],\"templateStyles\":\"$undefined\",\"templateScripts\":\"$undefined\",\"notFound\":\"$undefined\",\"forbidden\":\"$undefined\",\"unauthorized\":\"$undefined\"}]}]}],[\"$\",\"$L6\",null,{}]]}]]}]]}],{\"children\":[[\"$\",\"$1\",\"c\",{\"children\":[null,[\"$\",\"$L4\",null,{\"parallelRouterKey\":\"children\",\"error\":\"$undefined\",\"errorStyles\":\"$undefined\",\"errorScripts\":\"$undefined\",\"template\":[\"$\",\"$L5\",null,{}],\"templateStyles\":\"$undefined\",\"templateScripts\":\"$undefined\",\"notFound\":\"$undefined\",\"forbidden\":\"$undefined\",\"unauthorized\":\"$undefined\"}]]}],{\"children\":[[\"$\",\"$1\",\"c\",{\"children\":[[[\"$\",\"title\",null,{\"children\":\"404: This page could not be found.\"}],[\"$\",\"div\",null,{\"style\":{\"fontFamily\":\"system-ui,\\\"Segoe UI\\\",Roboto,Helvetica,Arial,sans-serif,\\\"Apple Color Emoji\\\",\\\"Segoe UI Emoji\\\"\",\"height\":\"100vh\",\"textAlign\":\"center\",\"display\":\"flex\",\"flexDirection\":\"column\",\"alignItems\":\"center\",\"justifyContent\":\"center\"},\"children\":[\"$\",\"div\",null,{\"children\":[[\"$\",\"style\",null,{\"dangerouslySetInnerHTML\":{\"__html\":\"body{color:#000;background:#fff;margin:0}.next-error-h1{border-right:1px solid rgba(0,0,0,.3)}@media (prefers-color-scheme:dark){body{color:#fff;background:#000}.next-error-h1{border-right:1px solid rgba(255,255,255,.3)}}\"}}],[\"$\",\"h1\",null,{\"className\":\"next-error-h1\",\"style\":{\"display\":\"inline-block\",\"margin\":\"0 20px 0 0\",\"padding\":\"0 23px 0 0\",\"fontSize\":24,\"fontWeight\":500,\"verticalAlign\":\"top\",\"lineHeight\":\"49px\"},\"children\":404}],[\"$\",\"div\",null,{\"style\":{\"display\":\"inline-block\"},\"children\":[\"$\",\"h2\",null,{\"style\":{\"fontSize\":14,\"fontWeight\":400,\"lineHeight\":\"49px\",\"margin\":0},\"children\":\"This page could not be found.\"}]}]]}]}]],null,[\"$\",\"$L7\",null,{\"children\":[\"$\",\"$8\",null,{\"name\":\"Next.MetadataOutlet\",\"children\":\"$@9\"}]}]]}],{},null,false,null]},null,false,\"$@a\"]},null,false,null],[\"$\",\"$1\",\"h\",{\"children\":[[\"$\",\"meta\",null,{\"name\":\"robots\",\"content\":\"noindex\"}],[\"$\",\"$Lb\",null,{\"children\":\"$Lc\"}],[\"$\",\"div\",null,{\"hidden\":true,\"children\":[\"$\",\"$Ld\",null,{\"children\":[\"$\",\"$8\",null,{\"name\":\"Next.Metadata\",\"children\":\"$Le\"}]}]}],null]}],false]],\"m\":\"$undefined\",\"G\":[\"$f\",[]],\"S\":true,\"h\":null,\"s\":\"$undefined\",\"l\":\"$undefined\",\"p\":\"$undefined\",\"d\":\"$undefined\",\"b\":\"IauO0rNZkUVPX834k-SBa\"}\n"])</script><script>self.__next_f.push([1,"10:[]\na:\"$W10\"\n"])</script><script>self.__next_f.push([1,"c:[[\"$\",\"meta\",\"0\",{\"charSet\":\"utf-8\"}],[\"$\",\"meta\",\"1\",{\"name\":\"viewport\",\"content\":\"width=device-width, initial-scale=1, maximum-scale=1, viewport-fit=cover\"}],[\"$\",\"meta\",\"2\",{\"name\":\"theme-color\",\"content\":\"#2563eb\"}]]\n"])</script><script>self.__next_f.push([1,"11:I[6869,[],\"IconMark\"]\n9:null\ne:[[\"$\",\"title\",\"0\",{\"children\":\"Jarela\"}],[\"$\",\"meta\",\"1\",{\"name\":\"description\",\"content\":\"Jarela — local chat interface for LangGraph agents\"}],[\"$\",\"link\",\"2\",{\"rel\":\"manifest\",\"href\":\"/manifest.json\",\"crossOrigin\":\"$undefined\"}],[\"$\",\"link\",\"3\",{\"rel\":\"icon\",\"href\":\"/favicon.ico\",\"sizes\":\"any\"}],[\"$\",\"link\",\"4\",{\"rel\":\"icon\",\"href\":\"/icon-192.png\",\"type\":\"image/png\",\"sizes\":\"192x192\"}],[\"$\",\"link\",\"5\",{\"rel\":\"icon\",\"href\":\"/icon-512.png\",\"type\":\"image/png\",\"sizes\":\"512x512\"}],[\"$\",\"link\",\"6\",{\"rel\":\"apple-touch-icon\",\"href\":\"/apple-touch-icon.png\",\"sizes\":\"180x180\"}],[\"$\",\"$L11\",\"7\",{}]]\n"])</script></body></html>
9
+ })();</script><script src="/_next/static/chunks/polyfills-42372ed130431b0a.js" noModule=""></script></head><body><div hidden=""><!--$--><!--/$--></div><div style="font-family:system-ui,&quot;Segoe UI&quot;,Roboto,Helvetica,Arial,sans-serif,&quot;Apple Color Emoji&quot;,&quot;Segoe UI Emoji&quot;;height:100vh;text-align:center;display:flex;flex-direction:column;align-items:center;justify-content:center"><div><style>body{color:#000;background:#fff;margin:0}.next-error-h1{border-right:1px solid rgba(0,0,0,.3)}@media (prefers-color-scheme:dark){body{color:#fff;background:#000}.next-error-h1{border-right:1px solid rgba(255,255,255,.3)}}</style><h1 class="next-error-h1" style="display:inline-block;margin:0 20px 0 0;padding:0 23px 0 0;font-size:24px;font-weight:500;vertical-align:top;line-height:49px">404</h1><div style="display:inline-block"><h2 style="font-size:14px;font-weight:400;line-height:49px;margin:0">This page could not be found.</h2></div></div></div><!--$--><!--/$--><script src="/_next/static/chunks/webpack-ff5627013a5e3842.js" id="_R_" async=""></script><script>(self.__next_f=self.__next_f||[]).push([0])</script><script>self.__next_f.push([1,"1:\"$Sreact.fragment\"\n2:I[737,[\"7177\",\"static/chunks/app/layout-0814b4dde82d031c.js\"],\"ThemeProvider\"]\n3:I[3639,[\"7177\",\"static/chunks/app/layout-0814b4dde82d031c.js\"],\"AppProvider\"]\n4:I[7121,[],\"\"]\n5:I[4581,[],\"\"]\n6:I[722,[\"7177\",\"static/chunks/app/layout-0814b4dde82d031c.js\"],\"ServiceWorkerRegistration\"]\n7:I[484,[],\"OutletBoundary\"]\n8:\"$Sreact.suspense\"\nb:I[484,[],\"ViewportBoundary\"]\nd:I[484,[],\"MetadataBoundary\"]\nf:I[7123,[],\"default\",1]\n:HL[\"/_next/static/css/5507dbe1cdc6c599.css\",\"style\"]\n"])</script><script>self.__next_f.push([1,"0:{\"P\":null,\"c\":[\"\",\"_not-found\"],\"q\":\"\",\"i\":false,\"f\":[[[\"\",{\"children\":[\"_not-found\",{\"children\":[\"__PAGE__\",{}]}]},\"$undefined\",\"$undefined\",16],[[\"$\",\"$1\",\"c\",{\"children\":[[[\"$\",\"link\",\"0\",{\"rel\":\"stylesheet\",\"href\":\"/_next/static/css/5507dbe1cdc6c599.css\",\"precedence\":\"next\",\"crossOrigin\":\"$undefined\",\"nonce\":\"$undefined\"}]],[\"$\",\"html\",null,{\"lang\":\"en\",\"data-theme\":\"system\",\"suppressHydrationWarning\":true,\"children\":[[\"$\",\"head\",null,{\"children\":[\"$\",\"script\",null,{\"dangerouslySetInnerHTML\":{\"__html\":\"(() =\u003e {\\n try {\\n var t = localStorage.getItem(\\\"jarela-theme\\\");\\n if (t !== \\\"light\\\" \u0026\u0026 t !== \\\"dark\\\" \u0026\u0026 t !== \\\"system\\\") t = \\\"system\\\";\\n document.documentElement.setAttribute(\\\"data-theme\\\", t);\\n } catch (e) {\\n document.documentElement.setAttribute(\\\"data-theme\\\", \\\"system\\\");\\n }\\n})();\"}}]}],[\"$\",\"body\",null,{\"children\":[[\"$\",\"$L2\",null,{\"children\":[\"$\",\"$L3\",null,{\"children\":[\"$\",\"$L4\",null,{\"parallelRouterKey\":\"children\",\"error\":\"$undefined\",\"errorStyles\":\"$undefined\",\"errorScripts\":\"$undefined\",\"template\":[\"$\",\"$L5\",null,{}],\"templateStyles\":\"$undefined\",\"templateScripts\":\"$undefined\",\"notFound\":\"$undefined\",\"forbidden\":\"$undefined\",\"unauthorized\":\"$undefined\"}]}]}],[\"$\",\"$L6\",null,{}]]}]]}]]}],{\"children\":[[\"$\",\"$1\",\"c\",{\"children\":[null,[\"$\",\"$L4\",null,{\"parallelRouterKey\":\"children\",\"error\":\"$undefined\",\"errorStyles\":\"$undefined\",\"errorScripts\":\"$undefined\",\"template\":[\"$\",\"$L5\",null,{}],\"templateStyles\":\"$undefined\",\"templateScripts\":\"$undefined\",\"notFound\":\"$undefined\",\"forbidden\":\"$undefined\",\"unauthorized\":\"$undefined\"}]]}],{\"children\":[[\"$\",\"$1\",\"c\",{\"children\":[[[\"$\",\"title\",null,{\"children\":\"404: This page could not be found.\"}],[\"$\",\"div\",null,{\"style\":{\"fontFamily\":\"system-ui,\\\"Segoe UI\\\",Roboto,Helvetica,Arial,sans-serif,\\\"Apple Color Emoji\\\",\\\"Segoe UI Emoji\\\"\",\"height\":\"100vh\",\"textAlign\":\"center\",\"display\":\"flex\",\"flexDirection\":\"column\",\"alignItems\":\"center\",\"justifyContent\":\"center\"},\"children\":[\"$\",\"div\",null,{\"children\":[[\"$\",\"style\",null,{\"dangerouslySetInnerHTML\":{\"__html\":\"body{color:#000;background:#fff;margin:0}.next-error-h1{border-right:1px solid rgba(0,0,0,.3)}@media (prefers-color-scheme:dark){body{color:#fff;background:#000}.next-error-h1{border-right:1px solid rgba(255,255,255,.3)}}\"}}],[\"$\",\"h1\",null,{\"className\":\"next-error-h1\",\"style\":{\"display\":\"inline-block\",\"margin\":\"0 20px 0 0\",\"padding\":\"0 23px 0 0\",\"fontSize\":24,\"fontWeight\":500,\"verticalAlign\":\"top\",\"lineHeight\":\"49px\"},\"children\":404}],[\"$\",\"div\",null,{\"style\":{\"display\":\"inline-block\"},\"children\":[\"$\",\"h2\",null,{\"style\":{\"fontSize\":14,\"fontWeight\":400,\"lineHeight\":\"49px\",\"margin\":0},\"children\":\"This page could not be found.\"}]}]]}]}]],null,[\"$\",\"$L7\",null,{\"children\":[\"$\",\"$8\",null,{\"name\":\"Next.MetadataOutlet\",\"children\":\"$@9\"}]}]]}],{},null,false,null]},null,false,\"$@a\"]},null,false,null],[\"$\",\"$1\",\"h\",{\"children\":[[\"$\",\"meta\",null,{\"name\":\"robots\",\"content\":\"noindex\"}],[\"$\",\"$Lb\",null,{\"children\":\"$Lc\"}],[\"$\",\"div\",null,{\"hidden\":true,\"children\":[\"$\",\"$Ld\",null,{\"children\":[\"$\",\"$8\",null,{\"name\":\"Next.Metadata\",\"children\":\"$Le\"}]}]}],null]}],false]],\"m\":\"$undefined\",\"G\":[\"$f\",[]],\"S\":true,\"h\":null,\"s\":\"$undefined\",\"l\":\"$undefined\",\"p\":\"$undefined\",\"d\":\"$undefined\",\"b\":\"AbCOWpaxP4v4lUSeFWWYz\"}\n"])</script><script>self.__next_f.push([1,"10:[]\na:\"$W10\"\n"])</script><script>self.__next_f.push([1,"c:[[\"$\",\"meta\",\"0\",{\"charSet\":\"utf-8\"}],[\"$\",\"meta\",\"1\",{\"name\":\"viewport\",\"content\":\"width=device-width, initial-scale=1, maximum-scale=1, viewport-fit=cover\"}],[\"$\",\"meta\",\"2\",{\"name\":\"theme-color\",\"content\":\"#2563eb\"}]]\n"])</script><script>self.__next_f.push([1,"11:I[6869,[],\"IconMark\"]\n9:null\ne:[[\"$\",\"title\",\"0\",{\"children\":\"Jarela\"}],[\"$\",\"meta\",\"1\",{\"name\":\"description\",\"content\":\"Jarela — local chat interface for LangGraph agents\"}],[\"$\",\"link\",\"2\",{\"rel\":\"manifest\",\"href\":\"/manifest.json\",\"crossOrigin\":\"$undefined\"}],[\"$\",\"link\",\"3\",{\"rel\":\"icon\",\"href\":\"/favicon.ico\",\"sizes\":\"any\"}],[\"$\",\"link\",\"4\",{\"rel\":\"icon\",\"href\":\"/icon-192.png\",\"type\":\"image/png\",\"sizes\":\"192x192\"}],[\"$\",\"link\",\"5\",{\"rel\":\"icon\",\"href\":\"/icon-512.png\",\"type\":\"image/png\",\"sizes\":\"512x512\"}],[\"$\",\"link\",\"6\",{\"rel\":\"apple-touch-icon\",\"href\":\"/apple-touch-icon.png\",\"sizes\":\"180x180\"}],[\"$\",\"$L11\",\"7\",{}]]\n"])</script></body></html>
@@ -1 +1 @@
1
- <!DOCTYPE html><html id="__next_error__"><head><meta charSet="utf-8"/><meta name="viewport" content="width=device-width, initial-scale=1"/><link rel="preload" as="script" fetchPriority="low" href="/_next/static/chunks/webpack-ff5627013a5e3842.js"/><script src="/_next/static/chunks/4bd1b696-f4afdf0ad1d556a5.js" async=""></script><script src="/_next/static/chunks/3457-5218e06617c4db2a.js" async=""></script><script src="/_next/static/chunks/main-app-3f37bcefd1eaffaf.js" async=""></script><title>500: This page couldn’t load</title><style>:root {--next-error-bg: #fff;--next-error-text: #171717;--next-error-title: #171717;--next-error-message: #171717;--next-error-digest: #666666;--next-error-btn-text: #fff;--next-error-btn-bg: #171717;--next-error-btn-border: none;--next-error-btn-secondary-text: #171717;--next-error-btn-secondary-bg: transparent;--next-error-btn-secondary-border: 1px solid rgba(0,0,0,0.08);}@media (prefers-color-scheme: dark) {:root {--next-error-bg: #0a0a0a;--next-error-text: #ededed;--next-error-title: #ededed;--next-error-message: #ededed;--next-error-digest: #a0a0a0;--next-error-btn-text: #0a0a0a;--next-error-btn-bg: #ededed;--next-error-btn-border: none;--next-error-btn-secondary-text: #ededed;--next-error-btn-secondary-bg: transparent;--next-error-btn-secondary-border: 1px solid rgba(255,255,255,0.14);}}body { margin: 0; color: var(--next-error-text); background: var(--next-error-bg); }</style><script src="/_next/static/chunks/polyfills-42372ed130431b0a.js" noModule=""></script></head><body><div hidden=""><!--$--><!--/$--></div><div style="font-family:system-ui,&quot;Segoe UI&quot;,Roboto,Helvetica,Arial,sans-serif,&quot;Apple Color Emoji&quot;,&quot;Segoe UI Emoji&quot;;height:100vh;display:flex;align-items:center;justify-content:center"><div style="margin-top:-32px;max-width:325px;padding:32px 28px;text-align:left"><svg width="32" height="32" viewBox="-0.2 -1.5 32 32" fill="none" style="margin-bottom:24px"><path d="M16.9328 0C18.0839 0.000116771 19.1334 0.658832 19.634 1.69531L31.4299 26.1309C32.0708 27.4588 31.1036 28.9999 29.6291 29H2.00215C0.527541 29 -0.439628 27.4588 0.201371 26.1309L11.9973 1.69531C12.4979 0.658823 13.5474 7.75066e-05 14.6984 0H16.9328ZM3.59493 26H28.0363L16.9328 3H14.6984L3.59493 26ZM15.8156 19C16.9202 19.0001 17.8156 19.8955 17.8156 21C17.8156 22.1045 16.9202 22.9999 15.8156 23C14.7111 23 13.8156 22.1046 13.8156 21C13.8156 19.8954 14.7111 19 15.8156 19ZM17.3156 16.5H14.3156V8.5H17.3156V16.5Z" fill="var(--next-error-title)"></path></svg><h1 style="font-size:24px;font-weight:500;letter-spacing:-0.02em;line-height:32px;margin:0 0 12px 0;color:var(--next-error-title)">This page couldn’t load</h1><p style="font-size:14px;font-weight:400;line-height:21px;margin:0 0 20px 0;color:var(--next-error-message)">A server error occurred. Reload to try again.</p><form style="margin:0"><button type="submit" style="display:inline-flex;align-items:center;justify-content:center;height:32px;padding:0 12px;font-size:14px;font-weight:500;line-height:20px;border-radius:6px;cursor:pointer;color:var(--next-error-btn-text);background:var(--next-error-btn-bg);border:var(--next-error-btn-border)">Reload</button></form></div></div><!--$--><!--/$--><script src="/_next/static/chunks/webpack-ff5627013a5e3842.js" id="_R_" async=""></script><script>(self.__next_f=self.__next_f||[]).push([0])</script><script>self.__next_f.push([1,"1:\"$Sreact.fragment\"\n2:I[7121,[],\"\"]\n3:I[4581,[],\"\"]\n4:I[484,[],\"OutletBoundary\"]\n5:\"$Sreact.suspense\"\n8:I[484,[],\"ViewportBoundary\"]\na:I[484,[],\"MetadataBoundary\"]\nc:I[7123,[],\"default\",1]\n"])</script><script>self.__next_f.push([1,"0:{\"P\":null,\"c\":[\"\",\"_global-error\"],\"q\":\"\",\"i\":false,\"f\":[[[\"\",{\"children\":[\"_global-error\",{\"children\":[\"__PAGE__\",{}]}]}],[[\"$\",\"$1\",\"c\",{\"children\":[null,[\"$\",\"$L2\",null,{\"parallelRouterKey\":\"children\",\"error\":\"$undefined\",\"errorStyles\":\"$undefined\",\"errorScripts\":\"$undefined\",\"template\":[\"$\",\"$L3\",null,{}],\"templateStyles\":\"$undefined\",\"templateScripts\":\"$undefined\",\"notFound\":\"$undefined\",\"forbidden\":\"$undefined\",\"unauthorized\":\"$undefined\"}]]}],{\"children\":[[\"$\",\"$1\",\"c\",{\"children\":[null,[\"$\",\"$L2\",null,{\"parallelRouterKey\":\"children\",\"error\":\"$undefined\",\"errorStyles\":\"$undefined\",\"errorScripts\":\"$undefined\",\"template\":[\"$\",\"$L3\",null,{}],\"templateStyles\":\"$undefined\",\"templateScripts\":\"$undefined\",\"notFound\":\"$undefined\",\"forbidden\":\"$undefined\",\"unauthorized\":\"$undefined\"}]]}],{\"children\":[[\"$\",\"$1\",\"c\",{\"children\":[[\"$\",\"html\",null,{\"id\":\"__next_error__\",\"children\":[[\"$\",\"head\",null,{\"children\":[[\"$\",\"title\",null,{\"children\":\"500: This page couldn’t load\"}],[\"$\",\"style\",null,{\"dangerouslySetInnerHTML\":{\"__html\":\":root {--next-error-bg: #fff;--next-error-text: #171717;--next-error-title: #171717;--next-error-message: #171717;--next-error-digest: #666666;--next-error-btn-text: #fff;--next-error-btn-bg: #171717;--next-error-btn-border: none;--next-error-btn-secondary-text: #171717;--next-error-btn-secondary-bg: transparent;--next-error-btn-secondary-border: 1px solid rgba(0,0,0,0.08);}@media (prefers-color-scheme: dark) {:root {--next-error-bg: #0a0a0a;--next-error-text: #ededed;--next-error-title: #ededed;--next-error-message: #ededed;--next-error-digest: #a0a0a0;--next-error-btn-text: #0a0a0a;--next-error-btn-bg: #ededed;--next-error-btn-border: none;--next-error-btn-secondary-text: #ededed;--next-error-btn-secondary-bg: transparent;--next-error-btn-secondary-border: 1px solid rgba(255,255,255,0.14);}}body { margin: 0; color: var(--next-error-text); background: var(--next-error-bg); }\"}}]]}],[\"$\",\"body\",null,{\"children\":[\"$\",\"div\",null,{\"style\":{\"fontFamily\":\"system-ui,\\\"Segoe UI\\\",Roboto,Helvetica,Arial,sans-serif,\\\"Apple Color Emoji\\\",\\\"Segoe UI Emoji\\\"\",\"height\":\"100vh\",\"display\":\"flex\",\"alignItems\":\"center\",\"justifyContent\":\"center\"},\"children\":[\"$\",\"div\",null,{\"style\":{\"marginTop\":\"-32px\",\"maxWidth\":\"325px\",\"padding\":\"32px 28px\",\"textAlign\":\"left\"},\"children\":[[\"$\",\"svg\",null,{\"width\":\"32\",\"height\":\"32\",\"viewBox\":\"-0.2 -1.5 32 32\",\"fill\":\"none\",\"style\":{\"marginBottom\":\"24px\"},\"children\":[\"$\",\"path\",null,{\"d\":\"M16.9328 0C18.0839 0.000116771 19.1334 0.658832 19.634 1.69531L31.4299 26.1309C32.0708 27.4588 31.1036 28.9999 29.6291 29H2.00215C0.527541 29 -0.439628 27.4588 0.201371 26.1309L11.9973 1.69531C12.4979 0.658823 13.5474 7.75066e-05 14.6984 0H16.9328ZM3.59493 26H28.0363L16.9328 3H14.6984L3.59493 26ZM15.8156 19C16.9202 19.0001 17.8156 19.8955 17.8156 21C17.8156 22.1045 16.9202 22.9999 15.8156 23C14.7111 23 13.8156 22.1046 13.8156 21C13.8156 19.8954 14.7111 19 15.8156 19ZM17.3156 16.5H14.3156V8.5H17.3156V16.5Z\",\"fill\":\"var(--next-error-title)\"}]}],[\"$\",\"h1\",null,{\"style\":{\"fontSize\":\"24px\",\"fontWeight\":500,\"letterSpacing\":\"-0.02em\",\"lineHeight\":\"32px\",\"margin\":\"0 0 12px 0\",\"color\":\"var(--next-error-title)\"},\"children\":\"This page couldn’t load\"}],[\"$\",\"p\",null,{\"style\":{\"fontSize\":\"14px\",\"fontWeight\":400,\"lineHeight\":\"21px\",\"margin\":\"0 0 20px 0\",\"color\":\"var(--next-error-message)\"},\"children\":\"A server error occurred. Reload to try again.\"}],[\"$\",\"form\",null,{\"style\":{\"margin\":0},\"children\":[\"$\",\"button\",null,{\"type\":\"submit\",\"style\":{\"display\":\"inline-flex\",\"alignItems\":\"center\",\"justifyContent\":\"center\",\"height\":\"32px\",\"padding\":\"0 12px\",\"fontSize\":\"14px\",\"fontWeight\":500,\"lineHeight\":\"20px\",\"borderRadius\":\"6px\",\"cursor\":\"pointer\",\"color\":\"var(--next-error-btn-text)\",\"background\":\"var(--next-error-btn-bg)\",\"border\":\"var(--next-error-btn-border)\"},\"children\":\"Reload\"}]}]]}]}]}]]}],null,[\"$\",\"$L4\",null,{\"children\":[\"$\",\"$5\",null,{\"name\":\"Next.MetadataOutlet\",\"children\":\"$@6\"}]}]]}],{},null,false,null]},null,false,\"$@7\"]},null,false,\"$@7\"],[\"$\",\"$1\",\"h\",{\"children\":[null,[\"$\",\"$L8\",null,{\"children\":\"$L9\"}],[\"$\",\"div\",null,{\"hidden\":true,\"children\":[\"$\",\"$La\",null,{\"children\":[\"$\",\"$5\",null,{\"name\":\"Next.Metadata\",\"children\":\"$Lb\"}]}]}],null]}],false]],\"m\":\"$undefined\",\"G\":[\"$c\",[]],\"S\":true,\"h\":null,\"s\":\"$undefined\",\"l\":\"$undefined\",\"p\":\"$undefined\",\"d\":\"$undefined\",\"b\":\"IauO0rNZkUVPX834k-SBa\"}\n"])</script><script>self.__next_f.push([1,"d:[]\n7:\"$Wd\"\n"])</script><script>self.__next_f.push([1,"9:[[\"$\",\"meta\",\"0\",{\"charSet\":\"utf-8\"}],[\"$\",\"meta\",\"1\",{\"name\":\"viewport\",\"content\":\"width=device-width, initial-scale=1\"}]]\n"])</script><script>self.__next_f.push([1,"6:null\nb:[]\n"])</script></body></html>
1
+ <!DOCTYPE html><html id="__next_error__"><head><meta charSet="utf-8"/><meta name="viewport" content="width=device-width, initial-scale=1"/><link rel="preload" as="script" fetchPriority="low" href="/_next/static/chunks/webpack-ff5627013a5e3842.js"/><script src="/_next/static/chunks/4bd1b696-f4afdf0ad1d556a5.js" async=""></script><script src="/_next/static/chunks/3457-5218e06617c4db2a.js" async=""></script><script src="/_next/static/chunks/main-app-3f37bcefd1eaffaf.js" async=""></script><title>500: This page couldn’t load</title><style>:root {--next-error-bg: #fff;--next-error-text: #171717;--next-error-title: #171717;--next-error-message: #171717;--next-error-digest: #666666;--next-error-btn-text: #fff;--next-error-btn-bg: #171717;--next-error-btn-border: none;--next-error-btn-secondary-text: #171717;--next-error-btn-secondary-bg: transparent;--next-error-btn-secondary-border: 1px solid rgba(0,0,0,0.08);}@media (prefers-color-scheme: dark) {:root {--next-error-bg: #0a0a0a;--next-error-text: #ededed;--next-error-title: #ededed;--next-error-message: #ededed;--next-error-digest: #a0a0a0;--next-error-btn-text: #0a0a0a;--next-error-btn-bg: #ededed;--next-error-btn-border: none;--next-error-btn-secondary-text: #ededed;--next-error-btn-secondary-bg: transparent;--next-error-btn-secondary-border: 1px solid rgba(255,255,255,0.14);}}body { margin: 0; color: var(--next-error-text); background: var(--next-error-bg); }</style><script src="/_next/static/chunks/polyfills-42372ed130431b0a.js" noModule=""></script></head><body><div hidden=""><!--$--><!--/$--></div><div style="font-family:system-ui,&quot;Segoe UI&quot;,Roboto,Helvetica,Arial,sans-serif,&quot;Apple Color Emoji&quot;,&quot;Segoe UI Emoji&quot;;height:100vh;display:flex;align-items:center;justify-content:center"><div style="margin-top:-32px;max-width:325px;padding:32px 28px;text-align:left"><svg width="32" height="32" viewBox="-0.2 -1.5 32 32" fill="none" style="margin-bottom:24px"><path d="M16.9328 0C18.0839 0.000116771 19.1334 0.658832 19.634 1.69531L31.4299 26.1309C32.0708 27.4588 31.1036 28.9999 29.6291 29H2.00215C0.527541 29 -0.439628 27.4588 0.201371 26.1309L11.9973 1.69531C12.4979 0.658823 13.5474 7.75066e-05 14.6984 0H16.9328ZM3.59493 26H28.0363L16.9328 3H14.6984L3.59493 26ZM15.8156 19C16.9202 19.0001 17.8156 19.8955 17.8156 21C17.8156 22.1045 16.9202 22.9999 15.8156 23C14.7111 23 13.8156 22.1046 13.8156 21C13.8156 19.8954 14.7111 19 15.8156 19ZM17.3156 16.5H14.3156V8.5H17.3156V16.5Z" fill="var(--next-error-title)"></path></svg><h1 style="font-size:24px;font-weight:500;letter-spacing:-0.02em;line-height:32px;margin:0 0 12px 0;color:var(--next-error-title)">This page couldn’t load</h1><p style="font-size:14px;font-weight:400;line-height:21px;margin:0 0 20px 0;color:var(--next-error-message)">A server error occurred. Reload to try again.</p><form style="margin:0"><button type="submit" style="display:inline-flex;align-items:center;justify-content:center;height:32px;padding:0 12px;font-size:14px;font-weight:500;line-height:20px;border-radius:6px;cursor:pointer;color:var(--next-error-btn-text);background:var(--next-error-btn-bg);border:var(--next-error-btn-border)">Reload</button></form></div></div><!--$--><!--/$--><script src="/_next/static/chunks/webpack-ff5627013a5e3842.js" id="_R_" async=""></script><script>(self.__next_f=self.__next_f||[]).push([0])</script><script>self.__next_f.push([1,"1:\"$Sreact.fragment\"\n2:I[7121,[],\"\"]\n3:I[4581,[],\"\"]\n4:I[484,[],\"OutletBoundary\"]\n5:\"$Sreact.suspense\"\n8:I[484,[],\"ViewportBoundary\"]\na:I[484,[],\"MetadataBoundary\"]\nc:I[7123,[],\"default\",1]\n"])</script><script>self.__next_f.push([1,"0:{\"P\":null,\"c\":[\"\",\"_global-error\"],\"q\":\"\",\"i\":false,\"f\":[[[\"\",{\"children\":[\"_global-error\",{\"children\":[\"__PAGE__\",{}]}]}],[[\"$\",\"$1\",\"c\",{\"children\":[null,[\"$\",\"$L2\",null,{\"parallelRouterKey\":\"children\",\"error\":\"$undefined\",\"errorStyles\":\"$undefined\",\"errorScripts\":\"$undefined\",\"template\":[\"$\",\"$L3\",null,{}],\"templateStyles\":\"$undefined\",\"templateScripts\":\"$undefined\",\"notFound\":\"$undefined\",\"forbidden\":\"$undefined\",\"unauthorized\":\"$undefined\"}]]}],{\"children\":[[\"$\",\"$1\",\"c\",{\"children\":[null,[\"$\",\"$L2\",null,{\"parallelRouterKey\":\"children\",\"error\":\"$undefined\",\"errorStyles\":\"$undefined\",\"errorScripts\":\"$undefined\",\"template\":[\"$\",\"$L3\",null,{}],\"templateStyles\":\"$undefined\",\"templateScripts\":\"$undefined\",\"notFound\":\"$undefined\",\"forbidden\":\"$undefined\",\"unauthorized\":\"$undefined\"}]]}],{\"children\":[[\"$\",\"$1\",\"c\",{\"children\":[[\"$\",\"html\",null,{\"id\":\"__next_error__\",\"children\":[[\"$\",\"head\",null,{\"children\":[[\"$\",\"title\",null,{\"children\":\"500: This page couldn’t load\"}],[\"$\",\"style\",null,{\"dangerouslySetInnerHTML\":{\"__html\":\":root {--next-error-bg: #fff;--next-error-text: #171717;--next-error-title: #171717;--next-error-message: #171717;--next-error-digest: #666666;--next-error-btn-text: #fff;--next-error-btn-bg: #171717;--next-error-btn-border: none;--next-error-btn-secondary-text: #171717;--next-error-btn-secondary-bg: transparent;--next-error-btn-secondary-border: 1px solid rgba(0,0,0,0.08);}@media (prefers-color-scheme: dark) {:root {--next-error-bg: #0a0a0a;--next-error-text: #ededed;--next-error-title: #ededed;--next-error-message: #ededed;--next-error-digest: #a0a0a0;--next-error-btn-text: #0a0a0a;--next-error-btn-bg: #ededed;--next-error-btn-border: none;--next-error-btn-secondary-text: #ededed;--next-error-btn-secondary-bg: transparent;--next-error-btn-secondary-border: 1px solid rgba(255,255,255,0.14);}}body { margin: 0; color: var(--next-error-text); background: var(--next-error-bg); }\"}}]]}],[\"$\",\"body\",null,{\"children\":[\"$\",\"div\",null,{\"style\":{\"fontFamily\":\"system-ui,\\\"Segoe UI\\\",Roboto,Helvetica,Arial,sans-serif,\\\"Apple Color Emoji\\\",\\\"Segoe UI Emoji\\\"\",\"height\":\"100vh\",\"display\":\"flex\",\"alignItems\":\"center\",\"justifyContent\":\"center\"},\"children\":[\"$\",\"div\",null,{\"style\":{\"marginTop\":\"-32px\",\"maxWidth\":\"325px\",\"padding\":\"32px 28px\",\"textAlign\":\"left\"},\"children\":[[\"$\",\"svg\",null,{\"width\":\"32\",\"height\":\"32\",\"viewBox\":\"-0.2 -1.5 32 32\",\"fill\":\"none\",\"style\":{\"marginBottom\":\"24px\"},\"children\":[\"$\",\"path\",null,{\"d\":\"M16.9328 0C18.0839 0.000116771 19.1334 0.658832 19.634 1.69531L31.4299 26.1309C32.0708 27.4588 31.1036 28.9999 29.6291 29H2.00215C0.527541 29 -0.439628 27.4588 0.201371 26.1309L11.9973 1.69531C12.4979 0.658823 13.5474 7.75066e-05 14.6984 0H16.9328ZM3.59493 26H28.0363L16.9328 3H14.6984L3.59493 26ZM15.8156 19C16.9202 19.0001 17.8156 19.8955 17.8156 21C17.8156 22.1045 16.9202 22.9999 15.8156 23C14.7111 23 13.8156 22.1046 13.8156 21C13.8156 19.8954 14.7111 19 15.8156 19ZM17.3156 16.5H14.3156V8.5H17.3156V16.5Z\",\"fill\":\"var(--next-error-title)\"}]}],[\"$\",\"h1\",null,{\"style\":{\"fontSize\":\"24px\",\"fontWeight\":500,\"letterSpacing\":\"-0.02em\",\"lineHeight\":\"32px\",\"margin\":\"0 0 12px 0\",\"color\":\"var(--next-error-title)\"},\"children\":\"This page couldn’t load\"}],[\"$\",\"p\",null,{\"style\":{\"fontSize\":\"14px\",\"fontWeight\":400,\"lineHeight\":\"21px\",\"margin\":\"0 0 20px 0\",\"color\":\"var(--next-error-message)\"},\"children\":\"A server error occurred. Reload to try again.\"}],[\"$\",\"form\",null,{\"style\":{\"margin\":0},\"children\":[\"$\",\"button\",null,{\"type\":\"submit\",\"style\":{\"display\":\"inline-flex\",\"alignItems\":\"center\",\"justifyContent\":\"center\",\"height\":\"32px\",\"padding\":\"0 12px\",\"fontSize\":\"14px\",\"fontWeight\":500,\"lineHeight\":\"20px\",\"borderRadius\":\"6px\",\"cursor\":\"pointer\",\"color\":\"var(--next-error-btn-text)\",\"background\":\"var(--next-error-btn-bg)\",\"border\":\"var(--next-error-btn-border)\"},\"children\":\"Reload\"}]}]]}]}]}]]}],null,[\"$\",\"$L4\",null,{\"children\":[\"$\",\"$5\",null,{\"name\":\"Next.MetadataOutlet\",\"children\":\"$@6\"}]}]]}],{},null,false,null]},null,false,\"$@7\"]},null,false,\"$@7\"],[\"$\",\"$1\",\"h\",{\"children\":[null,[\"$\",\"$L8\",null,{\"children\":\"$L9\"}],[\"$\",\"div\",null,{\"hidden\":true,\"children\":[\"$\",\"$La\",null,{\"children\":[\"$\",\"$5\",null,{\"name\":\"Next.Metadata\",\"children\":\"$Lb\"}]}]}],null]}],false]],\"m\":\"$undefined\",\"G\":[\"$c\",[]],\"S\":true,\"h\":null,\"s\":\"$undefined\",\"l\":\"$undefined\",\"p\":\"$undefined\",\"d\":\"$undefined\",\"b\":\"AbCOWpaxP4v4lUSeFWWYz\"}\n"])</script><script>self.__next_f.push([1,"d:[]\n7:\"$Wd\"\n"])</script><script>self.__next_f.push([1,"9:[[\"$\",\"meta\",\"0\",{\"charSet\":\"utf-8\"}],[\"$\",\"meta\",\"1\",{\"name\":\"viewport\",\"content\":\"width=device-width, initial-scale=1\"}]]\n"])</script><script>self.__next_f.push([1,"6:null\nb:[]\n"])</script></body></html>
@@ -1 +1 @@
1
- {"node":{},"edge":{},"encryptionKey":"1vmNnoZJDQSNIgwKYd7FaMjgJL0vxU5y+Y1y2MPb+cE="}
1
+ {"node":{},"edge":{},"encryptionKey":"MVyrlNqrVTBs9j/nNTaAzS4JFCacpXmDwVkFoS//sHc="}