@acquiredintelligence/attend 0.0.0-stage → 0.1.0

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 (254) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +580 -2
  3. package/dist/attend.d.ts +30 -0
  4. package/dist/attend.d.ts.map +1 -0
  5. package/dist/attend.js +428 -0
  6. package/dist/attend.js.map +1 -0
  7. package/dist/cli.d.ts +3 -0
  8. package/dist/cli.d.ts.map +1 -0
  9. package/dist/cli.js +4 -0
  10. package/dist/cli.js.map +1 -0
  11. package/dist/core/ids.d.ts +12 -0
  12. package/dist/core/ids.d.ts.map +1 -0
  13. package/dist/core/ids.js +97 -0
  14. package/dist/core/ids.js.map +1 -0
  15. package/dist/core/reducer.d.ts +26 -0
  16. package/dist/core/reducer.d.ts.map +1 -0
  17. package/dist/core/reducer.js +437 -0
  18. package/dist/core/reducer.js.map +1 -0
  19. package/dist/core/seen.d.ts +22 -0
  20. package/dist/core/seen.d.ts.map +1 -0
  21. package/dist/core/seen.js +61 -0
  22. package/dist/core/seen.js.map +1 -0
  23. package/dist/core/state.d.ts +12 -0
  24. package/dist/core/state.d.ts.map +1 -0
  25. package/dist/core/state.js +90 -0
  26. package/dist/core/state.js.map +1 -0
  27. package/dist/core/step.d.ts +14 -0
  28. package/dist/core/step.d.ts.map +1 -0
  29. package/dist/core/step.js +17 -0
  30. package/dist/core/step.js.map +1 -0
  31. package/dist/core/threshold.d.ts +40 -0
  32. package/dist/core/threshold.d.ts.map +1 -0
  33. package/dist/core/threshold.js +72 -0
  34. package/dist/core/threshold.js.map +1 -0
  35. package/dist/core/types.d.ts +704 -0
  36. package/dist/core/types.d.ts.map +1 -0
  37. package/dist/core/types.js +24 -0
  38. package/dist/core/types.js.map +1 -0
  39. package/dist/core/window.d.ts +38 -0
  40. package/dist/core/window.d.ts.map +1 -0
  41. package/dist/core/window.js +322 -0
  42. package/dist/core/window.js.map +1 -0
  43. package/dist/decisions.d.ts +53 -0
  44. package/dist/decisions.d.ts.map +1 -0
  45. package/dist/decisions.js +115 -0
  46. package/dist/decisions.js.map +1 -0
  47. package/dist/errors.d.ts +36 -0
  48. package/dist/errors.d.ts.map +1 -0
  49. package/dist/errors.js +53 -0
  50. package/dist/errors.js.map +1 -0
  51. package/dist/index.d.ts +10 -0
  52. package/dist/index.d.ts.map +1 -0
  53. package/dist/index.js +4 -0
  54. package/dist/index.js.map +1 -0
  55. package/dist/internal/adapter.d.ts +21 -0
  56. package/dist/internal/adapter.d.ts.map +1 -0
  57. package/dist/internal/adapter.js +62 -0
  58. package/dist/internal/adapter.js.map +1 -0
  59. package/dist/internal/assert.d.ts +5 -0
  60. package/dist/internal/assert.d.ts.map +1 -0
  61. package/dist/internal/assert.js +14 -0
  62. package/dist/internal/assert.js.map +1 -0
  63. package/dist/internal/clock.d.ts +8 -0
  64. package/dist/internal/clock.d.ts.map +1 -0
  65. package/dist/internal/clock.js +38 -0
  66. package/dist/internal/clock.js.map +1 -0
  67. package/dist/internal/http.d.ts +42 -0
  68. package/dist/internal/http.d.ts.map +1 -0
  69. package/dist/internal/http.js +122 -0
  70. package/dist/internal/http.js.map +1 -0
  71. package/dist/internal/images.d.ts +18 -0
  72. package/dist/internal/images.d.ts.map +1 -0
  73. package/dist/internal/images.js +75 -0
  74. package/dist/internal/images.js.map +1 -0
  75. package/dist/internal/json.d.ts +3 -0
  76. package/dist/internal/json.d.ts.map +1 -0
  77. package/dist/internal/json.js +5 -0
  78. package/dist/internal/json.js.map +1 -0
  79. package/dist/internal/prompt.d.ts +31 -0
  80. package/dist/internal/prompt.d.ts.map +1 -0
  81. package/dist/internal/prompt.js +149 -0
  82. package/dist/internal/prompt.js.map +1 -0
  83. package/dist/internal/shared.d.ts +12 -0
  84. package/dist/internal/shared.d.ts.map +1 -0
  85. package/dist/internal/shared.js +134 -0
  86. package/dist/internal/shared.js.map +1 -0
  87. package/dist/jev.d.ts +74 -0
  88. package/dist/jev.d.ts.map +1 -0
  89. package/dist/jev.js +156 -0
  90. package/dist/jev.js.map +1 -0
  91. package/dist/llm.d.ts +164 -0
  92. package/dist/llm.d.ts.map +1 -0
  93. package/dist/llm.js +79 -0
  94. package/dist/llm.js.map +1 -0
  95. package/dist/mcp.d.ts +130 -0
  96. package/dist/mcp.d.ts.map +1 -0
  97. package/dist/mcp.js +550 -0
  98. package/dist/mcp.js.map +1 -0
  99. package/dist/memory.d.ts +10 -0
  100. package/dist/memory.d.ts.map +1 -0
  101. package/dist/memory.js +50 -0
  102. package/dist/memory.js.map +1 -0
  103. package/dist/postgres.d.ts +25 -0
  104. package/dist/postgres.d.ts.map +1 -0
  105. package/dist/postgres.js +56 -0
  106. package/dist/postgres.js.map +1 -0
  107. package/dist/redis.d.ts +20 -0
  108. package/dist/redis.d.ts.map +1 -0
  109. package/dist/redis.js +83 -0
  110. package/dist/redis.js.map +1 -0
  111. package/dist/server/compat.d.ts +13 -0
  112. package/dist/server/compat.d.ts.map +1 -0
  113. package/dist/server/compat.js +5 -0
  114. package/dist/server/compat.js.map +1 -0
  115. package/dist/server/cursor.d.ts +15 -0
  116. package/dist/server/cursor.d.ts.map +1 -0
  117. package/dist/server/cursor.js +50 -0
  118. package/dist/server/cursor.js.map +1 -0
  119. package/dist/server/events.d.ts +42 -0
  120. package/dist/server/events.d.ts.map +1 -0
  121. package/dist/server/events.js +189 -0
  122. package/dist/server/events.js.map +1 -0
  123. package/dist/server/fanout.d.ts +28 -0
  124. package/dist/server/fanout.d.ts.map +1 -0
  125. package/dist/server/fanout.js +184 -0
  126. package/dist/server/fanout.js.map +1 -0
  127. package/dist/server/guard.d.ts +19 -0
  128. package/dist/server/guard.d.ts.map +1 -0
  129. package/dist/server/guard.js +27 -0
  130. package/dist/server/guard.js.map +1 -0
  131. package/dist/server/http.d.ts +4 -0
  132. package/dist/server/http.d.ts.map +1 -0
  133. package/dist/server/http.js +323 -0
  134. package/dist/server/http.js.map +1 -0
  135. package/dist/server/ingest.d.ts +4 -0
  136. package/dist/server/ingest.d.ts.map +1 -0
  137. package/dist/server/ingest.js +400 -0
  138. package/dist/server/ingest.js.map +1 -0
  139. package/dist/server/install.d.ts +5 -0
  140. package/dist/server/install.d.ts.map +1 -0
  141. package/dist/server/install.js +91 -0
  142. package/dist/server/install.js.map +1 -0
  143. package/dist/server/poll.d.ts +4 -0
  144. package/dist/server/poll.d.ts.map +1 -0
  145. package/dist/server/poll.js +45 -0
  146. package/dist/server/poll.js.map +1 -0
  147. package/dist/server/serve.d.ts +19 -0
  148. package/dist/server/serve.d.ts.map +1 -0
  149. package/dist/server/serve.js +238 -0
  150. package/dist/server/serve.js.map +1 -0
  151. package/dist/server/sessions.d.ts +14 -0
  152. package/dist/server/sessions.d.ts.map +1 -0
  153. package/dist/server/sessions.js +54 -0
  154. package/dist/server/sessions.js.map +1 -0
  155. package/dist/server/stream.d.ts +11 -0
  156. package/dist/server/stream.d.ts.map +1 -0
  157. package/dist/server/stream.js +216 -0
  158. package/dist/server/stream.js.map +1 -0
  159. package/dist/server/tools.d.ts +22 -0
  160. package/dist/server/tools.d.ts.map +1 -0
  161. package/dist/server/tools.js +55 -0
  162. package/dist/server/tools.js.map +1 -0
  163. package/dist/server/types.d.ts +351 -0
  164. package/dist/server/types.d.ts.map +1 -0
  165. package/dist/server/types.js +5 -0
  166. package/dist/server/types.js.map +1 -0
  167. package/dist/server.d.ts +11 -0
  168. package/dist/server.d.ts.map +1 -0
  169. package/dist/server.js +10 -0
  170. package/dist/server.js.map +1 -0
  171. package/dist/shell/budget.d.ts +4 -0
  172. package/dist/shell/budget.d.ts.map +1 -0
  173. package/dist/shell/budget.js +5 -0
  174. package/dist/shell/budget.js.map +1 -0
  175. package/dist/shell/copy.d.ts +17 -0
  176. package/dist/shell/copy.d.ts.map +1 -0
  177. package/dist/shell/copy.js +67 -0
  178. package/dist/shell/copy.js.map +1 -0
  179. package/dist/shell/decisions.d.ts +6 -0
  180. package/dist/shell/decisions.d.ts.map +1 -0
  181. package/dist/shell/decisions.js +42 -0
  182. package/dist/shell/decisions.js.map +1 -0
  183. package/dist/shell/read.d.ts +7 -0
  184. package/dist/shell/read.d.ts.map +1 -0
  185. package/dist/shell/read.js +21 -0
  186. package/dist/shell/read.js.map +1 -0
  187. package/dist/shell/scheduler.d.ts +4 -0
  188. package/dist/shell/scheduler.d.ts.map +1 -0
  189. package/dist/shell/scheduler.js +90 -0
  190. package/dist/shell/scheduler.js.map +1 -0
  191. package/dist/shell/scope.d.ts +27 -0
  192. package/dist/shell/scope.d.ts.map +1 -0
  193. package/dist/shell/scope.js +343 -0
  194. package/dist/shell/scope.js.map +1 -0
  195. package/dist/shell/types.d.ts +156 -0
  196. package/dist/shell/types.d.ts.map +1 -0
  197. package/dist/shell/types.js +2 -0
  198. package/dist/shell/types.js.map +1 -0
  199. package/dist/sqlite.d.ts +14 -0
  200. package/dist/sqlite.d.ts.map +1 -0
  201. package/dist/sqlite.js +39 -0
  202. package/dist/sqlite.js.map +1 -0
  203. package/dist/step.d.ts +18 -0
  204. package/dist/step.d.ts.map +1 -0
  205. package/dist/step.js +14 -0
  206. package/dist/step.js.map +1 -0
  207. package/dist/store/memory.d.ts +12 -0
  208. package/dist/store/memory.d.ts.map +1 -0
  209. package/dist/store/memory.js +264 -0
  210. package/dist/store/memory.js.map +1 -0
  211. package/dist/store/postgres.d.ts +24 -0
  212. package/dist/store/postgres.d.ts.map +1 -0
  213. package/dist/store/postgres.js +364 -0
  214. package/dist/store/postgres.js.map +1 -0
  215. package/dist/store/redis.d.ts +12 -0
  216. package/dist/store/redis.d.ts.map +1 -0
  217. package/dist/store/redis.js +540 -0
  218. package/dist/store/redis.js.map +1 -0
  219. package/dist/store/sqlite-worker.d.ts +91 -0
  220. package/dist/store/sqlite-worker.d.ts.map +1 -0
  221. package/dist/store/sqlite-worker.js +322 -0
  222. package/dist/store/sqlite-worker.js.map +1 -0
  223. package/dist/store/sqlite.d.ts +34 -0
  224. package/dist/store/sqlite.d.ts.map +1 -0
  225. package/dist/store/sqlite.js +238 -0
  226. package/dist/store/sqlite.js.map +1 -0
  227. package/dist/store/types.d.ts +137 -0
  228. package/dist/store/types.d.ts.map +1 -0
  229. package/dist/store/types.js +2 -0
  230. package/dist/store/types.js.map +1 -0
  231. package/dist/testing/conformance.d.ts +13 -0
  232. package/dist/testing/conformance.d.ts.map +1 -0
  233. package/dist/testing/conformance.js +542 -0
  234. package/dist/testing/conformance.js.map +1 -0
  235. package/dist/testing/wire.d.ts +16 -0
  236. package/dist/testing/wire.d.ts.map +1 -0
  237. package/dist/testing/wire.js +304 -0
  238. package/dist/testing/wire.js.map +1 -0
  239. package/dist/testing.d.ts +113 -0
  240. package/dist/testing.d.ts.map +1 -0
  241. package/dist/testing.js +655 -0
  242. package/dist/testing.js.map +1 -0
  243. package/dist/types.d.ts +5 -0
  244. package/dist/types.d.ts.map +1 -0
  245. package/dist/types.js +5 -0
  246. package/dist/types.js.map +1 -0
  247. package/package.json +130 -4
  248. package/skills/attend/SKILL.md +231 -0
  249. package/skills/attend/references/judges.md +283 -0
  250. package/skills/attend/references/kinds.md +62 -0
  251. package/skills/attend/references/mcp.md +132 -0
  252. package/skills/attend/references/sinks.md +73 -0
  253. package/skills/attend/references/stores.md +90 -0
  254. package/skills/attend/references/testing.md +120 -0
@@ -0,0 +1,322 @@
1
+ import { isMainThread, parentPort, workerData } from 'node:worker_threads';
2
+ function column(row, name) {
3
+ if (typeof row !== 'object' || row === null)
4
+ throw new Error('attend/sqlite: expected a row');
5
+ return Reflect.get(row, name);
6
+ }
7
+ function rawRow(row) {
8
+ return {
9
+ position: Number(column(row, 'position')), scope: column(row, 'scope'), kind: column(row, 'kind'),
10
+ id: column(row, 'id'), at: column(row, 'at'), route: column(row, 'route'), body: column(row, 'body'),
11
+ };
12
+ }
13
+ /** No row is `undefined` from node:sqlite and `null` from bun:sqlite. */
14
+ function absent(row) {
15
+ return row === undefined || row === null;
16
+ }
17
+ function message(error) {
18
+ return error instanceof Error ? error.message : String(error);
19
+ }
20
+ /** Creates or adopts the tables and returns the synchronous SQL engine. */
21
+ export function openTables(db, prefix) {
22
+ const scopes = `${prefix}scopes`;
23
+ const inputs = `${prefix}inputs`;
24
+ const snapshots = `${prefix}snapshots`;
25
+ const decisions = `${prefix}decisions`;
26
+ const rollback = () => {
27
+ try {
28
+ db.exec('ROLLBACK');
29
+ }
30
+ catch { /* BEGIN may itself have failed. */ }
31
+ };
32
+ const transaction = (run) => {
33
+ try {
34
+ db.exec('BEGIN IMMEDIATE');
35
+ const result = run();
36
+ db.exec('COMMIT');
37
+ return result;
38
+ }
39
+ catch (error) {
40
+ rollback();
41
+ throw error;
42
+ }
43
+ };
44
+ db.exec(`
45
+ CREATE TABLE IF NOT EXISTS ${scopes} (scope TEXT PRIMARY KEY, version INTEGER NOT NULL, due REAL);
46
+ CREATE INDEX IF NOT EXISTS ${prefix}scopes_due ON ${scopes} (due, scope) WHERE due IS NOT NULL;
47
+ CREATE TABLE IF NOT EXISTS ${inputs} (scope TEXT NOT NULL, version INTEGER NOT NULL, input TEXT NOT NULL, PRIMARY KEY (scope, version)) WITHOUT ROWID;
48
+ CREATE TABLE IF NOT EXISTS ${snapshots} (scope TEXT PRIMARY KEY, version INTEGER NOT NULL, policy TEXT NOT NULL, reducer INTEGER NOT NULL, record TEXT NOT NULL);
49
+ CREATE TABLE IF NOT EXISTS ${decisions} (position INTEGER PRIMARY KEY AUTOINCREMENT, scope TEXT NOT NULL, kind TEXT NOT NULL, id TEXT NOT NULL, at REAL NOT NULL, route TEXT, body TEXT NOT NULL, UNIQUE (kind, id));
50
+ CREATE INDEX IF NOT EXISTS ${prefix}decisions_scope ON ${decisions} (scope, position);
51
+ CREATE INDEX IF NOT EXISTS ${prefix}decisions_at ON ${decisions} (at);
52
+ CREATE TABLE IF NOT EXISTS ${prefix}meta (key TEXT PRIMARY KEY, value TEXT NOT NULL);
53
+ `);
54
+ db.prepare(`INSERT INTO ${prefix}meta (key, value) VALUES ('epoch', ?) ON CONFLICT (key) DO NOTHING`).run(crypto.randomUUID());
55
+ const epoch = column(db.prepare(`SELECT value FROM ${prefix}meta WHERE key = 'epoch'`).get(), 'value');
56
+ const selectHead = db.prepare(`SELECT max(position) AS head FROM ${decisions}`);
57
+ const head = () => {
58
+ const value = column(selectHead.get(), 'head');
59
+ return value === null ? null : Number(value);
60
+ };
61
+ const newest = db.prepare(`SELECT position FROM ${decisions} ORDER BY position DESC LIMIT 1 OFFSET ?`);
62
+ const firstSince = db.prepare(`SELECT position FROM ${decisions} WHERE at >= ? ORDER BY position LIMIT 1`);
63
+ const dropBelow = db.prepare(`DELETE FROM ${decisions} WHERE position < ?`);
64
+ const trim = (retention) => {
65
+ const last = head();
66
+ if (last === null)
67
+ return;
68
+ const floors = [];
69
+ if (retention.maxRows !== undefined) {
70
+ const row = newest.get(Math.max(retention.maxRows - 1, 0));
71
+ if (!absent(row))
72
+ floors.push(Number(column(row, 'position')));
73
+ }
74
+ if (retention.olderThanMs !== undefined) {
75
+ const row = firstSince.get(Date.now() - retention.olderThanMs);
76
+ floors.push(absent(row) ? last : Number(column(row, 'position')));
77
+ }
78
+ if (floors.length)
79
+ dropBelow.run(Math.min(last, Math.max(...floors)));
80
+ };
81
+ const create = db.prepare(`INSERT INTO ${scopes} (scope, version, due) VALUES (?, ?, ?) ON CONFLICT (scope) DO NOTHING`);
82
+ const advance = db.prepare(`UPDATE ${scopes} SET version = ? WHERE scope = ? AND version = ?`);
83
+ const advanceDue = db.prepare(`UPDATE ${scopes} SET version = ?, due = ? WHERE scope = ? AND version = ?`);
84
+ const insertInput = db.prepare(`INSERT INTO ${inputs} (scope, version, input) VALUES (?, ?, ?)`);
85
+ const upsertSnapshot = db.prepare(`INSERT INTO ${snapshots} (scope, version, policy, reducer, record) VALUES (?, ?, ?, ?, ?) ON CONFLICT (scope) DO UPDATE SET version = excluded.version, policy = excluded.policy, reducer = excluded.reducer, record = excluded.record`);
86
+ const trimInputs = db.prepare(`DELETE FROM ${inputs} WHERE scope = ? AND version <= ?`);
87
+ const append = db.prepare(`INSERT INTO ${decisions} (scope, kind, id, at, route, body) VALUES (?, ?, ?, ?, ?, ?) ON CONFLICT (kind, id) DO NOTHING`);
88
+ const selectScope = db.prepare(`SELECT version FROM ${scopes} WHERE scope = ?`);
89
+ const selectSnapshot = db.prepare(`SELECT version, policy, reducer, record FROM ${snapshots} WHERE scope = ?`);
90
+ const selectTail = db.prepare(`SELECT input FROM ${inputs} WHERE scope = ? ORDER BY version`);
91
+ const selectDue = db.prepare(`SELECT due, scope FROM ${scopes} WHERE due <= ? ORDER BY due, scope LIMIT ?`);
92
+ const selectDueAfter = db.prepare(`SELECT due, scope FROM ${scopes} WHERE due <= ? AND (due, scope) > (?, ?) ORDER BY due, scope LIMIT ?`);
93
+ const removals = [scopes, inputs, snapshots].map((table) => db.prepare(`DELETE FROM ${table} WHERE scope = ?`));
94
+ const selectBounds = db.prepare(`SELECT (SELECT min(position) FROM ${decisions}) AS first, (SELECT max(position) FROM ${decisions}) AS last`);
95
+ const scan = (scoped) => db.prepare(`SELECT position, scope, kind, id, at, route,
96
+ CASE WHEN (? IS NULL OR kind IN (SELECT value FROM json_each(?)))
97
+ AND (? IS NULL OR route IN (SELECT value FROM json_each(?)))
98
+ AND (? IS NULL OR at >= ?)
99
+ AND (? IS NULL OR substr(scope, 1, length(?)) = ?) THEN body END AS body
100
+ FROM ${decisions} WHERE ${scoped ? 'scope = ? AND ' : ''}position > ? AND position <= ? ORDER BY position LIMIT ?`);
101
+ const scanAll = scan(false);
102
+ const scanScope = scan(true);
103
+ const selectRow = db.prepare(`SELECT position, scope, kind, id, at, route, body FROM ${decisions} WHERE kind = ? AND id = ?`);
104
+ const write = (writes) => {
105
+ let appended = false;
106
+ const outcomes = writes.map((w) => {
107
+ const final = w.expectedVersion + w.inputs.length;
108
+ const result = w.expectedVersion === 0
109
+ ? create.run(w.scope, final, w.due)
110
+ : w.setDue ? advanceDue.run(final, w.due, w.scope, w.expectedVersion) : advance.run(final, w.scope, w.expectedVersion);
111
+ if (Number(result.changes) === 0)
112
+ return 'conflict';
113
+ for (const [i, input] of w.inputs.entries()) {
114
+ const version = w.expectedVersion + 1 + i;
115
+ if (w.snapshot === null || version > w.snapshot.version)
116
+ insertInput.run(w.scope, version, input);
117
+ }
118
+ if (w.snapshot !== null) {
119
+ upsertSnapshot.run(w.scope, w.snapshot.version, w.snapshot.policy, w.snapshot.reducer, w.snapshot.record);
120
+ trimInputs.run(w.scope, w.snapshot.version);
121
+ }
122
+ for (const row of w.appends) {
123
+ if (Number(append.run(row.scope, row.kind, row.id, row.at, row.route, row.body).changes) > 0)
124
+ appended = true;
125
+ }
126
+ return 'ok';
127
+ });
128
+ return { outcomes, appended };
129
+ };
130
+ return {
131
+ epoch: () => epoch,
132
+ load(scope) {
133
+ db.exec('SAVEPOINT attend_load');
134
+ try {
135
+ const row = selectScope.get(scope);
136
+ if (absent(row))
137
+ return null;
138
+ const snapshot = selectSnapshot.get(scope);
139
+ return {
140
+ version: column(row, 'version'),
141
+ snapshot: absent(snapshot) ? null : snapshot,
142
+ tail: selectTail.all(scope).map((r) => column(r, 'input')),
143
+ };
144
+ }
145
+ finally {
146
+ db.exec('RELEASE attend_load');
147
+ }
148
+ },
149
+ commit(groups, retention) {
150
+ return transaction(() => {
151
+ const results = groups.map((group) => {
152
+ db.exec('SAVEPOINT attend_group');
153
+ let value;
154
+ try {
155
+ value = write(group);
156
+ }
157
+ catch (error) {
158
+ db.exec('ROLLBACK TO attend_group');
159
+ db.exec('RELEASE attend_group');
160
+ return { error };
161
+ }
162
+ db.exec('RELEASE attend_group');
163
+ return { value };
164
+ });
165
+ if (retention && results.some((r) => 'value' in r && r.value.appended))
166
+ trim(retention);
167
+ return results;
168
+ });
169
+ },
170
+ due(now, limit, after) {
171
+ return after ? selectDueAfter.all(now, after.due, after.scope, limit) : selectDue.all(now, limit);
172
+ },
173
+ remove(scope) {
174
+ transaction(() => {
175
+ for (const removal of removals)
176
+ removal.run(scope);
177
+ });
178
+ },
179
+ bounds() {
180
+ return selectBounds.get();
181
+ },
182
+ read(query) {
183
+ const last = head();
184
+ const scanLimit = query.scanLimit ?? 4 * query.limit;
185
+ const filtered = query.kinds !== undefined || query.routes !== undefined || query.sinceAt !== undefined || !!query.scopePrefix;
186
+ const budget = filtered ? scanLimit : Math.min(query.limit, scanLimit);
187
+ const kinds = query.kinds === undefined ? null : JSON.stringify(query.kinds);
188
+ const routes = query.routes === undefined ? null : JSON.stringify(query.routes);
189
+ const sinceAt = query.sinceAt ?? null;
190
+ const scopePrefix = query.scopePrefix || null;
191
+ const filters = [kinds, kinds, routes, routes, sinceAt, sinceAt, scopePrefix, scopePrefix, scopePrefix];
192
+ const range = [query.after ?? 0, last ?? 0, budget + 1];
193
+ const rows = query.scope === undefined ? scanAll.all(...filters, ...range) : scanScope.all(...filters, query.scope, ...range);
194
+ const matched = [];
195
+ let examined = 0;
196
+ let checked = query.after;
197
+ for (const row of rows) {
198
+ if (examined === scanLimit || matched.length === query.limit)
199
+ return { rows: matched, checked, more: true };
200
+ examined++;
201
+ const raw = rawRow(row);
202
+ checked = raw.position;
203
+ if (raw.body !== null)
204
+ matched.push(raw);
205
+ }
206
+ return { rows: matched, checked: last === null ? query.after : Math.max(last, query.after ?? 0), more: false };
207
+ },
208
+ find(kind, id) {
209
+ const row = selectRow.get(kind, id);
210
+ return absent(row) ? null : rawRow(row);
211
+ },
212
+ trim(retention) { transaction(() => trim(retention)); },
213
+ };
214
+ }
215
+ /** Coalesces every group queued before the next immediate into one transaction. */
216
+ export function queueCommits(engine, retention) {
217
+ let queued = [];
218
+ return (writes) => new Promise((resolve, reject) => {
219
+ queued.push({ writes, resolve, reject });
220
+ if (queued.length !== 1)
221
+ return;
222
+ setImmediate(() => {
223
+ const batch = queued;
224
+ queued = [];
225
+ try {
226
+ const results = engine.commit(batch.map((group) => group.writes), retention);
227
+ for (const [i, result] of results.entries()) {
228
+ const group = batch[i];
229
+ if (!group)
230
+ continue;
231
+ if ('error' in result)
232
+ group.reject(result.error);
233
+ else
234
+ group.resolve(result.value);
235
+ }
236
+ }
237
+ catch (error) {
238
+ for (const group of batch)
239
+ group.reject(error);
240
+ }
241
+ });
242
+ });
243
+ }
244
+ /**
245
+ * Two connections switching one new file to WAL at once: the loser gets SQLITE_BUSY at once, without
246
+ * waiting out busy_timeout. So retry, for as long as busy_timeout would have waited.
247
+ */
248
+ function useWal(db) {
249
+ for (let attempt = 1;; attempt += 1) {
250
+ try {
251
+ db.exec('PRAGMA journal_mode = WAL');
252
+ return;
253
+ }
254
+ catch (error) {
255
+ if (attempt === 50 || Reflect.get(Object(error), 'errcode') !== 5)
256
+ throw error;
257
+ Atomics.wait(new Int32Array(new SharedArrayBuffer(4)), 0, 0, 100);
258
+ }
259
+ }
260
+ }
261
+ if (!isMainThread && parentPort && workerData?.attendSqlite) {
262
+ const port = parentPort;
263
+ const { file, prefix, synchronous, retain } = workerData.attendSqlite;
264
+ const { DatabaseSync } = await import('node:sqlite');
265
+ const db = new DatabaseSync(file);
266
+ db.exec('PRAGMA busy_timeout = 5000');
267
+ useWal(db);
268
+ db.exec(`PRAGMA synchronous = ${synchronous}`);
269
+ const engine = openTables(db, prefix);
270
+ const commit = queueCommits(engine, retain);
271
+ const pending = new Set();
272
+ port.on('message', (request) => {
273
+ const run = async () => {
274
+ try {
275
+ let value;
276
+ switch (request.op) {
277
+ case 'commit':
278
+ value = await commit(...request.args);
279
+ break;
280
+ case 'load':
281
+ value = engine.load(...request.args);
282
+ break;
283
+ case 'due':
284
+ value = engine.due(...request.args);
285
+ break;
286
+ case 'remove':
287
+ value = engine.remove(...request.args);
288
+ break;
289
+ case 'bounds':
290
+ value = engine.bounds(...request.args);
291
+ break;
292
+ case 'read':
293
+ value = engine.read(...request.args);
294
+ break;
295
+ case 'find':
296
+ value = engine.find(...request.args);
297
+ break;
298
+ case 'trim':
299
+ value = engine.trim(...request.args);
300
+ break;
301
+ case 'epoch':
302
+ value = engine.epoch(...request.args);
303
+ break;
304
+ case 'close':
305
+ await Promise.all(pending);
306
+ db.close();
307
+ break;
308
+ }
309
+ port.postMessage({ id: request.id, value });
310
+ if (request.op === 'close')
311
+ port.close();
312
+ }
313
+ catch (error) {
314
+ port.postMessage({ id: request.id, error: message(error) });
315
+ }
316
+ };
317
+ const task = run();
318
+ pending.add(task);
319
+ void task.finally(() => pending.delete(task));
320
+ });
321
+ }
322
+ //# sourceMappingURL=sqlite-worker.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sqlite-worker.js","sourceRoot":"","sources":["../../src/store/sqlite-worker.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,34 @@
1
+ import type { Retention, ScopeStore } from './types.js';
2
+ /** A positional SQLite binding. */
3
+ export type SqliteValue = string | number | bigint | null;
4
+ /** Prepared statements supplied by the application's SQLite driver. */
5
+ export interface SqliteStatement {
6
+ run(...params: SqliteValue[]): {
7
+ changes: number | bigint;
8
+ };
9
+ get(...params: SqliteValue[]): unknown;
10
+ all(...params: SqliteValue[]): unknown[];
11
+ }
12
+ /** The synchronous SQLite handle used by the in-thread store. */
13
+ export interface SqliteDatabase {
14
+ exec(sql: string): void;
15
+ prepare(sql: string): SqliteStatement;
16
+ }
17
+ export interface SqliteStoreOptions {
18
+ /** Prepended to the table names. Letters, digits and underscores. Default 'attend_'. */
19
+ prefix?: string;
20
+ /** Trims the decision log by this inside every transaction that appends rows. */
21
+ retain?: Retention;
22
+ }
23
+ /**
24
+ * Given a handle: in-thread, one transaction per macrotask turn, under the app's own pragmas
25
+ * (`journal_mode`, `synchronous`, `busy_timeout`). Given a file: a worker thread owns the database
26
+ * in WAL mode, `synchronous` FULL unless set, so commits are asynchronous and groups form under
27
+ * load. Either way the tables are created if they are absent.
28
+ */
29
+ export declare function sqliteStore(db: SqliteDatabase | {
30
+ file: string;
31
+ worker: true;
32
+ synchronous?: 'NORMAL' | 'FULL';
33
+ }, options?: SqliteStoreOptions): ScopeStore;
34
+ //# sourceMappingURL=sqlite.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sqlite.d.ts","sourceRoot":"","sources":["../../src/store/sqlite.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAe,SAAS,EAAE,UAAU,EAA2B,MAAM,YAAY,CAAC;AAE9F,mCAAmC;AACnC,MAAM,MAAM,WAAW,GAAG,MAAM,GAAG,MAAM,GAAG,MAAM,GAAG,IAAI,CAAC;AAE1D,uEAAuE;AACvE,MAAM,WAAW,eAAe;IAC9B,GAAG,CAAC,GAAG,MAAM,EAAE,WAAW,EAAE,GAAG;QAAE,OAAO,EAAE,MAAM,GAAG,MAAM,CAAA;KAAE,CAAC;IAC5D,GAAG,CAAC,GAAG,MAAM,EAAE,WAAW,EAAE,GAAG,OAAO,CAAC;IACvC,GAAG,CAAC,GAAG,MAAM,EAAE,WAAW,EAAE,GAAG,OAAO,EAAE,CAAC;CAC1C;AAED,iEAAiE;AACjE,MAAM,WAAW,cAAc;IAC7B,IAAI,CAAC,GAAG,EAAE,MAAM,GAAG,IAAI,CAAC;IACxB,OAAO,CAAC,GAAG,EAAE,MAAM,GAAG,eAAe,CAAC;CACvC;AAED,MAAM,WAAW,kBAAkB;IACjC,wFAAwF;IACxF,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,iFAAiF;IACjF,MAAM,CAAC,EAAE,SAAS,CAAC;CACpB;AAED;;;;;GAKG;AACH,wBAAgB,WAAW,CAAC,EAAE,EAAE,cAAc,GAAG;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,IAAI,CAAC;IAAC,WAAW,CAAC,EAAE,QAAQ,GAAG,MAAM,CAAA;CAAE,EAAE,OAAO,CAAC,EAAE,kBAAkB,GAAG,UAAU,CAwF1J"}
@@ -0,0 +1,238 @@
1
+ import { Worker } from 'node:worker_threads';
2
+ import { boundary } from '../internal/adapter.js';
3
+ import { openTables, queueCommits } from './sqlite-worker.js';
4
+ /**
5
+ * Given a handle: in-thread, one transaction per macrotask turn, under the app's own pragmas
6
+ * (`journal_mode`, `synchronous`, `busy_timeout`). Given a file: a worker thread owns the database
7
+ * in WAL mode, `synchronous` FULL unless set, so commits are asynchronous and groups form under
8
+ * load. Either way the tables are created if they are absent.
9
+ */
10
+ export function sqliteStore(db, options) {
11
+ const prefix = parse.tablePrefix(options?.prefix);
12
+ const transport = 'worker' in db ? workerTransport(db, prefix, options?.retain) : localTransport(db, prefix, options?.retain);
13
+ const engine = transport.engine;
14
+ const waiters = new Set();
15
+ const store = {
16
+ durable: true,
17
+ async load(scope) {
18
+ const raw = await engine.load(scope);
19
+ if (raw === null)
20
+ return null;
21
+ const snapshot = raw.snapshot;
22
+ const stored = {
23
+ version: Number(raw.version),
24
+ snapshot: snapshot === null ? null : {
25
+ version: Number(parse.column(snapshot, 'version')),
26
+ policy: JSON.parse(parse.text(parse.column(snapshot, 'policy'))),
27
+ reducer: Number(parse.column(snapshot, 'reducer')),
28
+ record: parse.parseRecord(parse.column(snapshot, 'record'), scope),
29
+ },
30
+ tail: raw.tail.map((input) => JSON.parse(parse.text(input))),
31
+ };
32
+ return stored;
33
+ },
34
+ async commit(writes) {
35
+ const scopes = new Set();
36
+ for (const write of writes) {
37
+ if (scopes.has(write.scope))
38
+ throw new Error(`attend/sqlite: a group names scope "${write.scope}" twice`);
39
+ scopes.add(write.scope);
40
+ }
41
+ if (writes.length === 0)
42
+ return [];
43
+ const result = await engine.commit(writes.map(encode));
44
+ if (result.appended)
45
+ for (const wake of waiters)
46
+ wake();
47
+ return result.outcomes;
48
+ },
49
+ async due(now, limit, after) {
50
+ return (await engine.due(now, limit, after)).map((row) => ({
51
+ due: Number(parse.column(row, 'due')), scope: parse.text(parse.column(row, 'scope')),
52
+ }));
53
+ },
54
+ async remove(scope) { await engine.remove(scope); },
55
+ log: {
56
+ async epoch() { return parse.text(await engine.epoch()); },
57
+ async bounds() {
58
+ const raw = await engine.bounds();
59
+ return { first: position(parse.column(raw, 'first')), last: position(parse.column(raw, 'last')) };
60
+ },
61
+ async read(query) {
62
+ const raw = await engine.read({ ...query, after: query.after === null ? null : Number(parse.parsePosition(query.after)) });
63
+ return { rows: raw.rows.map(decodeRow), checked: position(raw.checked), more: raw.more };
64
+ },
65
+ async find(kind, id) {
66
+ const row = await engine.find(kind, id);
67
+ return row === null ? null : decodeRow(row);
68
+ },
69
+ wait(after, blockMs, signal) {
70
+ if (signal.aborted)
71
+ return Promise.resolve();
72
+ return new Promise((resolve) => {
73
+ let finished = false;
74
+ let checking = false;
75
+ const finish = () => {
76
+ if (finished)
77
+ return;
78
+ finished = true;
79
+ clearTimeout(timeout);
80
+ clearInterval(poll);
81
+ signal.removeEventListener('abort', finish);
82
+ waiters.delete(check);
83
+ resolve();
84
+ };
85
+ const check = () => {
86
+ if (finished || checking)
87
+ return;
88
+ checking = true;
89
+ void store.log.bounds().then(({ last }) => {
90
+ if (last !== null && (after === null || store.log.compare(last, after) > 0))
91
+ finish();
92
+ }).catch(finish).finally(() => { checking = false; });
93
+ };
94
+ const timeout = setTimeout(finish, blockMs);
95
+ const poll = setInterval(check, 100);
96
+ signal.addEventListener('abort', finish, { once: true });
97
+ waiters.add(check);
98
+ check();
99
+ });
100
+ },
101
+ async trim(retention) { await engine.trim(retention); },
102
+ compare(a, b) { return Math.sign(Number(parse.parsePosition(a)) - Number(parse.parsePosition(b))); },
103
+ },
104
+ };
105
+ if (transport.close)
106
+ store.close = transport.close;
107
+ return store;
108
+ }
109
+ const parse = boundary('attend/sqlite');
110
+ function position(value) {
111
+ return value === null ? null : parse.formatPosition(value);
112
+ }
113
+ function encode(write) {
114
+ return {
115
+ scope: write.scope, expectedVersion: write.expectedVersion,
116
+ inputs: write.serialized?.inputs ?? write.inputs.map((input) => JSON.stringify(input)),
117
+ snapshot: write.snapshot === null ? null : {
118
+ version: write.snapshot.version, policy: JSON.stringify(write.snapshot.policy), reducer: write.snapshot.reducer,
119
+ record: write.serialized?.snapshot ?? JSON.stringify(write.snapshot.record),
120
+ },
121
+ setDue: write.due !== undefined, due: write.due ?? null,
122
+ appends: write.appends.map((row, i) => ({
123
+ kind: row.kind, id: row.id, scope: row.scope, at: row.at, route: row.route,
124
+ body: write.serialized?.appends[i] ?? JSON.stringify(row.body),
125
+ })),
126
+ };
127
+ }
128
+ function route(value) {
129
+ const result = parse.text(value);
130
+ if (result === 'interrupt' || result === 'queue' || result === 'note' || result === 'ask')
131
+ return result;
132
+ throw new Error(`attend/sqlite: unknown route "${result}"`);
133
+ }
134
+ function decodeRow(raw) {
135
+ const base = { position: parse.formatPosition(raw.position), scope: parse.text(raw.scope), id: parse.text(raw.id), at: Number(raw.at) };
136
+ const kind = parse.text(raw.kind);
137
+ const body = JSON.parse(parse.text(raw.body));
138
+ if (kind === 'decision')
139
+ return { ...base, kind, route: route(raw.route), body };
140
+ if (kind === 'deadLetter')
141
+ return { ...base, kind, route: raw.route === null ? null : route(raw.route), body };
142
+ throw new Error(`attend/sqlite: unknown decision kind "${kind}"`);
143
+ }
144
+ function localTransport(db, prefix, retain) {
145
+ const engine = openTables(db, prefix);
146
+ return { engine: {
147
+ commit: queueCommits(engine, retain),
148
+ async load(...args) { return engine.load(...args); },
149
+ async due(...args) { return engine.due(...args); },
150
+ async remove(...args) { return engine.remove(...args); },
151
+ async bounds() { return engine.bounds(); },
152
+ async read(...args) { return engine.read(...args); },
153
+ async find(...args) { return engine.find(...args); },
154
+ async trim(...args) { return engine.trim(...args); },
155
+ async epoch() { return engine.epoch(); },
156
+ } };
157
+ }
158
+ function workerTransport(db, prefix, retain) {
159
+ if (db.synchronous !== undefined && db.synchronous !== 'NORMAL' && db.synchronous !== 'FULL') {
160
+ throw new Error('attend/sqlite: synchronous must be NORMAL or FULL');
161
+ }
162
+ // Tests load this module from source.
163
+ const url = new URL(import.meta.url.endsWith('.ts') ? './sqlite-worker.ts' : './sqlite-worker.js', import.meta.url);
164
+ const worker = new Worker(url, { workerData: { attendSqlite: { file: db.file, prefix, synchronous: db.synchronous ?? 'FULL', retain } } });
165
+ const pending = new Map();
166
+ let nextId = 0;
167
+ let stopped;
168
+ let closing;
169
+ const fail = (error) => {
170
+ stopped = error;
171
+ for (const request of pending.values())
172
+ request.reject(error);
173
+ pending.clear();
174
+ worker.unref();
175
+ };
176
+ const exited = new Promise((resolve) => {
177
+ worker.once('exit', () => {
178
+ fail(stopped ?? new Error('attend/sqlite: the worker stopped'));
179
+ resolve();
180
+ });
181
+ });
182
+ worker.on('error', fail);
183
+ worker.on('message', (reply) => {
184
+ const request = pending.get(reply.id);
185
+ if (!request)
186
+ return;
187
+ pending.delete(reply.id);
188
+ if (reply.error !== undefined)
189
+ request.reject(new Error(reply.error));
190
+ else
191
+ request.resolve(reply.value);
192
+ if (pending.size === 0 && !closing)
193
+ worker.unref();
194
+ });
195
+ worker.unref();
196
+ function send(op, args) {
197
+ if (stopped)
198
+ return Promise.reject(stopped);
199
+ if (closing && op !== 'close')
200
+ return Promise.reject(new Error('attend/sqlite: the worker stopped'));
201
+ return new Promise((resolve, reject) => {
202
+ const id = nextId++;
203
+ pending.set(id, { resolve: (value) => resolve(value), reject });
204
+ worker.ref();
205
+ try {
206
+ worker.postMessage({ id, op, args });
207
+ }
208
+ catch (error) {
209
+ pending.delete(id);
210
+ if (pending.size === 0 && !closing)
211
+ worker.unref();
212
+ reject(error);
213
+ }
214
+ });
215
+ }
216
+ return {
217
+ engine: {
218
+ commit: (...args) => send('commit', args),
219
+ load: (...args) => send('load', args),
220
+ due: (...args) => send('due', args),
221
+ remove: (...args) => send('remove', args),
222
+ bounds: () => send('bounds', []),
223
+ read: (...args) => send('read', args),
224
+ find: (...args) => send('find', args),
225
+ trim: (...args) => send('trim', args),
226
+ epoch: () => send('epoch', []),
227
+ },
228
+ close() {
229
+ closing ??= (async () => {
230
+ if (!stopped)
231
+ await send('close', []);
232
+ await exited;
233
+ })();
234
+ return closing;
235
+ },
236
+ };
237
+ }
238
+ //# sourceMappingURL=sqlite.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sqlite.js","sourceRoot":"","sources":["../../src/store/sqlite.ts"],"names":[],"mappings":"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"}