@amalgm/chat 0.1.1 → 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 (282) hide show
  1. package/AGENTS.md +98 -0
  2. package/PURPOSE.md +143 -104
  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 -23
  61. package/dist/index.d.ts.map +1 -1
  62. package/dist/index.js +7 -23
  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 +45 -21
  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/turns/index.d.ts +0 -11
  228. package/dist/turns/index.d.ts.map +0 -1
  229. package/dist/turns/index.js +0 -11
  230. package/dist/turns/index.js.map +0 -1
  231. package/dist/turns/queries.d.ts +0 -36
  232. package/dist/turns/queries.d.ts.map +0 -1
  233. package/dist/turns/queries.js +0 -37
  234. package/dist/turns/queries.js.map +0 -1
  235. package/dist/turns/replay.d.ts +0 -105
  236. package/dist/turns/replay.d.ts.map +0 -1
  237. package/dist/turns/replay.js +0 -163
  238. package/dist/turns/replay.js.map +0 -1
  239. package/dist/turns/status.d.ts +0 -49
  240. package/dist/turns/status.d.ts.map +0 -1
  241. package/dist/turns/status.js +0 -56
  242. package/dist/turns/status.js.map +0 -1
  243. package/dist/turns/turn-store.d.ts +0 -109
  244. package/dist/turns/turn-store.d.ts.map +0 -1
  245. package/dist/turns/turn-store.js +0 -169
  246. package/dist/turns/turn-store.js.map +0 -1
  247. package/dist/warm/client-cache.d.ts +0 -47
  248. package/dist/warm/client-cache.d.ts.map +0 -1
  249. package/dist/warm/client-cache.js +0 -48
  250. package/dist/warm/client-cache.js.map +0 -1
  251. package/dist/warm/envelope-cache.d.ts +0 -79
  252. package/dist/warm/envelope-cache.d.ts.map +0 -1
  253. package/dist/warm/envelope-cache.js +0 -85
  254. package/dist/warm/envelope-cache.js.map +0 -1
  255. package/dist/warm/index.d.ts +0 -18
  256. package/dist/warm/index.d.ts.map +0 -1
  257. package/dist/warm/index.js +0 -12
  258. package/dist/warm/index.js.map +0 -1
  259. package/dist/warm/payload.d.ts +0 -137
  260. package/dist/warm/payload.d.ts.map +0 -1
  261. package/dist/warm/payload.js +0 -112
  262. package/dist/warm/payload.js.map +0 -1
  263. package/dist/warm/revision.d.ts +0 -70
  264. package/dist/warm/revision.d.ts.map +0 -1
  265. package/dist/warm/revision.js +0 -63
  266. package/dist/warm/revision.js.map +0 -1
  267. package/dist/warm/store-policy.d.ts +0 -57
  268. package/dist/warm/store-policy.d.ts.map +0 -1
  269. package/dist/warm/store-policy.js +0 -89
  270. package/dist/warm/store-policy.js.map +0 -1
  271. package/dist/warm/store.d.ts +0 -42
  272. package/dist/warm/store.d.ts.map +0 -1
  273. package/dist/warm/store.js +0 -69
  274. package/dist/warm/store.js.map +0 -1
  275. package/dist/wire/frames.d.ts +0 -208
  276. package/dist/wire/frames.d.ts.map +0 -1
  277. package/dist/wire/frames.js +0 -245
  278. package/dist/wire/frames.js.map +0 -1
  279. package/dist/wire/index.d.ts +0 -7
  280. package/dist/wire/index.d.ts.map +0 -1
  281. package/dist/wire/index.js +0 -7
  282. package/dist/wire/index.js.map +0 -1
@@ -1,225 +0,0 @@
1
- /**
2
- * Internal port of engine `chat-core/tool-shape.js` (173 lines): tool
3
- * identity — kind classification, human titles, and MCP name parsing
4
- * (`mcp__<server>__<tool>`, `amalgm_<tool>`), ported byte-exact.
5
- *
6
- * NOTE (dedupe): the canonical public home for tool identity is the
7
- * transcript module (`src/transcript/`, per ROADMAP). This copy exists so
8
- * `src/events` + `src/wire` build stand-alone; unify when the transcript
9
- * port lands. Not re-exported from the events barrel.
10
- */
11
- import { compactText, isRecord, stringifyResult } from './tool-display.js';
12
- /** Engine tool-shape.js:9-17. Hostname without `www.`; unparseable URLs compact to 80 chars. */
13
- export function hostLabel(url) {
14
- if (url === undefined || url === null || url === '')
15
- return '';
16
- try {
17
- const host = new URL(String(url)).hostname.replace(/^www\./, '');
18
- return host || String(url);
19
- }
20
- catch {
21
- return compactText(url, 80);
22
- }
23
- }
24
- /** Engine tool-shape.js:19-28. */
25
- export function humanizeToolName(value = '') {
26
- const text = String(value || '')
27
- .replace(/^mcp__/, '')
28
- .replace(/^amalgm[_-]/i, '')
29
- .replace(/__/g, ' ')
30
- .replace(/[_-]+/g, ' ')
31
- .trim();
32
- if (!text)
33
- return 'Tool';
34
- return text.charAt(0).toUpperCase() + text.slice(1);
35
- }
36
- /** Engine tool-shape.js:30-37. `mcp__<server>__<tool>` or `amalgm_<tool>`; null otherwise. */
37
- export function parseMcpName(name = '') {
38
- const text = String(name || '');
39
- const mcp = text.match(/^mcp__([^_]+(?:_[^_]+)*)__([\s\S]+)$/);
40
- if (mcp)
41
- return { server: mcp[1], tool: mcp[2] };
42
- const amalgm = text.match(/^amalgm_(.+)$/);
43
- if (amalgm)
44
- return { server: 'amalgm', tool: amalgm[1] };
45
- return null;
46
- }
47
- /** Engine tool-shape.js:39-51. Falsy errors normalize to undefined; records keep themselves as `details`. */
48
- export function normalizeError(error, fallback = 'Tool failed') {
49
- if (!error)
50
- return undefined;
51
- if (typeof error === 'string')
52
- return { message: error };
53
- if (isRecord(error)) {
54
- const message = error['message'] || error['error'] || error['details'] || fallback;
55
- return {
56
- message: typeof message === 'string' ? message : stringifyResult(message),
57
- ...(error['code'] ? { code: String(error['code']) } : {}),
58
- details: error,
59
- };
60
- }
61
- return { message: String(error) || fallback };
62
- }
63
- /** Engine tool-shape.js:53-76. Canonical kind classifier (name, then MCP, then input-shape heuristics). */
64
- export function toolKind(name = '', input = {}, metadata = {}) {
65
- const clean = String(name || '').toLowerCase();
66
- const compact = clean.replace(/[^a-z0-9]/g, '');
67
- const mcp = metadata['mcp'] || parseMcpName(name);
68
- if (metadata['subagent'] || clean === 'task' || clean.includes('spawnagent') || clean.includes('collabagent'))
69
- return 'subagent';
70
- if (clean.includes('todo'))
71
- return 'todo';
72
- if (clean.includes('question') || clean.includes('askuser'))
73
- return 'question';
74
- if (compact.includes('toolsearch'))
75
- return 'search';
76
- if (clean.includes('bash') || clean.includes('command'))
77
- return 'bash';
78
- if (clean.includes('websearch') || clean === 'websearch')
79
- return 'web_search';
80
- if (clean.includes('browser') || mcp?.tool?.startsWith?.('browser_'))
81
- return 'browser';
82
- if (clean.includes('webfetch') || clean === 'webfetch')
83
- return 'browser';
84
- if (clean.includes('read'))
85
- return 'file_read';
86
- if (clean.includes('write'))
87
- return 'file_write';
88
- if (clean.includes('edit') || clean.includes('filechange'))
89
- return 'file_edit';
90
- if (mcp)
91
- return 'mcp';
92
- if (input && typeof input === 'object') {
93
- const record = input;
94
- if (record['command'] !== undefined)
95
- return 'bash';
96
- if (record['url'] !== undefined)
97
- return 'browser';
98
- if (record['query'] !== undefined)
99
- return 'web_search';
100
- if (record['file_path'] !== undefined || record['filePath'] !== undefined || record['path'] !== undefined)
101
- return 'file_read';
102
- }
103
- return 'unknown';
104
- }
105
- /**
106
- * Engine tool-shape.js:78-88. Browser action out of a tool name, across
107
- * naming eras: current toolbox__browser_open, era-2
108
- * toolbox__browser_browser_open / browser_open, and bare
109
- * record_start/cua_click. Null for non-browser tools.
110
- */
111
- function browserAction(name) {
112
- const match = String(name || '').match(/^(?:toolbox__browser_|browser_)(.+)$/);
113
- if (match)
114
- return match[1].replace(/^browser_/, '');
115
- if (/^(?:record_(?:start|stop|list)|cua(?:_[a-z_]+)?)$/.test(String(name)))
116
- return name;
117
- return null;
118
- }
119
- /** Engine tool-shape.js:90-123. */
120
- function titleFromMcp(tool, input = {}) {
121
- const name = String(tool || '');
122
- const action = browserAction(name);
123
- if (action === 'open')
124
- return input['url'] ? `Opening ${hostLabel(input['url'])}` : 'Opening browser page';
125
- if (action === 'snapshot')
126
- return 'Reading browser page';
127
- if (action === 'screenshot' || action === 'cua_screenshot')
128
- return 'Taking browser screenshot';
129
- if (action === 'fill')
130
- return input['text'] ? `Typing "${compactText(input['text'], 60)}"` : 'Typing in browser';
131
- if (action === 'click')
132
- return 'Clicking in browser';
133
- if (action === 'press')
134
- return input['key'] ? `Pressing ${compactText(input['key'], 20)}` : 'Pressing key in browser';
135
- if (action === 'eval')
136
- return 'Running JavaScript in browser';
137
- if (action === 'wait')
138
- return 'Waiting for page';
139
- if (action === 'cli')
140
- return Array.isArray(input['args']) ? `Browser: ${compactText(input['args'].join(' '), 60)}` : 'Running browser command';
141
- if (action === 'cua') {
142
- const cuaAction = String(input['action'] || '');
143
- if (cuaAction === 'screenshot')
144
- return 'Taking browser screenshot';
145
- if (cuaAction === 'type')
146
- return input['text'] ? `Typing "${compactText(input['text'], 60)}"` : 'Typing in browser';
147
- return cuaAction ? `Browser ${cuaAction.replace(/_/g, ' ')} (coordinates)` : 'Browser computer-use action';
148
- }
149
- if (action === 'dialog')
150
- return input['action'] === 'dismiss' ? 'Dismissing browser dialog' : 'Accepting browser dialog';
151
- if (action === 'tab')
152
- return `Browser tab ${compactText(String(input['action'] || 'list'), 20)}`;
153
- if (action === 'console')
154
- return 'Reading browser console';
155
- if (action === 'close')
156
- return 'Closing browser session';
157
- if (action === 'record_start')
158
- return 'Starting browser recording';
159
- if (action === 'record_stop')
160
- return 'Saving browser recording';
161
- if (action === 'record_list')
162
- return 'Listing browser recordings';
163
- if (action === 'auth_list')
164
- return 'Listing browser logins';
165
- if (name === 'apps_register')
166
- return input['cwd'] ? `Registering app from ${compactText(input['cwd'], 60)}` : 'Registering app';
167
- if (name === 'apps_start')
168
- return 'Starting app';
169
- if (name === 'apps_stop')
170
- return 'Stopping app';
171
- if (name === 'apps_list')
172
- return 'Listing apps';
173
- if (name === 'agents_list')
174
- return 'Listing agents';
175
- if (name === 'talk_to_agent')
176
- return 'Talking to agent';
177
- return humanizeToolName(action || name);
178
- }
179
- /** Engine tool-shape.js:125-157. Descriptor > metadata title > MCP title > per-tool heuristics > fallback. */
180
- export function titleForTool({ name, input = {}, error, metadata = {}, fallback } = {}) {
181
- if (metadata['actionDescriptor'])
182
- return compactText(metadata['actionDescriptor'], 160);
183
- if (metadata['title'])
184
- return compactText(metadata['title'], 160);
185
- const mcp = metadata['mcp'] || parseMcpName(name);
186
- if (mcp)
187
- return titleFromMcp(mcp.tool, input);
188
- const clean = String(name || '').toLowerCase();
189
- const compact = clean.replace(/[^a-z0-9]/g, '');
190
- const action = metadata['action'];
191
- if (action?.['type'] === 'search') {
192
- return `Searching ${compactText(action['query'] || input['query'] || 'the web', 80)}`;
193
- }
194
- if (action?.['type'] === 'openPage') {
195
- const host = hostLabel(action['url'] || input['url'] || input['query']);
196
- return host ? `Opening ${host}` : 'Opening web page';
197
- }
198
- if (action?.['type'] === 'findInPage') {
199
- const pattern = action['pattern'] || input['pattern'];
200
- const url = action['url'] || input['url'];
201
- const host = hostLabel(url) || 'current page';
202
- return pattern ? `Finding "${compactText(pattern, 60)}" on ${host}` : `Finding text on ${host}`;
203
- }
204
- if (compact.includes('toolsearch')) {
205
- const selected = String(input['query'] || '').replace(/^select:/i, '').trim();
206
- return selected ? `Selecting ${compactText(selected, 80)}` : 'Selecting tool';
207
- }
208
- if (clean.includes('websearch'))
209
- return input['query'] ? `Searching ${compactText(input['query'], 80)}` : 'Searching the web';
210
- if (clean.includes('webfetch'))
211
- return input['url'] ? `Opening ${hostLabel(input['url'])}` : 'Opening web page';
212
- if (clean === 'bash' || clean.includes('command'))
213
- return input['command'] ? `$ ${compactText(input['command'], 120)}` : 'Running command';
214
- if (clean === 'task' || metadata['subagent'])
215
- return compactText(input['description'] || metadata['description'] || fallback || 'Running subagent', 120);
216
- if (error)
217
- return normalizeError(error)?.message || 'Tool failed';
218
- return compactText(fallback || humanizeToolName(name), 120);
219
- }
220
- /** Engine tool-shape.js:159-162. */
221
- export function mcpMetadataFromName(name) {
222
- const mcp = parseMcpName(name);
223
- return mcp ? { mcp } : {};
224
- }
225
- //# sourceMappingURL=tool-shape.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"tool-shape.js","sourceRoot":"","sources":["../../src/events/tool-shape.ts"],"names":[],"mappings":"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"}
@@ -1,11 +0,0 @@
1
- /**
2
- * @amalgm/chat — turns module barrel. The turn machine's pure laws:
3
- * the TurnStore tempstore (stores.js), the status vocabulary, the replay
4
- * grammar (streams.js), and the /active + /runtime-idle query shapes
5
- * (engine.js:101-118).
6
- */
7
- export { TURN_STATUSES, IDLE_STATUS, ACTIVE_STATUSES, STOP_REASONS, isActiveStatus, isTerminalStatus, type TurnStatus, type QueryStatus, type ActiveStatus, type StopReason, } from './status.js';
8
- export { TurnStore, addChunkOrThrow, RAW_STREAM_WRITE_FAILED_MESSAGE, type TurnChunk, type TurnEntry, type StartTurnInput, type ChunkFrame, type AddChunkOptions, type TurnListener, } from './turn-store.js';
9
- export { HEARTBEAT_INTERVAL_MS, KEEP_ALIVE_FRAME, SSE_HEADERS, CHAT_STREAM_FALLBACK_ERROR, jsonSse, namedSse, normalizeAfterIndex, parseAfterIndexParam, findTurn, createTurnTail, createRawTempTail, chatErrorWrites, type ReplayFormat, type TailOutput, type TurnTail, type TurnTailOptions, } from './replay.js';
10
- export { activeQuery, idleStatusQuery, type ActiveQueryResult, type IdleStatusResult, } from './queries.js';
11
- //# sourceMappingURL=index.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/turns/index.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EACL,aAAa,EACb,WAAW,EACX,eAAe,EACf,YAAY,EACZ,cAAc,EACd,gBAAgB,EAChB,KAAK,UAAU,EACf,KAAK,WAAW,EAChB,KAAK,YAAY,EACjB,KAAK,UAAU,GAChB,MAAM,aAAa,CAAC;AAErB,OAAO,EACL,SAAS,EACT,eAAe,EACf,+BAA+B,EAC/B,KAAK,SAAS,EACd,KAAK,SAAS,EACd,KAAK,cAAc,EACnB,KAAK,UAAU,EACf,KAAK,eAAe,EACpB,KAAK,YAAY,GAClB,MAAM,iBAAiB,CAAC;AAEzB,OAAO,EACL,qBAAqB,EACrB,gBAAgB,EAChB,WAAW,EACX,0BAA0B,EAC1B,OAAO,EACP,QAAQ,EACR,mBAAmB,EACnB,oBAAoB,EACpB,QAAQ,EACR,cAAc,EACd,iBAAiB,EACjB,eAAe,EACf,KAAK,YAAY,EACjB,KAAK,UAAU,EACf,KAAK,QAAQ,EACb,KAAK,eAAe,GACrB,MAAM,aAAa,CAAC;AAErB,OAAO,EACL,WAAW,EACX,eAAe,EACf,KAAK,iBAAiB,EACtB,KAAK,gBAAgB,GACtB,MAAM,cAAc,CAAC"}
@@ -1,11 +0,0 @@
1
- /**
2
- * @amalgm/chat — turns module barrel. The turn machine's pure laws:
3
- * the TurnStore tempstore (stores.js), the status vocabulary, the replay
4
- * grammar (streams.js), and the /active + /runtime-idle query shapes
5
- * (engine.js:101-118).
6
- */
7
- export { TURN_STATUSES, IDLE_STATUS, ACTIVE_STATUSES, STOP_REASONS, isActiveStatus, isTerminalStatus, } from './status.js';
8
- export { TurnStore, addChunkOrThrow, RAW_STREAM_WRITE_FAILED_MESSAGE, } from './turn-store.js';
9
- export { HEARTBEAT_INTERVAL_MS, KEEP_ALIVE_FRAME, SSE_HEADERS, CHAT_STREAM_FALLBACK_ERROR, jsonSse, namedSse, normalizeAfterIndex, parseAfterIndexParam, findTurn, createTurnTail, createRawTempTail, chatErrorWrites, } from './replay.js';
10
- export { activeQuery, idleStatusQuery, } from './queries.js';
11
- //# sourceMappingURL=index.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/turns/index.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EACL,aAAa,EACb,WAAW,EACX,eAAe,EACf,YAAY,EACZ,cAAc,EACd,gBAAgB,GAKjB,MAAM,aAAa,CAAC;AAErB,OAAO,EACL,SAAS,EACT,eAAe,EACf,+BAA+B,GAOhC,MAAM,iBAAiB,CAAC;AAEzB,OAAO,EACL,qBAAqB,EACrB,gBAAgB,EAChB,WAAW,EACX,0BAA0B,EAC1B,OAAO,EACP,QAAQ,EACR,mBAAmB,EACnB,oBAAoB,EACpB,QAAQ,EACR,cAAc,EACd,iBAAiB,EACjB,eAAe,GAKhB,MAAM,aAAa,CAAC;AAErB,OAAO,EACL,WAAW,EACX,eAAe,GAGhB,MAAM,cAAc,CAAC"}
@@ -1,36 +0,0 @@
1
- /**
2
- * Turn query response shapes — engine `chat-core/engine.js:101-118`, the
3
- * pure builders behind `GET /active` and `GET /runtime-idle`
4
- * (server.js:101,45). They read only a TurnStore; the host serializes.
5
- */
6
- import type { TurnStore } from './turn-store.js';
7
- import { type QueryStatus } from './status.js';
8
- /** `GET /active` response body (engine.js:101-109). */
9
- export interface ActiveQueryResult {
10
- active: boolean;
11
- codeSessionId: string;
12
- assistantMessageId: string | null;
13
- status: QueryStatus;
14
- }
15
- /**
16
- * `ChatCore.active()` (engine.js:101-109): the session's active entry, with
17
- * the active flag re-checked against the status predicate (a `cancelling`
18
- * turn is still active) and `'idle'` synthesized when nothing is stored.
19
- * Falsy assistantMessageId coerces to null via `||`, as the engine does.
20
- */
21
- export declare function activeQuery(store: TurnStore, sessionId: string): ActiveQueryResult;
22
- /** `GET /runtime-idle` response body (engine.js:111-118). */
23
- export interface IdleStatusResult {
24
- idle: boolean;
25
- active_turns: number;
26
- tempstore_count: number;
27
- }
28
- /**
29
- * `ChatCore.idleStatus()` (engine.js:111-118): idle iff no turn holds a
30
- * tempstore slot; both counters report the same activeCount. The engine's
31
- * `typeof this.turns.activeCount === 'function'` guard is dropped — the
32
- * store is typed here, so activeCount always exists (engineParity: true,
33
- * guard unreachable).
34
- */
35
- export declare function idleStatusQuery(store: TurnStore): IdleStatusResult;
36
- //# sourceMappingURL=queries.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"queries.d.ts","sourceRoot":"","sources":["../../src/turns/queries.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;AACjD,OAAO,EAAe,KAAK,WAAW,EAAkB,MAAM,aAAa,CAAC;AAE5E,uDAAuD;AACvD,MAAM,WAAW,iBAAiB;IAChC,MAAM,EAAE,OAAO,CAAC;IAChB,aAAa,EAAE,MAAM,CAAC;IACtB,kBAAkB,EAAE,MAAM,GAAG,IAAI,CAAC;IAClC,MAAM,EAAE,WAAW,CAAC;CACrB;AAED;;;;;GAKG;AACH,wBAAgB,WAAW,CAAC,KAAK,EAAE,SAAS,EAAE,SAAS,EAAE,MAAM,GAAG,iBAAiB,CAQlF;AAED,6DAA6D;AAC7D,MAAM,WAAW,gBAAgB;IAC/B,IAAI,EAAE,OAAO,CAAC;IACd,YAAY,EAAE,MAAM,CAAC;IACrB,eAAe,EAAE,MAAM,CAAC;CACzB;AAED;;;;;;GAMG;AACH,wBAAgB,eAAe,CAAC,KAAK,EAAE,SAAS,GAAG,gBAAgB,CAOlE"}
@@ -1,37 +0,0 @@
1
- /**
2
- * Turn query response shapes — engine `chat-core/engine.js:101-118`, the
3
- * pure builders behind `GET /active` and `GET /runtime-idle`
4
- * (server.js:101,45). They read only a TurnStore; the host serializes.
5
- */
6
- import { IDLE_STATUS, isActiveStatus } from './status.js';
7
- /**
8
- * `ChatCore.active()` (engine.js:101-109): the session's active entry, with
9
- * the active flag re-checked against the status predicate (a `cancelling`
10
- * turn is still active) and `'idle'` synthesized when nothing is stored.
11
- * Falsy assistantMessageId coerces to null via `||`, as the engine does.
12
- */
13
- export function activeQuery(store, sessionId) {
14
- const entry = store.active(sessionId);
15
- return {
16
- active: !!entry && isActiveStatus(entry.status),
17
- codeSessionId: sessionId,
18
- assistantMessageId: entry?.assistantMessageId || null,
19
- status: entry?.status || IDLE_STATUS,
20
- };
21
- }
22
- /**
23
- * `ChatCore.idleStatus()` (engine.js:111-118): idle iff no turn holds a
24
- * tempstore slot; both counters report the same activeCount. The engine's
25
- * `typeof this.turns.activeCount === 'function'` guard is dropped — the
26
- * store is typed here, so activeCount always exists (engineParity: true,
27
- * guard unreachable).
28
- */
29
- export function idleStatusQuery(store) {
30
- const tempstoreCount = store.activeCount();
31
- return {
32
- idle: tempstoreCount === 0,
33
- active_turns: tempstoreCount,
34
- tempstore_count: tempstoreCount,
35
- };
36
- }
37
- //# sourceMappingURL=queries.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"queries.js","sourceRoot":"","sources":["../../src/turns/queries.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAGH,OAAO,EAAE,WAAW,EAAoB,cAAc,EAAE,MAAM,aAAa,CAAC;AAU5E;;;;;GAKG;AACH,MAAM,UAAU,WAAW,CAAC,KAAgB,EAAE,SAAiB;IAC7D,MAAM,KAAK,GAAG,KAAK,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC;IACtC,OAAO;QACL,MAAM,EAAE,CAAC,CAAC,KAAK,IAAI,cAAc,CAAC,KAAK,CAAC,MAAM,CAAC;QAC/C,aAAa,EAAE,SAAS;QACxB,kBAAkB,EAAE,KAAK,EAAE,kBAAkB,IAAI,IAAI;QACrD,MAAM,EAAE,KAAK,EAAE,MAAM,IAAI,WAAW;KACrC,CAAC;AACJ,CAAC;AASD;;;;;;GAMG;AACH,MAAM,UAAU,eAAe,CAAC,KAAgB;IAC9C,MAAM,cAAc,GAAG,KAAK,CAAC,WAAW,EAAE,CAAC;IAC3C,OAAO;QACL,IAAI,EAAE,cAAc,KAAK,CAAC;QAC1B,YAAY,EAAE,cAAc;QAC5B,eAAe,EAAE,cAAc;KAChC,CAAC;AACJ,CAAC"}
@@ -1,105 +0,0 @@
1
- /**
2
- * The replay grammar — engine `chat-core/streams.js` (160 lines), with the
3
- * host I/O peeled off. streams.js mixes SSE response plumbing (headers,
4
- * heartbeat timers, `res.write`) with the replay LAW: which payloads a tail
5
- * emits, in what order, and when the stream closes. This module is the law
6
- * as pure functions; the host owns the socket, the timer, and the actual
7
- * subscription wiring.
8
- *
9
- * Host contract (mirrors streams.js:97-117):
10
- * 1. `createTurnTail(entry, options)` — apply `tail.initial` writes; if
11
- * `initial.end`, close.
12
- * 2. `store.subscribe(entry.turnId, (chunk, current) => ...)` — feed each
13
- * emission through `tail.next(chunk, current)`; write its writes; close
14
- * on `end`. (Subscribe before applying `initial` to match the engine;
15
- * the cursor guard makes duplicate delivery harmless.)
16
- * 3. Every `HEARTBEAT_INTERVAL_MS`, write `KEEP_ALIVE_FRAME` while open.
17
- */
18
- import type { TurnChunk, TurnEntry, TurnStore } from './turn-store.js';
19
- /** Heartbeat cadence (streams.js:5). */
20
- export declare const HEARTBEAT_INTERVAL_MS = 15000;
21
- /** The comment frame the heartbeat writes (streams.js:31), byte-exact. */
22
- export declare const KEEP_ALIVE_FRAME = ": keep-alive\n\n";
23
- /**
24
- * The SSE response headers the host must send before any tail write
25
- * (sse.js:198-204). Documented contract — writing them is host work.
26
- */
27
- export declare const SSE_HEADERS: {
28
- readonly 'Content-Type': "text/event-stream";
29
- readonly 'Cache-Control': "no-cache, no-transform";
30
- readonly Connection: "keep-alive";
31
- };
32
- /**
33
- * The two tail formats (streams.js:63):
34
- * - `frame` — `/chat` live tail: chunk `data` bytes written verbatim.
35
- * - `raw-temp` — `/raw-temp` replay: named SSE events
36
- * `existing` {chunks, total} → `chunk` {chunk, total} → `complete` {total}.
37
- */
38
- export type ReplayFormat = 'frame' | 'raw-temp';
39
- /** Anonymous SSE data frame (streams.js:7-9). */
40
- export declare function jsonSse(data: unknown): string;
41
- /** Named SSE event frame (streams.js:11-13). */
42
- export declare function namedSse(event: string, data: unknown): string;
43
- /** Cursor normalization (streams.js:58-60): any non-finite value → -1. */
44
- export declare function normalizeAfterIndex(afterIndex: unknown): number;
45
- /**
46
- * Route-layer cursor parse (server.js:43):
47
- * `Number(searchParams.get('afterIndex') ?? -1)`. A missing param is -1; a
48
- * garbage param becomes NaN, which {@link normalizeAfterIndex} folds to -1
49
- * inside the tail. An empty-string param is 0 — engine-faithful quirk.
50
- */
51
- export declare function parseAfterIndexParam(value: string | null): number;
52
- /**
53
- * Tail selection (streams.js:120-122): the id is tried as a session first —
54
- * active turn, else latest-by-session — then as a literal turn id.
55
- */
56
- export declare function findTurn(store: TurnStore, id: string): TurnEntry | null;
57
- /** One step's output: payloads to write, then whether to close the stream. */
58
- export interface TailOutput {
59
- writes: string[];
60
- end: boolean;
61
- }
62
- export interface TurnTailOptions {
63
- /** Defaults to 'frame' (streams.js:63). */
64
- format?: ReplayFormat;
65
- /** Replay cursor; non-finite values normalize to -1 (streams.js:64). */
66
- afterIndex?: number;
67
- }
68
- export interface TurnTail {
69
- /**
70
- * The backlog pass (streams.js:104-117): existing chunks past the cursor,
71
- * plus immediate completion when the turn is already terminal.
72
- */
73
- readonly initial: TailOutput;
74
- /**
75
- * One subscription emission (streams.js:97-101): a chunk write, or — on a
76
- * status notification — completion if the status is terminal.
77
- */
78
- next(chunk: TurnChunk | null, current: TurnEntry): TailOutput;
79
- }
80
- /**
81
- * The core of `writeTurnTail` (streams.js:62-118) as a cursor-holding pure
82
- * state machine. No sockets, no timers: each call returns the exact payload
83
- * strings the engine would have written.
84
- */
85
- export declare function createTurnTail(entry: TurnEntry, options?: TurnTailOptions): TurnTail;
86
- /**
87
- * `writeRawTempStream` selection (streams.js:124-134): resolve the id via
88
- * {@link findTurn}; `null` means the host answers 404 (no tail exists).
89
- */
90
- export declare function createRawTempTail(store: TurnStore, id: string, afterIndex?: number): {
91
- entry: TurnEntry;
92
- tail: TurnTail;
93
- } | null;
94
- /**
95
- * Default error message when a failed turn carries none (streams.js:148).
96
- */
97
- export declare const CHAT_STREAM_FALLBACK_ERROR = "Internal server error";
98
- /**
99
- * The frames `/chat` writes when `runTurn` rejects (streams.js:148-152):
100
- * an error frame, then a complete frame with `stopReason: 'error'`. After
101
- * writing these the host closes the stream — this is the second half of the
102
- * save_failed rule: the tail held the socket open so these bytes land first.
103
- */
104
- export declare function chatErrorWrites(message?: string | null): string[];
105
- //# sourceMappingURL=replay.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"replay.d.ts","sourceRoot":"","sources":["../../src/turns/replay.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;GAgBG;AAEH,OAAO,KAAK,EAAE,SAAS,EAAE,SAAS,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;AAGvE,wCAAwC;AACxC,eAAO,MAAM,qBAAqB,QAAS,CAAC;AAE5C,0EAA0E;AAC1E,eAAO,MAAM,gBAAgB,qBAAqB,CAAC;AAEnD;;;GAGG;AACH,eAAO,MAAM,WAAW;;;;CAId,CAAC;AAEX;;;;;GAKG;AACH,MAAM,MAAM,YAAY,GAAG,OAAO,GAAG,UAAU,CAAC;AAEhD,iDAAiD;AACjD,wBAAgB,OAAO,CAAC,IAAI,EAAE,OAAO,GAAG,MAAM,CAE7C;AAED,gDAAgD;AAChD,wBAAgB,QAAQ,CAAC,KAAK,EAAE,MAAM,EAAE,IAAI,EAAE,OAAO,GAAG,MAAM,CAE7D;AAED,0EAA0E;AAC1E,wBAAgB,mBAAmB,CAAC,UAAU,EAAE,OAAO,GAAG,MAAM,CAE/D;AAED;;;;;GAKG;AACH,wBAAgB,oBAAoB,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI,GAAG,MAAM,CAEjE;AAED;;;GAGG;AACH,wBAAgB,QAAQ,CAAC,KAAK,EAAE,SAAS,EAAE,EAAE,EAAE,MAAM,GAAG,SAAS,GAAG,IAAI,CAEvE;AAED,8EAA8E;AAC9E,MAAM,WAAW,UAAU;IACzB,MAAM,EAAE,MAAM,EAAE,CAAC;IACjB,GAAG,EAAE,OAAO,CAAC;CACd;AAED,MAAM,WAAW,eAAe;IAC9B,2CAA2C;IAC3C,MAAM,CAAC,EAAE,YAAY,CAAC;IACtB,wEAAwE;IACxE,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB;AAED,MAAM,WAAW,QAAQ;IACvB;;;OAGG;IACH,QAAQ,CAAC,OAAO,EAAE,UAAU,CAAC;IAC7B;;;OAGG;IACH,IAAI,CAAC,KAAK,EAAE,SAAS,GAAG,IAAI,EAAE,OAAO,EAAE,SAAS,GAAG,UAAU,CAAC;CAC/D;AAED;;;;GAIG;AACH,wBAAgB,cAAc,CAAC,KAAK,EAAE,SAAS,EAAE,OAAO,GAAE,eAAoB,GAAG,QAAQ,CA4DxF;AAED;;;GAGG;AACH,wBAAgB,iBAAiB,CAC/B,KAAK,EAAE,SAAS,EAChB,EAAE,EAAE,MAAM,EACV,UAAU,CAAC,EAAE,MAAM,GAClB;IAAE,KAAK,EAAE,SAAS,CAAC;IAAC,IAAI,EAAE,QAAQ,CAAA;CAAE,GAAG,IAAI,CAU7C;AAED;;GAEG;AACH,eAAO,MAAM,0BAA0B,0BAA0B,CAAC;AAElE;;;;;GAKG;AACH,wBAAgB,eAAe,CAAC,OAAO,CAAC,EAAE,MAAM,GAAG,IAAI,GAAG,MAAM,EAAE,CAMjE"}
@@ -1,163 +0,0 @@
1
- /**
2
- * The replay grammar — engine `chat-core/streams.js` (160 lines), with the
3
- * host I/O peeled off. streams.js mixes SSE response plumbing (headers,
4
- * heartbeat timers, `res.write`) with the replay LAW: which payloads a tail
5
- * emits, in what order, and when the stream closes. This module is the law
6
- * as pure functions; the host owns the socket, the timer, and the actual
7
- * subscription wiring.
8
- *
9
- * Host contract (mirrors streams.js:97-117):
10
- * 1. `createTurnTail(entry, options)` — apply `tail.initial` writes; if
11
- * `initial.end`, close.
12
- * 2. `store.subscribe(entry.turnId, (chunk, current) => ...)` — feed each
13
- * emission through `tail.next(chunk, current)`; write its writes; close
14
- * on `end`. (Subscribe before applying `initial` to match the engine;
15
- * the cursor guard makes duplicate delivery harmless.)
16
- * 3. Every `HEARTBEAT_INTERVAL_MS`, write `KEEP_ALIVE_FRAME` while open.
17
- */
18
- import { isTerminalStatus } from './status.js';
19
- /** Heartbeat cadence (streams.js:5). */
20
- export const HEARTBEAT_INTERVAL_MS = 15_000;
21
- /** The comment frame the heartbeat writes (streams.js:31), byte-exact. */
22
- export const KEEP_ALIVE_FRAME = ': keep-alive\n\n';
23
- /**
24
- * The SSE response headers the host must send before any tail write
25
- * (sse.js:198-204). Documented contract — writing them is host work.
26
- */
27
- export const SSE_HEADERS = {
28
- 'Content-Type': 'text/event-stream',
29
- 'Cache-Control': 'no-cache, no-transform',
30
- Connection: 'keep-alive',
31
- };
32
- /** Anonymous SSE data frame (streams.js:7-9). */
33
- export function jsonSse(data) {
34
- return `data: ${JSON.stringify(data)}\n\n`;
35
- }
36
- /** Named SSE event frame (streams.js:11-13). */
37
- export function namedSse(event, data) {
38
- return `event: ${event}\ndata: ${JSON.stringify(data)}\n\n`;
39
- }
40
- /** Cursor normalization (streams.js:58-60): any non-finite value → -1. */
41
- export function normalizeAfterIndex(afterIndex) {
42
- return Number.isFinite(afterIndex) ? afterIndex : -1;
43
- }
44
- /**
45
- * Route-layer cursor parse (server.js:43):
46
- * `Number(searchParams.get('afterIndex') ?? -1)`. A missing param is -1; a
47
- * garbage param becomes NaN, which {@link normalizeAfterIndex} folds to -1
48
- * inside the tail. An empty-string param is 0 — engine-faithful quirk.
49
- */
50
- export function parseAfterIndexParam(value) {
51
- return Number(value ?? -1);
52
- }
53
- /**
54
- * Tail selection (streams.js:120-122): the id is tried as a session first —
55
- * active turn, else latest-by-session — then as a literal turn id.
56
- */
57
- export function findTurn(store, id) {
58
- return store.latest(id) || store.get(id);
59
- }
60
- /**
61
- * The core of `writeTurnTail` (streams.js:62-118) as a cursor-holding pure
62
- * state machine. No sockets, no timers: each call returns the exact payload
63
- * strings the engine would have written.
64
- */
65
- export function createTurnTail(entry, options = {}) {
66
- const format = options.format || 'frame';
67
- let lastSent = normalizeAfterIndex(options.afterIndex);
68
- // streams.js:66-78 — the guarded chunk write; advances the cursor.
69
- const writeChunk = (writes, chunk, current) => {
70
- if (!chunk || chunk.index <= lastSent)
71
- return;
72
- if (format === 'raw-temp') {
73
- writes.push(namedSse('chunk', {
74
- codeSessionId: current.sessionId,
75
- chunk,
76
- total: current.chunks.length,
77
- }));
78
- }
79
- else {
80
- writes.push(chunk.data);
81
- }
82
- lastSent = chunk.index;
83
- };
84
- // streams.js:80-95 — the completion rule. raw-temp always writes the
85
- // `complete` event and closes. frame format writes nothing and closes —
86
- // UNLESS the status is `save_failed`: the /chat route still owes the tail
87
- // an error frame after runTurn rejects, so the stream must stay open for
88
- // it (streams.js:90-94; the frames themselves are chatErrorWrites()).
89
- const complete = (writes, current) => {
90
- if (format === 'raw-temp') {
91
- writes.push(namedSse('complete', {
92
- codeSessionId: current.sessionId,
93
- total: current.chunks.length,
94
- }));
95
- return true;
96
- }
97
- return current.status !== 'save_failed';
98
- };
99
- // streams.js:104-117 — the backlog pass.
100
- const initial = { writes: [], end: false };
101
- const existing = entry.chunks.filter((chunk) => chunk.index > lastSent);
102
- if (format === 'raw-temp') {
103
- initial.writes.push(namedSse('existing', {
104
- codeSessionId: entry.sessionId,
105
- assistantMessageId: entry.assistantMessageId,
106
- chunks: existing,
107
- total: existing.length,
108
- }));
109
- if (existing.length)
110
- lastSent = existing[existing.length - 1].index;
111
- }
112
- else {
113
- for (const chunk of existing)
114
- writeChunk(initial.writes, chunk, entry);
115
- }
116
- if (isTerminalStatus(entry.status))
117
- initial.end = complete(initial.writes, entry);
118
- return {
119
- initial,
120
- next(chunk, current) {
121
- const out = { writes: [], end: false };
122
- if (chunk)
123
- writeChunk(out.writes, chunk, current);
124
- else if (isTerminalStatus(current.status))
125
- out.end = complete(out.writes, current);
126
- return out;
127
- },
128
- };
129
- }
130
- /**
131
- * `writeRawTempStream` selection (streams.js:124-134): resolve the id via
132
- * {@link findTurn}; `null` means the host answers 404 (no tail exists).
133
- */
134
- export function createRawTempTail(store, id, afterIndex) {
135
- const entry = findTurn(store, id);
136
- if (!entry)
137
- return null;
138
- return {
139
- entry,
140
- tail: createTurnTail(entry, {
141
- format: 'raw-temp',
142
- afterIndex: normalizeAfterIndex(afterIndex),
143
- }),
144
- };
145
- }
146
- /**
147
- * Default error message when a failed turn carries none (streams.js:148).
148
- */
149
- export const CHAT_STREAM_FALLBACK_ERROR = 'Internal server error';
150
- /**
151
- * The frames `/chat` writes when `runTurn` rejects (streams.js:148-152):
152
- * an error frame, then a complete frame with `stopReason: 'error'`. After
153
- * writing these the host closes the stream — this is the second half of the
154
- * save_failed rule: the tail held the socket open so these bytes land first.
155
- */
156
- export function chatErrorWrites(message) {
157
- const resolved = message || CHAT_STREAM_FALLBACK_ERROR;
158
- return [
159
- jsonSse({ _type: 'error', message: resolved }),
160
- jsonSse({ _type: 'complete', stopReason: 'error' }),
161
- ];
162
- }
163
- //# sourceMappingURL=replay.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"replay.js","sourceRoot":"","sources":["../../src/turns/replay.ts"],"names":[],"mappings":"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"}