nolo-cli 0.8.0 → 0.9.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/_executeModel-UD44KGZ4.js +203 -0
- package/action-ZJWE3Y5S.js +28 -0
- package/addContentAction-TVDBNJM5.js +26 -0
- package/addDialogAgentAction-EKH774VT.js +68 -0
- package/agentDeleteCommand-TCPEFJTF.js +327 -0
- package/agentEmailCommands-CZ3UILZ4.js +626 -0
- package/agentListCommands-SJKO2FFB.js +223 -0
- package/agentMachineCommands-PSNABISZ.js +425 -0
- package/agentPullCommand-O2MTUAFR.js +122 -0
- package/agentRecordCommands-MH2JKFHS.js +94 -0
- package/agentRunCommand-4KH6MIZR.js +110 -0
- package/agentRunControl-K4VKNEHF.js +57 -0
- package/agentRuntimeLocal-SKHJUWSS.js +104 -0
- package/agentSlice-3WXXN4VK.js +42 -0
- package/authCommand-PXFX6JDT.js +581 -0
- package/authCommands-356AYWEK.js +35 -0
- package/chunk-2EISRLRC.js +238 -0
- package/chunk-2FTTDCD4.js +675 -0
- package/chunk-2K2ECKSG.js +222 -0
- package/chunk-2PUGVR6E.js +19 -0
- package/chunk-3ASDTTEI.js +1774 -0
- package/chunk-3EUW3WEO.js +8 -0
- package/chunk-3LY4F7SV.js +9293 -0
- package/chunk-3TZDXYSF.js +71 -0
- package/chunk-3WYQEUBI.js +34 -0
- package/chunk-4CQLVGRV.js +50 -0
- package/chunk-4IJYA27C.js +342 -0
- package/chunk-4K2KKCSD.js +577 -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-5PJ3VWCS.js +360 -0
- package/chunk-63SLEOLK.js +175 -0
- package/chunk-63W5N6P3.js +150 -0
- package/chunk-6GANEXVO.js +231 -0
- package/chunk-6HYVJV7B.js +102 -0
- package/chunk-6WD3OOJS.js +20 -0
- package/chunk-7OOXPE3N.js +628 -0
- package/chunk-7QRKCBOP.js +1078 -0
- package/chunk-ATNTHIZI.js +13 -0
- package/chunk-AUQ747NZ.js +902 -0
- package/chunk-AVMKZHBC.js +85 -0
- package/chunk-AZPCASRE.js +36 -0
- package/chunk-BBYVOSU2.js +792 -0
- package/chunk-C3RUNRHT.js +51 -0
- package/chunk-CF2WZF4N.js +134 -0
- package/chunk-CF7PE763.js +10 -0
- package/chunk-CKOJQDKR.js +198 -0
- package/chunk-COMXDWNM.js +807 -0
- package/chunk-CPB2YM4D.js +171 -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-ELRRLDWI.js +478 -0
- package/chunk-EXTIQUCI.js +482 -0
- package/chunk-EYEEHCU4.js +3066 -0
- package/chunk-G3SUCT4W.js +8 -0
- package/chunk-G43KEVSC.js +1447 -0
- package/chunk-GAKEBQD6.js +30 -0
- package/chunk-GBRG75BQ.js +86 -0
- package/chunk-GG4AJPSR.js +191 -0
- package/chunk-H33743XH.js +25 -0
- package/chunk-HNMXYYJR.js +12 -0
- package/chunk-I42VC5KR.js +15 -0
- package/chunk-IDZTNRP2.js +85 -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-KKY4B2Q2.js +21 -0
- package/chunk-KOCA5FCS.js +4750 -0
- package/chunk-KQHGZWSV.js +63 -0
- package/chunk-KTVVPRJS.js +138 -0
- package/chunk-KUG52IAP.js +8 -0
- package/chunk-KX6YBIHG.js +8 -0
- package/chunk-LARL2V6G.js +9017 -0
- package/chunk-LCBAMY2M.js +60 -0
- package/chunk-LM6IYQ3F.js +16 -0
- package/chunk-M76ECQRD.js +13658 -0
- package/chunk-MGOJ5R6J.js +113 -0
- package/chunk-MKMWT7SA.js +27196 -0
- package/chunk-MRC4Q34M.js +188 -0
- package/chunk-OLZBQWZU.js +6 -0
- package/chunk-OPZYGHUC.js +89 -0
- package/chunk-OWOHNGCN.js +50 -0
- package/chunk-PAKN26FP.js +239 -0
- package/chunk-PCWC3JTN.js +91 -0
- package/chunk-PG5PNA7Y.js +939 -0
- package/chunk-Q2YZULBH.js +104 -0
- package/chunk-QSJ3HFEF.js +8 -0
- package/chunk-QYXLLLGL.js +4519 -0
- package/chunk-ROWQEJRP.js +139 -0
- package/chunk-S7Z2HMCN.js +25 -0
- package/chunk-SBR32ZZS.js +1901 -0
- package/chunk-SH2CFQOH.js +3391 -0
- package/chunk-SL35K7AH.js +226 -0
- package/chunk-TILFE6LV.js +381 -0
- package/chunk-TSS3XJY4.js +2052 -0
- package/chunk-U4TRT5V4.js +246 -0
- package/chunk-U6VC4MU4.js +8 -0
- package/chunk-UAD2WT54.js +64 -0
- package/chunk-UUJDGGAK.js +421 -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-W4NVOSFF.js +37 -0
- package/chunk-WKM6FH35.js +190 -0
- package/chunk-WWC7I6TA.js +8 -0
- package/chunk-X7W4TNB4.js +1550 -0
- package/chunk-XE635NI4.js +1948 -0
- package/chunk-XKIMRZO2.js +221 -0
- package/chunk-XS466O7S.js +933 -0
- package/chunk-Y5GCAMGP.js +9 -0
- package/chunk-YBWOP46I.js +3272 -0
- package/chunk-YPRZSPF3.js +148 -0
- package/chunk-YYUCRDOK.js +69 -0
- package/chunk-Z4NR32XR.js +50 -0
- package/chunk-ZIG5LJ7X.js +24765 -0
- package/chunk-ZNFJWEN4.js +56 -0
- package/chunk-ZQ2UM4KG.js +2878 -0
- package/cliExecutor-DNE7TCC4.js +36 -0
- package/clipboardy-BVE3LVEH.js +12001 -0
- package/createAgentAutomationAction-63OIP6X5.js +866 -0
- package/createDialogAction-ZLYZDYBB.js +54 -0
- package/createPageAction-AL5FSDCK.js +171 -0
- package/db-HCJ5PRB5.js +271 -0
- package/dbSlice-PR44QPXY.js +60 -0
- package/deleteFile-4SKGPHOZ.js +41 -0
- package/dialogCommands-F6YI5742.js +63 -0
- package/dialogSlice-JSBNZRLR.js +148 -0
- package/docCreateCommands-4CTO7ERT.js +219 -0
- package/docDeleteCommands-VBWERDRG.js +180 -0
- package/docReadCommands-KNP4MFYB.js +133 -0
- package/docStore-ADP5VYY4.js +98 -0
- package/docUpdateCommands-4BCBJQHA.js +317 -0
- package/fetchMessages-U6ZHN56A.js +17 -0
- package/getPricing-3E6UNPKL.js +30 -0
- package/handleSendMessageAction-IJDQ6ARA.js +185 -0
- package/index.js +188 -112943
- package/lib-FYYBQIXS.js +19839 -0
- package/localDialogRead-Z5UTAJPU.js +26 -0
- package/localFirstLog-DHNOY2NA.js +19 -0
- package/localRuntimeAuthority-TEGCOWX4.js +471 -0
- package/localRuntimeDb-LGDF6FQP.js +12 -0
- package/machineCommands-EA3M4XTN.js +779 -0
- package/machineInfo-M6KB6HZN.js +10 -0
- package/machineWsRunDispatch-NAPKE5ZA.js +110 -0
- package/memoryCommands-O4MIPIWQ.js +476 -0
- package/models-4OPOOLFS.js +9 -0
- package/offlineMarxistsAgentCommand-BCPJITJL.js +242 -0
- package/package.json +3 -25
- package/read-RIJCIVKX.js +17 -0
- package/readDocTool-GZD2N3LO.js +16 -0
- package/readlineWorkspace-KMWT4T4S.js +5509 -0
- package/removeDialogAgentAction-GJQJNDW6.js +73 -0
- package/runAgentClientLoop-U5Q6NDTJ.js +291 -0
- package/runtimeDoctorCommands-LRHLPDRC.js +289 -0
- package/setDialogExtraReferencesAction-M7OQG54N.js +60 -0
- package/setPrimaryDialogAgentAction-46UNFJDL.js +80 -0
- package/settingSlice-FVUUH4JA.js +199 -0
- package/skillSummaryMarker-42HKSXYY.js +9 -0
- package/slateToRenderMarkdown-Y5IYN73U.js +7 -0
- package/slateUtils-2M7MUTWX.js +19 -0
- package/spaceCommands-E2CFRPZJ.js +454 -0
- package/spaceSlice-L3R6IMXE.js +147 -0
- package/streamAgentChatTurn-UBDAOQWE.js +4528 -0
- package/tableCommands-GOFP7QKA.js +1286 -0
- package/toolApiClient-QI3YBNWB.js +26 -0
- package/tools-TMJXZTCA.js +85 -0
- package/tuiSummaryLlmCaller-RV3THLZF.js +78 -0
- package/understanding-GQKNDDWM.js +271 -0
- package/updateCommands-VOSPKXFF.js +31 -0
- package/updateDialogTitleAction-ZTWRDXI2.js +188 -0
|
@@ -0,0 +1,206 @@
|
|
|
1
|
+
import {
|
|
2
|
+
extractCustomId
|
|
3
|
+
} from "./chunk-DFFIZ25G.js";
|
|
4
|
+
import {
|
|
5
|
+
getActiveDialogKey
|
|
6
|
+
} from "./chunk-3ASDTTEI.js";
|
|
7
|
+
import {
|
|
8
|
+
compactWhitespace
|
|
9
|
+
} from "./chunk-DWLEOOGR.js";
|
|
10
|
+
import {
|
|
11
|
+
asTrimmedLowercaseString
|
|
12
|
+
} from "./chunk-QSJ3HFEF.js";
|
|
13
|
+
import {
|
|
14
|
+
isRecord
|
|
15
|
+
} from "./chunk-KUG52IAP.js";
|
|
16
|
+
|
|
17
|
+
// packages/ai/tools/toolApiClient.ts
|
|
18
|
+
var MAIN_SERVER = "https://nolo.chat";
|
|
19
|
+
var getIsDesktopApp = () => typeof window !== "undefined" && Boolean(window.__NOLO_DESKTOP__);
|
|
20
|
+
var isLocalServerUrl = (value) => {
|
|
21
|
+
if (!value) return false;
|
|
22
|
+
try {
|
|
23
|
+
const hostname = new URL(value).hostname.toLowerCase();
|
|
24
|
+
return hostname === "localhost" || hostname === "127.0.0.1" || hostname === "::1";
|
|
25
|
+
} catch {
|
|
26
|
+
return false;
|
|
27
|
+
}
|
|
28
|
+
};
|
|
29
|
+
var resolveDesktopSafeServer = (value) => {
|
|
30
|
+
if (!getIsDesktopApp()) return value || MAIN_SERVER;
|
|
31
|
+
return isLocalServerUrl(value) ? MAIN_SERVER : value || MAIN_SERVER;
|
|
32
|
+
};
|
|
33
|
+
var selectCurrentServerFromState = (state) => resolveDesktopSafeServer(state?.settings?.currentServer);
|
|
34
|
+
var selectCurrentTokenFromState = (state) => typeof state?.auth?.currentToken === "string" ? state.auth.currentToken : null;
|
|
35
|
+
var selectCurrentDialogKeyFromState = (_state) => getActiveDialogKey();
|
|
36
|
+
var resolveToolBaseUrl = (currentServer) => {
|
|
37
|
+
const _window = globalThis.window;
|
|
38
|
+
if (!_window) return (currentServer || "").replace(/\/+$/, "");
|
|
39
|
+
const fallbackLocal = _window.location.origin;
|
|
40
|
+
if (!currentServer) return fallbackLocal;
|
|
41
|
+
return currentServer.replace(/\/+$/, "");
|
|
42
|
+
};
|
|
43
|
+
var DESKTOP_LOCAL_TOOL_PATHS = /* @__PURE__ */ new Set([
|
|
44
|
+
"/api/exec-shell",
|
|
45
|
+
"/api/check-env",
|
|
46
|
+
"/api/read-file",
|
|
47
|
+
"/api/write-file",
|
|
48
|
+
"/api/apply-edit",
|
|
49
|
+
"/api/apply-line-edits",
|
|
50
|
+
"/api/code-search",
|
|
51
|
+
"/api/search-repo",
|
|
52
|
+
"/api/desktop/files/roots",
|
|
53
|
+
"/api/desktop/files/roots/request",
|
|
54
|
+
"/api/desktop/files/list",
|
|
55
|
+
"/api/desktop/files/read",
|
|
56
|
+
"/api/desktop/files/plan",
|
|
57
|
+
"/api/desktop/files/approve",
|
|
58
|
+
"/api/desktop/files/execute",
|
|
59
|
+
"/api/desktop/files/undo",
|
|
60
|
+
"/api/desktop/files/history"
|
|
61
|
+
]);
|
|
62
|
+
var getWindowOrigin = () => {
|
|
63
|
+
const _window = globalThis.window;
|
|
64
|
+
const origin = _window?.location?.origin;
|
|
65
|
+
return typeof origin === "string" && origin ? origin.replace(/\/+$/, "") : null;
|
|
66
|
+
};
|
|
67
|
+
var resolveToolApiBaseUrl = (currentServer, path) => {
|
|
68
|
+
if (path && DESKTOP_LOCAL_TOOL_PATHS.has(path) && getIsDesktopApp()) {
|
|
69
|
+
const localOrigin = getWindowOrigin();
|
|
70
|
+
if (localOrigin) return localOrigin;
|
|
71
|
+
}
|
|
72
|
+
return resolveToolBaseUrl(currentServer);
|
|
73
|
+
};
|
|
74
|
+
var getRequestConfig = (thunkApi) => {
|
|
75
|
+
const state = thunkApi.getState();
|
|
76
|
+
const currentServer = selectCurrentServerFromState(state);
|
|
77
|
+
const token = selectCurrentTokenFromState(state);
|
|
78
|
+
if (!currentServer) throw new Error("\u65E0\u6CD5\u83B7\u53D6\u5F53\u524D\u670D\u52A1\u5668\u5730\u5740\u3002");
|
|
79
|
+
return { currentServer, token };
|
|
80
|
+
};
|
|
81
|
+
var getToolBaseUrl = (thunkApi) => {
|
|
82
|
+
const { currentServer } = getRequestConfig(thunkApi);
|
|
83
|
+
const baseUrl = resolveToolBaseUrl(currentServer);
|
|
84
|
+
if (!baseUrl) throw new Error("\u65E0\u6CD5\u83B7\u53D6\u5DE5\u5177\u670D\u52A1\u5668\u5730\u5740\u3002");
|
|
85
|
+
return baseUrl;
|
|
86
|
+
};
|
|
87
|
+
var getToolRequestContext = (thunkApi) => {
|
|
88
|
+
const { currentServer, token } = getRequestConfig(thunkApi);
|
|
89
|
+
const baseUrl = resolveToolBaseUrl(currentServer);
|
|
90
|
+
if (!baseUrl) throw new Error("\u65E0\u6CD5\u83B7\u53D6\u5DE5\u5177\u670D\u52A1\u5668\u5730\u5740\u3002");
|
|
91
|
+
return {
|
|
92
|
+
currentServer,
|
|
93
|
+
token,
|
|
94
|
+
baseUrl
|
|
95
|
+
};
|
|
96
|
+
};
|
|
97
|
+
var maybeAttachDialogId = (thunkApi, body) => {
|
|
98
|
+
if (!isRecord(body)) return body;
|
|
99
|
+
if ("dialogId" in body) return body;
|
|
100
|
+
const state = thunkApi.getState();
|
|
101
|
+
const currentDialogKey = selectCurrentDialogKeyFromState(state);
|
|
102
|
+
const dialogId = currentDialogKey ? extractCustomId(currentDialogKey) : null;
|
|
103
|
+
if (!dialogId) return body;
|
|
104
|
+
return {
|
|
105
|
+
...body,
|
|
106
|
+
dialogId
|
|
107
|
+
};
|
|
108
|
+
};
|
|
109
|
+
var ToolApiError = class extends Error {
|
|
110
|
+
status;
|
|
111
|
+
code;
|
|
112
|
+
details;
|
|
113
|
+
constructor(message, options) {
|
|
114
|
+
super(message);
|
|
115
|
+
this.name = "ToolApiError";
|
|
116
|
+
this.status = options?.status;
|
|
117
|
+
this.code = options?.code;
|
|
118
|
+
this.details = options?.details;
|
|
119
|
+
}
|
|
120
|
+
};
|
|
121
|
+
var buildToolRequestHeaders = (thunkApi, options = {}) => {
|
|
122
|
+
const { withAuth = false, agentKey } = options;
|
|
123
|
+
const { token } = getRequestConfig(thunkApi);
|
|
124
|
+
const headers = { "Content-Type": "application/json" };
|
|
125
|
+
if (withAuth && token) {
|
|
126
|
+
headers["Authorization"] = `Bearer ${token}`;
|
|
127
|
+
}
|
|
128
|
+
if (agentKey && typeof agentKey === "string" && agentKey.trim()) {
|
|
129
|
+
headers["X-Nolo-Agent-Key"] = agentKey.trim();
|
|
130
|
+
}
|
|
131
|
+
if (typeof window !== "undefined" && window.__NOLO_DESKTOP__) {
|
|
132
|
+
headers["X-Nolo-Desktop-Tool"] = "1";
|
|
133
|
+
}
|
|
134
|
+
return headers;
|
|
135
|
+
};
|
|
136
|
+
var buildResponsePreview = (text) => compactWhitespace(text).slice(0, 240);
|
|
137
|
+
var looksLikeHtmlResponse = (text, contentType) => {
|
|
138
|
+
if (contentType?.toLowerCase().includes("text/html")) return true;
|
|
139
|
+
const trimmed = asTrimmedLowercaseString(text);
|
|
140
|
+
return trimmed.startsWith("<!doctype html") || trimmed.startsWith("<html");
|
|
141
|
+
};
|
|
142
|
+
async function callToolApi(thunkApi, path, body, options = {}) {
|
|
143
|
+
const { currentServer } = getRequestConfig(thunkApi);
|
|
144
|
+
const baseUrl = resolveToolApiBaseUrl(currentServer, path);
|
|
145
|
+
if (!baseUrl) throw new Error("\u65E0\u6CD5\u83B7\u53D6\u5DE5\u5177\u670D\u52A1\u5668\u5730\u5740\u3002");
|
|
146
|
+
const url = `${baseUrl}${path}`;
|
|
147
|
+
const headers = buildToolRequestHeaders(thunkApi, options);
|
|
148
|
+
const response = await fetch(url, {
|
|
149
|
+
method: "POST",
|
|
150
|
+
headers,
|
|
151
|
+
body: JSON.stringify(maybeAttachDialogId(thunkApi, body))
|
|
152
|
+
});
|
|
153
|
+
const contentType = response.headers.get("content-type");
|
|
154
|
+
const responseText = await response.text();
|
|
155
|
+
if (!response.ok) {
|
|
156
|
+
let errorMessage = `API \u8BF7\u6C42\u5931\u8D25\uFF0C\u72B6\u6001\u7801: ${response.status}`;
|
|
157
|
+
let errorCode;
|
|
158
|
+
let errorDetails;
|
|
159
|
+
try {
|
|
160
|
+
const errorData = JSON.parse(responseText);
|
|
161
|
+
const err = errorData?.error;
|
|
162
|
+
if (err) {
|
|
163
|
+
errorMessage += `: ${err.message ?? JSON.stringify(err)}`;
|
|
164
|
+
errorCode = typeof err.code === "string" ? err.code : void 0;
|
|
165
|
+
errorDetails = err.details;
|
|
166
|
+
}
|
|
167
|
+
} catch {
|
|
168
|
+
errorCode = looksLikeHtmlResponse(responseText, contentType) ? "HTML_ERROR_RESPONSE" : "NON_JSON_ERROR_RESPONSE";
|
|
169
|
+
errorDetails = {
|
|
170
|
+
contentType,
|
|
171
|
+
responsePreview: buildResponsePreview(responseText)
|
|
172
|
+
};
|
|
173
|
+
if (typeof errorDetails.responsePreview === "string" && errorDetails.responsePreview) {
|
|
174
|
+
errorMessage += `: ${errorDetails.responsePreview}`;
|
|
175
|
+
}
|
|
176
|
+
}
|
|
177
|
+
throw new ToolApiError(errorMessage, {
|
|
178
|
+
status: response.status,
|
|
179
|
+
code: errorCode,
|
|
180
|
+
details: errorDetails
|
|
181
|
+
});
|
|
182
|
+
}
|
|
183
|
+
try {
|
|
184
|
+
return JSON.parse(responseText);
|
|
185
|
+
} catch {
|
|
186
|
+
throw new ToolApiError("\u670D\u52A1\u7AEF\u8FD4\u56DE\u4E86\u65E0\u6CD5\u89E3\u6790\u7684\u975E JSON \u54CD\u5E94", {
|
|
187
|
+
status: response.status,
|
|
188
|
+
code: looksLikeHtmlResponse(responseText, contentType) ? "HTML_RESPONSE" : "INVALID_JSON_RESPONSE",
|
|
189
|
+
details: {
|
|
190
|
+
contentType,
|
|
191
|
+
responsePreview: buildResponsePreview(responseText)
|
|
192
|
+
}
|
|
193
|
+
});
|
|
194
|
+
}
|
|
195
|
+
}
|
|
196
|
+
|
|
197
|
+
export {
|
|
198
|
+
resolveToolBaseUrl,
|
|
199
|
+
resolveToolApiBaseUrl,
|
|
200
|
+
getRequestConfig,
|
|
201
|
+
getToolBaseUrl,
|
|
202
|
+
getToolRequestContext,
|
|
203
|
+
ToolApiError,
|
|
204
|
+
buildToolRequestHeaders,
|
|
205
|
+
callToolApi
|
|
206
|
+
};
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
import {
|
|
2
|
+
compactWhitespace
|
|
3
|
+
} from "./chunk-DWLEOOGR.js";
|
|
4
|
+
|
|
5
|
+
// packages/core/clipCompactText.ts
|
|
6
|
+
function clipCompactText(value, max, ellipsis = "...") {
|
|
7
|
+
const compact = compactWhitespace(value);
|
|
8
|
+
if (compact.length <= max) return compact;
|
|
9
|
+
if (max <= ellipsis.length) return compact.slice(0, max);
|
|
10
|
+
return `${compact.slice(0, max - ellipsis.length)}${ellipsis}`;
|
|
11
|
+
}
|
|
12
|
+
|
|
13
|
+
export {
|
|
14
|
+
clipCompactText
|
|
15
|
+
};
|
|
@@ -0,0 +1,360 @@
|
|
|
1
|
+
import {
|
|
2
|
+
readDbRecord,
|
|
3
|
+
writeAgentRecord
|
|
4
|
+
} from "./chunk-7OOXPE3N.js";
|
|
5
|
+
import {
|
|
6
|
+
buildSkillSummaryMarker
|
|
7
|
+
} from "./chunk-VF4K2QE6.js";
|
|
8
|
+
import {
|
|
9
|
+
buildSkillDocMarkdown
|
|
10
|
+
} from "./chunk-ZQ2UM4KG.js";
|
|
11
|
+
import {
|
|
12
|
+
createSpaceKey
|
|
13
|
+
} from "./chunk-UAD2WT54.js";
|
|
14
|
+
import {
|
|
15
|
+
parseUserIdFromAuthToken,
|
|
16
|
+
readOption,
|
|
17
|
+
resolveAuthToken,
|
|
18
|
+
resolveServerUrl
|
|
19
|
+
} from "./chunk-ISNCLGUZ.js";
|
|
20
|
+
import {
|
|
21
|
+
require_index_umd
|
|
22
|
+
} from "./chunk-SH2CFQOH.js";
|
|
23
|
+
import {
|
|
24
|
+
asTrimmedLowercaseString
|
|
25
|
+
} from "./chunk-QSJ3HFEF.js";
|
|
26
|
+
import {
|
|
27
|
+
DEFAULT_LOCAL_API_ORIGIN
|
|
28
|
+
} from "./chunk-4SN6J65J.js";
|
|
29
|
+
import {
|
|
30
|
+
NOLO_CLUSTER_SERVERS
|
|
31
|
+
} from "./chunk-LCBAMY2M.js";
|
|
32
|
+
import {
|
|
33
|
+
normalizeServerOrigin
|
|
34
|
+
} from "./chunk-CF7PE763.js";
|
|
35
|
+
import {
|
|
36
|
+
__toESM
|
|
37
|
+
} from "./chunk-4VNS5WPM.js";
|
|
38
|
+
|
|
39
|
+
// packages/cli/docPageHelpers.ts
|
|
40
|
+
var import_ulid = __toESM(require_index_umd(), 1);
|
|
41
|
+
import { readFileSync } from "node:fs";
|
|
42
|
+
function getCliArg(args, flag) {
|
|
43
|
+
const idx = args.indexOf(flag);
|
|
44
|
+
return idx !== -1 ? args[idx + 1] : void 0;
|
|
45
|
+
}
|
|
46
|
+
function readBodyArg(args, fallback = "") {
|
|
47
|
+
const bodyFile = getCliArg(args, "--body-file");
|
|
48
|
+
if (bodyFile !== void 0) {
|
|
49
|
+
return readFileSync(bodyFile, "utf8");
|
|
50
|
+
}
|
|
51
|
+
return getCliArg(args, "--body") ?? fallback;
|
|
52
|
+
}
|
|
53
|
+
function textToSlate(text) {
|
|
54
|
+
return text.split("\n").map((line) => ({
|
|
55
|
+
type: "paragraph",
|
|
56
|
+
children: [{ text: line }]
|
|
57
|
+
}));
|
|
58
|
+
}
|
|
59
|
+
function createPageId() {
|
|
60
|
+
return (0, import_ulid.ulid)();
|
|
61
|
+
}
|
|
62
|
+
function buildPageKey(userId, pageId) {
|
|
63
|
+
return `page-${userId}-${pageId}`;
|
|
64
|
+
}
|
|
65
|
+
function buildPageRecord(args) {
|
|
66
|
+
const { dbKey, pageId, title, spaceId, content, existing, meta, slateData } = args;
|
|
67
|
+
const now = Date.now();
|
|
68
|
+
const createdAt = typeof existing?.createdAt === "number" ? existing.createdAt : now;
|
|
69
|
+
const created = typeof existing?.created === "string" ? existing.created : new Date(createdAt).toISOString();
|
|
70
|
+
const nextRecord = {
|
|
71
|
+
...existing ?? {},
|
|
72
|
+
id: existing?.id ?? pageId,
|
|
73
|
+
dbKey,
|
|
74
|
+
type: "page",
|
|
75
|
+
title,
|
|
76
|
+
spaceId,
|
|
77
|
+
content,
|
|
78
|
+
updatedAt: now,
|
|
79
|
+
createdAt,
|
|
80
|
+
created
|
|
81
|
+
};
|
|
82
|
+
if (meta !== void 0) {
|
|
83
|
+
if (meta === null) {
|
|
84
|
+
delete nextRecord.meta;
|
|
85
|
+
} else {
|
|
86
|
+
nextRecord.meta = meta;
|
|
87
|
+
}
|
|
88
|
+
}
|
|
89
|
+
if (slateData !== void 0) {
|
|
90
|
+
if (slateData === null) {
|
|
91
|
+
delete nextRecord.slateData;
|
|
92
|
+
} else {
|
|
93
|
+
nextRecord.slateData = slateData;
|
|
94
|
+
}
|
|
95
|
+
} else if (!existing?.slateData) {
|
|
96
|
+
nextRecord.slateData = textToSlate(content);
|
|
97
|
+
}
|
|
98
|
+
return nextRecord;
|
|
99
|
+
}
|
|
100
|
+
|
|
101
|
+
// packages/cli/docSkillHelpers.ts
|
|
102
|
+
function normalizeSkillSeed(input) {
|
|
103
|
+
return input.trim().toLowerCase().replace(/[^a-z0-9\u4e00-\u9fa5]+/g, "-").replace(/^-+|-+$/g, "");
|
|
104
|
+
}
|
|
105
|
+
function deterministicId(prefix, seed) {
|
|
106
|
+
let h = 2166136261;
|
|
107
|
+
for (let i = 0; i < seed.length; i++) {
|
|
108
|
+
h ^= seed.charCodeAt(i);
|
|
109
|
+
h = h * 16777619 >>> 0;
|
|
110
|
+
}
|
|
111
|
+
const suffix = h.toString(36).toUpperCase().padStart(14, "0");
|
|
112
|
+
return (prefix + suffix).slice(0, 26);
|
|
113
|
+
}
|
|
114
|
+
function buildSkillDocId(input) {
|
|
115
|
+
return deterministicId("01SK", normalizeSkillSeed(input) || input);
|
|
116
|
+
}
|
|
117
|
+
function buildSkillPageKey(userId, skillId) {
|
|
118
|
+
return buildPageKey(userId, skillId);
|
|
119
|
+
}
|
|
120
|
+
function buildSkillPageRecord(args) {
|
|
121
|
+
const {
|
|
122
|
+
dbKey,
|
|
123
|
+
skillId,
|
|
124
|
+
title,
|
|
125
|
+
spaceId,
|
|
126
|
+
body,
|
|
127
|
+
skillConfig,
|
|
128
|
+
evalConfig,
|
|
129
|
+
workflowConfig,
|
|
130
|
+
existing
|
|
131
|
+
} = args;
|
|
132
|
+
return {
|
|
133
|
+
...buildPageRecord({
|
|
134
|
+
dbKey,
|
|
135
|
+
pageId: skillId,
|
|
136
|
+
title,
|
|
137
|
+
spaceId,
|
|
138
|
+
content: buildSkillDocMarkdown({
|
|
139
|
+
body,
|
|
140
|
+
skillConfig,
|
|
141
|
+
evalConfig,
|
|
142
|
+
workflowConfig
|
|
143
|
+
}),
|
|
144
|
+
existing,
|
|
145
|
+
meta: {
|
|
146
|
+
...existing?.meta ?? {},
|
|
147
|
+
kind: "skill",
|
|
148
|
+
skillConfig,
|
|
149
|
+
...evalConfig ? { evalConfig } : {},
|
|
150
|
+
...workflowConfig ? { workflowConfig } : {}
|
|
151
|
+
},
|
|
152
|
+
slateData: null
|
|
153
|
+
})
|
|
154
|
+
};
|
|
155
|
+
}
|
|
156
|
+
function parseJsonArg(raw, fallback) {
|
|
157
|
+
if (raw === void 0) return fallback;
|
|
158
|
+
return JSON.parse(raw);
|
|
159
|
+
}
|
|
160
|
+
|
|
161
|
+
// packages/cli/docSpaceHelpers.ts
|
|
162
|
+
async function ensurePageAttachedToSpace(params) {
|
|
163
|
+
const { baseUrl, userId, authToken, spaceId, contentKey, title, skillSummary } = params;
|
|
164
|
+
const spaceKey = createSpaceKey.space(spaceId);
|
|
165
|
+
const spaceRecord = await readDbRecord({
|
|
166
|
+
dbKey: spaceKey,
|
|
167
|
+
authToken,
|
|
168
|
+
fetchImpl: fetch,
|
|
169
|
+
serverUrl: baseUrl
|
|
170
|
+
});
|
|
171
|
+
const now = Date.now();
|
|
172
|
+
await writeAgentRecord({
|
|
173
|
+
agentKey: spaceKey,
|
|
174
|
+
authToken,
|
|
175
|
+
fetchImpl: fetch,
|
|
176
|
+
serverUrl: baseUrl,
|
|
177
|
+
userId,
|
|
178
|
+
record: {
|
|
179
|
+
...spaceRecord,
|
|
180
|
+
contents: {
|
|
181
|
+
...spaceRecord.contents ?? {},
|
|
182
|
+
[contentKey]: {
|
|
183
|
+
...spaceRecord.contents?.[contentKey] ?? {},
|
|
184
|
+
title,
|
|
185
|
+
type: "page",
|
|
186
|
+
contentKey,
|
|
187
|
+
...skillSummary !== void 0 ? { skillSummary } : {},
|
|
188
|
+
updatedAt: now,
|
|
189
|
+
createdAt: spaceRecord.contents?.[contentKey]?.createdAt ?? now
|
|
190
|
+
}
|
|
191
|
+
},
|
|
192
|
+
updatedAt: now
|
|
193
|
+
}
|
|
194
|
+
});
|
|
195
|
+
}
|
|
196
|
+
async function removePageFromSpace(params) {
|
|
197
|
+
const { baseUrl, userId, authToken, spaceId, contentKey } = params;
|
|
198
|
+
const spaceKey = createSpaceKey.space(spaceId);
|
|
199
|
+
const spaceRecord = await readDbRecord({
|
|
200
|
+
dbKey: spaceKey,
|
|
201
|
+
authToken,
|
|
202
|
+
fetchImpl: fetch,
|
|
203
|
+
serverUrl: baseUrl
|
|
204
|
+
});
|
|
205
|
+
const nextContents = { ...spaceRecord.contents ?? {} };
|
|
206
|
+
delete nextContents[contentKey];
|
|
207
|
+
await writeAgentRecord({
|
|
208
|
+
agentKey: spaceKey,
|
|
209
|
+
authToken,
|
|
210
|
+
fetchImpl: fetch,
|
|
211
|
+
serverUrl: baseUrl,
|
|
212
|
+
userId,
|
|
213
|
+
record: {
|
|
214
|
+
...spaceRecord,
|
|
215
|
+
contents: nextContents,
|
|
216
|
+
updatedAt: Date.now()
|
|
217
|
+
}
|
|
218
|
+
});
|
|
219
|
+
}
|
|
220
|
+
|
|
221
|
+
// packages/cli/docCommandShared.ts
|
|
222
|
+
function hasHelpArg(args) {
|
|
223
|
+
return args.includes("--help") || args.includes("-h");
|
|
224
|
+
}
|
|
225
|
+
function hasFlag(args, flag) {
|
|
226
|
+
return args.includes(flag);
|
|
227
|
+
}
|
|
228
|
+
function normalizeBaseUrl(base) {
|
|
229
|
+
return normalizeServerOrigin(base);
|
|
230
|
+
}
|
|
231
|
+
function localBaseFromEnv(env) {
|
|
232
|
+
return normalizeBaseUrl(env.SCRIPT_LOCAL_BASE_URL || DEFAULT_LOCAL_API_ORIGIN);
|
|
233
|
+
}
|
|
234
|
+
function targetToBase(target, env) {
|
|
235
|
+
const normalized = asTrimmedLowercaseString(target);
|
|
236
|
+
if (normalized === "local") return localBaseFromEnv(env);
|
|
237
|
+
if (normalized === "main") return normalizeBaseUrl(NOLO_CLUSTER_SERVERS[0]);
|
|
238
|
+
if (normalized === "us") return normalizeBaseUrl(NOLO_CLUSTER_SERVERS[1]);
|
|
239
|
+
return normalizeBaseUrl(target);
|
|
240
|
+
}
|
|
241
|
+
function parseSyncTargets(raw, env) {
|
|
242
|
+
if (!raw) return void 0;
|
|
243
|
+
return raw.split(",").map((value) => value.trim()).filter(Boolean).filter((value) => value !== "none").map((value) => targetToBase(value, env));
|
|
244
|
+
}
|
|
245
|
+
function isLocalBaseUrl(baseUrl) {
|
|
246
|
+
try {
|
|
247
|
+
const hostname = new URL(baseUrl).hostname;
|
|
248
|
+
return hostname === "localhost" || hostname === "127.0.0.1";
|
|
249
|
+
} catch {
|
|
250
|
+
return false;
|
|
251
|
+
}
|
|
252
|
+
}
|
|
253
|
+
function resolveWriteTargets(args, env) {
|
|
254
|
+
const explicitSync = parseSyncTargets(readOption(args, "--sync"), env);
|
|
255
|
+
const targets = hasFlag(args, "--local-only") ? [localBaseFromEnv(env)] : explicitSync ?? [resolveServerUrl(args, env)];
|
|
256
|
+
const filtered = hasFlag(args, "--no-local") ? targets.filter((target) => !isLocalBaseUrl(target)) : targets;
|
|
257
|
+
return Array.from(new Set(filtered.map(normalizeBaseUrl)));
|
|
258
|
+
}
|
|
259
|
+
function readTitle(args) {
|
|
260
|
+
const valueFlags = /* @__PURE__ */ new Set([
|
|
261
|
+
"--title",
|
|
262
|
+
"--name",
|
|
263
|
+
"--description",
|
|
264
|
+
"--body",
|
|
265
|
+
"--body-file",
|
|
266
|
+
"--space",
|
|
267
|
+
"--id",
|
|
268
|
+
"--key",
|
|
269
|
+
"--kind",
|
|
270
|
+
"--sync",
|
|
271
|
+
"--tools",
|
|
272
|
+
"--required-skills",
|
|
273
|
+
"--recommended-skills",
|
|
274
|
+
"--preferred-agents",
|
|
275
|
+
"--trigger-mode",
|
|
276
|
+
"--budget-tier",
|
|
277
|
+
"--prompt-patch",
|
|
278
|
+
"--token",
|
|
279
|
+
"--server"
|
|
280
|
+
]);
|
|
281
|
+
return readOption(args, "--title") ?? args.find((value, index) => {
|
|
282
|
+
if (index === 0) return false;
|
|
283
|
+
if (valueFlags.has(args[index - 1])) return false;
|
|
284
|
+
return !value.startsWith("-");
|
|
285
|
+
});
|
|
286
|
+
}
|
|
287
|
+
function resolveDocKind(args, fallback) {
|
|
288
|
+
if (hasFlag(args, "--page") || readOption(args, "--kind") === "page") return "page";
|
|
289
|
+
return fallback;
|
|
290
|
+
}
|
|
291
|
+
function requireTokenUser(args, env, dryRun) {
|
|
292
|
+
const authToken = resolveAuthToken(args, env);
|
|
293
|
+
const userId = parseUserIdFromAuthToken(authToken) || env.USER_ID || "";
|
|
294
|
+
if (!authToken && !dryRun) {
|
|
295
|
+
throw new Error("doc command requires an auth token. Pass --token or set AUTH_TOKEN.");
|
|
296
|
+
}
|
|
297
|
+
if (!userId && !dryRun) {
|
|
298
|
+
throw new Error("auth token does not contain userId. Pass a user-scoped token.");
|
|
299
|
+
}
|
|
300
|
+
return {
|
|
301
|
+
authToken,
|
|
302
|
+
userId: userId || "dry-run"
|
|
303
|
+
};
|
|
304
|
+
}
|
|
305
|
+
async function writePageRecord(args) {
|
|
306
|
+
await writeAgentRecord({
|
|
307
|
+
agentKey: args.dbKey,
|
|
308
|
+
authToken: args.authToken,
|
|
309
|
+
fetchImpl: fetch,
|
|
310
|
+
serverUrl: args.serverUrl,
|
|
311
|
+
userId: args.userId,
|
|
312
|
+
record: args.record
|
|
313
|
+
});
|
|
314
|
+
if (args.spaceId) {
|
|
315
|
+
await ensurePageAttachedToSpace({
|
|
316
|
+
baseUrl: args.serverUrl,
|
|
317
|
+
userId: args.userId,
|
|
318
|
+
authToken: args.authToken,
|
|
319
|
+
spaceId: args.spaceId,
|
|
320
|
+
contentKey: args.dbKey,
|
|
321
|
+
title: args.title,
|
|
322
|
+
skillSummary: args.skillSummary
|
|
323
|
+
});
|
|
324
|
+
}
|
|
325
|
+
}
|
|
326
|
+
async function readPageRecord(args) {
|
|
327
|
+
return readDbRecord({
|
|
328
|
+
dbKey: args.dbKey,
|
|
329
|
+
authToken: args.authToken,
|
|
330
|
+
fetchImpl: fetch,
|
|
331
|
+
serverUrl: args.serverUrl
|
|
332
|
+
});
|
|
333
|
+
}
|
|
334
|
+
function buildSkillSummaryForRecord(record) {
|
|
335
|
+
const meta = record?.meta;
|
|
336
|
+
const skillConfig = meta?.skillConfig;
|
|
337
|
+
if (!skillConfig) return void 0;
|
|
338
|
+
return buildSkillSummaryMarker(meta);
|
|
339
|
+
}
|
|
340
|
+
|
|
341
|
+
export {
|
|
342
|
+
readBodyArg,
|
|
343
|
+
createPageId,
|
|
344
|
+
buildPageKey,
|
|
345
|
+
buildPageRecord,
|
|
346
|
+
buildSkillDocId,
|
|
347
|
+
buildSkillPageKey,
|
|
348
|
+
buildSkillPageRecord,
|
|
349
|
+
parseJsonArg,
|
|
350
|
+
removePageFromSpace,
|
|
351
|
+
hasHelpArg,
|
|
352
|
+
hasFlag,
|
|
353
|
+
resolveWriteTargets,
|
|
354
|
+
readTitle,
|
|
355
|
+
resolveDocKind,
|
|
356
|
+
requireTokenUser,
|
|
357
|
+
writePageRecord,
|
|
358
|
+
readPageRecord,
|
|
359
|
+
buildSkillSummaryForRecord
|
|
360
|
+
};
|