@amalgm/chat 0.1.0 → 0.1.1

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
@@ -87,7 +87,7 @@ port, not a law.
87
87
  | Surface | Form | Status |
88
88
  |---|---|---|
89
89
  | SDK | `@amalgm/chat` (this package's `src/`) | porting |
90
- | API | router factory a host mounts | after SDK |
90
+ | API | router factory a host mounts | chat payloads served |
91
91
  | CLI | `amalgm-chat` diagnostic commands | after SDK |
92
92
  | MCP | tool definitions + dispatch | after SDK |
93
93
  | Skill | `skills/chat/SKILL.md` | after SDK |
package/README.md CHANGED
@@ -18,6 +18,7 @@ src/contract/ harnesses, model identities, freeze algebra, chatInput,
18
18
  src/warm/ warm-payload laws: revision, fingerprint, cache policies
19
19
  src/usage/ token algebra, turn finalization, ownership fork, catalog
20
20
  src/normalizers/ claude · codex · opencode · cursor · pi → the grammar
21
+ src/api/ fetch adapters over SDK services
21
22
  src/ports.ts the ports a host injects (clock, hash, uuid)
22
23
  host/ the reference host: adapters, tooling, orchestration,
23
24
  chat-server shell (effectful, imports the laws from dist)
@@ -31,6 +32,30 @@ npm install
31
32
  npm test # build + every exam
32
33
  ```
33
34
 
35
+ ## Serve the machine chat-payload API
36
+
37
+ ```js
38
+ import { createChatPayloadApi } from '@amalgm/chat/api';
39
+ import { ChatPayloadStore } from '@amalgm/chat/warm';
40
+
41
+ const payloads = new ChatPayloadStore({
42
+ store: {
43
+ read: () => readPayloadMapFromYourHost(),
44
+ write: (next) => writePayloadMapFromYourHost(next),
45
+ },
46
+ clockIso: () => new Date().toISOString(),
47
+ clockMs: () => Date.now(),
48
+ emit: (event) => publishStateEventFromYourHost(event),
49
+ });
50
+
51
+ const api = createChatPayloadApi(payloads);
52
+ const response = await api(new Request('http://local/chat-payloads'));
53
+ ```
54
+
55
+ The adapter preserves the engine's `/chat-payloads` list, lookup, and write
56
+ contract. The host chooses persistence, clocks, and state-event delivery;
57
+ record normalization, retention, and route responses stay in this package.
58
+
34
59
  Rules of the house: `src/` is pure — one runtime dependency (zod, axiom 9),
35
60
  no `node:*`, no env, no ambient clock; hosts inject effects through
36
61
  `src/ports.ts`. `host/` is effectful by design but never re-implements a
@@ -0,0 +1,10 @@
1
+ /**
2
+ * Fetch API adapter for engine
3
+ * `runtime/scripts/amalgm-mcp/server/routes/chat-payloads.js`.
4
+ * Route matching and response shapes are byte-for-byte laws; persistence and
5
+ * clocks are already behind `ChatPayloadStore` ports.
6
+ */
7
+ import type { ChatPayloadStore } from '../warm/store.js';
8
+ export type ChatPayloadApi = (request: Request) => Promise<Response>;
9
+ export declare function createChatPayloadApi(store: ChatPayloadStore): ChatPayloadApi;
10
+ //# sourceMappingURL=chat-payloads.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"chat-payloads.d.ts","sourceRoot":"","sources":["../../src/api/chat-payloads.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,kBAAkB,CAAC;AAEzD,MAAM,MAAM,cAAc,GAAG,CAAC,OAAO,EAAE,OAAO,KAAK,OAAO,CAAC,QAAQ,CAAC,CAAC;AAErE,wBAAgB,oBAAoB,CAAC,KAAK,EAAE,gBAAgB,GAAG,cAAc,CAoC5E"}
@@ -0,0 +1,57 @@
1
+ /**
2
+ * Fetch API adapter for engine
3
+ * `runtime/scripts/amalgm-mcp/server/routes/chat-payloads.js`.
4
+ * Route matching and response shapes are byte-for-byte laws; persistence and
5
+ * clocks are already behind `ChatPayloadStore` ports.
6
+ */
7
+ export function createChatPayloadApi(store) {
8
+ return async (request) => {
9
+ try {
10
+ const url = new URL(request.url);
11
+ const method = request.method.toUpperCase();
12
+ if (url.pathname === '/chat-payloads' && method === 'GET') {
13
+ const id = url.searchParams.get('id');
14
+ const payload = id ? store.get(id) : null;
15
+ return json(payload ? 200 : (id ? 404 : 200), {
16
+ ...(id && payload ? { payload } : {}),
17
+ payloads: store.list(),
18
+ ...(id && !payload ? { error: 'Chat payload not found' } : {}),
19
+ });
20
+ }
21
+ if (url.pathname === '/chat-payloads/get' && method === 'POST') {
22
+ const body = await jsonBody(request);
23
+ const payload = store.get(value(body, 'id') || value(body, 'payloadId'));
24
+ if (!payload)
25
+ return json(404, { error: 'Chat payload not found' });
26
+ return json(200, { payload });
27
+ }
28
+ if (url.pathname === '/chat-payloads' && (method === 'PUT' || method === 'POST')) {
29
+ const payload = store.write(await jsonBody(request));
30
+ return json(200, { success: true, payload });
31
+ }
32
+ return new Response('Not found', {
33
+ status: 404,
34
+ headers: { 'content-type': 'text/plain' },
35
+ });
36
+ }
37
+ catch {
38
+ return json(500, { error: 'Internal server error' });
39
+ }
40
+ };
41
+ }
42
+ async function jsonBody(request) {
43
+ const raw = await request.text();
44
+ return raw ? JSON.parse(raw) : {};
45
+ }
46
+ function value(input, key) {
47
+ return input && typeof input === 'object' && !Array.isArray(input)
48
+ ? input[key]
49
+ : undefined;
50
+ }
51
+ function json(status, body) {
52
+ return new Response(JSON.stringify(body), {
53
+ status,
54
+ headers: { 'content-type': 'application/json' },
55
+ });
56
+ }
57
+ //# sourceMappingURL=chat-payloads.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"chat-payloads.js","sourceRoot":"","sources":["../../src/api/chat-payloads.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAMH,MAAM,UAAU,oBAAoB,CAAC,KAAuB;IAC1D,OAAO,KAAK,EAAE,OAAO,EAAE,EAAE;QACvB,IAAI,CAAC;YACH,MAAM,GAAG,GAAG,IAAI,GAAG,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;YACjC,MAAM,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,WAAW,EAAE,CAAC;YAE5C,IAAI,GAAG,CAAC,QAAQ,KAAK,gBAAgB,IAAI,MAAM,KAAK,KAAK,EAAE,CAAC;gBAC1D,MAAM,EAAE,GAAG,GAAG,CAAC,YAAY,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;gBACtC,MAAM,OAAO,GAAG,EAAE,CAAC,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;gBAC1C,OAAO,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,EAAE;oBAC5C,GAAG,CAAC,EAAE,IAAI,OAAO,CAAC,CAAC,CAAC,EAAE,OAAO,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;oBACrC,QAAQ,EAAE,KAAK,CAAC,IAAI,EAAE;oBACtB,GAAG,CAAC,EAAE,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,wBAAwB,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;iBAC/D,CAAC,CAAC;YACL,CAAC;YAED,IAAI,GAAG,CAAC,QAAQ,KAAK,oBAAoB,IAAI,MAAM,KAAK,MAAM,EAAE,CAAC;gBAC/D,MAAM,IAAI,GAAG,MAAM,QAAQ,CAAC,OAAO,CAAC,CAAC;gBACrC,MAAM,OAAO,GAAG,KAAK,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,EAAE,IAAI,CAAC,IAAI,KAAK,CAAC,IAAI,EAAE,WAAW,CAAC,CAAC,CAAC;gBACzE,IAAI,CAAC,OAAO;oBAAE,OAAO,IAAI,CAAC,GAAG,EAAE,EAAE,KAAK,EAAE,wBAAwB,EAAE,CAAC,CAAC;gBACpE,OAAO,IAAI,CAAC,GAAG,EAAE,EAAE,OAAO,EAAE,CAAC,CAAC;YAChC,CAAC;YAED,IAAI,GAAG,CAAC,QAAQ,KAAK,gBAAgB,IAAI,CAAC,MAAM,KAAK,KAAK,IAAI,MAAM,KAAK,MAAM,CAAC,EAAE,CAAC;gBACjF,MAAM,OAAO,GAAG,KAAK,CAAC,KAAK,CAAC,MAAM,QAAQ,CAAC,OAAO,CAAC,CAAC,CAAC;gBACrD,OAAO,IAAI,CAAC,GAAG,EAAE,EAAE,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,CAAC,CAAC;YAC/C,CAAC;YAED,OAAO,IAAI,QAAQ,CAAC,WAAW,EAAE;gBAC/B,MAAM,EAAE,GAAG;gBACX,OAAO,EAAE,EAAE,cAAc,EAAE,YAAY,EAAE;aAC1C,CAAC,CAAC;QACL,CAAC;QAAC,MAAM,CAAC;YACP,OAAO,IAAI,CAAC,GAAG,EAAE,EAAE,KAAK,EAAE,uBAAuB,EAAE,CAAC,CAAC;QACvD,CAAC;IACH,CAAC,CAAC;AACJ,CAAC;AAED,KAAK,UAAU,QAAQ,CAAC,OAAgB;IACtC,MAAM,GAAG,GAAG,MAAM,OAAO,CAAC,IAAI,EAAE,CAAC;IACjC,OAAO,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;AACpC,CAAC;AAED,SAAS,KAAK,CAAC,KAAc,EAAE,GAAW;IACxC,OAAO,KAAK,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC;QAChE,CAAC,CAAE,KAAiC,CAAC,GAAG,CAAC;QACzC,CAAC,CAAC,SAAS,CAAC;AAChB,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;KAChD,CAAC,CAAC;AACL,CAAC"}
@@ -0,0 +1,4 @@
1
+ /** @amalgm/chat API adapters — thin doors over the SDK laws. */
2
+ export type { ChatPayloadApi } from './chat-payloads.js';
3
+ export { createChatPayloadApi } from './chat-payloads.js';
4
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/api/index.ts"],"names":[],"mappings":"AAAA,gEAAgE;AAEhE,YAAY,EAAE,cAAc,EAAE,MAAM,oBAAoB,CAAC;AACzD,OAAO,EAAE,oBAAoB,EAAE,MAAM,oBAAoB,CAAC"}
@@ -0,0 +1,3 @@
1
+ /** @amalgm/chat API adapters — thin doors over the SDK laws. */
2
+ export { createChatPayloadApi } from './chat-payloads.js';
3
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/api/index.ts"],"names":[],"mappings":"AAAA,gEAAgE;AAGhE,OAAO,EAAE,oBAAoB,EAAE,MAAM,oBAAoB,CAAC"}
package/dist/index.d.ts CHANGED
@@ -10,6 +10,7 @@
10
10
  * freeze algebra, chatInput, payload merge, input
11
11
  * warm/ warm-payload laws: revision, fingerprint, cache policies
12
12
  * usage/ token algebra, turn finalization, ownership fork, catalog
13
+ * api/ thin fetch adapters over SDK services
13
14
  * normalizers/ native harness events → the grammar (wave B)
14
15
  *
15
16
  * Hosts inject effects through the port types in `ports.ts` (axiom 7).
@@ -23,5 +24,6 @@ export * as turns from './turns/index.js';
23
24
  export * as contract from './contract/index.js';
24
25
  export * as warm from './warm/index.js';
25
26
  export * as usage from './usage/index.js';
27
+ export * as api from './api/index.js';
26
28
  export type { ClockMsPort, ClockIsoPort, Sha256HexPort, RandomUuidPort } from './ports.js';
27
29
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;GAiBG;AAEH,OAAO,KAAK,MAAM,MAAM,mBAAmB,CAAC;AAC5C,OAAO,KAAK,IAAI,MAAM,iBAAiB,CAAC;AACxC,OAAO,KAAK,UAAU,MAAM,uBAAuB,CAAC;AACpD,OAAO,KAAK,KAAK,MAAM,kBAAkB,CAAC;AAC1C,OAAO,KAAK,QAAQ,MAAM,qBAAqB,CAAC;AAChD,OAAO,KAAK,IAAI,MAAM,iBAAiB,CAAC;AACxC,OAAO,KAAK,KAAK,MAAM,kBAAkB,CAAC;AAC1C,YAAY,EAAE,WAAW,EAAE,YAAY,EAAE,aAAa,EAAE,cAAc,EAAE,MAAM,YAAY,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;GAkBG;AAEH,OAAO,KAAK,MAAM,MAAM,mBAAmB,CAAC;AAC5C,OAAO,KAAK,IAAI,MAAM,iBAAiB,CAAC;AACxC,OAAO,KAAK,UAAU,MAAM,uBAAuB,CAAC;AACpD,OAAO,KAAK,KAAK,MAAM,kBAAkB,CAAC;AAC1C,OAAO,KAAK,QAAQ,MAAM,qBAAqB,CAAC;AAChD,OAAO,KAAK,IAAI,MAAM,iBAAiB,CAAC;AACxC,OAAO,KAAK,KAAK,MAAM,kBAAkB,CAAC;AAC1C,OAAO,KAAK,GAAG,MAAM,gBAAgB,CAAC;AACtC,YAAY,EAAE,WAAW,EAAE,YAAY,EAAE,aAAa,EAAE,cAAc,EAAE,MAAM,YAAY,CAAC"}
package/dist/index.js CHANGED
@@ -10,6 +10,7 @@
10
10
  * freeze algebra, chatInput, payload merge, input
11
11
  * warm/ warm-payload laws: revision, fingerprint, cache policies
12
12
  * usage/ token algebra, turn finalization, ownership fork, catalog
13
+ * api/ thin fetch adapters over SDK services
13
14
  * normalizers/ native harness events → the grammar (wave B)
14
15
  *
15
16
  * Hosts inject effects through the port types in `ports.ts` (axiom 7).
@@ -23,4 +24,5 @@ export * as turns from './turns/index.js';
23
24
  export * as contract from './contract/index.js';
24
25
  export * as warm from './warm/index.js';
25
26
  export * as usage from './usage/index.js';
27
+ export * as api from './api/index.js';
26
28
  //# sourceMappingURL=index.js.map
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;GAiBG;AAEH,OAAO,KAAK,MAAM,MAAM,mBAAmB,CAAC;AAC5C,OAAO,KAAK,IAAI,MAAM,iBAAiB,CAAC;AACxC,OAAO,KAAK,UAAU,MAAM,uBAAuB,CAAC;AACpD,OAAO,KAAK,KAAK,MAAM,kBAAkB,CAAC;AAC1C,OAAO,KAAK,QAAQ,MAAM,qBAAqB,CAAC;AAChD,OAAO,KAAK,IAAI,MAAM,iBAAiB,CAAC;AACxC,OAAO,KAAK,KAAK,MAAM,kBAAkB,CAAC"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;GAkBG;AAEH,OAAO,KAAK,MAAM,MAAM,mBAAmB,CAAC;AAC5C,OAAO,KAAK,IAAI,MAAM,iBAAiB,CAAC;AACxC,OAAO,KAAK,UAAU,MAAM,uBAAuB,CAAC;AACpD,OAAO,KAAK,KAAK,MAAM,kBAAkB,CAAC;AAC1C,OAAO,KAAK,QAAQ,MAAM,qBAAqB,CAAC;AAChD,OAAO,KAAK,IAAI,MAAM,iBAAiB,CAAC;AACxC,OAAO,KAAK,KAAK,MAAM,kBAAkB,CAAC;AAC1C,OAAO,KAAK,GAAG,MAAM,gBAAgB,CAAC"}
@@ -13,4 +13,6 @@ export type { LaunchEnvelopeCacheEntry } from './client-cache.js';
13
13
  export { CACHE_WARM_DELAY_MS, machineKey, launchEnvelopeCacheKey, launchEnvelopePayloadKey, usableEntry, } from './client-cache.js';
14
14
  export type { ChatPayloadStoreRecord } from './store-policy.js';
15
15
  export { CHAT_PAYLOADS_META_KEY, CHAT_PAYLOADS_RESOURCE, CHAT_PAYLOAD_TTL_MS, CHAT_PAYLOAD_MAX_RECORDS, isPlainObject, cleanString, normalizeChatPayloadRecord, recordTimestamp, sweepChatPayloads, } from './store-policy.js';
16
+ export type { ChatPayloadMapStore, ChatPayloadStateEvent, ChatPayloadStoreOptions, } from './store.js';
17
+ export { ChatPayloadStore } from './store.js';
16
18
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/warm/index.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,YAAY,EACV,SAAS,EACT,UAAU,EACV,SAAS,EACT,gBAAgB,EAChB,kBAAkB,EAClB,oBAAoB,EACpB,kBAAkB,EAClB,gBAAgB,EAChB,eAAe,EACf,mBAAmB,EACnB,WAAW,EACX,8BAA8B,EAC9B,eAAe,EACf,4BAA4B,EAC5B,qBAAqB,GACtB,MAAM,cAAc,CAAC;AACtB,OAAO,EACL,UAAU,EACV,+BAA+B,EAC/B,iCAAiC,EACjC,0BAA0B,GAC3B,MAAM,cAAc,CAAC;AAEtB,YAAY,EACV,wBAAwB,EACxB,0BAA0B,EAC1B,4BAA4B,EAC5B,6BAA6B,GAC9B,MAAM,eAAe,CAAC;AACvB,OAAO,EACL,sBAAsB,EACtB,sBAAsB,EACtB,mBAAmB,EACnB,qBAAqB,EACrB,6BAA6B,GAC9B,MAAM,eAAe,CAAC;AAEvB,YAAY,EACV,yBAAyB,EACzB,8BAA8B,GAC/B,MAAM,qBAAqB,CAAC;AAC7B,OAAO,EACL,eAAe,EACf,aAAa,EACb,WAAW,EACX,8BAA8B,EAC9B,iBAAiB,EACjB,yBAAyB,GAC1B,MAAM,qBAAqB,CAAC;AAE7B,YAAY,EAAE,wBAAwB,EAAE,MAAM,mBAAmB,CAAC;AAClE,OAAO,EACL,mBAAmB,EACnB,UAAU,EACV,sBAAsB,EACtB,wBAAwB,EACxB,WAAW,GACZ,MAAM,mBAAmB,CAAC;AAE3B,YAAY,EAAE,sBAAsB,EAAE,MAAM,mBAAmB,CAAC;AAChE,OAAO,EACL,sBAAsB,EACtB,sBAAsB,EACtB,mBAAmB,EACnB,wBAAwB,EACxB,aAAa,EACb,WAAW,EACX,0BAA0B,EAC1B,eAAe,EACf,iBAAiB,GAClB,MAAM,mBAAmB,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/warm/index.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,YAAY,EACV,SAAS,EACT,UAAU,EACV,SAAS,EACT,gBAAgB,EAChB,kBAAkB,EAClB,oBAAoB,EACpB,kBAAkB,EAClB,gBAAgB,EAChB,eAAe,EACf,mBAAmB,EACnB,WAAW,EACX,8BAA8B,EAC9B,eAAe,EACf,4BAA4B,EAC5B,qBAAqB,GACtB,MAAM,cAAc,CAAC;AACtB,OAAO,EACL,UAAU,EACV,+BAA+B,EAC/B,iCAAiC,EACjC,0BAA0B,GAC3B,MAAM,cAAc,CAAC;AAEtB,YAAY,EACV,wBAAwB,EACxB,0BAA0B,EAC1B,4BAA4B,EAC5B,6BAA6B,GAC9B,MAAM,eAAe,CAAC;AACvB,OAAO,EACL,sBAAsB,EACtB,sBAAsB,EACtB,mBAAmB,EACnB,qBAAqB,EACrB,6BAA6B,GAC9B,MAAM,eAAe,CAAC;AAEvB,YAAY,EACV,yBAAyB,EACzB,8BAA8B,GAC/B,MAAM,qBAAqB,CAAC;AAC7B,OAAO,EACL,eAAe,EACf,aAAa,EACb,WAAW,EACX,8BAA8B,EAC9B,iBAAiB,EACjB,yBAAyB,GAC1B,MAAM,qBAAqB,CAAC;AAE7B,YAAY,EAAE,wBAAwB,EAAE,MAAM,mBAAmB,CAAC;AAClE,OAAO,EACL,mBAAmB,EACnB,UAAU,EACV,sBAAsB,EACtB,wBAAwB,EACxB,WAAW,GACZ,MAAM,mBAAmB,CAAC;AAE3B,YAAY,EAAE,sBAAsB,EAAE,MAAM,mBAAmB,CAAC;AAChE,OAAO,EACL,sBAAsB,EACtB,sBAAsB,EACtB,mBAAmB,EACnB,wBAAwB,EACxB,aAAa,EACb,WAAW,EACX,0BAA0B,EAC1B,eAAe,EACf,iBAAiB,GAClB,MAAM,mBAAmB,CAAC;AAE3B,YAAY,EACV,mBAAmB,EACnB,qBAAqB,EACrB,uBAAuB,GACxB,MAAM,YAAY,CAAC;AACpB,OAAO,EAAE,gBAAgB,EAAE,MAAM,YAAY,CAAC"}
@@ -8,4 +8,5 @@ export { CONFIRMED_WRITE_TTL_MS, machinePayloadWriteKey, chatPayloadRevision, is
8
8
  export { ENVELOPE_TTL_MS, MAX_ENVELOPES, stableValue, fingerprintLaunchEnvelopeInput, envelopeExpiresAt, pruneAgentLaunchEnvelopes, } from './envelope-cache.js';
9
9
  export { CACHE_WARM_DELAY_MS, machineKey, launchEnvelopeCacheKey, launchEnvelopePayloadKey, usableEntry, } from './client-cache.js';
10
10
  export { CHAT_PAYLOADS_META_KEY, CHAT_PAYLOADS_RESOURCE, CHAT_PAYLOAD_TTL_MS, CHAT_PAYLOAD_MAX_RECORDS, isPlainObject, cleanString, normalizeChatPayloadRecord, recordTimestamp, sweepChatPayloads, } from './store-policy.js';
11
+ export { ChatPayloadStore } from './store.js';
11
12
  //# sourceMappingURL=index.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/warm/index.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAmBH,OAAO,EACL,UAAU,EACV,+BAA+B,EAC/B,iCAAiC,EACjC,0BAA0B,GAC3B,MAAM,cAAc,CAAC;AAQtB,OAAO,EACL,sBAAsB,EACtB,sBAAsB,EACtB,mBAAmB,EACnB,qBAAqB,EACrB,6BAA6B,GAC9B,MAAM,eAAe,CAAC;AAMvB,OAAO,EACL,eAAe,EACf,aAAa,EACb,WAAW,EACX,8BAA8B,EAC9B,iBAAiB,EACjB,yBAAyB,GAC1B,MAAM,qBAAqB,CAAC;AAG7B,OAAO,EACL,mBAAmB,EACnB,UAAU,EACV,sBAAsB,EACtB,wBAAwB,EACxB,WAAW,GACZ,MAAM,mBAAmB,CAAC;AAG3B,OAAO,EACL,sBAAsB,EACtB,sBAAsB,EACtB,mBAAmB,EACnB,wBAAwB,EACxB,aAAa,EACb,WAAW,EACX,0BAA0B,EAC1B,eAAe,EACf,iBAAiB,GAClB,MAAM,mBAAmB,CAAC"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/warm/index.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAmBH,OAAO,EACL,UAAU,EACV,+BAA+B,EAC/B,iCAAiC,EACjC,0BAA0B,GAC3B,MAAM,cAAc,CAAC;AAQtB,OAAO,EACL,sBAAsB,EACtB,sBAAsB,EACtB,mBAAmB,EACnB,qBAAqB,EACrB,6BAA6B,GAC9B,MAAM,eAAe,CAAC;AAMvB,OAAO,EACL,eAAe,EACf,aAAa,EACb,WAAW,EACX,8BAA8B,EAC9B,iBAAiB,EACjB,yBAAyB,GAC1B,MAAM,qBAAqB,CAAC;AAG7B,OAAO,EACL,mBAAmB,EACnB,UAAU,EACV,sBAAsB,EACtB,wBAAwB,EACxB,WAAW,GACZ,MAAM,mBAAmB,CAAC;AAG3B,OAAO,EACL,sBAAsB,EACtB,sBAAsB,EACtB,mBAAmB,EACnB,wBAAwB,EACxB,aAAa,EACb,WAAW,EACX,0BAA0B,EAC1B,eAAe,EACf,iBAAiB,GAClB,MAAM,mBAAmB,CAAC;AAO3B,OAAO,EAAE,gBAAgB,EAAE,MAAM,YAAY,CAAC"}
@@ -0,0 +1,42 @@
1
+ /**
2
+ * Machine chat-payload store — the effect-port composition of engine
3
+ * `runtime/scripts/amalgm-mcp/lib/chat-payloads.js`.
4
+ *
5
+ * The record, revision, and sweep decisions remain chat law. A host owns the
6
+ * bytes and clocks through these ports, so this module never touches disk or
7
+ * ambient time (PURPOSE.md axiom 7).
8
+ */
9
+ import type { ClockIsoPort, ClockMsPort } from '../ports.js';
10
+ import { CHAT_PAYLOADS_RESOURCE } from './store-policy.js';
11
+ import type { ChatPayloadStoreRecord } from './store-policy.js';
12
+ export interface ChatPayloadMapStore {
13
+ read(): Record<string, unknown>;
14
+ write(payloads: Record<string, ChatPayloadStoreRecord>): void;
15
+ }
16
+ export type ChatPayloadStateEvent = {
17
+ resource: typeof CHAT_PAYLOADS_RESOURCE;
18
+ op: 'invalidate';
19
+ source: 'chat-payloads-gc';
20
+ } | {
21
+ resource: typeof CHAT_PAYLOADS_RESOURCE;
22
+ op: 'update';
23
+ id: string;
24
+ value: ChatPayloadStoreRecord;
25
+ source: string;
26
+ };
27
+ export interface ChatPayloadStoreOptions {
28
+ store: ChatPayloadMapStore;
29
+ clockIso: ClockIsoPort;
30
+ clockMs: ClockMsPort;
31
+ emit?: (event: ChatPayloadStateEvent) => void;
32
+ }
33
+ export declare class ChatPayloadStore {
34
+ #private;
35
+ constructor(options: ChatPayloadStoreOptions);
36
+ list(): Record<string, ChatPayloadStoreRecord>;
37
+ get(id: unknown): ChatPayloadStoreRecord | null;
38
+ write(input: unknown, options?: {
39
+ source?: string;
40
+ }): ChatPayloadStoreRecord;
41
+ }
42
+ //# sourceMappingURL=store.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"store.d.ts","sourceRoot":"","sources":["../../src/warm/store.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,OAAO,KAAK,EAAE,YAAY,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAC7D,OAAO,EACL,sBAAsB,EAKvB,MAAM,mBAAmB,CAAC;AAC3B,OAAO,KAAK,EAAE,sBAAsB,EAAE,MAAM,mBAAmB,CAAC;AAEhE,MAAM,WAAW,mBAAmB;IAClC,IAAI,IAAI,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAChC,KAAK,CAAC,QAAQ,EAAE,MAAM,CAAC,MAAM,EAAE,sBAAsB,CAAC,GAAG,IAAI,CAAC;CAC/D;AAED,MAAM,MAAM,qBAAqB,GAC7B;IAAE,QAAQ,EAAE,OAAO,sBAAsB,CAAC;IAAC,EAAE,EAAE,YAAY,CAAC;IAAC,MAAM,EAAE,kBAAkB,CAAA;CAAE,GACzF;IACE,QAAQ,EAAE,OAAO,sBAAsB,CAAC;IACxC,EAAE,EAAE,QAAQ,CAAC;IACb,EAAE,EAAE,MAAM,CAAC;IACX,KAAK,EAAE,sBAAsB,CAAC;IAC9B,MAAM,EAAE,MAAM,CAAC;CAChB,CAAC;AAEN,MAAM,WAAW,uBAAuB;IACtC,KAAK,EAAE,mBAAmB,CAAC;IAC3B,QAAQ,EAAE,YAAY,CAAC;IACvB,OAAO,EAAE,WAAW,CAAC;IACrB,IAAI,CAAC,EAAE,CAAC,KAAK,EAAE,qBAAqB,KAAK,IAAI,CAAC;CAC/C;AAED,qBAAa,gBAAgB;;gBAOf,OAAO,EAAE,uBAAuB;IAO5C,IAAI,IAAI,MAAM,CAAC,MAAM,EAAE,sBAAsB,CAAC;IAK9C,GAAG,CAAC,EAAE,EAAE,OAAO,GAAG,sBAAsB,GAAG,IAAI;IAO/C,KAAK,CAAC,KAAK,EAAE,OAAO,EAAE,OAAO,GAAE;QAAE,MAAM,CAAC,EAAE,MAAM,CAAA;KAAO,GAAG,sBAAsB;CAkCjF"}
@@ -0,0 +1,69 @@
1
+ /**
2
+ * Machine chat-payload store — the effect-port composition of engine
3
+ * `runtime/scripts/amalgm-mcp/lib/chat-payloads.js`.
4
+ *
5
+ * The record, revision, and sweep decisions remain chat law. A host owns the
6
+ * bytes and clocks through these ports, so this module never touches disk or
7
+ * ambient time (PURPOSE.md axiom 7).
8
+ */
9
+ import { CHAT_PAYLOADS_RESOURCE, cleanString, isPlainObject, normalizeChatPayloadRecord, sweepChatPayloads, } from './store-policy.js';
10
+ export class ChatPayloadStore {
11
+ #store;
12
+ #clockIso;
13
+ #clockMs;
14
+ #emit;
15
+ #sweepDone = false;
16
+ constructor(options) {
17
+ this.#store = options.store;
18
+ this.#clockIso = options.clockIso;
19
+ this.#clockMs = options.clockMs;
20
+ this.#emit = options.emit ?? (() => undefined);
21
+ }
22
+ list() {
23
+ this.#sweepOnce();
24
+ return this.#store.read();
25
+ }
26
+ get(id) {
27
+ this.#sweepOnce();
28
+ const payloadId = cleanString(id);
29
+ if (!payloadId)
30
+ return null;
31
+ return this.#store.read()[payloadId] ?? null;
32
+ }
33
+ write(input, options = {}) {
34
+ this.#sweepOnce();
35
+ const current = this.#store.read();
36
+ const inputId = isPlainObject(input) ? cleanString(input['id'] || input['payloadId']) : null;
37
+ const existing = inputId
38
+ ? current[inputId] ?? null
39
+ : null;
40
+ const record = normalizeChatPayloadRecord(input, existing, this.#clockIso);
41
+ this.#store.write({
42
+ ...current,
43
+ [record.id]: record,
44
+ });
45
+ this.#emit({
46
+ resource: CHAT_PAYLOADS_RESOURCE,
47
+ op: 'update',
48
+ id: record.id,
49
+ value: record,
50
+ source: options.source || 'chat-payloads',
51
+ });
52
+ return record;
53
+ }
54
+ #sweepOnce() {
55
+ if (this.#sweepDone)
56
+ return;
57
+ this.#sweepDone = true;
58
+ const result = sweepChatPayloads(this.#store.read(), this.#clockMs());
59
+ if (!result.changed)
60
+ return;
61
+ this.#store.write(result.next);
62
+ this.#emit({
63
+ resource: CHAT_PAYLOADS_RESOURCE,
64
+ op: 'invalidate',
65
+ source: 'chat-payloads-gc',
66
+ });
67
+ }
68
+ }
69
+ //# sourceMappingURL=store.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"store.js","sourceRoot":"","sources":["../../src/warm/store.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAGH,OAAO,EACL,sBAAsB,EACtB,WAAW,EACX,aAAa,EACb,0BAA0B,EAC1B,iBAAiB,GAClB,MAAM,mBAAmB,CAAC;AAyB3B,MAAM,OAAO,gBAAgB;IAClB,MAAM,CAAsB;IAC5B,SAAS,CAAe;IACxB,QAAQ,CAAc;IACtB,KAAK,CAAyC;IACvD,UAAU,GAAG,KAAK,CAAC;IAEnB,YAAY,OAAgC;QAC1C,IAAI,CAAC,MAAM,GAAG,OAAO,CAAC,KAAK,CAAC;QAC5B,IAAI,CAAC,SAAS,GAAG,OAAO,CAAC,QAAQ,CAAC;QAClC,IAAI,CAAC,QAAQ,GAAG,OAAO,CAAC,OAAO,CAAC;QAChC,IAAI,CAAC,KAAK,GAAG,OAAO,CAAC,IAAI,IAAI,CAAC,GAAG,EAAE,CAAC,SAAS,CAAC,CAAC;IACjD,CAAC;IAED,IAAI;QACF,IAAI,CAAC,UAAU,EAAE,CAAC;QAClB,OAAO,IAAI,CAAC,MAAM,CAAC,IAAI,EAA4C,CAAC;IACtE,CAAC;IAED,GAAG,CAAC,EAAW;QACb,IAAI,CAAC,UAAU,EAAE,CAAC;QAClB,MAAM,SAAS,GAAG,WAAW,CAAC,EAAE,CAAC,CAAC;QAClC,IAAI,CAAC,SAAS;YAAE,OAAO,IAAI,CAAC;QAC5B,OAAQ,IAAI,CAAC,MAAM,CAAC,IAAI,EAAE,CAAC,SAAS,CAAwC,IAAI,IAAI,CAAC;IACvF,CAAC;IAED,KAAK,CAAC,KAAc,EAAE,UAA+B,EAAE;QACrD,IAAI,CAAC,UAAU,EAAE,CAAC;QAClB,MAAM,OAAO,GAAG,IAAI,CAAC,MAAM,CAAC,IAAI,EAAE,CAAC;QACnC,MAAM,OAAO,GAAG,aAAa,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,WAAW,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,KAAK,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;QAC7F,MAAM,QAAQ,GAAG,OAAO;YACtB,CAAC,CAAE,OAAO,CAAC,OAAO,CAAwC,IAAI,IAAI;YAClE,CAAC,CAAC,IAAI,CAAC;QACT,MAAM,MAAM,GAAG,0BAA0B,CAAC,KAAK,EAAE,QAAQ,EAAE,IAAI,CAAC,SAAS,CAAC,CAAC;QAC3E,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC;YAChB,GAAI,OAAkD;YACtD,CAAC,MAAM,CAAC,EAAE,CAAC,EAAE,MAAM;SACpB,CAAC,CAAC;QACH,IAAI,CAAC,KAAK,CAAC;YACT,QAAQ,EAAE,sBAAsB;YAChC,EAAE,EAAE,QAAQ;YACZ,EAAE,EAAE,MAAM,CAAC,EAAE;YACb,KAAK,EAAE,MAAM;YACb,MAAM,EAAE,OAAO,CAAC,MAAM,IAAI,eAAe;SAC1C,CAAC,CAAC;QACH,OAAO,MAAM,CAAC;IAChB,CAAC;IAED,UAAU;QACR,IAAI,IAAI,CAAC,UAAU;YAAE,OAAO;QAC5B,IAAI,CAAC,UAAU,GAAG,IAAI,CAAC;QACvB,MAAM,MAAM,GAAG,iBAAiB,CAAC,IAAI,CAAC,MAAM,CAAC,IAAI,EAAE,EAAE,IAAI,CAAC,QAAQ,EAAE,CAAC,CAAC;QACtE,IAAI,CAAC,MAAM,CAAC,OAAO;YAAE,OAAO;QAC5B,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;QAC/B,IAAI,CAAC,KAAK,CAAC;YACT,QAAQ,EAAE,sBAAsB;YAChC,EAAE,EAAE,YAAY;YAChB,MAAM,EAAE,kBAAkB;SAC3B,CAAC,CAAC;IACL,CAAC;CACF"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@amalgm/chat",
3
- "version": "0.1.0",
3
+ "version": "0.1.1",
4
4
  "description": "The Amalgm chat SDK — the conversation pipeline's laws: turns, messages, streaming assembly, event normalization, and transcript truth, behind host-injected adapters.",
5
5
  "type": "module",
6
6
  "license": "UNLICENSED",
@@ -47,6 +47,10 @@
47
47
  "./normalizers": {
48
48
  "types": "./dist/normalizers/index.d.ts",
49
49
  "default": "./dist/normalizers/index.js"
50
+ },
51
+ "./api": {
52
+ "types": "./dist/api/index.d.ts",
53
+ "default": "./dist/api/index.js"
50
54
  }
51
55
  },
52
56
  "files": [