@digitalpaws/starr 0.0.1

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 (290) hide show
  1. package/README.rst +75 -0
  2. package/data/.nfs.811bbb0d.43c34.4 +0 -0
  3. package/data/.nfs.81ba4cd0.ffff87804.4 +0 -0
  4. package/data/.nfs.82d127f7.fffff5704.4 +0 -0
  5. package/data/.nfs.82d127fe.fffff5704.4 +0 -0
  6. package/data/.nfs.82d159a5.fffff5aa4.4 +0 -0
  7. package/data/.nfs.82d159aa.fffff5aa4.4 +0 -0
  8. package/data/.nfs.82d15a9c.fffff5bb4.4 +0 -0
  9. package/data/.nfs.82d15aa1.fffff5bb4.4 +0 -0
  10. package/data/.nfs.82d15c65.fffff5c24.4 +0 -0
  11. package/data/.nfs.82d1852c.fffff5e24.4 +0 -0
  12. package/data/.nfs.82d18536.fffff5e24.4 +0 -0
  13. package/data/.nfs.82d18dbe.fffff5e44.4 +0 -0
  14. package/data/.nfs.82d18dc6.fffff5e44.4 +0 -0
  15. package/data/.nfs.8309a3f5.fffff82f4.4 +0 -0
  16. package/data/.nfs.8309a3fe.fffff82f4.4 +0 -0
  17. package/data/.nfs.8314122e.fffffb044.4 +0 -0
  18. package/data/.nfs.83141236.fffffb044.4 +0 -0
  19. package/data/.nfs.833c4fe9.fffffbc34.4 +0 -0
  20. package/data/.nfs.833c4ff3.fffffbc34.4 +0 -0
  21. package/data/logs/starr.log +66244 -0
  22. package/data/starr.db +0 -0
  23. package/data/starr.db-shm +0 -0
  24. package/data/starr.db-wal +0 -0
  25. package/data/starr.jwt +1 -0
  26. package/data/starr.key +1 -0
  27. package/dist/auth/auth-service.d.ts +42 -0
  28. package/dist/auth/auth-service.d.ts.map +1 -0
  29. package/dist/auth/auth-service.js +226 -0
  30. package/dist/auth/auth-service.js.map +1 -0
  31. package/dist/auth/http-server.d.ts +16 -0
  32. package/dist/auth/http-server.d.ts.map +1 -0
  33. package/dist/auth/http-server.js +207 -0
  34. package/dist/auth/http-server.js.map +1 -0
  35. package/dist/auth/jwt-secret.d.ts +6 -0
  36. package/dist/auth/jwt-secret.d.ts.map +1 -0
  37. package/dist/auth/jwt-secret.js +51 -0
  38. package/dist/auth/jwt-secret.js.map +1 -0
  39. package/dist/auth/oidc/oidc-flow.d.ts +60 -0
  40. package/dist/auth/oidc/oidc-flow.d.ts.map +1 -0
  41. package/dist/auth/oidc/oidc-flow.js +201 -0
  42. package/dist/auth/oidc/oidc-flow.js.map +1 -0
  43. package/dist/auth/oidc/oidc-provider-service.d.ts +59 -0
  44. package/dist/auth/oidc/oidc-provider-service.d.ts.map +1 -0
  45. package/dist/auth/oidc/oidc-provider-service.js +124 -0
  46. package/dist/auth/oidc/oidc-provider-service.js.map +1 -0
  47. package/dist/auth/oidc/user-service.d.ts +67 -0
  48. package/dist/auth/oidc/user-service.d.ts.map +1 -0
  49. package/dist/auth/oidc/user-service.js +177 -0
  50. package/dist/auth/oidc/user-service.js.map +1 -0
  51. package/dist/auth/rate-limiter.d.ts +31 -0
  52. package/dist/auth/rate-limiter.d.ts.map +1 -0
  53. package/dist/auth/rate-limiter.js +70 -0
  54. package/dist/auth/rate-limiter.js.map +1 -0
  55. package/dist/config/config-service.d.ts +83 -0
  56. package/dist/config/config-service.d.ts.map +1 -0
  57. package/dist/config/config-service.js +309 -0
  58. package/dist/config/config-service.js.map +1 -0
  59. package/dist/config/validate.d.ts +12 -0
  60. package/dist/config/validate.d.ts.map +1 -0
  61. package/dist/config/validate.js +140 -0
  62. package/dist/config/validate.js.map +1 -0
  63. package/dist/content-types/registry.d.ts +75 -0
  64. package/dist/content-types/registry.d.ts.map +1 -0
  65. package/dist/content-types/registry.js +171 -0
  66. package/dist/content-types/registry.js.map +1 -0
  67. package/dist/datastore/db.d.ts +9 -0
  68. package/dist/datastore/db.d.ts.map +1 -0
  69. package/dist/datastore/db.js +27 -0
  70. package/dist/datastore/db.js.map +1 -0
  71. package/dist/datastore/encrypt.d.ts +9 -0
  72. package/dist/datastore/encrypt.d.ts.map +1 -0
  73. package/dist/datastore/encrypt.js +84 -0
  74. package/dist/datastore/encrypt.js.map +1 -0
  75. package/dist/datastore/migrations.d.ts +10 -0
  76. package/dist/datastore/migrations.d.ts.map +1 -0
  77. package/dist/datastore/migrations.js +340 -0
  78. package/dist/datastore/migrations.js.map +1 -0
  79. package/dist/datastore/storage.d.ts +4 -0
  80. package/dist/datastore/storage.d.ts.map +1 -0
  81. package/dist/datastore/storage.js +60 -0
  82. package/dist/datastore/storage.js.map +1 -0
  83. package/dist/events/event-bus.d.ts +15 -0
  84. package/dist/events/event-bus.d.ts.map +1 -0
  85. package/dist/events/event-bus.js +140 -0
  86. package/dist/events/event-bus.js.map +1 -0
  87. package/dist/events/spine.d.ts +31 -0
  88. package/dist/events/spine.d.ts.map +1 -0
  89. package/dist/events/spine.js +68 -0
  90. package/dist/events/spine.js.map +1 -0
  91. package/dist/events/trace.d.ts +24 -0
  92. package/dist/events/trace.d.ts.map +1 -0
  93. package/dist/events/trace.js +33 -0
  94. package/dist/events/trace.js.map +1 -0
  95. package/dist/host.d.ts +65 -0
  96. package/dist/host.d.ts.map +1 -0
  97. package/dist/host.js +94 -0
  98. package/dist/host.js.map +1 -0
  99. package/dist/library/importer.d.ts +29 -0
  100. package/dist/library/importer.d.ts.map +1 -0
  101. package/dist/library/importer.js +145 -0
  102. package/dist/library/importer.js.map +1 -0
  103. package/dist/library/library-cache.d.ts +46 -0
  104. package/dist/library/library-cache.d.ts.map +1 -0
  105. package/dist/library/library-cache.js +152 -0
  106. package/dist/library/library-cache.js.map +1 -0
  107. package/dist/library/library-config.d.ts +12 -0
  108. package/dist/library/library-config.d.ts.map +1 -0
  109. package/dist/library/library-config.js +10 -0
  110. package/dist/library/library-config.js.map +1 -0
  111. package/dist/library/library-scanner.d.ts +62 -0
  112. package/dist/library/library-scanner.d.ts.map +1 -0
  113. package/dist/library/library-scanner.js +336 -0
  114. package/dist/library/library-scanner.js.map +1 -0
  115. package/dist/library/library-service.d.ts +65 -0
  116. package/dist/library/library-service.d.ts.map +1 -0
  117. package/dist/library/library-service.js +197 -0
  118. package/dist/library/library-service.js.map +1 -0
  119. package/dist/library/metadata-matcher.d.ts +56 -0
  120. package/dist/library/metadata-matcher.d.ts.map +1 -0
  121. package/dist/library/metadata-matcher.js +207 -0
  122. package/dist/library/metadata-matcher.js.map +1 -0
  123. package/dist/library/naming.d.ts +8 -0
  124. package/dist/library/naming.d.ts.map +1 -0
  125. package/dist/library/naming.js +47 -0
  126. package/dist/library/naming.js.map +1 -0
  127. package/dist/library/scan-controller.d.ts +95 -0
  128. package/dist/library/scan-controller.d.ts.map +1 -0
  129. package/dist/library/scan-controller.js +379 -0
  130. package/dist/library/scan-controller.js.map +1 -0
  131. package/dist/library/source-resolver.d.ts +17 -0
  132. package/dist/library/source-resolver.d.ts.map +1 -0
  133. package/dist/library/source-resolver.js +75 -0
  134. package/dist/library/source-resolver.js.map +1 -0
  135. package/dist/logging/logger.d.ts +3 -0
  136. package/dist/logging/logger.d.ts.map +1 -0
  137. package/dist/logging/logger.js +107 -0
  138. package/dist/logging/logger.js.map +1 -0
  139. package/dist/main.d.ts +36 -0
  140. package/dist/main.d.ts.map +1 -0
  141. package/dist/main.js +229 -0
  142. package/dist/main.js.map +1 -0
  143. package/dist/plugins/context.d.ts +10 -0
  144. package/dist/plugins/context.d.ts.map +1 -0
  145. package/dist/plugins/context.js +110 -0
  146. package/dist/plugins/context.js.map +1 -0
  147. package/dist/plugins/discovery.d.ts +2 -0
  148. package/dist/plugins/discovery.d.ts.map +1 -0
  149. package/dist/plugins/discovery.js +32 -0
  150. package/dist/plugins/discovery.js.map +1 -0
  151. package/dist/plugins/loader.d.ts +9 -0
  152. package/dist/plugins/loader.d.ts.map +1 -0
  153. package/dist/plugins/loader.js +245 -0
  154. package/dist/plugins/loader.js.map +1 -0
  155. package/dist/state/request-intake.d.ts +26 -0
  156. package/dist/state/request-intake.d.ts.map +1 -0
  157. package/dist/state/request-intake.js +74 -0
  158. package/dist/state/request-intake.js.map +1 -0
  159. package/dist/state/state-store.d.ts +146 -0
  160. package/dist/state/state-store.d.ts.map +1 -0
  161. package/dist/state/state-store.js +465 -0
  162. package/dist/state/state-store.js.map +1 -0
  163. package/dist/state/trace-store.d.ts +12 -0
  164. package/dist/state/trace-store.d.ts.map +1 -0
  165. package/dist/state/trace-store.js +24 -0
  166. package/dist/state/trace-store.js.map +1 -0
  167. package/dist/types/plugin.d.ts +93 -0
  168. package/dist/types/plugin.d.ts.map +1 -0
  169. package/dist/types/plugin.js +4 -0
  170. package/dist/types/plugin.js.map +1 -0
  171. package/dist/web/index.d.ts +10 -0
  172. package/dist/web/index.d.ts.map +1 -0
  173. package/dist/web/index.js +153 -0
  174. package/dist/web/index.js.map +1 -0
  175. package/dist/web/routes/activity.d.ts +6 -0
  176. package/dist/web/routes/activity.d.ts.map +1 -0
  177. package/dist/web/routes/activity.js +31 -0
  178. package/dist/web/routes/activity.js.map +1 -0
  179. package/dist/web/routes/auth.d.ts +6 -0
  180. package/dist/web/routes/auth.d.ts.map +1 -0
  181. package/dist/web/routes/auth.js +142 -0
  182. package/dist/web/routes/auth.js.map +1 -0
  183. package/dist/web/routes/config.d.ts +7 -0
  184. package/dist/web/routes/config.d.ts.map +1 -0
  185. package/dist/web/routes/config.js +204 -0
  186. package/dist/web/routes/config.js.map +1 -0
  187. package/dist/web/routes/content-types.d.ts +6 -0
  188. package/dist/web/routes/content-types.d.ts.map +1 -0
  189. package/dist/web/routes/content-types.js +29 -0
  190. package/dist/web/routes/content-types.js.map +1 -0
  191. package/dist/web/routes/discovery.d.ts +6 -0
  192. package/dist/web/routes/discovery.d.ts.map +1 -0
  193. package/dist/web/routes/discovery.js +111 -0
  194. package/dist/web/routes/discovery.js.map +1 -0
  195. package/dist/web/routes/library-import.d.ts +6 -0
  196. package/dist/web/routes/library-import.d.ts.map +1 -0
  197. package/dist/web/routes/library-import.js +120 -0
  198. package/dist/web/routes/library-import.js.map +1 -0
  199. package/dist/web/routes/library-management.d.ts +6 -0
  200. package/dist/web/routes/library-management.d.ts.map +1 -0
  201. package/dist/web/routes/library-management.js +120 -0
  202. package/dist/web/routes/library-management.js.map +1 -0
  203. package/dist/web/routes/library.d.ts +6 -0
  204. package/dist/web/routes/library.d.ts.map +1 -0
  205. package/dist/web/routes/library.js +28 -0
  206. package/dist/web/routes/library.js.map +1 -0
  207. package/dist/web/routes/oidc.d.ts +9 -0
  208. package/dist/web/routes/oidc.d.ts.map +1 -0
  209. package/dist/web/routes/oidc.js +203 -0
  210. package/dist/web/routes/oidc.js.map +1 -0
  211. package/dist/web/routes/requests.d.ts +6 -0
  212. package/dist/web/routes/requests.d.ts.map +1 -0
  213. package/dist/web/routes/requests.js +183 -0
  214. package/dist/web/routes/requests.js.map +1 -0
  215. package/dist/web/routes/sse.d.ts +6 -0
  216. package/dist/web/routes/sse.d.ts.map +1 -0
  217. package/dist/web/routes/sse.js +54 -0
  218. package/dist/web/routes/sse.js.map +1 -0
  219. package/package.json +33 -0
  220. package/package.json.license +2 -0
  221. package/src/auth/auth-service.ts +333 -0
  222. package/src/auth/http-server.ts +249 -0
  223. package/src/auth/jwt-secret.ts +65 -0
  224. package/src/auth/oidc/oidc-flow.ts +266 -0
  225. package/src/auth/oidc/oidc-provider-service.ts +174 -0
  226. package/src/auth/oidc/user-service.ts +227 -0
  227. package/src/auth/rate-limiter.ts +85 -0
  228. package/src/config/config-service.ts +434 -0
  229. package/src/config/validate.ts +153 -0
  230. package/src/content-types/registry.ts +194 -0
  231. package/src/datastore/db.ts +38 -0
  232. package/src/datastore/encrypt.ts +107 -0
  233. package/src/datastore/migrations.ts +367 -0
  234. package/src/datastore/storage.ts +83 -0
  235. package/src/events/event-bus.ts +180 -0
  236. package/src/events/spine.ts +87 -0
  237. package/src/events/trace.ts +38 -0
  238. package/src/host.ts +130 -0
  239. package/src/library/importer.ts +174 -0
  240. package/src/library/library-cache.ts +212 -0
  241. package/src/library/library-config.ts +22 -0
  242. package/src/library/library-scanner.ts +404 -0
  243. package/src/library/library-service.ts +282 -0
  244. package/src/library/metadata-matcher.ts +285 -0
  245. package/src/library/naming.ts +59 -0
  246. package/src/library/scan-controller.ts +490 -0
  247. package/src/library/source-resolver.ts +92 -0
  248. package/src/logging/logger.ts +115 -0
  249. package/src/main.ts +364 -0
  250. package/src/plugins/context.ts +138 -0
  251. package/src/plugins/discovery.ts +29 -0
  252. package/src/plugins/loader.ts +309 -0
  253. package/src/state/request-intake.ts +101 -0
  254. package/src/state/state-store.ts +621 -0
  255. package/src/state/trace-store.ts +27 -0
  256. package/src/types/plugin.ts +110 -0
  257. package/src/web/index.ts +182 -0
  258. package/src/web/routes/activity.ts +41 -0
  259. package/src/web/routes/auth.ts +170 -0
  260. package/src/web/routes/config.ts +282 -0
  261. package/src/web/routes/content-types.ts +42 -0
  262. package/src/web/routes/discovery.ts +156 -0
  263. package/src/web/routes/library-import.ts +196 -0
  264. package/src/web/routes/library-management.ts +140 -0
  265. package/src/web/routes/library.ts +46 -0
  266. package/src/web/routes/oidc.ts +260 -0
  267. package/src/web/routes/requests.ts +250 -0
  268. package/src/web/routes/sse.ts +92 -0
  269. package/tests/auth.test.ts +510 -0
  270. package/tests/config-route.test.ts +345 -0
  271. package/tests/config.test.ts +612 -0
  272. package/tests/content-types.test.ts +376 -0
  273. package/tests/datastore.test.ts +345 -0
  274. package/tests/e2e.test.ts +430 -0
  275. package/tests/event-bus.test.ts +925 -0
  276. package/tests/host.test.ts +449 -0
  277. package/tests/library-cache.test.ts +171 -0
  278. package/tests/library-scanner.test.ts +177 -0
  279. package/tests/library.test.ts +210 -0
  280. package/tests/loader-context.test.ts +644 -0
  281. package/tests/logger-jsonl.test.ts +154 -0
  282. package/tests/metadata-matcher.test.ts +198 -0
  283. package/tests/oidc.test.ts +218 -0
  284. package/tests/scan-controller.test.ts +328 -0
  285. package/tests/source-resolver.test.ts +100 -0
  286. package/tests/starr-video-integration.test.ts +153 -0
  287. package/tests/state-store.test.ts +700 -0
  288. package/tests/trace-history.test.ts +356 -0
  289. package/tsconfig.json +8 -0
  290. package/tsconfig.json.license +2 -0
@@ -0,0 +1,465 @@
1
+ // SPDX-License-Identifier: 0BSD
2
+ // SPDX-FileCopyrightText: 2025 Digi <digitalpaws@proton.me>
3
+ import { env } from "node:process";
4
+ // ── Row mapping helper ─────────────────────────────────────
5
+ function rowToRequest(row) {
6
+ return {
7
+ requestId: row.request_id,
8
+ contentTypeId: row.content_type_id,
9
+ contentIdentity: row.content_identity,
10
+ item: JSON.parse(row.item),
11
+ ownerUserId: row.owner_user_id,
12
+ watchers: JSON.parse(row.watchers),
13
+ status: row.status,
14
+ statusDetail: row.status_detail || undefined,
15
+ chosenReleaseId: row.chosen_release_id || undefined,
16
+ attempts: row.attempts,
17
+ libraryId: row.library_id || undefined,
18
+ createdAt: row.created_at,
19
+ updatedAt: row.updated_at,
20
+ };
21
+ }
22
+ /**
23
+ * Maximum number of trace entries retained per traceId.
24
+ * Set via STARR_TRACE_HISTORY_LIMIT env var; defaults to 50.
25
+ * Values ≤ 0 disable trace capture entirely.
26
+ */
27
+ const TRACE_HISTORY_LIMIT = (() => {
28
+ const raw = env.STARR_TRACE_HISTORY_LIMIT;
29
+ if (raw === undefined || raw === "")
30
+ return 50;
31
+ const n = Number(raw);
32
+ if (Number.isNaN(n)) {
33
+ // We don't have a logger at module scope — the state store
34
+ // constructor will log a warning if the env var is invalid.
35
+ return 50;
36
+ }
37
+ return Math.max(0, Math.floor(n));
38
+ })();
39
+ // ── StateStore class ───────────────────────────────────────
40
+ export class StateStore {
41
+ db;
42
+ bus;
43
+ logger;
44
+ // Prepared statements — created once in constructor
45
+ stmtGetByRequestId;
46
+ stmtFindByIdentity;
47
+ stmtInsert;
48
+ stmtUpdateStatus;
49
+ stmtIncrementAttempts;
50
+ stmtAddWatcher;
51
+ stmtListByUser;
52
+ stmtInsertTrace;
53
+ stmtGetIdsByTraceId;
54
+ stmtGetTraceByRequestId;
55
+ stmtResetAttempts;
56
+ stmtResetForRetry;
57
+ stmtDeleteRequest;
58
+ stmtDeleteTraceByRequestId;
59
+ constructor(db, bus, logger) {
60
+ this.db = db;
61
+ this.bus = bus;
62
+ this.logger = logger.child("state-store");
63
+ // Compile prepared statements once
64
+ this.stmtGetByRequestId = db.prepare("SELECT * FROM tracked_requests WHERE request_id = @requestId");
65
+ this.stmtFindByIdentity = db.prepare(`SELECT * FROM tracked_requests
66
+ WHERE content_identity = @identity AND status != 'failed'
67
+ ORDER BY created_at DESC
68
+ LIMIT 1`);
69
+ this.stmtInsert = db.prepare(`INSERT INTO tracked_requests
70
+ (request_id, content_type_id, content_identity, item,
71
+ owner_user_id, watchers, status, attempts, library_id, created_at, updated_at)
72
+ VALUES
73
+ (@requestId, @contentTypeId, @contentIdentity, @item,
74
+ @ownerUserId, '[]', 'requested', 0,
75
+ @libraryId,
76
+ datetime('now'), datetime('now'))`);
77
+ this.stmtUpdateStatus = db.prepare(`UPDATE tracked_requests
78
+ SET status = @status,
79
+ status_detail = @detail,
80
+ chosen_release_id = COALESCE(@chosenReleaseId, chosen_release_id),
81
+ updated_at = datetime('now')
82
+ WHERE request_id = @requestId`);
83
+ this.stmtIncrementAttempts = db.prepare(`UPDATE tracked_requests
84
+ SET attempts = attempts + 1, updated_at = datetime('now')
85
+ WHERE request_id = @requestId`);
86
+ this.stmtAddWatcher = db.prepare(`UPDATE tracked_requests
87
+ SET watchers = @watchers, updated_at = datetime('now')
88
+ WHERE request_id = @requestId`);
89
+ this.stmtListByUser = db.prepare(`SELECT * FROM tracked_requests
90
+ WHERE owner_user_id = @userId
91
+ OR watchers LIKE @pattern
92
+ ORDER BY created_at DESC`);
93
+ // Trace log — prepared statements
94
+ this.stmtInsertTrace = db.prepare(`INSERT INTO trace_log (trace_id, request_id, event_type, event_data, timestamp)
95
+ VALUES (@traceId, @requestId, @eventType, @eventData, @timestamp)`);
96
+ this.stmtGetIdsByTraceId = db.prepare(`SELECT id FROM trace_log
97
+ WHERE trace_id = @traceId
98
+ ORDER BY id ASC`);
99
+ this.stmtGetTraceByRequestId = db.prepare(`SELECT * FROM trace_log
100
+ WHERE request_id = @requestId
101
+ ORDER BY id ASC`);
102
+ this.stmtResetAttempts = db.prepare(`UPDATE tracked_requests
103
+ SET attempts = 0, updated_at = datetime('now')
104
+ WHERE request_id = @requestId`);
105
+ this.stmtResetForRetry = db.prepare(`UPDATE tracked_requests
106
+ SET status = 'requested',
107
+ status_detail = @detail,
108
+ chosen_release_id = NULL,
109
+ attempts = 0,
110
+ updated_at = datetime('now')
111
+ WHERE request_id = @requestId`);
112
+ this.stmtDeleteRequest = db.prepare(`DELETE FROM tracked_requests WHERE request_id = @requestId`);
113
+ this.stmtDeleteTraceByRequestId = db.prepare(`DELETE FROM trace_log WHERE request_id = @requestId`);
114
+ // Subscribe to acquisition spine events
115
+ this.subscribe();
116
+ }
117
+ // ── Public API ───────────────────────────────────────────
118
+ /** Retrieve a single tracked request by its domain id. */
119
+ getByRequestId(requestId) {
120
+ const row = this.stmtGetByRequestId.get({ requestId });
121
+ return row ? rowToRequest(row) : undefined;
122
+ }
123
+ /**
124
+ * Find a non-failed tracked request with the given content identity.
125
+ * Used by request intake for de-duplication (DU1).
126
+ * Returns the most recently created match, or undefined.
127
+ */
128
+ findByContentIdentity(contentIdentity) {
129
+ const row = this.stmtFindByIdentity.get({ identity: contentIdentity });
130
+ return row ? rowToRequest(row) : undefined;
131
+ }
132
+ /**
133
+ * Insert a brand-new tracked request with status ``requested``.
134
+ * Called by request intake after de-dup check (DU3).
135
+ */
136
+ insert(data) {
137
+ this.stmtInsert.run({
138
+ requestId: data.requestId,
139
+ contentTypeId: data.contentTypeId,
140
+ contentIdentity: data.contentIdentity,
141
+ item: JSON.stringify(data.item),
142
+ ownerUserId: data.ownerUserId,
143
+ libraryId: data.libraryId ?? null,
144
+ });
145
+ this.logger.debug("tracked request created", {
146
+ requestId: data.requestId,
147
+ contentIdentity: data.contentIdentity,
148
+ libraryId: data.libraryId,
149
+ });
150
+ }
151
+ /**
152
+ * Add a userId to the watchers array of an existing request.
153
+ * Called by request intake when re-attaching to an existing request (DU2).
154
+ * No-op if the user is already the owner or a watcher.
155
+ */
156
+ addWatcher(requestId, userId) {
157
+ const req = this.getByRequestId(requestId);
158
+ if (!req) {
159
+ this.logger.warn("addWatcher: unknown requestId", { requestId });
160
+ return;
161
+ }
162
+ if (req.ownerUserId === userId || req.watchers.includes(userId)) {
163
+ return; // already attached
164
+ }
165
+ const updated = [...req.watchers, userId];
166
+ this.stmtAddWatcher.run({
167
+ requestId,
168
+ watchers: JSON.stringify(updated),
169
+ });
170
+ this.logger.debug("watcher added", { requestId, userId });
171
+ }
172
+ /**
173
+ * Return the ordered trace history for a tracked request.
174
+ *
175
+ * Returns an array of TraceEntry, oldest first. Returns an empty array
176
+ * if the requestId is unknown or has no captured events.
177
+ *
178
+ * This is the data surface for the admin "activity" view (DBG2).
179
+ * The UI (Task 022) renders the returned data; this task only provides
180
+ * the query.
181
+ */
182
+ getTraceLog(requestId) {
183
+ const rows = this.stmtGetTraceByRequestId.all({ requestId });
184
+ return rows.map((row) => ({
185
+ id: row.id,
186
+ traceId: row.trace_id,
187
+ requestId: row.request_id,
188
+ eventType: row.event_type,
189
+ eventData: JSON.parse(row.event_data),
190
+ timestamp: row.timestamp,
191
+ }));
192
+ }
193
+ // ── Retry ───────────────────────────────────────────────
194
+ /**
195
+ * Reset a tracked request to 'requested' for a manual retry.
196
+ *
197
+ * Clears chosenReleaseId, resets attempts to 0, sets status to
198
+ * 'requested' with a detail message. This is called from the
199
+ * retry endpoint before re-emitting content.requested.
200
+ *
201
+ * Uses a transaction for atomicity.
202
+ * Emits item.updated so the UI reflects the change immediately.
203
+ */
204
+ resetAndRetry(requestId) {
205
+ const txn = this.db.transaction(() => {
206
+ // Reset status, clear chosenReleaseId, reset attempts in one statement
207
+ this.stmtResetForRetry.run({
208
+ requestId,
209
+ detail: "Retrying — restarted by user",
210
+ });
211
+ });
212
+ txn();
213
+ // Emit item.updated so the UI updates live
214
+ this.bus.emit("item.updated", {
215
+ requestId,
216
+ status: "requested",
217
+ detail: "Retrying — restarted by user",
218
+ });
219
+ this.logger.info("request reset for retry", { requestId });
220
+ }
221
+ // ── Delete ──────────────────────────────────────────────
222
+ /**
223
+ * Permanently delete a tracked request and its associated
224
+ * trace-log entries. This is unconditional (any status).
225
+ *
226
+ * Returns true if a row was deleted, false if the requestId
227
+ * did not exist.
228
+ */
229
+ deleteRequest(requestId) {
230
+ const txn = this.db.transaction(() => {
231
+ // 1. Delete trace log entries for this request
232
+ this.stmtDeleteTraceByRequestId.run({ requestId });
233
+ // 2. Delete the request itself
234
+ const info = this.stmtDeleteRequest.run({ requestId });
235
+ return info.changes > 0;
236
+ });
237
+ const deleted = txn();
238
+ if (deleted) {
239
+ this.logger.info("request deleted", { requestId });
240
+ }
241
+ else {
242
+ this.logger.warn("deleteRequest: requestId not found", { requestId });
243
+ }
244
+ // Note: we deliberately do NOT emit item.updated here.
245
+ // Deletion is handled on the UI side by removing the item from
246
+ // the local store and/or navigating away.
247
+ return deleted;
248
+ }
249
+ /**
250
+ * Return ALL tracked requests (admin only).
251
+ */
252
+ getLibraryPath(requestId) {
253
+ const row = this.db
254
+ .prepare("SELECT library_path FROM library_paths WHERE request_id = ?")
255
+ .get(requestId);
256
+ return row?.library_path;
257
+ }
258
+ getAllRequests() {
259
+ const rows = this.db
260
+ .prepare("SELECT * FROM tracked_requests ORDER BY created_at DESC")
261
+ .all();
262
+ return rows.map((row) => rowToRequest(row));
263
+ }
264
+ /**
265
+ * List tracked requests visible to a given user (owner or watcher).
266
+ * Used by the UI to show the request list (UI-ST2).
267
+ */
268
+ listByUser(userId) {
269
+ // The LIKE pattern searches for the userId inside the JSON watchers array.
270
+ // e.g. '%"admin"%' matches ["admin"] or ["alice","admin"].
271
+ const rows = this.stmtListByUser.all({
272
+ userId,
273
+ pattern: `%"${userId}"%`,
274
+ });
275
+ return rows.map(rowToRequest);
276
+ }
277
+ // ── Trace capture ────────────────────────────────────────
278
+ /**
279
+ * Capture a spine event into the trace log. Stores the full event data
280
+ * (envelope fields + payload) as JSON, then prunes if the per-traceId
281
+ * count exceeds TRACE_HISTORY_LIMIT.
282
+ *
283
+ * This is a no-op if TRACE_HISTORY_LIMIT is 0 (trace capture disabled).
284
+ */
285
+ captureTraceEvent(event, requestId) {
286
+ if (TRACE_HISTORY_LIMIT === 0)
287
+ return;
288
+ const eventData = {
289
+ eventId: event.id,
290
+ traceId: event.traceId,
291
+ correlationId: event.correlationId,
292
+ source: event.source,
293
+ schemaVersion: event.schemaVersion,
294
+ timestamp: event.timestamp,
295
+ payload: event.payload,
296
+ };
297
+ // 1. Insert the new entry
298
+ this.stmtInsertTrace.run({
299
+ traceId: event.traceId,
300
+ requestId,
301
+ eventType: event.type,
302
+ eventData: JSON.stringify(eventData),
303
+ timestamp: event.timestamp,
304
+ });
305
+ // 2. Fetch all entry ids for this traceId, oldest first
306
+ const rows = this.stmtGetIdsByTraceId.all({
307
+ traceId: event.traceId,
308
+ });
309
+ // 3. Prune if over the limit — delete the oldest excess entries
310
+ if (rows.length > TRACE_HISTORY_LIMIT) {
311
+ const excess = rows.length - TRACE_HISTORY_LIMIT;
312
+ const deleteIds = rows.slice(0, excess).map((r) => r.id);
313
+ // Use a one-off prepared statement for deletes
314
+ const deleteStmt = this.db.prepare("DELETE FROM trace_log WHERE id = ?");
315
+ for (const id of deleteIds) {
316
+ deleteStmt.run(id);
317
+ }
318
+ this.logger.debug("trace pruned", {
319
+ traceId: event.traceId,
320
+ deleted: excess,
321
+ remaining: TRACE_HISTORY_LIMIT,
322
+ });
323
+ }
324
+ }
325
+ // ── Event subscription ───────────────────────────────────
326
+ subscribe() {
327
+ this.bus.on("release.found", this.onReleaseFound.bind(this));
328
+ this.bus.on("download.started", this.onDownloadStarted.bind(this));
329
+ this.bus.on("download.completed", this.onDownloadCompleted.bind(this));
330
+ this.bus.on("download.failed", this.onDownloadFailed.bind(this));
331
+ this.bus.on("request.failed", this.onRequestFailed.bind(this));
332
+ this.bus.on("import.started", this.onImportStarted.bind(this));
333
+ this.bus.on("import.completed", this.onImportCompleted.bind(this));
334
+ this.bus.on("import.failed", this.onImportFailed.bind(this));
335
+ }
336
+ onReleaseFound(event) {
337
+ const { requestId } = event.payload;
338
+ const req = this.getByRequestId(requestId);
339
+ if (!req) {
340
+ this.logger.warn("release.found for unknown requestId", { requestId });
341
+ return;
342
+ }
343
+ this.captureTraceEvent(event, requestId);
344
+ // Transition: requested → searching (first candidate arrived)
345
+ if (req.status === "requested") {
346
+ this.updateStatus(requestId, "searching");
347
+ }
348
+ // If already searching (or beyond), just more candidates — no status change.
349
+ }
350
+ onDownloadStarted(event) {
351
+ const payload = event.payload;
352
+ const req = this.getByRequestId(payload.requestId);
353
+ if (!req) {
354
+ this.logger.warn("download.started for unknown requestId", {
355
+ requestId: payload.requestId,
356
+ });
357
+ return;
358
+ }
359
+ this.captureTraceEvent(event, payload.requestId);
360
+ // Increment the display-only attempts counter (SM4)
361
+ this.incrementAttempts(payload.requestId);
362
+ // Transition: searching → downloading (defensive: also from 'requested')
363
+ if (req.status === "searching" || req.status === "requested") {
364
+ const releaseId = payload.release?.id ?? payload.release?.title ?? undefined;
365
+ this.updateStatus(payload.requestId, "downloading", undefined, releaseId);
366
+ }
367
+ }
368
+ onDownloadCompleted(event) {
369
+ const { requestId } = event.payload;
370
+ const req = this.getByRequestId(requestId);
371
+ if (!req) {
372
+ this.logger.warn("download.completed for unknown requestId", { requestId });
373
+ return;
374
+ }
375
+ this.captureTraceEvent(event, requestId);
376
+ // Terminal success — only if not already terminal
377
+ if (req.status !== "failed" && req.status !== "downloaded" && req.status !== "imported") {
378
+ this.updateStatus(requestId, "downloaded");
379
+ }
380
+ }
381
+ onDownloadFailed(event) {
382
+ const { requestId } = event.payload;
383
+ const req = this.getByRequestId(requestId);
384
+ if (!req) {
385
+ this.logger.warn("download.failed for unknown requestId", { requestId });
386
+ return;
387
+ }
388
+ this.captureTraceEvent(event, requestId);
389
+ // Transient failure: go back to searching, NEVER to failed (SM1)
390
+ if (req.status === "downloading") {
391
+ this.updateStatus(requestId, "searching", `retrying (attempt ${req.attempts})`);
392
+ }
393
+ }
394
+ onImportStarted(event) {
395
+ const { requestId } = event.payload;
396
+ const req = this.getByRequestId(requestId);
397
+ if (!req)
398
+ return;
399
+ if (req.status === "downloaded") {
400
+ this.updateStatus(requestId, "importing");
401
+ }
402
+ }
403
+ onImportCompleted(event) {
404
+ const { requestId } = event.payload;
405
+ const req = this.getByRequestId(requestId);
406
+ if (!req)
407
+ return;
408
+ if (req.status === "importing") {
409
+ this.updateStatus(requestId, "imported");
410
+ }
411
+ }
412
+ onImportFailed(event) {
413
+ const payload = event.payload;
414
+ const req = this.getByRequestId(payload.requestId);
415
+ if (!req)
416
+ return;
417
+ if (req.status === "importing") {
418
+ this.updateStatus(payload.requestId, "downloaded", `Import failed: ${payload.error ?? "unknown error"}`);
419
+ }
420
+ }
421
+ onRequestFailed(event) {
422
+ const payload = event.payload;
423
+ const req = this.getByRequestId(payload.requestId);
424
+ if (!req) {
425
+ this.logger.warn("request.failed for unknown requestId", {
426
+ requestId: payload.requestId,
427
+ });
428
+ return;
429
+ }
430
+ this.captureTraceEvent(event, payload.requestId);
431
+ // Terminal failure — the ONLY path to 'failed' (SM2, SP1a)
432
+ if (req.status !== "failed" && req.status !== "downloaded" && req.status !== "imported") {
433
+ this.updateStatus(payload.requestId, "failed", payload.reason);
434
+ }
435
+ }
436
+ // ── Internal helpers ──────────────────────────────────────
437
+ /**
438
+ * Update status, optional detail, and optional chosenReleaseId.
439
+ * Emits item.updated on every call (the caller guards transitions,
440
+ * so duplicate emissions are not a concern).
441
+ */
442
+ updateStatus(requestId, status, detail, chosenReleaseId) {
443
+ this.stmtUpdateStatus.run({
444
+ requestId,
445
+ status,
446
+ detail: detail ?? null,
447
+ chosenReleaseId: chosenReleaseId ?? null,
448
+ });
449
+ // Emit item.updated — the single event the UI relies on (SP2, UI-ST1)
450
+ const payload = {
451
+ requestId,
452
+ status,
453
+ };
454
+ if (detail !== undefined) {
455
+ payload.detail = detail;
456
+ }
457
+ this.bus.emit("item.updated", payload);
458
+ this.logger.debug("status updated", { requestId, status, detail });
459
+ }
460
+ /** Increment the attempts counter by 1. Called on download.started (SM4). */
461
+ incrementAttempts(requestId) {
462
+ this.stmtIncrementAttempts.run({ requestId });
463
+ }
464
+ }
465
+ //# sourceMappingURL=state-store.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"state-store.js","sourceRoot":"","sources":["../../src/state/state-store.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,12 @@
1
+ import type { TraceEntry, StateStore } from "./state-store.js";
2
+ /**
3
+ * Initialize the trace-store wrapper with a reference to the StateStore.
4
+ * Called from main.ts after the web server and state store are created.
5
+ */
6
+ export declare function initTraceStore(store: StateStore): void;
7
+ /**
8
+ * Retrieve trace events for a given requestId.
9
+ * Returns an empty array if the state store isn't available or no events exist.
10
+ */
11
+ export declare function getTraceEvents(requestId: string): TraceEntry[];
12
+ //# sourceMappingURL=trace-store.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"trace-store.d.ts","sourceRoot":"","sources":["../../src/state/trace-store.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,UAAU,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;AAQ/D;;;GAGG;AACH,wBAAgB,cAAc,CAAC,KAAK,EAAE,UAAU,GAAG,IAAI,CAEtD;AAED;;;GAGG;AACH,wBAAgB,cAAc,CAAC,SAAS,EAAE,MAAM,GAAG,UAAU,EAAE,CAG9D"}
@@ -0,0 +1,24 @@
1
+ // SPDX-License-Identifier: 0BSD
2
+ // SPDX-FileCopyrightText: 2025 Digi <digitalpaws@proton.me>
3
+ /**
4
+ * Module-level reference to the state store, set by the host bootstrap.
5
+ * This avoids circular imports between route modules and the host.
6
+ */
7
+ let stateStore = null;
8
+ /**
9
+ * Initialize the trace-store wrapper with a reference to the StateStore.
10
+ * Called from main.ts after the web server and state store are created.
11
+ */
12
+ export function initTraceStore(store) {
13
+ stateStore = store;
14
+ }
15
+ /**
16
+ * Retrieve trace events for a given requestId.
17
+ * Returns an empty array if the state store isn't available or no events exist.
18
+ */
19
+ export function getTraceEvents(requestId) {
20
+ if (!stateStore)
21
+ return [];
22
+ return stateStore.getTraceLog(requestId);
23
+ }
24
+ //# sourceMappingURL=trace-store.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"trace-store.js","sourceRoot":"","sources":["../../src/state/trace-store.ts"],"names":[],"mappings":"AAAA,gCAAgC;AAChC,4DAA4D;AAI5D;;;GAGG;AACH,IAAI,UAAU,GAAsB,IAAI,CAAC;AAEzC;;;GAGG;AACH,MAAM,UAAU,cAAc,CAAC,KAAiB;IAC9C,UAAU,GAAG,KAAK,CAAC;AACrB,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,cAAc,CAAC,SAAiB;IAC9C,IAAI,CAAC,UAAU;QAAE,OAAO,EAAE,CAAC;IAC3B,OAAO,UAAU,CAAC,WAAW,CAAC,SAAS,CAAC,CAAC;AAC3C,CAAC"}
@@ -0,0 +1,93 @@
1
+ import type { ContentTypeDescriptor } from "@digitalpaws/starr-types-core";
2
+ export interface PluginMeta {
3
+ id: string;
4
+ version: string;
5
+ starrApiVersion: string;
6
+ }
7
+ export interface ConnectionTestResult {
8
+ ok: boolean;
9
+ message?: string;
10
+ }
11
+ export interface PluginLifecycle {
12
+ start?(): void | Promise<void>;
13
+ stop?(): void | Promise<void>;
14
+ testConnection?(values: Record<string, unknown>): ConnectionTestResult | Promise<ConnectionTestResult>;
15
+ }
16
+ export interface Logger {
17
+ debug(message: string, meta?: Record<string, unknown>): void;
18
+ info(message: string, meta?: Record<string, unknown>): void;
19
+ warn(message: string, meta?: Record<string, unknown>): void;
20
+ error(message: string, meta?: Record<string, unknown>): void;
21
+ child(tag: string): Logger;
22
+ }
23
+ export interface StarrEvent<P = unknown> {
24
+ readonly type: string;
25
+ readonly id: string;
26
+ readonly traceId: string;
27
+ readonly correlationId?: string;
28
+ readonly source: string;
29
+ readonly timestamp: string;
30
+ readonly schemaVersion: number;
31
+ readonly payload: P;
32
+ /** Convenience: emit a correlated reply. */
33
+ reply<R>(type: string, payload: R): void;
34
+ }
35
+ export interface EmitOpts {
36
+ correlationId?: string;
37
+ }
38
+ export interface RequestOpts {
39
+ responseType: string;
40
+ windowMs: number;
41
+ max?: number;
42
+ }
43
+ export type Unsubscribe = () => void;
44
+ export type EventHandler<P = unknown> = (event: StarrEvent<P>) => void | Promise<void>;
45
+ export interface EventBus {
46
+ emit<P>(type: string, payload: P, opts?: EmitOpts): void;
47
+ on<P>(type: string, handler: EventHandler<P>): Unsubscribe;
48
+ request<Res>(type: string, payload: unknown, opts: RequestOpts): Promise<StarrEvent<Res>[]>;
49
+ }
50
+ export interface PluginStorage {
51
+ get<T>(key: string): Promise<T | undefined>;
52
+ set<T>(key: string, value: T): Promise<void>;
53
+ delete(key: string): Promise<void>;
54
+ /** List all keys (optionally filtered by prefix), sorted lexically. */
55
+ list<T>(prefix?: string): Promise<Array<{
56
+ key: string;
57
+ value: T;
58
+ }>>;
59
+ /** Delete all keys for this plugin's namespace. Used during rollback. */
60
+ deleteAll(): Promise<void>;
61
+ }
62
+ export interface ContentTypeRegistry {
63
+ /**
64
+ * Register a content-type descriptor. Throws on:
65
+ * - Malformed descriptor (empty identity, list without itemType,
66
+ * enum without options)
67
+ * - Duplicate id already registered by another plugin
68
+ */
69
+ register(descriptor: ContentTypeDescriptor): void;
70
+ }
71
+ export interface ConfigField {
72
+ type: string;
73
+ label: string;
74
+ required?: boolean;
75
+ default?: unknown;
76
+ options?: string[];
77
+ description?: string;
78
+ group?: string;
79
+ }
80
+ export type ConfigSchema<T> = {
81
+ [K in keyof T]: ConfigField;
82
+ };
83
+ export interface PluginContext {
84
+ readonly apiVersion: string;
85
+ define(meta: PluginMeta): void;
86
+ config<T>(schema: ConfigSchema<T>): Readonly<T>;
87
+ events: EventBus;
88
+ storage: PluginStorage;
89
+ contentTypes: ContentTypeRegistry;
90
+ logger: Logger;
91
+ }
92
+ export type RegisterFn = (ctx: PluginContext) => void | PluginLifecycle | Promise<void | PluginLifecycle>;
93
+ //# sourceMappingURL=plugin.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"plugin.d.ts","sourceRoot":"","sources":["../../src/types/plugin.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,4 @@
1
+ // SPDX-License-Identifier: 0BSD
2
+ // SPDX-FileCopyrightText: 2025 Digi <digitalpaws@proton.me>
3
+ export {};
4
+ //# sourceMappingURL=plugin.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"plugin.js","sourceRoot":"","sources":["../../src/types/plugin.ts"],"names":[],"mappings":"AAAA,gCAAgC;AAChC,4DAA4D"}
@@ -0,0 +1,10 @@
1
+ import Fastify from "fastify";
2
+ import type { Logger } from "../types/plugin.js";
3
+ import type { AuthService } from "../auth/auth-service.js";
4
+ import type { OidcProviderService } from "../auth/oidc/oidc-provider-service.js";
5
+ import type { OidcFlow } from "../auth/oidc/oidc-flow.js";
6
+ import type { UserService } from "../auth/oidc/user-service.js";
7
+ export declare function initAuthService(auth: AuthService): void;
8
+ export declare function initOidcServices(oidcProviders: OidcProviderService, flow: OidcFlow, users: UserService): void;
9
+ export declare function createWebServer(logger: Logger): Promise<Fastify.FastifyInstance<import("http").Server<typeof import("http").IncomingMessage, typeof import("http").ServerResponse>, import("http").IncomingMessage, import("http").ServerResponse<import("http").IncomingMessage>, Fastify.FastifyBaseLogger, Fastify.FastifyTypeProviderDefault>>;
10
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/web/index.ts"],"names":[],"mappings":"AAGA,OAAO,OAAO,MAAM,SAAS,CAAC;AAM9B,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,oBAAoB,CAAC;AACjD,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,yBAAyB,CAAC;AAC3D,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,uCAAuC,CAAC;AACjF,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,2BAA2B,CAAC;AAC1D,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,8BAA8B,CAAC;AAQhE,wBAAgB,eAAe,CAAC,IAAI,EAAE,WAAW,GAAG,IAAI,CAEvD;AAOD,wBAAgB,gBAAgB,CAC9B,aAAa,EAAE,mBAAmB,EAClC,IAAI,EAAE,QAAQ,EACd,KAAK,EAAE,WAAW,GACjB,IAAI,CAIN;AAID,wBAAsB,eAAe,CAAC,MAAM,EAAE,MAAM,sSA2InD"}