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.
Files changed (139) hide show
  1. package/.github/SECURITY.md +4 -4
  2. package/README.en.md +252 -250
  3. package/README.md +252 -250
  4. package/bin/luckytri.js +5 -1
  5. package/docs/en/CHANGELOG.md +8 -0
  6. package/docs/en/connect.md +18 -18
  7. package/docs/en/guide.md +202 -216
  8. package/docs/en/npm-release.md +25 -25
  9. package/docs/zh/CHANGELOG.md +8 -0
  10. package/docs/zh/connect.md +17 -17
  11. package/docs/zh/guide.md +202 -216
  12. package/docs/zh/npm-release.md +33 -33
  13. package/package.json +110 -108
  14. package/plugins/sdk/index.d.ts +155 -155
  15. package/plugins/sdk/testing.js +58 -58
  16. package/plugins/weather/index.js +82 -82
  17. package/plugins/weather/luckytri-plugin.json +29 -29
  18. package/public/app/assets/ChatsPage-BhlJHseG.js +3 -0
  19. package/public/app/assets/Empty-DP6WMGHi.js +2 -0
  20. package/public/app/assets/Field-CtbdqaiB.js +1 -0
  21. package/public/app/assets/HeartPage-32BeTPn2.js +1 -0
  22. package/public/app/assets/LifePage-CxSm0XKI.js +1 -0
  23. package/public/app/assets/MemoryPage-BeKBcPCY.js +1 -0
  24. package/public/app/assets/NaturePage-NEPYl2HS.js +3 -0
  25. package/public/app/assets/PeoplePage-DxtpekwM.js +1 -0
  26. package/public/app/assets/PluginsPage-CVVQwEBI.css +1 -0
  27. package/public/app/assets/PluginsPage-DksEZbUU.js +2 -0
  28. package/public/app/assets/{SystemPage-CAMPoYqM.css → SystemPage-BkRu0Rvx.css} +1 -1
  29. package/public/app/assets/SystemPage-BvzJlHuY.js +1 -0
  30. package/public/app/assets/TimePage-7-awH5XL.js +3 -0
  31. package/public/app/assets/index-4rItIkD-.js +4 -0
  32. package/public/app/assets/{index-YDz1ree1.css → index-DY4e15Kh.css} +1 -1
  33. package/public/app/assets/{knowledge-DG0e0uKw.js → knowledge-C6_HvoyB.js} +1 -1
  34. package/public/app/assets/media-SMfTT-yc.js +1 -0
  35. package/public/app/index.html +3 -3
  36. package/public/guide.en.html +72 -99
  37. package/public/guide.html +44 -86
  38. package/public/tutorial.en.md +25 -39
  39. package/public/tutorial.md +25 -39
  40. package/scripts/backup.js +311 -311
  41. package/scripts/browser.js +41 -41
  42. package/scripts/import-data.js +128 -0
  43. package/scripts/launch.js +101 -94
  44. package/scripts/plugin.js +150 -150
  45. package/scripts/reset-password.js +22 -0
  46. package/scripts/runtime.js +25 -25
  47. package/scripts/service.js +56 -47
  48. package/scripts/setup.js +50 -50
  49. package/scripts/start-server.js +41 -41
  50. package/scripts/stop.js +36 -36
  51. package/server/app.js +112 -96
  52. package/server/auth.js +217 -0
  53. package/server/channels/contract.js +57 -57
  54. package/server/channels/hub.js +165 -165
  55. package/server/channels/index.js +28 -25
  56. package/server/channels/onebot/index.js +335 -336
  57. package/server/channels/onebot/token.js +22 -3
  58. package/server/core/capabilities.js +208 -208
  59. package/server/core/events.js +64 -60
  60. package/server/core/image-preprocessor.js +208 -208
  61. package/server/core/model-manager.js +1213 -1213
  62. package/server/core/net-guard.js +49 -49
  63. package/server/core/orchestrator.js +569 -569
  64. package/server/core/perceivers.js +91 -91
  65. package/server/core/persona-manager.js +243 -243
  66. package/server/core/repository.js +293 -293
  67. package/server/core/response-validator.js +508 -508
  68. package/server/core/turn-processor.js +630 -630
  69. package/server/core/turn.js +236 -236
  70. package/server/core/vision-manager.js +633 -633
  71. package/server/i18n/errors.js +548 -497
  72. package/server/i18n/labels.js +649 -653
  73. package/server/index.js +151 -102
  74. package/server/knowledge/manager.js +386 -386
  75. package/server/knowledge/schema.js +12 -8
  76. package/server/local-access.js +32 -0
  77. package/server/mind/anticipations.js +507 -507
  78. package/server/mind/api.js +703 -703
  79. package/server/mind/budget.js +152 -152
  80. package/server/mind/context-selection.js +61 -61
  81. package/server/mind/day-planner.js +324 -324
  82. package/server/mind/evidence.js +148 -148
  83. package/server/mind/index.js +445 -445
  84. package/server/mind/life/diary.js +786 -786
  85. package/server/mind/life/index.js +1049 -1049
  86. package/server/mind/observations.js +84 -84
  87. package/server/mind/own-day.js +324 -324
  88. package/server/mind/own-voice.js +318 -318
  89. package/server/mind/senses.js +53 -53
  90. package/server/mind/time/activity-clock.js +196 -196
  91. package/server/mind/time/availability.js +69 -69
  92. package/server/mind/time/commitment-review.js +198 -198
  93. package/server/mind/time/executor.js +512 -512
  94. package/server/mind/time/experiences.js +128 -128
  95. package/server/mind/time/games.js +562 -562
  96. package/server/mind/time/index.js +739 -739
  97. package/server/mind/time/intent.js +166 -166
  98. package/server/mind/time/kinds.js +171 -171
  99. package/server/mind/time/plugin-activity.js +207 -207
  100. package/server/mind/time/tasks.js +587 -587
  101. package/server/mind/util.js +110 -110
  102. package/server/mind/view.js +273 -273
  103. package/server/paths.js +102 -102
  104. package/server/plugins/api.js +204 -204
  105. package/server/plugins/host.js +967 -967
  106. package/server/plugins/install.js +295 -295
  107. package/server/plugins/manifest.js +201 -201
  108. package/server/plugins/permissions.js +42 -42
  109. package/server/plugins/runner/guard.mjs +36 -36
  110. package/server/plugins/runner/worker.mjs +250 -250
  111. package/server/plugins/schema.js +91 -91
  112. package/server/plugins/zip.js +112 -112
  113. package/server/startup-lock.js +118 -118
  114. package/server/storage/archive.js +242 -241
  115. package/server/storage/backup-cleanup-worker.js +8 -8
  116. package/server/storage/backup-cleanup.js +415 -414
  117. package/server/storage/backup-lock.js +76 -76
  118. package/server/storage/backup-scheduler.js +131 -131
  119. package/server/storage/data-package.js +298 -0
  120. package/server/storage/data-transfer-api.js +50 -0
  121. package/server/storage/data-transfer-worker.js +18 -0
  122. package/server/storage/data-transfer.js +415 -0
  123. package/server/storage/store.js +202 -199
  124. package/server/studio/readiness.js +181 -190
  125. package/server/studio/settings.js +236 -236
  126. package/public/app/assets/ChatsPage-C-FcRapR.js +0 -3
  127. package/public/app/assets/Empty-CpP5kQHH.js +0 -2
  128. package/public/app/assets/Field-D4gY-INU.js +0 -1
  129. package/public/app/assets/HeartPage-CPy_thQd.js +0 -1
  130. package/public/app/assets/LifePage-CxWvwmSf.js +0 -1
  131. package/public/app/assets/MemoryPage-DC4rhQ68.js +0 -1
  132. package/public/app/assets/NaturePage-IvYw04Zq.js +0 -3
  133. package/public/app/assets/PeoplePage-Cqefm9-q.js +0 -1
  134. package/public/app/assets/PluginsPage-DKSaKvXb.js +0 -2
  135. package/public/app/assets/PluginsPage-HyBe5D8w.css +0 -1
  136. package/public/app/assets/SystemPage-CJmtJkrK.js +0 -1
  137. package/public/app/assets/TimePage-Cw44inM4.js +0 -3
  138. package/public/app/assets/index-BheRW-1t.js +0 -4
  139. package/public/app/assets/media-BzPDBm7e.js +0 -1
@@ -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
+ }