@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,93 @@
1
+ import { callerSchema, extensionSourceSchema, installSourceSchema, jsonSchema, problemSchema, workspaceSchema, z } from '@kvman/sdk';
2
+ // The messages between the main thread and a worker, checked on arrival like any other boundary.
3
+ const secretWriteSchema = z.discriminatedUnion('action', [
4
+ z.object({ action: z.literal('set'), extension: z.string(), name: z.string(), value: z.string() }),
5
+ z.object({ action: z.literal('delete'), extension: z.string(), name: z.string() }),
6
+ ]);
7
+ const scheduleTimingSchema = z.union([z.object({ at: z.string() }), z.object({ cron: z.string() })]);
8
+ // What a worker asks the main thread to do, which owns the job and schedule rows (ADR 0009, 19).
9
+ const workerRequestSchema = z.discriminatedUnion('kind', [
10
+ z.object({ kind: z.literal('write-secret'), write: secretWriteSchema }),
11
+ z.object({
12
+ kind: z.literal('queue-job'),
13
+ name: z.string(),
14
+ input: z.unknown(),
15
+ workspaceId: z.string(),
16
+ caller: callerSchema,
17
+ retries: z.number().int(),
18
+ fromHandler: z.boolean(),
19
+ }),
20
+ z.object({
21
+ kind: z.literal('schedule'),
22
+ name: z.string(),
23
+ input: z.unknown(),
24
+ timing: scheduleTimingSchema,
25
+ key: z.string().optional(),
26
+ workspaceId: z.string(),
27
+ owner: z.string(),
28
+ retries: z.number().int(),
29
+ fromHandler: z.boolean(),
30
+ }),
31
+ z.object({ kind: z.literal('cancel-schedule'), id: z.string(), owner: z.string() }),
32
+ z.object({ kind: z.literal('cancel-job'), jobId: z.string() }),
33
+ z.object({ kind: z.literal('open-workspace'), path: z.string() }),
34
+ z.object({ kind: z.literal('close-workspace'), workspaceId: z.string() }),
35
+ z.object({ kind: z.literal('preset-get') }),
36
+ z.object({ kind: z.literal('preset-install'), source: installSourceSchema }),
37
+ z.object({ kind: z.literal('preset-uninstall'), name: z.string() }),
38
+ z.object({ kind: z.literal('health') }),
39
+ z.object({ kind: z.literal('restart') }),
40
+ z.object({
41
+ kind: z.literal('start-process'),
42
+ extension: z.string(),
43
+ workspace: workspaceSchema,
44
+ name: z.string(),
45
+ options: z.object({ command: z.string(), args: z.array(z.string()), cwd: z.string().optional(), env: z.record(z.string(), z.string()) }),
46
+ }),
47
+ z.object({ kind: z.literal('stop-process'), extension: z.string(), workspaceId: z.string(), name: z.string() }),
48
+ ]);
49
+ export const workerSetupSchema = z.object({
50
+ home: z.string(),
51
+ homeFolder: z.string(),
52
+ database: z.string(),
53
+ extensions: z.array(z.object({ name: z.string(), namespace: z.string(), entryUrl: z.string(), version: z.string(), source: extensionSourceSchema, revision: z.number().int() })),
54
+ languages: z.array(z.string()),
55
+ presetSettings: z.record(z.string(), jsonSchema),
56
+ logLevel: z.enum(['debug', 'info', 'warn', 'error']),
57
+ terminalLog: z.boolean(),
58
+ checkPresetSettings: z.boolean(),
59
+ mainArgv: z.array(z.string()),
60
+ });
61
+ const rootJobSchema = z.object({
62
+ id: z.string(),
63
+ name: z.string(),
64
+ input: z.unknown(),
65
+ workspace: workspaceSchema,
66
+ caller: callerSchema,
67
+ async: z.boolean(),
68
+ fromHandler: z.boolean(),
69
+ handlerExtension: z.string().optional(),
70
+ });
71
+ export const abortReasons = ['cancel', 'shutdown'];
72
+ export const toWorkerSchema = z.discriminatedUnion('kind', [
73
+ z.object({ kind: z.literal('run'), requestId: z.number(), job: rootJobSchema }),
74
+ z.object({ kind: z.literal('abort'), requestId: z.number(), reason: z.enum(abortReasons) }),
75
+ z.object({ kind: z.literal('answer'), requestId: z.number(), value: z.unknown().optional(), problem: problemSchema.optional() }),
76
+ z.object({ kind: z.literal('stop') }),
77
+ ]);
78
+ const summarySchema = z.object({
79
+ jobs: z.array(z.object({ name: z.string(), kind: z.enum(['command', 'query']), owner: z.string(), public: z.boolean(), retries: z.number().int(), syncOnly: z.boolean(), maxInputBytes: z.number().int() })),
80
+ handlers: z.array(z.object({ point: z.string(), extension: z.string(), retries: z.number().int() })),
81
+ });
82
+ // A sync job, root or nested, that ended failed or cancelled; the main thread queues the matching handler jobs.
83
+ const syncEndSchema = z.object({ point: z.enum(['kernel.job.failed', 'kernel.job.cancelled']), input: z.record(z.string(), z.unknown()), workspaceId: z.string() });
84
+ export const toMainSchema = z.discriminatedUnion('kind', [
85
+ z.object({ kind: z.literal('ready'), summary: summarySchema }),
86
+ z.object({ kind: z.literal('failed'), problem: problemSchema }),
87
+ z.object({ kind: z.literal('result'), requestId: z.number(), output: z.unknown() }),
88
+ z.object({ kind: z.literal('problem'), requestId: z.number(), problem: problemSchema }),
89
+ z.object({ kind: z.literal('request'), requestId: z.number(), request: workerRequestSchema }),
90
+ z.object({ kind: z.literal('progress'), rootId: z.string(), chunk: z.object({ source: z.string(), data: jsonSchema }) }),
91
+ z.object({ kind: z.literal('sync-ended'), end: syncEndSchema }),
92
+ ]);
93
+ //# sourceMappingURL=protocol.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"protocol.js","sourceRoot":"","sources":["../../src/workers/protocol.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,15 @@
1
+ import { type JobEnvironment } from '../jobs/run-job.ts';
2
+ import type { AbortReason, RootJob, ToMain, ToWorker } from './protocol.ts';
3
+ export declare function createRootRunner(environment: JobEnvironment, send: (message: ToMain) => void): {
4
+ run: (requestId: number, job: RootJob) => void;
5
+ abort: (requestId: number, reason: AbortReason) => void;
6
+ };
7
+ type Answers = Map<number, {
8
+ resolve: (value: unknown) => void;
9
+ reject: (error: Error) => void;
10
+ }>;
11
+ export declare function answerFromMain(answers: Answers, message: Extract<ToWorker, {
12
+ kind: 'answer';
13
+ }>): void;
14
+ export {};
15
+ //# sourceMappingURL=root-runner.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"root-runner.d.ts","sourceRoot":"","sources":["../../src/workers/root-runner.ts"],"names":[],"mappings":"AACA,OAAO,EAAqB,KAAK,cAAc,EAAmB,MAAM,oBAAoB,CAAC;AAE7F,OAAO,KAAK,EAAE,WAAW,EAAE,OAAO,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAC;AAiB5E,wBAAgB,gBAAgB,CAAC,WAAW,EAAE,cAAc,EAAE,IAAI,EAAE,CAAC,OAAO,EAAE,MAAM,KAAK,IAAI;qBAyBxE,MAAM,OAAO,OAAO,KAAG,IAAI;uBAGzB,MAAM,UAAU,WAAW,KAAG,IAAI;EAOxD;AAED,KAAK,OAAO,GAAG,GAAG,CAAC,MAAM,EAAE;IAAE,OAAO,EAAE,CAAC,KAAK,EAAE,OAAO,KAAK,IAAI,CAAC;IAAC,MAAM,EAAE,CAAC,KAAK,EAAE,KAAK,KAAK,IAAI,CAAA;CAAE,CAAC,CAAC;AAElG,wBAAgB,cAAc,CAAC,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,CAAC,QAAQ,EAAE;IAAE,IAAI,EAAE,QAAQ,CAAA;CAAE,CAAC,GAAG,IAAI,CAKrG"}
@@ -0,0 +1,63 @@
1
+ import { ProblemError } from '@kvman/sdk';
2
+ import { runJob, syncEndOf } from "../jobs/run-job.js";
3
+ import { kernelProblem } from "../problems.js";
4
+ function abortProblem(reason) {
5
+ return reason === 'cancel' ? kernelProblem('CANCELLED', 'The job was cancelled.') : kernelProblem('INTERRUPTED', 'kvman stopped during the attempt.');
6
+ }
7
+ function problemAfter(root, problem) {
8
+ if (root.reason === 'cancel')
9
+ return abortProblem('cancel').problem;
10
+ if (root.reason === 'shutdown' && problem !== undefined)
11
+ return abortProblem('shutdown').problem;
12
+ return problem;
13
+ }
14
+ export function createRootRunner(environment, send) {
15
+ const roots = new Map();
16
+ const runRoot = async (requestId, job) => {
17
+ const root = { controller: new AbortController(), reason: undefined };
18
+ roots.set(requestId, root);
19
+ const request = { ...job, rootId: job.id, parent: undefined, signal: root.controller.signal, handlerExtension: job.handlerExtension };
20
+ let output;
21
+ let failure;
22
+ try {
23
+ output = await runJob(environment, request);
24
+ }
25
+ catch (error) {
26
+ if (!(error instanceof ProblemError))
27
+ throw error;
28
+ failure = error.problem;
29
+ }
30
+ finally {
31
+ roots.delete(requestId);
32
+ }
33
+ const problem = problemAfter(root, failure);
34
+ if (problem === undefined) {
35
+ send({ kind: 'result', requestId, output });
36
+ return;
37
+ }
38
+ if (!job.async && !job.fromHandler)
39
+ environment.reportSyncEnd(syncEndOf(request, problem, 'cancel'));
40
+ send({ kind: 'problem', requestId, problem });
41
+ };
42
+ return {
43
+ run: (requestId, job) => {
44
+ void runRoot(requestId, job);
45
+ },
46
+ abort: (requestId, reason) => {
47
+ const root = roots.get(requestId);
48
+ if (root === undefined || root.reason !== undefined)
49
+ return;
50
+ root.reason = reason;
51
+ root.controller.abort(abortProblem(reason));
52
+ },
53
+ };
54
+ }
55
+ export function answerFromMain(answers, message) {
56
+ const pending = answers.get(message.requestId);
57
+ answers.delete(message.requestId);
58
+ if (message.problem === undefined)
59
+ pending?.resolve(message.value);
60
+ else
61
+ pending?.reject(new ProblemError(message.problem));
62
+ }
63
+ //# sourceMappingURL=root-runner.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"root-runner.js","sourceRoot":"","sources":["../../src/workers/root-runner.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export declare function shareKernelSdk(): void;
2
+ //# sourceMappingURL=sdk-resolution.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sdk-resolution.d.ts","sourceRoot":"","sources":["../../src/workers/sdk-resolution.ts"],"names":[],"mappings":"AAIA,wBAAgB,cAAc,IAAI,IAAI,CASrC"}
@@ -0,0 +1,14 @@
1
+ import { registerHooks } from 'node:module';
2
+ // Every `@kvman/sdk` import in a worker resolves to the kernel's own copy, so all extensions share one SDK and one zod
3
+ // (plan 02 §2.9), whatever their own node_modules hold.
4
+ export function shareKernelSdk() {
5
+ registerHooks({
6
+ resolve: (specifier, context, nextResolve) => {
7
+ if (specifier === '@kvman/sdk' || specifier.startsWith('@kvman/sdk/')) {
8
+ return nextResolve(specifier, { ...context, parentURL: import.meta.url });
9
+ }
10
+ return nextResolve(specifier, context);
11
+ },
12
+ });
13
+ }
14
+ //# sourceMappingURL=sdk-resolution.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sdk-resolution.js","sourceRoot":"","sources":["../../src/workers/sdk-resolution.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAE5C,uHAAuH;AACvH,wDAAwD;AACxD,MAAM,UAAU,cAAc;IAC5B,aAAa,CAAC;QACZ,OAAO,EAAE,CAAC,SAAS,EAAE,OAAO,EAAE,WAAW,EAAE,EAAE;YAC3C,IAAI,SAAS,KAAK,YAAY,IAAI,SAAS,CAAC,UAAU,CAAC,aAAa,CAAC,EAAE,CAAC;gBACtE,OAAO,WAAW,CAAC,SAAS,EAAE,EAAE,GAAG,OAAO,EAAE,SAAS,EAAE,MAAM,CAAC,IAAI,CAAC,GAAG,EAAE,CAAC,CAAC;YAC5E,CAAC;YACD,OAAO,WAAW,CAAC,SAAS,EAAE,OAAO,CAAC,CAAC;QACzC,CAAC;KACF,CAAC,CAAC;AACL,CAAC"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=worker-main.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"worker-main.d.ts","sourceRoot":"","sources":["../../src/workers/worker-main.ts"],"names":[],"mappings":""}
@@ -0,0 +1,123 @@
1
+ var __rewriteRelativeImportExtension = (this && this.__rewriteRelativeImportExtension) || function (path, preserveJsx) {
2
+ if (typeof path === "string" && /^\.\.?\//.test(path)) {
3
+ return path.replace(/\.(tsx)$|((?:\.d)?)((?:\.[^./]+?)?)\.([cm]?)ts$/i, function (m, tsx, d, ext, cm) {
4
+ return tsx ? preserveJsx ? ".jsx" : ".js" : d && (!ext || !cm) ? m : (d + ext + "." + cm.toLowerCase() + "js");
5
+ });
6
+ }
7
+ return path;
8
+ };
9
+ import { parentPort, workerData } from 'node:worker_threads';
10
+ import { ProblemError } from '@kvman/sdk';
11
+ import { systemClock } from "../clock.js";
12
+ import { createExtensionCtx } from "../ctx/extension-ctx.js";
13
+ import { createFiles } from "../files/files.js";
14
+ import { handlerSummaries } from "../jobs/handlers.js";
15
+ import { createIdGenerator } from "../ids.js";
16
+ import { createRegistry } from "../jobs/registry.js";
17
+ import { registerKernelApi } from "../kernel-api/register-kernel-api.js";
18
+ import { openLogFile } from "../logging/log-file.js";
19
+ import { kernelProblem } from "../problems.js";
20
+ import { openSecretsFile } from "../secrets/secrets-file.js";
21
+ import { kernelSettingDefinitions } from "../settings/kernel-settings.js";
22
+ import { checkPresetSettings } from "../settings/preset-check.js";
23
+ import { createSettings } from "../settings/settings.js";
24
+ import { openConnection } from "../storage/database.js";
25
+ import { answerFromMain, createRootRunner } from "./root-runner.js";
26
+ import { shareKernelSdk } from "./sdk-resolution.js";
27
+ import { toWorkerSchema, workerSetupSchema } from "./protocol.js";
28
+ // A worker thread: it loads every extension of the run, then runs the jobs the main thread sends it (plan 02 §2.2).
29
+ shareKernelSdk();
30
+ if (parentPort === null)
31
+ throw new Error('worker-main runs only as a worker thread');
32
+ const port = parentPort;
33
+ const setup = workerSetupSchema.parse(workerData);
34
+ // A handler sees the main thread's `process.argv`, so `process.argv[1]` is kvman's entry file (ADR 0009, 114).
35
+ process.argv.splice(0, process.argv.length, ...setup.mainArgv);
36
+ const send = (message) => port.postMessage(message);
37
+ const logFile = openLogFile(setup.home, setup.logLevel, setup.terminalLog);
38
+ const registry = createRegistry();
39
+ for (const definition of kernelSettingDefinitions(setup.languages))
40
+ registry.settings.set(definition.key, definition);
41
+ const answers = new Map();
42
+ let nextRequest = 0;
43
+ const connection = openConnection(setup.database);
44
+ const ids = createIdGenerator(systemClock);
45
+ const services = {
46
+ environment: { registry, logger: logFile.logger, reportSyncEnd: (end) => send({ kind: 'sync-ended', end }) },
47
+ ids,
48
+ request: (request) => new Promise((resolve, reject) => {
49
+ nextRequest += 1;
50
+ answers.set(nextRequest, { resolve, reject });
51
+ send({ kind: 'request', requestId: nextRequest, request });
52
+ }),
53
+ home: setup.home,
54
+ connection,
55
+ files: createFiles({ connection, home: setup.home, ids, clock: systemClock }),
56
+ logger: logFile.logger,
57
+ settings: createSettings({ connection, definitions: registry.settings, presetValues: setup.presetSettings, logger: logFile.logger }),
58
+ secrets: openSecretsFile(setup.home),
59
+ sendProgress: (rootId, chunk) => send({ kind: 'progress', rootId, chunk }),
60
+ };
61
+ const roots = createRootRunner(services.environment, send);
62
+ // The worker closes its own connection and log before it exits, so SQLite never sees a thread torn down under it.
63
+ function stop() {
64
+ connection.close();
65
+ logFile.close();
66
+ process.exit(0);
67
+ }
68
+ function isEntry(value) {
69
+ return typeof value === 'function';
70
+ }
71
+ async function loadExtension(extension) {
72
+ const module = await import(__rewriteRelativeImportExtension(extension.entryUrl));
73
+ const entry = typeof module === 'object' && module !== null && 'default' in module ? module.default : undefined;
74
+ if (!isEntry(entry))
75
+ throw kernelProblem('EXTENSION_INVALID', `${extension.name}: its entry doesn't default-export a function.`, { extension: extension.name });
76
+ entry(createExtensionCtx({ name: extension.name, namespace: extension.namespace }, services));
77
+ }
78
+ function loadProblem(extension, error) {
79
+ if (error instanceof ProblemError && error.problem.code === 'EXTENSION_INVALID')
80
+ return error.problem;
81
+ const reason = error instanceof Error ? error.message : String(error);
82
+ return { code: 'EXTENSION_INVALID', message: `${extension.name}: its entry failed (${reason}).`, params: { extension: extension.name } };
83
+ }
84
+ async function load() {
85
+ const { homeFolder, extensions } = setup;
86
+ registerKernelApi(registry, { ...services, homeFolder, registry, extensions });
87
+ for (const extension of setup.extensions) {
88
+ try {
89
+ await loadExtension(extension);
90
+ }
91
+ catch (error) {
92
+ send({ kind: 'failed', problem: loadProblem(extension, error) });
93
+ return;
94
+ }
95
+ }
96
+ registry.sealed = true;
97
+ if (setup.checkPresetSettings) {
98
+ try {
99
+ checkPresetSettings(registry.settings, setup.presetSettings);
100
+ }
101
+ catch (error) {
102
+ if (!(error instanceof ProblemError))
103
+ throw error;
104
+ send({ kind: 'failed', problem: error.problem });
105
+ return;
106
+ }
107
+ }
108
+ const jobs = [...registry.jobs.values()].map((job) => ({ name: job.name, kind: job.kind, owner: job.owner, public: job.public, retries: job.retries, syncOnly: job.syncOnly, maxInputBytes: job.maxInputBytes }));
109
+ send({ kind: 'ready', summary: { jobs, handlers: handlerSummaries(registry) } });
110
+ }
111
+ port.on('message', (raw) => {
112
+ const message = toWorkerSchema.parse(raw);
113
+ if (message.kind === 'run')
114
+ roots.run(message.requestId, message.job);
115
+ else if (message.kind === 'abort')
116
+ roots.abort(message.requestId, message.reason);
117
+ else if (message.kind === 'answer')
118
+ answerFromMain(answers, message);
119
+ else
120
+ stop();
121
+ });
122
+ await load();
123
+ //# sourceMappingURL=worker-main.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"worker-main.js","sourceRoot":"","sources":["../../src/workers/worker-main.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,17 @@
1
+ import type { Workspace } from '@kvman/sdk';
2
+ import type { IdGenerator } from '../ids.ts';
3
+ import type { Connection } from '../storage/database.ts';
4
+ export declare const homeWorkspaceId = "home";
5
+ export type ClosedWorkspaces = () => readonly string[];
6
+ export declare function outsideClosed(joiner: 'WHERE' | 'AND', closed: readonly string[]): string;
7
+ export declare function homeWorkspace(homeFolder: string): Workspace;
8
+ export declare function openWorkspaceOf(connection: Connection, homeFolder: string, id: string): Workspace;
9
+ export declare function listWorkspaces(connection: Connection, homeFolder: string): Workspace[];
10
+ export type Workspaces = ReturnType<typeof createWorkspaces>;
11
+ export declare function createWorkspaces(connection: Connection, homeFolder: string, ids: IdGenerator): {
12
+ closed: () => readonly string[];
13
+ open(folder: string, firstOpened: (workspaceId: string) => void): Workspace;
14
+ close(id: string): void;
15
+ openHomeFirstTime(firstOpened: (workspaceId: string) => void): void;
16
+ };
17
+ //# sourceMappingURL=workspaces.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"workspaces.d.ts","sourceRoot":"","sources":["../../src/workspaces/workspaces.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,YAAY,CAAC;AAC5C,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,WAAW,CAAC;AAE7C,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,wBAAwB,CAAC;AAKzD,eAAO,MAAM,eAAe,SAAS,CAAC;AAItC,MAAM,MAAM,gBAAgB,GAAG,MAAM,SAAS,MAAM,EAAE,CAAC;AAIvD,wBAAgB,aAAa,CAAC,MAAM,EAAE,OAAO,GAAG,KAAK,EAAE,MAAM,EAAE,SAAS,MAAM,EAAE,GAAG,MAAM,CAExF;AAID,wBAAgB,aAAa,CAAC,UAAU,EAAE,MAAM,GAAG,SAAS,CAE3D;AAGD,wBAAgB,eAAe,CAAC,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,GAAG,SAAS,CAKjG;AAGD,wBAAgB,cAAc,CAAC,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,MAAM,GAAG,SAAS,EAAE,CAGtF;AAeD,MAAM,MAAM,UAAU,GAAG,UAAU,CAAC,OAAO,gBAAgB,CAAC,CAAC;AAE7D,wBAAgB,gBAAgB,CAAC,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,MAAM,EAAE,GAAG,EAAE,WAAW;kBAG7E,SAAS,MAAM,EAAE;iBAGhB,MAAM,eAAe,CAAC,WAAW,EAAE,MAAM,KAAK,IAAI,GAAG,SAAS;cAgBjE,MAAM,GAAG,IAAI;mCAOQ,CAAC,WAAW,EAAE,MAAM,KAAK,IAAI,GAAG,IAAI;EAOtE"}
@@ -0,0 +1,85 @@
1
+ import { realpathSync, statSync } from 'node:fs';
2
+ import path from 'node:path';
3
+ import { kernelProblem } from "../problems.js";
4
+ // Workspaces (plan 02 §2.6, ADR 0009, 22): folders on disk, remembered across restarts. Home, the user's home folder,
5
+ // is built in and always open; closing another pauses it, and opening its path again brings back its id and data.
6
+ export const homeWorkspaceId = 'home';
7
+ // The SQL clause, joined by `WHERE` or `AND`, that leaves out rows of closed workspaces, with their ids as its
8
+ // parameters; with none closed it is empty, so the common case costs nothing.
9
+ export function outsideClosed(joiner, closed) {
10
+ return closed.length === 0 ? '' : ` ${joiner} workspace_id NOT IN (${closed.map(() => '?').join(', ')})`;
11
+ }
12
+ export function homeWorkspace(homeFolder) {
13
+ return { id: homeWorkspaceId, name: path.basename(homeFolder), path: homeFolder };
14
+ }
15
+ // The open workspace with this id; a closed or unknown one fails NOT_FOUND.
16
+ export function openWorkspaceOf(connection, homeFolder, id) {
17
+ if (id === homeWorkspaceId)
18
+ return homeWorkspace(homeFolder);
19
+ const row = connection.prepare('SELECT id, name, path FROM workspaces WHERE id = ? AND open = 1').get(id);
20
+ if (row === undefined)
21
+ throw kernelProblem('NOT_FOUND', `There is no open workspace ${id}.`, { workspaceId: id });
22
+ return row;
23
+ }
24
+ // Home, then the open workspaces in the order they were first opened (their ids are UUIDv7).
25
+ export function listWorkspaces(connection, homeFolder) {
26
+ const others = connection.prepare('SELECT id, name, path FROM workspaces WHERE open = 1 ORDER BY id').all();
27
+ return [homeWorkspace(homeFolder), ...others];
28
+ }
29
+ function realFolder(folder) {
30
+ if (!path.isAbsolute(folder))
31
+ throw kernelProblem('VALIDATION_FAILED', 'A workspace path must be absolute.', { path: folder });
32
+ let isFolder;
33
+ try {
34
+ isFolder = statSync(folder).isDirectory();
35
+ }
36
+ catch (error) {
37
+ const reason = error instanceof Error ? error.message : String(error);
38
+ throw kernelProblem('VALIDATION_FAILED', `The workspace path can't be read (${reason}).`, { path: folder });
39
+ }
40
+ if (!isFolder)
41
+ throw kernelProblem('VALIDATION_FAILED', 'A workspace path must be a folder.', { path: folder });
42
+ return realpathSync.native(folder);
43
+ }
44
+ export function createWorkspaces(connection, homeFolder, ids) {
45
+ const closed = new Set(connection.prepare('SELECT id FROM workspaces WHERE open = 0').all().map((row) => row.id));
46
+ return {
47
+ closed: () => [...closed],
48
+ // Opens a folder: Home for Home's own folder, the existing workspace for an open path, the remembered one for a
49
+ // closed path, or a new one; `firstOpened` runs in the same transaction as a new workspace's row.
50
+ open(folder, firstOpened) {
51
+ const real = realFolder(folder);
52
+ if (real === realpathSync.native(homeFolder))
53
+ return homeWorkspace(homeFolder);
54
+ return connection.transaction(() => {
55
+ const row = connection.prepare('SELECT * FROM workspaces WHERE path = ?').get(real);
56
+ if (row !== undefined) {
57
+ connection.prepare('UPDATE workspaces SET open = 1 WHERE id = ?').run(row.id);
58
+ closed.delete(row.id);
59
+ return { id: row.id, name: row.name, path: row.path };
60
+ }
61
+ const workspace = { id: ids(), name: path.basename(real), path: real };
62
+ connection.prepare('INSERT INTO workspaces (id, name, path, open) VALUES (?, ?, ?, 1)').run(workspace.id, workspace.name, workspace.path);
63
+ firstOpened(workspace.id);
64
+ return workspace;
65
+ })();
66
+ },
67
+ close(id) {
68
+ if (id === homeWorkspaceId)
69
+ throw kernelProblem('VALIDATION_FAILED', "Home can't be closed.", { workspaceId: id });
70
+ const changed = connection.prepare('UPDATE workspaces SET open = 0 WHERE id = ? AND open = 1').run(id).changes;
71
+ if (changed === 0)
72
+ throw kernelProblem('NOT_FOUND', `There is no open workspace ${id}.`, { workspaceId: id });
73
+ closed.add(id);
74
+ },
75
+ // Home counts as first opened on the first start of a new home (plan 02 §2.15).
76
+ openHomeFirstTime(firstOpened) {
77
+ connection.transaction(() => {
78
+ const marked = connection.prepare("INSERT INTO kernel_state (key, value) VALUES ('home-opened', 'true') ON CONFLICT DO NOTHING").run().changes;
79
+ if (marked === 1)
80
+ firstOpened(homeWorkspaceId);
81
+ })();
82
+ },
83
+ };
84
+ }
85
+ //# sourceMappingURL=workspaces.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"workspaces.js","sourceRoot":"","sources":["../../src/workspaces/workspaces.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,70 @@
1
+ {
2
+ "kernel.errors.VALIDATION_FAILED": "هناك قيمة غير صالحة.",
3
+ "kernel.errors.NOT_FOUND": "العنصر المطلوب غير موجود.",
4
+ "kernel.errors.NOT_PUBLIC": "هذا خاص بإضافة أخرى.",
5
+ "kernel.errors.NOT_A_COMMAND": "الأوامر وحدها يمكن وضعها في قائمة الانتظار أو جدولتها.",
6
+ "kernel.errors.READ_ONLY": "الاستعلام للقراءة فقط.",
7
+ "kernel.errors.NO_JOB": "لا يعمل هذا إلا داخل مهمة جارية.",
8
+ "kernel.errors.TOO_LARGE": "تجاوز الحد المسموح به: {limit}.",
9
+ "kernel.errors.TOO_DEEP": "تداخل الاستدعاءات أعمق من الحد المسموح به: {limit}.",
10
+ "kernel.errors.TIMEOUT": "استغرق التنفيذ وقتًا أطول من المسموح.",
11
+ "kernel.errors.CANCELLED": "تم الإلغاء.",
12
+ "kernel.errors.WORKER_CRASHED": "توقف خيط العمل الذي كان ينفّذه بشكل غير متوقع.",
13
+ "kernel.errors.INTERRUPTED": "توقف kvman أثناء التنفيذ.",
14
+ "kernel.errors.HANDLER_FAILED": "فشل التنفيذ بشكل غير متوقع. التفاصيل في السجل.",
15
+ "kernel.errors.FORBIDDEN_ORIGIN": "هذا الطلب ليس صادرًا عن kvman.",
16
+ "kernel.errors.PROCESS_RUNNING": "توجد عملية بهذا الاسم تعمل بالفعل.",
17
+ "kernel.errors.PORT_IN_USE": "المنفذ مستخدم بالفعل.",
18
+ "kernel.errors.EXTENSION_INVALID": "تعذّر تحميل إحدى الإضافات.",
19
+ "kernel.errors.KVMAN_RUNNING": "kvman يعمل بالفعل على هذا المجلد الرئيسي.",
20
+ "kernel.port.description": "المنفذ الذي يستقبل عليه kvman الاتصالات. يُطبَّق عند التشغيل التالي.",
21
+ "kernel.workers.description": "عدد خيوط العمل التي تنفّذ المهام. يُطبَّق عند التشغيل التالي.",
22
+ "kernel.workerConcurrency.description": "عدد المهام التي ينفّذها خيط العمل الواحد في الوقت نفسه. يُطبَّق عند التشغيل التالي.",
23
+ "kernel.language.description": "لغة التطبيق.",
24
+ "kernel.jobs.retentionDays.description": "عدد الأيام التي تُحفظ فيها المهام المنتهية.",
25
+ "kernel.web.home.description": "الإضافة التي يفتح kvman تطبيق الويب الخاص بها.",
26
+ "kernel.workspace.open.description": "يفتح مجلدًا كمساحة عمل.",
27
+ "kernel.workspace.open.fields.path": "المجلد",
28
+ "kernel.workspace.close.description": "يغلق مساحة عمل؛ وتبقى بياناتها إلى أن تُفتح مجددًا.",
29
+ "kernel.workspace.close.fields.workspaceId": "مساحة العمل",
30
+ "kernel.workspace.list.description": "يسرد مساحات العمل المفتوحة.",
31
+ "kernel.folder.list.description": "يسرد المجلدات الفرعية لمجلد على هذا الجهاز.",
32
+ "kernel.folder.create.description": "ينشئ مجلدًا داخل مجلد على هذا الجهاز.",
33
+ "kernel.settings.set.description": "يضبط قيمة إعداد.",
34
+ "kernel.settings.set.fields.key": "الإعداد",
35
+ "kernel.settings.set.fields.value": "القيمة",
36
+ "kernel.settings.set.fields.scope": "النطاق",
37
+ "kernel.settings.reset.description": "يزيل قيمة إعداد في نطاق واحد.",
38
+ "kernel.settings.reset.fields.key": "الإعداد",
39
+ "kernel.settings.reset.fields.scope": "النطاق",
40
+ "kernel.settings.list.description": "يسرد كل الإعدادات مع قيمها.",
41
+ "kernel.secrets.set.description": "يضبط سرًّا لإحدى الإضافات.",
42
+ "kernel.secrets.set.fields.extension": "الإضافة",
43
+ "kernel.secrets.set.fields.name": "الاسم",
44
+ "kernel.secrets.set.fields.value": "القيمة",
45
+ "kernel.secrets.delete.description": "يحذف سرًّا لإحدى الإضافات.",
46
+ "kernel.secrets.delete.fields.extension": "الإضافة",
47
+ "kernel.secrets.delete.fields.name": "الاسم",
48
+ "kernel.secrets.list.description": "يسرد أسماء الأسرار، دون قيمها أبدًا.",
49
+ "kernel.jobs.get.description": "يعيد مهمة واحدة.",
50
+ "kernel.jobs.list.description": "يسرد مهام مساحة العمل الحالية، الأحدث أولًا.",
51
+ "kernel.files.get.description": "يعيد ملفًا من مساحة العمل الحالية.",
52
+ "kernel.files.list.description": "يسرد ملفات مساحة العمل الحالية، الأحدث أولًا.",
53
+ "kernel.files.unlink.description": "يحذف ملفًا من مساحة العمل الحالية.",
54
+ "kernel.files.unlink.fields.id": "الملف",
55
+ "kernel.extensions.list.description": "يسرد إضافات التشغيل الحالي وما تسجّله.",
56
+ "kernel.registrations.list.description": "يسرد كل أوامر التشغيل الحالي واستعلاماته مع مالك كلٍّ منها، دون المخططات.",
57
+ "kernel.preset.get.description": "يعيد الإعداد المسبق الحالي كما هو مخزَّن الآن.",
58
+ "kernel.extensions.install.description": "يضيف إضافة إلى ملف الإعداد المسبق؛ وتُطبَّق عند التشغيل التالي.",
59
+ "kernel.extensions.uninstall.description": "يزيل إضافة من ملف الإعداد المسبق؛ وتُطبَّق الإزالة عند التشغيل التالي.",
60
+ "kernel.restart.description": "يطلب من kvman إعادة التشغيل: يتوقف ثم يبدأ من جديد في العملية نفسها.",
61
+ "kernel.processes.list.description": "يسرد العمليات طويلة الأمد الجارية.",
62
+ "kernel.health.get.description": "يصف حالة kvman الجاري.",
63
+ "kernel.title": "kvman",
64
+ "kernel.port.title": "المنفذ",
65
+ "kernel.workers.title": "خيوط العمل",
66
+ "kernel.workerConcurrency.title": "المهام لكل خيط عمل",
67
+ "kernel.language.title": "اللغة",
68
+ "kernel.jobs.retentionDays.title": "مدة الاحتفاظ بالمهام المنتهية (بالأيام)",
69
+ "kernel.web.home.title": "تطبيق الويب"
70
+ }