@google/gemini-cli 0.12.0-nightly.20251027.cb0947c5 → 0.13.0-nightly.20251030.42c79c64
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/README.md +7 -5
- package/dist/package.json +2 -2
- package/dist/src/commands/extensions/disable.d.ts +1 -1
- package/dist/src/commands/extensions/disable.js +5 -4
- package/dist/src/commands/extensions/disable.js.map +1 -1
- package/dist/src/commands/extensions/enable.d.ts +1 -1
- package/dist/src/commands/extensions/enable.js +3 -2
- package/dist/src/commands/extensions/enable.js.map +1 -1
- package/dist/src/commands/extensions/install.js +2 -1
- package/dist/src/commands/extensions/install.js.map +1 -1
- package/dist/src/commands/extensions/install.test.js +1 -0
- package/dist/src/commands/extensions/install.test.js.map +1 -1
- package/dist/src/commands/extensions/link.js +2 -1
- package/dist/src/commands/extensions/link.js.map +1 -1
- package/dist/src/commands/extensions/list.js +2 -2
- package/dist/src/commands/extensions/list.js.map +1 -1
- package/dist/src/commands/extensions/uninstall.js +2 -1
- package/dist/src/commands/extensions/uninstall.js.map +1 -1
- package/dist/src/commands/extensions/update.js +2 -2
- package/dist/src/commands/extensions/update.js.map +1 -1
- package/dist/src/commands/mcp/list.js +2 -2
- package/dist/src/commands/mcp/list.js.map +1 -1
- package/dist/src/config/auth.js +0 -5
- package/dist/src/config/auth.js.map +1 -1
- package/dist/src/config/auth.test.js +1 -3
- package/dist/src/config/auth.test.js.map +1 -1
- package/dist/src/config/config.d.ts +5 -3
- package/dist/src/config/config.js +42 -9
- package/dist/src/config/config.js.map +1 -1
- package/dist/src/config/config.test.js +186 -161
- package/dist/src/config/config.test.js.map +1 -1
- package/dist/src/config/extension-manager.d.ts +23 -10
- package/dist/src/config/extension-manager.js +89 -62
- package/dist/src/config/extension-manager.js.map +1 -1
- package/dist/src/config/extension.test.js +158 -74
- package/dist/src/config/extension.test.js.map +1 -1
- package/dist/src/config/extensions/extensionSettings.d.ts +3 -3
- package/dist/src/config/extensions/extensionSettings.js +74 -24
- package/dist/src/config/extensions/extensionSettings.js.map +1 -1
- package/dist/src/config/extensions/extensionSettings.test.js +145 -24
- package/dist/src/config/extensions/extensionSettings.test.js.map +1 -1
- package/dist/src/config/extensions/github.js +3 -3
- package/dist/src/config/extensions/github.js.map +1 -1
- package/dist/src/config/extensions/github.test.js +1 -1
- package/dist/src/config/extensions/github.test.js.map +1 -1
- package/dist/src/config/extensions/update.js +7 -6
- package/dist/src/config/extensions/update.js.map +1 -1
- package/dist/src/config/extensions/update.test.js +54 -31
- package/dist/src/config/extensions/update.test.js.map +1 -1
- package/dist/src/config/keyBindings.js +1 -1
- package/dist/src/config/keyBindings.js.map +1 -1
- package/dist/src/config/policies/read-only.toml +56 -0
- package/dist/src/config/policies/write.toml +63 -0
- package/dist/src/config/policies/yolo.toml +31 -0
- package/dist/src/config/policy-engine.integration.test.js +41 -38
- package/dist/src/config/policy-engine.integration.test.js.map +1 -1
- package/dist/src/config/policy-toml-loader.d.ts +46 -0
- package/dist/src/config/policy-toml-loader.js +314 -0
- package/dist/src/config/policy-toml-loader.js.map +1 -0
- package/dist/src/config/policy-toml-loader.test.d.ts +6 -0
- package/dist/src/config/policy-toml-loader.test.js +626 -0
- package/dist/src/config/policy-toml-loader.test.js.map +1 -0
- package/dist/src/config/policy.d.ts +9 -2
- package/dist/src/config/policy.js +139 -110
- package/dist/src/config/policy.js.map +1 -1
- package/dist/src/config/policy.test.js +780 -82
- package/dist/src/config/policy.test.js.map +1 -1
- package/dist/src/config/sandboxConfig.d.ts +1 -1
- package/dist/src/config/sandboxConfig.js +6 -3
- package/dist/src/config/sandboxConfig.js.map +1 -1
- package/dist/src/config/settings.js +1 -1
- package/dist/src/config/settings.js.map +1 -1
- package/dist/src/config/settings.test.js +4 -4
- package/dist/src/config/settings.test.js.map +1 -1
- package/dist/src/gemini.js +14 -18
- package/dist/src/gemini.js.map +1 -1
- package/dist/src/gemini.test.js +2 -0
- package/dist/src/gemini.test.js.map +1 -1
- package/dist/src/generated/git-commit.d.ts +2 -2
- package/dist/src/generated/git-commit.js +2 -2
- package/dist/src/nonInteractiveCli.d.ts +9 -1
- package/dist/src/nonInteractiveCli.js +16 -1
- package/dist/src/nonInteractiveCli.js.map +1 -1
- package/dist/src/nonInteractiveCli.test.js +209 -103
- package/dist/src/nonInteractiveCli.test.js.map +1 -1
- package/dist/src/test-utils/render.d.ts +12 -0
- package/dist/src/test-utils/render.js +28 -1
- package/dist/src/test-utils/render.js.map +1 -1
- package/dist/src/test-utils/render.test.d.ts +6 -0
- package/dist/src/test-utils/render.test.js +54 -0
- package/dist/src/test-utils/render.test.js.map +1 -0
- package/dist/src/ui/AppContainer.js +60 -25
- package/dist/src/ui/AppContainer.js.map +1 -1
- package/dist/src/ui/AppContainer.test.js +8 -0
- package/dist/src/ui/AppContainer.test.js.map +1 -1
- package/dist/src/ui/auth/ApiAuthDialog.d.ts +14 -0
- package/dist/src/ui/auth/ApiAuthDialog.js +26 -0
- package/dist/src/ui/auth/ApiAuthDialog.js.map +1 -0
- package/dist/src/ui/auth/ApiAuthDialog.test.d.ts +6 -0
- package/dist/src/ui/auth/ApiAuthDialog.test.js +91 -0
- package/dist/src/ui/auth/ApiAuthDialog.test.js.map +1 -0
- package/dist/src/ui/auth/AuthDialog.js +7 -3
- package/dist/src/ui/auth/AuthDialog.js.map +1 -1
- package/dist/src/ui/auth/AuthDialog.test.js +1 -1
- package/dist/src/ui/auth/AuthDialog.test.js.map +1 -1
- package/dist/src/ui/auth/useAuth.d.ts +2 -0
- package/dist/src/ui/auth/useAuth.js +31 -2
- package/dist/src/ui/auth/useAuth.js.map +1 -1
- package/dist/src/ui/commands/directoryCommand.js +1 -1
- package/dist/src/ui/commands/directoryCommand.js.map +1 -1
- package/dist/src/ui/commands/extensionsCommand.js +45 -1
- package/dist/src/ui/commands/extensionsCommand.js.map +1 -1
- package/dist/src/ui/commands/extensionsCommand.test.js +64 -1
- package/dist/src/ui/commands/extensionsCommand.test.js.map +1 -1
- package/dist/src/ui/commands/memoryCommand.js +1 -1
- package/dist/src/ui/commands/memoryCommand.js.map +1 -1
- package/dist/src/ui/commands/memoryCommand.test.js +3 -1
- package/dist/src/ui/commands/memoryCommand.test.js.map +1 -1
- package/dist/src/ui/components/ConsoleSummaryDisplay.js +1 -1
- package/dist/src/ui/components/ConsoleSummaryDisplay.js.map +1 -1
- package/dist/src/ui/components/DetailedMessagesDisplay.js +1 -1
- package/dist/src/ui/components/DetailedMessagesDisplay.js.map +1 -1
- package/dist/src/ui/components/DialogManager.js +4 -0
- package/dist/src/ui/components/DialogManager.js.map +1 -1
- package/dist/src/ui/components/FolderTrustDialog.test.js +4 -5
- package/dist/src/ui/components/FolderTrustDialog.test.js.map +1 -1
- package/dist/src/ui/components/Footer.js +1 -1
- package/dist/src/ui/components/Footer.js.map +1 -1
- package/dist/src/ui/components/Footer.test.js +24 -0
- package/dist/src/ui/components/Footer.test.js.map +1 -1
- package/dist/src/ui/components/Help.test.js +0 -1
- package/dist/src/ui/components/Help.test.js.map +1 -1
- package/dist/src/ui/components/ModelDialog.test.js +5 -6
- package/dist/src/ui/components/ModelDialog.test.js.map +1 -1
- package/dist/src/ui/components/PermissionsModifyTrustDialog.test.js +11 -13
- package/dist/src/ui/components/PermissionsModifyTrustDialog.test.js.map +1 -1
- package/dist/src/ui/components/SettingsDialog.test.js +12 -14
- package/dist/src/ui/components/SettingsDialog.test.js.map +1 -1
- package/dist/src/ui/components/messages/Todo.js +27 -5
- package/dist/src/ui/components/messages/Todo.js.map +1 -1
- package/dist/src/ui/components/messages/Todo.test.js +19 -7
- package/dist/src/ui/components/messages/Todo.test.js.map +1 -1
- package/dist/src/ui/components/shared/BaseSelectionList.test.js +11 -13
- package/dist/src/ui/components/shared/BaseSelectionList.test.js.map +1 -1
- package/dist/src/ui/components/shared/TextInput.d.ts +15 -0
- package/dist/src/ui/components/shared/TextInput.js +38 -0
- package/dist/src/ui/components/shared/TextInput.js.map +1 -0
- package/dist/src/ui/components/shared/TextInput.test.d.ts +6 -0
- package/dist/src/ui/components/shared/TextInput.test.js +242 -0
- package/dist/src/ui/components/shared/TextInput.test.js.map +1 -0
- package/dist/src/ui/components/shared/text-buffer.d.ts +8 -2
- package/dist/src/ui/components/shared/text-buffer.js +28 -13
- package/dist/src/ui/components/shared/text-buffer.js.map +1 -1
- package/dist/src/ui/components/shared/text-buffer.test.js +139 -2
- package/dist/src/ui/components/shared/text-buffer.test.js.map +1 -1
- package/dist/src/ui/contexts/KeypressContext.js +8 -29
- package/dist/src/ui/contexts/KeypressContext.js.map +1 -1
- package/dist/src/ui/contexts/KeypressContext.test.js +90 -73
- package/dist/src/ui/contexts/KeypressContext.test.js.map +1 -1
- package/dist/src/ui/contexts/SessionContext.test.js +27 -14
- package/dist/src/ui/contexts/SessionContext.test.js.map +1 -1
- package/dist/src/ui/contexts/UIActionsContext.d.ts +2 -0
- package/dist/src/ui/contexts/UIActionsContext.js.map +1 -1
- package/dist/src/ui/contexts/UIStateContext.d.ts +2 -0
- package/dist/src/ui/contexts/UIStateContext.js.map +1 -1
- package/dist/src/ui/hooks/atCommandProcessor.js +31 -9
- package/dist/src/ui/hooks/atCommandProcessor.js.map +1 -1
- package/dist/src/ui/hooks/atCommandProcessor.test.js +162 -64
- package/dist/src/ui/hooks/atCommandProcessor.test.js.map +1 -1
- package/dist/src/ui/hooks/useAtCompletion.test.js +32 -23
- package/dist/src/ui/hooks/useAtCompletion.test.js.map +1 -1
- package/dist/src/ui/hooks/useAutoAcceptIndicator.test.js +2 -2
- package/dist/src/ui/hooks/useAutoAcceptIndicator.test.js.map +1 -1
- package/dist/src/ui/hooks/useExtensionUpdates.d.ts +1 -2
- package/dist/src/ui/hooks/useExtensionUpdates.js +2 -1
- package/dist/src/ui/hooks/useExtensionUpdates.js.map +1 -1
- package/dist/src/ui/hooks/useExtensionUpdates.test.js +14 -20
- package/dist/src/ui/hooks/useExtensionUpdates.test.js.map +1 -1
- package/dist/src/ui/hooks/useFlickerDetector.test.js +9 -6
- package/dist/src/ui/hooks/useFlickerDetector.test.js.map +1 -1
- package/dist/src/ui/hooks/useFolderTrust.test.js +45 -23
- package/dist/src/ui/hooks/useFolderTrust.test.js.map +1 -1
- package/dist/src/ui/hooks/useGeminiStream.js +7 -5
- package/dist/src/ui/hooks/useGeminiStream.js.map +1 -1
- package/dist/src/ui/hooks/useGeminiStream.test.js +42 -41
- package/dist/src/ui/hooks/useGeminiStream.test.js.map +1 -1
- package/dist/src/ui/hooks/useHistoryManager.test.js +2 -2
- package/dist/src/ui/hooks/useHistoryManager.test.js.map +1 -1
- package/dist/src/ui/hooks/useInputHistory.test.js +2 -2
- package/dist/src/ui/hooks/useInputHistory.test.js.map +1 -1
- package/dist/src/ui/hooks/useInputHistoryStore.test.js +2 -2
- package/dist/src/ui/hooks/useInputHistoryStore.test.js.map +1 -1
- package/dist/src/ui/hooks/usePermissionsModifyTrust.test.js +2 -3
- package/dist/src/ui/hooks/usePermissionsModifyTrust.test.js.map +1 -1
- package/dist/src/ui/hooks/usePhraseCycler.js +1 -1
- package/dist/src/ui/hooks/usePhraseCycler.js.map +1 -1
- package/dist/src/ui/hooks/usePhraseCycler.test.js +83 -111
- package/dist/src/ui/hooks/usePhraseCycler.test.js.map +1 -1
- package/dist/src/ui/hooks/useQuotaAndFallback.test.js +2 -2
- package/dist/src/ui/hooks/useQuotaAndFallback.test.js.map +1 -1
- package/dist/src/ui/hooks/useReactToolScheduler.test.js +1 -2
- package/dist/src/ui/hooks/useReactToolScheduler.test.js.map +1 -1
- package/dist/src/ui/hooks/useReverseSearchCompletion.test.js +2 -2
- package/dist/src/ui/hooks/useReverseSearchCompletion.test.js.map +1 -1
- package/dist/src/ui/hooks/useShellHistory.test.js +40 -17
- package/dist/src/ui/hooks/useShellHistory.test.js.map +1 -1
- package/dist/src/ui/hooks/useSlashCompletion.js +2 -2
- package/dist/src/ui/hooks/useSlashCompletion.js.map +1 -1
- package/dist/src/ui/hooks/useSlashCompletion.test.js +54 -49
- package/dist/src/ui/hooks/useSlashCompletion.test.js.map +1 -1
- package/dist/src/ui/hooks/useToolScheduler.test.js +48 -42
- package/dist/src/ui/hooks/useToolScheduler.test.js.map +1 -1
- package/dist/src/ui/keyMatchers.test.js +3 -3
- package/dist/src/ui/keyMatchers.test.js.map +1 -1
- package/dist/src/ui/types.d.ts +1 -0
- package/dist/src/ui/types.js +2 -0
- package/dist/src/ui/types.js.map +1 -1
- package/dist/src/ui/utils/clipboardUtils.js +2 -2
- package/dist/src/ui/utils/clipboardUtils.js.map +1 -1
- package/dist/src/ui/utils/updateCheck.js +6 -3
- package/dist/src/ui/utils/updateCheck.js.map +1 -1
- package/dist/src/ui/utils/updateCheck.test.js +5 -1
- package/dist/src/ui/utils/updateCheck.test.js.map +1 -1
- package/dist/src/utils/commentJson.js +2 -2
- package/dist/src/utils/commentJson.js.map +1 -1
- package/dist/src/utils/commentJson.test.js +7 -6
- package/dist/src/utils/commentJson.test.js.map +1 -1
- package/dist/src/utils/version.js +6 -2
- package/dist/src/utils/version.js.map +1 -1
- package/dist/src/zed-integration/acp.js +2 -1
- package/dist/src/zed-integration/acp.js.map +1 -1
- package/dist/src/zed-integration/zedIntegration.d.ts +2 -2
- package/dist/src/zed-integration/zedIntegration.js +4 -6
- package/dist/src/zed-integration/zedIntegration.js.map +1 -1
- package/dist/tsconfig.tsbuildinfo +1 -1
- package/package.json +3 -3
- package/dist/src/utils/package.d.ts +0 -12
- package/dist/src/utils/package.js +0 -24
- package/dist/src/utils/package.js.map +0 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"nonInteractiveCli.js","sourceRoot":"","sources":["../../src/nonInteractiveCli.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAQH,OAAO,EAAE,cAAc,EAAE,MAAM,4BAA4B,CAAC;AAE5D,OAAO,EACL,eAAe,EACf,iBAAiB,EACjB,yBAAyB,EACzB,eAAe,EACf,eAAe,EACf,eAAe,EACf,YAAY,EACZ,aAAa,EACb,mBAAmB,EACnB,mBAAmB,EACnB,kBAAkB,EAClB,WAAW,EACX,UAAU,EACV,SAAS,GACV,MAAM,yBAAyB,CAAC;AAIjC,OAAO,EAAE,kBAAkB,EAAE,MAAM,gCAAgC,CAAC;AACpE,OAAO,EAAE,cAAc,EAAE,MAAM,8BAA8B,CAAC;AAC9D,OAAO,EAAE,eAAe,EAAE,MAAM,kCAAkC,CAAC;AACnE,OAAO,EACL,WAAW,EACX,eAAe,EACf,uBAAuB,EACvB,2BAA2B,GAC5B,MAAM,mBAAmB,CAAC;AAC3B,OAAO,EAAE,UAAU,EAAE,MAAM,0BAA0B,CAAC;
|
|
1
|
+
{"version":3,"file":"nonInteractiveCli.js","sourceRoot":"","sources":["../../src/nonInteractiveCli.ts"],"names":[],"mappings":"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"}
|
|
@@ -53,6 +53,26 @@ describe('runNonInteractive', () => {
|
|
|
53
53
|
let processStdoutSpy;
|
|
54
54
|
let processStderrSpy;
|
|
55
55
|
let mockGeminiClient;
|
|
56
|
+
const MOCK_SESSION_METRICS = {
|
|
57
|
+
models: {},
|
|
58
|
+
tools: {
|
|
59
|
+
totalCalls: 0,
|
|
60
|
+
totalSuccess: 0,
|
|
61
|
+
totalFail: 0,
|
|
62
|
+
totalDurationMs: 0,
|
|
63
|
+
totalDecisions: {
|
|
64
|
+
accept: 0,
|
|
65
|
+
reject: 0,
|
|
66
|
+
modify: 0,
|
|
67
|
+
auto_accept: 0,
|
|
68
|
+
},
|
|
69
|
+
byName: {},
|
|
70
|
+
},
|
|
71
|
+
files: {
|
|
72
|
+
totalLinesAdded: 0,
|
|
73
|
+
totalLinesRemoved: 0,
|
|
74
|
+
},
|
|
75
|
+
};
|
|
56
76
|
beforeEach(async () => {
|
|
57
77
|
mockCoreExecuteToolCall = vi.mocked(executeToolCall);
|
|
58
78
|
mockShutdownTelemetry = vi.mocked(shutdownTelemetry);
|
|
@@ -143,7 +163,12 @@ describe('runNonInteractive', () => {
|
|
|
143
163
|
},
|
|
144
164
|
];
|
|
145
165
|
mockGeminiClient.sendMessageStream.mockReturnValue(createStreamFromEvents(events));
|
|
146
|
-
await runNonInteractive(
|
|
166
|
+
await runNonInteractive({
|
|
167
|
+
config: mockConfig,
|
|
168
|
+
settings: mockSettings,
|
|
169
|
+
input: 'Test input',
|
|
170
|
+
prompt_id: 'prompt-id-1',
|
|
171
|
+
});
|
|
147
172
|
expect(mockGeminiClient.sendMessageStream).toHaveBeenCalledWith([{ text: 'Test input' }], expect.any(AbortSignal), 'prompt-id-1');
|
|
148
173
|
expect(getWrittenOutput()).toBe('Hello World\n');
|
|
149
174
|
expect(mockShutdownTelemetry).toHaveBeenCalled();
|
|
@@ -190,7 +215,12 @@ describe('runNonInteractive', () => {
|
|
|
190
215
|
mockGeminiClient.sendMessageStream
|
|
191
216
|
.mockReturnValueOnce(createStreamFromEvents(firstCallEvents))
|
|
192
217
|
.mockReturnValueOnce(createStreamFromEvents(secondCallEvents));
|
|
193
|
-
await runNonInteractive(
|
|
218
|
+
await runNonInteractive({
|
|
219
|
+
config: mockConfig,
|
|
220
|
+
settings: mockSettings,
|
|
221
|
+
input: 'Use a tool',
|
|
222
|
+
prompt_id: 'prompt-id-2',
|
|
223
|
+
});
|
|
194
224
|
expect(mockGeminiClient.sendMessageStream).toHaveBeenCalledTimes(2);
|
|
195
225
|
expect(mockCoreExecuteToolCall).toHaveBeenCalledWith(mockConfig, expect.objectContaining({ name: 'testTool' }), expect.any(AbortSignal));
|
|
196
226
|
expect(mockGeminiClient.sendMessageStream).toHaveBeenNthCalledWith(2, [{ text: 'Tool response' }], expect.any(AbortSignal), 'prompt-id-2');
|
|
@@ -245,7 +275,12 @@ describe('runNonInteractive', () => {
|
|
|
245
275
|
.mockReturnValueOnce(createStreamFromEvents(modelTurn2))
|
|
246
276
|
.mockReturnValueOnce(createStreamFromEvents(modelTurn3));
|
|
247
277
|
// 4. Run the command.
|
|
248
|
-
await runNonInteractive(
|
|
278
|
+
await runNonInteractive({
|
|
279
|
+
config: mockConfig,
|
|
280
|
+
settings: mockSettings,
|
|
281
|
+
input: 'Use mock tool multiple times',
|
|
282
|
+
prompt_id: 'prompt-id-multi',
|
|
283
|
+
});
|
|
249
284
|
// 5. Verify the output.
|
|
250
285
|
// The rendered output should contain the text from each turn, separated by a
|
|
251
286
|
// single newline, with a final newline at the end.
|
|
@@ -305,7 +340,12 @@ describe('runNonInteractive', () => {
|
|
|
305
340
|
mockGeminiClient.sendMessageStream
|
|
306
341
|
.mockReturnValueOnce(createStreamFromEvents([toolCallEvent]))
|
|
307
342
|
.mockReturnValueOnce(createStreamFromEvents(finalResponse));
|
|
308
|
-
await runNonInteractive(
|
|
343
|
+
await runNonInteractive({
|
|
344
|
+
config: mockConfig,
|
|
345
|
+
settings: mockSettings,
|
|
346
|
+
input: 'Trigger tool error',
|
|
347
|
+
prompt_id: 'prompt-id-3',
|
|
348
|
+
});
|
|
309
349
|
expect(mockCoreExecuteToolCall).toHaveBeenCalled();
|
|
310
350
|
expect(consoleErrorSpy).toHaveBeenCalledWith('Error executing tool errorTool: Execution failed');
|
|
311
351
|
expect(mockGeminiClient.sendMessageStream).toHaveBeenCalledTimes(2);
|
|
@@ -326,7 +366,12 @@ describe('runNonInteractive', () => {
|
|
|
326
366
|
mockGeminiClient.sendMessageStream.mockImplementation(() => {
|
|
327
367
|
throw apiError;
|
|
328
368
|
});
|
|
329
|
-
await expect(runNonInteractive(
|
|
369
|
+
await expect(runNonInteractive({
|
|
370
|
+
config: mockConfig,
|
|
371
|
+
settings: mockSettings,
|
|
372
|
+
input: 'Initial fail',
|
|
373
|
+
prompt_id: 'prompt-id-4',
|
|
374
|
+
})).rejects.toThrow(apiError);
|
|
330
375
|
});
|
|
331
376
|
it('should not exit if a tool is not found, and should send error back to model', async () => {
|
|
332
377
|
const toolCallEvent = {
|
|
@@ -370,7 +415,12 @@ describe('runNonInteractive', () => {
|
|
|
370
415
|
mockGeminiClient.sendMessageStream
|
|
371
416
|
.mockReturnValueOnce(createStreamFromEvents([toolCallEvent]))
|
|
372
417
|
.mockReturnValueOnce(createStreamFromEvents(finalResponse));
|
|
373
|
-
await runNonInteractive(
|
|
418
|
+
await runNonInteractive({
|
|
419
|
+
config: mockConfig,
|
|
420
|
+
settings: mockSettings,
|
|
421
|
+
input: 'Trigger tool not found',
|
|
422
|
+
prompt_id: 'prompt-id-5',
|
|
423
|
+
});
|
|
374
424
|
expect(mockCoreExecuteToolCall).toHaveBeenCalled();
|
|
375
425
|
expect(consoleErrorSpy).toHaveBeenCalledWith('Error executing tool nonexistentTool: Tool "nonexistentTool" not found in registry.');
|
|
376
426
|
expect(mockGeminiClient.sendMessageStream).toHaveBeenCalledTimes(2);
|
|
@@ -378,7 +428,12 @@ describe('runNonInteractive', () => {
|
|
|
378
428
|
});
|
|
379
429
|
it('should exit when max session turns are exceeded', async () => {
|
|
380
430
|
vi.mocked(mockConfig.getMaxSessionTurns).mockReturnValue(0);
|
|
381
|
-
await expect(runNonInteractive(
|
|
431
|
+
await expect(runNonInteractive({
|
|
432
|
+
config: mockConfig,
|
|
433
|
+
settings: mockSettings,
|
|
434
|
+
input: 'Trigger loop',
|
|
435
|
+
prompt_id: 'prompt-id-6',
|
|
436
|
+
})).rejects.toThrow('process.exit(53) called');
|
|
382
437
|
});
|
|
383
438
|
it('should preprocess @include commands before sending to the model', async () => {
|
|
384
439
|
// 1. Mock the imported atCommandProcessor
|
|
@@ -407,7 +462,12 @@ describe('runNonInteractive', () => {
|
|
|
407
462
|
];
|
|
408
463
|
mockGeminiClient.sendMessageStream.mockReturnValue(createStreamFromEvents(events));
|
|
409
464
|
// 4. Run the non-interactive mode with the raw input
|
|
410
|
-
await runNonInteractive(
|
|
465
|
+
await runNonInteractive({
|
|
466
|
+
config: mockConfig,
|
|
467
|
+
settings: mockSettings,
|
|
468
|
+
input: rawInput,
|
|
469
|
+
prompt_id: 'prompt-id-7',
|
|
470
|
+
});
|
|
411
471
|
// 5. Assert that sendMessageStream was called with the PROCESSED parts, not the raw input
|
|
412
472
|
expect(mockGeminiClient.sendMessageStream).toHaveBeenCalledWith(processedParts, expect.any(AbortSignal), 'prompt-id-7');
|
|
413
473
|
// 6. Assert the final output is correct
|
|
@@ -423,30 +483,15 @@ describe('runNonInteractive', () => {
|
|
|
423
483
|
];
|
|
424
484
|
mockGeminiClient.sendMessageStream.mockReturnValue(createStreamFromEvents(events));
|
|
425
485
|
vi.mocked(mockConfig.getOutputFormat).mockReturnValue(OutputFormat.JSON);
|
|
426
|
-
|
|
427
|
-
|
|
428
|
-
|
|
429
|
-
|
|
430
|
-
|
|
431
|
-
|
|
432
|
-
|
|
433
|
-
totalDecisions: {
|
|
434
|
-
accept: 0,
|
|
435
|
-
reject: 0,
|
|
436
|
-
modify: 0,
|
|
437
|
-
auto_accept: 0,
|
|
438
|
-
},
|
|
439
|
-
byName: {},
|
|
440
|
-
},
|
|
441
|
-
files: {
|
|
442
|
-
totalLinesAdded: 0,
|
|
443
|
-
totalLinesRemoved: 0,
|
|
444
|
-
},
|
|
445
|
-
};
|
|
446
|
-
vi.mocked(uiTelemetryService.getMetrics).mockReturnValue(mockMetrics);
|
|
447
|
-
await runNonInteractive(mockConfig, mockSettings, 'Test input', 'prompt-id-1');
|
|
486
|
+
vi.mocked(uiTelemetryService.getMetrics).mockReturnValue(MOCK_SESSION_METRICS);
|
|
487
|
+
await runNonInteractive({
|
|
488
|
+
config: mockConfig,
|
|
489
|
+
settings: mockSettings,
|
|
490
|
+
input: 'Test input',
|
|
491
|
+
prompt_id: 'prompt-id-1',
|
|
492
|
+
});
|
|
448
493
|
expect(mockGeminiClient.sendMessageStream).toHaveBeenCalledWith([{ text: 'Test input' }], expect.any(AbortSignal), 'prompt-id-1');
|
|
449
|
-
expect(processStdoutSpy).toHaveBeenCalledWith(JSON.stringify({ response: 'Hello World', stats:
|
|
494
|
+
expect(processStdoutSpy).toHaveBeenCalledWith(JSON.stringify({ response: 'Hello World', stats: MOCK_SESSION_METRICS }, null, 2));
|
|
450
495
|
});
|
|
451
496
|
it('should write JSON output with stats for tool-only commands (no text response)', async () => {
|
|
452
497
|
// Test the scenario where a command completes successfully with only tool calls
|
|
@@ -500,45 +545,17 @@ describe('runNonInteractive', () => {
|
|
|
500
545
|
.mockReturnValueOnce(createStreamFromEvents(firstCallEvents))
|
|
501
546
|
.mockReturnValueOnce(createStreamFromEvents(secondCallEvents));
|
|
502
547
|
vi.mocked(mockConfig.getOutputFormat).mockReturnValue(OutputFormat.JSON);
|
|
503
|
-
|
|
504
|
-
|
|
505
|
-
|
|
506
|
-
|
|
507
|
-
|
|
508
|
-
|
|
509
|
-
|
|
510
|
-
totalDecisions: {
|
|
511
|
-
accept: 1,
|
|
512
|
-
reject: 0,
|
|
513
|
-
modify: 0,
|
|
514
|
-
auto_accept: 0,
|
|
515
|
-
},
|
|
516
|
-
byName: {
|
|
517
|
-
testTool: {
|
|
518
|
-
count: 1,
|
|
519
|
-
success: 1,
|
|
520
|
-
fail: 0,
|
|
521
|
-
durationMs: 100,
|
|
522
|
-
decisions: {
|
|
523
|
-
accept: 1,
|
|
524
|
-
reject: 0,
|
|
525
|
-
modify: 0,
|
|
526
|
-
auto_accept: 0,
|
|
527
|
-
},
|
|
528
|
-
},
|
|
529
|
-
},
|
|
530
|
-
},
|
|
531
|
-
files: {
|
|
532
|
-
totalLinesAdded: 0,
|
|
533
|
-
totalLinesRemoved: 0,
|
|
534
|
-
},
|
|
535
|
-
};
|
|
536
|
-
vi.mocked(uiTelemetryService.getMetrics).mockReturnValue(mockMetrics);
|
|
537
|
-
await runNonInteractive(mockConfig, mockSettings, 'Execute tool only', 'prompt-id-tool-only');
|
|
548
|
+
vi.mocked(uiTelemetryService.getMetrics).mockReturnValue(MOCK_SESSION_METRICS);
|
|
549
|
+
await runNonInteractive({
|
|
550
|
+
config: mockConfig,
|
|
551
|
+
settings: mockSettings,
|
|
552
|
+
input: 'Execute tool only',
|
|
553
|
+
prompt_id: 'prompt-id-tool-only',
|
|
554
|
+
});
|
|
538
555
|
expect(mockGeminiClient.sendMessageStream).toHaveBeenCalledTimes(2);
|
|
539
556
|
expect(mockCoreExecuteToolCall).toHaveBeenCalledWith(mockConfig, expect.objectContaining({ name: 'testTool' }), expect.any(AbortSignal));
|
|
540
557
|
// This should output JSON with empty response but include stats
|
|
541
|
-
expect(processStdoutSpy).toHaveBeenCalledWith(JSON.stringify({ response: '', stats:
|
|
558
|
+
expect(processStdoutSpy).toHaveBeenCalledWith(JSON.stringify({ response: '', stats: MOCK_SESSION_METRICS }, null, 2));
|
|
542
559
|
});
|
|
543
560
|
it('should write JSON output with stats for empty response commands', async () => {
|
|
544
561
|
// Test the scenario where a command completes but produces no content at all
|
|
@@ -550,31 +567,16 @@ describe('runNonInteractive', () => {
|
|
|
550
567
|
];
|
|
551
568
|
mockGeminiClient.sendMessageStream.mockReturnValue(createStreamFromEvents(events));
|
|
552
569
|
vi.mocked(mockConfig.getOutputFormat).mockReturnValue(OutputFormat.JSON);
|
|
553
|
-
|
|
554
|
-
|
|
555
|
-
|
|
556
|
-
|
|
557
|
-
|
|
558
|
-
|
|
559
|
-
|
|
560
|
-
totalDecisions: {
|
|
561
|
-
accept: 0,
|
|
562
|
-
reject: 0,
|
|
563
|
-
modify: 0,
|
|
564
|
-
auto_accept: 0,
|
|
565
|
-
},
|
|
566
|
-
byName: {},
|
|
567
|
-
},
|
|
568
|
-
files: {
|
|
569
|
-
totalLinesAdded: 0,
|
|
570
|
-
totalLinesRemoved: 0,
|
|
571
|
-
},
|
|
572
|
-
};
|
|
573
|
-
vi.mocked(uiTelemetryService.getMetrics).mockReturnValue(mockMetrics);
|
|
574
|
-
await runNonInteractive(mockConfig, mockSettings, 'Empty response test', 'prompt-id-empty');
|
|
570
|
+
vi.mocked(uiTelemetryService.getMetrics).mockReturnValue(MOCK_SESSION_METRICS);
|
|
571
|
+
await runNonInteractive({
|
|
572
|
+
config: mockConfig,
|
|
573
|
+
settings: mockSettings,
|
|
574
|
+
input: 'Empty response test',
|
|
575
|
+
prompt_id: 'prompt-id-empty',
|
|
576
|
+
});
|
|
575
577
|
expect(mockGeminiClient.sendMessageStream).toHaveBeenCalledWith([{ text: 'Empty response test' }], expect.any(AbortSignal), 'prompt-id-empty');
|
|
576
578
|
// This should output JSON with empty response but include stats
|
|
577
|
-
expect(processStdoutSpy).toHaveBeenCalledWith(JSON.stringify({ response: '', stats:
|
|
579
|
+
expect(processStdoutSpy).toHaveBeenCalledWith(JSON.stringify({ response: '', stats: MOCK_SESSION_METRICS }, null, 2));
|
|
578
580
|
});
|
|
579
581
|
it('should handle errors in JSON format', async () => {
|
|
580
582
|
vi.mocked(mockConfig.getOutputFormat).mockReturnValue(OutputFormat.JSON);
|
|
@@ -588,7 +590,12 @@ describe('runNonInteractive', () => {
|
|
|
588
590
|
.mockImplementation(() => { });
|
|
589
591
|
let thrownError = null;
|
|
590
592
|
try {
|
|
591
|
-
await runNonInteractive(
|
|
593
|
+
await runNonInteractive({
|
|
594
|
+
config: mockConfig,
|
|
595
|
+
settings: mockSettings,
|
|
596
|
+
input: 'Test input',
|
|
597
|
+
prompt_id: 'prompt-id-error',
|
|
598
|
+
});
|
|
592
599
|
// Should not reach here
|
|
593
600
|
expect.fail('Expected process.exit to be called');
|
|
594
601
|
}
|
|
@@ -617,7 +624,12 @@ describe('runNonInteractive', () => {
|
|
|
617
624
|
.mockImplementation(() => { });
|
|
618
625
|
let thrownError = null;
|
|
619
626
|
try {
|
|
620
|
-
await runNonInteractive(
|
|
627
|
+
await runNonInteractive({
|
|
628
|
+
config: mockConfig,
|
|
629
|
+
settings: mockSettings,
|
|
630
|
+
input: 'Invalid syntax',
|
|
631
|
+
prompt_id: 'prompt-id-fatal',
|
|
632
|
+
});
|
|
621
633
|
// Should not reach here
|
|
622
634
|
expect.fail('Expected process.exit to be called');
|
|
623
635
|
}
|
|
@@ -652,7 +664,12 @@ describe('runNonInteractive', () => {
|
|
|
652
664
|
},
|
|
653
665
|
];
|
|
654
666
|
mockGeminiClient.sendMessageStream.mockReturnValue(createStreamFromEvents(events));
|
|
655
|
-
await runNonInteractive(
|
|
667
|
+
await runNonInteractive({
|
|
668
|
+
config: mockConfig,
|
|
669
|
+
settings: mockSettings,
|
|
670
|
+
input: '/testcommand',
|
|
671
|
+
prompt_id: 'prompt-id-slash',
|
|
672
|
+
});
|
|
656
673
|
// Ensure the prompt sent to the model is from the command, not the raw input
|
|
657
674
|
expect(mockGeminiClient.sendMessageStream).toHaveBeenCalledWith([{ text: 'Prompt from command' }], expect.any(AbortSignal), 'prompt-id-slash');
|
|
658
675
|
expect(getWrittenOutput()).toBe('Response from command\n');
|
|
@@ -667,7 +684,12 @@ describe('runNonInteractive', () => {
|
|
|
667
684
|
}),
|
|
668
685
|
};
|
|
669
686
|
mockGetCommands.mockReturnValue([mockCommand]);
|
|
670
|
-
await expect(runNonInteractive(
|
|
687
|
+
await expect(runNonInteractive({
|
|
688
|
+
config: mockConfig,
|
|
689
|
+
settings: mockSettings,
|
|
690
|
+
input: '/confirm',
|
|
691
|
+
prompt_id: 'prompt-id-confirm',
|
|
692
|
+
})).rejects.toThrow('Exiting due to a confirmation prompt requested by the command.');
|
|
671
693
|
});
|
|
672
694
|
it('should treat an unknown slash command as a regular prompt', async () => {
|
|
673
695
|
// No commands are mocked, so any slash command is "unknown"
|
|
@@ -680,7 +702,12 @@ describe('runNonInteractive', () => {
|
|
|
680
702
|
},
|
|
681
703
|
];
|
|
682
704
|
mockGeminiClient.sendMessageStream.mockReturnValue(createStreamFromEvents(events));
|
|
683
|
-
await runNonInteractive(
|
|
705
|
+
await runNonInteractive({
|
|
706
|
+
config: mockConfig,
|
|
707
|
+
settings: mockSettings,
|
|
708
|
+
input: '/unknowncommand',
|
|
709
|
+
prompt_id: 'prompt-id-unknown',
|
|
710
|
+
});
|
|
684
711
|
// Ensure the raw input is sent to the model
|
|
685
712
|
expect(mockGeminiClient.sendMessageStream).toHaveBeenCalledWith([{ text: '/unknowncommand' }], expect.any(AbortSignal), 'prompt-id-unknown');
|
|
686
713
|
expect(getWrittenOutput()).toBe('Response to unknown\n');
|
|
@@ -694,7 +721,12 @@ describe('runNonInteractive', () => {
|
|
|
694
721
|
}),
|
|
695
722
|
};
|
|
696
723
|
mockGetCommands.mockReturnValue([mockCommand]);
|
|
697
|
-
await expect(runNonInteractive(
|
|
724
|
+
await expect(runNonInteractive({
|
|
725
|
+
config: mockConfig,
|
|
726
|
+
settings: mockSettings,
|
|
727
|
+
input: '/noaction',
|
|
728
|
+
prompt_id: 'prompt-id-unhandled',
|
|
729
|
+
})).rejects.toThrow('Exiting due to command result that is not supported in non-interactive mode.');
|
|
698
730
|
});
|
|
699
731
|
it('should pass arguments to the slash command action', async () => {
|
|
700
732
|
const mockAction = vi.fn().mockResolvedValue({
|
|
@@ -715,7 +747,12 @@ describe('runNonInteractive', () => {
|
|
|
715
747
|
},
|
|
716
748
|
];
|
|
717
749
|
mockGeminiClient.sendMessageStream.mockReturnValue(createStreamFromEvents(events));
|
|
718
|
-
await runNonInteractive(
|
|
750
|
+
await runNonInteractive({
|
|
751
|
+
config: mockConfig,
|
|
752
|
+
settings: mockSettings,
|
|
753
|
+
input: '/testargs arg1 arg2',
|
|
754
|
+
prompt_id: 'prompt-id-args',
|
|
755
|
+
});
|
|
719
756
|
expect(mockAction).toHaveBeenCalledWith(expect.any(Object), 'arg1 arg2');
|
|
720
757
|
expect(getWrittenOutput()).toBe('Acknowledged\n');
|
|
721
758
|
});
|
|
@@ -732,7 +769,12 @@ describe('runNonInteractive', () => {
|
|
|
732
769
|
},
|
|
733
770
|
];
|
|
734
771
|
mockGeminiClient.sendMessageStream.mockReturnValue(createStreamFromEvents(events));
|
|
735
|
-
await runNonInteractive(
|
|
772
|
+
await runNonInteractive({
|
|
773
|
+
config: mockConfig,
|
|
774
|
+
settings: mockSettings,
|
|
775
|
+
input: '/mycommand',
|
|
776
|
+
prompt_id: 'prompt-id-loaders',
|
|
777
|
+
});
|
|
736
778
|
// Check that loaders were instantiated with the config
|
|
737
779
|
expect(FileCommandLoader).toHaveBeenCalledTimes(1);
|
|
738
780
|
expect(FileCommandLoader).toHaveBeenCalledWith(mockConfig);
|
|
@@ -797,7 +839,12 @@ describe('runNonInteractive', () => {
|
|
|
797
839
|
mockGeminiClient.sendMessageStream
|
|
798
840
|
.mockReturnValueOnce(createStreamFromEvents(firstCallEvents))
|
|
799
841
|
.mockReturnValueOnce(createStreamFromEvents(secondCallEvents));
|
|
800
|
-
await runNonInteractive(
|
|
842
|
+
await runNonInteractive({
|
|
843
|
+
config: mockConfig,
|
|
844
|
+
settings: mockSettings,
|
|
845
|
+
input: 'List the files',
|
|
846
|
+
prompt_id: 'prompt-id-allowed',
|
|
847
|
+
});
|
|
801
848
|
expect(mockCoreExecuteToolCall).toHaveBeenCalledWith(mockConfig, expect.objectContaining({ name: 'ShellTool' }), expect.any(AbortSignal));
|
|
802
849
|
expect(getWrittenOutput()).toBe('file.txt\n');
|
|
803
850
|
});
|
|
@@ -810,7 +857,12 @@ describe('runNonInteractive', () => {
|
|
|
810
857
|
},
|
|
811
858
|
];
|
|
812
859
|
mockGeminiClient.sendMessageStream.mockReturnValue(createStreamFromEvents(events));
|
|
813
|
-
await runNonInteractive(
|
|
860
|
+
await runNonInteractive({
|
|
861
|
+
config: mockConfig,
|
|
862
|
+
settings: mockSettings,
|
|
863
|
+
input: 'test',
|
|
864
|
+
prompt_id: 'prompt-id-events',
|
|
865
|
+
});
|
|
814
866
|
expect(mockCoreEvents.on).toHaveBeenCalledWith(CoreEvent.UserFeedback, expect.any(Function));
|
|
815
867
|
expect(mockCoreEvents.drainFeedbackBacklog).toHaveBeenCalledTimes(1);
|
|
816
868
|
});
|
|
@@ -822,7 +874,12 @@ describe('runNonInteractive', () => {
|
|
|
822
874
|
},
|
|
823
875
|
];
|
|
824
876
|
mockGeminiClient.sendMessageStream.mockReturnValue(createStreamFromEvents(events));
|
|
825
|
-
await runNonInteractive(
|
|
877
|
+
await runNonInteractive({
|
|
878
|
+
config: mockConfig,
|
|
879
|
+
settings: mockSettings,
|
|
880
|
+
input: 'test',
|
|
881
|
+
prompt_id: 'prompt-id-events',
|
|
882
|
+
});
|
|
826
883
|
expect(mockCoreEvents.off).toHaveBeenCalledWith(CoreEvent.UserFeedback, expect.any(Function));
|
|
827
884
|
});
|
|
828
885
|
it('logs to process.stderr when UserFeedback event is received', async () => {
|
|
@@ -833,7 +890,12 @@ describe('runNonInteractive', () => {
|
|
|
833
890
|
},
|
|
834
891
|
];
|
|
835
892
|
mockGeminiClient.sendMessageStream.mockReturnValue(createStreamFromEvents(events));
|
|
836
|
-
await runNonInteractive(
|
|
893
|
+
await runNonInteractive({
|
|
894
|
+
config: mockConfig,
|
|
895
|
+
settings: mockSettings,
|
|
896
|
+
input: 'test',
|
|
897
|
+
prompt_id: 'prompt-id-events',
|
|
898
|
+
});
|
|
837
899
|
// Get the registered handler
|
|
838
900
|
const handler = mockCoreEvents.on.mock.calls.find((call) => call[0] === CoreEvent.UserFeedback)?.[1];
|
|
839
901
|
expect(handler).toBeDefined();
|
|
@@ -854,7 +916,12 @@ describe('runNonInteractive', () => {
|
|
|
854
916
|
},
|
|
855
917
|
];
|
|
856
918
|
mockGeminiClient.sendMessageStream.mockReturnValue(createStreamFromEvents(events));
|
|
857
|
-
await runNonInteractive(
|
|
919
|
+
await runNonInteractive({
|
|
920
|
+
config: mockConfig,
|
|
921
|
+
settings: mockSettings,
|
|
922
|
+
input: 'test',
|
|
923
|
+
prompt_id: 'prompt-id-events',
|
|
924
|
+
});
|
|
858
925
|
// Get the registered handler
|
|
859
926
|
const handler = mockCoreEvents.on.mock.calls.find((call) => call[0] === CoreEvent.UserFeedback)?.[1];
|
|
860
927
|
expect(handler).toBeDefined();
|
|
@@ -872,5 +939,44 @@ describe('runNonInteractive', () => {
|
|
|
872
939
|
expect(processStderrSpy).toHaveBeenCalledWith('Error: Original error\n at test\n');
|
|
873
940
|
});
|
|
874
941
|
});
|
|
942
|
+
it('should display a deprecation warning if hasDeprecatedPromptArg is true', async () => {
|
|
943
|
+
const events = [
|
|
944
|
+
{ type: GeminiEventType.Content, value: 'Final Answer' },
|
|
945
|
+
{
|
|
946
|
+
type: GeminiEventType.Finished,
|
|
947
|
+
value: { reason: undefined, usageMetadata: { totalTokenCount: 10 } },
|
|
948
|
+
},
|
|
949
|
+
];
|
|
950
|
+
mockGeminiClient.sendMessageStream.mockReturnValue(createStreamFromEvents(events));
|
|
951
|
+
await runNonInteractive({
|
|
952
|
+
config: mockConfig,
|
|
953
|
+
settings: mockSettings,
|
|
954
|
+
input: 'Test input',
|
|
955
|
+
prompt_id: 'prompt-id-deprecated',
|
|
956
|
+
hasDeprecatedPromptArg: true,
|
|
957
|
+
});
|
|
958
|
+
expect(processStderrSpy).toHaveBeenCalledWith('The --prompt (-p) flag has been deprecated and will be removed in a future version. Please use a positional argument for your prompt. See gemini --help for more information.\n');
|
|
959
|
+
expect(processStdoutSpy).toHaveBeenCalledWith('Final Answer');
|
|
960
|
+
});
|
|
961
|
+
it('should display a deprecation warning for JSON format', async () => {
|
|
962
|
+
const events = [
|
|
963
|
+
{ type: GeminiEventType.Content, value: 'Final Answer' },
|
|
964
|
+
{
|
|
965
|
+
type: GeminiEventType.Finished,
|
|
966
|
+
value: { reason: undefined, usageMetadata: { totalTokenCount: 10 } },
|
|
967
|
+
},
|
|
968
|
+
];
|
|
969
|
+
mockGeminiClient.sendMessageStream.mockReturnValue(createStreamFromEvents(events));
|
|
970
|
+
vi.mocked(mockConfig.getOutputFormat).mockReturnValue(OutputFormat.JSON);
|
|
971
|
+
await runNonInteractive({
|
|
972
|
+
config: mockConfig,
|
|
973
|
+
settings: mockSettings,
|
|
974
|
+
input: 'Test input',
|
|
975
|
+
prompt_id: 'prompt-id-deprecated-json',
|
|
976
|
+
hasDeprecatedPromptArg: true,
|
|
977
|
+
});
|
|
978
|
+
const deprecateText = 'The --prompt (-p) flag has been deprecated and will be removed in a future version. Please use a positional argument for your prompt. See gemini --help for more information.\n';
|
|
979
|
+
expect(processStderrSpy).toHaveBeenCalledWith(deprecateText);
|
|
980
|
+
});
|
|
875
981
|
});
|
|
876
982
|
//# sourceMappingURL=nonInteractiveCli.test.js.map
|