@amalgm/shell 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (105) hide show
  1. package/PURPOSE.md +73 -0
  2. package/README.md +33 -0
  3. package/dist/automations-host.d.ts +19 -0
  4. package/dist/automations-host.js +41 -0
  5. package/dist/automations-host.js.map +1 -0
  6. package/dist/boot.d.ts +53 -0
  7. package/dist/boot.js +249 -0
  8. package/dist/boot.js.map +1 -0
  9. package/dist/bundle-apps.d.ts +12 -0
  10. package/dist/bundle-apps.js +71 -0
  11. package/dist/bundle-apps.js.map +1 -0
  12. package/dist/bundle-automations.d.ts +8 -0
  13. package/dist/bundle-automations.js +106 -0
  14. package/dist/bundle-automations.js.map +1 -0
  15. package/dist/bundle-bindings.d.ts +8 -0
  16. package/dist/bundle-bindings.js +101 -0
  17. package/dist/bundle-bindings.js.map +1 -0
  18. package/dist/bundle-port.d.ts +14 -0
  19. package/dist/bundle-port.js +166 -0
  20. package/dist/bundle-port.js.map +1 -0
  21. package/dist/chat-host.d.ts +32 -0
  22. package/dist/chat-host.js +167 -0
  23. package/dist/chat-host.js.map +1 -0
  24. package/dist/chat-payloads-host.d.ts +8 -0
  25. package/dist/chat-payloads-host.js +76 -0
  26. package/dist/chat-payloads-host.js.map +1 -0
  27. package/dist/chat-relay-host.d.ts +24 -0
  28. package/dist/chat-relay-host.js +90 -0
  29. package/dist/chat-relay-host.js.map +1 -0
  30. package/dist/cli.d.ts +1 -0
  31. package/dist/cli.js +157 -0
  32. package/dist/cli.js.map +1 -0
  33. package/dist/compose.d.ts +32 -0
  34. package/dist/compose.js +35 -0
  35. package/dist/compose.js.map +1 -0
  36. package/dist/credentials-host.d.ts +7 -0
  37. package/dist/credentials-host.js +143 -0
  38. package/dist/credentials-host.js.map +1 -0
  39. package/dist/diagnostics-host.d.ts +3 -0
  40. package/dist/diagnostics-host.js +92 -0
  41. package/dist/diagnostics-host.js.map +1 -0
  42. package/dist/drivers/claude-code.d.ts +27 -0
  43. package/dist/drivers/claude-code.js +72 -0
  44. package/dist/drivers/claude-code.js.map +1 -0
  45. package/dist/event-triggers-host.d.ts +4 -0
  46. package/dist/event-triggers-host.js +48 -0
  47. package/dist/event-triggers-host.js.map +1 -0
  48. package/dist/events-host.d.ts +9 -0
  49. package/dist/events-host.js +34 -0
  50. package/dist/events-host.js.map +1 -0
  51. package/dist/external-proxy-host.d.ts +15 -0
  52. package/dist/external-proxy-host.js +166 -0
  53. package/dist/external-proxy-host.js.map +1 -0
  54. package/dist/filesystem.d.ts +7 -0
  55. package/dist/filesystem.js +71 -0
  56. package/dist/filesystem.js.map +1 -0
  57. package/dist/forward.d.ts +11 -0
  58. package/dist/forward.js +36 -0
  59. package/dist/forward.js.map +1 -0
  60. package/dist/gateway.d.ts +33 -0
  61. package/dist/gateway.js +85 -0
  62. package/dist/gateway.js.map +1 -0
  63. package/dist/index.d.ts +23 -0
  64. package/dist/index.js +14 -0
  65. package/dist/index.js.map +1 -0
  66. package/dist/local-host.d.ts +8 -0
  67. package/dist/local-host.js +101 -0
  68. package/dist/local-host.js.map +1 -0
  69. package/dist/machine-host.d.ts +56 -0
  70. package/dist/machine-host.js +340 -0
  71. package/dist/machine-host.js.map +1 -0
  72. package/dist/main.d.ts +2 -0
  73. package/dist/main.js +4 -0
  74. package/dist/main.js.map +1 -0
  75. package/dist/parity.d.ts +40 -0
  76. package/dist/parity.js +108 -0
  77. package/dist/parity.js.map +1 -0
  78. package/dist/ports-host.d.ts +8 -0
  79. package/dist/ports-host.js +26 -0
  80. package/dist/ports-host.js.map +1 -0
  81. package/dist/pty-host.d.ts +14 -0
  82. package/dist/pty-host.js +141 -0
  83. package/dist/pty-host.js.map +1 -0
  84. package/dist/release-catalog.d.ts +5 -0
  85. package/dist/release-catalog.js +23 -0
  86. package/dist/release-catalog.js.map +1 -0
  87. package/dist/state-host.d.ts +4 -0
  88. package/dist/state-host.js +67 -0
  89. package/dist/state-host.js.map +1 -0
  90. package/dist/state-store.d.ts +15 -0
  91. package/dist/state-store.js +63 -0
  92. package/dist/state-store.js.map +1 -0
  93. package/dist/user-ground-host.d.ts +58 -0
  94. package/dist/user-ground-host.js +809 -0
  95. package/dist/user-ground-host.js.map +1 -0
  96. package/dist/wire-client.d.ts +44 -0
  97. package/dist/wire-client.js +235 -0
  98. package/dist/wire-client.js.map +1 -0
  99. package/dist/workspace-host.d.ts +5 -0
  100. package/dist/workspace-host.js +73 -0
  101. package/dist/workspace-host.js.map +1 -0
  102. package/dist/workspace-store.d.ts +10 -0
  103. package/dist/workspace-store.js +47 -0
  104. package/dist/workspace-store.js.map +1 -0
  105. package/package.json +55 -0
@@ -0,0 +1,141 @@
1
+ import { randomBytes } from "node:crypto";
2
+ import { existsSync, chmodSync } from "node:fs";
3
+ import { isAbsolute, dirname, join } from "node:path";
4
+ import { createRequire } from "node:module";
5
+ import { platform } from "node:os";
6
+ import * as nativePty from "@homebridge/node-pty-prebuilt-multiarch";
7
+ import { createPtyApi, PtySessionManager, } from "@amalgm/core/pty";
8
+ import { WS_CLOSE_UNAUTHORIZED, } from "@amalgm/core/transport";
9
+ import { WebSocket, WebSocketServer } from "ws";
10
+ /** Native effects for Core's PTY law; Engine reference local-gateway.js:33-47,333-346,777-904. */
11
+ export function createPtyHost(config) {
12
+ ensureSpawnHelperExecutable();
13
+ const manager = new PtySessionManager({
14
+ spawn: (spec) => adaptProcess(nativePty.spawn(spec.shell, [], spec)),
15
+ timer: {
16
+ schedule(delayMs, callback) {
17
+ const handle = setTimeout(callback, delayMs);
18
+ handle.unref();
19
+ return { dispose: () => clearTimeout(handle) };
20
+ },
21
+ },
22
+ now: Date.now,
23
+ randomHex: (bytes) => randomBytes(bytes).toString("hex"),
24
+ isAbsolutePath: isAbsolute,
25
+ defaultCwd: config.env.AMALGM_DEFAULT_CWD || config.defaultCwd,
26
+ shell: config.env.SHELL || (platform() === "win32" ? "powershell.exe" : "/bin/zsh"),
27
+ env: config.env,
28
+ });
29
+ const api = createPtyApi(manager);
30
+ const wss = new WebSocketServer({ noServer: true });
31
+ return {
32
+ manager,
33
+ mount: {
34
+ prefix: "/pty",
35
+ stream: async (req, res, pathname) => {
36
+ try {
37
+ const response = await api(await fetchRequest(req, pathname));
38
+ res.writeHead(response.status, Object.fromEntries(response.headers.entries()));
39
+ res.end(Buffer.from(await response.arrayBuffer()));
40
+ }
41
+ catch (error) {
42
+ res.writeHead(500, { "content-type": "application/json" });
43
+ res.end(JSON.stringify({ error: error instanceof Error ? error.message : "internal error" }));
44
+ }
45
+ },
46
+ },
47
+ upgrade: {
48
+ prefix: "/pty",
49
+ handle(req, socket, head, authorized) {
50
+ wss.handleUpgrade(req, socket, head, (ws) => {
51
+ if (!authorized) {
52
+ ws.close(WS_CLOSE_UNAUTHORIZED.code, WS_CLOSE_UNAUTHORIZED.reason);
53
+ return;
54
+ }
55
+ const pathname = new URL(req.url ?? "/", "http://pty.local").pathname;
56
+ const sessionId = pathname.match(/^\/pty\/([^/]+)\/connect$/)?.[1] ?? "";
57
+ manager.attach(sessionId, adaptPeer(ws));
58
+ });
59
+ },
60
+ },
61
+ close() {
62
+ manager.closeAll();
63
+ },
64
+ };
65
+ }
66
+ function adaptProcess(proc) {
67
+ return {
68
+ pid: proc.pid,
69
+ write: (data) => proc.write(data),
70
+ resize: (cols, rows) => proc.resize(cols, rows),
71
+ kill: () => proc.kill(),
72
+ onData: (listener) => proc.onData(listener),
73
+ onExit: (listener) => proc.onExit(listener),
74
+ };
75
+ }
76
+ function adaptPeer(ws) {
77
+ return {
78
+ send(data) {
79
+ if (ws.readyState === WebSocket.OPEN)
80
+ ws.send(data);
81
+ },
82
+ close(code, reason) {
83
+ ws.close(code, reason);
84
+ },
85
+ onInput(listener) {
86
+ const receive = (data) => listener(rawText(data));
87
+ ws.on("message", receive);
88
+ return { dispose: () => ws.off("message", receive) };
89
+ },
90
+ onClose(listener) {
91
+ ws.on("close", listener);
92
+ return { dispose: () => ws.off("close", listener) };
93
+ },
94
+ };
95
+ }
96
+ function rawText(data) {
97
+ if (Buffer.isBuffer(data))
98
+ return data.toString("utf8");
99
+ if (data instanceof ArrayBuffer)
100
+ return Buffer.from(data).toString("utf8");
101
+ return Buffer.concat([...data]).toString("utf8");
102
+ }
103
+ function ensureSpawnHelperExecutable() {
104
+ try {
105
+ const require = createRequire(import.meta.url);
106
+ const root = dirname(require.resolve("@homebridge/node-pty-prebuilt-multiarch/package.json"));
107
+ for (const helper of [
108
+ join(root, "prebuilds", `${process.platform}-${process.arch}`, "spawn-helper"),
109
+ join(root, "build", "Release", "spawn-helper"),
110
+ ]) {
111
+ if (existsSync(helper))
112
+ chmodSync(helper, 0o755);
113
+ }
114
+ }
115
+ catch {
116
+ // Best effort: spawn reports the underlying platform error if no helper is used.
117
+ }
118
+ }
119
+ async function fetchRequest(req, pathname) {
120
+ const url = new URL(req.url ?? pathname, "http://pty.local");
121
+ const headers = new Headers();
122
+ for (const [name, value] of Object.entries(req.headers)) {
123
+ if (Array.isArray(value))
124
+ for (const item of value)
125
+ headers.append(name, item);
126
+ else if (value !== undefined)
127
+ headers.set(name, value);
128
+ }
129
+ const method = req.method ?? "GET";
130
+ const chunks = [];
131
+ if (method !== "GET" && method !== "HEAD") {
132
+ for await (const chunk of req)
133
+ chunks.push(chunk);
134
+ }
135
+ return new Request(`http://pty.local${pathname}${url.search}`, {
136
+ method,
137
+ headers,
138
+ body: chunks.length ? Buffer.concat(chunks) : undefined,
139
+ });
140
+ }
141
+ //# sourceMappingURL=pty-host.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"pty-host.js","sourceRoot":"","sources":["../src/pty-host.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAC1C,OAAO,EAAE,UAAU,EAAE,SAAS,EAAE,MAAM,SAAS,CAAC;AAEhD,OAAO,EAAE,UAAU,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AACtD,OAAO,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAC5C,OAAO,EAAE,QAAQ,EAAE,MAAM,SAAS,CAAC;AAEnC,OAAO,KAAK,SAAS,MAAM,yCAAyC,CAAC;AACrE,OAAO,EACL,YAAY,EACZ,iBAAiB,GAClB,MAAM,kBAAkB,CAAC;AAE1B,OAAO,EACL,qBAAqB,GACtB,MAAM,wBAAwB,CAAC;AAChC,OAAO,EAAE,SAAS,EAAE,eAAe,EAAE,MAAM,IAAI,CAAC;AAiBhD,kGAAkG;AAClG,MAAM,UAAU,aAAa,CAAC,MAAqB;IACjD,2BAA2B,EAAE,CAAC;IAC9B,MAAM,OAAO,GAAG,IAAI,iBAAiB,CAAC;QACpC,KAAK,EAAE,CAAC,IAAI,EAAE,EAAE,CAAC,YAAY,CAAC,SAAS,CAAC,KAAK,CAAC,IAAI,CAAC,KAAK,EAAE,EAAE,EAAE,IAAI,CAAC,CAAC;QACpE,KAAK,EAAE;YACL,QAAQ,CAAC,OAAO,EAAE,QAAQ;gBACxB,MAAM,MAAM,GAAG,UAAU,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC;gBAC7C,MAAM,CAAC,KAAK,EAAE,CAAC;gBACf,OAAO,EAAE,OAAO,EAAE,GAAG,EAAE,CAAC,YAAY,CAAC,MAAM,CAAC,EAAE,CAAC;YACjD,CAAC;SACF;QACD,GAAG,EAAE,IAAI,CAAC,GAAG;QACb,SAAS,EAAE,CAAC,KAAK,EAAE,EAAE,CAAC,WAAW,CAAC,KAAK,CAAC,CAAC,QAAQ,CAAC,KAAK,CAAC;QACxD,cAAc,EAAE,UAAU;QAC1B,UAAU,EAAE,MAAM,CAAC,GAAG,CAAC,kBAAkB,IAAI,MAAM,CAAC,UAAU;QAC9D,KAAK,EAAE,MAAM,CAAC,GAAG,CAAC,KAAK,IAAI,CAAC,QAAQ,EAAE,KAAK,OAAO,CAAC,CAAC,CAAC,gBAAgB,CAAC,CAAC,CAAC,UAAU,CAAC;QACnF,GAAG,EAAE,MAAM,CAAC,GAAG;KAChB,CAAC,CAAC;IACH,MAAM,GAAG,GAAG,YAAY,CAAC,OAAO,CAAC,CAAC;IAClC,MAAM,GAAG,GAAG,IAAI,eAAe,CAAC,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC,CAAC;IAEpD,OAAO;QACL,OAAO;QACP,KAAK,EAAE;YACL,MAAM,EAAE,MAAM;YACd,MAAM,EAAE,KAAK,EAAE,GAAG,EAAE,GAAG,EAAE,QAAQ,EAAE,EAAE;gBACnC,IAAI,CAAC;oBACH,MAAM,QAAQ,GAAG,MAAM,GAAG,CAAC,MAAM,YAAY,CAAC,GAAG,EAAE,QAAQ,CAAC,CAAC,CAAC;oBAC9D,GAAG,CAAC,SAAS,CAAC,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC,WAAW,CAAC,QAAQ,CAAC,OAAO,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC;oBAC/E,GAAG,CAAC,GAAG,CAAC,MAAM,CAAC,IAAI,CAAC,MAAM,QAAQ,CAAC,WAAW,EAAE,CAAC,CAAC,CAAC;gBACrD,CAAC;gBAAC,OAAO,KAAK,EAAE,CAAC;oBACf,GAAG,CAAC,SAAS,CAAC,GAAG,EAAE,EAAE,cAAc,EAAE,kBAAkB,EAAE,CAAC,CAAC;oBAC3D,GAAG,CAAC,GAAG,CAAC,IAAI,CAAC,SAAS,CAAC,EAAE,KAAK,EAAE,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,gBAAgB,EAAE,CAAC,CAAC,CAAC;gBAChG,CAAC;YACH,CAAC;SACF;QACD,OAAO,EAAE;YACP,MAAM,EAAE,MAAM;YACd,MAAM,CAAC,GAAG,EAAE,MAAM,EAAE,IAAI,EAAE,UAAU;gBAClC,GAAG,CAAC,aAAa,CAAC,GAAG,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC,EAAE,EAAE,EAAE;oBAC1C,IAAI,CAAC,UAAU,EAAE,CAAC;wBAChB,EAAE,CAAC,KAAK,CAAC,qBAAqB,CAAC,IAAI,EAAE,qBAAqB,CAAC,MAAM,CAAC,CAAC;wBACnE,OAAO;oBACT,CAAC;oBACD,MAAM,QAAQ,GAAG,IAAI,GAAG,CAAC,GAAG,CAAC,GAAG,IAAI,GAAG,EAAE,kBAAkB,CAAC,CAAC,QAAQ,CAAC;oBACtE,MAAM,SAAS,GAAG,QAAQ,CAAC,KAAK,CAAC,2BAA2B,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;oBACzE,OAAO,CAAC,MAAM,CAAC,SAAS,EAAE,SAAS,CAAC,EAAE,CAAC,CAAC,CAAC;gBAC3C,CAAC,CAAC,CAAC;YACL,CAAC;SACF;QACD,KAAK;YACH,OAAO,CAAC,QAAQ,EAAE,CAAC;QACrB,CAAC;KACF,CAAC;AACJ,CAAC;AAED,SAAS,YAAY,CAAC,IAAoB;IACxC,OAAO;QACL,GAAG,EAAE,IAAI,CAAC,GAAG;QACb,KAAK,EAAE,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC;QACjC,MAAM,EAAE,CAAC,IAAI,EAAE,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,MAAM,CAAC,IAAI,EAAE,IAAI,CAAC;QAC/C,IAAI,EAAE,GAAG,EAAE,CAAC,IAAI,CAAC,IAAI,EAAE;QACvB,MAAM,EAAE,CAAC,QAAQ,EAAE,EAAE,CAAC,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC;QAC3C,MAAM,EAAE,CAAC,QAAQ,EAAE,EAAE,CAAC,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC;KAC5C,CAAC;AACJ,CAAC;AAED,SAAS,SAAS,CAAC,EAAa;IAC9B,OAAO;QACL,IAAI,CAAC,IAAI;YACP,IAAI,EAAE,CAAC,UAAU,KAAK,SAAS,CAAC,IAAI;gBAAE,EAAE,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QACtD,CAAC;QACD,KAAK,CAAC,IAAI,EAAE,MAAM;YAChB,EAAE,CAAC,KAAK,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC;QACzB,CAAC;QACD,OAAO,CAAC,QAAQ;YACd,MAAM,OAAO,GAAG,CAAC,IAAa,EAAE,EAAE,CAAC,QAAQ,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC;YAC3D,EAAE,CAAC,EAAE,CAAC,SAAS,EAAE,OAAO,CAAC,CAAC;YAC1B,OAAO,EAAE,OAAO,EAAE,GAAG,EAAE,CAAC,EAAE,CAAC,GAAG,CAAC,SAAS,EAAE,OAAO,CAAC,EAAE,CAAC;QACvD,CAAC;QACD,OAAO,CAAC,QAAQ;YACd,EAAE,CAAC,EAAE,CAAC,OAAO,EAAE,QAAQ,CAAC,CAAC;YACzB,OAAO,EAAE,OAAO,EAAE,GAAG,EAAE,CAAC,EAAE,CAAC,GAAG,CAAC,OAAO,EAAE,QAAQ,CAAC,EAAE,CAAC;QACtD,CAAC;KACF,CAAC;AACJ,CAAC;AAED,SAAS,OAAO,CAAC,IAAa;IAC5B,IAAI,MAAM,CAAC,QAAQ,CAAC,IAAI,CAAC;QAAE,OAAO,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC;IACxD,IAAI,IAAI,YAAY,WAAW;QAAE,OAAO,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC;IAC3E,OAAO,MAAM,CAAC,MAAM,CAAC,CAAC,GAAG,IAAI,CAAC,CAAC,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC;AACnD,CAAC;AAED,SAAS,2BAA2B;IAClC,IAAI,CAAC;QACH,MAAM,OAAO,GAAG,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;QAC/C,MAAM,IAAI,GAAG,OAAO,CAAC,OAAO,CAAC,OAAO,CAAC,sDAAsD,CAAC,CAAC,CAAC;QAC9F,KAAK,MAAM,MAAM,IAAI;YACnB,IAAI,CAAC,IAAI,EAAE,WAAW,EAAE,GAAG,OAAO,CAAC,QAAQ,IAAI,OAAO,CAAC,IAAI,EAAE,EAAE,cAAc,CAAC;YAC9E,IAAI,CAAC,IAAI,EAAE,OAAO,EAAE,SAAS,EAAE,cAAc,CAAC;SAC/C,EAAE,CAAC;YACF,IAAI,UAAU,CAAC,MAAM,CAAC;gBAAE,SAAS,CAAC,MAAM,EAAE,KAAK,CAAC,CAAC;QACnD,CAAC;IACH,CAAC;IAAC,MAAM,CAAC;QACP,iFAAiF;IACnF,CAAC;AACH,CAAC;AAED,KAAK,UAAU,YAAY,CAAC,GAAoB,EAAE,QAAgB;IAChE,MAAM,GAAG,GAAG,IAAI,GAAG,CAAC,GAAG,CAAC,GAAG,IAAI,QAAQ,EAAE,kBAAkB,CAAC,CAAC;IAC7D,MAAM,OAAO,GAAG,IAAI,OAAO,EAAE,CAAC;IAC9B,KAAK,MAAM,CAAC,IAAI,EAAE,KAAK,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,GAAG,CAAC,OAAO,CAAC,EAAE,CAAC;QACxD,IAAI,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC;YAAE,KAAK,MAAM,IAAI,IAAI,KAAK;gBAAE,OAAO,CAAC,MAAM,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC;aAC1E,IAAI,KAAK,KAAK,SAAS;YAAE,OAAO,CAAC,GAAG,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC;IACzD,CAAC;IACD,MAAM,MAAM,GAAG,GAAG,CAAC,MAAM,IAAI,KAAK,CAAC;IACnC,MAAM,MAAM,GAAa,EAAE,CAAC;IAC5B,IAAI,MAAM,KAAK,KAAK,IAAI,MAAM,KAAK,MAAM,EAAE,CAAC;QAC1C,IAAI,KAAK,EAAE,MAAM,KAAK,IAAI,GAAG;YAAE,MAAM,CAAC,IAAI,CAAC,KAAe,CAAC,CAAC;IAC9D,CAAC;IACD,OAAO,IAAI,OAAO,CAAC,mBAAmB,QAAQ,GAAG,GAAG,CAAC,MAAM,EAAE,EAAE;QAC7D,MAAM;QACN,OAAO;QACP,IAAI,EAAE,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,SAAS;KACxD,CAAC,CAAC;AACL,CAAC"}
@@ -0,0 +1,5 @@
1
+ import type { ReleaseCatalogVerifierPort, SignedReleaseCatalog } from "@amalgm/core/supervision";
2
+ /** Signed once by the Shell release authority. The private key is not part of
3
+ * the package; changing this graph requires a newly signed release. */
4
+ export declare const shellReleaseCatalog: SignedReleaseCatalog;
5
+ export declare const shellReleaseVerifier: ReleaseCatalogVerifierPort;
@@ -0,0 +1,23 @@
1
+ import { createPublicKey, verify } from "node:crypto";
2
+ const RELEASE_KEY = `-----BEGIN PUBLIC KEY-----
3
+ MCowBQYDK2VwAyEANMqhSyyHbFnlzR/e7O7OaykWb5zZ73OXCmP+An5/hUc=
4
+ -----END PUBLIC KEY-----`;
5
+ /** Signed once by the Shell release authority. The private key is not part of
6
+ * the package; changing this graph requires a newly signed release. */
7
+ export const shellReleaseCatalog = Object.freeze({
8
+ releaseId: "shell-registration-0.1.0",
9
+ keyId: "shell-registration-2026-08",
10
+ services: Object.freeze([
11
+ { id: "core", dependencies: [] },
12
+ { id: "files", dependencies: ["core"] },
13
+ ]),
14
+ signature: "KvhNC0EuTFuDaeunhsKzY-iKT0N5NZyKzCmyVN-uVNjkkHZ16yAwIf22vhlFFc3MhJZwejWWwS5dU7KrsE4zBQ",
15
+ });
16
+ const releaseKey = createPublicKey(RELEASE_KEY);
17
+ export const shellReleaseVerifier = Object.freeze({
18
+ verify(payload, signature, keyId) {
19
+ return keyId === shellReleaseCatalog.keyId
20
+ && verify(null, Buffer.from(payload), releaseKey, Buffer.from(signature, "base64url"));
21
+ },
22
+ });
23
+ //# sourceMappingURL=release-catalog.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"release-catalog.js","sourceRoot":"","sources":["../src/release-catalog.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC;AAOtD,MAAM,WAAW,GAAG;;yBAEK,CAAC;AAE1B;uEACuE;AACvE,MAAM,CAAC,MAAM,mBAAmB,GAAyB,MAAM,CAAC,MAAM,CAAC;IACrE,SAAS,EAAE,0BAA0B;IACrC,KAAK,EAAE,4BAA4B;IACnC,QAAQ,EAAE,MAAM,CAAC,MAAM,CAAC;QACtB,EAAE,EAAE,EAAE,MAAM,EAAE,YAAY,EAAE,EAAE,EAAE;QAChC,EAAE,EAAE,EAAE,OAAO,EAAE,YAAY,EAAE,CAAC,MAAM,CAAC,EAAE;KACxC,CAAC;IACF,SAAS,EAAE,wFAAwF;CACpG,CAAC,CAAC;AAEH,MAAM,UAAU,GAAG,eAAe,CAAC,WAAW,CAAC,CAAC;AAEhD,MAAM,CAAC,MAAM,oBAAoB,GAA+B,MAAM,CAAC,MAAM,CAAC;IAC5E,MAAM,CAAC,OAAe,EAAE,SAAiB,EAAE,KAAa;QACtD,OAAO,KAAK,KAAK,mBAAmB,CAAC,KAAK;eACrC,MAAM,CAAC,IAAI,EAAE,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,EAAE,UAAU,EAAE,MAAM,CAAC,IAAI,CAAC,SAAS,EAAE,WAAW,CAAC,CAAC,CAAC;IAC3F,CAAC;CACF,CAAC,CAAC"}
@@ -0,0 +1,4 @@
1
+ import { StateRail } from "@amalgm/core/state";
2
+ import type { BrickMount } from "./gateway.js";
3
+ /** Node socket adapter for Core's portable Fetch state surface. */
4
+ export declare function stateMount(rail: StateRail): BrickMount;
@@ -0,0 +1,67 @@
1
+ import { createStateApi } from "@amalgm/core/state";
2
+ /** Node socket adapter for Core's portable Fetch state surface. */
3
+ export function stateMount(rail) {
4
+ const api = createStateApi(rail);
5
+ return {
6
+ prefix: "/state",
7
+ stream: async (req, res, pathname) => {
8
+ const abort = new AbortController();
9
+ const disconnect = () => abort.abort();
10
+ req.once("aborted", disconnect);
11
+ res.once("close", disconnect);
12
+ try {
13
+ const request = await fetchRequest(req, pathname, abort.signal);
14
+ const response = await api(request);
15
+ res.writeHead(response.status, Object.fromEntries(response.headers.entries()));
16
+ if (!response.body) {
17
+ res.end();
18
+ return;
19
+ }
20
+ const reader = response.body.getReader();
21
+ try {
22
+ while (!res.destroyed) {
23
+ const chunk = await reader.read();
24
+ if (chunk.done)
25
+ break;
26
+ res.write(Buffer.from(chunk.value));
27
+ }
28
+ }
29
+ finally {
30
+ await reader.cancel().catch(() => { });
31
+ }
32
+ if (!res.writableEnded)
33
+ res.end();
34
+ }
35
+ catch (error) {
36
+ if (res.headersSent || res.destroyed)
37
+ return;
38
+ res.writeHead(500, { "content-type": "application/json" });
39
+ res.end(JSON.stringify({ error: error instanceof Error ? error.message : "internal error" }));
40
+ }
41
+ },
42
+ };
43
+ }
44
+ async function fetchRequest(req, pathname, signal) {
45
+ const url = new URL(req.url ?? pathname, "http://state.local");
46
+ const headers = new Headers();
47
+ for (const [name, value] of Object.entries(req.headers)) {
48
+ if (Array.isArray(value))
49
+ for (const item of value)
50
+ headers.append(name, item);
51
+ else if (value !== undefined)
52
+ headers.set(name, value);
53
+ }
54
+ const method = req.method ?? "GET";
55
+ const chunks = [];
56
+ if (method !== "GET" && method !== "HEAD") {
57
+ for await (const chunk of req)
58
+ chunks.push(chunk);
59
+ }
60
+ return new Request(`http://state.local${pathname}${url.search}`, {
61
+ method,
62
+ headers,
63
+ signal,
64
+ body: chunks.length ? Buffer.concat(chunks) : undefined,
65
+ });
66
+ }
67
+ //# sourceMappingURL=state-host.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"state-host.js","sourceRoot":"","sources":["../src/state-host.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,15 @@
1
+ import type { StateEvent, StateEventInput, StateEventStore } from "@amalgm/core/state";
2
+ /** Core's host port backed by a bounded, restart-safe local event tail. */
3
+ export declare class FileStateEventStore implements StateEventStore {
4
+ #private;
5
+ constructor(file: string, options?: {
6
+ maxEvents?: number;
7
+ });
8
+ currentSeq(): number;
9
+ append(input: StateEventInput, ts: string): StateEvent;
10
+ listAfter(after: number, limit: number): readonly StateEvent[];
11
+ bounds(): {
12
+ minSeq: number;
13
+ maxSeq: number;
14
+ };
15
+ }
@@ -0,0 +1,63 @@
1
+ import { appendFileSync, mkdirSync, readFileSync, renameSync, writeFileSync } from "node:fs";
2
+ import { dirname } from "node:path";
3
+ /** Core's host port backed by a bounded, restart-safe local event tail. */
4
+ export class FileStateEventStore {
5
+ #file;
6
+ #maxEvents;
7
+ #events;
8
+ #seq;
9
+ constructor(file, options = {}) {
10
+ this.#file = file;
11
+ this.#maxEvents = Math.max(1, Math.floor(options.maxEvents ?? 5000));
12
+ this.#events = readEvents(file).slice(-this.#maxEvents);
13
+ this.#seq = this.#events.at(-1)?.seq ?? 0;
14
+ }
15
+ currentSeq() {
16
+ return this.#seq;
17
+ }
18
+ append(input, ts) {
19
+ const event = { seq: ++this.#seq, ts, ...input };
20
+ mkdirSync(dirname(this.#file), { recursive: true });
21
+ appendFileSync(this.#file, `${JSON.stringify(event)}\n`, "utf8");
22
+ this.#events.push(event);
23
+ if (this.#events.length > this.#maxEvents) {
24
+ this.#events.splice(0, this.#events.length - this.#maxEvents);
25
+ const temporary = `${this.#file}.${process.pid}.tmp`;
26
+ writeFileSync(temporary, this.#events.map((row) => JSON.stringify(row)).join("\n") + "\n", "utf8");
27
+ renameSync(temporary, this.#file);
28
+ }
29
+ return event;
30
+ }
31
+ listAfter(after, limit) {
32
+ return this.#events.filter((event) => event.seq > after).slice(0, limit);
33
+ }
34
+ bounds() {
35
+ return { minSeq: this.#events[0]?.seq ?? 0, maxSeq: this.#events.at(-1)?.seq ?? 0 };
36
+ }
37
+ }
38
+ function readEvents(file) {
39
+ let text;
40
+ try {
41
+ text = readFileSync(file, "utf8");
42
+ }
43
+ catch (error) {
44
+ if (error.code === "ENOENT")
45
+ return [];
46
+ throw error;
47
+ }
48
+ const events = [];
49
+ for (const line of text.split("\n")) {
50
+ if (!line)
51
+ continue;
52
+ try {
53
+ const event = JSON.parse(line);
54
+ if (Number.isInteger(event.seq) && event.seq > 0)
55
+ events.push(event);
56
+ }
57
+ catch {
58
+ // A torn final append is not an event; earlier complete rows remain truth.
59
+ }
60
+ }
61
+ return events.sort((left, right) => left.seq - right.seq);
62
+ }
63
+ //# sourceMappingURL=state-store.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"state-store.js","sourceRoot":"","sources":["../src/state-store.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,58 @@
1
+ import { type UserGroundPort, type UserHomeDeclaration } from "@amalgm/core/identity";
2
+ import { type EntityType, type UserGroundIdentity } from "@amalgm/live";
3
+ interface GroundRow {
4
+ readonly uuid: string;
5
+ readonly type: EntityType;
6
+ readonly parentUUID: string | null;
7
+ readonly name: string;
8
+ readonly status: "active";
9
+ readonly version: string;
10
+ readonly payloadVersion: string | null;
11
+ readonly transportVersion: string | null;
12
+ readonly relativePath: string;
13
+ readonly absolutePath: string;
14
+ readonly deviceNumber: number;
15
+ readonly inode: number;
16
+ }
17
+ export interface UserGroundHostOptions {
18
+ readonly amalgmRoot: string;
19
+ readonly deviceId: string;
20
+ readonly tunnelUrl: string;
21
+ readonly tunnelToken: string;
22
+ readonly runtimeVersion: string;
23
+ readonly declaration?: UserHomeDeclaration;
24
+ readonly now?: () => Date;
25
+ }
26
+ /** The production Files port injected into Core. Portable identity remains in
27
+ * Live; this class owns only Node filesystem, SQLite, Watch, and wire effects. */
28
+ export declare class UserGroundHost {
29
+ private readonly options;
30
+ private readonly wire;
31
+ private readonly watchers;
32
+ private activeIdentity;
33
+ private rescanTimer;
34
+ private cloudState;
35
+ private syncing;
36
+ readonly port: UserGroundPort;
37
+ constructor(options: UserGroundHostOptions);
38
+ databasePath(identity: UserGroundIdentity): string;
39
+ rows(identity: UserGroundIdentity): GroundRow[];
40
+ /** Make every observed filesystem change durable in SQLite, immutable
41
+ * content storage, and the official cloud head before returning. */
42
+ flush(): Promise<void>;
43
+ activateRuntimeTunnel(gatewayPort: number, runtimeToken: string): Promise<void>;
44
+ stopRuntimeTunnel(): Promise<void>;
45
+ close(): Promise<void>;
46
+ private userRoot;
47
+ private cacheDir;
48
+ private cloudPort;
49
+ private localPort;
50
+ private uploadSnapshotContent;
51
+ private downloadContent;
52
+ private ensureWatchers;
53
+ private scheduleRescan;
54
+ private syncLocalChanges;
55
+ private drainOutboxBeforeLookup;
56
+ private drainOutbox;
57
+ }
58
+ export {};