@hybridaione/hybridclaw 0.2.2 → 0.2.6

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 (277) hide show
  1. package/.github/workflows/ci.yml +70 -0
  2. package/.husky/pre-commit +1 -0
  3. package/CHANGELOG.md +85 -0
  4. package/CONTRIBUTING.md +33 -0
  5. package/README.md +41 -16
  6. package/SECURITY.md +17 -0
  7. package/biome.json +35 -0
  8. package/config.example.json +71 -8
  9. package/container/package-lock.json +2 -2
  10. package/container/package.json +1 -1
  11. package/container/src/approval-policy.ts +1303 -0
  12. package/container/src/browser-tools.ts +431 -136
  13. package/container/src/extensions.ts +36 -12
  14. package/container/src/hybridai-client.ts +34 -13
  15. package/container/src/index.ts +451 -109
  16. package/container/src/ipc.ts +5 -3
  17. package/container/src/token-usage.ts +20 -10
  18. package/container/src/tools.ts +599 -225
  19. package/container/src/types.ts +32 -2
  20. package/container/src/web-fetch.ts +89 -32
  21. package/dist/agent.d.ts.map +1 -1
  22. package/dist/agent.js +10 -2
  23. package/dist/agent.js.map +1 -1
  24. package/dist/audit-cli.d.ts.map +1 -1
  25. package/dist/audit-cli.js +4 -2
  26. package/dist/audit-cli.js.map +1 -1
  27. package/dist/audit-events.d.ts.map +1 -1
  28. package/dist/audit-events.js +53 -3
  29. package/dist/audit-events.js.map +1 -1
  30. package/dist/audit-trail.d.ts.map +1 -1
  31. package/dist/audit-trail.js +17 -8
  32. package/dist/audit-trail.js.map +1 -1
  33. package/dist/channels/discord/attachments.d.ts.map +1 -1
  34. package/dist/channels/discord/attachments.js +14 -7
  35. package/dist/channels/discord/attachments.js.map +1 -1
  36. package/dist/channels/discord/debounce.d.ts +9 -0
  37. package/dist/channels/discord/debounce.d.ts.map +1 -0
  38. package/dist/channels/discord/debounce.js +20 -0
  39. package/dist/channels/discord/debounce.js.map +1 -0
  40. package/dist/channels/discord/delivery.d.ts +4 -1
  41. package/dist/channels/discord/delivery.d.ts.map +1 -1
  42. package/dist/channels/discord/delivery.js +19 -3
  43. package/dist/channels/discord/delivery.js.map +1 -1
  44. package/dist/channels/discord/human-delay.d.ts +16 -0
  45. package/dist/channels/discord/human-delay.d.ts.map +1 -0
  46. package/dist/channels/discord/human-delay.js +29 -0
  47. package/dist/channels/discord/human-delay.js.map +1 -0
  48. package/dist/channels/discord/inbound.d.ts +4 -0
  49. package/dist/channels/discord/inbound.d.ts.map +1 -1
  50. package/dist/channels/discord/inbound.js +45 -4
  51. package/dist/channels/discord/inbound.js.map +1 -1
  52. package/dist/channels/discord/mentions.d.ts.map +1 -1
  53. package/dist/channels/discord/mentions.js +16 -4
  54. package/dist/channels/discord/mentions.js.map +1 -1
  55. package/dist/channels/discord/presence.d.ts +33 -0
  56. package/dist/channels/discord/presence.d.ts.map +1 -0
  57. package/dist/channels/discord/presence.js +111 -0
  58. package/dist/channels/discord/presence.js.map +1 -0
  59. package/dist/channels/discord/rate-limiter.d.ts +14 -0
  60. package/dist/channels/discord/rate-limiter.d.ts.map +1 -0
  61. package/dist/channels/discord/rate-limiter.js +49 -0
  62. package/dist/channels/discord/rate-limiter.js.map +1 -0
  63. package/dist/channels/discord/reactions.d.ts +38 -0
  64. package/dist/channels/discord/reactions.d.ts.map +1 -0
  65. package/dist/channels/discord/reactions.js +151 -0
  66. package/dist/channels/discord/reactions.js.map +1 -0
  67. package/dist/channels/discord/runtime.d.ts +6 -3
  68. package/dist/channels/discord/runtime.d.ts.map +1 -1
  69. package/dist/channels/discord/runtime.js +621 -125
  70. package/dist/channels/discord/runtime.js.map +1 -1
  71. package/dist/channels/discord/stream.d.ts +4 -1
  72. package/dist/channels/discord/stream.d.ts.map +1 -1
  73. package/dist/channels/discord/stream.js +16 -8
  74. package/dist/channels/discord/stream.js.map +1 -1
  75. package/dist/channels/discord/tool-actions.d.ts.map +1 -1
  76. package/dist/channels/discord/tool-actions.js +24 -12
  77. package/dist/channels/discord/tool-actions.js.map +1 -1
  78. package/dist/channels/discord/typing.d.ts +15 -0
  79. package/dist/channels/discord/typing.d.ts.map +1 -0
  80. package/dist/channels/discord/typing.js +106 -0
  81. package/dist/channels/discord/typing.js.map +1 -0
  82. package/dist/chunk.d.ts.map +1 -1
  83. package/dist/chunk.js +4 -2
  84. package/dist/chunk.js.map +1 -1
  85. package/dist/cli.js +47 -22
  86. package/dist/cli.js.map +1 -1
  87. package/dist/config.d.ts +19 -0
  88. package/dist/config.d.ts.map +1 -1
  89. package/dist/config.js +103 -18
  90. package/dist/config.js.map +1 -1
  91. package/dist/container-runner.d.ts.map +1 -1
  92. package/dist/container-runner.js +58 -26
  93. package/dist/container-runner.js.map +1 -1
  94. package/dist/container-setup.d.ts.map +1 -1
  95. package/dist/container-setup.js +10 -9
  96. package/dist/container-setup.js.map +1 -1
  97. package/dist/conversation.d.ts +2 -2
  98. package/dist/conversation.d.ts.map +1 -1
  99. package/dist/conversation.js +1 -1
  100. package/dist/conversation.js.map +1 -1
  101. package/dist/db.d.ts +118 -2
  102. package/dist/db.d.ts.map +1 -1
  103. package/dist/db.js +1568 -50
  104. package/dist/db.js.map +1 -1
  105. package/dist/delegation-manager.d.ts.map +1 -1
  106. package/dist/delegation-manager.js +3 -2
  107. package/dist/delegation-manager.js.map +1 -1
  108. package/dist/gateway-client.d.ts +2 -2
  109. package/dist/gateway-client.d.ts.map +1 -1
  110. package/dist/gateway-client.js +10 -4
  111. package/dist/gateway-client.js.map +1 -1
  112. package/dist/gateway-service.d.ts +3 -3
  113. package/dist/gateway-service.d.ts.map +1 -1
  114. package/dist/gateway-service.js +563 -73
  115. package/dist/gateway-service.js.map +1 -1
  116. package/dist/gateway-types.d.ts +24 -0
  117. package/dist/gateway-types.d.ts.map +1 -1
  118. package/dist/gateway-types.js.map +1 -1
  119. package/dist/gateway.js +179 -24
  120. package/dist/gateway.js.map +1 -1
  121. package/dist/health.d.ts.map +1 -1
  122. package/dist/health.js +20 -10
  123. package/dist/health.js.map +1 -1
  124. package/dist/heartbeat.d.ts +4 -0
  125. package/dist/heartbeat.d.ts.map +1 -1
  126. package/dist/heartbeat.js +48 -20
  127. package/dist/heartbeat.js.map +1 -1
  128. package/dist/hybridai-bots.d.ts.map +1 -1
  129. package/dist/hybridai-bots.js +4 -2
  130. package/dist/hybridai-bots.js.map +1 -1
  131. package/dist/instruction-approval-audit.d.ts.map +1 -1
  132. package/dist/instruction-approval-audit.js.map +1 -1
  133. package/dist/instruction-integrity.d.ts.map +1 -1
  134. package/dist/instruction-integrity.js +8 -2
  135. package/dist/instruction-integrity.js.map +1 -1
  136. package/dist/ipc.d.ts.map +1 -1
  137. package/dist/ipc.js +6 -1
  138. package/dist/ipc.js.map +1 -1
  139. package/dist/logger.js.map +1 -1
  140. package/dist/memory-consolidation.d.ts +17 -0
  141. package/dist/memory-consolidation.d.ts.map +1 -0
  142. package/dist/memory-consolidation.js +25 -0
  143. package/dist/memory-consolidation.js.map +1 -0
  144. package/dist/memory-service.d.ts +200 -0
  145. package/dist/memory-service.d.ts.map +1 -0
  146. package/dist/memory-service.js +294 -0
  147. package/dist/memory-service.js.map +1 -0
  148. package/dist/mount-security.d.ts.map +1 -1
  149. package/dist/mount-security.js +31 -7
  150. package/dist/mount-security.js.map +1 -1
  151. package/dist/observability-ingest.d.ts.map +1 -1
  152. package/dist/observability-ingest.js +32 -11
  153. package/dist/observability-ingest.js.map +1 -1
  154. package/dist/onboarding.d.ts.map +1 -1
  155. package/dist/onboarding.js +32 -9
  156. package/dist/onboarding.js.map +1 -1
  157. package/dist/proactive-policy.d.ts.map +1 -1
  158. package/dist/proactive-policy.js +2 -1
  159. package/dist/proactive-policy.js.map +1 -1
  160. package/dist/prompt-hooks.d.ts.map +1 -1
  161. package/dist/prompt-hooks.js +9 -7
  162. package/dist/prompt-hooks.js.map +1 -1
  163. package/dist/runtime-config.d.ts +98 -1
  164. package/dist/runtime-config.d.ts.map +1 -1
  165. package/dist/runtime-config.js +477 -23
  166. package/dist/runtime-config.js.map +1 -1
  167. package/dist/scheduled-task-runner.d.ts +1 -0
  168. package/dist/scheduled-task-runner.d.ts.map +1 -1
  169. package/dist/scheduled-task-runner.js +29 -10
  170. package/dist/scheduled-task-runner.js.map +1 -1
  171. package/dist/scheduler.d.ts +43 -4
  172. package/dist/scheduler.d.ts.map +1 -1
  173. package/dist/scheduler.js +530 -56
  174. package/dist/scheduler.js.map +1 -1
  175. package/dist/session-export.d.ts +26 -0
  176. package/dist/session-export.d.ts.map +1 -0
  177. package/dist/session-export.js +149 -0
  178. package/dist/session-export.js.map +1 -0
  179. package/dist/session-maintenance.d.ts.map +1 -1
  180. package/dist/session-maintenance.js +75 -13
  181. package/dist/session-maintenance.js.map +1 -1
  182. package/dist/session-transcripts.d.ts.map +1 -1
  183. package/dist/session-transcripts.js.map +1 -1
  184. package/dist/side-effects.d.ts.map +1 -1
  185. package/dist/side-effects.js +14 -2
  186. package/dist/side-effects.js.map +1 -1
  187. package/dist/skills-guard.d.ts.map +1 -1
  188. package/dist/skills-guard.js +893 -130
  189. package/dist/skills-guard.js.map +1 -1
  190. package/dist/skills.d.ts +5 -0
  191. package/dist/skills.d.ts.map +1 -1
  192. package/dist/skills.js +29 -15
  193. package/dist/skills.js.map +1 -1
  194. package/dist/token-efficiency.d.ts.map +1 -1
  195. package/dist/token-efficiency.js.map +1 -1
  196. package/dist/tui.js +92 -11
  197. package/dist/tui.js.map +1 -1
  198. package/dist/types.d.ts +146 -0
  199. package/dist/types.d.ts.map +1 -1
  200. package/dist/types.js +24 -1
  201. package/dist/types.js.map +1 -1
  202. package/dist/update.d.ts.map +1 -1
  203. package/dist/update.js +42 -14
  204. package/dist/update.js.map +1 -1
  205. package/dist/workspace.d.ts.map +1 -1
  206. package/dist/workspace.js +49 -9
  207. package/dist/workspace.js.map +1 -1
  208. package/docs/chat.html +9 -3
  209. package/docs/index.html +37 -13
  210. package/package.json +8 -2
  211. package/src/agent.ts +16 -3
  212. package/src/audit-cli.ts +44 -16
  213. package/src/audit-events.ts +69 -5
  214. package/src/audit-trail.ts +41 -15
  215. package/src/channels/discord/attachments.ts +81 -27
  216. package/src/channels/discord/debounce.ts +25 -0
  217. package/src/channels/discord/delivery.ts +57 -13
  218. package/src/channels/discord/human-delay.ts +48 -0
  219. package/src/channels/discord/inbound.ts +66 -7
  220. package/src/channels/discord/mentions.ts +42 -18
  221. package/src/channels/discord/presence.ts +148 -0
  222. package/src/channels/discord/rate-limiter.ts +58 -0
  223. package/src/channels/discord/reactions.ts +211 -0
  224. package/src/channels/discord/runtime.ts +1048 -182
  225. package/src/channels/discord/stream.ts +73 -27
  226. package/src/channels/discord/tool-actions.ts +78 -37
  227. package/src/channels/discord/typing.ts +140 -0
  228. package/src/chunk.ts +12 -4
  229. package/src/cli.ts +141 -56
  230. package/src/config.ts +192 -34
  231. package/src/container-runner.ts +132 -42
  232. package/src/container-setup.ts +57 -22
  233. package/src/conversation.ts +9 -7
  234. package/src/db.ts +2217 -84
  235. package/src/delegation-manager.ts +6 -2
  236. package/src/gateway-client.ts +41 -17
  237. package/src/gateway-service.ts +1019 -201
  238. package/src/gateway-types.ts +33 -0
  239. package/src/gateway.ts +321 -48
  240. package/src/health.ts +66 -26
  241. package/src/heartbeat.ts +84 -22
  242. package/src/hybridai-bots.ts +14 -5
  243. package/src/instruction-approval-audit.ts +4 -1
  244. package/src/instruction-integrity.ts +30 -9
  245. package/src/ipc.ts +23 -5
  246. package/src/logger.ts +4 -1
  247. package/src/memory-consolidation.ts +41 -0
  248. package/src/memory-service.ts +606 -0
  249. package/src/mount-security.ts +58 -13
  250. package/src/observability-ingest.ts +134 -35
  251. package/src/onboarding.ts +126 -35
  252. package/src/proactive-policy.ts +3 -1
  253. package/src/prompt-hooks.ts +40 -17
  254. package/src/runtime-config.ts +1114 -99
  255. package/src/scheduled-task-runner.ts +63 -11
  256. package/src/scheduler.ts +683 -60
  257. package/src/session-export.ts +196 -0
  258. package/src/session-maintenance.ts +125 -22
  259. package/src/session-transcripts.ts +12 -3
  260. package/src/side-effects.ts +28 -5
  261. package/src/skills-guard.ts +1067 -219
  262. package/src/skills.ts +163 -65
  263. package/src/token-efficiency.ts +31 -9
  264. package/src/tui.ts +166 -25
  265. package/src/types.ts +195 -2
  266. package/src/update.ts +79 -23
  267. package/src/workspace.ts +63 -11
  268. package/tests/approval-policy.test.ts +224 -0
  269. package/tests/discord.basic.test.ts +82 -2
  270. package/tests/discord.human-presence.test.ts +85 -0
  271. package/tests/gateway-service.media-routing.test.ts +8 -2
  272. package/tests/memory-service.test.ts +1114 -0
  273. package/tests/token-efficiency.basic.test.ts +8 -2
  274. package/vitest.e2e.config.ts +3 -1
  275. package/vitest.integration.config.ts +3 -1
  276. package/vitest.live.config.ts +3 -1
  277. package/vitest.unit.config.ts +9 -0
@@ -1,7 +1,7 @@
1
+ import { spawn } from 'node:child_process';
1
2
  import { createHash } from 'node:crypto';
2
3
  import fs from 'node:fs';
3
4
  import path from 'node:path';
4
- import { spawn } from 'node:child_process';
5
5
 
6
6
  import { CONTAINER_IMAGE } from './config.js';
7
7
 
@@ -13,7 +13,11 @@ interface EnsureContainerImageOptions {
13
13
  cwd?: string;
14
14
  }
15
15
 
16
- function runCommand(command: string, args: string[], cwd?: string): Promise<{ code: number | null; err?: string }> {
16
+ function runCommand(
17
+ command: string,
18
+ args: string[],
19
+ cwd?: string,
20
+ ): Promise<{ code: number | null; err?: string }> {
17
21
  return new Promise((resolve) => {
18
22
  const proc = spawn(command, args, {
19
23
  cwd,
@@ -40,7 +44,10 @@ async function containerImageExists(imageName: string): Promise<boolean> {
40
44
  async function buildContainerImage(cwd: string): Promise<void> {
41
45
  const result = await runCommand('npm', ['run', 'build:container'], cwd);
42
46
  if (result.code !== 0) {
43
- throw new Error(result.err?.trim() || 'npm run build:container returned a non-zero exit code.');
47
+ throw new Error(
48
+ result.err?.trim() ||
49
+ 'npm run build:container returned a non-zero exit code.',
50
+ );
44
51
  }
45
52
  }
46
53
 
@@ -62,7 +69,9 @@ const TRACKED_FILES = [
62
69
  ];
63
70
  const TRACKED_SOURCE_ROOT = 'container/src';
64
71
 
65
- function normalizeRebuildPolicy(raw: string | undefined): ContainerRebuildPolicy {
72
+ function normalizeRebuildPolicy(
73
+ raw: string | undefined,
74
+ ): ContainerRebuildPolicy {
66
75
  const value = (raw || '').trim().toLowerCase();
67
76
  if (value === 'always') return 'always';
68
77
  if (value === 'never') return 'never';
@@ -71,8 +80,8 @@ function normalizeRebuildPolicy(raw: string | undefined): ContainerRebuildPolicy
71
80
 
72
81
  function resolveRebuildPolicy(): ContainerRebuildPolicy {
73
82
  return normalizeRebuildPolicy(
74
- process.env.HYBRIDCLAW_CONTAINER_REBUILD
75
- || process.env.HYBRIDCLAW_CONTAINER_REBUILD_POLICY,
83
+ process.env.HYBRIDCLAW_CONTAINER_REBUILD ||
84
+ process.env.HYBRIDCLAW_CONTAINER_REBUILD_POLICY,
76
85
  );
77
86
  }
78
87
 
@@ -80,21 +89,27 @@ function stateFilePath(cwd: string): string {
80
89
  return path.join(cwd, STATE_DIRNAME, STATE_FILENAME);
81
90
  }
82
91
 
83
- function readContainerImageState(cwd: string, imageName: string): ContainerImageState | null {
92
+ function readContainerImageState(
93
+ cwd: string,
94
+ imageName: string,
95
+ ): ContainerImageState | null {
84
96
  const file = stateFilePath(cwd);
85
97
  if (!fs.existsSync(file)) return null;
86
98
  try {
87
- const parsed = JSON.parse(fs.readFileSync(file, 'utf-8')) as Partial<ContainerImageState>;
99
+ const parsed = JSON.parse(
100
+ fs.readFileSync(file, 'utf-8'),
101
+ ) as Partial<ContainerImageState>;
88
102
  if (
89
- parsed
90
- && parsed.imageName === imageName
91
- && typeof parsed.fingerprint === 'string'
92
- && parsed.fingerprint.trim() !== ''
103
+ parsed &&
104
+ parsed.imageName === imageName &&
105
+ typeof parsed.fingerprint === 'string' &&
106
+ parsed.fingerprint.trim() !== ''
93
107
  ) {
94
108
  return {
95
109
  imageName: parsed.imageName,
96
110
  fingerprint: parsed.fingerprint,
97
- recordedAt: typeof parsed.recordedAt === 'string' ? parsed.recordedAt : '',
111
+ recordedAt:
112
+ typeof parsed.recordedAt === 'string' ? parsed.recordedAt : '',
98
113
  };
99
114
  }
100
115
  } catch {
@@ -103,7 +118,10 @@ function readContainerImageState(cwd: string, imageName: string): ContainerImage
103
118
  return null;
104
119
  }
105
120
 
106
- function writeContainerImageState(cwd: string, state: ContainerImageState): void {
121
+ function writeContainerImageState(
122
+ cwd: string,
123
+ state: ContainerImageState,
124
+ ): void {
107
125
  const file = stateFilePath(cwd);
108
126
  fs.mkdirSync(path.dirname(file), { recursive: true });
109
127
  fs.writeFileSync(file, JSON.stringify(state, null, 2) + '\n');
@@ -124,7 +142,10 @@ function collectFilesRecursive(root: string, out: string[]): void {
124
142
  }
125
143
  }
126
144
 
127
- function computeContainerFingerprint(cwd: string, imageName: string): string | null {
145
+ function computeContainerFingerprint(
146
+ cwd: string,
147
+ imageName: string,
148
+ ): string | null {
128
149
  try {
129
150
  const hash = createHash('sha256');
130
151
  hash.update(`fingerprint-version:${CONTAINER_FINGERPRINT_VERSION}\n`);
@@ -159,12 +180,19 @@ function computeContainerFingerprint(cwd: string, imageName: string): string | n
159
180
  }
160
181
  }
161
182
 
162
- function ensureInteractiveAutoBuild(commandName: string, required: boolean, reason: string, hint: string): boolean {
183
+ function ensureInteractiveAutoBuild(
184
+ commandName: string,
185
+ required: boolean,
186
+ reason: string,
187
+ hint: string,
188
+ ): boolean {
163
189
  if (process.stdin.isTTY && process.stdout.isTTY) return true;
164
190
  if (required) {
165
191
  throw new Error(`${hint} ${reason}`);
166
192
  }
167
- console.warn(`${commandName}: Skipping automatic container build in non-interactive mode. ${hint}`);
193
+ console.warn(
194
+ `${commandName}: Skipping automatic container build in non-interactive mode. ${hint}`,
195
+ );
168
196
  return false;
169
197
  }
170
198
 
@@ -177,10 +205,13 @@ async function buildAndValidateImage(params: {
177
205
  hint: string;
178
206
  fingerprint: string | null;
179
207
  }): Promise<void> {
180
- const { commandName, required, cwd, imageName, reason, hint, fingerprint } = params;
208
+ const { commandName, required, cwd, imageName, reason, hint, fingerprint } =
209
+ params;
181
210
  if (!ensureInteractiveAutoBuild(commandName, required, reason, hint)) return;
182
211
 
183
- console.log(`${commandName}: ${reason} Building container image '${imageName}'...`);
212
+ console.log(
213
+ `${commandName}: ${reason} Building container image '${imageName}'...`,
214
+ );
184
215
  try {
185
216
  await buildContainerImage(cwd);
186
217
  const built = await containerImageExists(imageName);
@@ -198,7 +229,9 @@ async function buildAndValidateImage(params: {
198
229
  } catch (err) {
199
230
  const message = err instanceof Error ? err.message : String(err);
200
231
  if (!required) {
201
- console.warn(`${commandName}: Unable to build image automatically. ${hint}`);
232
+ console.warn(
233
+ `${commandName}: Unable to build image automatically. ${hint}`,
234
+ );
202
235
  console.warn(`Details: ${message}`);
203
236
  return;
204
237
  }
@@ -206,7 +239,9 @@ async function buildAndValidateImage(params: {
206
239
  }
207
240
  }
208
241
 
209
- export async function ensureContainerImageReady(options: EnsureContainerImageOptions = {}): Promise<void> {
242
+ export async function ensureContainerImageReady(
243
+ options: EnsureContainerImageOptions = {},
244
+ ): Promise<void> {
210
245
  const commandName = options.commandName || 'hybridclaw';
211
246
  const required = options.required !== false;
212
247
  const cwd = options.cwd || process.cwd();
@@ -226,7 +261,7 @@ export async function ensureContainerImageReady(options: EnsureContainerImageOpt
226
261
  required,
227
262
  cwd,
228
263
  imageName,
229
- reason: "Container image not found.",
264
+ reason: 'Container image not found.',
230
265
  hint,
231
266
  fingerprint,
232
267
  });
@@ -1,14 +1,14 @@
1
- import { expandSkillInvocation, loadSkills, type Skill } from './skills.js';
2
- import type { ChatMessage } from './types.js';
3
1
  import {
4
2
  buildSystemPromptFromHooks,
5
3
  type PromptMode,
6
4
  type PromptRuntimeInfo,
7
5
  } from './prompt-hooks.js';
6
+ import { expandSkillInvocation, loadSkills, type Skill } from './skills.js';
8
7
  import {
9
- optimizeHistoryMessagesForPrompt,
10
8
  type HistoryOptimizationStats,
9
+ optimizeHistoryMessagesForPrompt,
11
10
  } from './token-efficiency.js';
11
+ import type { ChatMessage } from './types.js';
12
12
 
13
13
  interface HistoryMessage {
14
14
  role: string;
@@ -52,10 +52,12 @@ export function buildConversationContext(params: {
52
52
  messages.push({ role: 'system', content: systemPrompt });
53
53
  }
54
54
 
55
- const historyMessages = [...history].reverse().map((msg): ChatMessage => ({
56
- role: msg.role as ChatMessage['role'],
57
- content: msg.content,
58
- }));
55
+ const historyMessages = [...history].reverse().map(
56
+ (msg): ChatMessage => ({
57
+ role: msg.role as ChatMessage['role'],
58
+ content: msg.content,
59
+ }),
60
+ );
59
61
 
60
62
  if (expandLatestHistoryUser && historyMessages.length > 0) {
61
63
  const latest = historyMessages[historyMessages.length - 1];