@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.
- package/.github/workflows/ci.yml +70 -0
- package/.husky/pre-commit +1 -0
- package/CHANGELOG.md +85 -0
- package/CONTRIBUTING.md +33 -0
- package/README.md +41 -16
- package/SECURITY.md +17 -0
- package/biome.json +35 -0
- package/config.example.json +71 -8
- package/container/package-lock.json +2 -2
- package/container/package.json +1 -1
- package/container/src/approval-policy.ts +1303 -0
- package/container/src/browser-tools.ts +431 -136
- package/container/src/extensions.ts +36 -12
- package/container/src/hybridai-client.ts +34 -13
- package/container/src/index.ts +451 -109
- package/container/src/ipc.ts +5 -3
- package/container/src/token-usage.ts +20 -10
- package/container/src/tools.ts +599 -225
- package/container/src/types.ts +32 -2
- package/container/src/web-fetch.ts +89 -32
- package/dist/agent.d.ts.map +1 -1
- package/dist/agent.js +10 -2
- package/dist/agent.js.map +1 -1
- package/dist/audit-cli.d.ts.map +1 -1
- package/dist/audit-cli.js +4 -2
- package/dist/audit-cli.js.map +1 -1
- package/dist/audit-events.d.ts.map +1 -1
- package/dist/audit-events.js +53 -3
- package/dist/audit-events.js.map +1 -1
- package/dist/audit-trail.d.ts.map +1 -1
- package/dist/audit-trail.js +17 -8
- package/dist/audit-trail.js.map +1 -1
- package/dist/channels/discord/attachments.d.ts.map +1 -1
- package/dist/channels/discord/attachments.js +14 -7
- package/dist/channels/discord/attachments.js.map +1 -1
- package/dist/channels/discord/debounce.d.ts +9 -0
- package/dist/channels/discord/debounce.d.ts.map +1 -0
- package/dist/channels/discord/debounce.js +20 -0
- package/dist/channels/discord/debounce.js.map +1 -0
- package/dist/channels/discord/delivery.d.ts +4 -1
- package/dist/channels/discord/delivery.d.ts.map +1 -1
- package/dist/channels/discord/delivery.js +19 -3
- package/dist/channels/discord/delivery.js.map +1 -1
- package/dist/channels/discord/human-delay.d.ts +16 -0
- package/dist/channels/discord/human-delay.d.ts.map +1 -0
- package/dist/channels/discord/human-delay.js +29 -0
- package/dist/channels/discord/human-delay.js.map +1 -0
- package/dist/channels/discord/inbound.d.ts +4 -0
- package/dist/channels/discord/inbound.d.ts.map +1 -1
- package/dist/channels/discord/inbound.js +45 -4
- package/dist/channels/discord/inbound.js.map +1 -1
- package/dist/channels/discord/mentions.d.ts.map +1 -1
- package/dist/channels/discord/mentions.js +16 -4
- package/dist/channels/discord/mentions.js.map +1 -1
- package/dist/channels/discord/presence.d.ts +33 -0
- package/dist/channels/discord/presence.d.ts.map +1 -0
- package/dist/channels/discord/presence.js +111 -0
- package/dist/channels/discord/presence.js.map +1 -0
- package/dist/channels/discord/rate-limiter.d.ts +14 -0
- package/dist/channels/discord/rate-limiter.d.ts.map +1 -0
- package/dist/channels/discord/rate-limiter.js +49 -0
- package/dist/channels/discord/rate-limiter.js.map +1 -0
- package/dist/channels/discord/reactions.d.ts +38 -0
- package/dist/channels/discord/reactions.d.ts.map +1 -0
- package/dist/channels/discord/reactions.js +151 -0
- package/dist/channels/discord/reactions.js.map +1 -0
- package/dist/channels/discord/runtime.d.ts +6 -3
- package/dist/channels/discord/runtime.d.ts.map +1 -1
- package/dist/channels/discord/runtime.js +621 -125
- package/dist/channels/discord/runtime.js.map +1 -1
- package/dist/channels/discord/stream.d.ts +4 -1
- package/dist/channels/discord/stream.d.ts.map +1 -1
- package/dist/channels/discord/stream.js +16 -8
- package/dist/channels/discord/stream.js.map +1 -1
- package/dist/channels/discord/tool-actions.d.ts.map +1 -1
- package/dist/channels/discord/tool-actions.js +24 -12
- package/dist/channels/discord/tool-actions.js.map +1 -1
- package/dist/channels/discord/typing.d.ts +15 -0
- package/dist/channels/discord/typing.d.ts.map +1 -0
- package/dist/channels/discord/typing.js +106 -0
- package/dist/channels/discord/typing.js.map +1 -0
- package/dist/chunk.d.ts.map +1 -1
- package/dist/chunk.js +4 -2
- package/dist/chunk.js.map +1 -1
- package/dist/cli.js +47 -22
- package/dist/cli.js.map +1 -1
- package/dist/config.d.ts +19 -0
- package/dist/config.d.ts.map +1 -1
- package/dist/config.js +103 -18
- package/dist/config.js.map +1 -1
- package/dist/container-runner.d.ts.map +1 -1
- package/dist/container-runner.js +58 -26
- package/dist/container-runner.js.map +1 -1
- package/dist/container-setup.d.ts.map +1 -1
- package/dist/container-setup.js +10 -9
- package/dist/container-setup.js.map +1 -1
- package/dist/conversation.d.ts +2 -2
- package/dist/conversation.d.ts.map +1 -1
- package/dist/conversation.js +1 -1
- package/dist/conversation.js.map +1 -1
- package/dist/db.d.ts +118 -2
- package/dist/db.d.ts.map +1 -1
- package/dist/db.js +1568 -50
- package/dist/db.js.map +1 -1
- package/dist/delegation-manager.d.ts.map +1 -1
- package/dist/delegation-manager.js +3 -2
- package/dist/delegation-manager.js.map +1 -1
- package/dist/gateway-client.d.ts +2 -2
- package/dist/gateway-client.d.ts.map +1 -1
- package/dist/gateway-client.js +10 -4
- package/dist/gateway-client.js.map +1 -1
- package/dist/gateway-service.d.ts +3 -3
- package/dist/gateway-service.d.ts.map +1 -1
- package/dist/gateway-service.js +563 -73
- package/dist/gateway-service.js.map +1 -1
- package/dist/gateway-types.d.ts +24 -0
- package/dist/gateway-types.d.ts.map +1 -1
- package/dist/gateway-types.js.map +1 -1
- package/dist/gateway.js +179 -24
- package/dist/gateway.js.map +1 -1
- package/dist/health.d.ts.map +1 -1
- package/dist/health.js +20 -10
- package/dist/health.js.map +1 -1
- package/dist/heartbeat.d.ts +4 -0
- package/dist/heartbeat.d.ts.map +1 -1
- package/dist/heartbeat.js +48 -20
- package/dist/heartbeat.js.map +1 -1
- package/dist/hybridai-bots.d.ts.map +1 -1
- package/dist/hybridai-bots.js +4 -2
- package/dist/hybridai-bots.js.map +1 -1
- package/dist/instruction-approval-audit.d.ts.map +1 -1
- package/dist/instruction-approval-audit.js.map +1 -1
- package/dist/instruction-integrity.d.ts.map +1 -1
- package/dist/instruction-integrity.js +8 -2
- package/dist/instruction-integrity.js.map +1 -1
- package/dist/ipc.d.ts.map +1 -1
- package/dist/ipc.js +6 -1
- package/dist/ipc.js.map +1 -1
- package/dist/logger.js.map +1 -1
- package/dist/memory-consolidation.d.ts +17 -0
- package/dist/memory-consolidation.d.ts.map +1 -0
- package/dist/memory-consolidation.js +25 -0
- package/dist/memory-consolidation.js.map +1 -0
- package/dist/memory-service.d.ts +200 -0
- package/dist/memory-service.d.ts.map +1 -0
- package/dist/memory-service.js +294 -0
- package/dist/memory-service.js.map +1 -0
- package/dist/mount-security.d.ts.map +1 -1
- package/dist/mount-security.js +31 -7
- package/dist/mount-security.js.map +1 -1
- package/dist/observability-ingest.d.ts.map +1 -1
- package/dist/observability-ingest.js +32 -11
- package/dist/observability-ingest.js.map +1 -1
- package/dist/onboarding.d.ts.map +1 -1
- package/dist/onboarding.js +32 -9
- package/dist/onboarding.js.map +1 -1
- package/dist/proactive-policy.d.ts.map +1 -1
- package/dist/proactive-policy.js +2 -1
- package/dist/proactive-policy.js.map +1 -1
- package/dist/prompt-hooks.d.ts.map +1 -1
- package/dist/prompt-hooks.js +9 -7
- package/dist/prompt-hooks.js.map +1 -1
- package/dist/runtime-config.d.ts +98 -1
- package/dist/runtime-config.d.ts.map +1 -1
- package/dist/runtime-config.js +477 -23
- package/dist/runtime-config.js.map +1 -1
- package/dist/scheduled-task-runner.d.ts +1 -0
- package/dist/scheduled-task-runner.d.ts.map +1 -1
- package/dist/scheduled-task-runner.js +29 -10
- package/dist/scheduled-task-runner.js.map +1 -1
- package/dist/scheduler.d.ts +43 -4
- package/dist/scheduler.d.ts.map +1 -1
- package/dist/scheduler.js +530 -56
- package/dist/scheduler.js.map +1 -1
- package/dist/session-export.d.ts +26 -0
- package/dist/session-export.d.ts.map +1 -0
- package/dist/session-export.js +149 -0
- package/dist/session-export.js.map +1 -0
- package/dist/session-maintenance.d.ts.map +1 -1
- package/dist/session-maintenance.js +75 -13
- package/dist/session-maintenance.js.map +1 -1
- package/dist/session-transcripts.d.ts.map +1 -1
- package/dist/session-transcripts.js.map +1 -1
- package/dist/side-effects.d.ts.map +1 -1
- package/dist/side-effects.js +14 -2
- package/dist/side-effects.js.map +1 -1
- package/dist/skills-guard.d.ts.map +1 -1
- package/dist/skills-guard.js +893 -130
- package/dist/skills-guard.js.map +1 -1
- package/dist/skills.d.ts +5 -0
- package/dist/skills.d.ts.map +1 -1
- package/dist/skills.js +29 -15
- package/dist/skills.js.map +1 -1
- package/dist/token-efficiency.d.ts.map +1 -1
- package/dist/token-efficiency.js.map +1 -1
- package/dist/tui.js +92 -11
- package/dist/tui.js.map +1 -1
- package/dist/types.d.ts +146 -0
- package/dist/types.d.ts.map +1 -1
- package/dist/types.js +24 -1
- package/dist/types.js.map +1 -1
- package/dist/update.d.ts.map +1 -1
- package/dist/update.js +42 -14
- package/dist/update.js.map +1 -1
- package/dist/workspace.d.ts.map +1 -1
- package/dist/workspace.js +49 -9
- package/dist/workspace.js.map +1 -1
- package/docs/chat.html +9 -3
- package/docs/index.html +37 -13
- package/package.json +8 -2
- package/src/agent.ts +16 -3
- package/src/audit-cli.ts +44 -16
- package/src/audit-events.ts +69 -5
- package/src/audit-trail.ts +41 -15
- package/src/channels/discord/attachments.ts +81 -27
- package/src/channels/discord/debounce.ts +25 -0
- package/src/channels/discord/delivery.ts +57 -13
- package/src/channels/discord/human-delay.ts +48 -0
- package/src/channels/discord/inbound.ts +66 -7
- package/src/channels/discord/mentions.ts +42 -18
- package/src/channels/discord/presence.ts +148 -0
- package/src/channels/discord/rate-limiter.ts +58 -0
- package/src/channels/discord/reactions.ts +211 -0
- package/src/channels/discord/runtime.ts +1048 -182
- package/src/channels/discord/stream.ts +73 -27
- package/src/channels/discord/tool-actions.ts +78 -37
- package/src/channels/discord/typing.ts +140 -0
- package/src/chunk.ts +12 -4
- package/src/cli.ts +141 -56
- package/src/config.ts +192 -34
- package/src/container-runner.ts +132 -42
- package/src/container-setup.ts +57 -22
- package/src/conversation.ts +9 -7
- package/src/db.ts +2217 -84
- package/src/delegation-manager.ts +6 -2
- package/src/gateway-client.ts +41 -17
- package/src/gateway-service.ts +1019 -201
- package/src/gateway-types.ts +33 -0
- package/src/gateway.ts +321 -48
- package/src/health.ts +66 -26
- package/src/heartbeat.ts +84 -22
- package/src/hybridai-bots.ts +14 -5
- package/src/instruction-approval-audit.ts +4 -1
- package/src/instruction-integrity.ts +30 -9
- package/src/ipc.ts +23 -5
- package/src/logger.ts +4 -1
- package/src/memory-consolidation.ts +41 -0
- package/src/memory-service.ts +606 -0
- package/src/mount-security.ts +58 -13
- package/src/observability-ingest.ts +134 -35
- package/src/onboarding.ts +126 -35
- package/src/proactive-policy.ts +3 -1
- package/src/prompt-hooks.ts +40 -17
- package/src/runtime-config.ts +1114 -99
- package/src/scheduled-task-runner.ts +63 -11
- package/src/scheduler.ts +683 -60
- package/src/session-export.ts +196 -0
- package/src/session-maintenance.ts +125 -22
- package/src/session-transcripts.ts +12 -3
- package/src/side-effects.ts +28 -5
- package/src/skills-guard.ts +1067 -219
- package/src/skills.ts +163 -65
- package/src/token-efficiency.ts +31 -9
- package/src/tui.ts +166 -25
- package/src/types.ts +195 -2
- package/src/update.ts +79 -23
- package/src/workspace.ts +63 -11
- package/tests/approval-policy.test.ts +224 -0
- package/tests/discord.basic.test.ts +82 -2
- package/tests/discord.human-presence.test.ts +85 -0
- package/tests/gateway-service.media-routing.test.ts +8 -2
- package/tests/memory-service.test.ts +1114 -0
- package/tests/token-efficiency.basic.test.ts +8 -2
- package/vitest.e2e.config.ts +3 -1
- package/vitest.integration.config.ts +3 -1
- package/vitest.live.config.ts +3 -1
- package/vitest.unit.config.ts +9 -0
package/src/container-setup.ts
CHANGED
|
@@ -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(
|
|
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(
|
|
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(
|
|
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
|
-
|
|
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(
|
|
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(
|
|
99
|
+
const parsed = JSON.parse(
|
|
100
|
+
fs.readFileSync(file, 'utf-8'),
|
|
101
|
+
) as Partial<ContainerImageState>;
|
|
88
102
|
if (
|
|
89
|
-
parsed
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
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:
|
|
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(
|
|
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(
|
|
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(
|
|
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(
|
|
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 } =
|
|
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(
|
|
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(
|
|
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(
|
|
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:
|
|
264
|
+
reason: 'Container image not found.',
|
|
230
265
|
hint,
|
|
231
266
|
fingerprint,
|
|
232
267
|
});
|
package/src/conversation.ts
CHANGED
|
@@ -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(
|
|
56
|
-
|
|
57
|
-
|
|
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];
|