@kb-labs/agent-cli 0.5.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/README.md +56 -0
- package/dist/cli/commands/diff.d.ts +17 -0
- package/dist/cli/commands/diff.js +182 -0
- package/dist/cli/commands/diff.js.map +1 -0
- package/dist/cli/commands/history.d.ts +16 -0
- package/dist/cli/commands/history.js +216 -0
- package/dist/cli/commands/history.js.map +1 -0
- package/dist/cli/commands/quality-report.d.ts +21 -0
- package/dist/cli/commands/quality-report.js +457 -0
- package/dist/cli/commands/quality-report.js.map +1 -0
- package/dist/cli/commands/rollback.d.ts +27 -0
- package/dist/cli/commands/rollback.js +109 -0
- package/dist/cli/commands/rollback.js.map +1 -0
- package/dist/cli/commands/run.d.ts +42 -0
- package/dist/cli/commands/run.js +923 -0
- package/dist/cli/commands/run.js.map +1 -0
- package/dist/cli/commands/trace-context.d.ts +22 -0
- package/dist/cli/commands/trace-context.js +131 -0
- package/dist/cli/commands/trace-context.js.map +1 -0
- package/dist/cli/commands/trace-diagnose.d.ts +20 -0
- package/dist/cli/commands/trace-diagnose.js +434 -0
- package/dist/cli/commands/trace-diagnose.js.map +1 -0
- package/dist/cli/commands/trace-event-normalizer.d.ts +13 -0
- package/dist/cli/commands/trace-event-normalizer.js +39 -0
- package/dist/cli/commands/trace-event-normalizer.js.map +1 -0
- package/dist/cli/commands/trace-filter.d.ts +19 -0
- package/dist/cli/commands/trace-filter.js +153 -0
- package/dist/cli/commands/trace-filter.js.map +1 -0
- package/dist/cli/commands/trace-iteration.d.ts +18 -0
- package/dist/cli/commands/trace-iteration.js +192 -0
- package/dist/cli/commands/trace-iteration.js.map +1 -0
- package/dist/cli/commands/trace-stats.d.ts +17 -0
- package/dist/cli/commands/trace-stats.js +247 -0
- package/dist/cli/commands/trace-stats.js.map +1 -0
- package/dist/index.d.ts +2 -0
- package/dist/index.js +473 -0
- package/dist/index.js.map +1 -0
- package/dist/manifest.d.ts +184 -0
- package/dist/manifest.js +473 -0
- package/dist/manifest.js.map +1 -0
- package/dist/rest/handlers/approve-handler.d.ts +15 -0
- package/dist/rest/handlers/approve-handler.js +60 -0
- package/dist/rest/handlers/approve-handler.js.map +1 -0
- package/dist/rest/handlers/approve-session-plan-handler.d.ts +10 -0
- package/dist/rest/handlers/approve-session-plan-handler.js +52 -0
- package/dist/rest/handlers/approve-session-plan-handler.js.map +1 -0
- package/dist/rest/handlers/correct-handler.d.ts +7 -0
- package/dist/rest/handlers/correct-handler.js +326 -0
- package/dist/rest/handlers/correct-handler.js.map +1 -0
- package/dist/rest/handlers/create-session-handler.d.ts +7 -0
- package/dist/rest/handlers/create-session-handler.js +25 -0
- package/dist/rest/handlers/create-session-handler.js.map +1 -0
- package/dist/rest/handlers/execute-session-plan-handler.d.ts +10 -0
- package/dist/rest/handlers/execute-session-plan-handler.js +635 -0
- package/dist/rest/handlers/execute-session-plan-handler.js.map +1 -0
- package/dist/rest/handlers/generate-spec-handler.d.ts +10 -0
- package/dist/rest/handlers/generate-spec-handler.js +389 -0
- package/dist/rest/handlers/generate-spec-handler.js.map +1 -0
- package/dist/rest/handlers/get-file-diff-handler.d.ts +24 -0
- package/dist/rest/handlers/get-file-diff-handler.js +44 -0
- package/dist/rest/handlers/get-file-diff-handler.js.map +1 -0
- package/dist/rest/handlers/get-session-handler.d.ts +10 -0
- package/dist/rest/handlers/get-session-handler.js +23 -0
- package/dist/rest/handlers/get-session-handler.js.map +1 -0
- package/dist/rest/handlers/get-session-plan-handler.d.ts +10 -0
- package/dist/rest/handlers/get-session-plan-handler.js +53 -0
- package/dist/rest/handlers/get-session-plan-handler.js.map +1 -0
- package/dist/rest/handlers/get-session-turns-handler.d.ts +16 -0
- package/dist/rest/handlers/get-session-turns-handler.js +35 -0
- package/dist/rest/handlers/get-session-turns-handler.js.map +1 -0
- package/dist/rest/handlers/get-spec-handler.d.ts +10 -0
- package/dist/rest/handlers/get-spec-handler.js +39 -0
- package/dist/rest/handlers/get-spec-handler.js.map +1 -0
- package/dist/rest/handlers/list-file-changes-handler.d.ts +13 -0
- package/dist/rest/handlers/list-file-changes-handler.js +34 -0
- package/dist/rest/handlers/list-file-changes-handler.js.map +1 -0
- package/dist/rest/handlers/list-sessions-handler.d.ts +7 -0
- package/dist/rest/handlers/list-sessions-handler.js +23 -0
- package/dist/rest/handlers/list-sessions-handler.js.map +1 -0
- package/dist/rest/handlers/rollback-handler.d.ts +22 -0
- package/dist/rest/handlers/rollback-handler.js +91 -0
- package/dist/rest/handlers/rollback-handler.js.map +1 -0
- package/dist/rest/handlers/run-handler.d.ts +7 -0
- package/dist/rest/handlers/run-handler.js +516 -0
- package/dist/rest/handlers/run-handler.js.map +1 -0
- package/dist/rest/handlers/sessions-handler.d.ts +18 -0
- package/dist/rest/handlers/sessions-handler.js +56 -0
- package/dist/rest/handlers/sessions-handler.js.map +1 -0
- package/dist/rest/handlers/status-handler.d.ts +7 -0
- package/dist/rest/handlers/status-handler.js +313 -0
- package/dist/rest/handlers/status-handler.js.map +1 -0
- package/dist/rest/handlers/stop-handler.d.ts +7 -0
- package/dist/rest/handlers/stop-handler.js +317 -0
- package/dist/rest/handlers/stop-handler.js.map +1 -0
- package/dist/widgets/220.js +446 -0
- package/dist/widgets/220.js.map +1 -0
- package/dist/widgets/331.js +2 -0
- package/dist/widgets/331.js.map +1 -0
- package/dist/widgets/403.js +2 -0
- package/dist/widgets/403.js.map +1 -0
- package/dist/widgets/406.js +35 -0
- package/dist/widgets/406.js.map +1 -0
- package/dist/widgets/455.js +2 -0
- package/dist/widgets/455.js.map +1 -0
- package/dist/widgets/482.js +2 -0
- package/dist/widgets/482.js.map +1 -0
- package/dist/widgets/485.js +2 -0
- package/dist/widgets/485.js.map +1 -0
- package/dist/widgets/527.js +2 -0
- package/dist/widgets/527.js.map +1 -0
- package/dist/widgets/628.js +2 -0
- package/dist/widgets/628.js.map +1 -0
- package/dist/widgets/694.js +2 -0
- package/dist/widgets/694.js.map +1 -0
- package/dist/widgets/712.js +2 -0
- package/dist/widgets/712.js.map +1 -0
- package/dist/widgets/866.js +2 -0
- package/dist/widgets/866.js.map +1 -0
- package/dist/widgets/915.js +39 -0
- package/dist/widgets/915.js.map +1 -0
- package/dist/widgets/957.js +10 -0
- package/dist/widgets/957.js.map +1 -0
- package/dist/widgets/983.js +2 -0
- package/dist/widgets/983.js.map +1 -0
- package/dist/widgets/@mf-types.d.ts +3 -0
- package/dist/widgets/@mf-types.zip +0 -0
- package/dist/widgets/__federation_expose_AgentsPage.js +2 -0
- package/dist/widgets/__federation_expose_AgentsPage.js.map +1 -0
- package/dist/widgets/mf-manifest.json +260 -0
- package/dist/widgets/mf-stats.json +305 -0
- package/dist/widgets/remoteEntry.js +7 -0
- package/dist/widgets/remoteEntry.js.map +1 -0
- package/dist/ws/session-stream-handler.d.ts +8 -0
- package/dist/ws/session-stream-handler.js +409 -0
- package/dist/ws/session-stream-handler.js.map +1 -0
- package/package.json +83 -0
|
@@ -0,0 +1,109 @@
|
|
|
1
|
+
import { defineCommand, useLogger } from '@kb-labs/sdk';
|
|
2
|
+
import { ChangeStore } from '@kb-labs/agent-history';
|
|
3
|
+
import { promises } from 'fs';
|
|
4
|
+
import path from 'path';
|
|
5
|
+
|
|
6
|
+
// src/cli/commands/rollback.ts
|
|
7
|
+
var rollback_default = defineCommand({
|
|
8
|
+
id: "rollback",
|
|
9
|
+
description: "Rollback file changes made by agents in a session or run",
|
|
10
|
+
handler: {
|
|
11
|
+
async execute(ctx, input) {
|
|
12
|
+
const logger = useLogger();
|
|
13
|
+
const flags = input.flags ?? input;
|
|
14
|
+
const sessionId = flags["session-id"] ?? flags["sessionId"];
|
|
15
|
+
const runId = flags["run-id"] ?? flags["runId"];
|
|
16
|
+
const filePath = flags["file"];
|
|
17
|
+
const dryRun = Boolean(flags["dry-run"] ?? flags["dryRun"]);
|
|
18
|
+
const asJson = Boolean(flags["json"]);
|
|
19
|
+
if (!sessionId) {
|
|
20
|
+
return output(ctx, asJson, { success: false, error: "Missing --session-id" }, 1);
|
|
21
|
+
}
|
|
22
|
+
const workingDir = process.cwd();
|
|
23
|
+
const store = new ChangeStore(workingDir);
|
|
24
|
+
try {
|
|
25
|
+
let changes;
|
|
26
|
+
if (runId && !filePath) {
|
|
27
|
+
changes = await store.listRun(sessionId, runId);
|
|
28
|
+
} else if (filePath) {
|
|
29
|
+
changes = await store.listFile(sessionId, filePath);
|
|
30
|
+
if (runId) {
|
|
31
|
+
changes = changes.filter((c) => c.runId === runId);
|
|
32
|
+
}
|
|
33
|
+
} else {
|
|
34
|
+
changes = await store.listSession(sessionId);
|
|
35
|
+
}
|
|
36
|
+
if (changes.length === 0) {
|
|
37
|
+
return output(ctx, asJson, { success: true, rolledBack: 0, message: "No changes to rollback" }, 0);
|
|
38
|
+
}
|
|
39
|
+
const ordered = [...changes].sort(
|
|
40
|
+
(a, b) => new Date(b.timestamp).getTime() - new Date(a.timestamp).getTime()
|
|
41
|
+
);
|
|
42
|
+
if (dryRun) {
|
|
43
|
+
const preview = ordered.map((c) => ({
|
|
44
|
+
filePath: c.filePath,
|
|
45
|
+
operation: c.operation,
|
|
46
|
+
action: !c.before ? "delete (was new file)" : "restore to before state"
|
|
47
|
+
}));
|
|
48
|
+
return output(ctx, asJson, { success: true, dryRun: true, wouldRollback: preview }, 0);
|
|
49
|
+
}
|
|
50
|
+
let rolledBack = 0;
|
|
51
|
+
const errors = [];
|
|
52
|
+
for (const change of ordered) {
|
|
53
|
+
const fullPath = path.join(workingDir, change.filePath);
|
|
54
|
+
try {
|
|
55
|
+
if (!change.before) {
|
|
56
|
+
await promises.unlink(fullPath).catch((e) => {
|
|
57
|
+
if (e.code !== "ENOENT") {
|
|
58
|
+
throw e;
|
|
59
|
+
}
|
|
60
|
+
});
|
|
61
|
+
} else {
|
|
62
|
+
await promises.mkdir(path.dirname(fullPath), { recursive: true });
|
|
63
|
+
await promises.writeFile(fullPath, change.before.content, "utf-8");
|
|
64
|
+
}
|
|
65
|
+
rolledBack++;
|
|
66
|
+
} catch (e) {
|
|
67
|
+
errors.push(`${change.filePath}: ${String(e)}`);
|
|
68
|
+
}
|
|
69
|
+
}
|
|
70
|
+
return output(ctx, asJson, { success: errors.length === 0, rolledBack, errors }, errors.length > 0 ? 1 : 0);
|
|
71
|
+
} catch (e) {
|
|
72
|
+
logger.error("agent:rollback error", e instanceof Error ? e : void 0);
|
|
73
|
+
return output(ctx, asJson, { success: false, error: String(e) }, 1);
|
|
74
|
+
}
|
|
75
|
+
}
|
|
76
|
+
}
|
|
77
|
+
});
|
|
78
|
+
function output(ctx, asJson, data, exitCode) {
|
|
79
|
+
if (asJson) {
|
|
80
|
+
ctx.ui.write(JSON.stringify(data, null, 2) + "\n");
|
|
81
|
+
} else {
|
|
82
|
+
const d = data;
|
|
83
|
+
if (d["success"]) {
|
|
84
|
+
if (d["dryRun"]) {
|
|
85
|
+
ctx.ui.write(`[DRY RUN] Would rollback:
|
|
86
|
+
`);
|
|
87
|
+
for (const p of d["wouldRollback"] ?? []) {
|
|
88
|
+
ctx.ui.write(` ${p["operation"]?.toUpperCase()} ${p["filePath"]} \u2192 ${p["action"]}
|
|
89
|
+
`);
|
|
90
|
+
}
|
|
91
|
+
} else {
|
|
92
|
+
ctx.ui.write(`\u2705 Rolled back ${d["rolledBack"]} change(s)
|
|
93
|
+
`);
|
|
94
|
+
for (const e of d["errors"] ?? []) {
|
|
95
|
+
ctx.ui.write(` \u26A0\uFE0F ${e}
|
|
96
|
+
`);
|
|
97
|
+
}
|
|
98
|
+
}
|
|
99
|
+
} else {
|
|
100
|
+
ctx.ui.write(`\u274C ${d["error"]}
|
|
101
|
+
`);
|
|
102
|
+
}
|
|
103
|
+
}
|
|
104
|
+
return { exitCode };
|
|
105
|
+
}
|
|
106
|
+
|
|
107
|
+
export { rollback_default as default };
|
|
108
|
+
//# sourceMappingURL=rollback.js.map
|
|
109
|
+
//# sourceMappingURL=rollback.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../../src/cli/commands/rollback.ts"],"names":["fsp"],"mappings":"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","file":"rollback.js","sourcesContent":["/**\n * agent:rollback — Rollback file changes made by agents.\n *\n * Uses ChangeStore from @kb-labs/agent-history.\n * All rollback logic is in ChangeTrackingMiddleware.rollbackRun() or handled here via ChangeStore.\n *\n * Usage:\n * pnpm kb agent:rollback --run-id={id} --session-id={id}\n * pnpm kb agent:rollback --file=src/index.ts --session-id={id}\n * pnpm kb agent:rollback --session-id={id}\n * pnpm kb agent:rollback --run-id={id} --session-id={id} --dry-run\n */\n\nimport { defineCommand, useLogger } from '@kb-labs/sdk';\nimport type { PluginContextV3 } from '@kb-labs/sdk';\nimport { ChangeStore } from '@kb-labs/agent-history';\nimport type { FileChange } from '@kb-labs/agent-history';\nimport { promises as fsp } from 'node:fs';\nimport path from 'node:path';\n\ntype RollbackInput = {\n 'run-id'?: string;\n runId?: string;\n 'session-id'?: string;\n sessionId?: string;\n file?: string;\n 'dry-run'?: boolean;\n dryRun?: boolean;\n json?: boolean;\n};\n\nexport default defineCommand({\n id: 'rollback',\n description: 'Rollback file changes made by agents in a session or run',\n\n handler: {\n async execute(ctx: PluginContextV3, input: RollbackInput): Promise<{ exitCode: number }> {\n const logger = useLogger();\n const flags = ((input as Record<string, unknown>).flags ?? input) as Record<string, unknown>;\n\n const sessionId = (flags['session-id'] ?? flags['sessionId']) as string | undefined;\n const runId = (flags['run-id'] ?? flags['runId']) as string | undefined;\n const filePath = flags['file'] as string | undefined;\n const dryRun = Boolean(flags['dry-run'] ?? flags['dryRun']);\n const asJson = Boolean(flags['json']);\n\n if (!sessionId) {\n return output(ctx, asJson, { success: false, error: 'Missing --session-id' }, 1);\n }\n\n const workingDir = process.cwd();\n const store = new ChangeStore(workingDir);\n\n try {\n let changes: FileChange[];\n\n if (runId && !filePath) {\n changes = await store.listRun(sessionId, runId);\n } else if (filePath) {\n changes = await store.listFile(sessionId, filePath);\n if (runId) {\n changes = changes.filter((c) => c.runId === runId);\n }\n } else {\n changes = await store.listSession(sessionId);\n }\n\n if (changes.length === 0) {\n return output(ctx, asJson, { success: true, rolledBack: 0, message: 'No changes to rollback' }, 0);\n }\n\n // Process in reverse chronological order\n const ordered = [...changes].sort(\n (a, b) => new Date(b.timestamp).getTime() - new Date(a.timestamp).getTime(),\n );\n\n if (dryRun) {\n const preview = ordered.map((c) => ({\n filePath: c.filePath,\n operation: c.operation,\n action: !c.before ? 'delete (was new file)' : 'restore to before state',\n }));\n return output(ctx, asJson, { success: true, dryRun: true, wouldRollback: preview }, 0);\n }\n\n let rolledBack = 0;\n const errors: string[] = [];\n\n for (const change of ordered) {\n const fullPath = path.join(workingDir, change.filePath);\n try {\n if (!change.before) {\n // File was created by agent — delete it\n await fsp.unlink(fullPath).catch((e: NodeJS.ErrnoException) => {\n if (e.code !== 'ENOENT') {throw e;}\n });\n } else {\n // Restore to before state\n await fsp.mkdir(path.dirname(fullPath), { recursive: true });\n await fsp.writeFile(fullPath, change.before.content, 'utf-8');\n }\n rolledBack++;\n } catch (e) {\n errors.push(`${change.filePath}: ${String(e)}`);\n }\n }\n\n return output(ctx, asJson, { success: errors.length === 0, rolledBack, errors }, errors.length > 0 ? 1 : 0);\n } catch (e) {\n logger.error('agent:rollback error', e instanceof Error ? e : undefined);\n return output(ctx, asJson, { success: false, error: String(e) }, 1);\n }\n },\n },\n});\n\nfunction output(ctx: PluginContextV3, asJson: boolean, data: unknown, exitCode: number): { exitCode: number } {\n if (asJson) {\n ctx.ui.write(JSON.stringify(data, null, 2) + '\\n');\n } else {\n const d = data as Record<string, unknown>;\n if (d['success']) {\n if (d['dryRun']) {\n ctx.ui.write(`[DRY RUN] Would rollback:\\n`);\n for (const p of (d['wouldRollback'] as Array<Record<string, string>>) ?? []) {\n ctx.ui.write(` ${p['operation']?.toUpperCase()} ${p['filePath']} → ${p['action']}\\n`);\n }\n } else {\n ctx.ui.write(`✅ Rolled back ${d['rolledBack']} change(s)\\n`);\n for (const e of (d['errors'] as string[]) ?? []) {\n ctx.ui.write(` ⚠️ ${e}\\n`);\n }\n }\n } else {\n ctx.ui.write(`❌ ${d['error']}\\n`);\n }\n }\n return { exitCode };\n}\n"]}
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
import * as _kb_labs_shared_command_kit from '@kb-labs/shared-command-kit';
|
|
2
|
+
import { AgentMode } from '@kb-labs/agent-contracts';
|
|
3
|
+
|
|
4
|
+
type RunInput = {
|
|
5
|
+
task: string;
|
|
6
|
+
workingDir?: string;
|
|
7
|
+
maxIterations?: number;
|
|
8
|
+
temperature?: number;
|
|
9
|
+
verbose?: boolean;
|
|
10
|
+
quiet?: boolean;
|
|
11
|
+
detailed?: boolean;
|
|
12
|
+
sessionId?: string;
|
|
13
|
+
tier?: 'small' | 'medium' | 'large';
|
|
14
|
+
escalate?: boolean;
|
|
15
|
+
mode?: AgentMode;
|
|
16
|
+
complexity?: 'simple' | 'medium' | 'complex';
|
|
17
|
+
files?: string[];
|
|
18
|
+
trace?: string;
|
|
19
|
+
approve?: boolean;
|
|
20
|
+
execute?: boolean;
|
|
21
|
+
spec?: boolean;
|
|
22
|
+
'dry-run'?: boolean;
|
|
23
|
+
debug?: boolean;
|
|
24
|
+
/** Abort execution after this many seconds (0 or undefined = no timeout). */
|
|
25
|
+
timeout?: number;
|
|
26
|
+
/** Override token budget (e.g. 300000 for heavy tasks). Overrides config value. */
|
|
27
|
+
budget?: number;
|
|
28
|
+
/** Output structured JSON instead of human-readable output. */
|
|
29
|
+
json?: boolean;
|
|
30
|
+
argv?: string[];
|
|
31
|
+
};
|
|
32
|
+
declare const _default: _kb_labs_shared_command_kit.CommandHandlerV3<unknown, RunInput, {
|
|
33
|
+
success: boolean;
|
|
34
|
+
summary: string;
|
|
35
|
+
filesCreated: string[];
|
|
36
|
+
filesModified: string[];
|
|
37
|
+
filesRead: string[];
|
|
38
|
+
iterations: number;
|
|
39
|
+
tokensUsed: number;
|
|
40
|
+
}>;
|
|
41
|
+
|
|
42
|
+
export { _default as default };
|