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,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-GGXABIPP.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
|
+
};
|