@vellumai/assistant 0.10.3-dev.202606292252.adea010 → 0.10.3-dev.202606300318.cf23f52
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/openapi.yaml +134 -0
- package/package.json +1 -1
- package/src/__tests__/agent-loop-compaction-events.test.ts +1 -0
- package/src/__tests__/agent-loop-compaction-strip.test.ts +2 -0
- package/src/__tests__/agent-loop-exit-reason.test.ts +2 -0
- package/src/__tests__/agent-loop-regrowth-guard.test.ts +8 -0
- package/src/__tests__/agent-loop.test.ts +1 -0
- package/src/__tests__/conversation-agent-loop.test.ts +39 -1
- package/src/__tests__/conversation-runtime-assembly.test.ts +6 -6
- package/src/__tests__/device-id.test.ts +38 -1
- package/src/__tests__/history-repair-hook.test.ts +1 -1
- package/src/__tests__/llm-request-log-source-clickhouse.test.ts +1 -0
- package/src/__tests__/memory-retrieval-hook.test.ts +1 -1
- package/src/__tests__/plugin-import-boundary-guard.test.ts +7 -0
- package/src/__tests__/title-generate-hook.test.ts +1 -1
- package/src/agent/loop.ts +190 -135
- package/src/api/index.ts +4 -0
- package/src/api/responses/llm-request-log-entry.ts +41 -0
- package/src/config/bundled-skills/app-builder/SKILL.md +2 -0
- package/src/config/llm-resolver.ts +17 -0
- package/src/config/schemas/__tests__/memory-v3.test.ts +11 -11
- package/src/config/schemas/memory-v3.ts +10 -10
- package/src/daemon/conversation-agent-loop-handlers.ts +58 -8
- package/src/daemon/conversation-agent-loop.ts +31 -13
- package/src/daemon/conversation-runtime-assembly.ts +10 -8
- package/src/daemon/conversation.ts +1 -0
- package/src/daemon/turn-latency-tracker.test.ts +137 -0
- package/src/daemon/turn-latency-tracker.ts +134 -0
- package/src/ipc/__tests__/inject-local-actor-header.test.ts +33 -0
- package/src/ipc/assistant-server.ts +37 -38
- package/src/messaging/providers/slack/render.test.ts +166 -4
- package/src/messaging/providers/slack/render.ts +289 -36
- package/src/persistence/llm-request-log-source-clickhouse.ts +4 -0
- package/src/persistence/llm-request-log-store.ts +25 -2
- package/src/persistence/migrations/310-llm-request-log-latency-breakdown.ts +37 -0
- package/src/persistence/schema/infrastructure.ts +8 -0
- package/src/persistence/steps.ts +2 -0
- package/src/plugin-api/types.ts +9 -13
- package/src/plugins/defaults/image-fallback/__tests__/image-fallback.test.ts +23 -9
- package/src/plugins/defaults/image-fallback/hooks/user-prompt-submit.ts +2 -3
- package/src/plugins/defaults/image-fallback/src/caption-blocks.ts +7 -14
- package/src/plugins/defaults/memory/hooks/post-compact.ts +3 -4
- package/src/plugins/defaults/memory/hooks/user-prompt-submit.ts +5 -4
- package/src/{tools/memory/register.test.ts → plugins/defaults/memory/tools.test.ts} +7 -7
- package/src/{tools/memory/register.ts → plugins/defaults/memory/tools.ts} +17 -8
- package/src/plugins/defaults/memory/v3/__tests__/orchestrate.test.ts +20 -9
- package/src/plugins/defaults/memory/v3/__tests__/shadow-integration.test.ts +16 -6
- package/src/plugins/defaults/memory/v3/__tests__/shadow-plugin.test.ts +56 -9
- package/src/plugins/defaults/memory/v3/hot-set.test.ts +1 -1
- package/src/plugins/defaults/memory/v3/orchestrate.ts +2 -2
- package/src/plugins/defaults/memory/v3/shadow-plugin.ts +17 -14
- package/src/runtime/__tests__/agent-wake.test.ts +95 -24
- package/src/runtime/agent-wake.ts +40 -6
- package/src/runtime/routes/__tests__/wake-conversation-routes.test.ts +89 -0
- package/src/runtime/routes/conversation-query-routes.ts +24 -1
- package/src/runtime/routes/platform-routes.ts +3 -0
- package/src/runtime/routes/types.ts +7 -0
- package/src/runtime/routes/wake-conversation-routes.ts +18 -2
- package/src/tools/tool-manifest.ts +1 -1
- package/src/util/device-id.ts +52 -12
package/openapi.yaml
CHANGED
|
@@ -8527,6 +8527,49 @@ paths:
|
|
|
8527
8527
|
- type: "null"
|
|
8528
8528
|
additionalProperties: false
|
|
8529
8529
|
- type: "null"
|
|
8530
|
+
latency:
|
|
8531
|
+
anyOf:
|
|
8532
|
+
- type: object
|
|
8533
|
+
properties:
|
|
8534
|
+
phases:
|
|
8535
|
+
type: array
|
|
8536
|
+
items:
|
|
8537
|
+
type: object
|
|
8538
|
+
properties:
|
|
8539
|
+
key:
|
|
8540
|
+
type: string
|
|
8541
|
+
label:
|
|
8542
|
+
type: string
|
|
8543
|
+
ms:
|
|
8544
|
+
type: number
|
|
8545
|
+
required:
|
|
8546
|
+
- key
|
|
8547
|
+
- label
|
|
8548
|
+
- ms
|
|
8549
|
+
additionalProperties: false
|
|
8550
|
+
ttftMs:
|
|
8551
|
+
anyOf:
|
|
8552
|
+
- type: number
|
|
8553
|
+
- type: "null"
|
|
8554
|
+
totalToFirstTokenMs:
|
|
8555
|
+
anyOf:
|
|
8556
|
+
- type: number
|
|
8557
|
+
- type: "null"
|
|
8558
|
+
providerDurationMs:
|
|
8559
|
+
anyOf:
|
|
8560
|
+
- type: number
|
|
8561
|
+
- type: "null"
|
|
8562
|
+
firstTokenKind:
|
|
8563
|
+
anyOf:
|
|
8564
|
+
- type: string
|
|
8565
|
+
enum:
|
|
8566
|
+
- thinking
|
|
8567
|
+
- text
|
|
8568
|
+
- type: "null"
|
|
8569
|
+
required:
|
|
8570
|
+
- phases
|
|
8571
|
+
additionalProperties: false
|
|
8572
|
+
- type: "null"
|
|
8530
8573
|
required:
|
|
8531
8574
|
- id
|
|
8532
8575
|
- createdAt
|
|
@@ -15521,6 +15564,49 @@ paths:
|
|
|
15521
15564
|
- type: "null"
|
|
15522
15565
|
additionalProperties: false
|
|
15523
15566
|
- type: "null"
|
|
15567
|
+
latency:
|
|
15568
|
+
anyOf:
|
|
15569
|
+
- type: object
|
|
15570
|
+
properties:
|
|
15571
|
+
phases:
|
|
15572
|
+
type: array
|
|
15573
|
+
items:
|
|
15574
|
+
type: object
|
|
15575
|
+
properties:
|
|
15576
|
+
key:
|
|
15577
|
+
type: string
|
|
15578
|
+
label:
|
|
15579
|
+
type: string
|
|
15580
|
+
ms:
|
|
15581
|
+
type: number
|
|
15582
|
+
required:
|
|
15583
|
+
- key
|
|
15584
|
+
- label
|
|
15585
|
+
- ms
|
|
15586
|
+
additionalProperties: false
|
|
15587
|
+
ttftMs:
|
|
15588
|
+
anyOf:
|
|
15589
|
+
- type: number
|
|
15590
|
+
- type: "null"
|
|
15591
|
+
totalToFirstTokenMs:
|
|
15592
|
+
anyOf:
|
|
15593
|
+
- type: number
|
|
15594
|
+
- type: "null"
|
|
15595
|
+
providerDurationMs:
|
|
15596
|
+
anyOf:
|
|
15597
|
+
- type: number
|
|
15598
|
+
- type: "null"
|
|
15599
|
+
firstTokenKind:
|
|
15600
|
+
anyOf:
|
|
15601
|
+
- type: string
|
|
15602
|
+
enum:
|
|
15603
|
+
- thinking
|
|
15604
|
+
- text
|
|
15605
|
+
- type: "null"
|
|
15606
|
+
required:
|
|
15607
|
+
- phases
|
|
15608
|
+
additionalProperties: false
|
|
15609
|
+
- type: "null"
|
|
15524
15610
|
required:
|
|
15525
15611
|
- id
|
|
15526
15612
|
- createdAt
|
|
@@ -18145,6 +18231,49 @@ paths:
|
|
|
18145
18231
|
- type: "null"
|
|
18146
18232
|
additionalProperties: false
|
|
18147
18233
|
- type: "null"
|
|
18234
|
+
latency:
|
|
18235
|
+
anyOf:
|
|
18236
|
+
- type: object
|
|
18237
|
+
properties:
|
|
18238
|
+
phases:
|
|
18239
|
+
type: array
|
|
18240
|
+
items:
|
|
18241
|
+
type: object
|
|
18242
|
+
properties:
|
|
18243
|
+
key:
|
|
18244
|
+
type: string
|
|
18245
|
+
label:
|
|
18246
|
+
type: string
|
|
18247
|
+
ms:
|
|
18248
|
+
type: number
|
|
18249
|
+
required:
|
|
18250
|
+
- key
|
|
18251
|
+
- label
|
|
18252
|
+
- ms
|
|
18253
|
+
additionalProperties: false
|
|
18254
|
+
ttftMs:
|
|
18255
|
+
anyOf:
|
|
18256
|
+
- type: number
|
|
18257
|
+
- type: "null"
|
|
18258
|
+
totalToFirstTokenMs:
|
|
18259
|
+
anyOf:
|
|
18260
|
+
- type: number
|
|
18261
|
+
- type: "null"
|
|
18262
|
+
providerDurationMs:
|
|
18263
|
+
anyOf:
|
|
18264
|
+
- type: number
|
|
18265
|
+
- type: "null"
|
|
18266
|
+
firstTokenKind:
|
|
18267
|
+
anyOf:
|
|
18268
|
+
- type: string
|
|
18269
|
+
enum:
|
|
18270
|
+
- thinking
|
|
18271
|
+
- text
|
|
18272
|
+
- type: "null"
|
|
18273
|
+
required:
|
|
18274
|
+
- phases
|
|
18275
|
+
additionalProperties: false
|
|
18276
|
+
- type: "null"
|
|
18148
18277
|
required:
|
|
18149
18278
|
- id
|
|
18150
18279
|
- createdAt
|
|
@@ -20315,6 +20444,10 @@ paths:
|
|
|
20315
20444
|
type: boolean
|
|
20316
20445
|
hasWebhookSecret:
|
|
20317
20446
|
type: boolean
|
|
20447
|
+
clientInstallationId:
|
|
20448
|
+
anyOf:
|
|
20449
|
+
- type: string
|
|
20450
|
+
- type: "null"
|
|
20318
20451
|
available:
|
|
20319
20452
|
type: boolean
|
|
20320
20453
|
organizationId:
|
|
@@ -20346,6 +20479,7 @@ paths:
|
|
|
20346
20479
|
- assistantId
|
|
20347
20480
|
- hasAssistantApiKey
|
|
20348
20481
|
- hasWebhookSecret
|
|
20482
|
+
- clientInstallationId
|
|
20349
20483
|
- available
|
|
20350
20484
|
- organizationId
|
|
20351
20485
|
- userId
|
package/package.json
CHANGED
|
@@ -150,6 +150,7 @@ describe("AgentLoop compaction start/end event pair", () => {
|
|
|
150
150
|
onEvent: (event) => {
|
|
151
151
|
events.push(event);
|
|
152
152
|
},
|
|
153
|
+
modelProfileKey: "balanced",
|
|
153
154
|
resolveContextWindow: () => ({
|
|
154
155
|
maxInputTokens: 10,
|
|
155
156
|
overflowRecovery: { enabled: true, safetyMarginRatio: 0 },
|
|
@@ -167,6 +167,7 @@ describe("AgentLoop compaction summarizer input", () => {
|
|
|
167
167
|
onEvent: (event) => {
|
|
168
168
|
events.push(event);
|
|
169
169
|
},
|
|
170
|
+
modelProfileKey: "balanced",
|
|
170
171
|
resolveContextWindow: () => ({
|
|
171
172
|
maxInputTokens: 10,
|
|
172
173
|
overflowRecovery: { enabled: true, safetyMarginRatio: 0 },
|
|
@@ -221,6 +222,7 @@ describe("AgentLoop compaction summarizer input", () => {
|
|
|
221
222
|
onEvent: (event) => {
|
|
222
223
|
events.push(event);
|
|
223
224
|
},
|
|
225
|
+
modelProfileKey: "balanced",
|
|
224
226
|
resolveContextWindow: () => ({
|
|
225
227
|
maxInputTokens: 10,
|
|
226
228
|
overflowRecovery: { enabled: true, safetyMarginRatio: 0 },
|
|
@@ -460,6 +460,7 @@ describe("AgentLoop exit-reason instrumentation", () => {
|
|
|
460
460
|
messages: [userMessage],
|
|
461
461
|
onEvent: () => {},
|
|
462
462
|
trust: { sourceChannel: "vellum", trustClass: "unknown" },
|
|
463
|
+
modelProfileKey: "balanced",
|
|
463
464
|
resolveContextWindow: () => ({
|
|
464
465
|
maxInputTokens: 10,
|
|
465
466
|
overflowRecovery: { enabled: false, safetyMarginRatio: 0 },
|
|
@@ -500,6 +501,7 @@ describe("AgentLoop exit-reason instrumentation", () => {
|
|
|
500
501
|
onEvent: (event) => {
|
|
501
502
|
events.push(event);
|
|
502
503
|
},
|
|
504
|
+
modelProfileKey: "balanced",
|
|
503
505
|
resolveContextWindow: () => ({
|
|
504
506
|
maxInputTokens: 10,
|
|
505
507
|
overflowRecovery: { enabled: true, safetyMarginRatio: 0 },
|
|
@@ -148,6 +148,7 @@ async function runOnce(args: {
|
|
|
148
148
|
onEvent: (event) => {
|
|
149
149
|
events.push(event);
|
|
150
150
|
},
|
|
151
|
+
modelProfileKey: "balanced",
|
|
151
152
|
resolveContextWindow: () => ({
|
|
152
153
|
maxInputTokens: 10,
|
|
153
154
|
overflowRecovery: { enabled: true, safetyMarginRatio: 0 },
|
|
@@ -215,6 +216,7 @@ describe("AgentLoop budget-gate regrowth guard", () => {
|
|
|
215
216
|
onEvent: (event) => {
|
|
216
217
|
events.push(event);
|
|
217
218
|
},
|
|
219
|
+
modelProfileKey: "balanced",
|
|
218
220
|
resolveContextWindow: () => ({
|
|
219
221
|
maxInputTokens: 10,
|
|
220
222
|
overflowRecovery: { enabled: true, safetyMarginRatio: 0 },
|
|
@@ -249,6 +251,7 @@ describe("AgentLoop budget-gate regrowth guard", () => {
|
|
|
249
251
|
requestId: "req",
|
|
250
252
|
messages: [userMessage],
|
|
251
253
|
onEvent: () => {},
|
|
254
|
+
modelProfileKey: "balanced",
|
|
252
255
|
resolveContextWindow: () => ({
|
|
253
256
|
maxInputTokens: 10,
|
|
254
257
|
overflowRecovery: { enabled: true, safetyMarginRatio: 0 },
|
|
@@ -310,6 +313,7 @@ describe("AgentLoop budget-gate per-turn proactive-futility suppression", () =>
|
|
|
310
313
|
onEvent: (event) => {
|
|
311
314
|
events.push(event);
|
|
312
315
|
},
|
|
316
|
+
modelProfileKey: "balanced",
|
|
313
317
|
resolveContextWindow: () => ({
|
|
314
318
|
maxInputTokens: 10,
|
|
315
319
|
overflowRecovery: { enabled: true, safetyMarginRatio: 0 },
|
|
@@ -369,6 +373,7 @@ describe("AgentLoop budget-gate per-turn proactive-futility suppression", () =>
|
|
|
369
373
|
onEvent: (e) => {
|
|
370
374
|
events.push(e);
|
|
371
375
|
},
|
|
376
|
+
modelProfileKey: "balanced",
|
|
372
377
|
resolveContextWindow: () => ({
|
|
373
378
|
maxInputTokens: 10,
|
|
374
379
|
overflowRecovery: { enabled: true, safetyMarginRatio: 0 },
|
|
@@ -411,6 +416,7 @@ describe("AgentLoop budget-gate per-turn proactive-futility suppression", () =>
|
|
|
411
416
|
onEvent: (e) => {
|
|
412
417
|
turn1.push(e);
|
|
413
418
|
},
|
|
419
|
+
modelProfileKey: "balanced",
|
|
414
420
|
resolveContextWindow: () => ({
|
|
415
421
|
maxInputTokens: 10,
|
|
416
422
|
overflowRecovery: { enabled: true, safetyMarginRatio: 0 },
|
|
@@ -428,6 +434,7 @@ describe("AgentLoop budget-gate per-turn proactive-futility suppression", () =>
|
|
|
428
434
|
onEvent: (e) => {
|
|
429
435
|
turn2.push(e);
|
|
430
436
|
},
|
|
437
|
+
modelProfileKey: "balanced",
|
|
431
438
|
resolveContextWindow: () => ({
|
|
432
439
|
maxInputTokens: 10,
|
|
433
440
|
overflowRecovery: { enabled: true, safetyMarginRatio: 0 },
|
|
@@ -483,6 +490,7 @@ describe("AgentLoop budget-gate per-turn proactive-futility suppression", () =>
|
|
|
483
490
|
onEvent: (e) => {
|
|
484
491
|
events.push(e);
|
|
485
492
|
},
|
|
493
|
+
modelProfileKey: "balanced",
|
|
486
494
|
resolveContextWindow: () => ({
|
|
487
495
|
maxInputTokens: 10,
|
|
488
496
|
overflowRecovery: { enabled: true, safetyMarginRatio: 0 },
|
|
@@ -204,6 +204,7 @@ describe("AgentLoop", () => {
|
|
|
204
204
|
trust: { sourceChannel: "vellum", trustClass: "unknown" },
|
|
205
205
|
requestId: "req-1",
|
|
206
206
|
callSite: "mainAgent",
|
|
207
|
+
modelProfileKey: "balanced",
|
|
207
208
|
resolveContextWindow: () => ({
|
|
208
209
|
maxInputTokens,
|
|
209
210
|
overflowRecovery: { enabled: false, safetyMarginRatio: 0 },
|
|
@@ -32,6 +32,8 @@ const conversationDiskViewRealSnapshot = {
|
|
|
32
32
|
) as Record<string, unknown>),
|
|
33
33
|
};
|
|
34
34
|
let mockUiConfig: { userTimezone?: string; detectedTimezone?: string } = {};
|
|
35
|
+
let mockLlmProfiles: Record<string, unknown> = {};
|
|
36
|
+
let mockLlmActiveProfile: string | undefined;
|
|
35
37
|
|
|
36
38
|
// ── Module mocks (must precede imports of the module under test) ─────
|
|
37
39
|
|
|
@@ -80,8 +82,9 @@ mock.module("../config/loader.js", () => ({
|
|
|
80
82
|
},
|
|
81
83
|
},
|
|
82
84
|
},
|
|
83
|
-
profiles:
|
|
85
|
+
profiles: mockLlmProfiles,
|
|
84
86
|
callSites: {},
|
|
87
|
+
activeProfile: mockLlmActiveProfile,
|
|
85
88
|
pricingOverrides: [],
|
|
86
89
|
},
|
|
87
90
|
rateLimit: { maxRequestsPerMinute: 0 },
|
|
@@ -835,6 +838,8 @@ function makeCompactionResult(
|
|
|
835
838
|
|
|
836
839
|
beforeEach(() => {
|
|
837
840
|
mockUiConfig = {};
|
|
841
|
+
mockLlmProfiles = {};
|
|
842
|
+
mockLlmActiveProfile = undefined;
|
|
838
843
|
mockEstimateTokens = 1000;
|
|
839
844
|
mockReducerStepFn = null;
|
|
840
845
|
mockOverflowAction = "fail_gracefully";
|
|
@@ -903,6 +908,39 @@ beforeEach(() => {
|
|
|
903
908
|
|
|
904
909
|
describe("session-agent-loop", () => {
|
|
905
910
|
describe("user-prompt-submit hook failures", () => {
|
|
911
|
+
test("passes the effective profile to hooks even when it was already announced", async () => {
|
|
912
|
+
mockLlmProfiles = {
|
|
913
|
+
balanced: {
|
|
914
|
+
label: "Balanced",
|
|
915
|
+
model: "accounts/fireworks/models/glm-5p2",
|
|
916
|
+
},
|
|
917
|
+
quality: { label: "Quality", model: "claude-opus-4-8" },
|
|
918
|
+
};
|
|
919
|
+
mockLlmActiveProfile = "quality";
|
|
920
|
+
const observedProfileKeys: string[] = [];
|
|
921
|
+
registerPlugin({
|
|
922
|
+
manifest: {
|
|
923
|
+
name: "test-observe-model-profile",
|
|
924
|
+
version: "1.0.0",
|
|
925
|
+
},
|
|
926
|
+
hooks: {
|
|
927
|
+
"user-prompt-submit": async (ctx: UserPromptSubmitContext) => {
|
|
928
|
+
observedProfileKeys.push(ctx.modelProfileKey);
|
|
929
|
+
},
|
|
930
|
+
},
|
|
931
|
+
});
|
|
932
|
+
|
|
933
|
+
const ctx = makeCtx({
|
|
934
|
+
inferenceProfile: "balanced",
|
|
935
|
+
lastNotifiedInferenceProfile: "balanced",
|
|
936
|
+
providerResponses: [textResponse("ok")],
|
|
937
|
+
});
|
|
938
|
+
|
|
939
|
+
await runAgentLoopImpl(ctx, "hello", "msg-1", () => {});
|
|
940
|
+
|
|
941
|
+
expect(observedProfileKeys).toEqual(["balanced"]);
|
|
942
|
+
});
|
|
943
|
+
|
|
906
944
|
test("logs and continues with prior hook mutations", async () => {
|
|
907
945
|
registerPlugin({
|
|
908
946
|
manifest: {
|
|
@@ -1104,7 +1104,7 @@ describe("applyRuntimeInjections — injection mode", () => {
|
|
|
1104
1104
|
requestId: "reinject-req",
|
|
1105
1105
|
conversationId: "injection-mode-conv",
|
|
1106
1106
|
isNonInteractive: false,
|
|
1107
|
-
modelProfileKey:
|
|
1107
|
+
modelProfileKey: "balanced",
|
|
1108
1108
|
};
|
|
1109
1109
|
await postCompact(postCompactCtx);
|
|
1110
1110
|
const result = postCompactCtx.history;
|
|
@@ -1628,16 +1628,16 @@ describe("resolveTurnInboundActorContext", () => {
|
|
|
1628
1628
|
|
|
1629
1629
|
describe("resolveTurnModelProfileLabel", () => {
|
|
1630
1630
|
/**
|
|
1631
|
-
* A null key means
|
|
1632
|
-
*
|
|
1631
|
+
* A null notice key means there is no `model_profile` line to render this
|
|
1632
|
+
* turn.
|
|
1633
1633
|
*/
|
|
1634
|
-
test("returns null when the profile key is null", () => {
|
|
1635
|
-
// GIVEN a turn
|
|
1634
|
+
test("returns null when the profile notice key is null", () => {
|
|
1635
|
+
// GIVEN a turn without a profile notice to render
|
|
1636
1636
|
const llm = LLMSchema.parse({
|
|
1637
1637
|
default: { provider: "anthropic", model: "claude-sonnet-4-7" },
|
|
1638
1638
|
});
|
|
1639
1639
|
|
|
1640
|
-
// WHEN the label is resolved for a null key
|
|
1640
|
+
// WHEN the label is resolved for a null notice key
|
|
1641
1641
|
const label = resolveTurnModelProfileLabel(null, "mainAgent", llm);
|
|
1642
1642
|
|
|
1643
1643
|
// THEN there is no profile line to inject
|
|
@@ -19,7 +19,11 @@ mock.module("../util/logger.js", () => ({
|
|
|
19
19
|
}),
|
|
20
20
|
}));
|
|
21
21
|
|
|
22
|
-
import {
|
|
22
|
+
import {
|
|
23
|
+
getDeviceId,
|
|
24
|
+
getExistingDeviceId,
|
|
25
|
+
resetDeviceIdCache,
|
|
26
|
+
} from "../util/device-id.js";
|
|
23
27
|
|
|
24
28
|
const originalVellumEnvironment = process.env.VELLUM_ENVIRONMENT;
|
|
25
29
|
const originalXdgConfigHome = process.env.XDG_CONFIG_HOME;
|
|
@@ -179,3 +183,36 @@ describe("getDeviceId VELLUM_DEVICE_ID precedence", () => {
|
|
|
179
183
|
expect(getDeviceId()).not.toBe("env-id");
|
|
180
184
|
});
|
|
181
185
|
});
|
|
186
|
+
|
|
187
|
+
describe("getExistingDeviceId", () => {
|
|
188
|
+
beforeEach(() => {
|
|
189
|
+
delete process.env.IS_CONTAINERIZED;
|
|
190
|
+
process.env.VELLUM_ENVIRONMENT = "dev";
|
|
191
|
+
process.env.XDG_CONFIG_HOME = tempDir;
|
|
192
|
+
});
|
|
193
|
+
|
|
194
|
+
test("returns null without creating device.json when no id exists", () => {
|
|
195
|
+
const expectedPath = join(tempDir, "vellum-dev", "device.json");
|
|
196
|
+
|
|
197
|
+
expect(getExistingDeviceId()).toBeNull();
|
|
198
|
+
expect(existsSync(expectedPath)).toBe(false);
|
|
199
|
+
});
|
|
200
|
+
|
|
201
|
+
test("reads an existing device.json id", () => {
|
|
202
|
+
const dir = join(tempDir, "vellum-dev");
|
|
203
|
+
mkdirSync(dir, { recursive: true });
|
|
204
|
+
writeFileSync(
|
|
205
|
+
join(dir, "device.json"),
|
|
206
|
+
JSON.stringify({ deviceId: "file-id" }),
|
|
207
|
+
);
|
|
208
|
+
|
|
209
|
+
expect(getExistingDeviceId()).toBe("file-id");
|
|
210
|
+
});
|
|
211
|
+
|
|
212
|
+
test("returns the env override without writing device.json", () => {
|
|
213
|
+
process.env.VELLUM_DEVICE_ID = "env-id";
|
|
214
|
+
|
|
215
|
+
expect(getExistingDeviceId()).toBe("env-id");
|
|
216
|
+
expect(readdirSync(tempDir)).toEqual([]);
|
|
217
|
+
});
|
|
218
|
+
});
|
|
@@ -72,7 +72,7 @@ function makeCtx(messages: Message[]): UserPromptSubmitContext {
|
|
|
72
72
|
conversationId: "conv-test",
|
|
73
73
|
userMessageId: "msg-test",
|
|
74
74
|
requestId: "req-test",
|
|
75
|
-
modelProfileKey:
|
|
75
|
+
modelProfileKey: "balanced",
|
|
76
76
|
isNonInteractive: false,
|
|
77
77
|
prompt: "",
|
|
78
78
|
originalMessages: messages,
|
|
@@ -130,6 +130,8 @@ const BASELINE: Record<string, readonly string[]> = {
|
|
|
130
130
|
"../../../daemon/pkb-context-tracker.js",
|
|
131
131
|
"../../../daemon/pkb-reminder-builder.js",
|
|
132
132
|
"../../../daemon/trust-context.js",
|
|
133
|
+
"../../../memory/context-search/agent-runner.js",
|
|
134
|
+
"../../../memory/context-search/types.js",
|
|
133
135
|
"../../../memory/graph/bootstrap.js",
|
|
134
136
|
"../../../memory/graph/consolidation.js",
|
|
135
137
|
"../../../memory/graph/conversation-graph-memory.js",
|
|
@@ -138,6 +140,8 @@ const BASELINE: Record<string, readonly string[]> = {
|
|
|
138
140
|
"../../../memory/graph/graph-search.js",
|
|
139
141
|
"../../../memory/graph/narrative.js",
|
|
140
142
|
"../../../memory/graph/pattern-scan.js",
|
|
143
|
+
"../../../memory/graph/tool-handlers.js",
|
|
144
|
+
"../../../memory/graph/tools.js",
|
|
141
145
|
"../../../memory/job-handlers/backfill.js",
|
|
142
146
|
"../../../memory/job-handlers/embedding.js",
|
|
143
147
|
"../../../memory/job-handlers/index-maintenance.js",
|
|
@@ -152,7 +156,10 @@ const BASELINE: Record<string, readonly string[]> = {
|
|
|
152
156
|
"../../../memory/v2/consolidation-job.js",
|
|
153
157
|
"../../../memory/v2/static-context.js",
|
|
154
158
|
"../../../memory/v2/sweep-job.js",
|
|
159
|
+
"../../../permissions/types.js",
|
|
155
160
|
"../../../persistence/jobs-store.js",
|
|
161
|
+
"../../../runtime/capabilities.js",
|
|
162
|
+
"../../../tools/types.js",
|
|
156
163
|
"../../../types.js",
|
|
157
164
|
"../../../util/logger.js",
|
|
158
165
|
"../../../util/platform.js",
|