@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,107 @@
1
+ // SPDX-License-Identifier: 0BSD
2
+ // SPDX-FileCopyrightText: 2025 Digi <digitalpaws@proton.me>
3
+ import { env } from "node:process";
4
+ import path from "node:path";
5
+ import fs from "node:fs";
6
+ const LEVELS = { debug: 10, info: 20, warn: 30, error: 40 };
7
+ function resolveLogFilePath() {
8
+ const explicit = env.STARR_LOG_FILE;
9
+ if (explicit === "")
10
+ return undefined; // disabled
11
+ if (explicit)
12
+ return path.resolve(explicit);
13
+ const dataDir = env.STARR_DATA_DIR ?? "./data";
14
+ return path.resolve(dataDir, "logs", "starr.log");
15
+ }
16
+ function ensureLogDir(logPath) {
17
+ const dir = path.dirname(logPath);
18
+ if (!fs.existsSync(dir)) {
19
+ fs.mkdirSync(dir, { recursive: true });
20
+ }
21
+ }
22
+ export function createLogger(tag = "core", levelName = "info") {
23
+ const consoleLevel = LEVELS[levelName] ?? LEVELS.info;
24
+ const fileLevelName = env.STARR_LOG_FILE_LEVEL ?? levelName;
25
+ const fileLevel = LEVELS[fileLevelName] ?? consoleLevel;
26
+ const logFilePath = resolveLogFilePath();
27
+ let fileHandle;
28
+ let fileErrorLogged = false;
29
+ function openFile() {
30
+ if (!logFilePath)
31
+ return undefined;
32
+ try {
33
+ ensureLogDir(logFilePath);
34
+ return fs.openSync(logFilePath, "a");
35
+ }
36
+ catch (err) {
37
+ if (!fileErrorLogged) {
38
+ console.warn(JSON.stringify({
39
+ timestamp: new Date().toISOString(),
40
+ level: "warn",
41
+ tag: "core/logging",
42
+ message: "Failed to open log file",
43
+ path: logFilePath,
44
+ error: String(err),
45
+ }));
46
+ fileErrorLogged = true;
47
+ }
48
+ return undefined;
49
+ }
50
+ }
51
+ function log(level, message, meta) {
52
+ const levelValue = LEVELS[level] ?? LEVELS.info;
53
+ const line = {
54
+ timestamp: new Date().toISOString(),
55
+ level,
56
+ tag,
57
+ message,
58
+ ...(meta ?? {}),
59
+ };
60
+ // Console sink
61
+ if (levelValue >= consoleLevel) {
62
+ console.log(JSON.stringify(line));
63
+ }
64
+ // File sink
65
+ if (logFilePath && levelValue >= fileLevel) {
66
+ if (fileHandle === undefined) {
67
+ fileHandle = openFile();
68
+ }
69
+ if (fileHandle !== undefined) {
70
+ try {
71
+ fs.writeSync(fileHandle, JSON.stringify(line) + "\n");
72
+ }
73
+ catch (err) {
74
+ if (!fileErrorLogged) {
75
+ console.warn(JSON.stringify({
76
+ timestamp: new Date().toISOString(),
77
+ level: "warn",
78
+ tag: "core/logging",
79
+ message: "Failed to write to log file",
80
+ path: logFilePath,
81
+ error: String(err),
82
+ }));
83
+ fileErrorLogged = true;
84
+ }
85
+ }
86
+ }
87
+ }
88
+ }
89
+ if (fileHandle !== undefined) {
90
+ process.once("exit", () => {
91
+ try {
92
+ fs.closeSync(fileHandle);
93
+ }
94
+ catch {
95
+ // ignore close errors
96
+ }
97
+ });
98
+ }
99
+ return {
100
+ debug: (m, meta) => log("debug", m, meta),
101
+ info: (m, meta) => log("info", m, meta),
102
+ warn: (m, meta) => log("warn", m, meta),
103
+ error: (m, meta) => log("error", m, meta),
104
+ child: (childTag) => createLogger(`${tag}/${childTag}`, levelName),
105
+ };
106
+ }
107
+ //# sourceMappingURL=logger.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"logger.js","sourceRoot":"","sources":["../../src/logging/logger.ts"],"names":[],"mappings":"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"}
package/dist/main.d.ts ADDED
@@ -0,0 +1,36 @@
1
+ export type { PluginContext, PluginLifecycle, PluginMeta, ConfigSchema, ConfigField, Logger, EventBus, PluginStorage, ContentTypeRegistry, RegisterFn, StarrEvent, EventHandler, Unsubscribe, EmitOpts, RequestOpts, ConnectionTestResult, } from "./types/plugin.js";
2
+ export { SPINE_EVENTS, SPINE_NAMESPACES, isSpineType, validateSpineEmission, } from "./events/spine.js";
3
+ export { EventBusImpl } from "./events/event-bus.js";
4
+ export { Starr } from "./host.js";
5
+ export type { StarrOptions, PluginRuntime } from "./host.js";
6
+ export { createLogger } from "./logging/logger.js";
7
+ export { discoverPluginDirs } from "./plugins/discovery.js";
8
+ export { createContext } from "./plugins/context.js";
9
+ export { loadPlugins, stopPlugins } from "./plugins/loader.js";
10
+ export { ContentTypeRegistryImpl, validateDescriptor, computeContentIdentity, areSameItem, } from "./content-types/registry.js";
11
+ export { StateStore } from "./state/state-store.js";
12
+ export type { TrackedRequest, TrackedRequestData, RequestStatus, TraceEntry, } from "./state/state-store.js";
13
+ export { requestIntake } from "./state/request-intake.js";
14
+ export type { RequestIntakeInput } from "./state/request-intake.js";
15
+ export { AuthService } from "./auth/auth-service.js";
16
+ export { createAuthServer, authenticate, withAuth, parseCookies, COOKIE_NAME } from "./auth/http-server.js";
17
+ export { loadJwtSecret, getJwtSecret, resetJwtSecret } from "./auth/jwt-secret.js";
18
+ export { RateLimiter } from "./auth/rate-limiter.js";
19
+ export { Importer } from "./library/importer.js";
20
+ export type { ImportResult } from "./library/importer.js";
21
+ export { LibraryService } from "./library/library-service.js";
22
+ export type { Library, LibraryInput } from "./library/library-service.js";
23
+ export { resolveNaming } from "./library/naming.js";
24
+ export type { NamingRule, NamingSegment } from "@digitalpaws/starr-types-core";
25
+ export { DEFAULT_LIBRARY_CONFIG } from "./library/library-config.js";
26
+ export type { LibraryConfig, LibraryRoots } from "./library/library-config.js";
27
+ export { LibraryCache } from "./library/library-cache.js";
28
+ export type { CachedLibraryItem } from "./library/library-cache.js";
29
+ export { resolveSourcePath } from "./library/source-resolver.js";
30
+ export type { ResolvedSource } from "./library/source-resolver.js";
31
+ export { LibraryScanner } from "./library/library-scanner.js";
32
+ export type { DiscoveredGroup } from "./library/library-scanner.js";
33
+ export { MetadataMatcher } from "./library/metadata-matcher.js";
34
+ export type { MatchResult } from "./library/metadata-matcher.js";
35
+ export { ScanController } from "./library/scan-controller.js";
36
+ //# sourceMappingURL=main.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"main.d.ts","sourceRoot":"","sources":["../src/main.ts"],"names":[],"mappings":"AAGA,YAAY,EACV,aAAa,EACb,eAAe,EACf,UAAU,EACV,YAAY,EACZ,WAAW,EACX,MAAM,EACN,QAAQ,EACR,aAAa,EACb,mBAAmB,EACnB,UAAU,EACV,UAAU,EACV,YAAY,EACZ,WAAW,EACX,QAAQ,EACR,WAAW,EACX,oBAAoB,GACrB,MAAM,mBAAmB,CAAC;AAE3B,OAAO,EACL,YAAY,EACZ,gBAAgB,EAChB,WAAW,EACX,qBAAqB,GACtB,MAAM,mBAAmB,CAAC;AAE3B,OAAO,EAAE,YAAY,EAAE,MAAM,uBAAuB,CAAC;AAErD,OAAO,EAAE,KAAK,EAAE,MAAM,WAAW,CAAC;AAClC,YAAY,EAAE,YAAY,EAAE,aAAa,EAAE,MAAM,WAAW,CAAC;AAC7D,OAAO,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAC;AACnD,OAAO,EAAE,kBAAkB,EAAE,MAAM,wBAAwB,CAAC;AAC5D,OAAO,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC;AACrD,OAAO,EAAE,WAAW,EAAE,WAAW,EAAE,MAAM,qBAAqB,CAAC;AAE/D,OAAO,EACL,uBAAuB,EACvB,kBAAkB,EAClB,sBAAsB,EACtB,WAAW,GACZ,MAAM,6BAA6B,CAAC;AAErC,OAAO,EAAE,UAAU,EAAE,MAAM,wBAAwB,CAAC;AACpD,YAAY,EACV,cAAc,EACd,kBAAkB,EAClB,aAAa,EACb,UAAU,GACX,MAAM,wBAAwB,CAAC;AAChC,OAAO,EAAE,aAAa,EAAE,MAAM,2BAA2B,CAAC;AAC1D,YAAY,EAAE,kBAAkB,EAAE,MAAM,2BAA2B,CAAC;AAEpE,OAAO,EAAE,WAAW,EAAE,MAAM,wBAAwB,CAAC;AACrD,OAAO,EAAE,gBAAgB,EAAE,YAAY,EAAE,QAAQ,EAAE,YAAY,EAAE,WAAW,EAAE,MAAM,uBAAuB,CAAC;AAC5G,OAAO,EAAE,aAAa,EAAE,YAAY,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAC;AACnF,OAAO,EAAE,WAAW,EAAE,MAAM,wBAAwB,CAAC;AAErD,OAAO,EAAE,QAAQ,EAAE,MAAM,uBAAuB,CAAC;AACjD,YAAY,EAAE,YAAY,EAAE,MAAM,uBAAuB,CAAC;AAC1D,OAAO,EAAE,cAAc,EAAE,MAAM,8BAA8B,CAAC;AAC9D,YAAY,EAAE,OAAO,EAAE,YAAY,EAAE,MAAM,8BAA8B,CAAC;AAC1E,OAAO,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AACpD,YAAY,EAAE,UAAU,EAAE,aAAa,EAAE,MAAM,+BAA+B,CAAC;AAC/E,OAAO,EAAE,sBAAsB,EAAE,MAAM,6BAA6B,CAAC;AACrE,YAAY,EAAE,aAAa,EAAE,YAAY,EAAE,MAAM,6BAA6B,CAAC;AAC/E,OAAO,EAAE,YAAY,EAAE,MAAM,4BAA4B,CAAC;AAC1D,YAAY,EAAE,iBAAiB,EAAE,MAAM,4BAA4B,CAAC;AACpE,OAAO,EAAE,iBAAiB,EAAE,MAAM,8BAA8B,CAAC;AACjE,YAAY,EAAE,cAAc,EAAE,MAAM,8BAA8B,CAAC;AACnE,OAAO,EAAE,cAAc,EAAE,MAAM,8BAA8B,CAAC;AAC9D,YAAY,EAAE,eAAe,EAAE,MAAM,8BAA8B,CAAC;AACpE,OAAO,EAAE,eAAe,EAAE,MAAM,+BAA+B,CAAC;AAChE,YAAY,EAAE,WAAW,EAAE,MAAM,+BAA+B,CAAC;AACjE,OAAO,EAAE,cAAc,EAAE,MAAM,8BAA8B,CAAC"}
package/dist/main.js ADDED
@@ -0,0 +1,229 @@
1
+ // SPDX-License-Identifier: 0BSD
2
+ // SPDX-FileCopyrightText: 2025 Digi <digitalpaws@proton.me>
3
+ export { SPINE_EVENTS, SPINE_NAMESPACES, isSpineType, validateSpineEmission, } from "./events/spine.js";
4
+ export { EventBusImpl } from "./events/event-bus.js";
5
+ export { Starr } from "./host.js";
6
+ export { createLogger } from "./logging/logger.js";
7
+ export { discoverPluginDirs } from "./plugins/discovery.js";
8
+ export { createContext } from "./plugins/context.js";
9
+ export { loadPlugins, stopPlugins } from "./plugins/loader.js";
10
+ export { ContentTypeRegistryImpl, validateDescriptor, computeContentIdentity, areSameItem, } from "./content-types/registry.js";
11
+ export { StateStore } from "./state/state-store.js";
12
+ export { requestIntake } from "./state/request-intake.js";
13
+ export { AuthService } from "./auth/auth-service.js";
14
+ export { createAuthServer, authenticate, withAuth, parseCookies, COOKIE_NAME } from "./auth/http-server.js";
15
+ export { loadJwtSecret, getJwtSecret, resetJwtSecret } from "./auth/jwt-secret.js";
16
+ export { RateLimiter } from "./auth/rate-limiter.js";
17
+ export { Importer } from "./library/importer.js";
18
+ export { LibraryService } from "./library/library-service.js";
19
+ export { resolveNaming } from "./library/naming.js";
20
+ export { DEFAULT_LIBRARY_CONFIG } from "./library/library-config.js";
21
+ export { LibraryCache } from "./library/library-cache.js";
22
+ export { resolveSourcePath } from "./library/source-resolver.js";
23
+ export { LibraryScanner } from "./library/library-scanner.js";
24
+ export { MetadataMatcher } from "./library/metadata-matcher.js";
25
+ export { ScanController } from "./library/scan-controller.js";
26
+ // Bootstrap — only run when this module is the entry point (not during tests/imports).
27
+ import { fileURLToPath } from "node:url";
28
+ import path from "node:path";
29
+ const isMain = process.argv[1] && fileURLToPath(import.meta.url) === path.resolve(process.argv[1]);
30
+ if (isMain) {
31
+ const { Starr } = await import("./host.js");
32
+ const { createLogger } = await import("./logging/logger.js");
33
+ const { loadPlugins, stopPlugins } = await import("./plugins/loader.js");
34
+ const { openDatastore } = await import("./datastore/db.js");
35
+ const { runMigrations, CORE_MIGRATIONS } = await import("./datastore/migrations.js");
36
+ const { loadEncryptionKey } = await import("./datastore/encrypt.js");
37
+ const { ConfigService } = await import("./config/config-service.js");
38
+ const { StateStore } = await import("./state/state-store.js");
39
+ const { loadJwtSecret } = await import("./auth/jwt-secret.js");
40
+ const { AuthService } = await import("./auth/auth-service.js");
41
+ const { createWebServer, initAuthService, initOidcServices } = await import("./web/index.js");
42
+ const { initContentTypeRoutes } = await import("./web/routes/content-types.js");
43
+ const { initDiscoveryRoutes } = await import("./web/routes/discovery.js");
44
+ const { initRequestRoutes } = await import("./web/routes/requests.js");
45
+ const { initConfigRoutes } = await import("./web/routes/config.js");
46
+ const { initActivityRoutes } = await import("./web/routes/activity.js");
47
+ const { initSseRoutes } = await import("./web/routes/sse.js");
48
+ const { initAuthRoutes } = await import("./web/routes/auth.js");
49
+ const { initTraceStore } = await import("./state/trace-store.js");
50
+ const { OidcProviderService } = await import("./auth/oidc/oidc-provider-service.js");
51
+ const { UserService } = await import("./auth/oidc/user-service.js");
52
+ const { OidcFlow } = await import("./auth/oidc/oidc-flow.js");
53
+ const { Importer } = await import("./library/importer.js");
54
+ const { getNamingRule } = await import("./content-types/registry.js");
55
+ const { DEFAULT_LIBRARY_CONFIG } = await import("./library/library-config.js");
56
+ const { LibraryService } = await import("./library/library-service.js");
57
+ const { LibraryCache } = await import("./library/library-cache.js");
58
+ const { initLibraryRoutes } = await import("./web/routes/library.js");
59
+ const { initLibraryManagementRoutes } = await import("./web/routes/library-management.js");
60
+ const { initLibraryImportRoutes } = await import("./web/routes/library-import.js");
61
+ const { LibraryScanner } = await import("./library/library-scanner.js");
62
+ const { MetadataMatcher } = await import("./library/metadata-matcher.js");
63
+ const { ScanController } = await import("./library/scan-controller.js");
64
+ const { resolveSourcePath } = await import("./library/source-resolver.js");
65
+ async function main() {
66
+ const pluginsDir = path.resolve(process.env.STARR_PLUGINS_DIR ?? "./plugins");
67
+ const dataDir = path.resolve(process.env.STARR_DATA_DIR ?? "./data");
68
+ const apiVersion = process.env.STARR_API_VERSION ?? "1.0.0";
69
+ const logLevel = process.env.STARR_LOG_LEVEL ?? "info";
70
+ const logger = createLogger("core", logLevel);
71
+ // 1. Open datastore
72
+ const datastore = openDatastore(dataDir, logger);
73
+ // 2. Run core migrations
74
+ runMigrations(datastore.db, CORE_MIGRATIONS, logger);
75
+ // 3. Load encryption key
76
+ loadEncryptionKey(dataDir, logger);
77
+ // 3a. Load JWT secret
78
+ loadJwtSecret(dataDir, logger);
79
+ // 4. Create host
80
+ const starr = new Starr({ pluginsDir, apiVersion, logger });
81
+ starr.datastore = datastore;
82
+ // 5. Create ConfigService (after datastore and encryption are ready)
83
+ const configService = new ConfigService(datastore.db, logger.child("config"),
84
+ // Reload callback — use lazy import to avoid circular deps
85
+ async (pluginId) => {
86
+ const { reloadPlugin } = await import("./plugins/loader.js");
87
+ await reloadPlugin(starr, pluginId);
88
+ });
89
+ starr.configService = configService;
90
+ // 6. Initialize state store (subscribes to spine events)
91
+ const stateStore = new StateStore(datastore.db, starr.coreBus, logger);
92
+ starr.stateStore = stateStore;
93
+ // 5a. Create LibraryService (after migrations so table exists)
94
+ const libraryService = new LibraryService(datastore.db, starr.coreBus, logger.child("library-service"));
95
+ starr.libraryService = libraryService;
96
+ // Bootstrap default library if none exist
97
+ const defaultLib = libraryService.getGlobalDefault();
98
+ if (!defaultLib) {
99
+ libraryService.create({
100
+ name: "Default Library",
101
+ isDefault: true,
102
+ defaultLibraryRoot: DEFAULT_LIBRARY_CONFIG.defaultLibraryRoot,
103
+ linkType: DEFAULT_LIBRARY_CONFIG.linkType,
104
+ importSubtitles: DEFAULT_LIBRARY_CONFIG.importSubtitles,
105
+ subtitleExtensions: [...DEFAULT_LIBRARY_CONFIG.subtitleExtensions],
106
+ });
107
+ logger.info("created default library");
108
+ }
109
+ // 6a. Create importer (reacts to download.completed)
110
+ const importer = new Importer(datastore.db, starr.coreBus, logger, () => {
111
+ const defaultLib = libraryService.getGlobalDefault();
112
+ return {
113
+ defaultLibraryRoot: defaultLib?.defaultLibraryRoot ?? DEFAULT_LIBRARY_CONFIG.defaultLibraryRoot,
114
+ roots: defaultLib?.roots ?? {},
115
+ linkType: defaultLib?.linkType ?? DEFAULT_LIBRARY_CONFIG.linkType,
116
+ importSubtitles: defaultLib?.importSubtitles ?? DEFAULT_LIBRARY_CONFIG.importSubtitles,
117
+ subtitleExtensions: defaultLib?.subtitleExtensions ?? DEFAULT_LIBRARY_CONFIG.subtitleExtensions,
118
+ };
119
+ }, (contentTypeId) => getNamingRule(contentTypeId, starr.contentTypeRegistry), libraryService);
120
+ starr.importer = importer;
121
+ // 6b. Create library cache (populated from imported items)
122
+ const libraryCache = new LibraryCache(datastore.db, starr.coreBus, logger);
123
+ libraryCache.refreshFromDb();
124
+ starr.libraryCache = libraryCache;
125
+ // 6c. Create library scanner, metadata matcher, and scan controller
126
+ const libraryScanner = new LibraryScanner(datastore.db, logger, libraryService);
127
+ const metadataMatcher = new MetadataMatcher(starr.coreBus, starr.contentTypeRegistry, logger);
128
+ const scanController = new ScanController(libraryScanner, metadataMatcher, datastore.db, starr.coreBus, logger, libraryCache, starr.contentTypeRegistry, importer);
129
+ starr.scanController = scanController;
130
+ // Subscribe importer to download.completed
131
+ starr.coreBus.on("download.completed", async (event) => {
132
+ const payload = event.payload;
133
+ const req = stateStore.getByRequestId(payload.requestId);
134
+ if (!req)
135
+ return;
136
+ try {
137
+ const resolved = await resolveSourcePath(payload.location);
138
+ // Import each media file found at the source
139
+ let anySucceeded = false;
140
+ for (const filePath of resolved.files) {
141
+ const ext = path.extname(filePath).slice(1).toLowerCase() || "mkv";
142
+ const result = await importer.import(payload.requestId, filePath, req.item, req.contentTypeId, ext, req.contentIdentity, payload.libraryId);
143
+ if (result.success) {
144
+ anySucceeded = true;
145
+ }
146
+ else {
147
+ logger.error("import failed for file", {
148
+ requestId: payload.requestId,
149
+ file: filePath,
150
+ error: result.error,
151
+ });
152
+ }
153
+ }
154
+ if (!anySucceeded) {
155
+ logger.error("all imports failed", { requestId: payload.requestId });
156
+ }
157
+ }
158
+ catch (err) {
159
+ logger.error("import resolution failed", {
160
+ requestId: payload.requestId,
161
+ error: String(err),
162
+ });
163
+ }
164
+ });
165
+ // 7. Create AuthService (before web server so auth hook can reference it)
166
+ const authService = new AuthService(datastore.db, logger.child("auth"));
167
+ // 7a. Create UserService
168
+ const userService = new UserService(datastore.db, logger.child("users"));
169
+ // 7b. Create OIDC Provider Service
170
+ const { encrypt, decrypt } = await import("./datastore/encrypt.js");
171
+ const oidcProviderService = new OidcProviderService(datastore.db, (plaintext) => encrypt(plaintext), (ciphertext) => decrypt(ciphertext), logger.child("oidc-providers"));
172
+ // 7c. Create OIDC Flow
173
+ const port = parseInt(process.env.STARR_PORT ?? "3457", 10);
174
+ const baseUrl = process.env.STARR_BASE_URL ?? `http://localhost:${port}`;
175
+ const oidcFlow = new OidcFlow(datastore.db, oidcProviderService, userService, baseUrl, logger.child("oidc-flow"));
176
+ // 8. Create web server (registers route stubs via dynamic import, auth hook)
177
+ const webServer = await createWebServer(logger.child("web"));
178
+ starr.webServer = webServer;
179
+ // Wire auth routes and auth hook into web server
180
+ initAuthService(authService);
181
+ initAuthRoutes(authService);
182
+ // Wire OIDC services into web server (so oidc route init gets them)
183
+ initOidcServices(oidcProviderService, oidcFlow, userService);
184
+ // Wire config routes (configService already exists)
185
+ initConfigRoutes(configService, () => starr.getRuntimes());
186
+ // Wire trace-store wrapper
187
+ initTraceStore(stateStore);
188
+ // 9. Load plugins (populates content-type registry, event bus handlers)
189
+ logger.info("booting", { pluginsDir, apiVersion, dataDir });
190
+ await loadPlugins(starr);
191
+ // 10. Wire remaining routes that depend on plugin-loaded data
192
+ initContentTypeRoutes(() => starr.contentTypeRegistry.list(), (id) => starr.contentTypeRegistry.get(id));
193
+ initDiscoveryRoutes(starr.coreBus);
194
+ initRequestRoutes(starr);
195
+ initActivityRoutes(starr);
196
+ initSseRoutes(starr.coreBus);
197
+ initLibraryRoutes(libraryCache);
198
+ initLibraryManagementRoutes(libraryService);
199
+ initLibraryImportRoutes(scanController);
200
+ // 11. Start web server
201
+ await webServer.listen({ port, host: "0.0.0.0" });
202
+ logger.info("web server listening", { port });
203
+ starr.markRunning();
204
+ // 12. Graceful shutdown
205
+ let shuttingDown = false;
206
+ for (const signal of ["SIGTERM", "SIGINT"]) {
207
+ process.on(signal, async () => {
208
+ if (shuttingDown)
209
+ return;
210
+ shuttingDown = true;
211
+ logger.info("shutting down", { signal });
212
+ // Close web server first to release the port immediately
213
+ try {
214
+ await webServer.close();
215
+ }
216
+ catch { /* ignore close errors during shutdown */ }
217
+ await stopPlugins(starr);
218
+ starr.markStopped();
219
+ datastore.close();
220
+ process.exit(0);
221
+ });
222
+ }
223
+ }
224
+ main().catch((err) => {
225
+ console.error(err);
226
+ process.exit(1);
227
+ });
228
+ }
229
+ //# sourceMappingURL=main.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"main.js","sourceRoot":"","sources":["../src/main.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,10 @@
1
+ import type Database from "better-sqlite3";
2
+ import type { PluginContext, PluginMeta } from "../types/plugin.js";
3
+ import type { Starr } from "../host.js";
4
+ import type { ConfigService } from "../config/config-service.js";
5
+ export declare function createContext(starr: Starr, pluginDir: string, db: Database.Database, configService?: ConfigService, instanceId?: string): PluginContext & {
6
+ getMeta: () => PluginMeta | undefined;
7
+ unsubscribeAll: () => void;
8
+ deleteAllStorage: () => Promise<void>;
9
+ };
10
+ //# sourceMappingURL=context.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"context.d.ts","sourceRoot":"","sources":["../../src/plugins/context.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,QAAQ,MAAM,gBAAgB,CAAC;AAC3C,OAAO,KAAK,EAAwB,aAAa,EAAE,UAAU,EAAkD,MAAM,oBAAoB,CAAC;AAC1I,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,YAAY,CAAC;AACxC,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,6BAA6B,CAAC;AAIjE,wBAAgB,aAAa,CAC3B,KAAK,EAAE,KAAK,EACZ,SAAS,EAAE,MAAM,EACjB,EAAE,EAAE,QAAQ,CAAC,QAAQ,EACrB,aAAa,CAAC,EAAE,aAAa,EAC7B,UAAU,SAAY,GACrB,aAAa,GAAG;IACjB,OAAO,EAAE,MAAM,UAAU,GAAG,SAAS,CAAC;IACtC,cAAc,EAAE,MAAM,IAAI,CAAC;IAC3B,gBAAgB,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC;CACvC,CAmHA"}
@@ -0,0 +1,110 @@
1
+ // SPDX-License-Identifier: 0BSD
2
+ // SPDX-FileCopyrightText: 2025 Digi <digitalpaws@proton.me>
3
+ import semver from "semver";
4
+ import path from "node:path";
5
+ import { createPluginStorage } from "../datastore/storage.js";
6
+ export function createContext(starr, pluginDir, db, configService, instanceId = "default") {
7
+ let meta;
8
+ let defined = false;
9
+ let _storage = null;
10
+ let _subscriptions = [];
11
+ const guard = () => {
12
+ if (!defined)
13
+ throw new Error("ctx.define must be called before any other context method");
14
+ };
15
+ let logger = starr.logger.child(path.basename(pluginDir));
16
+ const context = {
17
+ apiVersion: starr.apiVersion,
18
+ define(m) {
19
+ if (defined)
20
+ throw new Error("ctx.define can only be called once");
21
+ if (!m.id)
22
+ throw new Error("plugin id is required");
23
+ if (!semver.valid(m.version))
24
+ throw new Error(`invalid plugin version: ${m.version}`);
25
+ if (!semver.validRange(m.starrApiVersion))
26
+ throw new Error(`invalid api range: ${m.starrApiVersion}`);
27
+ if (!semver.satisfies(starr.apiVersion, m.starrApiVersion)) {
28
+ throw new Error(`API version mismatch: host ${starr.apiVersion} does not satisfy ${m.starrApiVersion}`);
29
+ }
30
+ meta = m;
31
+ defined = true;
32
+ logger = starr.logger.child(m.id);
33
+ logger.debug("defined", { meta: m });
34
+ },
35
+ config(schema) {
36
+ guard();
37
+ if (!meta)
38
+ throw new Error("ctx.config called before ctx.define");
39
+ if (configService) {
40
+ return configService.register(meta.id, schema, instanceId);
41
+ }
42
+ // Fallback for tests / bootstrap paths that do not provide a ConfigService
43
+ const values = {};
44
+ for (const [key, field] of Object.entries(schema)) {
45
+ values[key] = field.default ?? undefined;
46
+ }
47
+ return Object.freeze(values);
48
+ },
49
+ events: (() => {
50
+ let _pluginBus = null;
51
+ const getBus = () => {
52
+ if (!_pluginBus) {
53
+ _pluginBus = starr.busImpl.pluginBus(meta.id);
54
+ }
55
+ return _pluginBus;
56
+ };
57
+ return {
58
+ on(type, handler) {
59
+ guard();
60
+ const unsub = getBus().on(type, handler);
61
+ _subscriptions.push(unsub);
62
+ return unsub;
63
+ },
64
+ emit(type, payload, opts) {
65
+ guard();
66
+ getBus().emit(type, payload, opts);
67
+ },
68
+ request(type, payload, opts) {
69
+ guard();
70
+ return getBus().request(type, payload, opts);
71
+ },
72
+ };
73
+ })(),
74
+ get storage() {
75
+ if (!_storage && defined && meta) {
76
+ _storage = createPluginStorage(db, meta.id, instanceId);
77
+ }
78
+ if (!_storage) {
79
+ throw new Error("ctx.storage called before ctx.define");
80
+ }
81
+ return _storage;
82
+ },
83
+ contentTypes: {
84
+ register(descriptor) {
85
+ guard();
86
+ if (!meta)
87
+ throw new Error("ctx.contentTypes.register called before ctx.define");
88
+ starr.contentTypeRegistry.register(descriptor, meta.id);
89
+ logger.debug("registered content type", { typeId: descriptor.id });
90
+ },
91
+ },
92
+ get logger() {
93
+ return logger;
94
+ },
95
+ getMeta: () => meta,
96
+ unsubscribeAll: () => {
97
+ for (const unsub of _subscriptions)
98
+ unsub();
99
+ _subscriptions = [];
100
+ },
101
+ deleteAllStorage: async () => {
102
+ if (_storage) {
103
+ await _storage.deleteAll();
104
+ _storage = null;
105
+ }
106
+ },
107
+ };
108
+ return context;
109
+ }
110
+ //# sourceMappingURL=context.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"context.js","sourceRoot":"","sources":["../../src/plugins/context.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export declare function discoverPluginDirs(pluginsDir: string): Promise<string[]>;
2
+ //# sourceMappingURL=discovery.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"discovery.d.ts","sourceRoot":"","sources":["../../src/plugins/discovery.ts"],"names":[],"mappings":"AAMA,wBAAsB,kBAAkB,CAAC,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC,CAsB9E"}
@@ -0,0 +1,32 @@
1
+ // SPDX-License-Identifier: 0BSD
2
+ // SPDX-FileCopyrightText: 2025 Digi <digitalpaws@proton.me>
3
+ import { readdir, stat } from "node:fs/promises";
4
+ import path from "node:path";
5
+ export async function discoverPluginDirs(pluginsDir) {
6
+ let entries;
7
+ try {
8
+ entries = await readdir(pluginsDir, { withFileTypes: true });
9
+ }
10
+ catch {
11
+ return [];
12
+ }
13
+ const dirs = [];
14
+ for (const entry of entries) {
15
+ if (!entry.isDirectory())
16
+ continue;
17
+ if (entry.name.startsWith("."))
18
+ continue;
19
+ if (entry.name === "node_modules")
20
+ continue;
21
+ const full = path.join(pluginsDir, entry.name);
22
+ try {
23
+ await stat(path.join(full, "package.json"));
24
+ dirs.push(full);
25
+ }
26
+ catch {
27
+ // not a plugin package
28
+ }
29
+ }
30
+ return dirs.sort((a, b) => path.basename(a).localeCompare(path.basename(b)));
31
+ }
32
+ //# sourceMappingURL=discovery.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"discovery.js","sourceRoot":"","sources":["../../src/plugins/discovery.ts"],"names":[],"mappings":"AAAA,gCAAgC;AAChC,4DAA4D;AAE5D,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,kBAAkB,CAAC;AACjD,OAAO,IAAI,MAAM,WAAW,CAAC;AAE7B,MAAM,CAAC,KAAK,UAAU,kBAAkB,CAAC,UAAkB;IACzD,IAAI,OAAO,CAAC;IACZ,IAAI,CAAC;QACH,OAAO,GAAG,MAAM,OAAO,CAAC,UAAU,EAAE,EAAE,aAAa,EAAE,IAAI,EAAE,CAAC,CAAC;IAC/D,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,EAAE,CAAC;IACZ,CAAC;IAED,MAAM,IAAI,GAAa,EAAE,CAAC;IAC1B,KAAK,MAAM,KAAK,IAAI,OAAO,EAAE,CAAC;QAC5B,IAAI,CAAC,KAAK,CAAC,WAAW,EAAE;YAAE,SAAS;QACnC,IAAI,KAAK,CAAC,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC;YAAE,SAAS;QACzC,IAAI,KAAK,CAAC,IAAI,KAAK,cAAc;YAAE,SAAS;QAC5C,MAAM,IAAI,GAAG,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE,KAAK,CAAC,IAAI,CAAC,CAAC;QAC/C,IAAI,CAAC;YACH,MAAM,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,cAAc,CAAC,CAAC,CAAC;YAC5C,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAClB,CAAC;QAAC,MAAM,CAAC;YACP,uBAAuB;QACzB,CAAC;IACH,CAAC;IACD,OAAO,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,aAAa,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;AAC/E,CAAC"}
@@ -0,0 +1,9 @@
1
+ import type { Starr } from "../host.js";
2
+ export declare function loadPlugins(starr: Starr): Promise<void>;
3
+ /**
4
+ * Reload a single plugin in isolation: stop → unregister → re-import → start.
5
+ * In multi-instance mode, all instances of the plugin are reloaded.
6
+ */
7
+ export declare function reloadPlugin(starr: Starr, pluginId: string): Promise<void>;
8
+ export declare function stopPlugins(starr: Starr): Promise<void>;
9
+ //# sourceMappingURL=loader.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"loader.d.ts","sourceRoot":"","sources":["../../src/plugins/loader.ts"],"names":[],"mappings":"AAQA,OAAO,KAAK,EAAiB,KAAK,EAAE,MAAM,YAAY,CAAC;AAyBvD,wBAAsB,WAAW,CAAC,KAAK,EAAE,KAAK,GAAG,OAAO,CAAC,IAAI,CAAC,CAqI7D;AAED;;;GAGG;AACH,wBAAsB,YAAY,CAChC,KAAK,EAAE,KAAK,EACZ,QAAQ,EAAE,MAAM,GACf,OAAO,CAAC,IAAI,CAAC,CA+Gf;AAED,wBAAsB,WAAW,CAAC,KAAK,EAAE,KAAK,GAAG,OAAO,CAAC,IAAI,CAAC,CAoB7D"}