mirror of
http://10.0.2.1:3031/sauer/claude-code.git
synced 2026-06-30 16:26:58 +10:00
64 lines
8.9 KiB
TypeScript
64 lines
8.9 KiB
TypeScript
|
|
import { feature } from 'bun:bundle';
|
||
|
|
import * as React from 'react';
|
||
|
|
import type { LocalJSXCommandContext } from '../../commands.js';
|
||
|
|
import { ContextVisualization } from '../../components/ContextVisualization.js';
|
||
|
|
import { microcompactMessages } from '../../services/compact/microCompact.js';
|
||
|
|
import type { LocalJSXCommandOnDone } from '../../types/command.js';
|
||
|
|
import type { Message } from '../../types/message.js';
|
||
|
|
import { analyzeContextUsage } from '../../utils/analyzeContext.js';
|
||
|
|
import { getMessagesAfterCompactBoundary } from '../../utils/messages.js';
|
||
|
|
import { renderToAnsiString } from '../../utils/staticRender.js';
|
||
|
|
|
||
|
|
/**
|
||
|
|
* Apply the same context transforms query.ts does before the API call, so
|
||
|
|
* /context shows what the model actually sees rather than the REPL's raw
|
||
|
|
* history. Without projectView the token count overcounts by however much
|
||
|
|
* was collapsed — user sees "180k, 3 spans collapsed" when the API sees 120k.
|
||
|
|
*/
|
||
|
|
function toApiView(messages: Message[]): Message[] {
|
||
|
|
let view = getMessagesAfterCompactBoundary(messages);
|
||
|
|
if (feature('CONTEXT_COLLAPSE')) {
|
||
|
|
/* eslint-disable @typescript-eslint/no-require-imports */
|
||
|
|
const {
|
||
|
|
projectView
|
||
|
|
} = require('../../services/contextCollapse/operations.js') as typeof import('../../services/contextCollapse/operations.js');
|
||
|
|
/* eslint-enable @typescript-eslint/no-require-imports */
|
||
|
|
view = projectView(view);
|
||
|
|
}
|
||
|
|
return view;
|
||
|
|
}
|
||
|
|
export async function call(onDone: LocalJSXCommandOnDone, context: LocalJSXCommandContext): Promise<React.ReactNode> {
|
||
|
|
const {
|
||
|
|
messages,
|
||
|
|
getAppState,
|
||
|
|
options: {
|
||
|
|
mainLoopModel,
|
||
|
|
tools
|
||
|
|
}
|
||
|
|
} = context;
|
||
|
|
const apiView = toApiView(messages);
|
||
|
|
|
||
|
|
// Apply microcompact to get accurate representation of messages sent to API
|
||
|
|
const {
|
||
|
|
messages: compactedMessages
|
||
|
|
} = await microcompactMessages(apiView);
|
||
|
|
|
||
|
|
// Get terminal width for responsive sizing
|
||
|
|
const terminalWidth = process.stdout.columns || 80;
|
||
|
|
const appState = getAppState();
|
||
|
|
|
||
|
|
// Analyze context with compacted messages
|
||
|
|
// Pass original messages as last parameter for accurate API usage extraction
|
||
|
|
const data = await analyzeContextUsage(compactedMessages, mainLoopModel, async () => appState.toolPermissionContext, tools, appState.agentDefinitions, terminalWidth, context,
|
||
|
|
// Pass full context for system prompt calculation
|
||
|
|
undefined,
|
||
|
|
// mainThreadAgentDefinition
|
||
|
|
apiView // Original messages for API usage extraction
|
||
|
|
);
|
||
|
|
|
||
|
|
// Render to ANSI string to preserve colors and pass to onDone like local commands do
|
||
|
|
const output = await renderToAnsiString(<ContextVisualization data={data} />);
|
||
|
|
onDone(output);
|
||
|
|
return null;
|
||
|
|
}
|
||
|
|
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJmZWF0dXJlIiwiUmVhY3QiLCJMb2NhbEpTWENvbW1hbmRDb250ZXh0IiwiQ29udGV4dFZpc3VhbGl6YXRpb24iLCJtaWNyb2NvbXBhY3RNZXNzYWdlcyIsIkxvY2FsSlNYQ29tbWFuZE9uRG9uZSIsIk1lc3NhZ2UiLCJhbmFseXplQ29udGV4dFVzYWdlIiwiZ2V0TWVzc2FnZXNBZnRlckNvbXBhY3RCb3VuZGFyeSIsInJlbmRlclRvQW5zaVN0cmluZyIsInRvQXBpVmlldyIsIm1lc3NhZ2VzIiwidmlldyIsInByb2plY3RWaWV3IiwicmVxdWlyZSIsImNhbGwiLCJvbkRvbmUiLCJjb250ZXh0IiwiUHJvbWlzZSIsIlJlYWN0Tm9kZSIsImdldEFwcFN0YXRlIiwib3B0aW9ucyIsIm1haW5Mb29wTW9kZWwiLCJ0b29scyIsImFwaVZpZXciLCJjb21wYWN0ZWRNZXNzYWdlcyIsInRlcm1pbmFsV2lkdGgiLCJwcm9jZXNzIiwic3Rkb3V0IiwiY29sdW1ucyIsImFwcFN0YXRlIiwiZGF0YSIsInRvb2xQZXJtaXNzaW9uQ29udGV4dCIsImFnZW50RGVmaW5pdGlvbnMiLCJ1bmRlZmluZWQiLCJvdXRwdXQiXSwic291cmNlcyI6WyJjb250ZXh0LnRzeCJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBmZWF0dXJlIH0gZnJvbSAnYnVuOmJ1bmRsZSdcbmltcG9ydCAqIGFzIFJlYWN0IGZyb20gJ3JlYWN0J1xuaW1wb3J0IHR5cGUgeyBMb2NhbEpTWENvbW1hbmRDb250ZXh0IH0gZnJvbSAnLi4vLi4vY29tbWFuZHMuanMnXG5pbXBvcnQgeyBDb250ZXh0VmlzdWFsaXphdGlvbiB9IGZyb20gJy4uLy4uL2NvbXBvbmVudHMvQ29udGV4dFZpc3VhbGl6YXRpb24uanMnXG5pbXBvcnQgeyBtaWNyb2NvbXBhY3RNZXNzYWdlcyB9IGZyb20gJy4uLy4uL3NlcnZpY2VzL2NvbXBhY3QvbWljcm9Db21wYWN0LmpzJ1xuaW1wb3J0IHR5cGUgeyBMb2NhbEpTWENvbW1hbmRPbkRvbmUgfSBmcm9tICcuLi8uLi90eXBlcy9jb21tYW5kLmpzJ1xuaW1wb3J0IHR5cGUgeyBNZXNzYWdlIH0gZnJvbSAnLi4vLi4vdHlwZXMvbWVzc2FnZS5qcydcbmltcG9ydCB7IGFuYWx5emVDb250ZXh0VXNhZ2UgfSBmcm9tICcuLi8uLi91dGlscy9hbmFseXplQ29udGV4dC5qcydcbmltcG9ydCB7IGdldE1lc3NhZ2VzQWZ0ZXJDb21wYWN0Qm91bmRhcnkgfSBmcm9tICcuLi8uLi91dGlscy9tZXNzYWdlcy5qcydcbmltcG9ydCB7IHJlbmRlclRvQW5zaVN0cmluZyB9IGZyb20gJy4uLy4uL3V0aWxzL3N0YXRpY1JlbmRlci5qcydcblxuLyoqXG4gKiBBcHBseSB0aGUgc2FtZSBjb250ZXh0IHRyYW5zZm9ybXMgcXVlcnkudHMgZG9lcyBiZWZvcmUgdGhlIEFQSSBjYWxsLCBzb1xuICogL2NvbnRleHQgc2hvd3Mgd2hhdCB0aGUgbW9kZWwgYWN0dWFsbHkgc2VlcyByYXRoZXIgdGhhbiB0aGUgUkVQTCdzIHJhd1xuICogaGlzdG9yeS4gV2l0aG91dCBwcm9qZWN0VmlldyB0aGUgdG9rZW4gY291bnQgb3ZlcmNvdW50cyBieSBob3dldmVyIG11Y2hcbiAqIHdhcyBjb2xsYXBzZWQg4oCUIHVzZXIgc2VlcyBcIjE4MGssIDMgc3BhbnMgY29sbGFwc2VkXCIgd2hlbiB0aGUgQVBJIHNlZXMgMTIway5cbiAqL1xuZnVuY3Rpb24gdG9BcGlWaWV3KG1lc3NhZ2VzOiBNZXNzYWdlW10pOiBNZXNzYWdlW10ge1xuICBsZXQgdmlldyA9IGdldE1lc3NhZ2VzQWZ0ZXJDb21wYWN0Qm91bmRhcnkobWVzc2FnZXMpXG4gIGlmIChmZWF0dXJlKCdDT05URVhUX0NPTExBUFNFJykpIHtcbiAgICAvKiBlc2xpbnQtZGlzYWJsZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tcmVxdWlyZS1pbXBvcnRzICovXG4gICAgY29uc3QgeyBwcm9qZWN0VmlldyB9ID1cbiAgICAgIHJlcXVpcmUoJy4uLy4uL3NlcnZpY2VzL2NvbnRleHRDb2xsYXBzZS9vcGVyYXRpb25zLmpzJykgYXMgdHlwZW9mIGltcG9ydCgnLi4vLi4vc2VydmljZXMvY29udGV4dENvbGxhcHNlL29wZXJhdGlvbnMuanMnKVxuICAgIC8qIGVzbGludC1lbmFibGUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXJlcXVpcmUtaW1wb3J0cyAqL1xuICAgIHZpZXcgPSBwcm9qZWN0Vmlldyh2aWV3KVxuICB9XG4gIHJldHVybiB2aWV3XG59XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBjYWxsKFxuICBvbkRvbmU6IExvY2FsSlNYQ29tbWFuZE9uRG9uZSxcbiAgY29udGV4dDogTG9jYWxKU1hDb21tYW5kQ29udGV4dCxcbik6IFByb21pc2U8UmVhY3QuUmVhY3ROb2RlPiB7XG4gIGNvbnN0IHtcbiAgICBtZXNzYWdlcyxcbiAgICBnZXRBcHBTdGF0ZSxcbiAgICBvcHRpb25zOiB7IG1haW5Mb29wTW9kZWwsIHRvb2xzIH0sXG4gIH0gPSBjb250ZXh0XG5cbiAgY29uc3QgYXBpVmlldyA9IHRvQXBpVmlldyhtZXNzYWdlcylcblxuICAvLyBBcHBseSBtaWNyb2NvbXBhY3QgdG8gZ2V0IGFjY3VyYXRlIHJlcHJlc2VudGF0aW9uIG9mIG1lc3NhZ2VzIHNlbnQgdG8gQVBJXG4gIGNvbnN0IHsgbWVzc2FnZXM6IGNvbXBhY3RlZE1lc3NhZ2VzIH0gPSBhd2FpdCBtaWNyb2NvbXBhY3RNZXNzYWdlcyhhcGlWaWV3KVxuXG4gIC8vIEdldCB0ZXJtaW5hbCB3aWR0aCBmb3IgcmVzcG9uc2l2ZSBzaXppbmdcbiAgY29uc3QgdGVybWluYWxXaWR0aCA9IHByb2Nlc3Muc3Rkb3V0LmNvbHVtbnMgfHwgODBcblxuICBjb25zdCBhcHBTdGF0ZSA9IGdldEFwcFN0YXRlKClcblxuICAvLyBBbmFseXplIGNvbnRleHQgd2l0aCBjb21wYWN0ZWQgbWVzc2FnZXNcbiAgLy8gUGFzcyBvcmlnaW5hbCBtZXNzYWdlcyBhcyBsYXN0IHBhcmFtZXRlciBmb3IgYWNjdXJhdGUgQVBJIHVzYWdlIGV4dHJhY3Rpb25cbiAgY29uc3QgZGF0YSA9IGF3YWl0IGFuYWx5emVDb250ZXh0VXNhZ2UoXG4gICAgY29tcGFjdGVkTWVzc2FnZXMsXG4gICAgbWFpbkxvb3BNb2RlbCxcbiAgICBhc3luYyAoKSA9PiBhcHBTdGF0ZS50b29sUGVybWlzc2lvbkNvbnRleHQsXG4gICAgdG9vbHMsXG4gICAgYXBwU3RhdGUuYWdlbnREZWZpbml0aW9ucyxcbiAgICB0ZXJtaW5hbFdpZHRoLFxuICAgIGNvbnRleHQsIC8vIFBhc3MgZnVsbCBjb250ZXh0IGZvciBzeXN0ZW0gcHJvbXB0IGNhbGN1bGF0aW9uXG4gICAgdW5kZWZpbmVkLCAvLyBtYWluVGhyZWFkQWdlbnREZWZpbml0aW9uXG4
|