@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.
- package/LICENSE +21 -0
- package/README.md +11 -0
- package/dist/clock.d.ts +8 -0
- package/dist/clock.d.ts.map +1 -0
- package/dist/clock.js +13 -0
- package/dist/clock.js.map +1 -0
- package/dist/ctx/extension-ctx.d.ts +22 -0
- package/dist/ctx/extension-ctx.d.ts.map +1 -0
- package/dist/ctx/extension-ctx.js +78 -0
- package/dist/ctx/extension-ctx.js.map +1 -0
- package/dist/ctx/files-calls.d.ts +5 -0
- package/dist/ctx/files-calls.d.ts.map +1 -0
- package/dist/ctx/files-calls.js +26 -0
- package/dist/ctx/files-calls.js.map +1 -0
- package/dist/ctx/job-calls.d.ts +12 -0
- package/dist/ctx/job-calls.d.ts.map +1 -0
- package/dist/ctx/job-calls.js +73 -0
- package/dist/ctx/job-calls.js.map +1 -0
- package/dist/ctx/processes-calls.d.ts +11 -0
- package/dist/ctx/processes-calls.d.ts.map +1 -0
- package/dist/ctx/processes-calls.js +50 -0
- package/dist/ctx/processes-calls.js.map +1 -0
- package/dist/ctx/settings-calls.d.ts +5 -0
- package/dist/ctx/settings-calls.d.ts.map +1 -0
- package/dist/ctx/settings-calls.js +30 -0
- package/dist/ctx/settings-calls.js.map +1 -0
- package/dist/extensions/load-order.d.ts +13 -0
- package/dist/extensions/load-order.d.ts.map +1 -0
- package/dist/extensions/load-order.js +111 -0
- package/dist/extensions/load-order.js.map +1 -0
- package/dist/extensions/manifests.d.ts +16 -0
- package/dist/extensions/manifests.d.ts.map +1 -0
- package/dist/extensions/manifests.js +50 -0
- package/dist/extensions/manifests.js.map +1 -0
- package/dist/extensions/npm-install.d.ts +9 -0
- package/dist/extensions/npm-install.d.ts.map +1 -0
- package/dist/extensions/npm-install.js +39 -0
- package/dist/extensions/npm-install.js.map +1 -0
- package/dist/extensions/trust.d.ts +11 -0
- package/dist/extensions/trust.d.ts.map +1 -0
- package/dist/extensions/trust.js +27 -0
- package/dist/extensions/trust.js.map +1 -0
- package/dist/files/file-access.d.ts +6 -0
- package/dist/files/file-access.d.ts.map +1 -0
- package/dist/files/file-access.js +21 -0
- package/dist/files/file-access.js.map +1 -0
- package/dist/files/files.d.ts +31 -0
- package/dist/files/files.d.ts.map +1 -0
- package/dist/files/files.js +73 -0
- package/dist/files/files.js.map +1 -0
- package/dist/http/call-routes.d.ts +4 -0
- package/dist/http/call-routes.d.ts.map +1 -0
- package/dist/http/call-routes.js +72 -0
- package/dist/http/call-routes.js.map +1 -0
- package/dist/http/envelope.d.ts +8 -0
- package/dist/http/envelope.d.ts.map +1 -0
- package/dist/http/envelope.js +17 -0
- package/dist/http/envelope.js.map +1 -0
- package/dist/http/file-routes.d.ts +5 -0
- package/dist/http/file-routes.d.ts.map +1 -0
- package/dist/http/file-routes.js +47 -0
- package/dist/http/file-routes.js.map +1 -0
- package/dist/http/http-app.d.ts +11 -0
- package/dist/http/http-app.d.ts.map +1 -0
- package/dist/http/http-app.js +31 -0
- package/dist/http/http-app.js.map +1 -0
- package/dist/http/http-server.d.ts +9 -0
- package/dist/http/http-server.d.ts.map +1 -0
- package/dist/http/http-server.js +38 -0
- package/dist/http/http-server.js.map +1 -0
- package/dist/http/job-events.d.ts +18 -0
- package/dist/http/job-events.d.ts.map +1 -0
- package/dist/http/job-events.js +48 -0
- package/dist/http/job-events.js.map +1 -0
- package/dist/http/job-routes.d.ts +4 -0
- package/dist/http/job-routes.d.ts.map +1 -0
- package/dist/http/job-routes.js +20 -0
- package/dist/http/job-routes.js.map +1 -0
- package/dist/http/own-origin.d.ts +2 -0
- package/dist/http/own-origin.d.ts.map +1 -0
- package/dist/http/own-origin.js +9 -0
- package/dist/http/own-origin.js.map +1 -0
- package/dist/http/request-body.d.ts +19 -0
- package/dist/http/request-body.d.ts.map +1 -0
- package/dist/http/request-body.js +72 -0
- package/dist/http/request-body.js.map +1 -0
- package/dist/http/static-files.d.ts +3 -0
- package/dist/http/static-files.d.ts.map +1 -0
- package/dist/http/static-files.js +35 -0
- package/dist/http/static-files.js.map +1 -0
- package/dist/http/web-routes.d.ts +4 -0
- package/dist/http/web-routes.d.ts.map +1 -0
- package/dist/http/web-routes.js +23 -0
- package/dist/http/web-routes.js.map +1 -0
- package/dist/ids.d.ts +6 -0
- package/dist/ids.d.ts.map +1 -0
- package/dist/ids.js +42 -0
- package/dist/ids.js.map +1 -0
- package/dist/index.d.ts +13 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +8 -0
- package/dist/index.js.map +1 -0
- package/dist/jobs/current-job.d.ts +19 -0
- package/dist/jobs/current-job.d.ts.map +1 -0
- package/dist/jobs/current-job.js +20 -0
- package/dist/jobs/current-job.js.map +1 -0
- package/dist/jobs/dispatcher.d.ts +40 -0
- package/dist/jobs/dispatcher.d.ts.map +1 -0
- package/dist/jobs/dispatcher.js +201 -0
- package/dist/jobs/dispatcher.js.map +1 -0
- package/dist/jobs/handlers.d.ts +19 -0
- package/dist/jobs/handlers.d.ts.map +1 -0
- package/dist/jobs/handlers.js +54 -0
- package/dist/jobs/handlers.js.map +1 -0
- package/dist/jobs/job-rows.d.ts +63 -0
- package/dist/jobs/job-rows.d.ts.map +1 -0
- package/dist/jobs/job-rows.js +111 -0
- package/dist/jobs/job-rows.js.map +1 -0
- package/dist/jobs/progress-hub.d.ts +12 -0
- package/dist/jobs/progress-hub.d.ts.map +1 -0
- package/dist/jobs/progress-hub.js +40 -0
- package/dist/jobs/progress-hub.js.map +1 -0
- package/dist/jobs/registry.d.ts +38 -0
- package/dist/jobs/registry.d.ts.map +1 -0
- package/dist/jobs/registry.js +89 -0
- package/dist/jobs/registry.js.map +1 -0
- package/dist/jobs/retry-policy.d.ts +4 -0
- package/dist/jobs/retry-policy.d.ts.map +1 -0
- package/dist/jobs/retry-policy.js +10 -0
- package/dist/jobs/retry-policy.js.map +1 -0
- package/dist/jobs/run-job.d.ts +26 -0
- package/dist/jobs/run-job.d.ts.map +1 -0
- package/dist/jobs/run-job.js +120 -0
- package/dist/jobs/run-job.js.map +1 -0
- package/dist/kernel-api/extensions-api.d.ts +4 -0
- package/dist/kernel-api/extensions-api.d.ts.map +1 -0
- package/dist/kernel-api/extensions-api.js +32 -0
- package/dist/kernel-api/extensions-api.js.map +1 -0
- package/dist/kernel-api/folder-api.d.ts +4 -0
- package/dist/kernel-api/folder-api.d.ts.map +1 -0
- package/dist/kernel-api/folder-api.js +54 -0
- package/dist/kernel-api/folder-api.js.map +1 -0
- package/dist/kernel-api/folder-name.d.ts +3 -0
- package/dist/kernel-api/folder-name.d.ts.map +1 -0
- package/dist/kernel-api/folder-name.js +26 -0
- package/dist/kernel-api/folder-name.js.map +1 -0
- package/dist/kernel-api/health-api.d.ts +4 -0
- package/dist/kernel-api/health-api.d.ts.map +1 -0
- package/dist/kernel-api/health-api.js +8 -0
- package/dist/kernel-api/health-api.js.map +1 -0
- package/dist/kernel-api/jobs-files-api.d.ts +4 -0
- package/dist/kernel-api/jobs-files-api.d.ts.map +1 -0
- package/dist/kernel-api/jobs-files-api.js +18 -0
- package/dist/kernel-api/jobs-files-api.js.map +1 -0
- package/dist/kernel-api/json-schemas.d.ts +3 -0
- package/dist/kernel-api/json-schemas.d.ts.map +1 -0
- package/dist/kernel-api/json-schemas.js +16 -0
- package/dist/kernel-api/json-schemas.js.map +1 -0
- package/dist/kernel-api/kernel-api-services.d.ts +17 -0
- package/dist/kernel-api/kernel-api-services.d.ts.map +1 -0
- package/dist/kernel-api/kernel-api-services.js +2 -0
- package/dist/kernel-api/kernel-api-services.js.map +1 -0
- package/dist/kernel-api/kernel-registrations.d.ts +19 -0
- package/dist/kernel-api/kernel-registrations.d.ts.map +1 -0
- package/dist/kernel-api/kernel-registrations.js +14 -0
- package/dist/kernel-api/kernel-registrations.js.map +1 -0
- package/dist/kernel-api/preset-api.d.ts +4 -0
- package/dist/kernel-api/preset-api.d.ts.map +1 -0
- package/dist/kernel-api/preset-api.js +10 -0
- package/dist/kernel-api/preset-api.js.map +1 -0
- package/dist/kernel-api/register-kernel-api.d.ts +4 -0
- package/dist/kernel-api/register-kernel-api.d.ts.map +1 -0
- package/dist/kernel-api/register-kernel-api.js +24 -0
- package/dist/kernel-api/register-kernel-api.js.map +1 -0
- package/dist/kernel-api/restart-api.d.ts +4 -0
- package/dist/kernel-api/restart-api.d.ts.map +1 -0
- package/dist/kernel-api/restart-api.js +10 -0
- package/dist/kernel-api/restart-api.js.map +1 -0
- package/dist/kernel-api/secrets-api.d.ts +4 -0
- package/dist/kernel-api/secrets-api.d.ts.map +1 -0
- package/dist/kernel-api/secrets-api.js +23 -0
- package/dist/kernel-api/secrets-api.js.map +1 -0
- package/dist/kernel-api/settings-api.d.ts +4 -0
- package/dist/kernel-api/settings-api.d.ts.map +1 -0
- package/dist/kernel-api/settings-api.js +33 -0
- package/dist/kernel-api/settings-api.js.map +1 -0
- package/dist/kernel-api/workspace-api.d.ts +4 -0
- package/dist/kernel-api/workspace-api.d.ts.map +1 -0
- package/dist/kernel-api/workspace-api.js +13 -0
- package/dist/kernel-api/workspace-api.js.map +1 -0
- package/dist/kernel-lifecycle.d.ts +8 -0
- package/dist/kernel-lifecycle.d.ts.map +1 -0
- package/dist/kernel-lifecycle.js +56 -0
- package/dist/kernel-lifecycle.js.map +1 -0
- package/dist/kernel-requests.d.ts +25 -0
- package/dist/kernel-requests.d.ts.map +1 -0
- package/dist/kernel-requests.js +63 -0
- package/dist/kernel-requests.js.map +1 -0
- package/dist/kernel-version.d.ts +2 -0
- package/dist/kernel-version.d.ts.map +1 -0
- package/dist/kernel-version.js +8 -0
- package/dist/kernel-version.js.map +1 -0
- package/dist/kernel-web.d.ts +36 -0
- package/dist/kernel-web.d.ts.map +1 -0
- package/dist/kernel-web.js +26 -0
- package/dist/kernel-web.js.map +1 -0
- package/dist/kernel.d.ts +44 -0
- package/dist/kernel.d.ts.map +1 -0
- package/dist/kernel.js +157 -0
- package/dist/kernel.js.map +1 -0
- package/dist/limits.d.ts +6 -0
- package/dist/limits.d.ts.map +1 -0
- package/dist/limits.js +8 -0
- package/dist/limits.js.map +1 -0
- package/dist/localization/catalogs.d.ts +15 -0
- package/dist/localization/catalogs.d.ts.map +1 -0
- package/dist/localization/catalogs.js +66 -0
- package/dist/localization/catalogs.js.map +1 -0
- package/dist/logging/log-file.d.ts +7 -0
- package/dist/logging/log-file.d.ts.map +1 -0
- package/dist/logging/log-file.js +12 -0
- package/dist/logging/log-file.js.map +1 -0
- package/dist/logging/logger.d.ts +12 -0
- package/dist/logging/logger.d.ts.map +1 -0
- package/dist/logging/logger.js +14 -0
- package/dist/logging/logger.js.map +1 -0
- package/dist/logging/terminal-lines.d.ts +4 -0
- package/dist/logging/terminal-lines.d.ts.map +1 -0
- package/dist/logging/terminal-lines.js +16 -0
- package/dist/logging/terminal-lines.js.map +1 -0
- package/dist/preset-edit/install-source.d.ts +8 -0
- package/dist/preset-edit/install-source.d.ts.map +1 -0
- package/dist/preset-edit/install-source.js +36 -0
- package/dist/preset-edit/install-source.js.map +1 -0
- package/dist/preset-edit/preset-backup.d.ts +10 -0
- package/dist/preset-edit/preset-backup.d.ts.map +1 -0
- package/dist/preset-edit/preset-backup.js +45 -0
- package/dist/preset-edit/preset-backup.js.map +1 -0
- package/dist/preset-edit/preset-files.d.ts +6 -0
- package/dist/preset-edit/preset-files.d.ts.map +1 -0
- package/dist/preset-edit/preset-files.js +56 -0
- package/dist/preset-edit/preset-files.js.map +1 -0
- package/dist/preset-edit/preset-source.d.ts +7 -0
- package/dist/preset-edit/preset-source.d.ts.map +1 -0
- package/dist/preset-edit/preset-source.js +2 -0
- package/dist/preset-edit/preset-source.js.map +1 -0
- package/dist/preset-edit/preset-store.d.ts +22 -0
- package/dist/preset-edit/preset-store.d.ts.map +1 -0
- package/dist/preset-edit/preset-store.js +70 -0
- package/dist/preset-edit/preset-store.js.map +1 -0
- package/dist/problems.d.ts +3 -0
- package/dist/problems.d.ts.map +1 -0
- package/dist/problems.js +6 -0
- package/dist/problems.js.map +1 -0
- package/dist/processes/process-kill.d.ts +16 -0
- package/dist/processes/process-kill.d.ts.map +1 -0
- package/dist/processes/process-kill.js +45 -0
- package/dist/processes/process-kill.js.map +1 -0
- package/dist/processes/process-log.d.ts +10 -0
- package/dist/processes/process-log.d.ts.map +1 -0
- package/dist/processes/process-log.js +41 -0
- package/dist/processes/process-log.js.map +1 -0
- package/dist/processes/process-rows.d.ts +11 -0
- package/dist/processes/process-rows.d.ts.map +1 -0
- package/dist/processes/process-rows.js +21 -0
- package/dist/processes/process-rows.js.map +1 -0
- package/dist/processes/process-service.d.ts +30 -0
- package/dist/processes/process-service.d.ts.map +1 -0
- package/dist/processes/process-service.js +110 -0
- package/dist/processes/process-service.js.map +1 -0
- package/dist/reload/reload-extensions.d.ts +5 -0
- package/dist/reload/reload-extensions.d.ts.map +1 -0
- package/dist/reload/reload-extensions.js +25 -0
- package/dist/reload/reload-extensions.js.map +1 -0
- package/dist/reload/watcher.d.ts +7 -0
- package/dist/reload/watcher.d.ts.map +1 -0
- package/dist/reload/watcher.js +40 -0
- package/dist/reload/watcher.js.map +1 -0
- package/dist/run/extension-run.d.ts +36 -0
- package/dist/run/extension-run.d.ts.map +1 -0
- package/dist/run/extension-run.js +81 -0
- package/dist/run/extension-run.js.map +1 -0
- package/dist/schedules/schedule-rows.d.ts +27 -0
- package/dist/schedules/schedule-rows.d.ts.map +1 -0
- package/dist/schedules/schedule-rows.js +70 -0
- package/dist/schedules/schedule-rows.js.map +1 -0
- package/dist/sdk-version.d.ts +2 -0
- package/dist/sdk-version.d.ts.map +1 -0
- package/dist/sdk-version.js +10 -0
- package/dist/sdk-version.js.map +1 -0
- package/dist/secrets/secrets-file.d.ts +11 -0
- package/dist/secrets/secrets-file.d.ts.map +1 -0
- package/dist/secrets/secrets-file.js +50 -0
- package/dist/secrets/secrets-file.js.map +1 -0
- package/dist/settings/kernel-settings.d.ts +4 -0
- package/dist/settings/kernel-settings.d.ts.map +1 -0
- package/dist/settings/kernel-settings.js +20 -0
- package/dist/settings/kernel-settings.js.map +1 -0
- package/dist/settings/preset-check.d.ts +4 -0
- package/dist/settings/preset-check.d.ts.map +1 -0
- package/dist/settings/preset-check.js +19 -0
- package/dist/settings/preset-check.js.map +1 -0
- package/dist/settings/settings.d.ts +31 -0
- package/dist/settings/settings.d.ts.map +1 -0
- package/dist/settings/settings.js +68 -0
- package/dist/settings/settings.js.map +1 -0
- package/dist/storage/database.d.ts +6 -0
- package/dist/storage/database.d.ts.map +1 -0
- package/dist/storage/database.js +31 -0
- package/dist/storage/database.js.map +1 -0
- package/dist/storage/schema.d.ts +2 -0
- package/dist/storage/schema.d.ts.map +1 -0
- package/dist/storage/schema.js +108 -0
- package/dist/storage/schema.js.map +1 -0
- package/dist/store/collections.d.ts +6 -0
- package/dist/store/collections.d.ts.map +1 -0
- package/dist/store/collections.js +63 -0
- package/dist/store/collections.js.map +1 -0
- package/dist/store/filters.d.ts +10 -0
- package/dist/store/filters.d.ts.map +1 -0
- package/dist/store/filters.js +40 -0
- package/dist/store/filters.js.map +1 -0
- package/dist/store/json-values.d.ts +6 -0
- package/dist/store/json-values.d.ts.map +1 -0
- package/dist/store/json-values.js +20 -0
- package/dist/store/json-values.js.map +1 -0
- package/dist/store/kv.d.ts +9 -0
- package/dist/store/kv.d.ts.map +1 -0
- package/dist/store/kv.js +23 -0
- package/dist/store/kv.js.map +1 -0
- package/dist/store/store.d.ts +11 -0
- package/dist/store/store.d.ts.map +1 -0
- package/dist/store/store.js +62 -0
- package/dist/store/store.js.map +1 -0
- package/dist/wasm-code-gc.d.ts +2 -0
- package/dist/wasm-code-gc.d.ts.map +1 -0
- package/dist/wasm-code-gc.js +9 -0
- package/dist/wasm-code-gc.js.map +1 -0
- package/dist/workers/pool.d.ts +31 -0
- package/dist/workers/pool.d.ts.map +1 -0
- package/dist/workers/pool.js +208 -0
- package/dist/workers/pool.js.map +1 -0
- package/dist/workers/protocol.d.ts +431 -0
- package/dist/workers/protocol.d.ts.map +1 -0
- package/dist/workers/protocol.js +93 -0
- package/dist/workers/protocol.js.map +1 -0
- package/dist/workers/root-runner.d.ts +15 -0
- package/dist/workers/root-runner.d.ts.map +1 -0
- package/dist/workers/root-runner.js +63 -0
- package/dist/workers/root-runner.js.map +1 -0
- package/dist/workers/sdk-resolution.d.ts +2 -0
- package/dist/workers/sdk-resolution.d.ts.map +1 -0
- package/dist/workers/sdk-resolution.js +14 -0
- package/dist/workers/sdk-resolution.js.map +1 -0
- package/dist/workers/worker-main.d.ts +2 -0
- package/dist/workers/worker-main.d.ts.map +1 -0
- package/dist/workers/worker-main.js +123 -0
- package/dist/workers/worker-main.js.map +1 -0
- package/dist/workspaces/workspaces.d.ts +17 -0
- package/dist/workspaces/workspaces.d.ts.map +1 -0
- package/dist/workspaces/workspaces.js +85 -0
- package/dist/workspaces/workspaces.js.map +1 -0
- package/locales/ar.json +70 -0
- package/locales/en.json +70 -0
- 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 @@
|
|
|
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 @@
|
|
|
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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"}
|
package/locales/ar.json
ADDED
|
@@ -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
|
+
}
|