@amalgm/chat 0.1.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 (183) hide show
  1. package/PURPOSE.md +107 -0
  2. package/README.md +41 -0
  3. package/dist/contract/chat-input.d.ts +144 -0
  4. package/dist/contract/chat-input.d.ts.map +1 -0
  5. package/dist/contract/chat-input.js +261 -0
  6. package/dist/contract/chat-input.js.map +1 -0
  7. package/dist/contract/create.d.ts +191 -0
  8. package/dist/contract/create.d.ts.map +1 -0
  9. package/dist/contract/create.js +249 -0
  10. package/dist/contract/create.js.map +1 -0
  11. package/dist/contract/freeze.d.ts +85 -0
  12. package/dist/contract/freeze.d.ts.map +1 -0
  13. package/dist/contract/freeze.js +151 -0
  14. package/dist/contract/freeze.js.map +1 -0
  15. package/dist/contract/harnesses.d.ts +21 -0
  16. package/dist/contract/harnesses.d.ts.map +1 -0
  17. package/dist/contract/harnesses.js +39 -0
  18. package/dist/contract/harnesses.js.map +1 -0
  19. package/dist/contract/index.d.ts +17 -0
  20. package/dist/contract/index.d.ts.map +1 -0
  21. package/dist/contract/index.js +17 -0
  22. package/dist/contract/index.js.map +1 -0
  23. package/dist/contract/input.d.ts +45 -0
  24. package/dist/contract/input.d.ts.map +1 -0
  25. package/dist/contract/input.js +78 -0
  26. package/dist/contract/input.js.map +1 -0
  27. package/dist/contract/models.d.ts +57 -0
  28. package/dist/contract/models.d.ts.map +1 -0
  29. package/dist/contract/models.js +380 -0
  30. package/dist/contract/models.js.map +1 -0
  31. package/dist/contract/payload-merge.d.ts +76 -0
  32. package/dist/contract/payload-merge.d.ts.map +1 -0
  33. package/dist/contract/payload-merge.js +215 -0
  34. package/dist/contract/payload-merge.js.map +1 -0
  35. package/dist/events/constructors.d.ts +53 -0
  36. package/dist/events/constructors.d.ts.map +1 -0
  37. package/dist/events/constructors.js +217 -0
  38. package/dist/events/constructors.js.map +1 -0
  39. package/dist/events/index.d.ts +12 -0
  40. package/dist/events/index.d.ts.map +1 -0
  41. package/dist/events/index.js +12 -0
  42. package/dist/events/index.js.map +1 -0
  43. package/dist/events/schema.d.ts +455 -0
  44. package/dist/events/schema.d.ts.map +1 -0
  45. package/dist/events/schema.js +228 -0
  46. package/dist/events/schema.js.map +1 -0
  47. package/dist/events/tool-display.d.ts +22 -0
  48. package/dist/events/tool-display.d.ts.map +1 -0
  49. package/dist/events/tool-display.js +60 -0
  50. package/dist/events/tool-display.js.map +1 -0
  51. package/dist/events/tool-shape.d.ts +48 -0
  52. package/dist/events/tool-shape.d.ts.map +1 -0
  53. package/dist/events/tool-shape.js +225 -0
  54. package/dist/events/tool-shape.js.map +1 -0
  55. package/dist/index.d.ts +27 -0
  56. package/dist/index.d.ts.map +1 -0
  57. package/dist/index.js +26 -0
  58. package/dist/index.js.map +1 -0
  59. package/dist/normalizers/claude.d.ts +628 -0
  60. package/dist/normalizers/claude.d.ts.map +1 -0
  61. package/dist/normalizers/claude.js +603 -0
  62. package/dist/normalizers/claude.js.map +1 -0
  63. package/dist/normalizers/codex.d.ts +352 -0
  64. package/dist/normalizers/codex.d.ts.map +1 -0
  65. package/dist/normalizers/codex.js +485 -0
  66. package/dist/normalizers/codex.js.map +1 -0
  67. package/dist/normalizers/cursor.d.ts +34 -0
  68. package/dist/normalizers/cursor.d.ts.map +1 -0
  69. package/dist/normalizers/cursor.js +197 -0
  70. package/dist/normalizers/cursor.js.map +1 -0
  71. package/dist/normalizers/index.d.ts +13 -0
  72. package/dist/normalizers/index.d.ts.map +1 -0
  73. package/dist/normalizers/index.js +13 -0
  74. package/dist/normalizers/index.js.map +1 -0
  75. package/dist/normalizers/opencode.d.ts +81 -0
  76. package/dist/normalizers/opencode.d.ts.map +1 -0
  77. package/dist/normalizers/opencode.js +640 -0
  78. package/dist/normalizers/opencode.js.map +1 -0
  79. package/dist/normalizers/pi.d.ts +28 -0
  80. package/dist/normalizers/pi.d.ts.map +1 -0
  81. package/dist/normalizers/pi.js +160 -0
  82. package/dist/normalizers/pi.js.map +1 -0
  83. package/dist/ports.d.ts +14 -0
  84. package/dist/ports.d.ts.map +1 -0
  85. package/dist/ports.js +7 -0
  86. package/dist/ports.js.map +1 -0
  87. package/dist/transcript/index.d.ts +14 -0
  88. package/dist/transcript/index.d.ts.map +1 -0
  89. package/dist/transcript/index.js +12 -0
  90. package/dist/transcript/index.js.map +1 -0
  91. package/dist/transcript/message-reducer.d.ts +167 -0
  92. package/dist/transcript/message-reducer.d.ts.map +1 -0
  93. package/dist/transcript/message-reducer.js +400 -0
  94. package/dist/transcript/message-reducer.js.map +1 -0
  95. package/dist/transcript/part-accumulator.d.ts +24 -0
  96. package/dist/transcript/part-accumulator.d.ts.map +1 -0
  97. package/dist/transcript/part-accumulator.js +30 -0
  98. package/dist/transcript/part-accumulator.js.map +1 -0
  99. package/dist/transcript/tool-display.d.ts +14 -0
  100. package/dist/transcript/tool-display.d.ts.map +1 -0
  101. package/dist/transcript/tool-display.js +125 -0
  102. package/dist/transcript/tool-display.js.map +1 -0
  103. package/dist/transcript/tool-shape.d.ts +34 -0
  104. package/dist/transcript/tool-shape.d.ts.map +1 -0
  105. package/dist/transcript/tool-shape.js +216 -0
  106. package/dist/transcript/tool-shape.js.map +1 -0
  107. package/dist/turns/index.d.ts +11 -0
  108. package/dist/turns/index.d.ts.map +1 -0
  109. package/dist/turns/index.js +11 -0
  110. package/dist/turns/index.js.map +1 -0
  111. package/dist/turns/queries.d.ts +36 -0
  112. package/dist/turns/queries.d.ts.map +1 -0
  113. package/dist/turns/queries.js +37 -0
  114. package/dist/turns/queries.js.map +1 -0
  115. package/dist/turns/replay.d.ts +105 -0
  116. package/dist/turns/replay.d.ts.map +1 -0
  117. package/dist/turns/replay.js +163 -0
  118. package/dist/turns/replay.js.map +1 -0
  119. package/dist/turns/status.d.ts +49 -0
  120. package/dist/turns/status.d.ts.map +1 -0
  121. package/dist/turns/status.js +56 -0
  122. package/dist/turns/status.js.map +1 -0
  123. package/dist/turns/turn-store.d.ts +109 -0
  124. package/dist/turns/turn-store.d.ts.map +1 -0
  125. package/dist/turns/turn-store.js +169 -0
  126. package/dist/turns/turn-store.js.map +1 -0
  127. package/dist/usage/finalize.d.ts +57 -0
  128. package/dist/usage/finalize.d.ts.map +1 -0
  129. package/dist/usage/finalize.js +139 -0
  130. package/dist/usage/finalize.js.map +1 -0
  131. package/dist/usage/index.d.ts +11 -0
  132. package/dist/usage/index.d.ts.map +1 -0
  133. package/dist/usage/index.js +11 -0
  134. package/dist/usage/index.js.map +1 -0
  135. package/dist/usage/model-catalog.d.ts +50 -0
  136. package/dist/usage/model-catalog.d.ts.map +1 -0
  137. package/dist/usage/model-catalog.js +344 -0
  138. package/dist/usage/model-catalog.js.map +1 -0
  139. package/dist/usage/normalize.d.ts +103 -0
  140. package/dist/usage/normalize.d.ts.map +1 -0
  141. package/dist/usage/normalize.js +71 -0
  142. package/dist/usage/normalize.js.map +1 -0
  143. package/dist/usage/ports.d.ts +141 -0
  144. package/dist/usage/ports.d.ts.map +1 -0
  145. package/dist/usage/ports.js +113 -0
  146. package/dist/usage/ports.js.map +1 -0
  147. package/dist/usage/tokens.d.ts +79 -0
  148. package/dist/usage/tokens.d.ts.map +1 -0
  149. package/dist/usage/tokens.js +98 -0
  150. package/dist/usage/tokens.js.map +1 -0
  151. package/dist/warm/client-cache.d.ts +47 -0
  152. package/dist/warm/client-cache.d.ts.map +1 -0
  153. package/dist/warm/client-cache.js +48 -0
  154. package/dist/warm/client-cache.js.map +1 -0
  155. package/dist/warm/envelope-cache.d.ts +79 -0
  156. package/dist/warm/envelope-cache.d.ts.map +1 -0
  157. package/dist/warm/envelope-cache.js +85 -0
  158. package/dist/warm/envelope-cache.js.map +1 -0
  159. package/dist/warm/index.d.ts +16 -0
  160. package/dist/warm/index.d.ts.map +1 -0
  161. package/dist/warm/index.js +11 -0
  162. package/dist/warm/index.js.map +1 -0
  163. package/dist/warm/payload.d.ts +137 -0
  164. package/dist/warm/payload.d.ts.map +1 -0
  165. package/dist/warm/payload.js +112 -0
  166. package/dist/warm/payload.js.map +1 -0
  167. package/dist/warm/revision.d.ts +70 -0
  168. package/dist/warm/revision.d.ts.map +1 -0
  169. package/dist/warm/revision.js +63 -0
  170. package/dist/warm/revision.js.map +1 -0
  171. package/dist/warm/store-policy.d.ts +57 -0
  172. package/dist/warm/store-policy.d.ts.map +1 -0
  173. package/dist/warm/store-policy.js +89 -0
  174. package/dist/warm/store-policy.js.map +1 -0
  175. package/dist/wire/frames.d.ts +208 -0
  176. package/dist/wire/frames.d.ts.map +1 -0
  177. package/dist/wire/frames.js +245 -0
  178. package/dist/wire/frames.js.map +1 -0
  179. package/dist/wire/index.d.ts +7 -0
  180. package/dist/wire/index.d.ts.map +1 -0
  181. package/dist/wire/index.js +7 -0
  182. package/dist/wire/index.js.map +1 -0
  183. package/package.json +72 -0
package/PURPOSE.md ADDED
@@ -0,0 +1,107 @@
1
+ # @amalgm/chat — the conversation SDK
2
+
3
+ Status: extraction in progress · founded 2026-08-06 · source of truth for laws:
4
+ `amalgm-engine/runtime/scripts/chat-core/` (production until cutover)
5
+
6
+ ## Purpose
7
+
8
+ Chat is Amalgm's central product surface: every user message, every agent
9
+ turn, every streamed token flows through one pipeline. This repo owns that
10
+ pipeline's **laws** — what a turn is, what events mean, what a transcript
11
+ contains, how a send is prepared and billed — as a standalone SDK any host
12
+ can run: the engine runtime today, the Fly workers, the channels bridge
13
+ (email/Telegram/WhatsApp/Slack), and third-party apps tomorrow.
14
+
15
+ **Membership test:** a rule belongs here if it is a law of the conversation
16
+ itself — independent of any particular host, harness, or UI. If it spawns a
17
+ process, opens a socket, or touches a disk, it is a host adapter behind a
18
+ port, not a law.
19
+
20
+ ## The seven jobs
21
+
22
+ 1. **The event grammar.** One canonical vocabulary (`text.delta` …
23
+ `usage.final` … `done`) that every harness's native events are translated
24
+ into, schema-validated, and one projection of it onto the wire (the
25
+ ACP-shaped SSE frames). The grammar is the product's spine.
26
+ 2. **Normalization.** Per-harness translators (claude, codex, opencode,
27
+ cursor, pi) from native protocol events into the grammar. Pure functions;
28
+ every claim traceable to a recorded fixture.
29
+ 3. **Transcript truth.** One message reducer shared by both ends of the
30
+ wire: what the user watched streaming is byte-shape-identical to what
31
+ persists and reloads. Parts (text / reasoning / tool / image /
32
+ compaction) are the transcript's atoms.
33
+ 4. **The turn machine.** One active turn per session; the in-memory chunk
34
+ log (TurnStore) that makes reconnect/replay possible; the status
35
+ vocabulary (`streaming → cancelling → complete | cancelled | error |
36
+ save_failed | aborted`); the finalization order that never loses a
37
+ transcript silently.
38
+ 5. **The frozen contract.** A session's identity — harness, auth, model,
39
+ cwd, instructions, tool set — resolves once at creation and freezes.
40
+ Model names canonicalize through four deliberate identities (display /
41
+ runtime-CLI / billing / context-profile). Changing frozen fields means a
42
+ new session; that is what makes billing identity trustworthy.
43
+ 6. **Warm payloads.** The send path carries ids, not configuration: the full
44
+ launch payload is published to the machine's local store while the user
45
+ types (revision-hashed, 409 on mismatch), and the machine record is the
46
+ authority — client-supplied billing-relevant fields are deleted, never
47
+ trusted.
48
+ 7. **The usage law.** Token-list algebra, per-harness exactness rules,
49
+ the ownership fork (amalgm billing → proxy meters via egress; byok /
50
+ provider_auth → local logging), and the cost rules (unknown cost is
51
+ null, never zero).
52
+
53
+ ## Axioms
54
+
55
+ 1. **The engine copy is production truth until cutover.** Laws here are
56
+ ported byte-exact from `amalgm-engine/runtime/scripts/chat-core/`;
57
+ deliberate deviations carry an `engineParity: false` marker and a reason.
58
+ 2. **One reducer, both ends of the wire.** The engine's part accumulation
59
+ and the browser's live rendering are the same algorithm. Divergence is a
60
+ bug by definition.
61
+ 3. **The wire grammar is a public contract.** Tasks, subagents, Slack
62
+ inbound, email inbound, and hosted apps already speak `POST /chat` + the
63
+ SSE grammar. Evolution is additive; a removed or reshaped frame is a
64
+ breaking change to systems that never imported this package.
65
+ 4. **Send carries ids, not payloads.** The machine payload store is the
66
+ authority; precedence is payload record > chatInput > raw body; the
67
+ browser is never trusted for billing-relevant fields.
68
+ 5. **Session identity freezes at creation.** The frozen-contract fingerprint
69
+ decides; a turn whose frozen fields drifted continues the old contract.
70
+ 6. **Storage is a choice; the meter is not.** Conversation persistence can
71
+ be declined (`storage: 'none'`); usage logging on amalgm billing cannot.
72
+ 7. **The host supplies effects.** Nothing in `src/` imports `node:*`, reads
73
+ `process.env`, or calls `Date.now()`/`Math.random()` directly — clocks,
74
+ crypto, stores, transports arrive as injected ports.
75
+ 8. **Contracts are byte-exact.** Error strings, header names, status
76
+ vocabularies, thresholds, and merge precedence match the engine to the
77
+ byte; exams pin them.
78
+ 9. **One runtime dependency: zod.** The event grammar's executable form is
79
+ the same validator the engine runs — a hand-rolled clone would make
80
+ parity a fiction. Nothing else gets in.
81
+ 10. **Amalgm dogfoods its own SDK.** The end state (spec §10): ChatView's
82
+ data layer imports nothing but `@amalgm/chat`; the engine host mounts
83
+ these laws instead of containing them.
84
+
85
+ ## Five surfaces
86
+
87
+ | Surface | Form | Status |
88
+ |---|---|---|
89
+ | SDK | `@amalgm/chat` (this package's `src/`) | porting |
90
+ | API | router factory a host mounts | after SDK |
91
+ | CLI | `amalgm-chat` diagnostic commands | after SDK |
92
+ | MCP | tool definitions + dispatch | after SDK |
93
+ | Skill | `skills/chat/SKILL.md` | after SDK |
94
+
95
+ All doors are thin: one behavior in `src/`, adapters around it.
96
+
97
+ ## The prior art this repo unifies
98
+
99
+ - `docs/chat-sdk-spec.md` — the locked public-API spec (2026-07-13).
100
+ - `docs/chat-internals-and-plans.md` — the canonical pipeline map.
101
+ - `amalgm-engine/packages/chat/` — the milestone-1 client prototype.
102
+ - The orphaned 84-exam suite (`amalgm-ui/scripts/chat-core/tests/run.js`) —
103
+ the richest chat test suite ever written for this codebase, currently
104
+ running nowhere. It is revived here.
105
+
106
+ See `docs/responsibilities.md` for every duty, the knife table, the garbage
107
+ ledger, and the known wounds.
package/README.md ADDED
@@ -0,0 +1,41 @@
1
+ # @amalgm/chat
2
+
3
+ The Amalgm conversation SDK: every law of the chat pipeline — the event
4
+ grammar, harness normalization, transcript truth, the turn machine, the
5
+ frozen session contract, warm payloads, and the usage law — extracted from
6
+ the engine as a standalone package, plus a faithful reference host. Start
7
+ with [PURPOSE.md](PURPOSE.md) (the charter, seven jobs, ten axioms) and
8
+ [docs/responsibilities.md](docs/responsibilities.md) (every duty, the
9
+ four-copies ground truth, the garbage ledger, the known wounds).
10
+
11
+ ```
12
+ src/events/ the canonical event grammar (constructors + zod schema)
13
+ src/wire/ SSE frame projection (ACP-shaped AgentStreamEvent)
14
+ src/transcript/ message reducer, parts, tool shape/display
15
+ src/turns/ TurnStore, status machine, replay grammar
16
+ src/contract/ harnesses, model identities, freeze algebra, chatInput,
17
+ payload merge, input normalization
18
+ src/warm/ warm-payload laws: revision, fingerprint, cache policies
19
+ src/usage/ token algebra, turn finalization, ownership fork, catalog
20
+ src/normalizers/ claude · codex · opencode · cursor · pi → the grammar
21
+ src/ports.ts the ports a host injects (clock, hash, uuid)
22
+ host/ the reference host: adapters, tooling, orchestration,
23
+ chat-server shell (effectful, imports the laws from dist)
24
+ docs/ the chat corpus: SDK spec, runtime law, normalizer
25
+ contracts + errata, internals map, warm payloads,
26
+ reducer divergences
27
+ ```
28
+
29
+ ```bash
30
+ npm install
31
+ npm test # build + every exam
32
+ ```
33
+
34
+ Rules of the house: `src/` is pure — one runtime dependency (zod, axiom 9),
35
+ no `node:*`, no env, no ambient clock; hosts inject effects through
36
+ `src/ports.ts`. `host/` is effectful by design but never re-implements a
37
+ law — it imports them. Contracts are byte-exact against the shipped engine
38
+ (`amalgm-engine/runtime/scripts/chat-core/`, production truth until
39
+ cutover — axiom 1); every module was differentially verified against the
40
+ engine's own code. Tests are exams — each states a law, and a mutant must
41
+ be convicted by at least one.
@@ -0,0 +1,144 @@
1
+ /**
2
+ * Structured chat input — engine `runtime/lib/chatInput.js` (311 lines),
3
+ * ported byte-exact. Both sides run zod ^4.4.3, so the schemas carry over
4
+ * verbatim (`.passthrough()`, `.default()` semantics identical).
5
+ */
6
+ import { z } from 'zod';
7
+ export declare const ChatInputPartSchema: z.ZodUnion<readonly [z.ZodObject<{
8
+ type: z.ZodLiteral<"text">;
9
+ text: z.ZodDefault<z.ZodString>;
10
+ }, z.core.$loose>, z.ZodObject<{
11
+ type: z.ZodLiteral<"file">;
12
+ filename: z.ZodOptional<z.ZodString>;
13
+ mediaType: z.ZodOptional<z.ZodString>;
14
+ url: z.ZodOptional<z.ZodString>;
15
+ storagePath: z.ZodOptional<z.ZodString>;
16
+ storage_path: z.ZodOptional<z.ZodString>;
17
+ computerPath: z.ZodOptional<z.ZodString>;
18
+ sandboxPath: z.ZodOptional<z.ZodString>;
19
+ assetId: z.ZodOptional<z.ZodString>;
20
+ }, z.core.$loose>, z.ZodObject<{
21
+ type: z.ZodString;
22
+ }, z.core.$loose>]>;
23
+ export declare const WorkspaceTargetSchema: z.ZodDiscriminatedUnion<[z.ZodObject<{
24
+ kind: z.ZodLiteral<"cwd">;
25
+ cwd: z.ZodString;
26
+ }, z.core.$strip>, z.ZodObject<{
27
+ kind: z.ZodLiteral<"existing-worktree">;
28
+ path: z.ZodString;
29
+ }, z.core.$strip>, z.ZodObject<{
30
+ kind: z.ZodLiteral<"managed-worktree">;
31
+ repoPath: z.ZodString;
32
+ branch: z.ZodString;
33
+ baseBranch: z.ZodOptional<z.ZodNullable<z.ZodString>>;
34
+ path: z.ZodOptional<z.ZodNullable<z.ZodString>>;
35
+ }, z.core.$strip>], "kind">;
36
+ export declare const ChatInputSchema: z.ZodObject<{
37
+ parts: z.ZodDefault<z.ZodArray<z.ZodUnion<readonly [z.ZodObject<{
38
+ type: z.ZodLiteral<"text">;
39
+ text: z.ZodDefault<z.ZodString>;
40
+ }, z.core.$loose>, z.ZodObject<{
41
+ type: z.ZodLiteral<"file">;
42
+ filename: z.ZodOptional<z.ZodString>;
43
+ mediaType: z.ZodOptional<z.ZodString>;
44
+ url: z.ZodOptional<z.ZodString>;
45
+ storagePath: z.ZodOptional<z.ZodString>;
46
+ storage_path: z.ZodOptional<z.ZodString>;
47
+ computerPath: z.ZodOptional<z.ZodString>;
48
+ sandboxPath: z.ZodOptional<z.ZodString>;
49
+ assetId: z.ZodOptional<z.ZodString>;
50
+ }, z.core.$loose>, z.ZodObject<{
51
+ type: z.ZodString;
52
+ }, z.core.$loose>]>>>;
53
+ agent: z.ZodDefault<z.ZodObject<{
54
+ harness: z.ZodOptional<z.ZodNullable<z.ZodString>>;
55
+ model: z.ZodOptional<z.ZodNullable<z.ZodString>>;
56
+ authMethod: z.ZodOptional<z.ZodNullable<z.ZodEnum<{
57
+ amalgm: "amalgm";
58
+ byok: "byok";
59
+ provider_auth: "provider_auth";
60
+ }>>>;
61
+ customAgentId: z.ZodOptional<z.ZodNullable<z.ZodString>>;
62
+ systemPrompt: z.ZodOptional<z.ZodNullable<z.ZodString>>;
63
+ }, z.core.$strip>>;
64
+ tools: z.ZodDefault<z.ZodObject<{
65
+ mcpAppIds: z.ZodDefault<z.ZodArray<z.ZodString>>;
66
+ toolIds: z.ZodDefault<z.ZodArray<z.ZodString>>;
67
+ }, z.core.$strip>>;
68
+ execution: z.ZodDefault<z.ZodObject<{
69
+ cwd: z.ZodOptional<z.ZodNullable<z.ZodString>>;
70
+ computerId: z.ZodOptional<z.ZodNullable<z.ZodString>>;
71
+ workspace: z.ZodOptional<z.ZodNullable<z.ZodDiscriminatedUnion<[z.ZodObject<{
72
+ kind: z.ZodLiteral<"cwd">;
73
+ cwd: z.ZodString;
74
+ }, z.core.$strip>, z.ZodObject<{
75
+ kind: z.ZodLiteral<"existing-worktree">;
76
+ path: z.ZodString;
77
+ }, z.core.$strip>, z.ZodObject<{
78
+ kind: z.ZodLiteral<"managed-worktree">;
79
+ repoPath: z.ZodString;
80
+ branch: z.ZodString;
81
+ baseBranch: z.ZodOptional<z.ZodNullable<z.ZodString>>;
82
+ path: z.ZodOptional<z.ZodNullable<z.ZodString>>;
83
+ }, z.core.$strip>], "kind">>>;
84
+ }, z.core.$strip>>;
85
+ }, z.core.$strip>;
86
+ export type ChatInputPart = z.infer<typeof ChatInputPartSchema>;
87
+ export type WorkspaceTarget = z.infer<typeof WorkspaceTargetSchema>;
88
+ export type ChatInput = z.infer<typeof ChatInputSchema>;
89
+ /** The legacy flat fields `normalizeChatInput` accepts as fallbacks. */
90
+ export interface ChatInputLegacyFallback {
91
+ prompt?: unknown;
92
+ userParts?: unknown;
93
+ harness?: unknown;
94
+ modelId?: unknown;
95
+ model?: unknown;
96
+ authMethod?: unknown;
97
+ cwd?: unknown;
98
+ projectPath?: unknown;
99
+ computerId?: unknown;
100
+ mcpAppIds?: unknown;
101
+ toolIds?: unknown;
102
+ systemPrompt?: unknown;
103
+ [key: string]: unknown;
104
+ }
105
+ /** Engine `chatInput.js uniqueStrings`: trimmed, deduped string list. */
106
+ export declare function uniqueStrings(values: unknown): string[];
107
+ /** Engine `getWorkspaceCwd`: the folder a workspace target points at, if any. */
108
+ export declare function getWorkspaceCwd(workspace: unknown): string | null;
109
+ /** Engine `normalizeChatPart` — pass-through normalization for one part. */
110
+ export declare function normalizeChatPart(part: unknown): Record<string, any> | null;
111
+ /** Engine `normalizeChatParts` — normalized parts, else a text part from the prompt. */
112
+ export declare function normalizeChatParts(parts: unknown, fallbackPrompt: unknown): Record<string, any>[];
113
+ /** Engine `getChatInputText` — joined text of all text parts. */
114
+ export declare function getChatInputText(chatInput: unknown, fallbackPrompt?: unknown): string;
115
+ /** Engine `getAttachedFilePaths` — local paths of attached file parts. */
116
+ export declare function getAttachedFilePaths(parts: unknown): string[];
117
+ /** Engine `buildPromptFromParts` — flat prompt text incl. attached-file prefix. */
118
+ export declare function buildPromptFromParts(parts: unknown, fallbackPrompt: unknown): string;
119
+ /**
120
+ * Engine `normalizeChatInput(chatInput, legacy)` — the canonical structured
121
+ * input, merging the structured object with legacy flat fields.
122
+ */
123
+ export declare function normalizeChatInput(chatInput: unknown, legacy?: ChatInputLegacyFallback): ChatInput;
124
+ export interface ChatInputLegacyFields {
125
+ prompt: string;
126
+ userParts: ChatInput['parts'];
127
+ harness: string | null;
128
+ modelId: string | null;
129
+ model: string | null;
130
+ authMethod: string | null;
131
+ cwd: string | null;
132
+ projectPath: string | null;
133
+ computerId: string | null;
134
+ mcpAppIds: string[];
135
+ systemPrompt: string | null;
136
+ }
137
+ /**
138
+ * Engine `chatInputToLegacyFields` — project the structured input back onto
139
+ * the flat legacy body fields (the shape `applyPayloadRecord` spreads).
140
+ */
141
+ export declare function chatInputToLegacyFields(chatInput: unknown, fallback?: ChatInputLegacyFallback): ChatInputLegacyFields;
142
+ /** Engine `withChatInputText` — rewrite every text part through `updater`. */
143
+ export declare function withChatInputText(chatInput: unknown, updater: (text: string, part: ChatInputPart) => string, legacy?: ChatInputLegacyFallback): ChatInput;
144
+ //# sourceMappingURL=chat-input.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"chat-input.d.ts","sourceRoot":"","sources":["../../src/contract/chat-input.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,261 @@
1
+ /**
2
+ * Structured chat input — engine `runtime/lib/chatInput.js` (311 lines),
3
+ * ported byte-exact. Both sides run zod ^4.4.3, so the schemas carry over
4
+ * verbatim (`.passthrough()`, `.default()` semantics identical).
5
+ */
6
+ import { z } from 'zod';
7
+ const VALID_AUTH_METHODS = ['amalgm', 'byok', 'provider_auth'];
8
+ const ChatInputTextPartSchema = z.object({
9
+ type: z.literal('text'),
10
+ text: z.string().default(''),
11
+ }).passthrough();
12
+ const ChatInputFilePartSchema = z.object({
13
+ type: z.literal('file'),
14
+ filename: z.string().optional(),
15
+ mediaType: z.string().optional(),
16
+ url: z.string().optional(),
17
+ storagePath: z.string().optional(),
18
+ storage_path: z.string().optional(),
19
+ computerPath: z.string().optional(),
20
+ sandboxPath: z.string().optional(),
21
+ assetId: z.string().optional(),
22
+ }).passthrough();
23
+ const ChatInputUnknownPartSchema = z.object({
24
+ type: z.string(),
25
+ }).passthrough();
26
+ export const ChatInputPartSchema = z.union([
27
+ ChatInputTextPartSchema,
28
+ ChatInputFilePartSchema,
29
+ ChatInputUnknownPartSchema,
30
+ ]);
31
+ export const WorkspaceTargetSchema = z.discriminatedUnion('kind', [
32
+ z.object({
33
+ kind: z.literal('cwd'),
34
+ cwd: z.string(),
35
+ }),
36
+ z.object({
37
+ kind: z.literal('existing-worktree'),
38
+ path: z.string(),
39
+ }),
40
+ z.object({
41
+ kind: z.literal('managed-worktree'),
42
+ repoPath: z.string(),
43
+ branch: z.string(),
44
+ baseBranch: z.string().nullable().optional(),
45
+ path: z.string().nullable().optional(),
46
+ }),
47
+ ]);
48
+ export const ChatInputSchema = z.object({
49
+ parts: z.array(ChatInputPartSchema).default([]),
50
+ agent: z.object({
51
+ harness: z.string().nullable().optional(),
52
+ model: z.string().nullable().optional(),
53
+ authMethod: z.enum(VALID_AUTH_METHODS).nullable().optional(),
54
+ customAgentId: z.string().nullable().optional(),
55
+ systemPrompt: z.string().nullable().optional(),
56
+ }).default({}),
57
+ tools: z.object({
58
+ mcpAppIds: z.array(z.string()).default([]),
59
+ toolIds: z.array(z.string()).default([]),
60
+ // zod 4 `.default()` returns the default WITHOUT parsing, so a missing
61
+ // `tools` key yields bare `{}` (no mcpAppIds/toolIds) — verified against
62
+ // the engine at runtime. The cast preserves that byte-exact behavior.
63
+ }).default({}),
64
+ execution: z.object({
65
+ cwd: z.string().nullable().optional(),
66
+ computerId: z.string().nullable().optional(),
67
+ workspace: WorkspaceTargetSchema.nullable().optional(),
68
+ }).default({}),
69
+ });
70
+ function isObject(value) {
71
+ return !!value && typeof value === 'object' && !Array.isArray(value);
72
+ }
73
+ function cleanString(value) {
74
+ return typeof value === 'string' && value.trim() ? value : null;
75
+ }
76
+ function firstString(...values) {
77
+ for (const value of values) {
78
+ const cleaned = cleanString(value);
79
+ if (cleaned)
80
+ return cleaned;
81
+ }
82
+ return null;
83
+ }
84
+ /** Engine `chatInput.js uniqueStrings`: trimmed, deduped string list. */
85
+ export function uniqueStrings(values) {
86
+ if (!Array.isArray(values))
87
+ return [];
88
+ return [...new Set(values.filter((value) => typeof value === 'string' && value.trim()).map((value) => value.trim()))];
89
+ }
90
+ function normalizeWorkspace(rawWorkspace, fallbackCwd) {
91
+ if (isObject(rawWorkspace) && typeof rawWorkspace.kind === 'string') {
92
+ const parsed = WorkspaceTargetSchema.safeParse(rawWorkspace);
93
+ if (parsed.success)
94
+ return parsed.data;
95
+ }
96
+ const cwd = cleanString(fallbackCwd);
97
+ return cwd ? { kind: 'cwd', cwd } : null;
98
+ }
99
+ /** Engine `getWorkspaceCwd`: the folder a workspace target points at, if any. */
100
+ export function getWorkspaceCwd(workspace) {
101
+ if (!workspace || !isObject(workspace))
102
+ return null;
103
+ if (workspace.kind === 'cwd' && cleanString(workspace.cwd))
104
+ return workspace.cwd.trim();
105
+ if (workspace.kind === 'existing-worktree' && cleanString(workspace.path))
106
+ return workspace.path.trim();
107
+ if (workspace.kind === 'managed-worktree') {
108
+ return firstString(workspace.path, workspace.repoPath);
109
+ }
110
+ return null;
111
+ }
112
+ /** Engine `normalizeChatPart` — pass-through normalization for one part. */
113
+ export function normalizeChatPart(part) {
114
+ if (!isObject(part) || typeof part.type !== 'string')
115
+ return null;
116
+ if (part.type === 'text') {
117
+ return {
118
+ ...part,
119
+ type: 'text',
120
+ text: typeof part.text === 'string' ? part.text : '',
121
+ };
122
+ }
123
+ if (part.type === 'file') {
124
+ const storagePath = firstString(part.storagePath, part.storage_path);
125
+ const computerPath = firstString(part.computerPath, part.sandboxPath);
126
+ return {
127
+ ...part,
128
+ type: 'file',
129
+ ...(cleanString(part.filename) ? { filename: part.filename.trim() } : {}),
130
+ ...(cleanString(part.mediaType) ? { mediaType: part.mediaType.trim() } : {}),
131
+ ...(cleanString(part.url) ? { url: part.url.trim() } : {}),
132
+ ...(storagePath ? { storagePath, storage_path: storagePath } : {}),
133
+ ...(computerPath ? { computerPath, sandboxPath: computerPath } : {}),
134
+ ...(cleanString(part.assetId) ? { assetId: part.assetId.trim() } : {}),
135
+ };
136
+ }
137
+ return { ...part };
138
+ }
139
+ /** Engine `normalizeChatParts` — normalized parts, else a text part from the prompt. */
140
+ export function normalizeChatParts(parts, fallbackPrompt) {
141
+ const normalized = Array.isArray(parts)
142
+ ? parts.map(normalizeChatPart).filter((part) => Boolean(part))
143
+ : [];
144
+ if (normalized.length > 0)
145
+ return normalized;
146
+ const prompt = typeof fallbackPrompt === 'string' ? fallbackPrompt : '';
147
+ return prompt.trim() ? [{ type: 'text', text: prompt }] : [];
148
+ }
149
+ /** Engine `getChatInputText` — joined text of all text parts. */
150
+ export function getChatInputText(chatInput, fallbackPrompt) {
151
+ const normalized = normalizeChatInput(chatInput, { prompt: fallbackPrompt });
152
+ return normalized.parts
153
+ .filter((part) => part.type === 'text' && typeof part.text === 'string')
154
+ .map((part) => part.text)
155
+ .join('\n\n')
156
+ .trim();
157
+ }
158
+ /** Engine `getAttachedFilePaths` — local paths of attached file parts. */
159
+ export function getAttachedFilePaths(parts) {
160
+ if (!Array.isArray(parts))
161
+ return [];
162
+ return parts
163
+ .filter((part) => part && part.type === 'file')
164
+ .map((part) => firstString(part.computerPath, part.sandboxPath))
165
+ .filter((value) => Boolean(value));
166
+ }
167
+ /** Engine `buildPromptFromParts` — flat prompt text incl. attached-file prefix. */
168
+ export function buildPromptFromParts(parts, fallbackPrompt) {
169
+ const normalizedParts = normalizeChatParts(parts, fallbackPrompt);
170
+ const text = normalizedParts
171
+ .filter((part) => part.type === 'text' && typeof part.text === 'string')
172
+ .map((part) => part.text)
173
+ .join('\n\n')
174
+ .trim();
175
+ const attachedPaths = getAttachedFilePaths(normalizedParts);
176
+ if (attachedPaths.length === 0) {
177
+ return text || (typeof fallbackPrompt === 'string' ? fallbackPrompt : '');
178
+ }
179
+ const attachedPrefix = `[Attached files: ${attachedPaths.join(', ')}]`;
180
+ return text ? `${attachedPrefix}\n\n${text}` : attachedPrefix;
181
+ }
182
+ /**
183
+ * Engine `normalizeChatInput(chatInput, legacy)` — the canonical structured
184
+ * input, merging the structured object with legacy flat fields.
185
+ */
186
+ export function normalizeChatInput(chatInput, legacy = {}) {
187
+ const rawInput = isObject(chatInput) ? chatInput : {};
188
+ const rawAgent = isObject(rawInput.agent) ? rawInput.agent : {};
189
+ const rawTools = isObject(rawInput.tools) ? rawInput.tools : {};
190
+ const rawExecution = isObject(rawInput.execution) ? rawInput.execution : {};
191
+ const workspace = normalizeWorkspace(rawExecution.workspace, firstString(rawExecution.cwd, legacy.cwd, legacy.projectPath));
192
+ const resolvedCwd = firstString(rawExecution.cwd, getWorkspaceCwd(workspace), legacy.cwd, legacy.projectPath);
193
+ const normalized = {
194
+ parts: normalizeChatParts(rawInput.parts, Array.isArray(legacy.userParts) && legacy.userParts.length > 0
195
+ ? null
196
+ : legacy.prompt),
197
+ agent: {
198
+ harness: firstString(rawAgent.harness, rawAgent.harnessId, legacy.harness),
199
+ model: firstString(rawAgent.model, rawAgent.modelId, legacy.modelId, legacy.model),
200
+ authMethod: firstString(rawAgent.authMethod, legacy.authMethod),
201
+ customAgentId: firstString(rawAgent.customAgentId, (typeof rawAgent.harness === 'string' && rawAgent.harness.startsWith('custom-'))
202
+ ? rawAgent.harness
203
+ : null, (typeof legacy.harness === 'string' && legacy.harness.startsWith('custom-'))
204
+ ? legacy.harness
205
+ : null),
206
+ systemPrompt: firstString(rawAgent.systemPrompt, legacy.systemPrompt),
207
+ },
208
+ tools: {
209
+ mcpAppIds: uniqueStrings(rawTools.mcpAppIds || legacy.mcpAppIds),
210
+ toolIds: uniqueStrings(rawTools.toolIds
211
+ || legacy.toolIds),
212
+ },
213
+ execution: {
214
+ cwd: resolvedCwd,
215
+ computerId: firstString(rawExecution.computerId, legacy.computerId),
216
+ workspace,
217
+ },
218
+ };
219
+ return ChatInputSchema.parse(normalized);
220
+ }
221
+ /**
222
+ * Engine `chatInputToLegacyFields` — project the structured input back onto
223
+ * the flat legacy body fields (the shape `applyPayloadRecord` spreads).
224
+ */
225
+ export function chatInputToLegacyFields(chatInput, fallback = {}) {
226
+ const normalized = normalizeChatInput(chatInput, fallback);
227
+ const prompt = buildPromptFromParts(normalized.parts, fallback.prompt);
228
+ const harness = firstString(normalized.agent.customAgentId, normalized.agent.harness, fallback.harness);
229
+ const modelId = firstString(normalized.agent.model, fallback.modelId, fallback.model);
230
+ const cwd = firstString(normalized.execution.cwd, getWorkspaceCwd(normalized.execution.workspace), fallback.cwd, fallback.projectPath);
231
+ const authMethod = firstString(normalized.agent.authMethod, fallback.authMethod);
232
+ const systemPrompt = firstString(normalized.agent.systemPrompt, fallback.systemPrompt);
233
+ return {
234
+ prompt,
235
+ userParts: normalized.parts,
236
+ harness,
237
+ modelId,
238
+ model: modelId,
239
+ authMethod,
240
+ cwd,
241
+ projectPath: cwd,
242
+ computerId: firstString(normalized.execution.computerId, fallback.computerId),
243
+ mcpAppIds: normalized.tools.mcpAppIds,
244
+ systemPrompt,
245
+ };
246
+ }
247
+ /** Engine `withChatInputText` — rewrite every text part through `updater`. */
248
+ export function withChatInputText(chatInput, updater, legacy = {}) {
249
+ const normalized = normalizeChatInput(chatInput, legacy);
250
+ const parts = normalized.parts.map((part) => {
251
+ if (part.type !== 'text' || typeof part.text !== 'string')
252
+ return part;
253
+ const nextText = updater(part.text, part);
254
+ return {
255
+ ...part,
256
+ text: typeof nextText === 'string' ? nextText : part.text,
257
+ };
258
+ });
259
+ return normalizeChatInput({ ...normalized, parts });
260
+ }
261
+ //# sourceMappingURL=chat-input.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"chat-input.js","sourceRoot":"","sources":["../../src/contract/chat-input.ts"],"names":[],"mappings":"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"}