@vybestack/llxprt-code 0.4.8 → 0.5.0-nightly.251102.6bb3db7a
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/dist/package.json +5 -3
- package/dist/src/auth/__tests__/oauthManager.safety.test.d.ts +6 -0
- package/dist/src/auth/__tests__/oauthManager.safety.test.js +49 -0
- package/dist/src/auth/__tests__/oauthManager.safety.test.js.map +1 -0
- package/dist/src/auth/oauth-manager.d.ts +11 -0
- package/dist/src/auth/oauth-manager.js +62 -29
- package/dist/src/auth/oauth-manager.js.map +1 -1
- package/dist/src/auth/oauth-manager.spec.js +7 -2
- package/dist/src/auth/oauth-manager.spec.js.map +1 -1
- package/dist/src/config/__tests__/nonInteractiveTools.test.d.ts +6 -0
- package/dist/src/config/__tests__/nonInteractiveTools.test.js +13 -0
- package/dist/src/config/__tests__/nonInteractiveTools.test.js.map +1 -0
- package/dist/src/config/__tests__/profileBootstrap.test.d.ts +6 -0
- package/dist/src/config/__tests__/profileBootstrap.test.js +91 -0
- package/dist/src/config/__tests__/profileBootstrap.test.js.map +1 -0
- package/dist/src/config/config.d.ts +6 -2
- package/dist/src/config/config.js +219 -18
- package/dist/src/config/config.js.map +1 -1
- package/dist/src/config/profileBootstrap.d.ts +64 -0
- package/dist/src/config/profileBootstrap.js +140 -0
- package/dist/src/config/profileBootstrap.js.map +1 -0
- package/dist/src/gemini.js +68 -23
- package/dist/src/gemini.js.map +1 -1
- package/dist/src/gemini.test.js +1 -2
- package/dist/src/gemini.test.js.map +1 -1
- package/dist/src/generated/git-commit.d.ts +1 -1
- package/dist/src/generated/git-commit.js +1 -1
- package/dist/src/integration-tests/base-url-behavior.integration.test.js +110 -450
- package/dist/src/integration-tests/base-url-behavior.integration.test.js.map +1 -1
- package/dist/src/integration-tests/model-params-isolation.integration.test.js +101 -539
- package/dist/src/integration-tests/model-params-isolation.integration.test.js.map +1 -1
- package/dist/src/integration-tests/modelParams.integration.test.js +86 -761
- package/dist/src/integration-tests/modelParams.integration.test.js.map +1 -1
- package/dist/src/integration-tests/provider-multi-runtime.integration.test.d.ts +6 -0
- package/dist/src/integration-tests/provider-multi-runtime.integration.test.js +198 -0
- package/dist/src/integration-tests/provider-multi-runtime.integration.test.js.map +1 -0
- package/dist/src/integration-tests/provider-switching.integration.test.js +97 -151
- package/dist/src/integration-tests/provider-switching.integration.test.js.map +1 -1
- package/dist/src/integration-tests/runtime-isolation.test.d.ts +13 -0
- package/dist/src/integration-tests/runtime-isolation.test.js +170 -0
- package/dist/src/integration-tests/runtime-isolation.test.js.map +1 -0
- package/dist/src/integration-tests/test-utils.js +19 -2
- package/dist/src/integration-tests/test-utils.js.map +1 -1
- package/dist/src/integration-tests/test-utils.test.js +9 -8
- package/dist/src/integration-tests/test-utils.test.js.map +1 -1
- package/dist/src/integration-tests/todo-continuation.integration.test.js +5 -2
- package/dist/src/integration-tests/todo-continuation.integration.test.js.map +1 -1
- package/dist/src/integration-tests/tools-governance.integration.test.d.ts +6 -0
- package/dist/src/integration-tests/tools-governance.integration.test.js +98 -0
- package/dist/src/integration-tests/tools-governance.integration.test.js.map +1 -0
- package/dist/src/nonInteractiveCli.js +36 -11
- package/dist/src/nonInteractiveCli.js.map +1 -1
- package/dist/src/providers/logging/git-stats.test.js +11 -1
- package/dist/src/providers/logging/git-stats.test.js.map +1 -1
- package/dist/src/providers/logging/multi-provider-logging.integration.test.js +1 -2
- package/dist/src/providers/logging/multi-provider-logging.integration.test.js.map +1 -1
- package/dist/src/providers/logging/performance.test.js +1 -1
- package/dist/src/providers/logging/performance.test.js.map +1 -1
- package/dist/src/providers/oauth-provider-registration.d.ts +2 -2
- package/dist/src/providers/oauth-provider-registration.js +25 -9
- package/dist/src/providers/oauth-provider-registration.js.map +1 -1
- package/dist/src/providers/provider-gemini-switching.test.js +67 -89
- package/dist/src/providers/provider-gemini-switching.test.js.map +1 -1
- package/dist/src/providers/provider-switching.integration.test.js +42 -98
- package/dist/src/providers/provider-switching.integration.test.js.map +1 -1
- package/dist/src/providers/providerConfigUtils.d.ts +12 -7
- package/dist/src/providers/providerConfigUtils.js +31 -99
- package/dist/src/providers/providerConfigUtils.js.map +1 -1
- package/dist/src/providers/providerManagerInstance.d.ts +17 -1
- package/dist/src/providers/providerManagerInstance.js +157 -175
- package/dist/src/providers/providerManagerInstance.js.map +1 -1
- package/dist/src/providers/providerManagerInstance.oauthRegistration.test.js +19 -15
- package/dist/src/providers/providerManagerInstance.oauthRegistration.test.js.map +1 -1
- package/dist/src/providers/providerManagerInstance.test.js +2 -5
- package/dist/src/providers/providerManagerInstance.test.js.map +1 -1
- package/dist/src/runtime/__tests__/profileApplication.test.d.ts +5 -0
- package/dist/src/runtime/__tests__/profileApplication.test.js +232 -0
- package/dist/src/runtime/__tests__/profileApplication.test.js.map +1 -0
- package/dist/src/runtime/__tests__/runtimeIsolation.test.d.ts +5 -0
- package/dist/src/runtime/__tests__/runtimeIsolation.test.js +376 -0
- package/dist/src/runtime/__tests__/runtimeIsolation.test.js.map +1 -0
- package/dist/src/runtime/agentRuntimeAdapter.d.ts +249 -0
- package/dist/src/runtime/agentRuntimeAdapter.js +506 -0
- package/dist/src/runtime/agentRuntimeAdapter.js.map +1 -0
- package/dist/src/runtime/agentRuntimeAdapter.spec.d.ts +6 -0
- package/dist/src/runtime/agentRuntimeAdapter.spec.js +866 -0
- package/dist/src/runtime/agentRuntimeAdapter.spec.js.map +1 -0
- package/dist/src/runtime/messages.d.ts +28 -0
- package/dist/src/runtime/messages.js +64 -0
- package/dist/src/runtime/messages.js.map +1 -0
- package/dist/src/runtime/profileApplication.d.ts +33 -0
- package/dist/src/runtime/profileApplication.js +191 -0
- package/dist/src/runtime/profileApplication.js.map +1 -0
- package/dist/src/runtime/providerConfigUtils.test.d.ts +1 -0
- package/dist/src/runtime/providerConfigUtils.test.js +68 -0
- package/dist/src/runtime/providerConfigUtils.test.js.map +1 -0
- package/dist/src/runtime/runtimeContextFactory.d.ts +102 -0
- package/dist/src/runtime/runtimeContextFactory.js +190 -0
- package/dist/src/runtime/runtimeContextFactory.js.map +1 -0
- package/dist/src/runtime/runtimeSettings.d.ts +217 -0
- package/dist/src/runtime/runtimeSettings.js +1094 -0
- package/dist/src/runtime/runtimeSettings.js.map +1 -0
- package/dist/src/runtime/runtimeSettings.test.d.ts +1 -0
- package/dist/src/runtime/runtimeSettings.test.js +320 -0
- package/dist/src/runtime/runtimeSettings.test.js.map +1 -0
- package/dist/src/services/BuiltinCommandLoader.d.ts +13 -4
- package/dist/src/services/BuiltinCommandLoader.js +17 -4
- package/dist/src/services/BuiltinCommandLoader.js.map +1 -1
- package/dist/src/services/McpPromptLoader.js +34 -13
- package/dist/src/services/McpPromptLoader.js.map +1 -1
- package/dist/src/test-utils/mockCommandContext.js +5 -2
- package/dist/src/test-utils/mockCommandContext.js.map +1 -1
- package/dist/src/ui/App.js +29 -49
- package/dist/src/ui/App.js.map +1 -1
- package/dist/src/ui/commands/aboutCommand.js +59 -38
- package/dist/src/ui/commands/aboutCommand.js.map +1 -1
- package/dist/src/ui/commands/authCommand.js +7 -9
- package/dist/src/ui/commands/authCommand.js.map +1 -1
- package/dist/src/ui/commands/baseurlCommand.js +8 -44
- package/dist/src/ui/commands/baseurlCommand.js.map +1 -1
- package/dist/src/ui/commands/chatCommand.js +28 -12
- package/dist/src/ui/commands/chatCommand.js.map +1 -1
- package/dist/src/ui/commands/diagnosticsCommand.d.ts +0 -3
- package/dist/src/ui/commands/diagnosticsCommand.js +45 -191
- package/dist/src/ui/commands/diagnosticsCommand.js.map +1 -1
- package/dist/src/ui/commands/keyCommand.js +9 -58
- package/dist/src/ui/commands/keyCommand.js.map +1 -1
- package/dist/src/ui/commands/keyCommand.test.js +48 -102
- package/dist/src/ui/commands/keyCommand.test.js.map +1 -1
- package/dist/src/ui/commands/keyfileCommand.js +42 -93
- package/dist/src/ui/commands/keyfileCommand.js.map +1 -1
- package/dist/src/ui/commands/logoutCommand.js +2 -2
- package/dist/src/ui/commands/logoutCommand.js.map +1 -1
- package/dist/src/ui/commands/mcpCommand.js +29 -7
- package/dist/src/ui/commands/mcpCommand.js.map +1 -1
- package/dist/src/ui/commands/modelCommand.js +8 -59
- package/dist/src/ui/commands/modelCommand.js.map +1 -1
- package/dist/src/ui/commands/profileCommand.js +151 -267
- package/dist/src/ui/commands/profileCommand.js.map +1 -1
- package/dist/src/ui/commands/profileCommand.test.js +88 -344
- package/dist/src/ui/commands/profileCommand.test.js.map +1 -1
- package/dist/src/ui/commands/providerCommand.js +9 -3
- package/dist/src/ui/commands/providerCommand.js.map +1 -1
- package/dist/src/ui/commands/restoreCommand.js +38 -18
- package/dist/src/ui/commands/restoreCommand.js.map +1 -1
- package/dist/src/ui/commands/schema/argumentResolver.test.d.ts +6 -0
- package/dist/src/ui/commands/schema/argumentResolver.test.js +619 -0
- package/dist/src/ui/commands/schema/argumentResolver.test.js.map +1 -0
- package/dist/src/ui/commands/schema/index.d.ts +15 -0
- package/dist/src/ui/commands/schema/index.js +320 -0
- package/dist/src/ui/commands/schema/index.js.map +1 -0
- package/dist/src/ui/commands/schema/types.d.ts +61 -0
- package/dist/src/ui/commands/schema/types.js +12 -0
- package/dist/src/ui/commands/schema/types.js.map +1 -0
- package/dist/src/ui/commands/setCommand.js +641 -325
- package/dist/src/ui/commands/setCommand.js.map +1 -1
- package/dist/src/ui/commands/setCommand.test.js +92 -388
- package/dist/src/ui/commands/setCommand.test.js.map +1 -1
- package/dist/src/ui/commands/statusCommand.js +2 -2
- package/dist/src/ui/commands/statusCommand.js.map +1 -1
- package/dist/src/ui/commands/subagentCommand.d.ts +16 -0
- package/dist/src/ui/commands/subagentCommand.js +674 -0
- package/dist/src/ui/commands/subagentCommand.js.map +1 -0
- package/dist/src/ui/commands/test/setCommand.mutation.test.d.ts +6 -0
- package/dist/src/ui/commands/test/setCommand.mutation.test.js +132 -0
- package/dist/src/ui/commands/test/setCommand.mutation.test.js.map +1 -0
- package/dist/src/ui/commands/test/setCommand.phase09.test.d.ts +6 -0
- package/dist/src/ui/commands/test/setCommand.phase09.test.js +222 -0
- package/dist/src/ui/commands/test/setCommand.phase09.test.js.map +1 -0
- package/dist/src/ui/commands/test/subagentCommand.schema.test.d.ts +6 -0
- package/dist/src/ui/commands/test/subagentCommand.schema.test.js +125 -0
- package/dist/src/ui/commands/test/subagentCommand.schema.test.js.map +1 -0
- package/dist/src/ui/commands/test/subagentCommand.test.d.ts +1 -0
- package/dist/src/ui/commands/test/subagentCommand.test.js +598 -0
- package/dist/src/ui/commands/test/subagentCommand.test.js.map +1 -0
- package/dist/src/ui/commands/toolformatCommand.js +25 -98
- package/dist/src/ui/commands/toolformatCommand.js.map +1 -1
- package/dist/src/ui/commands/toolformatCommand.test.js +56 -102
- package/dist/src/ui/commands/toolformatCommand.test.js.map +1 -1
- package/dist/src/ui/commands/toolsCommand.js +187 -31
- package/dist/src/ui/commands/toolsCommand.js.map +1 -1
- package/dist/src/ui/commands/types.d.ts +11 -2
- package/dist/src/ui/commands/types.js.map +1 -1
- package/dist/src/ui/components/AuthDialog.js +16 -55
- package/dist/src/ui/components/AuthDialog.js.map +1 -1
- package/dist/src/ui/components/Footer.js +4 -5
- package/dist/src/ui/components/Footer.js.map +1 -1
- package/dist/src/ui/components/HistoryItemDisplay.js +1 -1
- package/dist/src/ui/components/HistoryItemDisplay.js.map +1 -1
- package/dist/src/ui/components/InputPrompt.js +1 -1
- package/dist/src/ui/components/InputPrompt.js.map +1 -1
- package/dist/src/ui/components/StatsDisplay.js +6 -11
- package/dist/src/ui/components/StatsDisplay.js.map +1 -1
- package/dist/src/ui/components/SuggestionsDisplay.d.ts +13 -1
- package/dist/src/ui/components/SuggestionsDisplay.js +22 -3
- package/dist/src/ui/components/SuggestionsDisplay.js.map +1 -1
- package/dist/src/ui/components/messages/ToolGroupMessage.d.ts +1 -0
- package/dist/src/ui/components/messages/ToolGroupMessage.js +14 -14
- package/dist/src/ui/components/messages/ToolGroupMessage.js.map +1 -1
- package/dist/src/ui/components/messages/ToolGroupMessage.test.js +1 -0
- package/dist/src/ui/components/messages/ToolGroupMessage.test.js.map +1 -1
- package/dist/src/ui/containers/SessionController.js +61 -117
- package/dist/src/ui/containers/SessionController.js.map +1 -1
- package/dist/src/ui/contexts/RuntimeContext.d.ts +61 -0
- package/dist/src/ui/contexts/RuntimeContext.js +118 -0
- package/dist/src/ui/contexts/RuntimeContext.js.map +1 -0
- package/dist/src/ui/contexts/TodoProvider.d.ts +1 -0
- package/dist/src/ui/contexts/TodoProvider.js +10 -8
- package/dist/src/ui/contexts/TodoProvider.js.map +1 -1
- package/dist/src/ui/contexts/ToolCallProvider.d.ts +1 -0
- package/dist/src/ui/contexts/ToolCallProvider.js +10 -9
- package/dist/src/ui/contexts/ToolCallProvider.js.map +1 -1
- package/dist/src/ui/hooks/__tests__/useSlashCompletion.set.phase09.test.d.ts +6 -0
- package/dist/src/ui/hooks/__tests__/useSlashCompletion.set.phase09.test.js +39 -0
- package/dist/src/ui/hooks/__tests__/useSlashCompletion.set.phase09.test.js.map +1 -0
- package/dist/src/ui/hooks/atCommandProcessor.js +11 -3
- package/dist/src/ui/hooks/atCommandProcessor.js.map +1 -1
- package/dist/src/ui/hooks/atCommandProcessor.test.js +3 -1
- package/dist/src/ui/hooks/atCommandProcessor.test.js.map +1 -1
- package/dist/src/ui/hooks/shellCommandProcessor.js +4 -1
- package/dist/src/ui/hooks/shellCommandProcessor.js.map +1 -1
- package/dist/src/ui/hooks/shellCommandProcessor.test.js +1 -0
- package/dist/src/ui/hooks/shellCommandProcessor.test.js.map +1 -1
- package/dist/src/ui/hooks/slashCommandProcessor.js +27 -1
- package/dist/src/ui/hooks/slashCommandProcessor.js.map +1 -1
- package/dist/src/ui/hooks/useAuthCommand.js +11 -3
- package/dist/src/ui/hooks/useAuthCommand.js.map +1 -1
- package/dist/src/ui/hooks/useCommandCompletion.d.ts +1 -0
- package/dist/src/ui/hooks/useCommandCompletion.js +2 -0
- package/dist/src/ui/hooks/useCommandCompletion.js.map +1 -1
- package/dist/src/ui/hooks/useGeminiStream.js +37 -11
- package/dist/src/ui/hooks/useGeminiStream.js.map +1 -1
- package/dist/src/ui/hooks/useGeminiStream.subagent.spec.d.ts +6 -0
- package/dist/src/ui/hooks/useGeminiStream.subagent.spec.js +232 -0
- package/dist/src/ui/hooks/useGeminiStream.subagent.spec.js.map +1 -0
- package/dist/src/ui/hooks/useLoadProfileDialog.d.ts +1 -1
- package/dist/src/ui/hooks/useLoadProfileDialog.js +18 -57
- package/dist/src/ui/hooks/useLoadProfileDialog.js.map +1 -1
- package/dist/src/ui/hooks/useOpenAIProviderInfo.d.ts +1 -1
- package/dist/src/ui/hooks/useOpenAIProviderInfo.js +12 -7
- package/dist/src/ui/hooks/useOpenAIProviderInfo.js.map +1 -1
- package/dist/src/ui/hooks/useProviderDialog.d.ts +1 -1
- package/dist/src/ui/hooks/useProviderDialog.js +17 -90
- package/dist/src/ui/hooks/useProviderDialog.js.map +1 -1
- package/dist/src/ui/hooks/useProviderModelDialog.d.ts +2 -2
- package/dist/src/ui/hooks/useProviderModelDialog.js +11 -12
- package/dist/src/ui/hooks/useProviderModelDialog.js.map +1 -1
- package/dist/src/ui/hooks/useReactToolScheduler.d.ts +3 -1
- package/dist/src/ui/hooks/useReactToolScheduler.js +144 -34
- package/dist/src/ui/hooks/useReactToolScheduler.js.map +1 -1
- package/dist/src/ui/hooks/useSlashCompletion.d.ts +32 -0
- package/dist/src/ui/hooks/useSlashCompletion.js +154 -77
- package/dist/src/ui/hooks/useSlashCompletion.js.map +1 -1
- package/dist/src/ui/hooks/useSlashCompletion.test.js +39 -14
- package/dist/src/ui/hooks/useSlashCompletion.test.js.map +1 -1
- package/dist/src/ui/hooks/useToolScheduler.test.js +108 -79
- package/dist/src/ui/hooks/useToolScheduler.test.js.map +1 -1
- package/dist/src/ui/types.d.ts +1 -0
- package/dist/src/ui/types.js.map +1 -1
- package/dist/src/utils/sandbox.js +7 -5
- package/dist/src/utils/sandbox.js.map +1 -1
- package/dist/src/validateNonInterActiveAuth.js +4 -2
- package/dist/src/validateNonInterActiveAuth.js.map +1 -1
- package/dist/src/zed-integration/schema.d.ts +30 -30
- package/dist/src/zed-integration/zedIntegration.js +112 -39
- package/dist/src/zed-integration/zedIntegration.js.map +1 -1
- package/dist/tsconfig.build.tsbuildinfo +1 -0
- package/package.json +5 -3
- package/dist/tsconfig.tsbuildinfo +0 -1
|
@@ -0,0 +1,598 @@
|
|
|
1
|
+
import { vi, describe, it, expect, beforeEach, afterEach, beforeAll, } from 'vitest';
|
|
2
|
+
vi.mock('child_process');
|
|
3
|
+
const runWithScopeMock = vi.fn((callback) => callback());
|
|
4
|
+
const getRuntimeBridgeMock = vi.fn(() => ({
|
|
5
|
+
runWithScope: runWithScopeMock,
|
|
6
|
+
}));
|
|
7
|
+
vi.mock('../contexts/RuntimeContext.js', () => ({
|
|
8
|
+
getRuntimeBridge: getRuntimeBridgeMock,
|
|
9
|
+
}));
|
|
10
|
+
/**
|
|
11
|
+
* COMPLETION SYSTEM REQUIREMENTS
|
|
12
|
+
*
|
|
13
|
+
* These tests require Phase 01 to have resolved autocomplete system capabilities.
|
|
14
|
+
*
|
|
15
|
+
* Findings from Phase 01:
|
|
16
|
+
* - Autocomplete feasibility documented (see findings.md)
|
|
17
|
+
* - Required file changes identified for fullLine support
|
|
18
|
+
* - No production code modified yet
|
|
19
|
+
*
|
|
20
|
+
* If Phase 01 blocked on autocomplete:
|
|
21
|
+
* - These tests should not be written until blocker resolved
|
|
22
|
+
* - Plan should be paused at Phase 01
|
|
23
|
+
*
|
|
24
|
+
* See: project-plans/subagentconfig/analysis/findings.md for Phase 01 results
|
|
25
|
+
*/
|
|
26
|
+
import * as fs from 'fs/promises';
|
|
27
|
+
import { writeFileSync } from 'fs';
|
|
28
|
+
import * as path from 'path';
|
|
29
|
+
import * as os from 'os';
|
|
30
|
+
import { SubagentManager, ProfileManager, } from '@vybestack/llxprt-code-core';
|
|
31
|
+
import { FunctionCallingConfigMode } from '@google/genai';
|
|
32
|
+
import { spawnSync } from 'child_process';
|
|
33
|
+
let subagentCommand;
|
|
34
|
+
beforeAll(async () => {
|
|
35
|
+
// Reset modules to ensure fresh import with mocks
|
|
36
|
+
vi.resetModules();
|
|
37
|
+
// Set up default mock behavior for spawnSync
|
|
38
|
+
vi.mocked(spawnSync).mockImplementation(() => ({
|
|
39
|
+
pid: 12345,
|
|
40
|
+
output: [null, null, null],
|
|
41
|
+
stdout: Buffer.from(''),
|
|
42
|
+
stderr: Buffer.from(''),
|
|
43
|
+
status: 0,
|
|
44
|
+
signal: null,
|
|
45
|
+
error: undefined,
|
|
46
|
+
}));
|
|
47
|
+
// Import AFTER mock is set up
|
|
48
|
+
const mod = await import('../subagentCommand.js?t=' + Date.now());
|
|
49
|
+
subagentCommand = mod.subagentCommand;
|
|
50
|
+
});
|
|
51
|
+
const createTestContext = ({ subagentManager, profileManager, overwriteConfirmed, } = {}) => {
|
|
52
|
+
const settings = { merged: {} };
|
|
53
|
+
const logger = {
|
|
54
|
+
log: vi.fn(),
|
|
55
|
+
logMessage: vi.fn(),
|
|
56
|
+
saveCheckpoint: vi.fn(),
|
|
57
|
+
loadCheckpoint: vi.fn().mockResolvedValue([]),
|
|
58
|
+
};
|
|
59
|
+
const metrics = {
|
|
60
|
+
models: {},
|
|
61
|
+
tools: {
|
|
62
|
+
totalCalls: 0,
|
|
63
|
+
totalSuccess: 0,
|
|
64
|
+
totalFail: 0,
|
|
65
|
+
totalDurationMs: 0,
|
|
66
|
+
totalDecisions: {
|
|
67
|
+
accept: 0,
|
|
68
|
+
reject: 0,
|
|
69
|
+
modify: 0,
|
|
70
|
+
auto_accept: 0,
|
|
71
|
+
},
|
|
72
|
+
byName: {},
|
|
73
|
+
},
|
|
74
|
+
files: {
|
|
75
|
+
totalLinesAdded: 0,
|
|
76
|
+
totalLinesRemoved: 0,
|
|
77
|
+
},
|
|
78
|
+
tokenTracking: {
|
|
79
|
+
tokensPerMinute: 0,
|
|
80
|
+
throttleWaitTimeMs: 0,
|
|
81
|
+
sessionTokenUsage: {
|
|
82
|
+
input: 0,
|
|
83
|
+
output: 0,
|
|
84
|
+
cache: 0,
|
|
85
|
+
tool: 0,
|
|
86
|
+
thought: 0,
|
|
87
|
+
total: 0,
|
|
88
|
+
},
|
|
89
|
+
},
|
|
90
|
+
};
|
|
91
|
+
const stats = {
|
|
92
|
+
sessionId: 'test-session',
|
|
93
|
+
sessionStartTime: new Date(),
|
|
94
|
+
metrics,
|
|
95
|
+
lastPromptTokenCount: 0,
|
|
96
|
+
historyTokenCount: 0,
|
|
97
|
+
promptCount: 0,
|
|
98
|
+
};
|
|
99
|
+
return {
|
|
100
|
+
invocation: {
|
|
101
|
+
raw: '',
|
|
102
|
+
name: '',
|
|
103
|
+
args: '',
|
|
104
|
+
},
|
|
105
|
+
services: {
|
|
106
|
+
config: null,
|
|
107
|
+
settings,
|
|
108
|
+
git: undefined,
|
|
109
|
+
logger,
|
|
110
|
+
profileManager,
|
|
111
|
+
subagentManager,
|
|
112
|
+
},
|
|
113
|
+
ui: {
|
|
114
|
+
addItem: vi.fn(),
|
|
115
|
+
clear: vi.fn(),
|
|
116
|
+
setDebugMessage: vi.fn(),
|
|
117
|
+
pendingItem: null,
|
|
118
|
+
setPendingItem: vi.fn(),
|
|
119
|
+
loadHistory: vi.fn(),
|
|
120
|
+
toggleCorgiMode: vi.fn(),
|
|
121
|
+
toggleVimEnabled: vi.fn().mockResolvedValue(true),
|
|
122
|
+
setLlxprtMdFileCount: vi.fn(),
|
|
123
|
+
updateHistoryTokenCount: vi.fn(),
|
|
124
|
+
reloadCommands: vi.fn(),
|
|
125
|
+
},
|
|
126
|
+
session: {
|
|
127
|
+
stats,
|
|
128
|
+
sessionShellAllowlist: new Set(),
|
|
129
|
+
},
|
|
130
|
+
overwriteConfirmed: overwriteConfirmed ?? false,
|
|
131
|
+
};
|
|
132
|
+
};
|
|
133
|
+
const ensureMessage = (value) => {
|
|
134
|
+
expect(value).toBeDefined();
|
|
135
|
+
expect(value?.type).toBe('message');
|
|
136
|
+
if (!value || value.type !== 'message') {
|
|
137
|
+
throw new Error('Expected message action return');
|
|
138
|
+
}
|
|
139
|
+
return value;
|
|
140
|
+
};
|
|
141
|
+
const ensureConfirm = (value) => {
|
|
142
|
+
expect(value).toBeDefined();
|
|
143
|
+
expect(value?.type).toBe('confirm_action');
|
|
144
|
+
if (!value || value.type !== 'confirm_action') {
|
|
145
|
+
throw new Error('Expected confirm action return');
|
|
146
|
+
}
|
|
147
|
+
return value;
|
|
148
|
+
};
|
|
149
|
+
/**
|
|
150
|
+
* SubagentCommand behavioral tests - Basic commands
|
|
151
|
+
*
|
|
152
|
+
* @plan:PLAN-20250117-SUBAGENTCONFIG.P07
|
|
153
|
+
* @requirement:REQ-004, REQ-005, REQ-006, REQ-007, REQ-014
|
|
154
|
+
*
|
|
155
|
+
* Tests verify command interactions with SubagentManager
|
|
156
|
+
* Mock GeminiClient, use real file system
|
|
157
|
+
*/
|
|
158
|
+
describe('subagentCommand - basic @plan:PLAN-20250117-SUBAGENTCONFIG.P07', () => {
|
|
159
|
+
let context;
|
|
160
|
+
let subagentManager;
|
|
161
|
+
let profileManager;
|
|
162
|
+
let tempDir;
|
|
163
|
+
beforeEach(async () => {
|
|
164
|
+
// Create temp directories
|
|
165
|
+
tempDir = await fs.mkdtemp(path.join(os.tmpdir(), 'subagent-cmd-test-'));
|
|
166
|
+
const subagentsDir = path.join(tempDir, 'subagents');
|
|
167
|
+
const profilesDir = path.join(tempDir, 'profiles');
|
|
168
|
+
// Initialize managers
|
|
169
|
+
profileManager = new ProfileManager(profilesDir);
|
|
170
|
+
subagentManager = new SubagentManager(subagentsDir, profileManager);
|
|
171
|
+
// Create test profile
|
|
172
|
+
await fs.mkdir(profilesDir, { recursive: true });
|
|
173
|
+
await profileManager.saveProfile('testprofile', {
|
|
174
|
+
version: 1,
|
|
175
|
+
provider: 'openai',
|
|
176
|
+
model: 'gpt-4',
|
|
177
|
+
modelParams: {},
|
|
178
|
+
ephemeralSettings: {},
|
|
179
|
+
});
|
|
180
|
+
context = createTestContext({
|
|
181
|
+
profileManager,
|
|
182
|
+
subagentManager,
|
|
183
|
+
});
|
|
184
|
+
});
|
|
185
|
+
afterEach(async () => {
|
|
186
|
+
await fs.rm(tempDir, { recursive: true, force: true });
|
|
187
|
+
runWithScopeMock.mockClear();
|
|
188
|
+
getRuntimeBridgeMock.mockClear();
|
|
189
|
+
});
|
|
190
|
+
describe('saveCommand - manual mode @requirement:REQ-004', () => {
|
|
191
|
+
it('should save new subagent with manual mode', async () => {
|
|
192
|
+
const args = 'testagent testprofile manual "You are a test agent"';
|
|
193
|
+
const result = ensureMessage(await subagentCommand.subCommands[0].action(context, args));
|
|
194
|
+
expect(result.messageType).toBe('info');
|
|
195
|
+
expect(result.content).toMatch(/created successfully/i);
|
|
196
|
+
// Verify subagent was saved
|
|
197
|
+
const exists = await subagentManager.subagentExists('testagent');
|
|
198
|
+
expect(exists).toBe(true);
|
|
199
|
+
const loaded = await subagentManager.loadSubagent('testagent');
|
|
200
|
+
expect(loaded.profile).toBe('testprofile');
|
|
201
|
+
expect(loaded.systemPrompt).toBe('You are a test agent');
|
|
202
|
+
});
|
|
203
|
+
it('should reject invalid syntax', async () => {
|
|
204
|
+
const invalidArgs = [
|
|
205
|
+
'testagent', // Missing profile and mode
|
|
206
|
+
'testagent testprofile', // Missing mode and prompt
|
|
207
|
+
'testagent testprofile manual', // Missing prompt
|
|
208
|
+
'testagent testprofile invalid "prompt"', // Invalid mode
|
|
209
|
+
];
|
|
210
|
+
for (const args of invalidArgs) {
|
|
211
|
+
const result = ensureMessage(await subagentCommand.subCommands[0].action(context, args));
|
|
212
|
+
expect(result.messageType).toBe('error');
|
|
213
|
+
expect(result.content).toMatch(/usage|syntax/i);
|
|
214
|
+
}
|
|
215
|
+
});
|
|
216
|
+
it('should error when subagentManager service missing', async () => {
|
|
217
|
+
const contextWithoutManager = createTestContext({
|
|
218
|
+
profileManager,
|
|
219
|
+
subagentManager: undefined,
|
|
220
|
+
});
|
|
221
|
+
const result = ensureMessage(await subagentCommand.subCommands[0].action(contextWithoutManager, 'testagent testprofile manual "Prompt"'));
|
|
222
|
+
expect(result.messageType).toBe('error');
|
|
223
|
+
expect(result.content).toMatch(/service .* unavailable/i);
|
|
224
|
+
});
|
|
225
|
+
it('should reject non-existent profile @requirement:REQ-013', async () => {
|
|
226
|
+
const args = 'testagent nonexistent manual "prompt"';
|
|
227
|
+
const result = ensureMessage(await subagentCommand.subCommands[0].action(context, args));
|
|
228
|
+
expect(result.messageType).toBe('error');
|
|
229
|
+
expect(result.content).toMatch(/profile.*not found/i);
|
|
230
|
+
});
|
|
231
|
+
it('should prompt for confirmation on overwrite @requirement:REQ-014', async () => {
|
|
232
|
+
// Create existing subagent
|
|
233
|
+
await subagentManager.saveSubagent('testagent', 'testprofile', 'Original prompt');
|
|
234
|
+
// Try to overwrite without confirmation
|
|
235
|
+
const args = 'testagent testprofile manual "New prompt"';
|
|
236
|
+
const result = ensureConfirm(await subagentCommand.subCommands[0].action(context, args));
|
|
237
|
+
// Check that prompt is a React element
|
|
238
|
+
expect(result).toHaveProperty('prompt');
|
|
239
|
+
expect(result.prompt).toBeDefined();
|
|
240
|
+
expect(result.originalInvocation).toBeDefined();
|
|
241
|
+
});
|
|
242
|
+
it('should overwrite when confirmed', async () => {
|
|
243
|
+
// Create existing subagent
|
|
244
|
+
await subagentManager.saveSubagent('testagent', 'testprofile', 'Original prompt');
|
|
245
|
+
// Set confirmation flag
|
|
246
|
+
context.overwriteConfirmed = true;
|
|
247
|
+
const args = 'testagent testprofile manual "New prompt"';
|
|
248
|
+
const result = ensureMessage(await subagentCommand.subCommands[0].action(context, args));
|
|
249
|
+
expect(result.messageType).toBe('info');
|
|
250
|
+
expect(result.content).toMatch(/updated successfully/i);
|
|
251
|
+
// Verify updated
|
|
252
|
+
const loaded = await subagentManager.loadSubagent('testagent');
|
|
253
|
+
expect(loaded.systemPrompt).toBe('New prompt');
|
|
254
|
+
});
|
|
255
|
+
});
|
|
256
|
+
describe('listCommand @requirement:REQ-005 @plan:PLAN-20250117-SUBAGENTCONFIG.P07', () => {
|
|
257
|
+
it('should show message when no subagents exist', async () => {
|
|
258
|
+
// Mock listSubagents to return empty array
|
|
259
|
+
// Use real SubagentManager for this test
|
|
260
|
+
context = createTestContext({
|
|
261
|
+
profileManager,
|
|
262
|
+
subagentManager,
|
|
263
|
+
});
|
|
264
|
+
const result = ensureMessage(await subagentCommand.subCommands[1].action(context, ''));
|
|
265
|
+
expect(result.messageType).toBe('info');
|
|
266
|
+
expect(result.content).toMatch(/no subagents found/i);
|
|
267
|
+
});
|
|
268
|
+
it('should list all subagents with details', async () => {
|
|
269
|
+
// Create multiple subagents
|
|
270
|
+
await subagentManager.saveSubagent('agent1', 'testprofile', 'Prompt 1');
|
|
271
|
+
await subagentManager.saveSubagent('agent2', 'testprofile', 'Prompt 2');
|
|
272
|
+
const result = ensureMessage(await subagentCommand.subCommands[1].action(context, ''));
|
|
273
|
+
expect(result.messageType).toBe('info');
|
|
274
|
+
expect(result.content).toMatch(/agent1/);
|
|
275
|
+
expect(result.content).toMatch(/agent2/);
|
|
276
|
+
expect(result.content).toMatch(/testprofile/);
|
|
277
|
+
});
|
|
278
|
+
});
|
|
279
|
+
describe('showCommand @requirement:REQ-006 @plan:PLAN-20250117-SUBAGENTCONFIG.P07', () => {
|
|
280
|
+
it('should display full subagent configuration', async () => {
|
|
281
|
+
await subagentManager.saveSubagent('testagent', 'testprofile', 'Test system prompt');
|
|
282
|
+
const result = ensureMessage(await subagentCommand.subCommands[2].action(context, 'testagent'));
|
|
283
|
+
expect(result.messageType).toBe('info');
|
|
284
|
+
expect(result.content).toMatch(/testagent/);
|
|
285
|
+
expect(result.content).toMatch(/testprofile/);
|
|
286
|
+
expect(result.content).toMatch(/Test system prompt/);
|
|
287
|
+
});
|
|
288
|
+
it('should error for non-existent subagent', async () => {
|
|
289
|
+
const result = ensureMessage(await subagentCommand.subCommands[2].action(context, 'nonexistent'));
|
|
290
|
+
expect(result.messageType).toBe('error');
|
|
291
|
+
expect(result.content).toMatch(/not found/i);
|
|
292
|
+
});
|
|
293
|
+
it('should error when name not provided', async () => {
|
|
294
|
+
const result = ensureMessage(await subagentCommand.subCommands[2].action(context, ''));
|
|
295
|
+
expect(result.messageType).toBe('error');
|
|
296
|
+
expect(result.content).toMatch(/usage|name required/i);
|
|
297
|
+
});
|
|
298
|
+
});
|
|
299
|
+
describe('deleteCommand @requirement:REQ-007 @plan:PLAN-20250117-SUBAGENTCONFIG.P07', () => {
|
|
300
|
+
it('should delete subagent with confirmation', async () => {
|
|
301
|
+
await subagentManager.saveSubagent('testagent', 'testprofile', 'Test prompt');
|
|
302
|
+
// First call: should prompt for confirmation
|
|
303
|
+
ensureConfirm(await subagentCommand.subCommands[3].action(context, 'testagent'));
|
|
304
|
+
// Second call: with confirmation
|
|
305
|
+
context.overwriteConfirmed = true;
|
|
306
|
+
const result2 = ensureMessage(await subagentCommand.subCommands[3].action(context, 'testagent'));
|
|
307
|
+
expect(result2.messageType).toBe('info');
|
|
308
|
+
expect(result2.content).toMatch(/deleted/i);
|
|
309
|
+
// Verify deleted
|
|
310
|
+
const exists = await subagentManager.subagentExists('testagent');
|
|
311
|
+
expect(exists).toBe(false);
|
|
312
|
+
});
|
|
313
|
+
it('should error for non-existent subagent', async () => {
|
|
314
|
+
const result = ensureMessage(await subagentCommand.subCommands[3].action(context, 'nonexistent'));
|
|
315
|
+
expect(result.messageType).toBe('error');
|
|
316
|
+
expect(result.content).toMatch(/not found/i);
|
|
317
|
+
});
|
|
318
|
+
});
|
|
319
|
+
});
|
|
320
|
+
/**
|
|
321
|
+
* Edit command tests
|
|
322
|
+
*
|
|
323
|
+
* @plan:PLAN-20250117-SUBAGENTCONFIG.P10
|
|
324
|
+
* @requirement:REQ-008
|
|
325
|
+
*/
|
|
326
|
+
describe('editCommand @requirement:REQ-008', () => {
|
|
327
|
+
let context;
|
|
328
|
+
let subagentManager;
|
|
329
|
+
let profileManager;
|
|
330
|
+
let tempDir;
|
|
331
|
+
beforeEach(async () => {
|
|
332
|
+
// Create temp directories - same pattern as Phase 08
|
|
333
|
+
tempDir = await fs.mkdtemp(path.join(os.tmpdir(), 'subagent-edit-test-'));
|
|
334
|
+
const subagentsDir = path.join(tempDir, 'subagents');
|
|
335
|
+
const profilesDir = path.join(tempDir, 'profiles');
|
|
336
|
+
// Initialize real managers
|
|
337
|
+
profileManager = new ProfileManager(profilesDir);
|
|
338
|
+
subagentManager = new SubagentManager(subagentsDir, profileManager);
|
|
339
|
+
// Create test profile
|
|
340
|
+
await fs.mkdir(profilesDir, { recursive: true });
|
|
341
|
+
await profileManager.saveProfile('testprofile', {
|
|
342
|
+
version: 1,
|
|
343
|
+
provider: 'openai',
|
|
344
|
+
model: 'gpt-4',
|
|
345
|
+
modelParams: {},
|
|
346
|
+
ephemeralSettings: {},
|
|
347
|
+
});
|
|
348
|
+
context = createTestContext({
|
|
349
|
+
profileManager,
|
|
350
|
+
subagentManager,
|
|
351
|
+
});
|
|
352
|
+
expect(vi.isMockFunction(spawnSync)).toBe(true);
|
|
353
|
+
});
|
|
354
|
+
afterEach(async () => {
|
|
355
|
+
await fs.rm(tempDir, { recursive: true, force: true });
|
|
356
|
+
vi.clearAllMocks();
|
|
357
|
+
});
|
|
358
|
+
it('should error when name not provided', async () => {
|
|
359
|
+
const result = ensureMessage(await subagentCommand.subCommands[4].action(context, ''));
|
|
360
|
+
expect(result.messageType).toBe('error');
|
|
361
|
+
expect(result.content).toMatch(/usage|name required/i);
|
|
362
|
+
});
|
|
363
|
+
it('should error for non-existent subagent', async () => {
|
|
364
|
+
const result = ensureMessage(await subagentCommand.subCommands[4].action(context, 'nonexistent'));
|
|
365
|
+
expect(result.messageType).toBe('error');
|
|
366
|
+
expect(result.content).toMatch(/not found/i);
|
|
367
|
+
});
|
|
368
|
+
it('should launch editor for existing subagent', async () => {
|
|
369
|
+
await subagentManager.saveSubagent('testagent', 'testprofile', 'Test prompt');
|
|
370
|
+
const original = await subagentManager.loadSubagent('testagent');
|
|
371
|
+
// Mock implementation that simulates file editing
|
|
372
|
+
vi.mocked(spawnSync).mockImplementationOnce((_cmd, args) => {
|
|
373
|
+
const filePath = Array.isArray(args)
|
|
374
|
+
? args[0]
|
|
375
|
+
: undefined;
|
|
376
|
+
if (filePath) {
|
|
377
|
+
writeFileSync(filePath, JSON.stringify({
|
|
378
|
+
...original,
|
|
379
|
+
systemPrompt: 'Updated prompt from editor',
|
|
380
|
+
}, null, 2), 'utf8');
|
|
381
|
+
}
|
|
382
|
+
return {
|
|
383
|
+
pid: 12345,
|
|
384
|
+
output: [null, null, null],
|
|
385
|
+
stdout: Buffer.from(''),
|
|
386
|
+
stderr: Buffer.from(''),
|
|
387
|
+
status: 0,
|
|
388
|
+
signal: null,
|
|
389
|
+
error: undefined,
|
|
390
|
+
};
|
|
391
|
+
});
|
|
392
|
+
const result = ensureMessage(await subagentCommand.subCommands[4].action(context, 'testagent'));
|
|
393
|
+
const updated = await subagentManager.loadSubagent('testagent');
|
|
394
|
+
expect(updated.systemPrompt).toBe('Updated prompt from editor');
|
|
395
|
+
expect(new Date(updated.updatedAt).getTime()).toBeGreaterThanOrEqual(new Date(original.updatedAt).getTime());
|
|
396
|
+
expect(result.messageType).toBe('info');
|
|
397
|
+
expect(result.content).toMatch(/updated successfully/i);
|
|
398
|
+
});
|
|
399
|
+
it('should handle editor failure', async () => {
|
|
400
|
+
await subagentManager.saveSubagent('testagent', 'testprofile', 'Test prompt');
|
|
401
|
+
// Mock editor exiting with error
|
|
402
|
+
vi.mocked(spawnSync).mockImplementationOnce(() => ({
|
|
403
|
+
pid: 12345,
|
|
404
|
+
output: [null, null, null],
|
|
405
|
+
stdout: Buffer.from(''),
|
|
406
|
+
stderr: Buffer.from(''),
|
|
407
|
+
status: 1,
|
|
408
|
+
signal: null,
|
|
409
|
+
error: undefined,
|
|
410
|
+
}));
|
|
411
|
+
const result = ensureMessage(await subagentCommand.subCommands[4].action(context, 'testagent'));
|
|
412
|
+
expect(result.messageType).toBe('error');
|
|
413
|
+
expect(result.content).toMatch(/editor.*exited|failed/i);
|
|
414
|
+
});
|
|
415
|
+
it('should validate JSON after edit', async () => {
|
|
416
|
+
await subagentManager.saveSubagent('testagent', 'testprofile', 'Test prompt');
|
|
417
|
+
// Mock editor writing invalid JSON
|
|
418
|
+
vi.mocked(spawnSync).mockImplementationOnce((_cmd, args) => {
|
|
419
|
+
const filePath = Array.isArray(args)
|
|
420
|
+
? args[0]
|
|
421
|
+
: undefined;
|
|
422
|
+
if (filePath) {
|
|
423
|
+
writeFileSync(filePath, '{ invalid json', 'utf8');
|
|
424
|
+
}
|
|
425
|
+
return {
|
|
426
|
+
pid: 12345,
|
|
427
|
+
output: [null, null, null],
|
|
428
|
+
stdout: Buffer.from(''),
|
|
429
|
+
stderr: Buffer.from(''),
|
|
430
|
+
status: 0,
|
|
431
|
+
signal: null,
|
|
432
|
+
error: undefined,
|
|
433
|
+
};
|
|
434
|
+
});
|
|
435
|
+
const result = ensureMessage(await subagentCommand.subCommands[4].action(context, 'testagent'));
|
|
436
|
+
expect(result.messageType).toBe('error');
|
|
437
|
+
expect(result.content).toMatch(/invalid json/i);
|
|
438
|
+
});
|
|
439
|
+
});
|
|
440
|
+
/**
|
|
441
|
+
* Autocomplete tests
|
|
442
|
+
*
|
|
443
|
+
* @plan:PLAN-20250117-SUBAGENTCONFIG.P10
|
|
444
|
+
* @requirement:REQ-009
|
|
445
|
+
*
|
|
446
|
+
* NOTE: These tests assume Phase 01 has resolved autocomplete system to support
|
|
447
|
+
* fullLine parameter. If Phase 01 did not implement enhancement, these tests
|
|
448
|
+
* will need to be adjusted based on findings.md.
|
|
449
|
+
*/
|
|
450
|
+
describe('completion @requirement:REQ-009', () => {
|
|
451
|
+
it('is temporarily skipped pending schema-driven slash completion migration', () => {
|
|
452
|
+
expect(subagentCommand.schema).toBeUndefined();
|
|
453
|
+
});
|
|
454
|
+
});
|
|
455
|
+
/**
|
|
456
|
+
* Auto mode tests
|
|
457
|
+
*
|
|
458
|
+
* @plan:PLAN-20250117-SUBAGENTCONFIG.P13
|
|
459
|
+
* @plan:PLAN-20250117-SUBAGENTCONFIG.P14
|
|
460
|
+
* @requirement:REQ-003
|
|
461
|
+
*/
|
|
462
|
+
describe('saveCommand - auto mode @requirement:REQ-003', () => {
|
|
463
|
+
let context;
|
|
464
|
+
let subagentManager;
|
|
465
|
+
let profileManager;
|
|
466
|
+
let tempDir;
|
|
467
|
+
let mockGeminiClient;
|
|
468
|
+
beforeEach(async () => {
|
|
469
|
+
// Create temp directories for a realistic test environment
|
|
470
|
+
tempDir = await fs.mkdtemp(path.join(os.tmpdir(), 'subagent-auto-test-'));
|
|
471
|
+
const subagentsDir = path.join(tempDir, 'subagents');
|
|
472
|
+
const profilesDir = path.join(tempDir, 'profiles');
|
|
473
|
+
// Initialize real managers
|
|
474
|
+
profileManager = new ProfileManager(profilesDir);
|
|
475
|
+
subagentManager = new SubagentManager(subagentsDir, profileManager);
|
|
476
|
+
// Create test profile
|
|
477
|
+
await fs.mkdir(profilesDir, { recursive: true });
|
|
478
|
+
await profileManager.saveProfile('testprofile', {
|
|
479
|
+
version: 1,
|
|
480
|
+
provider: 'openai',
|
|
481
|
+
model: 'gpt-4',
|
|
482
|
+
modelParams: {},
|
|
483
|
+
ephemeralSettings: {},
|
|
484
|
+
});
|
|
485
|
+
context = createTestContext({
|
|
486
|
+
profileManager,
|
|
487
|
+
subagentManager,
|
|
488
|
+
});
|
|
489
|
+
// Mock GeminiClient
|
|
490
|
+
mockGeminiClient = {
|
|
491
|
+
generateDirectMessage: vi.fn().mockResolvedValue({
|
|
492
|
+
text: 'Auto generated prompt',
|
|
493
|
+
}),
|
|
494
|
+
};
|
|
495
|
+
// Add to context in a way that avoids TypeScript errors
|
|
496
|
+
context.services.config =
|
|
497
|
+
{
|
|
498
|
+
getGeminiClient: vi.fn(() => mockGeminiClient),
|
|
499
|
+
};
|
|
500
|
+
});
|
|
501
|
+
afterEach(async () => {
|
|
502
|
+
await fs.rm(tempDir, { recursive: true, force: true });
|
|
503
|
+
});
|
|
504
|
+
it('should generate system prompt using LLM', async () => {
|
|
505
|
+
// Mock LLM response
|
|
506
|
+
mockGeminiClient.generateDirectMessage.mockResolvedValue({
|
|
507
|
+
text: 'You are an expert Python debugger specializing in finding and fixing bugs.',
|
|
508
|
+
});
|
|
509
|
+
const args = 'testagent testprofile auto "expert Python debugger"';
|
|
510
|
+
// Access the save subcommand directly from the imported module
|
|
511
|
+
const result = await subagentCommand.subCommands[0].action(context, args);
|
|
512
|
+
// Verify LLM was called
|
|
513
|
+
expect(mockGeminiClient.generateDirectMessage).toHaveBeenCalledTimes(1);
|
|
514
|
+
const callArgs = mockGeminiClient.generateDirectMessage.mock.calls[0][0];
|
|
515
|
+
expect(callArgs.message).toMatch(/expert Python debugger/);
|
|
516
|
+
expect(callArgs.message).toMatch(/system prompt/i);
|
|
517
|
+
expect(callArgs.config).toEqual({
|
|
518
|
+
toolConfig: {
|
|
519
|
+
functionCallingConfig: {
|
|
520
|
+
mode: FunctionCallingConfigMode.NONE,
|
|
521
|
+
},
|
|
522
|
+
},
|
|
523
|
+
tools: [],
|
|
524
|
+
});
|
|
525
|
+
// Verify success message type and content
|
|
526
|
+
expect(result).toBeDefined();
|
|
527
|
+
expect(result?.type).toBe('message');
|
|
528
|
+
if (result && result.type === 'message') {
|
|
529
|
+
expect(result.messageType).toBe('info');
|
|
530
|
+
expect(result.content).toMatch(/created successfully/i);
|
|
531
|
+
}
|
|
532
|
+
// Verify the subagent was saved with the generated prompt
|
|
533
|
+
const loaded = await subagentManager.loadSubagent('testagent');
|
|
534
|
+
expect(loaded.systemPrompt).toBe('You are an expert Python debugger specializing in finding and fixing bugs.');
|
|
535
|
+
});
|
|
536
|
+
it('should handle LLM generation failure', async () => {
|
|
537
|
+
// Mock LLM error
|
|
538
|
+
mockGeminiClient.generateDirectMessage.mockRejectedValue(new Error('Network error'));
|
|
539
|
+
const args = 'testagent testprofile auto "expert debugger"';
|
|
540
|
+
const result = await subagentCommand.subCommands[0].action(context, args);
|
|
541
|
+
expect(result).toBeDefined();
|
|
542
|
+
expect(result?.type).toBe('message');
|
|
543
|
+
if (result && result.type === 'message') {
|
|
544
|
+
expect(result.messageType).toBe('error');
|
|
545
|
+
expect(result.content).toMatch(/failed to generate|connection|manual mode/i);
|
|
546
|
+
}
|
|
547
|
+
expect(mockGeminiClient.generateDirectMessage).toHaveBeenCalledWith(expect.objectContaining({
|
|
548
|
+
config: {
|
|
549
|
+
toolConfig: {
|
|
550
|
+
functionCallingConfig: {
|
|
551
|
+
mode: FunctionCallingConfigMode.NONE,
|
|
552
|
+
},
|
|
553
|
+
},
|
|
554
|
+
tools: [],
|
|
555
|
+
},
|
|
556
|
+
}), expect.any(String));
|
|
557
|
+
});
|
|
558
|
+
it('should handle empty LLM response', async () => {
|
|
559
|
+
// Mock empty response
|
|
560
|
+
mockGeminiClient.generateDirectMessage.mockResolvedValue({
|
|
561
|
+
text: '',
|
|
562
|
+
});
|
|
563
|
+
const args = 'testagent testprofile auto "expert debugger"';
|
|
564
|
+
const result = await subagentCommand.subCommands[0].action(context, args);
|
|
565
|
+
expect(result).toBeDefined();
|
|
566
|
+
expect(result?.type).toBe('message');
|
|
567
|
+
if (result && result.type === 'message') {
|
|
568
|
+
expect(result.messageType).toBe('error');
|
|
569
|
+
expect(result.content).toMatch(/empty.*response|manual mode/i);
|
|
570
|
+
}
|
|
571
|
+
expect(mockGeminiClient.generateDirectMessage).toHaveBeenCalledWith(expect.objectContaining({
|
|
572
|
+
config: {
|
|
573
|
+
toolConfig: {
|
|
574
|
+
functionCallingConfig: {
|
|
575
|
+
mode: FunctionCallingConfigMode.NONE,
|
|
576
|
+
},
|
|
577
|
+
},
|
|
578
|
+
tools: [],
|
|
579
|
+
},
|
|
580
|
+
}), expect.any(String));
|
|
581
|
+
});
|
|
582
|
+
it('should use correct prompt template for LLM', async () => {
|
|
583
|
+
mockGeminiClient.generateDirectMessage.mockResolvedValue({
|
|
584
|
+
text: 'Generated prompt',
|
|
585
|
+
});
|
|
586
|
+
const description = 'expert code reviewer';
|
|
587
|
+
const args = `testagent testprofile auto "${description}"`;
|
|
588
|
+
await subagentCommand.subCommands[0].action(context, args);
|
|
589
|
+
const callArgs = mockGeminiClient.generateDirectMessage.mock.calls[0][0];
|
|
590
|
+
// Verify prompt includes description
|
|
591
|
+
expect(callArgs.message).toContain(description);
|
|
592
|
+
// Verify prompt includes instructions
|
|
593
|
+
expect(callArgs.message).toMatch(/comprehensive/i);
|
|
594
|
+
expect(callArgs.message).toMatch(/role.*capabilities.*behavior/i);
|
|
595
|
+
expect(callArgs.message).toMatch(/output.*only/i);
|
|
596
|
+
});
|
|
597
|
+
});
|
|
598
|
+
//# sourceMappingURL=subagentCommand.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"subagentCommand.test.js","sourceRoot":"","sources":["../../../../../src/ui/commands/test/subagentCommand.test.ts"],"names":[],"mappings":"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"}
|