@amalgm/core 0.1.2 → 0.1.3

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 CHANGED
@@ -82,6 +82,11 @@ source until each module is cut over.
82
82
  harness discovery may expose auth type and a bounded hint, but secret
83
83
  values cross only an explicit authenticated resolution call and never
84
84
  enter discovery, logs, or state snapshots.
85
+ 14. **A terminal session has one process lifecycle.** Core owns session ids,
86
+ geometry bounds, peer attachment, exit signaling, and idle teardown;
87
+ the host supplies the native spawn, path, clock, randomness, and timer
88
+ effects. A reconnect attaches to the same process rather than creating
89
+ hidden replacement state.
85
90
 
86
91
  ## Five surfaces, one behavior
87
92
 
@@ -17,6 +17,7 @@ export * from './auth.js';
17
17
  export * from './routing.js';
18
18
  export * from './shipped-routes.js';
19
19
  export * from './state/index.js';
20
+ export * from './pty/index.js';
20
21
  export * from './admission.js';
21
22
  export * from './ingress.js';
22
23
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/transport/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AAEH,cAAc,WAAW,CAAC;AAC1B,cAAc,cAAc,CAAC;AAC7B,cAAc,qBAAqB,CAAC;AACpC,cAAc,kBAAkB,CAAC;AACjC,cAAc,gBAAgB,CAAC;AAC/B,cAAc,cAAc,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/transport/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AAEH,cAAc,WAAW,CAAC;AAC1B,cAAc,cAAc,CAAC;AAC7B,cAAc,qBAAqB,CAAC;AACpC,cAAc,kBAAkB,CAAC;AACjC,cAAc,gBAAgB,CAAC;AAC/B,cAAc,gBAAgB,CAAC;AAC/B,cAAc,cAAc,CAAC"}
@@ -17,6 +17,7 @@ export * from './auth.js';
17
17
  export * from './routing.js';
18
18
  export * from './shipped-routes.js';
19
19
  export * from './state/index.js';
20
+ export * from './pty/index.js';
20
21
  export * from './admission.js';
21
22
  export * from './ingress.js';
22
23
  //# sourceMappingURL=index.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/transport/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AAEH,cAAc,WAAW,CAAC;AAC1B,cAAc,cAAc,CAAC;AAC7B,cAAc,qBAAqB,CAAC;AACpC,cAAc,kBAAkB,CAAC;AACjC,cAAc,gBAAgB,CAAC;AAC/B,cAAc,cAAc,CAAC"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/transport/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AAEH,cAAc,WAAW,CAAC;AAC1B,cAAc,cAAc,CAAC;AAC7B,cAAc,qBAAqB,CAAC;AACpC,cAAc,kBAAkB,CAAC;AACjC,cAAc,gBAAgB,CAAC;AAC/B,cAAc,gBAAgB,CAAC;AAC/B,cAAc,cAAc,CAAC"}
@@ -0,0 +1,4 @@
1
+ import { PtySessionManager } from './session-manager.js';
2
+ /** Engine parity reference: amalgm-engine/runtime/scripts/local-gateway.js:817-863. */
3
+ export declare function createPtyApi(manager: PtySessionManager): (request: Request) => Promise<Response>;
4
+ //# sourceMappingURL=api.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"api.d.ts","sourceRoot":"","sources":["../../../src/transport/pty/api.ts"],"names":[],"mappings":"AAAA,OAAO,EAAqC,iBAAiB,EAAE,MAAM,sBAAsB,CAAC;AAI5F,uFAAuF;AACvF,wBAAgB,YAAY,CAAC,OAAO,EAAE,iBAAiB,GAAG,CAAC,OAAO,EAAE,OAAO,KAAK,OAAO,CAAC,QAAQ,CAAC,CA4BhG"}
@@ -0,0 +1,45 @@
1
+ import { PTY_COLS, PTY_NOT_FOUND, PTY_ROWS, PtySessionManager } from './session-manager.js';
2
+ const JSON_HEADERS = { 'content-type': 'application/json', 'cache-control': 'no-store' };
3
+ /** Engine parity reference: amalgm-engine/runtime/scripts/local-gateway.js:817-863. */
4
+ export function createPtyApi(manager) {
5
+ return async (request) => {
6
+ const pathname = new URL(request.url).pathname;
7
+ if (request.method === 'GET' && pathname === '/pty') {
8
+ return json(200, { service: 'pty', sessions: manager.list() });
9
+ }
10
+ if (request.method === 'GET' && pathname === '/pty/session') {
11
+ return json(200, { sessions: manager.list() });
12
+ }
13
+ if (request.method === 'GET' && pathname === '/pty/resize') {
14
+ return json(200, { cols: PTY_COLS, rows: PTY_ROWS, sessions: manager.list() });
15
+ }
16
+ if (request.method === 'POST' && pathname === '/pty/session') {
17
+ const session = manager.create(await body(request));
18
+ return json(200, { success: true, sessionId: session.id, wsPath: `/pty/${session.id}/connect` });
19
+ }
20
+ if (request.method === 'POST' && pathname === '/pty/resize') {
21
+ const input = await body(request);
22
+ if (!manager.resize(input))
23
+ return json(404, { error: PTY_NOT_FOUND });
24
+ return json(200, { success: true });
25
+ }
26
+ if (request.method === 'DELETE' && pathname === '/pty/session') {
27
+ manager.destroy((await body(request)).sessionId);
28
+ return json(200, { success: true });
29
+ }
30
+ return json(404, { error: 'Unknown PTY route' });
31
+ };
32
+ }
33
+ async function body(request) {
34
+ const text = await request.text();
35
+ if (!text)
36
+ return {};
37
+ const parsed = JSON.parse(text);
38
+ return parsed && typeof parsed === 'object' && !Array.isArray(parsed)
39
+ ? parsed
40
+ : {};
41
+ }
42
+ function json(status, value) {
43
+ return new Response(JSON.stringify(value), { status, headers: JSON_HEADERS });
44
+ }
45
+ //# sourceMappingURL=api.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"api.js","sourceRoot":"","sources":["../../../src/transport/pty/api.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,4 @@
1
+ export * from './types.js';
2
+ export * from './session-manager.js';
3
+ export * from './api.js';
4
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/transport/pty/index.ts"],"names":[],"mappings":"AAAA,cAAc,YAAY,CAAC;AAC3B,cAAc,sBAAsB,CAAC;AACrC,cAAc,UAAU,CAAC"}
@@ -0,0 +1,4 @@
1
+ export * from './types.js';
2
+ export * from './session-manager.js';
3
+ export * from './api.js';
4
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/transport/pty/index.ts"],"names":[],"mappings":"AAAA,cAAc,YAAY,CAAC;AAC3B,cAAc,sBAAsB,CAAC;AACrC,cAAc,UAAU,CAAC"}
@@ -0,0 +1,45 @@
1
+ import type { CreatePtySessionInput, PtyGeometry, PtyPeer, PtySessionManagerOptions, PtySessionSummary, ResizePtySessionInput } from './types.js';
2
+ /**
3
+ * Engine parity reference:
4
+ * amalgm-engine/runtime/scripts/local-gateway.js:777-904
5
+ *
6
+ * This is the process/session decision core only. Native PTY loading,
7
+ * WebSocket framing, paths, clocks, randomness, and timers remain injected
8
+ * host effects under Core axiom 6.
9
+ */
10
+ export declare const PTY_COLS: {
11
+ readonly default: 80;
12
+ readonly min: 20;
13
+ readonly max: 400;
14
+ };
15
+ export declare const PTY_ROWS: {
16
+ readonly default: 24;
17
+ readonly min: 5;
18
+ readonly max: 200;
19
+ };
20
+ export declare const PTY_IDLE_TIMEOUT_MS = 30000;
21
+ export declare const PTY_NOT_FOUND = "PTY session not found";
22
+ export declare const PTY_EXIT_CLOSE: {
23
+ readonly code: 1000;
24
+ readonly reason: "PTY process exited";
25
+ };
26
+ export declare const PTY_MISSING_CLOSE: {
27
+ readonly code: 4404;
28
+ readonly reason: "PTY session not found";
29
+ };
30
+ export declare class PtySessionManager {
31
+ #private;
32
+ constructor(options: PtySessionManagerOptions);
33
+ create(input?: CreatePtySessionInput): PtySessionSummary;
34
+ list(): PtySessionSummary[];
35
+ has(sessionId: string): boolean;
36
+ resize(input: ResizePtySessionInput): boolean;
37
+ destroy(sessionId: unknown): void;
38
+ attach(sessionId: string, peer: PtyPeer): boolean;
39
+ closeAll(): void;
40
+ }
41
+ export declare function normalizePtyGeometry(input: {
42
+ readonly cols?: unknown;
43
+ readonly rows?: unknown;
44
+ }): PtyGeometry;
45
+ //# sourceMappingURL=session-manager.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"session-manager.d.ts","sourceRoot":"","sources":["../../../src/transport/pty/session-manager.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,qBAAqB,EAErB,WAAW,EACX,OAAO,EAEP,wBAAwB,EACxB,iBAAiB,EACjB,qBAAqB,EACtB,MAAM,YAAY,CAAC;AAEpB;;;;;;;GAOG;AAEH,eAAO,MAAM,QAAQ;;;;CAA8C,CAAC;AACpE,eAAO,MAAM,QAAQ;;;;CAA6C,CAAC;AACnE,eAAO,MAAM,mBAAmB,QAAS,CAAC;AAC1C,eAAO,MAAM,aAAa,0BAA0B,CAAC;AACrD,eAAO,MAAM,cAAc;;;CAAwD,CAAC;AACpF,eAAO,MAAM,iBAAiB;;;CAAiD,CAAC;AAchF,qBAAa,iBAAiB;;gBAIhB,OAAO,EAAE,wBAAwB;IAI7C,MAAM,CAAC,KAAK,GAAE,qBAA0B,GAAG,iBAAiB;IAmC5D,IAAI,IAAI,iBAAiB,EAAE;IAI3B,GAAG,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO;IAI/B,MAAM,CAAC,KAAK,EAAE,qBAAqB,GAAG,OAAO;IAU7C,OAAO,CAAC,SAAS,EAAE,OAAO,GAAG,IAAI;IAQjC,MAAM,CAAC,SAAS,EAAE,MAAM,EAAE,IAAI,EAAE,OAAO,GAAG,OAAO;IAgBjD,QAAQ,IAAI,IAAI;CA+BjB;AAED,wBAAgB,oBAAoB,CAAC,KAAK,EAAE;IAAE,QAAQ,CAAC,IAAI,CAAC,EAAE,OAAO,CAAC;IAAC,QAAQ,CAAC,IAAI,CAAC,EAAE,OAAO,CAAA;CAAE,GAAG,WAAW,CAK7G"}
@@ -0,0 +1,143 @@
1
+ /**
2
+ * Engine parity reference:
3
+ * amalgm-engine/runtime/scripts/local-gateway.js:777-904
4
+ *
5
+ * This is the process/session decision core only. Native PTY loading,
6
+ * WebSocket framing, paths, clocks, randomness, and timers remain injected
7
+ * host effects under Core axiom 6.
8
+ */
9
+ export const PTY_COLS = { default: 80, min: 20, max: 400 };
10
+ export const PTY_ROWS = { default: 24, min: 5, max: 200 };
11
+ export const PTY_IDLE_TIMEOUT_MS = 30_000;
12
+ export const PTY_NOT_FOUND = 'PTY session not found';
13
+ export const PTY_EXIT_CLOSE = { code: 1000, reason: 'PTY process exited' };
14
+ export const PTY_MISSING_CLOSE = { code: 4404, reason: PTY_NOT_FOUND };
15
+ export class PtySessionManager {
16
+ #options;
17
+ #sessions = new Map();
18
+ constructor(options) {
19
+ this.#options = options;
20
+ }
21
+ create(input = {}) {
22
+ const geometry = normalizePtyGeometry(input);
23
+ const requestedCwd = typeof input.cwd === 'string' ? input.cwd : '';
24
+ const cwd = requestedCwd && this.#options.isAbsolutePath(requestedCwd)
25
+ ? requestedCwd
26
+ : this.#options.defaultCwd;
27
+ const createdAt = this.#options.now();
28
+ const id = `pty-${createdAt}-${this.#options.randomHex(4)}`;
29
+ const proc = this.#options.spawn({
30
+ shell: this.#options.shell,
31
+ name: 'xterm-256color',
32
+ ...geometry,
33
+ cwd,
34
+ env: {
35
+ ...this.#options.env,
36
+ TERM: 'xterm-256color',
37
+ LANG: this.#options.env.LANG || 'en_US.UTF-8',
38
+ },
39
+ });
40
+ const session = {
41
+ id,
42
+ proc,
43
+ cwd,
44
+ shell: this.#options.shell,
45
+ createdAt,
46
+ cols: geometry.cols,
47
+ rows: geometry.rows,
48
+ clients: new Map(),
49
+ exitSubscription: { dispose() { } },
50
+ };
51
+ session.exitSubscription = proc.onExit(({ exitCode }) => this.#onExit(session, exitCode));
52
+ this.#sessions.set(id, session);
53
+ return summary(session);
54
+ }
55
+ list() {
56
+ return [...this.#sessions.values()].map(summary);
57
+ }
58
+ has(sessionId) {
59
+ return this.#sessions.has(sessionId);
60
+ }
61
+ resize(input) {
62
+ const session = this.#sessions.get(String(input.sessionId || ''));
63
+ if (!session)
64
+ return false;
65
+ const geometry = normalizePtyGeometry(input);
66
+ session.proc.resize(geometry.cols, geometry.rows);
67
+ session.cols = geometry.cols;
68
+ session.rows = geometry.rows;
69
+ return true;
70
+ }
71
+ destroy(sessionId) {
72
+ const id = String(sessionId || '');
73
+ const session = this.#sessions.get(id);
74
+ if (!session)
75
+ return;
76
+ this.#sessions.delete(id);
77
+ session.proc.kill();
78
+ }
79
+ attach(sessionId, peer) {
80
+ const session = this.#sessions.get(sessionId);
81
+ if (!session) {
82
+ peer.close(PTY_MISSING_CLOSE.code, PTY_MISSING_CLOSE.reason);
83
+ return false;
84
+ }
85
+ const subscriptions = [
86
+ session.proc.onData((data) => peer.send(data)),
87
+ peer.onInput((data) => session.proc.write(data)),
88
+ peer.onClose(() => this.#detach(session, peer)),
89
+ ];
90
+ session.clients.set(peer, subscriptions);
91
+ return true;
92
+ }
93
+ closeAll() {
94
+ const sessions = [...this.#sessions.values()];
95
+ this.#sessions.clear();
96
+ for (const session of sessions)
97
+ session.proc.kill();
98
+ }
99
+ #detach(session, peer) {
100
+ const subscriptions = session.clients.get(peer);
101
+ if (!subscriptions)
102
+ return;
103
+ session.clients.delete(peer);
104
+ for (const subscription of subscriptions)
105
+ subscription.dispose();
106
+ this.#options.timer.schedule(this.#options.idleTimeoutMs ?? PTY_IDLE_TIMEOUT_MS, () => {
107
+ if (session.clients.size > 0 || !this.#sessions.has(session.id))
108
+ return;
109
+ this.#sessions.delete(session.id);
110
+ session.proc.kill();
111
+ });
112
+ }
113
+ #onExit(session, exitCode) {
114
+ for (const [peer, subscriptions] of session.clients) {
115
+ peer.send(JSON.stringify({ type: 'exit', exitCode }));
116
+ peer.close(PTY_EXIT_CLOSE.code, PTY_EXIT_CLOSE.reason);
117
+ for (const subscription of subscriptions)
118
+ subscription.dispose();
119
+ }
120
+ session.clients.clear();
121
+ session.exitSubscription.dispose();
122
+ this.#sessions.delete(session.id);
123
+ }
124
+ }
125
+ export function normalizePtyGeometry(input) {
126
+ return {
127
+ cols: Math.max(PTY_COLS.min, Math.min(PTY_COLS.max, Number(input.cols || PTY_COLS.default))),
128
+ rows: Math.max(PTY_ROWS.min, Math.min(PTY_ROWS.max, Number(input.rows || PTY_ROWS.default))),
129
+ };
130
+ }
131
+ function summary(session) {
132
+ return {
133
+ id: session.id,
134
+ cwd: session.cwd,
135
+ shell: session.shell,
136
+ createdAt: session.createdAt,
137
+ cols: session.cols,
138
+ rows: session.rows,
139
+ clients: session.clients.size,
140
+ ...(session.proc.pid === undefined ? {} : { pid: session.proc.pid }),
141
+ };
142
+ }
143
+ //# sourceMappingURL=session-manager.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"session-manager.js","sourceRoot":"","sources":["../../../src/transport/pty/session-manager.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,64 @@
1
+ export interface Disposable {
2
+ dispose(): void;
3
+ }
4
+ export interface PtyGeometry {
5
+ readonly cols: number;
6
+ readonly rows: number;
7
+ }
8
+ export interface PtySpawnSpec extends PtyGeometry {
9
+ readonly name: 'xterm-256color';
10
+ readonly cwd: string;
11
+ readonly shell: string;
12
+ readonly env: Readonly<Record<string, string | undefined>>;
13
+ }
14
+ /** Native process boundary. Hosts adapt node-pty; Core never imports it. */
15
+ export interface PtyProcess {
16
+ readonly pid?: number;
17
+ write(data: string): void;
18
+ resize(cols: number, rows: number): void;
19
+ kill(): void;
20
+ onData(listener: (data: string) => void): Disposable;
21
+ onExit(listener: (event: {
22
+ readonly exitCode: number;
23
+ }) => void): Disposable;
24
+ }
25
+ /** WebSocket-shaped peer boundary. Hosts own framing and ready-state checks. */
26
+ export interface PtyPeer {
27
+ send(data: string): void;
28
+ close(code: number, reason: string): void;
29
+ onInput(listener: (data: string) => void): Disposable;
30
+ onClose(listener: () => void): Disposable;
31
+ }
32
+ export interface PtyTimerPort {
33
+ schedule(delayMs: number, callback: () => void): Disposable;
34
+ }
35
+ export interface PtySessionSummary extends PtyGeometry {
36
+ readonly id: string;
37
+ readonly cwd: string;
38
+ readonly shell: string;
39
+ readonly createdAt: number;
40
+ readonly clients: number;
41
+ readonly pid?: number;
42
+ }
43
+ export interface CreatePtySessionInput {
44
+ readonly cols?: unknown;
45
+ readonly rows?: unknown;
46
+ readonly cwd?: unknown;
47
+ }
48
+ export interface ResizePtySessionInput {
49
+ readonly sessionId?: unknown;
50
+ readonly cols?: unknown;
51
+ readonly rows?: unknown;
52
+ }
53
+ export interface PtySessionManagerOptions {
54
+ readonly spawn: (spec: PtySpawnSpec) => PtyProcess;
55
+ readonly timer: PtyTimerPort;
56
+ readonly now: () => number;
57
+ readonly randomHex: (bytes: number) => string;
58
+ readonly isAbsolutePath: (path: string) => boolean;
59
+ readonly defaultCwd: string;
60
+ readonly shell: string;
61
+ readonly env: Readonly<Record<string, string | undefined>>;
62
+ readonly idleTimeoutMs?: number;
63
+ }
64
+ //# sourceMappingURL=types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../src/transport/pty/types.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../../../src/transport/pty/types.ts"],"names":[],"mappings":""}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@amalgm/core",
3
- "version": "0.1.2",
3
+ "version": "0.1.3",
4
4
  "description": "The Amalgm kernel SDK — identity, transport, supervision, and host capability contracts behind host-injected adapters.",
5
5
  "type": "module",
6
6
  "license": "UNLICENSED",
@@ -32,6 +32,10 @@
32
32
  "types": "./dist/transport/state/index.d.ts",
33
33
  "default": "./dist/transport/state/index.js"
34
34
  },
35
+ "./pty": {
36
+ "types": "./dist/transport/pty/index.d.ts",
37
+ "default": "./dist/transport/pty/index.js"
38
+ },
35
39
  "./supervision": {
36
40
  "types": "./dist/supervision/index.d.ts",
37
41
  "default": "./dist/supervision/index.js"