@google/gemini-cli 0.1.8-rc.0 → 0.1.8

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (54) hide show
  1. package/README.md +4 -2
  2. package/dist/google-gemini-cli-0.1.8.tgz +0 -0
  3. package/dist/package.json +7 -7
  4. package/dist/src/config/auth.js +1 -1
  5. package/dist/src/config/auth.js.map +1 -1
  6. package/dist/src/gemini.js +2 -2
  7. package/dist/src/gemini.js.map +1 -1
  8. package/dist/src/generated/git-commit.d.ts +1 -1
  9. package/dist/src/generated/git-commit.js +1 -1
  10. package/dist/src/ui/App.js +2 -2
  11. package/dist/src/ui/App.js.map +1 -1
  12. package/dist/src/ui/components/AuthDialog.d.ts +3 -3
  13. package/dist/src/ui/components/AuthDialog.js +3 -6
  14. package/dist/src/ui/components/AuthDialog.js.map +1 -1
  15. package/dist/src/ui/components/AuthDialog.test.js +3 -3
  16. package/dist/src/ui/components/AuthDialog.test.js.map +1 -1
  17. package/dist/src/ui/components/SessionSummaryDisplay.js +3 -25
  18. package/dist/src/ui/components/SessionSummaryDisplay.js.map +1 -1
  19. package/dist/src/ui/components/SessionSummaryDisplay.test.js +2 -29
  20. package/dist/src/ui/components/SessionSummaryDisplay.test.js.map +1 -1
  21. package/dist/src/ui/components/StatsDisplay.d.ts +1 -0
  22. package/dist/src/ui/components/StatsDisplay.js +9 -2
  23. package/dist/src/ui/components/StatsDisplay.js.map +1 -1
  24. package/dist/src/ui/components/StatsDisplay.test.js +34 -0
  25. package/dist/src/ui/components/StatsDisplay.test.js.map +1 -1
  26. package/dist/src/ui/components/shared/MaxSizedBox.js +2 -1
  27. package/dist/src/ui/components/shared/MaxSizedBox.js.map +1 -1
  28. package/dist/src/ui/hooks/useAuthCommand.d.ts +2 -3
  29. package/dist/src/ui/hooks/useAuthCommand.js +7 -13
  30. package/dist/src/ui/hooks/useAuthCommand.js.map +1 -1
  31. package/dist/src/ui/hooks/useGeminiStream.test.js +1 -1
  32. package/dist/src/ui/hooks/useGeminiStream.test.js.map +1 -1
  33. package/dist/src/ui/privacy/PrivacyNotice.js +1 -1
  34. package/dist/src/ui/privacy/PrivacyNotice.js.map +1 -1
  35. package/dist/src/ui/utils/MarkdownDisplay.js +55 -0
  36. package/dist/src/ui/utils/MarkdownDisplay.js.map +1 -1
  37. package/dist/src/ui/utils/MarkdownDisplay.test.js +176 -0
  38. package/dist/src/ui/utils/MarkdownDisplay.test.js.map +1 -0
  39. package/dist/src/ui/utils/TableRenderer.d.ts +17 -0
  40. package/dist/src/ui/utils/TableRenderer.js +66 -0
  41. package/dist/src/ui/utils/TableRenderer.js.map +1 -0
  42. package/dist/src/ui/utils/errorParsing.js +1 -1
  43. package/dist/src/ui/utils/errorParsing.js.map +1 -1
  44. package/dist/src/ui/utils/updateCheck.js +3 -1
  45. package/dist/src/ui/utils/updateCheck.js.map +1 -1
  46. package/dist/tsconfig.tsbuildinfo +1 -1
  47. package/package.json +7 -7
  48. package/dist/google-gemini-cli-0.1.8-rc.0.tgz +0 -0
  49. package/dist/src/ui/components/Stats.d.ts +0 -39
  50. package/dist/src/ui/components/Stats.js +0 -23
  51. package/dist/src/ui/components/Stats.js.map +0 -1
  52. package/dist/src/ui/components/Stats.test.js +0 -57
  53. package/dist/src/ui/components/Stats.test.js.map +0 -1
  54. /package/dist/src/ui/{components/Stats.test.d.ts → utils/MarkdownDisplay.test.d.ts} +0 -0
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@google/gemini-cli",
3
- "version": "0.1.8-rc.0",
3
+ "version": "0.1.8",
4
4
  "description": "Gemini CLI",
5
5
  "repository": "google-gemini/gemini-cli",
6
6
  "type": "module",
@@ -10,7 +10,6 @@
10
10
  },
11
11
  "scripts": {
12
12
  "build": "node ../../scripts/build_package.js",
13
- "clean": "rm -rf dist",
14
13
  "start": "node dist/index.js",
15
14
  "debug": "node --inspect-brk dist/index.js",
16
15
  "lint": "eslint . --ext .ts,.tsx",
@@ -27,10 +26,10 @@
27
26
  "dist"
28
27
  ],
29
28
  "config": {
30
- "sandboxImageUri": "us-docker.pkg.dev/gemini-code-dev/gemini-cli/sandbox:0.1.8-rc.0"
29
+ "sandboxImageUri": "us-docker.pkg.dev/gemini-code-dev/gemini-cli/sandbox:0.1.8"
31
30
  },
32
31
  "dependencies": {
33
- "@google/gemini-cli-core": "0.1.8-rc.0",
32
+ "@google/gemini-cli-core": "0.1.8",
34
33
  "@types/update-notifier": "^6.0.8",
35
34
  "command-exists": "^1.2.9",
36
35
  "diff": "^7.0.0",
@@ -41,9 +40,9 @@
41
40
  "ink": "^6.0.1",
42
41
  "ink-big-text": "^2.0.0",
43
42
  "ink-gradient": "^3.0.0",
43
+ "ink-link": "^4.1.0",
44
44
  "ink-select-input": "^6.2.0",
45
45
  "ink-spinner": "^5.0.0",
46
- "ink-link": "^4.1.0",
47
46
  "ink-text-input": "^6.0.0",
48
47
  "lowlight": "^3.3.0",
49
48
  "mime-types": "^2.1.4",
@@ -58,20 +57,21 @@
58
57
  "yargs": "^17.7.2"
59
58
  },
60
59
  "devDependencies": {
61
- "@testing-library/react": "^16.3.0",
62
60
  "@babel/runtime": "^7.27.6",
61
+ "@testing-library/react": "^16.3.0",
63
62
  "@types/command-exists": "^1.2.3",
64
63
  "@types/diff": "^7.0.2",
65
64
  "@types/dotenv": "^6.1.1",
66
65
  "@types/node": "^20.11.24",
67
66
  "@types/react": "^19.1.8",
68
67
  "@types/react-dom": "^19.1.6",
68
+ "@types/semver": "^7.7.0",
69
69
  "@types/shell-quote": "^1.7.5",
70
70
  "@types/yargs": "^17.0.32",
71
71
  "ink-testing-library": "^4.0.0",
72
72
  "jsdom": "^26.1.0",
73
- "react-dom": "^19.1.0",
74
73
  "pretty-format": "^30.0.2",
74
+ "react-dom": "^19.1.0",
75
75
  "typescript": "^5.3.3",
76
76
  "vitest": "^3.1.1"
77
77
  },
@@ -1,39 +0,0 @@
1
- /**
2
- * @license
3
- * Copyright 2025 Google LLC
4
- * SPDX-License-Identifier: Apache-2.0
5
- */
6
- import React from 'react';
7
- export interface FormattedStats {
8
- inputTokens: number;
9
- outputTokens: number;
10
- toolUseTokens: number;
11
- thoughtsTokens: number;
12
- cachedTokens: number;
13
- totalTokens: number;
14
- }
15
- /**
16
- * Renders a single row with a colored label on the left and a value on the right.
17
- */
18
- export declare const StatRow: React.FC<{
19
- label: string;
20
- value: string | number;
21
- valueColor?: string;
22
- }>;
23
- /**
24
- * Renders a full column for either "Last Turn" or "Cumulative" stats.
25
- */
26
- export declare const StatsColumn: React.FC<{
27
- title: string;
28
- stats: FormattedStats;
29
- isCumulative?: boolean;
30
- width?: string | number;
31
- children?: React.ReactNode;
32
- }>;
33
- /**
34
- * Renders a column for displaying duration information.
35
- */
36
- export declare const DurationColumn: React.FC<{
37
- apiTime: string;
38
- wallTime: string;
39
- }>;
@@ -1,23 +0,0 @@
1
- import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
- import { Box, Text } from 'ink';
3
- import { Colors } from '../colors.js';
4
- // --- Helper Components ---
5
- /**
6
- * Renders a single row with a colored label on the left and a value on the right.
7
- */
8
- export const StatRow = ({ label, value, valueColor }) => (_jsxs(Box, { justifyContent: "space-between", gap: 2, children: [_jsx(Text, { color: Colors.LightBlue, children: label }), _jsx(Text, { color: valueColor, children: value })] }));
9
- /**
10
- * Renders a full column for either "Last Turn" or "Cumulative" stats.
11
- */
12
- export const StatsColumn = ({ title, stats, isCumulative = false, width, children }) => {
13
- const cachedDisplay = isCumulative && stats.totalTokens > 0
14
- ? `${stats.cachedTokens.toLocaleString()} (${((stats.cachedTokens / stats.totalTokens) * 100).toFixed(1)}%)`
15
- : stats.cachedTokens.toLocaleString();
16
- const cachedColor = isCumulative && stats.cachedTokens > 0 ? Colors.AccentGreen : undefined;
17
- return (_jsxs(Box, { flexDirection: "column", width: width, children: [_jsx(Text, { bold: true, children: title }), _jsxs(Box, { marginTop: 1, flexDirection: "column", children: [_jsx(StatRow, { label: "Input Tokens", value: stats.inputTokens.toLocaleString() }), _jsx(StatRow, { label: "Output Tokens", value: stats.outputTokens.toLocaleString() }), stats.toolUseTokens > 0 && (_jsx(StatRow, { label: "Tool Use Tokens", value: stats.toolUseTokens.toLocaleString() })), _jsx(StatRow, { label: "Thoughts Tokens", value: stats.thoughtsTokens.toLocaleString() }), stats.cachedTokens > 0 && (_jsx(StatRow, { label: "Cached Tokens", value: cachedDisplay, valueColor: cachedColor })), _jsx(Box, { borderTop: true, borderLeft: false, borderRight: false, borderBottom: false, borderStyle: "single" }), _jsx(StatRow, { label: "Total Tokens", value: stats.totalTokens.toLocaleString() }), children] })] }));
18
- };
19
- /**
20
- * Renders a column for displaying duration information.
21
- */
22
- export const DurationColumn = ({ apiTime, wallTime }) => (_jsxs(Box, { flexDirection: "column", width: '48%', children: [_jsx(Text, { bold: true, children: "Duration" }), _jsxs(Box, { marginTop: 1, flexDirection: "column", children: [_jsx(StatRow, { label: "API Time", value: apiTime }), _jsx(StatRow, { label: "Wall Time", value: wallTime })] })] }));
23
- //# sourceMappingURL=Stats.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"Stats.js","sourceRoot":"","sources":["../../../../src/ui/components/Stats.tsx"],"names":[],"mappings":"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"}
@@ -1,57 +0,0 @@
1
- import { jsx as _jsx } from "react/jsx-runtime";
2
- /**
3
- * @license
4
- * Copyright 2025 Google LLC
5
- * SPDX-License-Identifier: Apache-2.0
6
- */
7
- import { render } from 'ink-testing-library';
8
- import { describe, it, expect } from 'vitest';
9
- import { StatRow, StatsColumn, DurationColumn, } from './Stats.js';
10
- import { Colors } from '../colors.js';
11
- describe('<StatRow />', () => {
12
- it('renders a label and value', () => {
13
- const { lastFrame } = render(_jsx(StatRow, { label: "Test Label", value: "Test Value" }));
14
- expect(lastFrame()).toMatchSnapshot();
15
- });
16
- it('renders with a specific value color', () => {
17
- const { lastFrame } = render(_jsx(StatRow, { label: "Test Label", value: "Test Value", valueColor: Colors.AccentGreen }));
18
- expect(lastFrame()).toMatchSnapshot();
19
- });
20
- });
21
- describe('<StatsColumn />', () => {
22
- const mockStats = {
23
- inputTokens: 100,
24
- outputTokens: 200,
25
- toolUseTokens: 50,
26
- thoughtsTokens: 25,
27
- cachedTokens: 10,
28
- totalTokens: 385,
29
- };
30
- it('renders a stats column with children', () => {
31
- const { lastFrame } = render(_jsx(StatsColumn, { title: "Test Stats", stats: mockStats, children: _jsx(StatRow, { label: "Child Prop", value: "Child Value" }) }));
32
- expect(lastFrame()).toMatchSnapshot();
33
- });
34
- it('renders a stats column with a specific width', () => {
35
- const { lastFrame } = render(_jsx(StatsColumn, { title: "Test Stats", stats: mockStats, width: "50%" }));
36
- expect(lastFrame()).toMatchSnapshot();
37
- });
38
- it('renders a cumulative stats column with percentages', () => {
39
- const { lastFrame } = render(_jsx(StatsColumn, { title: "Cumulative Stats", stats: mockStats, isCumulative: true }));
40
- expect(lastFrame()).toMatchSnapshot();
41
- });
42
- it('hides the tool use row when there are no tool use tokens', () => {
43
- const statsWithNoToolUse = {
44
- ...mockStats,
45
- toolUseTokens: 0,
46
- };
47
- const { lastFrame } = render(_jsx(StatsColumn, { title: "Test Stats", stats: statsWithNoToolUse }));
48
- expect(lastFrame()).not.toContain('Tool Use Tokens');
49
- });
50
- });
51
- describe('<DurationColumn />', () => {
52
- it('renders a duration column', () => {
53
- const { lastFrame } = render(_jsx(DurationColumn, { apiTime: "5s", wallTime: "10s" }));
54
- expect(lastFrame()).toMatchSnapshot();
55
- });
56
- });
57
- //# sourceMappingURL=Stats.test.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"Stats.test.js","sourceRoot":"","sources":["../../../../src/ui/components/Stats.test.tsx"],"names":[],"mappings":"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"}