nolo-cli 0.7.0 → 0.8.0-alpha.11

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 (175) hide show
  1. package/_executeModel-GPU2276G.js +198 -0
  2. package/action-PAXRPJJF.js +27 -0
  3. package/addContentAction-CZVWF3QZ.js +25 -0
  4. package/addDialogAgentAction-CCIDTPHC.js +67 -0
  5. package/agentDeleteCommand-4ZZFM6AT.js +323 -0
  6. package/agentEmailCommands-C4FIVQYV.js +621 -0
  7. package/agentListCommands-VQAKVNEX.js +219 -0
  8. package/agentMachineCommands-ONFDXZUQ.js +421 -0
  9. package/agentPullCommand-O2MTUAFR.js +122 -0
  10. package/agentRecordCommands-QANUGHLK.js +89 -0
  11. package/agentRunCommand-A3OSRB5Q.js +102 -0
  12. package/agentRunControl-K4VKNEHF.js +57 -0
  13. package/agentRuntimeLocal-62ZB2ODP.js +99 -0
  14. package/agentSlice-GCGLVR2N.js +41 -0
  15. package/authCommand-WXMD3IPR.js +574 -0
  16. package/authCommands-X74AFDTC.js +26 -0
  17. package/chunk-2EISRLRC.js +238 -0
  18. package/chunk-2FTTDCD4.js +675 -0
  19. package/chunk-2MALU52L.js +51 -0
  20. package/chunk-2UZXR7WO.js +3631 -0
  21. package/chunk-3ASDTTEI.js +1774 -0
  22. package/chunk-3EUW3WEO.js +8 -0
  23. package/chunk-3LY4F7SV.js +9293 -0
  24. package/chunk-4CQLVGRV.js +50 -0
  25. package/chunk-4IJYA27C.js +342 -0
  26. package/chunk-4SN6J65J.js +38 -0
  27. package/chunk-4VNS5WPM.js +42 -0
  28. package/chunk-53DNV5AT.js +421 -0
  29. package/chunk-572EKYLF.js +792 -0
  30. package/chunk-5MIDPSSK.js +206 -0
  31. package/chunk-5MMAK75Q.js +15 -0
  32. package/chunk-63W5N6P3.js +150 -0
  33. package/chunk-6B7G54GE.js +1078 -0
  34. package/chunk-6HYVJV7B.js +102 -0
  35. package/chunk-6WD3OOJS.js +20 -0
  36. package/chunk-7OC5VCLW.js +929 -0
  37. package/chunk-7YLKNMOM.js +562 -0
  38. package/chunk-ATNTHIZI.js +13 -0
  39. package/chunk-AUGHVUFE.js +69 -0
  40. package/chunk-AVMKZHBC.js +85 -0
  41. package/chunk-AZPCASRE.js +36 -0
  42. package/chunk-BR2WP3DF.js +548 -0
  43. package/chunk-BSTNFPHD.js +231 -0
  44. package/chunk-CF2WZF4N.js +134 -0
  45. package/chunk-CF7PE763.js +10 -0
  46. package/chunk-CJH2VTEU.js +360 -0
  47. package/chunk-CKOJQDKR.js +198 -0
  48. package/chunk-CM54RSSA.js +206 -0
  49. package/chunk-CQAHS7YO.js +4300 -0
  50. package/chunk-CWMSB67P.js +34 -0
  51. package/chunk-DFFIZ25G.js +30 -0
  52. package/chunk-DWLEOOGR.js +8 -0
  53. package/chunk-DZ3XJVET.js +231 -0
  54. package/chunk-EHLHSX7R.js +1433 -0
  55. package/chunk-ELRRLDWI.js +478 -0
  56. package/chunk-EYEEHCU4.js +3066 -0
  57. package/chunk-F6QQI5YI.js +19 -0
  58. package/chunk-G3SUCT4W.js +8 -0
  59. package/chunk-G5H7RNFL.js +807 -0
  60. package/chunk-GAKEBQD6.js +30 -0
  61. package/chunk-GBRG75BQ.js +86 -0
  62. package/chunk-GCMRDRCQ.js +190 -0
  63. package/chunk-GGUO4FKF.js +27158 -0
  64. package/chunk-GGXABIPP.js +628 -0
  65. package/chunk-H2RMRZJE.js +113 -0
  66. package/chunk-H33743XH.js +25 -0
  67. package/chunk-HEIIIZBX.js +104 -0
  68. package/chunk-HNMXYYJR.js +12 -0
  69. package/chunk-I3D64LRJ.js +1447 -0
  70. package/chunk-IAXBCTTE.js +175 -0
  71. package/chunk-IDZTNRP2.js +85 -0
  72. package/chunk-ISNCLGUZ.js +146 -0
  73. package/chunk-IYQV26RA.js +138 -0
  74. package/chunk-J4576WMJ.js +91 -0
  75. package/chunk-J5KV47ZW.js +222 -0
  76. package/chunk-JBTJAPUF.js +35 -0
  77. package/chunk-JZPBVBIY.js +94 -0
  78. package/chunk-KB7YFGL6.js +34 -0
  79. package/chunk-KKY4B2Q2.js +21 -0
  80. package/chunk-KQHGZWSV.js +63 -0
  81. package/chunk-KUG52IAP.js +8 -0
  82. package/chunk-KX6YBIHG.js +8 -0
  83. package/chunk-LAWBMYBC.js +171 -0
  84. package/chunk-LCBAMY2M.js +60 -0
  85. package/chunk-LM25IZBJ.js +902 -0
  86. package/chunk-LM6IYQ3F.js +16 -0
  87. package/chunk-M76ECQRD.js +13658 -0
  88. package/chunk-MRC4Q34M.js +188 -0
  89. package/chunk-NXZGF7F7.js +2878 -0
  90. package/chunk-OF5H3QWS.js +300 -0
  91. package/chunk-OLZBQWZU.js +6 -0
  92. package/chunk-OWOHNGCN.js +50 -0
  93. package/chunk-PN7AFLOK.js +3401 -0
  94. package/chunk-QR5IPGT3.js +24674 -0
  95. package/chunk-QSJ3HFEF.js +8 -0
  96. package/chunk-QYXLLLGL.js +4519 -0
  97. package/chunk-R2HXWML7.js +1949 -0
  98. package/chunk-ROWQEJRP.js +139 -0
  99. package/chunk-S7Z2HMCN.js +25 -0
  100. package/chunk-SYOF5TAS.js +962 -0
  101. package/chunk-TDIQFT2F.js +301 -0
  102. package/chunk-TILFE6LV.js +381 -0
  103. package/chunk-TZNCFAUP.js +2157 -0
  104. package/chunk-U4TRT5V4.js +246 -0
  105. package/chunk-U6VC4MU4.js +8 -0
  106. package/chunk-UAD2WT54.js +64 -0
  107. package/chunk-USZMK5UT.js +105 -0
  108. package/chunk-VEJLAVTC.js +2052 -0
  109. package/chunk-VF4K2QE6.js +21 -0
  110. package/chunk-VHBWHNVT.js +59 -0
  111. package/chunk-VIDPVFP3.js +20 -0
  112. package/chunk-VP4WJWKW.js +8882 -0
  113. package/chunk-VQ2AJRGD.js +148 -0
  114. package/chunk-W4NVOSFF.js +37 -0
  115. package/chunk-WWC7I6TA.js +8 -0
  116. package/chunk-X7W4TNB4.js +1550 -0
  117. package/chunk-XBIUN5CR.js +191 -0
  118. package/chunk-XDVAYP26.js +537 -0
  119. package/chunk-XKIMRZO2.js +221 -0
  120. package/chunk-Y5GCAMGP.js +9 -0
  121. package/chunk-YOUZDXU7.js +9013 -0
  122. package/chunk-Z4NR32XR.js +50 -0
  123. package/chunk-ZNFJWEN4.js +56 -0
  124. package/cliExecutor-DNE7TCC4.js +36 -0
  125. package/clipboardy-BVE3LVEH.js +12001 -0
  126. package/createAgentAutomationAction-537X433B.js +864 -0
  127. package/createDialogAction-YUD4RKBS.js +52 -0
  128. package/createPageAction-KJMFHL4C.js +169 -0
  129. package/db-HCJ5PRB5.js +271 -0
  130. package/dbSlice-C4UJLRZP.js +59 -0
  131. package/deleteFile-4SKGPHOZ.js +41 -0
  132. package/dialogCommands-H74KJKHC.js +59 -0
  133. package/dialogSlice-ETSD4YWS.js +146 -0
  134. package/docCreateCommands-ADUSU34K.js +215 -0
  135. package/docDeleteCommands-ZXV3S5OS.js +176 -0
  136. package/docReadCommands-YYYI6LT7.js +129 -0
  137. package/docStore-ZBF5DDKR.js +96 -0
  138. package/docUpdateCommands-7MGJ3BYA.js +313 -0
  139. package/fetchMessages-JOCYIFKL.js +16 -0
  140. package/getPricing-PWPJ6MNV.js +30 -0
  141. package/handleSendMessageAction-MGKI62Y6.js +183 -0
  142. package/index.js +184 -112288
  143. package/lib-FYYBQIXS.js +19839 -0
  144. package/localDialogRead-D3BELSTF.js +26 -0
  145. package/localFirstLog-DHNOY2NA.js +19 -0
  146. package/localRuntimeAuthority-TEGCOWX4.js +471 -0
  147. package/localRuntimeDb-LGDF6FQP.js +12 -0
  148. package/machineCommands-RMTMN7VQ.js +774 -0
  149. package/machineInfo-M6KB6HZN.js +10 -0
  150. package/machineWsRunDispatch-UIP355FN.js +105 -0
  151. package/memoryCommands-O4MIPIWQ.js +476 -0
  152. package/models-XLEOET3E.js +9 -0
  153. package/offlineMarxistsAgentCommand-BCPJITJL.js +242 -0
  154. package/package.json +3 -25
  155. package/read-RIJCIVKX.js +17 -0
  156. package/readDocTool-GZD2N3LO.js +16 -0
  157. package/readlineWorkspace-CRNQRZ6D.js +5374 -0
  158. package/removeDialogAgentAction-CXLST3N6.js +72 -0
  159. package/runAgentClientLoop-2S334SGA.js +288 -0
  160. package/runtimeDoctorCommands-LRHLPDRC.js +289 -0
  161. package/setDialogExtraReferencesAction-LP6VYGU7.js +59 -0
  162. package/setPrimaryDialogAgentAction-D3GGH23T.js +79 -0
  163. package/settingSlice-J4I3Z5H7.js +198 -0
  164. package/skillSummaryMarker-42HKSXYY.js +9 -0
  165. package/slateToRenderMarkdown-Y5IYN73U.js +7 -0
  166. package/slateUtils-2M7MUTWX.js +19 -0
  167. package/spaceCommands-NDEWMFZJ.js +450 -0
  168. package/spaceSlice-RLB6RTHO.js +145 -0
  169. package/streamAgentChatTurn-Y2TTYPBD.js +4503 -0
  170. package/tableCommands-GOFP7QKA.js +1286 -0
  171. package/toolApiClient-QI3YBNWB.js +26 -0
  172. package/tools-YZYLY2ZQ.js +83 -0
  173. package/understanding-HCSFPE7R.js +318 -0
  174. package/updateCommands-VOSPKXFF.js +31 -0
  175. package/updateDialogTitleAction-LQV6QLBW.js +185 -0
@@ -0,0 +1,175 @@
1
+ import {
2
+ selectCurrentServer,
3
+ selectRemoteServers
4
+ } from "./chunk-VEJLAVTC.js";
5
+ import {
6
+ createUserKey,
7
+ extractAgentInfo,
8
+ extractCoverImage,
9
+ resolveShareAuthorIdentity,
10
+ sanitizeShareData,
11
+ shareKey,
12
+ toNonEmptyString
13
+ } from "./chunk-PN7AFLOK.js";
14
+ import {
15
+ noloDeleteRequest,
16
+ noloWriteRequest,
17
+ selectIdentityUser,
18
+ selectIdentityUserId
19
+ } from "./chunk-EYEEHCU4.js";
20
+ import {
21
+ normalizeTimeFields
22
+ } from "./chunk-QYXLLLGL.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
+ };
@@ -0,0 +1,85 @@
1
+ // packages/cli/processSpawn.ts
2
+ import { spawn } from "node:child_process";
3
+ function spawnProcess(options) {
4
+ let [command, ...args] = options.cmd;
5
+ if (process.platform === "win32") {
6
+ const lower = command.toLowerCase();
7
+ if ((lower === "npm" || lower === "npx" || lower === "pnpm" || lower === "yarn" || lower === "nolo") && !lower.endsWith(".cmd") && !lower.endsWith(".exe") && !lower.endsWith(".bat")) {
8
+ command = `${command}.cmd`;
9
+ }
10
+ }
11
+ let child;
12
+ try {
13
+ child = spawn(command, args, {
14
+ cwd: options.cwd,
15
+ env: options.env,
16
+ stdio: [
17
+ options.stdin ?? "pipe",
18
+ options.stdout ?? "pipe",
19
+ options.stderr ?? "pipe"
20
+ ]
21
+ });
22
+ } catch {
23
+ return {
24
+ exited: Promise.resolve(127),
25
+ stdin: null,
26
+ stdout: null,
27
+ stderr: null
28
+ };
29
+ }
30
+ const exited = new Promise((resolve) => {
31
+ child.on("exit", (code) => resolve(code ?? 1));
32
+ child.on("error", () => resolve(127));
33
+ });
34
+ return {
35
+ exited,
36
+ stdin: child.stdin,
37
+ stdout: child.stdout,
38
+ stderr: child.stderr
39
+ };
40
+ }
41
+ async function readPipeText(stream) {
42
+ if (!stream) return "";
43
+ const anyStream = stream;
44
+ if (typeof anyStream.setEncoding !== "function" && typeof anyStream[Symbol.asyncIterator] === "function") {
45
+ const chunks = [];
46
+ for await (const chunk of anyStream) {
47
+ if (typeof chunk === "string") chunks.push(chunk);
48
+ else if (chunk instanceof Uint8Array) chunks.push(Buffer.from(chunk).toString("utf8"));
49
+ else if (Buffer.isBuffer(chunk)) chunks.push(chunk.toString("utf8"));
50
+ else chunks.push(String(chunk ?? ""));
51
+ }
52
+ return chunks.join("");
53
+ }
54
+ return new Promise((resolve) => {
55
+ let data = "";
56
+ let done = false;
57
+ const finish = () => {
58
+ if (done) return;
59
+ done = true;
60
+ resolve(data);
61
+ };
62
+ if (typeof anyStream.setEncoding === "function") {
63
+ anyStream.setEncoding("utf8");
64
+ }
65
+ stream.on("data", (chunk) => {
66
+ data += typeof chunk === "string" ? chunk : Buffer.from(chunk).toString("utf8");
67
+ });
68
+ stream.on("end", finish);
69
+ stream.on("close", finish);
70
+ stream.on("error", finish);
71
+ });
72
+ }
73
+ function resolveDefaultSpawn() {
74
+ const bunSpawn = globalThis.Bun?.spawn;
75
+ if (typeof bunSpawn === "function") {
76
+ return bunSpawn;
77
+ }
78
+ return spawnProcess;
79
+ }
80
+
81
+ export {
82
+ spawnProcess,
83
+ readPipeText,
84
+ resolveDefaultSpawn
85
+ };
@@ -0,0 +1,146 @@
1
+ import {
2
+ DEFAULT_NOLO_SERVER_URL
3
+ } from "./chunk-OLZBQWZU.js";
4
+ import {
5
+ DEFAULT_LOCAL_API_ORIGIN
6
+ } from "./chunk-4SN6J65J.js";
7
+ import {
8
+ NOLO_CLUSTER_SERVERS
9
+ } from "./chunk-LCBAMY2M.js";
10
+ import {
11
+ normalizeServerOrigin
12
+ } from "./chunk-CF7PE763.js";
13
+ import {
14
+ asOptionalTrimmedString
15
+ } from "./chunk-G3SUCT4W.js";
16
+
17
+ // packages/cli/cliEnvHelpers.ts
18
+ import { dirname, extname, join } from "node:path";
19
+ import { fileURLToPath } from "node:url";
20
+ function resolveServerUrlFromEnv(env) {
21
+ return normalizeServerOrigin(
22
+ env.NOLO_SERVER || env.BASE_URL || DEFAULT_NOLO_SERVER_URL
23
+ );
24
+ }
25
+ function isCliArgs(value) {
26
+ return Array.isArray(value);
27
+ }
28
+ function buildServerCandidates(values) {
29
+ return [...new Set(
30
+ values.filter((value) => typeof value === "string" && value.trim().length > 0).map((value) => normalizeServerOrigin(value))
31
+ )];
32
+ }
33
+ function resolveServerUrl(input, env) {
34
+ if (isCliArgs(input)) {
35
+ const explicit = readOption(input, "--server-url") || readOption(input, "--server");
36
+ return normalizeServerOrigin(explicit) || resolveServerUrlFromEnv(env ?? {});
37
+ }
38
+ return resolveServerUrlFromEnv(input);
39
+ }
40
+ function resolveServerCandidates(input, envOrPreferred, preferred) {
41
+ if (isCliArgs(input)) {
42
+ const env2 = envOrPreferred ?? {};
43
+ const explicitServer = resolveServerUrl(input, env2);
44
+ return buildServerCandidates([
45
+ explicitServer,
46
+ preferred?.trim(),
47
+ env2.NOLO_SERVER,
48
+ env2.BASE_URL,
49
+ env2.NOLO_SERVER_URL,
50
+ DEFAULT_NOLO_SERVER_URL,
51
+ ...NOLO_CLUSTER_SERVERS
52
+ ]);
53
+ }
54
+ const env = input;
55
+ return buildServerCandidates([
56
+ asOptionalTrimmedString(envOrPreferred),
57
+ env.NOLO_SERVER,
58
+ env.BASE_URL,
59
+ env.NOLO_SERVER_URL,
60
+ DEFAULT_NOLO_SERVER_URL,
61
+ ...NOLO_CLUSTER_SERVERS
62
+ ]);
63
+ }
64
+ function resolveDeleteServerCandidatesFromEnv(env, ...preferredValues) {
65
+ return buildServerCandidates([
66
+ ...preferredValues,
67
+ env.NOLO_SERVER,
68
+ env.BASE_URL,
69
+ env.NOLO_SERVER_URL,
70
+ env.READ_DIALOG_BASE,
71
+ DEFAULT_NOLO_SERVER_URL,
72
+ ...NOLO_CLUSTER_SERVERS,
73
+ DEFAULT_LOCAL_API_ORIGIN
74
+ ]);
75
+ }
76
+ function resolveDeleteServerCandidates(input, envOrPreferred, preferred) {
77
+ if (isCliArgs(input)) {
78
+ const env2 = envOrPreferred ?? {};
79
+ const explicitServer = resolveServerUrl(input, env2);
80
+ return resolveDeleteServerCandidatesFromEnv(env2, explicitServer, preferred?.trim());
81
+ }
82
+ const env = input;
83
+ return resolveDeleteServerCandidatesFromEnv(
84
+ env,
85
+ asOptionalTrimmedString(envOrPreferred)
86
+ );
87
+ }
88
+ function resolveAuthTokenFromEnv(env, extraEnvKeys = []) {
89
+ for (const key of ["AUTH_TOKEN", "AUTH", ...extraEnvKeys]) {
90
+ const value = env[key];
91
+ if (typeof value === "string" && value.trim()) return value;
92
+ }
93
+ return "";
94
+ }
95
+ function resolveAuthToken(input, envOrExtraEnvKeys, extraEnvKeys = []) {
96
+ if (isCliArgs(input)) {
97
+ const env = envOrExtraEnvKeys ?? {};
98
+ return readOption(input, "--token") || readOption(input, "--machine-key") || resolveAuthTokenFromEnv(env, extraEnvKeys);
99
+ }
100
+ return resolveAuthTokenFromEnv(input, envOrExtraEnvKeys ?? []);
101
+ }
102
+ function parseUserIdFromAuthToken(token) {
103
+ const parts = token.trim().split(".").filter(Boolean);
104
+ const payloadCandidates = parts.length >= 3 ? [parts[1], parts[0]] : [parts[0]];
105
+ for (const payload of payloadCandidates) {
106
+ if (!payload) continue;
107
+ try {
108
+ const parsed = JSON.parse(Buffer.from(payload, "base64").toString("utf8"));
109
+ if (typeof parsed?.userId === "string") return parsed.userId;
110
+ } catch {
111
+ }
112
+ }
113
+ return "";
114
+ }
115
+ function readOption(args, flag) {
116
+ const index = args.indexOf(flag);
117
+ return index >= 0 ? args[index + 1] : void 0;
118
+ }
119
+ function isCompiledBinary() {
120
+ try {
121
+ const url = import.meta.url;
122
+ return url.startsWith("file:///$bunfs/root/") || url.startsWith("/$bunfs/root/");
123
+ } catch {
124
+ return false;
125
+ }
126
+ }
127
+ function resolveCliEntrypointPath(fromModuleUrl = import.meta.url) {
128
+ if (isCompiledBinary()) {
129
+ return process.execPath;
130
+ }
131
+ const sourcePath = fileURLToPath(fromModuleUrl);
132
+ const ext = extname(sourcePath) || ".ts";
133
+ return join(dirname(sourcePath), "..", `index${ext}`);
134
+ }
135
+
136
+ export {
137
+ resolveServerUrl,
138
+ resolveServerCandidates,
139
+ resolveDeleteServerCandidates,
140
+ resolveAuthTokenFromEnv,
141
+ resolveAuthToken,
142
+ parseUserIdFromAuthToken,
143
+ readOption,
144
+ isCompiledBinary,
145
+ resolveCliEntrypointPath
146
+ };
@@ -0,0 +1,138 @@
1
+ import {
2
+ selectCurrentServer
3
+ } from "./chunk-VEJLAVTC.js";
4
+ import {
5
+ patch
6
+ } from "./chunk-G5H7RNFL.js";
7
+ import {
8
+ selectIdentityToken
9
+ } from "./chunk-EYEEHCU4.js";
10
+ import {
11
+ getIsDesktopApp
12
+ } from "./chunk-QYXLLLGL.js";
13
+
14
+ // packages/ai/agent/cliChatClient.ts
15
+ function getCliChatRequestConfig(thunkApi) {
16
+ const state = thunkApi.getState();
17
+ const currentServer = selectCurrentServer(state);
18
+ const token = selectIdentityToken(state);
19
+ if (!currentServer) throw new Error("\u65E0\u6CD5\u83B7\u53D6\u5F53\u524D\u670D\u52A1\u5668\u5730\u5740\u3002");
20
+ return { currentServer, token };
21
+ }
22
+ function resolveCliChatUrl(currentServer) {
23
+ if (getIsDesktopApp()) return "/api/cli/chat";
24
+ return `${currentServer}/api/cli/chat`;
25
+ }
26
+ async function postCliChat(thunkApi, body, signal) {
27
+ const { currentServer, token } = getCliChatRequestConfig(thunkApi);
28
+ return fetch(resolveCliChatUrl(currentServer), {
29
+ method: "POST",
30
+ headers: {
31
+ "Content-Type": "application/json",
32
+ ...token ? { Authorization: `Bearer ${token}` } : {}
33
+ },
34
+ body: JSON.stringify(body),
35
+ signal
36
+ });
37
+ }
38
+ async function startCliChatSession(thunkApi, args) {
39
+ const response = await postCliChat(thunkApi, {
40
+ action: "start",
41
+ cliProvider: args.cliProvider,
42
+ model: args.model,
43
+ systemPrompt: args.systemPrompt,
44
+ reasoningEffort: args.reasoningEffort,
45
+ temperature: args.temperature,
46
+ topP: args.topP,
47
+ frequencyPenalty: args.frequencyPenalty,
48
+ presencePenalty: args.presencePenalty,
49
+ maxTokens: args.maxTokens,
50
+ enableThinking: args.enableThinking,
51
+ thinkingBudget: args.thinkingBudget
52
+ });
53
+ return response.json();
54
+ }
55
+ async function getCliChatSession(thunkApi, args) {
56
+ const response = await postCliChat(thunkApi, {
57
+ action: "get",
58
+ sessionId: args.sessionId
59
+ });
60
+ return response.json();
61
+ }
62
+ async function closeCliChatSession(thunkApi, args) {
63
+ const response = await postCliChat(thunkApi, {
64
+ action: "close",
65
+ sessionId: args.sessionId
66
+ });
67
+ return response.json();
68
+ }
69
+ function createCliChatTurnStream(thunkApi, args, signal) {
70
+ return postCliChat(
71
+ thunkApi,
72
+ args.sessionId ? {
73
+ action: "turn",
74
+ sessionId: args.sessionId,
75
+ prompt: args.prompt,
76
+ model: args.model,
77
+ reasoningEffort: args.reasoningEffort,
78
+ temperature: args.temperature,
79
+ topP: args.topP,
80
+ frequencyPenalty: args.frequencyPenalty,
81
+ presencePenalty: args.presencePenalty,
82
+ maxTokens: args.maxTokens,
83
+ enableThinking: args.enableThinking,
84
+ thinkingBudget: args.thinkingBudget
85
+ } : {
86
+ prompt: args.prompt,
87
+ model: args.model,
88
+ cliProvider: args.cliProvider,
89
+ systemPrompt: args.systemPrompt,
90
+ reasoningEffort: args.reasoningEffort,
91
+ temperature: args.temperature,
92
+ topP: args.topP,
93
+ frequencyPenalty: args.frequencyPenalty,
94
+ presencePenalty: args.presencePenalty,
95
+ maxTokens: args.maxTokens,
96
+ enableThinking: args.enableThinking,
97
+ thinkingBudget: args.thinkingBudget
98
+ },
99
+ signal
100
+ );
101
+ }
102
+
103
+ // packages/chat/dialog/actions/cleanupCliSession.ts
104
+ async function cleanupCliSessionForDialog(thunkApi, dialogConfig) {
105
+ const cliSessionId = dialogConfig?.cliSessionId;
106
+ const dialogKey = dialogConfig?.dbKey;
107
+ if (!cliSessionId || !dialogKey) return;
108
+ try {
109
+ await closeCliChatSession(
110
+ { getState: thunkApi.getState },
111
+ { sessionId: cliSessionId }
112
+ );
113
+ } catch {
114
+ }
115
+ try {
116
+ const patchResult = thunkApi.dispatch(
117
+ patch({
118
+ dbKey: dialogKey,
119
+ changes: {
120
+ cliSessionId: null
121
+ }
122
+ })
123
+ );
124
+ if (typeof patchResult?.unwrap === "function") {
125
+ await patchResult.unwrap();
126
+ } else {
127
+ await patchResult;
128
+ }
129
+ } catch {
130
+ }
131
+ }
132
+
133
+ export {
134
+ startCliChatSession,
135
+ getCliChatSession,
136
+ createCliChatTurnStream,
137
+ cleanupCliSessionForDialog
138
+ };
@@ -0,0 +1,91 @@
1
+ import {
2
+ dialogMessageKey
3
+ } from "./chunk-PN7AFLOK.js";
4
+ import {
5
+ asOptionalFiniteNumber
6
+ } from "./chunk-WWC7I6TA.js";
7
+ import {
8
+ asOptionalTrimmedString
9
+ } from "./chunk-G3SUCT4W.js";
10
+
11
+ // packages/core/chat/dialogAttachmentCleanup.ts
12
+ var FILE_CONTENT_RE = /(?:https?:\/\/[^/"'\s]+)?\/api\/v1\/db\/file\/content\/([^?#"'\s)]+)/g;
13
+ function extractFileContentIds(value) {
14
+ const ids = /* @__PURE__ */ new Set();
15
+ const visit = (input) => {
16
+ if (typeof input === "string") {
17
+ for (const match of input.matchAll(FILE_CONTENT_RE)) {
18
+ const fileId = decodeURIComponent(match[1] ?? "").trim();
19
+ if (fileId) ids.add(fileId);
20
+ }
21
+ return;
22
+ }
23
+ if (Array.isArray(input)) {
24
+ for (const item of input) visit(item);
25
+ return;
26
+ }
27
+ if (input && typeof input === "object") {
28
+ for (const item of Object.values(input)) visit(item);
29
+ }
30
+ };
31
+ visit(value);
32
+ return [...ids];
33
+ }
34
+ function messageDbKey(dialogId, message) {
35
+ const dbKey = asOptionalTrimmedString(message.dbKey);
36
+ if (dbKey) return dbKey;
37
+ const id = asOptionalTrimmedString(message.id);
38
+ if (id) return dialogMessageKey(dialogId, id);
39
+ return null;
40
+ }
41
+ function asText(value) {
42
+ return asOptionalTrimmedString(value) ?? null;
43
+ }
44
+ function buildDialogAttachmentPlan(args) {
45
+ const messageKeys = new Set(
46
+ args.messages.map((message) => messageDbKey(args.dialogId, message)).filter((key) => Boolean(key))
47
+ );
48
+ const referencedFileIds = [
49
+ ...new Set(args.messages.flatMap((message) => extractFileContentIds(message)))
50
+ ];
51
+ const candidates = referencedFileIds.map((fileId) => {
52
+ const metadata = args.metadataByFileId[fileId];
53
+ const ownerType = asText(metadata?.ownerType);
54
+ const ownerId = asText(metadata?.ownerId);
55
+ const ownerDbKey = asText(metadata?.ownerDbKey);
56
+ const fileDbKey = asText(metadata?.dbKey);
57
+ const source = asText(metadata?.source);
58
+ const ownedByDialog = ownerType === "dialog" && ownerId === args.dialogId;
59
+ const ownedByMessage = Boolean(ownerDbKey && messageKeys.has(ownerDbKey));
60
+ const userOwnedReferenced = args.includeUserOwnedReferenced === true && Boolean(args.ownerId) && ownerType === "user" && ownerId === args.ownerId;
61
+ const canDelete = Boolean(fileDbKey && (ownedByDialog || ownedByMessage || userOwnedReferenced));
62
+ return {
63
+ fileId,
64
+ fileDbKey,
65
+ size: asOptionalFiniteNumber(metadata?.size) ?? null,
66
+ ownerType,
67
+ ownerId,
68
+ ownerDbKey,
69
+ source,
70
+ status: canDelete ? "delete" : "retain",
71
+ reason: canDelete ? ownedByMessage ? "ownerDbKey matches a message in this dialog" : userOwnedReferenced ? "user-owned file is referenced by this dialog and explicit referenced-attachment deletion is enabled" : "ownerType/ownerId matches this dialog" : fileDbKey ? "file ownership is not exclusive to this dialog" : "file metadata not found"
72
+ };
73
+ });
74
+ const deleteCandidates = candidates.filter((candidate) => candidate.status === "delete");
75
+ const retainedCandidates = candidates.filter((candidate) => candidate.status === "retain");
76
+ return {
77
+ dialogId: args.dialogId,
78
+ messageCount: args.messages.length,
79
+ referencedFileIds,
80
+ candidates,
81
+ deleteCandidates,
82
+ retainedCandidates,
83
+ bytesToDelete: deleteCandidates.reduce((sum, candidate) => sum + (candidate.size ?? 0), 0),
84
+ metadataReadFailures: args.metadataReadFailures ?? []
85
+ };
86
+ }
87
+
88
+ export {
89
+ extractFileContentIds,
90
+ buildDialogAttachmentPlan
91
+ };