@amalgm/shell 0.1.91 → 0.1.92
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 +4 -1
- package/dist/runtime-command-host.js +34 -12
- package/dist/runtime-command-host.js.map +1 -1
- package/package.json +1 -1
package/PURPOSE.md
CHANGED
|
@@ -381,7 +381,10 @@ shell only assembles.
|
|
|
381
381
|
|
|
382
382
|
39. **A finite CLI command leaves no transport alive after its result.** The
|
|
383
383
|
running runtime alone owns persistent connections; register and add close
|
|
384
|
-
their
|
|
384
|
+
their loopback request before the command process exits. That request is
|
|
385
|
+
bounded by the service result, never by a generic HTTP response-header
|
|
386
|
+
deadline: fresh-byte Register and Add journeys may legitimately take
|
|
387
|
+
minutes while their durable work continues.
|
|
385
388
|
|
|
386
389
|
40. **Interactive processes use the host's declared shell.** Unix reads
|
|
387
390
|
`SHELL`; Windows reads `ComSpec`; a test or deployment may override that
|
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import { rmSync } from "node:fs";
|
|
2
|
+
import { request } from "node:http";
|
|
2
3
|
import { coerceRuntimeLabel, runtimeStateDir, runtimeStateFile, runtimeTokenFile, } from "@amalgm/core/identity";
|
|
3
4
|
import { atomicJson, readJson } from "./filesystem.js";
|
|
4
5
|
const FILES_PORT = "amalgm_mcp";
|
|
@@ -36,30 +37,22 @@ export async function callRuntimeCommand(input, path, body) {
|
|
|
36
37
|
const port = validPort(state.ports?.[FILES_PORT]);
|
|
37
38
|
let response;
|
|
38
39
|
try {
|
|
39
|
-
response = await
|
|
40
|
-
method: "POST",
|
|
41
|
-
headers: {
|
|
42
|
-
"content-type": "application/json",
|
|
43
|
-
"x-amalgm-runtime-token": token,
|
|
44
|
-
"connection": "close",
|
|
45
|
-
},
|
|
46
|
-
body: JSON.stringify(body),
|
|
47
|
-
});
|
|
40
|
+
response = await postRuntimeCommand(port, path, token, body);
|
|
48
41
|
}
|
|
49
42
|
catch {
|
|
50
43
|
throw new Error(`Amalgm runtime is not running for ${input.userScope}. Start it with \`amalgm run --user ${input.userScope}\`.`);
|
|
51
44
|
}
|
|
52
45
|
let payload = null;
|
|
53
46
|
try {
|
|
54
|
-
payload =
|
|
47
|
+
payload = JSON.parse(response.body);
|
|
55
48
|
}
|
|
56
49
|
catch {
|
|
57
50
|
// The status below remains the honest failure evidence.
|
|
58
51
|
}
|
|
59
|
-
if (
|
|
52
|
+
if (response.statusCode < 200 || response.statusCode >= 300) {
|
|
60
53
|
const message = payload && typeof payload === "object" && "error" in payload
|
|
61
54
|
? String(payload.error)
|
|
62
|
-
: `runtime responded ${response.
|
|
55
|
+
: `runtime responded ${response.statusCode}`;
|
|
63
56
|
throw new Error(message);
|
|
64
57
|
}
|
|
65
58
|
if (!payload || typeof payload !== "object" || Array.isArray(payload)) {
|
|
@@ -67,6 +60,35 @@ export async function callRuntimeCommand(input, path, body) {
|
|
|
67
60
|
}
|
|
68
61
|
return payload;
|
|
69
62
|
}
|
|
63
|
+
/** Register and Add are awaited journeys whose duration scales with fresh bytes. */
|
|
64
|
+
function postRuntimeCommand(port, path, token, body) {
|
|
65
|
+
const encoded = JSON.stringify(body);
|
|
66
|
+
return new Promise((resolve, reject) => {
|
|
67
|
+
const command = request({
|
|
68
|
+
hostname: "127.0.0.1",
|
|
69
|
+
port,
|
|
70
|
+
path,
|
|
71
|
+
method: "POST",
|
|
72
|
+
headers: {
|
|
73
|
+
"content-type": "application/json",
|
|
74
|
+
"content-length": Buffer.byteLength(encoded),
|
|
75
|
+
"x-amalgm-runtime-token": token,
|
|
76
|
+
"connection": "close",
|
|
77
|
+
},
|
|
78
|
+
}, (response) => {
|
|
79
|
+
response.setEncoding("utf8");
|
|
80
|
+
let responseBody = "";
|
|
81
|
+
response.on("data", (chunk) => { responseBody += chunk; });
|
|
82
|
+
response.once("end", () => resolve({
|
|
83
|
+
statusCode: response.statusCode ?? 500,
|
|
84
|
+
body: responseBody,
|
|
85
|
+
}));
|
|
86
|
+
response.once("error", reject);
|
|
87
|
+
});
|
|
88
|
+
command.once("error", reject);
|
|
89
|
+
command.end(encoded);
|
|
90
|
+
});
|
|
91
|
+
}
|
|
70
92
|
function commandFiles(input) {
|
|
71
93
|
const directory = runtimeStateDir(input.userRoot, required(input.deviceId, "device id"), coerceRuntimeLabel(input.runtimeLabel));
|
|
72
94
|
return { state: runtimeStateFile(directory), token: runtimeTokenFile(directory) };
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"runtime-command-host.js","sourceRoot":"","sources":["../src/runtime-command-host.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,SAAS,CAAC;
|
|
1
|
+
{"version":3,"file":"runtime-command-host.js","sourceRoot":"","sources":["../src/runtime-command-host.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@amalgm/shell",
|
|
3
|
-
"version": "0.1.
|
|
3
|
+
"version": "0.1.92",
|
|
4
4
|
"description": "The Amalgm boot shell — the runtime assembled from published @amalgm SDK bricks. Composition and parity ground for the lego-driven engine rewrite.",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"private": false,
|