@amalgm/shell 0.1.162 → 0.1.163
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/PURPOSE.md +98 -14
- package/README.md +16 -0
- package/dist/authorization/recovery-host.d.ts +1 -0
- package/dist/authorization/recovery-host.js +2 -3
- package/dist/authorization/recovery-host.js.map +1 -1
- package/dist/cli-arguments.d.ts +8 -0
- package/dist/cli-arguments.js +47 -0
- package/dist/cli-arguments.js.map +1 -0
- package/dist/cli.d.ts +6 -4
- package/dist/cli.js +85 -73
- package/dist/cli.js.map +1 -1
- package/dist/compose.js +4 -3
- package/dist/compose.js.map +1 -1
- package/dist/development/profile.d.ts +27 -0
- package/dist/development/profile.js +142 -0
- package/dist/development/profile.js.map +1 -0
- package/dist/files-register-host.d.ts +1 -0
- package/dist/files-register-host.js +1 -0
- package/dist/files-register-host.js.map +1 -1
- package/dist/installation/environment.d.ts +30 -0
- package/dist/installation/environment.js +28 -0
- package/dist/installation/environment.js.map +1 -0
- package/dist/installation/lease.d.ts +6 -0
- package/dist/installation/lease.js +28 -0
- package/dist/installation/lease.js.map +1 -0
- package/dist/installation/ownership.d.ts +30 -0
- package/dist/installation/ownership.js +156 -0
- package/dist/installation/ownership.js.map +1 -0
- package/dist/installation/selection.d.ts +8 -0
- package/dist/installation/selection.js +29 -0
- package/dist/installation/selection.js.map +1 -0
- package/dist/machine-host.d.ts +26 -5
- package/dist/machine-host.js +192 -69
- package/dist/machine-host.js.map +1 -1
- package/dist/main.js +56 -2
- package/dist/main.js.map +1 -1
- package/dist/platform-product-host.d.ts +9 -9
- package/dist/platform-product-host.js +17 -17
- package/dist/platform-product-host.js.map +1 -1
- package/dist/platform-tools.d.ts +4 -3
- package/dist/platform-tools.js +34 -37
- package/dist/platform-tools.js.map +1 -1
- package/dist/process-lifecycle.d.ts +8 -0
- package/dist/process-lifecycle.js +32 -0
- package/dist/process-lifecycle.js.map +1 -0
- package/dist/runtime-command-host.d.ts +7 -0
- package/dist/runtime-command-host.js +49 -13
- package/dist/runtime-command-host.js.map +1 -1
- package/dist/service/adapter.d.ts +36 -0
- package/dist/service/adapter.js +24 -0
- package/dist/service/adapter.js.map +1 -0
- package/dist/service/cli.d.ts +8 -0
- package/dist/service/cli.js +196 -0
- package/dist/service/cli.js.map +1 -0
- package/dist/service/control.d.ts +29 -0
- package/dist/service/control.js +68 -0
- package/dist/service/control.js.map +1 -0
- package/dist/service/index.d.ts +9 -0
- package/dist/service/index.js +10 -0
- package/dist/service/index.js.map +1 -0
- package/dist/service/keepalive.d.ts +11 -0
- package/dist/service/keepalive.js +180 -0
- package/dist/service/keepalive.js.map +1 -0
- package/dist/service/launchd.d.ts +9 -0
- package/dist/service/launchd.js +105 -0
- package/dist/service/launchd.js.map +1 -0
- package/dist/service/owner.d.ts +4 -0
- package/dist/service/owner.js +14 -0
- package/dist/service/owner.js.map +1 -0
- package/dist/service/portable.d.ts +10 -0
- package/dist/service/portable.js +32 -0
- package/dist/service/portable.js.map +1 -0
- package/dist/service/registration.d.ts +82 -0
- package/dist/service/registration.js +114 -0
- package/dist/service/registration.js.map +1 -0
- package/dist/service/systemd.d.ts +9 -0
- package/dist/service/systemd.js +94 -0
- package/dist/service/systemd.js.map +1 -0
- package/dist/service/windows-task.d.ts +16 -0
- package/dist/service/windows-task.js +82 -0
- package/dist/service/windows-task.js.map +1 -0
- package/dist/service/windows.d.ts +2 -0
- package/dist/service/windows.js +65 -0
- package/dist/service/windows.js.map +1 -0
- package/dist/user-ground-host.d.ts +3 -0
- package/dist/user-ground-host.js +13 -0
- package/dist/user-ground-host.js.map +1 -1
- package/npm-shrinkwrap.json +49 -83
- package/package.json +9 -9
package/dist/compose.js
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import { timingSafeEqual } from "node:crypto";
|
|
2
2
|
import { homedir as osHomedir } from "node:os";
|
|
3
3
|
import { join, resolve } from "node:path";
|
|
4
|
-
import { PRIMITIVE_DIRS, productStateDirEnvVar, resolveProductStateDir, scopedAmalgmDir, } from "@amalgm/core/identity";
|
|
4
|
+
import { PRIMITIVE_DIRS, productStateDirEnvVar, resolveProductStateDir, scopedAmalgmDir, runtimeBindingFromEnvironment, runtimeRootSegments, } from "@amalgm/core/identity";
|
|
5
5
|
import { guardBearerRequest } from "@amalgm/core/transport";
|
|
6
6
|
/**
|
|
7
7
|
* Assemble the shell: one identity resolution and one auth guard, both owned
|
|
@@ -10,7 +10,8 @@ import { guardBearerRequest } from "@amalgm/core/transport";
|
|
|
10
10
|
export function composeShell(config = {}) {
|
|
11
11
|
const env = config.env ?? process.env;
|
|
12
12
|
const home = config.homedir ?? osHomedir();
|
|
13
|
-
const
|
|
13
|
+
const binding = runtimeBindingFromEnvironment(env);
|
|
14
|
+
const amalgmRoot = config.amalgmRoot ?? env.AMALGM_ROOT ?? join(home, ...runtimeRootSegments(binding));
|
|
14
15
|
const userScope = config.userEmail ?? config.scope ?? env.AMALGM_USER_EMAIL ?? "local";
|
|
15
16
|
// Core owns the portable `/` grammar; Shell turns it into a physical host
|
|
16
17
|
// path at the filesystem-effect boundary.
|
|
@@ -21,7 +22,7 @@ export function composeShell(config = {}) {
|
|
|
21
22
|
const described = resolveProductStateDir({
|
|
22
23
|
product: primitive,
|
|
23
24
|
primitive,
|
|
24
|
-
env,
|
|
25
|
+
env: { ...env, AMALGM_ROOT: amalgmRoot },
|
|
25
26
|
homedir: amalgmRoot,
|
|
26
27
|
scope: userScope,
|
|
27
28
|
});
|
package/dist/compose.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"compose.js","sourceRoot":"","sources":["../src/compose.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAE,MAAM,aAAa,CAAC;AAC9C,OAAO,EAAE,OAAO,IAAI,SAAS,EAAE,MAAM,SAAS,CAAC;AAC/C,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAE1C,OAAO,EACL,cAAc,EACd,qBAAqB,EACrB,sBAAsB,EACtB,eAAe,
|
|
1
|
+
{"version":3,"file":"compose.js","sourceRoot":"","sources":["../src/compose.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAE,MAAM,aAAa,CAAC;AAC9C,OAAO,EAAE,OAAO,IAAI,SAAS,EAAE,MAAM,SAAS,CAAC;AAC/C,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAE1C,OAAO,EACL,cAAc,EACd,qBAAqB,EACrB,sBAAsB,EACtB,eAAe,EACf,6BAA6B,EAC7B,mBAAmB,GACpB,MAAM,uBAAuB,CAAC;AAC/B,OAAO,EAAE,kBAAkB,EAAE,MAAM,wBAAwB,CAAC;AA8B5D;;;GAGG;AACH,MAAM,UAAU,YAAY,CAAC,SAAsB,EAAE;IACnD,MAAM,GAAG,GAAG,MAAM,CAAC,GAAG,IAAI,OAAO,CAAC,GAAG,CAAC;IACtC,MAAM,IAAI,GAAG,MAAM,CAAC,OAAO,IAAI,SAAS,EAAE,CAAC;IAC3C,MAAM,OAAO,GAAG,6BAA6B,CAAC,GAAG,CAAC,CAAC;IACnD,MAAM,UAAU,GAAG,MAAM,CAAC,UAAU,IAAI,GAAG,CAAC,WAAW,IAAI,IAAI,CAAC,IAAI,EAAE,GAAG,mBAAmB,CAAC,OAAO,CAAC,CAAC,CAAC;IACvG,MAAM,SAAS,GAAG,MAAM,CAAC,SAAS,IAAI,MAAM,CAAC,KAAK,IAAI,GAAG,CAAC,iBAAiB,IAAI,OAAO,CAAC;IACvF,0EAA0E;IAC1E,0CAA0C;IAC1C,MAAM,OAAO,GAAG,OAAO,CAAC,eAAe,CAAC,UAAU,EAAE,SAAS,CAAC,CAAC,CAAC;IAChE,MAAM,QAAQ,GAAG,MAAM,CAAC,QAAQ,IAAI,GAAG,CAAC,gBAAgB,IAAI,cAAc,CAAC;IAE3E,MAAM,SAAS,GAA2B,EAAE,CAAC;IAC7C,KAAK,MAAM,SAAS,IAAI,cAAc,EAAE,CAAC;QACvC,MAAM,SAAS,GAAG,sBAAsB,CAAC;YACvC,OAAO,EAAE,SAAS;YAClB,SAAS;YACT,GAAG,EAAE,EAAE,GAAG,GAAG,EAAE,WAAW,EAAE,UAAU,EAAE;YACxC,OAAO,EAAE,UAAU;YACnB,KAAK,EAAE,SAAS;SACjB,CAAC,CAAC;QACH,SAAS,CAAC,SAAS,CAAC,GAAG,GAAG,CAAC,qBAAqB,CAAC,SAAS,CAAC,CAAC;YAC1D,CAAC,CAAC,SAAS;YACX,CAAC,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC;IACzB,CAAC;IAED,MAAM,KAAK,GAA2B,CAAC,OAAO,EAAE,EAAE,CAChD,kBAAkB,CAAC;QACjB,yEAAyE;QACzE,OAAO;QACP,aAAa,EAAE,MAAM,CAAC,YAAY,IAAI,EAAE;QACxC,eAAe;KAChB,CAAC,CAAC;IAEL,OAAO,EAAE,UAAU,EAAE,OAAO,EAAE,QAAQ,EAAE,SAAS,EAAE,KAAK,EAAE,CAAC;AAC7D,CAAC"}
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
export interface LocalSource {
|
|
2
|
+
readonly root: string;
|
|
3
|
+
readonly kind: 'source' | 'fixture';
|
|
4
|
+
readonly commit: string | null;
|
|
5
|
+
readonly dirty: boolean;
|
|
6
|
+
}
|
|
7
|
+
export interface DevelopmentProfile {
|
|
8
|
+
readonly file: string;
|
|
9
|
+
readonly branch: string;
|
|
10
|
+
readonly localSession: string;
|
|
11
|
+
readonly sources: Readonly<Record<string, LocalSource>>;
|
|
12
|
+
readonly services: readonly string[];
|
|
13
|
+
readonly endpoints: Readonly<Record<string, string>>;
|
|
14
|
+
readonly uiRoot?: string;
|
|
15
|
+
readonly environmentFile?: string;
|
|
16
|
+
}
|
|
17
|
+
/** A local profile is an explicit source selection. It cannot silently import
|
|
18
|
+
* an omitted private product from the registry or use a hosted service. */
|
|
19
|
+
export declare function readDevelopmentProfile(file: string, shellRoot: string): DevelopmentProfile;
|
|
20
|
+
/** The profile records only this path; secrets never enter its metadata. */
|
|
21
|
+
export declare function readDevelopmentEnvironment(profile: DevelopmentProfile): Record<string, string | undefined>;
|
|
22
|
+
/** Register before importing any Amalgm SDK. The hook covers transitive imports
|
|
23
|
+
* too, so an installed registry package cannot conceal an omitted local brick. */
|
|
24
|
+
export declare function installLocalSourceResolver(profile: DevelopmentProfile): {
|
|
25
|
+
deregister(): void;
|
|
26
|
+
};
|
|
27
|
+
export declare function developmentArguments(args: readonly string[], profile: DevelopmentProfile): string[];
|
|
@@ -0,0 +1,142 @@
|
|
|
1
|
+
import { createHash } from 'node:crypto';
|
|
2
|
+
import { spawnSync } from 'node:child_process';
|
|
3
|
+
import { existsSync, readFileSync, realpathSync } from 'node:fs';
|
|
4
|
+
import * as modules from 'node:module';
|
|
5
|
+
import { dirname, isAbsolute, join, relative, resolve } from 'node:path';
|
|
6
|
+
import { fileURLToPath, pathToFileURL } from 'node:url';
|
|
7
|
+
import { parseEnv } from 'node:util';
|
|
8
|
+
/** A local profile is an explicit source selection. It cannot silently import
|
|
9
|
+
* an omitted private product from the registry or use a hosted service. */
|
|
10
|
+
export function readDevelopmentProfile(file, shellRoot) {
|
|
11
|
+
const profileFile = realpathSync(file);
|
|
12
|
+
const raw = JSON.parse(readFileSync(profileFile, 'utf8'));
|
|
13
|
+
if (raw.version !== 1 || !raw.sources || typeof raw.sources !== 'object' || Array.isArray(raw.sources)) {
|
|
14
|
+
throw new Error('A development profile requires version 1 and a sources map.');
|
|
15
|
+
}
|
|
16
|
+
const root = realpathSync(shellRoot);
|
|
17
|
+
const branch = git(root, ['symbolic-ref', '--quiet', '--short', 'HEAD']);
|
|
18
|
+
if (!branch || branch === 'main')
|
|
19
|
+
throw new Error('Local Shell requires a named non-main source branch.');
|
|
20
|
+
if (raw.branch !== undefined && raw.branch !== branch)
|
|
21
|
+
throw new Error('The profile branch differs from the local Shell branch.');
|
|
22
|
+
const sources = {};
|
|
23
|
+
for (const [name, input] of Object.entries(raw.sources)) {
|
|
24
|
+
if (!/^@amalgm\/[a-z][a-z0-9-]*$/.test(name))
|
|
25
|
+
throw new Error(`Invalid local package name: ${name}`);
|
|
26
|
+
const value = typeof input === 'string' ? { path: input, kind: 'source' } : input;
|
|
27
|
+
if (!value || typeof value.path !== 'string' || !value.path)
|
|
28
|
+
throw new Error(`Local source ${name} needs an explicit path.`);
|
|
29
|
+
const kind = value.kind ?? 'source';
|
|
30
|
+
if (kind !== 'source' && kind !== 'fixture')
|
|
31
|
+
throw new Error(`Invalid local source kind for ${name}.`);
|
|
32
|
+
const sourceRoot = realpathSync(resolve(dirname(profileFile), value.path));
|
|
33
|
+
const manifest = JSON.parse(readFileSync(join(sourceRoot, 'package.json'), 'utf8'));
|
|
34
|
+
if (manifest.name !== name)
|
|
35
|
+
throw new Error(`Local source ${name} has a different package identity.`);
|
|
36
|
+
if (kind === 'source' && git(sourceRoot, ['symbolic-ref', '--quiet', '--short', 'HEAD']) !== branch) {
|
|
37
|
+
throw new Error(`Local source ${name} must use the same exact branch as Shell: ${branch}.`);
|
|
38
|
+
}
|
|
39
|
+
sources[name] = {
|
|
40
|
+
root: sourceRoot, kind, commit: kind === 'source' ? git(sourceRoot, ['rev-parse', 'HEAD']) : null,
|
|
41
|
+
dirty: kind === 'source' ? Boolean(git(sourceRoot, ['status', '--porcelain'])) : false,
|
|
42
|
+
};
|
|
43
|
+
}
|
|
44
|
+
if (sources['@amalgm/shell'] && sources['@amalgm/shell'].root !== root)
|
|
45
|
+
throw new Error('The profile selects a different Shell checkout.');
|
|
46
|
+
sources['@amalgm/shell'] = { root, kind: 'source', commit: git(root, ['rev-parse', 'HEAD']), dirty: Boolean(git(root, ['status', '--porcelain'])) };
|
|
47
|
+
for (const name of ['@amalgm/core', '@amalgm/live']) {
|
|
48
|
+
if (!sources[name])
|
|
49
|
+
throw new Error(`Every installation needs ${name}; declare its local source or explicit fixture.`);
|
|
50
|
+
}
|
|
51
|
+
const uiRoot = raw.ui === undefined ? undefined : realpathSync(resolve(dirname(profileFile), raw.ui));
|
|
52
|
+
if (uiRoot && git(uiRoot, ['symbolic-ref', '--quiet', '--short', 'HEAD']) !== branch)
|
|
53
|
+
throw new Error('Local UI and Shell require the same exact branch.');
|
|
54
|
+
const localSession = createHash('sha256').update(JSON.stringify([uiRoot ?? profileFile, root, branch])).digest('hex').slice(0, 32);
|
|
55
|
+
if (!Array.isArray(raw.services) || raw.services.length === 0 || raw.services.some((service) => typeof service !== 'string' || !/^[a-z][a-z0-9-]*$/.test(service))) {
|
|
56
|
+
throw new Error('A development profile explicitly selects one or more services; Core and Files are always included.');
|
|
57
|
+
}
|
|
58
|
+
const endpoints = {};
|
|
59
|
+
for (const [name, value] of Object.entries(raw.endpoints ?? {})) {
|
|
60
|
+
if (!['app', 'proxy', 'automations', 'channels', 'wire', 'supabase'].includes(name) || typeof value !== 'string')
|
|
61
|
+
throw new Error(`Invalid local endpoint: ${name}`);
|
|
62
|
+
const url = new URL(value);
|
|
63
|
+
const protocols = name === 'wire' ? ['http:', 'https:', 'ws:', 'wss:'] : ['http:', 'https:'];
|
|
64
|
+
if (!protocols.includes(url.protocol) || url.username || url.password || url.search || url.hash
|
|
65
|
+
|| (name !== 'wire' && url.pathname !== '/'))
|
|
66
|
+
throw new Error(`Invalid local endpoint URL: ${name}`);
|
|
67
|
+
if (name === 'app' && url.protocol !== 'http:')
|
|
68
|
+
throw new Error('The local UI launcher serves HTTP; its app endpoint must use http.');
|
|
69
|
+
if (name === 'wire') {
|
|
70
|
+
if (url.protocol === 'http:')
|
|
71
|
+
url.protocol = 'ws:';
|
|
72
|
+
if (url.protocol === 'https:')
|
|
73
|
+
url.protocol = 'wss:';
|
|
74
|
+
if (url.pathname === '/')
|
|
75
|
+
url.pathname = '/wire';
|
|
76
|
+
if (url.pathname !== '/wire')
|
|
77
|
+
throw new Error('The local wire endpoint must name /wire.');
|
|
78
|
+
}
|
|
79
|
+
if (!['127.0.0.1', 'localhost', '[::1]'].includes(url.hostname))
|
|
80
|
+
throw new Error(`Local profile endpoint ${name} must be loopback; remote Fly examinations require their own explicit host binding.`);
|
|
81
|
+
endpoints[name] = url.href.replace(/\/$/, '');
|
|
82
|
+
}
|
|
83
|
+
if (raw.environmentFile !== undefined && typeof raw.environmentFile !== 'string')
|
|
84
|
+
throw new Error('environmentFile must name an explicit local environment file.');
|
|
85
|
+
const environmentFile = raw.environmentFile === undefined ? undefined : realpathSync(resolve(dirname(profileFile), raw.environmentFile));
|
|
86
|
+
return Object.freeze({ file: profileFile, branch, localSession, sources: Object.freeze(sources),
|
|
87
|
+
services: Object.freeze([...new Set(['core', 'files', ...raw.services])]), endpoints: Object.freeze(endpoints),
|
|
88
|
+
...(uiRoot ? { uiRoot } : {}), ...(environmentFile ? { environmentFile } : {}) });
|
|
89
|
+
}
|
|
90
|
+
/** The profile records only this path; secrets never enter its metadata. */
|
|
91
|
+
export function readDevelopmentEnvironment(profile) {
|
|
92
|
+
return profile.environmentFile ? parseEnv(readFileSync(profile.environmentFile, 'utf8')) : {};
|
|
93
|
+
}
|
|
94
|
+
/** Register before importing any Amalgm SDK. The hook covers transitive imports
|
|
95
|
+
* too, so an installed registry package cannot conceal an omitted local brick. */
|
|
96
|
+
export function installLocalSourceResolver(profile) {
|
|
97
|
+
const register = modules.registerHooks;
|
|
98
|
+
if (!register)
|
|
99
|
+
throw new Error('Local source profiles require Node.js 24 or newer.');
|
|
100
|
+
return register({ resolve(specifier, context, next) {
|
|
101
|
+
const name = /^(@amalgm\/[^/]+)(?:\/|$)/.exec(specifier)?.[1];
|
|
102
|
+
if (!name)
|
|
103
|
+
return next(specifier, context);
|
|
104
|
+
const source = profile.sources[name];
|
|
105
|
+
if (!source)
|
|
106
|
+
throw Object.assign(new Error(`Local capability ${name} is not installed in this profile.`), { code: 'capability_not_installed' });
|
|
107
|
+
const result = next(specifier, { ...context, parentURL: pathToFileURL(join(source.root, 'package.json')).href });
|
|
108
|
+
if (!result.url.startsWith('file:'))
|
|
109
|
+
throw new Error(`Local source ${name} did not resolve to a file.`);
|
|
110
|
+
const file = fileURLToPath(result.url);
|
|
111
|
+
const inside = relative(source.root, existsSync(file) ? realpathSync(file) : file);
|
|
112
|
+
if (isAbsolute(inside) || inside === '..' || inside.startsWith('../') || inside.startsWith('..\\'))
|
|
113
|
+
throw new Error(`Local source ${name} resolved outside its declared directory.`);
|
|
114
|
+
if (!existsSync(file))
|
|
115
|
+
throw new Error(`The local build of ${name} is missing. Build its declared source before starting.`);
|
|
116
|
+
return result;
|
|
117
|
+
} });
|
|
118
|
+
}
|
|
119
|
+
export function developmentArguments(args, profile) {
|
|
120
|
+
const output = [...args];
|
|
121
|
+
for (const [name, value] of Object.entries({ branch: profile.branch, 'local-session': profile.localSession,
|
|
122
|
+
...(profile.endpoints.app ? { 'app-url': profile.endpoints.app } : {}),
|
|
123
|
+
...(profile.endpoints.proxy ? { 'proxy-url': profile.endpoints.proxy } : {}),
|
|
124
|
+
...(profile.endpoints.wire ? { 'wire-url': profile.endpoints.wire } : {}) })) {
|
|
125
|
+
const existing = output.findIndex((argument) => argument === `--${name}` || argument.startsWith(`--${name}=`));
|
|
126
|
+
if (existing >= 0) {
|
|
127
|
+
const current = output[existing].includes('=') ? output[existing].slice(name.length + 3) : output[existing + 1];
|
|
128
|
+
if (current !== value)
|
|
129
|
+
throw new Error(`--${name} conflicts with the local profile.`);
|
|
130
|
+
}
|
|
131
|
+
else
|
|
132
|
+
output.push(`--${name}`, value);
|
|
133
|
+
}
|
|
134
|
+
return output;
|
|
135
|
+
}
|
|
136
|
+
function git(root, args) {
|
|
137
|
+
const result = spawnSync('git', ['-C', root, ...args], { encoding: 'utf8', timeout: 10_000 });
|
|
138
|
+
if (result.status !== 0)
|
|
139
|
+
throw new Error(`Cannot verify the local source in ${root}: ${String(result.stderr || '').trim()}`);
|
|
140
|
+
return result.stdout.trim();
|
|
141
|
+
}
|
|
142
|
+
//# sourceMappingURL=profile.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"profile.js","sourceRoot":"","sources":["../../src/development/profile.ts"],"names":[],"mappings":"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"}
|
|
@@ -18,6 +18,7 @@ export declare function createFilesRegisterPorts(input: {
|
|
|
18
18
|
readonly userRoot: string;
|
|
19
19
|
readonly deviceId: string;
|
|
20
20
|
readonly onReferenceDeclared?: () => void;
|
|
21
|
+
readonly reserveWritableRoot?: (path: string) => void;
|
|
21
22
|
/** The entity graph is identity authority. Bindings are only durable user
|
|
22
23
|
* intent and may lag it across a crash or an enclosing registration. */
|
|
23
24
|
readonly findKnownWorkspaceId?: (input: {
|
|
@@ -76,6 +76,7 @@ export function createFilesRegisterPorts(input) {
|
|
|
76
76
|
},
|
|
77
77
|
randomUuid: randomUUID,
|
|
78
78
|
declareWorkspaceReference: async ({ workspaceId, workspaceName, absolutePath }) => {
|
|
79
|
+
input.reserveWritableRoot?.(absolutePath);
|
|
79
80
|
const binding = ensureWorkspaceBinding({ bindingDir, workspaceId, absolutePath });
|
|
80
81
|
try {
|
|
81
82
|
const reference = ensureWorkspaceReference({
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"files-register-host.js","sourceRoot":"","sources":["../src/files-register-host.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AACzC,OAAO,EACL,UAAU,EACV,SAAS,EACT,YAAY,EACZ,WAAW,EACX,YAAY,EACZ,MAAM,EACN,QAAQ,EACR,WAAW,GACZ,MAAM,SAAS,CAAC;AACjB,OAAO,EACL,QAAQ,EACR,OAAO,EACP,UAAU,EACV,IAAI,EACJ,QAAQ,EACR,OAAO,EACP,GAAG,GACJ,MAAM,WAAW,CAAC;AAEnB,OAAO,EAAE,mBAAmB,EAAE,MAAM,uBAAuB,CAAC;AAG5D,OAAO,EAAE,gBAAgB,EAAE,MAAM,iBAAiB,CAAC;AAEnD,MAAM,CAAC,MAAM,cAAc,GAAG,4EAA4E,CAAC;AAE3G,MAAM,UAAU,mBAAmB,CAAC,QAAgB,EAAE,QAAgB;IACpE,OAAO,IAAI,CAAC,mBAAmB,CAAC,QAAQ,EAAE,QAAQ,CAAC,EAAE,UAAU,CAAC,CAAC;AACnE,CAAC;AAED;gFACgF;AAChF,MAAM,UAAU,sBAAsB,CAAC,KAItC;IAIC,gBAAgB,CAAC,KAAK,CAAC,UAAU,CAAC,CAAC;IACnC,MAAM,WAAW,GAAG,IAAI,CAAC,KAAK,CAAC,UAAU,EAAE,KAAK,CAAC,WAAW,CAAC,CAAC;IAC9D,MAAM,YAAY,GAAG,YAAY,CAAC,KAAK,CAAC,YAAY,CAAC,CAAC;IACtD,IAAI,UAAU,CAAC,WAAW,CAAC,EAAE,CAAC;QAC5B,IAAI,CAAC;YACH,IAAI,YAAY,CAAC,WAAW,CAAC,KAAK,YAAY,EAAE,CAAC;gBAC/C,MAAM,IAAI,KAAK,CAAC,aAAa,KAAK,CAAC,WAAW,uCAAuC,CAAC,CAAC;YACzF,CAAC;YACD,OAAO,EAAE,WAAW,EAAE,OAAO,EAAE,KAAK,EAAE,CAAC;QACzC,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,IAAK,KAA+B,CAAC,IAAI,KAAK,QAAQ;gBAAE,MAAM,KAAK,CAAC;YACpE,MAAM,CAAC,WAAW,EAAE,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC;QACvC,CAAC;IACH,CAAC;IACD,WAAW,CAAC,YAAY,EAAE,WAAW,EAAE,KAAK,CAAC,CAAC;IAC9C,OAAO,EAAE,WAAW,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC;AACxC,CAAC;AAED;;yCAEyC;AACzC,MAAM,UAAU,wBAAwB,CAAC,
|
|
1
|
+
{"version":3,"file":"files-register-host.js","sourceRoot":"","sources":["../src/files-register-host.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
import { type RuntimeBinding } from '@amalgm/core/identity';
|
|
2
|
+
export declare const managedEnvironments: Readonly<{
|
|
3
|
+
main: Readonly<{
|
|
4
|
+
app: "https://amalgm.ai";
|
|
5
|
+
proxy: "https://amalgm-api-proxy-v2.fly.dev";
|
|
6
|
+
gateway: "https://wire.events.amalgm.ai";
|
|
7
|
+
wire: "wss://wire.events.amalgm.ai/wire";
|
|
8
|
+
automations: "https://automations.amalgm.ai";
|
|
9
|
+
channels: "https://amalgm-channels.fly.dev";
|
|
10
|
+
chat: "https://amalgm-chat-gateway.fly.dev";
|
|
11
|
+
supabase: "https://mjmkllducpzchwnggvqc.supabase.co";
|
|
12
|
+
}>;
|
|
13
|
+
preview: Readonly<{
|
|
14
|
+
app: "https://preview.amalgm.ai";
|
|
15
|
+
proxy: "https://api.preview.amalgm.ai";
|
|
16
|
+
gateway: "https://wire.events.preview.amalgm.ai";
|
|
17
|
+
wire: "wss://wire.events.preview.amalgm.ai/wire";
|
|
18
|
+
automations: "https://amalgm-automations-preview.fly.dev";
|
|
19
|
+
channels: "https://amalgm-channels-preview.fly.dev";
|
|
20
|
+
chat: "https://chat.preview.amalgm.ai";
|
|
21
|
+
supabase: "https://mjmkllducpzchwnggvqc.supabase.co";
|
|
22
|
+
}>;
|
|
23
|
+
}>;
|
|
24
|
+
export declare function runtimeAppOrigin(binding: RuntimeBinding, explicit?: string): string;
|
|
25
|
+
export declare function runtimeProxyOrigin(binding: RuntimeBinding, appUrl: string, explicit?: string): string | undefined;
|
|
26
|
+
export declare function runtimeWireUrl(binding: RuntimeBinding, appUrl: string, value: string, declared?: string): string;
|
|
27
|
+
export declare function runtimeHostedEndpoints(binding: RuntimeBinding, appUrl: string, env: NodeJS.ProcessEnv): {
|
|
28
|
+
channelsBaseUrl?: string | undefined;
|
|
29
|
+
automationsBaseUrl?: string | undefined;
|
|
30
|
+
};
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
import { isLoopbackEndpoint, managedRuntimeEndpoints, normalizeRuntimeEndpoint, resolveRuntimeEndpoint } from '@amalgm/core/identity';
|
|
2
|
+
export const managedEnvironments = managedRuntimeEndpoints;
|
|
3
|
+
export function runtimeAppOrigin(binding, explicit) {
|
|
4
|
+
return resolveRuntimeEndpoint(binding, 'app', explicit, explicit);
|
|
5
|
+
}
|
|
6
|
+
export function runtimeProxyOrigin(binding, appUrl, explicit) {
|
|
7
|
+
if (!explicit && (binding.runtimeLabel === 'local' || isLoopbackEndpoint(appUrl)))
|
|
8
|
+
return undefined;
|
|
9
|
+
return resolveRuntimeEndpoint(binding, 'proxy', explicit, appUrl);
|
|
10
|
+
}
|
|
11
|
+
export function runtimeWireUrl(binding, appUrl, value, declared) {
|
|
12
|
+
const endpoint = resolveRuntimeEndpoint(binding, 'wire', value, appUrl);
|
|
13
|
+
if (declared && endpoint !== normalizeRuntimeEndpoint('wire', declared)) {
|
|
14
|
+
throw Object.assign(new Error('The machine tunnel differs from the declared wire endpoint.'), { code: 'machine_binding_mismatch' });
|
|
15
|
+
}
|
|
16
|
+
return endpoint;
|
|
17
|
+
}
|
|
18
|
+
export function runtimeHostedEndpoints(binding, appUrl, env) {
|
|
19
|
+
const managed = binding.runtimeLabel === 'local' ? null : managedEnvironments[binding.runtimeLabel];
|
|
20
|
+
const defaults = managed && !isLoopbackEndpoint(appUrl) ? managed : null;
|
|
21
|
+
const automations = env.AMALGM_AUTOMATIONS_URL || defaults?.automations;
|
|
22
|
+
const channels = env.AMALGM_CHANNELS_URL || defaults?.channels;
|
|
23
|
+
return {
|
|
24
|
+
...(automations ? { automationsBaseUrl: resolveRuntimeEndpoint(binding, 'automations', automations, appUrl) } : {}),
|
|
25
|
+
...(channels ? { channelsBaseUrl: resolveRuntimeEndpoint(binding, 'channels', channels, appUrl) } : {}),
|
|
26
|
+
};
|
|
27
|
+
}
|
|
28
|
+
//# sourceMappingURL=environment.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"environment.js","sourceRoot":"","sources":["../../src/installation/environment.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,kBAAkB,EAAE,uBAAuB,EAAE,wBAAwB,EAAE,sBAAsB,EAAuB,MAAM,uBAAuB,CAAC;AAE3J,MAAM,CAAC,MAAM,mBAAmB,GAAG,uBAAuB,CAAC;AAE3D,MAAM,UAAU,gBAAgB,CAAC,OAAuB,EAAE,QAAiB;IACzE,OAAO,sBAAsB,CAAC,OAAO,EAAE,KAAK,EAAE,QAAQ,EAAE,QAAQ,CAAC,CAAC;AACpE,CAAC;AAED,MAAM,UAAU,kBAAkB,CAAC,OAAuB,EAAE,MAAc,EAAE,QAAiB;IAC3F,IAAI,CAAC,QAAQ,IAAI,CAAC,OAAO,CAAC,YAAY,KAAK,OAAO,IAAI,kBAAkB,CAAC,MAAM,CAAC,CAAC;QAAE,OAAO,SAAS,CAAC;IACpG,OAAO,sBAAsB,CAAC,OAAO,EAAE,OAAO,EAAE,QAAQ,EAAE,MAAM,CAAC,CAAC;AACpE,CAAC;AAED,MAAM,UAAU,cAAc,CAAC,OAAuB,EAAE,MAAc,EAAE,KAAa,EAAE,QAAiB;IACtG,MAAM,QAAQ,GAAG,sBAAsB,CAAC,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,CAAC,CAAC;IACxE,IAAI,QAAQ,IAAI,QAAQ,KAAK,wBAAwB,CAAC,MAAM,EAAE,QAAQ,CAAC,EAAE,CAAC;QACxE,MAAM,MAAM,CAAC,MAAM,CAAC,IAAI,KAAK,CAAC,6DAA6D,CAAC,EAAE,EAAE,IAAI,EAAE,0BAA0B,EAAE,CAAC,CAAC;IACtI,CAAC;IACD,OAAO,QAAQ,CAAC;AAClB,CAAC;AAED,MAAM,UAAU,sBAAsB,CAAC,OAAuB,EAAE,MAAc,EAAE,GAAsB;IACpG,MAAM,OAAO,GAAG,OAAO,CAAC,YAAY,KAAK,OAAO,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,mBAAmB,CAAC,OAAO,CAAC,YAAY,CAAC,CAAC;IACpG,MAAM,QAAQ,GAAG,OAAO,IAAI,CAAC,kBAAkB,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,IAAI,CAAC;IACzE,MAAM,WAAW,GAAG,GAAG,CAAC,sBAAsB,IAAI,QAAQ,EAAE,WAAW,CAAC;IACxE,MAAM,QAAQ,GAAG,GAAG,CAAC,mBAAmB,IAAI,QAAQ,EAAE,QAAQ,CAAC;IAC/D,OAAO;QACL,GAAG,CAAC,WAAW,CAAC,CAAC,CAAC,EAAE,kBAAkB,EAAE,sBAAsB,CAAC,OAAO,EAAE,aAAa,EAAE,WAAW,EAAE,MAAM,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QACnH,GAAG,CAAC,QAAQ,CAAC,CAAC,CAAC,EAAE,eAAe,EAAE,sBAAsB,CAAC,OAAO,EAAE,UAAU,EAAE,QAAQ,EAAE,MAAM,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;KACxG,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
/** An OS-held file lock ends on process exit, survives suspension and cannot
|
|
2
|
+
* be stolen by age or PID reuse. The file itself is never removed. */
|
|
3
|
+
export declare function acquireProcessLease(file: string): {
|
|
4
|
+
close(): void;
|
|
5
|
+
} | null;
|
|
6
|
+
export declare function processLeaseHeld(file: string): boolean;
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
import Database from 'better-sqlite3';
|
|
2
|
+
import { dirname } from 'node:path';
|
|
3
|
+
import { ensurePrivateDir } from '../filesystem.js';
|
|
4
|
+
/** An OS-held file lock ends on process exit, survives suspension and cannot
|
|
5
|
+
* be stolen by age or PID reuse. The file itself is never removed. */
|
|
6
|
+
export function acquireProcessLease(file) {
|
|
7
|
+
ensurePrivateDir(dirname(file));
|
|
8
|
+
const database = new Database(file, { timeout: 0 });
|
|
9
|
+
try {
|
|
10
|
+
database.exec('BEGIN EXCLUSIVE');
|
|
11
|
+
}
|
|
12
|
+
catch (error) {
|
|
13
|
+
database.close();
|
|
14
|
+
if (error.code === 'SQLITE_BUSY')
|
|
15
|
+
return null;
|
|
16
|
+
throw error;
|
|
17
|
+
}
|
|
18
|
+
return { close() { if (database.open)
|
|
19
|
+
database.close(); } };
|
|
20
|
+
}
|
|
21
|
+
export function processLeaseHeld(file) {
|
|
22
|
+
const lease = acquireProcessLease(file);
|
|
23
|
+
if (!lease)
|
|
24
|
+
return true;
|
|
25
|
+
lease.close();
|
|
26
|
+
return false;
|
|
27
|
+
}
|
|
28
|
+
//# sourceMappingURL=lease.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"lease.js","sourceRoot":"","sources":["../../src/installation/lease.ts"],"names":[],"mappings":"AAAA,OAAO,QAAQ,MAAM,gBAAgB,CAAC;AACtC,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,EAAE,gBAAgB,EAAE,MAAM,kBAAkB,CAAC;AAEpD;sEACsE;AACtE,MAAM,UAAU,mBAAmB,CAAC,IAAY;IAC9C,gBAAgB,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC;IAChC,MAAM,QAAQ,GAAG,IAAI,QAAQ,CAAC,IAAI,EAAE,EAAE,OAAO,EAAE,CAAC,EAAE,CAAC,CAAC;IACpD,IAAI,CAAC;QAAC,QAAQ,CAAC,IAAI,CAAC,iBAAiB,CAAC,CAAC;IAAC,CAAC;IACzC,OAAO,KAAK,EAAE,CAAC;QACb,QAAQ,CAAC,KAAK,EAAE,CAAC;QACjB,IAAK,KAA2B,CAAC,IAAI,KAAK,aAAa;YAAE,OAAO,IAAI,CAAC;QACrE,MAAM,KAAK,CAAC;IACd,CAAC;IACD,OAAO,EAAE,KAAK,KAAK,IAAI,QAAQ,CAAC,IAAI;YAAE,QAAQ,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;AAC9D,CAAC;AAED,MAAM,UAAU,gBAAgB,CAAC,IAAY;IAC3C,MAAM,KAAK,GAAG,mBAAmB,CAAC,IAAI,CAAC,CAAC;IACxC,IAAI,CAAC,KAAK;QAAE,OAAO,IAAI,CAAC;IACxB,KAAK,CAAC,KAAK,EAAE,CAAC;IACd,OAAO,KAAK,CAAC;AACf,CAAC"}
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
import { type RuntimeBinding } from '@amalgm/core/identity';
|
|
2
|
+
/** One machine-local ownership ledger, independent of any selected lane.
|
|
3
|
+
* SQLite serializes competing processes; no polling or idle worker is needed.
|
|
4
|
+
* Root claims survive shutdown because stopped runtimes still own their data. */
|
|
5
|
+
export declare class InstallationOwnership {
|
|
6
|
+
private readonly database;
|
|
7
|
+
private readonly runtimeLeases;
|
|
8
|
+
private readonly leaseDirectory;
|
|
9
|
+
readonly installationRoot: string;
|
|
10
|
+
readonly binding: RuntimeBinding;
|
|
11
|
+
constructor(input: {
|
|
12
|
+
home: string;
|
|
13
|
+
installationRoot: string;
|
|
14
|
+
binding: RuntimeBinding;
|
|
15
|
+
});
|
|
16
|
+
/** Reserve before registration, materialization, Watch or another writer.
|
|
17
|
+
* Empty scope reserves the installation container, not a user's workspace. */
|
|
18
|
+
reserve(requestedPath: string, userScope?: string): string;
|
|
19
|
+
/** Serialize initialization with other claimants before creating a manifest. */
|
|
20
|
+
initialize<T>(effect: () => T): T;
|
|
21
|
+
/** An OS-held SQLite write lock is the lease: process exit releases it,
|
|
22
|
+
* suspension does not, and PID reuse cannot either steal or strand it. */
|
|
23
|
+
acquireRuntime(userScope: string): void;
|
|
24
|
+
releaseRuntime(userScope: string): void;
|
|
25
|
+
/** Contention is bounded setup work, never an idle ownership-recovery poll. */
|
|
26
|
+
waitForRuntime(userScope: string, timeoutMs?: number): Promise<void>;
|
|
27
|
+
close(): void;
|
|
28
|
+
}
|
|
29
|
+
/** Resolve existing symlink ancestors even before a new destination exists. */
|
|
30
|
+
export declare function physicalPath(requestedPath: string): string;
|
|
@@ -0,0 +1,156 @@
|
|
|
1
|
+
import { createHash } from 'node:crypto';
|
|
2
|
+
import { existsSync, mkdirSync, realpathSync, statSync } from 'node:fs';
|
|
3
|
+
import { basename, dirname, join, parse, resolve, sep } from 'node:path';
|
|
4
|
+
import Database from 'better-sqlite3';
|
|
5
|
+
import { acquireProcessLease } from './lease.js';
|
|
6
|
+
import { resolveRuntimeBinding, runtimeBindingsMatch, writableRootsOverlap, } from '@amalgm/core/identity';
|
|
7
|
+
/** One machine-local ownership ledger, independent of any selected lane.
|
|
8
|
+
* SQLite serializes competing processes; no polling or idle worker is needed.
|
|
9
|
+
* Root claims survive shutdown because stopped runtimes still own their data. */
|
|
10
|
+
export class InstallationOwnership {
|
|
11
|
+
database;
|
|
12
|
+
runtimeLeases = new Map();
|
|
13
|
+
leaseDirectory;
|
|
14
|
+
installationRoot;
|
|
15
|
+
binding;
|
|
16
|
+
constructor(input) {
|
|
17
|
+
this.binding = resolveRuntimeBinding(input.binding);
|
|
18
|
+
this.installationRoot = physicalPath(input.installationRoot);
|
|
19
|
+
const directory = join(input.home, '.amalgm');
|
|
20
|
+
this.leaseDirectory = join(directory, 'owners');
|
|
21
|
+
mkdirSync(directory, { recursive: true, mode: 0o700 });
|
|
22
|
+
this.database = new Database(join(directory, 'installation-ownership.sqlite'));
|
|
23
|
+
this.database.pragma('busy_timeout = 5000');
|
|
24
|
+
this.database.exec(`
|
|
25
|
+
CREATE TABLE IF NOT EXISTS writable_roots (
|
|
26
|
+
path TEXT PRIMARY KEY, installation TEXT NOT NULL, binding TEXT NOT NULL,
|
|
27
|
+
user_scope TEXT NOT NULL, physical TEXT NOT NULL
|
|
28
|
+
);
|
|
29
|
+
`);
|
|
30
|
+
try {
|
|
31
|
+
this.reserve(this.installationRoot);
|
|
32
|
+
}
|
|
33
|
+
catch (error) {
|
|
34
|
+
this.database.close();
|
|
35
|
+
throw error;
|
|
36
|
+
}
|
|
37
|
+
}
|
|
38
|
+
/** Reserve before registration, materialization, Watch or another writer.
|
|
39
|
+
* Empty scope reserves the installation container, not a user's workspace. */
|
|
40
|
+
reserve(requestedPath, userScope = '') {
|
|
41
|
+
const path = physicalPath(requestedPath);
|
|
42
|
+
const physical = physicalComponents(path);
|
|
43
|
+
const binding = JSON.stringify(this.binding);
|
|
44
|
+
this.database.transaction(() => {
|
|
45
|
+
const claims = this.database.prepare('SELECT * FROM writable_roots').all();
|
|
46
|
+
for (const claim of claims) {
|
|
47
|
+
const previous = physicalComponents(claim.path);
|
|
48
|
+
const recorded = JSON.parse(claim.physical);
|
|
49
|
+
const overlaps = writableRootsOverlap(pathComponents(path), pathComponents(claim.path))
|
|
50
|
+
|| writableRootsOverlap(physical, previous)
|
|
51
|
+
|| writableRootsOverlap(physical, recorded)
|
|
52
|
+
|| (recorded.at(-1).startsWith('inode:') && physical.includes(recorded.at(-1)))
|
|
53
|
+
|| (physical.at(-1).startsWith('inode:') && recorded.includes(physical.at(-1)));
|
|
54
|
+
if (!overlaps)
|
|
55
|
+
continue;
|
|
56
|
+
const sameInstallation = claim.installation === this.installationRoot
|
|
57
|
+
&& runtimeBindingsMatch(JSON.parse(claim.binding), this.binding);
|
|
58
|
+
const sameUser = !claim.user_scope || !userScope || claim.user_scope === userScope;
|
|
59
|
+
if (!sameInstallation || !sameUser) {
|
|
60
|
+
throw Object.assign(new Error(`Writable root ${path} overlaps ${claim.path}, owned by another Amalgm installation or user. Use a separate checkout.`), {
|
|
61
|
+
code: 'installation_root_conflict',
|
|
62
|
+
});
|
|
63
|
+
}
|
|
64
|
+
}
|
|
65
|
+
const existing = this.database.prepare('SELECT * FROM writable_roots WHERE path = ?').get(path);
|
|
66
|
+
if (!existing) {
|
|
67
|
+
this.database.prepare('INSERT INTO writable_roots VALUES (?, ?, ?, ?, ?)')
|
|
68
|
+
.run(path, this.installationRoot, binding, userScope, JSON.stringify(physical));
|
|
69
|
+
}
|
|
70
|
+
}).immediate();
|
|
71
|
+
return path;
|
|
72
|
+
}
|
|
73
|
+
/** Serialize initialization with other claimants before creating a manifest. */
|
|
74
|
+
initialize(effect) {
|
|
75
|
+
return this.database.transaction(effect).immediate();
|
|
76
|
+
}
|
|
77
|
+
/** An OS-held SQLite write lock is the lease: process exit releases it,
|
|
78
|
+
* suspension does not, and PID reuse cannot either steal or strand it. */
|
|
79
|
+
acquireRuntime(userScope) {
|
|
80
|
+
if (!userScope)
|
|
81
|
+
throw new Error('Runtime ownership requires a user scope.');
|
|
82
|
+
if (this.runtimeLeases.has(userScope))
|
|
83
|
+
return;
|
|
84
|
+
const scope = createHash('sha256').update(JSON.stringify([this.binding, userScope])).digest('hex');
|
|
85
|
+
const lease = acquireProcessLease(join(this.leaseDirectory, `${scope}.sqlite`));
|
|
86
|
+
if (!lease)
|
|
87
|
+
throw Object.assign(new Error(`Amalgm already has a runtime owner for ${userScope} in this environment. Bind to that runtime.`), {
|
|
88
|
+
code: 'runtime_already_owned',
|
|
89
|
+
});
|
|
90
|
+
this.runtimeLeases.set(userScope, lease);
|
|
91
|
+
}
|
|
92
|
+
releaseRuntime(userScope) {
|
|
93
|
+
const lease = this.runtimeLeases.get(userScope);
|
|
94
|
+
if (!lease)
|
|
95
|
+
return;
|
|
96
|
+
lease.close();
|
|
97
|
+
this.runtimeLeases.delete(userScope);
|
|
98
|
+
}
|
|
99
|
+
/** Contention is bounded setup work, never an idle ownership-recovery poll. */
|
|
100
|
+
async waitForRuntime(userScope, timeoutMs = 600_000) {
|
|
101
|
+
const deadline = Date.now() + timeoutMs;
|
|
102
|
+
for (;;) {
|
|
103
|
+
try {
|
|
104
|
+
this.acquireRuntime(userScope);
|
|
105
|
+
return;
|
|
106
|
+
}
|
|
107
|
+
catch (error) {
|
|
108
|
+
if (error.code !== 'runtime_already_owned' || Date.now() >= deadline)
|
|
109
|
+
throw error;
|
|
110
|
+
}
|
|
111
|
+
await new Promise((done) => setTimeout(done, 250));
|
|
112
|
+
}
|
|
113
|
+
}
|
|
114
|
+
close() {
|
|
115
|
+
for (const scope of this.runtimeLeases.keys())
|
|
116
|
+
this.releaseRuntime(scope);
|
|
117
|
+
if (this.database.open)
|
|
118
|
+
this.database.close();
|
|
119
|
+
}
|
|
120
|
+
}
|
|
121
|
+
/** Resolve existing symlink ancestors even before a new destination exists. */
|
|
122
|
+
export function physicalPath(requestedPath) {
|
|
123
|
+
let ancestor = resolve(requestedPath);
|
|
124
|
+
const absent = [];
|
|
125
|
+
while (!existsSync(ancestor)) {
|
|
126
|
+
const parent = dirname(ancestor);
|
|
127
|
+
if (parent === ancestor)
|
|
128
|
+
throw new Error(`Cannot resolve physical root ${requestedPath}`);
|
|
129
|
+
absent.unshift(basename(ancestor));
|
|
130
|
+
ancestor = parent;
|
|
131
|
+
}
|
|
132
|
+
return join(realpathSync.native(ancestor), ...absent);
|
|
133
|
+
}
|
|
134
|
+
function physicalComponents(path) {
|
|
135
|
+
const root = parse(path).root;
|
|
136
|
+
const components = [root, ...path.slice(root.length).split(sep).filter(Boolean)];
|
|
137
|
+
let current = root;
|
|
138
|
+
return components.map((component, index) => {
|
|
139
|
+
if (index > 0)
|
|
140
|
+
current = join(current, component);
|
|
141
|
+
try {
|
|
142
|
+
const info = statSync(current);
|
|
143
|
+
return `inode:${info.dev}:${info.ino}:${info.birthtimeMs}`;
|
|
144
|
+
}
|
|
145
|
+
catch (error) {
|
|
146
|
+
if (error.code !== 'ENOENT')
|
|
147
|
+
throw error;
|
|
148
|
+
return `name:${process.platform === 'win32' ? component.toLowerCase() : component}`;
|
|
149
|
+
}
|
|
150
|
+
});
|
|
151
|
+
}
|
|
152
|
+
function pathComponents(path) {
|
|
153
|
+
const absolute = process.platform === 'win32' ? path.toLowerCase() : path;
|
|
154
|
+
return [parse(absolute).root, ...absolute.slice(parse(absolute).root.length).split(sep).filter(Boolean)];
|
|
155
|
+
}
|
|
156
|
+
//# sourceMappingURL=ownership.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ownership.js","sourceRoot":"","sources":["../../src/installation/ownership.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AACzC,OAAO,EAAE,UAAU,EAAE,SAAS,EAAE,YAAY,EAAE,QAAQ,EAAE,MAAM,SAAS,CAAC;AACxE,OAAO,EAAE,QAAQ,EAAE,OAAO,EAAE,IAAI,EAAE,KAAK,EAAE,OAAO,EAAE,GAAG,EAAE,MAAM,WAAW,CAAC;AAEzE,OAAO,QAAQ,MAAM,gBAAgB,CAAC;AACtC,OAAO,EAAE,mBAAmB,EAAE,MAAM,YAAY,CAAC;AACjD,OAAO,EACL,qBAAqB,EACrB,oBAAoB,EACpB,oBAAoB,GAErB,MAAM,uBAAuB,CAAC;AAU/B;;iFAEiF;AACjF,MAAM,OAAO,qBAAqB;IACf,QAAQ,CAAoB;IAC5B,aAAa,GAAG,IAAI,GAAG,EAA6B,CAAC;IACrD,cAAc,CAAS;IAC/B,gBAAgB,CAAS;IACzB,OAAO,CAAiB;IAEjC,YAAY,KAA0E;QACpF,IAAI,CAAC,OAAO,GAAG,qBAAqB,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;QACpD,IAAI,CAAC,gBAAgB,GAAG,YAAY,CAAC,KAAK,CAAC,gBAAgB,CAAC,CAAC;QAC7D,MAAM,SAAS,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,EAAE,SAAS,CAAC,CAAC;QAC9C,IAAI,CAAC,cAAc,GAAG,IAAI,CAAC,SAAS,EAAE,QAAQ,CAAC,CAAC;QAChD,SAAS,CAAC,SAAS,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC,CAAC;QACvD,IAAI,CAAC,QAAQ,GAAG,IAAI,QAAQ,CAAC,IAAI,CAAC,SAAS,EAAE,+BAA+B,CAAC,CAAC,CAAC;QAC/E,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,qBAAqB,CAAC,CAAC;QAC5C,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC;;;;;KAKlB,CAAC,CAAC;QACH,IAAI,CAAC;YACH,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,gBAAgB,CAAC,CAAC;QACtC,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,IAAI,CAAC,QAAQ,CAAC,KAAK,EAAE,CAAC;YACtB,MAAM,KAAK,CAAC;QACd,CAAC;IACH,CAAC;IAED;kFAC8E;IAC9E,OAAO,CAAC,aAAqB,EAAE,SAAS,GAAG,EAAE;QAC3C,MAAM,IAAI,GAAG,YAAY,CAAC,aAAa,CAAC,CAAC;QACzC,MAAM,QAAQ,GAAG,kBAAkB,CAAC,IAAI,CAAC,CAAC;QAC1C,MAAM,OAAO,GAAG,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;QAC7C,IAAI,CAAC,QAAQ,CAAC,WAAW,CAAC,GAAG,EAAE;YAC7B,MAAM,MAAM,GAAG,IAAI,CAAC,QAAQ,CAAC,OAAO,CAAC,8BAA8B,CAAC,CAAC,GAAG,EAAiB,CAAC;YAC1F,KAAK,MAAM,KAAK,IAAI,MAAM,EAAE,CAAC;gBAC3B,MAAM,QAAQ,GAAG,kBAAkB,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;gBAChD,MAAM,QAAQ,GAAG,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,QAAQ,CAAa,CAAC;gBACxD,MAAM,QAAQ,GAAG,oBAAoB,CAAC,cAAc,CAAC,IAAI,CAAC,EAAE,cAAc,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;uBAClF,oBAAoB,CAAC,QAAQ,EAAE,QAAQ,CAAC;uBACxC,oBAAoB,CAAC,QAAQ,EAAE,QAAQ,CAAC;uBACxC,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC,CAAC,CAAE,CAAC,UAAU,CAAC,QAAQ,CAAC,IAAI,QAAQ,CAAC,QAAQ,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC,CAAC,CAAE,CAAC,CAAC;uBAC9E,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC,CAAC,CAAE,CAAC,UAAU,CAAC,QAAQ,CAAC,IAAI,QAAQ,CAAC,QAAQ,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC,CAAC,CAAE,CAAC,CAAC,CAAC;gBACpF,IAAI,CAAC,QAAQ;oBAAE,SAAS;gBACxB,MAAM,gBAAgB,GAAG,KAAK,CAAC,YAAY,KAAK,IAAI,CAAC,gBAAgB;uBAChE,oBAAoB,CAAC,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,OAAO,CAAmB,EAAE,IAAI,CAAC,OAAO,CAAC,CAAC;gBACrF,MAAM,QAAQ,GAAG,CAAC,KAAK,CAAC,UAAU,IAAI,CAAC,SAAS,IAAI,KAAK,CAAC,UAAU,KAAK,SAAS,CAAC;gBACnF,IAAI,CAAC,gBAAgB,IAAI,CAAC,QAAQ,EAAE,CAAC;oBACnC,MAAM,MAAM,CAAC,MAAM,CAAC,IAAI,KAAK,CAAC,iBAAiB,IAAI,aAAa,KAAK,CAAC,IAAI,0EAA0E,CAAC,EAAE;wBACrJ,IAAI,EAAE,4BAA4B;qBACnC,CAAC,CAAC;gBACL,CAAC;YACH,CAAC;YACD,MAAM,QAAQ,GAAG,IAAI,CAAC,QAAQ,CAAC,OAAO,CAAC,6CAA6C,CAAC,CAAC,GAAG,CAAC,IAAI,CAA0B,CAAC;YACzH,IAAI,CAAC,QAAQ,EAAE,CAAC;gBACd,IAAI,CAAC,QAAQ,CAAC,OAAO,CAAC,mDAAmD,CAAC;qBACvE,GAAG,CAAC,IAAI,EAAE,IAAI,CAAC,gBAAgB,EAAE,OAAO,EAAE,SAAS,EAAE,IAAI,CAAC,SAAS,CAAC,QAAQ,CAAC,CAAC,CAAC;YACpF,CAAC;QACH,CAAC,CAAC,CAAC,SAAS,EAAE,CAAC;QACf,OAAO,IAAI,CAAC;IACd,CAAC;IAED,gFAAgF;IAChF,UAAU,CAAI,MAAe;QAC3B,OAAO,IAAI,CAAC,QAAQ,CAAC,WAAW,CAAC,MAAM,CAAC,CAAC,SAAS,EAAE,CAAC;IACvD,CAAC;IAED;8EAC0E;IAC1E,cAAc,CAAC,SAAiB;QAC9B,IAAI,CAAC,SAAS;YAAE,MAAM,IAAI,KAAK,CAAC,0CAA0C,CAAC,CAAC;QAC5E,IAAI,IAAI,CAAC,aAAa,CAAC,GAAG,CAAC,SAAS,CAAC;YAAE,OAAO;QAC9C,MAAM,KAAK,GAAG,UAAU,CAAC,QAAQ,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC,IAAI,CAAC,OAAO,EAAE,SAAS,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;QACnG,MAAM,KAAK,GAAG,mBAAmB,CAAC,IAAI,CAAC,IAAI,CAAC,cAAc,EAAE,GAAG,KAAK,SAAS,CAAC,CAAC,CAAC;QAChF,IAAI,CAAC,KAAK;YAAE,MAAM,MAAM,CAAC,MAAM,CAAC,IAAI,KAAK,CAAC,0CAA0C,SAAS,6CAA6C,CAAC,EAAE;gBAC3I,IAAI,EAAE,uBAAuB;aAC9B,CAAC,CAAC;QACH,IAAI,CAAC,aAAa,CAAC,GAAG,CAAC,SAAS,EAAE,KAAK,CAAC,CAAC;IAC3C,CAAC;IAED,cAAc,CAAC,SAAiB;QAC9B,MAAM,KAAK,GAAG,IAAI,CAAC,aAAa,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC;QAChD,IAAI,CAAC,KAAK;YAAE,OAAO;QACnB,KAAK,CAAC,KAAK,EAAE,CAAC;QACd,IAAI,CAAC,aAAa,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC;IACvC,CAAC;IAED,+EAA+E;IAC/E,KAAK,CAAC,cAAc,CAAC,SAAiB,EAAE,SAAS,GAAG,OAAO;QACzD,MAAM,QAAQ,GAAG,IAAI,CAAC,GAAG,EAAE,GAAG,SAAS,CAAC;QACxC,SAAS,CAAC;YACR,IAAI,CAAC;gBAAC,IAAI,CAAC,cAAc,CAAC,SAAS,CAAC,CAAC;gBAAC,OAAO;YAAC,CAAC;YAC/C,OAAO,KAAK,EAAE,CAAC;gBACb,IAAK,KAA2B,CAAC,IAAI,KAAK,uBAAuB,IAAI,IAAI,CAAC,GAAG,EAAE,IAAI,QAAQ;oBAAE,MAAM,KAAK,CAAC;YAC3G,CAAC;YACD,MAAM,IAAI,OAAO,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,UAAU,CAAC,IAAI,EAAE,GAAG,CAAC,CAAC,CAAC;QACrD,CAAC;IACH,CAAC;IAED,KAAK;QACH,KAAK,MAAM,KAAK,IAAI,IAAI,CAAC,aAAa,CAAC,IAAI,EAAE;YAAE,IAAI,CAAC,cAAc,CAAC,KAAK,CAAC,CAAC;QAC1E,IAAI,IAAI,CAAC,QAAQ,CAAC,IAAI;YAAE,IAAI,CAAC,QAAQ,CAAC,KAAK,EAAE,CAAC;IAChD,CAAC;CAEF;AAED,+EAA+E;AAC/E,MAAM,UAAU,YAAY,CAAC,aAAqB;IAChD,IAAI,QAAQ,GAAG,OAAO,CAAC,aAAa,CAAC,CAAC;IACtC,MAAM,MAAM,GAAa,EAAE,CAAC;IAC5B,OAAO,CAAC,UAAU,CAAC,QAAQ,CAAC,EAAE,CAAC;QAC7B,MAAM,MAAM,GAAG,OAAO,CAAC,QAAQ,CAAC,CAAC;QACjC,IAAI,MAAM,KAAK,QAAQ;YAAE,MAAM,IAAI,KAAK,CAAC,gCAAgC,aAAa,EAAE,CAAC,CAAC;QAC1F,MAAM,CAAC,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC,CAAC;QACnC,QAAQ,GAAG,MAAM,CAAC;IACpB,CAAC;IACD,OAAO,IAAI,CAAC,YAAY,CAAC,MAAM,CAAC,QAAQ,CAAC,EAAE,GAAG,MAAM,CAAC,CAAC;AACxD,CAAC;AAED,SAAS,kBAAkB,CAAC,IAAY;IACtC,MAAM,IAAI,GAAG,KAAK,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC;IAC9B,MAAM,UAAU,GAAG,CAAC,IAAI,EAAE,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC;IACjF,IAAI,OAAO,GAAG,IAAI,CAAC;IACnB,OAAO,UAAU,CAAC,GAAG,CAAC,CAAC,SAAS,EAAE,KAAK,EAAE,EAAE;QACzC,IAAI,KAAK,GAAG,CAAC;YAAE,OAAO,GAAG,IAAI,CAAC,OAAO,EAAE,SAAS,CAAC,CAAC;QAClD,IAAI,CAAC;YACH,MAAM,IAAI,GAAG,QAAQ,CAAC,OAAO,CAAC,CAAC;YAC/B,OAAO,SAAS,IAAI,CAAC,GAAG,IAAI,IAAI,CAAC,GAAG,IAAI,IAAI,CAAC,WAAW,EAAE,CAAC;QAC7D,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,IAAK,KAA+B,CAAC,IAAI,KAAK,QAAQ;gBAAE,MAAM,KAAK,CAAC;YACpE,OAAO,QAAQ,OAAO,CAAC,QAAQ,KAAK,OAAO,CAAC,CAAC,CAAC,SAAS,CAAC,WAAW,EAAE,CAAC,CAAC,CAAC,SAAS,EAAE,CAAC;QACtF,CAAC;IACH,CAAC,CAAC,CAAC;AACL,CAAC;AAED,SAAS,cAAc,CAAC,IAAY;IAClC,MAAM,QAAQ,GAAG,OAAO,CAAC,QAAQ,KAAK,OAAO,CAAC,CAAC,CAAC,IAAI,CAAC,WAAW,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC;IAC1E,OAAO,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC,IAAI,EAAE,GAAG,QAAQ,CAAC,KAAK,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC;AAC3G,CAAC"}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import { type RuntimeBinding, type RuntimeLabel } from '@amalgm/core/identity';
|
|
2
|
+
import type { ParsedArguments } from '../cli-arguments.js';
|
|
3
|
+
/** Public command prefixes select the environment, never ambient env vars. */
|
|
4
|
+
export declare function selectRuntimeInvocation(args: readonly string[]): {
|
|
5
|
+
runtimeLabel: RuntimeLabel;
|
|
6
|
+
args: readonly string[];
|
|
7
|
+
};
|
|
8
|
+
export declare function resolveInvocationBinding(runtimeLabel: RuntimeLabel, parsed: ParsedArguments): RuntimeBinding;
|