@machina.ai/cell-cli-core 1.40.1-rc2 → 1.41.1-rc2
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/docs/AFTER_MERGE_PROMPT.md +1 -1
- package/dist/docs/CHANGES.md +19 -0
- package/dist/docs/changelogs/index.md +18 -0
- package/dist/docs/changelogs/latest.md +243 -255
- package/dist/docs/changelogs/preview.md +168 -18
- package/dist/docs/cli/sandbox.md +162 -45
- package/dist/docs/cli/settings.md +19 -13
- package/dist/docs/reference/configuration.md +77 -0
- package/dist/docs/reference/keyboard-shortcuts.md +1 -0
- package/dist/index.d.ts +1 -1
- package/dist/index.js +1 -1
- package/dist/index.js.map +1 -1
- package/dist/package.json +3 -2
- package/dist/src/agents/local-executor.js +8 -0
- package/dist/src/agents/local-executor.js.map +1 -1
- package/dist/src/agents/skill-extraction-agent.js +5 -4
- package/dist/src/agents/skill-extraction-agent.js.map +1 -1
- package/dist/src/agents/skill-extraction-agent.test.js +4 -2
- package/dist/src/agents/skill-extraction-agent.test.js.map +1 -1
- package/dist/src/agents/types.d.ts +2 -0
- package/dist/src/agents/types.js.map +1 -1
- package/dist/src/code_assist/server.js +16 -0
- package/dist/src/code_assist/server.js.map +1 -1
- package/dist/src/code_assist/server.test.js +18 -0
- package/dist/src/code_assist/server.test.js.map +1 -1
- package/dist/src/config/config.d.ts +6 -0
- package/dist/src/config/config.js +26 -8
- package/dist/src/config/config.js.map +1 -1
- package/dist/src/config/config.test.js +39 -1
- package/dist/src/config/config.test.js.map +1 -1
- package/dist/src/config/defaultModelConfigs.js +69 -0
- package/dist/src/config/defaultModelConfigs.js.map +1 -1
- package/dist/src/config/models.d.ts +5 -1
- package/dist/src/config/models.js +34 -6
- package/dist/src/config/models.js.map +1 -1
- package/dist/src/config/models.test.js +23 -1
- package/dist/src/config/models.test.js.map +1 -1
- package/dist/src/context/config/configLoader.d.ts +1 -2
- package/dist/src/context/config/configLoader.js +12 -7
- package/dist/src/context/config/configLoader.js.map +1 -1
- package/dist/src/context/config/configLoader.test.js +8 -12
- package/dist/src/context/config/configLoader.test.js.map +1 -1
- package/dist/src/context/config/profiles.d.ts +7 -1
- package/dist/src/context/config/profiles.js +46 -5
- package/dist/src/context/config/profiles.js.map +1 -1
- package/dist/src/context/contextManager.js +5 -3
- package/dist/src/context/contextManager.js.map +1 -1
- package/dist/src/context/eventBus.d.ts +7 -0
- package/dist/src/context/eventBus.js +6 -0
- package/dist/src/context/eventBus.js.map +1 -1
- package/dist/src/context/graph/builtinBehaviors.js +3 -3
- package/dist/src/context/graph/builtinBehaviors.js.map +1 -1
- package/dist/src/context/graph/mapper.d.ts +4 -2
- package/dist/src/context/graph/mapper.js +15 -3
- package/dist/src/context/graph/mapper.js.map +1 -1
- package/dist/src/context/graph/toGraph.d.ts +13 -2
- package/dist/src/context/graph/toGraph.js +88 -32
- package/dist/src/context/graph/toGraph.js.map +1 -1
- package/dist/src/context/historyObserver.d.ts +1 -0
- package/dist/src/context/historyObserver.js +25 -26
- package/dist/src/context/historyObserver.js.map +1 -1
- package/dist/src/context/initializer.d.ts +9 -0
- package/dist/src/context/initializer.js +75 -0
- package/dist/src/context/initializer.js.map +1 -0
- package/dist/src/context/pipeline/contextWorkingBuffer.js +12 -6
- package/dist/src/context/pipeline/contextWorkingBuffer.js.map +1 -1
- package/dist/src/context/pipeline/contextWorkingBuffer.test.js +1 -1
- package/dist/src/context/pipeline/environmentImpl.d.ts +3 -2
- package/dist/src/context/pipeline/environmentImpl.js +6 -3
- package/dist/src/context/pipeline/environmentImpl.js.map +1 -1
- package/dist/src/context/pipeline/environmentImpl.test.js +1 -1
- package/dist/src/context/pipeline/environmentImpl.test.js.map +1 -1
- package/dist/src/context/pipeline/orchestrator.js +5 -0
- package/dist/src/context/pipeline/orchestrator.js.map +1 -1
- package/dist/src/context/processors/toolMaskingProcessor.js +21 -5
- package/dist/src/context/processors/toolMaskingProcessor.js.map +1 -1
- package/dist/src/context/processors/toolMaskingProcessor.test.js +22 -0
- package/dist/src/context/processors/toolMaskingProcessor.test.js.map +1 -1
- package/dist/src/context/system-tests/lifecycle.golden.test.js +5 -0
- package/dist/src/context/system-tests/lifecycle.golden.test.js.map +1 -1
- package/dist/src/context/system-tests/simulationHarness.js +1 -1
- package/dist/src/context/system-tests/simulationHarness.js.map +1 -1
- package/dist/src/context/testing/contextTestUtils.js +7 -3
- package/dist/src/context/testing/contextTestUtils.js.map +1 -1
- package/dist/src/context/tracer.js +3 -1
- package/dist/src/context/tracer.js.map +1 -1
- package/dist/src/context/tracer.test.js +4 -2
- package/dist/src/context/tracer.test.js.map +1 -1
- package/dist/src/context/utils/contextTokenCalculator.d.ts +2 -1
- package/dist/src/context/utils/contextTokenCalculator.js +13 -11
- package/dist/src/context/utils/contextTokenCalculator.js.map +1 -1
- package/dist/src/core/client.d.ts +1 -0
- package/dist/src/core/client.js +9 -8
- package/dist/src/core/client.js.map +1 -1
- package/dist/src/core/client.test.js +0 -3
- package/dist/src/core/client.test.js.map +1 -1
- package/dist/src/core/geminiChat.d.ts +2 -1
- package/dist/src/core/geminiChat.js +72 -20
- package/dist/src/core/geminiChat.js.map +1 -1
- package/dist/src/core/geminiChat.test.js +1 -0
- package/dist/src/core/geminiChat.test.js.map +1 -1
- package/dist/src/core/geminiChat_network_retry.test.js +1 -0
- package/dist/src/core/geminiChat_network_retry.test.js.map +1 -1
- package/dist/src/core/tokenLimits.d.ts +1 -0
- package/dist/src/core/tokenLimits.js +5 -1
- package/dist/src/core/tokenLimits.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/index.d.ts +9 -1
- package/dist/src/index.js +10 -1
- package/dist/src/index.js.map +1 -1
- package/dist/src/policy/policy-engine.js +12 -7
- package/dist/src/policy/policy-engine.js.map +1 -1
- package/dist/src/policy/policy-engine.test.js +69 -1
- package/dist/src/policy/policy-engine.test.js.map +1 -1
- package/dist/src/prompts/snippets.js +2 -1
- package/dist/src/prompts/snippets.js.map +1 -1
- package/dist/src/prompts/snippets.legacy.js +2 -1
- package/dist/src/prompts/snippets.legacy.js.map +1 -1
- package/dist/src/services/chatRecordingService.d.ts +1 -0
- package/dist/src/services/chatRecordingService.js +23 -0
- package/dist/src/services/chatRecordingService.js.map +1 -1
- package/dist/src/services/chatRecordingTypes.d.ts +13 -0
- package/dist/src/services/memoryService.d.ts +5 -0
- package/dist/src/services/memoryService.js +76 -53
- package/dist/src/services/memoryService.js.map +1 -1
- package/dist/src/services/memoryService.test.js +256 -12
- package/dist/src/services/memoryService.test.js.map +1 -1
- package/dist/src/services/sessionScratchpadUtils.d.ts +7 -0
- package/dist/src/services/sessionScratchpadUtils.js +121 -0
- package/dist/src/services/sessionScratchpadUtils.js.map +1 -0
- package/dist/src/services/sessionScratchpadUtils.test.d.ts +6 -0
- package/dist/src/services/sessionScratchpadUtils.test.js +27 -0
- package/dist/src/services/sessionScratchpadUtils.test.js.map +1 -0
- package/dist/src/services/sessionSummaryUtils.d.ts +3 -3
- package/dist/src/services/sessionSummaryUtils.js +232 -27
- package/dist/src/services/sessionSummaryUtils.js.map +1 -1
- package/dist/src/services/sessionSummaryUtils.test.js +449 -10
- package/dist/src/services/sessionSummaryUtils.test.js.map +1 -1
- package/dist/src/services/test-data/resolved-aliases-retry.golden.json +24 -0
- package/dist/src/services/test-data/resolved-aliases.golden.json +24 -0
- package/dist/src/tools/mcp-client.js +12 -2
- package/dist/src/tools/mcp-client.js.map +1 -1
- package/dist/src/tools/trackerTools.test.js +7 -2
- package/dist/src/tools/trackerTools.test.js.map +1 -1
- package/dist/src/utils/binaryCheck.d.ts +9 -0
- package/dist/src/utils/binaryCheck.js +13 -0
- package/dist/src/utils/binaryCheck.js.map +1 -0
- package/dist/src/utils/fsErrorMessages.js +4 -0
- package/dist/src/utils/fsErrorMessages.js.map +1 -1
- package/dist/src/utils/fsErrorMessages.test.js +21 -0
- package/dist/src/utils/fsErrorMessages.test.js.map +1 -1
- package/dist/src/utils/tokenCalculation.d.ts +2 -2
- package/dist/src/utils/tokenCalculation.js +15 -14
- package/dist/src/utils/tokenCalculation.js.map +1 -1
- package/dist/src/voice/audioRecorder.d.ts +27 -0
- package/dist/src/voice/audioRecorder.js +95 -0
- package/dist/src/voice/audioRecorder.js.map +1 -0
- package/dist/src/voice/geminiLiveTranscriptionProvider.d.ts +20 -0
- package/dist/src/voice/geminiLiveTranscriptionProvider.js +140 -0
- package/dist/src/voice/geminiLiveTranscriptionProvider.js.map +1 -0
- package/dist/src/voice/transcriptionFactory.d.ts +12 -0
- package/dist/src/voice/transcriptionFactory.js +32 -0
- package/dist/src/voice/transcriptionFactory.js.map +1 -0
- package/dist/src/voice/transcriptionProvider.d.ts +29 -0
- package/dist/src/voice/transcriptionProvider.js +7 -0
- package/dist/src/voice/transcriptionProvider.js.map +1 -0
- package/dist/src/voice/whisperModelManager.d.ts +26 -0
- package/dist/src/voice/whisperModelManager.js +79 -0
- package/dist/src/voice/whisperModelManager.js.map +1 -0
- package/dist/src/voice/whisperTranscriptionProvider.d.ts +34 -0
- package/dist/src/voice/whisperTranscriptionProvider.js +151 -0
- package/dist/src/voice/whisperTranscriptionProvider.js.map +1 -0
- package/dist/src/voice/whisperTranscriptionProvider.test.d.ts +6 -0
- package/dist/src/voice/whisperTranscriptionProvider.test.js +24 -0
- package/dist/src/voice/whisperTranscriptionProvider.test.js.map +1 -0
- package/dist/tsconfig.tsbuildinfo +1 -1
- package/package.json +3 -2
|
@@ -0,0 +1,121 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @license
|
|
3
|
+
* Copyright 2026 Google LLC
|
|
4
|
+
* SPDX-License-Identifier: Apache-2.0
|
|
5
|
+
*/
|
|
6
|
+
import { SHELL_TOOL_NAME } from '../tools/definitions/base-declarations.js';
|
|
7
|
+
const WORKFLOW_PART_SEPARATOR = ' | ';
|
|
8
|
+
const TOOL_SEQUENCE_SEPARATOR = ' -> ';
|
|
9
|
+
const SHELL_ASSIGNMENT_REGEX = /^[A-Za-z_][A-Za-z0-9_]*=/;
|
|
10
|
+
const SAFE_COMMAND_NAME_REGEX = /^[A-Za-z0-9_.@+-]+$/;
|
|
11
|
+
const SAFE_TOOL_SEQUENCE_ENTRY_REGEX = /^[A-Za-z_][A-Za-z0-9_:.]*$/;
|
|
12
|
+
function tokenizeShellCommand(command) {
|
|
13
|
+
const tokens = [];
|
|
14
|
+
let currentToken = '';
|
|
15
|
+
let quote;
|
|
16
|
+
for (let i = 0; i < command.length; i++) {
|
|
17
|
+
const char = command[i];
|
|
18
|
+
if (quote) {
|
|
19
|
+
if (char === quote) {
|
|
20
|
+
quote = undefined;
|
|
21
|
+
continue;
|
|
22
|
+
}
|
|
23
|
+
if (quote === '"' && char === '\\' && i + 1 < command.length) {
|
|
24
|
+
currentToken += command[i + 1];
|
|
25
|
+
i++;
|
|
26
|
+
continue;
|
|
27
|
+
}
|
|
28
|
+
currentToken += char;
|
|
29
|
+
continue;
|
|
30
|
+
}
|
|
31
|
+
if (char === ' ' || char === '\t' || char === '\n' || char === '\r') {
|
|
32
|
+
if (currentToken) {
|
|
33
|
+
tokens.push(currentToken);
|
|
34
|
+
currentToken = '';
|
|
35
|
+
}
|
|
36
|
+
continue;
|
|
37
|
+
}
|
|
38
|
+
if (char === '"' || char === "'" || char === '`') {
|
|
39
|
+
quote = char;
|
|
40
|
+
continue;
|
|
41
|
+
}
|
|
42
|
+
currentToken += char;
|
|
43
|
+
}
|
|
44
|
+
if (currentToken) {
|
|
45
|
+
tokens.push(currentToken);
|
|
46
|
+
}
|
|
47
|
+
return tokens;
|
|
48
|
+
}
|
|
49
|
+
function getSafeCommandName(token) {
|
|
50
|
+
if (!token || SHELL_ASSIGNMENT_REGEX.test(token)) {
|
|
51
|
+
return undefined;
|
|
52
|
+
}
|
|
53
|
+
const pathParts = token.split(/[/\\]/).filter(Boolean);
|
|
54
|
+
const basename = pathParts[pathParts.length - 1] ?? token;
|
|
55
|
+
if (!basename || basename.includes('://')) {
|
|
56
|
+
return 'shell';
|
|
57
|
+
}
|
|
58
|
+
return SAFE_COMMAND_NAME_REGEX.test(basename) ? basename : 'shell';
|
|
59
|
+
}
|
|
60
|
+
export function summarizeShellCommandForScratchpad(command) {
|
|
61
|
+
const normalized = command.replace(/\s+/g, ' ').trim();
|
|
62
|
+
if (normalized.length === 0) {
|
|
63
|
+
return undefined;
|
|
64
|
+
}
|
|
65
|
+
for (const token of tokenizeShellCommand(normalized)) {
|
|
66
|
+
const commandName = getSafeCommandName(token);
|
|
67
|
+
if (commandName) {
|
|
68
|
+
return commandName;
|
|
69
|
+
}
|
|
70
|
+
}
|
|
71
|
+
return undefined;
|
|
72
|
+
}
|
|
73
|
+
function sanitizeWorkflowToolSequenceEntry(entry) {
|
|
74
|
+
const trimmed = entry.trim();
|
|
75
|
+
if (!trimmed) {
|
|
76
|
+
return undefined;
|
|
77
|
+
}
|
|
78
|
+
const shellPrefix = `${SHELL_TOOL_NAME}:`;
|
|
79
|
+
if (trimmed.startsWith(shellPrefix)) {
|
|
80
|
+
const command = trimmed.slice(shellPrefix.length).trim();
|
|
81
|
+
const commandSummary = summarizeShellCommandForScratchpad(command);
|
|
82
|
+
return commandSummary
|
|
83
|
+
? `${SHELL_TOOL_NAME}: ${commandSummary}`
|
|
84
|
+
: SHELL_TOOL_NAME;
|
|
85
|
+
}
|
|
86
|
+
if (trimmed === SHELL_TOOL_NAME ||
|
|
87
|
+
SAFE_TOOL_SEQUENCE_ENTRY_REGEX.test(trimmed)) {
|
|
88
|
+
return trimmed;
|
|
89
|
+
}
|
|
90
|
+
return undefined;
|
|
91
|
+
}
|
|
92
|
+
export function sanitizeWorkflowSummaryForScratchpad(summary) {
|
|
93
|
+
const normalized = summary.replace(/\s+/g, ' ').trim();
|
|
94
|
+
if (!normalized.includes(`${SHELL_TOOL_NAME}:`)) {
|
|
95
|
+
return normalized;
|
|
96
|
+
}
|
|
97
|
+
const sanitizedParts = [];
|
|
98
|
+
for (const part of normalized.split(WORKFLOW_PART_SEPARATOR)) {
|
|
99
|
+
const trimmed = part.trim();
|
|
100
|
+
if (!trimmed) {
|
|
101
|
+
continue;
|
|
102
|
+
}
|
|
103
|
+
if (trimmed.includes(`${SHELL_TOOL_NAME}:`)) {
|
|
104
|
+
const sanitizedToolSequence = trimmed
|
|
105
|
+
.split(TOOL_SEQUENCE_SEPARATOR)
|
|
106
|
+
.map(sanitizeWorkflowToolSequenceEntry)
|
|
107
|
+
.filter((entry) => Boolean(entry));
|
|
108
|
+
if (sanitizedToolSequence.length > 0) {
|
|
109
|
+
sanitizedParts.push(sanitizedToolSequence.join(TOOL_SEQUENCE_SEPARATOR));
|
|
110
|
+
}
|
|
111
|
+
continue;
|
|
112
|
+
}
|
|
113
|
+
if (trimmed.startsWith('paths ') ||
|
|
114
|
+
trimmed === 'validated' ||
|
|
115
|
+
trimmed === 'validation failed') {
|
|
116
|
+
sanitizedParts.push(trimmed);
|
|
117
|
+
}
|
|
118
|
+
}
|
|
119
|
+
return sanitizedParts.join(WORKFLOW_PART_SEPARATOR);
|
|
120
|
+
}
|
|
121
|
+
//# sourceMappingURL=sessionScratchpadUtils.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"sessionScratchpadUtils.js","sourceRoot":"","sources":["../../../src/services/sessionScratchpadUtils.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @license
|
|
3
|
+
* Copyright 2026 Google LLC
|
|
4
|
+
* SPDX-License-Identifier: Apache-2.0
|
|
5
|
+
*/
|
|
6
|
+
import { describe, expect, it } from 'vitest';
|
|
7
|
+
import { SHELL_TOOL_NAME } from '../tools/definitions/base-declarations.js';
|
|
8
|
+
import { sanitizeWorkflowSummaryForScratchpad, summarizeShellCommandForScratchpad, } from './sessionScratchpadUtils.js';
|
|
9
|
+
describe('sessionScratchpadUtils', () => {
|
|
10
|
+
describe('summarizeShellCommandForScratchpad', () => {
|
|
11
|
+
it('summarizes quoted and assignment-prefixed shell commands', () => {
|
|
12
|
+
expect(summarizeShellCommandForScratchpad('"npm" run test')).toBe('npm');
|
|
13
|
+
expect(summarizeShellCommandForScratchpad('DATABASE_URL=postgres://user:password@example/db pnpm test')).toBe('pnpm');
|
|
14
|
+
});
|
|
15
|
+
it('handles adversarial unterminated quoted input without exposing arguments', () => {
|
|
16
|
+
const adversarialCommand = `"${'\\"!'.repeat(10_000)}`;
|
|
17
|
+
expect(summarizeShellCommandForScratchpad(adversarialCommand)).toBe('shell');
|
|
18
|
+
});
|
|
19
|
+
});
|
|
20
|
+
describe('sanitizeWorkflowSummaryForScratchpad', () => {
|
|
21
|
+
it('sanitizes adversarial shell commands in workflow summaries', () => {
|
|
22
|
+
const adversarialCommand = `"${'\\"!'.repeat(10_000)}`;
|
|
23
|
+
expect(sanitizeWorkflowSummaryForScratchpad(`${SHELL_TOOL_NAME}: ${adversarialCommand} -> read_file`)).toBe(`${SHELL_TOOL_NAME}: shell -> read_file`);
|
|
24
|
+
});
|
|
25
|
+
});
|
|
26
|
+
});
|
|
27
|
+
//# sourceMappingURL=sessionScratchpadUtils.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"sessionScratchpadUtils.test.js","sourceRoot":"","sources":["../../../src/services/sessionScratchpadUtils.test.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAE,QAAQ,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,QAAQ,CAAC;AAC9C,OAAO,EAAE,eAAe,EAAE,MAAM,2CAA2C,CAAC;AAC5E,OAAO,EACL,oCAAoC,EACpC,kCAAkC,GACnC,MAAM,6BAA6B,CAAC;AAErC,QAAQ,CAAC,wBAAwB,EAAE,GAAG,EAAE;IACtC,QAAQ,CAAC,oCAAoC,EAAE,GAAG,EAAE;QAClD,EAAE,CAAC,0DAA0D,EAAE,GAAG,EAAE;YAClE,MAAM,CAAC,kCAAkC,CAAC,gBAAgB,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;YACzE,MAAM,CACJ,kCAAkC,CAChC,4DAA4D,CAC7D,CACF,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;QACjB,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,0EAA0E,EAAE,GAAG,EAAE;YAClF,MAAM,kBAAkB,GAAG,IAAI,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,EAAE,CAAC;YAEvD,MAAM,CAAC,kCAAkC,CAAC,kBAAkB,CAAC,CAAC,CAAC,IAAI,CACjE,OAAO,CACR,CAAC;QACJ,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;IAEH,QAAQ,CAAC,sCAAsC,EAAE,GAAG,EAAE;QACpD,EAAE,CAAC,4DAA4D,EAAE,GAAG,EAAE;YACpE,MAAM,kBAAkB,GAAG,IAAI,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,EAAE,CAAC;YAEvD,MAAM,CACJ,oCAAoC,CAClC,GAAG,eAAe,KAAK,kBAAkB,eAAe,CACzD,CACF,CAAC,IAAI,CAAC,GAAG,eAAe,sBAAsB,CAAC,CAAC;QACnD,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC"}
|
|
@@ -5,12 +5,12 @@
|
|
|
5
5
|
*/
|
|
6
6
|
import type { Config } from '../config/config.js';
|
|
7
7
|
/**
|
|
8
|
-
* Finds the most recently updated previous session that still needs
|
|
9
|
-
* Returns the path if it needs a
|
|
8
|
+
* Finds the most recently updated previous session that still needs workflow metadata.
|
|
9
|
+
* Returns the path if it needs a scratchpad, null otherwise.
|
|
10
10
|
*/
|
|
11
11
|
export declare function getPreviousSession(config: Config): Promise<string | null>;
|
|
12
12
|
/**
|
|
13
|
-
* Generates summary for the previous session if it lacks
|
|
13
|
+
* Generates summary metadata for the previous session if it lacks a scratchpad.
|
|
14
14
|
* This is designed to be called fire-and-forget on startup.
|
|
15
15
|
*/
|
|
16
16
|
export declare function generateSummary(config: Config): Promise<void>;
|
|
@@ -7,9 +7,19 @@ import { SessionSummaryService } from './sessionSummaryService.js';
|
|
|
7
7
|
import { BaseLlmClient } from '../core/baseLlmClient.js';
|
|
8
8
|
import { debugLogger } from '../utils/debugLogger.js';
|
|
9
9
|
import { SESSION_FILE_PREFIX, loadConversationRecord, } from './chatRecordingService.js';
|
|
10
|
+
import { CoreToolCallStatus } from '../scheduler/types.js';
|
|
11
|
+
import { SHELL_TOOL_NAME } from '../tools/definitions/base-declarations.js';
|
|
12
|
+
import { summarizeShellCommandForScratchpad } from './sessionScratchpadUtils.js';
|
|
10
13
|
import fs from 'node:fs/promises';
|
|
11
14
|
import path from 'node:path';
|
|
12
15
|
const MIN_MESSAGES_FOR_SUMMARY = 1;
|
|
16
|
+
const MAX_SCRATCHPAD_TOOLS = 6;
|
|
17
|
+
const MAX_SCRATCHPAD_PATHS = 4;
|
|
18
|
+
const MAX_SCRATCHPAD_PATH_DEPTH = 6;
|
|
19
|
+
const MAX_WORKFLOW_SUMMARY_LENGTH = 160;
|
|
20
|
+
const VALIDATION_COMMAND_REGEX = /\b(test|tests|vitest|jest|pytest|cargo test|npm test|pnpm test|yarn test|bun test|lint|build|check|typecheck)\b/i;
|
|
21
|
+
const PATH_KEY_REGEX = /(path|file|dir|directory|cwd|root)/i;
|
|
22
|
+
const VALIDATION_TOOL_REGEX = /\b(test|lint|build|check|typecheck)\b/i;
|
|
13
23
|
function isSupportedSessionFile(fileName) {
|
|
14
24
|
return (fileName.startsWith(SESSION_FILE_PREFIX) &&
|
|
15
25
|
(fileName.endsWith('.json') || fileName.endsWith('.jsonl')));
|
|
@@ -46,6 +56,170 @@ function getSessionTimestampMs(session) {
|
|
|
46
56
|
const parsed = Date.parse(session.lastUpdated);
|
|
47
57
|
return Number.isNaN(parsed) ? 0 : parsed;
|
|
48
58
|
}
|
|
59
|
+
function normalizeToolName(name) {
|
|
60
|
+
const trimmed = name.trim();
|
|
61
|
+
return trimmed.length > 0 ? trimmed : 'unknown_tool';
|
|
62
|
+
}
|
|
63
|
+
function pushUniqueLimited(target, value, limit) {
|
|
64
|
+
if (!value || target.includes(value) || target.length >= limit) {
|
|
65
|
+
return;
|
|
66
|
+
}
|
|
67
|
+
target.push(value);
|
|
68
|
+
}
|
|
69
|
+
function normalizePathCandidate(candidate, projectRoot) {
|
|
70
|
+
const trimmed = candidate.trim();
|
|
71
|
+
if (trimmed.length === 0 ||
|
|
72
|
+
trimmed.length > 240 ||
|
|
73
|
+
trimmed.includes('\n') ||
|
|
74
|
+
(!trimmed.includes('/') &&
|
|
75
|
+
!trimmed.includes('\\') &&
|
|
76
|
+
!trimmed.startsWith('.') &&
|
|
77
|
+
path.extname(trimmed).length === 0)) {
|
|
78
|
+
return null;
|
|
79
|
+
}
|
|
80
|
+
let normalized = trimmed.replace(/\\/g, '/');
|
|
81
|
+
if (path.isAbsolute(trimmed)) {
|
|
82
|
+
const relative = path.relative(projectRoot, trimmed);
|
|
83
|
+
normalized =
|
|
84
|
+
relative && !relative.startsWith('..') && !path.isAbsolute(relative)
|
|
85
|
+
? relative.replace(/\\/g, '/')
|
|
86
|
+
: path.basename(trimmed);
|
|
87
|
+
}
|
|
88
|
+
if (normalized.length > 120) {
|
|
89
|
+
normalized = normalized.split('/').slice(-3).join('/');
|
|
90
|
+
}
|
|
91
|
+
return normalized.length > 0 ? normalized : null;
|
|
92
|
+
}
|
|
93
|
+
function collectPathsFromValue(value, projectRoot, paths, keyHint, depth = 0) {
|
|
94
|
+
if (paths.length >= MAX_SCRATCHPAD_PATHS ||
|
|
95
|
+
depth > MAX_SCRATCHPAD_PATH_DEPTH) {
|
|
96
|
+
return;
|
|
97
|
+
}
|
|
98
|
+
if (typeof value === 'string') {
|
|
99
|
+
if (!keyHint || !PATH_KEY_REGEX.test(keyHint)) {
|
|
100
|
+
return;
|
|
101
|
+
}
|
|
102
|
+
const normalized = normalizePathCandidate(value, projectRoot);
|
|
103
|
+
if (normalized) {
|
|
104
|
+
pushUniqueLimited(paths, normalized, MAX_SCRATCHPAD_PATHS);
|
|
105
|
+
}
|
|
106
|
+
return;
|
|
107
|
+
}
|
|
108
|
+
if (Array.isArray(value)) {
|
|
109
|
+
for (const item of value) {
|
|
110
|
+
collectPathsFromValue(item, projectRoot, paths, keyHint, depth + 1);
|
|
111
|
+
if (paths.length >= MAX_SCRATCHPAD_PATHS) {
|
|
112
|
+
return;
|
|
113
|
+
}
|
|
114
|
+
}
|
|
115
|
+
return;
|
|
116
|
+
}
|
|
117
|
+
if (typeof value !== 'object' || value === null) {
|
|
118
|
+
return;
|
|
119
|
+
}
|
|
120
|
+
for (const [key, nestedValue] of Object.entries(value)) {
|
|
121
|
+
collectPathsFromValue(nestedValue, projectRoot, paths, key, depth + 1);
|
|
122
|
+
if (paths.length >= MAX_SCRATCHPAD_PATHS) {
|
|
123
|
+
return;
|
|
124
|
+
}
|
|
125
|
+
}
|
|
126
|
+
}
|
|
127
|
+
function getToolCallCommand(toolCall) {
|
|
128
|
+
for (const key of ['command', 'cmd', 'script']) {
|
|
129
|
+
const value = toolCall.args[key];
|
|
130
|
+
if (typeof value === 'string' && value.trim().length > 0) {
|
|
131
|
+
return value;
|
|
132
|
+
}
|
|
133
|
+
}
|
|
134
|
+
return undefined;
|
|
135
|
+
}
|
|
136
|
+
function getToolSequenceEntry(toolCall) {
|
|
137
|
+
const toolName = normalizeToolName(toolCall.name);
|
|
138
|
+
if (toolName !== SHELL_TOOL_NAME) {
|
|
139
|
+
return toolName;
|
|
140
|
+
}
|
|
141
|
+
const command = getToolCallCommand(toolCall);
|
|
142
|
+
const commandSummary = command
|
|
143
|
+
? summarizeShellCommandForScratchpad(command)
|
|
144
|
+
: undefined;
|
|
145
|
+
return commandSummary ? `${toolName}: ${commandSummary}` : toolName;
|
|
146
|
+
}
|
|
147
|
+
function getValidationStatusForToolCall(toolCall) {
|
|
148
|
+
const command = getToolCallCommand(toolCall);
|
|
149
|
+
const isValidationTool = VALIDATION_TOOL_REGEX.test(toolCall.name) ||
|
|
150
|
+
(command ? VALIDATION_COMMAND_REGEX.test(command) : false);
|
|
151
|
+
if (!isValidationTool) {
|
|
152
|
+
return undefined;
|
|
153
|
+
}
|
|
154
|
+
if (toolCall.status === CoreToolCallStatus.Success) {
|
|
155
|
+
return 'passed';
|
|
156
|
+
}
|
|
157
|
+
if (toolCall.status === CoreToolCallStatus.Error ||
|
|
158
|
+
toolCall.status === CoreToolCallStatus.Cancelled) {
|
|
159
|
+
return 'failed';
|
|
160
|
+
}
|
|
161
|
+
return 'unknown';
|
|
162
|
+
}
|
|
163
|
+
function buildWorkflowSummary(toolSequence, touchedPaths, validationStatus) {
|
|
164
|
+
const parts = [];
|
|
165
|
+
if (toolSequence.length > 0) {
|
|
166
|
+
parts.push(toolSequence.join(' -> '));
|
|
167
|
+
}
|
|
168
|
+
if (touchedPaths.length > 0) {
|
|
169
|
+
parts.push(`paths ${touchedPaths.join(', ')}`);
|
|
170
|
+
}
|
|
171
|
+
if (validationStatus === 'passed') {
|
|
172
|
+
parts.push('validated');
|
|
173
|
+
}
|
|
174
|
+
else if (validationStatus === 'failed') {
|
|
175
|
+
parts.push('validation failed');
|
|
176
|
+
}
|
|
177
|
+
if (parts.length === 0) {
|
|
178
|
+
return undefined;
|
|
179
|
+
}
|
|
180
|
+
const summary = parts.join(' | ');
|
|
181
|
+
if (summary.length === 0) {
|
|
182
|
+
return undefined;
|
|
183
|
+
}
|
|
184
|
+
return summary.length > MAX_WORKFLOW_SUMMARY_LENGTH
|
|
185
|
+
? `${summary.slice(0, MAX_WORKFLOW_SUMMARY_LENGTH - 3)}...`
|
|
186
|
+
: summary;
|
|
187
|
+
}
|
|
188
|
+
function buildMemoryScratchpad(messages, projectRoot) {
|
|
189
|
+
const toolSequence = [];
|
|
190
|
+
const touchedPaths = [];
|
|
191
|
+
let validationStatus;
|
|
192
|
+
for (const message of messages) {
|
|
193
|
+
if (message.type !== 'gemini' || !message.toolCalls) {
|
|
194
|
+
continue;
|
|
195
|
+
}
|
|
196
|
+
for (const toolCall of message.toolCalls) {
|
|
197
|
+
pushUniqueLimited(toolSequence, getToolSequenceEntry(toolCall), MAX_SCRATCHPAD_TOOLS);
|
|
198
|
+
collectPathsFromValue(toolCall.args, projectRoot, touchedPaths);
|
|
199
|
+
const toolValidationStatus = getValidationStatusForToolCall(toolCall);
|
|
200
|
+
if (toolValidationStatus) {
|
|
201
|
+
validationStatus = toolValidationStatus;
|
|
202
|
+
}
|
|
203
|
+
}
|
|
204
|
+
}
|
|
205
|
+
const workflowSummary = buildWorkflowSummary(toolSequence, touchedPaths, validationStatus);
|
|
206
|
+
return {
|
|
207
|
+
version: 1,
|
|
208
|
+
...(workflowSummary ? { workflowSummary } : {}),
|
|
209
|
+
...(toolSequence.length > 0 ? { toolSequence } : {}),
|
|
210
|
+
...(touchedPaths.length > 0 ? { touchedPaths } : {}),
|
|
211
|
+
...(validationStatus ? { validationStatus } : {}),
|
|
212
|
+
};
|
|
213
|
+
}
|
|
214
|
+
function hasCurrentMemoryScratchpad(session) {
|
|
215
|
+
return Boolean(session.memoryScratchpad && session.memoryScratchpadIsStale !== true);
|
|
216
|
+
}
|
|
217
|
+
function hasSessionSummaryMetadata(session) {
|
|
218
|
+
return hasCurrentMemoryScratchpad(session);
|
|
219
|
+
}
|
|
220
|
+
function getLoadedMessageCount(session) {
|
|
221
|
+
return session.messageCount ?? session.messages.length;
|
|
222
|
+
}
|
|
49
223
|
/**
|
|
50
224
|
* Generates and saves a summary for a session file.
|
|
51
225
|
*/
|
|
@@ -55,9 +229,10 @@ async function generateAndSaveSummary(config, sessionPath) {
|
|
|
55
229
|
debugLogger.debug(`[SessionSummary] Could not read session ${sessionPath}`);
|
|
56
230
|
return;
|
|
57
231
|
}
|
|
58
|
-
// Skip if
|
|
59
|
-
|
|
60
|
-
|
|
232
|
+
// Skip if workflow metadata already exists; memory extraction can use the
|
|
233
|
+
// scratchpad even when summary generation was unavailable.
|
|
234
|
+
if (hasSessionSummaryMetadata(conversation)) {
|
|
235
|
+
debugLogger.debug(`[SessionSummary] Summary metadata already exists for ${sessionPath}, skipping`);
|
|
61
236
|
return;
|
|
62
237
|
}
|
|
63
238
|
// Skip if no messages
|
|
@@ -65,22 +240,25 @@ async function generateAndSaveSummary(config, sessionPath) {
|
|
|
65
240
|
debugLogger.debug(`[SessionSummary] No messages to summarize in ${sessionPath}`);
|
|
66
241
|
return;
|
|
67
242
|
}
|
|
68
|
-
|
|
69
|
-
const contentGenerator = config.getContentGenerator();
|
|
70
|
-
if (!contentGenerator) {
|
|
71
|
-
debugLogger.debug('[SessionSummary] Content generator not available, skipping summary generation');
|
|
72
|
-
return;
|
|
73
|
-
}
|
|
74
|
-
const baseLlmClient = new BaseLlmClient(contentGenerator, config);
|
|
75
|
-
const summaryService = new SessionSummaryService(baseLlmClient);
|
|
76
|
-
// Generate summary
|
|
77
|
-
const summary = await summaryService.generateSummary({
|
|
78
|
-
messages: conversation.messages,
|
|
79
|
-
});
|
|
243
|
+
let summary = conversation.summary;
|
|
80
244
|
if (!summary) {
|
|
81
|
-
|
|
82
|
-
|
|
245
|
+
const contentGenerator = config.getContentGenerator();
|
|
246
|
+
if (!contentGenerator) {
|
|
247
|
+
debugLogger.debug('[SessionSummary] Content generator not available, skipping summary generation');
|
|
248
|
+
}
|
|
249
|
+
else {
|
|
250
|
+
const baseLlmClient = new BaseLlmClient(contentGenerator, config);
|
|
251
|
+
const summaryService = new SessionSummaryService(baseLlmClient);
|
|
252
|
+
summary =
|
|
253
|
+
(await summaryService.generateSummary({
|
|
254
|
+
messages: conversation.messages,
|
|
255
|
+
})) ?? undefined;
|
|
256
|
+
if (!summary) {
|
|
257
|
+
debugLogger.warn(`[SessionSummary] Failed to generate summary for ${sessionPath}`);
|
|
258
|
+
}
|
|
259
|
+
}
|
|
83
260
|
}
|
|
261
|
+
let scratchpadSourceConversation = conversation;
|
|
84
262
|
// Re-read the file before writing to handle race conditions. For JSONL we
|
|
85
263
|
// only need the metadata; for legacy JSON we need the full record so we can
|
|
86
264
|
// round-trip the messages back to disk.
|
|
@@ -92,27 +270,52 @@ async function generateAndSaveSummary(config, sessionPath) {
|
|
|
92
270
|
debugLogger.debug(`[SessionSummary] Could not re-read ${sessionPath}`);
|
|
93
271
|
return;
|
|
94
272
|
}
|
|
95
|
-
// Check if summary was added by another process
|
|
96
|
-
if (freshConversation
|
|
97
|
-
debugLogger.debug(`[SessionSummary] Summary was added by another process for ${sessionPath}`);
|
|
273
|
+
// Check if summary metadata was added by another process
|
|
274
|
+
if (hasSessionSummaryMetadata(freshConversation)) {
|
|
275
|
+
debugLogger.debug(`[SessionSummary] Summary metadata was added by another process for ${sessionPath}`);
|
|
276
|
+
return;
|
|
277
|
+
}
|
|
278
|
+
if (!hasCurrentMemoryScratchpad(freshConversation) &&
|
|
279
|
+
(getLoadedMessageCount(freshConversation) !==
|
|
280
|
+
getLoadedMessageCount(conversation) ||
|
|
281
|
+
freshConversation.lastUpdated !== conversation.lastUpdated)) {
|
|
282
|
+
const latestConversation = await loadConversationRecord(sessionPath);
|
|
283
|
+
if (!latestConversation) {
|
|
284
|
+
debugLogger.debug(`[SessionSummary] Could not re-read ${sessionPath}`);
|
|
285
|
+
return;
|
|
286
|
+
}
|
|
287
|
+
if (hasSessionSummaryMetadata(latestConversation)) {
|
|
288
|
+
debugLogger.debug(`[SessionSummary] Summary metadata was added by another process for ${sessionPath}`);
|
|
289
|
+
return;
|
|
290
|
+
}
|
|
291
|
+
scratchpadSourceConversation = latestConversation;
|
|
292
|
+
}
|
|
293
|
+
const metadataUpdate = {};
|
|
294
|
+
if (!freshConversation.summary && summary) {
|
|
295
|
+
metadataUpdate.summary = summary;
|
|
296
|
+
}
|
|
297
|
+
if (!hasCurrentMemoryScratchpad(freshConversation)) {
|
|
298
|
+
metadataUpdate.memoryScratchpad = buildMemoryScratchpad(scratchpadSourceConversation.messages, config.getProjectRoot());
|
|
299
|
+
}
|
|
300
|
+
if (Object.keys(metadataUpdate).length === 0) {
|
|
98
301
|
return;
|
|
99
302
|
}
|
|
100
303
|
if (isJsonl) {
|
|
101
|
-
await fs.appendFile(sessionPath, `${JSON.stringify({ $set:
|
|
304
|
+
await fs.appendFile(sessionPath, `${JSON.stringify({ $set: metadataUpdate })}\n`);
|
|
102
305
|
}
|
|
103
306
|
else {
|
|
104
307
|
const lastUpdated = freshConversation.lastUpdated;
|
|
105
308
|
await fs.writeFile(sessionPath, JSON.stringify({
|
|
106
309
|
...freshConversation,
|
|
107
|
-
|
|
310
|
+
...metadataUpdate,
|
|
108
311
|
lastUpdated,
|
|
109
312
|
}, null, 2));
|
|
110
313
|
}
|
|
111
|
-
debugLogger.debug(`[SessionSummary] Saved summary for ${sessionPath}
|
|
314
|
+
debugLogger.debug(`[SessionSummary] Saved summary metadata for ${sessionPath}${summary ? `: "${summary}"` : ''}`);
|
|
112
315
|
}
|
|
113
316
|
/**
|
|
114
|
-
* Finds the most recently updated previous session that still needs
|
|
115
|
-
* Returns the path if it needs a
|
|
317
|
+
* Finds the most recently updated previous session that still needs workflow metadata.
|
|
318
|
+
* Returns the path if it needs a scratchpad, null otherwise.
|
|
116
319
|
*/
|
|
117
320
|
export async function getPreviousSession(config) {
|
|
118
321
|
try {
|
|
@@ -149,7 +352,9 @@ export async function getPreviousSession(config) {
|
|
|
149
352
|
continue;
|
|
150
353
|
if (conversation.sessionId === config.getSessionId())
|
|
151
354
|
continue;
|
|
152
|
-
if (conversation.
|
|
355
|
+
if (conversation.kind === 'subagent')
|
|
356
|
+
continue;
|
|
357
|
+
if (hasSessionSummaryMetadata(conversation))
|
|
153
358
|
continue;
|
|
154
359
|
// Only generate summaries for sessions with more than 1 user message.
|
|
155
360
|
// `loadConversationRecord` populates `userMessageCount` in metadataOnly
|
|
@@ -187,7 +392,7 @@ export async function getPreviousSession(config) {
|
|
|
187
392
|
}
|
|
188
393
|
}
|
|
189
394
|
/**
|
|
190
|
-
* Generates summary for the previous session if it lacks
|
|
395
|
+
* Generates summary metadata for the previous session if it lacks a scratchpad.
|
|
191
396
|
* This is designed to be called fire-and-forget on startup.
|
|
192
397
|
*/
|
|
193
398
|
export async function generateSummary(config) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"sessionSummaryUtils.js","sourceRoot":"","sources":["../../../src/services/sessionSummaryUtils.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"sessionSummaryUtils.js","sourceRoot":"","sources":["../../../src/services/sessionSummaryUtils.ts"],"names":[],"mappings":"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"}
|