@circuitwall/jarela 1.9.2 → 1.9.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.
- package/.next/standalone/.next/BUILD_ID +1 -1
- package/.next/standalone/.next/app-path-routes-manifest.json +1 -1
- package/.next/standalone/.next/build-manifest.json +2 -2
- 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 +2 -2
- package/.next/standalone/.next/server/app/_not-found.segments/_full.segment.rsc +2 -2
- 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 +2 -2
- 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 +2 -2
- package/.next/standalone/.next/server/app/page.js +688 -427
- package/.next/standalone/.next/server/app/page.js.map +1 -1
- package/.next/standalone/.next/server/app/page_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/setup/page_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app-paths-manifest.json +1 -1
- package/.next/standalone/.next/server/chunks/4045.js.map +1 -1
- package/.next/standalone/.next/server/middleware-build-manifest.js +2 -2
- package/.next/standalone/.next/server/pages/404.html +2 -2
- package/.next/standalone/.next/server/pages/500.html +1 -1
- package/.next/standalone/.next/server/server-reference-manifest.json +1 -1
- package/.next/standalone/.next/static/chunks/2747-4a6287cacd57d231.js.map +1 -1
- package/.next/standalone/.next/static/chunks/{1998-31a617131197a83a.js → 962-fe2372e00f85e23a.js} +111 -2
- package/.next/standalone/.next/static/chunks/962-fe2372e00f85e23a.js.map +1 -0
- package/.next/standalone/.next/static/chunks/app/layout-84c6f211a7a1ca36.js.map +1 -1
- package/.next/standalone/.next/static/chunks/app/{page-afdef9bd1108a656.js → page-c5b9f4407416c3f9.js} +332 -154
- package/.next/standalone/.next/static/chunks/app/page-c5b9f4407416c3f9.js.map +1 -0
- package/.next/standalone/.next/static/css/b8e04d59a2bfff04.css +5 -0
- package/.next/standalone/.next/static/css/b8e04d59a2bfff04.css.map +1 -0
- package/.next/standalone/package.json +1 -1
- package/CHANGELOG.md +25 -0
- package/components/credentials/CredentialsPanel.tsx +1 -1
- package/components/layout/AppShell.tsx +6 -0
- package/components/layout/MenuPanel.tsx +15 -91
- package/components/settings/AppearancePanel.tsx +93 -0
- package/components/settings/SettingsPanel.tsx +94 -0
- package/contexts/AppContext.tsx +1 -1
- package/hooks/useUrlSync.ts +1 -1
- package/lib/ui/navigate.ts +1 -1
- package/package.json +1 -1
- package/.next/standalone/.next/static/chunks/1998-31a617131197a83a.js.map +0 -1
- package/.next/standalone/.next/static/chunks/app/page-afdef9bd1108a656.js.map +0 -1
- package/.next/standalone/.next/static/css/44f9bbea39fef458.css +0 -5
- package/.next/standalone/.next/static/css/44f9bbea39fef458.css.map +0 -1
- /package/.next/standalone/.next/static/{rr-Rxxi6kkXe1Bw8-Hzq2 → EOkgU73YJOpR-vFcKMgL0}/_buildManifest.js +0 -0
- /package/.next/standalone/.next/static/{rr-Rxxi6kkXe1Bw8-Hzq2 → EOkgU73YJOpR-vFcKMgL0}/_ssgManifest.js +0 -0
|
@@ -1 +1 @@
|
|
|
1
|
-
globalThis.__RSC_MANIFEST=(globalThis.__RSC_MANIFEST||{});globalThis.__RSC_MANIFEST["/page"]={"moduleLoading":{"prefix":"/_next/"},"ssrModuleMapping":{"484":{"*":{"id":"70664","name":"*","chunks":[],"async":false}},"722":{"*":{"id":"86486","name":"*","chunks":[],"async":false}},"737":{"*":{"id":"41005","name":"*","chunks":[],"async":false}},"1304":{"*":{"id":"60440","name":"*","chunks":[],"async":false}},"2283":{"*":{"id":"26751","name":"*","chunks":[],"async":false}},"3639":{"*":{"id":"35419","name":"*","chunks":[],"async":false}},"4581":{"*":{"id":"61335","name":"*","chunks":[],"async":false}},"4777":{"*":{"id":"82265","name":"*","chunks":[],"async":false}},"6869":{"*":{"id":"74661","name":"*","chunks":[],"async":false}},"7121":{"*":{"id":"35421","name":"*","chunks":[],"async":false}},"7123":{"*":{"id":"81921","name":"*","chunks":[],"async":false}},"
|
|
1
|
+
globalThis.__RSC_MANIFEST=(globalThis.__RSC_MANIFEST||{});globalThis.__RSC_MANIFEST["/page"]={"moduleLoading":{"prefix":"/_next/"},"ssrModuleMapping":{"484":{"*":{"id":"70664","name":"*","chunks":[],"async":false}},"722":{"*":{"id":"86486","name":"*","chunks":[],"async":false}},"737":{"*":{"id":"41005","name":"*","chunks":[],"async":false}},"1304":{"*":{"id":"60440","name":"*","chunks":[],"async":false}},"2283":{"*":{"id":"26751","name":"*","chunks":[],"async":false}},"3639":{"*":{"id":"35419","name":"*","chunks":[],"async":false}},"4581":{"*":{"id":"61335","name":"*","chunks":[],"async":false}},"4777":{"*":{"id":"82265","name":"*","chunks":[],"async":false}},"6869":{"*":{"id":"74661","name":"*","chunks":[],"async":false}},"7121":{"*":{"id":"35421","name":"*","chunks":[],"async":false}},"7123":{"*":{"id":"81921","name":"*","chunks":[],"async":false}},"8616":{"*":{"id":"84342","name":"*","chunks":[],"async":false}},"8753":{"*":{"id":"21936","name":"*","chunks":[],"async":false}},"9998":{"*":{"id":"19674","name":"*","chunks":[],"async":false}}},"edgeSSRModuleMapping":{},"clientModules":{"/home/runner/work/jarela/jarela/node_modules/next/dist/client/components/builtin/global-error.js":{"id":7123,"name":"*","chunks":[],"async":false},"/home/runner/work/jarela/jarela/node_modules/next/dist/esm/client/components/builtin/global-error.js":{"id":7123,"name":"*","chunks":[],"async":false},"/home/runner/work/jarela/jarela/node_modules/next/dist/client/components/client-page.js":{"id":1304,"name":"*","chunks":[],"async":false},"/home/runner/work/jarela/jarela/node_modules/next/dist/esm/client/components/client-page.js":{"id":1304,"name":"*","chunks":[],"async":false},"/home/runner/work/jarela/jarela/node_modules/next/dist/client/components/client-segment.js":{"id":8616,"name":"*","chunks":[],"async":false},"/home/runner/work/jarela/jarela/node_modules/next/dist/esm/client/components/client-segment.js":{"id":8616,"name":"*","chunks":[],"async":false},"/home/runner/work/jarela/jarela/node_modules/next/dist/client/components/http-access-fallback/error-boundary.js":{"id":4777,"name":"*","chunks":[],"async":false},"/home/runner/work/jarela/jarela/node_modules/next/dist/esm/client/components/http-access-fallback/error-boundary.js":{"id":4777,"name":"*","chunks":[],"async":false},"/home/runner/work/jarela/jarela/node_modules/next/dist/client/components/layout-router.js":{"id":7121,"name":"*","chunks":[],"async":false},"/home/runner/work/jarela/jarela/node_modules/next/dist/esm/client/components/layout-router.js":{"id":7121,"name":"*","chunks":[],"async":false},"/home/runner/work/jarela/jarela/node_modules/next/dist/client/components/render-from-template-context.js":{"id":4581,"name":"*","chunks":[],"async":false},"/home/runner/work/jarela/jarela/node_modules/next/dist/esm/client/components/render-from-template-context.js":{"id":4581,"name":"*","chunks":[],"async":false},"/home/runner/work/jarela/jarela/node_modules/next/dist/lib/framework/boundary-components.js":{"id":484,"name":"*","chunks":[],"async":false},"/home/runner/work/jarela/jarela/node_modules/next/dist/esm/lib/framework/boundary-components.js":{"id":484,"name":"*","chunks":[],"async":false},"/home/runner/work/jarela/jarela/node_modules/next/dist/lib/metadata/generate/icon-mark.js":{"id":6869,"name":"*","chunks":[],"async":false},"/home/runner/work/jarela/jarela/node_modules/next/dist/esm/lib/metadata/generate/icon-mark.js":{"id":6869,"name":"*","chunks":[],"async":false},"/home/runner/work/jarela/jarela/app/globals.css":{"id":6872,"name":"*","chunks":["7177","static/chunks/app/layout-84c6f211a7a1ca36.js"],"async":false},"/home/runner/work/jarela/jarela/components/ui/ServiceWorkerRegistration.tsx":{"id":722,"name":"*","chunks":["7177","static/chunks/app/layout-84c6f211a7a1ca36.js"],"async":false},"/home/runner/work/jarela/jarela/contexts/AppContext.tsx":{"id":3639,"name":"*","chunks":["7177","static/chunks/app/layout-84c6f211a7a1ca36.js"],"async":false},"/home/runner/work/jarela/jarela/contexts/ThemeContext.tsx":{"id":737,"name":"*","chunks":["7177","static/chunks/app/layout-84c6f211a7a1ca36.js"],"async":false},"/home/runner/work/jarela/jarela/components/layout/AppShell.tsx":{"id":9998,"name":"*","chunks":["4502","static/chunks/4502-086e97fb92e704ad.js","962","static/chunks/962-fe2372e00f85e23a.js","2747","static/chunks/2747-4a6287cacd57d231.js","8974","static/chunks/app/page-c5b9f4407416c3f9.js"],"async":false},"/home/runner/work/jarela/jarela/components/setup/UnlockScreen.tsx":{"id":2283,"name":"*","chunks":["4502","static/chunks/4502-086e97fb92e704ad.js","962","static/chunks/962-fe2372e00f85e23a.js","2747","static/chunks/2747-4a6287cacd57d231.js","8974","static/chunks/app/page-c5b9f4407416c3f9.js"],"async":false},"/home/runner/work/jarela/jarela/components/setup/OnboardingWizard.tsx":{"id":8753,"name":"*","chunks":[],"async":false}},"entryCSSFiles":{"/home/runner/work/jarela/jarela/":[],"/home/runner/work/jarela/jarela/app/layout":[{"inlined":false,"path":"static/css/b8e04d59a2bfff04.css"}],"/home/runner/work/jarela/jarela/app/page":[{"inlined":false,"path":"static/css/61d4279c2300e146.css"}]},"rscModuleMapping":{"484":{"*":{"id":"98562","name":"*","chunks":[],"async":false}},"722":{"*":{"id":"13236","name":"*","chunks":[],"async":false}},"737":{"*":{"id":"28383","name":"*","chunks":[],"async":false}},"1304":{"*":{"id":"15098","name":"*","chunks":[],"async":false}},"2283":{"*":{"id":"67181","name":"*","chunks":[],"async":false}},"3639":{"*":{"id":"25933","name":"*","chunks":[],"async":false}},"4581":{"*":{"id":"16237","name":"*","chunks":[],"async":false}},"4777":{"*":{"id":"33859","name":"*","chunks":[],"async":false}},"6869":{"*":{"id":"36675","name":"*","chunks":[],"async":false}},"6872":{"*":{"id":"82704","name":"*","chunks":[],"async":false}},"7121":{"*":{"id":"98099","name":"*","chunks":[],"async":false}},"7123":{"*":{"id":"95547","name":"*","chunks":[],"async":false}},"8616":{"*":{"id":"47644","name":"*","chunks":[],"async":false}},"8753":{"*":{"id":"59275","name":"*","chunks":[],"async":false}},"9998":{"*":{"id":"59255","name":"*","chunks":[],"async":false}}},"edgeRscModuleMapping":{}};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
globalThis.__RSC_MANIFEST=(globalThis.__RSC_MANIFEST||{});globalThis.__RSC_MANIFEST["/setup/page"]={"moduleLoading":{"prefix":"/_next/"},"ssrModuleMapping":{"484":{"*":{"id":"70664","name":"*","chunks":[],"async":false}},"722":{"*":{"id":"86486","name":"*","chunks":[],"async":false}},"737":{"*":{"id":"41005","name":"*","chunks":[],"async":false}},"1304":{"*":{"id":"60440","name":"*","chunks":[],"async":false}},"2283":{"*":{"id":"26751","name":"*","chunks":[],"async":false}},"3639":{"*":{"id":"35419","name":"*","chunks":[],"async":false}},"4581":{"*":{"id":"61335","name":"*","chunks":[],"async":false}},"4777":{"*":{"id":"82265","name":"*","chunks":[],"async":false}},"6869":{"*":{"id":"74661","name":"*","chunks":[],"async":false}},"7121":{"*":{"id":"35421","name":"*","chunks":[],"async":false}},"7123":{"*":{"id":"81921","name":"*","chunks":[],"async":false}},"
|
|
1
|
+
globalThis.__RSC_MANIFEST=(globalThis.__RSC_MANIFEST||{});globalThis.__RSC_MANIFEST["/setup/page"]={"moduleLoading":{"prefix":"/_next/"},"ssrModuleMapping":{"484":{"*":{"id":"70664","name":"*","chunks":[],"async":false}},"722":{"*":{"id":"86486","name":"*","chunks":[],"async":false}},"737":{"*":{"id":"41005","name":"*","chunks":[],"async":false}},"1304":{"*":{"id":"60440","name":"*","chunks":[],"async":false}},"2283":{"*":{"id":"26751","name":"*","chunks":[],"async":false}},"3639":{"*":{"id":"35419","name":"*","chunks":[],"async":false}},"4581":{"*":{"id":"61335","name":"*","chunks":[],"async":false}},"4777":{"*":{"id":"82265","name":"*","chunks":[],"async":false}},"6869":{"*":{"id":"74661","name":"*","chunks":[],"async":false}},"7121":{"*":{"id":"35421","name":"*","chunks":[],"async":false}},"7123":{"*":{"id":"81921","name":"*","chunks":[],"async":false}},"8616":{"*":{"id":"84342","name":"*","chunks":[],"async":false}},"8753":{"*":{"id":"21936","name":"*","chunks":[],"async":false}},"9998":{"*":{"id":"19674","name":"*","chunks":[],"async":false}}},"edgeSSRModuleMapping":{},"clientModules":{"/home/runner/work/jarela/jarela/node_modules/next/dist/client/components/builtin/global-error.js":{"id":7123,"name":"*","chunks":[],"async":false},"/home/runner/work/jarela/jarela/node_modules/next/dist/esm/client/components/builtin/global-error.js":{"id":7123,"name":"*","chunks":[],"async":false},"/home/runner/work/jarela/jarela/node_modules/next/dist/client/components/client-page.js":{"id":1304,"name":"*","chunks":[],"async":false},"/home/runner/work/jarela/jarela/node_modules/next/dist/esm/client/components/client-page.js":{"id":1304,"name":"*","chunks":[],"async":false},"/home/runner/work/jarela/jarela/node_modules/next/dist/client/components/client-segment.js":{"id":8616,"name":"*","chunks":[],"async":false},"/home/runner/work/jarela/jarela/node_modules/next/dist/esm/client/components/client-segment.js":{"id":8616,"name":"*","chunks":[],"async":false},"/home/runner/work/jarela/jarela/node_modules/next/dist/client/components/http-access-fallback/error-boundary.js":{"id":4777,"name":"*","chunks":[],"async":false},"/home/runner/work/jarela/jarela/node_modules/next/dist/esm/client/components/http-access-fallback/error-boundary.js":{"id":4777,"name":"*","chunks":[],"async":false},"/home/runner/work/jarela/jarela/node_modules/next/dist/client/components/layout-router.js":{"id":7121,"name":"*","chunks":[],"async":false},"/home/runner/work/jarela/jarela/node_modules/next/dist/esm/client/components/layout-router.js":{"id":7121,"name":"*","chunks":[],"async":false},"/home/runner/work/jarela/jarela/node_modules/next/dist/client/components/render-from-template-context.js":{"id":4581,"name":"*","chunks":[],"async":false},"/home/runner/work/jarela/jarela/node_modules/next/dist/esm/client/components/render-from-template-context.js":{"id":4581,"name":"*","chunks":[],"async":false},"/home/runner/work/jarela/jarela/node_modules/next/dist/lib/framework/boundary-components.js":{"id":484,"name":"*","chunks":[],"async":false},"/home/runner/work/jarela/jarela/node_modules/next/dist/esm/lib/framework/boundary-components.js":{"id":484,"name":"*","chunks":[],"async":false},"/home/runner/work/jarela/jarela/node_modules/next/dist/lib/metadata/generate/icon-mark.js":{"id":6869,"name":"*","chunks":[],"async":false},"/home/runner/work/jarela/jarela/node_modules/next/dist/esm/lib/metadata/generate/icon-mark.js":{"id":6869,"name":"*","chunks":[],"async":false},"/home/runner/work/jarela/jarela/app/globals.css":{"id":6872,"name":"*","chunks":["7177","static/chunks/app/layout-84c6f211a7a1ca36.js"],"async":false},"/home/runner/work/jarela/jarela/components/ui/ServiceWorkerRegistration.tsx":{"id":722,"name":"*","chunks":["7177","static/chunks/app/layout-84c6f211a7a1ca36.js"],"async":false},"/home/runner/work/jarela/jarela/contexts/AppContext.tsx":{"id":3639,"name":"*","chunks":["7177","static/chunks/app/layout-84c6f211a7a1ca36.js"],"async":false},"/home/runner/work/jarela/jarela/contexts/ThemeContext.tsx":{"id":737,"name":"*","chunks":["7177","static/chunks/app/layout-84c6f211a7a1ca36.js"],"async":false},"/home/runner/work/jarela/jarela/components/layout/AppShell.tsx":{"id":9998,"name":"*","chunks":["4502","static/chunks/4502-086e97fb92e704ad.js","962","static/chunks/962-fe2372e00f85e23a.js","2747","static/chunks/2747-4a6287cacd57d231.js","8974","static/chunks/app/page-c5b9f4407416c3f9.js"],"async":false},"/home/runner/work/jarela/jarela/components/setup/UnlockScreen.tsx":{"id":2283,"name":"*","chunks":["4502","static/chunks/4502-086e97fb92e704ad.js","2747","static/chunks/2747-4a6287cacd57d231.js","620","static/chunks/app/setup/page-d0f616216e2e1c68.js"],"async":false},"/home/runner/work/jarela/jarela/components/setup/OnboardingWizard.tsx":{"id":8753,"name":"*","chunks":["4502","static/chunks/4502-086e97fb92e704ad.js","2747","static/chunks/2747-4a6287cacd57d231.js","620","static/chunks/app/setup/page-d0f616216e2e1c68.js"],"async":false}},"entryCSSFiles":{"/home/runner/work/jarela/jarela/":[],"/home/runner/work/jarela/jarela/app/layout":[{"inlined":false,"path":"static/css/b8e04d59a2bfff04.css"}],"/home/runner/work/jarela/jarela/app/page":[{"inlined":false,"path":"static/css/61d4279c2300e146.css"}],"/home/runner/work/jarela/jarela/app/setup/page":[]},"rscModuleMapping":{"484":{"*":{"id":"98562","name":"*","chunks":[],"async":false}},"722":{"*":{"id":"13236","name":"*","chunks":[],"async":false}},"737":{"*":{"id":"28383","name":"*","chunks":[],"async":false}},"1304":{"*":{"id":"15098","name":"*","chunks":[],"async":false}},"2283":{"*":{"id":"67181","name":"*","chunks":[],"async":false}},"3639":{"*":{"id":"25933","name":"*","chunks":[],"async":false}},"4581":{"*":{"id":"16237","name":"*","chunks":[],"async":false}},"4777":{"*":{"id":"33859","name":"*","chunks":[],"async":false}},"6869":{"*":{"id":"36675","name":"*","chunks":[],"async":false}},"6872":{"*":{"id":"82704","name":"*","chunks":[],"async":false}},"7121":{"*":{"id":"98099","name":"*","chunks":[],"async":false}},"7123":{"*":{"id":"95547","name":"*","chunks":[],"async":false}},"8616":{"*":{"id":"47644","name":"*","chunks":[],"async":false}},"8753":{"*":{"id":"59275","name":"*","chunks":[],"async":false}},"9998":{"*":{"id":"59255","name":"*","chunks":[],"async":false}}},"edgeRscModuleMapping":{}};
|
|
@@ -100,8 +100,8 @@
|
|
|
100
100
|
"/api/v1/watchers/route": "app/api/v1/watchers/route.js",
|
|
101
101
|
"/icon.svg/route": "app/icon.svg/route.js",
|
|
102
102
|
"/api/v1/bridges/[id]/chats/route": "app/api/v1/bridges/[id]/chats/route.js",
|
|
103
|
-
"/api/v1/bridges/[id]/lookup/route": "app/api/v1/bridges/[id]/lookup/route.js",
|
|
104
103
|
"/api/v1/bridges/[id]/pair/route": "app/api/v1/bridges/[id]/pair/route.js",
|
|
104
|
+
"/api/v1/bridges/[id]/lookup/route": "app/api/v1/bridges/[id]/lookup/route.js",
|
|
105
105
|
"/api/v1/bridges/[id]/status/route": "app/api/v1/bridges/[id]/status/route.js",
|
|
106
106
|
"/api/v1/bridges/[id]/route": "app/api/v1/bridges/[id]/route.js",
|
|
107
107
|
"/api/v1/events/route": "app/api/v1/events/route.js",
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"4045.js","mappings":"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","sources":["webpack://@circuitwall/jarela/_N_E/./components/ui/ServiceWorkerRegistration.tsx/__nextjs-internal-proxy.mjs","webpack://@circuitwall/jarela/_N_E/./contexts/AppContext.tsx/__nextjs-internal-proxy.mjs","webpack://@circuitwall/jarela/_N_E/./contexts/ThemeContext.tsx/__nextjs-internal-proxy.mjs","webpack://@circuitwall/jarela/./app/layout.tsx","webpack://@circuitwall/jarela/./contexts/AppContext.tsx","webpack://@circuitwall/jarela/?5364","webpack://@circuitwall/jarela/./contexts/ThemeContext.tsx","webpack://@circuitwall/jarela/./lib/env/app-config.ts","webpack://@circuitwall/jarela/?e859","webpack://@circuitwall/jarela/?cd2b","webpack://@circuitwall/jarela/?ea39","webpack://@circuitwall/jarela/./app/globals.css","webpack://@circuitwall/jarela/./app/icon.svg","webpack://@circuitwall/jarela/./components/ui/ServiceWorkerRegistration.tsx","webpack://@circuitwall/jarela/?7241","webpack://@circuitwall/jarela/?c6d3"],"sourcesContent":["// This file is generated by the Webpack next-flight-loader.\nimport { registerClientReference } from \"react-server-dom-webpack/server\";\nexport const ServiceWorkerRegistration = registerClientReference(\nfunction() { throw new Error(\"Attempted to call ServiceWorkerRegistration() from the server but ServiceWorkerRegistration is on the client. It's not possible to invoke a client function from the server, it can only be rendered as a Component or passed to props of a Client Component.\"); },\n\"/home/runner/work/jarela/jarela/components/ui/ServiceWorkerRegistration.tsx\",\n\"ServiceWorkerRegistration\",\n);","// This file is generated by the Webpack next-flight-loader.\nimport { registerClientReference } from \"react-server-dom-webpack/server\";\nexport const AppProvider = registerClientReference(\nfunction() { throw new Error(\"Attempted to call AppProvider() from the server but AppProvider is on the client. It's not possible to invoke a client function from the server, it can only be rendered as a Component or passed to props of a Client Component.\"); },\n\"/home/runner/work/jarela/jarela/contexts/AppContext.tsx\",\n\"AppProvider\",\n);export const useAppContext = registerClientReference(\nfunction() { throw new Error(\"Attempted to call useAppContext() from the server but useAppContext is on the client. It's not possible to invoke a client function from the server, it can only be rendered as a Component or passed to props of a Client Component.\"); },\n\"/home/runner/work/jarela/jarela/contexts/AppContext.tsx\",\n\"useAppContext\",\n);","// This file is generated by the Webpack next-flight-loader.\nimport { registerClientReference } from \"react-server-dom-webpack/server\";\nexport const ThemeProvider = registerClientReference(\nfunction() { throw new Error(\"Attempted to call ThemeProvider() from the server but ThemeProvider is on the client. It's not possible to invoke a client function from the server, it can only be rendered as a Component or passed to props of a Client Component.\"); },\n\"/home/runner/work/jarela/jarela/contexts/ThemeContext.tsx\",\n\"ThemeProvider\",\n);export const useTheme = registerClientReference(\nfunction() { throw new Error(\"Attempted to call useTheme() from the server but useTheme is on the client. It's not possible to invoke a client function from the server, it can only be rendered as a Component or passed to props of a Client Component.\"); },\n\"/home/runner/work/jarela/jarela/contexts/ThemeContext.tsx\",\n\"useTheme\",\n);","import type { Metadata, Viewport } from \"next\";\nimport { AppProvider } from \"@/contexts/AppContext\";\nimport { ThemeProvider } from \"@/contexts/ThemeContext\";\nimport { ServiceWorkerRegistration } from \"@/components/ui/ServiceWorkerRegistration\";\nimport { getAppName, getAppDescription } from \"@/lib/env/app-config\";\nimport \"./globals.css\";\n\nexport const metadata: Metadata = {\n title: getAppName(),\n description: getAppDescription(),\n manifest: \"/manifest.json\",\n icons: {\n // SVG favicon is theme-aware (prefers-color-scheme inside the SVG),\n // so it flips between navy J (light UI) and sky J (dark UI) without\n // shipping two payloads. PNG/ICO fall through for older browsers.\n icon: [\n { url: \"/favicon.svg\", type: \"image/svg+xml\" },\n { url: \"/favicon.ico\", sizes: \"any\" },\n { url: \"/icon-192.png\", type: \"image/png\", sizes: \"192x192\" },\n { url: \"/icon-512.png\", type: \"image/png\", sizes: \"512x512\" },\n ],\n // iOS reads ONE apple-touch-icon and ignores prefers-color-scheme,\n // so we hand it the dark navy variant (reads on any wallpaper). The\n // light-bg companion is shipped at /apple-touch-icon-light.png for\n // anyone who wants to opt in via a custom <link> tag.\n apple: [{ url: \"/apple-touch-icon.png\", sizes: \"180x180\" }],\n },\n // iOS standalone-mode PWA chrome. Safari ignores the manifest's\n // `theme_color` once the app is installed to the home screen and only\n // honors these Apple-specific tags. `black-translucent` is the only\n // value that produces an arbitrary status-bar color: the bar overlays\n // the page and whatever paints under it (the AppShell top bar, which\n // already pads itself with env(safe-area-inset-top) via --app-safe-top)\n // becomes the visible status-bar background. So the top bar's surface\n // color follows the active light/dark theme automatically.\n appleWebApp: {\n capable: true,\n title: getAppName(),\n statusBarStyle: \"black-translucent\",\n },\n};\n\n// Next 15+ requires themeColor (and color-scheme, viewport, etc.) to live in\n// the viewport export, not metadata. The /_not-found warning came from Next\n// inheriting this same layout — moving it here fixes both routes at once.\n// Match the installed-PWA window chrome (desktop title bar, mobile address\n// bar, splash) to the active surface color. Two entries let the OS pick\n// based on prefers-color-scheme; the runtime ThemeContext / pre-paint\n// script overrides this single <meta name=\"theme-color\"> tag when the\n// user picks an explicit light/dark mode.\nexport const viewport: Viewport = {\n themeColor: [\n { media: \"(prefers-color-scheme: light)\", color: \"#ffffff\" },\n { media: \"(prefers-color-scheme: dark)\", color: \"#09090b\" },\n ],\n width: \"device-width\",\n initialScale: 1,\n maximumScale: 1,\n viewportFit: \"cover\",\n // Chromium-only: shrink the layout viewport when the OS keyboard\n // appears, so `100dvh` automatically sits above the keyboard. Safari\n // doesn't implement this key (it logs a benign console warning, see\n // tests/e2e/smoke.spec.ts allow-list) and instead `dvh` itself already\n // tracks the keyboard on iOS 16.4+ PWA, so no extra JS is needed.\n interactiveWidget: \"resizes-content\",\n};\n\n// Pre-paint script: reads the persisted theme and sets `data-theme` on\n// <html> before the first paint, so light-mode users don't flash dark on\n// every page load. Inlined via dangerouslySetInnerHTML — the canonical\n// App Router pattern. (Earlier attempt routed this through next/script,\n// but under Next 16 + React 19.2 that import resolves to a Promise in\n// some module-resolution paths, tripping \"Element type is invalid\".)\n// Falls back to \"system\", which then defers to prefers-color-scheme.\nconst themeBootstrap = `(() => {\n var LIGHT = \"#ffffff\", DARK = \"#09090b\";\n function resolve(t) {\n if (t === \"light\") return LIGHT;\n if (t === \"dark\") return DARK;\n try {\n return window.matchMedia(\"(prefers-color-scheme: dark)\").matches ? DARK : LIGHT;\n } catch (e) { return DARK; }\n }\n try {\n var t = localStorage.getItem(\"jarela-theme\");\n if (t !== \"light\" && t !== \"dark\" && t !== \"system\") t = \"system\";\n document.documentElement.setAttribute(\"data-theme\", t);\n // Collapse any media-scoped theme-color metas Next emits to a single tag\n // so the PWA window chrome matches the user's explicit choice (not just\n // prefers-color-scheme). ThemeContext keeps this in sync on change.\n var metas = document.querySelectorAll('meta[name=\"theme-color\"]');\n for (var i = 1; i < metas.length; i++) metas[i].parentNode.removeChild(metas[i]);\n var meta = metas[0];\n if (!meta) {\n meta = document.createElement(\"meta\");\n meta.setAttribute(\"name\", \"theme-color\");\n document.head.appendChild(meta);\n }\n meta.removeAttribute(\"media\");\n meta.setAttribute(\"content\", resolve(t));\n } catch (e) {\n document.documentElement.setAttribute(\"data-theme\", \"system\");\n }\n})();`;\n\n// iOS Safari standalone-PWA viewport-height shim. On iPhones in\n// \"Add to Home Screen\" mode iOS reports window.innerHeight (and 100dvh\n// resolves against it) ~safe-area-inset-top pixels SHORTER than the\n// physical screen — about 59px on iPhone, 32px on iPad. That leaves a\n// gap below the app that the UA paints with the color-scheme default\n// (the white strip the user sees above the home-indicator). dvh, vh,\n// position:fixed inset:0, -webkit-fill-available — none of them fill\n// the physical screen in standalone PWA mode.\n//\n// The community-validated fix (boolinator/ios-pwa-bottom-bar-fix.md,\n// stackoverflow.com/q/79902310) is a JS shim: read visualViewport.height,\n// add safe-area-inset-top back when the gap matches the bug signature,\n// and write the corrected pixel value into --actual-vh on <html>.\n// CSS then sizes the doc with var(--actual-vh, 100dvh) so non-iOS\n// browsers keep using the standard primitive.\n//\n// Retries at 50/150/300/500/800/1200ms cover iOS's async safe-area\n// population on launch. visualViewport.resize, orientationchange, and\n// visibilitychange handle keyboard/rotation/app-switch.\nconst iosViewportBootstrap = `(() => {\n try {\n var isPWA = window.matchMedia('(display-mode: standalone)').matches\n || window.matchMedia('(display-mode: fullscreen)').matches\n || window.navigator.standalone === true;\n if (!isPWA) return;\n var last = 0;\n function safeTopPx() {\n var v = getComputedStyle(document.documentElement).getPropertyValue('--app-safe-top') || '';\n var n = parseFloat(v);\n return isNaN(n) ? 0 : n;\n }\n function isEditableFocused() {\n var ae = document.activeElement;\n if (!ae) return false;\n var tag = ae.tagName;\n return tag === 'INPUT' || tag === 'TEXTAREA' || ae.isContentEditable === true;\n }\n function apply() {\n var vv = window.visualViewport;\n var vh = (vv && vv.height) || window.innerHeight;\n // Keyboard-open detection: when iOS shows the on-screen keyboard,\n // visualViewport.height shrinks but window.innerHeight stays put.\n // Pairing that gap with editable-focus makes it model-agnostic -\n // no need to guess a keyboard height per device (SE ~216, 15 Pro\n // Max ~301, iPad floating ~120). 50px just filters URL-bar jitter.\n var keyboardOpen = isEditableFocused() && (window.innerHeight - vh) > 50;\n var isPortrait = window.innerHeight > window.innerWidth;\n // Skip the chin correction while the keyboard is up - otherwise we\n // inflate --actual-vh beyond the visible viewport and the input bar\n // ends up underneath the keyboard.\n if (!keyboardOpen && isPortrait) {\n var screenH = Math.max(window.screen.height, window.screen.width);\n if (screenH - vh > 15) {\n var top = safeTopPx();\n if (top > 0) vh += top;\n }\n }\n document.documentElement.style.setProperty('--actual-vh', vh + 'px');\n if (last > 0 && Math.abs(vh - last) > 30) {\n setTimeout(function () { window.dispatchEvent(new Event('resize')); }, 50);\n }\n last = vh;\n }\n apply();\n [50, 150, 300, 500, 800, 1200].forEach(function (ms) { setTimeout(apply, ms); });\n window.addEventListener('resize', apply);\n window.addEventListener('orientationchange', function () {\n setTimeout(apply, 100); setTimeout(apply, 300);\n });\n if (window.visualViewport) {\n window.visualViewport.addEventListener('resize', apply);\n window.visualViewport.addEventListener('scroll', apply);\n }\n // focusin/focusout can lead visualViewport.resize by ~100ms on\n // older iOS - recompute immediately so we don't render a bad frame.\n document.addEventListener('focusin', apply, true);\n document.addEventListener('focusout', apply, true);\n // iOS still scrolls the layout viewport up when the keyboard opens\n // to keep the focused input visible, even with html/body overflow:hidden.\n // Aggressive scroll-reset on focus events counteracts it (piclaw PWA.md\n // pattern, validated on iOS 26.x). Staggered timers cover the lag\n // between focus and iOS's scroll-into-view.\n function snapScroll() {\n if (window.scrollY !== 0 || window.pageYOffset !== 0) {\n window.scrollTo(0, 0);\n }\n }\n document.addEventListener('focusin', function () {\n snapScroll();\n [16, 50, 100, 200, 400].forEach(function (ms) { setTimeout(snapScroll, ms); });\n }, true);\n document.addEventListener('focusout', function () {\n [16, 50, 100, 200].forEach(function (ms) { setTimeout(snapScroll, ms); });\n }, true);\n if (window.visualViewport) {\n window.visualViewport.addEventListener('scroll', snapScroll);\n }\n window.addEventListener('scroll', snapScroll, { passive: true });\n document.addEventListener('visibilitychange', function () {\n if (!document.hidden) { setTimeout(apply, 50); setTimeout(apply, 200); }\n });\n } catch (e) { /* non-fatal: falls back to 100dvh */ }\n})();`;\n\nexport default function RootLayout({ children }: { children: React.ReactNode }) {\n return (\n <html lang=\"en\" data-theme=\"system\" suppressHydrationWarning>\n <head>\n <script dangerouslySetInnerHTML={{ __html: themeBootstrap }} />\n <script dangerouslySetInnerHTML={{ __html: iosViewportBootstrap }} />\n </head>\n <body>\n <ThemeProvider>\n <AppProvider>{children}</AppProvider>\n </ThemeProvider>\n <ServiceWorkerRegistration />\n </body>\n </html>\n );\n}\n","\"use client\";\nimport { createContext, useContext, useEffect, useReducer, type ReactNode } from \"react\";\n\nexport type ExperienceMode = \"essential\" | \"full\";\n\nconst EXPERIENCE_MODE_KEY = \"jarela.experience.mode\";\n\n// Back-compat: pre-rename builds stored \"normal\" / \"advanced\". Read those\n// values silently so an upgrade does not reset the user's choice.\nfunction parseStoredMode(raw: string | null): ExperienceMode | null {\n if (raw === \"essential\" || raw === \"normal\") return \"essential\";\n if (raw === \"full\" || raw === \"advanced\") return \"full\";\n return null;\n}\n\nexport type Tab = \"chat\" | \"dashboard\" | \"agents\" | \"memory\" | \"documents\" | \"models\" | \"credentials\" | \"mcp\" | \"extensions\" | \"tools\" | \"tasks\" | \"bridges\" | \"profile\" | \"harness\" | \"logs\" | \"env\";\n\ninterface AppState {\n activeThreadId: string | null;\n activeAgentId: string | null;\n activeTab: Tab;\n experienceMode: ExperienceMode;\n // Per-tab sub-selection (a sub-tab key under credentials, an mcp server name, an\n // agent uuid, a profile subsection slug, …). Settings panels read their\n // slot to scroll-to + highlight; the URL mirrors this via `?item=<id>`.\n selectedItem: Partial<Record<Tab, string>>;\n}\n\ntype Action =\n | { type: \"SELECT_THREAD\"; threadId: string; agentId: string }\n | { type: \"NEW_CHAT\" }\n | { type: \"SET_AGENT\"; agentId: string }\n | { type: \"SET_TAB\"; tab: Tab }\n | { type: \"SET_EXPERIENCE_MODE\"; mode: ExperienceMode }\n | { type: \"SET_SELECTION\"; tab: Tab; itemId: string | null };\n\nfunction reducer(state: AppState, action: Action): AppState {\n switch (action.type) {\n case \"SELECT_THREAD\":\n return { ...state, activeThreadId: action.threadId, activeAgentId: action.agentId, activeTab: \"chat\" };\n case \"NEW_CHAT\":\n return { ...state, activeThreadId: null, activeAgentId: null, activeTab: \"chat\" };\n case \"SET_AGENT\":\n return { ...state, activeAgentId: action.agentId };\n case \"SET_TAB\":\n return { ...state, activeTab: action.tab };\n case \"SET_EXPERIENCE_MODE\":\n return { ...state, experienceMode: action.mode };\n case \"SET_SELECTION\": {\n const next = { ...state.selectedItem };\n if (action.itemId == null) delete next[action.tab];\n else next[action.tab] = action.itemId;\n return { ...state, selectedItem: next };\n }\n }\n}\n\nconst AppContext = createContext<{ state: AppState; dispatch: React.Dispatch<Action> } | null>(null);\n\nexport function AppProvider({ children }: { children: ReactNode }) {\n const [state, dispatch] = useReducer(reducer, {\n activeThreadId: null,\n activeAgentId: null,\n activeTab: \"chat\",\n experienceMode: \"essential\",\n selectedItem: {},\n });\n\n useEffect(() => {\n try {\n const stored = parseStoredMode(window.localStorage.getItem(EXPERIENCE_MODE_KEY));\n if (stored) {\n dispatch({ type: \"SET_EXPERIENCE_MODE\", mode: stored });\n }\n } catch {\n // ignore storage failures\n }\n }, []);\n\n useEffect(() => {\n try {\n window.localStorage.setItem(EXPERIENCE_MODE_KEY, state.experienceMode);\n } catch {\n // ignore storage failures\n }\n }, [state.experienceMode]);\n\n return <AppContext.Provider value={{ state, dispatch }}>{children}</AppContext.Provider>;\n}\n\nexport function useAppContext() {\n const ctx = useContext(AppContext);\n if (!ctx) throw new Error(\"useAppContext must be used within AppProvider\");\n return ctx;\n}\n","import(/* webpackMode: \"eager\", webpackExports: [\"ServiceWorkerRegistration\"] */ \"/home/runner/work/jarela/jarela/components/ui/ServiceWorkerRegistration.tsx\");\n;\nimport(/* webpackMode: \"eager\", webpackExports: [\"AppProvider\"] */ \"/home/runner/work/jarela/jarela/contexts/AppContext.tsx\");\n;\nimport(/* webpackMode: \"eager\", webpackExports: [\"ThemeProvider\"] */ \"/home/runner/work/jarela/jarela/contexts/ThemeContext.tsx\");\n","\"use client\";\nimport { createContext, useCallback, useContext, useEffect, useState, type ReactNode } from \"react\";\n\nexport type Theme = \"light\" | \"dark\" | \"system\";\n\nconst STORAGE_KEY = \"jarela-theme\";\n\nfunction isTheme(v: unknown): v is Theme {\n return v === \"light\" || v === \"dark\" || v === \"system\";\n}\n\nfunction readStored(): Theme {\n if (typeof window === \"undefined\") return \"system\";\n try {\n const v = window.localStorage.getItem(STORAGE_KEY);\n return isTheme(v) ? v : \"system\";\n } catch {\n return \"system\";\n }\n}\n\nconst LIGHT_CHROME = \"#ffffff\";\nconst DARK_CHROME = \"#09090b\";\n\nfunction resolveChrome(theme: Theme): string {\n if (theme === \"light\") return LIGHT_CHROME;\n if (theme === \"dark\") return DARK_CHROME;\n if (typeof window === \"undefined\") return DARK_CHROME;\n return window.matchMedia(\"(prefers-color-scheme: dark)\").matches ? DARK_CHROME : LIGHT_CHROME;\n}\n\n// Keep the single <meta name=\"theme-color\"> tag (installed by the pre-paint\n// script in app/layout.tsx) aligned with the active surface so the PWA's\n// desktop title bar and mobile address bar match the theme.\nfunction syncChrome(theme: Theme) {\n if (typeof document === \"undefined\") return;\n const meta = document.querySelector('meta[name=\"theme-color\"]');\n if (meta) meta.setAttribute(\"content\", resolveChrome(theme));\n}\n\nfunction apply(theme: Theme) {\n if (typeof document === \"undefined\") return;\n document.documentElement.setAttribute(\"data-theme\", theme);\n syncChrome(theme);\n}\n\ninterface Ctx {\n theme: Theme;\n setTheme: (t: Theme) => void;\n}\n\nconst ThemeContext = createContext<Ctx | null>(null);\n\nexport function ThemeProvider({ children }: { children: ReactNode }) {\n // Initial state stays \"system\" on the server to match the pre-paint script,\n // which writes data-theme before React hydrates. The effect below syncs the\n // React state to whatever the script (or localStorage) decided.\n const [theme, setThemeState] = useState<Theme>(\"system\");\n\n useEffect(() => {\n const stored = readStored();\n setThemeState(stored);\n // When in \"system\" mode, mirror OS-level changes into the PWA chrome.\n if (typeof window === \"undefined\") return;\n const mq = window.matchMedia(\"(prefers-color-scheme: dark)\");\n const onChange = () => {\n if (readStored() === \"system\") syncChrome(\"system\");\n };\n mq.addEventListener?.(\"change\", onChange);\n return () => mq.removeEventListener?.(\"change\", onChange);\n }, []);\n\n const setTheme = useCallback((t: Theme) => {\n setThemeState(t);\n apply(t);\n try {\n window.localStorage.setItem(STORAGE_KEY, t);\n } catch {\n /* ignore quota / private-mode errors */\n }\n }, []);\n\n return <ThemeContext.Provider value={{ theme, setTheme }}>{children}</ThemeContext.Provider>;\n}\n\nexport function useTheme() {\n const ctx = useContext(ThemeContext);\n if (!ctx) throw new Error(\"useTheme must be used within ThemeProvider\");\n return ctx;\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","import(/* webpackMode: \"eager\", webpackExports: [\"ServiceWorkerRegistration\"] */ \"/home/runner/work/jarela/jarela/components/ui/ServiceWorkerRegistration.tsx\");\n;\nimport(/* webpackMode: \"eager\", webpackExports: [\"AppProvider\"] */ \"/home/runner/work/jarela/jarela/contexts/AppContext.tsx\");\n;\nimport(/* webpackMode: \"eager\", webpackExports: [\"ThemeProvider\"] */ \"/home/runner/work/jarela/jarela/contexts/ThemeContext.tsx\");\n","import(/* webpackMode: \"eager\" */ \"/home/runner/work/jarela/jarela/node_modules/next/dist/client/components/builtin/global-error.js\");\n;\nimport(/* webpackMode: \"eager\" */ \"/home/runner/work/jarela/jarela/node_modules/next/dist/client/components/client-page.js\");\n;\nimport(/* webpackMode: \"eager\" */ \"/home/runner/work/jarela/jarela/node_modules/next/dist/client/components/client-segment.js\");\n;\nimport(/* webpackMode: \"eager\" */ \"/home/runner/work/jarela/jarela/node_modules/next/dist/client/components/http-access-fallback/error-boundary.js\");\n;\nimport(/* webpackMode: \"eager\" */ \"/home/runner/work/jarela/jarela/node_modules/next/dist/client/components/layout-router.js\");\n;\nimport(/* webpackMode: \"eager\" */ \"/home/runner/work/jarela/jarela/node_modules/next/dist/client/components/render-from-template-context.js\");\n;\nimport(/* webpackMode: \"eager\" */ \"/home/runner/work/jarela/jarela/node_modules/next/dist/lib/framework/boundary-components.js\");\n;\nimport(/* webpackMode: \"eager\" */ \"/home/runner/work/jarela/jarela/node_modules/next/dist/lib/metadata/generate/icon-mark.js\");\n","import(/* webpackMode: \"eager\" */ \"/home/runner/work/jarela/jarela/node_modules/next/dist/client/components/builtin/global-error.js\");\n",""," import { fillMetadataSegment } from 'next/dist/lib/metadata/get-metadata-route'\n\n export default async (props) => {\n const imageData = {\"type\":\"image/svg+xml\",\"sizes\":\"any\"}\n const imageUrl = fillMetadataSegment(\".\", await props.params, \"icon.svg\", true)\n\n return [{\n ...imageData,\n url: imageUrl + \"?44694c2d5379230a\",\n }]\n }","\"use client\";\n\nimport { useEffect } from \"react\";\n\n/**\n * Registers the Serwist-generated service worker. Replaces the auto-injected\n * registration script that next-pwa used to emit. Only runs in production\n * (the SW is disabled in dev by withSerwist).\n */\nexport function ServiceWorkerRegistration() {\n useEffect(() => {\n if (typeof window === \"undefined\") return;\n if (!(\"serviceWorker\" in navigator)) return;\n\n if (process.env.NODE_ENV !== \"production\") {\n // Dev mode safety: if a previous production build registered a SW,\n // it can keep serving stale assets even though SW is disabled now.\n // Purge registrations + caches once per tab session.\n const key = \"jarela.dev.sw-cleaned\";\n if (!window.sessionStorage.getItem(key)) {\n navigator.serviceWorker\n .getRegistrations()\n .then((regs) => Promise.all(regs.map((r) => r.unregister())))\n .catch(() => {\n /* ignore */\n });\n if (\"caches\" in window) {\n caches\n .keys()\n .then((names) => Promise.all(names.map((name) => caches.delete(name))))\n .catch(() => {\n /* ignore */\n });\n }\n window.sessionStorage.setItem(key, \"1\");\n }\n return;\n }\n\n // Defer to idle so we don't compete with the first paint.\n const register = () => {\n navigator.serviceWorker\n .register(\"/sw.js\", { scope: \"/\" })\n .catch((err) => {\n // Swallow — SW failures should never break the app.\n console.warn(\"[sw] registration failed:\", err);\n });\n };\n if (\"requestIdleCallback\" in window) {\n (window as Window & { requestIdleCallback: (cb: () => void) => void })\n .requestIdleCallback(register);\n } else {\n setTimeout(register, 1000);\n }\n }, []);\n return null;\n}\n","import(/* webpackMode: \"eager\" */ \"/home/runner/work/jarela/jarela/node_modules/next/dist/client/components/builtin/global-error.js\");\n;\nimport(/* webpackMode: \"eager\" */ \"/home/runner/work/jarela/jarela/node_modules/next/dist/client/components/client-page.js\");\n;\nimport(/* webpackMode: \"eager\" */ \"/home/runner/work/jarela/jarela/node_modules/next/dist/client/components/client-segment.js\");\n;\nimport(/* webpackMode: \"eager\" */ \"/home/runner/work/jarela/jarela/node_modules/next/dist/client/components/http-access-fallback/error-boundary.js\");\n;\nimport(/* webpackMode: \"eager\" */ \"/home/runner/work/jarela/jarela/node_modules/next/dist/client/components/layout-router.js\");\n;\nimport(/* webpackMode: \"eager\" */ \"/home/runner/work/jarela/jarela/node_modules/next/dist/client/components/render-from-template-context.js\");\n;\nimport(/* webpackMode: \"eager\" */ \"/home/runner/work/jarela/jarela/node_modules/next/dist/lib/framework/boundary-components.js\");\n;\nimport(/* webpackMode: \"eager\" */ \"/home/runner/work/jarela/jarela/node_modules/next/dist/lib/metadata/generate/icon-mark.js\");\n","import(/* webpackMode: \"eager\" */ \"/home/runner/work/jarela/jarela/node_modules/next/dist/client/components/builtin/global-error.js\");\n"],"names":["AppProvider","ThemeProvider","ServiceWorkerRegistration","getAppName","getAppDescription","metadata","title","description","manifest","icons","icon","url","type","sizes","apple","appleWebApp","capable","statusBarStyle","viewport","themeColor","media","color","width","initialScale","maximumScale","viewportFit","interactiveWidget","themeBootstrap","iosViewportBootstrap","RootLayout","children","html","lang","data-theme","suppressHydrationWarning","head","script","dangerouslySetInnerHTML","__html","body","createContext","useContext","useEffect","useReducer","EXPERIENCE_MODE_KEY","parseStoredMode","raw","reducer","state","action","activeThreadId","threadId","activeAgentId","agentId","activeTab","tab","experienceMode","mode","next","selectedItem","itemId","AppContext","dispatch","stored","window","localStorage","getItem","setItem","Provider","value","useAppContext","ctx","Error","useCallback","useState","STORAGE_KEY","isTheme","v","readStored","LIGHT_CHROME","DARK_CHROME","resolveChrome","theme","matchMedia","matches","syncChrome","document","meta","querySelector","setAttribute","apply","documentElement","ThemeContext","setThemeState","mq","onChange","addEventListener","removeEventListener","setTheme","t","useTheme","DEFAULT_APP_NAME","DEFAULT_APP_DESCRIPTION","DEFAULT_ISSUE_URL","process","env","NEXT_PUBLIC_APP_NAME","trim","NEXT_PUBLIC_APP_DESCRIPTION","getAppIssueUrl","NEXT_PUBLIC_APP_ISSUE_URL","navigator","key","sessionStorage","serviceWorker","getRegistrations","then","regs","Promise","all","map","r","unregister","catch","caches","keys","names","name","delete","register","scope","err","console","warn","requestIdleCallback","setTimeout"],"sourceRoot":"","ignoreList":[0,1,2]}
|
|
1
|
+
{"version":3,"file":"4045.js","mappings":"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","sources":["webpack://@circuitwall/jarela/_N_E/./components/ui/ServiceWorkerRegistration.tsx/__nextjs-internal-proxy.mjs","webpack://@circuitwall/jarela/_N_E/./contexts/AppContext.tsx/__nextjs-internal-proxy.mjs","webpack://@circuitwall/jarela/_N_E/./contexts/ThemeContext.tsx/__nextjs-internal-proxy.mjs","webpack://@circuitwall/jarela/./app/layout.tsx","webpack://@circuitwall/jarela/./contexts/AppContext.tsx","webpack://@circuitwall/jarela/?5364","webpack://@circuitwall/jarela/./contexts/ThemeContext.tsx","webpack://@circuitwall/jarela/./lib/env/app-config.ts","webpack://@circuitwall/jarela/?e859","webpack://@circuitwall/jarela/?cd2b","webpack://@circuitwall/jarela/?ea39","webpack://@circuitwall/jarela/./app/globals.css","webpack://@circuitwall/jarela/./app/icon.svg","webpack://@circuitwall/jarela/./components/ui/ServiceWorkerRegistration.tsx","webpack://@circuitwall/jarela/?7241","webpack://@circuitwall/jarela/?c6d3"],"sourcesContent":["// This file is generated by the Webpack next-flight-loader.\nimport { registerClientReference } from \"react-server-dom-webpack/server\";\nexport const ServiceWorkerRegistration = registerClientReference(\nfunction() { throw new Error(\"Attempted to call ServiceWorkerRegistration() from the server but ServiceWorkerRegistration is on the client. It's not possible to invoke a client function from the server, it can only be rendered as a Component or passed to props of a Client Component.\"); },\n\"/home/runner/work/jarela/jarela/components/ui/ServiceWorkerRegistration.tsx\",\n\"ServiceWorkerRegistration\",\n);","// This file is generated by the Webpack next-flight-loader.\nimport { registerClientReference } from \"react-server-dom-webpack/server\";\nexport const AppProvider = registerClientReference(\nfunction() { throw new Error(\"Attempted to call AppProvider() from the server but AppProvider is on the client. It's not possible to invoke a client function from the server, it can only be rendered as a Component or passed to props of a Client Component.\"); },\n\"/home/runner/work/jarela/jarela/contexts/AppContext.tsx\",\n\"AppProvider\",\n);export const useAppContext = registerClientReference(\nfunction() { throw new Error(\"Attempted to call useAppContext() from the server but useAppContext is on the client. It's not possible to invoke a client function from the server, it can only be rendered as a Component or passed to props of a Client Component.\"); },\n\"/home/runner/work/jarela/jarela/contexts/AppContext.tsx\",\n\"useAppContext\",\n);","// This file is generated by the Webpack next-flight-loader.\nimport { registerClientReference } from \"react-server-dom-webpack/server\";\nexport const ThemeProvider = registerClientReference(\nfunction() { throw new Error(\"Attempted to call ThemeProvider() from the server but ThemeProvider is on the client. It's not possible to invoke a client function from the server, it can only be rendered as a Component or passed to props of a Client Component.\"); },\n\"/home/runner/work/jarela/jarela/contexts/ThemeContext.tsx\",\n\"ThemeProvider\",\n);export const useTheme = registerClientReference(\nfunction() { throw new Error(\"Attempted to call useTheme() from the server but useTheme is on the client. It's not possible to invoke a client function from the server, it can only be rendered as a Component or passed to props of a Client Component.\"); },\n\"/home/runner/work/jarela/jarela/contexts/ThemeContext.tsx\",\n\"useTheme\",\n);","import type { Metadata, Viewport } from \"next\";\nimport { AppProvider } from \"@/contexts/AppContext\";\nimport { ThemeProvider } from \"@/contexts/ThemeContext\";\nimport { ServiceWorkerRegistration } from \"@/components/ui/ServiceWorkerRegistration\";\nimport { getAppName, getAppDescription } from \"@/lib/env/app-config\";\nimport \"./globals.css\";\n\nexport const metadata: Metadata = {\n title: getAppName(),\n description: getAppDescription(),\n manifest: \"/manifest.json\",\n icons: {\n // SVG favicon is theme-aware (prefers-color-scheme inside the SVG),\n // so it flips between navy J (light UI) and sky J (dark UI) without\n // shipping two payloads. PNG/ICO fall through for older browsers.\n icon: [\n { url: \"/favicon.svg\", type: \"image/svg+xml\" },\n { url: \"/favicon.ico\", sizes: \"any\" },\n { url: \"/icon-192.png\", type: \"image/png\", sizes: \"192x192\" },\n { url: \"/icon-512.png\", type: \"image/png\", sizes: \"512x512\" },\n ],\n // iOS reads ONE apple-touch-icon and ignores prefers-color-scheme,\n // so we hand it the dark navy variant (reads on any wallpaper). The\n // light-bg companion is shipped at /apple-touch-icon-light.png for\n // anyone who wants to opt in via a custom <link> tag.\n apple: [{ url: \"/apple-touch-icon.png\", sizes: \"180x180\" }],\n },\n // iOS standalone-mode PWA chrome. Safari ignores the manifest's\n // `theme_color` once the app is installed to the home screen and only\n // honors these Apple-specific tags. `black-translucent` is the only\n // value that produces an arbitrary status-bar color: the bar overlays\n // the page and whatever paints under it (the AppShell top bar, which\n // already pads itself with env(safe-area-inset-top) via --app-safe-top)\n // becomes the visible status-bar background. So the top bar's surface\n // color follows the active light/dark theme automatically.\n appleWebApp: {\n capable: true,\n title: getAppName(),\n statusBarStyle: \"black-translucent\",\n },\n};\n\n// Next 15+ requires themeColor (and color-scheme, viewport, etc.) to live in\n// the viewport export, not metadata. The /_not-found warning came from Next\n// inheriting this same layout — moving it here fixes both routes at once.\n// Match the installed-PWA window chrome (desktop title bar, mobile address\n// bar, splash) to the active surface color. Two entries let the OS pick\n// based on prefers-color-scheme; the runtime ThemeContext / pre-paint\n// script overrides this single <meta name=\"theme-color\"> tag when the\n// user picks an explicit light/dark mode.\nexport const viewport: Viewport = {\n themeColor: [\n { media: \"(prefers-color-scheme: light)\", color: \"#ffffff\" },\n { media: \"(prefers-color-scheme: dark)\", color: \"#09090b\" },\n ],\n width: \"device-width\",\n initialScale: 1,\n maximumScale: 1,\n viewportFit: \"cover\",\n // Chromium-only: shrink the layout viewport when the OS keyboard\n // appears, so `100dvh` automatically sits above the keyboard. Safari\n // doesn't implement this key (it logs a benign console warning, see\n // tests/e2e/smoke.spec.ts allow-list) and instead `dvh` itself already\n // tracks the keyboard on iOS 16.4+ PWA, so no extra JS is needed.\n interactiveWidget: \"resizes-content\",\n};\n\n// Pre-paint script: reads the persisted theme and sets `data-theme` on\n// <html> before the first paint, so light-mode users don't flash dark on\n// every page load. Inlined via dangerouslySetInnerHTML — the canonical\n// App Router pattern. (Earlier attempt routed this through next/script,\n// but under Next 16 + React 19.2 that import resolves to a Promise in\n// some module-resolution paths, tripping \"Element type is invalid\".)\n// Falls back to \"system\", which then defers to prefers-color-scheme.\nconst themeBootstrap = `(() => {\n var LIGHT = \"#ffffff\", DARK = \"#09090b\";\n function resolve(t) {\n if (t === \"light\") return LIGHT;\n if (t === \"dark\") return DARK;\n try {\n return window.matchMedia(\"(prefers-color-scheme: dark)\").matches ? DARK : LIGHT;\n } catch (e) { return DARK; }\n }\n try {\n var t = localStorage.getItem(\"jarela-theme\");\n if (t !== \"light\" && t !== \"dark\" && t !== \"system\") t = \"system\";\n document.documentElement.setAttribute(\"data-theme\", t);\n // Collapse any media-scoped theme-color metas Next emits to a single tag\n // so the PWA window chrome matches the user's explicit choice (not just\n // prefers-color-scheme). ThemeContext keeps this in sync on change.\n var metas = document.querySelectorAll('meta[name=\"theme-color\"]');\n for (var i = 1; i < metas.length; i++) metas[i].parentNode.removeChild(metas[i]);\n var meta = metas[0];\n if (!meta) {\n meta = document.createElement(\"meta\");\n meta.setAttribute(\"name\", \"theme-color\");\n document.head.appendChild(meta);\n }\n meta.removeAttribute(\"media\");\n meta.setAttribute(\"content\", resolve(t));\n } catch (e) {\n document.documentElement.setAttribute(\"data-theme\", \"system\");\n }\n})();`;\n\n// iOS Safari standalone-PWA viewport-height shim. On iPhones in\n// \"Add to Home Screen\" mode iOS reports window.innerHeight (and 100dvh\n// resolves against it) ~safe-area-inset-top pixels SHORTER than the\n// physical screen — about 59px on iPhone, 32px on iPad. That leaves a\n// gap below the app that the UA paints with the color-scheme default\n// (the white strip the user sees above the home-indicator). dvh, vh,\n// position:fixed inset:0, -webkit-fill-available — none of them fill\n// the physical screen in standalone PWA mode.\n//\n// The community-validated fix (boolinator/ios-pwa-bottom-bar-fix.md,\n// stackoverflow.com/q/79902310) is a JS shim: read visualViewport.height,\n// add safe-area-inset-top back when the gap matches the bug signature,\n// and write the corrected pixel value into --actual-vh on <html>.\n// CSS then sizes the doc with var(--actual-vh, 100dvh) so non-iOS\n// browsers keep using the standard primitive.\n//\n// Retries at 50/150/300/500/800/1200ms cover iOS's async safe-area\n// population on launch. visualViewport.resize, orientationchange, and\n// visibilitychange handle keyboard/rotation/app-switch.\nconst iosViewportBootstrap = `(() => {\n try {\n var isPWA = window.matchMedia('(display-mode: standalone)').matches\n || window.matchMedia('(display-mode: fullscreen)').matches\n || window.navigator.standalone === true;\n if (!isPWA) return;\n var last = 0;\n function safeTopPx() {\n var v = getComputedStyle(document.documentElement).getPropertyValue('--app-safe-top') || '';\n var n = parseFloat(v);\n return isNaN(n) ? 0 : n;\n }\n function isEditableFocused() {\n var ae = document.activeElement;\n if (!ae) return false;\n var tag = ae.tagName;\n return tag === 'INPUT' || tag === 'TEXTAREA' || ae.isContentEditable === true;\n }\n function apply() {\n var vv = window.visualViewport;\n var vh = (vv && vv.height) || window.innerHeight;\n // Keyboard-open detection: when iOS shows the on-screen keyboard,\n // visualViewport.height shrinks but window.innerHeight stays put.\n // Pairing that gap with editable-focus makes it model-agnostic -\n // no need to guess a keyboard height per device (SE ~216, 15 Pro\n // Max ~301, iPad floating ~120). 50px just filters URL-bar jitter.\n var keyboardOpen = isEditableFocused() && (window.innerHeight - vh) > 50;\n var isPortrait = window.innerHeight > window.innerWidth;\n // Skip the chin correction while the keyboard is up - otherwise we\n // inflate --actual-vh beyond the visible viewport and the input bar\n // ends up underneath the keyboard.\n if (!keyboardOpen && isPortrait) {\n var screenH = Math.max(window.screen.height, window.screen.width);\n if (screenH - vh > 15) {\n var top = safeTopPx();\n if (top > 0) vh += top;\n }\n }\n document.documentElement.style.setProperty('--actual-vh', vh + 'px');\n if (last > 0 && Math.abs(vh - last) > 30) {\n setTimeout(function () { window.dispatchEvent(new Event('resize')); }, 50);\n }\n last = vh;\n }\n apply();\n [50, 150, 300, 500, 800, 1200].forEach(function (ms) { setTimeout(apply, ms); });\n window.addEventListener('resize', apply);\n window.addEventListener('orientationchange', function () {\n setTimeout(apply, 100); setTimeout(apply, 300);\n });\n if (window.visualViewport) {\n window.visualViewport.addEventListener('resize', apply);\n window.visualViewport.addEventListener('scroll', apply);\n }\n // focusin/focusout can lead visualViewport.resize by ~100ms on\n // older iOS - recompute immediately so we don't render a bad frame.\n document.addEventListener('focusin', apply, true);\n document.addEventListener('focusout', apply, true);\n // iOS still scrolls the layout viewport up when the keyboard opens\n // to keep the focused input visible, even with html/body overflow:hidden.\n // Aggressive scroll-reset on focus events counteracts it (piclaw PWA.md\n // pattern, validated on iOS 26.x). Staggered timers cover the lag\n // between focus and iOS's scroll-into-view.\n function snapScroll() {\n if (window.scrollY !== 0 || window.pageYOffset !== 0) {\n window.scrollTo(0, 0);\n }\n }\n document.addEventListener('focusin', function () {\n snapScroll();\n [16, 50, 100, 200, 400].forEach(function (ms) { setTimeout(snapScroll, ms); });\n }, true);\n document.addEventListener('focusout', function () {\n [16, 50, 100, 200].forEach(function (ms) { setTimeout(snapScroll, ms); });\n }, true);\n if (window.visualViewport) {\n window.visualViewport.addEventListener('scroll', snapScroll);\n }\n window.addEventListener('scroll', snapScroll, { passive: true });\n document.addEventListener('visibilitychange', function () {\n if (!document.hidden) { setTimeout(apply, 50); setTimeout(apply, 200); }\n });\n } catch (e) { /* non-fatal: falls back to 100dvh */ }\n})();`;\n\nexport default function RootLayout({ children }: { children: React.ReactNode }) {\n return (\n <html lang=\"en\" data-theme=\"system\" suppressHydrationWarning>\n <head>\n <script dangerouslySetInnerHTML={{ __html: themeBootstrap }} />\n <script dangerouslySetInnerHTML={{ __html: iosViewportBootstrap }} />\n </head>\n <body>\n <ThemeProvider>\n <AppProvider>{children}</AppProvider>\n </ThemeProvider>\n <ServiceWorkerRegistration />\n </body>\n </html>\n );\n}\n","\"use client\";\nimport { createContext, useContext, useEffect, useReducer, type ReactNode } from \"react\";\n\nexport type ExperienceMode = \"essential\" | \"full\";\n\nconst EXPERIENCE_MODE_KEY = \"jarela.experience.mode\";\n\n// Back-compat: pre-rename builds stored \"normal\" / \"advanced\". Read those\n// values silently so an upgrade does not reset the user's choice.\nfunction parseStoredMode(raw: string | null): ExperienceMode | null {\n if (raw === \"essential\" || raw === \"normal\") return \"essential\";\n if (raw === \"full\" || raw === \"advanced\") return \"full\";\n return null;\n}\n\nexport type Tab = \"chat\" | \"dashboard\" | \"agents\" | \"memory\" | \"documents\" | \"models\" | \"credentials\" | \"mcp\" | \"extensions\" | \"tools\" | \"tasks\" | \"bridges\" | \"profile\" | \"harness\" | \"logs\" | \"env\" | \"settings\";\n\ninterface AppState {\n activeThreadId: string | null;\n activeAgentId: string | null;\n activeTab: Tab;\n experienceMode: ExperienceMode;\n // Per-tab sub-selection (a sub-tab key under credentials, an mcp server name, an\n // agent uuid, a profile subsection slug, …). Settings panels read their\n // slot to scroll-to + highlight; the URL mirrors this via `?item=<id>`.\n selectedItem: Partial<Record<Tab, string>>;\n}\n\ntype Action =\n | { type: \"SELECT_THREAD\"; threadId: string; agentId: string }\n | { type: \"NEW_CHAT\" }\n | { type: \"SET_AGENT\"; agentId: string }\n | { type: \"SET_TAB\"; tab: Tab }\n | { type: \"SET_EXPERIENCE_MODE\"; mode: ExperienceMode }\n | { type: \"SET_SELECTION\"; tab: Tab; itemId: string | null };\n\nfunction reducer(state: AppState, action: Action): AppState {\n switch (action.type) {\n case \"SELECT_THREAD\":\n return { ...state, activeThreadId: action.threadId, activeAgentId: action.agentId, activeTab: \"chat\" };\n case \"NEW_CHAT\":\n return { ...state, activeThreadId: null, activeAgentId: null, activeTab: \"chat\" };\n case \"SET_AGENT\":\n return { ...state, activeAgentId: action.agentId };\n case \"SET_TAB\":\n return { ...state, activeTab: action.tab };\n case \"SET_EXPERIENCE_MODE\":\n return { ...state, experienceMode: action.mode };\n case \"SET_SELECTION\": {\n const next = { ...state.selectedItem };\n if (action.itemId == null) delete next[action.tab];\n else next[action.tab] = action.itemId;\n return { ...state, selectedItem: next };\n }\n }\n}\n\nconst AppContext = createContext<{ state: AppState; dispatch: React.Dispatch<Action> } | null>(null);\n\nexport function AppProvider({ children }: { children: ReactNode }) {\n const [state, dispatch] = useReducer(reducer, {\n activeThreadId: null,\n activeAgentId: null,\n activeTab: \"chat\",\n experienceMode: \"essential\",\n selectedItem: {},\n });\n\n useEffect(() => {\n try {\n const stored = parseStoredMode(window.localStorage.getItem(EXPERIENCE_MODE_KEY));\n if (stored) {\n dispatch({ type: \"SET_EXPERIENCE_MODE\", mode: stored });\n }\n } catch {\n // ignore storage failures\n }\n }, []);\n\n useEffect(() => {\n try {\n window.localStorage.setItem(EXPERIENCE_MODE_KEY, state.experienceMode);\n } catch {\n // ignore storage failures\n }\n }, [state.experienceMode]);\n\n return <AppContext.Provider value={{ state, dispatch }}>{children}</AppContext.Provider>;\n}\n\nexport function useAppContext() {\n const ctx = useContext(AppContext);\n if (!ctx) throw new Error(\"useAppContext must be used within AppProvider\");\n return ctx;\n}\n","import(/* webpackMode: \"eager\", webpackExports: [\"ServiceWorkerRegistration\"] */ \"/home/runner/work/jarela/jarela/components/ui/ServiceWorkerRegistration.tsx\");\n;\nimport(/* webpackMode: \"eager\", webpackExports: [\"AppProvider\"] */ \"/home/runner/work/jarela/jarela/contexts/AppContext.tsx\");\n;\nimport(/* webpackMode: \"eager\", webpackExports: [\"ThemeProvider\"] */ \"/home/runner/work/jarela/jarela/contexts/ThemeContext.tsx\");\n","\"use client\";\nimport { createContext, useCallback, useContext, useEffect, useState, type ReactNode } from \"react\";\n\nexport type Theme = \"light\" | \"dark\" | \"system\";\n\nconst STORAGE_KEY = \"jarela-theme\";\n\nfunction isTheme(v: unknown): v is Theme {\n return v === \"light\" || v === \"dark\" || v === \"system\";\n}\n\nfunction readStored(): Theme {\n if (typeof window === \"undefined\") return \"system\";\n try {\n const v = window.localStorage.getItem(STORAGE_KEY);\n return isTheme(v) ? v : \"system\";\n } catch {\n return \"system\";\n }\n}\n\nconst LIGHT_CHROME = \"#ffffff\";\nconst DARK_CHROME = \"#09090b\";\n\nfunction resolveChrome(theme: Theme): string {\n if (theme === \"light\") return LIGHT_CHROME;\n if (theme === \"dark\") return DARK_CHROME;\n if (typeof window === \"undefined\") return DARK_CHROME;\n return window.matchMedia(\"(prefers-color-scheme: dark)\").matches ? DARK_CHROME : LIGHT_CHROME;\n}\n\n// Keep the single <meta name=\"theme-color\"> tag (installed by the pre-paint\n// script in app/layout.tsx) aligned with the active surface so the PWA's\n// desktop title bar and mobile address bar match the theme.\nfunction syncChrome(theme: Theme) {\n if (typeof document === \"undefined\") return;\n const meta = document.querySelector('meta[name=\"theme-color\"]');\n if (meta) meta.setAttribute(\"content\", resolveChrome(theme));\n}\n\nfunction apply(theme: Theme) {\n if (typeof document === \"undefined\") return;\n document.documentElement.setAttribute(\"data-theme\", theme);\n syncChrome(theme);\n}\n\ninterface Ctx {\n theme: Theme;\n setTheme: (t: Theme) => void;\n}\n\nconst ThemeContext = createContext<Ctx | null>(null);\n\nexport function ThemeProvider({ children }: { children: ReactNode }) {\n // Initial state stays \"system\" on the server to match the pre-paint script,\n // which writes data-theme before React hydrates. The effect below syncs the\n // React state to whatever the script (or localStorage) decided.\n const [theme, setThemeState] = useState<Theme>(\"system\");\n\n useEffect(() => {\n const stored = readStored();\n setThemeState(stored);\n // When in \"system\" mode, mirror OS-level changes into the PWA chrome.\n if (typeof window === \"undefined\") return;\n const mq = window.matchMedia(\"(prefers-color-scheme: dark)\");\n const onChange = () => {\n if (readStored() === \"system\") syncChrome(\"system\");\n };\n mq.addEventListener?.(\"change\", onChange);\n return () => mq.removeEventListener?.(\"change\", onChange);\n }, []);\n\n const setTheme = useCallback((t: Theme) => {\n setThemeState(t);\n apply(t);\n try {\n window.localStorage.setItem(STORAGE_KEY, t);\n } catch {\n /* ignore quota / private-mode errors */\n }\n }, []);\n\n return <ThemeContext.Provider value={{ theme, setTheme }}>{children}</ThemeContext.Provider>;\n}\n\nexport function useTheme() {\n const ctx = useContext(ThemeContext);\n if (!ctx) throw new Error(\"useTheme must be used within ThemeProvider\");\n return ctx;\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","import(/* webpackMode: \"eager\", webpackExports: [\"ServiceWorkerRegistration\"] */ \"/home/runner/work/jarela/jarela/components/ui/ServiceWorkerRegistration.tsx\");\n;\nimport(/* webpackMode: \"eager\", webpackExports: [\"AppProvider\"] */ \"/home/runner/work/jarela/jarela/contexts/AppContext.tsx\");\n;\nimport(/* webpackMode: \"eager\", webpackExports: [\"ThemeProvider\"] */ \"/home/runner/work/jarela/jarela/contexts/ThemeContext.tsx\");\n","import(/* webpackMode: \"eager\" */ \"/home/runner/work/jarela/jarela/node_modules/next/dist/client/components/builtin/global-error.js\");\n;\nimport(/* webpackMode: \"eager\" */ \"/home/runner/work/jarela/jarela/node_modules/next/dist/client/components/client-page.js\");\n;\nimport(/* webpackMode: \"eager\" */ \"/home/runner/work/jarela/jarela/node_modules/next/dist/client/components/client-segment.js\");\n;\nimport(/* webpackMode: \"eager\" */ \"/home/runner/work/jarela/jarela/node_modules/next/dist/client/components/http-access-fallback/error-boundary.js\");\n;\nimport(/* webpackMode: \"eager\" */ \"/home/runner/work/jarela/jarela/node_modules/next/dist/client/components/layout-router.js\");\n;\nimport(/* webpackMode: \"eager\" */ \"/home/runner/work/jarela/jarela/node_modules/next/dist/client/components/render-from-template-context.js\");\n;\nimport(/* webpackMode: \"eager\" */ \"/home/runner/work/jarela/jarela/node_modules/next/dist/lib/framework/boundary-components.js\");\n;\nimport(/* webpackMode: \"eager\" */ \"/home/runner/work/jarela/jarela/node_modules/next/dist/lib/metadata/generate/icon-mark.js\");\n","import(/* webpackMode: \"eager\" */ \"/home/runner/work/jarela/jarela/node_modules/next/dist/client/components/builtin/global-error.js\");\n",""," import { fillMetadataSegment } from 'next/dist/lib/metadata/get-metadata-route'\n\n export default async (props) => {\n const imageData = {\"type\":\"image/svg+xml\",\"sizes\":\"any\"}\n const imageUrl = fillMetadataSegment(\".\", await props.params, \"icon.svg\", true)\n\n return [{\n ...imageData,\n url: imageUrl + \"?44694c2d5379230a\",\n }]\n }","\"use client\";\n\nimport { useEffect } from \"react\";\n\n/**\n * Registers the Serwist-generated service worker. Replaces the auto-injected\n * registration script that next-pwa used to emit. Only runs in production\n * (the SW is disabled in dev by withSerwist).\n */\nexport function ServiceWorkerRegistration() {\n useEffect(() => {\n if (typeof window === \"undefined\") return;\n if (!(\"serviceWorker\" in navigator)) return;\n\n if (process.env.NODE_ENV !== \"production\") {\n // Dev mode safety: if a previous production build registered a SW,\n // it can keep serving stale assets even though SW is disabled now.\n // Purge registrations + caches once per tab session.\n const key = \"jarela.dev.sw-cleaned\";\n if (!window.sessionStorage.getItem(key)) {\n navigator.serviceWorker\n .getRegistrations()\n .then((regs) => Promise.all(regs.map((r) => r.unregister())))\n .catch(() => {\n /* ignore */\n });\n if (\"caches\" in window) {\n caches\n .keys()\n .then((names) => Promise.all(names.map((name) => caches.delete(name))))\n .catch(() => {\n /* ignore */\n });\n }\n window.sessionStorage.setItem(key, \"1\");\n }\n return;\n }\n\n // Defer to idle so we don't compete with the first paint.\n const register = () => {\n navigator.serviceWorker\n .register(\"/sw.js\", { scope: \"/\" })\n .catch((err) => {\n // Swallow — SW failures should never break the app.\n console.warn(\"[sw] registration failed:\", err);\n });\n };\n if (\"requestIdleCallback\" in window) {\n (window as Window & { requestIdleCallback: (cb: () => void) => void })\n .requestIdleCallback(register);\n } else {\n setTimeout(register, 1000);\n }\n }, []);\n return null;\n}\n","import(/* webpackMode: \"eager\" */ \"/home/runner/work/jarela/jarela/node_modules/next/dist/client/components/builtin/global-error.js\");\n;\nimport(/* webpackMode: \"eager\" */ \"/home/runner/work/jarela/jarela/node_modules/next/dist/client/components/client-page.js\");\n;\nimport(/* webpackMode: \"eager\" */ \"/home/runner/work/jarela/jarela/node_modules/next/dist/client/components/client-segment.js\");\n;\nimport(/* webpackMode: \"eager\" */ \"/home/runner/work/jarela/jarela/node_modules/next/dist/client/components/http-access-fallback/error-boundary.js\");\n;\nimport(/* webpackMode: \"eager\" */ \"/home/runner/work/jarela/jarela/node_modules/next/dist/client/components/layout-router.js\");\n;\nimport(/* webpackMode: \"eager\" */ \"/home/runner/work/jarela/jarela/node_modules/next/dist/client/components/render-from-template-context.js\");\n;\nimport(/* webpackMode: \"eager\" */ \"/home/runner/work/jarela/jarela/node_modules/next/dist/lib/framework/boundary-components.js\");\n;\nimport(/* webpackMode: \"eager\" */ \"/home/runner/work/jarela/jarela/node_modules/next/dist/lib/metadata/generate/icon-mark.js\");\n","import(/* webpackMode: \"eager\" */ \"/home/runner/work/jarela/jarela/node_modules/next/dist/client/components/builtin/global-error.js\");\n"],"names":["AppProvider","ThemeProvider","ServiceWorkerRegistration","getAppName","getAppDescription","metadata","title","description","manifest","icons","icon","url","type","sizes","apple","appleWebApp","capable","statusBarStyle","viewport","themeColor","media","color","width","initialScale","maximumScale","viewportFit","interactiveWidget","themeBootstrap","iosViewportBootstrap","RootLayout","children","html","lang","data-theme","suppressHydrationWarning","head","script","dangerouslySetInnerHTML","__html","body","createContext","useContext","useEffect","useReducer","EXPERIENCE_MODE_KEY","parseStoredMode","raw","reducer","state","action","activeThreadId","threadId","activeAgentId","agentId","activeTab","tab","experienceMode","mode","next","selectedItem","itemId","AppContext","dispatch","stored","window","localStorage","getItem","setItem","Provider","value","useAppContext","ctx","Error","useCallback","useState","STORAGE_KEY","isTheme","v","readStored","LIGHT_CHROME","DARK_CHROME","resolveChrome","theme","matchMedia","matches","syncChrome","document","meta","querySelector","setAttribute","apply","documentElement","ThemeContext","setThemeState","mq","onChange","addEventListener","removeEventListener","setTheme","t","useTheme","DEFAULT_APP_NAME","DEFAULT_APP_DESCRIPTION","DEFAULT_ISSUE_URL","process","env","NEXT_PUBLIC_APP_NAME","trim","NEXT_PUBLIC_APP_DESCRIPTION","getAppIssueUrl","NEXT_PUBLIC_APP_ISSUE_URL","navigator","key","sessionStorage","serviceWorker","getRegistrations","then","regs","Promise","all","map","r","unregister","catch","caches","keys","names","name","delete","register","scope","err","console","warn","requestIdleCallback","setTimeout"],"sourceRoot":"","ignoreList":[0,1,2]}
|
|
@@ -4,8 +4,8 @@ globalThis.__BUILD_MANIFEST = {
|
|
|
4
4
|
],
|
|
5
5
|
"devFiles": [],
|
|
6
6
|
"lowPriorityFiles": [
|
|
7
|
-
"static/
|
|
8
|
-
"static/
|
|
7
|
+
"static/EOkgU73YJOpR-vFcKMgL0/_buildManifest.js",
|
|
8
|
+
"static/EOkgU73YJOpR-vFcKMgL0/_ssgManifest.js"
|
|
9
9
|
],
|
|
10
10
|
"rootMainFiles": [
|
|
11
11
|
"static/chunks/webpack-f4ac5c5f92cfd1c1.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, interactive-widget=resizes-content"/><link rel="stylesheet" href="/_next/static/css/
|
|
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, interactive-widget=resizes-content"/><link rel="stylesheet" href="/_next/static/css/b8e04d59a2bfff04.css" data-precedence="next"/><link rel="preload" as="script" fetchPriority="low" href="/_next/static/chunks/webpack-f4ac5c5f92cfd1c1.js"/><script src="/_next/static/chunks/4bd1b696-f4afdf0ad1d556a5.js" async=""></script><script src="/_next/static/chunks/3457-6d51726379cee3b7.js" async=""></script><script src="/_next/static/chunks/main-app-3f37bcefd1eaffaf.js" async=""></script><script src="/_next/static/chunks/app/layout-84c6f211a7a1ca36.js" async=""></script><title>404: This page could not be found.</title><meta name="robots" content="noindex"/><meta name="theme-color" content="#ffffff" media="(prefers-color-scheme: light)"/><meta name="theme-color" content="#09090b" media="(prefers-color-scheme: dark)"/><title>Jarela</title><meta name="description" content="Jarela — local chat interface for LangGraph agents"/><link rel="manifest" href="/manifest.json"/><meta name="mobile-web-app-capable" content="yes"/><meta name="apple-mobile-web-app-title" content="Jarela"/><meta name="apple-mobile-web-app-status-bar-style" content="black-translucent"/><link rel="icon" href="/favicon.svg" type="image/svg+xml"/><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
|
var LIGHT = "#ffffff", DARK = "#09090b";
|
|
3
3
|
function resolve(t) {
|
|
4
4
|
if (t === "light") return LIGHT;
|
|
@@ -110,4 +110,4 @@
|
|
|
110
110
|
if (!document.hidden) { setTimeout(apply, 50); setTimeout(apply, 200); }
|
|
111
111
|
});
|
|
112
112
|
} catch (e) { /* non-fatal: falls back to 100dvh */ }
|
|
113
|
-
})();</script><script src="/_next/static/chunks/polyfills-42372ed130431b0a.js" noModule=""></script></head><body><div hidden=""><!--$--><!--/$--></div><div style="font-family:system-ui,"Segoe UI",Roboto,Helvetica,Arial,sans-serif,"Apple Color Emoji","Segoe UI Emoji";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-f4ac5c5f92cfd1c1.js" id="_R_" async=""></script><script>(self.__next_f=self.__next_f||[]).push([0])</script><script>self.__next_f.push([1,"1:\"$Sreact.fragment\"\n9:I[7123,[],\"default\",1]\n:HL[\"/_next/static/css/44f9bbea39fef458.css\",\"style\"]\n2:T4b9,(() =\u003e {\n var LIGHT = \"#ffffff\", DARK = \"#09090b\";\n function resolve(t) {\n if (t === \"light\") return LIGHT;\n if (t === \"dark\") return DARK;\n try {\n return window.matchMedia(\"(prefers-color-scheme: dark)\").matches ? DARK : LIGHT;\n } catch (e) { return DARK; }\n }\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 // Collapse any media-scoped theme-color metas Next emits to a single tag\n // so the PWA window chrome matches the user's explicit choice (not just\n // prefers-color-scheme). ThemeContext keeps this in sync on change.\n var metas = document.querySelectorAll('meta[name=\"theme-color\"]');\n for (var i = 1; i \u003c metas.length; i++) metas[i].parentNode.removeChild(metas[i]);\n var meta = metas[0];\n if (!meta) {\n meta = document.createElement(\"meta\");\n meta.setAttribute(\"name\", \"theme-color\");\n document.head.appendChild(meta);\n }\n meta.removeAttribute(\"media\");\n meta.setAttribute(\"content\", resolve(t));\n } catch (e) {\n document.documentElement.setAttribute(\"data-theme\", \"system\");\n }\n})();3:Tf06,"])</script><script>self.__next_f.push([1,"(() =\u003e {\n try {\n var isPWA = window.matchMedia('(display-mode: standalone)').matches\n || window.matchMedia('(display-mode: fullscreen)').matches\n || window.navigator.standalone === true;\n if (!isPWA) return;\n var last = 0;\n function safeTopPx() {\n var v = getComputedStyle(document.documentElement).getPropertyValue('--app-safe-top') || '';\n var n = parseFloat(v);\n return isNaN(n) ? 0 : n;\n }\n function isEditableFocused() {\n var ae = document.activeElement;\n if (!ae) return false;\n var tag = ae.tagName;\n return tag === 'INPUT' || tag === 'TEXTAREA' || ae.isContentEditable === true;\n }\n function apply() {\n var vv = window.visualViewport;\n var vh = (vv \u0026\u0026 vv.height) || window.innerHeight;\n // Keyboard-open detection: when iOS shows the on-screen keyboard,\n // visualViewport.height shrinks but window.innerHeight stays put.\n // Pairing that gap with editable-focus makes it model-agnostic -\n // no need to guess a keyboard height per device (SE ~216, 15 Pro\n // Max ~301, iPad floating ~120). 50px just filters URL-bar jitter.\n var keyboardOpen = isEditableFocused() \u0026\u0026 (window.innerHeight - vh) \u003e 50;\n var isPortrait = window.innerHeight \u003e window.innerWidth;\n // Skip the chin correction while the keyboard is up - otherwise we\n // inflate --actual-vh beyond the visible viewport and the input bar\n // ends up underneath the keyboard.\n if (!keyboardOpen \u0026\u0026 isPortrait) {\n var screenH = Math.max(window.screen.height, window.screen.width);\n if (screenH - vh \u003e 15) {\n var top = safeTopPx();\n if (top \u003e 0) vh += top;\n }\n }\n document.documentElement.style.setProperty('--actual-vh', vh + 'px');\n if (last \u003e 0 \u0026\u0026 Math.abs(vh - last) \u003e 30) {\n setTimeout(function () { window.dispatchEvent(new Event('resize')); }, 50);\n }\n last = vh;\n }\n apply();\n [50, 150, 300, 500, 800, 1200].forEach(function (ms) { setTimeout(apply, ms); });\n window.addEventListener('resize', apply);\n window.addEventListener('orientationchange', function () {\n setTimeout(apply, 100); setTimeout(apply, 300);\n });\n if (window.visualViewport) {\n window.visualViewport.addEventListener('resize', apply);\n window.visualViewport.addEventListener('scroll', apply);\n }\n // focusin/focusout can lead visualViewport.resize by ~100ms on\n // older iOS - recompute immediately so we don't render a bad frame.\n document.addEventListener('focusin', apply, true);\n document.addEventListener('focusout', apply, true);\n // iOS still scrolls the layout viewport up when the keyboard opens\n // to keep the focused input visible, even with html/body overflow:hidden.\n // Aggressive scroll-reset on focus events counteracts it (piclaw PWA.md\n // pattern, validated on iOS 26.x). Staggered timers cover the lag\n // between focus and iOS's scroll-into-view.\n function snapScroll() {\n if (window.scrollY !== 0 || window.pageYOffset !== 0) {\n window.scrollTo(0, 0);\n }\n }\n document.addEventListener('focusin', function () {\n snapScroll();\n [16, 50, 100, 200, 400].forEach(function (ms) { setTimeout(snapScroll, ms); });\n }, true);\n document.addEventListener('focusout', function () {\n [16, 50, 100, 200].forEach(function (ms) { setTimeout(snapScroll, ms); });\n }, true);\n if (window.visualViewport) {\n window.visualViewport.addEventListener('scroll', snapScroll);\n }\n window.addEventListener('scroll', snapScroll, { passive: true });\n document.addEventListener('visibilitychange', function () {\n if (!document.hidden) { setTimeout(apply, 50); setTimeout(apply, 200); }\n });\n } catch (e) { /* non-fatal: falls back to 100dvh */ }\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/44f9bbea39fef458.css\",\"precedence\":\"next\",\"crossOrigin\":\"$undefined\",\"nonce\":\"$undefined\"}]],[\"$\",\"html\",null,{\"lang\":\"en\",\"data-theme\":\"system\",\"suppressHydrationWarning\":true,\"children\":[[\"$\",\"head\",null,{\"children\":[[\"$\",\"script\",null,{\"dangerouslySetInnerHTML\":{\"__html\":\"$2\"}}],[\"$\",\"script\",null,{\"dangerouslySetInnerHTML\":{\"__html\":\"$3\"}}]]}],\"$L4\"]}]]}],{\"children\":[\"$L5\",{\"children\":[\"$L6\",{},null,false,null]},null,false,\"$@7\"]},null,false,null],\"$L8\",false]],\"m\":\"$undefined\",\"G\":[\"$9\",[]],\"S\":true,\"h\":null,\"s\":\"$undefined\",\"l\":\"$undefined\",\"p\":\"$undefined\",\"d\":\"$undefined\",\"b\":\"rr-Rxxi6kkXe1Bw8-Hzq2\"}\n"])</script><script>self.__next_f.push([1,"a:I[737,[\"7177\",\"static/chunks/app/layout-84c6f211a7a1ca36.js\"],\"ThemeProvider\"]\nb:I[3639,[\"7177\",\"static/chunks/app/layout-84c6f211a7a1ca36.js\"],\"AppProvider\"]\nc:I[7121,[],\"\"]\nd:I[4581,[],\"\"]\ne:I[722,[\"7177\",\"static/chunks/app/layout-84c6f211a7a1ca36.js\"],\"ServiceWorkerRegistration\"]\nf:I[484,[],\"OutletBoundary\"]\n10:\"$Sreact.suspense\"\n13:I[484,[],\"ViewportBoundary\"]\n15:I[484,[],\"MetadataBoundary\"]\n4:[\"$\",\"body\",null,{\"children\":[[\"$\",\"$La\",null,{\"children\":[\"$\",\"$Lb\",null,{\"children\":[\"$\",\"$Lc\",null,{\"parallelRouterKey\":\"children\",\"error\":\"$undefined\",\"errorStyles\":\"$undefined\",\"errorScripts\":\"$undefined\",\"template\":[\"$\",\"$Ld\",null,{}],\"templateStyles\":\"$undefined\",\"templateScripts\":\"$undefined\",\"notFound\":\"$undefined\",\"forbidden\":\"$undefined\",\"unauthorized\":\"$undefined\"}]}]}],[\"$\",\"$Le\",null,{}]]}]\n5:[\"$\",\"$1\",\"c\",{\"children\":[null,[\"$\",\"$Lc\",null,{\"parallelRouterKey\":\"children\",\"error\":\"$undefined\",\"errorStyles\":\"$undefined\",\"errorScripts\":\"$undefined\",\"template\":[\"$\",\"$Ld\",null,{}],\"templateStyles\":\"$undefined\",\"templateScripts\":\"$undefined\",\"notFound\":\"$undefined\",\"forbidden\":\"$undefined\",\"unauthorized\":\"$undefined\"}]]}]\n6:[\"$\",\"$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,[\"$\",\"$Lf\",null,{\"children\":[\"$\",\"$10\",null,{\"name\":\"Next.MetadataOutlet\",\"children\":\"$@11\"}]}]]}]\n12:[]\n7:\"$W12\"\n8:[\"$\",\"$1\",\"h\",{\"children\":[[\"$\",\"meta\",null,{\"name\":\"robots\",\"content\":\"noindex\"}],[\"$\",\"$L13\",null,{\"children\":\"$L14\"}],[\"$\",\"div\",null,{\"hidden\":true,\"children\":[\"$\",\"$L15\",null,{\"children\":[\"$\",\"$10\",null,{\"name\":\"Next.Metadata\",\"children\":\"$L16\"}]}]}],null]}]\n"])</script><script>self.__next_f.push([1,"14:[[\"$\",\"meta\",\"0\",{\"charSet\":\"utf-8\"}],[\"$\",\"meta\",\"1\",{\"name\":\"viewport\",\"content\":\"width=device-width, initial-scale=1, maximum-scale=1, viewport-fit=cover, interactive-widget=resizes-content\"}],[\"$\",\"meta\",\"2\",{\"name\":\"theme-color\",\"content\":\"#ffffff\",\"media\":\"(prefers-color-scheme: light)\"}],[\"$\",\"meta\",\"3\",{\"name\":\"theme-color\",\"content\":\"#09090b\",\"media\":\"(prefers-color-scheme: dark)\"}]]\n"])</script><script>self.__next_f.push([1,"17:I[6869,[],\"IconMark\"]\n11:null\n16:[[\"$\",\"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\"}],[\"$\",\"meta\",\"3\",{\"name\":\"mobile-web-app-capable\",\"content\":\"yes\"}],[\"$\",\"meta\",\"4\",{\"name\":\"apple-mobile-web-app-title\",\"content\":\"Jarela\"}],[\"$\",\"meta\",\"5\",{\"name\":\"apple-mobile-web-app-status-bar-style\",\"content\":\"black-translucent\"}],[\"$\",\"link\",\"6\",{\"rel\":\"icon\",\"href\":\"/favicon.svg\",\"type\":\"image/svg+xml\"}],[\"$\",\"link\",\"7\",{\"rel\":\"icon\",\"href\":\"/favicon.ico\",\"sizes\":\"any\"}],[\"$\",\"link\",\"8\",{\"rel\":\"icon\",\"href\":\"/icon-192.png\",\"type\":\"image/png\",\"sizes\":\"192x192\"}],[\"$\",\"link\",\"9\",{\"rel\":\"icon\",\"href\":\"/icon-512.png\",\"type\":\"image/png\",\"sizes\":\"512x512\"}],[\"$\",\"link\",\"10\",{\"rel\":\"apple-touch-icon\",\"href\":\"/apple-touch-icon.png\",\"sizes\":\"180x180\"}],[\"$\",\"$L17\",\"11\",{}]]\n"])</script></body></html>
|
|
113
|
+
})();</script><script src="/_next/static/chunks/polyfills-42372ed130431b0a.js" noModule=""></script></head><body><div hidden=""><!--$--><!--/$--></div><div style="font-family:system-ui,"Segoe UI",Roboto,Helvetica,Arial,sans-serif,"Apple Color Emoji","Segoe UI Emoji";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-f4ac5c5f92cfd1c1.js" id="_R_" async=""></script><script>(self.__next_f=self.__next_f||[]).push([0])</script><script>self.__next_f.push([1,"1:\"$Sreact.fragment\"\n9:I[7123,[],\"default\",1]\n:HL[\"/_next/static/css/b8e04d59a2bfff04.css\",\"style\"]\n2:T4b9,(() =\u003e {\n var LIGHT = \"#ffffff\", DARK = \"#09090b\";\n function resolve(t) {\n if (t === \"light\") return LIGHT;\n if (t === \"dark\") return DARK;\n try {\n return window.matchMedia(\"(prefers-color-scheme: dark)\").matches ? DARK : LIGHT;\n } catch (e) { return DARK; }\n }\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 // Collapse any media-scoped theme-color metas Next emits to a single tag\n // so the PWA window chrome matches the user's explicit choice (not just\n // prefers-color-scheme). ThemeContext keeps this in sync on change.\n var metas = document.querySelectorAll('meta[name=\"theme-color\"]');\n for (var i = 1; i \u003c metas.length; i++) metas[i].parentNode.removeChild(metas[i]);\n var meta = metas[0];\n if (!meta) {\n meta = document.createElement(\"meta\");\n meta.setAttribute(\"name\", \"theme-color\");\n document.head.appendChild(meta);\n }\n meta.removeAttribute(\"media\");\n meta.setAttribute(\"content\", resolve(t));\n } catch (e) {\n document.documentElement.setAttribute(\"data-theme\", \"system\");\n }\n})();3:Tf06,"])</script><script>self.__next_f.push([1,"(() =\u003e {\n try {\n var isPWA = window.matchMedia('(display-mode: standalone)').matches\n || window.matchMedia('(display-mode: fullscreen)').matches\n || window.navigator.standalone === true;\n if (!isPWA) return;\n var last = 0;\n function safeTopPx() {\n var v = getComputedStyle(document.documentElement).getPropertyValue('--app-safe-top') || '';\n var n = parseFloat(v);\n return isNaN(n) ? 0 : n;\n }\n function isEditableFocused() {\n var ae = document.activeElement;\n if (!ae) return false;\n var tag = ae.tagName;\n return tag === 'INPUT' || tag === 'TEXTAREA' || ae.isContentEditable === true;\n }\n function apply() {\n var vv = window.visualViewport;\n var vh = (vv \u0026\u0026 vv.height) || window.innerHeight;\n // Keyboard-open detection: when iOS shows the on-screen keyboard,\n // visualViewport.height shrinks but window.innerHeight stays put.\n // Pairing that gap with editable-focus makes it model-agnostic -\n // no need to guess a keyboard height per device (SE ~216, 15 Pro\n // Max ~301, iPad floating ~120). 50px just filters URL-bar jitter.\n var keyboardOpen = isEditableFocused() \u0026\u0026 (window.innerHeight - vh) \u003e 50;\n var isPortrait = window.innerHeight \u003e window.innerWidth;\n // Skip the chin correction while the keyboard is up - otherwise we\n // inflate --actual-vh beyond the visible viewport and the input bar\n // ends up underneath the keyboard.\n if (!keyboardOpen \u0026\u0026 isPortrait) {\n var screenH = Math.max(window.screen.height, window.screen.width);\n if (screenH - vh \u003e 15) {\n var top = safeTopPx();\n if (top \u003e 0) vh += top;\n }\n }\n document.documentElement.style.setProperty('--actual-vh', vh + 'px');\n if (last \u003e 0 \u0026\u0026 Math.abs(vh - last) \u003e 30) {\n setTimeout(function () { window.dispatchEvent(new Event('resize')); }, 50);\n }\n last = vh;\n }\n apply();\n [50, 150, 300, 500, 800, 1200].forEach(function (ms) { setTimeout(apply, ms); });\n window.addEventListener('resize', apply);\n window.addEventListener('orientationchange', function () {\n setTimeout(apply, 100); setTimeout(apply, 300);\n });\n if (window.visualViewport) {\n window.visualViewport.addEventListener('resize', apply);\n window.visualViewport.addEventListener('scroll', apply);\n }\n // focusin/focusout can lead visualViewport.resize by ~100ms on\n // older iOS - recompute immediately so we don't render a bad frame.\n document.addEventListener('focusin', apply, true);\n document.addEventListener('focusout', apply, true);\n // iOS still scrolls the layout viewport up when the keyboard opens\n // to keep the focused input visible, even with html/body overflow:hidden.\n // Aggressive scroll-reset on focus events counteracts it (piclaw PWA.md\n // pattern, validated on iOS 26.x). Staggered timers cover the lag\n // between focus and iOS's scroll-into-view.\n function snapScroll() {\n if (window.scrollY !== 0 || window.pageYOffset !== 0) {\n window.scrollTo(0, 0);\n }\n }\n document.addEventListener('focusin', function () {\n snapScroll();\n [16, 50, 100, 200, 400].forEach(function (ms) { setTimeout(snapScroll, ms); });\n }, true);\n document.addEventListener('focusout', function () {\n [16, 50, 100, 200].forEach(function (ms) { setTimeout(snapScroll, ms); });\n }, true);\n if (window.visualViewport) {\n window.visualViewport.addEventListener('scroll', snapScroll);\n }\n window.addEventListener('scroll', snapScroll, { passive: true });\n document.addEventListener('visibilitychange', function () {\n if (!document.hidden) { setTimeout(apply, 50); setTimeout(apply, 200); }\n });\n } catch (e) { /* non-fatal: falls back to 100dvh */ }\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/b8e04d59a2bfff04.css\",\"precedence\":\"next\",\"crossOrigin\":\"$undefined\",\"nonce\":\"$undefined\"}]],[\"$\",\"html\",null,{\"lang\":\"en\",\"data-theme\":\"system\",\"suppressHydrationWarning\":true,\"children\":[[\"$\",\"head\",null,{\"children\":[[\"$\",\"script\",null,{\"dangerouslySetInnerHTML\":{\"__html\":\"$2\"}}],[\"$\",\"script\",null,{\"dangerouslySetInnerHTML\":{\"__html\":\"$3\"}}]]}],\"$L4\"]}]]}],{\"children\":[\"$L5\",{\"children\":[\"$L6\",{},null,false,null]},null,false,\"$@7\"]},null,false,null],\"$L8\",false]],\"m\":\"$undefined\",\"G\":[\"$9\",[]],\"S\":true,\"h\":null,\"s\":\"$undefined\",\"l\":\"$undefined\",\"p\":\"$undefined\",\"d\":\"$undefined\",\"b\":\"EOkgU73YJOpR-vFcKMgL0\"}\n"])</script><script>self.__next_f.push([1,"a:I[737,[\"7177\",\"static/chunks/app/layout-84c6f211a7a1ca36.js\"],\"ThemeProvider\"]\nb:I[3639,[\"7177\",\"static/chunks/app/layout-84c6f211a7a1ca36.js\"],\"AppProvider\"]\nc:I[7121,[],\"\"]\nd:I[4581,[],\"\"]\ne:I[722,[\"7177\",\"static/chunks/app/layout-84c6f211a7a1ca36.js\"],\"ServiceWorkerRegistration\"]\nf:I[484,[],\"OutletBoundary\"]\n10:\"$Sreact.suspense\"\n13:I[484,[],\"ViewportBoundary\"]\n15:I[484,[],\"MetadataBoundary\"]\n4:[\"$\",\"body\",null,{\"children\":[[\"$\",\"$La\",null,{\"children\":[\"$\",\"$Lb\",null,{\"children\":[\"$\",\"$Lc\",null,{\"parallelRouterKey\":\"children\",\"error\":\"$undefined\",\"errorStyles\":\"$undefined\",\"errorScripts\":\"$undefined\",\"template\":[\"$\",\"$Ld\",null,{}],\"templateStyles\":\"$undefined\",\"templateScripts\":\"$undefined\",\"notFound\":\"$undefined\",\"forbidden\":\"$undefined\",\"unauthorized\":\"$undefined\"}]}]}],[\"$\",\"$Le\",null,{}]]}]\n5:[\"$\",\"$1\",\"c\",{\"children\":[null,[\"$\",\"$Lc\",null,{\"parallelRouterKey\":\"children\",\"error\":\"$undefined\",\"errorStyles\":\"$undefined\",\"errorScripts\":\"$undefined\",\"template\":[\"$\",\"$Ld\",null,{}],\"templateStyles\":\"$undefined\",\"templateScripts\":\"$undefined\",\"notFound\":\"$undefined\",\"forbidden\":\"$undefined\",\"unauthorized\":\"$undefined\"}]]}]\n6:[\"$\",\"$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,[\"$\",\"$Lf\",null,{\"children\":[\"$\",\"$10\",null,{\"name\":\"Next.MetadataOutlet\",\"children\":\"$@11\"}]}]]}]\n12:[]\n7:\"$W12\"\n8:[\"$\",\"$1\",\"h\",{\"children\":[[\"$\",\"meta\",null,{\"name\":\"robots\",\"content\":\"noindex\"}],[\"$\",\"$L13\",null,{\"children\":\"$L14\"}],[\"$\",\"div\",null,{\"hidden\":true,\"children\":[\"$\",\"$L15\",null,{\"children\":[\"$\",\"$10\",null,{\"name\":\"Next.Metadata\",\"children\":\"$L16\"}]}]}],null]}]\n"])</script><script>self.__next_f.push([1,"14:[[\"$\",\"meta\",\"0\",{\"charSet\":\"utf-8\"}],[\"$\",\"meta\",\"1\",{\"name\":\"viewport\",\"content\":\"width=device-width, initial-scale=1, maximum-scale=1, viewport-fit=cover, interactive-widget=resizes-content\"}],[\"$\",\"meta\",\"2\",{\"name\":\"theme-color\",\"content\":\"#ffffff\",\"media\":\"(prefers-color-scheme: light)\"}],[\"$\",\"meta\",\"3\",{\"name\":\"theme-color\",\"content\":\"#09090b\",\"media\":\"(prefers-color-scheme: dark)\"}]]\n"])</script><script>self.__next_f.push([1,"17:I[6869,[],\"IconMark\"]\n11:null\n16:[[\"$\",\"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\"}],[\"$\",\"meta\",\"3\",{\"name\":\"mobile-web-app-capable\",\"content\":\"yes\"}],[\"$\",\"meta\",\"4\",{\"name\":\"apple-mobile-web-app-title\",\"content\":\"Jarela\"}],[\"$\",\"meta\",\"5\",{\"name\":\"apple-mobile-web-app-status-bar-style\",\"content\":\"black-translucent\"}],[\"$\",\"link\",\"6\",{\"rel\":\"icon\",\"href\":\"/favicon.svg\",\"type\":\"image/svg+xml\"}],[\"$\",\"link\",\"7\",{\"rel\":\"icon\",\"href\":\"/favicon.ico\",\"sizes\":\"any\"}],[\"$\",\"link\",\"8\",{\"rel\":\"icon\",\"href\":\"/icon-192.png\",\"type\":\"image/png\",\"sizes\":\"192x192\"}],[\"$\",\"link\",\"9\",{\"rel\":\"icon\",\"href\":\"/icon-512.png\",\"type\":\"image/png\",\"sizes\":\"512x512\"}],[\"$\",\"link\",\"10\",{\"rel\":\"apple-touch-icon\",\"href\":\"/apple-touch-icon.png\",\"sizes\":\"180x180\"}],[\"$\",\"$L17\",\"11\",{}]]\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-f4ac5c5f92cfd1c1.js"/><script src="/_next/static/chunks/4bd1b696-f4afdf0ad1d556a5.js" async=""></script><script src="/_next/static/chunks/3457-6d51726379cee3b7.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,"Segoe UI",Roboto,Helvetica,Arial,sans-serif,"Apple Color Emoji","Segoe UI Emoji";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-f4ac5c5f92cfd1c1.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\":\"
|
|
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-f4ac5c5f92cfd1c1.js"/><script src="/_next/static/chunks/4bd1b696-f4afdf0ad1d556a5.js" async=""></script><script src="/_next/static/chunks/3457-6d51726379cee3b7.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,"Segoe UI",Roboto,Helvetica,Arial,sans-serif,"Apple Color Emoji","Segoe UI Emoji";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-f4ac5c5f92cfd1c1.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\":\"EOkgU73YJOpR-vFcKMgL0\"}\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":"
|
|
1
|
+
{"node":{},"edge":{},"encryptionKey":"jg9vnbSGJkvQb8vj8DY1IIZl6UKxf0/5CHq1tzlMu7s="}
|