@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 +1 -1
- package/README.md +25 -0
- package/dist/api/chat-payloads.d.ts +10 -0
- package/dist/api/chat-payloads.d.ts.map +1 -0
- package/dist/api/chat-payloads.js +57 -0
- package/dist/api/chat-payloads.js.map +1 -0
- package/dist/api/index.d.ts +4 -0
- package/dist/api/index.d.ts.map +1 -0
- package/dist/api/index.js +3 -0
- package/dist/api/index.js.map +1 -0
- package/dist/index.d.ts +2 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +2 -0
- package/dist/index.js.map +1 -1
- package/dist/warm/index.d.ts +2 -0
- package/dist/warm/index.d.ts.map +1 -1
- package/dist/warm/index.js +1 -0
- package/dist/warm/index.js.map +1 -1
- package/dist/warm/store.d.ts +42 -0
- package/dist/warm/store.d.ts.map +1 -0
- package/dist/warm/store.js +69 -0
- package/dist/warm/store.js.map +1 -0
- package/package.json +5 -1
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 |
|
|
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":"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"}
|
|
@@ -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 @@
|
|
|
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
|
package/dist/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA
|
|
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
|
|
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"}
|
package/dist/warm/index.d.ts
CHANGED
|
@@ -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
|
package/dist/warm/index.d.ts.map
CHANGED
|
@@ -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"}
|
package/dist/warm/index.js
CHANGED
|
@@ -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
|
package/dist/warm/index.js.map
CHANGED
|
@@ -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.
|
|
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": [
|