@amalgm/chat 0.1.2 → 0.2.0

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 (286) hide show
  1. package/AGENTS.md +98 -0
  2. package/PURPOSE.md +143 -112
  3. package/README.md +82 -54
  4. package/dist/acp/index.d.ts +7 -0
  5. package/dist/acp/index.d.ts.map +1 -0
  6. package/dist/acp/index.js +7 -0
  7. package/dist/acp/index.js.map +1 -0
  8. package/dist/acp/projection.d.ts +30 -0
  9. package/dist/acp/projection.d.ts.map +1 -0
  10. package/dist/acp/projection.js +147 -0
  11. package/dist/acp/projection.js.map +1 -0
  12. package/dist/api/conversations.d.ts +66 -0
  13. package/dist/api/conversations.d.ts.map +1 -0
  14. package/dist/api/conversations.js +202 -0
  15. package/dist/api/conversations.js.map +1 -0
  16. package/dist/api/index.d.ts +3 -3
  17. package/dist/api/index.d.ts.map +1 -1
  18. package/dist/api/index.js +1 -2
  19. package/dist/api/index.js.map +1 -1
  20. package/dist/conversations/index.d.ts +3 -0
  21. package/dist/conversations/index.d.ts.map +1 -0
  22. package/dist/conversations/index.js +3 -0
  23. package/dist/conversations/index.js.map +1 -0
  24. package/dist/conversations/transcript.d.ts +13 -0
  25. package/dist/conversations/transcript.d.ts.map +1 -0
  26. package/dist/conversations/transcript.js +171 -0
  27. package/dist/conversations/transcript.js.map +1 -0
  28. package/dist/conversations/types.d.ts +147 -0
  29. package/dist/conversations/types.d.ts.map +1 -0
  30. package/dist/conversations/types.js +9 -0
  31. package/dist/conversations/types.js.map +1 -0
  32. package/dist/events/constructors.d.ts +9 -15
  33. package/dist/events/constructors.d.ts.map +1 -1
  34. package/dist/events/constructors.js +6 -12
  35. package/dist/events/constructors.js.map +1 -1
  36. package/dist/events/index.d.ts +2 -3
  37. package/dist/events/index.d.ts.map +1 -1
  38. package/dist/events/index.js +2 -3
  39. package/dist/events/index.js.map +1 -1
  40. package/dist/events/schema.d.ts +2 -5
  41. package/dist/events/schema.d.ts.map +1 -1
  42. package/dist/events/schema.js +2 -5
  43. package/dist/events/schema.js.map +1 -1
  44. package/dist/execution/contract.d.ts +51 -0
  45. package/dist/execution/contract.d.ts.map +1 -0
  46. package/dist/execution/contract.js +127 -0
  47. package/dist/execution/contract.js.map +1 -0
  48. package/dist/execution/index.d.ts +6 -0
  49. package/dist/execution/index.d.ts.map +1 -0
  50. package/dist/execution/index.js +4 -0
  51. package/dist/execution/index.js.map +1 -0
  52. package/dist/execution/revision.d.ts +5 -0
  53. package/dist/execution/revision.d.ts.map +1 -0
  54. package/dist/execution/revision.js +17 -0
  55. package/dist/execution/revision.js.map +1 -0
  56. package/dist/execution/store.d.ts +26 -0
  57. package/dist/execution/store.d.ts.map +1 -0
  58. package/dist/execution/store.js +38 -0
  59. package/dist/execution/store.js.map +1 -0
  60. package/dist/index.d.ts +8 -25
  61. package/dist/index.d.ts.map +1 -1
  62. package/dist/index.js +7 -25
  63. package/dist/index.js.map +1 -1
  64. package/dist/input/index.d.ts +3 -0
  65. package/dist/input/index.d.ts.map +1 -0
  66. package/dist/input/index.js +2 -0
  67. package/dist/input/index.js.map +1 -0
  68. package/dist/input/prompt.d.ts +17 -0
  69. package/dist/input/prompt.d.ts.map +1 -0
  70. package/dist/input/prompt.js +104 -0
  71. package/dist/input/prompt.js.map +1 -0
  72. package/dist/normalizers/claude.d.ts +6 -9
  73. package/dist/normalizers/claude.d.ts.map +1 -1
  74. package/dist/normalizers/claude.js +5 -8
  75. package/dist/normalizers/claude.js.map +1 -1
  76. package/dist/normalizers/codex.d.ts +5 -8
  77. package/dist/normalizers/codex.d.ts.map +1 -1
  78. package/dist/normalizers/codex.js +4 -7
  79. package/dist/normalizers/codex.js.map +1 -1
  80. package/dist/normalizers/cursor.d.ts +1 -2
  81. package/dist/normalizers/cursor.d.ts.map +1 -1
  82. package/dist/normalizers/cursor.js +2 -3
  83. package/dist/normalizers/cursor.js.map +1 -1
  84. package/dist/normalizers/index.d.ts +3 -5
  85. package/dist/normalizers/index.d.ts.map +1 -1
  86. package/dist/normalizers/index.js +3 -5
  87. package/dist/normalizers/index.js.map +1 -1
  88. package/dist/normalizers/opencode.d.ts +2 -4
  89. package/dist/normalizers/opencode.d.ts.map +1 -1
  90. package/dist/normalizers/opencode.js +2 -4
  91. package/dist/normalizers/opencode.js.map +1 -1
  92. package/dist/normalizers/pi.d.ts +3 -4
  93. package/dist/normalizers/pi.d.ts.map +1 -1
  94. package/dist/normalizers/pi.js +3 -4
  95. package/dist/normalizers/pi.js.map +1 -1
  96. package/dist/sessions/chat.d.ts +176 -0
  97. package/dist/sessions/chat.d.ts.map +1 -0
  98. package/dist/sessions/chat.js +701 -0
  99. package/dist/sessions/chat.js.map +1 -0
  100. package/dist/sessions/index.d.ts +3 -0
  101. package/dist/sessions/index.d.ts.map +1 -0
  102. package/dist/sessions/index.js +2 -0
  103. package/dist/sessions/index.js.map +1 -0
  104. package/dist/transcript/index.d.ts +1 -1
  105. package/dist/transcript/index.js +1 -1
  106. package/dist/transcript/message-reducer.d.ts +1 -1
  107. package/dist/transcript/message-reducer.js +1 -1
  108. package/dist/transcript/part-accumulator.d.ts +1 -1
  109. package/dist/transcript/part-accumulator.js +1 -1
  110. package/dist/transcript/tool-display.d.ts +1 -1
  111. package/dist/transcript/tool-display.js +1 -1
  112. package/dist/transcript/tool-shape.d.ts +1 -1
  113. package/dist/transcript/tool-shape.js +1 -1
  114. package/dist/usage/finalize.d.ts +7 -9
  115. package/dist/usage/finalize.d.ts.map +1 -1
  116. package/dist/usage/finalize.js +11 -13
  117. package/dist/usage/finalize.js.map +1 -1
  118. package/dist/usage/index.d.ts +2 -3
  119. package/dist/usage/index.d.ts.map +1 -1
  120. package/dist/usage/index.js +2 -3
  121. package/dist/usage/index.js.map +1 -1
  122. package/dist/usage/model-catalog.d.ts +2 -3
  123. package/dist/usage/model-catalog.d.ts.map +1 -1
  124. package/dist/usage/model-catalog.js +10 -3
  125. package/dist/usage/model-catalog.js.map +1 -1
  126. package/dist/usage/normalize.d.ts +5 -7
  127. package/dist/usage/normalize.d.ts.map +1 -1
  128. package/dist/usage/normalize.js +3 -5
  129. package/dist/usage/normalize.js.map +1 -1
  130. package/dist/usage/ports.d.ts +14 -24
  131. package/dist/usage/ports.d.ts.map +1 -1
  132. package/dist/usage/ports.js +9 -17
  133. package/dist/usage/ports.js.map +1 -1
  134. package/dist/usage/steps.d.ts +70 -0
  135. package/dist/usage/steps.d.ts.map +1 -0
  136. package/dist/usage/steps.js +152 -0
  137. package/dist/usage/steps.js.map +1 -0
  138. package/dist/usage/tokens.d.ts +4 -7
  139. package/dist/usage/tokens.d.ts.map +1 -1
  140. package/dist/usage/tokens.js +4 -7
  141. package/dist/usage/tokens.js.map +1 -1
  142. package/docs/contracts/acp-and-step-usage.md +51 -0
  143. package/docs/contracts/conversation-persistence.md +47 -0
  144. package/docs/contracts/input-and-execution.md +177 -0
  145. package/docs/contracts/platform-authorization.md +17 -0
  146. package/host/adapters/acp-capabilities.js +30 -0
  147. package/host/adapters/acp-client.js +156 -0
  148. package/host/adapters/acp.js +284 -0
  149. package/host/adapters/claude.js +235 -0
  150. package/host/adapters/codex.js +733 -0
  151. package/host/adapters/cursor.js +347 -0
  152. package/host/adapters/input-capabilities.js +89 -0
  153. package/host/adapters/opencode.js +486 -0
  154. package/host/adapters/pi.js +519 -0
  155. package/host/adapters/prompt.js +212 -0
  156. package/host/auth.js +257 -0
  157. package/host/credentials/store.js +209 -0
  158. package/host/http.d.ts +32 -0
  159. package/host/http.js +238 -0
  160. package/host/index.d.ts +84 -0
  161. package/host/index.js +59 -0
  162. package/host/lib/runtime-paths.js +44 -0
  163. package/host/model-resolution.js +313 -0
  164. package/host/native-contract.js +185 -0
  165. package/host/native-runtime.js +194 -0
  166. package/host/permissions.js +27 -0
  167. package/host/platform-egress.js +114 -0
  168. package/host/recorder.js +61 -0
  169. package/host/sqlite/index.d.ts +69 -0
  170. package/host/sqlite/index.js +704 -0
  171. package/host/tooling/mcp-bundle.js +214 -0
  172. package/host/tooling/mcp-relay.js +83 -0
  173. package/host/tooling/native-binaries.js +667 -0
  174. package/host/tooling/native-config.js +460 -0
  175. package/host/tooling/package-import.js +111 -0
  176. package/host/tooling/runtime-home.js +26 -0
  177. package/host/tooling/system-instructions.js +69 -0
  178. package/host/tooling/system-prompt.js +35 -0
  179. package/package.json +44 -24
  180. package/skills/chat/SKILL.md +97 -0
  181. package/skills/chat/agents/openai.yaml +4 -0
  182. package/skills/chat/references/contracts.md +131 -0
  183. package/dist/api/chat-payloads.d.ts +0 -10
  184. package/dist/api/chat-payloads.d.ts.map +0 -1
  185. package/dist/api/chat-payloads.js +0 -57
  186. package/dist/api/chat-payloads.js.map +0 -1
  187. package/dist/contract/chat-input.d.ts +0 -144
  188. package/dist/contract/chat-input.d.ts.map +0 -1
  189. package/dist/contract/chat-input.js +0 -261
  190. package/dist/contract/chat-input.js.map +0 -1
  191. package/dist/contract/create.d.ts +0 -191
  192. package/dist/contract/create.d.ts.map +0 -1
  193. package/dist/contract/create.js +0 -249
  194. package/dist/contract/create.js.map +0 -1
  195. package/dist/contract/freeze.d.ts +0 -85
  196. package/dist/contract/freeze.d.ts.map +0 -1
  197. package/dist/contract/freeze.js +0 -151
  198. package/dist/contract/freeze.js.map +0 -1
  199. package/dist/contract/harnesses.d.ts +0 -21
  200. package/dist/contract/harnesses.d.ts.map +0 -1
  201. package/dist/contract/harnesses.js +0 -39
  202. package/dist/contract/harnesses.js.map +0 -1
  203. package/dist/contract/index.d.ts +0 -17
  204. package/dist/contract/index.d.ts.map +0 -1
  205. package/dist/contract/index.js +0 -17
  206. package/dist/contract/index.js.map +0 -1
  207. package/dist/contract/input.d.ts +0 -45
  208. package/dist/contract/input.d.ts.map +0 -1
  209. package/dist/contract/input.js +0 -78
  210. package/dist/contract/input.js.map +0 -1
  211. package/dist/contract/models.d.ts +0 -57
  212. package/dist/contract/models.d.ts.map +0 -1
  213. package/dist/contract/models.js +0 -380
  214. package/dist/contract/models.js.map +0 -1
  215. package/dist/contract/payload-merge.d.ts +0 -76
  216. package/dist/contract/payload-merge.d.ts.map +0 -1
  217. package/dist/contract/payload-merge.js +0 -215
  218. package/dist/contract/payload-merge.js.map +0 -1
  219. package/dist/events/tool-display.d.ts +0 -22
  220. package/dist/events/tool-display.d.ts.map +0 -1
  221. package/dist/events/tool-display.js +0 -60
  222. package/dist/events/tool-display.js.map +0 -1
  223. package/dist/events/tool-shape.d.ts +0 -48
  224. package/dist/events/tool-shape.d.ts.map +0 -1
  225. package/dist/events/tool-shape.js +0 -225
  226. package/dist/events/tool-shape.js.map +0 -1
  227. package/dist/relay/index.d.ts +0 -65
  228. package/dist/relay/index.d.ts.map +0 -1
  229. package/dist/relay/index.js +0 -197
  230. package/dist/relay/index.js.map +0 -1
  231. package/dist/turns/index.d.ts +0 -11
  232. package/dist/turns/index.d.ts.map +0 -1
  233. package/dist/turns/index.js +0 -11
  234. package/dist/turns/index.js.map +0 -1
  235. package/dist/turns/queries.d.ts +0 -36
  236. package/dist/turns/queries.d.ts.map +0 -1
  237. package/dist/turns/queries.js +0 -37
  238. package/dist/turns/queries.js.map +0 -1
  239. package/dist/turns/replay.d.ts +0 -105
  240. package/dist/turns/replay.d.ts.map +0 -1
  241. package/dist/turns/replay.js +0 -163
  242. package/dist/turns/replay.js.map +0 -1
  243. package/dist/turns/status.d.ts +0 -49
  244. package/dist/turns/status.d.ts.map +0 -1
  245. package/dist/turns/status.js +0 -56
  246. package/dist/turns/status.js.map +0 -1
  247. package/dist/turns/turn-store.d.ts +0 -109
  248. package/dist/turns/turn-store.d.ts.map +0 -1
  249. package/dist/turns/turn-store.js +0 -169
  250. package/dist/turns/turn-store.js.map +0 -1
  251. package/dist/warm/client-cache.d.ts +0 -47
  252. package/dist/warm/client-cache.d.ts.map +0 -1
  253. package/dist/warm/client-cache.js +0 -48
  254. package/dist/warm/client-cache.js.map +0 -1
  255. package/dist/warm/envelope-cache.d.ts +0 -79
  256. package/dist/warm/envelope-cache.d.ts.map +0 -1
  257. package/dist/warm/envelope-cache.js +0 -85
  258. package/dist/warm/envelope-cache.js.map +0 -1
  259. package/dist/warm/index.d.ts +0 -18
  260. package/dist/warm/index.d.ts.map +0 -1
  261. package/dist/warm/index.js +0 -12
  262. package/dist/warm/index.js.map +0 -1
  263. package/dist/warm/payload.d.ts +0 -137
  264. package/dist/warm/payload.d.ts.map +0 -1
  265. package/dist/warm/payload.js +0 -112
  266. package/dist/warm/payload.js.map +0 -1
  267. package/dist/warm/revision.d.ts +0 -70
  268. package/dist/warm/revision.d.ts.map +0 -1
  269. package/dist/warm/revision.js +0 -63
  270. package/dist/warm/revision.js.map +0 -1
  271. package/dist/warm/store-policy.d.ts +0 -57
  272. package/dist/warm/store-policy.d.ts.map +0 -1
  273. package/dist/warm/store-policy.js +0 -89
  274. package/dist/warm/store-policy.js.map +0 -1
  275. package/dist/warm/store.d.ts +0 -42
  276. package/dist/warm/store.d.ts.map +0 -1
  277. package/dist/warm/store.js +0 -69
  278. package/dist/warm/store.js.map +0 -1
  279. package/dist/wire/frames.d.ts +0 -208
  280. package/dist/wire/frames.d.ts.map +0 -1
  281. package/dist/wire/frames.js +0 -245
  282. package/dist/wire/frames.js.map +0 -1
  283. package/dist/wire/index.d.ts +0 -7
  284. package/dist/wire/index.d.ts.map +0 -1
  285. package/dist/wire/index.js +0 -7
  286. package/dist/wire/index.js.map +0 -1
@@ -1,112 +0,0 @@
1
- /**
2
- * Warm-payload shapes and the stable-JSON / session-freeze / envelope-request
3
- * laws — `amalgm-ui/lib/chat/payload.ts`, ported byte-exact.
4
- *
5
- * Design doc: docs/warm-payloads.md (Layer A shape + freeze interaction).
6
- *
7
- * The UI file imports its field types from elsewhere in amalgm-ui; those
8
- * types are mirrored here verbatim so the SDK stands alone:
9
- * - `HarnessId`, `AuthMethod` — amalgm-ui/lib/harnesses.ts:26,30
10
- * - `CliEffort`, `ModelCliSettings` — amalgm-ui/lib/modelSettings.ts:4-11
11
- * - `CustomAgentLoadout` — amalgm-ui/lib/customAgents.ts:31-34
12
- * - `InstalledSkillSource` — amalgm-ui/lib/skills/types.ts:1-12
13
- * - `AgentConfig*` — amalgm-ui/lib/agent-config/types.ts:3-48
14
- */
15
- function stableJsonValue(value, arrayItem = false) {
16
- if (value === undefined || typeof value === 'function' || typeof value === 'symbol') {
17
- return arrayItem ? 'null' : undefined;
18
- }
19
- if (Array.isArray(value)) {
20
- return `[${value.map((item) => stableJsonValue(item, true) ?? 'null').join(',')}]`;
21
- }
22
- if (!value || typeof value !== 'object') {
23
- return JSON.stringify(value);
24
- }
25
- const input = value;
26
- return `{${Object.keys(input)
27
- .sort()
28
- .flatMap((key) => {
29
- const serialized = stableJsonValue(input[key]);
30
- return serialized === undefined ? [] : `${JSON.stringify(key)}:${serialized}`;
31
- })
32
- .join(',')}}`;
33
- }
34
- export function stableJson(value) {
35
- return stableJsonValue(value) ?? 'null';
36
- }
37
- export function getSessionStableChatViewPayload(payload) {
38
- return {
39
- machineId: payload.machineId,
40
- harness: payload.harness,
41
- resolvedHarnessId: payload.resolvedHarnessId,
42
- authMethod: payload.authMethod,
43
- cwd: payload.cwd,
44
- customAgentId: payload.customAgentId,
45
- systemPrompt: payload.systemPrompt,
46
- agentConfigSnapshot: payload.agentConfigSnapshot ?? null,
47
- };
48
- }
49
- export function mergeSessionStableChatViewPayload(payload, sessionStablePayload) {
50
- if (!sessionStablePayload)
51
- return payload;
52
- return {
53
- ...payload,
54
- ...sessionStablePayload,
55
- };
56
- }
57
- export function buildLaunchEnvelopeRequest(payload, machinePayload) {
58
- if (payload.pendingWorktree)
59
- return null;
60
- if (machinePayload?.payloadId) {
61
- return {
62
- chatPayloadId: machinePayload.payloadId,
63
- chatPayloadRevision: machinePayload.revision ?? null,
64
- chatInput: {
65
- parts: [],
66
- agent: {
67
- harness: payload.harness,
68
- model: payload.modelId,
69
- authMethod: payload.authMethod,
70
- customAgentId: payload.customAgentId,
71
- systemPrompt: null,
72
- },
73
- tools: {
74
- mcpAppIds: [],
75
- toolIds: payload.loadout?.toolIds ?? [],
76
- },
77
- execution: {
78
- cwd: null,
79
- computerId: payload.machineId,
80
- },
81
- },
82
- };
83
- }
84
- const agentConfigSnapshot = payload.agentConfigSnapshot ?? null;
85
- return {
86
- chatInput: {
87
- parts: [],
88
- agent: {
89
- harness: payload.harness,
90
- model: payload.modelId,
91
- authMethod: payload.authMethod,
92
- customAgentId: payload.customAgentId,
93
- systemPrompt: payload.systemPrompt,
94
- },
95
- tools: {
96
- mcpAppIds: payload.mcpAppIds,
97
- toolIds: payload.loadout?.toolIds ?? [],
98
- },
99
- execution: {
100
- cwd: payload.cwd,
101
- computerId: payload.machineId,
102
- },
103
- },
104
- modelSettings: payload.modelSettings,
105
- ...(agentConfigSnapshot ? {
106
- agentConfigId: agentConfigSnapshot.agentId,
107
- agentConfig: agentConfigSnapshot.config,
108
- compiledAgentInstructions: agentConfigSnapshot.compiledInstructions,
109
- } : {}),
110
- };
111
- }
112
- //# sourceMappingURL=payload.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"payload.js","sourceRoot":"","sources":["../../src/warm/payload.ts"],"names":[],"mappings":"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"}
@@ -1,70 +0,0 @@
1
- /**
2
- * Revision hash + client publish-dedupe policy — the pure laws of
3
- * `amalgm-ui/lib/chat/machinePayloadClient.ts` (:7-51 and the decision
4
- * sequence of `publishMachineChatPayload`, :61-71).
5
- *
6
- * Design doc: docs/warm-payloads.md ("Revision law").
7
- *
8
- * Note: the revision is NOT sha256 — the UI uses a djb2-xor string hash
9
- * rendered base-36 (`machinePayloadClient.ts:41-47`), ported byte-exact
10
- * below, so no Sha256HexPort is needed here. The maps themselves
11
- * (in-flight promises, confirmed writes) and the fetch are host state;
12
- * this module exports only the shapes, constants, and decision laws.
13
- */
14
- import type { ChatViewPayload } from './payload.js';
15
- /** Store record shape as the client sees it — `machinePayloadClient.ts:7-12`. */
16
- export type MachineChatPayloadRecord = {
17
- id: string;
18
- revision: string;
19
- payload: ChatViewPayload;
20
- updatedAt?: string;
21
- };
22
- /** In-flight write memory, per (machine, payload) key — `machinePayloadClient.ts:17-22`. */
23
- export type PendingMachinePayloadWrite = {
24
- revision: string;
25
- };
26
- export type ConfirmedMachinePayloadWrite = {
27
- revision: string;
28
- at: number;
29
- };
30
- /** `machinePayloadClient.ts:35` — confirmed-write memory lives 10 minutes. */
31
- export declare const CONFIRMED_WRITE_TTL_MS: number;
32
- /** Dedupe-map key law — `machinePayloadClient.ts:37-39`. */
33
- export declare function machinePayloadWriteKey(machineId: string | null | undefined, payloadId: string): string;
34
- /**
35
- * Revision law: revision = hash of the stable JSON of the payload
36
- * (`machinePayloadClient.ts:49-51`; callers feed it `stableJson(payload)`).
37
- */
38
- export declare function chatPayloadRevision(payloadJson: string): string;
39
- /**
40
- * Is a confirmed-write memory entry still fresh? — the guard at
41
- * `machinePayloadClient.ts:69` (`Date.now() - confirmed.at < TTL`), with
42
- * the clock injected.
43
- */
44
- export declare function isConfirmedWriteFresh(confirmed: ConfirmedMachinePayloadWrite | null | undefined, nowMs: number): boolean;
45
- export type MachinePayloadPublishDecision =
46
- /** No payload id — nothing to publish (`:61`). */
47
- 'skip-no-payload-id'
48
- /** The live state stream already committed this revision (`:62`). */
49
- | 'skip-committed'
50
- /** An identical write is already in flight — join its promise (`:65-66`). */
51
- | 'join-pending'
52
- /** The server confirmed this revision within the TTL (`:68-71`). */
53
- | 'skip-confirmed'
54
- /** Issue the PUT. */
55
- | 'publish';
56
- /**
57
- * The publish-dedupe decision sequence of `publishMachineChatPayload`
58
- * (`machinePayloadClient.ts:61-71`), as a pure function. The caller looks up
59
- * `pending`/`confirmed` from its own maps under `machinePayloadWriteKey` and
60
- * acts on the verdict; map mutation and the fetch stay host.
61
- */
62
- export declare function machinePayloadPublishDecision(args: {
63
- payloadId: string | null;
64
- revision: string;
65
- committedRevision?: string | null;
66
- pending?: PendingMachinePayloadWrite | null;
67
- confirmed?: ConfirmedMachinePayloadWrite | null;
68
- nowMs: number;
69
- }): MachinePayloadPublishDecision;
70
- //# sourceMappingURL=revision.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"revision.d.ts","sourceRoot":"","sources":["../../src/warm/revision.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAEH,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,cAAc,CAAC;AAEpD,iFAAiF;AACjF,MAAM,MAAM,wBAAwB,GAAG;IACrC,EAAE,EAAE,MAAM,CAAC;IACX,QAAQ,EAAE,MAAM,CAAC;IACjB,OAAO,EAAE,eAAe,CAAC;IACzB,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB,CAAC;AAEF,4FAA4F;AAC5F,MAAM,MAAM,0BAA0B,GAAG;IACvC,QAAQ,EAAE,MAAM,CAAC;CAClB,CAAC;AAOF,MAAM,MAAM,4BAA4B,GAAG;IACzC,QAAQ,EAAE,MAAM,CAAC;IACjB,EAAE,EAAE,MAAM,CAAC;CACZ,CAAC;AAEF,8EAA8E;AAC9E,eAAO,MAAM,sBAAsB,QAAiB,CAAC;AAErD,4DAA4D;AAC5D,wBAAgB,sBAAsB,CAAC,SAAS,EAAE,MAAM,GAAG,IAAI,GAAG,SAAS,EAAE,SAAS,EAAE,MAAM,GAAG,MAAM,CAEtG;AAUD;;;GAGG;AACH,wBAAgB,mBAAmB,CAAC,WAAW,EAAE,MAAM,GAAG,MAAM,CAE/D;AAED;;;;GAIG;AACH,wBAAgB,qBAAqB,CACnC,SAAS,EAAE,4BAA4B,GAAG,IAAI,GAAG,SAAS,EAC1D,KAAK,EAAE,MAAM,GACZ,OAAO,CAGT;AAED,MAAM,MAAM,6BAA6B;AACvC,kDAAkD;AAChD,oBAAoB;AACtB,qEAAqE;GACnE,gBAAgB;AAClB,6EAA6E;GAC3E,cAAc;AAChB,oEAAoE;GAClE,gBAAgB;AAClB,qBAAqB;GACnB,SAAS,CAAC;AAEd;;;;;GAKG;AACH,wBAAgB,6BAA6B,CAAC,IAAI,EAAE;IAClD,SAAS,EAAE,MAAM,GAAG,IAAI,CAAC;IACzB,QAAQ,EAAE,MAAM,CAAC;IACjB,iBAAiB,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAClC,OAAO,CAAC,EAAE,0BAA0B,GAAG,IAAI,CAAC;IAC5C,SAAS,CAAC,EAAE,4BAA4B,GAAG,IAAI,CAAC;IAChD,KAAK,EAAE,MAAM,CAAC;CACf,GAAG,6BAA6B,CAShC"}
@@ -1,63 +0,0 @@
1
- /**
2
- * Revision hash + client publish-dedupe policy — the pure laws of
3
- * `amalgm-ui/lib/chat/machinePayloadClient.ts` (:7-51 and the decision
4
- * sequence of `publishMachineChatPayload`, :61-71).
5
- *
6
- * Design doc: docs/warm-payloads.md ("Revision law").
7
- *
8
- * Note: the revision is NOT sha256 — the UI uses a djb2-xor string hash
9
- * rendered base-36 (`machinePayloadClient.ts:41-47`), ported byte-exact
10
- * below, so no Sha256HexPort is needed here. The maps themselves
11
- * (in-flight promises, confirmed writes) and the fetch are host state;
12
- * this module exports only the shapes, constants, and decision laws.
13
- */
14
- /** `machinePayloadClient.ts:35` — confirmed-write memory lives 10 minutes. */
15
- export const CONFIRMED_WRITE_TTL_MS = 10 * 60 * 1000;
16
- /** Dedupe-map key law — `machinePayloadClient.ts:37-39`. */
17
- export function machinePayloadWriteKey(machineId, payloadId) {
18
- return `${machineId?.trim() || '__default__'}\0${payloadId}`;
19
- }
20
- function hashString(input) {
21
- let hash = 5381;
22
- for (let index = 0; index < input.length; index += 1) {
23
- hash = ((hash << 5) + hash) ^ input.charCodeAt(index);
24
- }
25
- return (hash >>> 0).toString(36);
26
- }
27
- /**
28
- * Revision law: revision = hash of the stable JSON of the payload
29
- * (`machinePayloadClient.ts:49-51`; callers feed it `stableJson(payload)`).
30
- */
31
- export function chatPayloadRevision(payloadJson) {
32
- return hashString(payloadJson);
33
- }
34
- /**
35
- * Is a confirmed-write memory entry still fresh? — the guard at
36
- * `machinePayloadClient.ts:69` (`Date.now() - confirmed.at < TTL`), with
37
- * the clock injected.
38
- */
39
- export function isConfirmedWriteFresh(confirmed, nowMs) {
40
- if (!confirmed)
41
- return false;
42
- return nowMs - confirmed.at < CONFIRMED_WRITE_TTL_MS;
43
- }
44
- /**
45
- * The publish-dedupe decision sequence of `publishMachineChatPayload`
46
- * (`machinePayloadClient.ts:61-71`), as a pure function. The caller looks up
47
- * `pending`/`confirmed` from its own maps under `machinePayloadWriteKey` and
48
- * acts on the verdict; map mutation and the fetch stay host.
49
- */
50
- export function machinePayloadPublishDecision(args) {
51
- const { payloadId, revision, committedRevision, pending, confirmed, nowMs } = args;
52
- if (!payloadId)
53
- return 'skip-no-payload-id';
54
- if (committedRevision === revision)
55
- return 'skip-committed';
56
- if (pending?.revision === revision)
57
- return 'join-pending';
58
- if (confirmed?.revision === revision && isConfirmedWriteFresh(confirmed, nowMs)) {
59
- return 'skip-confirmed';
60
- }
61
- return 'publish';
62
- }
63
- //# sourceMappingURL=revision.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"revision.js","sourceRoot":"","sources":["../../src/warm/revision.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AA2BH,8EAA8E;AAC9E,MAAM,CAAC,MAAM,sBAAsB,GAAG,EAAE,GAAG,EAAE,GAAG,IAAI,CAAC;AAErD,4DAA4D;AAC5D,MAAM,UAAU,sBAAsB,CAAC,SAAoC,EAAE,SAAiB;IAC5F,OAAO,GAAG,SAAS,EAAE,IAAI,EAAE,IAAI,aAAa,KAAK,SAAS,EAAE,CAAC;AAC/D,CAAC;AAED,SAAS,UAAU,CAAC,KAAa;IAC/B,IAAI,IAAI,GAAG,IAAI,CAAC;IAChB,KAAK,IAAI,KAAK,GAAG,CAAC,EAAE,KAAK,GAAG,KAAK,CAAC,MAAM,EAAE,KAAK,IAAI,CAAC,EAAE,CAAC;QACrD,IAAI,GAAG,CAAC,CAAC,IAAI,IAAI,CAAC,CAAC,GAAG,IAAI,CAAC,GAAG,KAAK,CAAC,UAAU,CAAC,KAAK,CAAC,CAAC;IACxD,CAAC;IACD,OAAO,CAAC,IAAI,KAAK,CAAC,CAAC,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC;AACnC,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,mBAAmB,CAAC,WAAmB;IACrD,OAAO,UAAU,CAAC,WAAW,CAAC,CAAC;AACjC,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,qBAAqB,CACnC,SAA0D,EAC1D,KAAa;IAEb,IAAI,CAAC,SAAS;QAAE,OAAO,KAAK,CAAC;IAC7B,OAAO,KAAK,GAAG,SAAS,CAAC,EAAE,GAAG,sBAAsB,CAAC;AACvD,CAAC;AAcD;;;;;GAKG;AACH,MAAM,UAAU,6BAA6B,CAAC,IAO7C;IACC,MAAM,EAAE,SAAS,EAAE,QAAQ,EAAE,iBAAiB,EAAE,OAAO,EAAE,SAAS,EAAE,KAAK,EAAE,GAAG,IAAI,CAAC;IACnF,IAAI,CAAC,SAAS;QAAE,OAAO,oBAAoB,CAAC;IAC5C,IAAI,iBAAiB,KAAK,QAAQ;QAAE,OAAO,gBAAgB,CAAC;IAC5D,IAAI,OAAO,EAAE,QAAQ,KAAK,QAAQ;QAAE,OAAO,cAAc,CAAC;IAC1D,IAAI,SAAS,EAAE,QAAQ,KAAK,QAAQ,IAAI,qBAAqB,CAAC,SAAS,EAAE,KAAK,CAAC,EAAE,CAAC;QAChF,OAAO,gBAAgB,CAAC;IAC1B,CAAC;IACD,OAAO,SAAS,CAAC;AACnB,CAAC"}
@@ -1,57 +0,0 @@
1
- /**
2
- * Machine-side chat-payload store policy — the pure laws of engine
3
- * `runtime/scripts/amalgm-mcp/lib/chat-payloads.js` (CJS). SQLite
4
- * (`local_meta` key `chat_payloads`), the transaction, and state-event
5
- * emission stay host; this module owns the record shape, normalization,
6
- * the TTL/cap constants, and the GC sweep decision.
7
- */
8
- import type { ClockIsoPort } from '../ports.js';
9
- /** `chat-payloads.js:6-7` — store key and state-event resource name. */
10
- export declare const CHAT_PAYLOADS_META_KEY = "chat_payloads";
11
- export declare const CHAT_PAYLOADS_RESOURCE = "chat_payloads";
12
- export declare const CHAT_PAYLOAD_TTL_MS: number;
13
- export declare const CHAT_PAYLOAD_MAX_RECORDS = 300;
14
- /** Stored record shape — `chat-payloads.js:54-59`. Payload is untyped JSON machine-side. */
15
- export type ChatPayloadStoreRecord = {
16
- id: string;
17
- revision: string;
18
- payload: Record<string, unknown>;
19
- updatedAt: string;
20
- };
21
- /** `chat-payloads.js:17-19`. */
22
- export declare function isPlainObject(value: unknown): value is Record<string, unknown>;
23
- /** `chat-payloads.js:21-23`. */
24
- export declare function cleanString(value: unknown): string | null;
25
- /**
26
- * Record normalization law — `chat-payloads.js:42-60`: id required (from
27
- * `id`/`payloadId`/existing), payload required (from body else existing),
28
- * revision falls back through `revision`/`payloadRevision`/existing to
29
- * `'unknown'`, and `updatedAt` is stamped now (the engine's
30
- * `new Date().toISOString()`, injected as `clockIso`).
31
- */
32
- export declare function normalizeChatPayloadRecord(input: unknown, existing: ChatPayloadStoreRecord | null, clockIso: ClockIsoPort): ChatPayloadStoreRecord;
33
- /**
34
- * `chat-payloads.js:62-65` — unparseable/absent updatedAt sorts as epoch 0.
35
- * `Date.parse` here is a deterministic string parser, not a clock read —
36
- * the purity axiom (src/ports.ts) bans ambient time/entropy, and the
37
- * engine's law is defined in terms of `Date.parse` itself. `String(...)`
38
- * mirrors the ToString coercion `Date.parse` applies to the engine's
39
- * `record?.updatedAt || ''` argument.
40
- */
41
- export declare function recordTimestamp(record: {
42
- updatedAt?: unknown;
43
- } | null | undefined): number;
44
- /**
45
- * GC sweep decision — the pure core of `sweepChatPayloadsOnce`
46
- * (`chat-payloads.js:67-100`, the transaction body :74-86): keep only
47
- * plain records with a non-blank id whose timestamp is on or after
48
- * `now - 7d`; if more than 300 survive, keep the newest 300 by
49
- * `updatedAt`. `changed === false` means the sweep writes nothing (the
50
- * engine returns null and skips the SQLite UPDATE + state event). The
51
- * once-per-process latch, the write, and the event stay host.
52
- */
53
- export declare function sweepChatPayloads(current: Record<string, unknown>, nowMs: number): {
54
- changed: boolean;
55
- next: Record<string, ChatPayloadStoreRecord>;
56
- };
57
- //# sourceMappingURL=store-policy.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"store-policy.d.ts","sourceRoot":"","sources":["../../src/warm/store-policy.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAEhD,wEAAwE;AACxE,eAAO,MAAM,sBAAsB,kBAAkB,CAAC;AACtD,eAAO,MAAM,sBAAsB,kBAAkB,CAAC;AAMtD,eAAO,MAAM,mBAAmB,QAA0B,CAAC;AAC3D,eAAO,MAAM,wBAAwB,MAAM,CAAC;AAE5C,4FAA4F;AAC5F,MAAM,MAAM,sBAAsB,GAAG;IACnC,EAAE,EAAE,MAAM,CAAC;IACX,QAAQ,EAAE,MAAM,CAAC;IACjB,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IACjC,SAAS,EAAE,MAAM,CAAC;CACnB,CAAC;AAEF,gCAAgC;AAChC,wBAAgB,aAAa,CAAC,KAAK,EAAE,OAAO,GAAG,KAAK,IAAI,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAE9E;AAED,gCAAgC;AAChC,wBAAgB,WAAW,CAAC,KAAK,EAAE,OAAO,GAAG,MAAM,GAAG,IAAI,CAEzD;AAED;;;;;;GAMG;AACH,wBAAgB,0BAA0B,CACxC,KAAK,EAAE,OAAO,EACd,QAAQ,EAAE,sBAAsB,GAAG,IAAI,EACvC,QAAQ,EAAE,YAAY,GACrB,sBAAsB,CAkBxB;AAED;;;;;;;GAOG;AACH,wBAAgB,eAAe,CAAC,MAAM,EAAE;IAAE,SAAS,CAAC,EAAE,OAAO,CAAA;CAAE,GAAG,IAAI,GAAG,SAAS,GAAG,MAAM,CAG1F;AAED;;;;;;;;GAQG;AACH,wBAAgB,iBAAiB,CAC/B,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAChC,KAAK,EAAE,MAAM,GACZ;IAAE,OAAO,EAAE,OAAO,CAAC;IAAC,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,sBAAsB,CAAC,CAAA;CAAE,CAgBpE"}
@@ -1,89 +0,0 @@
1
- /**
2
- * Machine-side chat-payload store policy — the pure laws of engine
3
- * `runtime/scripts/amalgm-mcp/lib/chat-payloads.js` (CJS). SQLite
4
- * (`local_meta` key `chat_payloads`), the transaction, and state-event
5
- * emission stay host; this module owns the record shape, normalization,
6
- * the TTL/cap constants, and the GC sweep decision.
7
- */
8
- /** `chat-payloads.js:6-7` — store key and state-event resource name. */
9
- export const CHAT_PAYLOADS_META_KEY = 'chat_payloads';
10
- export const CHAT_PAYLOADS_RESOURCE = 'chat_payloads';
11
- // Records are keyed by UI tab id and nothing deletes them when a tab closes, so
12
- // the map grows forever without a sweep. GC of a live tab's record is safe:
13
- // before every launch the client re-publishes unless its own confirmed-write
14
- // memory is fresher than 10 minutes.
15
- export const CHAT_PAYLOAD_TTL_MS = 7 * 24 * 60 * 60 * 1000;
16
- export const CHAT_PAYLOAD_MAX_RECORDS = 300;
17
- /** `chat-payloads.js:17-19`. */
18
- export function isPlainObject(value) {
19
- return Boolean(value && typeof value === 'object' && !Array.isArray(value));
20
- }
21
- /** `chat-payloads.js:21-23`. */
22
- export function cleanString(value) {
23
- return typeof value === 'string' && value.trim() ? value.trim() : null;
24
- }
25
- /**
26
- * Record normalization law — `chat-payloads.js:42-60`: id required (from
27
- * `id`/`payloadId`/existing), payload required (from body else existing),
28
- * revision falls back through `revision`/`payloadRevision`/existing to
29
- * `'unknown'`, and `updatedAt` is stamped now (the engine's
30
- * `new Date().toISOString()`, injected as `clockIso`).
31
- */
32
- export function normalizeChatPayloadRecord(input, existing, clockIso) {
33
- const body = isPlainObject(input) ? input : {};
34
- const id = cleanString(body['id'] || body['payloadId'] || existing?.id);
35
- if (!id)
36
- throw new Error('chat payload id is required');
37
- const payload = isPlainObject(body['payload'])
38
- ? body['payload']
39
- : isPlainObject(existing?.payload)
40
- ? existing.payload
41
- : null;
42
- if (!payload)
43
- throw new Error('chat payload is required');
44
- return {
45
- id,
46
- revision: cleanString(body['revision'] || body['payloadRevision'] || existing?.revision) || 'unknown',
47
- payload,
48
- updatedAt: clockIso(),
49
- };
50
- }
51
- /**
52
- * `chat-payloads.js:62-65` — unparseable/absent updatedAt sorts as epoch 0.
53
- * `Date.parse` here is a deterministic string parser, not a clock read —
54
- * the purity axiom (src/ports.ts) bans ambient time/entropy, and the
55
- * engine's law is defined in terms of `Date.parse` itself. `String(...)`
56
- * mirrors the ToString coercion `Date.parse` applies to the engine's
57
- * `record?.updatedAt || ''` argument.
58
- */
59
- export function recordTimestamp(record) {
60
- const parsed = Date.parse(String(record?.updatedAt || ''));
61
- return Number.isFinite(parsed) ? parsed : 0;
62
- }
63
- /**
64
- * GC sweep decision — the pure core of `sweepChatPayloadsOnce`
65
- * (`chat-payloads.js:67-100`, the transaction body :74-86): keep only
66
- * plain records with a non-blank id whose timestamp is on or after
67
- * `now - 7d`; if more than 300 survive, keep the newest 300 by
68
- * `updatedAt`. `changed === false` means the sweep writes nothing (the
69
- * engine returns null and skips the SQLite UPDATE + state event). The
70
- * once-per-process latch, the write, and the event stay host.
71
- */
72
- export function sweepChatPayloads(current, nowMs) {
73
- const cutoff = nowMs - CHAT_PAYLOAD_TTL_MS;
74
- let kept = Object.values(current)
75
- .filter((record) => isPlainObject(record) && Boolean(cleanString(record['id'])))
76
- .filter((record) => recordTimestamp(record) >= cutoff);
77
- if (kept.length > CHAT_PAYLOAD_MAX_RECORDS) {
78
- kept = kept
79
- .sort((a, b) => recordTimestamp(b) - recordTimestamp(a))
80
- .slice(0, CHAT_PAYLOAD_MAX_RECORDS);
81
- }
82
- if (kept.length === Object.keys(current).length)
83
- return { changed: false, next: current };
84
- const next = {};
85
- for (const record of kept)
86
- next[record.id] = record;
87
- return { changed: true, next };
88
- }
89
- //# sourceMappingURL=store-policy.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"store-policy.js","sourceRoot":"","sources":["../../src/warm/store-policy.ts"],"names":[],"mappings":"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"}
@@ -1,42 +0,0 @@
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
@@ -1 +0,0 @@
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"}
@@ -1,69 +0,0 @@
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
@@ -1 +0,0 @@
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"}