opencami 1.8.6 → 1.8.8

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 (89) hide show
  1. package/README.md +0 -1
  2. package/dist/client/assets/{CSPContext-6t3O1emU.js → CSPContext-nHSyQniZ.js} +1 -1
  3. package/dist/client/assets/{DirectionContext-C6goXEY_.js → DirectionContext-B1cuzwIr.js} +1 -1
  4. package/dist/client/assets/_sessionKey-CNw4O2rY.js +19 -0
  5. package/dist/client/assets/agents-C6Ev94B1.js +2 -0
  6. package/dist/client/assets/agents-screen-DpNSh5Ok.js +1 -0
  7. package/dist/client/assets/bots-B2_u-OmP.js +2 -0
  8. package/dist/client/assets/bots-screen-Qh_IK9hC.js +1 -0
  9. package/dist/client/assets/button-DdG8c-XQ.js +1 -0
  10. package/dist/client/assets/{composite-feK0c-xF.js → composite-Cx-QHT9o.js} +1 -1
  11. package/dist/client/assets/{connect-02tmQV_v.js → connect-CSbeSBTn.js} +1 -1
  12. package/dist/client/assets/{dashboard-DQ0zDQKd.js → dashboard-DA1fTRcH.js} +1 -1
  13. package/dist/client/assets/event-Dwf9IDxK.js +1 -0
  14. package/dist/client/assets/file-explorer-screen-DzDX4HcB.js +1 -0
  15. package/dist/client/assets/files-PsZnGOUx.js +2 -0
  16. package/dist/client/assets/follow-up-suggestions-BYWq-d8P.js +5 -0
  17. package/dist/client/assets/{index-lK3yGoTI.js → index-B551ln24.js} +1 -1
  18. package/dist/client/assets/index-BxsgifDH.js +3 -0
  19. package/dist/client/assets/keyboard-shortcuts-dialog-BX-hH4Wf.js +1 -0
  20. package/dist/client/assets/main-DBmooBKx.js +210 -0
  21. package/dist/client/assets/markdown-Bpat4kTr.js +87 -0
  22. package/dist/client/assets/memory-Bs8hOoEv.js +2 -0
  23. package/dist/client/assets/memory-screen-1DgDLyZf.js +1 -0
  24. package/dist/client/assets/menu-ByR1BVmq.js +1 -0
  25. package/dist/client/assets/{opencami-logo-zuSBm5Br.js → opencami-logo-BV1uPYe6.js} +1 -1
  26. package/dist/client/assets/popupStateMapping-CGDLUl5Y.js +1 -0
  27. package/dist/client/assets/proxy-DYrSkM35.js +9 -0
  28. package/dist/client/assets/{react-BLyCEWpN.js → react-dSDkXQu6.js} +1 -1
  29. package/dist/client/assets/search-dialog-B3XJLq-O.js +1 -0
  30. package/dist/client/assets/search-sources-badge-CTd0gLuz.js +1 -0
  31. package/dist/client/assets/session-export-dialog-Cib97JLm.js +1 -0
  32. package/dist/client/assets/settings-dialog-B4NLq1ZS.js +1 -0
  33. package/dist/client/assets/{skills-panel-BH27r3nC.js → skills-panel-Cj7yHGbX.js} +1 -1
  34. package/dist/client/assets/skills-pueagQNc.js +2 -0
  35. package/dist/client/assets/styles-Ce2xZzc4.css +1 -0
  36. package/dist/client/assets/switch-kXs1I0oW.js +1 -0
  37. package/dist/client/assets/tabs-B6GW7TBf.js +1 -0
  38. package/dist/client/assets/thinking-DTP9JDQl.js +1 -0
  39. package/dist/client/assets/tooltip-CtHpm-sQ.js +1 -0
  40. package/dist/client/assets/use-file-explorer-state-C-D2CShe.js +12 -0
  41. package/dist/client/assets/{useBaseUiId-MgM4ouhx.js → useBaseUiId-Ckx_aJky.js} +1 -1
  42. package/dist/client/assets/useCompositeItem-CkvfeGmG.js +1 -0
  43. package/dist/client/assets/{useControlled-BQxTgsOd.js → useControlled-8D4PSDAL.js} +1 -1
  44. package/dist/client/assets/{useMutation-12DyB3Ox.js → useMutation-DckvFKPC.js} +1 -1
  45. package/dist/client/assets/{useQuery-Ctiljcrr.js → useQuery-CtUiG53w.js} +1 -1
  46. package/dist/server/assets/{_sessionKey-DzsJfprr.js → _sessionKey-LV6xK9IM.js} +548 -947
  47. package/dist/server/assets/{_tanstack-start-manifest_v-C5HBDfQB.js → _tanstack-start-manifest_v-qVhiIEVc.js} +1 -1
  48. package/dist/server/assets/{connect-CbgijWz4.js → connect-BNabuqpW.js} +1 -1
  49. package/dist/server/assets/follow-up-suggestions-CSSc4PDe.js +336 -0
  50. package/dist/server/assets/{index-Dl2BOKP7.js → index-BEWnDAH6.js} +24 -5
  51. package/dist/server/assets/{index-BFHEmXpN.js → index-DMKS4aeI.js} +1 -1
  52. package/dist/server/assets/{markdown-BFE5y9YH.js → markdown-DoX5Q7qh.js} +50 -26
  53. package/dist/server/assets/{memory-BqZOoD7Q.js → memory-Cxu7i8ej.js} +1 -1
  54. package/dist/server/assets/{memory-screen-BK5phS8K.js → memory-screen-B5l1NZRY.js} +2 -2
  55. package/dist/server/assets/{router-BZPatFG9.js → router-Cr2xCvGA.js} +5 -5
  56. package/dist/server/assets/{search-dialog-DQRkARXw.js → search-dialog-DR6zBnui.js} +4 -4
  57. package/dist/server/assets/search-sources-badge-B0rAEDs_.js +106 -0
  58. package/dist/server/assets/{settings-dialog-Bc1ta26X.js → settings-dialog-DEMlCMCP.js} +4 -4
  59. package/dist/server/assets/thinking-BpAc3itF.js +92 -0
  60. package/dist/server/server.js +38 -195
  61. package/package.json +2 -6
  62. package/dist/client/assets/_sessionKey-B5Viv43f.js +0 -23
  63. package/dist/client/assets/agents-BmE6QOwl.js +0 -2
  64. package/dist/client/assets/agents-screen-pHUzJxX5.js +0 -1
  65. package/dist/client/assets/bots-BeOkwrXr.js +0 -2
  66. package/dist/client/assets/bots-screen-B79bAYvf.js +0 -1
  67. package/dist/client/assets/button-CK8tKQ-Z.js +0 -1
  68. package/dist/client/assets/event-BsD1rqGT.js +0 -1
  69. package/dist/client/assets/file-explorer-screen-Ds7LeJTd.js +0 -1
  70. package/dist/client/assets/files-e40B1zFy.js +0 -2
  71. package/dist/client/assets/index-rljDU_1M.js +0 -3
  72. package/dist/client/assets/keyboard-shortcuts-dialog-Bb_GOr9L.js +0 -1
  73. package/dist/client/assets/main-Dq6jpr6-.js +0 -210
  74. package/dist/client/assets/markdown-C7_Aipwd.js +0 -87
  75. package/dist/client/assets/memory-C7UG-1le.js +0 -2
  76. package/dist/client/assets/memory-screen-CUFBWsq5.js +0 -1
  77. package/dist/client/assets/menu-n6L--M9R.js +0 -1
  78. package/dist/client/assets/proxy-BU8Bw1Vt.js +0 -9
  79. package/dist/client/assets/search-dialog-yB4w5ajo.js +0 -1
  80. package/dist/client/assets/session-export-dialog-qbZgd2Zo.js +0 -1
  81. package/dist/client/assets/settings-dialog-CHJbvpgk.js +0 -1
  82. package/dist/client/assets/skills-DoKPPhNY.js +0 -2
  83. package/dist/client/assets/styles-CXV5jZiD.css +0 -1
  84. package/dist/client/assets/switch-BD3a0LRm.js +0 -1
  85. package/dist/client/assets/tabs-DI1e-kzz.js +0 -1
  86. package/dist/client/assets/tooltip-BbH3QWvK.js +0 -1
  87. package/dist/client/assets/use-file-explorer-state-DBfLeAyz.js +0 -12
  88. package/dist/client/assets/useCompositeItem-OhltNFdZ.js +0 -1
  89. package/dist/client/assets/useOnFirstRender-7qoaK5sI.js +0 -1
@@ -5,7 +5,7 @@ import { HugeiconsIcon } from "@hugeicons/react";
5
5
  import { Search01Icon, Cancel01Icon, Loading03Icon } from "@hugeicons/core-free-icons";
6
6
  import { D as DialogRoot, a as DialogContent } from "./use-file-explorer-state-s7CS50ho.js";
7
7
  import { useQueryClient } from "@tanstack/react-query";
8
- import { c as chatQueryKeys } from "./_sessionKey-DzsJfprr.js";
8
+ import { c as chatQueryKeys } from "./_sessionKey-LV6xK9IM.js";
9
9
  import { c as cn } from "./button-CwY2OHFj.js";
10
10
  import "@base-ui/react/dialog";
11
11
  import "zustand";
@@ -18,15 +18,15 @@ import "@base-ui/react/scroll-area";
18
18
  import "./menu-D90CDTi2.js";
19
19
  import "@base-ui/react/menu";
20
20
  import "./opencami-logo-C-43FL3R.js";
21
- import "./markdown-BFE5y9YH.js";
21
+ import "./markdown-DoX5Q7qh.js";
22
22
  import "marked";
23
23
  import "react-markdown";
24
24
  import "remark-breaks";
25
25
  import "remark-gfm";
26
- import "./index-Dl2BOKP7.js";
26
+ import "./index-BEWnDAH6.js";
27
27
  import "zustand/middleware";
28
28
  import "react-dom";
29
- import "./router-BZPatFG9.js";
29
+ import "./router-Cr2xCvGA.js";
30
30
  import "node:crypto";
31
31
  import "node:fs";
32
32
  import "node:os";
@@ -0,0 +1,106 @@
1
+ import { jsxs, jsx } from "react/jsx-runtime";
2
+ import { useState } from "react";
3
+ import { HugeiconsIcon } from "@hugeicons/react";
4
+ import { Search01Icon, ArrowRight01Icon } from "@hugeicons/core-free-icons";
5
+ import { c as cn } from "./button-CwY2OHFj.js";
6
+ import "@base-ui/react/merge-props";
7
+ import "@base-ui/react/use-render";
8
+ import "class-variance-authority";
9
+ import "clsx";
10
+ import "tailwind-merge";
11
+ function getDomain(url) {
12
+ try {
13
+ return new URL(url).hostname.replace("www.", "");
14
+ } catch {
15
+ return url;
16
+ }
17
+ }
18
+ function FaviconCircle({ domain }) {
19
+ return /* @__PURE__ */ jsx(
20
+ "div",
21
+ {
22
+ className: "flex items-center justify-center w-5 h-5 rounded-full bg-white dark:bg-zinc-800 border border-cyan-500/20 overflow-hidden",
23
+ title: domain,
24
+ children: /* @__PURE__ */ jsx(
25
+ "img",
26
+ {
27
+ src: `https://www.google.com/s2/favicons?domain=${domain}&sz=32`,
28
+ alt: "",
29
+ className: "w-4 h-4 object-contain",
30
+ loading: "lazy",
31
+ onError: (e) => {
32
+ const target = e.target;
33
+ target.style.display = "none";
34
+ const parent = target.parentElement;
35
+ if (parent) {
36
+ parent.textContent = domain.charAt(0).toUpperCase();
37
+ parent.classList.add("text-[10px]", "font-medium", "text-cyan-400");
38
+ }
39
+ }
40
+ }
41
+ )
42
+ }
43
+ );
44
+ }
45
+ function SearchSourcesBadge({ sources }) {
46
+ const [expanded, setExpanded] = useState(false);
47
+ if (!sources.length) return null;
48
+ const uniqueDomains = [...new Set(sources.map((s) => getDomain(s.url)))];
49
+ return /* @__PURE__ */ jsxs("div", { className: "mt-2 w-full", children: [
50
+ /* @__PURE__ */ jsxs(
51
+ "button",
52
+ {
53
+ onClick: () => setExpanded(!expanded),
54
+ className: cn(
55
+ "inline-flex items-center gap-1.5 px-3 py-1.5 rounded-full text-xs",
56
+ "bg-cyan-500/10 hover:bg-cyan-500/20 border border-cyan-500/30",
57
+ "text-cyan-300 transition-colors"
58
+ ),
59
+ children: [
60
+ /* @__PURE__ */ jsx(HugeiconsIcon, { icon: Search01Icon, size: 14 }),
61
+ /* @__PURE__ */ jsx("span", { className: "font-medium", children: "Sources" }),
62
+ /* @__PURE__ */ jsx("span", { className: "px-1.5 py-0.5 rounded-full bg-cyan-500/20 text-cyan-400 font-semibold", children: sources.length }),
63
+ /* @__PURE__ */ jsxs("div", { className: "flex items-center gap-0.5 ml-1", children: [
64
+ uniqueDomains.slice(0, 3).map((domain) => /* @__PURE__ */ jsx(FaviconCircle, { domain }, domain)),
65
+ uniqueDomains.length > 3 && /* @__PURE__ */ jsxs("span", { className: "text-cyan-500/70 text-[10px] ml-0.5", children: [
66
+ "+",
67
+ uniqueDomains.length - 3
68
+ ] })
69
+ ] }),
70
+ /* @__PURE__ */ jsx(
71
+ HugeiconsIcon,
72
+ {
73
+ icon: ArrowRight01Icon,
74
+ size: 12,
75
+ className: cn("transition-transform", expanded && "rotate-90")
76
+ }
77
+ )
78
+ ]
79
+ }
80
+ ),
81
+ expanded && /* @__PURE__ */ jsx("div", { className: "mt-2 rounded-lg border border-cyan-500/20 bg-cyan-500/5 max-h-80 overflow-y-auto", children: sources.map((source, i) => {
82
+ const domain = getDomain(source.url);
83
+ return /* @__PURE__ */ jsxs(
84
+ "a",
85
+ {
86
+ href: source.url,
87
+ target: "_blank",
88
+ rel: "noopener noreferrer",
89
+ className: "flex items-start gap-2 p-2.5 border-b border-cyan-500/10 last:border-b-0 hover:bg-cyan-500/5 transition-colors",
90
+ children: [
91
+ /* @__PURE__ */ jsx(FaviconCircle, { domain }),
92
+ /* @__PURE__ */ jsxs("div", { className: "flex-1 min-w-0", children: [
93
+ /* @__PURE__ */ jsx("div", { className: "text-sm font-medium text-primary-900 hover:underline line-clamp-1", children: source.title || domain }),
94
+ /* @__PURE__ */ jsx("div", { className: "text-xs text-muted-foreground", children: domain }),
95
+ source.snippet && /* @__PURE__ */ jsx("p", { className: "text-xs text-muted-foreground/80 line-clamp-2 mt-0.5", children: source.snippet })
96
+ ] })
97
+ ]
98
+ },
99
+ `${source.url}-${i}`
100
+ );
101
+ }) })
102
+ ] });
103
+ }
104
+ export {
105
+ SearchSourcesBadge
106
+ };
@@ -7,8 +7,8 @@ import { B as Button, c as cn } from "./button-CwY2OHFj.js";
7
7
  import { D as DialogRoot, a as DialogContent, b as DialogTitle, c as DialogDescription, d as DialogClose } from "./use-file-explorer-state-s7CS50ho.js";
8
8
  import { S as Switch } from "./switch-BbkUeVDV.js";
9
9
  import { T as Tabs, a as TabsList, b as TabsTab } from "./tabs-DDFZob0m.js";
10
- import { u as useChatSettings } from "./index-Dl2BOKP7.js";
11
- import { u as useLlmSettings, g as getLlmProviderDefaults } from "./_sessionKey-DzsJfprr.js";
10
+ import { u as useChatSettings } from "./index-BEWnDAH6.js";
11
+ import { u as useLlmSettings, g as getLlmProviderDefaults } from "./_sessionKey-LV6xK9IM.js";
12
12
  import "@base-ui/react/merge-props";
13
13
  import "@base-ui/react/use-render";
14
14
  import "class-variance-authority";
@@ -29,13 +29,13 @@ import "@base-ui/react/scroll-area";
29
29
  import "./menu-D90CDTi2.js";
30
30
  import "@base-ui/react/menu";
31
31
  import "./opencami-logo-C-43FL3R.js";
32
- import "./markdown-BFE5y9YH.js";
32
+ import "./markdown-DoX5Q7qh.js";
33
33
  import "marked";
34
34
  import "react-markdown";
35
35
  import "remark-breaks";
36
36
  import "remark-gfm";
37
37
  import "react-dom";
38
- import "./router-BZPatFG9.js";
38
+ import "./router-Cr2xCvGA.js";
39
39
  import "node:crypto";
40
40
  import "node:fs";
41
41
  import "node:os";
@@ -0,0 +1,92 @@
1
+ import { jsx, jsxs } from "react/jsx-runtime";
2
+ import { useState, useEffect } from "react";
3
+ import { C as Collapsible, d as CollapsibleTrigger, e as CollapsiblePanel } from "./_sessionKey-LV6xK9IM.js";
4
+ import { HugeiconsIcon } from "@hugeicons/react";
5
+ import { ArrowDown01Icon } from "@hugeicons/core-free-icons";
6
+ import { B as Button } from "./button-CwY2OHFj.js";
7
+ import "@tanstack/react-router";
8
+ import "@tanstack/react-query";
9
+ import "./tooltip-DgsSPocE.js";
10
+ import "@base-ui/react/tooltip";
11
+ import "motion/react";
12
+ import "@base-ui/react/alert-dialog";
13
+ import "./use-file-explorer-state-s7CS50ho.js";
14
+ import "@base-ui/react/dialog";
15
+ import "zustand";
16
+ import "@base-ui/react/collapsible";
17
+ import "@base-ui/react/scroll-area";
18
+ import "./menu-D90CDTi2.js";
19
+ import "@base-ui/react/menu";
20
+ import "./opencami-logo-C-43FL3R.js";
21
+ import "./markdown-DoX5Q7qh.js";
22
+ import "marked";
23
+ import "react-markdown";
24
+ import "remark-breaks";
25
+ import "remark-gfm";
26
+ import "./index-BEWnDAH6.js";
27
+ import "zustand/middleware";
28
+ import "react-dom";
29
+ import "./router-Cr2xCvGA.js";
30
+ import "node:crypto";
31
+ import "node:fs";
32
+ import "node:os";
33
+ import "node:path";
34
+ import "ws";
35
+ import "@tanstack/router-core/ssr/client";
36
+ import "node:stream";
37
+ import "node:child_process";
38
+ import "node:util";
39
+ import "node:fs/promises";
40
+ import "path";
41
+ import "@base-ui/react/merge-props";
42
+ import "@base-ui/react/use-render";
43
+ import "class-variance-authority";
44
+ import "clsx";
45
+ import "tailwind-merge";
46
+ function useIsMobile() {
47
+ const [isMobile, setIsMobile] = useState(
48
+ () => typeof window !== "undefined" ? window.innerWidth < 768 : false
49
+ );
50
+ useEffect(() => {
51
+ if (typeof window === "undefined") return;
52
+ const mql = window.matchMedia("(max-width: 767px)");
53
+ const handler = (e) => setIsMobile(e.matches);
54
+ mql.addEventListener("change", handler);
55
+ setIsMobile(mql.matches);
56
+ return () => mql.removeEventListener("change", handler);
57
+ }, []);
58
+ return isMobile;
59
+ }
60
+ function Thinking({ content }) {
61
+ const isMobile = useIsMobile();
62
+ return /* @__PURE__ */ jsx("div", { className: "inline-flex flex-col", children: /* @__PURE__ */ jsxs(Collapsible, { defaultOpen: !isMobile, children: [
63
+ /* @__PURE__ */ jsxs(
64
+ CollapsibleTrigger,
65
+ {
66
+ render: /* @__PURE__ */ jsx(
67
+ Button,
68
+ {
69
+ variant: "ghost",
70
+ className: "h-auto gap-1.5 px-1.5 py-0.5 -mx-2"
71
+ }
72
+ ),
73
+ children: [
74
+ /* @__PURE__ */ jsx("span", { className: "text-sm font-medium text-primary-900", children: "Thinking" }),
75
+ /* @__PURE__ */ jsx(
76
+ HugeiconsIcon,
77
+ {
78
+ icon: ArrowDown01Icon,
79
+ size: 14,
80
+ strokeWidth: 1.5,
81
+ className: "text-primary-900 transition-transform duration-150 group-data-panel-open:rotate-180"
82
+ }
83
+ )
84
+ ]
85
+ }
86
+ ),
87
+ /* @__PURE__ */ jsx(CollapsiblePanel, { children: /* @__PURE__ */ jsx("div", { className: "pt-1 mb-3", children: /* @__PURE__ */ jsx("p", { className: "text-sm text-primary-700 whitespace-pre-wrap", children: content }) }) })
88
+ ] }) });
89
+ }
90
+ export {
91
+ Thinking
92
+ };
@@ -184,11 +184,19 @@ function getResponse() {
184
184
  return event.res;
185
185
  }
186
186
  async function getStartManifest(matchedRoutes) {
187
- const { tsrStartManifest } = await import("./assets/_tanstack-start-manifest_v-C5HBDfQB.js");
187
+ const { tsrStartManifest } = await import("./assets/_tanstack-start-manifest_v-qVhiIEVc.js");
188
188
  const startManifest = tsrStartManifest();
189
189
  const rootRoute = startManifest.routes[rootRouteId] = startManifest.routes[rootRouteId] || {};
190
190
  rootRoute.assets = rootRoute.assets || [];
191
- let injectedHeadScripts;
191
+ let script = `import('${startManifest.clientEntry}')`;
192
+ rootRoute.assets.push({
193
+ tag: "script",
194
+ attrs: {
195
+ type: "module",
196
+ async: true
197
+ },
198
+ children: script
199
+ });
192
200
  const manifest2 = {
193
201
  routes: Object.fromEntries(
194
202
  Object.entries(startManifest.routes).flatMap(([k, v]) => {
@@ -209,11 +217,7 @@ async function getStartManifest(matchedRoutes) {
209
217
  })
210
218
  )
211
219
  };
212
- return {
213
- manifest: manifest2,
214
- clientEntry: startManifest.clientEntry,
215
- injectedHeadScripts
216
- };
220
+ return manifest2;
217
221
  }
218
222
  const textEncoder$1 = new TextEncoder();
219
223
  const EMPTY_PAYLOAD = new Uint8Array(0);
@@ -371,6 +375,10 @@ const handleServerAction = async ({
371
375
  context,
372
376
  serverFnId
373
377
  }) => {
378
+ const controller = new AbortController();
379
+ const signal = controller.signal;
380
+ const abort = () => controller.abort();
381
+ request.signal.addEventListener("abort", abort);
374
382
  const method = request.method;
375
383
  const methodUpper = method.toUpperCase();
376
384
  const methodLower = method.toLowerCase();
@@ -438,17 +446,17 @@ const handleServerAction = async ({
438
446
  }
439
447
  if (rawStreams.size > 0) {
440
448
  const jsonStream = new ReadableStream({
441
- start(controller) {
449
+ start(controller2) {
442
450
  callbacks.onParse = (value) => {
443
- controller.enqueue(JSON.stringify(value) + "\n");
451
+ controller2.enqueue(JSON.stringify(value) + "\n");
444
452
  };
445
453
  callbacks.onDone = () => {
446
454
  try {
447
- controller.close();
455
+ controller2.close();
448
456
  } catch {
449
457
  }
450
458
  };
451
- callbacks.onError = (error) => controller.error(error);
459
+ callbacks.onError = (error) => controller2.error(error);
452
460
  if (nonStreamingBody !== void 0) {
453
461
  callbacks.onParse(nonStreamingBody);
454
462
  }
@@ -468,18 +476,18 @@ const handleServerAction = async ({
468
476
  });
469
477
  }
470
478
  const stream = new ReadableStream({
471
- start(controller) {
472
- callbacks.onParse = (value) => controller.enqueue(
479
+ start(controller2) {
480
+ callbacks.onParse = (value) => controller2.enqueue(
473
481
  textEncoder.encode(JSON.stringify(value) + "\n")
474
482
  );
475
483
  callbacks.onDone = () => {
476
484
  try {
477
- controller.close();
485
+ controller2.close();
478
486
  } catch (error) {
479
- controller.error(error);
487
+ controller2.error(error);
480
488
  }
481
489
  };
482
- callbacks.onError = (error) => controller.error(error);
490
+ callbacks.onError = (error) => controller2.error(error);
483
491
  if (nonStreamingBody !== void 0) {
484
492
  callbacks.onParse(nonStreamingBody);
485
493
  }
@@ -531,7 +539,7 @@ const handleServerAction = async ({
531
539
  if (false) ;
532
540
  }
533
541
  }
534
- return await action(params);
542
+ return await action(params, signal);
535
543
  }
536
544
  if (methodLower === "get") {
537
545
  const payloadParam = url.searchParams.get("payload");
@@ -541,7 +549,7 @@ const handleServerAction = async ({
541
549
  const payload2 = payloadParam ? parsePayload(JSON.parse(payloadParam)) : {};
542
550
  payload2.context = safeObjectMerge(context, payload2.context);
543
551
  payload2.method = methodUpper;
544
- return await action(payload2);
552
+ return await action(payload2, signal);
545
553
  }
546
554
  if (methodLower !== "post") {
547
555
  throw new Error("expected POST method");
@@ -553,7 +561,7 @@ const handleServerAction = async ({
553
561
  const payload = jsonPayload ? parsePayload(jsonPayload) : {};
554
562
  payload.context = safeObjectMerge(payload.context, context);
555
563
  payload.method = methodUpper;
556
- return await action(payload);
564
+ return await action(payload, signal);
557
565
  })();
558
566
  const unwrapped = res.result || res.error;
559
567
  if (isNotFound(res)) {
@@ -601,6 +609,7 @@ const handleServerAction = async ({
601
609
  });
602
610
  }
603
611
  })();
612
+ request.signal.removeEventListener("abort", abort);
604
613
  return response;
605
614
  };
606
615
  function isNotFoundResponse(error) {
@@ -613,111 +622,6 @@ function isNotFoundResponse(error) {
613
622
  }
614
623
  });
615
624
  }
616
- function resolveTransformConfig(transform) {
617
- if (typeof transform === "string") {
618
- const prefix = transform;
619
- return {
620
- type: "transform",
621
- transformFn: ({ url }) => `${prefix}${url}`,
622
- cache: true
623
- };
624
- }
625
- if (typeof transform === "function") {
626
- return {
627
- type: "transform",
628
- transformFn: transform,
629
- cache: true
630
- };
631
- }
632
- if ("createTransform" in transform && transform.createTransform) {
633
- return {
634
- type: "createTransform",
635
- createTransform: transform.createTransform,
636
- cache: transform.cache !== false
637
- };
638
- }
639
- const transformFn = typeof transform.transform === "string" ? (({ url }) => `${transform.transform}${url}`) : transform.transform;
640
- return {
641
- type: "transform",
642
- transformFn,
643
- cache: transform.cache !== false
644
- };
645
- }
646
- function buildClientEntryScriptTag(clientEntry, injectedHeadScripts) {
647
- const clientEntryLiteral = JSON.stringify(clientEntry);
648
- let script = `import(${clientEntryLiteral})`;
649
- if (injectedHeadScripts) {
650
- script = `${injectedHeadScripts};${script}`;
651
- }
652
- return {
653
- tag: "script",
654
- attrs: {
655
- type: "module",
656
- async: true
657
- },
658
- children: script
659
- };
660
- }
661
- function transformManifestUrls(source, transformFn, opts) {
662
- return (async () => {
663
- const manifest2 = opts?.clone ? structuredClone(source.manifest) : source.manifest;
664
- for (const route of Object.values(manifest2.routes)) {
665
- if (route.preloads) {
666
- route.preloads = await Promise.all(
667
- route.preloads.map(
668
- (url) => Promise.resolve(transformFn({ url, type: "modulepreload" }))
669
- )
670
- );
671
- }
672
- if (route.assets) {
673
- for (const asset of route.assets) {
674
- if (asset.tag === "link" && asset.attrs?.href) {
675
- asset.attrs.href = await Promise.resolve(
676
- transformFn({
677
- url: asset.attrs.href,
678
- type: "stylesheet"
679
- })
680
- );
681
- }
682
- }
683
- }
684
- }
685
- const transformedClientEntry = await Promise.resolve(
686
- transformFn({
687
- url: source.clientEntry,
688
- type: "clientEntry"
689
- })
690
- );
691
- const rootRoute = manifest2.routes[rootRouteId];
692
- if (rootRoute) {
693
- rootRoute.assets = rootRoute.assets || [];
694
- rootRoute.assets.push(
695
- buildClientEntryScriptTag(
696
- transformedClientEntry,
697
- source.injectedHeadScripts
698
- )
699
- );
700
- }
701
- return manifest2;
702
- })();
703
- }
704
- function buildManifestWithClientEntry(source) {
705
- const scriptTag = buildClientEntryScriptTag(
706
- source.clientEntry,
707
- source.injectedHeadScripts
708
- );
709
- const baseRootRoute = source.manifest.routes[rootRouteId];
710
- const routes = {
711
- ...source.manifest.routes,
712
- ...baseRootRoute ? {
713
- [rootRouteId]: {
714
- ...baseRootRoute,
715
- assets: [...baseRootRoute.assets || [], scriptTag]
716
- }
717
- } : {}
718
- };
719
- return { routes };
720
- }
721
625
  const HEADERS = {
722
626
  TSS_SHELL: "X-TSS_SHELL"
723
627
  };
@@ -750,10 +654,9 @@ function getStartResponseHeaders(opts) {
750
654
  return headers;
751
655
  }
752
656
  let entriesPromise;
753
- let baseManifestPromise;
754
- let cachedFinalManifestPromise;
657
+ let manifestPromise;
755
658
  async function loadEntries() {
756
- const routerEntry = await import("./assets/router-BZPatFG9.js").then((n) => n.r);
659
+ const routerEntry = await import("./assets/router-Cr2xCvGA.js").then((n) => n.r);
757
660
  const startEntry = await import("./assets/start-HYkvq4Ni.js");
758
661
  return { startEntry, routerEntry };
759
662
  }
@@ -763,24 +666,11 @@ function getEntries() {
763
666
  }
764
667
  return entriesPromise;
765
668
  }
766
- function getBaseManifest(matchedRoutes) {
767
- if (!baseManifestPromise) {
768
- baseManifestPromise = getStartManifest();
669
+ function getManifest(matchedRoutes) {
670
+ if (!manifestPromise) {
671
+ manifestPromise = getStartManifest();
769
672
  }
770
- return baseManifestPromise;
771
- }
772
- async function resolveManifest(matchedRoutes, transformFn, cache) {
773
- const base = await getBaseManifest();
774
- const computeFinalManifest = async () => {
775
- return transformFn ? await transformManifestUrls(base, transformFn, { clone: !cache }) : buildManifestWithClientEntry(base);
776
- };
777
- if (!transformFn || cache) {
778
- if (!cachedFinalManifestPromise) {
779
- cachedFinalManifestPromise = computeFinalManifest();
780
- }
781
- return cachedFinalManifestPromise;
782
- }
783
- return computeFinalManifest();
673
+ return manifestPromise;
784
674
  }
785
675
  const ROUTER_BASEPATH = "/";
786
676
  const SERVER_FN_BASE = "/_serverFn/";
@@ -854,52 +744,14 @@ function handlerToMiddleware(handler, mayDefer = false) {
854
744
  return response;
855
745
  };
856
746
  }
857
- function createStartHandler(cbOrOptions) {
858
- const cb = typeof cbOrOptions === "function" ? cbOrOptions : cbOrOptions.handler;
859
- const transformAssetUrlsOption = typeof cbOrOptions === "function" ? void 0 : cbOrOptions.transformAssetUrls;
860
- const warmupTransformManifest = !!transformAssetUrlsOption && typeof transformAssetUrlsOption === "object" && transformAssetUrlsOption.warmup === true;
861
- const resolvedTransformConfig = transformAssetUrlsOption ? resolveTransformConfig(transformAssetUrlsOption) : void 0;
862
- const cache = resolvedTransformConfig ? resolvedTransformConfig.cache : true;
863
- let cachedCreateTransformPromise;
864
- const getTransformFn = async (opts) => {
865
- if (!resolvedTransformConfig) return void 0;
866
- if (resolvedTransformConfig.type === "createTransform") {
867
- if (cache) {
868
- if (!cachedCreateTransformPromise) {
869
- cachedCreateTransformPromise = Promise.resolve(
870
- resolvedTransformConfig.createTransform(opts)
871
- );
872
- }
873
- return cachedCreateTransformPromise;
874
- }
875
- return resolvedTransformConfig.createTransform(opts);
876
- }
877
- return resolvedTransformConfig.transformFn;
878
- };
879
- if (warmupTransformManifest && cache && true && !cachedFinalManifestPromise) {
880
- const warmupPromise = (async () => {
881
- const base = await getBaseManifest();
882
- const transformFn = await getTransformFn({ warmup: true });
883
- return transformFn ? await transformManifestUrls(base, transformFn, { clone: false }) : buildManifestWithClientEntry(base);
884
- })();
885
- cachedFinalManifestPromise = warmupPromise;
886
- warmupPromise.catch(() => {
887
- if (cachedFinalManifestPromise === warmupPromise) {
888
- cachedFinalManifestPromise = void 0;
889
- }
890
- cachedCreateTransformPromise = void 0;
891
- });
892
- }
747
+ function createStartHandler(cb) {
893
748
  const startRequestResolver = async (request, requestOpts) => {
894
749
  let router = null;
895
750
  let cbWillCleanup = false;
896
751
  try {
897
- const { url, handledProtocolRelativeURL } = getNormalizedURL(request.url);
752
+ const url = getNormalizedURL(request.url);
898
753
  const href = url.pathname + url.search + url.hash;
899
754
  const origin = getOrigin(request);
900
- if (handledProtocolRelativeURL) {
901
- return Response.redirect(url, 308);
902
- }
903
755
  const entries = await getEntries();
904
756
  const startOptions = await entries.startEntry.startInstance?.getOptions() || {};
905
757
  const serializationAdapters = [
@@ -966,7 +818,6 @@ function createStartHandler(cbOrOptions) {
966
818
  );
967
819
  const ctx2 = await executeMiddleware([...middlewares2, serverFnHandler], {
968
820
  request,
969
- pathname: url.pathname,
970
821
  context: createNullProtoObject(requestOpts?.context)
971
822
  });
972
823
  return handleRedirectResponse(ctx2.response, request, getRouter);
@@ -984,11 +835,7 @@ function createStartHandler(cbOrOptions) {
984
835
  { status: 500 }
985
836
  );
986
837
  }
987
- const manifest2 = await resolveManifest(
988
- matchedRoutes,
989
- await getTransformFn({ warmup: false, request }),
990
- cache
991
- );
838
+ const manifest2 = await getManifest(matchedRoutes);
992
839
  const routerInstance = await getRouter();
993
840
  attachRouterServerSsrUtils({
994
841
  router: routerInstance,
@@ -1043,11 +890,7 @@ function createStartHandler(cbOrOptions) {
1043
890
  );
1044
891
  const ctx = await executeMiddleware(
1045
892
  [...middlewares, requestHandlerMiddleware],
1046
- {
1047
- request,
1048
- pathname: url.pathname,
1049
- context: createNullProtoObject(requestOpts?.context)
1050
- }
893
+ { request, context: createNullProtoObject(requestOpts?.context) }
1051
894
  );
1052
895
  return handleRedirectResponse(ctx.response, request, getRouter);
1053
896
  } finally {
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "opencami",
3
- "version": "1.8.6",
3
+ "version": "1.8.8",
4
4
  "type": "module",
5
5
  "description": "OpenCami - A beautiful web client for OpenClaw",
6
6
  "bin": {
@@ -54,8 +54,6 @@
54
54
  "@tailwindcss/vite": "^4.1.18",
55
55
  "@tanstack/react-query": "^5.84.1",
56
56
  "@tanstack/react-router": "^1.132.0",
57
- "@tanstack/react-router-devtools": "^1.132.0",
58
- "@tanstack/react-router-ssr-query": "^1.131.7",
59
57
  "@tanstack/react-start": "^1.132.0",
60
58
  "@tanstack/router-plugin": "^1.132.0",
61
59
  "class-variance-authority": "^0.7.1",
@@ -94,8 +92,6 @@
94
92
  "sharp": "^0.34.5",
95
93
  "typescript": "^5.7.2",
96
94
  "vite": "^7.1.7",
97
- "vite-plugin-pwa": "^1.2.0",
98
- "vitest": "^3.0.5",
99
- "web-vitals": "^5.1.0"
95
+ "vitest": "^3.0.5"
100
96
  }
101
97
  }