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.
- package/README.md +0 -1
- package/dist/client/assets/{CSPContext-6t3O1emU.js → CSPContext-nHSyQniZ.js} +1 -1
- package/dist/client/assets/{DirectionContext-C6goXEY_.js → DirectionContext-B1cuzwIr.js} +1 -1
- package/dist/client/assets/_sessionKey-CNw4O2rY.js +19 -0
- package/dist/client/assets/agents-C6Ev94B1.js +2 -0
- package/dist/client/assets/agents-screen-DpNSh5Ok.js +1 -0
- package/dist/client/assets/bots-B2_u-OmP.js +2 -0
- package/dist/client/assets/bots-screen-Qh_IK9hC.js +1 -0
- package/dist/client/assets/button-DdG8c-XQ.js +1 -0
- package/dist/client/assets/{composite-feK0c-xF.js → composite-Cx-QHT9o.js} +1 -1
- package/dist/client/assets/{connect-02tmQV_v.js → connect-CSbeSBTn.js} +1 -1
- package/dist/client/assets/{dashboard-DQ0zDQKd.js → dashboard-DA1fTRcH.js} +1 -1
- package/dist/client/assets/event-Dwf9IDxK.js +1 -0
- package/dist/client/assets/file-explorer-screen-DzDX4HcB.js +1 -0
- package/dist/client/assets/files-PsZnGOUx.js +2 -0
- package/dist/client/assets/follow-up-suggestions-BYWq-d8P.js +5 -0
- package/dist/client/assets/{index-lK3yGoTI.js → index-B551ln24.js} +1 -1
- package/dist/client/assets/index-BxsgifDH.js +3 -0
- package/dist/client/assets/keyboard-shortcuts-dialog-BX-hH4Wf.js +1 -0
- package/dist/client/assets/main-DBmooBKx.js +210 -0
- package/dist/client/assets/markdown-Bpat4kTr.js +87 -0
- package/dist/client/assets/memory-Bs8hOoEv.js +2 -0
- package/dist/client/assets/memory-screen-1DgDLyZf.js +1 -0
- package/dist/client/assets/menu-ByR1BVmq.js +1 -0
- package/dist/client/assets/{opencami-logo-zuSBm5Br.js → opencami-logo-BV1uPYe6.js} +1 -1
- package/dist/client/assets/popupStateMapping-CGDLUl5Y.js +1 -0
- package/dist/client/assets/proxy-DYrSkM35.js +9 -0
- package/dist/client/assets/{react-BLyCEWpN.js → react-dSDkXQu6.js} +1 -1
- package/dist/client/assets/search-dialog-B3XJLq-O.js +1 -0
- package/dist/client/assets/search-sources-badge-CTd0gLuz.js +1 -0
- package/dist/client/assets/session-export-dialog-Cib97JLm.js +1 -0
- package/dist/client/assets/settings-dialog-B4NLq1ZS.js +1 -0
- package/dist/client/assets/{skills-panel-BH27r3nC.js → skills-panel-Cj7yHGbX.js} +1 -1
- package/dist/client/assets/skills-pueagQNc.js +2 -0
- package/dist/client/assets/styles-Ce2xZzc4.css +1 -0
- package/dist/client/assets/switch-kXs1I0oW.js +1 -0
- package/dist/client/assets/tabs-B6GW7TBf.js +1 -0
- package/dist/client/assets/thinking-DTP9JDQl.js +1 -0
- package/dist/client/assets/tooltip-CtHpm-sQ.js +1 -0
- package/dist/client/assets/use-file-explorer-state-C-D2CShe.js +12 -0
- package/dist/client/assets/{useBaseUiId-MgM4ouhx.js → useBaseUiId-Ckx_aJky.js} +1 -1
- package/dist/client/assets/useCompositeItem-CkvfeGmG.js +1 -0
- package/dist/client/assets/{useControlled-BQxTgsOd.js → useControlled-8D4PSDAL.js} +1 -1
- package/dist/client/assets/{useMutation-12DyB3Ox.js → useMutation-DckvFKPC.js} +1 -1
- package/dist/client/assets/{useQuery-Ctiljcrr.js → useQuery-CtUiG53w.js} +1 -1
- package/dist/server/assets/{_sessionKey-DzsJfprr.js → _sessionKey-LV6xK9IM.js} +548 -947
- package/dist/server/assets/{_tanstack-start-manifest_v-C5HBDfQB.js → _tanstack-start-manifest_v-qVhiIEVc.js} +1 -1
- package/dist/server/assets/{connect-CbgijWz4.js → connect-BNabuqpW.js} +1 -1
- package/dist/server/assets/follow-up-suggestions-CSSc4PDe.js +336 -0
- package/dist/server/assets/{index-Dl2BOKP7.js → index-BEWnDAH6.js} +24 -5
- package/dist/server/assets/{index-BFHEmXpN.js → index-DMKS4aeI.js} +1 -1
- package/dist/server/assets/{markdown-BFE5y9YH.js → markdown-DoX5Q7qh.js} +50 -26
- package/dist/server/assets/{memory-BqZOoD7Q.js → memory-Cxu7i8ej.js} +1 -1
- package/dist/server/assets/{memory-screen-BK5phS8K.js → memory-screen-B5l1NZRY.js} +2 -2
- package/dist/server/assets/{router-BZPatFG9.js → router-Cr2xCvGA.js} +5 -5
- package/dist/server/assets/{search-dialog-DQRkARXw.js → search-dialog-DR6zBnui.js} +4 -4
- package/dist/server/assets/search-sources-badge-B0rAEDs_.js +106 -0
- package/dist/server/assets/{settings-dialog-Bc1ta26X.js → settings-dialog-DEMlCMCP.js} +4 -4
- package/dist/server/assets/thinking-BpAc3itF.js +92 -0
- package/dist/server/server.js +38 -195
- package/package.json +2 -6
- package/dist/client/assets/_sessionKey-B5Viv43f.js +0 -23
- package/dist/client/assets/agents-BmE6QOwl.js +0 -2
- package/dist/client/assets/agents-screen-pHUzJxX5.js +0 -1
- package/dist/client/assets/bots-BeOkwrXr.js +0 -2
- package/dist/client/assets/bots-screen-B79bAYvf.js +0 -1
- package/dist/client/assets/button-CK8tKQ-Z.js +0 -1
- package/dist/client/assets/event-BsD1rqGT.js +0 -1
- package/dist/client/assets/file-explorer-screen-Ds7LeJTd.js +0 -1
- package/dist/client/assets/files-e40B1zFy.js +0 -2
- package/dist/client/assets/index-rljDU_1M.js +0 -3
- package/dist/client/assets/keyboard-shortcuts-dialog-Bb_GOr9L.js +0 -1
- package/dist/client/assets/main-Dq6jpr6-.js +0 -210
- package/dist/client/assets/markdown-C7_Aipwd.js +0 -87
- package/dist/client/assets/memory-C7UG-1le.js +0 -2
- package/dist/client/assets/memory-screen-CUFBWsq5.js +0 -1
- package/dist/client/assets/menu-n6L--M9R.js +0 -1
- package/dist/client/assets/proxy-BU8Bw1Vt.js +0 -9
- package/dist/client/assets/search-dialog-yB4w5ajo.js +0 -1
- package/dist/client/assets/session-export-dialog-qbZgd2Zo.js +0 -1
- package/dist/client/assets/settings-dialog-CHJbvpgk.js +0 -1
- package/dist/client/assets/skills-DoKPPhNY.js +0 -2
- package/dist/client/assets/styles-CXV5jZiD.css +0 -1
- package/dist/client/assets/switch-BD3a0LRm.js +0 -1
- package/dist/client/assets/tabs-DI1e-kzz.js +0 -1
- package/dist/client/assets/tooltip-BbH3QWvK.js +0 -1
- package/dist/client/assets/use-file-explorer-state-DBfLeAyz.js +0 -12
- package/dist/client/assets/useCompositeItem-OhltNFdZ.js +0 -1
- 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-
|
|
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-
|
|
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-
|
|
26
|
+
import "./index-BEWnDAH6.js";
|
|
27
27
|
import "zustand/middleware";
|
|
28
28
|
import "react-dom";
|
|
29
|
-
import "./router-
|
|
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-
|
|
11
|
-
import { u as useLlmSettings, g as getLlmProviderDefaults } from "./_sessionKey-
|
|
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-
|
|
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-
|
|
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
|
+
};
|
package/dist/server/server.js
CHANGED
|
@@ -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-
|
|
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
|
|
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(
|
|
449
|
+
start(controller2) {
|
|
442
450
|
callbacks.onParse = (value) => {
|
|
443
|
-
|
|
451
|
+
controller2.enqueue(JSON.stringify(value) + "\n");
|
|
444
452
|
};
|
|
445
453
|
callbacks.onDone = () => {
|
|
446
454
|
try {
|
|
447
|
-
|
|
455
|
+
controller2.close();
|
|
448
456
|
} catch {
|
|
449
457
|
}
|
|
450
458
|
};
|
|
451
|
-
callbacks.onError = (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(
|
|
472
|
-
callbacks.onParse = (value) =>
|
|
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
|
-
|
|
485
|
+
controller2.close();
|
|
478
486
|
} catch (error) {
|
|
479
|
-
|
|
487
|
+
controller2.error(error);
|
|
480
488
|
}
|
|
481
489
|
};
|
|
482
|
-
callbacks.onError = (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
|
|
754
|
-
let cachedFinalManifestPromise;
|
|
657
|
+
let manifestPromise;
|
|
755
658
|
async function loadEntries() {
|
|
756
|
-
const routerEntry = await import("./assets/router-
|
|
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
|
|
767
|
-
if (!
|
|
768
|
-
|
|
669
|
+
function getManifest(matchedRoutes) {
|
|
670
|
+
if (!manifestPromise) {
|
|
671
|
+
manifestPromise = getStartManifest();
|
|
769
672
|
}
|
|
770
|
-
return
|
|
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(
|
|
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
|
|
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
|
|
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.
|
|
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
|
-
"
|
|
98
|
-
"vitest": "^3.0.5",
|
|
99
|
-
"web-vitals": "^5.1.0"
|
|
95
|
+
"vitest": "^3.0.5"
|
|
100
96
|
}
|
|
101
97
|
}
|