@circuitwall/jarela 0.9.3 → 0.10.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (94) hide show
  1. package/.next/standalone/.next/BUILD_ID +1 -1
  2. package/.next/standalone/.next/app-path-routes-manifest.json +2 -2
  3. package/.next/standalone/.next/build-manifest.json +2 -2
  4. package/.next/standalone/.next/prerender-manifest.json +3 -3
  5. package/.next/standalone/.next/server/app/_global-error/page_client-reference-manifest.js +1 -1
  6. package/.next/standalone/.next/server/app/_global-error.html +1 -1
  7. package/.next/standalone/.next/server/app/_global-error.rsc +1 -1
  8. package/.next/standalone/.next/server/app/_global-error.segments/_full.segment.rsc +1 -1
  9. package/.next/standalone/.next/server/app/_global-error.segments/_global-error/__PAGE__.segment.rsc +1 -1
  10. package/.next/standalone/.next/server/app/_global-error.segments/_global-error.segment.rsc +1 -1
  11. package/.next/standalone/.next/server/app/_global-error.segments/_head.segment.rsc +1 -1
  12. package/.next/standalone/.next/server/app/_global-error.segments/_index.segment.rsc +1 -1
  13. package/.next/standalone/.next/server/app/_global-error.segments/_tree.segment.rsc +1 -1
  14. package/.next/standalone/.next/server/app/_not-found/page_client-reference-manifest.js +1 -1
  15. package/.next/standalone/.next/server/app/_not-found.html +2 -2
  16. package/.next/standalone/.next/server/app/_not-found.rsc +2 -2
  17. package/.next/standalone/.next/server/app/_not-found.segments/_full.segment.rsc +2 -2
  18. package/.next/standalone/.next/server/app/_not-found.segments/_head.segment.rsc +1 -1
  19. package/.next/standalone/.next/server/app/_not-found.segments/_index.segment.rsc +2 -2
  20. package/.next/standalone/.next/server/app/_not-found.segments/_not-found/__PAGE__.segment.rsc +1 -1
  21. package/.next/standalone/.next/server/app/_not-found.segments/_not-found.segment.rsc +1 -1
  22. package/.next/standalone/.next/server/app/_not-found.segments/_tree.segment.rsc +2 -2
  23. package/.next/standalone/.next/server/app/api/v1/dashboard/metrics/route.js +72 -5
  24. package/.next/standalone/.next/server/app/api/v1/dashboard/metrics/route.js.map +1 -1
  25. package/.next/standalone/.next/server/app/api/v1/extensions/route.js +2 -2
  26. package/.next/standalone/.next/server/app/api/v1/extensions/tools/[name]/secrets/route.js +2 -2
  27. package/.next/standalone/.next/server/app/api/v1/threads/[thread_id]/run/route.js +136 -26
  28. package/.next/standalone/.next/server/app/api/v1/threads/[thread_id]/run/route.js.map +1 -1
  29. package/.next/standalone/.next/server/app/api/v1/tools/route.js +2 -2
  30. package/.next/standalone/.next/server/app/index.html +2 -2
  31. package/.next/standalone/.next/server/app/index.rsc +3 -3
  32. package/.next/standalone/.next/server/app/index.segments/__PAGE__.segment.rsc +2 -2
  33. package/.next/standalone/.next/server/app/index.segments/_full.segment.rsc +3 -3
  34. package/.next/standalone/.next/server/app/index.segments/_head.segment.rsc +1 -1
  35. package/.next/standalone/.next/server/app/index.segments/_index.segment.rsc +2 -2
  36. package/.next/standalone/.next/server/app/index.segments/_tree.segment.rsc +2 -2
  37. package/.next/standalone/.next/server/app/page.js +266 -40
  38. package/.next/standalone/.next/server/app/page.js.map +1 -1
  39. package/.next/standalone/.next/server/app/page_client-reference-manifest.js +1 -1
  40. package/.next/standalone/.next/server/app/setup/page_client-reference-manifest.js +1 -1
  41. package/.next/standalone/.next/server/app/setup.html +1 -1
  42. package/.next/standalone/.next/server/app/setup.rsc +2 -2
  43. package/.next/standalone/.next/server/app/setup.segments/_full.segment.rsc +2 -2
  44. package/.next/standalone/.next/server/app/setup.segments/_head.segment.rsc +1 -1
  45. package/.next/standalone/.next/server/app/setup.segments/_index.segment.rsc +2 -2
  46. package/.next/standalone/.next/server/app/setup.segments/_tree.segment.rsc +2 -2
  47. package/.next/standalone/.next/server/app/setup.segments/setup/__PAGE__.segment.rsc +1 -1
  48. package/.next/standalone/.next/server/app/setup.segments/setup.segment.rsc +1 -1
  49. package/.next/standalone/.next/server/app-paths-manifest.json +2 -2
  50. package/.next/standalone/.next/server/chunks/210.js +1 -1
  51. package/.next/standalone/.next/server/chunks/2151.js +60 -2
  52. package/.next/standalone/.next/server/chunks/2151.js.map +1 -1
  53. package/.next/standalone/.next/server/chunks/614.js +336 -93
  54. package/.next/standalone/.next/server/chunks/614.js.map +1 -1
  55. package/.next/standalone/.next/server/chunks/6765.js +35 -0
  56. package/.next/standalone/.next/server/chunks/6765.js.map +1 -1
  57. package/.next/standalone/.next/server/chunks/8697.js +15246 -15002
  58. package/.next/standalone/.next/server/chunks/8697.js.map +1 -1
  59. package/.next/standalone/.next/server/middleware-build-manifest.js +2 -2
  60. package/.next/standalone/.next/server/pages/404.html +2 -2
  61. package/.next/standalone/.next/server/pages/500.html +1 -1
  62. package/.next/standalone/.next/server/server-reference-manifest.json +1 -1
  63. package/.next/standalone/.next/static/chunks/{3741-344e2bfc5028b9c8.js → 3741-2d64471ff763b8fa.js} +36 -1
  64. package/.next/standalone/.next/static/chunks/3741-2d64471ff763b8fa.js.map +1 -0
  65. package/.next/standalone/.next/static/chunks/app/{page-c77ab600642bbfc2.js → page-318743bf47fac345.js} +267 -41
  66. package/.next/standalone/.next/static/chunks/app/page-318743bf47fac345.js.map +1 -0
  67. package/.next/standalone/.next/static/css/b6b85b0f13bc0e98.css +5 -0
  68. package/.next/standalone/.next/static/css/b6b85b0f13bc0e98.css.map +1 -0
  69. package/.next/standalone/package.json +1 -1
  70. package/CHANGELOG.md +48 -0
  71. package/README.md +2 -0
  72. package/api/client.ts +37 -1
  73. package/api/types.ts +18 -0
  74. package/app/api/v1/threads/[thread_id]/run/route.ts +69 -22
  75. package/components/agents/AgentEditor.tsx +7 -4
  76. package/components/chat/MessageBubble.tsx +108 -1
  77. package/components/dashboard/DashboardPanel.tsx +79 -21
  78. package/hooks/useSSE.ts +22 -9
  79. package/lib/agents/prepare/system-prompt.ts +30 -0
  80. package/lib/agents/run-registry.test.ts +94 -0
  81. package/lib/agents/run-registry.ts +60 -1
  82. package/lib/stores/dashboard-metrics.test.ts +33 -0
  83. package/lib/stores/dashboard-metrics.ts +93 -1
  84. package/lib/tools/exec.ts +9 -5
  85. package/lib/tools/files.ts +6 -0
  86. package/lib/tools/safety.test.ts +95 -0
  87. package/lib/tools/safety.ts +147 -0
  88. package/package.json +1 -1
  89. package/.next/standalone/.next/static/chunks/3741-344e2bfc5028b9c8.js.map +0 -1
  90. package/.next/standalone/.next/static/chunks/app/page-c77ab600642bbfc2.js.map +0 -1
  91. package/.next/standalone/.next/static/css/53f85613a5500253.css +0 -5
  92. package/.next/standalone/.next/static/css/53f85613a5500253.css.map +0 -1
  93. /package/.next/standalone/.next/static/{6uLoytvvEtLKIblEB53e0 → 8qTBpUDFnSMYwe3Zc0bGV}/_buildManifest.js +0 -0
  94. /package/.next/standalone/.next/static/{6uLoytvvEtLKIblEB53e0 → 8qTBpUDFnSMYwe3Zc0bGV}/_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}},"3434":{"*":{"id":"44381","name":"*","chunks":[],"async":false}},"3639":{"*":{"id":"35419","name":"*","chunks":[],"async":false}},"3741":{"*":{"id":"96765","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}}},"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":3434,"name":"*","chunks":["9209","static/chunks/9209-423cc67bf5d574dd.js","1517","static/chunks/1517-dbe76f9ee0ab6eaa.js","3741","static/chunks/3741-344e2bfc5028b9c8.js","8974","static/chunks/app/page-c77ab600642bbfc2.js"],"async":false},"/home/runner/work/jarela/jarela/components/setup/OnboardingWizard.tsx":{"id":3741,"name":"*","chunks":[],"async":false}},"entryCSSFiles":{"/home/runner/work/jarela/jarela/":[],"/home/runner/work/jarela/jarela/app/layout":[{"inlined":false,"path":"static/css/53f85613a5500253.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}},"3434":{"*":{"id":"59255","name":"*","chunks":[],"async":false}},"3639":{"*":{"id":"25933","name":"*","chunks":[],"async":false}},"3741":{"*":{"id":"59275","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}}},"edgeRscModuleMapping":{}};
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}},"3434":{"*":{"id":"44381","name":"*","chunks":[],"async":false}},"3639":{"*":{"id":"35419","name":"*","chunks":[],"async":false}},"3741":{"*":{"id":"96765","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}}},"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":3434,"name":"*","chunks":["9209","static/chunks/9209-423cc67bf5d574dd.js","1517","static/chunks/1517-dbe76f9ee0ab6eaa.js","3741","static/chunks/3741-2d64471ff763b8fa.js","8974","static/chunks/app/page-318743bf47fac345.js"],"async":false},"/home/runner/work/jarela/jarela/components/setup/OnboardingWizard.tsx":{"id":3741,"name":"*","chunks":[],"async":false}},"entryCSSFiles":{"/home/runner/work/jarela/jarela/":[],"/home/runner/work/jarela/jarela/app/layout":[{"inlined":false,"path":"static/css/b6b85b0f13bc0e98.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}},"3434":{"*":{"id":"59255","name":"*","chunks":[],"async":false}},"3639":{"*":{"id":"25933","name":"*","chunks":[],"async":false}},"3741":{"*":{"id":"59275","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}}},"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}},"3434":{"*":{"id":"44381","name":"*","chunks":[],"async":false}},"3639":{"*":{"id":"35419","name":"*","chunks":[],"async":false}},"3741":{"*":{"id":"96765","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}}},"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":3434,"name":"*","chunks":["9209","static/chunks/9209-423cc67bf5d574dd.js","1517","static/chunks/1517-dbe76f9ee0ab6eaa.js","3741","static/chunks/3741-344e2bfc5028b9c8.js","8974","static/chunks/app/page-c77ab600642bbfc2.js"],"async":false},"/home/runner/work/jarela/jarela/components/setup/OnboardingWizard.tsx":{"id":3741,"name":"*","chunks":["9209","static/chunks/9209-423cc67bf5d574dd.js","3741","static/chunks/3741-344e2bfc5028b9c8.js","620","static/chunks/app/setup/page-b1833b1823a1b475.js"],"async":false}},"entryCSSFiles":{"/home/runner/work/jarela/jarela/":[],"/home/runner/work/jarela/jarela/app/layout":[{"inlined":false,"path":"static/css/53f85613a5500253.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}},"3434":{"*":{"id":"59255","name":"*","chunks":[],"async":false}},"3639":{"*":{"id":"25933","name":"*","chunks":[],"async":false}},"3741":{"*":{"id":"59275","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}}},"edgeRscModuleMapping":{}};
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}},"3434":{"*":{"id":"44381","name":"*","chunks":[],"async":false}},"3639":{"*":{"id":"35419","name":"*","chunks":[],"async":false}},"3741":{"*":{"id":"96765","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}}},"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":3434,"name":"*","chunks":["9209","static/chunks/9209-423cc67bf5d574dd.js","1517","static/chunks/1517-dbe76f9ee0ab6eaa.js","3741","static/chunks/3741-2d64471ff763b8fa.js","8974","static/chunks/app/page-318743bf47fac345.js"],"async":false},"/home/runner/work/jarela/jarela/components/setup/OnboardingWizard.tsx":{"id":3741,"name":"*","chunks":["9209","static/chunks/9209-423cc67bf5d574dd.js","3741","static/chunks/3741-2d64471ff763b8fa.js","620","static/chunks/app/setup/page-b1833b1823a1b475.js"],"async":false}},"entryCSSFiles":{"/home/runner/work/jarela/jarela/":[],"/home/runner/work/jarela/jarela/app/layout":[{"inlined":false,"path":"static/css/b6b85b0f13bc0e98.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}},"3434":{"*":{"id":"59255","name":"*","chunks":[],"async":false}},"3639":{"*":{"id":"25933","name":"*","chunks":[],"async":false}},"3741":{"*":{"id":"59275","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}}},"edgeRscModuleMapping":{}};
@@ -1 +1 @@
1
- <!DOCTYPE html><html id="__next_error__"><head><meta charSet="utf-8"/><meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1, viewport-fit=cover"/><link rel="preload" as="script" fetchPriority="low" href="/_next/static/chunks/webpack-ff5627013a5e3842.js"/><script src="/_next/static/chunks/4bd1b696-f4afdf0ad1d556a5.js" async=""></script><script src="/_next/static/chunks/3457-5218e06617c4db2a.js" async=""></script><script src="/_next/static/chunks/main-app-3f37bcefd1eaffaf.js" async=""></script><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.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 src="/_next/static/chunks/polyfills-42372ed130431b0a.js" noModule=""></script></head><body><div hidden=""><!--$--><!--/$--></div><script src="/_next/static/chunks/webpack-ff5627013a5e3842.js" id="_R_" async=""></script><script>(self.__next_f=self.__next_f||[]).push([0])</script><script>self.__next_f.push([1,"1:\"$Sreact.fragment\"\n3:I[737,[\"7177\",\"static/chunks/app/layout-84c6f211a7a1ca36.js\"],\"ThemeProvider\"]\n4:I[3639,[\"7177\",\"static/chunks/app/layout-84c6f211a7a1ca36.js\"],\"AppProvider\"]\n5:I[7121,[],\"\"]\n6:I[4581,[],\"\"]\n7:I[722,[\"7177\",\"static/chunks/app/layout-84c6f211a7a1ca36.js\"],\"ServiceWorkerRegistration\"]\n9:I[484,[],\"OutletBoundary\"]\na:\"$Sreact.suspense\"\nd:I[484,[],\"ViewportBoundary\"]\nf:I[484,[],\"MetadataBoundary\"]\n11:I[7123,[],\"default\",1]\n:HL[\"/_next/static/css/53f85613a5500253.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})();"])</script><script>self.__next_f.push([1,"0:{\"P\":null,\"c\":[\"\",\"setup\"],\"q\":\"\",\"i\":false,\"f\":[[[\"\",{\"children\":[\"setup\",{\"children\":[\"__PAGE__\",{}]}]},\"$undefined\",\"$undefined\",16],[[\"$\",\"$1\",\"c\",{\"children\":[[[\"$\",\"link\",\"0\",{\"rel\":\"stylesheet\",\"href\":\"/_next/static/css/53f85613a5500253.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\"}}]}],[\"$\",\"body\",null,{\"children\":[[\"$\",\"$L3\",null,{\"children\":[\"$\",\"$L4\",null,{\"children\":[\"$\",\"$L5\",null,{\"parallelRouterKey\":\"children\",\"error\":\"$undefined\",\"errorStyles\":\"$undefined\",\"errorScripts\":\"$undefined\",\"template\":[\"$\",\"$L6\",null,{}],\"templateStyles\":\"$undefined\",\"templateScripts\":\"$undefined\",\"notFound\":[[[\"$\",\"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.\"}]}]]}]}]],[]],\"forbidden\":\"$undefined\",\"unauthorized\":\"$undefined\"}]}]}],[\"$\",\"$L7\",null,{}]]}]]}]]}],{\"children\":[[\"$\",\"$1\",\"c\",{\"children\":[null,[\"$\",\"$L5\",null,{\"parallelRouterKey\":\"children\",\"error\":\"$undefined\",\"errorStyles\":\"$undefined\",\"errorScripts\":\"$undefined\",\"template\":[\"$\",\"$L6\",null,{}],\"templateStyles\":\"$undefined\",\"templateScripts\":\"$undefined\",\"notFound\":\"$undefined\",\"forbidden\":\"$undefined\",\"unauthorized\":\"$undefined\"}]]}],{\"children\":[[\"$\",\"$1\",\"c\",{\"children\":[\"$L8\",null,[\"$\",\"$L9\",null,{\"children\":[\"$\",\"$a\",null,{\"name\":\"Next.MetadataOutlet\",\"children\":\"$@b\"}]}]]}],{},null,false,null]},null,false,\"$@c\"]},null,false,null],[\"$\",\"$1\",\"h\",{\"children\":[null,[\"$\",\"$Ld\",null,{\"children\":\"$Le\"}],[\"$\",\"div\",null,{\"hidden\":true,\"children\":[\"$\",\"$Lf\",null,{\"children\":[\"$\",\"$a\",null,{\"name\":\"Next.Metadata\",\"children\":\"$L10\"}]}]}],null]}],false]],\"m\":\"$undefined\",\"G\":[\"$11\",[]],\"S\":true,\"h\":null,\"s\":\"$undefined\",\"l\":\"$undefined\",\"p\":\"$undefined\",\"d\":\"$undefined\",\"b\":\"6uLoytvvEtLKIblEB53e0\"}\n"])</script><script>self.__next_f.push([1,"8:E{\"digest\":\"NEXT_REDIRECT;replace;/;307;\"}\n"])</script><script>self.__next_f.push([1,"12:[]\nc:\"$W12\"\n"])</script><script>self.__next_f.push([1,"e:[[\"$\",\"meta\",\"0\",{\"charSet\":\"utf-8\"}],[\"$\",\"meta\",\"1\",{\"name\":\"viewport\",\"content\":\"width=device-width, initial-scale=1, maximum-scale=1, viewport-fit=cover\"}],[\"$\",\"meta\",\"2\",{\"name\":\"theme-color\",\"content\":\"#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,"13:I[6869,[],\"IconMark\"]\nb:null\n10:[[\"$\",\"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.ico\",\"sizes\":\"any\"}],[\"$\",\"link\",\"7\",{\"rel\":\"icon\",\"href\":\"/icon-192.png\",\"type\":\"image/png\",\"sizes\":\"192x192\"}],[\"$\",\"link\",\"8\",{\"rel\":\"icon\",\"href\":\"/icon-512.png\",\"type\":\"image/png\",\"sizes\":\"512x512\"}],[\"$\",\"link\",\"9\",{\"rel\":\"apple-touch-icon\",\"href\":\"/apple-touch-icon.png\",\"sizes\":\"180x180\"}],[\"$\",\"$L13\",\"10\",{}]]\n"])</script></body></html>
1
+ <!DOCTYPE html><html id="__next_error__"><head><meta charSet="utf-8"/><meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1, viewport-fit=cover"/><link rel="preload" as="script" fetchPriority="low" href="/_next/static/chunks/webpack-ff5627013a5e3842.js"/><script src="/_next/static/chunks/4bd1b696-f4afdf0ad1d556a5.js" async=""></script><script src="/_next/static/chunks/3457-5218e06617c4db2a.js" async=""></script><script src="/_next/static/chunks/main-app-3f37bcefd1eaffaf.js" async=""></script><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.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 src="/_next/static/chunks/polyfills-42372ed130431b0a.js" noModule=""></script></head><body><div hidden=""><!--$--><!--/$--></div><script src="/_next/static/chunks/webpack-ff5627013a5e3842.js" id="_R_" async=""></script><script>(self.__next_f=self.__next_f||[]).push([0])</script><script>self.__next_f.push([1,"1:\"$Sreact.fragment\"\n3:I[737,[\"7177\",\"static/chunks/app/layout-84c6f211a7a1ca36.js\"],\"ThemeProvider\"]\n4:I[3639,[\"7177\",\"static/chunks/app/layout-84c6f211a7a1ca36.js\"],\"AppProvider\"]\n5:I[7121,[],\"\"]\n6:I[4581,[],\"\"]\n7:I[722,[\"7177\",\"static/chunks/app/layout-84c6f211a7a1ca36.js\"],\"ServiceWorkerRegistration\"]\n9:I[484,[],\"OutletBoundary\"]\na:\"$Sreact.suspense\"\nd:I[484,[],\"ViewportBoundary\"]\nf:I[484,[],\"MetadataBoundary\"]\n11:I[7123,[],\"default\",1]\n:HL[\"/_next/static/css/b6b85b0f13bc0e98.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})();"])</script><script>self.__next_f.push([1,"0:{\"P\":null,\"c\":[\"\",\"setup\"],\"q\":\"\",\"i\":false,\"f\":[[[\"\",{\"children\":[\"setup\",{\"children\":[\"__PAGE__\",{}]}]},\"$undefined\",\"$undefined\",16],[[\"$\",\"$1\",\"c\",{\"children\":[[[\"$\",\"link\",\"0\",{\"rel\":\"stylesheet\",\"href\":\"/_next/static/css/b6b85b0f13bc0e98.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\"}}]}],[\"$\",\"body\",null,{\"children\":[[\"$\",\"$L3\",null,{\"children\":[\"$\",\"$L4\",null,{\"children\":[\"$\",\"$L5\",null,{\"parallelRouterKey\":\"children\",\"error\":\"$undefined\",\"errorStyles\":\"$undefined\",\"errorScripts\":\"$undefined\",\"template\":[\"$\",\"$L6\",null,{}],\"templateStyles\":\"$undefined\",\"templateScripts\":\"$undefined\",\"notFound\":[[[\"$\",\"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.\"}]}]]}]}]],[]],\"forbidden\":\"$undefined\",\"unauthorized\":\"$undefined\"}]}]}],[\"$\",\"$L7\",null,{}]]}]]}]]}],{\"children\":[[\"$\",\"$1\",\"c\",{\"children\":[null,[\"$\",\"$L5\",null,{\"parallelRouterKey\":\"children\",\"error\":\"$undefined\",\"errorStyles\":\"$undefined\",\"errorScripts\":\"$undefined\",\"template\":[\"$\",\"$L6\",null,{}],\"templateStyles\":\"$undefined\",\"templateScripts\":\"$undefined\",\"notFound\":\"$undefined\",\"forbidden\":\"$undefined\",\"unauthorized\":\"$undefined\"}]]}],{\"children\":[[\"$\",\"$1\",\"c\",{\"children\":[\"$L8\",null,[\"$\",\"$L9\",null,{\"children\":[\"$\",\"$a\",null,{\"name\":\"Next.MetadataOutlet\",\"children\":\"$@b\"}]}]]}],{},null,false,null]},null,false,\"$@c\"]},null,false,null],[\"$\",\"$1\",\"h\",{\"children\":[null,[\"$\",\"$Ld\",null,{\"children\":\"$Le\"}],[\"$\",\"div\",null,{\"hidden\":true,\"children\":[\"$\",\"$Lf\",null,{\"children\":[\"$\",\"$a\",null,{\"name\":\"Next.Metadata\",\"children\":\"$L10\"}]}]}],null]}],false]],\"m\":\"$undefined\",\"G\":[\"$11\",[]],\"S\":true,\"h\":null,\"s\":\"$undefined\",\"l\":\"$undefined\",\"p\":\"$undefined\",\"d\":\"$undefined\",\"b\":\"8qTBpUDFnSMYwe3Zc0bGV\"}\n"])</script><script>self.__next_f.push([1,"8:E{\"digest\":\"NEXT_REDIRECT;replace;/;307;\"}\n"])</script><script>self.__next_f.push([1,"12:[]\nc:\"$W12\"\n"])</script><script>self.__next_f.push([1,"e:[[\"$\",\"meta\",\"0\",{\"charSet\":\"utf-8\"}],[\"$\",\"meta\",\"1\",{\"name\":\"viewport\",\"content\":\"width=device-width, initial-scale=1, maximum-scale=1, viewport-fit=cover\"}],[\"$\",\"meta\",\"2\",{\"name\":\"theme-color\",\"content\":\"#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,"13:I[6869,[],\"IconMark\"]\nb:null\n10:[[\"$\",\"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.ico\",\"sizes\":\"any\"}],[\"$\",\"link\",\"7\",{\"rel\":\"icon\",\"href\":\"/icon-192.png\",\"type\":\"image/png\",\"sizes\":\"192x192\"}],[\"$\",\"link\",\"8\",{\"rel\":\"icon\",\"href\":\"/icon-512.png\",\"type\":\"image/png\",\"sizes\":\"512x512\"}],[\"$\",\"link\",\"9\",{\"rel\":\"apple-touch-icon\",\"href\":\"/apple-touch-icon.png\",\"sizes\":\"180x180\"}],[\"$\",\"$L13\",\"10\",{}]]\n"])</script></body></html>
@@ -9,7 +9,7 @@ a:"$Sreact.suspense"
9
9
  d:I[484,[],"ViewportBoundary"]
10
10
  f:I[484,[],"MetadataBoundary"]
11
11
  11:I[7123,[],"default",1]
12
- :HL["/_next/static/css/53f85613a5500253.css","style"]
12
+ :HL["/_next/static/css/b6b85b0f13bc0e98.css","style"]
13
13
  2:T4b9,(() => {
14
14
  var LIGHT = "#ffffff", DARK = "#09090b";
15
15
  function resolve(t) {
@@ -39,7 +39,7 @@ f:I[484,[],"MetadataBoundary"]
39
39
  } catch (e) {
40
40
  document.documentElement.setAttribute("data-theme", "system");
41
41
  }
42
- })();0:{"P":null,"c":["","setup"],"q":"","i":false,"f":[[["",{"children":["setup",{"children":["__PAGE__",{}]}]},"$undefined","$undefined",16],[["$","$1","c",{"children":[[["$","link","0",{"rel":"stylesheet","href":"/_next/static/css/53f85613a5500253.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"}}]}],["$","body",null,{"children":[["$","$L3",null,{"children":["$","$L4",null,{"children":["$","$L5",null,{"parallelRouterKey":"children","error":"$undefined","errorStyles":"$undefined","errorScripts":"$undefined","template":["$","$L6",null,{}],"templateStyles":"$undefined","templateScripts":"$undefined","notFound":[[["$","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."}]}]]}]}]],[]],"forbidden":"$undefined","unauthorized":"$undefined"}]}]}],["$","$L7",null,{}]]}]]}]]}],{"children":[["$","$1","c",{"children":[null,["$","$L5",null,{"parallelRouterKey":"children","error":"$undefined","errorStyles":"$undefined","errorScripts":"$undefined","template":["$","$L6",null,{}],"templateStyles":"$undefined","templateScripts":"$undefined","notFound":"$undefined","forbidden":"$undefined","unauthorized":"$undefined"}]]}],{"children":[["$","$1","c",{"children":["$L8",null,["$","$L9",null,{"children":["$","$a",null,{"name":"Next.MetadataOutlet","children":"$@b"}]}]]}],{},null,false,null]},null,false,"$@c"]},null,false,null],["$","$1","h",{"children":[null,["$","$Ld",null,{"children":"$Le"}],["$","div",null,{"hidden":true,"children":["$","$Lf",null,{"children":["$","$a",null,{"name":"Next.Metadata","children":"$L10"}]}]}],null]}],false]],"m":"$undefined","G":["$11",[]],"S":true,"h":null,"s":"$undefined","l":"$undefined","p":"$undefined","d":"$undefined","b":"6uLoytvvEtLKIblEB53e0"}
42
+ })();0:{"P":null,"c":["","setup"],"q":"","i":false,"f":[[["",{"children":["setup",{"children":["__PAGE__",{}]}]},"$undefined","$undefined",16],[["$","$1","c",{"children":[[["$","link","0",{"rel":"stylesheet","href":"/_next/static/css/b6b85b0f13bc0e98.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"}}]}],["$","body",null,{"children":[["$","$L3",null,{"children":["$","$L4",null,{"children":["$","$L5",null,{"parallelRouterKey":"children","error":"$undefined","errorStyles":"$undefined","errorScripts":"$undefined","template":["$","$L6",null,{}],"templateStyles":"$undefined","templateScripts":"$undefined","notFound":[[["$","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."}]}]]}]}]],[]],"forbidden":"$undefined","unauthorized":"$undefined"}]}]}],["$","$L7",null,{}]]}]]}]]}],{"children":[["$","$1","c",{"children":[null,["$","$L5",null,{"parallelRouterKey":"children","error":"$undefined","errorStyles":"$undefined","errorScripts":"$undefined","template":["$","$L6",null,{}],"templateStyles":"$undefined","templateScripts":"$undefined","notFound":"$undefined","forbidden":"$undefined","unauthorized":"$undefined"}]]}],{"children":[["$","$1","c",{"children":["$L8",null,["$","$L9",null,{"children":["$","$a",null,{"name":"Next.MetadataOutlet","children":"$@b"}]}]]}],{},null,false,null]},null,false,"$@c"]},null,false,null],["$","$1","h",{"children":[null,["$","$Ld",null,{"children":"$Le"}],["$","div",null,{"hidden":true,"children":["$","$Lf",null,{"children":["$","$a",null,{"name":"Next.Metadata","children":"$L10"}]}]}],null]}],false]],"m":"$undefined","G":["$11",[]],"S":true,"h":null,"s":"$undefined","l":"$undefined","p":"$undefined","d":"$undefined","b":"8qTBpUDFnSMYwe3Zc0bGV"}
43
43
  8:E{"digest":"NEXT_REDIRECT;replace;/;307;"}
44
44
  12:[]
45
45
  c:"$W12"
@@ -9,7 +9,7 @@ a:"$Sreact.suspense"
9
9
  d:I[484,[],"ViewportBoundary"]
10
10
  f:I[484,[],"MetadataBoundary"]
11
11
  11:I[7123,[],"default",1]
12
- :HL["/_next/static/css/53f85613a5500253.css","style"]
12
+ :HL["/_next/static/css/b6b85b0f13bc0e98.css","style"]
13
13
  2:T4b9,(() => {
14
14
  var LIGHT = "#ffffff", DARK = "#09090b";
15
15
  function resolve(t) {
@@ -39,7 +39,7 @@ f:I[484,[],"MetadataBoundary"]
39
39
  } catch (e) {
40
40
  document.documentElement.setAttribute("data-theme", "system");
41
41
  }
42
- })();0:{"P":null,"c":["","setup"],"q":"","i":false,"f":[[["",{"children":["setup",{"children":["__PAGE__",{}]}]},"$undefined","$undefined",16],[["$","$1","c",{"children":[[["$","link","0",{"rel":"stylesheet","href":"/_next/static/css/53f85613a5500253.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"}}]}],["$","body",null,{"children":[["$","$L3",null,{"children":["$","$L4",null,{"children":["$","$L5",null,{"parallelRouterKey":"children","error":"$undefined","errorStyles":"$undefined","errorScripts":"$undefined","template":["$","$L6",null,{}],"templateStyles":"$undefined","templateScripts":"$undefined","notFound":[[["$","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."}]}]]}]}]],[]],"forbidden":"$undefined","unauthorized":"$undefined"}]}]}],["$","$L7",null,{}]]}]]}]]}],{"children":[["$","$1","c",{"children":[null,["$","$L5",null,{"parallelRouterKey":"children","error":"$undefined","errorStyles":"$undefined","errorScripts":"$undefined","template":["$","$L6",null,{}],"templateStyles":"$undefined","templateScripts":"$undefined","notFound":"$undefined","forbidden":"$undefined","unauthorized":"$undefined"}]]}],{"children":[["$","$1","c",{"children":["$L8",null,["$","$L9",null,{"children":["$","$a",null,{"name":"Next.MetadataOutlet","children":"$@b"}]}]]}],{},null,false,null]},null,false,"$@c"]},null,false,null],["$","$1","h",{"children":[null,["$","$Ld",null,{"children":"$Le"}],["$","div",null,{"hidden":true,"children":["$","$Lf",null,{"children":["$","$a",null,{"name":"Next.Metadata","children":"$L10"}]}]}],null]}],false]],"m":"$undefined","G":["$11",[]],"S":true,"h":null,"s":"$undefined","l":"$undefined","p":"$undefined","d":"$undefined","b":"6uLoytvvEtLKIblEB53e0"}
42
+ })();0:{"P":null,"c":["","setup"],"q":"","i":false,"f":[[["",{"children":["setup",{"children":["__PAGE__",{}]}]},"$undefined","$undefined",16],[["$","$1","c",{"children":[[["$","link","0",{"rel":"stylesheet","href":"/_next/static/css/b6b85b0f13bc0e98.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"}}]}],["$","body",null,{"children":[["$","$L3",null,{"children":["$","$L4",null,{"children":["$","$L5",null,{"parallelRouterKey":"children","error":"$undefined","errorStyles":"$undefined","errorScripts":"$undefined","template":["$","$L6",null,{}],"templateStyles":"$undefined","templateScripts":"$undefined","notFound":[[["$","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."}]}]]}]}]],[]],"forbidden":"$undefined","unauthorized":"$undefined"}]}]}],["$","$L7",null,{}]]}]]}]]}],{"children":[["$","$1","c",{"children":[null,["$","$L5",null,{"parallelRouterKey":"children","error":"$undefined","errorStyles":"$undefined","errorScripts":"$undefined","template":["$","$L6",null,{}],"templateStyles":"$undefined","templateScripts":"$undefined","notFound":"$undefined","forbidden":"$undefined","unauthorized":"$undefined"}]]}],{"children":[["$","$1","c",{"children":["$L8",null,["$","$L9",null,{"children":["$","$a",null,{"name":"Next.MetadataOutlet","children":"$@b"}]}]]}],{},null,false,null]},null,false,"$@c"]},null,false,null],["$","$1","h",{"children":[null,["$","$Ld",null,{"children":"$Le"}],["$","div",null,{"hidden":true,"children":["$","$Lf",null,{"children":["$","$a",null,{"name":"Next.Metadata","children":"$L10"}]}]}],null]}],false]],"m":"$undefined","G":["$11",[]],"S":true,"h":null,"s":"$undefined","l":"$undefined","p":"$undefined","d":"$undefined","b":"8qTBpUDFnSMYwe3Zc0bGV"}
43
43
  8:E{"digest":"NEXT_REDIRECT;replace;/;307;"}
44
44
  12:[]
45
45
  c:"$W12"
@@ -3,4 +3,4 @@
3
3
  3:I[484,[],"MetadataBoundary"]
4
4
  4:"$Sreact.suspense"
5
5
  5:I[6869,[],"IconMark"]
6
- 0:{"rsc":["$","$1","h",{"children":[null,["$","$L2",null,{"children":[["$","meta","0",{"charSet":"utf-8"}],["$","meta","1",{"name":"viewport","content":"width=device-width, initial-scale=1, maximum-scale=1, viewport-fit=cover"}],["$","meta","2",{"name":"theme-color","content":"#ffffff","media":"(prefers-color-scheme: light)"}],["$","meta","3",{"name":"theme-color","content":"#09090b","media":"(prefers-color-scheme: dark)"}]]}],["$","div",null,{"hidden":true,"children":["$","$L3",null,{"children":["$","$4",null,{"name":"Next.Metadata","children":[["$","title","0",{"children":"Jarela"}],["$","meta","1",{"name":"description","content":"Jarela — local chat interface for LangGraph agents"}],["$","link","2",{"rel":"manifest","href":"/manifest.json"}],["$","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.ico","sizes":"any"}],["$","link","7",{"rel":"icon","href":"/icon-192.png","type":"image/png","sizes":"192x192"}],["$","link","8",{"rel":"icon","href":"/icon-512.png","type":"image/png","sizes":"512x512"}],["$","link","9",{"rel":"apple-touch-icon","href":"/apple-touch-icon.png","sizes":"180x180"}],["$","$L5","10",{}]]}]}]}],null]}],"isPartial":false,"staleTime":300,"varyParams":null,"buildId":"6uLoytvvEtLKIblEB53e0"}
6
+ 0:{"rsc":["$","$1","h",{"children":[null,["$","$L2",null,{"children":[["$","meta","0",{"charSet":"utf-8"}],["$","meta","1",{"name":"viewport","content":"width=device-width, initial-scale=1, maximum-scale=1, viewport-fit=cover"}],["$","meta","2",{"name":"theme-color","content":"#ffffff","media":"(prefers-color-scheme: light)"}],["$","meta","3",{"name":"theme-color","content":"#09090b","media":"(prefers-color-scheme: dark)"}]]}],["$","div",null,{"hidden":true,"children":["$","$L3",null,{"children":["$","$4",null,{"name":"Next.Metadata","children":[["$","title","0",{"children":"Jarela"}],["$","meta","1",{"name":"description","content":"Jarela — local chat interface for LangGraph agents"}],["$","link","2",{"rel":"manifest","href":"/manifest.json"}],["$","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.ico","sizes":"any"}],["$","link","7",{"rel":"icon","href":"/icon-192.png","type":"image/png","sizes":"192x192"}],["$","link","8",{"rel":"icon","href":"/icon-512.png","type":"image/png","sizes":"512x512"}],["$","link","9",{"rel":"apple-touch-icon","href":"/apple-touch-icon.png","sizes":"180x180"}],["$","$L5","10",{}]]}]}]}],null]}],"isPartial":false,"staleTime":300,"varyParams":null,"buildId":"8qTBpUDFnSMYwe3Zc0bGV"}
@@ -4,7 +4,7 @@
4
4
  5:I[7121,[],""]
5
5
  6:I[4581,[],""]
6
6
  7:I[722,["7177","static/chunks/app/layout-84c6f211a7a1ca36.js"],"ServiceWorkerRegistration"]
7
- :HL["/_next/static/css/53f85613a5500253.css","style"]
7
+ :HL["/_next/static/css/b6b85b0f13bc0e98.css","style"]
8
8
  2:T4b9,(() => {
9
9
  var LIGHT = "#ffffff", DARK = "#09090b";
10
10
  function resolve(t) {
@@ -34,4 +34,4 @@
34
34
  } catch (e) {
35
35
  document.documentElement.setAttribute("data-theme", "system");
36
36
  }
37
- })();0:{"rsc":["$","$1","c",{"children":[[["$","link","0",{"rel":"stylesheet","href":"/_next/static/css/53f85613a5500253.css","precedence":"next"}]],["$","html",null,{"lang":"en","data-theme":"system","suppressHydrationWarning":true,"children":[["$","head",null,{"children":["$","script",null,{"dangerouslySetInnerHTML":{"__html":"$2"}}]}],["$","body",null,{"children":[["$","$L3",null,{"children":["$","$L4",null,{"children":["$","$L5",null,{"parallelRouterKey":"children","template":["$","$L6",null,{}],"notFound":[[["$","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."}]}]]}]}]],[]]}]}]}],["$","$L7",null,{}]]}]]}]]}],"isPartial":false,"staleTime":300,"varyParams":null,"buildId":"6uLoytvvEtLKIblEB53e0"}
37
+ })();0:{"rsc":["$","$1","c",{"children":[[["$","link","0",{"rel":"stylesheet","href":"/_next/static/css/b6b85b0f13bc0e98.css","precedence":"next"}]],["$","html",null,{"lang":"en","data-theme":"system","suppressHydrationWarning":true,"children":[["$","head",null,{"children":["$","script",null,{"dangerouslySetInnerHTML":{"__html":"$2"}}]}],["$","body",null,{"children":[["$","$L3",null,{"children":["$","$L4",null,{"children":["$","$L5",null,{"parallelRouterKey":"children","template":["$","$L6",null,{}],"notFound":[[["$","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."}]}]]}]}]],[]]}]}]}],["$","$L7",null,{}]]}]]}]]}],"isPartial":false,"staleTime":300,"varyParams":null,"buildId":"8qTBpUDFnSMYwe3Zc0bGV"}
@@ -1,2 +1,2 @@
1
- :HL["/_next/static/css/53f85613a5500253.css","style"]
2
- 0:{"tree":{"name":"","param":null,"prefetchHints":16,"slots":{"children":{"name":"setup","param":null,"prefetchHints":0,"slots":{"children":{"name":"__PAGE__","param":null,"prefetchHints":0,"slots":null}}}}},"staleTime":300,"buildId":"6uLoytvvEtLKIblEB53e0"}
1
+ :HL["/_next/static/css/b6b85b0f13bc0e98.css","style"]
2
+ 0:{"tree":{"name":"","param":null,"prefetchHints":16,"slots":{"children":{"name":"setup","param":null,"prefetchHints":0,"slots":{"children":{"name":"__PAGE__","param":null,"prefetchHints":0,"slots":null}}}}},"staleTime":300,"buildId":"8qTBpUDFnSMYwe3Zc0bGV"}
@@ -1,6 +1,6 @@
1
1
  1:"$Sreact.fragment"
2
2
  3:I[484,[],"OutletBoundary"]
3
3
  4:"$Sreact.suspense"
4
- 0:{"rsc":["$","$1","c",{"children":["$L2",null,["$","$L3",null,{"children":["$","$4",null,{"name":"Next.MetadataOutlet","children":"$@5"}]}]]}],"isPartial":false,"staleTime":300,"varyParams":null,"buildId":"6uLoytvvEtLKIblEB53e0"}
4
+ 0:{"rsc":["$","$1","c",{"children":["$L2",null,["$","$L3",null,{"children":["$","$4",null,{"name":"Next.MetadataOutlet","children":"$@5"}]}]]}],"isPartial":false,"staleTime":300,"varyParams":null,"buildId":"8qTBpUDFnSMYwe3Zc0bGV"}
5
5
  5:null
6
6
  2:E{"digest":"NEXT_REDIRECT;replace;/;307;"}
@@ -2,4 +2,4 @@
2
2
  2:I[7121,[],""]
3
3
  3:I[4581,[],""]
4
4
  4:[]
5
- 0:{"rsc":["$","$1","c",{"children":[null,["$","$L2",null,{"parallelRouterKey":"children","template":["$","$L3",null,{}]}]]}],"isPartial":false,"staleTime":300,"varyParams":"$W4","buildId":"6uLoytvvEtLKIblEB53e0"}
5
+ 0:{"rsc":["$","$1","c",{"children":[null,["$","$L2",null,{"parallelRouterKey":"children","template":["$","$L3",null,{}]}]]}],"isPartial":false,"staleTime":300,"varyParams":"$W4","buildId":"8qTBpUDFnSMYwe3Zc0bGV"}
@@ -76,12 +76,12 @@
76
76
  "/icon.svg/route": "app/icon.svg/route.js",
77
77
  "/api/v1/bridges/[id]/chats/route": "app/api/v1/bridges/[id]/chats/route.js",
78
78
  "/api/v1/bridges/[id]/lookup/route": "app/api/v1/bridges/[id]/lookup/route.js",
79
- "/api/v1/bridges/[id]/pair/route": "app/api/v1/bridges/[id]/pair/route.js",
80
79
  "/api/v1/bridges/[id]/status/route": "app/api/v1/bridges/[id]/status/route.js",
80
+ "/api/v1/bridges/[id]/pair/route": "app/api/v1/bridges/[id]/pair/route.js",
81
81
  "/api/v1/bridges/[id]/route": "app/api/v1/bridges/[id]/route.js",
82
82
  "/api/v1/events/route": "app/api/v1/events/route.js",
83
- "/api/v1/maps/embed/route": "app/api/v1/maps/embed/route.js",
84
83
  "/api/v1/page-capture/route": "app/api/v1/page-capture/route.js",
84
+ "/api/v1/maps/embed/route": "app/api/v1/maps/embed/route.js",
85
85
  "/api/v1/proxy-config/route": "app/api/v1/proxy-config/route.js",
86
86
  "/api/v1/update/route": "app/api/v1/update/route.js",
87
87
  "/page": "app/page.js",
@@ -18,7 +18,7 @@ exports.modules = {
18
18
  async function bootNode() {
19
19
  const { registerShutdownHandlers } = await __webpack_require__.e(/* import() */ 9032).then(__webpack_require__.bind(__webpack_require__, 39032));
20
20
  registerShutdownHandlers();
21
- const { initTools } = await Promise.all(/* import() */[__webpack_require__.e(1218), __webpack_require__.e(6447), __webpack_require__.e(127), __webpack_require__.e(3169), __webpack_require__.e(423), __webpack_require__.e(8697), __webpack_require__.e(8370)]).then(__webpack_require__.bind(__webpack_require__, 73306));
21
+ const { initTools } = await Promise.all(/* import() */[__webpack_require__.e(1218), __webpack_require__.e(6447), __webpack_require__.e(127), __webpack_require__.e(3169), __webpack_require__.e(423), __webpack_require__.e(8697), __webpack_require__.e(8370)]).then(__webpack_require__.bind(__webpack_require__, 17991));
22
22
  initTools();
23
23
  const triggers = await Promise.all(/* import() */[__webpack_require__.e(1218), __webpack_require__.e(6447), __webpack_require__.e(127), __webpack_require__.e(3169), __webpack_require__.e(423), __webpack_require__.e(8697), __webpack_require__.e(8370)]).then(__webpack_require__.bind(__webpack_require__, 64439));
24
24
  await triggers.startAllTriggerHandlers();
@@ -13,6 +13,23 @@ exports.modules = {
13
13
  /* unused harmony exports startRun, broadcast, finishRun, getRun, abortRun, subscribe */
14
14
  const MAX_BUFFERED = 4000; // text_delta chunks accumulate fast; cap them
15
15
  const RECENT_TTL_MS = (/* unused pure expression or super */ null && (5 * 60000)); // keep finished runs visible for 5 min
16
+ // Idle (no-progress) ceiling: if no chunk has been broadcast for this
17
+ // long the registry assumes the LLM/tool call wedged and force-finishes
18
+ // the run. This is the user-perceived "stream is dead" signal and is
19
+ // short by design — long legitimate turns keep streaming text/tool
20
+ // chunks, so they reset the idle clock on every broadcast(). The
21
+ // wall-clock ceiling (runMaxMs) is the absolute safety net for the
22
+ // degenerate case where broadcast() is never called at all (or fires
23
+ // faster than the idle window forever).
24
+ // Override with JARELA_RUN_IDLE_MS / JARELA_RUN_MAX_MS.
25
+ function runIdleMs() {
26
+ const raw = Number(process.env.JARELA_RUN_IDLE_MS);
27
+ return Number.isFinite(raw) && raw > 0 ? raw : 90000;
28
+ }
29
+ function runMaxMs() {
30
+ const raw = Number(process.env.JARELA_RUN_MAX_MS);
31
+ return Number.isFinite(raw) && raw > 0 ? raw : 15 * 60000;
32
+ }
16
33
  const runs = new Map();
17
34
  function startRun(thread_id, agent_id) {
18
35
  // If a stale completed run exists, drop it before starting a new one.
@@ -20,24 +37,65 @@ function startRun(thread_id, agent_id) {
20
37
  if (existing && existing.status === "running") {
21
38
  throw new Error(`A run is already active for thread ${thread_id}`);
22
39
  }
40
+ const now = Date.now();
23
41
  const run = {
24
42
  thread_id,
25
43
  agent_id,
26
- started_at: Date.now(),
44
+ started_at: now,
27
45
  finished_at: null,
28
46
  status: "running",
29
47
  events: [],
30
48
  subscribers: new Set(),
31
49
  final_text: "",
32
- abort: new AbortController()
50
+ abort: new AbortController(),
51
+ last_chunk_at: now
33
52
  };
34
53
  runs.set(thread_id, run);
54
+ scheduleIdleWatchdog(run);
55
+ scheduleMaxWatchdog(run);
35
56
  return run;
36
57
  }
58
+ // Self-rearming idle watchdog. Fires when no chunk has arrived for
59
+ // `idleMs`; otherwise reschedules itself for `(last_chunk_at + idleMs) -
60
+ // now`. We never carry a handle on the run — the closure just bails if
61
+ // the run is no longer the registry's entry or no longer running.
62
+ function scheduleIdleWatchdog(run) {
63
+ const idleMs = runIdleMs();
64
+ const fireIn = Math.max(0, run.last_chunk_at + idleMs - Date.now());
65
+ setTimeout(()=>{
66
+ const cur = runs.get(run.thread_id);
67
+ if (cur !== run) return;
68
+ if (run.status !== "running") return;
69
+ const idle = Date.now() - run.last_chunk_at;
70
+ if (idle < idleMs) {
71
+ scheduleIdleWatchdog(run);
72
+ return;
73
+ }
74
+ console.warn(`[run-registry] idle watchdog: force-finishing stalled run for thread ${run.thread_id} after ${idle}ms of no progress`);
75
+ try {
76
+ run.abort.abort("run_idle_timeout");
77
+ } catch {}
78
+ finishRun(run, "error");
79
+ }, fireIn).unref?.();
80
+ }
81
+ function scheduleMaxWatchdog(run) {
82
+ const max = runMaxMs();
83
+ setTimeout(()=>{
84
+ const cur = runs.get(run.thread_id);
85
+ if (cur !== run) return;
86
+ if (run.status !== "running") return;
87
+ console.warn(`[run-registry] wall-clock watchdog: force-finishing run for thread ${run.thread_id} after ${max}ms`);
88
+ try {
89
+ run.abort.abort("run_watchdog_timeout");
90
+ } catch {}
91
+ finishRun(run, "error");
92
+ }, max).unref?.();
93
+ }
37
94
  function broadcast(run, chunk) {
38
95
  // Identity-check: a superseded run must not smear trailing chunks onto
39
96
  // the replacement entry in the registry.
40
97
  if (runs.get(run.thread_id) !== run) return;
98
+ run.last_chunk_at = Date.now();
41
99
  if (chunk.type === "text_delta") {
42
100
  run.final_text += chunk.data.delta ?? "";
43
101
  }
@@ -1 +1 @@
1
- {"version":3,"file":"2151.js","mappings":"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","sources":["webpack://@circuitwall/jarela/./lib/agents/run-registry.ts"],"sourcesContent":["import type { StreamChunk } from \"./base\";\n\n// In-memory registry of in-flight agent runs, keyed by thread_id. When the user\n// switches agents mid-stream, the run keeps going server-side; if they return\n// (or open a second tab), they re-attach via subscribe() and see live deltas.\n//\n// Trade-offs:\n// - Single Node process only. Multi-instance deploys would need a shared\n// pubsub (Redis, NATS) — not in scope for a local app.\n// - Buffered events are capped to MAX_BUFFERED so a 100k-token response\n// doesn't pin GBs of memory if every chunk lingers. Late attachers see the\n// most recent slice plus all subsequent events.\n\ntype Subscriber = (chunk: StreamChunk) => void;\n\nconst MAX_BUFFERED = 4000; // text_delta chunks accumulate fast; cap them\nconst RECENT_TTL_MS = 5 * 60_000; // keep finished runs visible for 5 min\n\nexport interface ActiveRun {\n thread_id: string;\n agent_id: string | null;\n started_at: number;\n finished_at: number | null;\n status: \"running\" | \"done\" | \"error\";\n events: StreamChunk[];\n subscribers: Set<Subscriber>;\n // Final assistant text — useful for notification body without replaying every event.\n final_text: string;\n // Server-side abort: when the user clicks Stop (or the last client\n // disconnects), we signal this controller so the LangGraph stream cancels\n // itself instead of running to completion in the background.\n abort: AbortController;\n}\n\nconst runs = new Map<string, ActiveRun>();\n\nexport function startRun(thread_id: string, agent_id: string | null): ActiveRun {\n // If a stale completed run exists, drop it before starting a new one.\n const existing = runs.get(thread_id);\n if (existing && existing.status === \"running\") {\n throw new Error(`A run is already active for thread ${thread_id}`);\n }\n const run: ActiveRun = {\n thread_id,\n agent_id,\n started_at: Date.now(),\n finished_at: null,\n status: \"running\",\n events: [],\n subscribers: new Set(),\n final_text: \"\",\n abort: new AbortController(),\n };\n runs.set(thread_id, run);\n return run;\n}\n\nexport function broadcast(run: ActiveRun, chunk: StreamChunk): void {\n // Identity-check: a superseded run must not smear trailing chunks onto\n // the replacement entry in the registry.\n if (runs.get(run.thread_id) !== run) return;\n if (chunk.type === \"text_delta\") {\n run.final_text += (chunk.data.delta as string) ?? \"\";\n }\n if (run.events.length < MAX_BUFFERED) {\n run.events.push(chunk);\n }\n for (const fn of run.subscribers) {\n try { fn(chunk); } catch { /* subscriber errored, ignore */ }\n }\n}\n\nexport function finishRun(run: ActiveRun, status: \"done\" | \"error\"): void {\n // Identity-check: a stale run finishing late must not flip the\n // replacement's status or evict it from the registry.\n if (runs.get(run.thread_id) !== run) return;\n run.status = status;\n run.finished_at = Date.now();\n // Drop subscribers — late attachers should NOT keep getting events on a\n // dead run. They'll get the buffered events on subscribe and that's it.\n run.subscribers.clear();\n // Auto-evict after TTL so memory doesn't grow with every conversation.\n setTimeout(() => {\n const cur = runs.get(run.thread_id);\n if (cur === run) runs.delete(run.thread_id);\n }, RECENT_TTL_MS).unref?.();\n}\n\nexport function getRun(thread_id: string): ActiveRun | null {\n return runs.get(thread_id) ?? null;\n}\n\n// Signal the agent stream to cancel. The stream loop in the route is wired\n// to listen on the AbortController and exit early, emitting an error chunk\n// the client (and the queue-drain hook) can react to. Idempotent.\nexport function abortRun(thread_id: string, reason = \"user_interrupted\"): boolean {\n const run = runs.get(thread_id);\n if (!run || run.status !== \"running\") return false;\n if (!run.abort.signal.aborted) {\n try { run.abort.abort(reason); } catch { /* */ }\n }\n return true;\n}\n\n// Abort every currently-running run. Used by the graceful-shutdown path so\n// LangGraph stream loops bail out instead of continuing past process exit.\n// Returns the number of runs that were signalled.\nexport function abortAllRuns(reason = \"server_shutdown\"): number {\n let count = 0;\n for (const run of runs.values()) {\n if (run.status !== \"running\") continue;\n if (run.abort.signal.aborted) continue;\n try { run.abort.abort(reason); count++; } catch { /* */ }\n }\n return count;\n}\n\n// Poll until every run has transitioned out of \"running\" (or until the\n// caller-supplied deadline elapses). Used during graceful shutdown after\n// `abortAllRuns()` so the stream `finally` blocks have a chance to flush\n// the trailing error chunk and call `finishRun()`. Resolves to the count\n// of runs still stuck in \"running\" when the deadline hit (0 = clean).\nexport async function waitForRunsToSettle(timeoutMs: number): Promise<number> {\n const deadline = Date.now() + Math.max(0, timeoutMs);\n while (Date.now() < deadline) {\n let stillRunning = 0;\n for (const run of runs.values()) if (run.status === \"running\") stillRunning++;\n if (stillRunning === 0) return 0;\n await new Promise<void>((resolve) => setTimeout(resolve, 50));\n }\n let stillRunning = 0;\n for (const run of runs.values()) if (run.status === \"running\") stillRunning++;\n return stillRunning;\n}\n\n// Replays buffered events synchronously, then subscribes for live ones.\n// Returns an unsubscribe fn. Caller is responsible for calling it.\nexport function subscribe(\n thread_id: string,\n onEvent: Subscriber,\n): { run: ActiveRun | null; unsubscribe: () => void } {\n const run = runs.get(thread_id);\n if (!run) return { run: null, unsubscribe: () => {} };\n // Replay buffered events first (so the new subscriber catches up).\n for (const ev of run.events) {\n try { onEvent(ev); } catch { /* */ }\n }\n if (run.status !== \"running\") {\n return { run, unsubscribe: () => {} };\n }\n run.subscribers.add(onEvent);\n return {\n run,\n unsubscribe: () => { run.subscribers.delete(onEvent); },\n };\n}\n"],"names":["MAX_BUFFERED","RECENT_TTL_MS","runs","Map","startRun","thread_id","agent_id","existing","get","status","Error","run","started_at","Date","now","finished_at","events","subscribers","Set","final_text","abort","AbortController","set","broadcast","chunk","type","data","delta","length","push","fn","finishRun","clear","setTimeout","cur","delete","unref","getRun","abortRun","reason","signal","aborted","abortAllRuns","count","values","waitForRunsToSettle","timeoutMs","deadline","Math","max","stillRunning","Promise","resolve","subscribe","onEvent","unsubscribe","ev","add"],"sourceRoot":"","ignoreList":[]}
1
+ {"version":3,"file":"2151.js","mappings":"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","sources":["webpack://@circuitwall/jarela/./lib/agents/run-registry.ts"],"sourcesContent":["import type { StreamChunk } from \"./base\";\n\n// In-memory registry of in-flight agent runs, keyed by thread_id. When the user\n// switches agents mid-stream, the run keeps going server-side; if they return\n// (or open a second tab), they re-attach via subscribe() and see live deltas.\n//\n// Trade-offs:\n// - Single Node process only. Multi-instance deploys would need a shared\n// pubsub (Redis, NATS) — not in scope for a local app.\n// - Buffered events are capped to MAX_BUFFERED so a 100k-token response\n// doesn't pin GBs of memory if every chunk lingers. Late attachers see the\n// most recent slice plus all subsequent events.\n\ntype Subscriber = (chunk: StreamChunk) => void;\n\nconst MAX_BUFFERED = 4000; // text_delta chunks accumulate fast; cap them\nconst RECENT_TTL_MS = 5 * 60_000; // keep finished runs visible for 5 min\n// Idle (no-progress) ceiling: if no chunk has been broadcast for this\n// long the registry assumes the LLM/tool call wedged and force-finishes\n// the run. This is the user-perceived \"stream is dead\" signal and is\n// short by design — long legitimate turns keep streaming text/tool\n// chunks, so they reset the idle clock on every broadcast(). The\n// wall-clock ceiling (runMaxMs) is the absolute safety net for the\n// degenerate case where broadcast() is never called at all (or fires\n// faster than the idle window forever).\n// Override with JARELA_RUN_IDLE_MS / JARELA_RUN_MAX_MS.\nfunction runIdleMs(): number {\n const raw = Number(process.env.JARELA_RUN_IDLE_MS);\n return Number.isFinite(raw) && raw > 0 ? raw : 90_000;\n}\nfunction runMaxMs(): number {\n const raw = Number(process.env.JARELA_RUN_MAX_MS);\n return Number.isFinite(raw) && raw > 0 ? raw : 15 * 60_000;\n}\n\nexport interface ActiveRun {\n thread_id: string;\n agent_id: string | null;\n started_at: number;\n finished_at: number | null;\n status: \"running\" | \"done\" | \"error\";\n events: StreamChunk[];\n subscribers: Set<Subscriber>;\n // Final assistant text — useful for notification body without replaying every event.\n final_text: string;\n // Server-side abort: when the user clicks Stop (or the last client\n // disconnects), we signal this controller so the LangGraph stream cancels\n // itself instead of running to completion in the background.\n abort: AbortController;\n // Last activity timestamp — bumped on every broadcast() so the idle\n // watchdog can tell live progress from a wedged stream.\n last_chunk_at: number;\n}\n\nconst runs = new Map<string, ActiveRun>();\n\nexport function startRun(thread_id: string, agent_id: string | null): ActiveRun {\n // If a stale completed run exists, drop it before starting a new one.\n const existing = runs.get(thread_id);\n if (existing && existing.status === \"running\") {\n throw new Error(`A run is already active for thread ${thread_id}`);\n }\n const now = Date.now();\n const run: ActiveRun = {\n thread_id,\n agent_id,\n started_at: now,\n finished_at: null,\n status: \"running\",\n events: [],\n subscribers: new Set(),\n final_text: \"\",\n abort: new AbortController(),\n last_chunk_at: now,\n };\n runs.set(thread_id, run);\n scheduleIdleWatchdog(run);\n scheduleMaxWatchdog(run);\n return run;\n}\n\n// Self-rearming idle watchdog. Fires when no chunk has arrived for\n// `idleMs`; otherwise reschedules itself for `(last_chunk_at + idleMs) -\n// now`. We never carry a handle on the run — the closure just bails if\n// the run is no longer the registry's entry or no longer running.\nfunction scheduleIdleWatchdog(run: ActiveRun): void {\n const idleMs = runIdleMs();\n const fireIn = Math.max(0, (run.last_chunk_at + idleMs) - Date.now());\n setTimeout(() => {\n const cur = runs.get(run.thread_id);\n if (cur !== run) return;\n if (run.status !== \"running\") return;\n const idle = Date.now() - run.last_chunk_at;\n if (idle < idleMs) {\n scheduleIdleWatchdog(run);\n return;\n }\n console.warn(`[run-registry] idle watchdog: force-finishing stalled run for thread ${run.thread_id} after ${idle}ms of no progress`);\n try { run.abort.abort(\"run_idle_timeout\"); } catch { /* */ }\n finishRun(run, \"error\");\n }, fireIn).unref?.();\n}\n\nfunction scheduleMaxWatchdog(run: ActiveRun): void {\n const max = runMaxMs();\n setTimeout(() => {\n const cur = runs.get(run.thread_id);\n if (cur !== run) return;\n if (run.status !== \"running\") return;\n console.warn(`[run-registry] wall-clock watchdog: force-finishing run for thread ${run.thread_id} after ${max}ms`);\n try { run.abort.abort(\"run_watchdog_timeout\"); } catch { /* */ }\n finishRun(run, \"error\");\n }, max).unref?.();\n}\n\nexport function broadcast(run: ActiveRun, chunk: StreamChunk): void {\n // Identity-check: a superseded run must not smear trailing chunks onto\n // the replacement entry in the registry.\n if (runs.get(run.thread_id) !== run) return;\n run.last_chunk_at = Date.now();\n if (chunk.type === \"text_delta\") {\n run.final_text += (chunk.data.delta as string) ?? \"\";\n }\n if (run.events.length < MAX_BUFFERED) {\n run.events.push(chunk);\n }\n for (const fn of run.subscribers) {\n try { fn(chunk); } catch { /* subscriber errored, ignore */ }\n }\n}\n\nexport function finishRun(run: ActiveRun, status: \"done\" | \"error\"): void {\n // Identity-check: a stale run finishing late must not flip the\n // replacement's status or evict it from the registry.\n if (runs.get(run.thread_id) !== run) return;\n run.status = status;\n run.finished_at = Date.now();\n // Drop subscribers — late attachers should NOT keep getting events on a\n // dead run. They'll get the buffered events on subscribe and that's it.\n run.subscribers.clear();\n // Auto-evict after TTL so memory doesn't grow with every conversation.\n setTimeout(() => {\n const cur = runs.get(run.thread_id);\n if (cur === run) runs.delete(run.thread_id);\n }, RECENT_TTL_MS).unref?.();\n}\n\nexport function getRun(thread_id: string): ActiveRun | null {\n return runs.get(thread_id) ?? null;\n}\n\n// Signal the agent stream to cancel. The stream loop in the route is wired\n// to listen on the AbortController and exit early, emitting an error chunk\n// the client (and the queue-drain hook) can react to. Idempotent.\nexport function abortRun(thread_id: string, reason = \"user_interrupted\"): boolean {\n const run = runs.get(thread_id);\n if (!run || run.status !== \"running\") return false;\n if (!run.abort.signal.aborted) {\n try { run.abort.abort(reason); } catch { /* */ }\n }\n return true;\n}\n\n// Abort every currently-running run. Used by the graceful-shutdown path so\n// LangGraph stream loops bail out instead of continuing past process exit.\n// Returns the number of runs that were signalled.\nexport function abortAllRuns(reason = \"server_shutdown\"): number {\n let count = 0;\n for (const run of runs.values()) {\n if (run.status !== \"running\") continue;\n if (run.abort.signal.aborted) continue;\n try { run.abort.abort(reason); count++; } catch { /* */ }\n }\n return count;\n}\n\n// Poll until every run has transitioned out of \"running\" (or until the\n// caller-supplied deadline elapses). Used during graceful shutdown after\n// `abortAllRuns()` so the stream `finally` blocks have a chance to flush\n// the trailing error chunk and call `finishRun()`. Resolves to the count\n// of runs still stuck in \"running\" when the deadline hit (0 = clean).\nexport async function waitForRunsToSettle(timeoutMs: number): Promise<number> {\n const deadline = Date.now() + Math.max(0, timeoutMs);\n while (Date.now() < deadline) {\n let stillRunning = 0;\n for (const run of runs.values()) if (run.status === \"running\") stillRunning++;\n if (stillRunning === 0) return 0;\n await new Promise<void>((resolve) => setTimeout(resolve, 50));\n }\n let stillRunning = 0;\n for (const run of runs.values()) if (run.status === \"running\") stillRunning++;\n return stillRunning;\n}\n\n// Replays buffered events synchronously, then subscribes for live ones.\n// Returns an unsubscribe fn. Caller is responsible for calling it.\nexport function subscribe(\n thread_id: string,\n onEvent: Subscriber,\n): { run: ActiveRun | null; unsubscribe: () => void } {\n const run = runs.get(thread_id);\n if (!run) return { run: null, unsubscribe: () => {} };\n // Replay buffered events first (so the new subscriber catches up).\n for (const ev of run.events) {\n try { onEvent(ev); } catch { /* */ }\n }\n if (run.status !== \"running\") {\n return { run, unsubscribe: () => {} };\n }\n run.subscribers.add(onEvent);\n return {\n run,\n unsubscribe: () => { run.subscribers.delete(onEvent); },\n };\n}\n"],"names":["MAX_BUFFERED","RECENT_TTL_MS","runIdleMs","raw","Number","process","env","JARELA_RUN_IDLE_MS","isFinite","runMaxMs","JARELA_RUN_MAX_MS","runs","Map","startRun","thread_id","agent_id","existing","get","status","Error","now","Date","run","started_at","finished_at","events","subscribers","Set","final_text","abort","AbortController","last_chunk_at","set","scheduleIdleWatchdog","scheduleMaxWatchdog","idleMs","fireIn","Math","max","setTimeout","cur","idle","console","warn","finishRun","unref","broadcast","chunk","type","data","delta","length","push","fn","clear","delete","getRun","abortRun","reason","signal","aborted","abortAllRuns","count","values","waitForRunsToSettle","timeoutMs","deadline","stillRunning","Promise","resolve","subscribe","onEvent","unsubscribe","ev","add"],"sourceRoot":"","ignoreList":[]}