@google/gemini-cli-core 0.21.0-nightly.20251209.ec9a8c7a7 → 0.21.0-preview.1

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 (58) hide show
  1. package/README.md +1 -1
  2. package/dist/google-gemini-cli-core-0.21.0-preview.0.tgz +0 -0
  3. package/dist/src/commands/restore.d.ts +1 -11
  4. package/dist/src/commands/restore.js +1 -0
  5. package/dist/src/commands/restore.js.map +1 -1
  6. package/dist/src/commands/restore.test.js +1 -0
  7. package/dist/src/commands/restore.test.js.map +1 -1
  8. package/dist/src/config/config.d.ts +3 -0
  9. package/dist/src/config/config.js +6 -0
  10. package/dist/src/config/config.js.map +1 -1
  11. package/dist/src/core/turn.d.ts +1 -0
  12. package/dist/src/core/turn.js.map +1 -1
  13. package/dist/src/generated/git-commit.d.ts +2 -2
  14. package/dist/src/generated/git-commit.js +2 -2
  15. package/dist/src/generated/git-commit.js.map +1 -1
  16. package/dist/src/ide/ide-client.js +3 -3
  17. package/dist/src/ide/ide-client.js.map +1 -1
  18. package/dist/src/ide/ide-client.test.js +17 -0
  19. package/dist/src/ide/ide-client.test.js.map +1 -1
  20. package/dist/src/index.d.ts +2 -0
  21. package/dist/src/index.js +2 -0
  22. package/dist/src/index.js.map +1 -1
  23. package/dist/src/resources/resource-registry.d.ts +30 -0
  24. package/dist/src/resources/resource-registry.js +57 -0
  25. package/dist/src/resources/resource-registry.js.map +1 -0
  26. package/dist/src/resources/resource-registry.test.d.ts +6 -0
  27. package/dist/src/resources/resource-registry.test.js +54 -0
  28. package/dist/src/resources/resource-registry.test.js.map +1 -0
  29. package/dist/src/services/gitService.js +5 -0
  30. package/dist/src/services/gitService.js.map +1 -1
  31. package/dist/src/services/gitService.test.js +28 -0
  32. package/dist/src/services/gitService.test.js.map +1 -1
  33. package/dist/src/services/shellExecutionService.js +47 -2
  34. package/dist/src/services/shellExecutionService.js.map +1 -1
  35. package/dist/src/services/shellExecutionService.test.js +102 -1
  36. package/dist/src/services/shellExecutionService.test.js.map +1 -1
  37. package/dist/src/tools/mcp-client-manager.d.ts +2 -1
  38. package/dist/src/tools/mcp-client-manager.js +4 -1
  39. package/dist/src/tools/mcp-client-manager.js.map +1 -1
  40. package/dist/src/tools/mcp-client-manager.test.js +13 -10
  41. package/dist/src/tools/mcp-client-manager.test.js.map +1 -1
  42. package/dist/src/tools/mcp-client.d.ts +25 -4
  43. package/dist/src/tools/mcp-client.js +132 -22
  44. package/dist/src/tools/mcp-client.js.map +1 -1
  45. package/dist/src/tools/mcp-client.test.js +197 -17
  46. package/dist/src/tools/mcp-client.test.js.map +1 -1
  47. package/dist/src/tools/tool-names.d.ts +1 -0
  48. package/dist/src/tools/tool-names.js +1 -0
  49. package/dist/src/tools/tool-names.js.map +1 -1
  50. package/dist/src/utils/checkpointUtils.d.ts +82 -0
  51. package/dist/src/utils/checkpointUtils.js +117 -0
  52. package/dist/src/utils/checkpointUtils.js.map +1 -0
  53. package/dist/src/utils/checkpointUtils.test.d.ts +6 -0
  54. package/dist/src/utils/checkpointUtils.test.js +229 -0
  55. package/dist/src/utils/checkpointUtils.test.js.map +1 -0
  56. package/dist/tsconfig.tsbuildinfo +1 -1
  57. package/package.json +1 -1
  58. package/dist/google-gemini-cli-core-0.21.0-nightly.20251207.025e450ac.tgz +0 -0
@@ -0,0 +1,82 @@
1
+ /**
2
+ * @license
3
+ * Copyright 2025 Google LLC
4
+ * SPDX-License-Identifier: Apache-2.0
5
+ */
6
+ import type { GitService } from '../services/gitService.js';
7
+ import type { GeminiClient } from '../core/client.js';
8
+ import { z } from 'zod';
9
+ import type { Content } from '@google/genai';
10
+ import type { ToolCallRequestInfo } from '../core/turn.js';
11
+ export interface ToolCallData<HistoryType = unknown, ArgsType = unknown> {
12
+ history?: HistoryType;
13
+ clientHistory?: Content[];
14
+ commitHash?: string;
15
+ toolCall: {
16
+ name: string;
17
+ args: ArgsType;
18
+ };
19
+ messageId?: string;
20
+ }
21
+ export declare function getToolCallDataSchema(historyItemSchema?: z.ZodTypeAny): z.ZodObject<{
22
+ history: z.ZodOptional<z.ZodArray<z.ZodTypeAny, "many">>;
23
+ clientHistory: z.ZodOptional<z.ZodArray<z.ZodObject<{
24
+ role: z.ZodOptional<z.ZodString>;
25
+ parts: z.ZodArray<z.ZodRecord<z.ZodString, z.ZodUnknown>, "many">;
26
+ }, "passthrough", z.ZodTypeAny, z.objectOutputType<{
27
+ role: z.ZodOptional<z.ZodString>;
28
+ parts: z.ZodArray<z.ZodRecord<z.ZodString, z.ZodUnknown>, "many">;
29
+ }, z.ZodTypeAny, "passthrough">, z.objectInputType<{
30
+ role: z.ZodOptional<z.ZodString>;
31
+ parts: z.ZodArray<z.ZodRecord<z.ZodString, z.ZodUnknown>, "many">;
32
+ }, z.ZodTypeAny, "passthrough">>, "many">>;
33
+ commitHash: z.ZodOptional<z.ZodString>;
34
+ toolCall: z.ZodObject<{
35
+ name: z.ZodString;
36
+ args: z.ZodRecord<z.ZodString, z.ZodUnknown>;
37
+ }, "strip", z.ZodTypeAny, {
38
+ name: string;
39
+ args: Record<string, unknown>;
40
+ }, {
41
+ name: string;
42
+ args: Record<string, unknown>;
43
+ }>;
44
+ messageId: z.ZodOptional<z.ZodString>;
45
+ }, "strip", z.ZodTypeAny, {
46
+ toolCall: {
47
+ name: string;
48
+ args: Record<string, unknown>;
49
+ };
50
+ history?: any[] | undefined;
51
+ clientHistory?: z.objectOutputType<{
52
+ role: z.ZodOptional<z.ZodString>;
53
+ parts: z.ZodArray<z.ZodRecord<z.ZodString, z.ZodUnknown>, "many">;
54
+ }, z.ZodTypeAny, "passthrough">[] | undefined;
55
+ commitHash?: string | undefined;
56
+ messageId?: string | undefined;
57
+ }, {
58
+ toolCall: {
59
+ name: string;
60
+ args: Record<string, unknown>;
61
+ };
62
+ history?: any[] | undefined;
63
+ clientHistory?: z.objectInputType<{
64
+ role: z.ZodOptional<z.ZodString>;
65
+ parts: z.ZodArray<z.ZodRecord<z.ZodString, z.ZodUnknown>, "many">;
66
+ }, z.ZodTypeAny, "passthrough">[] | undefined;
67
+ commitHash?: string | undefined;
68
+ messageId?: string | undefined;
69
+ }>;
70
+ export declare function generateCheckpointFileName(toolCall: ToolCallRequestInfo): string | null;
71
+ export declare function formatCheckpointDisplayList(filenames: string[]): string;
72
+ export declare function getTruncatedCheckpointNames(filenames: string[]): string[];
73
+ export declare function processRestorableToolCalls<HistoryType>(toolCalls: ToolCallRequestInfo[], gitService: GitService, geminiClient: GeminiClient, history?: HistoryType): Promise<{
74
+ checkpointsToWrite: Map<string, string>;
75
+ toolCallToCheckpointMap: Map<string, string>;
76
+ errors: string[];
77
+ }>;
78
+ export interface CheckpointInfo {
79
+ messageId: string;
80
+ checkpoint: string;
81
+ }
82
+ export declare function getCheckpointInfoList(checkpointFiles: Map<string, string>): CheckpointInfo[];
@@ -0,0 +1,117 @@
1
+ /**
2
+ * @license
3
+ * Copyright 2025 Google LLC
4
+ * SPDX-License-Identifier: Apache-2.0
5
+ */
6
+ import * as path from 'node:path';
7
+ import { getErrorMessage } from './errors.js';
8
+ import { z } from 'zod';
9
+ const ContentSchema = z
10
+ .object({
11
+ role: z.string().optional(),
12
+ parts: z.array(z.record(z.unknown())),
13
+ })
14
+ .passthrough();
15
+ export function getToolCallDataSchema(historyItemSchema) {
16
+ const schema = historyItemSchema ?? z.any();
17
+ return z.object({
18
+ history: z.array(schema).optional(),
19
+ clientHistory: z.array(ContentSchema).optional(),
20
+ commitHash: z.string().optional(),
21
+ toolCall: z.object({
22
+ name: z.string(),
23
+ args: z.record(z.unknown()),
24
+ }),
25
+ messageId: z.string().optional(),
26
+ });
27
+ }
28
+ export function generateCheckpointFileName(toolCall) {
29
+ const toolArgs = toolCall.args;
30
+ const toolFilePath = toolArgs['file_path'];
31
+ if (!toolFilePath) {
32
+ return null;
33
+ }
34
+ const timestamp = new Date()
35
+ .toISOString()
36
+ .replace(/:/g, '-')
37
+ .replace(/\./g, '_');
38
+ const toolName = toolCall.name;
39
+ const fileName = path.basename(toolFilePath);
40
+ return `${timestamp}-${fileName}-${toolName}`;
41
+ }
42
+ export function formatCheckpointDisplayList(filenames) {
43
+ return getTruncatedCheckpointNames(filenames).join('\n');
44
+ }
45
+ export function getTruncatedCheckpointNames(filenames) {
46
+ return filenames.map((file) => {
47
+ const components = file.split('.');
48
+ if (components.length <= 1) {
49
+ return file;
50
+ }
51
+ components.pop();
52
+ return components.join('.');
53
+ });
54
+ }
55
+ export async function processRestorableToolCalls(toolCalls, gitService, geminiClient, history) {
56
+ const checkpointsToWrite = new Map();
57
+ const toolCallToCheckpointMap = new Map();
58
+ const errors = [];
59
+ for (const toolCall of toolCalls) {
60
+ try {
61
+ let commitHash;
62
+ try {
63
+ commitHash = await gitService.createFileSnapshot(`Snapshot for ${toolCall.name}`);
64
+ }
65
+ catch (error) {
66
+ errors.push(`Failed to create new snapshot for ${toolCall.name}: ${getErrorMessage(error)}. Attempting to use current commit.`);
67
+ commitHash = await gitService.getCurrentCommitHash();
68
+ }
69
+ if (!commitHash) {
70
+ errors.push(`Failed to create snapshot for ${toolCall.name}. Checkpointing may not be working properly. Ensure Git is installed and the project directory is accessible.`);
71
+ continue;
72
+ }
73
+ const checkpointFileName = generateCheckpointFileName(toolCall);
74
+ if (!checkpointFileName) {
75
+ errors.push(`Skipping restorable tool call due to missing file_path: ${toolCall.name}`);
76
+ continue;
77
+ }
78
+ const clientHistory = await geminiClient.getHistory();
79
+ const checkpointData = {
80
+ history,
81
+ clientHistory,
82
+ toolCall: {
83
+ name: toolCall.name,
84
+ args: toolCall.args,
85
+ },
86
+ commitHash,
87
+ messageId: toolCall.prompt_id,
88
+ };
89
+ const fileName = `${checkpointFileName}.json`;
90
+ checkpointsToWrite.set(fileName, JSON.stringify(checkpointData, null, 2));
91
+ toolCallToCheckpointMap.set(toolCall.callId, fileName.replace('.json', ''));
92
+ }
93
+ catch (error) {
94
+ errors.push(`Failed to create checkpoint for ${toolCall.name}: ${getErrorMessage(error)}`);
95
+ }
96
+ }
97
+ return { checkpointsToWrite, toolCallToCheckpointMap, errors };
98
+ }
99
+ export function getCheckpointInfoList(checkpointFiles) {
100
+ const checkpointInfoList = [];
101
+ for (const [file, content] of checkpointFiles) {
102
+ try {
103
+ const toolCallData = JSON.parse(content);
104
+ if (toolCallData.messageId) {
105
+ checkpointInfoList.push({
106
+ messageId: toolCallData.messageId,
107
+ checkpoint: file.replace('.json', ''),
108
+ });
109
+ }
110
+ }
111
+ catch (_e) {
112
+ // Ignore invalid JSON files
113
+ }
114
+ }
115
+ return checkpointInfoList;
116
+ }
117
+ //# sourceMappingURL=checkpointUtils.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"checkpointUtils.js","sourceRoot":"","sources":["../../../src/utils/checkpointUtils.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,6 @@
1
+ /**
2
+ * @license
3
+ * Copyright 2025 Google LLC
4
+ * SPDX-License-Identifier: Apache-2.0
5
+ */
6
+ export {};
@@ -0,0 +1,229 @@
1
+ /**
2
+ * @license
3
+ * Copyright 2025 Google LLC
4
+ * SPDX-License-Identifier: Apache-2.0
5
+ */
6
+ import { describe, it, expect, vi, beforeEach } from 'vitest';
7
+ import { z } from 'zod';
8
+ import { getToolCallDataSchema, generateCheckpointFileName, formatCheckpointDisplayList, getTruncatedCheckpointNames, processRestorableToolCalls, getCheckpointInfoList, } from './checkpointUtils.js';
9
+ describe('checkpoint utils', () => {
10
+ describe('getToolCallDataSchema', () => {
11
+ it('should return a schema that validates a basic tool call data object', () => {
12
+ const schema = getToolCallDataSchema();
13
+ const validData = {
14
+ toolCall: { name: 'test-tool', args: { foo: 'bar' } },
15
+ };
16
+ const result = schema.safeParse(validData);
17
+ expect(result.success).toBe(true);
18
+ });
19
+ it('should validate with an optional history schema', () => {
20
+ const historyItemSchema = z.object({ id: z.number(), event: z.string() });
21
+ const schema = getToolCallDataSchema(historyItemSchema);
22
+ const validData = {
23
+ history: [{ id: 1, event: 'start' }],
24
+ toolCall: { name: 'test-tool', args: {} },
25
+ };
26
+ const result = schema.safeParse(validData);
27
+ expect(result.success).toBe(true);
28
+ });
29
+ it('should fail validation if history items do not match the schema', () => {
30
+ const historyItemSchema = z.object({ id: z.number(), event: z.string() });
31
+ const schema = getToolCallDataSchema(historyItemSchema);
32
+ const invalidData = {
33
+ history: [{ id: '1', event: 'start' }], // id should be a number
34
+ toolCall: { name: 'test-tool', args: {} },
35
+ };
36
+ const result = schema.safeParse(invalidData);
37
+ expect(result.success).toBe(false);
38
+ });
39
+ it('should validate clientHistory with the correct schema', () => {
40
+ const schema = getToolCallDataSchema();
41
+ const validData = {
42
+ clientHistory: [{ role: 'user', parts: [{ text: 'Hello' }] }],
43
+ toolCall: { name: 'test-tool', args: {} },
44
+ };
45
+ const result = schema.safeParse(validData);
46
+ expect(result.success).toBe(true);
47
+ });
48
+ });
49
+ describe('generateCheckpointFileName', () => {
50
+ it('should generate a filename with timestamp, basename, and tool name', () => {
51
+ vi.useFakeTimers();
52
+ vi.setSystemTime(new Date('2025-01-01T12:00:00.000Z'));
53
+ const toolCall = {
54
+ callId: '1',
55
+ name: 'replace',
56
+ args: { file_path: '/path/to/my-file.txt' },
57
+ isClientInitiated: false,
58
+ prompt_id: 'p1',
59
+ };
60
+ const expected = '2025-01-01T12-00-00_000Z-my-file.txt-replace';
61
+ const actual = generateCheckpointFileName(toolCall);
62
+ expect(actual).toBe(expected);
63
+ vi.useRealTimers();
64
+ });
65
+ it('should return null if file_path is not in the tool arguments', () => {
66
+ const toolCall = {
67
+ callId: '1',
68
+ name: 'replace',
69
+ args: { some_other_arg: 'value' },
70
+ isClientInitiated: false,
71
+ prompt_id: 'p1',
72
+ };
73
+ const actual = generateCheckpointFileName(toolCall);
74
+ expect(actual).toBeNull();
75
+ });
76
+ });
77
+ describe('formatCheckpointDisplayList and getTruncatedCheckpointNames', () => {
78
+ const filenames = [
79
+ '2025-01-01T12-00-00_000Z-my-file.txt-replace.json',
80
+ '2025-01-01T13-00-00_000Z-another.js-write_file.json',
81
+ 'no-extension-file',
82
+ ];
83
+ it('getTruncatedCheckpointNames should remove the .json extension', () => {
84
+ const expected = [
85
+ '2025-01-01T12-00-00_000Z-my-file.txt-replace',
86
+ '2025-01-01T13-00-00_000Z-another.js-write_file',
87
+ 'no-extension-file',
88
+ ];
89
+ const actual = getTruncatedCheckpointNames(filenames);
90
+ expect(actual).toEqual(expected);
91
+ });
92
+ it('formatCheckpointDisplayList should return a newline-separated string of truncated names', () => {
93
+ const expected = [
94
+ '2025-01-01T12-00-00_000Z-my-file.txt-replace',
95
+ '2025-01-01T13-00-00_000Z-another.js-write_file',
96
+ 'no-extension-file',
97
+ ].join('\n');
98
+ const actual = formatCheckpointDisplayList(filenames);
99
+ expect(actual).toEqual(expected);
100
+ });
101
+ });
102
+ describe('processRestorableToolCalls', () => {
103
+ const mockGitService = {
104
+ createFileSnapshot: vi.fn(),
105
+ getCurrentCommitHash: vi.fn(),
106
+ };
107
+ const mockGeminiClient = {
108
+ getHistory: vi.fn(),
109
+ };
110
+ beforeEach(() => {
111
+ vi.clearAllMocks();
112
+ });
113
+ it('should create checkpoints for restorable tool calls', async () => {
114
+ const toolCalls = [
115
+ {
116
+ callId: '1',
117
+ name: 'replace',
118
+ args: { file_path: 'a.txt' },
119
+ prompt_id: 'p1',
120
+ isClientInitiated: false,
121
+ },
122
+ ];
123
+ mockGitService.createFileSnapshot.mockResolvedValue('hash123');
124
+ mockGeminiClient.getHistory.mockResolvedValue([
125
+ { role: 'user', parts: [] },
126
+ ]);
127
+ const { checkpointsToWrite, toolCallToCheckpointMap, errors } = await processRestorableToolCalls(toolCalls, mockGitService, mockGeminiClient, 'history-data');
128
+ expect(errors).toHaveLength(0);
129
+ expect(checkpointsToWrite.size).toBe(1);
130
+ expect(toolCallToCheckpointMap.get('1')).toBeDefined();
131
+ const fileName = checkpointsToWrite.values().next().value;
132
+ expect(fileName).toBeDefined();
133
+ const fileContent = JSON.parse(fileName);
134
+ expect(fileContent.commitHash).toBe('hash123');
135
+ expect(fileContent.history).toBe('history-data');
136
+ expect(fileContent.clientHistory).toEqual([{ role: 'user', parts: [] }]);
137
+ expect(fileContent.toolCall.name).toBe('replace');
138
+ expect(fileContent.messageId).toBe('p1');
139
+ });
140
+ it('should handle git snapshot failure by using current commit hash', async () => {
141
+ const toolCalls = [
142
+ {
143
+ callId: '1',
144
+ name: 'replace',
145
+ args: { file_path: 'a.txt' },
146
+ prompt_id: 'p1',
147
+ isClientInitiated: false,
148
+ },
149
+ ];
150
+ mockGitService.createFileSnapshot.mockRejectedValue(new Error('Snapshot failed'));
151
+ mockGitService.getCurrentCommitHash.mockResolvedValue('fallback-hash');
152
+ const { checkpointsToWrite, errors } = await processRestorableToolCalls(toolCalls, mockGitService, mockGeminiClient);
153
+ expect(errors).toHaveLength(1);
154
+ expect(errors[0]).toContain('Failed to create new snapshot');
155
+ expect(checkpointsToWrite.size).toBe(1);
156
+ const value = checkpointsToWrite.values().next().value;
157
+ expect(value).toBeDefined();
158
+ const fileContent = JSON.parse(value);
159
+ expect(fileContent.commitHash).toBe('fallback-hash');
160
+ });
161
+ it('should skip tool calls with no file_path', async () => {
162
+ const toolCalls = [
163
+ {
164
+ callId: '1',
165
+ name: 'replace',
166
+ args: { not_a_path: 'a.txt' },
167
+ prompt_id: 'p1',
168
+ isClientInitiated: false,
169
+ },
170
+ ];
171
+ mockGitService.createFileSnapshot.mockResolvedValue('hash123');
172
+ const { checkpointsToWrite, errors } = await processRestorableToolCalls(toolCalls, mockGitService, mockGeminiClient);
173
+ expect(errors).toHaveLength(1);
174
+ expect(errors[0]).toContain('Skipping restorable tool call due to missing file_path');
175
+ expect(checkpointsToWrite.size).toBe(0);
176
+ });
177
+ it('should log an error if git snapshot fails and then skip the tool call', async () => {
178
+ const toolCalls = [
179
+ {
180
+ callId: '1',
181
+ name: 'replace',
182
+ args: { file_path: 'a.txt' },
183
+ prompt_id: 'p1',
184
+ isClientInitiated: false,
185
+ },
186
+ ];
187
+ mockGitService.createFileSnapshot.mockRejectedValue(new Error('Snapshot failed'));
188
+ mockGitService.getCurrentCommitHash.mockResolvedValue(undefined);
189
+ const { checkpointsToWrite, errors } = await processRestorableToolCalls(toolCalls, mockGitService, mockGeminiClient);
190
+ expect(errors).toHaveLength(2);
191
+ expect(errors[0]).toContain('Failed to create new snapshot');
192
+ expect(errors[1]).toContain('Failed to create snapshot for replace');
193
+ expect(checkpointsToWrite.size).toBe(0);
194
+ });
195
+ });
196
+ describe('getCheckpointInfoList', () => {
197
+ it('should parse valid checkpoint files and return a list of info', () => {
198
+ const checkpointFiles = new Map([
199
+ ['checkpoint1.json', JSON.stringify({ messageId: 'msg1' })],
200
+ ['checkpoint2.json', JSON.stringify({ messageId: 'msg2' })],
201
+ ]);
202
+ const expected = [
203
+ { messageId: 'msg1', checkpoint: 'checkpoint1' },
204
+ { messageId: 'msg2', checkpoint: 'checkpoint2' },
205
+ ];
206
+ const actual = getCheckpointInfoList(checkpointFiles);
207
+ expect(actual).toEqual(expected);
208
+ });
209
+ it('should ignore files with invalid JSON', () => {
210
+ const checkpointFiles = new Map([
211
+ ['checkpoint1.json', JSON.stringify({ messageId: 'msg1' })],
212
+ ['invalid.json', 'not-json'],
213
+ ]);
214
+ const expected = [{ messageId: 'msg1', checkpoint: 'checkpoint1' }];
215
+ const actual = getCheckpointInfoList(checkpointFiles);
216
+ expect(actual).toEqual(expected);
217
+ });
218
+ it('should ignore files that are missing a messageId', () => {
219
+ const checkpointFiles = new Map([
220
+ ['checkpoint1.json', JSON.stringify({ messageId: 'msg1' })],
221
+ ['no-msg-id.json', JSON.stringify({ other_prop: 'value' })],
222
+ ]);
223
+ const expected = [{ messageId: 'msg1', checkpoint: 'checkpoint1' }];
224
+ const actual = getCheckpointInfoList(checkpointFiles);
225
+ expect(actual).toEqual(expected);
226
+ });
227
+ });
228
+ });
229
+ //# sourceMappingURL=checkpointUtils.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"checkpointUtils.test.js","sourceRoot":"","sources":["../../../src/utils/checkpointUtils.test.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAE,QAAQ,EAAE,EAAE,EAAE,MAAM,EAAE,EAAE,EAAE,UAAU,EAAa,MAAM,QAAQ,CAAC;AACzE,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,EACL,qBAAqB,EACrB,0BAA0B,EAC1B,2BAA2B,EAC3B,2BAA2B,EAC3B,0BAA0B,EAC1B,qBAAqB,GACtB,MAAM,sBAAsB,CAAC;AAK9B,QAAQ,CAAC,kBAAkB,EAAE,GAAG,EAAE;IAChC,QAAQ,CAAC,uBAAuB,EAAE,GAAG,EAAE;QACrC,EAAE,CAAC,qEAAqE,EAAE,GAAG,EAAE;YAC7E,MAAM,MAAM,GAAG,qBAAqB,EAAE,CAAC;YACvC,MAAM,SAAS,GAAG;gBAChB,QAAQ,EAAE,EAAE,IAAI,EAAE,WAAW,EAAE,IAAI,EAAE,EAAE,GAAG,EAAE,KAAK,EAAE,EAAE;aACtD,CAAC;YACF,MAAM,MAAM,GAAG,MAAM,CAAC,SAAS,CAAC,SAAS,CAAC,CAAC;YAC3C,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QACpC,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,iDAAiD,EAAE,GAAG,EAAE;YACzD,MAAM,iBAAiB,GAAG,CAAC,CAAC,MAAM,CAAC,EAAE,EAAE,EAAE,CAAC,CAAC,MAAM,EAAE,EAAE,KAAK,EAAE,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC;YAC1E,MAAM,MAAM,GAAG,qBAAqB,CAAC,iBAAiB,CAAC,CAAC;YACxD,MAAM,SAAS,GAAG;gBAChB,OAAO,EAAE,CAAC,EAAE,EAAE,EAAE,CAAC,EAAE,KAAK,EAAE,OAAO,EAAE,CAAC;gBACpC,QAAQ,EAAE,EAAE,IAAI,EAAE,WAAW,EAAE,IAAI,EAAE,EAAE,EAAE;aAC1C,CAAC;YACF,MAAM,MAAM,GAAG,MAAM,CAAC,SAAS,CAAC,SAAS,CAAC,CAAC;YAC3C,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QACpC,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,iEAAiE,EAAE,GAAG,EAAE;YACzE,MAAM,iBAAiB,GAAG,CAAC,CAAC,MAAM,CAAC,EAAE,EAAE,EAAE,CAAC,CAAC,MAAM,EAAE,EAAE,KAAK,EAAE,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC;YAC1E,MAAM,MAAM,GAAG,qBAAqB,CAAC,iBAAiB,CAAC,CAAC;YACxD,MAAM,WAAW,GAAG;gBAClB,OAAO,EAAE,CAAC,EAAE,EAAE,EAAE,GAAG,EAAE,KAAK,EAAE,OAAO,EAAE,CAAC,EAAE,wBAAwB;gBAChE,QAAQ,EAAE,EAAE,IAAI,EAAE,WAAW,EAAE,IAAI,EAAE,EAAE,EAAE;aAC1C,CAAC;YACF,MAAM,MAAM,GAAG,MAAM,CAAC,SAAS,CAAC,WAAW,CAAC,CAAC;YAC7C,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QACrC,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,uDAAuD,EAAE,GAAG,EAAE;YAC/D,MAAM,MAAM,GAAG,qBAAqB,EAAE,CAAC;YACvC,MAAM,SAAS,GAAG;gBAChB,aAAa,EAAE,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,CAAC,EAAE,IAAI,EAAE,OAAO,EAAE,CAAC,EAAE,CAAC;gBAC7D,QAAQ,EAAE,EAAE,IAAI,EAAE,WAAW,EAAE,IAAI,EAAE,EAAE,EAAE;aAC1C,CAAC;YACF,MAAM,MAAM,GAAG,MAAM,CAAC,SAAS,CAAC,SAAS,CAAC,CAAC;YAC3C,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QACpC,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;IAEH,QAAQ,CAAC,4BAA4B,EAAE,GAAG,EAAE;QAC1C,EAAE,CAAC,oEAAoE,EAAE,GAAG,EAAE;YAC5E,EAAE,CAAC,aAAa,EAAE,CAAC;YACnB,EAAE,CAAC,aAAa,CAAC,IAAI,IAAI,CAAC,0BAA0B,CAAC,CAAC,CAAC;YACvD,MAAM,QAAQ,GAAG;gBACf,MAAM,EAAE,GAAG;gBACX,IAAI,EAAE,SAAS;gBACf,IAAI,EAAE,EAAE,SAAS,EAAE,sBAAsB,EAAE;gBAC3C,iBAAiB,EAAE,KAAK;gBACxB,SAAS,EAAE,IAAI;aACO,CAAC;YAEzB,MAAM,QAAQ,GAAG,8CAA8C,CAAC;YAChE,MAAM,MAAM,GAAG,0BAA0B,CAAC,QAAQ,CAAC,CAAC;YACpD,MAAM,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;YAE9B,EAAE,CAAC,aAAa,EAAE,CAAC;QACrB,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,8DAA8D,EAAE,GAAG,EAAE;YACtE,MAAM,QAAQ,GAAG;gBACf,MAAM,EAAE,GAAG;gBACX,IAAI,EAAE,SAAS;gBACf,IAAI,EAAE,EAAE,cAAc,EAAE,OAAO,EAAE;gBACjC,iBAAiB,EAAE,KAAK;gBACxB,SAAS,EAAE,IAAI;aACO,CAAC;YAEzB,MAAM,MAAM,GAAG,0BAA0B,CAAC,QAAQ,CAAC,CAAC;YACpD,MAAM,CAAC,MAAM,CAAC,CAAC,QAAQ,EAAE,CAAC;QAC5B,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;IAEH,QAAQ,CAAC,6DAA6D,EAAE,GAAG,EAAE;QAC3E,MAAM,SAAS,GAAG;YAChB,mDAAmD;YACnD,qDAAqD;YACrD,mBAAmB;SACpB,CAAC;QAEF,EAAE,CAAC,+DAA+D,EAAE,GAAG,EAAE;YACvE,MAAM,QAAQ,GAAG;gBACf,8CAA8C;gBAC9C,gDAAgD;gBAChD,mBAAmB;aACpB,CAAC;YACF,MAAM,MAAM,GAAG,2BAA2B,CAAC,SAAS,CAAC,CAAC;YACtD,MAAM,CAAC,MAAM,CAAC,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC;QACnC,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,yFAAyF,EAAE,GAAG,EAAE;YACjG,MAAM,QAAQ,GAAG;gBACf,8CAA8C;gBAC9C,gDAAgD;gBAChD,mBAAmB;aACpB,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;YACb,MAAM,MAAM,GAAG,2BAA2B,CAAC,SAAS,CAAC,CAAC;YACtD,MAAM,CAAC,MAAM,CAAC,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC;QACnC,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;IAEH,QAAQ,CAAC,4BAA4B,EAAE,GAAG,EAAE;QAC1C,MAAM,cAAc,GAAG;YACrB,kBAAkB,EAAE,EAAE,CAAC,EAAE,EAAE;YAC3B,oBAAoB,EAAE,EAAE,CAAC,EAAE,EAAE;SACL,CAAC;QAE3B,MAAM,gBAAgB,GAAG;YACvB,UAAU,EAAE,EAAE,CAAC,EAAE,EAAE;SACO,CAAC;QAE7B,UAAU,CAAC,GAAG,EAAE;YACd,EAAE,CAAC,aAAa,EAAE,CAAC;QACrB,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,qDAAqD,EAAE,KAAK,IAAI,EAAE;YACnE,MAAM,SAAS,GAAG;gBAChB;oBACE,MAAM,EAAE,GAAG;oBACX,IAAI,EAAE,SAAS;oBACf,IAAI,EAAE,EAAE,SAAS,EAAE,OAAO,EAAE;oBAC5B,SAAS,EAAE,IAAI;oBACf,iBAAiB,EAAE,KAAK;iBACzB;aACuB,CAAC;YAE1B,cAAc,CAAC,kBAA2B,CAAC,iBAAiB,CAAC,SAAS,CAAC,CAAC;YACxE,gBAAgB,CAAC,UAAmB,CAAC,iBAAiB,CAAC;gBACtD,EAAE,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,EAAE,EAAE;aAC5B,CAAC,CAAC;YAEH,MAAM,EAAE,kBAAkB,EAAE,uBAAuB,EAAE,MAAM,EAAE,GAC3D,MAAM,0BAA0B,CAC9B,SAAS,EACT,cAAc,EACd,gBAAgB,EAChB,cAAc,CACf,CAAC;YAEJ,MAAM,CAAC,MAAM,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC;YAC/B,MAAM,CAAC,kBAAkB,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;YACxC,MAAM,CAAC,uBAAuB,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC,WAAW,EAAE,CAAC;YAEvD,MAAM,QAAQ,GAAG,kBAAkB,CAAC,MAAM,EAAE,CAAC,IAAI,EAAE,CAAC,KAAK,CAAC;YAC1D,MAAM,CAAC,QAAQ,CAAC,CAAC,WAAW,EAAE,CAAC;YAC/B,MAAM,WAAW,GAAG,IAAI,CAAC,KAAK,CAAC,QAAS,CAAC,CAAC;YAE1C,MAAM,CAAC,WAAW,CAAC,UAAU,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;YAC/C,MAAM,CAAC,WAAW,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,cAAc,CAAC,CAAC;YACjD,MAAM,CAAC,WAAW,CAAC,aAAa,CAAC,CAAC,OAAO,CAAC,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,EAAE,EAAE,CAAC,CAAC,CAAC;YACzE,MAAM,CAAC,WAAW,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;YAClD,MAAM,CAAC,WAAW,CAAC,SAAS,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAC3C,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,iEAAiE,EAAE,KAAK,IAAI,EAAE;YAC/E,MAAM,SAAS,GAAG;gBAChB;oBACE,MAAM,EAAE,GAAG;oBACX,IAAI,EAAE,SAAS;oBACf,IAAI,EAAE,EAAE,SAAS,EAAE,OAAO,EAAE;oBAC5B,SAAS,EAAE,IAAI;oBACf,iBAAiB,EAAE,KAAK;iBACzB;aACuB,CAAC;YAE1B,cAAc,CAAC,kBAA2B,CAAC,iBAAiB,CAC3D,IAAI,KAAK,CAAC,iBAAiB,CAAC,CAC7B,CAAC;YACD,cAAc,CAAC,oBAA6B,CAAC,iBAAiB,CAC7D,eAAe,CAChB,CAAC;YAEF,MAAM,EAAE,kBAAkB,EAAE,MAAM,EAAE,GAAG,MAAM,0BAA0B,CACrE,SAAS,EACT,cAAc,EACd,gBAAgB,CACjB,CAAC;YAEF,MAAM,CAAC,MAAM,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC;YAC/B,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,+BAA+B,CAAC,CAAC;YAC7D,MAAM,CAAC,kBAAkB,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;YACxC,MAAM,KAAK,GAAG,kBAAkB,CAAC,MAAM,EAAE,CAAC,IAAI,EAAE,CAAC,KAAK,CAAC;YACvD,MAAM,CAAC,KAAK,CAAC,CAAC,WAAW,EAAE,CAAC;YAC5B,MAAM,WAAW,GAAG,IAAI,CAAC,KAAK,CAAC,KAAM,CAAC,CAAC;YACvC,MAAM,CAAC,WAAW,CAAC,UAAU,CAAC,CAAC,IAAI,CAAC,eAAe,CAAC,CAAC;QACvD,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,0CAA0C,EAAE,KAAK,IAAI,EAAE;YACxD,MAAM,SAAS,GAAG;gBAChB;oBACE,MAAM,EAAE,GAAG;oBACX,IAAI,EAAE,SAAS;oBACf,IAAI,EAAE,EAAE,UAAU,EAAE,OAAO,EAAE;oBAC7B,SAAS,EAAE,IAAI;oBACf,iBAAiB,EAAE,KAAK;iBACzB;aACuB,CAAC;YAC1B,cAAc,CAAC,kBAA2B,CAAC,iBAAiB,CAAC,SAAS,CAAC,CAAC;YAEzE,MAAM,EAAE,kBAAkB,EAAE,MAAM,EAAE,GAAG,MAAM,0BAA0B,CACrE,SAAS,EACT,cAAc,EACd,gBAAgB,CACjB,CAAC;YAEF,MAAM,CAAC,MAAM,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC;YAC/B,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,SAAS,CACzB,wDAAwD,CACzD,CAAC;YACF,MAAM,CAAC,kBAAkB,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAC1C,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,uEAAuE,EAAE,KAAK,IAAI,EAAE;YACrF,MAAM,SAAS,GAAG;gBAChB;oBACE,MAAM,EAAE,GAAG;oBACX,IAAI,EAAE,SAAS;oBACf,IAAI,EAAE,EAAE,SAAS,EAAE,OAAO,EAAE;oBAC5B,SAAS,EAAE,IAAI;oBACf,iBAAiB,EAAE,KAAK;iBACzB;aACuB,CAAC;YAC1B,cAAc,CAAC,kBAA2B,CAAC,iBAAiB,CAC3D,IAAI,KAAK,CAAC,iBAAiB,CAAC,CAC7B,CAAC;YACD,cAAc,CAAC,oBAA6B,CAAC,iBAAiB,CAC7D,SAAS,CACV,CAAC;YAEF,MAAM,EAAE,kBAAkB,EAAE,MAAM,EAAE,GAAG,MAAM,0BAA0B,CACrE,SAAS,EACT,cAAc,EACd,gBAAgB,CACjB,CAAC;YAEF,MAAM,CAAC,MAAM,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC;YAC/B,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,+BAA+B,CAAC,CAAC;YAC7D,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,uCAAuC,CAAC,CAAC;YACrE,MAAM,CAAC,kBAAkB,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAC1C,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;IAEH,QAAQ,CAAC,uBAAuB,EAAE,GAAG,EAAE;QACrC,EAAE,CAAC,+DAA+D,EAAE,GAAG,EAAE;YACvE,MAAM,eAAe,GAAG,IAAI,GAAG,CAAC;gBAC9B,CAAC,kBAAkB,EAAE,IAAI,CAAC,SAAS,CAAC,EAAE,SAAS,EAAE,MAAM,EAAE,CAAC,CAAC;gBAC3D,CAAC,kBAAkB,EAAE,IAAI,CAAC,SAAS,CAAC,EAAE,SAAS,EAAE,MAAM,EAAE,CAAC,CAAC;aAC5D,CAAC,CAAC;YAEH,MAAM,QAAQ,GAAG;gBACf,EAAE,SAAS,EAAE,MAAM,EAAE,UAAU,EAAE,aAAa,EAAE;gBAChD,EAAE,SAAS,EAAE,MAAM,EAAE,UAAU,EAAE,aAAa,EAAE;aACjD,CAAC;YAEF,MAAM,MAAM,GAAG,qBAAqB,CAAC,eAAe,CAAC,CAAC;YACtD,MAAM,CAAC,MAAM,CAAC,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC;QACnC,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,uCAAuC,EAAE,GAAG,EAAE;YAC/C,MAAM,eAAe,GAAG,IAAI,GAAG,CAAC;gBAC9B,CAAC,kBAAkB,EAAE,IAAI,CAAC,SAAS,CAAC,EAAE,SAAS,EAAE,MAAM,EAAE,CAAC,CAAC;gBAC3D,CAAC,cAAc,EAAE,UAAU,CAAC;aAC7B,CAAC,CAAC;YAEH,MAAM,QAAQ,GAAG,CAAC,EAAE,SAAS,EAAE,MAAM,EAAE,UAAU,EAAE,aAAa,EAAE,CAAC,CAAC;YACpE,MAAM,MAAM,GAAG,qBAAqB,CAAC,eAAe,CAAC,CAAC;YACtD,MAAM,CAAC,MAAM,CAAC,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC;QACnC,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,kDAAkD,EAAE,GAAG,EAAE;YAC1D,MAAM,eAAe,GAAG,IAAI,GAAG,CAAC;gBAC9B,CAAC,kBAAkB,EAAE,IAAI,CAAC,SAAS,CAAC,EAAE,SAAS,EAAE,MAAM,EAAE,CAAC,CAAC;gBAC3D,CAAC,gBAAgB,EAAE,IAAI,CAAC,SAAS,CAAC,EAAE,UAAU,EAAE,OAAO,EAAE,CAAC,CAAC;aAC5D,CAAC,CAAC;YAEH,MAAM,QAAQ,GAAG,CAAC,EAAE,SAAS,EAAE,MAAM,EAAE,UAAU,EAAE,aAAa,EAAE,CAAC,CAAC;YACpE,MAAM,MAAM,GAAG,qBAAqB,CAAC,eAAe,CAAC,CAAC;YACtD,MAAM,CAAC,MAAM,CAAC,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC;QACnC,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC"}