@kvman/kernel 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 (365) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +11 -0
  3. package/dist/clock.d.ts +8 -0
  4. package/dist/clock.d.ts.map +1 -0
  5. package/dist/clock.js +13 -0
  6. package/dist/clock.js.map +1 -0
  7. package/dist/ctx/extension-ctx.d.ts +22 -0
  8. package/dist/ctx/extension-ctx.d.ts.map +1 -0
  9. package/dist/ctx/extension-ctx.js +78 -0
  10. package/dist/ctx/extension-ctx.js.map +1 -0
  11. package/dist/ctx/files-calls.d.ts +5 -0
  12. package/dist/ctx/files-calls.d.ts.map +1 -0
  13. package/dist/ctx/files-calls.js +26 -0
  14. package/dist/ctx/files-calls.js.map +1 -0
  15. package/dist/ctx/job-calls.d.ts +12 -0
  16. package/dist/ctx/job-calls.d.ts.map +1 -0
  17. package/dist/ctx/job-calls.js +73 -0
  18. package/dist/ctx/job-calls.js.map +1 -0
  19. package/dist/ctx/processes-calls.d.ts +11 -0
  20. package/dist/ctx/processes-calls.d.ts.map +1 -0
  21. package/dist/ctx/processes-calls.js +50 -0
  22. package/dist/ctx/processes-calls.js.map +1 -0
  23. package/dist/ctx/settings-calls.d.ts +5 -0
  24. package/dist/ctx/settings-calls.d.ts.map +1 -0
  25. package/dist/ctx/settings-calls.js +30 -0
  26. package/dist/ctx/settings-calls.js.map +1 -0
  27. package/dist/extensions/load-order.d.ts +13 -0
  28. package/dist/extensions/load-order.d.ts.map +1 -0
  29. package/dist/extensions/load-order.js +111 -0
  30. package/dist/extensions/load-order.js.map +1 -0
  31. package/dist/extensions/manifests.d.ts +16 -0
  32. package/dist/extensions/manifests.d.ts.map +1 -0
  33. package/dist/extensions/manifests.js +50 -0
  34. package/dist/extensions/manifests.js.map +1 -0
  35. package/dist/extensions/npm-install.d.ts +9 -0
  36. package/dist/extensions/npm-install.d.ts.map +1 -0
  37. package/dist/extensions/npm-install.js +39 -0
  38. package/dist/extensions/npm-install.js.map +1 -0
  39. package/dist/extensions/trust.d.ts +11 -0
  40. package/dist/extensions/trust.d.ts.map +1 -0
  41. package/dist/extensions/trust.js +27 -0
  42. package/dist/extensions/trust.js.map +1 -0
  43. package/dist/files/file-access.d.ts +6 -0
  44. package/dist/files/file-access.d.ts.map +1 -0
  45. package/dist/files/file-access.js +21 -0
  46. package/dist/files/file-access.js.map +1 -0
  47. package/dist/files/files.d.ts +31 -0
  48. package/dist/files/files.d.ts.map +1 -0
  49. package/dist/files/files.js +73 -0
  50. package/dist/files/files.js.map +1 -0
  51. package/dist/http/call-routes.d.ts +4 -0
  52. package/dist/http/call-routes.d.ts.map +1 -0
  53. package/dist/http/call-routes.js +72 -0
  54. package/dist/http/call-routes.js.map +1 -0
  55. package/dist/http/envelope.d.ts +8 -0
  56. package/dist/http/envelope.d.ts.map +1 -0
  57. package/dist/http/envelope.js +17 -0
  58. package/dist/http/envelope.js.map +1 -0
  59. package/dist/http/file-routes.d.ts +5 -0
  60. package/dist/http/file-routes.d.ts.map +1 -0
  61. package/dist/http/file-routes.js +47 -0
  62. package/dist/http/file-routes.js.map +1 -0
  63. package/dist/http/http-app.d.ts +11 -0
  64. package/dist/http/http-app.d.ts.map +1 -0
  65. package/dist/http/http-app.js +31 -0
  66. package/dist/http/http-app.js.map +1 -0
  67. package/dist/http/http-server.d.ts +9 -0
  68. package/dist/http/http-server.d.ts.map +1 -0
  69. package/dist/http/http-server.js +38 -0
  70. package/dist/http/http-server.js.map +1 -0
  71. package/dist/http/job-events.d.ts +18 -0
  72. package/dist/http/job-events.d.ts.map +1 -0
  73. package/dist/http/job-events.js +48 -0
  74. package/dist/http/job-events.js.map +1 -0
  75. package/dist/http/job-routes.d.ts +4 -0
  76. package/dist/http/job-routes.d.ts.map +1 -0
  77. package/dist/http/job-routes.js +20 -0
  78. package/dist/http/job-routes.js.map +1 -0
  79. package/dist/http/own-origin.d.ts +2 -0
  80. package/dist/http/own-origin.d.ts.map +1 -0
  81. package/dist/http/own-origin.js +9 -0
  82. package/dist/http/own-origin.js.map +1 -0
  83. package/dist/http/request-body.d.ts +19 -0
  84. package/dist/http/request-body.d.ts.map +1 -0
  85. package/dist/http/request-body.js +72 -0
  86. package/dist/http/request-body.js.map +1 -0
  87. package/dist/http/static-files.d.ts +3 -0
  88. package/dist/http/static-files.d.ts.map +1 -0
  89. package/dist/http/static-files.js +35 -0
  90. package/dist/http/static-files.js.map +1 -0
  91. package/dist/http/web-routes.d.ts +4 -0
  92. package/dist/http/web-routes.d.ts.map +1 -0
  93. package/dist/http/web-routes.js +23 -0
  94. package/dist/http/web-routes.js.map +1 -0
  95. package/dist/ids.d.ts +6 -0
  96. package/dist/ids.d.ts.map +1 -0
  97. package/dist/ids.js +42 -0
  98. package/dist/ids.js.map +1 -0
  99. package/dist/index.d.ts +13 -0
  100. package/dist/index.d.ts.map +1 -0
  101. package/dist/index.js +8 -0
  102. package/dist/index.js.map +1 -0
  103. package/dist/jobs/current-job.d.ts +19 -0
  104. package/dist/jobs/current-job.d.ts.map +1 -0
  105. package/dist/jobs/current-job.js +20 -0
  106. package/dist/jobs/current-job.js.map +1 -0
  107. package/dist/jobs/dispatcher.d.ts +40 -0
  108. package/dist/jobs/dispatcher.d.ts.map +1 -0
  109. package/dist/jobs/dispatcher.js +201 -0
  110. package/dist/jobs/dispatcher.js.map +1 -0
  111. package/dist/jobs/handlers.d.ts +19 -0
  112. package/dist/jobs/handlers.d.ts.map +1 -0
  113. package/dist/jobs/handlers.js +54 -0
  114. package/dist/jobs/handlers.js.map +1 -0
  115. package/dist/jobs/job-rows.d.ts +63 -0
  116. package/dist/jobs/job-rows.d.ts.map +1 -0
  117. package/dist/jobs/job-rows.js +111 -0
  118. package/dist/jobs/job-rows.js.map +1 -0
  119. package/dist/jobs/progress-hub.d.ts +12 -0
  120. package/dist/jobs/progress-hub.d.ts.map +1 -0
  121. package/dist/jobs/progress-hub.js +40 -0
  122. package/dist/jobs/progress-hub.js.map +1 -0
  123. package/dist/jobs/registry.d.ts +38 -0
  124. package/dist/jobs/registry.d.ts.map +1 -0
  125. package/dist/jobs/registry.js +89 -0
  126. package/dist/jobs/registry.js.map +1 -0
  127. package/dist/jobs/retry-policy.d.ts +4 -0
  128. package/dist/jobs/retry-policy.d.ts.map +1 -0
  129. package/dist/jobs/retry-policy.js +10 -0
  130. package/dist/jobs/retry-policy.js.map +1 -0
  131. package/dist/jobs/run-job.d.ts +26 -0
  132. package/dist/jobs/run-job.d.ts.map +1 -0
  133. package/dist/jobs/run-job.js +120 -0
  134. package/dist/jobs/run-job.js.map +1 -0
  135. package/dist/kernel-api/extensions-api.d.ts +4 -0
  136. package/dist/kernel-api/extensions-api.d.ts.map +1 -0
  137. package/dist/kernel-api/extensions-api.js +32 -0
  138. package/dist/kernel-api/extensions-api.js.map +1 -0
  139. package/dist/kernel-api/folder-api.d.ts +4 -0
  140. package/dist/kernel-api/folder-api.d.ts.map +1 -0
  141. package/dist/kernel-api/folder-api.js +54 -0
  142. package/dist/kernel-api/folder-api.js.map +1 -0
  143. package/dist/kernel-api/folder-name.d.ts +3 -0
  144. package/dist/kernel-api/folder-name.d.ts.map +1 -0
  145. package/dist/kernel-api/folder-name.js +26 -0
  146. package/dist/kernel-api/folder-name.js.map +1 -0
  147. package/dist/kernel-api/health-api.d.ts +4 -0
  148. package/dist/kernel-api/health-api.d.ts.map +1 -0
  149. package/dist/kernel-api/health-api.js +8 -0
  150. package/dist/kernel-api/health-api.js.map +1 -0
  151. package/dist/kernel-api/jobs-files-api.d.ts +4 -0
  152. package/dist/kernel-api/jobs-files-api.d.ts.map +1 -0
  153. package/dist/kernel-api/jobs-files-api.js +18 -0
  154. package/dist/kernel-api/jobs-files-api.js.map +1 -0
  155. package/dist/kernel-api/json-schemas.d.ts +3 -0
  156. package/dist/kernel-api/json-schemas.d.ts.map +1 -0
  157. package/dist/kernel-api/json-schemas.js +16 -0
  158. package/dist/kernel-api/json-schemas.js.map +1 -0
  159. package/dist/kernel-api/kernel-api-services.d.ts +17 -0
  160. package/dist/kernel-api/kernel-api-services.d.ts.map +1 -0
  161. package/dist/kernel-api/kernel-api-services.js +2 -0
  162. package/dist/kernel-api/kernel-api-services.js.map +1 -0
  163. package/dist/kernel-api/kernel-registrations.d.ts +19 -0
  164. package/dist/kernel-api/kernel-registrations.d.ts.map +1 -0
  165. package/dist/kernel-api/kernel-registrations.js +14 -0
  166. package/dist/kernel-api/kernel-registrations.js.map +1 -0
  167. package/dist/kernel-api/preset-api.d.ts +4 -0
  168. package/dist/kernel-api/preset-api.d.ts.map +1 -0
  169. package/dist/kernel-api/preset-api.js +10 -0
  170. package/dist/kernel-api/preset-api.js.map +1 -0
  171. package/dist/kernel-api/register-kernel-api.d.ts +4 -0
  172. package/dist/kernel-api/register-kernel-api.d.ts.map +1 -0
  173. package/dist/kernel-api/register-kernel-api.js +24 -0
  174. package/dist/kernel-api/register-kernel-api.js.map +1 -0
  175. package/dist/kernel-api/restart-api.d.ts +4 -0
  176. package/dist/kernel-api/restart-api.d.ts.map +1 -0
  177. package/dist/kernel-api/restart-api.js +10 -0
  178. package/dist/kernel-api/restart-api.js.map +1 -0
  179. package/dist/kernel-api/secrets-api.d.ts +4 -0
  180. package/dist/kernel-api/secrets-api.d.ts.map +1 -0
  181. package/dist/kernel-api/secrets-api.js +23 -0
  182. package/dist/kernel-api/secrets-api.js.map +1 -0
  183. package/dist/kernel-api/settings-api.d.ts +4 -0
  184. package/dist/kernel-api/settings-api.d.ts.map +1 -0
  185. package/dist/kernel-api/settings-api.js +33 -0
  186. package/dist/kernel-api/settings-api.js.map +1 -0
  187. package/dist/kernel-api/workspace-api.d.ts +4 -0
  188. package/dist/kernel-api/workspace-api.d.ts.map +1 -0
  189. package/dist/kernel-api/workspace-api.js +13 -0
  190. package/dist/kernel-api/workspace-api.js.map +1 -0
  191. package/dist/kernel-lifecycle.d.ts +8 -0
  192. package/dist/kernel-lifecycle.d.ts.map +1 -0
  193. package/dist/kernel-lifecycle.js +56 -0
  194. package/dist/kernel-lifecycle.js.map +1 -0
  195. package/dist/kernel-requests.d.ts +25 -0
  196. package/dist/kernel-requests.d.ts.map +1 -0
  197. package/dist/kernel-requests.js +63 -0
  198. package/dist/kernel-requests.js.map +1 -0
  199. package/dist/kernel-version.d.ts +2 -0
  200. package/dist/kernel-version.d.ts.map +1 -0
  201. package/dist/kernel-version.js +8 -0
  202. package/dist/kernel-version.js.map +1 -0
  203. package/dist/kernel-web.d.ts +36 -0
  204. package/dist/kernel-web.d.ts.map +1 -0
  205. package/dist/kernel-web.js +26 -0
  206. package/dist/kernel-web.js.map +1 -0
  207. package/dist/kernel.d.ts +44 -0
  208. package/dist/kernel.d.ts.map +1 -0
  209. package/dist/kernel.js +157 -0
  210. package/dist/kernel.js.map +1 -0
  211. package/dist/limits.d.ts +6 -0
  212. package/dist/limits.d.ts.map +1 -0
  213. package/dist/limits.js +8 -0
  214. package/dist/limits.js.map +1 -0
  215. package/dist/localization/catalogs.d.ts +15 -0
  216. package/dist/localization/catalogs.d.ts.map +1 -0
  217. package/dist/localization/catalogs.js +66 -0
  218. package/dist/localization/catalogs.js.map +1 -0
  219. package/dist/logging/log-file.d.ts +7 -0
  220. package/dist/logging/log-file.d.ts.map +1 -0
  221. package/dist/logging/log-file.js +12 -0
  222. package/dist/logging/log-file.js.map +1 -0
  223. package/dist/logging/logger.d.ts +12 -0
  224. package/dist/logging/logger.d.ts.map +1 -0
  225. package/dist/logging/logger.js +14 -0
  226. package/dist/logging/logger.js.map +1 -0
  227. package/dist/logging/terminal-lines.d.ts +4 -0
  228. package/dist/logging/terminal-lines.d.ts.map +1 -0
  229. package/dist/logging/terminal-lines.js +16 -0
  230. package/dist/logging/terminal-lines.js.map +1 -0
  231. package/dist/preset-edit/install-source.d.ts +8 -0
  232. package/dist/preset-edit/install-source.d.ts.map +1 -0
  233. package/dist/preset-edit/install-source.js +36 -0
  234. package/dist/preset-edit/install-source.js.map +1 -0
  235. package/dist/preset-edit/preset-backup.d.ts +10 -0
  236. package/dist/preset-edit/preset-backup.d.ts.map +1 -0
  237. package/dist/preset-edit/preset-backup.js +45 -0
  238. package/dist/preset-edit/preset-backup.js.map +1 -0
  239. package/dist/preset-edit/preset-files.d.ts +6 -0
  240. package/dist/preset-edit/preset-files.d.ts.map +1 -0
  241. package/dist/preset-edit/preset-files.js +56 -0
  242. package/dist/preset-edit/preset-files.js.map +1 -0
  243. package/dist/preset-edit/preset-source.d.ts +7 -0
  244. package/dist/preset-edit/preset-source.d.ts.map +1 -0
  245. package/dist/preset-edit/preset-source.js +2 -0
  246. package/dist/preset-edit/preset-source.js.map +1 -0
  247. package/dist/preset-edit/preset-store.d.ts +22 -0
  248. package/dist/preset-edit/preset-store.d.ts.map +1 -0
  249. package/dist/preset-edit/preset-store.js +70 -0
  250. package/dist/preset-edit/preset-store.js.map +1 -0
  251. package/dist/problems.d.ts +3 -0
  252. package/dist/problems.d.ts.map +1 -0
  253. package/dist/problems.js +6 -0
  254. package/dist/problems.js.map +1 -0
  255. package/dist/processes/process-kill.d.ts +16 -0
  256. package/dist/processes/process-kill.d.ts.map +1 -0
  257. package/dist/processes/process-kill.js +45 -0
  258. package/dist/processes/process-kill.js.map +1 -0
  259. package/dist/processes/process-log.d.ts +10 -0
  260. package/dist/processes/process-log.d.ts.map +1 -0
  261. package/dist/processes/process-log.js +41 -0
  262. package/dist/processes/process-log.js.map +1 -0
  263. package/dist/processes/process-rows.d.ts +11 -0
  264. package/dist/processes/process-rows.d.ts.map +1 -0
  265. package/dist/processes/process-rows.js +21 -0
  266. package/dist/processes/process-rows.js.map +1 -0
  267. package/dist/processes/process-service.d.ts +30 -0
  268. package/dist/processes/process-service.d.ts.map +1 -0
  269. package/dist/processes/process-service.js +110 -0
  270. package/dist/processes/process-service.js.map +1 -0
  271. package/dist/reload/reload-extensions.d.ts +5 -0
  272. package/dist/reload/reload-extensions.d.ts.map +1 -0
  273. package/dist/reload/reload-extensions.js +25 -0
  274. package/dist/reload/reload-extensions.js.map +1 -0
  275. package/dist/reload/watcher.d.ts +7 -0
  276. package/dist/reload/watcher.d.ts.map +1 -0
  277. package/dist/reload/watcher.js +40 -0
  278. package/dist/reload/watcher.js.map +1 -0
  279. package/dist/run/extension-run.d.ts +36 -0
  280. package/dist/run/extension-run.d.ts.map +1 -0
  281. package/dist/run/extension-run.js +81 -0
  282. package/dist/run/extension-run.js.map +1 -0
  283. package/dist/schedules/schedule-rows.d.ts +27 -0
  284. package/dist/schedules/schedule-rows.d.ts.map +1 -0
  285. package/dist/schedules/schedule-rows.js +70 -0
  286. package/dist/schedules/schedule-rows.js.map +1 -0
  287. package/dist/sdk-version.d.ts +2 -0
  288. package/dist/sdk-version.d.ts.map +1 -0
  289. package/dist/sdk-version.js +10 -0
  290. package/dist/sdk-version.js.map +1 -0
  291. package/dist/secrets/secrets-file.d.ts +11 -0
  292. package/dist/secrets/secrets-file.d.ts.map +1 -0
  293. package/dist/secrets/secrets-file.js +50 -0
  294. package/dist/secrets/secrets-file.js.map +1 -0
  295. package/dist/settings/kernel-settings.d.ts +4 -0
  296. package/dist/settings/kernel-settings.d.ts.map +1 -0
  297. package/dist/settings/kernel-settings.js +20 -0
  298. package/dist/settings/kernel-settings.js.map +1 -0
  299. package/dist/settings/preset-check.d.ts +4 -0
  300. package/dist/settings/preset-check.d.ts.map +1 -0
  301. package/dist/settings/preset-check.js +19 -0
  302. package/dist/settings/preset-check.js.map +1 -0
  303. package/dist/settings/settings.d.ts +31 -0
  304. package/dist/settings/settings.d.ts.map +1 -0
  305. package/dist/settings/settings.js +68 -0
  306. package/dist/settings/settings.js.map +1 -0
  307. package/dist/storage/database.d.ts +6 -0
  308. package/dist/storage/database.d.ts.map +1 -0
  309. package/dist/storage/database.js +31 -0
  310. package/dist/storage/database.js.map +1 -0
  311. package/dist/storage/schema.d.ts +2 -0
  312. package/dist/storage/schema.d.ts.map +1 -0
  313. package/dist/storage/schema.js +108 -0
  314. package/dist/storage/schema.js.map +1 -0
  315. package/dist/store/collections.d.ts +6 -0
  316. package/dist/store/collections.d.ts.map +1 -0
  317. package/dist/store/collections.js +63 -0
  318. package/dist/store/collections.js.map +1 -0
  319. package/dist/store/filters.d.ts +10 -0
  320. package/dist/store/filters.d.ts.map +1 -0
  321. package/dist/store/filters.js +40 -0
  322. package/dist/store/filters.js.map +1 -0
  323. package/dist/store/json-values.d.ts +6 -0
  324. package/dist/store/json-values.d.ts.map +1 -0
  325. package/dist/store/json-values.js +20 -0
  326. package/dist/store/json-values.js.map +1 -0
  327. package/dist/store/kv.d.ts +9 -0
  328. package/dist/store/kv.d.ts.map +1 -0
  329. package/dist/store/kv.js +23 -0
  330. package/dist/store/kv.js.map +1 -0
  331. package/dist/store/store.d.ts +11 -0
  332. package/dist/store/store.d.ts.map +1 -0
  333. package/dist/store/store.js +62 -0
  334. package/dist/store/store.js.map +1 -0
  335. package/dist/wasm-code-gc.d.ts +2 -0
  336. package/dist/wasm-code-gc.d.ts.map +1 -0
  337. package/dist/wasm-code-gc.js +9 -0
  338. package/dist/wasm-code-gc.js.map +1 -0
  339. package/dist/workers/pool.d.ts +31 -0
  340. package/dist/workers/pool.d.ts.map +1 -0
  341. package/dist/workers/pool.js +208 -0
  342. package/dist/workers/pool.js.map +1 -0
  343. package/dist/workers/protocol.d.ts +431 -0
  344. package/dist/workers/protocol.d.ts.map +1 -0
  345. package/dist/workers/protocol.js +93 -0
  346. package/dist/workers/protocol.js.map +1 -0
  347. package/dist/workers/root-runner.d.ts +15 -0
  348. package/dist/workers/root-runner.d.ts.map +1 -0
  349. package/dist/workers/root-runner.js +63 -0
  350. package/dist/workers/root-runner.js.map +1 -0
  351. package/dist/workers/sdk-resolution.d.ts +2 -0
  352. package/dist/workers/sdk-resolution.d.ts.map +1 -0
  353. package/dist/workers/sdk-resolution.js +14 -0
  354. package/dist/workers/sdk-resolution.js.map +1 -0
  355. package/dist/workers/worker-main.d.ts +2 -0
  356. package/dist/workers/worker-main.d.ts.map +1 -0
  357. package/dist/workers/worker-main.js +123 -0
  358. package/dist/workers/worker-main.js.map +1 -0
  359. package/dist/workspaces/workspaces.d.ts +17 -0
  360. package/dist/workspaces/workspaces.d.ts.map +1 -0
  361. package/dist/workspaces/workspaces.js +85 -0
  362. package/dist/workspaces/workspaces.js.map +1 -0
  363. package/locales/ar.json +70 -0
  364. package/locales/en.json +70 -0
  365. package/package.json +45 -0
@@ -0,0 +1,81 @@
1
+ import { pathToFileURL } from 'node:url';
2
+ import { checkAndOrder, checkReload, dependentsOf } from "../extensions/load-order.js";
3
+ import { readExtension, readExtensions } from "../extensions/manifests.js";
4
+ import { mergeCatalogs, readOwnerCatalogs } from "../localization/catalogs.js";
5
+ import { startPool } from "../workers/pool.js";
6
+ function catalogsOf(kernelCatalogs, extensions) {
7
+ return mergeCatalogs([kernelCatalogs, ...extensions.map((extension) => extension.catalogs)]);
8
+ }
9
+ function withCatalogs(extension, revision) {
10
+ return { ...extension, revision, catalogs: readOwnerCatalogs({ name: extension.name, namespace: extension.manifest.kvman.namespace, folder: extension.folder }) };
11
+ }
12
+ export async function startExtensionRun(options) {
13
+ const launch = (extensions, catalogs) => startPool({
14
+ ...options.pool,
15
+ setup: {
16
+ ...options.pool.setup,
17
+ languages: catalogs.languages,
18
+ extensions: extensions.map((extension) => ({
19
+ name: extension.name,
20
+ namespace: extension.manifest.kvman.namespace,
21
+ entryUrl: pathToFileURL(extension.entryPath).href,
22
+ version: extension.manifest.version,
23
+ source: extension.source,
24
+ revision: extension.revision,
25
+ })),
26
+ },
27
+ });
28
+ let extensions = checkAndOrder(readExtensions(options.preset, options.folders), options.sdkVersion).map((extension) => withCatalogs(extension, 0));
29
+ let catalogs = catalogsOf(options.kernelCatalogs, extensions);
30
+ let pool = await launch(extensions, catalogs);
31
+ const retiring = new Set();
32
+ const pools = () => [pool, ...retiring];
33
+ const warnDroppedNames = (reloaded, next) => {
34
+ const kept = new Set(next.summary.jobs.map((job) => job.name));
35
+ for (const job of pool.summary.jobs.filter((entry) => reloaded.has(entry.owner) && !kept.has(entry.name))) {
36
+ const dependents = [...dependentsOf(extensions, new Set([job.owner]))];
37
+ if (dependents.length > 0)
38
+ options.logger.warn('A reloaded extension dropped a name its dependents may call.', { extension: job.owner, name: job.name, dependents });
39
+ }
40
+ };
41
+ return {
42
+ pool: () => pool,
43
+ extensions: () => extensions,
44
+ catalogs: () => catalogs,
45
+ folders: () => new Map(extensions.filter((extension) => extension.source.startsWith('path:')).map((extension) => [extension.name, extension.folder])),
46
+ // Loads the changed extensions' new code in a fresh pool; throws, keeping everything as it was, when it fails.
47
+ async reload(changed) {
48
+ const read = extensions.map((extension) => (changed.has(extension.name) ? readExtension(extension.name, extension.source, options.folders) : extension));
49
+ const { ordered, warnings } = checkReload(read, changed, options.sdkVersion);
50
+ const previous = new Map(extensions.map((extension) => [extension.name, extension]));
51
+ const next = ordered.map((extension) => {
52
+ const before = previous.get(extension.name);
53
+ return changed.has(extension.name) || before === undefined ? withCatalogs(extension, (before?.revision ?? -1) + 1) : before;
54
+ });
55
+ const nextCatalogs = catalogsOf(options.kernelCatalogs, next);
56
+ const nextPool = await launch(next, nextCatalogs);
57
+ for (const warning of warnings)
58
+ options.logger.warn('A reloaded extension no longer satisfies a dependent.', warning);
59
+ warnDroppedNames(changed, nextPool);
60
+ const old = pool;
61
+ retiring.add(old);
62
+ void old.retire().then(() => retiring.delete(old));
63
+ pool = nextPool;
64
+ extensions = next;
65
+ catalogs = nextCatalogs;
66
+ const startedAgain = new Set([...changed, ...dependentsOf(next, changed)]);
67
+ return { reloaded: next.filter((extension) => changed.has(extension.name)), startedAgain: next.map((extension) => extension.name).filter((name) => startedAgain.has(name)) };
68
+ },
69
+ abortAll: (reason) => {
70
+ for (const each of pools())
71
+ each.abortAll(reason);
72
+ },
73
+ idle: async () => {
74
+ await Promise.all(pools().map((each) => each.idle()));
75
+ },
76
+ close: async () => {
77
+ await Promise.all(pools().map((each) => each.close()));
78
+ },
79
+ };
80
+ }
81
+ //# sourceMappingURL=extension-run.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"extension-run.js","sourceRoot":"","sources":["../../src/run/extension-run.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,27 @@
1
+ import type { Clock } from '../clock.ts';
2
+ import type { IdGenerator } from '../ids.ts';
3
+ import type { NewJob } from '../jobs/job-rows.ts';
4
+ import type { Connection } from '../storage/database.ts';
5
+ import { type ClosedWorkspaces } from '../workspaces/workspaces.ts';
6
+ export type NewSchedule = {
7
+ owner: string;
8
+ workspaceId: string;
9
+ name: string;
10
+ input: unknown;
11
+ timing: {
12
+ at: string;
13
+ } | {
14
+ cron: string;
15
+ };
16
+ key?: string | undefined;
17
+ retries: number;
18
+ fromHandler: boolean;
19
+ };
20
+ export type ScheduleRows = ReturnType<typeof createScheduleRows>;
21
+ export declare function createScheduleRows(connection: Connection, clock: Clock, ids: IdGenerator, closedWorkspaces: ClosedWorkspaces): {
22
+ upsert(schedule: NewSchedule): string;
23
+ cancel(id: string, owner: string): void;
24
+ queueDue(insert: (job: NewJob) => string): void;
25
+ earliestNextRun(): number | undefined;
26
+ };
27
+ //# sourceMappingURL=schedule-rows.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"schedule-rows.d.ts","sourceRoot":"","sources":["../../src/schedules/schedule-rows.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,aAAa,CAAC;AACzC,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,WAAW,CAAC;AAC7C,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,qBAAqB,CAAC;AAElD,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,wBAAwB,CAAC;AACzD,OAAO,EAAiB,KAAK,gBAAgB,EAAE,MAAM,6BAA6B,CAAC;AAKnF,MAAM,MAAM,WAAW,GAAG;IACxB,KAAK,EAAE,MAAM,CAAC;IACd,WAAW,EAAE,MAAM,CAAC;IACpB,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,OAAO,CAAC;IACf,MAAM,EAAE;QAAE,EAAE,EAAE,MAAM,CAAA;KAAE,GAAG;QAAE,IAAI,EAAE,MAAM,CAAA;KAAE,CAAC;IAC1C,GAAG,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IACzB,OAAO,EAAE,MAAM,CAAC;IAChB,WAAW,EAAE,OAAO,CAAC;CACtB,CAAC;AAiCF,MAAM,MAAM,YAAY,GAAG,UAAU,CAAC,OAAO,kBAAkB,CAAC,CAAC;AAEjE,wBAAgB,kBAAkB,CAAC,UAAU,EAAE,UAAU,EAAE,KAAK,EAAE,KAAK,EAAE,GAAG,EAAE,WAAW,EAAE,gBAAgB,EAAE,gBAAgB;qBAExG,WAAW,GAAG,MAAM;eAoB1B,MAAM,SAAS,MAAM,GAAG,IAAI;qBAMtB,CAAC,GAAG,EAAE,MAAM,KAAK,MAAM,GAAG,IAAI;uBAY5B,MAAM,GAAG,SAAS;EAMxC"}
@@ -0,0 +1,70 @@
1
+ import { Cron } from 'croner';
2
+ import { kernelProblem } from "../problems.js";
3
+ import { outsideClosed } from "../workspaces/workspaces.js";
4
+ const iso = (time) => new Date(time).toISOString();
5
+ function nextCronRun(cron, after) {
6
+ return new Cron(cron, { paused: true }).nextRun(new Date(after))?.getTime();
7
+ }
8
+ function firstRun(timing, now) {
9
+ if ('at' in timing)
10
+ return Date.parse(timing.at);
11
+ let next;
12
+ try {
13
+ next = nextCronRun(timing.cron, now);
14
+ }
15
+ catch (error) {
16
+ const reason = error instanceof Error ? error.message : String(error);
17
+ throw kernelProblem('VALIDATION_FAILED', `"${timing.cron}" is not a valid cron expression (${reason}).`, { cron: timing.cron });
18
+ }
19
+ if (next === undefined)
20
+ throw kernelProblem('VALIDATION_FAILED', `The cron expression "${timing.cron}" never runs.`, { cron: timing.cron });
21
+ return next;
22
+ }
23
+ export function createScheduleRows(connection, clock, ids, closedWorkspaces) {
24
+ return {
25
+ upsert(schedule) {
26
+ const nextRun = iso(firstRun(schedule.timing, clock.now()));
27
+ const at = 'at' in schedule.timing ? schedule.timing.at : null;
28
+ const cron = 'cron' in schedule.timing ? schedule.timing.cron : null;
29
+ const keyed = schedule.key === undefined
30
+ ? undefined
31
+ : connection
32
+ .prepare('SELECT id FROM schedules WHERE owner = ? AND workspace_id = ? AND key = ?')
33
+ .get(schedule.owner, schedule.workspaceId, schedule.key);
34
+ const id = keyed?.id ?? ids();
35
+ connection
36
+ .prepare(`INSERT INTO schedules (id, owner, key, name, input, at, cron, next_run, workspace_id, retries, from_handler) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)
37
+ ON CONFLICT (id) DO UPDATE SET name = excluded.name, input = excluded.input, at = excluded.at, cron = excluded.cron,
38
+ next_run = excluded.next_run, retries = excluded.retries, from_handler = excluded.from_handler`)
39
+ .run(id, schedule.owner, schedule.key ?? null, schedule.name, JSON.stringify(schedule.input), at, cron, nextRun, schedule.workspaceId, schedule.retries, schedule.fromHandler ? 1 : 0);
40
+ return id;
41
+ },
42
+ cancel(id, owner) {
43
+ const removed = connection.prepare('DELETE FROM schedules WHERE id = ? AND owner = ?').run(id, owner).changes;
44
+ if (removed === 0)
45
+ throw kernelProblem('NOT_FOUND', `There is no schedule ${id}.`, { id });
46
+ },
47
+ // Queues the job of every due schedule of an open workspace, once, and moves each to its next run; a one-time schedule is
48
+ // deleted. Missed repeats are not replayed.
49
+ queueDue(insert) {
50
+ const now = clock.now();
51
+ const closed = closedWorkspaces();
52
+ const due = connection.prepare(`SELECT * FROM schedules WHERE next_run <= ?${outsideClosed('AND', closed)} ORDER BY next_run, id`).all(iso(now), ...closed);
53
+ for (const row of due) {
54
+ const input = JSON.parse(row.input);
55
+ insert({ name: row.name, input, workspaceId: row.workspace_id, caller: { kind: 'extension', name: row.owner }, retries: row.retries, fromHandler: row.from_handler === 1, runAt: now });
56
+ const next = row.cron === null ? undefined : nextCronRun(row.cron, now);
57
+ if (next === undefined)
58
+ connection.prepare('DELETE FROM schedules WHERE id = ?').run(row.id);
59
+ else
60
+ connection.prepare('UPDATE schedules SET next_run = ? WHERE id = ?').run(iso(next), row.id);
61
+ }
62
+ },
63
+ earliestNextRun() {
64
+ const closed = closedWorkspaces();
65
+ const row = connection.prepare(`SELECT min(next_run) AS next_run FROM schedules${outsideClosed('WHERE', closed)}`).get(...closed);
66
+ return row?.next_run === null || row === undefined ? undefined : Date.parse(row.next_run);
67
+ },
68
+ };
69
+ }
70
+ //# sourceMappingURL=schedule-rows.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"schedule-rows.js","sourceRoot":"","sources":["../../src/schedules/schedule-rows.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export declare function kernelSdkVersion(): string;
2
+ //# sourceMappingURL=sdk-version.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sdk-version.d.ts","sourceRoot":"","sources":["../src/sdk-version.ts"],"names":[],"mappings":"AAKA,wBAAgB,gBAAgB,IAAI,MAAM,CAIzC"}
@@ -0,0 +1,10 @@
1
+ import { readFileSync } from 'node:fs';
2
+ import { createRequire } from 'node:module';
3
+ import { z } from '@kvman/sdk';
4
+ // The version of the kernel's own `@kvman/sdk`, which every extension's peer range must include (plan 02 §2.9).
5
+ export function kernelSdkVersion() {
6
+ const manifestPath = createRequire(import.meta.url).resolve('@kvman/sdk/package.json');
7
+ const manifest = JSON.parse(readFileSync(manifestPath, 'utf8'));
8
+ return z.object({ version: z.string() }).parse(manifest).version;
9
+ }
10
+ //# sourceMappingURL=sdk-version.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sdk-version.js","sourceRoot":"","sources":["../src/sdk-version.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AACvC,OAAO,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAC5C,OAAO,EAAE,CAAC,EAAE,MAAM,YAAY,CAAC;AAE/B,gHAAgH;AAChH,MAAM,UAAU,gBAAgB;IAC9B,MAAM,YAAY,GAAG,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,OAAO,CAAC,yBAAyB,CAAC,CAAC;IACvF,MAAM,QAAQ,GAAY,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC,YAAY,EAAE,MAAM,CAAC,CAAC,CAAC;IACzE,OAAO,CAAC,CAAC,MAAM,CAAC,EAAE,OAAO,EAAE,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC,OAAO,CAAC;AACnE,CAAC"}
@@ -0,0 +1,11 @@
1
+ export type SecretsFile = {
2
+ get(extension: string, name: string): string | undefined;
3
+ set(extension: string, name: string, value: string): void;
4
+ delete(extension: string, name: string): void;
5
+ list(): {
6
+ extension: string;
7
+ name: string;
8
+ }[];
9
+ };
10
+ export declare function openSecretsFile(home: string): SecretsFile;
11
+ //# sourceMappingURL=secrets-file.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"secrets-file.d.ts","sourceRoot":"","sources":["../../src/secrets/secrets-file.ts"],"names":[],"mappings":"AAYA,MAAM,MAAM,WAAW,GAAG;IACxB,GAAG,CAAC,SAAS,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS,CAAC;IACzD,GAAG,CAAC,SAAS,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,IAAI,CAAC;IAC1D,MAAM,CAAC,SAAS,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,IAAI,CAAC;IAC9C,IAAI,IAAI;QAAE,SAAS,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAA;KAAE,EAAE,CAAC;CAC/C,CAAC;AA0BF,wBAAgB,eAAe,CAAC,IAAI,EAAE,MAAM,GAAG,WAAW,CAiBzD"}
@@ -0,0 +1,50 @@
1
+ import { closeSync, existsSync, fsyncSync, openSync, readFileSync, renameSync, rmSync, writeSync } from 'node:fs';
2
+ import path from 'node:path';
3
+ import { randomUUID } from 'node:crypto';
4
+ import { z } from '@kvman/sdk';
5
+ // Secrets live only in `secrets.json` (plan 02 §2.8): mode 0600 on Linux and macOS; on Windows, the user profile
6
+ // folder's access rules protect it. A write replaces the whole file atomically: a new file, flushed, then renamed.
7
+ const secretsSchema = z.record(z.string(), z.record(z.string(), z.string()));
8
+ const privateFileMode = 0o600;
9
+ function openPrivateFile(file) {
10
+ if (process.platform === 'win32')
11
+ return openSync(file, 'wx');
12
+ return openSync(file, 'wx', privateFileMode);
13
+ }
14
+ function writeAtomically(file, text) {
15
+ const temporary = path.join(path.dirname(file), `.secrets-${randomUUID()}.tmp`);
16
+ try {
17
+ const descriptor = openPrivateFile(temporary);
18
+ try {
19
+ writeSync(descriptor, text);
20
+ fsyncSync(descriptor);
21
+ }
22
+ finally {
23
+ closeSync(descriptor);
24
+ }
25
+ renameSync(temporary, file);
26
+ }
27
+ catch (error) {
28
+ rmSync(temporary, { force: true });
29
+ throw error;
30
+ }
31
+ }
32
+ export function openSecretsFile(home) {
33
+ const file = path.join(home, 'secrets.json');
34
+ const read = () => (existsSync(file) ? secretsSchema.parse(JSON.parse(readFileSync(file, 'utf8'))) : {});
35
+ const write = (values) => writeAtomically(file, `${JSON.stringify(values, null, 2)}\n`);
36
+ return {
37
+ get: (extension, name) => read()[extension]?.[name],
38
+ set(extension, name, value) {
39
+ const values = read();
40
+ write({ ...values, [extension]: { ...values[extension], [name]: value } });
41
+ },
42
+ delete(extension, name) {
43
+ const values = read();
44
+ const { [name]: _removed, ...rest } = values[extension] ?? {};
45
+ write({ ...values, [extension]: rest });
46
+ },
47
+ list: () => Object.entries(read()).flatMap(([extension, names]) => Object.keys(names).map((name) => ({ extension, name }))),
48
+ };
49
+ }
50
+ //# sourceMappingURL=secrets-file.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"secrets-file.js","sourceRoot":"","sources":["../../src/secrets/secrets-file.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,4 @@
1
+ import type { SettingDefinition } from './settings.ts';
2
+ export declare const kernelExtension = "@kvman/kernel";
3
+ export declare function kernelSettingDefinitions(languages: readonly string[]): SettingDefinition[];
4
+ //# sourceMappingURL=kernel-settings.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"kernel-settings.d.ts","sourceRoot":"","sources":["../../src/settings/kernel-settings.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,eAAe,CAAC;AAIvD,eAAO,MAAM,eAAe,kBAAkB,CAAC;AAO/C,wBAAgB,wBAAwB,CAAC,SAAS,EAAE,SAAS,MAAM,EAAE,GAAG,iBAAiB,EAAE,CAU1F"}
@@ -0,0 +1,20 @@
1
+ import { availableParallelism } from 'node:os';
2
+ import { z } from '@kvman/sdk';
3
+ // The kernel's own keys, global only (plan 02 §2.8).
4
+ export const kernelExtension = '@kvman/kernel';
5
+ function kernelSetting(key, description, schema, value) {
6
+ return { key, extension: kernelExtension, description, schema, defaultValue: { value }, scopes: ['global'] };
7
+ }
8
+ // `kernel.language` is any code a loaded catalog has (plan 02 §2.11).
9
+ export function kernelSettingDefinitions(languages) {
10
+ const language = z.string().refine((code) => languages.includes(code), { error: `The language must be one a loaded catalog has: ${languages.join(', ')}.` });
11
+ return [
12
+ kernelSetting('kernel.port', 'The port kvman listens on, from the next start.', z.number().int().min(1).max(65_535), 3737),
13
+ kernelSetting('kernel.workers', 'How many worker threads run jobs, from the next start.', z.number().int().positive(), Math.max(1, availableParallelism() - 1)),
14
+ kernelSetting('kernel.workerConcurrency', 'How many jobs one worker runs at once, from the next start.', z.number().int().positive(), 32),
15
+ kernelSetting('kernel.language', 'The language of the app.', language, 'en'),
16
+ kernelSetting('kernel.jobs.retentionDays', 'How many days finished job rows are kept.', z.number().int().nonnegative(), 7),
17
+ kernelSetting('kernel.web.home', 'The namespace of the extension whose web folder is served at /.', z.string().min(1), 'kvwebui'),
18
+ ];
19
+ }
20
+ //# sourceMappingURL=kernel-settings.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"kernel-settings.js","sourceRoot":"","sources":["../../src/settings/kernel-settings.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,oBAAoB,EAAE,MAAM,SAAS,CAAC;AAC/C,OAAO,EAAE,CAAC,EAAE,MAAM,YAAY,CAAC;AAG/B,qDAAqD;AAErD,MAAM,CAAC,MAAM,eAAe,GAAG,eAAe,CAAC;AAE/C,SAAS,aAAa,CAAC,GAAW,EAAE,WAAmB,EAAE,MAAiB,EAAE,KAAc;IACxF,OAAO,EAAE,GAAG,EAAE,SAAS,EAAE,eAAe,EAAE,WAAW,EAAE,MAAM,EAAE,YAAY,EAAE,EAAE,KAAK,EAAE,EAAE,MAAM,EAAE,CAAC,QAAQ,CAAC,EAAE,CAAC;AAC/G,CAAC;AAED,sEAAsE;AACtE,MAAM,UAAU,wBAAwB,CAAC,SAA4B;IACnE,MAAM,QAAQ,GAAG,CAAC,CAAC,MAAM,EAAE,CAAC,MAAM,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,SAAS,CAAC,QAAQ,CAAC,IAAI,CAAC,EAAE,EAAE,KAAK,EAAE,kDAAkD,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,CAAC,CAAC;IAC7J,OAAO;QACL,aAAa,CAAC,aAAa,EAAE,iDAAiD,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,MAAM,CAAC,EAAE,IAAI,CAAC;QAC1H,aAAa,CAAC,gBAAgB,EAAE,wDAAwD,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,EAAE,CAAC,QAAQ,EAAE,EAAE,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,oBAAoB,EAAE,GAAG,CAAC,CAAC,CAAC;QAC/J,aAAa,CAAC,0BAA0B,EAAE,6DAA6D,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,EAAE,CAAC,QAAQ,EAAE,EAAE,EAAE,CAAC;QACzI,aAAa,CAAC,iBAAiB,EAAE,0BAA0B,EAAE,QAAQ,EAAE,IAAI,CAAC;QAC5E,aAAa,CAAC,2BAA2B,EAAE,2CAA2C,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,EAAE,CAAC,WAAW,EAAE,EAAE,CAAC,CAAC;QAC1H,aAAa,CAAC,iBAAiB,EAAE,iEAAiE,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,SAAS,CAAC;KAClI,CAAC;AACJ,CAAC"}
@@ -0,0 +1,4 @@
1
+ import type { Json } from '@kvman/sdk';
2
+ import type { SettingDefinition } from './settings.ts';
3
+ export declare function checkPresetSettings(definitions: ReadonlyMap<string, SettingDefinition>, presetValues: Readonly<Record<string, Json>>): void;
4
+ //# sourceMappingURL=preset-check.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"preset-check.d.ts","sourceRoot":"","sources":["../../src/settings/preset-check.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,YAAY,CAAC;AAGvC,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,eAAe,CAAC;AAGvD,wBAAgB,mBAAmB,CAAC,WAAW,EAAE,WAAW,CAAC,MAAM,EAAE,iBAAiB,CAAC,EAAE,YAAY,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,IAAI,CAAC,CAAC,GAAG,IAAI,CAY3I"}
@@ -0,0 +1,19 @@
1
+ import { kernelProblem } from "../problems.js";
2
+ import { validationFailed } from "../store/json-values.js";
3
+ // The preset's settings, checked once every extension has registered its keys (plan 02 §2.8, §2.14 step 7).
4
+ export function checkPresetSettings(definitions, presetValues) {
5
+ for (const [key, value] of Object.entries(presetValues)) {
6
+ const definition = definitions.get(key);
7
+ if (definition === undefined)
8
+ throw kernelProblem('VALIDATION_FAILED', `The preset sets "${key}", which no extension registers.`, { key });
9
+ const parsed = definition.schema.safeParse(value);
10
+ if (!parsed.success)
11
+ throw validationFailed(`The preset's value of "${key}"`, parsed.error);
12
+ }
13
+ for (const definition of definitions.values()) {
14
+ if (definition.defaultValue === undefined && !Object.hasOwn(presetValues, definition.key)) {
15
+ throw kernelProblem('VALIDATION_FAILED', `The setting "${definition.key}" has no default, so the preset must set it.`, { key: definition.key });
16
+ }
17
+ }
18
+ }
19
+ //# sourceMappingURL=preset-check.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"preset-check.js","sourceRoot":"","sources":["../../src/settings/preset-check.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,aAAa,EAAE,MAAM,gBAAgB,CAAC;AAC/C,OAAO,EAAE,gBAAgB,EAAE,MAAM,yBAAyB,CAAC;AAG3D,4GAA4G;AAC5G,MAAM,UAAU,mBAAmB,CAAC,WAAmD,EAAE,YAA4C;IACnI,KAAK,MAAM,CAAC,GAAG,EAAE,KAAK,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,YAAY,CAAC,EAAE,CAAC;QACxD,MAAM,UAAU,GAAG,WAAW,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;QACxC,IAAI,UAAU,KAAK,SAAS;YAAE,MAAM,aAAa,CAAC,mBAAmB,EAAE,oBAAoB,GAAG,kCAAkC,EAAE,EAAE,GAAG,EAAE,CAAC,CAAC;QAC3I,MAAM,MAAM,GAAG,UAAU,CAAC,MAAM,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC;QAClD,IAAI,CAAC,MAAM,CAAC,OAAO;YAAE,MAAM,gBAAgB,CAAC,0BAA0B,GAAG,GAAG,EAAE,MAAM,CAAC,KAAK,CAAC,CAAC;IAC9F,CAAC;IACD,KAAK,MAAM,UAAU,IAAI,WAAW,CAAC,MAAM,EAAE,EAAE,CAAC;QAC9C,IAAI,UAAU,CAAC,YAAY,KAAK,SAAS,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,YAAY,EAAE,UAAU,CAAC,GAAG,CAAC,EAAE,CAAC;YAC1F,MAAM,aAAa,CAAC,mBAAmB,EAAE,gBAAgB,UAAU,CAAC,GAAG,8CAA8C,EAAE,EAAE,GAAG,EAAE,UAAU,CAAC,GAAG,EAAE,CAAC,CAAC;QAClJ,CAAC;IACH,CAAC;AACH,CAAC"}
@@ -0,0 +1,31 @@
1
+ import type { Json, SettingScope, z } from '@kvman/sdk';
2
+ import type { KernelLogger } from '../logging/logger.ts';
3
+ import type { Connection } from '../storage/database.ts';
4
+ export type SettingDefinition = {
5
+ key: string;
6
+ extension: string;
7
+ description: string;
8
+ schema: z.ZodType;
9
+ defaultValue: {
10
+ value: unknown;
11
+ } | undefined;
12
+ scopes: readonly SettingScope[];
13
+ };
14
+ export type SettingSource = 'workspace' | 'global' | 'preset' | 'default';
15
+ export type ResolvedSetting = {
16
+ value: unknown;
17
+ source: SettingSource;
18
+ };
19
+ export type Settings = {
20
+ resolve(key: string, workspaceId: string): ResolvedSetting;
21
+ set(key: string, value: Json, scope: SettingScope, workspaceId: string): void;
22
+ reset(key: string, scope: SettingScope, workspaceId: string): void;
23
+ };
24
+ export type SettingsOptions = {
25
+ connection: Connection;
26
+ definitions: ReadonlyMap<string, SettingDefinition>;
27
+ presetValues: Readonly<Record<string, Json>>;
28
+ logger: KernelLogger;
29
+ };
30
+ export declare function createSettings({ connection, definitions, presetValues, logger }: SettingsOptions): Settings;
31
+ //# sourceMappingURL=settings.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"settings.d.ts","sourceRoot":"","sources":["../../src/settings/settings.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,IAAI,EAAE,YAAY,EAAE,CAAC,EAAE,MAAM,YAAY,CAAC;AACxD,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,sBAAsB,CAAC;AAEzD,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,wBAAwB,CAAC;AAOzD,MAAM,MAAM,iBAAiB,GAAG;IAC9B,GAAG,EAAE,MAAM,CAAC;IACZ,SAAS,EAAE,MAAM,CAAC;IAClB,WAAW,EAAE,MAAM,CAAC;IACpB,MAAM,EAAE,CAAC,CAAC,OAAO,CAAC;IAClB,YAAY,EAAE;QAAE,KAAK,EAAE,OAAO,CAAA;KAAE,GAAG,SAAS,CAAC;IAC7C,MAAM,EAAE,SAAS,YAAY,EAAE,CAAC;CACjC,CAAC;AAEF,MAAM,MAAM,aAAa,GAAG,WAAW,GAAG,QAAQ,GAAG,QAAQ,GAAG,SAAS,CAAC;AAE1E,MAAM,MAAM,eAAe,GAAG;IAAE,KAAK,EAAE,OAAO,CAAC;IAAC,MAAM,EAAE,aAAa,CAAA;CAAE,CAAC;AAExE,MAAM,MAAM,QAAQ,GAAG;IACrB,OAAO,CAAC,GAAG,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,GAAG,eAAe,CAAC;IAC3D,GAAG,CAAC,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,IAAI,EAAE,KAAK,EAAE,YAAY,EAAE,WAAW,EAAE,MAAM,GAAG,IAAI,CAAC;IAC9E,KAAK,CAAC,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,YAAY,EAAE,WAAW,EAAE,MAAM,GAAG,IAAI,CAAC;CACpE,CAAC;AAEF,MAAM,MAAM,eAAe,GAAG;IAC5B,UAAU,EAAE,UAAU,CAAC;IACvB,WAAW,EAAE,WAAW,CAAC,MAAM,EAAE,iBAAiB,CAAC,CAAC;IACpD,YAAY,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,IAAI,CAAC,CAAC,CAAC;IAC7C,MAAM,EAAE,YAAY,CAAC;CACtB,CAAC;AAMF,wBAAgB,cAAc,CAAC,EAAE,UAAU,EAAE,WAAW,EAAE,YAAY,EAAE,MAAM,EAAE,EAAE,eAAe,GAAG,QAAQ,CAoD3G"}
@@ -0,0 +1,68 @@
1
+ import { kernelProblem } from "../problems.js";
2
+ import { globalScope } from "../store/store.js";
3
+ import { validationFailed } from "../store/json-values.js";
4
+ function storedScope(scope, workspaceId) {
5
+ return scope === 'global' ? globalScope : workspaceId;
6
+ }
7
+ export function createSettings({ connection, definitions, presetValues, logger }) {
8
+ const definition = (key) => {
9
+ const found = definitions.get(key);
10
+ if (found === undefined)
11
+ throw kernelProblem('NOT_FOUND', `There is no setting "${key}".`, { key });
12
+ return found;
13
+ };
14
+ const allowed = (setting, scope) => {
15
+ if (!setting.scopes.includes(scope)) {
16
+ throw kernelProblem('VALIDATION_FAILED', `The setting "${setting.key}" can't be set in the ${scope} scope.`, { key: setting.key, scope });
17
+ }
18
+ };
19
+ const stored = (setting, scope, workspaceId) => {
20
+ if (!setting.scopes.includes(scope))
21
+ return undefined;
22
+ const row = connection
23
+ .prepare('SELECT value FROM settings WHERE key = ? AND scope = ?')
24
+ .get(setting.key, storedScope(scope, workspaceId));
25
+ if (row === undefined)
26
+ return undefined;
27
+ const parsed = setting.schema.safeParse(JSON.parse(row.value));
28
+ if (parsed.success)
29
+ return { value: parsed.data };
30
+ logger.warn('A stored setting no longer fits its schema, so it is skipped.', { key: setting.key, scope });
31
+ return undefined;
32
+ };
33
+ return {
34
+ resolve(key, workspaceId) {
35
+ const setting = definition(key);
36
+ const workspace = stored(setting, 'workspace', workspaceId);
37
+ if (workspace !== undefined)
38
+ return { value: workspace.value, source: 'workspace' };
39
+ const global = stored(setting, 'global', workspaceId);
40
+ if (global !== undefined)
41
+ return { value: global.value, source: 'global' };
42
+ if (Object.hasOwn(presetValues, key)) {
43
+ const parsed = setting.schema.safeParse(presetValues[key]);
44
+ if (!parsed.success)
45
+ throw validationFailed(`The preset's value of "${key}"`, parsed.error);
46
+ return { value: parsed.data, source: 'preset' };
47
+ }
48
+ if (setting.defaultValue !== undefined)
49
+ return { value: setting.defaultValue.value, source: 'default' };
50
+ throw kernelProblem('VALIDATION_FAILED', `The setting "${key}" has no value; the preset must set it.`, { key });
51
+ },
52
+ set(key, value, scope, workspaceId) {
53
+ const setting = definition(key);
54
+ allowed(setting, scope);
55
+ const parsed = setting.schema.safeParse(value);
56
+ if (!parsed.success)
57
+ throw validationFailed(`The value of "${key}"`, parsed.error);
58
+ connection
59
+ .prepare('INSERT INTO settings (key, scope, value) VALUES (?, ?, ?) ON CONFLICT DO UPDATE SET value = excluded.value')
60
+ .run(key, storedScope(scope, workspaceId), JSON.stringify(value));
61
+ },
62
+ reset(key, scope, workspaceId) {
63
+ allowed(definition(key), scope);
64
+ connection.prepare('DELETE FROM settings WHERE key = ? AND scope = ?').run(key, storedScope(scope, workspaceId));
65
+ },
66
+ };
67
+ }
68
+ //# sourceMappingURL=settings.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"settings.js","sourceRoot":"","sources":["../../src/settings/settings.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,6 @@
1
+ import Database from 'better-sqlite3';
2
+ export type Connection = Database.Database;
3
+ export declare const busyTimeoutMs = 5000;
4
+ export declare function openConnection(file: string): Connection;
5
+ export declare function openDatabase(file: string): Connection;
6
+ //# sourceMappingURL=database.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"database.d.ts","sourceRoot":"","sources":["../../src/storage/database.ts"],"names":[],"mappings":"AAAA,OAAO,QAAQ,MAAM,gBAAgB,CAAC;AAKtC,MAAM,MAAM,UAAU,GAAG,QAAQ,CAAC,QAAQ,CAAC;AAE3C,eAAO,MAAM,aAAa,OAAO,CAAC;AAElC,wBAAgB,cAAc,CAAC,IAAI,EAAE,MAAM,GAAG,UAAU,CAavD;AAGD,wBAAgB,YAAY,CAAC,IAAI,EAAE,MAAM,GAAG,UAAU,CASrD"}
@@ -0,0 +1,31 @@
1
+ import Database from 'better-sqlite3';
2
+ import { kernelSchema } from "./schema.js";
3
+ export const busyTimeoutMs = 5000;
4
+ export function openConnection(file) {
5
+ const connection = new Database(file);
6
+ try {
7
+ // The timeout comes first: switching to WAL takes a lock, which another connection may hold after a crash while it
8
+ // recovers the WAL; without the timeout, that pragma fails at once with "database is locked".
9
+ connection.pragma(`busy_timeout = ${busyTimeoutMs}`);
10
+ connection.pragma('journal_mode = WAL');
11
+ connection.pragma('synchronous = NORMAL');
12
+ return connection;
13
+ }
14
+ catch (error) {
15
+ connection.close();
16
+ throw error;
17
+ }
18
+ }
19
+ // Opens the database and creates the kernel's tables; the main thread does this once, before any worker connects.
20
+ export function openDatabase(file) {
21
+ const connection = openConnection(file);
22
+ try {
23
+ connection.exec(kernelSchema);
24
+ return connection;
25
+ }
26
+ catch (error) {
27
+ connection.close();
28
+ throw error;
29
+ }
30
+ }
31
+ //# sourceMappingURL=database.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"database.js","sourceRoot":"","sources":["../../src/storage/database.ts"],"names":[],"mappings":"AAAA,OAAO,QAAQ,MAAM,gBAAgB,CAAC;AACtC,OAAO,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAM3C,MAAM,CAAC,MAAM,aAAa,GAAG,IAAI,CAAC;AAElC,MAAM,UAAU,cAAc,CAAC,IAAY;IACzC,MAAM,UAAU,GAAG,IAAI,QAAQ,CAAC,IAAI,CAAC,CAAC;IACtC,IAAI,CAAC;QACH,mHAAmH;QACnH,8FAA8F;QAC9F,UAAU,CAAC,MAAM,CAAC,kBAAkB,aAAa,EAAE,CAAC,CAAC;QACrD,UAAU,CAAC,MAAM,CAAC,oBAAoB,CAAC,CAAC;QACxC,UAAU,CAAC,MAAM,CAAC,sBAAsB,CAAC,CAAC;QAC1C,OAAO,UAAU,CAAC;IACpB,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,UAAU,CAAC,KAAK,EAAE,CAAC;QACnB,MAAM,KAAK,CAAC;IACd,CAAC;AACH,CAAC;AAED,kHAAkH;AAClH,MAAM,UAAU,YAAY,CAAC,IAAY;IACvC,MAAM,UAAU,GAAG,cAAc,CAAC,IAAI,CAAC,CAAC;IACxC,IAAI,CAAC;QACH,UAAU,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC;QAC9B,OAAO,UAAU,CAAC;IACpB,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,UAAU,CAAC,KAAK,EAAE,CAAC;QACnB,MAAM,KAAK,CAAC;IACd,CAAC;AACH,CAAC"}
@@ -0,0 +1,2 @@
1
+ export declare const kernelSchema = "\nCREATE TABLE IF NOT EXISTS store_kv (\n extension TEXT NOT NULL,\n scope TEXT NOT NULL,\n key TEXT NOT NULL,\n value TEXT NOT NULL,\n PRIMARY KEY (extension, scope, key)\n) WITHOUT ROWID;\n\nCREATE TABLE IF NOT EXISTS store_documents (\n extension TEXT NOT NULL,\n scope TEXT NOT NULL,\n collection TEXT NOT NULL,\n id TEXT NOT NULL,\n data TEXT NOT NULL,\n PRIMARY KEY (extension, scope, collection, id)\n) WITHOUT ROWID;\n\nCREATE TABLE IF NOT EXISTS settings (\n key TEXT NOT NULL,\n scope TEXT NOT NULL,\n value TEXT NOT NULL,\n PRIMARY KEY (key, scope)\n) WITHOUT ROWID;\n\nCREATE TABLE IF NOT EXISTS files (\n id TEXT PRIMARY KEY,\n name TEXT NOT NULL,\n type TEXT NOT NULL,\n size INTEGER NOT NULL,\n owner TEXT NOT NULL,\n workspace_id TEXT NOT NULL,\n created_at TEXT NOT NULL\n) WITHOUT ROWID;\n\nCREATE INDEX IF NOT EXISTS files_by_workspace ON files (workspace_id, id);\n\nCREATE TABLE IF NOT EXISTS jobs (\n id TEXT PRIMARY KEY,\n name TEXT NOT NULL,\n input TEXT NOT NULL,\n workspace_id TEXT NOT NULL,\n caller TEXT NOT NULL,\n status TEXT NOT NULL,\n attempts INTEGER NOT NULL,\n retries INTEGER NOT NULL,\n output TEXT,\n problem TEXT,\n created_at TEXT NOT NULL,\n started_at TEXT,\n ended_at TEXT,\n run_at TEXT NOT NULL,\n from_handler INTEGER NOT NULL,\n handler_extension TEXT\n) WITHOUT ROWID;\n\nCREATE INDEX IF NOT EXISTS jobs_by_status ON jobs (status, run_at, id);\nCREATE INDEX IF NOT EXISTS jobs_by_workspace ON jobs (workspace_id, id);\n\nCREATE TABLE IF NOT EXISTS schedules (\n id TEXT PRIMARY KEY,\n owner TEXT NOT NULL,\n key TEXT,\n name TEXT NOT NULL,\n input TEXT NOT NULL,\n at TEXT,\n cron TEXT,\n next_run TEXT NOT NULL,\n workspace_id TEXT NOT NULL,\n retries INTEGER NOT NULL,\n from_handler INTEGER NOT NULL\n) WITHOUT ROWID;\n\nCREATE UNIQUE INDEX IF NOT EXISTS schedules_by_key ON schedules (owner, workspace_id, key) WHERE key IS NOT NULL;\nCREATE INDEX IF NOT EXISTS schedules_by_next_run ON schedules (next_run);\n\nCREATE TABLE IF NOT EXISTS workspaces (\n id TEXT PRIMARY KEY,\n name TEXT NOT NULL,\n path TEXT NOT NULL UNIQUE,\n open INTEGER NOT NULL\n) WITHOUT ROWID;\n\nCREATE TABLE IF NOT EXISTS processes (\n extension TEXT NOT NULL,\n workspace_id TEXT NOT NULL,\n name TEXT NOT NULL,\n pid INTEGER NOT NULL,\n started_at TEXT NOT NULL,\n PRIMARY KEY (extension, workspace_id, name)\n) WITHOUT ROWID;\n\nCREATE TABLE IF NOT EXISTS kernel_state (\n key TEXT PRIMARY KEY,\n value TEXT NOT NULL\n) WITHOUT ROWID;\n\nCREATE TABLE IF NOT EXISTS accepted_extensions (\n name TEXT NOT NULL,\n version TEXT NOT NULL,\n source TEXT NOT NULL,\n accepted_at TEXT NOT NULL,\n PRIMARY KEY (name, version, source)\n) WITHOUT ROWID;\n";
2
+ //# sourceMappingURL=schema.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"schema.d.ts","sourceRoot":"","sources":["../../src/storage/schema.ts"],"names":[],"mappings":"AAGA,eAAO,MAAM,YAAY,4rFAwGxB,CAAC"}