@amalgm/core 0.1.4 → 0.1.6

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 (32) hide show
  1. package/PURPOSE.md +9 -0
  2. package/dist/adapters/index.d.ts +1 -0
  3. package/dist/adapters/index.d.ts.map +1 -1
  4. package/dist/identity/credentials/api.d.ts +3 -0
  5. package/dist/identity/credentials/api.d.ts.map +1 -0
  6. package/dist/identity/credentials/api.js +61 -0
  7. package/dist/identity/credentials/api.js.map +1 -0
  8. package/dist/identity/credentials/index.d.ts +4 -0
  9. package/dist/identity/credentials/index.d.ts.map +1 -0
  10. package/dist/identity/credentials/index.js +3 -0
  11. package/dist/identity/credentials/index.js.map +1 -0
  12. package/dist/identity/credentials/types.d.ts +52 -0
  13. package/dist/identity/credentials/types.d.ts.map +1 -0
  14. package/dist/identity/credentials/types.js +2 -0
  15. package/dist/identity/credentials/types.js.map +1 -0
  16. package/dist/identity/credentials/vault.d.ts +31 -0
  17. package/dist/identity/credentials/vault.d.ts.map +1 -0
  18. package/dist/identity/credentials/vault.js +214 -0
  19. package/dist/identity/credentials/vault.js.map +1 -0
  20. package/dist/identity/index.d.ts +1 -0
  21. package/dist/identity/index.d.ts.map +1 -1
  22. package/dist/identity/index.js +1 -0
  23. package/dist/identity/index.js.map +1 -1
  24. package/dist/transport/diagnostics.d.ts +48 -0
  25. package/dist/transport/diagnostics.d.ts.map +1 -0
  26. package/dist/transport/diagnostics.js +106 -0
  27. package/dist/transport/diagnostics.js.map +1 -0
  28. package/dist/transport/index.d.ts +1 -0
  29. package/dist/transport/index.d.ts.map +1 -1
  30. package/dist/transport/index.js +1 -0
  31. package/dist/transport/index.js.map +1 -1
  32. package/package.json +9 -1
package/PURPOSE.md CHANGED
@@ -87,6 +87,15 @@ source until each module is cut over.
87
87
  the host supplies the native spawn, path, clock, randomness, and timer
88
88
  effects. A reconnect attaches to the same process rather than creating
89
89
  hidden replacement state.
90
+ 15. **Diagnostics are bounded evidence, never a secret channel.** A diagnostic
91
+ read names one declared service, reads at most the configured tail bound,
92
+ and applies the shared redaction law before any content crosses the
93
+ gateway; arbitrary paths and unbounded files are not diagnostic inputs.
94
+ 16. **One machine-local vault owns user credentials.** Every credential is
95
+ encrypted before persistence, every public view contains only a hint and
96
+ fingerprint, and plaintext leaves solely through explicit resolution.
97
+ Compatibility APIs share this vault; they never create a second secret
98
+ file or cloud authority.
90
99
 
91
100
  ## Five surfaces, one behavior
92
101
 
@@ -10,4 +10,5 @@
10
10
  export type { ClockIsoPort, ClockMsPort, RandomHexPort, Sha256HexPort, ResolvePathPort, } from '../identity/ports.js';
11
11
  export type { TimingSafeEqualPort } from '../transport/auth.js';
12
12
  export type { HmacHexPort } from '../transport/ingress.js';
13
+ export type { CredentialCipherPort, CredentialStorePort } from '../identity/credentials/index.js';
13
14
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/adapters/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,YAAY,EACV,YAAY,EACZ,WAAW,EACX,aAAa,EACb,aAAa,EACb,eAAe,GAChB,MAAM,sBAAsB,CAAC;AAC9B,YAAY,EAAE,mBAAmB,EAAE,MAAM,sBAAsB,CAAC;AAChE,YAAY,EAAE,WAAW,EAAE,MAAM,yBAAyB,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/adapters/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,YAAY,EACV,YAAY,EACZ,WAAW,EACX,aAAa,EACb,aAAa,EACb,eAAe,GAChB,MAAM,sBAAsB,CAAC;AAC9B,YAAY,EAAE,mBAAmB,EAAE,MAAM,sBAAsB,CAAC;AAChE,YAAY,EAAE,WAAW,EAAE,MAAM,yBAAyB,CAAC;AAC3D,YAAY,EAAE,oBAAoB,EAAE,mBAAmB,EAAE,MAAM,kCAAkC,CAAC"}
@@ -0,0 +1,3 @@
1
+ import { CredentialVault } from './vault.js';
2
+ export declare function createCredentialsApi(vault: CredentialVault): (request: Request) => Promise<Response>;
3
+ //# sourceMappingURL=api.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"api.d.ts","sourceRoot":"","sources":["../../../src/identity/credentials/api.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAE,MAAM,YAAY,CAAC;AAO7C,wBAAgB,oBAAoB,CAAC,KAAK,EAAE,eAAe,GAAG,CAAC,OAAO,EAAE,OAAO,KAAK,OAAO,CAAC,QAAQ,CAAC,CAmCpG"}
@@ -0,0 +1,61 @@
1
+ import { CredentialVault } from './vault.js';
2
+ export function createCredentialsApi(vault) {
3
+ return async (request) => {
4
+ const pathname = new URL(request.url).pathname;
5
+ if (pathname !== '/credentials' && pathname !== '/user-api-keys')
6
+ return json(404, { error: 'not found' });
7
+ try {
8
+ if (pathname === '/credentials') {
9
+ if (request.method === 'GET')
10
+ return json(200, { credentials: vault.list() });
11
+ const body = await requestBody(request);
12
+ if (request.method === 'POST') {
13
+ return json(200, { credential: vault.upsert({
14
+ ...(typeof body.id === 'string' ? { id: body.id } : {}),
15
+ ...(typeof body.name === 'string' ? { name: body.name } : {}),
16
+ ...(typeof body.providerKind === 'string' ? { providerKind: body.providerKind } : {}),
17
+ ...(typeof body.baseUrl === 'string' ? { baseUrl: body.baseUrl } : {}),
18
+ key: typeof body.key === 'string' ? body.key : '',
19
+ }) });
20
+ }
21
+ if (request.method === 'DELETE')
22
+ return json(200, vault.delete(typeof body.id === 'string' ? body.id : ''));
23
+ return methodNotAllowed('GET, POST, DELETE');
24
+ }
25
+ const body = await requestBody(request);
26
+ if (request.method === 'POST') {
27
+ const saved = vault.putHarnessKey(body.harnessId, body.apiKey);
28
+ return json(200, { keyHint: saved.keyHint });
29
+ }
30
+ if (request.method === 'DELETE') {
31
+ return json(200, vault.deleteHarnessKeys(body.harnessId));
32
+ }
33
+ return methodNotAllowed('POST, DELETE');
34
+ }
35
+ catch (error) {
36
+ return json(400, { error: error instanceof Error ? error.message : 'Invalid credential request' });
37
+ }
38
+ };
39
+ }
40
+ async function requestBody(request) {
41
+ const text = await request.text();
42
+ if (!text)
43
+ return {};
44
+ const value = JSON.parse(text);
45
+ if (!value || typeof value !== 'object' || Array.isArray(value))
46
+ throw new Error('request body must be an object');
47
+ return value;
48
+ }
49
+ function methodNotAllowed(allow) {
50
+ return new Response(JSON.stringify({ error: 'method not allowed' }), {
51
+ status: 405,
52
+ headers: { 'content-type': 'application/json', 'cache-control': 'no-store', allow },
53
+ });
54
+ }
55
+ function json(status, body) {
56
+ return new Response(JSON.stringify(body), {
57
+ status,
58
+ headers: { 'content-type': 'application/json', 'cache-control': 'no-store' },
59
+ });
60
+ }
61
+ //# sourceMappingURL=api.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"api.js","sourceRoot":"","sources":["../../../src/identity/credentials/api.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAE,MAAM,YAAY,CAAC;AAO7C,MAAM,UAAU,oBAAoB,CAAC,KAAsB;IACzD,OAAO,KAAK,EAAE,OAAO,EAAE,EAAE;QACvB,MAAM,QAAQ,GAAG,IAAI,GAAG,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,QAAQ,CAAC;QAC/C,IAAI,QAAQ,KAAK,cAAc,IAAI,QAAQ,KAAK,gBAAgB;YAAE,OAAO,IAAI,CAAC,GAAG,EAAE,EAAE,KAAK,EAAE,WAAW,EAAE,CAAC,CAAC;QAE3G,IAAI,CAAC;YACH,IAAI,QAAQ,KAAK,cAAc,EAAE,CAAC;gBAChC,IAAI,OAAO,CAAC,MAAM,KAAK,KAAK;oBAAE,OAAO,IAAI,CAAC,GAAG,EAAE,EAAE,WAAW,EAAE,KAAK,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC;gBAC9E,MAAM,IAAI,GAAG,MAAM,WAAW,CAAC,OAAO,CAAC,CAAC;gBACxC,IAAI,OAAO,CAAC,MAAM,KAAK,MAAM,EAAE,CAAC;oBAC9B,OAAO,IAAI,CAAC,GAAG,EAAE,EAAE,UAAU,EAAE,KAAK,CAAC,MAAM,CAAC;4BAC1C,GAAG,CAAC,OAAO,IAAI,CAAC,EAAE,KAAK,QAAQ,CAAC,CAAC,CAAC,EAAE,EAAE,EAAE,IAAI,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;4BACvD,GAAG,CAAC,OAAO,IAAI,CAAC,IAAI,KAAK,QAAQ,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,IAAI,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;4BAC7D,GAAG,CAAC,OAAO,IAAI,CAAC,YAAY,KAAK,QAAQ,CAAC,CAAC,CAAC,EAAE,YAAY,EAAE,IAAI,CAAC,YAAsC,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;4BAC/G,GAAG,CAAC,OAAO,IAAI,CAAC,OAAO,KAAK,QAAQ,CAAC,CAAC,CAAC,EAAE,OAAO,EAAE,IAAI,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;4BACtE,GAAG,EAAE,OAAO,IAAI,CAAC,GAAG,KAAK,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE;yBAClD,CAAC,EAAE,CAAC,CAAC;gBACR,CAAC;gBACD,IAAI,OAAO,CAAC,MAAM,KAAK,QAAQ;oBAAE,OAAO,IAAI,CAAC,GAAG,EAAE,KAAK,CAAC,MAAM,CAAC,OAAO,IAAI,CAAC,EAAE,KAAK,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;gBAC5G,OAAO,gBAAgB,CAAC,mBAAmB,CAAC,CAAC;YAC/C,CAAC;YAED,MAAM,IAAI,GAAG,MAAM,WAAW,CAAC,OAAO,CAAC,CAAC;YACxC,IAAI,OAAO,CAAC,MAAM,KAAK,MAAM,EAAE,CAAC;gBAC9B,MAAM,KAAK,GAAG,KAAK,CAAC,aAAa,CAAC,IAAI,CAAC,SAAS,EAAE,IAAI,CAAC,MAAM,CAAC,CAAC;gBAC/D,OAAO,IAAI,CAAC,GAAG,EAAE,EAAE,OAAO,EAAE,KAAK,CAAC,OAAO,EAAE,CAAC,CAAC;YAC/C,CAAC;YACD,IAAI,OAAO,CAAC,MAAM,KAAK,QAAQ,EAAE,CAAC;gBAChC,OAAO,IAAI,CAAC,GAAG,EAAE,KAAK,CAAC,iBAAiB,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC;YAC5D,CAAC;YACD,OAAO,gBAAgB,CAAC,cAAc,CAAC,CAAC;QAC1C,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,OAAO,IAAI,CAAC,GAAG,EAAE,EAAE,KAAK,EAAE,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,4BAA4B,EAAE,CAAC,CAAC;QACrG,CAAC;IACH,CAAC,CAAC;AACJ,CAAC;AAED,KAAK,UAAU,WAAW,CAAC,OAAgB;IACzC,MAAM,IAAI,GAAG,MAAM,OAAO,CAAC,IAAI,EAAE,CAAC;IAClC,IAAI,CAAC,IAAI;QAAE,OAAO,EAAE,CAAC;IACrB,MAAM,KAAK,GAAY,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;IACxC,IAAI,CAAC,KAAK,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC;QAAE,MAAM,IAAI,KAAK,CAAC,gCAAgC,CAAC,CAAC;IACnH,OAAO,KAAa,CAAC;AACvB,CAAC;AAED,SAAS,gBAAgB,CAAC,KAAa;IACrC,OAAO,IAAI,QAAQ,CAAC,IAAI,CAAC,SAAS,CAAC,EAAE,KAAK,EAAE,oBAAoB,EAAE,CAAC,EAAE;QACnE,MAAM,EAAE,GAAG;QACX,OAAO,EAAE,EAAE,cAAc,EAAE,kBAAkB,EAAE,eAAe,EAAE,UAAU,EAAE,KAAK,EAAE;KACpF,CAAC,CAAC;AACL,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
+ export { createCredentialsApi } from './api.js';
2
+ export { CredentialVault, DEFAULT_BASE_URL, inferProviderKind, normalizeBaseUrl } from './vault.js';
3
+ export type * from './types.js';
4
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/identity/credentials/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,oBAAoB,EAAE,MAAM,UAAU,CAAC;AAChD,OAAO,EAAE,eAAe,EAAE,gBAAgB,EAAE,iBAAiB,EAAE,gBAAgB,EAAE,MAAM,YAAY,CAAC;AACpG,mBAAmB,YAAY,CAAC"}
@@ -0,0 +1,3 @@
1
+ export { createCredentialsApi } from './api.js';
2
+ export { CredentialVault, DEFAULT_BASE_URL, inferProviderKind, normalizeBaseUrl } from './vault.js';
3
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/identity/credentials/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,oBAAoB,EAAE,MAAM,UAAU,CAAC;AAChD,OAAO,EAAE,eAAe,EAAE,gBAAgB,EAAE,iBAAiB,EAAE,gBAAgB,EAAE,MAAM,YAAY,CAAC"}
@@ -0,0 +1,52 @@
1
+ export type CredentialProviderKind = 'anthropic_compatible' | 'openai_compatible' | 'ai_gateway';
2
+ export type ByokHarnessId = 'claude_code' | 'codex' | 'opencode' | 'pi';
3
+ export interface CredentialSummary {
4
+ readonly id: string;
5
+ readonly name: string;
6
+ readonly providerKind: CredentialProviderKind;
7
+ readonly keyHint: string;
8
+ readonly tokenFingerprint: string;
9
+ readonly createdAt: string;
10
+ readonly updatedAt: string;
11
+ }
12
+ export interface StoredCredential extends CredentialSummary {
13
+ readonly baseUrl: string;
14
+ readonly encryptedKey: unknown;
15
+ readonly slot?: string;
16
+ }
17
+ export interface CredentialStoreDocument {
18
+ readonly version: 1;
19
+ readonly credentials: readonly StoredCredential[];
20
+ }
21
+ export interface CredentialStorePort {
22
+ read(): unknown;
23
+ write(document: CredentialStoreDocument): void;
24
+ }
25
+ export interface CredentialCipherPort {
26
+ encrypt(secret: string): unknown;
27
+ decrypt(envelope: unknown): string;
28
+ fingerprint(secret: string): string;
29
+ }
30
+ export interface CredentialVaultPorts {
31
+ readonly store: CredentialStorePort;
32
+ readonly cipher: CredentialCipherPort;
33
+ readonly now: () => string;
34
+ readonly randomId: () => string;
35
+ }
36
+ export interface UpsertCredentialInput {
37
+ readonly id?: string;
38
+ readonly name?: string;
39
+ readonly key: string;
40
+ readonly providerKind?: CredentialProviderKind;
41
+ readonly baseUrl?: string;
42
+ }
43
+ export interface ResolveCredentialInput {
44
+ readonly credentialId?: string;
45
+ readonly harness?: ByokHarnessId;
46
+ readonly providerKind?: CredentialProviderKind;
47
+ }
48
+ export interface ResolvedCredential extends CredentialSummary {
49
+ readonly baseUrl: string;
50
+ readonly key: string;
51
+ }
52
+ //# sourceMappingURL=types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../src/identity/credentials/types.ts"],"names":[],"mappings":"AAAA,MAAM,MAAM,sBAAsB,GAC9B,sBAAsB,GACtB,mBAAmB,GACnB,YAAY,CAAC;AAEjB,MAAM,MAAM,aAAa,GAAG,aAAa,GAAG,OAAO,GAAG,UAAU,GAAG,IAAI,CAAC;AAExE,MAAM,WAAW,iBAAiB;IAChC,QAAQ,CAAC,EAAE,EAAE,MAAM,CAAC;IACpB,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,YAAY,EAAE,sBAAsB,CAAC;IAC9C,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IACzB,QAAQ,CAAC,gBAAgB,EAAE,MAAM,CAAC;IAClC,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;IAC3B,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;CAC5B;AAED,MAAM,WAAW,gBAAiB,SAAQ,iBAAiB;IACzD,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IACzB,QAAQ,CAAC,YAAY,EAAE,OAAO,CAAC;IAC/B,QAAQ,CAAC,IAAI,CAAC,EAAE,MAAM,CAAC;CACxB;AAED,MAAM,WAAW,uBAAuB;IACtC,QAAQ,CAAC,OAAO,EAAE,CAAC,CAAC;IACpB,QAAQ,CAAC,WAAW,EAAE,SAAS,gBAAgB,EAAE,CAAC;CACnD;AAED,MAAM,WAAW,mBAAmB;IAClC,IAAI,IAAI,OAAO,CAAC;IAChB,KAAK,CAAC,QAAQ,EAAE,uBAAuB,GAAG,IAAI,CAAC;CAChD;AAED,MAAM,WAAW,oBAAoB;IACnC,OAAO,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC;IACjC,OAAO,CAAC,QAAQ,EAAE,OAAO,GAAG,MAAM,CAAC;IACnC,WAAW,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,CAAC;CACrC;AAED,MAAM,WAAW,oBAAoB;IACnC,QAAQ,CAAC,KAAK,EAAE,mBAAmB,CAAC;IACpC,QAAQ,CAAC,MAAM,EAAE,oBAAoB,CAAC;IACtC,QAAQ,CAAC,GAAG,EAAE,MAAM,MAAM,CAAC;IAC3B,QAAQ,CAAC,QAAQ,EAAE,MAAM,MAAM,CAAC;CACjC;AAED,MAAM,WAAW,qBAAqB;IACpC,QAAQ,CAAC,EAAE,CAAC,EAAE,MAAM,CAAC;IACrB,QAAQ,CAAC,IAAI,CAAC,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAC;IACrB,QAAQ,CAAC,YAAY,CAAC,EAAE,sBAAsB,CAAC;IAC/C,QAAQ,CAAC,OAAO,CAAC,EAAE,MAAM,CAAC;CAC3B;AAED,MAAM,WAAW,sBAAsB;IACrC,QAAQ,CAAC,YAAY,CAAC,EAAE,MAAM,CAAC;IAC/B,QAAQ,CAAC,OAAO,CAAC,EAAE,aAAa,CAAC;IACjC,QAAQ,CAAC,YAAY,CAAC,EAAE,sBAAsB,CAAC;CAChD;AAED,MAAM,WAAW,kBAAmB,SAAQ,iBAAiB;IAC3D,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IACzB,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAC;CACtB"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../../../src/identity/credentials/types.ts"],"names":[],"mappings":""}
@@ -0,0 +1,31 @@
1
+ import type { CredentialProviderKind, CredentialSummary, CredentialVaultPorts, ResolveCredentialInput, ResolvedCredential, UpsertCredentialInput } from './types.js';
2
+ /**
3
+ * Engine reference:
4
+ * - runtime/scripts/chat-core/credentials/store.js
5
+ * - runtime/scripts/amalgm-mcp/credentials/rest.js
6
+ * - runtime/scripts/amalgm-mcp/user-api-keys/rest.js
7
+ */
8
+ declare const DEFAULT_BASE_URL: Record<CredentialProviderKind, string>;
9
+ declare function inferProviderKind(input: {
10
+ readonly baseUrl?: string;
11
+ readonly key?: string;
12
+ }): CredentialProviderKind;
13
+ declare function normalizeBaseUrl(baseUrl: unknown, providerKind: CredentialProviderKind): string;
14
+ export declare class CredentialVault {
15
+ #private;
16
+ constructor(ports: CredentialVaultPorts);
17
+ list(): CredentialSummary[];
18
+ upsert(input: UpsertCredentialInput): CredentialSummary;
19
+ delete(id: string): {
20
+ readonly ok: true;
21
+ readonly deleted: boolean;
22
+ };
23
+ putHarnessKey(harnessId: unknown, apiKey: unknown): CredentialSummary;
24
+ deleteHarnessKeys(harnessId?: unknown): {
25
+ readonly ok: true;
26
+ readonly deleted: number;
27
+ };
28
+ resolve(input?: ResolveCredentialInput): ResolvedCredential | null;
29
+ }
30
+ export { DEFAULT_BASE_URL, inferProviderKind, normalizeBaseUrl };
31
+ //# sourceMappingURL=vault.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"vault.d.ts","sourceRoot":"","sources":["../../../src/identity/credentials/vault.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAEV,sBAAsB,EAEtB,iBAAiB,EACjB,oBAAoB,EACpB,sBAAsB,EACtB,kBAAkB,EAElB,qBAAqB,EACtB,MAAM,YAAY,CAAC;AAEpB;;;;;GAKG;AAEH,QAAA,MAAM,gBAAgB,EAAE,MAAM,CAAC,sBAAsB,EAAE,MAAM,CAI5D,CAAC;AAsCF,iBAAS,iBAAiB,CAAC,KAAK,EAAE;IAAE,QAAQ,CAAC,OAAO,CAAC,EAAE,MAAM,CAAC;IAAC,QAAQ,CAAC,GAAG,CAAC,EAAE,MAAM,CAAA;CAAE,GAAG,sBAAsB,CAM9G;AAED,iBAAS,gBAAgB,CAAC,OAAO,EAAE,OAAO,EAAE,YAAY,EAAE,sBAAsB,GAAG,MAAM,CAMxF;AA2DD,qBAAa,eAAe;;gBAGd,KAAK,EAAE,oBAAoB;IAIvC,IAAI,IAAI,iBAAiB,EAAE;IAM3B,MAAM,CAAC,KAAK,EAAE,qBAAqB,GAAG,iBAAiB;IAIvD,MAAM,CAAC,EAAE,EAAE,MAAM,GAAG;QAAE,QAAQ,CAAC,EAAE,EAAE,IAAI,CAAC;QAAC,QAAQ,CAAC,OAAO,EAAE,OAAO,CAAA;KAAE;IAQpE,aAAa,CAAC,SAAS,EAAE,OAAO,EAAE,MAAM,EAAE,OAAO,GAAG,iBAAiB;IAcrE,iBAAiB,CAAC,SAAS,CAAC,EAAE,OAAO,GAAG;QAAE,QAAQ,CAAC,EAAE,EAAE,IAAI,CAAC;QAAC,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAA;KAAE;IAQvF,OAAO,CAAC,KAAK,GAAE,sBAA2B,GAAG,kBAAkB,GAAG,IAAI;CAoDvE;AAED,OAAO,EAAE,gBAAgB,EAAE,iBAAiB,EAAE,gBAAgB,EAAE,CAAC"}
@@ -0,0 +1,214 @@
1
+ /**
2
+ * Engine reference:
3
+ * - runtime/scripts/chat-core/credentials/store.js
4
+ * - runtime/scripts/amalgm-mcp/credentials/rest.js
5
+ * - runtime/scripts/amalgm-mcp/user-api-keys/rest.js
6
+ */
7
+ const DEFAULT_BASE_URL = {
8
+ anthropic_compatible: 'https://api.anthropic.com',
9
+ openai_compatible: 'https://api.openai.com/v1',
10
+ ai_gateway: 'https://ai-gateway.vercel.sh/v1',
11
+ };
12
+ const HARNESS = {
13
+ claude_code: { name: 'Anthropic', providerKind: 'anthropic_compatible' },
14
+ codex: { name: 'OpenAI', providerKind: 'openai_compatible' },
15
+ opencode: { name: 'Vercel AI Gateway', providerKind: 'ai_gateway' },
16
+ pi: { name: 'OpenAI', providerKind: 'openai_compatible' },
17
+ };
18
+ const PROVIDERS_FOR_HARNESS = {
19
+ claude_code: ['anthropic_compatible'],
20
+ codex: ['openai_compatible'],
21
+ opencode: ['ai_gateway', 'openai_compatible', 'anthropic_compatible'],
22
+ pi: [],
23
+ };
24
+ function required(value, label) {
25
+ const text = typeof value === 'string' ? value.trim() : '';
26
+ if (!text)
27
+ throw new Error(`${label} is required`);
28
+ return text;
29
+ }
30
+ function provider(value) {
31
+ return value === 'anthropic_compatible'
32
+ || value === 'openai_compatible'
33
+ || value === 'ai_gateway'
34
+ ? value
35
+ : null;
36
+ }
37
+ function harness(value) {
38
+ if (value === 'claude_code' || value === 'codex' || value === 'opencode' || value === 'pi')
39
+ return value;
40
+ throw new Error(`Unsupported BYOK harness: ${String(value || '')}`);
41
+ }
42
+ function inferProviderKind(input) {
43
+ const url = String(input.baseUrl || '').toLowerCase();
44
+ const key = String(input.key || '').trim();
45
+ if (url.includes('anthropic') || key.startsWith('sk-ant-'))
46
+ return 'anthropic_compatible';
47
+ if (url.includes('ai-gateway.vercel') || url.includes('gateway.vercel') || key.startsWith('v0_'))
48
+ return 'ai_gateway';
49
+ return 'openai_compatible';
50
+ }
51
+ function normalizeBaseUrl(baseUrl, providerKind) {
52
+ const value = String(baseUrl || DEFAULT_BASE_URL[providerKind]).trim() || DEFAULT_BASE_URL[providerKind];
53
+ const url = new URL(value);
54
+ if (url.protocol !== 'http:' && url.protocol !== 'https:')
55
+ throw new Error('baseUrl must use http or https');
56
+ if (url.username || url.password)
57
+ throw new Error('baseUrl cannot contain credentials');
58
+ return value.replace(/\/+$/, '');
59
+ }
60
+ function defaultName(providerKind, baseUrl) {
61
+ if (providerKind === 'anthropic_compatible')
62
+ return 'Anthropic';
63
+ if (providerKind === 'ai_gateway')
64
+ return 'Vercel AI Gateway';
65
+ try {
66
+ return new URL(baseUrl).hostname.replace(/^api\./, '') || 'OpenAI Compatible';
67
+ }
68
+ catch {
69
+ return 'OpenAI Compatible';
70
+ }
71
+ }
72
+ function keyHint(key) {
73
+ return `...${key.slice(-4)}`;
74
+ }
75
+ function summary(record) {
76
+ return {
77
+ id: record.id,
78
+ name: record.name,
79
+ providerKind: record.providerKind,
80
+ keyHint: record.keyHint,
81
+ tokenFingerprint: record.tokenFingerprint,
82
+ createdAt: record.createdAt,
83
+ updatedAt: record.updatedAt,
84
+ };
85
+ }
86
+ function storedCredential(value) {
87
+ if (!value || typeof value !== 'object' || Array.isArray(value))
88
+ return null;
89
+ const record = value;
90
+ const providerKind = provider(record.providerKind);
91
+ if (!providerKind)
92
+ return null;
93
+ const id = typeof record.id === 'string' ? record.id.trim() : '';
94
+ const name = typeof record.name === 'string' ? record.name.trim() : '';
95
+ const baseUrl = typeof record.baseUrl === 'string' ? record.baseUrl.trim() : '';
96
+ const hint = typeof record.keyHint === 'string' ? record.keyHint.trim() : '';
97
+ const fingerprint = typeof record.tokenFingerprint === 'string' ? record.tokenFingerprint.trim() : '';
98
+ const createdAt = typeof record.createdAt === 'string' ? record.createdAt.trim() : '';
99
+ const updatedAt = typeof record.updatedAt === 'string' ? record.updatedAt.trim() : '';
100
+ if (!id || !name || !baseUrl || !hint || !fingerprint || !createdAt || !updatedAt || !('encryptedKey' in record))
101
+ return null;
102
+ return {
103
+ id, name, providerKind, baseUrl,
104
+ keyHint: hint,
105
+ tokenFingerprint: fingerprint,
106
+ encryptedKey: record.encryptedKey,
107
+ createdAt,
108
+ updatedAt,
109
+ ...(typeof record.slot === 'string' && record.slot.trim() ? { slot: record.slot.trim() } : {}),
110
+ };
111
+ }
112
+ function document(value) {
113
+ if (!value || typeof value !== 'object' || Array.isArray(value))
114
+ return { version: 1, credentials: [] };
115
+ const records = value.credentials;
116
+ if (!Array.isArray(records))
117
+ return { version: 1, credentials: [] };
118
+ return { version: 1, credentials: records.map(storedCredential).filter((record) => record !== null) };
119
+ }
120
+ export class CredentialVault {
121
+ #ports;
122
+ constructor(ports) {
123
+ this.#ports = ports;
124
+ }
125
+ list() {
126
+ return document(this.#ports.store.read()).credentials
127
+ .map(summary)
128
+ .sort((left, right) => left.createdAt.localeCompare(right.createdAt) || left.id.localeCompare(right.id));
129
+ }
130
+ upsert(input) {
131
+ return summary(this.#save(input));
132
+ }
133
+ delete(id) {
134
+ const target = required(id, 'id');
135
+ const current = document(this.#ports.store.read());
136
+ const credentials = current.credentials.filter((record) => record.id !== target);
137
+ this.#ports.store.write({ version: 1, credentials });
138
+ return { ok: true, deleted: credentials.length !== current.credentials.length };
139
+ }
140
+ putHarnessKey(harnessId, apiKey) {
141
+ const id = harness(harnessId);
142
+ const descriptor = HARNESS[id];
143
+ const current = document(this.#ports.store.read());
144
+ const existing = current.credentials.find((record) => record.slot === `harness:${id}`);
145
+ return summary(this.#save({
146
+ ...(existing ? { id: existing.id } : {}),
147
+ name: descriptor.name,
148
+ providerKind: descriptor.providerKind,
149
+ baseUrl: DEFAULT_BASE_URL[descriptor.providerKind],
150
+ key: required(apiKey, 'apiKey'),
151
+ }, `harness:${id}`));
152
+ }
153
+ deleteHarnessKeys(harnessId) {
154
+ const slot = harnessId === undefined ? null : `harness:${harness(harnessId)}`;
155
+ const current = document(this.#ports.store.read());
156
+ const credentials = current.credentials.filter((record) => slot ? record.slot !== slot : !record.slot?.startsWith('harness:'));
157
+ this.#ports.store.write({ version: 1, credentials });
158
+ return { ok: true, deleted: current.credentials.length - credentials.length };
159
+ }
160
+ resolve(input = {}) {
161
+ const current = document(this.#ports.store.read());
162
+ const allowed = input.providerKind
163
+ ? [input.providerKind]
164
+ : input.harness
165
+ ? PROVIDERS_FOR_HARNESS[harness(input.harness)]
166
+ : [];
167
+ const record = input.credentialId
168
+ ? current.credentials.find((candidate) => candidate.id === input.credentialId)
169
+ : allowed.length
170
+ ? current.credentials.find((candidate) => allowed.includes(candidate.providerKind))
171
+ : undefined;
172
+ if (!record)
173
+ return null;
174
+ if (allowed.length && !allowed.includes(record.providerKind)) {
175
+ throw new Error(`Credential ${record.name || record.id} is not compatible with ${input.harness || input.providerKind}`);
176
+ }
177
+ return { ...summary(record), baseUrl: record.baseUrl, key: this.#ports.cipher.decrypt(record.encryptedKey) };
178
+ }
179
+ #save(input, slot) {
180
+ const key = required(input.key, 'key');
181
+ const explicitProviderKind = input.providerKind === undefined ? null : provider(input.providerKind);
182
+ if (input.providerKind !== undefined && !explicitProviderKind) {
183
+ throw new Error(`Unsupported credential provider: ${String(input.providerKind)}`);
184
+ }
185
+ const providerKind = explicitProviderKind || inferProviderKind({
186
+ ...(input.baseUrl === undefined ? {} : { baseUrl: input.baseUrl }),
187
+ key,
188
+ });
189
+ const baseUrl = normalizeBaseUrl(input.baseUrl, providerKind);
190
+ const now = this.#ports.now();
191
+ const current = document(this.#ports.store.read());
192
+ const id = input.id ? required(input.id, 'id') : this.#ports.randomId();
193
+ const existing = current.credentials.find((record) => record.id === id);
194
+ const record = {
195
+ id,
196
+ name: String(input.name || '').trim() || defaultName(providerKind, baseUrl),
197
+ providerKind,
198
+ baseUrl,
199
+ keyHint: keyHint(key),
200
+ tokenFingerprint: this.#ports.cipher.fingerprint(key),
201
+ encryptedKey: this.#ports.cipher.encrypt(key),
202
+ createdAt: existing?.createdAt || now,
203
+ updatedAt: now,
204
+ ...(slot ? { slot } : existing?.slot ? { slot: existing.slot } : {}),
205
+ };
206
+ this.#ports.store.write({
207
+ version: 1,
208
+ credentials: [...current.credentials.filter((candidate) => candidate.id !== id), record],
209
+ });
210
+ return record;
211
+ }
212
+ }
213
+ export { DEFAULT_BASE_URL, inferProviderKind, normalizeBaseUrl };
214
+ //# sourceMappingURL=vault.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"vault.js","sourceRoot":"","sources":["../../../src/identity/credentials/vault.ts"],"names":[],"mappings":"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"}
@@ -10,6 +10,7 @@ export * from './labels.js';
10
10
  export * from './layout.js';
11
11
  export * from './product-state.js';
12
12
  export * from './local/index.js';
13
+ export * from './credentials/index.js';
13
14
  export * from './ids.js';
14
15
  export * from './auth-records.js';
15
16
  //# 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,kBAAkB,CAAC;AACjC,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,wBAAwB,CAAC;AACvC,cAAc,UAAU,CAAC;AACzB,cAAc,mBAAmB,CAAC"}
@@ -10,6 +10,7 @@ export * from './labels.js';
10
10
  export * from './layout.js';
11
11
  export * from './product-state.js';
12
12
  export * from './local/index.js';
13
+ export * from './credentials/index.js';
13
14
  export * from './ids.js';
14
15
  export * from './auth-records.js';
15
16
  //# 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,kBAAkB,CAAC;AACjC,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,wBAAwB,CAAC;AACvC,cAAc,UAAU,CAAC;AACzB,cAAc,mBAAmB,CAAC"}
@@ -0,0 +1,48 @@
1
+ /** Engine parity reference: amalgm-engine/runtime/scripts/local-gateway.js:77-96,427-560. */
2
+ export declare const DEFAULT_DIAGNOSTIC_LOG_TAIL_BYTES: number;
3
+ export declare const MAX_DIAGNOSTIC_LOG_TAIL_BYTES: number;
4
+ export declare const MAX_DIAGNOSTIC_LOG_LINES = 5000;
5
+ export declare const DIAGNOSTIC_LOG_FILES: {
6
+ readonly daemon: "daemon.log";
7
+ readonly 'chat-server': "chat-server.log";
8
+ readonly 'local-gateway': "local-gateway.log";
9
+ readonly 'amalgm-mcp': "amalgm-mcp.log";
10
+ readonly 'port-monitor': "port-monitor.log";
11
+ };
12
+ export declare const DIAGNOSTIC_LOG_ALIASES: Readonly<Record<string, DiagnosticLogService>>;
13
+ export type DiagnosticLogService = keyof typeof DIAGNOSTIC_LOG_FILES;
14
+ export interface DiagnosticLogTail {
15
+ readonly path: string;
16
+ readonly size: number;
17
+ readonly mtime: string;
18
+ readonly bytes: number;
19
+ readonly content: string;
20
+ readonly byteTruncated: boolean;
21
+ }
22
+ export type DiagnosticLogReadResult = {
23
+ readonly kind: 'found';
24
+ readonly tail: DiagnosticLogTail;
25
+ } | {
26
+ readonly kind: 'not_found';
27
+ readonly path: string;
28
+ } | {
29
+ readonly kind: 'not_file';
30
+ readonly path: string;
31
+ } | {
32
+ readonly kind: 'error';
33
+ readonly path: string;
34
+ readonly message: string;
35
+ };
36
+ export interface DiagnosticLogHost {
37
+ readTail(filename: string, maxBytes: number): Promise<DiagnosticLogReadResult>;
38
+ }
39
+ export declare function diagnosticLogServices(): DiagnosticLogService[];
40
+ export declare function normalizeDiagnosticLogService(value: unknown): string;
41
+ export declare function parseDiagnosticTailBytes(value: unknown): number;
42
+ export declare function parseDiagnosticLineLimit(value: unknown): number | null;
43
+ export declare function applyDiagnosticLineLimit(content: string, lineLimit: number | null): {
44
+ readonly content: string;
45
+ readonly lineTruncated: boolean;
46
+ };
47
+ export declare function createDiagnosticsApi(host: DiagnosticLogHost): (request: Request) => Promise<Response>;
48
+ //# sourceMappingURL=diagnostics.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"diagnostics.d.ts","sourceRoot":"","sources":["../../src/transport/diagnostics.ts"],"names":[],"mappings":"AAEA,6FAA6F;AAC7F,eAAO,MAAM,iCAAiC,QAAa,CAAC;AAC5D,eAAO,MAAM,6BAA6B,QAAkB,CAAC;AAC7D,eAAO,MAAM,wBAAwB,OAAO,CAAC;AAE7C,eAAO,MAAM,oBAAoB;;;;;;CAMvB,CAAC;AAEX,eAAO,MAAM,sBAAsB,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,oBAAoB,CAAC,CAQjF,CAAC;AAEF,MAAM,MAAM,oBAAoB,GAAG,MAAM,OAAO,oBAAoB,CAAC;AAErE,MAAM,WAAW,iBAAiB;IAChC,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IACzB,QAAQ,CAAC,aAAa,EAAE,OAAO,CAAC;CACjC;AAED,MAAM,MAAM,uBAAuB,GAC/B;IAAE,QAAQ,CAAC,IAAI,EAAE,OAAO,CAAC;IAAC,QAAQ,CAAC,IAAI,EAAE,iBAAiB,CAAA;CAAE,GAC5D;IAAE,QAAQ,CAAC,IAAI,EAAE,WAAW,CAAC;IAAC,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAA;CAAE,GACrD;IAAE,QAAQ,CAAC,IAAI,EAAE,UAAU,CAAC;IAAC,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAA;CAAE,GACpD;IAAE,QAAQ,CAAC,IAAI,EAAE,OAAO,CAAC;IAAC,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IAAC,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAA;CAAE,CAAC;AAEhF,MAAM,WAAW,iBAAiB;IAChC,QAAQ,CAAC,QAAQ,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,uBAAuB,CAAC,CAAC;CAChF;AAED,wBAAgB,qBAAqB,IAAI,oBAAoB,EAAE,CAE9D;AAED,wBAAgB,6BAA6B,CAAC,KAAK,EAAE,OAAO,GAAG,MAAM,CAKpE;AAED,wBAAgB,wBAAwB,CAAC,KAAK,EAAE,OAAO,GAAG,MAAM,CAI/D;AAED,wBAAgB,wBAAwB,CAAC,KAAK,EAAE,OAAO,GAAG,MAAM,GAAG,IAAI,CAItE;AAED,wBAAgB,wBAAwB,CACtC,OAAO,EAAE,MAAM,EACf,SAAS,EAAE,MAAM,GAAG,IAAI,GACvB;IAAE,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IAAC,QAAQ,CAAC,aAAa,EAAE,OAAO,CAAA;CAAE,CAK/D;AAED,wBAAgB,oBAAoB,CAAC,IAAI,EAAE,iBAAiB,GAAG,CAAC,OAAO,EAAE,OAAO,KAAK,OAAO,CAAC,QAAQ,CAAC,CAiDrG"}
@@ -0,0 +1,106 @@
1
+ import { redactSecrets } from './admission.js';
2
+ /** Engine parity reference: amalgm-engine/runtime/scripts/local-gateway.js:77-96,427-560. */
3
+ export const DEFAULT_DIAGNOSTIC_LOG_TAIL_BYTES = 256 * 1024;
4
+ export const MAX_DIAGNOSTIC_LOG_TAIL_BYTES = 2 * 1024 * 1024;
5
+ export const MAX_DIAGNOSTIC_LOG_LINES = 5000;
6
+ export const DIAGNOSTIC_LOG_FILES = {
7
+ daemon: 'daemon.log',
8
+ 'chat-server': 'chat-server.log',
9
+ 'local-gateway': 'local-gateway.log',
10
+ 'amalgm-mcp': 'amalgm-mcp.log',
11
+ 'port-monitor': 'port-monitor.log',
12
+ };
13
+ export const DIAGNOSTIC_LOG_ALIASES = {
14
+ chat: 'chat-server',
15
+ mcp: 'amalgm-mcp',
16
+ gateway: 'local-gateway',
17
+ events: 'daemon',
18
+ 'event-tunnel': 'daemon',
19
+ 'chat-tunnel': 'daemon',
20
+ tunnel: 'daemon',
21
+ };
22
+ export function diagnosticLogServices() {
23
+ return Object.keys(DIAGNOSTIC_LOG_FILES);
24
+ }
25
+ export function normalizeDiagnosticLogService(value) {
26
+ let service = String(value || 'daemon').trim().toLowerCase();
27
+ if (service.endsWith('.log'))
28
+ service = service.slice(0, -4);
29
+ service = service.replace(/[^a-z0-9_-]/g, '');
30
+ return DIAGNOSTIC_LOG_ALIASES[service] || service;
31
+ }
32
+ export function parseDiagnosticTailBytes(value) {
33
+ const parsed = Number.parseInt(String(value || ''), 10);
34
+ if (!Number.isFinite(parsed) || parsed < 0)
35
+ return DEFAULT_DIAGNOSTIC_LOG_TAIL_BYTES;
36
+ return Math.min(parsed, MAX_DIAGNOSTIC_LOG_TAIL_BYTES);
37
+ }
38
+ export function parseDiagnosticLineLimit(value) {
39
+ const parsed = Number.parseInt(String(value || ''), 10);
40
+ if (!Number.isFinite(parsed) || parsed <= 0)
41
+ return null;
42
+ return Math.min(parsed, MAX_DIAGNOSTIC_LOG_LINES);
43
+ }
44
+ export function applyDiagnosticLineLimit(content, lineLimit) {
45
+ if (!lineLimit)
46
+ return { content, lineTruncated: false };
47
+ const lines = String(content).split(/\r?\n/);
48
+ if (lines.length <= lineLimit)
49
+ return { content, lineTruncated: false };
50
+ return { content: lines.slice(-lineLimit).join('\n'), lineTruncated: true };
51
+ }
52
+ export function createDiagnosticsApi(host) {
53
+ return async (request) => {
54
+ const url = new URL(request.url);
55
+ if (request.method === 'GET' && url.pathname === '/diagnostics') {
56
+ return json(200, {
57
+ service: 'diagnostics',
58
+ logs: diagnosticLogServices(),
59
+ defaultTailBytes: DEFAULT_DIAGNOSTIC_LOG_TAIL_BYTES,
60
+ maxTailBytes: MAX_DIAGNOSTIC_LOG_TAIL_BYTES,
61
+ maxLines: MAX_DIAGNOSTIC_LOG_LINES,
62
+ });
63
+ }
64
+ if (url.pathname !== '/diagnostics/logs')
65
+ return json(404, { error: 'Unknown diagnostics route' });
66
+ if (request.method !== 'GET') {
67
+ return new Response(null, { status: 405, headers: { allow: 'GET' } });
68
+ }
69
+ const service = normalizeDiagnosticLogService(url.searchParams.get('service') || url.searchParams.get('name'));
70
+ const filename = DIAGNOSTIC_LOG_FILES[service];
71
+ if (!filename) {
72
+ return json(400, {
73
+ error: 'Unknown diagnostic log service',
74
+ availableServices: diagnosticLogServices(),
75
+ });
76
+ }
77
+ const lineLimit = parseDiagnosticLineLimit(url.searchParams.get('lines'));
78
+ const result = await host.readTail(filename, parseDiagnosticTailBytes(url.searchParams.get('tailBytes')));
79
+ if (result.kind === 'not_found') {
80
+ return json(404, { service, path: result.path, exists: false, error: 'Diagnostic log file not found' });
81
+ }
82
+ if (result.kind === 'not_file') {
83
+ return json(400, { service, error: 'Diagnostic log path is not a file' });
84
+ }
85
+ if (result.kind === 'error')
86
+ return json(500, { service, error: result.message });
87
+ const limited = applyDiagnosticLineLimit(result.tail.content, lineLimit);
88
+ return json(200, {
89
+ service,
90
+ path: result.tail.path,
91
+ exists: true,
92
+ size: result.tail.size,
93
+ mtime: result.tail.mtime,
94
+ tailBytes: result.tail.bytes,
95
+ truncated: result.tail.byteTruncated || limited.lineTruncated,
96
+ content: redactSecrets(limited.content),
97
+ });
98
+ };
99
+ }
100
+ function json(status, body) {
101
+ return new Response(JSON.stringify(body), {
102
+ status,
103
+ headers: { 'content-type': 'application/json', 'cache-control': 'no-store' },
104
+ });
105
+ }
106
+ //# sourceMappingURL=diagnostics.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"diagnostics.js","sourceRoot":"","sources":["../../src/transport/diagnostics.ts"],"names":[],"mappings":"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"}
@@ -18,6 +18,7 @@ export * from './routing.js';
18
18
  export * from './shipped-routes.js';
19
19
  export * from './state/index.js';
20
20
  export * from './pty/index.js';
21
+ export * from './diagnostics.js';
21
22
  export * from './admission.js';
22
23
  export * from './ingress.js';
23
24
  //# 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,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,kBAAkB,CAAC;AACjC,cAAc,gBAAgB,CAAC;AAC/B,cAAc,cAAc,CAAC"}
@@ -18,6 +18,7 @@ export * from './routing.js';
18
18
  export * from './shipped-routes.js';
19
19
  export * from './state/index.js';
20
20
  export * from './pty/index.js';
21
+ export * from './diagnostics.js';
21
22
  export * from './admission.js';
22
23
  export * from './ingress.js';
23
24
  //# 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,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,kBAAkB,CAAC;AACjC,cAAc,gBAAgB,CAAC;AAC/B,cAAc,cAAc,CAAC"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@amalgm/core",
3
- "version": "0.1.4",
3
+ "version": "0.1.6",
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",
@@ -24,6 +24,10 @@
24
24
  "types": "./dist/identity/local/index.d.ts",
25
25
  "default": "./dist/identity/local/index.js"
26
26
  },
27
+ "./credentials": {
28
+ "types": "./dist/identity/credentials/index.d.ts",
29
+ "default": "./dist/identity/credentials/index.js"
30
+ },
27
31
  "./transport": {
28
32
  "types": "./dist/transport/index.d.ts",
29
33
  "default": "./dist/transport/index.js"
@@ -36,6 +40,10 @@
36
40
  "types": "./dist/transport/pty/index.d.ts",
37
41
  "default": "./dist/transport/pty/index.js"
38
42
  },
43
+ "./diagnostics": {
44
+ "types": "./dist/transport/diagnostics.d.ts",
45
+ "default": "./dist/transport/diagnostics.js"
46
+ },
39
47
  "./supervision": {
40
48
  "types": "./dist/supervision/index.d.ts",
41
49
  "default": "./dist/supervision/index.js"