@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
@@ -0,0 +1,191 @@
1
+ /**
2
+ * `createContract` — engine `chat-core/contract.js:460-648`, ported as a pure
3
+ * orchestration. Effectful collaborators are injected:
4
+ *
5
+ * - `authEnvelope` — engine `chat-core/auth.js authEnvelope` (reads the
6
+ * BYOK credential store + provider auth files)
7
+ * - `normalizeAgentConfig`— engine `amalgm-mcp/agent-config/schema.js`
8
+ * (uses crypto.randomUUID for stable ids)
9
+ * - `cwd` ports — the filesystem checks behind `resolveCwd`
10
+ * (engine: fs.statSync / os.homedir / path,
11
+ * `runtime/scripts/lib/project-paths.js`)
12
+ * - `sha256Hex` — the runtimeKey fingerprint (engine: node:crypto)
13
+ *
14
+ * Env-derived engine defaults become documented options:
15
+ *
16
+ * - `options.defaultCwd` — engine `DEFAULT_CWD` = `AMALGM_DEFAULT_CWD` || '/workspace'
17
+ * - `options.port` — engine `runtimePort('chat-server')` (runtime-manifest)
18
+ * - `options.proxyToken` — engine config `PROXY_TOKEN`
19
+ * - `options.proxyBaseUrl`— engine `PROXY_BASE_URL || DEFAULT_PROXY_BASE_URL`
20
+ * - `options.amalgmDir` — engine config `AMALGM_DIR`
21
+ * - `options.containerId` — engine `process.env.AMALGM_CONTAINER_ID`
22
+ */
23
+ import type { FreezePorts, FrozenRuntimeFields } from './freeze.js';
24
+ /** Engine `AUTH_BY_HARNESS` (`auth.js:9-15`): supported methods, first = default. */
25
+ export declare const AUTH_BY_HARNESS: Readonly<Record<string, readonly string[]>>;
26
+ /**
27
+ * Engine `coerceAuth` (`auth.js:70-73`): clamp a requested auth method to the
28
+ * harness's supported set, defaulting to the first supported method.
29
+ */
30
+ export declare function coerceAuth(harness: string, requested: unknown): string;
31
+ /** The envelope returned by the host's `authEnvelope` (engine `auth.js:148-200`). */
32
+ export interface AuthEnvelope {
33
+ method: string;
34
+ baseUrl?: string | null;
35
+ credentialId?: string | null;
36
+ credentialName?: string | null;
37
+ providerKind?: string | null;
38
+ forwardBaseUrl?: string | null;
39
+ tokenRef?: string | null;
40
+ tokenFingerprint?: string | null;
41
+ runtimeHome?: string | null;
42
+ runtimeHomeSources?: string[];
43
+ [key: string]: unknown;
44
+ }
45
+ /** The exact argument object the engine passes to `authEnvelope`. */
46
+ export interface AuthEnvelopeArgs {
47
+ harness: string;
48
+ authMethod: string;
49
+ sessionId: string;
50
+ localBaseUrl: string;
51
+ proxyToken: string | undefined;
52
+ proxyBaseUrl: string | undefined;
53
+ amalgmDir: string | undefined;
54
+ userId: string;
55
+ credentialId: string | null;
56
+ modelId: string;
57
+ agentConfigId: string;
58
+ runtimeHomeLayout: string;
59
+ }
60
+ /**
61
+ * Filesystem/OS ports behind `resolveCwd`. Engine defaults:
62
+ * - `expandHome` — `contract.js:460-467` (os.homedir + path.join)
63
+ * - `canonicalProjectPath`— `runtime/scripts/lib/project-paths.js`
64
+ * - `isDirectory` — `fs.statSync(p).isDirectory()` (throwing is fine;
65
+ * it is treated as "not a directory")
66
+ * - `processCwd` — `process.cwd()` (throwing is fine)
67
+ * - `homedir` — `os.homedir()`
68
+ * - `isAbsolute` / `resolvePath` — `path.isAbsolute` / `path.resolve`
69
+ */
70
+ export interface CwdPorts {
71
+ expandHome(value: unknown): string;
72
+ canonicalProjectPath(value: string): string;
73
+ isDirectory(candidate: string): boolean;
74
+ processCwd(): string | null;
75
+ homedir(): string;
76
+ isAbsolute(candidate: string): boolean;
77
+ resolvePath(from: string, to: string): string;
78
+ }
79
+ export interface WorkspaceCwdUnavailableError extends Error {
80
+ code: 'workspace_cwd_unavailable';
81
+ status: 409;
82
+ }
83
+ /**
84
+ * The 409 thrown when a cloud-workspace turn cannot resolve its folder —
85
+ * engine `contract.js:493-497,503-507`. Message, `code`, and `status` are
86
+ * byte-exact.
87
+ */
88
+ export declare function workspaceCwdUnavailableError(): WorkspaceCwdUnavailableError;
89
+ export interface ResolveCwdOptions {
90
+ /** Fallback project cwd (engine `options.cwd`). */
91
+ cwd?: string | undefined;
92
+ /** Engine `DEFAULT_CWD` = `AMALGM_DEFAULT_CWD` || '/workspace'. */
93
+ defaultCwd?: string | undefined;
94
+ /** True when the payload carries `cloudWorkspaceRef` — 409 instead of fallback. */
95
+ requireCwd?: boolean | undefined;
96
+ }
97
+ /**
98
+ * Engine `resolveCwd` (`contract.js:486-510`), decision logic verbatim.
99
+ * With `requireCwd`, an empty or non-existent cwd throws
100
+ * `workspace_cwd_unavailable` (409) instead of falling back.
101
+ */
102
+ export declare function resolveCwd(rawCwd: unknown, options: ResolveCwdOptions, ports: CwdPorts): string;
103
+ export interface ContractOrigin {
104
+ type: string;
105
+ id: string;
106
+ name: string | null;
107
+ projectPath: string | null;
108
+ }
109
+ /** Engine `normalizeOrigin` (`contract.js:516-533`) — pure, ported fully. */
110
+ export declare function normalizeOrigin(payload?: Record<string, any>): ContractOrigin | null;
111
+ export interface ContractConstruct {
112
+ type: string;
113
+ id: string | null;
114
+ name: string | null;
115
+ projectPath: string | null;
116
+ path: string | null;
117
+ }
118
+ /** Engine `normalizeConstructs` (`contract.js:552-567`) — pure, ported fully. */
119
+ export declare function normalizeConstructs(payload?: Record<string, any>, cwd?: string | null): Array<ContractConstruct | ContractOrigin>;
120
+ /** Engine `positiveOrNull` (`contract.js:400-403`). */
121
+ export declare function positiveOrNull(value: unknown): number | null;
122
+ export interface CreateContractPorts extends FreezePorts {
123
+ /** Engine `chat-core/auth.js authEnvelope` — host auth, BYOK store, provider files. */
124
+ authEnvelope(args: AuthEnvelopeArgs): AuthEnvelope;
125
+ /** Engine `amalgm-mcp/agent-config/schema.js normalizeAgentConfig`. */
126
+ normalizeAgentConfig(input: unknown): unknown;
127
+ /** Filesystem/OS ports for `resolveCwd`. */
128
+ cwd: CwdPorts;
129
+ /** Optional override; defaults to the pure `coerceAuth` above (engine `auth.js`). */
130
+ coerceAuth?(harness: string, requested: unknown): string;
131
+ }
132
+ export interface CreateContractOptions {
133
+ /** Fallback project cwd fed to `resolveCwd` (engine `options.cwd`). */
134
+ cwd?: string | undefined;
135
+ /** Engine `DEFAULT_CWD` = env `AMALGM_DEFAULT_CWD` || '/workspace'. */
136
+ defaultCwd?: string | undefined;
137
+ /** Full local base URL; wins over `port` (engine `options.localBaseUrl`). */
138
+ localBaseUrl?: string | undefined;
139
+ /** Chat-server port. Engine default: `runtimePort('chat-server')` (runtime-manifest). */
140
+ port?: number | undefined;
141
+ /** Engine config `PROXY_TOKEN` (proxy-token-store). */
142
+ proxyToken?: string | undefined;
143
+ /** Engine `PROXY_BASE_URL || DEFAULT_PROXY_BASE_URL` (chat-server/config). */
144
+ proxyBaseUrl?: string | undefined;
145
+ /** Engine config `AMALGM_DIR`. */
146
+ amalgmDir?: string | undefined;
147
+ /** Fallback user id (engine `options.userId`). */
148
+ userId?: string | undefined;
149
+ /** Engine `process.env.AMALGM_CONTAINER_ID` — computerId fallback. */
150
+ containerId?: string | undefined;
151
+ }
152
+ export interface ChatContract {
153
+ sessionId: string;
154
+ userId: string;
155
+ computerId: string;
156
+ assistantMessageId: string;
157
+ userMessageId: string | null;
158
+ agentId: string;
159
+ agentConfigId: string;
160
+ agentConfig: unknown;
161
+ runtimeHomeLayout: string;
162
+ harness: string;
163
+ authMethod: string;
164
+ modelId: string;
165
+ usageModelId: string;
166
+ providerSessionId: string | null;
167
+ cliModel: string;
168
+ reasoningEffort: string | null;
169
+ fastMode: boolean;
170
+ contextWindow: number | null;
171
+ maxTokens: number | null;
172
+ cwd: string;
173
+ origin: ContractOrigin | null;
174
+ constructs: Array<ContractConstruct | ContractOrigin>;
175
+ localBaseUrl: string;
176
+ mcpServers: unknown[];
177
+ systemPrompt: string;
178
+ compiledAgentInstructions: string;
179
+ usageOwner: 'platform_proxy' | 'local_user';
180
+ auth: AuthEnvelope;
181
+ runtimeFields: FrozenRuntimeFields;
182
+ runtimeKey: string | null;
183
+ }
184
+ /**
185
+ * Engine `createContract` (`contract.js:569-648`). Field-for-field parity,
186
+ * including every error message and precedence chain. The uncommitted
187
+ * cloud-workspace behavior is preserved: `payload.cloudWorkspaceRef` makes
188
+ * cwd resolution mandatory (`workspace_cwd_unavailable`, 409).
189
+ */
190
+ export declare function createContract(payload: Record<string, any>, options: CreateContractOptions, ports: CreateContractPorts): ChatContract;
191
+ //# sourceMappingURL=create.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"create.d.ts","sourceRoot":"","sources":["../../src/contract/create.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,249 @@
1
+ /**
2
+ * `createContract` — engine `chat-core/contract.js:460-648`, ported as a pure
3
+ * orchestration. Effectful collaborators are injected:
4
+ *
5
+ * - `authEnvelope` — engine `chat-core/auth.js authEnvelope` (reads the
6
+ * BYOK credential store + provider auth files)
7
+ * - `normalizeAgentConfig`— engine `amalgm-mcp/agent-config/schema.js`
8
+ * (uses crypto.randomUUID for stable ids)
9
+ * - `cwd` ports — the filesystem checks behind `resolveCwd`
10
+ * (engine: fs.statSync / os.homedir / path,
11
+ * `runtime/scripts/lib/project-paths.js`)
12
+ * - `sha256Hex` — the runtimeKey fingerprint (engine: node:crypto)
13
+ *
14
+ * Env-derived engine defaults become documented options:
15
+ *
16
+ * - `options.defaultCwd` — engine `DEFAULT_CWD` = `AMALGM_DEFAULT_CWD` || '/workspace'
17
+ * - `options.port` — engine `runtimePort('chat-server')` (runtime-manifest)
18
+ * - `options.proxyToken` — engine config `PROXY_TOKEN`
19
+ * - `options.proxyBaseUrl`— engine `PROXY_BASE_URL || DEFAULT_PROXY_BASE_URL`
20
+ * - `options.amalgmDir` — engine config `AMALGM_DIR`
21
+ * - `options.containerId` — engine `process.env.AMALGM_CONTAINER_ID`
22
+ */
23
+ import { agentToHarness, assertSupportedHarness } from './harnesses.js';
24
+ import { canonicalModel, cliModelFor } from './models.js';
25
+ import { frozenRuntimeFields, runtimeKey } from './freeze.js';
26
+ // ── Host auth surface (engine chat-core/auth.js) ────────────────────────────
27
+ /** Engine `AUTH_BY_HARNESS` (`auth.js:9-15`): supported methods, first = default. */
28
+ export const AUTH_BY_HARNESS = {
29
+ claude_code: ['amalgm', 'byok', 'provider_auth'],
30
+ codex: ['amalgm', 'byok', 'provider_auth'],
31
+ opencode: ['amalgm', 'byok', 'provider_auth'],
32
+ cursor: ['provider_auth'],
33
+ pi: ['amalgm', 'byok', 'provider_auth'],
34
+ };
35
+ /**
36
+ * Engine `coerceAuth` (`auth.js:70-73`): clamp a requested auth method to the
37
+ * harness's supported set, defaulting to the first supported method.
38
+ */
39
+ export function coerceAuth(harness, requested) {
40
+ const supported = AUTH_BY_HARNESS[harness] || ['amalgm'];
41
+ return requested && supported.includes(requested) ? requested : supported[0];
42
+ }
43
+ /**
44
+ * The 409 thrown when a cloud-workspace turn cannot resolve its folder —
45
+ * engine `contract.js:493-497,503-507`. Message, `code`, and `status` are
46
+ * byte-exact.
47
+ */
48
+ export function workspaceCwdUnavailableError() {
49
+ return Object.assign(new Error('Cloud workspace folder is unavailable.'), { code: 'workspace_cwd_unavailable', status: 409 });
50
+ }
51
+ function existingDirectory(candidate, ports) {
52
+ if (!candidate)
53
+ return null;
54
+ try {
55
+ return ports.isDirectory(candidate) ? candidate : null;
56
+ }
57
+ catch {
58
+ return null;
59
+ }
60
+ }
61
+ function safeProcessCwd(ports) {
62
+ try {
63
+ return ports.processCwd();
64
+ }
65
+ catch {
66
+ return null;
67
+ }
68
+ }
69
+ /**
70
+ * Engine `resolveCwd` (`contract.js:486-510`), decision logic verbatim.
71
+ * With `requireCwd`, an empty or non-existent cwd throws
72
+ * `workspace_cwd_unavailable` (409) instead of falling back.
73
+ */
74
+ export function resolveCwd(rawCwd, options, ports) {
75
+ const fallback = existingDirectory(ports.canonicalProjectPath(ports.expandHome(options.cwd)), ports)
76
+ || existingDirectory(ports.canonicalProjectPath(ports.expandHome(options.defaultCwd ?? '/workspace')), ports)
77
+ || existingDirectory(safeProcessCwd(ports), ports)
78
+ || ports.homedir();
79
+ const expanded = ports.expandHome(rawCwd);
80
+ if (!expanded) {
81
+ if (options.requireCwd) {
82
+ throw workspaceCwdUnavailableError();
83
+ }
84
+ return fallback;
85
+ }
86
+ const absolute = ports.isAbsolute(expanded) ? expanded : ports.resolvePath(fallback, expanded);
87
+ const resolved = existingDirectory(ports.canonicalProjectPath(absolute), ports);
88
+ if (!resolved && options.requireCwd) {
89
+ throw workspaceCwdUnavailableError();
90
+ }
91
+ return resolved || fallback;
92
+ }
93
+ // ── Pure payload normalizers (engine contract.js:512-567) ───────────────────
94
+ function nullableString(value) {
95
+ return typeof value === 'string' && value.trim() ? value.trim() : null;
96
+ }
97
+ /** Engine `normalizeOrigin` (`contract.js:516-533`) — pure, ported fully. */
98
+ export function normalizeOrigin(payload = {}) {
99
+ const raw = payload.origin && typeof payload.origin === 'object' ? payload.origin : {};
100
+ const type = nullableString(raw.type || payload.originType || payload.origin);
101
+ const id = nullableString(raw.id
102
+ || raw.originId
103
+ || payload.originId
104
+ || payload.taskId
105
+ || payload.triggerId);
106
+ if (!type || !id)
107
+ return null;
108
+ return {
109
+ type,
110
+ id,
111
+ name: nullableString(raw.name || raw.originName || payload.originName),
112
+ projectPath: nullableString(raw.projectPath || payload.projectPath || payload.cwd),
113
+ };
114
+ }
115
+ function normalizeConstruct(input, fallback = {}) {
116
+ if (!input || typeof input !== 'object')
117
+ return null;
118
+ const type = nullableString(input.type || input.scopeType);
119
+ if (!type)
120
+ return null;
121
+ const id = nullableString(input.id || input.scopeId || input.originId);
122
+ const projectPath = nullableString(input.projectPath || input.path || fallback.projectPath);
123
+ const item = {
124
+ type,
125
+ id,
126
+ name: nullableString(input.name || input.originName),
127
+ projectPath,
128
+ path: nullableString(input.path),
129
+ };
130
+ if (!item.id && !item.projectPath && !item.path)
131
+ return null;
132
+ return item;
133
+ }
134
+ /** Engine `normalizeConstructs` (`contract.js:552-567`) — pure, ported fully. */
135
+ export function normalizeConstructs(payload = {}, cwd = null) {
136
+ const constructs = [];
137
+ for (const item of Array.isArray(payload.constructs) ? payload.constructs : []) {
138
+ const normalized = normalizeConstruct(item, { projectPath: cwd });
139
+ if (normalized)
140
+ constructs.push(normalized);
141
+ }
142
+ const origin = normalizeOrigin(payload);
143
+ if (origin)
144
+ constructs.push(origin);
145
+ const seen = new Set();
146
+ return constructs.filter((item) => {
147
+ const key = `${item.type}:${item.id || item.projectPath || item.path || ''}`;
148
+ if (seen.has(key))
149
+ return false;
150
+ seen.add(key);
151
+ return true;
152
+ });
153
+ }
154
+ /** Engine `positiveOrNull` (`contract.js:400-403`). */
155
+ export function positiveOrNull(value) {
156
+ const parsed = Number(value);
157
+ return Number.isFinite(parsed) && parsed > 0 ? parsed : null;
158
+ }
159
+ /**
160
+ * Engine `createContract` (`contract.js:569-648`). Field-for-field parity,
161
+ * including every error message and precedence chain. The uncommitted
162
+ * cloud-workspace behavior is preserved: `payload.cloudWorkspaceRef` makes
163
+ * cwd resolution mandatory (`workspace_cwd_unavailable`, 409).
164
+ */
165
+ export function createContract(payload, options, ports) {
166
+ const sessionId = payload.codeSessionId || payload.sessionId;
167
+ if (!sessionId)
168
+ throw new Error('codeSessionId is required');
169
+ const assistantMessageId = payload.assistantMessageId;
170
+ if (!assistantMessageId)
171
+ throw new Error('assistantMessageId is required');
172
+ const harness = agentToHarness(payload.harness || payload.agentId || payload.agent);
173
+ assertSupportedHarness(harness);
174
+ const coerce = ports.coerceAuth || coerceAuth;
175
+ const authMethod = coerce(harness, payload.authMethod || 'amalgm');
176
+ const modelId = canonicalModel(payload.modelId || payload.cliModel, harness);
177
+ const reasoningEffort = payload.reasoningEffort || null;
178
+ const fastMode = payload.fastMode === true;
179
+ const cliModel = cliModelFor({ harness, modelId, cliModel: payload.cliModel, reasoningEffort });
180
+ const cwd = resolveCwd(payload.cwd, {
181
+ cwd: options.cwd,
182
+ defaultCwd: options.defaultCwd,
183
+ requireCwd: Boolean(payload.cloudWorkspaceRef),
184
+ }, ports.cwd);
185
+ if (!options.localBaseUrl && options.port == null) {
186
+ throw new Error("createContract requires options.localBaseUrl or options.port (engine default: runtimePort('chat-server'))");
187
+ }
188
+ const localBaseUrl = options.localBaseUrl || `http://127.0.0.1:${options.port}`;
189
+ const origin = normalizeOrigin({ ...payload, cwd });
190
+ const userId = payload.userId || options.userId || 'unknown-user';
191
+ const payloadChatAgent = payload.chatInput && typeof payload.chatInput === 'object' && !Array.isArray(payload.chatInput)
192
+ ? payload.chatInput.agent
193
+ : null;
194
+ const agentConfigId = nullableString(payload.agentConfigId
195
+ || payload.amalgmAgentId
196
+ || payload.agentConfig?.agentId
197
+ || payloadChatAgent?.customAgentId) || harness;
198
+ const agentConfig = ports.normalizeAgentConfig(payload.agentConfig || { agentId: agentConfigId });
199
+ const runtimeHomeLayout = 'per-agent';
200
+ const auth = ports.authEnvelope({
201
+ harness,
202
+ authMethod,
203
+ sessionId,
204
+ localBaseUrl,
205
+ proxyToken: options.proxyToken,
206
+ proxyBaseUrl: options.proxyBaseUrl,
207
+ amalgmDir: options.amalgmDir,
208
+ userId,
209
+ credentialId: payload.credentialId || payload.byokCredentialId || null,
210
+ modelId,
211
+ agentConfigId,
212
+ runtimeHomeLayout,
213
+ });
214
+ const contract = {
215
+ sessionId,
216
+ userId,
217
+ computerId: payload.computerId || options.containerId || 'local-computer',
218
+ assistantMessageId,
219
+ userMessageId: payload.userMessageId || null,
220
+ agentId: payload.agentId || (harness === 'claude_code' ? 'claude' : harness),
221
+ agentConfigId,
222
+ agentConfig,
223
+ runtimeHomeLayout,
224
+ harness,
225
+ authMethod: auth.method,
226
+ modelId,
227
+ usageModelId: modelId,
228
+ providerSessionId: nullableString(payload.providerSessionId || payload.provider_session_id),
229
+ cliModel,
230
+ reasoningEffort,
231
+ fastMode,
232
+ contextWindow: positiveOrNull(payload.contextWindow),
233
+ maxTokens: positiveOrNull(payload.maxTokens),
234
+ cwd,
235
+ origin,
236
+ constructs: normalizeConstructs({ ...payload, origin }, cwd),
237
+ localBaseUrl,
238
+ mcpServers: Array.isArray(payload.mcpServers) ? payload.mcpServers : [],
239
+ systemPrompt: payload.systemPrompt || '',
240
+ compiledAgentInstructions: payload.compiledAgentInstructions || '',
241
+ usageOwner: (auth.method === 'amalgm' ? 'platform_proxy' : 'local_user'),
242
+ auth,
243
+ };
244
+ const withIdentity = contract;
245
+ withIdentity.runtimeFields = frozenRuntimeFields(contract, ports);
246
+ withIdentity.runtimeKey = runtimeKey(contract, ports);
247
+ return withIdentity;
248
+ }
249
+ //# sourceMappingURL=create.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"create.js","sourceRoot":"","sources":["../../src/contract/create.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,85 @@
1
+ /**
2
+ * The freeze algebra — engine `chat-core/contract.js:347-458` plus
3
+ * `chat-core/auth.js:66-68` (`fingerprint`), ported byte-exact.
4
+ *
5
+ * A session's runtime identity is the sha256 fingerprint of
6
+ * `frozenRuntimeFields`; the field ORDER inside that object is load-bearing
7
+ * (it is JSON.stringify'd) and must never change. Hashing is injected via
8
+ * `Sha256HexPort` (engine default: `node:crypto` sha256 hex digest).
9
+ */
10
+ import type { Sha256HexPort } from '../ports.js';
11
+ export interface FreezePorts {
12
+ /** Lowercase hex SHA-256 of a UTF-8 string (engine: node:crypto). */
13
+ sha256Hex: Sha256HexPort;
14
+ }
15
+ /**
16
+ * Engine `auth.js fingerprint()`: first 16 hex chars of sha256, or null for
17
+ * falsy input. Non-strings are coerced with `String()` exactly as the engine.
18
+ */
19
+ export declare function fingerprint(value: unknown, sha256Hex: Sha256HexPort): string | null;
20
+ /**
21
+ * Loose contract shape: the freeze algebra reads these fields but must accept
22
+ * any object (parity with the untyped engine).
23
+ */
24
+ export interface ContractLike {
25
+ [key: string]: unknown;
26
+ runtimeFields?: Record<string, unknown> | undefined;
27
+ runtimeKey?: string | null | undefined;
28
+ }
29
+ export interface FrozenRuntimeFields {
30
+ sessionId: unknown;
31
+ userId: unknown;
32
+ computerId: unknown;
33
+ harness: unknown;
34
+ authMethod: unknown;
35
+ auth: unknown;
36
+ modelId: unknown;
37
+ usageModelId: unknown;
38
+ cliModel: unknown;
39
+ reasoningEffort: unknown;
40
+ fastMode: boolean;
41
+ contextWindow: unknown;
42
+ maxTokens: unknown;
43
+ cwd: unknown;
44
+ runtimeHomeLayout: unknown;
45
+ systemPrompt: string | null;
46
+ compiledAgentInstructions: string | null;
47
+ agentConfig: string | null;
48
+ origin: string | null;
49
+ mcpServers: string | null;
50
+ }
51
+ /**
52
+ * Engine `frozenRuntimeFields` (`contract.js:365-394`). Field order in the
53
+ * returned object is byte-exact — `runtimeKey` stringifies it.
54
+ */
55
+ export declare function frozenRuntimeFields(input: any, ports: FreezePorts): FrozenRuntimeFields;
56
+ /** Engine `runtimeKey` (`contract.js:396-398`): fingerprint of the frozen fields. */
57
+ export declare function runtimeKey(input: any, ports: FreezePorts): string | null;
58
+ /**
59
+ * Engine `changedRuntimeFields` (`contract.js:405-410`): the frozen-field keys
60
+ * whose values differ between two contracts. Prefers precomputed
61
+ * `runtimeFields`; falls back to recomputing (hence the ports).
62
+ */
63
+ export declare function changedRuntimeFields(current: any, next: any, ports: FreezePorts): string[];
64
+ export interface FrozenContractChangedError extends Error {
65
+ code: 'FROZEN_SESSION_CONTRACT_CHANGED';
66
+ changedFields: string[];
67
+ }
68
+ /**
69
+ * Engine `frozenContractChangedError` (`contract.js:412-421`). Message and
70
+ * `code` are byte-exact.
71
+ */
72
+ export declare function frozenContractChangedError(current: any, next: any, ports: FreezePorts): FrozenContractChangedError;
73
+ /**
74
+ * Engine `continueFrozenRuntimeContract` (`contract.js:423-458`): when the
75
+ * next turn's contract drifts, keep the frozen identity from the current
76
+ * contract, carry over per-turn fields from `next`, and record the drifted
77
+ * keys in `continuedFromChangedContract` (warn semantics — the turn proceeds).
78
+ */
79
+ export declare function continueFrozenRuntimeContract<T extends ContractLike>(current: any, next: T, ports: FreezePorts): T;
80
+ /**
81
+ * Engine `assertSameContract` (`contract.js:650-655`): hard rejection when
82
+ * the runtime key moved. Throws `frozenContractChangedError`.
83
+ */
84
+ export declare function assertSameContract(current: any, next: any, ports: FreezePorts): void;
85
+ //# sourceMappingURL=freeze.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"freeze.d.ts","sourceRoot":"","sources":["../../src/contract/freeze.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAEjD,MAAM,WAAW,WAAW;IAC1B,qEAAqE;IACrE,SAAS,EAAE,aAAa,CAAC;CAC1B;AAED;;;GAGG;AACH,wBAAgB,WAAW,CAAC,KAAK,EAAE,OAAO,EAAE,SAAS,EAAE,aAAa,GAAG,MAAM,GAAG,IAAI,CAEnF;AAkCD;;;GAGG;AACH,MAAM,WAAW,YAAY;IAC3B,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC;IACvB,aAAa,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,SAAS,CAAC;IACpD,UAAU,CAAC,EAAE,MAAM,GAAG,IAAI,GAAG,SAAS,CAAC;CACxC;AAED,MAAM,WAAW,mBAAmB;IAClC,SAAS,EAAE,OAAO,CAAC;IACnB,MAAM,EAAE,OAAO,CAAC;IAChB,UAAU,EAAE,OAAO,CAAC;IACpB,OAAO,EAAE,OAAO,CAAC;IACjB,UAAU,EAAE,OAAO,CAAC;IACpB,IAAI,EAAE,OAAO,CAAC;IACd,OAAO,EAAE,OAAO,CAAC;IACjB,YAAY,EAAE,OAAO,CAAC;IACtB,QAAQ,EAAE,OAAO,CAAC;IAClB,eAAe,EAAE,OAAO,CAAC;IACzB,QAAQ,EAAE,OAAO,CAAC;IAClB,aAAa,EAAE,OAAO,CAAC;IACvB,SAAS,EAAE,OAAO,CAAC;IACnB,GAAG,EAAE,OAAO,CAAC;IACb,iBAAiB,EAAE,OAAO,CAAC;IAC3B,YAAY,EAAE,MAAM,GAAG,IAAI,CAAC;IAC5B,yBAAyB,EAAE,MAAM,GAAG,IAAI,CAAC;IACzC,WAAW,EAAE,MAAM,GAAG,IAAI,CAAC;IAC3B,MAAM,EAAE,MAAM,GAAG,IAAI,CAAC;IACtB,UAAU,EAAE,MAAM,GAAG,IAAI,CAAC;CAC3B;AAED;;;GAGG;AACH,wBAAgB,mBAAmB,CAAC,KAAK,EAAE,GAAG,EAAE,KAAK,EAAE,WAAW,GAAG,mBAAmB,CA+BvF;AAED,qFAAqF;AACrF,wBAAgB,UAAU,CAAC,KAAK,EAAE,GAAG,EAAE,KAAK,EAAE,WAAW,GAAG,MAAM,GAAG,IAAI,CAExE;AAED;;;;GAIG;AACH,wBAAgB,oBAAoB,CAAC,OAAO,EAAE,GAAG,EAAE,IAAI,EAAE,GAAG,EAAE,KAAK,EAAE,WAAW,GAAG,MAAM,EAAE,CAO1F;AAED,MAAM,WAAW,0BAA2B,SAAQ,KAAK;IACvD,IAAI,EAAE,iCAAiC,CAAC;IACxC,aAAa,EAAE,MAAM,EAAE,CAAC;CACzB;AAED;;;GAGG;AACH,wBAAgB,0BAA0B,CAAC,OAAO,EAAE,GAAG,EAAE,IAAI,EAAE,GAAG,EAAE,KAAK,EAAE,WAAW,GAAG,0BAA0B,CASlH;AAED;;;;;GAKG;AACH,wBAAgB,6BAA6B,CAAC,CAAC,SAAS,YAAY,EAClE,OAAO,EAAE,GAAG,EACZ,IAAI,EAAE,CAAC,EACP,KAAK,EAAE,WAAW,GACjB,CAAC,CAmCH;AAED;;;GAGG;AACH,wBAAgB,kBAAkB,CAAC,OAAO,EAAE,GAAG,EAAE,IAAI,EAAE,GAAG,EAAE,KAAK,EAAE,WAAW,GAAG,IAAI,CAKpF"}