nolo-cli 0.8.0-alpha.2 → 0.8.0-alpha.20
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 +1 -1
- package/_executeModel-WRUCQIV5.js +205 -0
- package/action-R4M4ORGA.js +28 -0
- package/addContentAction-UYFFTEWJ.js +26 -0
- package/addDialogAgentAction-OT4XZAVP.js +68 -0
- package/agentDeleteCommand-5DD2IM3J.js +327 -0
- package/agentEmailCommands-IASM2YBQ.js +628 -0
- package/agentListCommands-I6KZYCIG.js +223 -0
- package/agentMachineCommands-OUP3YQP7.js +425 -0
- package/agentPullCommand-O2MTUAFR.js +122 -0
- package/agentRecordCommands-QKGE2JTA.js +96 -0
- package/agentRunCommand-TVZXUBQ5.js +114 -0
- package/agentRunControl-K4VKNEHF.js +57 -0
- package/agentRuntimeLocal-ZYEIPTY4.js +104 -0
- package/agentSlice-T4PMW7W6.js +42 -0
- package/authCommand-EB5JSOX5.js +581 -0
- package/authCommands-XPEHTKSM.js +35 -0
- package/chunk-2EHX7F5G.js +1948 -0
- package/chunk-2FTTDCD4.js +675 -0
- package/chunk-3ASDTTEI.js +1774 -0
- package/chunk-3EUW3WEO.js +8 -0
- package/chunk-3LY4F7SV.js +9293 -0
- package/chunk-4CQLVGRV.js +50 -0
- package/chunk-4FBRSEV4.js +573 -0
- package/chunk-4IJYA27C.js +342 -0
- package/chunk-4QEWT7KD.js +933 -0
- package/chunk-4SN6J65J.js +38 -0
- package/chunk-4VNS5WPM.js +42 -0
- package/chunk-4ZDM73SD.js +34 -0
- package/chunk-5CS33IBL.js +301 -0
- package/chunk-5KLGBAAR.js +386 -0
- package/chunk-5MIDPSSK.js +206 -0
- package/chunk-5MMAK75Q.js +15 -0
- package/chunk-5W3VUFOX.js +34 -0
- package/chunk-63W5N6P3.js +150 -0
- package/chunk-6HYVJV7B.js +102 -0
- package/chunk-6WD3OOJS.js +20 -0
- package/chunk-7DAJ4AI4.js +191 -0
- package/chunk-7KCUSYT2.js +354 -0
- package/chunk-7T5PWAZN.js +171 -0
- package/chunk-AFON4QUU.js +112 -0
- package/chunk-AGFH73SK.js +239 -0
- package/chunk-ATNTHIZI.js +13 -0
- package/chunk-AVMKZHBC.js +85 -0
- package/chunk-AZPCASRE.js +36 -0
- package/chunk-BBYVOSU2.js +792 -0
- package/chunk-BCIOM4NZ.js +1078 -0
- package/chunk-C3RUNRHT.js +51 -0
- package/chunk-C4FTUXVF.js +146 -0
- package/chunk-CF2WZF4N.js +134 -0
- package/chunk-CF7PE763.js +10 -0
- package/chunk-CKOJQDKR.js +198 -0
- package/chunk-CMKUBIGW.js +1550 -0
- package/chunk-CWMSB67P.js +34 -0
- package/chunk-DCOA4QSN.js +105 -0
- package/chunk-DFFIZ25G.js +30 -0
- package/chunk-DWLEOOGR.js +8 -0
- package/chunk-DZ3XJVET.js +231 -0
- package/chunk-EHLHSX7R.js +1433 -0
- package/chunk-FM5IVZXO.js +4723 -0
- package/chunk-FVYY6MCS.js +1447 -0
- package/chunk-G3SUCT4W.js +8 -0
- package/chunk-GAKEBQD6.js +30 -0
- package/chunk-GBRG75BQ.js +86 -0
- package/chunk-GLYVN7EQ.js +238 -0
- package/chunk-H33743XH.js +25 -0
- package/chunk-HNMXYYJR.js +12 -0
- package/chunk-HNW7IJSK.js +71 -0
- package/chunk-I42VC5KR.js +15 -0
- package/chunk-IDZTNRP2.js +85 -0
- package/chunk-IHBCLYEE.js +22310 -0
- package/chunk-IJGXKGXW.js +421 -0
- package/chunk-ISNCLGUZ.js +146 -0
- package/chunk-IWX4UW2E.js +548 -0
- package/chunk-JBTJAPUF.js +35 -0
- package/chunk-JEXVIMYZ.js +55 -0
- package/chunk-JRKKFRAV.js +537 -0
- package/chunk-JZPBVBIY.js +94 -0
- package/chunk-K6BPOQLF.js +2052 -0
- package/chunk-K777STIO.js +478 -0
- package/chunk-KKY4B2Q2.js +21 -0
- package/chunk-KQHGZWSV.js +63 -0
- package/chunk-KUG52IAP.js +8 -0
- package/chunk-KX6YBIHG.js +8 -0
- package/chunk-LCBAMY2M.js +60 -0
- package/chunk-LM6IYQ3F.js +16 -0
- package/chunk-LTRXGFMS.js +83 -0
- package/chunk-M76ECQRD.js +13658 -0
- package/chunk-MNJDFJND.js +222 -0
- package/chunk-MRC4Q34M.js +188 -0
- package/chunk-MTU75CZ2.js +91 -0
- package/chunk-N54XAP77.js +19 -0
- package/chunk-O2ZNTTET.js +3272 -0
- package/chunk-O4BU24WZ.js +3212 -0
- package/chunk-OLZBQWZU.js +6 -0
- package/chunk-OPZYGHUC.js +89 -0
- package/chunk-OWOHNGCN.js +50 -0
- package/chunk-P3PKED2I.js +962 -0
- package/chunk-PFTAG6DY.js +1939 -0
- package/chunk-PMKQGGGM.js +221 -0
- package/chunk-PP4S6RTL.js +175 -0
- package/chunk-QJ7FZNYN.js +939 -0
- package/chunk-QSJ3HFEF.js +8 -0
- package/chunk-RGIM3WLT.js +113 -0
- package/chunk-RL776AGR.js +190 -0
- package/chunk-ROWQEJRP.js +139 -0
- package/chunk-S7Z2HMCN.js +25 -0
- package/chunk-SDJDLO5W.js +628 -0
- package/chunk-SOTZ6RDN.js +69 -0
- package/chunk-TILFE6LV.js +381 -0
- package/chunk-TIMLUWQA.js +231 -0
- package/chunk-TISCADJH.js +807 -0
- package/chunk-U4TRT5V4.js +246 -0
- package/chunk-U6VC4MU4.js +8 -0
- package/chunk-UAD2WT54.js +64 -0
- package/chunk-VC6OZXO5.js +298 -0
- package/chunk-VF4K2QE6.js +21 -0
- package/chunk-VHBWHNVT.js +59 -0
- package/chunk-VIDPVFP3.js +20 -0
- package/chunk-VP4WJWKW.js +8882 -0
- package/chunk-VVX233PH.js +482 -0
- package/chunk-W4NVOSFF.js +37 -0
- package/chunk-WI4XWASA.js +208 -0
- package/chunk-WWC7I6TA.js +8 -0
- package/chunk-WZSRQNQG.js +2587 -0
- package/chunk-XBROXIGL.js +3066 -0
- package/chunk-XENYHRUE.js +104 -0
- package/chunk-Y5GCAMGP.js +9 -0
- package/chunk-YN4XDB7B.js +9036 -0
- package/chunk-YPRZSPF3.js +148 -0
- package/chunk-Z4NR32XR.js +50 -0
- package/chunk-Z6EKEXJW.js +138 -0
- package/chunk-ZDRZMLKO.js +27339 -0
- package/chunk-ZNFJWEN4.js +56 -0
- package/cliExecutor-K3F7DMRO.js +36 -0
- package/clipboardy-BVE3LVEH.js +12001 -0
- package/createAgentAutomationAction-CCABEOM6.js +866 -0
- package/createDialogAction-YPKF5ITI.js +55 -0
- package/createPageAction-YEZ7EK5F.js +172 -0
- package/db-HCJ5PRB5.js +271 -0
- package/dbSlice-QPVZHBOE.js +60 -0
- package/deleteFile-SV5MS23W.js +41 -0
- package/dialogCommands-4IX4XIZE.js +63 -0
- package/dialogSlice-OVTO7QGW.js +148 -0
- package/docCreateCommands-SIL3NPGT.js +220 -0
- package/docDeleteCommands-7IOMLUS4.js +181 -0
- package/docReadCommands-FNFXUA5L.js +134 -0
- package/docStore-ZAYLW2HN.js +98 -0
- package/docUpdateCommands-X2HNDVUC.js +318 -0
- package/fetchMessages-KTNM7QAR.js +17 -0
- package/getPricing-3E6UNPKL.js +30 -0
- package/handleSendMessageAction-TZMZ4EP5.js +185 -0
- package/index.js +188 -112958
- package/lib-FYYBQIXS.js +19839 -0
- package/localDialogRead-2VRI24F4.js +26 -0
- package/localFirstLog-DHNOY2NA.js +19 -0
- package/localRuntimeAuthority-TEGCOWX4.js +471 -0
- package/localRuntimeDb-LGDF6FQP.js +12 -0
- package/machineCommands-M4ZJZIMS.js +781 -0
- package/machineInfo-M6KB6HZN.js +10 -0
- package/machineWsRunDispatch-TPJAUGLP.js +112 -0
- package/memoryCommands-O4MIPIWQ.js +476 -0
- package/models-4OPOOLFS.js +9 -0
- package/offlineMarxistsAgentCommand-BCPJITJL.js +242 -0
- package/package.json +4 -23
- package/read-EBMWX4Z6.js +17 -0
- package/readDocTool-2MWHSTQE.js +16 -0
- package/readlineWorkspace-OMCIU3WT.js +5682 -0
- package/removeDialogAgentAction-SNZ662NP.js +73 -0
- package/runAgentClientLoop-H6NGOUAM.js +293 -0
- package/runtimeDoctorCommands-LRHLPDRC.js +289 -0
- package/setDialogExtraReferencesAction-XDI2KM2N.js +60 -0
- package/setPrimaryDialogAgentAction-PYEC4N4Z.js +80 -0
- package/settingSlice-NOWHY2FK.js +199 -0
- package/skillDiscovery-UGSQGX2U.js +16 -0
- package/skillSummaryMarker-42HKSXYY.js +9 -0
- package/slateToRenderMarkdown-Y5IYN73U.js +7 -0
- package/slateUtils-2M7MUTWX.js +19 -0
- package/spaceCommands-E7VOF4LO.js +450 -0
- package/spaceSlice-QHBPICA2.js +149 -0
- package/streamAgentChatTurn-3XTBA2HN.js +4510 -0
- package/tableCommands-R5UCM63M.js +1286 -0
- package/toolApiClient-QI3YBNWB.js +26 -0
- package/tools-GHLZ3XD6.js +87 -0
- package/tuiSummaryLlmCaller-RV3THLZF.js +78 -0
- package/understanding-3CUQQ6SV.js +271 -0
- package/updateCommands-VOSPKXFF.js +31 -0
- package/updateDialogTitleAction-XA2OZTLP.js +188 -0
|
@@ -0,0 +1,221 @@
|
|
|
1
|
+
import {
|
|
2
|
+
toErrorMessage
|
|
3
|
+
} from "./chunk-HNMXYYJR.js";
|
|
4
|
+
|
|
5
|
+
// packages/create/editor/transforms/slateToSimplifiedMarkdown.ts
|
|
6
|
+
function renderTextNode(node) {
|
|
7
|
+
if (!node || typeof node.text !== "string") return "";
|
|
8
|
+
let text = node.text;
|
|
9
|
+
if (!text) return "";
|
|
10
|
+
if (node.bold) text = `**${text}**`;
|
|
11
|
+
if (node.italic) text = `*${text}*`;
|
|
12
|
+
if (node.strikethrough) text = `~~${text}~~`;
|
|
13
|
+
return text;
|
|
14
|
+
}
|
|
15
|
+
function renderPlainText(node, options = {}) {
|
|
16
|
+
if (!node) return "";
|
|
17
|
+
if (typeof node.text === "string") return renderTextNode(node);
|
|
18
|
+
if (!Array.isArray(node.children)) return "";
|
|
19
|
+
return node.children.map((child) => renderPlainText(child, options)).join("");
|
|
20
|
+
}
|
|
21
|
+
function renderTable(node, listDepth, options) {
|
|
22
|
+
const rows = Array.isArray(node.children) ? node.children : [];
|
|
23
|
+
if (rows.length === 0) return "";
|
|
24
|
+
const alignments = Array.isArray(node.columns) ? node.columns.map((column) => column?.align || "left") : [];
|
|
25
|
+
const renderedRows = rows.map(
|
|
26
|
+
(row) => (Array.isArray(row?.children) ? row.children : []).map((cell) => {
|
|
27
|
+
const content = renderPlainText(cell, options).replace(/\n+/g, " ").trim();
|
|
28
|
+
return content || " ";
|
|
29
|
+
})
|
|
30
|
+
);
|
|
31
|
+
const header = renderedRows[0] || [];
|
|
32
|
+
const divider = header.map((_, index) => {
|
|
33
|
+
const align = alignments[index];
|
|
34
|
+
if (align === "center") return ":---:";
|
|
35
|
+
if (align === "right") return "---:";
|
|
36
|
+
return "---";
|
|
37
|
+
});
|
|
38
|
+
const body = renderedRows.slice(1);
|
|
39
|
+
const allRows = [header, divider, ...body].map((cells) => `| ${cells.join(" | ")} |`).join("\n");
|
|
40
|
+
return `${allRows}
|
|
41
|
+
|
|
42
|
+
`;
|
|
43
|
+
}
|
|
44
|
+
function renderListItem(node, listDepth, ordered, start, index, options = {}) {
|
|
45
|
+
const indentation = " ".repeat(listDepth);
|
|
46
|
+
const marker = node.checked === true ? "- [x]" : node.checked === false ? "- [ ]" : ordered ? `${start + index}.` : "-";
|
|
47
|
+
const segments = Array.isArray(node.children) ? node.children : [];
|
|
48
|
+
const renderedSegments = segments.flatMap((child) => {
|
|
49
|
+
const rendered = renderNode(child, listDepth + 1, options).trimEnd();
|
|
50
|
+
return rendered ? [rendered] : [];
|
|
51
|
+
});
|
|
52
|
+
if (renderedSegments.length === 0) {
|
|
53
|
+
return `${indentation}${marker}
|
|
54
|
+
`;
|
|
55
|
+
}
|
|
56
|
+
const [first, ...rest] = renderedSegments;
|
|
57
|
+
const lines = first.split("\n");
|
|
58
|
+
const firstLine = lines.shift() || "";
|
|
59
|
+
const restFirst = lines.map((line) => `${indentation} ${line}`).join("\n");
|
|
60
|
+
const restBlocks = rest.map((block) => `${indentation} ${block}`).join("\n");
|
|
61
|
+
return [
|
|
62
|
+
`${indentation}${marker} ${firstLine}`,
|
|
63
|
+
restFirst,
|
|
64
|
+
restBlocks
|
|
65
|
+
].filter(Boolean).join("\n") + "\n";
|
|
66
|
+
}
|
|
67
|
+
function renderNode(node, listDepth = 0, options = {}) {
|
|
68
|
+
if (!node) return "";
|
|
69
|
+
const indentation = " ".repeat(listDepth);
|
|
70
|
+
switch (node.type) {
|
|
71
|
+
case "heading-one":
|
|
72
|
+
return `# ${node.children.map((n) => renderNode(n, listDepth, options)).join("")}
|
|
73
|
+
|
|
74
|
+
`;
|
|
75
|
+
case "heading-two":
|
|
76
|
+
return `## ${node.children.map((n) => renderNode(n, listDepth, options)).join("")}
|
|
77
|
+
|
|
78
|
+
`;
|
|
79
|
+
case "heading-three":
|
|
80
|
+
return `### ${node.children.map((n) => renderNode(n, listDepth, options)).join("")}
|
|
81
|
+
|
|
82
|
+
`;
|
|
83
|
+
case "heading-four":
|
|
84
|
+
return `#### ${node.children.map((n) => renderNode(n, listDepth, options)).join("")}
|
|
85
|
+
|
|
86
|
+
`;
|
|
87
|
+
case "heading-five":
|
|
88
|
+
return `##### ${node.children.map((n) => renderNode(n, listDepth, options)).join("")}
|
|
89
|
+
|
|
90
|
+
`;
|
|
91
|
+
case "heading-six":
|
|
92
|
+
return `###### ${node.children.map((n) => renderNode(n, listDepth, options)).join("")}
|
|
93
|
+
|
|
94
|
+
`;
|
|
95
|
+
case "paragraph":
|
|
96
|
+
return `${node.children.map((n) => renderNode(n, listDepth, options)).join("")}
|
|
97
|
+
|
|
98
|
+
`;
|
|
99
|
+
case "list":
|
|
100
|
+
return node.children.map(
|
|
101
|
+
(item, index) => renderListItem(item, listDepth, !!node.ordered, node.start || 1, index, options)
|
|
102
|
+
).join("");
|
|
103
|
+
case "list-item":
|
|
104
|
+
return renderListItem(node, listDepth, false, 1, 0, options);
|
|
105
|
+
case "quote":
|
|
106
|
+
const content = node.children.map((n) => renderNode(n, listDepth, options)).join("").trim();
|
|
107
|
+
return `> ${content.replace(/\n/g, "\n> ")}
|
|
108
|
+
|
|
109
|
+
`;
|
|
110
|
+
case "code-block":
|
|
111
|
+
const code = node.children.map(
|
|
112
|
+
(line) => (line.children || []).map((text) => text.text).join("")
|
|
113
|
+
).join("\n");
|
|
114
|
+
return "```" + (node.language || "") + "\n" + code + "\n```\n\n";
|
|
115
|
+
case "link":
|
|
116
|
+
const linkText = node.children.map((n) => renderNode(n, listDepth, options)).join("");
|
|
117
|
+
return `[${linkText}](${node.url})`;
|
|
118
|
+
case "table":
|
|
119
|
+
return renderTable(node, listDepth, options);
|
|
120
|
+
case "code-inline":
|
|
121
|
+
return `\`${node.children.map((n) => renderNode(n, listDepth, options)).join("")}\``;
|
|
122
|
+
case "mention": {
|
|
123
|
+
if (options.mentionResolver) {
|
|
124
|
+
return options.mentionResolver(node);
|
|
125
|
+
}
|
|
126
|
+
const label = node.label || node.resourceId || "mention";
|
|
127
|
+
const resourceType = node.resourceType || "unknown";
|
|
128
|
+
const resourceId = node.resourceId || "unknown";
|
|
129
|
+
return `@[${resourceType}:${resourceId}|${label}]`;
|
|
130
|
+
}
|
|
131
|
+
case "image": {
|
|
132
|
+
const alt = node.alt || "";
|
|
133
|
+
const title = node.title ? ` "${node.title}"` : "";
|
|
134
|
+
return ``;
|
|
135
|
+
}
|
|
136
|
+
case "html-inline":
|
|
137
|
+
return typeof node.html === "string" ? node.html : "";
|
|
138
|
+
case "html-block":
|
|
139
|
+
return typeof node.html === "string" ? `${node.html}
|
|
140
|
+
|
|
141
|
+
` : "";
|
|
142
|
+
case "thematic-break":
|
|
143
|
+
return "---\n\n";
|
|
144
|
+
default:
|
|
145
|
+
return renderTextNode(node) || (node.children ? node.children.map((child) => renderNode(child, listDepth, options)).join("") : "");
|
|
146
|
+
}
|
|
147
|
+
}
|
|
148
|
+
function slateToSimplifiedMarkdown(nodes, options = {}) {
|
|
149
|
+
if (!nodes || nodes.length === 0) {
|
|
150
|
+
return "";
|
|
151
|
+
}
|
|
152
|
+
return nodes.map((node) => renderNode(node, 0, options)).join("").trim() + "\n";
|
|
153
|
+
}
|
|
154
|
+
|
|
155
|
+
// packages/ai/tools/readDocTool.ts
|
|
156
|
+
var readDocFunctionSchema = {
|
|
157
|
+
name: "readDoc",
|
|
158
|
+
description: [
|
|
159
|
+
"\u8BFB\u53D6\u6307\u5B9A\u9875\u9762\u7684\u5185\u5BB9\uFF0C\u5E76\u5C06\u7ED3\u6784\u5316\u7684\u6570\u636E\u8F6C\u6362\u4E3A Markdown \u683C\u5F0F\u8FD4\u56DE\u3002",
|
|
160
|
+
"\u5982\u679C\u4F60\u62FF\u5230\u4E86\u9875\u9762\u7684 dbKey\uFF08\u5982 page-xxx\uFF09\uFF0C\u8BF7\u4F7F\u7528\u6B64\u5DE5\u5177\u67E5\u770B\u9875\u9762\u5185\u5BB9\u3002"
|
|
161
|
+
].join("\n"),
|
|
162
|
+
parameters: {
|
|
163
|
+
type: "object",
|
|
164
|
+
properties: {
|
|
165
|
+
id: {
|
|
166
|
+
type: "string",
|
|
167
|
+
description: "\u9875\u9762/\u6587\u6863\u7684\u6570\u636E\u5E93\u952E\uFF08dbKey\uFF09\uFF0C\u4F8B\u5982 page-xxx\u3002"
|
|
168
|
+
}
|
|
169
|
+
},
|
|
170
|
+
required: ["id"]
|
|
171
|
+
}
|
|
172
|
+
};
|
|
173
|
+
var readPageFunctionSchema = {
|
|
174
|
+
...readDocFunctionSchema,
|
|
175
|
+
name: "readPage"
|
|
176
|
+
};
|
|
177
|
+
var buildReadDocResult = (pageData) => {
|
|
178
|
+
const markdownContent = slateToSimplifiedMarkdown(pageData.slateData || []);
|
|
179
|
+
const rawData = {
|
|
180
|
+
success: true,
|
|
181
|
+
id: pageData.dbKey,
|
|
182
|
+
title: pageData.title,
|
|
183
|
+
content: markdownContent,
|
|
184
|
+
metadata: {
|
|
185
|
+
spaceId: pageData.spaceId,
|
|
186
|
+
created: pageData.created
|
|
187
|
+
}
|
|
188
|
+
};
|
|
189
|
+
const displayData = `\u5DF2\u6210\u529F\u8BFB\u53D6\u9875\u9762\u300A${pageData.title}\u300B\u3002
|
|
190
|
+
|
|
191
|
+
\u5185\u5BB9\u5982\u4E0B\uFF1A
|
|
192
|
+
|
|
193
|
+
${markdownContent}`;
|
|
194
|
+
return { rawData, displayData };
|
|
195
|
+
};
|
|
196
|
+
async function readDocFunc(args, thunkApi) {
|
|
197
|
+
const id = args.id ?? args.doc ?? args.docKey ?? args.pageKey ?? args.key;
|
|
198
|
+
if (!id || !id.toLowerCase().startsWith("page-")) {
|
|
199
|
+
throw new Error(`\u65E0\u6548\u7684\u9875\u9762 ID: ${id}\u3002\u9875\u9762 ID \u901A\u5E38\u4EE5 "page-" \u5F00\u5934\u3002`);
|
|
200
|
+
}
|
|
201
|
+
try {
|
|
202
|
+
const { readAction } = await import("./read-EBMWX4Z6.js");
|
|
203
|
+
const pageData = await readAction({ dbKey: id }, thunkApi);
|
|
204
|
+
if (!pageData) {
|
|
205
|
+
throw new Error(`\u672A\u627E\u5230 ID \u4E3A ${id} \u7684\u9875\u9762\u3002`);
|
|
206
|
+
}
|
|
207
|
+
return buildReadDocResult(pageData);
|
|
208
|
+
} catch (error) {
|
|
209
|
+
throw new Error(`\u8BFB\u53D6\u9875\u9762\u65F6\u51FA\u9519: ${toErrorMessage(error)}`);
|
|
210
|
+
}
|
|
211
|
+
}
|
|
212
|
+
var readPageFunc = readDocFunc;
|
|
213
|
+
|
|
214
|
+
export {
|
|
215
|
+
slateToSimplifiedMarkdown,
|
|
216
|
+
readDocFunctionSchema,
|
|
217
|
+
readPageFunctionSchema,
|
|
218
|
+
buildReadDocResult,
|
|
219
|
+
readDocFunc,
|
|
220
|
+
readPageFunc
|
|
221
|
+
};
|
|
@@ -0,0 +1,175 @@
|
|
|
1
|
+
import {
|
|
2
|
+
selectCurrentServer,
|
|
3
|
+
selectRemoteServers
|
|
4
|
+
} from "./chunk-K6BPOQLF.js";
|
|
5
|
+
import {
|
|
6
|
+
createUserKey,
|
|
7
|
+
extractAgentInfo,
|
|
8
|
+
extractCoverImage,
|
|
9
|
+
resolveShareAuthorIdentity,
|
|
10
|
+
sanitizeShareData,
|
|
11
|
+
shareKey,
|
|
12
|
+
toNonEmptyString
|
|
13
|
+
} from "./chunk-O4BU24WZ.js";
|
|
14
|
+
import {
|
|
15
|
+
noloDeleteRequest,
|
|
16
|
+
noloWriteRequest,
|
|
17
|
+
selectIdentityUser,
|
|
18
|
+
selectIdentityUserId
|
|
19
|
+
} from "./chunk-XBROXIGL.js";
|
|
20
|
+
import {
|
|
21
|
+
normalizeTimeFields
|
|
22
|
+
} from "./chunk-WI4XWASA.js";
|
|
23
|
+
|
|
24
|
+
// packages/share/action.ts
|
|
25
|
+
var generateToken = () => {
|
|
26
|
+
const chars = "abcdefghijklmnopqrstuvwxyz0123456789";
|
|
27
|
+
const charsLen = chars.length;
|
|
28
|
+
const maxValid = 252;
|
|
29
|
+
let token = "";
|
|
30
|
+
while (token.length < 10) {
|
|
31
|
+
const bytes = new Uint8Array(16);
|
|
32
|
+
crypto.getRandomValues(bytes);
|
|
33
|
+
for (let i = 0; i < bytes.length && token.length < 10; i++) {
|
|
34
|
+
if (bytes[i] < maxValid) {
|
|
35
|
+
token += chars.charAt(bytes[i] % charsLen);
|
|
36
|
+
}
|
|
37
|
+
}
|
|
38
|
+
}
|
|
39
|
+
return token;
|
|
40
|
+
};
|
|
41
|
+
var assertDialogShareMessagesPresent = (type, data) => {
|
|
42
|
+
if (type !== "dialog") return;
|
|
43
|
+
const messages = Array.isArray(data.messages) ? data.messages : Array.isArray(data.history) ? data.history : [];
|
|
44
|
+
if (messages.length > 0) return;
|
|
45
|
+
throw new Error("Cannot share dialog without persisted messages.");
|
|
46
|
+
};
|
|
47
|
+
var resolveTableSharePayload = (type, data, userId, originServer) => {
|
|
48
|
+
if (type !== "table") return sanitizeShareData(data);
|
|
49
|
+
const tableDbKey = typeof data.dbKey === "string" && data.dbKey.trim().length > 0 ? data.dbKey : void 0;
|
|
50
|
+
const tableOwnerId = typeof data.tenantId === "string" && data.tenantId.trim().length > 0 ? data.tenantId : userId;
|
|
51
|
+
if (!tableDbKey) {
|
|
52
|
+
throw new Error("Table share requires a dbKey.");
|
|
53
|
+
}
|
|
54
|
+
return {
|
|
55
|
+
mode: "live",
|
|
56
|
+
tableDbKey,
|
|
57
|
+
tableOwnerId,
|
|
58
|
+
originServer
|
|
59
|
+
};
|
|
60
|
+
};
|
|
61
|
+
var shareResourceAction = async (config, thunkApi) => {
|
|
62
|
+
const state = thunkApi.getState();
|
|
63
|
+
const userId = selectIdentityUserId(state);
|
|
64
|
+
const currentUser = selectIdentityUser(state);
|
|
65
|
+
if (!userId) {
|
|
66
|
+
throw new Error("User must be logged in to share resources.");
|
|
67
|
+
}
|
|
68
|
+
const token = generateToken();
|
|
69
|
+
const key = shareKey.create(token);
|
|
70
|
+
const currentServer = selectCurrentServer(state);
|
|
71
|
+
assertDialogShareMessagesPresent(config.type, config.data);
|
|
72
|
+
const snapshotData = resolveTableSharePayload(
|
|
73
|
+
config.type,
|
|
74
|
+
config.data,
|
|
75
|
+
userId,
|
|
76
|
+
currentServer
|
|
77
|
+
);
|
|
78
|
+
const coverImage = extractCoverImage(config.type, snapshotData);
|
|
79
|
+
const agentInfo = extractAgentInfo(config.type, snapshotData);
|
|
80
|
+
const createdAt = Date.now();
|
|
81
|
+
const { db: clientDb } = thunkApi.extra;
|
|
82
|
+
let authorProfile = null;
|
|
83
|
+
if (clientDb) {
|
|
84
|
+
try {
|
|
85
|
+
authorProfile = await clientDb.get(createUserKey.profile(userId));
|
|
86
|
+
} catch {
|
|
87
|
+
authorProfile = null;
|
|
88
|
+
}
|
|
89
|
+
}
|
|
90
|
+
const { authorName, authorAvatar } = resolveShareAuthorIdentity({
|
|
91
|
+
user: currentUser,
|
|
92
|
+
profile: authorProfile
|
|
93
|
+
});
|
|
94
|
+
if (agentInfo.sourceAgentKey && !agentInfo.sourceAgentName) {
|
|
95
|
+
if (clientDb) {
|
|
96
|
+
try {
|
|
97
|
+
const agentData = await clientDb.get(agentInfo.sourceAgentKey);
|
|
98
|
+
const name = toNonEmptyString(agentData?.name);
|
|
99
|
+
if (name) agentInfo.sourceAgentName = name;
|
|
100
|
+
} catch {
|
|
101
|
+
}
|
|
102
|
+
}
|
|
103
|
+
}
|
|
104
|
+
const sharedObject = {
|
|
105
|
+
type: config.type,
|
|
106
|
+
version: 1,
|
|
107
|
+
data: snapshotData,
|
|
108
|
+
meta: {
|
|
109
|
+
authorId: userId,
|
|
110
|
+
...authorName ? { authorName } : {},
|
|
111
|
+
...authorAvatar ? { authorAvatar } : {},
|
|
112
|
+
createdAt,
|
|
113
|
+
visibility: config.visibility ?? "private",
|
|
114
|
+
title: config.title,
|
|
115
|
+
description: config.description,
|
|
116
|
+
originalId: config.data.dbKey ?? config.data.id,
|
|
117
|
+
coverImage,
|
|
118
|
+
...agentInfo
|
|
119
|
+
}
|
|
120
|
+
};
|
|
121
|
+
const servers = [
|
|
122
|
+
currentServer,
|
|
123
|
+
...selectRemoteServers(state).filter((server) => server !== currentServer)
|
|
124
|
+
].filter(Boolean);
|
|
125
|
+
const replicaServers = servers.filter((server) => server !== currentServer);
|
|
126
|
+
if (servers.length === 0) {
|
|
127
|
+
throw new Error("No available server to publish share.");
|
|
128
|
+
}
|
|
129
|
+
if (config.type === "table" && sharedObject.data.mode === "live") {
|
|
130
|
+
sharedObject.data = {
|
|
131
|
+
...sharedObject.data,
|
|
132
|
+
originServer: currentServer
|
|
133
|
+
};
|
|
134
|
+
sharedObject.meta = {
|
|
135
|
+
...sharedObject.meta,
|
|
136
|
+
mode: "live",
|
|
137
|
+
tableDbKey: typeof sharedObject.data.tableDbKey === "string" ? sharedObject.data.tableDbKey : void 0,
|
|
138
|
+
tableOwnerId: typeof sharedObject.data.tableOwnerId === "string" ? sharedObject.data.tableOwnerId : void 0,
|
|
139
|
+
originServer: currentServer,
|
|
140
|
+
replicaServers
|
|
141
|
+
};
|
|
142
|
+
}
|
|
143
|
+
const persistedSharedObject = normalizeTimeFields({
|
|
144
|
+
...sharedObject,
|
|
145
|
+
dbKey: key,
|
|
146
|
+
userId
|
|
147
|
+
});
|
|
148
|
+
const indexKeys = shareKey.allIndexKeysFromShare(key, persistedSharedObject);
|
|
149
|
+
const results = await Promise.all(
|
|
150
|
+
servers.map(
|
|
151
|
+
(server) => noloWriteRequest(server, { data: persistedSharedObject, customKey: key, userId, indexKeys }, state)
|
|
152
|
+
)
|
|
153
|
+
);
|
|
154
|
+
const [originPublished, ...replicaPublishResults] = results;
|
|
155
|
+
if (!originPublished) {
|
|
156
|
+
const successfulReplicaServers = replicaServers.filter(
|
|
157
|
+
(_, index) => replicaPublishResults[index]
|
|
158
|
+
);
|
|
159
|
+
await Promise.all(
|
|
160
|
+
successfulReplicaServers.map(
|
|
161
|
+
(server) => noloDeleteRequest(server, key, { type: "single" }, state)
|
|
162
|
+
)
|
|
163
|
+
);
|
|
164
|
+
throw new Error("Failed to publish share to origin server.");
|
|
165
|
+
}
|
|
166
|
+
if (!clientDb) {
|
|
167
|
+
throw new Error("Client database instance is required in shareResourceAction");
|
|
168
|
+
}
|
|
169
|
+
await clientDb.put(key, persistedSharedObject);
|
|
170
|
+
return { token, key };
|
|
171
|
+
};
|
|
172
|
+
|
|
173
|
+
export {
|
|
174
|
+
shareResourceAction
|
|
175
|
+
};
|