nolo-cli 0.8.0-alpha.6 → 0.8.0-alpha.7

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (174) hide show
  1. package/_executeModel-XIGO7HW5.js +198 -0
  2. package/action-PAXRPJJF.js +27 -0
  3. package/addContentAction-CZVWF3QZ.js +25 -0
  4. package/addDialogAgentAction-CCIDTPHC.js +67 -0
  5. package/agentDeleteCommand-47B24JYG.js +323 -0
  6. package/agentEmailCommands-D4FC6OZJ.js +621 -0
  7. package/agentListCommands-UFET7CC4.js +219 -0
  8. package/agentMachineCommands-LH7QDQPP.js +421 -0
  9. package/agentPullCommand-O2MTUAFR.js +122 -0
  10. package/agentRecordCommands-CWS2B5IA.js +89 -0
  11. package/agentRunCommand-3FRPISLG.js +102 -0
  12. package/agentRunControl-K4VKNEHF.js +57 -0
  13. package/agentRuntimeLocal-JNQQC2WG.js +99 -0
  14. package/agentSlice-XDFSELFJ.js +41 -0
  15. package/authCommand-WXMD3IPR.js +574 -0
  16. package/authCommands-X74AFDTC.js +26 -0
  17. package/chunk-2EISRLRC.js +238 -0
  18. package/chunk-2FTTDCD4.js +675 -0
  19. package/chunk-2JHWPW5B.js +2127 -0
  20. package/chunk-2LMT6K6N.js +171 -0
  21. package/chunk-2MALU52L.js +51 -0
  22. package/chunk-364VYAX2.js +19 -0
  23. package/chunk-3ASDTTEI.js +1774 -0
  24. package/chunk-3EUW3WEO.js +8 -0
  25. package/chunk-3LY4F7SV.js +9293 -0
  26. package/chunk-4CQLVGRV.js +50 -0
  27. package/chunk-4IJYA27C.js +342 -0
  28. package/chunk-4SN6J65J.js +38 -0
  29. package/chunk-4VNS5WPM.js +42 -0
  30. package/chunk-543C7RDK.js +562 -0
  31. package/chunk-572EKYLF.js +792 -0
  32. package/chunk-5MIDPSSK.js +206 -0
  33. package/chunk-5MMAK75Q.js +15 -0
  34. package/chunk-5XH3NZ4T.js +3631 -0
  35. package/chunk-63W5N6P3.js +150 -0
  36. package/chunk-6HYVJV7B.js +102 -0
  37. package/chunk-6PWWWMI7.js +628 -0
  38. package/chunk-6WD3OOJS.js +20 -0
  39. package/chunk-A3X4Y7MO.js +4294 -0
  40. package/chunk-AR7ZSGDI.js +929 -0
  41. package/chunk-ATNTHIZI.js +13 -0
  42. package/chunk-AUGHVUFE.js +69 -0
  43. package/chunk-AVMKZHBC.js +85 -0
  44. package/chunk-AZPCASRE.js +36 -0
  45. package/chunk-B76D3JJK.js +1447 -0
  46. package/chunk-BR2WP3DF.js +548 -0
  47. package/chunk-BSTNFPHD.js +231 -0
  48. package/chunk-CF2WZF4N.js +134 -0
  49. package/chunk-CF7PE763.js +10 -0
  50. package/chunk-CKOJQDKR.js +198 -0
  51. package/chunk-CM54RSSA.js +206 -0
  52. package/chunk-CWMSB67P.js +34 -0
  53. package/chunk-DA2OEKS6.js +27 -0
  54. package/chunk-DFFIZ25G.js +30 -0
  55. package/chunk-DWLEOOGR.js +8 -0
  56. package/chunk-DZ3XJVET.js +231 -0
  57. package/chunk-E5HMHIKL.js +222 -0
  58. package/chunk-EHLHSX7R.js +1433 -0
  59. package/chunk-ELRRLDWI.js +478 -0
  60. package/chunk-EYEEHCU4.js +3066 -0
  61. package/chunk-G3SUCT4W.js +8 -0
  62. package/chunk-G5H7RNFL.js +807 -0
  63. package/chunk-GAKEBQD6.js +30 -0
  64. package/chunk-GBRG75BQ.js +86 -0
  65. package/chunk-GEKCOPTN.js +190 -0
  66. package/chunk-H2RMRZJE.js +113 -0
  67. package/chunk-H33743XH.js +25 -0
  68. package/chunk-HEIIIZBX.js +104 -0
  69. package/chunk-HNMXYYJR.js +12 -0
  70. package/chunk-IAXBCTTE.js +175 -0
  71. package/chunk-IDZTNRP2.js +85 -0
  72. package/chunk-IECI4YHR.js +421 -0
  73. package/chunk-ISNCLGUZ.js +146 -0
  74. package/chunk-IYQV26RA.js +138 -0
  75. package/chunk-JBTJAPUF.js +35 -0
  76. package/chunk-JZPBVBIY.js +94 -0
  77. package/chunk-KK6SWS5B.js +1078 -0
  78. package/chunk-KQHGZWSV.js +63 -0
  79. package/chunk-KTI2WDDG.js +24674 -0
  80. package/chunk-KUG52IAP.js +8 -0
  81. package/chunk-KX6YBIHG.js +8 -0
  82. package/chunk-LCBAMY2M.js +60 -0
  83. package/chunk-LM25IZBJ.js +902 -0
  84. package/chunk-LM6IYQ3F.js +16 -0
  85. package/chunk-M76ECQRD.js +13658 -0
  86. package/chunk-MRC4Q34M.js +188 -0
  87. package/chunk-NE3E3XJ2.js +936 -0
  88. package/chunk-NXZGF7F7.js +2878 -0
  89. package/chunk-OF5H3QWS.js +300 -0
  90. package/chunk-OLZBQWZU.js +6 -0
  91. package/chunk-OVGXXUVI.js +91 -0
  92. package/chunk-OWOHNGCN.js +50 -0
  93. package/chunk-PN7AFLOK.js +3401 -0
  94. package/chunk-QSJ3HFEF.js +8 -0
  95. package/chunk-QYXLLLGL.js +4519 -0
  96. package/chunk-ROWQEJRP.js +139 -0
  97. package/chunk-S7Z2HMCN.js +25 -0
  98. package/chunk-SL3EPWB4.js +1949 -0
  99. package/chunk-TDIQFT2F.js +301 -0
  100. package/chunk-TILFE6LV.js +381 -0
  101. package/chunk-U4TRT5V4.js +246 -0
  102. package/chunk-U6VC4MU4.js +8 -0
  103. package/chunk-UAD2WT54.js +64 -0
  104. package/chunk-USZDUWOV.js +191 -0
  105. package/chunk-USZMK5UT.js +105 -0
  106. package/chunk-UVPF33PW.js +46995 -0
  107. package/chunk-V2F4OGYM.js +9013 -0
  108. package/chunk-VEJLAVTC.js +2052 -0
  109. package/chunk-VF4K2QE6.js +21 -0
  110. package/chunk-VHBWHNVT.js +59 -0
  111. package/chunk-VIDPVFP3.js +20 -0
  112. package/chunk-VP4WJWKW.js +8882 -0
  113. package/chunk-VQ2AJRGD.js +148 -0
  114. package/chunk-W4NVOSFF.js +37 -0
  115. package/chunk-WWC7I6TA.js +8 -0
  116. package/chunk-X7W4TNB4.js +1550 -0
  117. package/chunk-XDVAYP26.js +537 -0
  118. package/chunk-XKIMRZO2.js +221 -0
  119. package/chunk-Y5GCAMGP.js +9 -0
  120. package/chunk-YD43KPCK.js +360 -0
  121. package/chunk-YIJFUVKA.js +34 -0
  122. package/chunk-Z4NR32XR.js +50 -0
  123. package/chunk-ZNFJWEN4.js +56 -0
  124. package/cliExecutor-DNE7TCC4.js +36 -0
  125. package/clipboardy-BVE3LVEH.js +12001 -0
  126. package/createAgentAutomationAction-3QTGNYJC.js +864 -0
  127. package/createDialogAction-5YX3ARBK.js +52 -0
  128. package/createPageAction-EQNQQRCW.js +169 -0
  129. package/db-HCJ5PRB5.js +271 -0
  130. package/dbSlice-C4UJLRZP.js +59 -0
  131. package/deleteFile-4SKGPHOZ.js +41 -0
  132. package/dialogCommands-AOQS23FV.js +59 -0
  133. package/dialogSlice-GZE3NCMC.js +146 -0
  134. package/docCreateCommands-GVOQVJON.js +215 -0
  135. package/docDeleteCommands-GEB7YAUZ.js +176 -0
  136. package/docReadCommands-XYKI2DF2.js +129 -0
  137. package/docStore-MLM5AME5.js +96 -0
  138. package/docUpdateCommands-4L3RAMHZ.js +313 -0
  139. package/fetchMessages-JOCYIFKL.js +16 -0
  140. package/getPricing-PWPJ6MNV.js +30 -0
  141. package/handleSendMessageAction-WG2GKTGZ.js +183 -0
  142. package/index.js +188 -113035
  143. package/localDialogRead-D3BELSTF.js +26 -0
  144. package/localFirstLog-DHNOY2NA.js +19 -0
  145. package/localRuntimeAuthority-TEGCOWX4.js +471 -0
  146. package/localRuntimeDb-LGDF6FQP.js +12 -0
  147. package/machineCommands-ZNXKLH6Q.js +774 -0
  148. package/machineInfo-M6KB6HZN.js +10 -0
  149. package/machineWsRunDispatch-7WRG6HNV.js +105 -0
  150. package/memoryCommands-O4MIPIWQ.js +476 -0
  151. package/models-XLEOET3E.js +9 -0
  152. package/offlineMarxistsAgentCommand-BCPJITJL.js +242 -0
  153. package/package.json +3 -25
  154. package/read-RIJCIVKX.js +17 -0
  155. package/readDocTool-GZD2N3LO.js +16 -0
  156. package/readlineWorkspace-AQURUDN4.js +5357 -0
  157. package/removeDialogAgentAction-CXLST3N6.js +72 -0
  158. package/runAgentClientLoop-VQUEKGA5.js +288 -0
  159. package/runtimeDoctorCommands-LRHLPDRC.js +289 -0
  160. package/setDialogExtraReferencesAction-LP6VYGU7.js +59 -0
  161. package/setPrimaryDialogAgentAction-D3GGH23T.js +79 -0
  162. package/settingSlice-J4I3Z5H7.js +198 -0
  163. package/skillSummaryMarker-42HKSXYY.js +9 -0
  164. package/slateToRenderMarkdown-Y5IYN73U.js +7 -0
  165. package/slateUtils-2M7MUTWX.js +19 -0
  166. package/spaceCommands-R2RXD5UY.js +450 -0
  167. package/spaceSlice-5UT4JNIN.js +145 -0
  168. package/streamAgentChatTurn-NRWSQKFN.js +4503 -0
  169. package/tableCommands-66XEWHAK.js +1286 -0
  170. package/toolApiClient-QI3YBNWB.js +26 -0
  171. package/tools-TNMUDDRK.js +83 -0
  172. package/understanding-HCSFPE7R.js +318 -0
  173. package/updateCommands-VOSPKXFF.js +31 -0
  174. package/updateDialogTitleAction-IXOKAVX3.js +185 -0
@@ -0,0 +1,30 @@
1
+ // packages/core/retryAfterMs.ts
2
+ function normalizeNonNegativeMs(value, fallbackMs) {
3
+ const parsed = Number(value);
4
+ return Number.isFinite(parsed) && parsed >= 0 ? Math.round(parsed) : Math.round(Number(fallbackMs)) || 0;
5
+ }
6
+ function parseRetryAfterHeaderMs(value, nowMs = Date.now()) {
7
+ if (typeof value !== "string" || !value.trim()) return null;
8
+ const trimmed = value.trim();
9
+ const seconds = Number(trimmed);
10
+ if (Number.isFinite(seconds)) {
11
+ if (seconds < 0) return null;
12
+ return Math.round(seconds * 1e3);
13
+ }
14
+ const parsedDateMs = Date.parse(trimmed);
15
+ if (Number.isFinite(parsedDateMs)) {
16
+ return Math.max(0, parsedDateMs - nowMs);
17
+ }
18
+ return null;
19
+ }
20
+
21
+ // packages/core/gatewayHttpStatus.ts
22
+ function isGatewayHttpStatus(status) {
23
+ return status === 502 || status === 503 || status === 504;
24
+ }
25
+
26
+ export {
27
+ normalizeNonNegativeMs,
28
+ parseRetryAfterHeaderMs,
29
+ isGatewayHttpStatus
30
+ };
@@ -0,0 +1,86 @@
1
+ import {
2
+ asOptionalPositiveFiniteNumber
3
+ } from "./chunk-U6VC4MU4.js";
4
+
5
+ // packages/database/tombstones.ts
6
+ var TOMBSTONE_DETAIL_RETENTION_MS = 90 * 24 * 60 * 60 * 1e3;
7
+ var isRecord = (value) => value !== null && typeof value === "object";
8
+ var readRecord = (value) => isRecord(value) ? value : null;
9
+ var parseTimestamp = (value) => {
10
+ const asNumber = asOptionalPositiveFiniteNumber(value);
11
+ if (asNumber !== void 0) return asNumber;
12
+ if (typeof value === "string" && value.trim()) {
13
+ return asOptionalPositiveFiniteNumber(Date.parse(value)) ?? 0;
14
+ }
15
+ return 0;
16
+ };
17
+ var getRecordTimestamp = (record) => {
18
+ const value = readRecord(record);
19
+ if (!value) return 0;
20
+ const candidates = [
21
+ value.updatedAt,
22
+ value.updated_at,
23
+ value.createdAt,
24
+ value.created,
25
+ isRecord(value.meta) ? value.meta.createdAt : void 0
26
+ ];
27
+ for (const candidate of candidates) {
28
+ const timestamp = parseTimestamp(candidate);
29
+ if (timestamp > 0) return timestamp;
30
+ }
31
+ return 0;
32
+ };
33
+ var getTombstoneTimestamp = (record) => {
34
+ const value = readRecord(record);
35
+ if (!value) return 0;
36
+ return parseTimestamp(value.deletedAt) || getRecordTimestamp(value);
37
+ };
38
+ var getRestoreTimestamp = (record) => {
39
+ const value = readRecord(record);
40
+ if (!value) return 0;
41
+ return parseTimestamp(value.restoredAt);
42
+ };
43
+ var isTombstoneRecord = (record) => {
44
+ const value = readRecord(record);
45
+ if (!value) return false;
46
+ const deletedAt = value.deletedAt;
47
+ if (typeof deletedAt === "string") return deletedAt.trim().length > 0;
48
+ return Boolean(deletedAt);
49
+ };
50
+ var isRestoredAfterTombstone = (activeRecord, tombstoneRecord) => {
51
+ if (isTombstoneRecord(activeRecord) || !isTombstoneRecord(tombstoneRecord)) {
52
+ return false;
53
+ }
54
+ const restoreTs = getRestoreTimestamp(activeRecord);
55
+ const tombstoneTs = getTombstoneTimestamp(tombstoneRecord);
56
+ return restoreTs > 0 && tombstoneTs > 0 && restoreTs > tombstoneTs;
57
+ };
58
+ var shouldReplaceWithNextRecord = (nextRecord, currentRecord) => {
59
+ const nextIsTombstone = isTombstoneRecord(nextRecord);
60
+ const currentIsTombstone = isTombstoneRecord(currentRecord);
61
+ if (currentIsTombstone && !nextIsTombstone) {
62
+ return isRestoredAfterTombstone(nextRecord, currentRecord);
63
+ }
64
+ if (nextIsTombstone && !currentIsTombstone) {
65
+ return !isRestoredAfterTombstone(currentRecord, nextRecord);
66
+ }
67
+ const nextTs = nextIsTombstone ? getTombstoneTimestamp(nextRecord) : getRecordTimestamp(nextRecord);
68
+ const currentTs = currentIsTombstone ? getTombstoneTimestamp(currentRecord) : getRecordTimestamp(currentRecord);
69
+ if (nextTs !== currentTs) return nextTs > currentTs;
70
+ return nextIsTombstone && !currentIsTombstone;
71
+ };
72
+ var buildTombstoneRecord = (record, nowIso) => {
73
+ const { restoredAt: _restoredAt, ...baseRecord } = record;
74
+ return {
75
+ ...baseRecord,
76
+ deletedAt: nowIso,
77
+ updatedAt: nowIso
78
+ };
79
+ };
80
+
81
+ export {
82
+ getRecordTimestamp,
83
+ isTombstoneRecord,
84
+ shouldReplaceWithNextRecord,
85
+ buildTombstoneRecord
86
+ };
@@ -0,0 +1,190 @@
1
+ import {
2
+ deleteDbRecord,
3
+ queryUserRecords,
4
+ readDbRecord
5
+ } from "./chunk-6PWWWMI7.js";
6
+ import {
7
+ mergeAndDedupUserData
8
+ } from "./chunk-KQHGZWSV.js";
9
+ import {
10
+ toErrorMessage
11
+ } from "./chunk-HNMXYYJR.js";
12
+ import {
13
+ isTombstoneRecord
14
+ } from "./chunk-GBRG75BQ.js";
15
+
16
+ // packages/cli/globalRecordOperations.ts
17
+ async function listUserRecordsFromServers(args) {
18
+ const remoteResults = [];
19
+ const failures = [];
20
+ const promises = args.serverUrls.map(async (serverUrl) => {
21
+ try {
22
+ const records = await queryUserRecords({
23
+ authToken: args.authToken,
24
+ fallbackFetchImpl: args.fallbackFetchImpl,
25
+ fetchImpl: args.fetchImpl,
26
+ includeDeleted: true,
27
+ limit: args.limit,
28
+ serverUrl,
29
+ summary: args.summary,
30
+ type: args.type,
31
+ userId: args.userId
32
+ });
33
+ return { ok: true, serverUrl, records };
34
+ } catch (error) {
35
+ return {
36
+ ok: false,
37
+ serverUrl,
38
+ error: toErrorMessage(error)
39
+ };
40
+ }
41
+ });
42
+ const results = await Promise.all(promises);
43
+ for (const res of results) {
44
+ if (res.ok) {
45
+ remoteResults.push({
46
+ data: {
47
+ data: res.records.map((record) => ({
48
+ ...record,
49
+ serverOrigin: typeof record?.serverOrigin === "string" && record.serverOrigin.trim() ? record.serverOrigin : res.serverUrl
50
+ }))
51
+ }
52
+ });
53
+ } else {
54
+ failures.push({
55
+ serverUrl: res.serverUrl,
56
+ error: res.error
57
+ });
58
+ }
59
+ }
60
+ if (remoteResults.length === 0 && failures.length > 0) {
61
+ const label = args.label ?? "record query";
62
+ throw new Error(
63
+ `${label} failed on all candidate servers: ${failures.map((failure) => `${failure.serverUrl}: ${failure.error}`).join("; ")}`
64
+ );
65
+ }
66
+ const merged = mergeAndDedupUserData([], remoteResults, { includeDeleted: true });
67
+ return {
68
+ records: merged.filter((record) => !isTombstoneRecord(record)),
69
+ failures
70
+ };
71
+ }
72
+ async function readDbRecordFromServers(args) {
73
+ const failures = [];
74
+ for (const serverUrl of args.serverUrls) {
75
+ try {
76
+ const record = await readDbRecord({
77
+ authToken: args.authToken,
78
+ dbKey: args.dbKey,
79
+ fallbackFetchImpl: args.fallbackFetchImpl,
80
+ fetchImpl: args.fetchImpl,
81
+ includeDeleted: args.includeDeleted,
82
+ serverUrl
83
+ });
84
+ return { record, serverUrl, failures };
85
+ } catch (error) {
86
+ failures.push({
87
+ serverUrl,
88
+ error: toErrorMessage(error)
89
+ });
90
+ }
91
+ }
92
+ const label = args.label ?? `record ${args.dbKey}`;
93
+ throw new Error(
94
+ `${label} is unreadable on all candidate servers: ${failures.map((failure) => `${failure.serverUrl}: ${failure.error}`).join("; ")}`
95
+ );
96
+ }
97
+ async function readDbRecordVersionsFromServers(args) {
98
+ const records = [];
99
+ const failures = [];
100
+ const promises = args.serverUrls.map(async (serverUrl) => {
101
+ try {
102
+ const record = await readDbRecord({
103
+ authToken: args.authToken,
104
+ dbKey: args.dbKey,
105
+ fallbackFetchImpl: args.fallbackFetchImpl,
106
+ fetchImpl: args.fetchImpl,
107
+ includeDeleted: true,
108
+ serverUrl
109
+ });
110
+ return { ok: true, serverUrl, record };
111
+ } catch (error) {
112
+ return {
113
+ ok: false,
114
+ serverUrl,
115
+ error: toErrorMessage(error)
116
+ };
117
+ }
118
+ });
119
+ const results = await Promise.all(promises);
120
+ for (const res of results) {
121
+ if (res.ok) {
122
+ const record = res.record;
123
+ records.push({
124
+ ...record,
125
+ dbKey: typeof record?.dbKey === "string" && record.dbKey.trim() ? record.dbKey : args.dbKey,
126
+ serverOrigin: typeof record?.serverOrigin === "string" && record.serverOrigin.trim() ? record.serverOrigin : res.serverUrl
127
+ });
128
+ } else {
129
+ failures.push({
130
+ serverUrl: res.serverUrl,
131
+ error: res.error
132
+ });
133
+ }
134
+ }
135
+ return { records, failures };
136
+ }
137
+ async function readLiveDbRecordAfterTombstoneMerge(args) {
138
+ const result = await readDbRecordVersionsFromServers(args);
139
+ const merged = mergeAndDedupUserData(
140
+ [],
141
+ [{ data: { data: result.records } }],
142
+ { includeDeleted: true }
143
+ );
144
+ const record = merged.find((item) => item?.dbKey === args.dbKey);
145
+ if (record && !isTombstoneRecord(record)) {
146
+ return {
147
+ record,
148
+ serverUrl: typeof record.serverOrigin === "string" ? record.serverOrigin : "",
149
+ failures: result.failures
150
+ };
151
+ }
152
+ const label = args.label ?? `record ${args.dbKey}`;
153
+ const failureText = result.failures.length ? ` Failures: ${result.failures.map((failure) => `${failure.serverUrl}: ${failure.error}`).join("; ")}` : "";
154
+ throw new Error(`${label} is deleted or unreadable after global tombstone merge.${failureText}`);
155
+ }
156
+ async function deleteDbRecordOnServers(args) {
157
+ return deleteDbRecordOnTargets({
158
+ ...args,
159
+ targets: args.serverUrls.map((serverUrl) => ({ serverUrl }))
160
+ });
161
+ }
162
+ async function deleteDbRecordOnTargets(args) {
163
+ const promises = args.targets.map(async (target) => {
164
+ try {
165
+ const result = await deleteDbRecord({
166
+ authToken: target.authToken ?? args.authToken,
167
+ dbKey: args.dbKey,
168
+ deleteOptions: args.deleteOptions,
169
+ fallbackFetchImpl: args.fallbackFetchImpl,
170
+ fetchImpl: args.fetchImpl,
171
+ serverUrl: target.serverUrl
172
+ });
173
+ return { serverUrl: target.serverUrl, ok: true, result };
174
+ } catch (error) {
175
+ return {
176
+ serverUrl: target.serverUrl,
177
+ ok: false,
178
+ error: toErrorMessage(error)
179
+ };
180
+ }
181
+ });
182
+ return Promise.all(promises);
183
+ }
184
+
185
+ export {
186
+ listUserRecordsFromServers,
187
+ readDbRecordFromServers,
188
+ readLiveDbRecordAfterTombstoneMerge,
189
+ deleteDbRecordOnServers
190
+ };
@@ -0,0 +1,113 @@
1
+ import {
2
+ createSpaceKey
3
+ } from "./chunk-UAD2WT54.js";
4
+ import {
5
+ patch,
6
+ read
7
+ } from "./chunk-G5H7RNFL.js";
8
+ import {
9
+ DEVICE_LOCAL_OWNER_ID,
10
+ isDeviceLocalSpaceBody,
11
+ selectIdentityUserId
12
+ } from "./chunk-EYEEHCU4.js";
13
+
14
+ // packages/create/space/utils/permissions.ts
15
+ var checkSpaceMembership = (spaceData, userId) => {
16
+ if (!spaceData) {
17
+ console.error("[Permission Check] Space data is missing.");
18
+ throw new Error("\u65E0\u6CD5\u6267\u884C\u6743\u9650\u68C0\u67E5\uFF1A\u7A7A\u95F4\u6570\u636E\u7F3A\u5931\u3002");
19
+ }
20
+ if (isDeviceLocalSpaceBody(spaceData)) {
21
+ return;
22
+ }
23
+ if (!userId) {
24
+ console.error("[Permission Check] User ID is missing.");
25
+ throw new Error("\u65E0\u6CD5\u6267\u884C\u6743\u9650\u68C0\u67E5\uFF1A\u7528\u6237 ID \u7F3A\u5931\u3002");
26
+ }
27
+ if (!spaceData.members || !Array.isArray(spaceData.members) || !spaceData.members.includes(userId)) {
28
+ console.warn(
29
+ `[Permission Check] User ${userId} attempt to operate on space ${spaceData.id} without membership.`
30
+ );
31
+ throw new Error("\u5F53\u524D\u7528\u6237\u4E0D\u662F\u7A7A\u95F4\u6210\u5458");
32
+ }
33
+ };
34
+ var localSpaceAuthorityPatchStamp = (spaceData) => isDeviceLocalSpaceBody(spaceData) ? { userId: DEVICE_LOCAL_OWNER_ID } : {};
35
+
36
+ // packages/create/space/constants.ts
37
+ var UNCATEGORIZED_ID = "__uncategorized_container__";
38
+
39
+ // packages/create/space/content/addContentAction.ts
40
+ var addContentAction = async (input, thunkAPI) => {
41
+ const {
42
+ spaceId,
43
+ title,
44
+ type,
45
+ contentKey,
46
+ fileCategory,
47
+ mimeType,
48
+ fileSize,
49
+ originalName,
50
+ categoryId: rawCategoryId,
51
+ pinned = false,
52
+ order,
53
+ triggerType,
54
+ skillSummary
55
+ } = input;
56
+ const { dispatch, getState } = thunkAPI;
57
+ const userId = selectIdentityUserId(getState());
58
+ if (!contentKey || typeof contentKey !== "string" || contentKey.trim() === "")
59
+ throw new Error("Invalid contentKey provided.");
60
+ if (!title || typeof title !== "string" || title.trim() === "")
61
+ throw new Error("Invalid or empty title provided.");
62
+ if (!type || typeof type !== "string")
63
+ throw new Error("Invalid content type provided.");
64
+ const spaceKey = createSpaceKey.space(spaceId);
65
+ const spaceData = await dispatch(read({
66
+ dbKey: spaceKey
67
+ })).unwrap();
68
+ checkSpaceMembership(spaceData, userId);
69
+ if (spaceData.contents && spaceData.contents[contentKey]) {
70
+ throw new Error(`\u5185\u5BB9\u952E "${contentKey}" \u5DF2\u5B58\u5728\u3002`);
71
+ }
72
+ let categoryIdForStorage;
73
+ if (rawCategoryId && rawCategoryId !== "" && rawCategoryId !== UNCATEGORIZED_ID) {
74
+ if (spaceData.categories?.[rawCategoryId]) {
75
+ categoryIdForStorage = rawCategoryId;
76
+ }
77
+ }
78
+ const now = Date.now();
79
+ const newSpaceContent = {
80
+ title: title.trim(),
81
+ type,
82
+ contentKey,
83
+ ...fileCategory !== void 0 ? { fileCategory } : {},
84
+ ...mimeType !== void 0 ? { mimeType } : {},
85
+ ...fileSize !== void 0 ? { fileSize } : {},
86
+ ...originalName !== void 0 ? { originalName } : {},
87
+ ...categoryIdForStorage !== void 0 && {
88
+ categoryId: categoryIdForStorage
89
+ },
90
+ pinned,
91
+ createdAt: now,
92
+ updatedAt: now,
93
+ ...order !== void 0 && typeof order === "number" && { order },
94
+ ...triggerType !== void 0 && { triggerType },
95
+ ...skillSummary !== void 0 ? { skillSummary } : {}
96
+ };
97
+ const changes = {
98
+ contents: { [contentKey]: newSpaceContent },
99
+ updatedAt: now,
100
+ ...localSpaceAuthorityPatchStamp(spaceData)
101
+ };
102
+ const updatedSpaceData = await dispatch(
103
+ patch({ dbKey: spaceKey, changes })
104
+ ).unwrap();
105
+ return { spaceId, updatedSpaceData };
106
+ };
107
+
108
+ export {
109
+ checkSpaceMembership,
110
+ localSpaceAuthorityPatchStamp,
111
+ UNCATEGORIZED_ID,
112
+ addContentAction
113
+ };
@@ -0,0 +1,25 @@
1
+ import {
2
+ resolveNoloHome
3
+ } from "./chunk-LM6IYQ3F.js";
4
+
5
+ // packages/cli/localRuntimeDb.ts
6
+ import path from "node:path";
7
+ function resolveCliLocalRuntimeDbPath(options = {}) {
8
+ return path.join(resolveNoloHome(options), "data", "leveldb");
9
+ }
10
+ function buildCliLocalRuntimeDbEnv(env = process.env) {
11
+ return {
12
+ ...env,
13
+ NOLO_SERVER_DB_PATH: env.NOLO_SERVER_DB_PATH?.trim() || resolveCliLocalRuntimeDbPath({ env })
14
+ };
15
+ }
16
+ async function getDefaultCliLocalRuntimeDb(options = {}) {
17
+ const { getDefaultCliLocalRuntimeDb: getAuthorityBackedDb } = await import("./localRuntimeAuthority-TEGCOWX4.js");
18
+ return getAuthorityBackedDb(options);
19
+ }
20
+
21
+ export {
22
+ resolveCliLocalRuntimeDbPath,
23
+ buildCliLocalRuntimeDbEnv,
24
+ getDefaultCliLocalRuntimeDb
25
+ };
@@ -0,0 +1,104 @@
1
+ import {
2
+ createMemoryKey,
3
+ memoryOwnerRange,
4
+ memorySubjectKindRange
5
+ } from "./chunk-PN7AFLOK.js";
6
+
7
+ // packages/ai/memory/queryShared.ts
8
+ var chooseMemoryOwners = (input) => {
9
+ const owners = [];
10
+ if (input.userId) {
11
+ owners.push({ ownerType: "user", ownerId: input.userId });
12
+ }
13
+ if (input.spaceId) {
14
+ owners.push({ ownerType: "space", ownerId: input.spaceId });
15
+ }
16
+ return owners;
17
+ };
18
+ var loadOwnerItemsFromDb = async (db, owner, limit) => {
19
+ const range = memoryOwnerRange(owner.ownerType, owner.ownerId);
20
+ const refs = [];
21
+ for await (const [, value] of db.iterator({
22
+ gte: range.start,
23
+ lte: range.end,
24
+ reverse: true
25
+ })) {
26
+ refs.push(value ?? {});
27
+ if (refs.length >= limit) break;
28
+ }
29
+ const items = await Promise.all(
30
+ refs.map(
31
+ (ref) => typeof ref?.memoryId === "string" ? db.get(createMemoryKey(owner.ownerType, owner.ownerId, ref.memoryId)).catch(() => null) : Promise.resolve(null)
32
+ )
33
+ );
34
+ return items.filter((item) => !!item);
35
+ };
36
+ var loadSubjectKindItemsFromDb = async (db, subject, kind, limit) => {
37
+ const range = memorySubjectKindRange(subject.subjectType, subject.subjectId, kind);
38
+ const refs = [];
39
+ for await (const [, value] of db.iterator({
40
+ gte: range.start,
41
+ lte: range.end,
42
+ reverse: true
43
+ })) {
44
+ refs.push(value ?? {});
45
+ if (refs.length >= limit) break;
46
+ }
47
+ const items = await Promise.all(
48
+ refs.map(
49
+ (ref) => typeof ref?.memoryKey === "string" ? db.get(ref.memoryKey).catch(() => null) : Promise.resolve(null)
50
+ )
51
+ );
52
+ return items.filter((item) => !!item);
53
+ };
54
+ var loadMemoryCandidatesFromDb = async (db, input) => {
55
+ const kinds = input.kinds ?? ["episodic", "semantic", "procedural"];
56
+ const ownerLimit = input.ownerLimit ?? 12;
57
+ const ownerFallback = input.ownerFallback ?? "onSubjectMiss";
58
+ const ownerKeySet = new Set(
59
+ input.owners.filter((owner) => owner.ownerId).map((owner) => `${owner.ownerType}:${owner.ownerId}`)
60
+ );
61
+ const subjects = input.subjects.filter(
62
+ (subject) => !!subject.subjectId
63
+ );
64
+ const subjectResults = subjects.length > 0 ? await Promise.all(
65
+ subjects.flatMap(
66
+ (subject) => kinds.map(
67
+ (kind) => loadSubjectKindItemsFromDb(db, subject, kind, ownerLimit)
68
+ )
69
+ )
70
+ ) : [];
71
+ const subjectHitCount = subjectResults.reduce((sum, items) => sum + items.length, 0);
72
+ const shouldLoadOwnerFallback = ownerFallback !== "never" && (subjects.length === 0 || subjectHitCount === 0 || ownerFallback === "always");
73
+ const results = shouldLoadOwnerFallback ? await Promise.all(
74
+ [
75
+ ...subjectResults,
76
+ ...input.owners.map((owner) => loadOwnerItemsFromDb(db, owner, ownerLimit))
77
+ ]
78
+ ) : subjectResults;
79
+ const kindSet = new Set(kinds);
80
+ const seen = /* @__PURE__ */ new Set();
81
+ const merged = [];
82
+ for (const items of results) {
83
+ for (const item of items) {
84
+ if (seen.has(item.id)) continue;
85
+ if (!kindSet.has(item.kind)) continue;
86
+ if (ownerKeySet.size > 0 && !ownerKeySet.has(`${item.ownerType}:${item.ownerId}`)) {
87
+ continue;
88
+ }
89
+ if (!shouldLoadOwnerFallback && subjects.length > 0 && !subjects.some(
90
+ (subject) => subject.subjectType === item.subjectType && subject.subjectId === item.subjectId
91
+ )) {
92
+ continue;
93
+ }
94
+ seen.add(item.id);
95
+ merged.push(item);
96
+ }
97
+ }
98
+ return merged;
99
+ };
100
+
101
+ export {
102
+ chooseMemoryOwners,
103
+ loadMemoryCandidatesFromDb
104
+ };
@@ -0,0 +1,12 @@
1
+ // packages/core/errorMessage.ts
2
+ function toErrorMessage(error) {
3
+ if (error instanceof Error) return error.message;
4
+ if (error !== null && typeof error === "object" && "message" in error && typeof error.message === "string") {
5
+ return error.message;
6
+ }
7
+ return String(error);
8
+ }
9
+
10
+ export {
11
+ toErrorMessage
12
+ };