luckytri 1.0.0 → 1.0.2
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/.github/SECURITY.md +4 -4
- package/README.en.md +252 -250
- package/README.md +252 -250
- package/bin/luckytri.js +5 -1
- package/docs/en/CHANGELOG.md +8 -0
- package/docs/en/connect.md +18 -18
- package/docs/en/guide.md +202 -216
- package/docs/en/npm-release.md +25 -25
- package/docs/zh/CHANGELOG.md +8 -0
- package/docs/zh/connect.md +17 -17
- package/docs/zh/guide.md +202 -216
- package/docs/zh/npm-release.md +33 -33
- package/package.json +110 -108
- package/plugins/sdk/index.d.ts +155 -155
- package/plugins/sdk/testing.js +58 -58
- package/plugins/weather/index.js +82 -82
- package/plugins/weather/luckytri-plugin.json +29 -29
- package/public/app/assets/ChatsPage-BhlJHseG.js +3 -0
- package/public/app/assets/Empty-DP6WMGHi.js +2 -0
- package/public/app/assets/Field-CtbdqaiB.js +1 -0
- package/public/app/assets/HeartPage-32BeTPn2.js +1 -0
- package/public/app/assets/LifePage-CxSm0XKI.js +1 -0
- package/public/app/assets/MemoryPage-BeKBcPCY.js +1 -0
- package/public/app/assets/NaturePage-NEPYl2HS.js +3 -0
- package/public/app/assets/PeoplePage-DxtpekwM.js +1 -0
- package/public/app/assets/PluginsPage-CVVQwEBI.css +1 -0
- package/public/app/assets/PluginsPage-DksEZbUU.js +2 -0
- package/public/app/assets/{SystemPage-CAMPoYqM.css → SystemPage-BkRu0Rvx.css} +1 -1
- package/public/app/assets/SystemPage-BvzJlHuY.js +1 -0
- package/public/app/assets/TimePage-7-awH5XL.js +3 -0
- package/public/app/assets/index-4rItIkD-.js +4 -0
- package/public/app/assets/{index-YDz1ree1.css → index-DY4e15Kh.css} +1 -1
- package/public/app/assets/{knowledge-DG0e0uKw.js → knowledge-C6_HvoyB.js} +1 -1
- package/public/app/assets/media-SMfTT-yc.js +1 -0
- package/public/app/index.html +3 -3
- package/public/guide.en.html +72 -99
- package/public/guide.html +44 -86
- package/public/tutorial.en.md +25 -39
- package/public/tutorial.md +25 -39
- package/scripts/backup.js +311 -311
- package/scripts/browser.js +41 -41
- package/scripts/import-data.js +128 -0
- package/scripts/launch.js +101 -94
- package/scripts/plugin.js +150 -150
- package/scripts/reset-password.js +22 -0
- package/scripts/runtime.js +25 -25
- package/scripts/service.js +56 -47
- package/scripts/setup.js +50 -50
- package/scripts/start-server.js +41 -41
- package/scripts/stop.js +36 -36
- package/server/app.js +112 -96
- package/server/auth.js +217 -0
- package/server/channels/contract.js +57 -57
- package/server/channels/hub.js +165 -165
- package/server/channels/index.js +28 -25
- package/server/channels/onebot/index.js +335 -336
- package/server/channels/onebot/token.js +22 -3
- package/server/core/capabilities.js +208 -208
- package/server/core/events.js +64 -60
- package/server/core/image-preprocessor.js +208 -208
- package/server/core/model-manager.js +1213 -1213
- package/server/core/net-guard.js +49 -49
- package/server/core/orchestrator.js +569 -569
- package/server/core/perceivers.js +91 -91
- package/server/core/persona-manager.js +243 -243
- package/server/core/repository.js +293 -293
- package/server/core/response-validator.js +508 -508
- package/server/core/turn-processor.js +630 -630
- package/server/core/turn.js +236 -236
- package/server/core/vision-manager.js +633 -633
- package/server/i18n/errors.js +548 -497
- package/server/i18n/labels.js +649 -653
- package/server/index.js +151 -102
- package/server/knowledge/manager.js +386 -386
- package/server/knowledge/schema.js +12 -8
- package/server/local-access.js +32 -0
- package/server/mind/anticipations.js +507 -507
- package/server/mind/api.js +703 -703
- package/server/mind/budget.js +152 -152
- package/server/mind/context-selection.js +61 -61
- package/server/mind/day-planner.js +324 -324
- package/server/mind/evidence.js +148 -148
- package/server/mind/index.js +445 -445
- package/server/mind/life/diary.js +786 -786
- package/server/mind/life/index.js +1049 -1049
- package/server/mind/observations.js +84 -84
- package/server/mind/own-day.js +324 -324
- package/server/mind/own-voice.js +318 -318
- package/server/mind/senses.js +53 -53
- package/server/mind/time/activity-clock.js +196 -196
- package/server/mind/time/availability.js +69 -69
- package/server/mind/time/commitment-review.js +198 -198
- package/server/mind/time/executor.js +512 -512
- package/server/mind/time/experiences.js +128 -128
- package/server/mind/time/games.js +562 -562
- package/server/mind/time/index.js +739 -739
- package/server/mind/time/intent.js +166 -166
- package/server/mind/time/kinds.js +171 -171
- package/server/mind/time/plugin-activity.js +207 -207
- package/server/mind/time/tasks.js +587 -587
- package/server/mind/util.js +110 -110
- package/server/mind/view.js +273 -273
- package/server/paths.js +102 -102
- package/server/plugins/api.js +204 -204
- package/server/plugins/host.js +967 -967
- package/server/plugins/install.js +295 -295
- package/server/plugins/manifest.js +201 -201
- package/server/plugins/permissions.js +42 -42
- package/server/plugins/runner/guard.mjs +36 -36
- package/server/plugins/runner/worker.mjs +250 -250
- package/server/plugins/schema.js +91 -91
- package/server/plugins/zip.js +112 -112
- package/server/startup-lock.js +118 -118
- package/server/storage/archive.js +242 -241
- package/server/storage/backup-cleanup-worker.js +8 -8
- package/server/storage/backup-cleanup.js +415 -414
- package/server/storage/backup-lock.js +76 -76
- package/server/storage/backup-scheduler.js +131 -131
- package/server/storage/data-package.js +298 -0
- package/server/storage/data-transfer-api.js +50 -0
- package/server/storage/data-transfer-worker.js +18 -0
- package/server/storage/data-transfer.js +415 -0
- package/server/storage/store.js +202 -199
- package/server/studio/readiness.js +181 -190
- package/server/studio/settings.js +236 -236
- package/public/app/assets/ChatsPage-C-FcRapR.js +0 -3
- package/public/app/assets/Empty-CpP5kQHH.js +0 -2
- package/public/app/assets/Field-D4gY-INU.js +0 -1
- package/public/app/assets/HeartPage-CPy_thQd.js +0 -1
- package/public/app/assets/LifePage-CxWvwmSf.js +0 -1
- package/public/app/assets/MemoryPage-DC4rhQ68.js +0 -1
- package/public/app/assets/NaturePage-IvYw04Zq.js +0 -3
- package/public/app/assets/PeoplePage-Cqefm9-q.js +0 -1
- package/public/app/assets/PluginsPage-DKSaKvXb.js +0 -2
- package/public/app/assets/PluginsPage-HyBe5D8w.css +0 -1
- package/public/app/assets/SystemPage-CJmtJkrK.js +0 -1
- package/public/app/assets/TimePage-Cw44inM4.js +0 -3
- package/public/app/assets/index-BheRW-1t.js +0 -4
- package/public/app/assets/media-BzPDBm7e.js +0 -1
package/server/mind/evidence.js
CHANGED
|
@@ -1,148 +1,148 @@
|
|
|
1
|
-
import { evidence, parse } from "./util.js";
|
|
2
|
-
import { evidenceReader } from "./evidence-read.js";
|
|
3
|
-
|
|
4
|
-
// A retelling is an interpretation of an experience, not another experience.
|
|
5
|
-
// Resolve all derivative citations to the same roots, without writing history.
|
|
6
|
-
export function evidenceRoots(
|
|
7
|
-
db,
|
|
8
|
-
sources,
|
|
9
|
-
before = Number.MAX_SAFE_INTEGER,
|
|
10
|
-
{ includeDerived = false } = {},
|
|
11
|
-
) {
|
|
12
|
-
const queue = [...evidence(sources)];
|
|
13
|
-
const visited = new Set();
|
|
14
|
-
const roots = new Set();
|
|
15
|
-
const read = evidenceReader(db);
|
|
16
|
-
for (let cursor = 0; cursor < queue.length; cursor++) {
|
|
17
|
-
if (visited.size >= 2048) return []; // Fail closed on damaged/unbounded graphs.
|
|
18
|
-
const ref = queue[cursor];
|
|
19
|
-
if (visited.has(ref)) continue;
|
|
20
|
-
visited.add(ref);
|
|
21
|
-
const kind = ref[0],
|
|
22
|
-
id = ref.slice(2);
|
|
23
|
-
if (["m", "r", "f"].includes(kind)) {
|
|
24
|
-
if (kind === "m") {
|
|
25
|
-
const event = read(
|
|
26
|
-
"SELECT time,CASE WHEN json_valid(payload) THEN json_extract(payload,'$.artifact.workId') END work_id FROM core_events WHERE seq=?",
|
|
27
|
-
[Number(id)],
|
|
28
|
-
),
|
|
29
|
-
workId = event?.time <= before ? event.work_id : null;
|
|
30
|
-
if (workId) {
|
|
31
|
-
const work = read("SELECT task_id FROM mind_time_works WHERE id=?", [
|
|
32
|
-
workId,
|
|
33
|
-
]);
|
|
34
|
-
if (work?.task_id) {
|
|
35
|
-
queue.push(`x:${work.task_id}`);
|
|
36
|
-
continue;
|
|
37
|
-
}
|
|
38
|
-
}
|
|
39
|
-
}
|
|
40
|
-
roots.add(ref);
|
|
41
|
-
continue;
|
|
42
|
-
}
|
|
43
|
-
if (kind === "o" || kind === "e") {
|
|
44
|
-
const row =
|
|
45
|
-
kind === "o"
|
|
46
|
-
? read(
|
|
47
|
-
"SELECT created FROM mind_observations WHERE id=? AND revoked=0",
|
|
48
|
-
[id],
|
|
49
|
-
)
|
|
50
|
-
: read(
|
|
51
|
-
"SELECT finished AS created FROM mind_actions WHERE id=? AND state='done'",
|
|
52
|
-
[id],
|
|
53
|
-
);
|
|
54
|
-
if (row && row.created <= before) roots.add(ref);
|
|
55
|
-
continue;
|
|
56
|
-
}
|
|
57
|
-
let rows = [];
|
|
58
|
-
if (kind === "x") {
|
|
59
|
-
rows = read(
|
|
60
|
-
"SELECT sources,created,(SELECT MIN(v.created) FROM mind_time_versions v JOIN mind_time_works w ON w.id=v.work_id WHERE w.task_id=mind_time_tasks.id) first_version FROM mind_time_tasks WHERE id=?",
|
|
61
|
-
[id],
|
|
62
|
-
true,
|
|
63
|
-
).filter(
|
|
64
|
-
(row) =>
|
|
65
|
-
row.created <= before &&
|
|
66
|
-
row.first_version !== null &&
|
|
67
|
-
row.first_version <= before,
|
|
68
|
-
);
|
|
69
|
-
if (rows.length) roots.add(ref);
|
|
70
|
-
} else if (kind === "t")
|
|
71
|
-
rows = read(
|
|
72
|
-
"SELECT sources,parent_id,created FROM mind_thoughts WHERE id=? AND hidden=0",
|
|
73
|
-
[id],
|
|
74
|
-
true,
|
|
75
|
-
);
|
|
76
|
-
else if (kind === "d")
|
|
77
|
-
rows = read(
|
|
78
|
-
"SELECT sources,created FROM mind_diary WHERE day=?",
|
|
79
|
-
[id],
|
|
80
|
-
true,
|
|
81
|
-
);
|
|
82
|
-
else if (kind === "s")
|
|
83
|
-
rows = read(
|
|
84
|
-
"SELECT sources,created FROM mind_self WHERE thread=? AND thread NOT IN (SELECT target_id FROM mind_revocations WHERE target_kind='self')",
|
|
85
|
-
[id],
|
|
86
|
-
true,
|
|
87
|
-
);
|
|
88
|
-
else if (kind === "g")
|
|
89
|
-
rows = read(
|
|
90
|
-
"SELECT sources,created FROM mind_meetings WHERE id=? AND id NOT IN (SELECT target_id FROM mind_revocations WHERE target_kind='meeting')",
|
|
91
|
-
[id],
|
|
92
|
-
true,
|
|
93
|
-
);
|
|
94
|
-
else if (kind === "a")
|
|
95
|
-
rows = read(
|
|
96
|
-
"SELECT sources,created FROM mind_anticipations WHERE id=?",
|
|
97
|
-
[id],
|
|
98
|
-
true,
|
|
99
|
-
);
|
|
100
|
-
rows = rows.filter((row) => row.created <= before);
|
|
101
|
-
// A self-originated wish is one stable internal source. Retelling it
|
|
102
|
-
// must not mint another one; it is distinguishable from external roots.
|
|
103
|
-
if (
|
|
104
|
-
kind === "s" &&
|
|
105
|
-
rows.length &&
|
|
106
|
-
rows.some((row) => !evidence(parse(row.sources, [])).length)
|
|
107
|
-
)
|
|
108
|
-
roots.add(ref);
|
|
109
|
-
for (const row of rows) {
|
|
110
|
-
queue.push(...evidence(parse(row.sources, [])));
|
|
111
|
-
if (row.parent_id) queue.push(`t:${row.parent_id}`);
|
|
112
|
-
}
|
|
113
|
-
}
|
|
114
|
-
return [...new Set([...roots, ...(includeDerived ? visited : [])])];
|
|
115
|
-
}
|
|
116
|
-
|
|
117
|
-
// Evidence outside the model's own wording. Unsent drafts, simulations,
|
|
118
|
-
// unknown citations and new names for an internal wish do not qualify.
|
|
119
|
-
export function externalEvidence(db, sources, before) {
|
|
120
|
-
return evidenceRoots(db, sources, before).filter((ref) => {
|
|
121
|
-
const id = ref.slice(2);
|
|
122
|
-
if (ref.startsWith("x:"))
|
|
123
|
-
return !!db
|
|
124
|
-
.prepare(
|
|
125
|
-
"SELECT 1 FROM mind_time_tasks WHERE id=? AND state!='abandoned' AND created<=? AND EXISTS(SELECT 1 FROM mind_time_versions v JOIN mind_time_works w ON w.id=v.work_id WHERE w.task_id=mind_time_tasks.id AND v.created<=? AND length(v.content)>0) AND (SELECT COALESCE(SUM(active_ms),0) FROM mind_time_spans WHERE task_id=mind_time_tasks.id AND updated<=?)>=300000",
|
|
126
|
-
)
|
|
127
|
-
.get(id, before, before, before);
|
|
128
|
-
if (ref.startsWith("m:"))
|
|
129
|
-
return !!db
|
|
130
|
-
.prepare(
|
|
131
|
-
"SELECT 1 FROM core_events WHERE seq=? AND time<=? AND role='user' AND COALESCE(json_extract(payload,'$.simulated'),0)=0 AND seq NOT IN (SELECT seq FROM mind_unlived)",
|
|
132
|
-
)
|
|
133
|
-
.get(Number(id), before);
|
|
134
|
-
if (ref.startsWith("f:"))
|
|
135
|
-
return !!db
|
|
136
|
-
.prepare(
|
|
137
|
-
"SELECT 1 FROM reply_feedback f JOIN decisions d ON d.id=f.decision_id WHERE f.decision_id=? AND f.time<=? AND d.is_demo=0",
|
|
138
|
-
)
|
|
139
|
-
.get(id, before);
|
|
140
|
-
if (ref.startsWith("r:"))
|
|
141
|
-
return !!db
|
|
142
|
-
.prepare(
|
|
143
|
-
"SELECT 1 FROM mind_readings WHERE chunk_id=? AND created<=? LIMIT 1",
|
|
144
|
-
)
|
|
145
|
-
.get(id, before);
|
|
146
|
-
return false;
|
|
147
|
-
});
|
|
148
|
-
}
|
|
1
|
+
import { evidence, parse } from "./util.js";
|
|
2
|
+
import { evidenceReader } from "./evidence-read.js";
|
|
3
|
+
|
|
4
|
+
// A retelling is an interpretation of an experience, not another experience.
|
|
5
|
+
// Resolve all derivative citations to the same roots, without writing history.
|
|
6
|
+
export function evidenceRoots(
|
|
7
|
+
db,
|
|
8
|
+
sources,
|
|
9
|
+
before = Number.MAX_SAFE_INTEGER,
|
|
10
|
+
{ includeDerived = false } = {},
|
|
11
|
+
) {
|
|
12
|
+
const queue = [...evidence(sources)];
|
|
13
|
+
const visited = new Set();
|
|
14
|
+
const roots = new Set();
|
|
15
|
+
const read = evidenceReader(db);
|
|
16
|
+
for (let cursor = 0; cursor < queue.length; cursor++) {
|
|
17
|
+
if (visited.size >= 2048) return []; // Fail closed on damaged/unbounded graphs.
|
|
18
|
+
const ref = queue[cursor];
|
|
19
|
+
if (visited.has(ref)) continue;
|
|
20
|
+
visited.add(ref);
|
|
21
|
+
const kind = ref[0],
|
|
22
|
+
id = ref.slice(2);
|
|
23
|
+
if (["m", "r", "f"].includes(kind)) {
|
|
24
|
+
if (kind === "m") {
|
|
25
|
+
const event = read(
|
|
26
|
+
"SELECT time,CASE WHEN json_valid(payload) THEN json_extract(payload,'$.artifact.workId') END work_id FROM core_events WHERE seq=?",
|
|
27
|
+
[Number(id)],
|
|
28
|
+
),
|
|
29
|
+
workId = event?.time <= before ? event.work_id : null;
|
|
30
|
+
if (workId) {
|
|
31
|
+
const work = read("SELECT task_id FROM mind_time_works WHERE id=?", [
|
|
32
|
+
workId,
|
|
33
|
+
]);
|
|
34
|
+
if (work?.task_id) {
|
|
35
|
+
queue.push(`x:${work.task_id}`);
|
|
36
|
+
continue;
|
|
37
|
+
}
|
|
38
|
+
}
|
|
39
|
+
}
|
|
40
|
+
roots.add(ref);
|
|
41
|
+
continue;
|
|
42
|
+
}
|
|
43
|
+
if (kind === "o" || kind === "e") {
|
|
44
|
+
const row =
|
|
45
|
+
kind === "o"
|
|
46
|
+
? read(
|
|
47
|
+
"SELECT created FROM mind_observations WHERE id=? AND revoked=0",
|
|
48
|
+
[id],
|
|
49
|
+
)
|
|
50
|
+
: read(
|
|
51
|
+
"SELECT finished AS created FROM mind_actions WHERE id=? AND state='done'",
|
|
52
|
+
[id],
|
|
53
|
+
);
|
|
54
|
+
if (row && row.created <= before) roots.add(ref);
|
|
55
|
+
continue;
|
|
56
|
+
}
|
|
57
|
+
let rows = [];
|
|
58
|
+
if (kind === "x") {
|
|
59
|
+
rows = read(
|
|
60
|
+
"SELECT sources,created,(SELECT MIN(v.created) FROM mind_time_versions v JOIN mind_time_works w ON w.id=v.work_id WHERE w.task_id=mind_time_tasks.id) first_version FROM mind_time_tasks WHERE id=?",
|
|
61
|
+
[id],
|
|
62
|
+
true,
|
|
63
|
+
).filter(
|
|
64
|
+
(row) =>
|
|
65
|
+
row.created <= before &&
|
|
66
|
+
row.first_version !== null &&
|
|
67
|
+
row.first_version <= before,
|
|
68
|
+
);
|
|
69
|
+
if (rows.length) roots.add(ref);
|
|
70
|
+
} else if (kind === "t")
|
|
71
|
+
rows = read(
|
|
72
|
+
"SELECT sources,parent_id,created FROM mind_thoughts WHERE id=? AND hidden=0",
|
|
73
|
+
[id],
|
|
74
|
+
true,
|
|
75
|
+
);
|
|
76
|
+
else if (kind === "d")
|
|
77
|
+
rows = read(
|
|
78
|
+
"SELECT sources,created FROM mind_diary WHERE day=?",
|
|
79
|
+
[id],
|
|
80
|
+
true,
|
|
81
|
+
);
|
|
82
|
+
else if (kind === "s")
|
|
83
|
+
rows = read(
|
|
84
|
+
"SELECT sources,created FROM mind_self WHERE thread=? AND thread NOT IN (SELECT target_id FROM mind_revocations WHERE target_kind='self')",
|
|
85
|
+
[id],
|
|
86
|
+
true,
|
|
87
|
+
);
|
|
88
|
+
else if (kind === "g")
|
|
89
|
+
rows = read(
|
|
90
|
+
"SELECT sources,created FROM mind_meetings WHERE id=? AND id NOT IN (SELECT target_id FROM mind_revocations WHERE target_kind='meeting')",
|
|
91
|
+
[id],
|
|
92
|
+
true,
|
|
93
|
+
);
|
|
94
|
+
else if (kind === "a")
|
|
95
|
+
rows = read(
|
|
96
|
+
"SELECT sources,created FROM mind_anticipations WHERE id=?",
|
|
97
|
+
[id],
|
|
98
|
+
true,
|
|
99
|
+
);
|
|
100
|
+
rows = rows.filter((row) => row.created <= before);
|
|
101
|
+
// A self-originated wish is one stable internal source. Retelling it
|
|
102
|
+
// must not mint another one; it is distinguishable from external roots.
|
|
103
|
+
if (
|
|
104
|
+
kind === "s" &&
|
|
105
|
+
rows.length &&
|
|
106
|
+
rows.some((row) => !evidence(parse(row.sources, [])).length)
|
|
107
|
+
)
|
|
108
|
+
roots.add(ref);
|
|
109
|
+
for (const row of rows) {
|
|
110
|
+
queue.push(...evidence(parse(row.sources, [])));
|
|
111
|
+
if (row.parent_id) queue.push(`t:${row.parent_id}`);
|
|
112
|
+
}
|
|
113
|
+
}
|
|
114
|
+
return [...new Set([...roots, ...(includeDerived ? visited : [])])];
|
|
115
|
+
}
|
|
116
|
+
|
|
117
|
+
// Evidence outside the model's own wording. Unsent drafts, simulations,
|
|
118
|
+
// unknown citations and new names for an internal wish do not qualify.
|
|
119
|
+
export function externalEvidence(db, sources, before) {
|
|
120
|
+
return evidenceRoots(db, sources, before).filter((ref) => {
|
|
121
|
+
const id = ref.slice(2);
|
|
122
|
+
if (ref.startsWith("x:"))
|
|
123
|
+
return !!db
|
|
124
|
+
.prepare(
|
|
125
|
+
"SELECT 1 FROM mind_time_tasks WHERE id=? AND state!='abandoned' AND created<=? AND EXISTS(SELECT 1 FROM mind_time_versions v JOIN mind_time_works w ON w.id=v.work_id WHERE w.task_id=mind_time_tasks.id AND v.created<=? AND length(v.content)>0) AND (SELECT COALESCE(SUM(active_ms),0) FROM mind_time_spans WHERE task_id=mind_time_tasks.id AND updated<=?)>=300000",
|
|
126
|
+
)
|
|
127
|
+
.get(id, before, before, before);
|
|
128
|
+
if (ref.startsWith("m:"))
|
|
129
|
+
return !!db
|
|
130
|
+
.prepare(
|
|
131
|
+
"SELECT 1 FROM core_events WHERE seq=? AND time<=? AND role='user' AND COALESCE(json_extract(payload,'$.simulated'),0)=0 AND seq NOT IN (SELECT seq FROM mind_unlived)",
|
|
132
|
+
)
|
|
133
|
+
.get(Number(id), before);
|
|
134
|
+
if (ref.startsWith("f:"))
|
|
135
|
+
return !!db
|
|
136
|
+
.prepare(
|
|
137
|
+
"SELECT 1 FROM reply_feedback f JOIN decisions d ON d.id=f.decision_id WHERE f.decision_id=? AND f.time<=? AND d.is_demo=0",
|
|
138
|
+
)
|
|
139
|
+
.get(id, before);
|
|
140
|
+
if (ref.startsWith("r:"))
|
|
141
|
+
return !!db
|
|
142
|
+
.prepare(
|
|
143
|
+
"SELECT 1 FROM mind_readings WHERE chunk_id=? AND created<=? LIMIT 1",
|
|
144
|
+
)
|
|
145
|
+
.get(id, before);
|
|
146
|
+
return false;
|
|
147
|
+
});
|
|
148
|
+
}
|