@amalgm/core 0.1.1 → 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.
Files changed (46) hide show
  1. package/PURPOSE.md +9 -0
  2. package/dist/identity/index.d.ts +1 -0
  3. package/dist/identity/index.d.ts.map +1 -1
  4. package/dist/identity/index.js +1 -0
  5. package/dist/identity/index.js.map +1 -1
  6. package/dist/identity/local/api.d.ts +6 -0
  7. package/dist/identity/local/api.d.ts.map +1 -0
  8. package/dist/identity/local/api.js +40 -0
  9. package/dist/identity/local/api.js.map +1 -0
  10. package/dist/identity/local/discovery.d.ts +4 -0
  11. package/dist/identity/local/discovery.d.ts.map +1 -0
  12. package/dist/identity/local/discovery.js +74 -0
  13. package/dist/identity/local/discovery.js.map +1 -0
  14. package/dist/identity/local/index.d.ts +5 -0
  15. package/dist/identity/local/index.d.ts.map +1 -0
  16. package/dist/identity/local/index.js +4 -0
  17. package/dist/identity/local/index.js.map +1 -0
  18. package/dist/identity/local/resolve.d.ts +7 -0
  19. package/dist/identity/local/resolve.d.ts.map +1 -0
  20. package/dist/identity/local/resolve.js +32 -0
  21. package/dist/identity/local/resolve.js.map +1 -0
  22. package/dist/identity/local/types.d.ts +30 -0
  23. package/dist/identity/local/types.d.ts.map +1 -0
  24. package/dist/identity/local/types.js +2 -0
  25. package/dist/identity/local/types.js.map +1 -0
  26. package/dist/transport/index.d.ts +1 -0
  27. package/dist/transport/index.d.ts.map +1 -1
  28. package/dist/transport/index.js +1 -0
  29. package/dist/transport/index.js.map +1 -1
  30. package/dist/transport/pty/api.d.ts +4 -0
  31. package/dist/transport/pty/api.d.ts.map +1 -0
  32. package/dist/transport/pty/api.js +45 -0
  33. package/dist/transport/pty/api.js.map +1 -0
  34. package/dist/transport/pty/index.d.ts +4 -0
  35. package/dist/transport/pty/index.d.ts.map +1 -0
  36. package/dist/transport/pty/index.js +4 -0
  37. package/dist/transport/pty/index.js.map +1 -0
  38. package/dist/transport/pty/session-manager.d.ts +45 -0
  39. package/dist/transport/pty/session-manager.d.ts.map +1 -0
  40. package/dist/transport/pty/session-manager.js +143 -0
  41. package/dist/transport/pty/session-manager.js.map +1 -0
  42. package/dist/transport/pty/types.d.ts +64 -0
  43. package/dist/transport/pty/types.d.ts.map +1 -0
  44. package/dist/transport/pty/types.js +2 -0
  45. package/dist/transport/pty/types.js.map +1 -0
  46. package/package.json +9 -1
package/PURPOSE.md CHANGED
@@ -78,6 +78,15 @@ source until each module is cut over.
78
78
  12. **A snapshot names its resume point.** Resource readers share one
79
79
  per-attempt context and a snapshot is stable only when its sequence is
80
80
  unchanged across the read; a racing write causes a complete retry.
81
+ 13. **Credential discovery reports evidence, never credentials.** Local
82
+ harness discovery may expose auth type and a bounded hint, but secret
83
+ values cross only an explicit authenticated resolution call and never
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.
81
90
 
82
91
  ## Five surfaces, one behavior
83
92
 
@@ -9,6 +9,7 @@ export * from './ports.js';
9
9
  export * from './labels.js';
10
10
  export * from './layout.js';
11
11
  export * from './product-state.js';
12
+ export * from './local/index.js';
12
13
  export * from './ids.js';
13
14
  export * from './auth-records.js';
14
15
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/identity/index.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,cAAc,YAAY,CAAC;AAC3B,cAAc,aAAa,CAAC;AAC5B,cAAc,aAAa,CAAC;AAC5B,cAAc,oBAAoB,CAAC;AACnC,cAAc,UAAU,CAAC;AACzB,cAAc,mBAAmB,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/identity/index.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,cAAc,YAAY,CAAC;AAC3B,cAAc,aAAa,CAAC;AAC5B,cAAc,aAAa,CAAC;AAC5B,cAAc,oBAAoB,CAAC;AACnC,cAAc,kBAAkB,CAAC;AACjC,cAAc,UAAU,CAAC;AACzB,cAAc,mBAAmB,CAAC"}
@@ -9,6 +9,7 @@ export * from './ports.js';
9
9
  export * from './labels.js';
10
10
  export * from './layout.js';
11
11
  export * from './product-state.js';
12
+ export * from './local/index.js';
12
13
  export * from './ids.js';
13
14
  export * from './auth-records.js';
14
15
  //# sourceMappingURL=index.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/identity/index.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,cAAc,YAAY,CAAC;AAC3B,cAAc,aAAa,CAAC;AAC5B,cAAc,aAAa,CAAC;AAC5B,cAAc,oBAAoB,CAAC;AACnC,cAAc,UAAU,CAAC;AACzB,cAAc,mBAAmB,CAAC"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/identity/index.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,cAAc,YAAY,CAAC;AAC3B,cAAc,aAAa,CAAC;AAC5B,cAAc,aAAa,CAAC;AAC5B,cAAc,oBAAoB,CAAC;AACnC,cAAc,kBAAkB,CAAC;AACjC,cAAc,UAAU,CAAC;AACzB,cAAc,mBAAmB,CAAC"}
@@ -0,0 +1,6 @@
1
+ import type { LocalDiscoveryHost, LocalEnvironmentHost } from './types.js';
2
+ export declare function createLocalApi(options: {
3
+ readonly discovery: LocalDiscoveryHost;
4
+ readonly environment: LocalEnvironmentHost;
5
+ }): (request: Request) => Promise<Response>;
6
+ //# sourceMappingURL=api.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"api.d.ts","sourceRoot":"","sources":["../../../src/identity/local/api.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,kBAAkB,EAAE,oBAAoB,EAAE,MAAM,YAAY,CAAC;AAE3E,wBAAgB,cAAc,CAAC,OAAO,EAAE;IACtC,QAAQ,CAAC,SAAS,EAAE,kBAAkB,CAAC;IACvC,QAAQ,CAAC,WAAW,EAAE,oBAAoB,CAAC;CAC5C,GAAG,CAAC,OAAO,EAAE,OAAO,KAAK,OAAO,CAAC,QAAQ,CAAC,CAmC1C"}
@@ -0,0 +1,40 @@
1
+ import { discoverLocalHarnesses } from './discovery.js';
2
+ import { resolveLocalAgentEnv } from './resolve.js';
3
+ export function createLocalApi(options) {
4
+ return async (request) => {
5
+ const url = new URL(request.url);
6
+ if (request.method === 'GET' && (url.pathname === '/local' || url.pathname === '/local/credentials')) {
7
+ return json(200, {
8
+ agents: discoverLocalHarnesses(options.discovery),
9
+ homedir: options.environment.homedir,
10
+ workspaceRoot: options.environment.workspaceRoot,
11
+ });
12
+ }
13
+ if (request.method === 'POST' && url.pathname === '/local/init') {
14
+ const initialized = options.environment.ensure();
15
+ return json(200, {
16
+ ok: true,
17
+ created: initialized.created,
18
+ amalgmPath: initialized.path,
19
+ homedir: options.environment.homedir,
20
+ workspaceRoot: options.environment.workspaceRoot,
21
+ agents: discoverLocalHarnesses(options.discovery),
22
+ });
23
+ }
24
+ if (request.method === 'POST' && url.pathname === '/local/credentials/resolve') {
25
+ const body = await request.json();
26
+ if (typeof body.agentId !== 'string' || typeof body.authMode !== 'string') {
27
+ return json(400, { error: 'agentId and authMode are required' });
28
+ }
29
+ return json(200, { env: resolveLocalAgentEnv(body.agentId, body.authMode, typeof body.proxyToken === 'string' ? body.proxyToken : undefined, typeof body.proxyBaseUrl === 'string' ? body.proxyBaseUrl : undefined) });
30
+ }
31
+ return json(404, { error: 'not found' });
32
+ };
33
+ }
34
+ function json(status, body) {
35
+ return new Response(JSON.stringify(body), {
36
+ status,
37
+ headers: { 'content-type': 'application/json', 'cache-control': 'no-store' },
38
+ });
39
+ }
40
+ //# sourceMappingURL=api.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"api.js","sourceRoot":"","sources":["../../../src/identity/local/api.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,sBAAsB,EAAE,MAAM,gBAAgB,CAAC;AACxD,OAAO,EAAE,oBAAoB,EAAE,MAAM,cAAc,CAAC;AAGpD,MAAM,UAAU,cAAc,CAAC,OAG9B;IACC,OAAO,KAAK,EAAE,OAAO,EAAE,EAAE;QACvB,MAAM,GAAG,GAAG,IAAI,GAAG,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;QACjC,IAAI,OAAO,CAAC,MAAM,KAAK,KAAK,IAAI,CAAC,GAAG,CAAC,QAAQ,KAAK,QAAQ,IAAI,GAAG,CAAC,QAAQ,KAAK,oBAAoB,CAAC,EAAE,CAAC;YACrG,OAAO,IAAI,CAAC,GAAG,EAAE;gBACf,MAAM,EAAE,sBAAsB,CAAC,OAAO,CAAC,SAAS,CAAC;gBACjD,OAAO,EAAE,OAAO,CAAC,WAAW,CAAC,OAAO;gBACpC,aAAa,EAAE,OAAO,CAAC,WAAW,CAAC,aAAa;aACjD,CAAC,CAAC;QACL,CAAC;QACD,IAAI,OAAO,CAAC,MAAM,KAAK,MAAM,IAAI,GAAG,CAAC,QAAQ,KAAK,aAAa,EAAE,CAAC;YAChE,MAAM,WAAW,GAAG,OAAO,CAAC,WAAW,CAAC,MAAM,EAAE,CAAC;YACjD,OAAO,IAAI,CAAC,GAAG,EAAE;gBACf,EAAE,EAAE,IAAI;gBACR,OAAO,EAAE,WAAW,CAAC,OAAO;gBAC5B,UAAU,EAAE,WAAW,CAAC,IAAI;gBAC5B,OAAO,EAAE,OAAO,CAAC,WAAW,CAAC,OAAO;gBACpC,aAAa,EAAE,OAAO,CAAC,WAAW,CAAC,aAAa;gBAChD,MAAM,EAAE,sBAAsB,CAAC,OAAO,CAAC,SAAS,CAAC;aAClD,CAAC,CAAC;QACL,CAAC;QACD,IAAI,OAAO,CAAC,MAAM,KAAK,MAAM,IAAI,GAAG,CAAC,QAAQ,KAAK,4BAA4B,EAAE,CAAC;YAC/E,MAAM,IAAI,GAAG,MAAM,OAAO,CAAC,IAAI,EAA6B,CAAC;YAC7D,IAAI,OAAO,IAAI,CAAC,OAAO,KAAK,QAAQ,IAAI,OAAO,IAAI,CAAC,QAAQ,KAAK,QAAQ,EAAE,CAAC;gBAC1E,OAAO,IAAI,CAAC,GAAG,EAAE,EAAE,KAAK,EAAE,mCAAmC,EAAE,CAAC,CAAC;YACnE,CAAC;YACD,OAAO,IAAI,CAAC,GAAG,EAAE,EAAE,GAAG,EAAE,oBAAoB,CAC1C,IAAI,CAAC,OAAO,EACZ,IAAI,CAAC,QAAQ,EACb,OAAO,IAAI,CAAC,UAAU,KAAK,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC,CAAC,SAAS,EACjE,OAAO,IAAI,CAAC,YAAY,KAAK,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC,CAAC,SAAS,CACtE,EAAE,CAAC,CAAC;QACP,CAAC;QACD,OAAO,IAAI,CAAC,GAAG,EAAE,EAAE,KAAK,EAAE,WAAW,EAAE,CAAC,CAAC;IAC3C,CAAC,CAAC;AACJ,CAAC;AAED,SAAS,IAAI,CAAC,MAAc,EAAE,IAAa;IACzC,OAAO,IAAI,QAAQ,CAAC,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,EAAE;QACxC,MAAM;QACN,OAAO,EAAE,EAAE,cAAc,EAAE,kBAAkB,EAAE,eAAe,EAAE,UAAU,EAAE;KAC7E,CAAC,CAAC;AACL,CAAC"}
@@ -0,0 +1,4 @@
1
+ import type { LocalDiscoveryHost, LocalHarness } from './types.js';
2
+ /** Engine reference: runtime/lib/local/credentialResolver.ts. */
3
+ export declare function discoverLocalHarnesses(host: LocalDiscoveryHost): LocalHarness[];
4
+ //# sourceMappingURL=discovery.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"discovery.d.ts","sourceRoot":"","sources":["../../../src/identity/local/discovery.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAmB,kBAAkB,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AAEpF,iEAAiE;AACjE,wBAAgB,sBAAsB,CAAC,IAAI,EAAE,kBAAkB,GAAG,YAAY,EAAE,CAwE/E"}
@@ -0,0 +1,74 @@
1
+ /** Engine reference: runtime/lib/local/credentialResolver.ts. */
2
+ export function discoverLocalHarnesses(host) {
3
+ const found = [];
4
+ const path = (...parts) => host.join(host.homedir, ...parts);
5
+ const claudeDir = path('.claude');
6
+ if (host.exists(claudeDir)) {
7
+ found.push(harness('claude_code', 'Claude Code', claudeDir, host.authStatus('claude_code')));
8
+ }
9
+ const codexDir = path('.codex');
10
+ const codexAuth = host.readJson(path('.codex', 'auth.json'));
11
+ if (codexAuth) {
12
+ const tokens = codexAuth.tokens;
13
+ const apiKey = typeof codexAuth.OPENAI_API_KEY === 'string' ? codexAuth.OPENAI_API_KEY : '';
14
+ const status = tokens && typeof tokens === 'object'
15
+ ? { hasAuth: true, authDetails: { type: 'oauth', hint: clean(codexAuth.auth_mode) || 'configured' } }
16
+ : apiKey
17
+ ? { hasAuth: true, authDetails: { type: 'api_key', hint: apiKey.slice(-4) } }
18
+ : { hasAuth: false };
19
+ found.push(harness('codex', 'Codex', codexDir, status));
20
+ }
21
+ const openCodeDir = path('.config', 'opencode');
22
+ const openCodeAuth = path('.local', 'share', 'opencode', 'auth.json');
23
+ if (host.exists(openCodeDir) || host.exists(openCodeAuth)) {
24
+ found.push(harness('opencode', 'OpenCode', openCodeDir, host.nonEmptyFile(openCodeAuth)
25
+ ? { hasAuth: true, authDetails: { type: 'oauth', hint: 'configured' } }
26
+ : { hasAuth: false }));
27
+ }
28
+ const piDir = path('.pi');
29
+ const piCredentials = [path('.pi', 'agent', 'auth.json'), path('.pi', 'agent', 'models.json')];
30
+ if (host.exists(piDir) || piCredentials.some((candidate) => host.exists(candidate))) {
31
+ const hasAuth = piCredentials.some((candidate) => host.nonEmptyFile(candidate));
32
+ found.push(harness('pi', 'Pi', piDir, hasAuth
33
+ ? { hasAuth, authDetails: { type: 'unknown', hint: 'configured' } }
34
+ : { hasAuth }));
35
+ }
36
+ const ampDir = path('.config', 'amp');
37
+ const ampKey = host.env('AMP_API_KEY') ?? '';
38
+ const ampCredentials = [path('.config', 'amp', 'settings.json'), path('.amp', 'config.json'), path('.amp', 'auth.json')];
39
+ if (ampKey || host.exists(ampDir) || ampCredentials.some((candidate) => host.exists(candidate))) {
40
+ const hasFile = ampCredentials.some((candidate) => host.nonEmptyFile(candidate));
41
+ const hasAuth = Boolean(ampKey || hasFile);
42
+ found.push(harness('amp', 'Amp', ampDir, hasAuth
43
+ ? { hasAuth, authDetails: { type: ampKey ? 'api_key' : 'unknown', hint: ampKey ? ampKey.slice(-4) : 'configured' } }
44
+ : { hasAuth }));
45
+ }
46
+ const cursorDir = path('.cursor');
47
+ const cursorKey = host.env('CURSOR_API_KEY') ?? '';
48
+ const cursorCredentials = [
49
+ path('.cursor', 'credentials.json'),
50
+ path('.config', 'cursor', 'credentials.json'),
51
+ path('.local', 'share', 'cursor-agent', 'auth.json'),
52
+ ];
53
+ const cursorStatus = host.authStatus('cursor');
54
+ if (cursorKey || cursorStatus?.hasAuth || host.exists(cursorDir)
55
+ || cursorCredentials.some((candidate) => host.exists(candidate))) {
56
+ const hasFile = cursorCredentials.some((candidate) => host.nonEmptyFile(candidate));
57
+ const hasAuth = Boolean(cursorKey || cursorStatus?.hasAuth || hasFile);
58
+ found.push(harness('cursor', 'Cursor', cursorDir, hasAuth
59
+ ? cursorKey
60
+ ? { hasAuth, authDetails: { type: 'api_key', hint: cursorKey.slice(-4) } }
61
+ : cursorStatus?.hasAuth
62
+ ? cursorStatus
63
+ : { hasAuth, authDetails: { type: 'oauth', hint: 'configured' } }
64
+ : { hasAuth }));
65
+ }
66
+ return found;
67
+ }
68
+ function harness(id, name, configDir, status) {
69
+ return { id, name, configDir, ...(status ?? { hasAuth: false }) };
70
+ }
71
+ function clean(value) {
72
+ return typeof value === 'string' ? value.trim() : '';
73
+ }
74
+ //# sourceMappingURL=discovery.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"discovery.js","sourceRoot":"","sources":["../../../src/identity/local/discovery.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,5 @@
1
+ export { createLocalApi } from './api.js';
2
+ export { discoverLocalHarnesses } from './discovery.js';
3
+ export { localReauthCommand, resolveLocalAgentEnv } from './resolve.js';
4
+ export type * from './types.js';
5
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/identity/local/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,MAAM,UAAU,CAAC;AAC1C,OAAO,EAAE,sBAAsB,EAAE,MAAM,gBAAgB,CAAC;AACxD,OAAO,EAAE,kBAAkB,EAAE,oBAAoB,EAAE,MAAM,cAAc,CAAC;AACxE,mBAAmB,YAAY,CAAC"}
@@ -0,0 +1,4 @@
1
+ export { createLocalApi } from './api.js';
2
+ export { discoverLocalHarnesses } from './discovery.js';
3
+ export { localReauthCommand, resolveLocalAgentEnv } from './resolve.js';
4
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/identity/local/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,MAAM,UAAU,CAAC;AAC1C,OAAO,EAAE,sBAAsB,EAAE,MAAM,gBAAgB,CAAC;AACxD,OAAO,EAAE,kBAAkB,EAAE,oBAAoB,EAAE,MAAM,cAAc,CAAC"}
@@ -0,0 +1,7 @@
1
+ import type { LocalHarness } from './types.js';
2
+ export declare function resolveLocalAgentEnv(agentId: LocalHarness['id'] | string, authMode: string, proxyToken?: string, proxyBaseUrl?: string): Record<string, string>;
3
+ export declare function localReauthCommand(agentId: string): {
4
+ shell: string;
5
+ description: string;
6
+ } | null;
7
+ //# sourceMappingURL=resolve.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"resolve.d.ts","sourceRoot":"","sources":["../../../src/identity/local/resolve.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AAE/C,wBAAgB,oBAAoB,CAClC,OAAO,EAAE,YAAY,CAAC,IAAI,CAAC,GAAG,MAAM,EACpC,QAAQ,EAAE,MAAM,EAChB,UAAU,CAAC,EAAE,MAAM,EACnB,YAAY,CAAC,EAAE,MAAM,GACpB,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAexB;AAED,wBAAgB,kBAAkB,CAAC,OAAO,EAAE,MAAM,GAAG;IAAE,KAAK,EAAE,MAAM,CAAC;IAAC,WAAW,EAAE,MAAM,CAAA;CAAE,GAAG,IAAI,CAajG"}
@@ -0,0 +1,32 @@
1
+ export function resolveLocalAgentEnv(agentId, authMode, proxyToken, proxyBaseUrl) {
2
+ if (authMode !== 'amalgm' || !proxyToken || !proxyBaseUrl)
3
+ return {};
4
+ const base = proxyBaseUrl.replace(/\/+$/, '');
5
+ switch (agentId) {
6
+ case 'claude_code':
7
+ return { ANTHROPIC_API_KEY: proxyToken, ANTHROPIC_BASE_URL: `${base}/anthropic` };
8
+ case 'codex':
9
+ return { OPENAI_API_KEY: proxyToken, OPENAI_BASE_URL: `${base}/openai/v1` };
10
+ case 'opencode':
11
+ return { AI_GATEWAY_API_KEY: proxyToken, AI_GATEWAY_BASE_URL: `${base}/ai_gateway/v3/ai` };
12
+ case 'pi':
13
+ return { AI_GATEWAY_API_KEY: proxyToken, AI_GATEWAY_BASE_URL: `${base}/ai_gateway/v1` };
14
+ default:
15
+ return {};
16
+ }
17
+ }
18
+ export function localReauthCommand(agentId) {
19
+ switch (agentId) {
20
+ case 'claude_code': return { shell: 'claude', description: 'Run `claude`, then type /login to authenticate.' };
21
+ case 'codex': return { shell: 'codex login', description: '`codex login` walks through OAuth or API-key setup.' };
22
+ case 'opencode': return { shell: 'opencode auth login', description: '`opencode auth login` walks through provider setup.' };
23
+ case 'pi': return { shell: 'pi --terminal-login', description: '`pi --terminal-login` authenticates Pi in the terminal.' };
24
+ case 'amp': return { shell: 'amp --setup', description: '`amp --setup` configures Amp credentials.' };
25
+ case 'cursor': return {
26
+ shell: 'if command -v cursor-agent >/dev/null 2>&1; then cursor-agent login; else "$HOME/.local/bin/cursor-agent" login; fi',
27
+ description: '`cursor-agent login` opens the browser login flow.',
28
+ };
29
+ default: return null;
30
+ }
31
+ }
32
+ //# sourceMappingURL=resolve.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"resolve.js","sourceRoot":"","sources":["../../../src/identity/local/resolve.ts"],"names":[],"mappings":"AAEA,MAAM,UAAU,oBAAoB,CAClC,OAAoC,EACpC,QAAgB,EAChB,UAAmB,EACnB,YAAqB;IAErB,IAAI,QAAQ,KAAK,QAAQ,IAAI,CAAC,UAAU,IAAI,CAAC,YAAY;QAAE,OAAO,EAAE,CAAC;IACrE,MAAM,IAAI,GAAG,YAAY,CAAC,OAAO,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC;IAC9C,QAAQ,OAAO,EAAE,CAAC;QAChB,KAAK,aAAa;YAChB,OAAO,EAAE,iBAAiB,EAAE,UAAU,EAAE,kBAAkB,EAAE,GAAG,IAAI,YAAY,EAAE,CAAC;QACpF,KAAK,OAAO;YACV,OAAO,EAAE,cAAc,EAAE,UAAU,EAAE,eAAe,EAAE,GAAG,IAAI,YAAY,EAAE,CAAC;QAC9E,KAAK,UAAU;YACb,OAAO,EAAE,kBAAkB,EAAE,UAAU,EAAE,mBAAmB,EAAE,GAAG,IAAI,mBAAmB,EAAE,CAAC;QAC7F,KAAK,IAAI;YACP,OAAO,EAAE,kBAAkB,EAAE,UAAU,EAAE,mBAAmB,EAAE,GAAG,IAAI,gBAAgB,EAAE,CAAC;QAC1F;YACE,OAAO,EAAE,CAAC;IACd,CAAC;AACH,CAAC;AAED,MAAM,UAAU,kBAAkB,CAAC,OAAe;IAChD,QAAQ,OAAO,EAAE,CAAC;QAChB,KAAK,aAAa,CAAC,CAAC,OAAO,EAAE,KAAK,EAAE,QAAQ,EAAE,WAAW,EAAE,iDAAiD,EAAE,CAAC;QAC/G,KAAK,OAAO,CAAC,CAAC,OAAO,EAAE,KAAK,EAAE,aAAa,EAAE,WAAW,EAAE,qDAAqD,EAAE,CAAC;QAClH,KAAK,UAAU,CAAC,CAAC,OAAO,EAAE,KAAK,EAAE,qBAAqB,EAAE,WAAW,EAAE,qDAAqD,EAAE,CAAC;QAC7H,KAAK,IAAI,CAAC,CAAC,OAAO,EAAE,KAAK,EAAE,qBAAqB,EAAE,WAAW,EAAE,yDAAyD,EAAE,CAAC;QAC3H,KAAK,KAAK,CAAC,CAAC,OAAO,EAAE,KAAK,EAAE,aAAa,EAAE,WAAW,EAAE,2CAA2C,EAAE,CAAC;QACtG,KAAK,QAAQ,CAAC,CAAC,OAAO;YACpB,KAAK,EAAE,qHAAqH;YAC5H,WAAW,EAAE,oDAAoD;SAClE,CAAC;QACF,OAAO,CAAC,CAAC,OAAO,IAAI,CAAC;IACvB,CAAC;AACH,CAAC"}
@@ -0,0 +1,30 @@
1
+ export interface LocalAuthStatus {
2
+ readonly hasAuth: boolean;
3
+ readonly authDetails?: {
4
+ readonly type: 'oauth' | 'api_key' | 'unknown';
5
+ readonly hint: string;
6
+ };
7
+ }
8
+ export interface LocalHarness extends LocalAuthStatus {
9
+ readonly id: 'claude_code' | 'codex' | 'opencode' | 'pi' | 'amp' | 'cursor';
10
+ readonly name: string;
11
+ readonly configDir: string;
12
+ }
13
+ export interface LocalDiscoveryHost {
14
+ readonly homedir: string;
15
+ join(...parts: string[]): string;
16
+ exists(path: string): boolean;
17
+ nonEmptyFile(path: string): boolean;
18
+ readJson(path: string): unknown;
19
+ env(name: string): string | undefined;
20
+ authStatus(harnessId: LocalHarness['id']): LocalAuthStatus | null;
21
+ }
22
+ export interface LocalEnvironmentHost {
23
+ readonly homedir: string;
24
+ readonly workspaceRoot: string;
25
+ ensure(): {
26
+ readonly created: boolean;
27
+ readonly path: string;
28
+ };
29
+ }
30
+ //# sourceMappingURL=types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../src/identity/local/types.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,eAAe;IAC9B,QAAQ,CAAC,OAAO,EAAE,OAAO,CAAC;IAC1B,QAAQ,CAAC,WAAW,CAAC,EAAE;QAAE,QAAQ,CAAC,IAAI,EAAE,OAAO,GAAG,SAAS,GAAG,SAAS,CAAC;QAAC,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAA;KAAE,CAAC;CAClG;AAED,MAAM,WAAW,YAAa,SAAQ,eAAe;IACnD,QAAQ,CAAC,EAAE,EAAE,aAAa,GAAG,OAAO,GAAG,UAAU,GAAG,IAAI,GAAG,KAAK,GAAG,QAAQ,CAAC;IAC5E,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;CAC5B;AAED,MAAM,WAAW,kBAAkB;IACjC,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IACzB,IAAI,CAAC,GAAG,KAAK,EAAE,MAAM,EAAE,GAAG,MAAM,CAAC;IACjC,MAAM,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC;IAC9B,YAAY,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC;IACpC,QAAQ,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC;IAChC,GAAG,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS,CAAC;IACtC,UAAU,CAAC,SAAS,EAAE,YAAY,CAAC,IAAI,CAAC,GAAG,eAAe,GAAG,IAAI,CAAC;CACnE;AAED,MAAM,WAAW,oBAAoB;IACnC,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IACzB,QAAQ,CAAC,aAAa,EAAE,MAAM,CAAC;IAC/B,MAAM,IAAI;QAAE,QAAQ,CAAC,OAAO,EAAE,OAAO,CAAC;QAAC,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAA;KAAE,CAAC;CAChE"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../../../src/identity/local/types.ts"],"names":[],"mappings":""}
@@ -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":"AAWA;;;;;;;GAOG;AAEH,MAAM,CAAC,MAAM,QAAQ,GAAG,EAAE,OAAO,EAAE,EAAE,EAAE,GAAG,EAAE,EAAE,EAAE,GAAG,EAAE,GAAG,EAAW,CAAC;AACpE,MAAM,CAAC,MAAM,QAAQ,GAAG,EAAE,OAAO,EAAE,EAAE,EAAE,GAAG,EAAE,CAAC,EAAE,GAAG,EAAE,GAAG,EAAW,CAAC;AACnE,MAAM,CAAC,MAAM,mBAAmB,GAAG,MAAM,CAAC;AAC1C,MAAM,CAAC,MAAM,aAAa,GAAG,uBAAuB,CAAC;AACrD,MAAM,CAAC,MAAM,cAAc,GAAG,EAAE,IAAI,EAAE,IAAI,EAAE,MAAM,EAAE,oBAAoB,EAAW,CAAC;AACpF,MAAM,CAAC,MAAM,iBAAiB,GAAG,EAAE,IAAI,EAAE,IAAI,EAAE,MAAM,EAAE,aAAa,EAAW,CAAC;AAchF,MAAM,OAAO,iBAAiB;IACnB,QAAQ,CAA2B;IACnC,SAAS,GAAG,IAAI,GAAG,EAAmB,CAAC;IAEhD,YAAY,OAAiC;QAC3C,IAAI,CAAC,QAAQ,GAAG,OAAO,CAAC;IAC1B,CAAC;IAED,MAAM,CAAC,QAA+B,EAAE;QACtC,MAAM,QAAQ,GAAG,oBAAoB,CAAC,KAAK,CAAC,CAAC;QAC7C,MAAM,YAAY,GAAG,OAAO,KAAK,CAAC,GAAG,KAAK,QAAQ,CAAC,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC;QACpE,MAAM,GAAG,GAAG,YAAY,IAAI,IAAI,CAAC,QAAQ,CAAC,cAAc,CAAC,YAAY,CAAC;YACpE,CAAC,CAAC,YAAY;YACd,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,UAAU,CAAC;QAC7B,MAAM,SAAS,GAAG,IAAI,CAAC,QAAQ,CAAC,GAAG,EAAE,CAAC;QACtC,MAAM,EAAE,GAAG,OAAO,SAAS,IAAI,IAAI,CAAC,QAAQ,CAAC,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC;QAC5D,MAAM,IAAI,GAAG,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC;YAC/B,KAAK,EAAE,IAAI,CAAC,QAAQ,CAAC,KAAK;YAC1B,IAAI,EAAE,gBAAgB;YACtB,GAAG,QAAQ;YACX,GAAG;YACH,GAAG,EAAE;gBACH,GAAG,IAAI,CAAC,QAAQ,CAAC,GAAG;gBACpB,IAAI,EAAE,gBAAgB;gBACtB,IAAI,EAAE,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,IAAI,IAAI,aAAa;aAC9C;SACF,CAAC,CAAC;QACH,MAAM,OAAO,GAAY;YACvB,EAAE;YACF,IAAI;YACJ,GAAG;YACH,KAAK,EAAE,IAAI,CAAC,QAAQ,CAAC,KAAK;YAC1B,SAAS;YACT,IAAI,EAAE,QAAQ,CAAC,IAAI;YACnB,IAAI,EAAE,QAAQ,CAAC,IAAI;YACnB,OAAO,EAAE,IAAI,GAAG,EAAE;YAClB,gBAAgB,EAAE,EAAE,OAAO,KAAI,CAAC,EAAE;SACnC,CAAC;QACF,OAAO,CAAC,gBAAgB,GAAG,IAAI,CAAC,MAAM,CAAC,CAAC,EAAE,QAAQ,EAAE,EAAE,EAAE,CAAC,IAAI,CAAC,OAAO,CAAC,OAAO,EAAE,QAAQ,CAAC,CAAC,CAAC;QAC1F,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,EAAE,EAAE,OAAO,CAAC,CAAC;QAChC,OAAO,OAAO,CAAC,OAAO,CAAC,CAAC;IAC1B,CAAC;IAED,IAAI;QACF,OAAO,CAAC,GAAG,IAAI,CAAC,SAAS,CAAC,MAAM,EAAE,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;IACnD,CAAC;IAED,GAAG,CAAC,SAAiB;QACnB,OAAO,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC;IACvC,CAAC;IAED,MAAM,CAAC,KAA4B;QACjC,MAAM,OAAO,GAAG,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,MAAM,CAAC,KAAK,CAAC,SAAS,IAAI,EAAE,CAAC,CAAC,CAAC;QAClE,IAAI,CAAC,OAAO;YAAE,OAAO,KAAK,CAAC;QAC3B,MAAM,QAAQ,GAAG,oBAAoB,CAAC,KAAK,CAAC,CAAC;QAC7C,OAAO,CAAC,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,IAAI,EAAE,QAAQ,CAAC,IAAI,CAAC,CAAC;QAClD,OAAO,CAAC,IAAI,GAAG,QAAQ,CAAC,IAAI,CAAC;QAC7B,OAAO,CAAC,IAAI,GAAG,QAAQ,CAAC,IAAI,CAAC;QAC7B,OAAO,IAAI,CAAC;IACd,CAAC;IAED,OAAO,CAAC,SAAkB;QACxB,MAAM,EAAE,GAAG,MAAM,CAAC,SAAS,IAAI,EAAE,CAAC,CAAC;QACnC,MAAM,OAAO,GAAG,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;QACvC,IAAI,CAAC,OAAO;YAAE,OAAO;QACrB,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;QAC1B,OAAO,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC;IACtB,CAAC;IAED,MAAM,CAAC,SAAiB,EAAE,IAAa;QACrC,MAAM,OAAO,GAAG,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC;QAC9C,IAAI,CAAC,OAAO,EAAE,CAAC;YACb,IAAI,CAAC,KAAK,CAAC,iBAAiB,CAAC,IAAI,EAAE,iBAAiB,CAAC,MAAM,CAAC,CAAC;YAC7D,OAAO,KAAK,CAAC;QACf,CAAC;QAED,MAAM,aAAa,GAAG;YACpB,OAAO,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;YAC9C,IAAI,CAAC,OAAO,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;YAChD,IAAI,CAAC,OAAO,CAAC,GAAG,EAAE,CAAC,IAAI,CAAC,OAAO,CAAC,OAAO,EAAE,IAAI,CAAC,CAAC;SACvC,CAAC;QACX,OAAO,CAAC,OAAO,CAAC,GAAG,CAAC,IAAI,EAAE,aAAa,CAAC,CAAC;QACzC,OAAO,IAAI,CAAC;IACd,CAAC;IAED,QAAQ;QACN,MAAM,QAAQ,GAAG,CAAC,GAAG,IAAI,CAAC,SAAS,CAAC,MAAM,EAAE,CAAC,CAAC;QAC9C,IAAI,CAAC,SAAS,CAAC,KAAK,EAAE,CAAC;QACvB,KAAK,MAAM,OAAO,IAAI,QAAQ;YAAE,OAAO,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC;IACtD,CAAC;IAED,OAAO,CAAC,OAAgB,EAAE,IAAa;QACrC,MAAM,aAAa,GAAG,OAAO,CAAC,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;QAChD,IAAI,CAAC,aAAa;YAAE,OAAO;QAC3B,OAAO,CAAC,OAAO,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;QAC7B,KAAK,MAAM,YAAY,IAAI,aAAa;YAAE,YAAY,CAAC,OAAO,EAAE,CAAC;QACjE,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC,QAAQ,CAC1B,IAAI,CAAC,QAAQ,CAAC,aAAa,IAAI,mBAAmB,EAClD,GAAG,EAAE;YACH,IAAI,OAAO,CAAC,OAAO,CAAC,IAAI,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,OAAO,CAAC,EAAE,CAAC;gBAAE,OAAO;YACxE,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC;YAClC,OAAO,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC;QACtB,CAAC,CACF,CAAC;IACJ,CAAC;IAED,OAAO,CAAC,OAAgB,EAAE,QAAgB;QACxC,KAAK,MAAM,CAAC,IAAI,EAAE,aAAa,CAAC,IAAI,OAAO,CAAC,OAAO,EAAE,CAAC;YACpD,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,QAAQ,EAAE,CAAC,CAAC,CAAC;YACtD,IAAI,CAAC,KAAK,CAAC,cAAc,CAAC,IAAI,EAAE,cAAc,CAAC,MAAM,CAAC,CAAC;YACvD,KAAK,MAAM,YAAY,IAAI,aAAa;gBAAE,YAAY,CAAC,OAAO,EAAE,CAAC;QACnE,CAAC;QACD,OAAO,CAAC,OAAO,CAAC,KAAK,EAAE,CAAC;QACxB,OAAO,CAAC,gBAAgB,CAAC,OAAO,EAAE,CAAC;QACnC,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC;IACpC,CAAC;CACF;AAED,MAAM,UAAU,oBAAoB,CAAC,KAA2D;IAC9F,OAAO;QACL,IAAI,EAAE,IAAI,CAAC,GAAG,CAAC,QAAQ,CAAC,GAAG,EAAE,IAAI,CAAC,GAAG,CAAC,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAC,KAAK,CAAC,IAAI,IAAI,QAAQ,CAAC,OAAO,CAAC,CAAC,CAAC;QAC5F,IAAI,EAAE,IAAI,CAAC,GAAG,CAAC,QAAQ,CAAC,GAAG,EAAE,IAAI,CAAC,GAAG,CAAC,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAC,KAAK,CAAC,IAAI,IAAI,QAAQ,CAAC,OAAO,CAAC,CAAC,CAAC;KAC7F,CAAC;AACJ,CAAC;AAED,SAAS,OAAO,CAAC,OAAgB;IAC/B,OAAO;QACL,EAAE,EAAE,OAAO,CAAC,EAAE;QACd,GAAG,EAAE,OAAO,CAAC,GAAG;QAChB,KAAK,EAAE,OAAO,CAAC,KAAK;QACpB,SAAS,EAAE,OAAO,CAAC,SAAS;QAC5B,IAAI,EAAE,OAAO,CAAC,IAAI;QAClB,IAAI,EAAE,OAAO,CAAC,IAAI;QAClB,OAAO,EAAE,OAAO,CAAC,OAAO,CAAC,IAAI;QAC7B,GAAG,CAAC,OAAO,CAAC,IAAI,CAAC,GAAG,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,GAAG,EAAE,OAAO,CAAC,IAAI,CAAC,GAAG,EAAE,CAAC;KACrE,CAAC;AACJ,CAAC"}
@@ -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.1",
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",
@@ -20,6 +20,10 @@
20
20
  "types": "./dist/identity/index.d.ts",
21
21
  "default": "./dist/identity/index.js"
22
22
  },
23
+ "./local": {
24
+ "types": "./dist/identity/local/index.d.ts",
25
+ "default": "./dist/identity/local/index.js"
26
+ },
23
27
  "./transport": {
24
28
  "types": "./dist/transport/index.d.ts",
25
29
  "default": "./dist/transport/index.js"
@@ -28,6 +32,10 @@
28
32
  "types": "./dist/transport/state/index.d.ts",
29
33
  "default": "./dist/transport/state/index.js"
30
34
  },
35
+ "./pty": {
36
+ "types": "./dist/transport/pty/index.d.ts",
37
+ "default": "./dist/transport/pty/index.js"
38
+ },
31
39
  "./supervision": {
32
40
  "types": "./dist/supervision/index.d.ts",
33
41
  "default": "./dist/supervision/index.js"