amalgm 0.1.131 → 0.1.132

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/lib/cli.js CHANGED
@@ -229,6 +229,7 @@ const SAFE_DAEMON_ENV_KEYS = [
229
229
  'LC_ALL',
230
230
  'LOGNAME',
231
231
  'NODE_PATH',
232
+ 'NPM_CONFIG_PREFIX',
232
233
  'PATH',
233
234
  'PORT_MONITOR_PORT',
234
235
  'SHELL',
@@ -241,6 +242,7 @@ const SAFE_DAEMON_ENV_KEYS = [
241
242
  'XDG_CACHE_HOME',
242
243
  'XDG_CONFIG_HOME',
243
244
  'XDG_DATA_HOME',
245
+ 'npm_config_prefix',
244
246
  ];
245
247
 
246
248
  function daemonEnv(localOnly) {
package/lib/service.js CHANGED
@@ -65,6 +65,7 @@ const SERVICE_ENV_KEYS = [
65
65
  'LANG',
66
66
  'LC_ALL',
67
67
  'NODE_PATH',
68
+ 'NPM_CONFIG_PREFIX',
68
69
  'PATH',
69
70
  'PORT_MONITOR_PORT',
70
71
  'SHELL',
@@ -75,6 +76,7 @@ const SERVICE_ENV_KEYS = [
75
76
  'XDG_CACHE_HOME',
76
77
  'XDG_CONFIG_HOME',
77
78
  'XDG_DATA_HOME',
79
+ 'npm_config_prefix',
78
80
  ];
79
81
 
80
82
  function ensureDir(dir, mode = 0o700) {
@@ -143,6 +145,27 @@ function systemdQuote(value) {
143
145
  return `"${String(value).replace(/\\/g, '\\\\').replace(/"/g, '\\"')}"`;
144
146
  }
145
147
 
148
+ function pathLooksLikeDesktopBundle(value) {
149
+ return /(?:^|\/)[^/]+\.app\/Contents\/(?:Resources\/cli|MacOS)(?:\/|$)/.test(String(value || '').replace(/\\/g, '/'));
150
+ }
151
+
152
+ function serviceStateCanOwnRuntime(state) {
153
+ if (!state) return false;
154
+ const pointsAtDesktopBundle = [
155
+ state.package_root,
156
+ state.node,
157
+ state.bin,
158
+ state.files?.plist,
159
+ state.files?.unit,
160
+ state.files?.script,
161
+ state.files?.nodeScript,
162
+ ].some(pathLooksLikeDesktopBundle);
163
+ if (pointsAtDesktopBundle) return false;
164
+ if (state.runtime_host === 'node') return true;
165
+ if (state.runtime_host === 'electron') return false;
166
+ return true;
167
+ }
168
+
146
169
  function isPidRunning(pid) {
147
170
  if (!Number.isInteger(pid) || pid <= 0) return false;
148
171
  try {
@@ -283,7 +306,6 @@ function buildServiceEnv(localOnly) {
283
306
  AMALGM_LOCAL_ONLY: localOnly ? 'true' : 'false',
284
307
  AMALGM_SERVICE_MANAGED: 'true',
285
308
  AMALGM_SERVICE_LABEL: SERVICE_LABEL,
286
- ELECTRON_RUN_AS_NODE: process.env.ELECTRON_RUN_AS_NODE || '1',
287
309
  PATH: process.env.PATH || '/usr/local/bin:/usr/bin:/bin',
288
310
  };
289
311
 
@@ -656,6 +678,7 @@ function serviceStateFor(backend, localOnly, files = {}) {
656
678
  package_root: PACKAGE_ROOT,
657
679
  node: process.execPath,
658
680
  bin: AMALGM_BIN,
681
+ runtime_host: process.versions.electron ? 'electron' : 'node',
659
682
  files,
660
683
  updated_at: new Date().toISOString(),
661
684
  };
@@ -710,6 +733,7 @@ function stateMatchesRequest(state, options = {}) {
710
733
  // Explicit `amalgm service install` still takes over via installService().
711
734
  function deferToExistingInstall(state, options = {}) {
712
735
  if (!state || !state.backend || !state.bin || !state.package_version) return false;
736
+ if (!serviceStateCanOwnRuntime(state)) return false;
713
737
  if (state.package_root === PACKAGE_ROOT) return false;
714
738
  if (!!state.local_only !== !!options.localOnly) return false;
715
739
  const requested = normalizeMode(options.mode || 'auto');
@@ -941,7 +965,10 @@ module.exports = {
941
965
  SERVICE_PID_FILE,
942
966
  clearPortableServiceStateForDeadPid,
943
967
  lockOwnedByAnother,
968
+ pathLooksLikeDesktopBundle,
944
969
  portableLockDir,
970
+ serviceStateCanOwnRuntime,
971
+ writeLaunchdPlist,
945
972
  writePortableNodeScript,
946
973
  writeSystemdUnit,
947
974
  },
package/lib/supervisor.js CHANGED
@@ -186,6 +186,7 @@ const SAFE_PROCESS_ENV_KEYS = [
186
186
  'ELECTRON_RUN_AS_NODE',
187
187
  'PATH',
188
188
  'NODE_PATH',
189
+ 'NPM_CONFIG_PREFIX',
189
190
  'SHELL',
190
191
  'SSH_AUTH_SOCK',
191
192
  'TERM',
@@ -196,6 +197,7 @@ const SAFE_PROCESS_ENV_KEYS = [
196
197
  'XDG_CACHE_HOME',
197
198
  'XDG_CONFIG_HOME',
198
199
  'XDG_DATA_HOME',
200
+ 'npm_config_prefix',
199
201
  ];
200
202
 
201
203
  function safeBaseProcessEnv() {
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "amalgm",
3
- "version": "0.1.131",
3
+ "version": "0.1.132",
4
4
  "description": "Amalgm local computer runtime: login, MCP, chat, events, previews, and tunnels.",
5
5
  "license": "UNLICENSED",
6
6
  "private": false,