@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,156 @@
1
+ import type { Clock, DeadLetter, DeliveredRoute, Effect, Event, Input, JsonObject, Judge, JudgeImage, Kind, Route, ScopeRecord, ScopeState, SettlePolicy, DecisionAppend, LoggedInput, Sink, Source, Trace } from '../core/types.js';
2
+ import type { DecisionKind, DecisionRow, ScopeStore, ScopeWrite, SerializedWrite } from '../store/types.js';
3
+ /** A handler for a window that exhausted judge or sink delivery. */
4
+ export type DeadLetterHandler = (letter: DeadLetter, signal: AbortSignal) => void | Promise<void>;
5
+ /** Live context fetched when the judge is called, and again on every retry. */
6
+ export interface JudgeContext {
7
+ facts?: JsonObject;
8
+ /** Questions the judge answers beside the route, by name. Merged over `AttendConfig.predicates`. */
9
+ predicates?: Record<string, string>;
10
+ }
11
+ /** Process-wide intake limits. */
12
+ export interface AdmissionOptions {
13
+ /** Raw, loading and unapplied inputs per process before push rejects with BackpressureError. Default 20,000. */
14
+ maxQueuedInputs?: number;
15
+ /** Shed load once scheduler lag exceeds this many ms. */
16
+ maxLagMs?: number;
17
+ }
18
+ /** Store, effects, policy and resource limits for an instance. */
19
+ export interface AttendConfig {
20
+ store: ScopeStore;
21
+ judge: Judge;
22
+ /** Pure. Called once per event at push; the event carries the result into the logged input. */
23
+ kind: (event: Event) => Kind;
24
+ /** A Sink delivers in-process through the decisions lane. `'log'`: the decision row is the delivery. Required: no silent default. */
25
+ sink: Sink | 'log';
26
+ /** A handler gets today's lane, which never gives up. `'log'`: the dead-letter row is final. Required. */
27
+ deadLetter: DeadLetterHandler | 'log';
28
+ settle?: Partial<SettlePolicy>;
29
+ /** Share of the judge's budget a window may fill before it settles with reason `size`. Default 0.5. */
30
+ windowShare?: number;
31
+ /**
32
+ * In (0, 1]. When set, the route acts (interrupt or ask) iff p(interrupt) + p(ask) is at least
33
+ * this, applied before the verdict is logged. Absent: the judge's route, unchanged.
34
+ */
35
+ actThreshold?: number;
36
+ guidance?: string;
37
+ criteria?: Partial<Record<Route, string>>;
38
+ predicates?: Record<string, string>;
39
+ context?: (scope: string, signal: AbortSignal) => JudgeContext | Promise<JudgeContext>;
40
+ capture?: (scope: string, signal: AbortSignal) => Promise<JudgeImage[] | JudgeImage | null>;
41
+ captureTimeoutMs?: number;
42
+ observe?: (trace: Trace) => void;
43
+ clock?: Clock;
44
+ admission?: AdmissionOptions;
45
+ /** Positive integer cap on judge calls in flight per process. Past it, calls are deferred with `judgeDeferred`. Default: no cap. */
46
+ judgeConcurrency?: number;
47
+ /** Idle quiescent scopes are dropped from the cache after this long. Default 300,000. */
48
+ cache?: {
49
+ idleMs?: number;
50
+ };
51
+ }
52
+ /** Today's RunOptions and abort semantics. The sweep pages the whole due index. */
53
+ export interface RunOptions {
54
+ signal: AbortSignal;
55
+ sweepMs?: number;
56
+ sweepLimit?: number;
57
+ }
58
+ /** Limits a decision-log subscription by scope, route or row kind. */
59
+ export interface DecisionFilter {
60
+ scope?: string;
61
+ scopePrefix?: string;
62
+ routes?: readonly DeliveredRoute[];
63
+ kinds?: readonly DecisionKind[];
64
+ }
65
+ /** Cursor, retention horizon and cancellation for a subscription. */
66
+ export interface DecisionReadOptions {
67
+ /** A cursor from an earlier page or from MCP Events. Null starts from now. */
68
+ cursor?: string | null;
69
+ maxAgeMs?: number;
70
+ pageSize?: number;
71
+ signal: AbortSignal;
72
+ }
73
+ /** Copied rows and the cursor checked through this page. */
74
+ export interface DecisionCursorPage {
75
+ rows: DecisionRow[];
76
+ /** The same `v1.<epoch>.<position>` cursor MCP subscribers get. */
77
+ cursor: string;
78
+ /** True when rows were skipped: an unknown epoch, or a cursor below the retention floor. */
79
+ truncated: boolean;
80
+ }
81
+ /** Intake, inspection, subscriptions and runner lifecycle. */
82
+ export interface Attend {
83
+ /** As today. May also reject with BackpressureError. */
84
+ push(scope: string, events: Event[]): Promise<void>;
85
+ /** Settles the open window at the next tick, reason `closing`, with `wait` still offered. */
86
+ end(scope: string): Promise<void>;
87
+ flush(scope: string): Promise<void>;
88
+ attach(scope: string, source: Source, options?: {
89
+ signal?: AbortSignal;
90
+ }): Promise<void>;
91
+ /** The record as stored: load, replay and `toRecord`, then a deep copy. */
92
+ inspect(scope: string): Promise<ScopeRecord | null>;
93
+ /** Reads the store's decision log in-process, with the same cursors MCP subscribers use. */
94
+ decisions(filter: DecisionFilter, options: DecisionReadOptions): AsyncIterable<DecisionCursorPage>;
95
+ run(options: RunOptions): Promise<void>;
96
+ }
97
+ /** An input and its callers, retained until commit or abandonment. */
98
+ export interface RawInput {
99
+ input: Input;
100
+ signal: AbortSignal | undefined;
101
+ rejectHook: ((error: unknown) => void) | undefined;
102
+ done: Promise<void>;
103
+ resolve(): void;
104
+ reject(error: unknown): void;
105
+ count: number;
106
+ conflicts: number;
107
+ }
108
+ /** The owned state, queued callers and persistence accounting for one scope. */
109
+ export interface ScopeSlot {
110
+ scope: string;
111
+ state: ScopeState | null;
112
+ loading: Promise<void> | null;
113
+ staged: StagedWrite | null;
114
+ inflight: StagedWrite | null;
115
+ queued: RawInput[];
116
+ tailBytes: number;
117
+ tailCount: number;
118
+ snapshotBytes: number;
119
+ snapshotNeeded: boolean;
120
+ forceWrite: boolean;
121
+ storedDue: number | null | undefined;
122
+ lastTouch: number;
123
+ }
124
+ /** An open write and the raw inputs and effects whose fate it determines. */
125
+ export interface StagedWrite {
126
+ write: ScopeWrite & {
127
+ inputs: LoggedInput[];
128
+ appends: DecisionAppend[];
129
+ };
130
+ raw: RawInput[];
131
+ effects: Effect[];
132
+ bytes: number;
133
+ snapshotBytes: number;
134
+ state: ScopeState;
135
+ serialized: SerializedWrite | undefined;
136
+ }
137
+ /** Shell-internal: smart batching, one group in flight per store, writes sorted by scope, bisect on failure. */
138
+ export interface CommitQueue {
139
+ stage(slot: ScopeSlot): void;
140
+ /** Resolves when everything staged so far has committed or been rejected. */
141
+ drain(): Promise<void>;
142
+ }
143
+ /** Shell-internal: one min-heap, one native timer, lazy re-arm, `sliceUs` of work per macrotask. */
144
+ export interface Scheduler {
145
+ arm(scope: string, dueAt: number | null): void;
146
+ /** Current lateness of the earliest queued entry, or zero when nothing is overdue. */
147
+ lagMs(): number;
148
+ stop(): void;
149
+ }
150
+ export interface SchedulerOptions {
151
+ clock: Clock;
152
+ /** Default 50. */
153
+ sliceUs?: number;
154
+ onDue(scope: string): void;
155
+ }
156
+ //# sourceMappingURL=types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/shell/types.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,KAAK,EAAE,UAAU,EAAE,cAAc,EAAE,MAAM,EAAE,KAAK,EAAE,KAAK,EAAE,UAAU,EAAE,KAAK,EAAE,UAAU,EAAE,IAAI,EAAE,KAAK,EAAE,WAAW,EAAE,UAAU,EAAE,YAAY,EAAE,cAAc,EAAE,WAAW,EAAE,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,kBAAkB,CAAC;AACrO,OAAO,KAAK,EAAE,YAAY,EAAE,WAAW,EAAE,UAAU,EAAE,UAAU,EAAE,eAAe,EAAE,MAAM,mBAAmB,CAAC;AAE5G,oEAAoE;AACpE,MAAM,MAAM,iBAAiB,GAAG,CAAC,MAAM,EAAE,UAAU,EAAE,MAAM,EAAE,WAAW,KAAK,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;AAElG,+EAA+E;AAC/E,MAAM,WAAW,YAAY;IAC3B,KAAK,CAAC,EAAE,UAAU,CAAC;IACnB,oGAAoG;IACpG,UAAU,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;CACrC;AAED,kCAAkC;AAClC,MAAM,WAAW,gBAAgB;IAC/B,gHAAgH;IAChH,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,yDAAyD;IACzD,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB;AAED,kEAAkE;AAClE,MAAM,WAAW,YAAY;IAC3B,KAAK,EAAE,UAAU,CAAC;IAClB,KAAK,EAAE,KAAK,CAAC;IACb,+FAA+F;IAC/F,IAAI,EAAE,CAAC,KAAK,EAAE,KAAK,KAAK,IAAI,CAAC;IAC7B,qIAAqI;IACrI,IAAI,EAAE,IAAI,GAAG,KAAK,CAAC;IACnB,0GAA0G;IAC1G,UAAU,EAAE,iBAAiB,GAAG,KAAK,CAAC;IACtC,MAAM,CAAC,EAAE,OAAO,CAAC,YAAY,CAAC,CAAC;IAC/B,uGAAuG;IACvG,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB;;;OAGG;IACH,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,QAAQ,CAAC,EAAE,OAAO,CAAC,MAAM,CAAC,KAAK,EAAE,MAAM,CAAC,CAAC,CAAC;IAC1C,UAAU,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACpC,OAAO,CAAC,EAAE,CAAC,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,WAAW,KAAK,YAAY,GAAG,OAAO,CAAC,YAAY,CAAC,CAAC;IACvF,OAAO,CAAC,EAAE,CAAC,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,WAAW,KAAK,OAAO,CAAC,UAAU,EAAE,GAAG,UAAU,GAAG,IAAI,CAAC,CAAC;IAC5F,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,OAAO,CAAC,EAAE,CAAC,KAAK,EAAE,KAAK,KAAK,IAAI,CAAC;IACjC,KAAK,CAAC,EAAE,KAAK,CAAC;IACd,SAAS,CAAC,EAAE,gBAAgB,CAAC;IAC7B,oIAAoI;IACpI,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,yFAAyF;IACzF,KAAK,CAAC,EAAE;QAAE,MAAM,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC;CAC7B;AAED,mFAAmF;AACnF,MAAM,WAAW,UAAU;IACzB,MAAM,EAAE,WAAW,CAAC;IACpB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB;AAED,sEAAsE;AACtE,MAAM,WAAW,cAAc;IAC7B,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,MAAM,CAAC,EAAE,SAAS,cAAc,EAAE,CAAC;IACnC,KAAK,CAAC,EAAE,SAAS,YAAY,EAAE,CAAC;CACjC;AAED,qEAAqE;AACrE,MAAM,WAAW,mBAAmB;IAClC,8EAA8E;IAC9E,MAAM,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IACvB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,MAAM,EAAE,WAAW,CAAC;CACrB;AAED,4DAA4D;AAC5D,MAAM,WAAW,kBAAkB;IACjC,IAAI,EAAE,WAAW,EAAE,CAAC;IACpB,mEAAmE;IACnE,MAAM,EAAE,MAAM,CAAC;IACf,4FAA4F;IAC5F,SAAS,EAAE,OAAO,CAAC;CACpB;AAED,8DAA8D;AAC9D,MAAM,WAAW,MAAM;IACrB,wDAAwD;IACxD,IAAI,CAAC,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IACpD,6FAA6F;IAC7F,GAAG,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAClC,KAAK,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IACpC,MAAM,CAAC,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE;QAAE,MAAM,CAAC,EAAE,WAAW,CAAA;KAAE,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IACzF,2EAA2E;IAC3E,OAAO,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,WAAW,GAAG,IAAI,CAAC,CAAC;IACpD,4FAA4F;IAC5F,SAAS,CAAC,MAAM,EAAE,cAAc,EAAE,OAAO,EAAE,mBAAmB,GAAG,aAAa,CAAC,kBAAkB,CAAC,CAAC;IACnG,GAAG,CAAC,OAAO,EAAE,UAAU,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;CACzC;AAED,sEAAsE;AACtE,MAAM,WAAW,QAAQ;IACvB,KAAK,EAAE,KAAK,CAAC;IACb,MAAM,EAAE,WAAW,GAAG,SAAS,CAAC;IAChC,UAAU,EAAE,CAAC,CAAC,KAAK,EAAE,OAAO,KAAK,IAAI,CAAC,GAAG,SAAS,CAAC;IACnD,IAAI,EAAE,OAAO,CAAC,IAAI,CAAC,CAAC;IACpB,OAAO,IAAI,IAAI,CAAC;IAChB,MAAM,CAAC,KAAK,EAAE,OAAO,GAAG,IAAI,CAAC;IAC7B,KAAK,EAAE,MAAM,CAAC;IACd,SAAS,EAAE,MAAM,CAAC;CACnB;AAED,gFAAgF;AAChF,MAAM,WAAW,SAAS;IACxB,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,EAAE,UAAU,GAAG,IAAI,CAAC;IACzB,OAAO,EAAE,OAAO,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC;IAC9B,MAAM,EAAE,WAAW,GAAG,IAAI,CAAC;IAC3B,QAAQ,EAAE,WAAW,GAAG,IAAI,CAAC;IAC7B,MAAM,EAAE,QAAQ,EAAE,CAAC;IACnB,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,EAAE,MAAM,CAAC;IAClB,aAAa,EAAE,MAAM,CAAC;IACtB,cAAc,EAAE,OAAO,CAAC;IACxB,UAAU,EAAE,OAAO,CAAC;IACpB,SAAS,EAAE,MAAM,GAAG,IAAI,GAAG,SAAS,CAAC;IACrC,SAAS,EAAE,MAAM,CAAC;CACnB;AAED,6EAA6E;AAC7E,MAAM,WAAW,WAAW;IAC1B,KAAK,EAAE,UAAU,GAAG;QAAE,MAAM,EAAE,WAAW,EAAE,CAAC;QAAC,OAAO,EAAE,cAAc,EAAE,CAAA;KAAE,CAAC;IACzE,GAAG,EAAE,QAAQ,EAAE,CAAC;IAChB,OAAO,EAAE,MAAM,EAAE,CAAC;IAClB,KAAK,EAAE,MAAM,CAAC;IACd,aAAa,EAAE,MAAM,CAAC;IACtB,KAAK,EAAE,UAAU,CAAC;IAClB,UAAU,EAAE,eAAe,GAAG,SAAS,CAAC;CACzC;AAED,gHAAgH;AAChH,MAAM,WAAW,WAAW;IAC1B,KAAK,CAAC,IAAI,EAAE,SAAS,GAAG,IAAI,CAAC;IAC7B,6EAA6E;IAC7E,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;CACxB;AAED,oGAAoG;AACpG,MAAM,WAAW,SAAS;IACxB,GAAG,CAAC,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,IAAI,GAAG,IAAI,CAAC;IAC/C,sFAAsF;IACtF,KAAK,IAAI,MAAM,CAAC;IAChB,IAAI,IAAI,IAAI,CAAC;CACd;AAED,MAAM,WAAW,gBAAgB;IAC/B,KAAK,EAAE,KAAK,CAAC;IACb,kBAAkB;IAClB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,KAAK,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI,CAAC;CAC5B"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/shell/types.ts"],"names":[],"mappings":""}
@@ -0,0 +1,14 @@
1
+ import type { EventLog } from './types.js';
2
+ import type { SqliteDatabase } from './store/sqlite.js';
3
+ export { sqliteStore } from './store/sqlite.js';
4
+ export type { SqliteStoreOptions, SqliteDatabase, SqliteStatement, SqliteValue } from './store/sqlite.js';
5
+ export interface SqliteOptions {
6
+ prefix?: string;
7
+ }
8
+ /**
9
+ * Positions are the rowid, which SQLite assigns under its single write lock, so they follow
10
+ * commit order. AUTOINCREMENT keeps a deleted tail's ids from being handed out again. `read`
11
+ * cannot wait: with `blockMs` it returns at once and `logSource` paces the loop.
12
+ */
13
+ export declare function sqliteLog(db: SqliteDatabase, options?: SqliteOptions): EventLog;
14
+ //# sourceMappingURL=sqlite.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sqlite.d.ts","sourceRoot":"","sources":["../src/sqlite.ts"],"names":[],"mappings":"AAMA,OAAO,KAAK,EAAE,QAAQ,EAAY,MAAM,YAAY,CAAC;AACrD,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,mBAAmB,CAAC;AAExD,OAAO,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAChD,YAAY,EAAE,kBAAkB,EAAE,cAAc,EAAE,eAAe,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAI1G,MAAM,WAAW,aAAa;IAC5B,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB;AAED;;;;GAIG;AACH,wBAAgB,SAAS,CAAC,EAAE,EAAE,cAAc,EAAE,OAAO,CAAC,EAAE,aAAa,GAAG,QAAQ,CAwB/E"}
package/dist/sqlite.js ADDED
@@ -0,0 +1,39 @@
1
+ /**
2
+ * `attend/sqlite`: a ScopeStore and an EventLog over SQLite, without loading a driver.
3
+ * The store supports a synchronous database handle or a file owned by a worker thread.
4
+ * Both adapters create their tables and indexes when needed.
5
+ */
6
+ import { boundary } from './internal/adapter.js';
7
+ export { sqliteStore } from './store/sqlite.js';
8
+ const { column, formatPosition, parseEvent, parsePosition, tablePrefix } = boundary('attend/sqlite');
9
+ /**
10
+ * Positions are the rowid, which SQLite assigns under its single write lock, so they follow
11
+ * commit order. AUTOINCREMENT keeps a deleted tail's ids from being handed out again. `read`
12
+ * cannot wait: with `blockMs` it returns at once and `logSource` paces the loop.
13
+ */
14
+ export function sqliteLog(db, options) {
15
+ const table = `${tablePrefix(options?.prefix)}log`;
16
+ db.exec(`CREATE TABLE IF NOT EXISTS ${table} (position INTEGER PRIMARY KEY AUTOINCREMENT, scope TEXT NOT NULL, event TEXT NOT NULL);
17
+ CREATE INDEX IF NOT EXISTS ${table}_scope ON ${table} (scope, position);`);
18
+ const insert = db.prepare(`INSERT INTO ${table} (scope, event) VALUES (?, ?)`);
19
+ const select = db.prepare(`SELECT position, event FROM ${table} WHERE scope = ? AND position > ? ORDER BY position LIMIT ?`);
20
+ return {
21
+ async append(scope, events) {
22
+ // A savepoint, unlike BEGIN, nests inside a transaction the caller already holds on this handle.
23
+ db.exec('SAVEPOINT attend_append');
24
+ try {
25
+ for (const event of events)
26
+ insert.run(scope, JSON.stringify(event));
27
+ db.exec('RELEASE attend_append');
28
+ }
29
+ catch (error) {
30
+ db.exec('ROLLBACK TO attend_append; RELEASE attend_append');
31
+ throw error;
32
+ }
33
+ },
34
+ async read(scope, after, { limit }) {
35
+ return select.all(scope, after === null ? 0 : Number(parsePosition(after)), limit).map((row) => ({ position: formatPosition(column(row, 'position')), event: parseEvent(column(row, 'event')) }));
36
+ },
37
+ };
38
+ }
39
+ //# sourceMappingURL=sqlite.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sqlite.js","sourceRoot":"","sources":["../src/sqlite.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AACH,OAAO,EAAE,QAAQ,EAAE,MAAM,uBAAuB,CAAC;AAIjD,OAAO,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAGhD,MAAM,EAAE,MAAM,EAAE,cAAc,EAAE,UAAU,EAAE,aAAa,EAAE,WAAW,EAAE,GAAG,QAAQ,CAAC,eAAe,CAAC,CAAC;AAMrG;;;;GAIG;AACH,MAAM,UAAU,SAAS,CAAC,EAAkB,EAAE,OAAuB;IACnE,MAAM,KAAK,GAAG,GAAG,WAAW,CAAC,OAAO,EAAE,MAAM,CAAC,KAAK,CAAC;IACnD,EAAE,CAAC,IAAI,CAAC,8BAA8B,KAAK;iCACZ,KAAK,aAAa,KAAK,qBAAqB,CAAC,CAAC;IAC7E,MAAM,MAAM,GAAG,EAAE,CAAC,OAAO,CAAC,eAAe,KAAK,+BAA+B,CAAC,CAAC;IAC/E,MAAM,MAAM,GAAG,EAAE,CAAC,OAAO,CAAC,+BAA+B,KAAK,6DAA6D,CAAC,CAAC;IAC7H,OAAO;QACL,KAAK,CAAC,MAAM,CAAC,KAAK,EAAE,MAAM;YACxB,iGAAiG;YACjG,EAAE,CAAC,IAAI,CAAC,yBAAyB,CAAC,CAAC;YACnC,IAAI,CAAC;gBACH,KAAK,MAAM,KAAK,IAAI,MAAM;oBAAE,MAAM,CAAC,GAAG,CAAC,KAAK,EAAE,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC,CAAC;gBACrE,EAAE,CAAC,IAAI,CAAC,uBAAuB,CAAC,CAAC;YACnC,CAAC;YAAC,OAAO,KAAK,EAAE,CAAC;gBACf,EAAE,CAAC,IAAI,CAAC,kDAAkD,CAAC,CAAC;gBAC5D,MAAM,KAAK,CAAC;YACd,CAAC;QACH,CAAC;QACD,KAAK,CAAC,IAAI,CAAC,KAAK,EAAE,KAAK,EAAE,EAAE,KAAK,EAAE;YAChC,OAAO,MAAM,CAAC,GAAG,CAAC,KAAK,EAAE,KAAK,KAAK,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,aAAa,CAAC,KAAK,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC,GAAG,CACpF,CAAC,GAAG,EAAY,EAAE,CAAC,CAAC,EAAE,QAAQ,EAAE,cAAc,CAAC,MAAM,CAAC,GAAG,EAAE,UAAU,CAAC,CAAC,EAAE,KAAK,EAAE,UAAU,CAAC,MAAM,CAAC,GAAG,EAAE,OAAO,CAAC,CAAC,EAAE,CAAC,CACpH,CAAC;QACJ,CAAC;KACF,CAAC;AACJ,CAAC"}
package/dist/step.d.ts ADDED
@@ -0,0 +1,18 @@
1
+ import type { Buffer, EventsInput, FlushInput, Input, ReleasedInput, ScopeRecord, SettlePolicy, SettleReason, Stepped, TraceEffect } from './types.js';
2
+ /** What the reducer needs from the config: the policy. */
3
+ export interface StepConfig {
4
+ policy: SettlePolicy;
5
+ }
6
+ /** Overload: ingest, flush and a release never emit anything but traces. */
7
+ export declare const step: {
8
+ (config: StepConfig, record: ScopeRecord, input: EventsInput | FlushInput | ReleasedInput, now: number): Stepped<TraceEffect>;
9
+ (config: StepConfig, record: ScopeRecord, input: Input, now: number): Stepped;
10
+ };
11
+ export declare const initialRecord: (scope: string) => ScopeRecord;
12
+ /** The earliest instant the open window settles, with its reason, or null while it holds no act and no flush. */
13
+ export declare const deadline: (policy: SettlePolicy, buffer: Buffer) => {
14
+ at: number;
15
+ reason: SettleReason;
16
+ } | null;
17
+ export { isAct, offeredRoutes, validate, windowId } from './core/step.js';
18
+ //# sourceMappingURL=step.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"step.d.ts","sourceRoot":"","sources":["../src/step.ts"],"names":[],"mappings":"AAOA,OAAO,KAAK,EAAE,MAAM,EAAE,WAAW,EAAE,UAAU,EAAE,KAAK,EAAE,aAAa,EAAE,WAAW,EAAE,YAAY,EAAE,YAAY,EAAE,OAAO,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AAEvJ,0DAA0D;AAC1D,MAAM,WAAW,UAAU;IACzB,MAAM,EAAE,YAAY,CAAC;CACtB;AAED,4EAA4E;AAC5E,eAAO,MAAM,IAAI,EAAe;IAC9B,CAAC,MAAM,EAAE,UAAU,EAAE,MAAM,EAAE,WAAW,EAAE,KAAK,EAAE,WAAW,GAAG,UAAU,GAAG,aAAa,EAAE,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,WAAW,CAAC,CAAC;IAC9H,CAAC,MAAM,EAAE,UAAU,EAAE,MAAM,EAAE,WAAW,EAAE,KAAK,EAAE,KAAK,EAAE,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC;CAC/E,CAAC;AAEF,eAAO,MAAM,aAAa,EAAwB,CAAC,KAAK,EAAE,MAAM,KAAK,WAAW,CAAC;AAEjF,iHAAiH;AACjH,eAAO,MAAM,QAAQ,EAAmB,CAAC,MAAM,EAAE,YAAY,EAAE,MAAM,EAAE,MAAM,KAAK;IAAE,EAAE,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,YAAY,CAAA;CAAE,GAAG,IAAI,CAAC;AAE9H,OAAO,EAAE,KAAK,EAAE,aAAa,EAAE,QAAQ,EAAE,QAAQ,EAAE,MAAM,gBAAgB,CAAC"}
package/dist/step.js ADDED
@@ -0,0 +1,14 @@
1
+ /**
2
+ * The reducer the shell runs: the in-place core (`./core/step.ts`) behind its pure `step` wrapper.
3
+ * The core's types are wider than ./types.ts: the `end` and `judgeDeferred` inputs, the `size`
4
+ * reason, `Buffer.endedAt` and new traces. The shell's inputs and policy can produce none of them,
5
+ * so these exports are narrowed by a cast to today's signatures until the shell moves onto the core.
6
+ */
7
+ import { deadline as coreDeadline, initialRecord as coreInitialRecord, step as coreStep } from './core/step.js';
8
+ /** Overload: ingest, flush and a release never emit anything but traces. */
9
+ export const step = coreStep;
10
+ export const initialRecord = coreInitialRecord;
11
+ /** The earliest instant the open window settles, with its reason, or null while it holds no act and no flush. */
12
+ export const deadline = coreDeadline;
13
+ export { isAct, offeredRoutes, validate, windowId } from './core/step.js';
14
+ //# sourceMappingURL=step.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"step.js","sourceRoot":"","sources":["../src/step.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AACH,OAAO,EAAE,QAAQ,IAAI,YAAY,EAAE,aAAa,IAAI,iBAAiB,EAAE,IAAI,IAAI,QAAQ,EAAE,MAAM,gBAAgB,CAAC;AAQhH,4EAA4E;AAC5E,MAAM,CAAC,MAAM,IAAI,GAAG,QAGnB,CAAC;AAEF,MAAM,CAAC,MAAM,aAAa,GAAG,iBAAmD,CAAC;AAEjF,iHAAiH;AACjH,MAAM,CAAC,MAAM,QAAQ,GAAG,YAAqG,CAAC;AAE9H,OAAO,EAAE,KAAK,EAAE,aAAa,EAAE,QAAQ,EAAE,QAAQ,EAAE,MAAM,gBAAgB,CAAC"}
@@ -0,0 +1,12 @@
1
+ import type { ScopeStore } from './types.js';
2
+ export interface MemoryStoreOptions {
3
+ decisions?: {
4
+ maxRows?: number;
5
+ maxAgeMs?: number;
6
+ };
7
+ }
8
+ /** Snapshots and inputs held by reference, a due index bucketed by second, a bounded decision ring and a random epoch. */
9
+ export declare function memoryStore(options?: MemoryStoreOptions): ScopeStore;
10
+ /** For tests: deep-freezes every snapshot, logged input and decision append at commit, and everything a read returns, so code that mutates committed or returned data throws. */
11
+ export declare function freezingStore(inner: ScopeStore): ScopeStore;
12
+ //# sourceMappingURL=memory.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"memory.d.ts","sourceRoot":"","sources":["../../src/store/memory.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAsC,UAAU,EAAY,MAAM,YAAY,CAAC;AAE3F,MAAM,WAAW,kBAAkB;IACjC,SAAS,CAAC,EAAE;QAAE,OAAO,CAAC,EAAE,MAAM,CAAC;QAAC,QAAQ,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC;CACrD;AAoBD,0HAA0H;AAC1H,wBAAgB,WAAW,CAAC,OAAO,CAAC,EAAE,kBAAkB,GAAG,UAAU,CA+LpE;AASD,iLAAiL;AACjL,wBAAgB,aAAa,CAAC,KAAK,EAAE,UAAU,GAAG,UAAU,CAyB3D"}
@@ -0,0 +1,264 @@
1
+ function lowerBound(values, target, start = 0) {
2
+ let end = values.length;
3
+ while (start < end) {
4
+ const middle = Math.floor((start + end) / 2);
5
+ if (values[middle] < target)
6
+ start = middle + 1;
7
+ else
8
+ end = middle;
9
+ }
10
+ return start;
11
+ }
12
+ function sequence(position) {
13
+ const value = Number(position);
14
+ if (!Number.isSafeInteger(value) || value < 0 || String(value) !== position) {
15
+ throw new TypeError(`attend: invalid position "${position}"`);
16
+ }
17
+ return value;
18
+ }
19
+ /** Snapshots and inputs held by reference, a due index bucketed by second, a bounded decision ring and a random epoch. */
20
+ export function memoryStore(options) {
21
+ const scopes = new Map();
22
+ const buckets = new Map();
23
+ const keys = [];
24
+ const epoch = crypto.randomUUID();
25
+ let ring = [];
26
+ let head = 0;
27
+ let last = 0;
28
+ const byScope = new Map();
29
+ const byKind = { decision: new Map(), deadLetter: new Map() };
30
+ const waiters = new Set();
31
+ function removeDue(scope, due) {
32
+ if (due === null)
33
+ return;
34
+ const key = Math.floor(due / 1000);
35
+ const bucket = buckets.get(key);
36
+ bucket.delete(scope);
37
+ if (bucket.size === 0) {
38
+ buckets.delete(key);
39
+ keys.splice(lowerBound(keys, key), 1);
40
+ }
41
+ }
42
+ function dropOldest() {
43
+ const row = ring[head];
44
+ ring[head++] = undefined;
45
+ byKind[row.kind].delete(row.id);
46
+ const scoped = byScope.get(row.scope);
47
+ scoped.head += 1;
48
+ if (scoped.head === scoped.seqs.length)
49
+ byScope.delete(row.scope);
50
+ else if (scoped.head >= 16 && scoped.head * 2 >= scoped.seqs.length) {
51
+ scoped.seqs = scoped.seqs.slice(scoped.head);
52
+ scoped.head = 0;
53
+ }
54
+ if (head >= 1024 && head * 2 >= ring.length) {
55
+ ring = ring.slice(head);
56
+ head = 0;
57
+ }
58
+ }
59
+ function retain(maxRows, age) {
60
+ if (maxRows !== undefined) {
61
+ while (ring.length - head > Math.max(maxRows, 1))
62
+ dropOldest();
63
+ }
64
+ if (age !== undefined) {
65
+ const cutoff = Date.now() - age;
66
+ while (ring.length - head > 1 && ring[head].at < cutoff)
67
+ dropOldest();
68
+ }
69
+ }
70
+ return {
71
+ durable: false,
72
+ async load(scope) {
73
+ const stored = scopes.get(scope);
74
+ return stored ? { version: stored.version, snapshot: stored.snapshot, tail: stored.tail.slice() } : null;
75
+ },
76
+ async commit(writes) {
77
+ if (writes.length > 1) {
78
+ const seen = new Set();
79
+ for (const write of writes) {
80
+ if (seen.has(write.scope))
81
+ throw new TypeError(`attend: a commit names scope "${write.scope}" twice`);
82
+ seen.add(write.scope);
83
+ }
84
+ }
85
+ const outcomes = [];
86
+ const before = last;
87
+ for (const write of writes) {
88
+ let stored = scopes.get(write.scope);
89
+ if ((stored?.version ?? 0) !== write.expectedVersion) {
90
+ outcomes.push('conflict');
91
+ continue;
92
+ }
93
+ if (!stored) {
94
+ stored = { version: 0, snapshot: null, tail: [], due: null };
95
+ scopes.set(write.scope, stored);
96
+ }
97
+ if (write.snapshot) {
98
+ stored.snapshot = write.snapshot;
99
+ stored.tail = [];
100
+ }
101
+ else {
102
+ for (const input of write.inputs)
103
+ stored.tail.push(input);
104
+ }
105
+ stored.version = write.expectedVersion + write.inputs.length;
106
+ if (write.due !== undefined) {
107
+ removeDue(write.scope, stored.due);
108
+ stored.due = write.due;
109
+ if (write.due !== null) {
110
+ const key = Math.floor(write.due / 1000);
111
+ let bucket = buckets.get(key);
112
+ if (!bucket) {
113
+ bucket = new Set();
114
+ buckets.set(key, bucket);
115
+ keys.splice(lowerBound(keys, key), 0, key);
116
+ }
117
+ bucket.add(write.scope);
118
+ }
119
+ }
120
+ for (const append of write.appends) {
121
+ if (byKind[append.kind].has(append.id))
122
+ continue;
123
+ const seq = ++last;
124
+ const row = { ...append, position: String(seq) };
125
+ ring.push(row);
126
+ byKind[row.kind].set(row.id, row);
127
+ let scoped = byScope.get(row.scope);
128
+ if (!scoped) {
129
+ scoped = { seqs: [], head: 0 };
130
+ byScope.set(row.scope, scoped);
131
+ }
132
+ scoped.seqs.push(seq);
133
+ }
134
+ outcomes.push('ok');
135
+ }
136
+ if (last > before) {
137
+ retain(options?.decisions?.maxRows ?? 10_000, options?.decisions?.maxAgeMs);
138
+ for (const wake of waiters)
139
+ wake();
140
+ }
141
+ return outcomes;
142
+ },
143
+ async due(now, limit, after) {
144
+ const result = [];
145
+ if (limit <= 0)
146
+ return result;
147
+ const end = Math.floor(now / 1000);
148
+ const start = after ? lowerBound(keys, Math.floor(after.due / 1000)) : 0;
149
+ for (let i = start; i < keys.length && keys[i] <= end; i += 1) {
150
+ const matches = [];
151
+ for (const scope of buckets.get(keys[i])) {
152
+ const due = scopes.get(scope).due;
153
+ if (due <= now && (!after || due > after.due || (due === after.due && scope > after.scope))) {
154
+ matches.push({ due, scope });
155
+ }
156
+ }
157
+ matches.sort((a, b) => a.due - b.due || (a.scope < b.scope ? -1 : a.scope > b.scope ? 1 : 0));
158
+ for (const match of matches) {
159
+ result.push(match);
160
+ if (result.length >= limit)
161
+ return result;
162
+ }
163
+ }
164
+ return result;
165
+ },
166
+ async remove(scope) {
167
+ const stored = scopes.get(scope);
168
+ if (stored)
169
+ removeDue(scope, stored.due);
170
+ scopes.delete(scope);
171
+ },
172
+ log: {
173
+ async epoch() { return epoch; },
174
+ async bounds() { return { first: ring[head]?.position ?? null, last: last === 0 ? null : String(last) }; },
175
+ async read(query) {
176
+ const after = query.after === null ? 0 : sequence(query.after);
177
+ const first = last - (ring.length - head) + 1;
178
+ const scoped = query.scope === undefined ? null : byScope.get(query.scope) ?? { seqs: [], head: 0 };
179
+ let index = scoped ? lowerBound(scoped.seqs, after + 1, scoped.head) : head + Math.max(0, after + 1 - first);
180
+ const end = scoped ? scoped.seqs.length : ring.length;
181
+ const rows = [];
182
+ const scanLimit = query.scanLimit ?? 4 * query.limit;
183
+ let examined = 0;
184
+ let checked = query.after;
185
+ for (; index < end; index += 1) {
186
+ if (rows.length >= query.limit || examined >= scanLimit)
187
+ return { rows, checked, more: true };
188
+ const row = ring[scoped ? head + (scoped.seqs[index] - first) : index];
189
+ examined += 1;
190
+ checked = row.position;
191
+ if (query.scopePrefix !== undefined && !row.scope.startsWith(query.scopePrefix))
192
+ continue;
193
+ if (query.kinds && !query.kinds.includes(row.kind))
194
+ continue;
195
+ if (query.routes && (row.route === null || !query.routes.includes(row.route)))
196
+ continue;
197
+ if (query.sinceAt !== undefined && row.at < query.sinceAt)
198
+ continue;
199
+ rows.push(row);
200
+ }
201
+ return { rows, checked: last === 0 && query.after === null ? null : String(Math.max(last, after)), more: false };
202
+ },
203
+ async find(kind, id) { return byKind[kind].get(id) ?? null; },
204
+ async wait(after, blockMs, signal) {
205
+ const seq = after === null ? 0 : sequence(after);
206
+ if (signal.aborted || last > seq)
207
+ return;
208
+ return new Promise((resolve) => {
209
+ const finish = () => {
210
+ clearTimeout(timer);
211
+ signal.removeEventListener('abort', finish);
212
+ waiters.delete(wake);
213
+ resolve();
214
+ };
215
+ const wake = () => { if (last > seq)
216
+ finish(); };
217
+ const timer = setTimeout(finish, blockMs);
218
+ signal.addEventListener('abort', finish, { once: true });
219
+ waiters.add(wake);
220
+ });
221
+ },
222
+ async trim(retention) { retain(retention.maxRows, retention.olderThanMs); },
223
+ compare(a, b) { return sequence(a) - sequence(b); },
224
+ },
225
+ };
226
+ }
227
+ function deepFreeze(value) {
228
+ if (typeof value !== 'object' || value === null)
229
+ return value;
230
+ Object.freeze(value);
231
+ for (const inner of Object.values(value))
232
+ deepFreeze(inner);
233
+ return value;
234
+ }
235
+ /** For tests: deep-freezes every snapshot, logged input and decision append at commit, and everything a read returns, so code that mutates committed or returned data throws. */
236
+ export function freezingStore(inner) {
237
+ return {
238
+ durable: inner.durable,
239
+ log: {
240
+ epoch: () => inner.log.epoch(),
241
+ bounds: () => inner.log.bounds().then(deepFreeze),
242
+ read: (query) => inner.log.read(query).then(deepFreeze),
243
+ find: (kind, id) => inner.log.find(kind, id).then(deepFreeze),
244
+ wait: (after, blockMs, signal) => inner.log.wait(after, blockMs, signal),
245
+ trim: (retention) => inner.log.trim(retention),
246
+ compare: (a, b) => inner.log.compare(a, b),
247
+ },
248
+ load: (scope) => inner.load(scope).then(deepFreeze),
249
+ due: (now, limit, after) => inner.due(now, limit, after).then(deepFreeze),
250
+ remove: (scope) => inner.remove(scope),
251
+ commit(writes) {
252
+ for (const write of writes) {
253
+ deepFreeze(write.snapshot);
254
+ for (const input of write.inputs)
255
+ deepFreeze(input);
256
+ for (const append of write.appends)
257
+ deepFreeze(append);
258
+ }
259
+ return inner.commit(writes);
260
+ },
261
+ ...(inner.close ? { close: inner.close.bind(inner) } : {}),
262
+ };
263
+ }
264
+ //# sourceMappingURL=memory.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"memory.js","sourceRoot":"","sources":["../../src/store/memory.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,24 @@
1
+ import type { Retention, ScopeStore } from './types.js';
2
+ export interface PostgresClient {
3
+ query(text: string, values?: unknown[]): Promise<{
4
+ rows: unknown[];
5
+ rowCount: number | null;
6
+ }>;
7
+ }
8
+ /** A dedicated connection for LISTEN, so subscribers in other processes wake on new decisions. */
9
+ export interface PostgresListener {
10
+ listen(channel: string, onNotify: () => void): Promise<() => Promise<void>>;
11
+ }
12
+ export interface PostgresStoreOptions {
13
+ prefix?: string;
14
+ retain?: Retention;
15
+ listener?: PostgresListener;
16
+ /** Opt-in `SET LOCAL synchronous_commit = off` per group: can lose the last commits, never corrupts. */
17
+ asyncCommit?: boolean;
18
+ }
19
+ /** Creates the scopes, inputs, snapshots, decisions and meta tables. Idempotent. Needs PostgreSQL 13 or later. */
20
+ export declare function migrate(client: PostgresClient, options?: {
21
+ prefix?: string;
22
+ }): Promise<void>;
23
+ export declare function postgresStore(client: PostgresClient, options?: PostgresStoreOptions): ScopeStore;
24
+ //# sourceMappingURL=postgres.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"postgres.d.ts","sourceRoot":"","sources":["../../src/store/postgres.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAA4B,SAAS,EAAE,UAAU,EAAqC,MAAM,YAAY,CAAC;AAIrH,MAAM,WAAW,cAAc;IAC7B,KAAK,CAAC,IAAI,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,OAAO,EAAE,GAAG,OAAO,CAAC;QAAE,IAAI,EAAE,OAAO,EAAE,CAAC;QAAC,QAAQ,EAAE,MAAM,GAAG,IAAI,CAAA;KAAE,CAAC,CAAC;CAChG;AAED,kGAAkG;AAClG,MAAM,WAAW,gBAAgB;IAC/B,MAAM,CAAC,OAAO,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,IAAI,GAAG,OAAO,CAAC,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC;CAC7E;AAED,MAAM,WAAW,oBAAoB;IACnC,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,MAAM,CAAC,EAAE,SAAS,CAAC;IACnB,QAAQ,CAAC,EAAE,gBAAgB,CAAC;IAC5B,wGAAwG;IACxG,WAAW,CAAC,EAAE,OAAO,CAAC;CACvB;AAED,kHAAkH;AAClH,wBAAsB,OAAO,CAAC,MAAM,EAAE,cAAc,EAAE,OAAO,CAAC,EAAE;IAAE,MAAM,CAAC,EAAE,MAAM,CAAA;CAAE,GAAG,OAAO,CAAC,IAAI,CAAC,CAiClG;AAED,wBAAgB,aAAa,CAAC,MAAM,EAAE,cAAc,EAAE,OAAO,CAAC,EAAE,oBAAoB,GAAG,UAAU,CAgOhG"}