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.
- package/_executeModel-GPU2276G.js +198 -0
- package/action-PAXRPJJF.js +27 -0
- package/addContentAction-CZVWF3QZ.js +25 -0
- package/addDialogAgentAction-CCIDTPHC.js +67 -0
- package/agentDeleteCommand-4ZZFM6AT.js +323 -0
- package/agentEmailCommands-C4FIVQYV.js +621 -0
- package/agentListCommands-VQAKVNEX.js +219 -0
- package/agentMachineCommands-ONFDXZUQ.js +421 -0
- package/agentPullCommand-O2MTUAFR.js +122 -0
- package/agentRecordCommands-QANUGHLK.js +89 -0
- package/agentRunCommand-A3OSRB5Q.js +102 -0
- package/agentRunControl-K4VKNEHF.js +57 -0
- package/agentRuntimeLocal-62ZB2ODP.js +99 -0
- package/agentSlice-GCGLVR2N.js +41 -0
- package/authCommand-WXMD3IPR.js +574 -0
- package/authCommands-X74AFDTC.js +26 -0
- package/chunk-2EISRLRC.js +238 -0
- package/chunk-2FTTDCD4.js +675 -0
- package/chunk-2MALU52L.js +51 -0
- package/chunk-2UZXR7WO.js +3631 -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-4IJYA27C.js +342 -0
- package/chunk-4SN6J65J.js +38 -0
- package/chunk-4VNS5WPM.js +42 -0
- package/chunk-53DNV5AT.js +421 -0
- package/chunk-572EKYLF.js +792 -0
- package/chunk-5MIDPSSK.js +206 -0
- package/chunk-5MMAK75Q.js +15 -0
- package/chunk-63W5N6P3.js +150 -0
- package/chunk-6B7G54GE.js +1078 -0
- package/chunk-6HYVJV7B.js +102 -0
- package/chunk-6WD3OOJS.js +20 -0
- package/chunk-7OC5VCLW.js +929 -0
- package/chunk-7YLKNMOM.js +562 -0
- package/chunk-ATNTHIZI.js +13 -0
- package/chunk-AUGHVUFE.js +69 -0
- package/chunk-AVMKZHBC.js +85 -0
- package/chunk-AZPCASRE.js +36 -0
- package/chunk-BR2WP3DF.js +548 -0
- package/chunk-BSTNFPHD.js +231 -0
- package/chunk-CF2WZF4N.js +134 -0
- package/chunk-CF7PE763.js +10 -0
- package/chunk-CJH2VTEU.js +360 -0
- package/chunk-CKOJQDKR.js +198 -0
- package/chunk-CM54RSSA.js +206 -0
- package/chunk-CQAHS7YO.js +4300 -0
- package/chunk-CWMSB67P.js +34 -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-EYEEHCU4.js +3066 -0
- package/chunk-F6QQI5YI.js +19 -0
- package/chunk-G3SUCT4W.js +8 -0
- package/chunk-G5H7RNFL.js +807 -0
- package/chunk-GAKEBQD6.js +30 -0
- package/chunk-GBRG75BQ.js +86 -0
- package/chunk-GCMRDRCQ.js +190 -0
- package/chunk-GGUO4FKF.js +27158 -0
- package/chunk-GGXABIPP.js +628 -0
- package/chunk-H2RMRZJE.js +113 -0
- package/chunk-H33743XH.js +25 -0
- package/chunk-HEIIIZBX.js +104 -0
- package/chunk-HNMXYYJR.js +12 -0
- package/chunk-I3D64LRJ.js +1447 -0
- package/chunk-IAXBCTTE.js +175 -0
- package/chunk-IDZTNRP2.js +85 -0
- package/chunk-ISNCLGUZ.js +146 -0
- package/chunk-IYQV26RA.js +138 -0
- package/chunk-J4576WMJ.js +91 -0
- package/chunk-J5KV47ZW.js +222 -0
- package/chunk-JBTJAPUF.js +35 -0
- package/chunk-JZPBVBIY.js +94 -0
- package/chunk-KB7YFGL6.js +34 -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-LAWBMYBC.js +171 -0
- package/chunk-LCBAMY2M.js +60 -0
- package/chunk-LM25IZBJ.js +902 -0
- package/chunk-LM6IYQ3F.js +16 -0
- package/chunk-M76ECQRD.js +13658 -0
- package/chunk-MRC4Q34M.js +188 -0
- package/chunk-NXZGF7F7.js +2878 -0
- package/chunk-OF5H3QWS.js +300 -0
- package/chunk-OLZBQWZU.js +6 -0
- package/chunk-OWOHNGCN.js +50 -0
- package/chunk-PN7AFLOK.js +3401 -0
- package/chunk-QR5IPGT3.js +24674 -0
- package/chunk-QSJ3HFEF.js +8 -0
- package/chunk-QYXLLLGL.js +4519 -0
- package/chunk-R2HXWML7.js +1949 -0
- package/chunk-ROWQEJRP.js +139 -0
- package/chunk-S7Z2HMCN.js +25 -0
- package/chunk-SYOF5TAS.js +962 -0
- package/chunk-TDIQFT2F.js +301 -0
- package/chunk-TILFE6LV.js +381 -0
- package/chunk-TZNCFAUP.js +2157 -0
- package/chunk-U4TRT5V4.js +246 -0
- package/chunk-U6VC4MU4.js +8 -0
- package/chunk-UAD2WT54.js +64 -0
- package/chunk-USZMK5UT.js +105 -0
- package/chunk-VEJLAVTC.js +2052 -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-VQ2AJRGD.js +148 -0
- package/chunk-W4NVOSFF.js +37 -0
- package/chunk-WWC7I6TA.js +8 -0
- package/chunk-X7W4TNB4.js +1550 -0
- package/chunk-XBIUN5CR.js +191 -0
- package/chunk-XDVAYP26.js +537 -0
- package/chunk-XKIMRZO2.js +221 -0
- package/chunk-Y5GCAMGP.js +9 -0
- package/chunk-YOUZDXU7.js +9013 -0
- package/chunk-Z4NR32XR.js +50 -0
- package/chunk-ZNFJWEN4.js +56 -0
- package/cliExecutor-DNE7TCC4.js +36 -0
- package/clipboardy-BVE3LVEH.js +12001 -0
- package/createAgentAutomationAction-537X433B.js +864 -0
- package/createDialogAction-YUD4RKBS.js +52 -0
- package/createPageAction-KJMFHL4C.js +169 -0
- package/db-HCJ5PRB5.js +271 -0
- package/dbSlice-C4UJLRZP.js +59 -0
- package/deleteFile-4SKGPHOZ.js +41 -0
- package/dialogCommands-H74KJKHC.js +59 -0
- package/dialogSlice-ETSD4YWS.js +146 -0
- package/docCreateCommands-ADUSU34K.js +215 -0
- package/docDeleteCommands-ZXV3S5OS.js +176 -0
- package/docReadCommands-YYYI6LT7.js +129 -0
- package/docStore-ZBF5DDKR.js +96 -0
- package/docUpdateCommands-7MGJ3BYA.js +313 -0
- package/fetchMessages-JOCYIFKL.js +16 -0
- package/getPricing-PWPJ6MNV.js +30 -0
- package/handleSendMessageAction-MGKI62Y6.js +183 -0
- package/index.js +184 -112288
- package/lib-FYYBQIXS.js +19839 -0
- package/localDialogRead-D3BELSTF.js +26 -0
- package/localFirstLog-DHNOY2NA.js +19 -0
- package/localRuntimeAuthority-TEGCOWX4.js +471 -0
- package/localRuntimeDb-LGDF6FQP.js +12 -0
- package/machineCommands-RMTMN7VQ.js +774 -0
- package/machineInfo-M6KB6HZN.js +10 -0
- package/machineWsRunDispatch-UIP355FN.js +105 -0
- package/memoryCommands-O4MIPIWQ.js +476 -0
- package/models-XLEOET3E.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-CRNQRZ6D.js +5374 -0
- package/removeDialogAgentAction-CXLST3N6.js +72 -0
- package/runAgentClientLoop-2S334SGA.js +288 -0
- package/runtimeDoctorCommands-LRHLPDRC.js +289 -0
- package/setDialogExtraReferencesAction-LP6VYGU7.js +59 -0
- package/setPrimaryDialogAgentAction-D3GGH23T.js +79 -0
- package/settingSlice-J4I3Z5H7.js +198 -0
- package/skillSummaryMarker-42HKSXYY.js +9 -0
- package/slateToRenderMarkdown-Y5IYN73U.js +7 -0
- package/slateUtils-2M7MUTWX.js +19 -0
- package/spaceCommands-NDEWMFZJ.js +450 -0
- package/spaceSlice-RLB6RTHO.js +145 -0
- package/streamAgentChatTurn-Y2TTYPBD.js +4503 -0
- package/tableCommands-GOFP7QKA.js +1286 -0
- package/toolApiClient-QI3YBNWB.js +26 -0
- package/tools-YZYLY2ZQ.js +83 -0
- package/understanding-HCSFPE7R.js +318 -0
- package/updateCommands-VOSPKXFF.js +31 -0
- package/updateDialogTitleAction-LQV6QLBW.js +185 -0
|
@@ -0,0 +1,360 @@
|
|
|
1
|
+
import {
|
|
2
|
+
readDbRecord,
|
|
3
|
+
writeAgentRecord
|
|
4
|
+
} from "./chunk-GGXABIPP.js";
|
|
5
|
+
import {
|
|
6
|
+
buildSkillSummaryMarker
|
|
7
|
+
} from "./chunk-VF4K2QE6.js";
|
|
8
|
+
import {
|
|
9
|
+
buildSkillDocMarkdown
|
|
10
|
+
} from "./chunk-NXZGF7F7.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-PN7AFLOK.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
|
+
};
|
|
@@ -0,0 +1,198 @@
|
|
|
1
|
+
import {
|
|
2
|
+
loadProfileConfig
|
|
3
|
+
} from "./chunk-ROWQEJRP.js";
|
|
4
|
+
import {
|
|
5
|
+
resolveDefaultSpawn
|
|
6
|
+
} from "./chunk-IDZTNRP2.js";
|
|
7
|
+
import {
|
|
8
|
+
isCompiledBinary
|
|
9
|
+
} from "./chunk-ISNCLGUZ.js";
|
|
10
|
+
import {
|
|
11
|
+
DEFAULT_NOLO_SERVER_URL
|
|
12
|
+
} from "./chunk-OLZBQWZU.js";
|
|
13
|
+
import {
|
|
14
|
+
normalizeServerOrigin
|
|
15
|
+
} from "./chunk-CF7PE763.js";
|
|
16
|
+
|
|
17
|
+
// packages/cli/updateCommands.ts
|
|
18
|
+
import { existsSync, readFileSync } from "node:fs";
|
|
19
|
+
import { dirname, join } from "node:path";
|
|
20
|
+
import { fileURLToPath } from "node:url";
|
|
21
|
+
function resolvePackageJsonPath() {
|
|
22
|
+
if (isCompiledBinary()) {
|
|
23
|
+
const execDir = dirname(process.execPath);
|
|
24
|
+
const candidate2 = join(execDir, "package.json");
|
|
25
|
+
if (existsSync(candidate2)) return candidate2;
|
|
26
|
+
return null;
|
|
27
|
+
}
|
|
28
|
+
const CLI_DIR = dirname(fileURLToPath(import.meta.url));
|
|
29
|
+
const candidate = join(CLI_DIR, "package.json");
|
|
30
|
+
return existsSync(candidate) ? candidate : null;
|
|
31
|
+
}
|
|
32
|
+
var PACKAGE_JSON_PATH = resolvePackageJsonPath();
|
|
33
|
+
function getCliInstallChannel(serverUrl) {
|
|
34
|
+
const normalized = normalizeServerOrigin(serverUrl);
|
|
35
|
+
if (!normalized) {
|
|
36
|
+
return "latest";
|
|
37
|
+
}
|
|
38
|
+
try {
|
|
39
|
+
const hostname = new URL(normalized).hostname.toLowerCase();
|
|
40
|
+
if (hostname === "us.nolo.chat" || hostname.endsWith(".us.nolo.chat")) {
|
|
41
|
+
return "alpha";
|
|
42
|
+
}
|
|
43
|
+
} catch {
|
|
44
|
+
if (/us\.nolo\.chat/i.test(normalized)) {
|
|
45
|
+
return "alpha";
|
|
46
|
+
}
|
|
47
|
+
}
|
|
48
|
+
return "latest";
|
|
49
|
+
}
|
|
50
|
+
function renderProgressBar(percent, width = 30) {
|
|
51
|
+
const pct = Math.max(0, Math.min(100, percent));
|
|
52
|
+
const filledLen = Math.round(width * pct / 100);
|
|
53
|
+
const emptyLen = width - filledLen;
|
|
54
|
+
const bar = "#".repeat(filledLen) + " ".repeat(emptyLen);
|
|
55
|
+
const pctText = pct.toFixed(1).padStart(5, " ");
|
|
56
|
+
return `[${bar}] ${pctText}%`;
|
|
57
|
+
}
|
|
58
|
+
function buildNpmSelfUpdateCommand(channel = "latest") {
|
|
59
|
+
return ["npm", "install", "-g", `nolo-cli@${channel}`, "--force", "--progress"];
|
|
60
|
+
}
|
|
61
|
+
function readPackageInfo() {
|
|
62
|
+
if (PACKAGE_JSON_PATH) {
|
|
63
|
+
try {
|
|
64
|
+
const raw = readFileSync(PACKAGE_JSON_PATH, "utf8");
|
|
65
|
+
const parsed = JSON.parse(raw);
|
|
66
|
+
return {
|
|
67
|
+
name: parsed.name || "nolo-cli",
|
|
68
|
+
version: parsed.version || "0.0.0"
|
|
69
|
+
};
|
|
70
|
+
} catch {
|
|
71
|
+
}
|
|
72
|
+
}
|
|
73
|
+
return {
|
|
74
|
+
name: process.env.NOLO_CLI_PACKAGE_NAME || "nolo-cli",
|
|
75
|
+
version: process.env.NOLO_CLI_VERSION || "0.0.0"
|
|
76
|
+
};
|
|
77
|
+
}
|
|
78
|
+
function buildCliVersionText(info) {
|
|
79
|
+
return `${info.name} ${info.version}`;
|
|
80
|
+
}
|
|
81
|
+
function buildSelfUpdateCommand(serverUrl) {
|
|
82
|
+
return buildNpmSelfUpdateCommand(getCliInstallChannel(serverUrl));
|
|
83
|
+
}
|
|
84
|
+
function resolveSelfUpdateServerUrl(env = process.env, override) {
|
|
85
|
+
if (override?.trim()) {
|
|
86
|
+
return normalizeServerOrigin(override);
|
|
87
|
+
}
|
|
88
|
+
const fromEnv = env.NOLO_SERVER || env.BASE_URL;
|
|
89
|
+
if (typeof fromEnv === "string" && fromEnv.trim()) {
|
|
90
|
+
return normalizeServerOrigin(fromEnv);
|
|
91
|
+
}
|
|
92
|
+
const profile = loadProfileConfig();
|
|
93
|
+
const profileUrl = profile?.profiles?.[profile.currentProfile]?.serverUrl;
|
|
94
|
+
if (profileUrl?.trim()) {
|
|
95
|
+
return normalizeServerOrigin(profileUrl);
|
|
96
|
+
}
|
|
97
|
+
return DEFAULT_NOLO_SERVER_URL;
|
|
98
|
+
}
|
|
99
|
+
function buildCliDoctorText(info) {
|
|
100
|
+
return [
|
|
101
|
+
"Nolo CLI doctor",
|
|
102
|
+
"---------------",
|
|
103
|
+
`version ${info.packageName} ${info.version}`,
|
|
104
|
+
`install ${info.installKind}`,
|
|
105
|
+
`channel ${info.updateChannel}`,
|
|
106
|
+
`entry ${info.entrypoint}`,
|
|
107
|
+
`server ${info.serverUrl}`,
|
|
108
|
+
`profile ${info.profileName}`,
|
|
109
|
+
`update nolo update`,
|
|
110
|
+
"",
|
|
111
|
+
"If direct `nolo` differs from repo-local `bun ./packages/cli/index.ts`,",
|
|
112
|
+
"the global install is older than this checkout.",
|
|
113
|
+
"",
|
|
114
|
+
`Manual update: ${buildNpmSelfUpdateCommand(info.updateChannel).join(" ")}`
|
|
115
|
+
].join("\n");
|
|
116
|
+
}
|
|
117
|
+
function isRunSelfUpdateOptions(value) {
|
|
118
|
+
return typeof value === "object" && value !== null && ("output" in value || "spawn" in value || "entrypointPath" in value || "serverUrl" in value || "env" in value);
|
|
119
|
+
}
|
|
120
|
+
async function forwardSpawnOutput(stream, output) {
|
|
121
|
+
if (!stream) {
|
|
122
|
+
return;
|
|
123
|
+
}
|
|
124
|
+
for await (const chunk of stream) {
|
|
125
|
+
output.write(normalizeSpawnChunk(chunk));
|
|
126
|
+
}
|
|
127
|
+
}
|
|
128
|
+
function normalizeSpawnChunk(chunk) {
|
|
129
|
+
if (typeof chunk === "string" || chunk instanceof Uint8Array) {
|
|
130
|
+
return chunk;
|
|
131
|
+
}
|
|
132
|
+
if (chunk instanceof ArrayBuffer) {
|
|
133
|
+
return new Uint8Array(chunk);
|
|
134
|
+
}
|
|
135
|
+
return new Uint8Array(chunk.buffer, chunk.byteOffset, chunk.byteLength);
|
|
136
|
+
}
|
|
137
|
+
async function runSelfUpdate(outputOrOptions) {
|
|
138
|
+
const options = outputOrOptions === void 0 ? {} : isRunSelfUpdateOptions(outputOrOptions) ? outputOrOptions : { output: outputOrOptions };
|
|
139
|
+
const output = options.output ?? process.stdout;
|
|
140
|
+
const spawn = options.spawn ?? resolveDefaultSpawn();
|
|
141
|
+
const env = options.env ?? process.env;
|
|
142
|
+
const serverUrl = resolveSelfUpdateServerUrl(env, options.serverUrl);
|
|
143
|
+
const channel = getCliInstallChannel(serverUrl);
|
|
144
|
+
const command = buildNpmSelfUpdateCommand(channel);
|
|
145
|
+
output.write(`
|
|
146
|
+
Nolo Agent CLI Installer & Updater
|
|
147
|
+
`);
|
|
148
|
+
output.write(`-----------------------------------------
|
|
149
|
+
`);
|
|
150
|
+
output.write(`\u2713 Target channel: ${channel} (nolo-cli@${channel})
|
|
151
|
+
`);
|
|
152
|
+
output.write(`\u25B8 Downloading and installing package via npm...
|
|
153
|
+
`);
|
|
154
|
+
const useCustomSink = options.output !== void 0;
|
|
155
|
+
const proc = spawn({
|
|
156
|
+
cmd: command,
|
|
157
|
+
stdin: "inherit",
|
|
158
|
+
stdout: useCustomSink ? "pipe" : "inherit",
|
|
159
|
+
stderr: useCustomSink ? "pipe" : "inherit",
|
|
160
|
+
env
|
|
161
|
+
});
|
|
162
|
+
if (!useCustomSink) {
|
|
163
|
+
const exitCode2 = await proc.exited;
|
|
164
|
+
if (exitCode2 === 0) {
|
|
165
|
+
output.write(` ${renderProgressBar(100)}
|
|
166
|
+
`);
|
|
167
|
+
output.write(`\u2713 Update completed successfully!
|
|
168
|
+
|
|
169
|
+
`);
|
|
170
|
+
}
|
|
171
|
+
return exitCode2;
|
|
172
|
+
}
|
|
173
|
+
const [exitCode] = await Promise.all([
|
|
174
|
+
proc.exited,
|
|
175
|
+
forwardSpawnOutput(proc.stdout, output),
|
|
176
|
+
forwardSpawnOutput(proc.stderr, output)
|
|
177
|
+
]);
|
|
178
|
+
if (exitCode === 0) {
|
|
179
|
+
output.write(` ${renderProgressBar(100)}
|
|
180
|
+
`);
|
|
181
|
+
output.write(`\u2713 Update completed successfully!
|
|
182
|
+
|
|
183
|
+
`);
|
|
184
|
+
}
|
|
185
|
+
return exitCode;
|
|
186
|
+
}
|
|
187
|
+
|
|
188
|
+
export {
|
|
189
|
+
getCliInstallChannel,
|
|
190
|
+
renderProgressBar,
|
|
191
|
+
buildNpmSelfUpdateCommand,
|
|
192
|
+
readPackageInfo,
|
|
193
|
+
buildCliVersionText,
|
|
194
|
+
buildSelfUpdateCommand,
|
|
195
|
+
resolveSelfUpdateServerUrl,
|
|
196
|
+
buildCliDoctorText,
|
|
197
|
+
runSelfUpdate
|
|
198
|
+
};
|