@ace-sdk/cli 3.12.0 ā 3.14.0
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/cli.d.ts.map +1 -1
- package/dist/cli.js +9 -18
- package/dist/cli.js.map +1 -1
- package/dist/commands/config.js +1 -1
- package/dist/commands/config.js.map +1 -1
- package/dist/commands/doctor.js +1 -1
- package/dist/commands/doctor.js.map +1 -1
- package/dist/commands/domains.js +3 -3
- package/dist/commands/domains.js.map +1 -1
- package/dist/commands/login.js +2 -2
- package/dist/commands/login.js.map +1 -1
- package/dist/commands/orgs.js +2 -2
- package/dist/commands/orgs.js.map +1 -1
- package/dist/commands/patterns.js +1 -1
- package/dist/commands/patterns.js.map +1 -1
- package/dist/commands/plugin.js +8 -8
- package/dist/commands/plugin.js.map +1 -1
- package/dist/commands/projects.d.ts +1 -1
- package/dist/commands/projects.js +2 -2
- package/dist/commands/projects.js.map +1 -1
- package/dist/commands/record.js +9 -9
- package/dist/commands/record.js.map +1 -1
- package/dist/commands/refresh.js +2 -2
- package/dist/commands/refresh.js.map +1 -1
- package/dist/commands/search.js +5 -5
- package/dist/commands/search.js.map +1 -1
- package/dist/commands/switch-org.js +2 -2
- package/dist/commands/switch-org.js.map +1 -1
- package/dist/commands/tune.js +1 -1
- package/dist/commands/tune.js.map +1 -1
- package/dist/commands/whoami.js +1 -1
- package/dist/commands/whoami.js.map +1 -1
- package/dist/services/plugin-loader.js +2 -2
- package/dist/services/plugin-loader.js.map +1 -1
- package/dist/services/server-client.d.ts.map +1 -1
- package/dist/services/server-client.js +1 -0
- package/dist/services/server-client.js.map +1 -1
- package/dist/utils/version-checker.js +1 -1
- package/dist/utils/version-checker.js.map +1 -1
- package/package.json +2 -2
- package/dist/commands/summarize.d.ts +0 -17
- package/dist/commands/summarize.d.ts.map +0 -1
- package/dist/commands/summarize.js +0 -167
- package/dist/commands/summarize.js.map +0 -1
|
@@ -1,167 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Session summarization command
|
|
3
|
-
*/
|
|
4
|
-
import { readFileSync, writeFileSync, existsSync } from 'fs';
|
|
5
|
-
import { getRecorder } from '../services/recorder.js';
|
|
6
|
-
import { globalOptions } from '../cli.js';
|
|
7
|
-
import { Logger } from '../services/logger.js';
|
|
8
|
-
import { createContext } from '../types/config.js';
|
|
9
|
-
import { ACEServerClient } from '../services/server-client.js';
|
|
10
|
-
import chalk from 'chalk';
|
|
11
|
-
/**
|
|
12
|
-
* Summarize a recorded session
|
|
13
|
-
*/
|
|
14
|
-
export async function summarizeCommand(sessionIdOrFile, options = {}) {
|
|
15
|
-
const logger = new Logger(globalOptions);
|
|
16
|
-
try {
|
|
17
|
-
// Determine if input is a session ID, file path, or stdin
|
|
18
|
-
let sessionData;
|
|
19
|
-
let sessionId;
|
|
20
|
-
if (options.stdin) {
|
|
21
|
-
// Read from stdin
|
|
22
|
-
logger.debug('Loading session from stdin');
|
|
23
|
-
const stdinData = readFileSync(0, 'utf8'); // fd 0 is stdin
|
|
24
|
-
sessionData = JSON.parse(stdinData.trim());
|
|
25
|
-
sessionId = sessionData.metadata?.id || 'stdin';
|
|
26
|
-
}
|
|
27
|
-
else if (!sessionIdOrFile) {
|
|
28
|
-
throw new Error('Must provide either a session ID/file or use --stdin');
|
|
29
|
-
}
|
|
30
|
-
else if (existsSync(sessionIdOrFile)) {
|
|
31
|
-
// It's a file path
|
|
32
|
-
logger.debug(`Loading session from file: ${sessionIdOrFile}`);
|
|
33
|
-
const fileContent = readFileSync(sessionIdOrFile, 'utf8');
|
|
34
|
-
sessionData = JSON.parse(fileContent);
|
|
35
|
-
sessionId = sessionData.metadata?.id || 'unknown';
|
|
36
|
-
}
|
|
37
|
-
else {
|
|
38
|
-
// It's a session ID - load from recorder
|
|
39
|
-
logger.debug(`Loading session from recorder: ${sessionIdOrFile}`);
|
|
40
|
-
const recorder = getRecorder();
|
|
41
|
-
sessionData = recorder.getSession(sessionIdOrFile);
|
|
42
|
-
sessionId = sessionIdOrFile;
|
|
43
|
-
}
|
|
44
|
-
// Get config and create client
|
|
45
|
-
const context = await createContext({ org: globalOptions.org, project: globalOptions.project });
|
|
46
|
-
const client = new ACEServerClient(context, logger);
|
|
47
|
-
// Fetch server config for defaults
|
|
48
|
-
const serverConfig = await client.getConfig();
|
|
49
|
-
const runtimeSettings = serverConfig?.runtime_settings || {};
|
|
50
|
-
const effectiveStyle = runtimeSettings.summarizationStyle || 'short';
|
|
51
|
-
const effectiveMaxTokens = runtimeSettings.summarizationMaxTokens || 1000;
|
|
52
|
-
logger.debug(`Summarization settings: style=${effectiveStyle}, max_tokens=${effectiveMaxTokens}`);
|
|
53
|
-
// Show spinner
|
|
54
|
-
const spinner = logger.spinner('Analyzing session...');
|
|
55
|
-
// Send to server for summarization (server will use runtime settings)
|
|
56
|
-
const summary = await client.summarizeSession(sessionData);
|
|
57
|
-
spinner?.succeed();
|
|
58
|
-
// Format output based on requested format (CLI option > 'text' default)
|
|
59
|
-
const format = options.format || 'text';
|
|
60
|
-
if (logger.isJson() || format === 'json') {
|
|
61
|
-
// JSON output
|
|
62
|
-
const output = {
|
|
63
|
-
session_id: sessionId,
|
|
64
|
-
summary: summary.summary,
|
|
65
|
-
key_events: summary.key_events,
|
|
66
|
-
insights: summary.insights,
|
|
67
|
-
duration_ms: summary.duration_ms,
|
|
68
|
-
event_count: summary.event_count
|
|
69
|
-
};
|
|
70
|
-
if (options.output) {
|
|
71
|
-
writeFileSync(options.output, JSON.stringify(output, null, 2));
|
|
72
|
-
logger.success(`Summary saved to ${options.output}`);
|
|
73
|
-
}
|
|
74
|
-
else {
|
|
75
|
-
logger.output(output);
|
|
76
|
-
}
|
|
77
|
-
}
|
|
78
|
-
else if (format === 'markdown') {
|
|
79
|
-
// Markdown output
|
|
80
|
-
const markdown = formatSummaryAsMarkdown(sessionId, summary);
|
|
81
|
-
if (options.output) {
|
|
82
|
-
writeFileSync(options.output, markdown);
|
|
83
|
-
logger.success(`Summary saved to ${options.output}`);
|
|
84
|
-
}
|
|
85
|
-
else {
|
|
86
|
-
console.log(markdown);
|
|
87
|
-
}
|
|
88
|
-
}
|
|
89
|
-
else {
|
|
90
|
-
// Text output (default)
|
|
91
|
-
displaySummaryAsText(logger, sessionId, summary);
|
|
92
|
-
if (options.output) {
|
|
93
|
-
const markdown = formatSummaryAsMarkdown(sessionId, summary);
|
|
94
|
-
writeFileSync(options.output, markdown);
|
|
95
|
-
logger.success(`\nSummary saved to ${options.output}`);
|
|
96
|
-
}
|
|
97
|
-
}
|
|
98
|
-
}
|
|
99
|
-
catch (error) {
|
|
100
|
-
if (logger.isJson()) {
|
|
101
|
-
logger.output({
|
|
102
|
-
success: false,
|
|
103
|
-
error: error instanceof Error ? error.message : String(error)
|
|
104
|
-
});
|
|
105
|
-
}
|
|
106
|
-
else {
|
|
107
|
-
logger.error('Failed to summarize session', error instanceof Error ? error : String(error));
|
|
108
|
-
}
|
|
109
|
-
process.exit(1);
|
|
110
|
-
}
|
|
111
|
-
}
|
|
112
|
-
/**
|
|
113
|
-
* Display summary as formatted text
|
|
114
|
-
*/
|
|
115
|
-
function displaySummaryAsText(logger, sessionId, summary) {
|
|
116
|
-
logger.info(chalk.bold(`\nš Session Summary: ${sessionId}\n`));
|
|
117
|
-
// Duration and event count
|
|
118
|
-
const durationSeconds = (summary.duration_ms / 1000).toFixed(1);
|
|
119
|
-
logger.info(chalk.dim(`Duration: ${durationSeconds}s | Events: ${summary.event_count}\n`));
|
|
120
|
-
// Summary
|
|
121
|
-
logger.info(chalk.bold('Summary:'));
|
|
122
|
-
logger.info(summary.summary);
|
|
123
|
-
logger.info('');
|
|
124
|
-
// Key events
|
|
125
|
-
if (summary.key_events && summary.key_events.length > 0) {
|
|
126
|
-
logger.info(chalk.bold('Key Events:'));
|
|
127
|
-
for (const event of summary.key_events) {
|
|
128
|
-
const timestamp = new Date(event.timestamp).toLocaleTimeString();
|
|
129
|
-
logger.info(chalk.dim(` [${timestamp}]`) + ` ${event.type}: ${event.description}`);
|
|
130
|
-
}
|
|
131
|
-
logger.info('');
|
|
132
|
-
}
|
|
133
|
-
// Insights
|
|
134
|
-
if (summary.insights && summary.insights.length > 0) {
|
|
135
|
-
logger.info(chalk.bold('Insights:'));
|
|
136
|
-
for (const insight of summary.insights) {
|
|
137
|
-
logger.info(chalk.cyan(` ⢠${insight}`));
|
|
138
|
-
}
|
|
139
|
-
logger.info('');
|
|
140
|
-
}
|
|
141
|
-
}
|
|
142
|
-
/**
|
|
143
|
-
* Format summary as markdown
|
|
144
|
-
*/
|
|
145
|
-
function formatSummaryAsMarkdown(sessionId, summary) {
|
|
146
|
-
const durationSeconds = (summary.duration_ms / 1000).toFixed(1);
|
|
147
|
-
let markdown = `# Session Summary: ${sessionId}\n\n`;
|
|
148
|
-
markdown += `**Duration:** ${durationSeconds}s | **Events:** ${summary.event_count}\n\n`;
|
|
149
|
-
markdown += `## Summary\n\n${summary.summary}\n\n`;
|
|
150
|
-
if (summary.key_events && summary.key_events.length > 0) {
|
|
151
|
-
markdown += `## Key Events\n\n`;
|
|
152
|
-
for (const event of summary.key_events) {
|
|
153
|
-
const timestamp = new Date(event.timestamp).toLocaleTimeString();
|
|
154
|
-
markdown += `- **[${timestamp}]** ${event.type}: ${event.description}\n`;
|
|
155
|
-
}
|
|
156
|
-
markdown += '\n';
|
|
157
|
-
}
|
|
158
|
-
if (summary.insights && summary.insights.length > 0) {
|
|
159
|
-
markdown += `## Insights\n\n`;
|
|
160
|
-
for (const insight of summary.insights) {
|
|
161
|
-
markdown += `- ${insight}\n`;
|
|
162
|
-
}
|
|
163
|
-
markdown += '\n';
|
|
164
|
-
}
|
|
165
|
-
return markdown;
|
|
166
|
-
}
|
|
167
|
-
//# sourceMappingURL=summarize.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"summarize.js","sourceRoot":"","sources":["../../src/commands/summarize.ts"],"names":[],"mappings":"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"}
|