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,478 @@
|
|
|
1
|
+
import {
|
|
2
|
+
getRuntimeServerContext,
|
|
3
|
+
partitionReadServers,
|
|
4
|
+
pickBestSettledRemoteRecord,
|
|
5
|
+
planAuthorityReadServers,
|
|
6
|
+
resolveRecordAuthority,
|
|
7
|
+
scheduleExistingRecordReplication,
|
|
8
|
+
shouldReplaceLocalWithRemoteRecord,
|
|
9
|
+
shouldReplicateLocalRecord
|
|
10
|
+
} from "./chunk-XBROXIGL.js";
|
|
11
|
+
import {
|
|
12
|
+
fetchFromClientDb,
|
|
13
|
+
fetchFromServer,
|
|
14
|
+
isAbortError,
|
|
15
|
+
isReadTimeoutError,
|
|
16
|
+
logger
|
|
17
|
+
} from "./chunk-WI4XWASA.js";
|
|
18
|
+
import {
|
|
19
|
+
shouldReplaceWithNextRecord
|
|
20
|
+
} from "./chunk-GBRG75BQ.js";
|
|
21
|
+
import {
|
|
22
|
+
NOLO_CLUSTER_SERVERS,
|
|
23
|
+
normalizeKnownServerOrigin
|
|
24
|
+
} from "./chunk-LCBAMY2M.js";
|
|
25
|
+
import {
|
|
26
|
+
normalizeServerOrigin
|
|
27
|
+
} from "./chunk-CF7PE763.js";
|
|
28
|
+
|
|
29
|
+
// packages/core/builtinAgents.ts
|
|
30
|
+
var BUILTIN_NOLO_AGENT_KEY = "agent-pub-01NOLOAPPBLD000000019KCKT0";
|
|
31
|
+
var BUILTIN_APP_BUILDER_AGENT_KEY = "agent-pub-01APPBUILDER00000001YAII3I";
|
|
32
|
+
var BUILTIN_ECOMMERCE_AGENT_KEY = "agent-pub-01ECOMMERCEAG00000001PYQ2J";
|
|
33
|
+
var BUILTIN_AGENT_CREATOR_AGENT_KEY = "agent-pub-01NOLOAGENTCRT000000000001";
|
|
34
|
+
var BUILTIN_FEEDBACK_AGENT_KEY = "agent-pub-01NOLOFEEDBACKA000000000R2";
|
|
35
|
+
var BUILTIN_CHROME_OPERATOR_AGENT_KEY = "agent-pub-01CHROMEOPR000000000001";
|
|
36
|
+
var PUBLIC_DEEPSEEK_V4_FLASH_AGENT_ID = "01DSV4FLASHPB00000000JFPFD";
|
|
37
|
+
var PUBLIC_DEEPSEEK_V4_FLASH_AGENT_KEY = `agent-pub-${PUBLIC_DEEPSEEK_V4_FLASH_AGENT_ID}`;
|
|
38
|
+
var PUBLIC_DEEPSEEK_V4_PRO_AGENT_ID = "01DSV4PROPUB00000001A9OLZN";
|
|
39
|
+
var PUBLIC_DEEPSEEK_V4_PRO_AGENT_KEY = `agent-pub-${PUBLIC_DEEPSEEK_V4_PRO_AGENT_ID}`;
|
|
40
|
+
var PUBLIC_KIMI_K27_CODING_AGENT_ID = "01KIMIK27CODEOL000000001";
|
|
41
|
+
var PUBLIC_KIMI_K27_CODING_AGENT_KEY = `agent-pub-${PUBLIC_KIMI_K27_CODING_AGENT_ID}`;
|
|
42
|
+
var PUBLIC_GLM_52_AGENT_ID = "01GLM52CHAT00000000001U721";
|
|
43
|
+
var PUBLIC_GLM_52_AGENT_KEY = `agent-pub-${PUBLIC_GLM_52_AGENT_ID}`;
|
|
44
|
+
var PUBLIC_KIMI_K26_IMAGE_AGENT_ID = "01KIMIK26OLLAMA0000000001";
|
|
45
|
+
var PUBLIC_KIMI_K26_IMAGE_AGENT_KEY = `agent-pub-${PUBLIC_KIMI_K26_IMAGE_AGENT_ID}`;
|
|
46
|
+
var BUILTIN_PLATFORM_AGENT_KEYS = [
|
|
47
|
+
BUILTIN_NOLO_AGENT_KEY,
|
|
48
|
+
BUILTIN_APP_BUILDER_AGENT_KEY,
|
|
49
|
+
BUILTIN_ECOMMERCE_AGENT_KEY,
|
|
50
|
+
BUILTIN_AGENT_CREATOR_AGENT_KEY,
|
|
51
|
+
BUILTIN_FEEDBACK_AGENT_KEY,
|
|
52
|
+
BUILTIN_CHROME_OPERATOR_AGENT_KEY
|
|
53
|
+
];
|
|
54
|
+
var BUILTIN_PLATFORM_AGENT_KEY_SET = new Set(BUILTIN_PLATFORM_AGENT_KEYS);
|
|
55
|
+
|
|
56
|
+
// packages/database/actions/agentReadResolution.ts
|
|
57
|
+
var BUILTIN_PLATFORM_AGENT_KEYS2 = [
|
|
58
|
+
...BUILTIN_PLATFORM_AGENT_KEYS
|
|
59
|
+
];
|
|
60
|
+
var BUILTIN_PLATFORM_AGENT_KEY_SET2 = new Set(
|
|
61
|
+
BUILTIN_PLATFORM_AGENT_KEYS2
|
|
62
|
+
);
|
|
63
|
+
var normalizeServer = (server) => normalizeKnownServerOrigin(server) ?? normalizeServerOrigin(server);
|
|
64
|
+
var isBuiltinPlatformAgentKey = (dbKey) => typeof dbKey === "string" && BUILTIN_PLATFORM_AGENT_KEY_SET2.has(dbKey);
|
|
65
|
+
var resolveAgentReadServers = ({
|
|
66
|
+
dbKey,
|
|
67
|
+
configuredServers
|
|
68
|
+
}) => {
|
|
69
|
+
const normalized = configuredServers.map(normalizeServer);
|
|
70
|
+
if (!isBuiltinPlatformAgentKey(dbKey)) {
|
|
71
|
+
return Array.from(new Set(normalized));
|
|
72
|
+
}
|
|
73
|
+
return Array.from(/* @__PURE__ */ new Set([...normalized, ...NOLO_CLUSTER_SERVERS]));
|
|
74
|
+
};
|
|
75
|
+
|
|
76
|
+
// packages/database/actions/readRequestManager.ts
|
|
77
|
+
var DEFAULT_MISS_COOLDOWN_MS = 2e3;
|
|
78
|
+
var DEFAULT_LOCAL_HIT_REVALIDATE_COOLDOWN_MS = 1500;
|
|
79
|
+
var DEFAULT_MISS_CACHE_MAX_SIZE = 1e3;
|
|
80
|
+
var ReadRequestManager = class {
|
|
81
|
+
constructor(options = {}) {
|
|
82
|
+
this.options = options;
|
|
83
|
+
}
|
|
84
|
+
inFlightReads = /* @__PURE__ */ new Map();
|
|
85
|
+
recentMisses = /* @__PURE__ */ new Map();
|
|
86
|
+
recentLocalHitRevalidations = /* @__PURE__ */ new Map();
|
|
87
|
+
get missCooldownMs() {
|
|
88
|
+
return this.options.missCooldownMs ?? DEFAULT_MISS_COOLDOWN_MS;
|
|
89
|
+
}
|
|
90
|
+
get missCacheMaxSize() {
|
|
91
|
+
return this.options.missCacheMaxSize ?? DEFAULT_MISS_CACHE_MAX_SIZE;
|
|
92
|
+
}
|
|
93
|
+
get localHitRevalidateCooldownMs() {
|
|
94
|
+
return this.options.localHitRevalidateCooldownMs ?? DEFAULT_LOCAL_HIT_REVALIDATE_COOLDOWN_MS;
|
|
95
|
+
}
|
|
96
|
+
getInFlight(dbKey) {
|
|
97
|
+
return this.inFlightReads.get(dbKey);
|
|
98
|
+
}
|
|
99
|
+
setInFlight(dbKey, promise) {
|
|
100
|
+
this.inFlightReads.set(dbKey, promise);
|
|
101
|
+
}
|
|
102
|
+
clearInFlight(dbKey, promise) {
|
|
103
|
+
if (this.inFlightReads.get(dbKey) === promise) {
|
|
104
|
+
this.inFlightReads.delete(dbKey);
|
|
105
|
+
}
|
|
106
|
+
}
|
|
107
|
+
clearMiss(dbKey) {
|
|
108
|
+
this.recentMisses.delete(dbKey);
|
|
109
|
+
}
|
|
110
|
+
getRetryInMs(dbKey, now) {
|
|
111
|
+
const missUntil = this.recentMisses.get(dbKey);
|
|
112
|
+
if (typeof missUntil !== "number") return null;
|
|
113
|
+
if (missUntil <= now) {
|
|
114
|
+
this.recentMisses.delete(dbKey);
|
|
115
|
+
return null;
|
|
116
|
+
}
|
|
117
|
+
return missUntil - now;
|
|
118
|
+
}
|
|
119
|
+
markMiss(dbKey, now, cooldownMs = this.missCooldownMs) {
|
|
120
|
+
this.recentMisses.set(dbKey, now + cooldownMs);
|
|
121
|
+
this.cleanupMisses(now);
|
|
122
|
+
}
|
|
123
|
+
getLocalHitRevalidateInMs(dbKey, now) {
|
|
124
|
+
const nextAllowedAt = this.recentLocalHitRevalidations.get(dbKey);
|
|
125
|
+
if (typeof nextAllowedAt !== "number") return null;
|
|
126
|
+
if (nextAllowedAt <= now) {
|
|
127
|
+
this.recentLocalHitRevalidations.delete(dbKey);
|
|
128
|
+
return null;
|
|
129
|
+
}
|
|
130
|
+
return nextAllowedAt - now;
|
|
131
|
+
}
|
|
132
|
+
markLocalHitRevalidated(dbKey, now, cooldownMs = this.localHitRevalidateCooldownMs) {
|
|
133
|
+
this.recentLocalHitRevalidations.set(dbKey, now + cooldownMs);
|
|
134
|
+
this.cleanupLocalHitRevalidations(now);
|
|
135
|
+
}
|
|
136
|
+
cleanupExpiringMap(map, now) {
|
|
137
|
+
for (const [key, expiresAt] of Array.from(map.entries())) {
|
|
138
|
+
if (expiresAt <= now) {
|
|
139
|
+
map.delete(key);
|
|
140
|
+
}
|
|
141
|
+
}
|
|
142
|
+
if (map.size <= this.missCacheMaxSize) return;
|
|
143
|
+
const overflow = map.size - this.missCacheMaxSize;
|
|
144
|
+
const keys = Array.from(map.keys());
|
|
145
|
+
for (let i = 0; i < overflow; i += 1) {
|
|
146
|
+
const key = keys[i];
|
|
147
|
+
if (key) map.delete(key);
|
|
148
|
+
}
|
|
149
|
+
}
|
|
150
|
+
cleanupMisses(now) {
|
|
151
|
+
this.cleanupExpiringMap(this.recentMisses, now);
|
|
152
|
+
}
|
|
153
|
+
cleanupLocalHitRevalidations(now) {
|
|
154
|
+
this.cleanupExpiringMap(this.recentLocalHitRevalidations, now);
|
|
155
|
+
}
|
|
156
|
+
// test helper
|
|
157
|
+
getMissCacheSize() {
|
|
158
|
+
return this.recentMisses.size;
|
|
159
|
+
}
|
|
160
|
+
// test helper
|
|
161
|
+
getLocalHitRevalidationCacheSize() {
|
|
162
|
+
return this.recentLocalHitRevalidations.size;
|
|
163
|
+
}
|
|
164
|
+
};
|
|
165
|
+
var readRequestManager = new ReadRequestManager();
|
|
166
|
+
|
|
167
|
+
// packages/database/actions/read.ts
|
|
168
|
+
var updateClientDbIfNewer = async (clientDb, dbKey, remoteData, localData) => {
|
|
169
|
+
if (!clientDb) return;
|
|
170
|
+
try {
|
|
171
|
+
if (isRemoteDataNewer(remoteData, localData)) {
|
|
172
|
+
await clientDb.put(
|
|
173
|
+
dbKey,
|
|
174
|
+
normalizeReadRecord(dbKey, remoteData, { forCache: true })
|
|
175
|
+
);
|
|
176
|
+
}
|
|
177
|
+
} catch (err) {
|
|
178
|
+
throw err;
|
|
179
|
+
}
|
|
180
|
+
};
|
|
181
|
+
var normalizeReadRecord = (dbKey, data, options = {}) => {
|
|
182
|
+
if (!data || typeof data !== "object") return data;
|
|
183
|
+
const baseRecord = options.forCache ? data : { ...data, dbKey };
|
|
184
|
+
return baseRecord;
|
|
185
|
+
};
|
|
186
|
+
var isRemoteDataNewer = (remoteData, localData) => {
|
|
187
|
+
if (!remoteData || typeof remoteData !== "object") return false;
|
|
188
|
+
if (!localData || typeof localData !== "object") return true;
|
|
189
|
+
return shouldReplaceWithNextRecord(remoteData, localData);
|
|
190
|
+
};
|
|
191
|
+
var syncLocalDataToServer = async (replicationContext, dbKey, localData) => {
|
|
192
|
+
try {
|
|
193
|
+
scheduleExistingRecordReplication({
|
|
194
|
+
currentServer: replicationContext.currentServer,
|
|
195
|
+
syncServers: replicationContext.syncServers,
|
|
196
|
+
dbKey,
|
|
197
|
+
localData,
|
|
198
|
+
state: replicationContext.state
|
|
199
|
+
});
|
|
200
|
+
} catch (err) {
|
|
201
|
+
}
|
|
202
|
+
};
|
|
203
|
+
var saveRemoteDataToClientDb = async (clientDb, dbKey, remoteData, serverOrigin) => {
|
|
204
|
+
if (!clientDb) return;
|
|
205
|
+
try {
|
|
206
|
+
const normalizedRemoteData = normalizeReadRecord(dbKey, remoteData, {
|
|
207
|
+
forCache: true
|
|
208
|
+
});
|
|
209
|
+
await clientDb.put(
|
|
210
|
+
dbKey,
|
|
211
|
+
serverOrigin ? {
|
|
212
|
+
...normalizedRemoteData,
|
|
213
|
+
serverOrigin
|
|
214
|
+
} : normalizedRemoteData
|
|
215
|
+
);
|
|
216
|
+
} catch (err) {
|
|
217
|
+
}
|
|
218
|
+
};
|
|
219
|
+
var processRemoteDataInBackground = async (clientDb, dbKey, remotePromises, remoteServers, localData, replicationContext) => {
|
|
220
|
+
if (!clientDb) return;
|
|
221
|
+
try {
|
|
222
|
+
const settledResults = await Promise.allSettled(remotePromises);
|
|
223
|
+
const remoteResult = pickBestSettledRemoteRecord({
|
|
224
|
+
settledResults,
|
|
225
|
+
isBetterCandidate: (current, latest) => shouldReplaceWithNextRecord(current, latest)
|
|
226
|
+
});
|
|
227
|
+
const validRemoteData = remoteResult ? remoteResult.data : null;
|
|
228
|
+
const serverOrigin = remoteResult && remoteServers[remoteResult.index] ? remoteServers[remoteResult.index] : void 0;
|
|
229
|
+
if (shouldReplaceLocalWithRemoteRecord({
|
|
230
|
+
localData,
|
|
231
|
+
remoteData: validRemoteData,
|
|
232
|
+
isRemoteNewer: isRemoteDataNewer
|
|
233
|
+
})) {
|
|
234
|
+
await updateClientDbIfNewer(
|
|
235
|
+
clientDb,
|
|
236
|
+
dbKey,
|
|
237
|
+
serverOrigin ? { ...validRemoteData, serverOrigin } : validRemoteData,
|
|
238
|
+
localData
|
|
239
|
+
);
|
|
240
|
+
}
|
|
241
|
+
if (shouldReplicateLocalRecord({
|
|
242
|
+
localData,
|
|
243
|
+
remoteData: validRemoteData,
|
|
244
|
+
remoteTargetCount: remotePromises.length
|
|
245
|
+
})) {
|
|
246
|
+
await syncLocalDataToServer(replicationContext, dbKey, localData);
|
|
247
|
+
}
|
|
248
|
+
} catch (err) {
|
|
249
|
+
}
|
|
250
|
+
};
|
|
251
|
+
var readAction = async (payload, thunkApi) => {
|
|
252
|
+
const dbKey = payload.dbKey;
|
|
253
|
+
const signal = payload.signal;
|
|
254
|
+
const preferredServerOrigin = payload.preferredServerOrigin;
|
|
255
|
+
if (!dbKey || typeof dbKey !== "string") {
|
|
256
|
+
throw new Error("readAction requires a non-empty dbKey.");
|
|
257
|
+
}
|
|
258
|
+
if (signal?.aborted) {
|
|
259
|
+
throw new DOMException("Aborted", "AbortError");
|
|
260
|
+
}
|
|
261
|
+
const { db: clientDb } = thunkApi.extra;
|
|
262
|
+
if (!clientDb) {
|
|
263
|
+
throw new Error("Client database is not available.");
|
|
264
|
+
}
|
|
265
|
+
const executeRead = async () => {
|
|
266
|
+
const isDialogKey = dbKey.startsWith("dialog-") && !dbKey.includes("-msg-");
|
|
267
|
+
const readStartedAt = isDialogKey ? Date.now() : 0;
|
|
268
|
+
const state = thunkApi.getState();
|
|
269
|
+
const {
|
|
270
|
+
currentToken,
|
|
271
|
+
remoteServers: configuredServers,
|
|
272
|
+
currentServer,
|
|
273
|
+
currentUserId,
|
|
274
|
+
syncServers,
|
|
275
|
+
userAuthorityRegistry
|
|
276
|
+
} = getRuntimeServerContext(state, preferredServerOrigin);
|
|
277
|
+
const allServers = resolveAgentReadServers({ dbKey, configuredServers });
|
|
278
|
+
const isLoggedIn = !!currentToken;
|
|
279
|
+
const now = Date.now();
|
|
280
|
+
const localData = await fetchFromClientDb(clientDb, dbKey);
|
|
281
|
+
if (isDialogKey) {
|
|
282
|
+
console.info("[readAction-perf] dialog local-read", {
|
|
283
|
+
dbKey,
|
|
284
|
+
localHit: !!localData,
|
|
285
|
+
localReadMs: Date.now() - readStartedAt,
|
|
286
|
+
serverCount: allServers.length
|
|
287
|
+
});
|
|
288
|
+
}
|
|
289
|
+
const authority = resolveRecordAuthority({
|
|
290
|
+
dbKey,
|
|
291
|
+
record: localData,
|
|
292
|
+
currentUserId,
|
|
293
|
+
currentServer,
|
|
294
|
+
userAuthorityRegistry
|
|
295
|
+
});
|
|
296
|
+
const authorityPlannedServers = planAuthorityReadServers({
|
|
297
|
+
allServers,
|
|
298
|
+
authorityServer: preferredServerOrigin ?? authority.authorityServer,
|
|
299
|
+
serverOrigin: authority.serverOrigin
|
|
300
|
+
});
|
|
301
|
+
const { preferredServer, fallbackServers, orderedServersForLocalHit } = partitionReadServers({
|
|
302
|
+
allServers: authorityPlannedServers,
|
|
303
|
+
preferredServerOrigin: preferredServerOrigin ?? authority.authorityServer
|
|
304
|
+
});
|
|
305
|
+
readRequestManager.cleanupMisses(now);
|
|
306
|
+
readRequestManager.cleanupLocalHitRevalidations(now);
|
|
307
|
+
if (localData) {
|
|
308
|
+
readRequestManager.clearMiss(dbKey);
|
|
309
|
+
} else {
|
|
310
|
+
const retryInMs = readRequestManager.getRetryInMs(dbKey, now);
|
|
311
|
+
if (typeof retryInMs === "number" && retryInMs > 0) {
|
|
312
|
+
logger.debug(
|
|
313
|
+
{ dbKey, retryInMs },
|
|
314
|
+
"[readAction] Suppressing repeated miss read"
|
|
315
|
+
);
|
|
316
|
+
throw new Error(
|
|
317
|
+
`Read temporarily suppressed for missing key "${dbKey}".`
|
|
318
|
+
);
|
|
319
|
+
}
|
|
320
|
+
}
|
|
321
|
+
if (authorityPlannedServers.length === 0) {
|
|
322
|
+
if (localData) {
|
|
323
|
+
if (isDialogKey) {
|
|
324
|
+
console.info("[readAction-perf] dialog offline-local-hit", {
|
|
325
|
+
dbKey,
|
|
326
|
+
totalMs: Date.now() - readStartedAt
|
|
327
|
+
});
|
|
328
|
+
}
|
|
329
|
+
return normalizeReadRecord(dbKey, localData);
|
|
330
|
+
}
|
|
331
|
+
readRequestManager.markMiss(dbKey, now);
|
|
332
|
+
throw new Error(
|
|
333
|
+
`Failed to fetch data for key "${dbKey}" because network is offline and no local data is available.`
|
|
334
|
+
);
|
|
335
|
+
}
|
|
336
|
+
if (localData) {
|
|
337
|
+
const retryInMs = signal?.aborted ? void 0 : readRequestManager.getLocalHitRevalidateInMs(dbKey, now);
|
|
338
|
+
if (!signal?.aborted) {
|
|
339
|
+
if (retryInMs === null) {
|
|
340
|
+
readRequestManager.markLocalHitRevalidated(dbKey, now);
|
|
341
|
+
const remotePromises2 = orderedServersForLocalHit.map(
|
|
342
|
+
(server) => fetchFromServer(
|
|
343
|
+
server,
|
|
344
|
+
dbKey,
|
|
345
|
+
isLoggedIn ? currentToken : void 0,
|
|
346
|
+
signal
|
|
347
|
+
)
|
|
348
|
+
);
|
|
349
|
+
void processRemoteDataInBackground(
|
|
350
|
+
clientDb,
|
|
351
|
+
dbKey,
|
|
352
|
+
remotePromises2,
|
|
353
|
+
orderedServersForLocalHit,
|
|
354
|
+
localData,
|
|
355
|
+
{ currentServer, syncServers, state }
|
|
356
|
+
);
|
|
357
|
+
} else {
|
|
358
|
+
logger.debug(
|
|
359
|
+
{ dbKey, retryInMs },
|
|
360
|
+
"[readAction] Skipping frequent local-hit revalidation"
|
|
361
|
+
);
|
|
362
|
+
}
|
|
363
|
+
}
|
|
364
|
+
if (isDialogKey) {
|
|
365
|
+
console.info("[readAction-perf] dialog local-hit-return", {
|
|
366
|
+
dbKey,
|
|
367
|
+
totalMs: Date.now() - readStartedAt,
|
|
368
|
+
revalidating: retryInMs === null
|
|
369
|
+
});
|
|
370
|
+
}
|
|
371
|
+
return normalizeReadRecord(dbKey, localData);
|
|
372
|
+
}
|
|
373
|
+
if (preferredServer) {
|
|
374
|
+
try {
|
|
375
|
+
const preferredRemoteData = await fetchFromServer(
|
|
376
|
+
preferredServer,
|
|
377
|
+
dbKey,
|
|
378
|
+
isLoggedIn ? currentToken : void 0,
|
|
379
|
+
signal
|
|
380
|
+
);
|
|
381
|
+
if (preferredRemoteData) {
|
|
382
|
+
await saveRemoteDataToClientDb(
|
|
383
|
+
clientDb,
|
|
384
|
+
dbKey,
|
|
385
|
+
preferredRemoteData,
|
|
386
|
+
preferredServer
|
|
387
|
+
);
|
|
388
|
+
readRequestManager.clearMiss(dbKey);
|
|
389
|
+
if (isDialogKey) {
|
|
390
|
+
console.info("[readAction-perf] dialog preferred-remote-hit", {
|
|
391
|
+
dbKey,
|
|
392
|
+
totalMs: Date.now() - readStartedAt,
|
|
393
|
+
server: preferredServer
|
|
394
|
+
});
|
|
395
|
+
}
|
|
396
|
+
return normalizeReadRecord(dbKey, {
|
|
397
|
+
...preferredRemoteData,
|
|
398
|
+
serverOrigin: preferredServer
|
|
399
|
+
});
|
|
400
|
+
}
|
|
401
|
+
} catch (error) {
|
|
402
|
+
if (signal?.aborted || isAbortError(error)) {
|
|
403
|
+
throw error;
|
|
404
|
+
}
|
|
405
|
+
if (isReadTimeoutError(error)) {
|
|
406
|
+
logger.warn(
|
|
407
|
+
{ dbKey, preferredServer, error: String(error.message) },
|
|
408
|
+
"[readAction] Preferred server timed out; falling back to remaining servers"
|
|
409
|
+
);
|
|
410
|
+
} else {
|
|
411
|
+
logger.warn(
|
|
412
|
+
{ dbKey, preferredServer, error: String(error) },
|
|
413
|
+
"[readAction] Preferred server read failed; falling back to remaining servers"
|
|
414
|
+
);
|
|
415
|
+
}
|
|
416
|
+
}
|
|
417
|
+
}
|
|
418
|
+
const remotePromises = fallbackServers.map(
|
|
419
|
+
(server) => fetchFromServer(
|
|
420
|
+
server,
|
|
421
|
+
dbKey,
|
|
422
|
+
isLoggedIn ? currentToken : void 0,
|
|
423
|
+
signal
|
|
424
|
+
)
|
|
425
|
+
);
|
|
426
|
+
const settledResults = await Promise.allSettled(remotePromises);
|
|
427
|
+
if (signal?.aborted) {
|
|
428
|
+
throw new DOMException("Aborted", "AbortError");
|
|
429
|
+
}
|
|
430
|
+
const remoteResult = pickBestSettledRemoteRecord({
|
|
431
|
+
settledResults,
|
|
432
|
+
isBetterCandidate: (current, latest) => shouldReplaceWithNextRecord(current, latest)
|
|
433
|
+
});
|
|
434
|
+
if (remoteResult) {
|
|
435
|
+
const { data: validRemoteData } = remoteResult;
|
|
436
|
+
const serverOrigin = fallbackServers[remoteResult.index];
|
|
437
|
+
if (!signal?.aborted) {
|
|
438
|
+
await saveRemoteDataToClientDb(
|
|
439
|
+
clientDb,
|
|
440
|
+
dbKey,
|
|
441
|
+
validRemoteData,
|
|
442
|
+
serverOrigin
|
|
443
|
+
);
|
|
444
|
+
}
|
|
445
|
+
readRequestManager.clearMiss(dbKey);
|
|
446
|
+
const remoteData = serverOrigin ? { ...validRemoteData, dbKey, serverOrigin } : { ...validRemoteData, dbKey };
|
|
447
|
+
return normalizeReadRecord(dbKey, remoteData);
|
|
448
|
+
}
|
|
449
|
+
readRequestManager.markMiss(dbKey, Date.now());
|
|
450
|
+
throw new Error(
|
|
451
|
+
`Failed to fetch data for key "${dbKey}" from all sources.`
|
|
452
|
+
);
|
|
453
|
+
};
|
|
454
|
+
const canDedup = !signal;
|
|
455
|
+
if (canDedup) {
|
|
456
|
+
const existing = readRequestManager.getInFlight(dbKey);
|
|
457
|
+
if (existing) return existing;
|
|
458
|
+
let inFlightPromise;
|
|
459
|
+
inFlightPromise = executeRead().finally(() => {
|
|
460
|
+
readRequestManager.clearInFlight(dbKey, inFlightPromise);
|
|
461
|
+
});
|
|
462
|
+
readRequestManager.setInFlight(dbKey, inFlightPromise);
|
|
463
|
+
return inFlightPromise;
|
|
464
|
+
}
|
|
465
|
+
return executeRead();
|
|
466
|
+
};
|
|
467
|
+
|
|
468
|
+
export {
|
|
469
|
+
BUILTIN_NOLO_AGENT_KEY,
|
|
470
|
+
PUBLIC_DEEPSEEK_V4_FLASH_AGENT_KEY,
|
|
471
|
+
PUBLIC_DEEPSEEK_V4_PRO_AGENT_KEY,
|
|
472
|
+
PUBLIC_KIMI_K27_CODING_AGENT_KEY,
|
|
473
|
+
PUBLIC_GLM_52_AGENT_KEY,
|
|
474
|
+
PUBLIC_KIMI_K26_IMAGE_AGENT_KEY,
|
|
475
|
+
readRequestManager,
|
|
476
|
+
resolveAgentReadServers,
|
|
477
|
+
readAction
|
|
478
|
+
};
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
// packages/agent-runtime/staleReplayGuard.ts
|
|
2
|
+
var wrapHistoricalSummaryWithReplayGuard = (summary) => {
|
|
3
|
+
const trimmed = summary.trim();
|
|
4
|
+
if (!trimmed) return "";
|
|
5
|
+
return [
|
|
6
|
+
"\u3010\u5386\u53F2\u53C2\u8003\uFF0C\u975E\u6D3B\u6307\u4EE4\u3011\u4EE5\u4E0B\u4E3A\u51BB\u7ED3\u6458\u8981\uFF0C\u5176\u4E2D\u7684\u4EFB\u52A1/skill/ARGUMENTS \u9ED8\u8BA4\u5DF2\u8FC7\u671F\uFF0C\u4E0D\u5F97\u91CD\u65B0\u6267\u884C\u3002",
|
|
7
|
+
trimmed
|
|
8
|
+
].join("\n");
|
|
9
|
+
};
|
|
10
|
+
|
|
11
|
+
// packages/agent-runtime/memoryUseGuidance.ts
|
|
12
|
+
var MEMORY_USE_GUIDANCE = `--- \u8BB0\u5FC6\u4F7F\u7528\u65B9\u5F0F ---
|
|
13
|
+
- \u8BB0\u5FC6\u662F\u4E2A\u6027\u5316\u589E\u5F3A\u5C42\uFF1B\u5F53\u524D\u8F93\u5165/\u5BF9\u8BDD/\u7CFB\u7EDF\u89C4\u5219/Agent prompt/skill/\u7528\u6237\u5168\u5C40\u504F\u597D\u90FD\u4F18\u5148\u4E8E\u5B83\u3002\u5F53\u524D\u8F93\u5165\u7ED9\u51FA\u65B0\u8BED\u8A00\u3001\u6280\u672F\u6808\u3001\u6570\u503C\u3001\u7EA6\u675F\u6216\u660E\u786E\u8986\u76D6\u65E7\u504F\u597D\u65F6\uFF0C\u91C7\u7528\u5F53\u524D\u8F93\u5165\uFF0C\u4E0D\u8981\u628A\u65E7\u8BB0\u5FC6\u5F53\u66F4\u9AD8\u771F\u503C\u3002
|
|
14
|
+
- \u8BB0\u5FC6\u542B\u7528\u6237\u8EAB\u4EFD/\u79F0\u547C/\u5173\u7CFB/\u957F\u671F\u504F\u597D/\u9879\u76EE\u80CC\u666F\u65F6\uFF0C\u76F8\u5173\u5904\u81EA\u7136\u4F53\u73B0\uFF08\u5F00\u573A\u79F0\u547C\u3001\u4E0A\u4E0B\u6587\u786E\u8BA4\u3001\u56DE\u7B54\u7ED3\u6784\u3001\u53D6\u820D\u6807\u51C6\uFF09\uFF0C\u4E0D\u8981\u6BCF\u53E5\u673A\u68B0\u79F0\u547C\u7528\u6237\u3002
|
|
15
|
+
- \u201C\u4E0A\u6B21/\u7EE7\u7EED/\u8FD9\u4E2A\u9879\u76EE\u201D\u7B49\u6307\u4EE3\u4F18\u5148\u6309\u5F53\u524D dialog/space/project/agent/sourceDialog \u7B49 KV \u8DEF\u5F84\u548C\u65F6\u95F4\u7EBF\u5B9A\u4F4D\uFF0C\u4E0D\u8981\u53EA\u6309\u8BED\u4E49\u76F8\u4F3C\u5EA6\u635E\u4E00\u6761\u3002
|
|
16
|
+
- \u63A8\u65AD\u578B\u8BB0\u5FC6\u53EA\u7528\u4E8E\u628A\u63E1\u8BED\u6C14\u3001\u72B6\u6001\u548C\u672A\u5B8C\u6210\u4E8B\u9879\uFF0C\u4E0D\u8981\u8BF4\u6210\u201C\u4F60\u660E\u786E\u544A\u8BC9\u8FC7\u6211\u201D\u6216\u5F53\u6210\u7528\u6237\u5DF2\u6388\u6743\u4FDD\u5B58\u7684\u4E8B\u5B9E\u3002\u51B2\u7A81\u6216\u573A\u666F\u4E0D\u660E\u65F6\u8BF4\u660E\u4F9D\u636E\u6216\u7B80\u77ED\u786E\u8BA4\uFF0C\u4E0D\u8981\u786C\u5957\u3002`;
|
|
17
|
+
|
|
18
|
+
export {
|
|
19
|
+
wrapHistoricalSummaryWithReplayGuard,
|
|
20
|
+
MEMORY_USE_GUIDANCE
|
|
21
|
+
};
|
|
@@ -0,0 +1,63 @@
|
|
|
1
|
+
import {
|
|
2
|
+
getRecordTimestamp,
|
|
3
|
+
isTombstoneRecord,
|
|
4
|
+
shouldReplaceWithNextRecord
|
|
5
|
+
} from "./chunk-GBRG75BQ.js";
|
|
6
|
+
|
|
7
|
+
// packages/database/userDataMerge.ts
|
|
8
|
+
var getUserDataItemTimestamp = (dataItem) => getRecordTimestamp(dataItem);
|
|
9
|
+
var getItemKey = (item) => {
|
|
10
|
+
const candidates = [
|
|
11
|
+
typeof item.contentKey === "string" ? item.contentKey : void 0,
|
|
12
|
+
typeof item.dbKey === "string" ? item.dbKey : void 0,
|
|
13
|
+
typeof item.appKey === "string" ? item.appKey : void 0,
|
|
14
|
+
typeof item.appId === "string" ? item.appId : void 0,
|
|
15
|
+
item.id
|
|
16
|
+
];
|
|
17
|
+
for (const candidate of candidates) {
|
|
18
|
+
if (typeof candidate === "string" && candidate.trim().length > 0) {
|
|
19
|
+
return candidate;
|
|
20
|
+
}
|
|
21
|
+
}
|
|
22
|
+
return null;
|
|
23
|
+
};
|
|
24
|
+
var mergeAndDedupUserData = (localData, remoteResults, options = {}) => {
|
|
25
|
+
const uniqueMap = /* @__PURE__ */ new Map();
|
|
26
|
+
const mergeRecordMetadata = (currentItem, nextItem) => {
|
|
27
|
+
if (typeof currentItem.serverOrigin !== "string" && typeof nextItem.serverOrigin === "string" && nextItem.serverOrigin.trim().length > 0) {
|
|
28
|
+
return {
|
|
29
|
+
...currentItem,
|
|
30
|
+
serverOrigin: nextItem.serverOrigin
|
|
31
|
+
};
|
|
32
|
+
}
|
|
33
|
+
return currentItem;
|
|
34
|
+
};
|
|
35
|
+
const addToMap = (item) => {
|
|
36
|
+
const itemKey = getItemKey(item);
|
|
37
|
+
if (!itemKey) return;
|
|
38
|
+
const existing = uniqueMap.get(itemKey);
|
|
39
|
+
if (!existing) {
|
|
40
|
+
uniqueMap.set(itemKey, item);
|
|
41
|
+
return;
|
|
42
|
+
}
|
|
43
|
+
if (shouldReplaceWithNextRecord(item, existing)) {
|
|
44
|
+
uniqueMap.set(itemKey, item);
|
|
45
|
+
return;
|
|
46
|
+
}
|
|
47
|
+
uniqueMap.set(itemKey, mergeRecordMetadata(existing, item));
|
|
48
|
+
};
|
|
49
|
+
localData.forEach(addToMap);
|
|
50
|
+
remoteResults.forEach((result) => {
|
|
51
|
+
const items = result?.data?.data;
|
|
52
|
+
if (Array.isArray(items)) {
|
|
53
|
+
items.forEach(addToMap);
|
|
54
|
+
}
|
|
55
|
+
});
|
|
56
|
+
const merged = Array.from(uniqueMap.values());
|
|
57
|
+
return options.includeDeleted ? merged : merged.filter((item) => !isTombstoneRecord(item));
|
|
58
|
+
};
|
|
59
|
+
|
|
60
|
+
export {
|
|
61
|
+
getUserDataItemTimestamp,
|
|
62
|
+
mergeAndDedupUserData
|
|
63
|
+
};
|
|
@@ -0,0 +1,60 @@
|
|
|
1
|
+
import {
|
|
2
|
+
normalizeServerOrigin
|
|
3
|
+
} from "./chunk-CF7PE763.js";
|
|
4
|
+
|
|
5
|
+
// packages/database/config.ts
|
|
6
|
+
var API_VERSION = "/api/v1";
|
|
7
|
+
var SERVERS = {
|
|
8
|
+
MAIN: "https://nolo.chat",
|
|
9
|
+
US: "https://us.nolo.chat"
|
|
10
|
+
};
|
|
11
|
+
var NOLO_CLUSTER_SERVERS = Object.values(SERVERS);
|
|
12
|
+
var LEGACY_SERVER_ORIGIN_MAP = {
|
|
13
|
+
"https://nolotus.com": SERVERS.MAIN,
|
|
14
|
+
"https://www.nolotus.com": SERVERS.MAIN,
|
|
15
|
+
"https://us.nolotus.com": SERVERS.US,
|
|
16
|
+
"https://www.us.nolotus.com": SERVERS.US
|
|
17
|
+
};
|
|
18
|
+
var normalizeKnownServerOrigin = (server) => {
|
|
19
|
+
if (typeof server !== "string" || server.trim().length === 0) return null;
|
|
20
|
+
const trimmed = server.trim();
|
|
21
|
+
let origin;
|
|
22
|
+
try {
|
|
23
|
+
origin = new URL(trimmed).origin;
|
|
24
|
+
} catch {
|
|
25
|
+
origin = normalizeServerOrigin(trimmed);
|
|
26
|
+
}
|
|
27
|
+
return LEGACY_SERVER_ORIGIN_MAP[origin.toLowerCase()] ?? origin;
|
|
28
|
+
};
|
|
29
|
+
var LOCAL_DEV_SERVER_ORIGIN_PATTERN = /^https?:\/\/(?:localhost|127\.0\.0\.1|0\.0\.0\.0|nolotus\.local)(?::\d+)?$/i;
|
|
30
|
+
var isLocalDevServerOrigin = (server) => {
|
|
31
|
+
if (typeof server !== "string" || server.trim().length === 0) return false;
|
|
32
|
+
const normalized = normalizeKnownServerOrigin(server) ?? normalizeServerOrigin(server);
|
|
33
|
+
return LOCAL_DEV_SERVER_ORIGIN_PATTERN.test(normalized);
|
|
34
|
+
};
|
|
35
|
+
var isNoloClusterServerOrigin = (server) => {
|
|
36
|
+
if (typeof server !== "string" || server.trim().length === 0) return false;
|
|
37
|
+
const normalized = normalizeKnownServerOrigin(server) ?? normalizeServerOrigin(server);
|
|
38
|
+
return /^https?:\/\/(?:us\.)?nolo\.chat$/i.test(normalized);
|
|
39
|
+
};
|
|
40
|
+
var API_ENDPOINTS = {
|
|
41
|
+
DATABASE: `${API_VERSION}/db`,
|
|
42
|
+
SHARE: `${API_VERSION}/share`,
|
|
43
|
+
USERS: `${API_VERSION}/users`,
|
|
44
|
+
WEATHER: `${API_VERSION}/weather`,
|
|
45
|
+
HI: `${API_VERSION}/hi`,
|
|
46
|
+
CHAT: `${API_VERSION}/chat`,
|
|
47
|
+
EXECUTE_SQL: `${API_VERSION}/sqlite/execute_sql`,
|
|
48
|
+
// --- 新增端点 ---
|
|
49
|
+
TRANSACTIONS: `${API_VERSION}/transactions`
|
|
50
|
+
};
|
|
51
|
+
|
|
52
|
+
export {
|
|
53
|
+
API_VERSION,
|
|
54
|
+
SERVERS,
|
|
55
|
+
NOLO_CLUSTER_SERVERS,
|
|
56
|
+
normalizeKnownServerOrigin,
|
|
57
|
+
isLocalDevServerOrigin,
|
|
58
|
+
isNoloClusterServerOrigin,
|
|
59
|
+
API_ENDPOINTS
|
|
60
|
+
};
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
// packages/database-engine/dbPath.ts
|
|
2
|
+
import { homedir } from "node:os";
|
|
3
|
+
import path from "node:path";
|
|
4
|
+
function resolveServerDbPath(options = {}) {
|
|
5
|
+
const env = options.env ?? process.env;
|
|
6
|
+
return env.NOLO_SERVER_DB_PATH?.trim() || path.join(options.cwd ?? process.cwd(), "data", "leveldb");
|
|
7
|
+
}
|
|
8
|
+
function resolveNoloHome(options = {}) {
|
|
9
|
+
const env = options.env ?? process.env;
|
|
10
|
+
return env.NOLO_HOME?.trim() || path.join(options.homeDir ?? homedir(), ".nolo");
|
|
11
|
+
}
|
|
12
|
+
|
|
13
|
+
export {
|
|
14
|
+
resolveServerDbPath,
|
|
15
|
+
resolveNoloHome
|
|
16
|
+
};
|