sweteam 0.1.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/LICENSE +21 -0
- package/README.md +587 -0
- package/dist/adapters/adapter.d.ts +19 -0
- package/dist/adapters/adapter.d.ts.map +1 -0
- package/dist/adapters/adapter.js +20 -0
- package/dist/adapters/adapter.js.map +1 -0
- package/dist/adapters/claude-code.d.ts +13 -0
- package/dist/adapters/claude-code.d.ts.map +1 -0
- package/dist/adapters/claude-code.js +150 -0
- package/dist/adapters/claude-code.js.map +1 -0
- package/dist/adapters/codex.d.ts +13 -0
- package/dist/adapters/codex.d.ts.map +1 -0
- package/dist/adapters/codex.js +100 -0
- package/dist/adapters/codex.js.map +1 -0
- package/dist/adapters/custom.d.ts +16 -0
- package/dist/adapters/custom.d.ts.map +1 -0
- package/dist/adapters/custom.js +167 -0
- package/dist/adapters/custom.js.map +1 -0
- package/dist/adapters/opencode.d.ts +13 -0
- package/dist/adapters/opencode.d.ts.map +1 -0
- package/dist/adapters/opencode.js +100 -0
- package/dist/adapters/opencode.js.map +1 -0
- package/dist/adapters/prompt-detection.d.ts +14 -0
- package/dist/adapters/prompt-detection.d.ts.map +1 -0
- package/dist/adapters/prompt-detection.js +74 -0
- package/dist/adapters/prompt-detection.js.map +1 -0
- package/dist/commands/create.d.ts +8 -0
- package/dist/commands/create.d.ts.map +1 -0
- package/dist/commands/create.js +38 -0
- package/dist/commands/create.js.map +1 -0
- package/dist/commands/delete.d.ts +2 -0
- package/dist/commands/delete.d.ts.map +1 -0
- package/dist/commands/delete.js +22 -0
- package/dist/commands/delete.js.map +1 -0
- package/dist/commands/enter.d.ts +19 -0
- package/dist/commands/enter.d.ts.map +1 -0
- package/dist/commands/enter.js +73 -0
- package/dist/commands/enter.js.map +1 -0
- package/dist/commands/init.d.ts +14 -0
- package/dist/commands/init.d.ts.map +1 -0
- package/dist/commands/init.js +52 -0
- package/dist/commands/init.js.map +1 -0
- package/dist/commands/list.d.ts +8 -0
- package/dist/commands/list.d.ts.map +1 -0
- package/dist/commands/list.js +98 -0
- package/dist/commands/list.js.map +1 -0
- package/dist/commands/show.d.ts +33 -0
- package/dist/commands/show.d.ts.map +1 -0
- package/dist/commands/show.js +142 -0
- package/dist/commands/show.js.map +1 -0
- package/dist/commands/stop.d.ts +2 -0
- package/dist/commands/stop.d.ts.map +1 -0
- package/dist/commands/stop.js +10 -0
- package/dist/commands/stop.js.map +1 -0
- package/dist/config/discovery.d.ts +12 -0
- package/dist/config/discovery.d.ts.map +1 -0
- package/dist/config/discovery.js +62 -0
- package/dist/config/discovery.js.map +1 -0
- package/dist/config/gh-auth.d.ts +5 -0
- package/dist/config/gh-auth.d.ts.map +1 -0
- package/dist/config/gh-auth.js +18 -0
- package/dist/config/gh-auth.js.map +1 -0
- package/dist/config/loader.d.ts +38 -0
- package/dist/config/loader.d.ts.map +1 -0
- package/dist/config/loader.js +72 -0
- package/dist/config/loader.js.map +1 -0
- package/dist/db/client.d.ts +10 -0
- package/dist/db/client.d.ts.map +1 -0
- package/dist/db/client.js +84 -0
- package/dist/db/client.js.map +1 -0
- package/dist/db/schema.d.ts +805 -0
- package/dist/db/schema.d.ts.map +1 -0
- package/dist/db/schema.js +66 -0
- package/dist/db/schema.js.map +1 -0
- package/dist/git/git.d.ts +29 -0
- package/dist/git/git.d.ts.map +1 -0
- package/dist/git/git.js +200 -0
- package/dist/git/git.js.map +1 -0
- package/dist/index.d.ts +3 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +154 -0
- package/dist/index.js.map +1 -0
- package/dist/lifecycle.d.ts +5 -0
- package/dist/lifecycle.d.ts.map +1 -0
- package/dist/lifecycle.js +63 -0
- package/dist/lifecycle.js.map +1 -0
- package/dist/orchestrator/build-handler.d.ts +20 -0
- package/dist/orchestrator/build-handler.d.ts.map +1 -0
- package/dist/orchestrator/build-handler.js +212 -0
- package/dist/orchestrator/build-handler.js.map +1 -0
- package/dist/orchestrator/dag.d.ts +10 -0
- package/dist/orchestrator/dag.d.ts.map +1 -0
- package/dist/orchestrator/dag.js +70 -0
- package/dist/orchestrator/dag.js.map +1 -0
- package/dist/orchestrator/error-handling.d.ts +21 -0
- package/dist/orchestrator/error-handling.d.ts.map +1 -0
- package/dist/orchestrator/error-handling.js +124 -0
- package/dist/orchestrator/error-handling.js.map +1 -0
- package/dist/orchestrator/feedback-handler.d.ts +36 -0
- package/dist/orchestrator/feedback-handler.d.ts.map +1 -0
- package/dist/orchestrator/feedback-handler.js +316 -0
- package/dist/orchestrator/feedback-handler.js.map +1 -0
- package/dist/orchestrator/orchestrator.d.ts +21 -0
- package/dist/orchestrator/orchestrator.d.ts.map +1 -0
- package/dist/orchestrator/orchestrator.js +188 -0
- package/dist/orchestrator/orchestrator.js.map +1 -0
- package/dist/orchestrator/parallel-runner.d.ts +3 -0
- package/dist/orchestrator/parallel-runner.d.ts.map +1 -0
- package/dist/orchestrator/parallel-runner.js +111 -0
- package/dist/orchestrator/parallel-runner.js.map +1 -0
- package/dist/orchestrator/reviewer.d.ts +20 -0
- package/dist/orchestrator/reviewer.d.ts.map +1 -0
- package/dist/orchestrator/reviewer.js +175 -0
- package/dist/orchestrator/reviewer.js.map +1 -0
- package/dist/orchestrator/task-runner.d.ts +20 -0
- package/dist/orchestrator/task-runner.d.ts.map +1 -0
- package/dist/orchestrator/task-runner.js +122 -0
- package/dist/orchestrator/task-runner.js.map +1 -0
- package/dist/orchestrator/test-runner.d.ts +8 -0
- package/dist/orchestrator/test-runner.d.ts.map +1 -0
- package/dist/orchestrator/test-runner.js +81 -0
- package/dist/orchestrator/test-runner.js.map +1 -0
- package/dist/planner/plan-parser.d.ts +14 -0
- package/dist/planner/plan-parser.d.ts.map +1 -0
- package/dist/planner/plan-parser.js +182 -0
- package/dist/planner/plan-parser.js.map +1 -0
- package/dist/planner/planner.d.ts +9 -0
- package/dist/planner/planner.d.ts.map +1 -0
- package/dist/planner/planner.js +151 -0
- package/dist/planner/planner.js.map +1 -0
- package/dist/repl/repl.d.ts +19 -0
- package/dist/repl/repl.d.ts.map +1 -0
- package/dist/repl/repl.js +505 -0
- package/dist/repl/repl.js.map +1 -0
- package/dist/session/agent-log.d.ts +35 -0
- package/dist/session/agent-log.d.ts.map +1 -0
- package/dist/session/agent-log.js +120 -0
- package/dist/session/agent-log.js.map +1 -0
- package/dist/session/chat.d.ts +38 -0
- package/dist/session/chat.d.ts.map +1 -0
- package/dist/session/chat.js +106 -0
- package/dist/session/chat.js.map +1 -0
- package/dist/session/cost-tracker.d.ts +14 -0
- package/dist/session/cost-tracker.d.ts.map +1 -0
- package/dist/session/cost-tracker.js +61 -0
- package/dist/session/cost-tracker.js.map +1 -0
- package/dist/session/export.d.ts +2 -0
- package/dist/session/export.d.ts.map +1 -0
- package/dist/session/export.js +105 -0
- package/dist/session/export.js.map +1 -0
- package/dist/session/in-session-commands.d.ts +7 -0
- package/dist/session/in-session-commands.d.ts.map +1 -0
- package/dist/session/in-session-commands.js +227 -0
- package/dist/session/in-session-commands.js.map +1 -0
- package/dist/session/interactive.d.ts +37 -0
- package/dist/session/interactive.d.ts.map +1 -0
- package/dist/session/interactive.js +226 -0
- package/dist/session/interactive.js.map +1 -0
- package/dist/session/manager.d.ts +63 -0
- package/dist/session/manager.d.ts.map +1 -0
- package/dist/session/manager.js +229 -0
- package/dist/session/manager.js.map +1 -0
- package/dist/session/resume.d.ts +7 -0
- package/dist/session/resume.d.ts.map +1 -0
- package/dist/session/resume.js +53 -0
- package/dist/session/resume.js.map +1 -0
- package/dist/session/state-machine.d.ts +4 -0
- package/dist/session/state-machine.d.ts.map +1 -0
- package/dist/session/state-machine.js +47 -0
- package/dist/session/state-machine.js.map +1 -0
- package/dist/tui/chat-ui.d.ts +16 -0
- package/dist/tui/chat-ui.d.ts.map +1 -0
- package/dist/tui/chat-ui.js +19 -0
- package/dist/tui/chat-ui.js.map +1 -0
- package/dist/tui/dashboard.d.ts +17 -0
- package/dist/tui/dashboard.d.ts.map +1 -0
- package/dist/tui/dashboard.js +57 -0
- package/dist/tui/dashboard.js.map +1 -0
- package/dist/tui/session-list.d.ts +18 -0
- package/dist/tui/session-list.d.ts.map +1 -0
- package/dist/tui/session-list.js +26 -0
- package/dist/tui/session-list.js.map +1 -0
- package/dist/ui/agent-panel.d.ts +9 -0
- package/dist/ui/agent-panel.d.ts.map +1 -0
- package/dist/ui/agent-panel.js +100 -0
- package/dist/ui/agent-panel.js.map +1 -0
- package/dist/ui/banner.d.ts +10 -0
- package/dist/ui/banner.d.ts.map +1 -0
- package/dist/ui/banner.js +100 -0
- package/dist/ui/banner.js.map +1 -0
- package/dist/ui/markdown.d.ts +19 -0
- package/dist/ui/markdown.d.ts.map +1 -0
- package/dist/ui/markdown.js +174 -0
- package/dist/ui/markdown.js.map +1 -0
- package/dist/ui/prompt.d.ts +24 -0
- package/dist/ui/prompt.d.ts.map +1 -0
- package/dist/ui/prompt.js +226 -0
- package/dist/ui/prompt.js.map +1 -0
- package/dist/utils/time.d.ts +3 -0
- package/dist/utils/time.d.ts.map +1 -0
- package/dist/utils/time.js +29 -0
- package/dist/utils/time.js.map +1 -0
- package/drizzle/migrations/0000_naive_human_fly.sql +56 -0
- package/drizzle/migrations/meta/0000_snapshot.json +395 -0
- package/drizzle/migrations/meta/_journal.json +13 -0
- package/package.json +70 -0
|
@@ -0,0 +1,120 @@
|
|
|
1
|
+
import { mkdirSync, appendFileSync, readFileSync, writeFileSync, existsSync, statSync, } from "fs";
|
|
2
|
+
import { join } from "path";
|
|
3
|
+
import { SWETEAM_DIR } from "../db/client.js";
|
|
4
|
+
const LOG_DIR = join(SWETEAM_DIR, "logs");
|
|
5
|
+
export function getLogPath(sessionId) {
|
|
6
|
+
mkdirSync(LOG_DIR, { recursive: true });
|
|
7
|
+
return join(LOG_DIR, `${sessionId}.jsonl`);
|
|
8
|
+
}
|
|
9
|
+
export function clearLog(sessionId) {
|
|
10
|
+
writeFileSync(getLogPath(sessionId), "");
|
|
11
|
+
}
|
|
12
|
+
export function writeEvent(sessionId, event) {
|
|
13
|
+
const line = JSON.stringify({ ...event, ts: Date.now() }) + "\n";
|
|
14
|
+
appendFileSync(getLogPath(sessionId), line);
|
|
15
|
+
}
|
|
16
|
+
/**
|
|
17
|
+
* Watch a session's agent log file for new events. Replays existing events
|
|
18
|
+
* from the beginning, then polls for new content every 200ms.
|
|
19
|
+
*/
|
|
20
|
+
/**
|
|
21
|
+
* Check whether a session's log file has recent activity, indicating a build
|
|
22
|
+
* is actively running (not a stale leftover from a crashed build).
|
|
23
|
+
*/
|
|
24
|
+
export function isLogActive(sessionId, staleThresholdMs = 10_000) {
|
|
25
|
+
const logPath = getLogPath(sessionId);
|
|
26
|
+
if (!existsSync(logPath))
|
|
27
|
+
return false;
|
|
28
|
+
try {
|
|
29
|
+
const content = readFileSync(logPath, "utf-8").trim();
|
|
30
|
+
if (!content)
|
|
31
|
+
return false;
|
|
32
|
+
// Check the last event's timestamp
|
|
33
|
+
const lines = content.split("\n").filter(Boolean);
|
|
34
|
+
const lastLine = lines[lines.length - 1];
|
|
35
|
+
const lastEvent = JSON.parse(lastLine);
|
|
36
|
+
// If the last event is build-complete, the build is done
|
|
37
|
+
if (lastEvent.type === "build-complete")
|
|
38
|
+
return false;
|
|
39
|
+
// If the last event was written recently, the build is likely still active
|
|
40
|
+
const age = Date.now() - lastEvent.ts;
|
|
41
|
+
return age < staleThresholdMs;
|
|
42
|
+
}
|
|
43
|
+
catch {
|
|
44
|
+
return false;
|
|
45
|
+
}
|
|
46
|
+
}
|
|
47
|
+
export function watchLog(sessionId, onEvent) {
|
|
48
|
+
const logPath = getLogPath(sessionId);
|
|
49
|
+
let offset = 0;
|
|
50
|
+
let stopped = false;
|
|
51
|
+
function poll() {
|
|
52
|
+
if (stopped)
|
|
53
|
+
return;
|
|
54
|
+
try {
|
|
55
|
+
if (!existsSync(logPath))
|
|
56
|
+
return;
|
|
57
|
+
const stat = statSync(logPath);
|
|
58
|
+
if (stat.size <= offset)
|
|
59
|
+
return;
|
|
60
|
+
const content = readFileSync(logPath, "utf-8");
|
|
61
|
+
const newContent = content.slice(offset);
|
|
62
|
+
offset = content.length;
|
|
63
|
+
const lines = newContent.split("\n").filter(Boolean);
|
|
64
|
+
for (const line of lines) {
|
|
65
|
+
try {
|
|
66
|
+
onEvent(JSON.parse(line));
|
|
67
|
+
}
|
|
68
|
+
catch {
|
|
69
|
+
// skip malformed lines
|
|
70
|
+
}
|
|
71
|
+
}
|
|
72
|
+
}
|
|
73
|
+
catch {
|
|
74
|
+
// file access error, retry next poll
|
|
75
|
+
}
|
|
76
|
+
}
|
|
77
|
+
// Initial read — replay existing events
|
|
78
|
+
poll();
|
|
79
|
+
// Poll for new content
|
|
80
|
+
const timer = setInterval(poll, 200);
|
|
81
|
+
return {
|
|
82
|
+
stop() {
|
|
83
|
+
stopped = true;
|
|
84
|
+
clearInterval(timer);
|
|
85
|
+
},
|
|
86
|
+
};
|
|
87
|
+
}
|
|
88
|
+
/**
|
|
89
|
+
* Wait for an `input-response` event matching the given requestId.
|
|
90
|
+
* Polls the log file every 200ms. Times out after `timeoutMs` (default 5 min).
|
|
91
|
+
*/
|
|
92
|
+
export function waitForResponse(sessionId, requestId, timeoutMs = 5 * 60 * 1000) {
|
|
93
|
+
return new Promise((resolve) => {
|
|
94
|
+
const deadline = Date.now() + timeoutMs;
|
|
95
|
+
let resolved = false;
|
|
96
|
+
const watcher = watchLog(sessionId, (event) => {
|
|
97
|
+
if (resolved)
|
|
98
|
+
return;
|
|
99
|
+
if (event.type === "input-response" && event.requestId === requestId) {
|
|
100
|
+
resolved = true;
|
|
101
|
+
watcher.stop();
|
|
102
|
+
resolve(event.response ?? null);
|
|
103
|
+
}
|
|
104
|
+
});
|
|
105
|
+
// Timeout check
|
|
106
|
+
const timer = setInterval(() => {
|
|
107
|
+
if (resolved) {
|
|
108
|
+
clearInterval(timer);
|
|
109
|
+
return;
|
|
110
|
+
}
|
|
111
|
+
if (Date.now() > deadline) {
|
|
112
|
+
clearInterval(timer);
|
|
113
|
+
resolved = true;
|
|
114
|
+
watcher.stop();
|
|
115
|
+
resolve(null);
|
|
116
|
+
}
|
|
117
|
+
}, 1000);
|
|
118
|
+
});
|
|
119
|
+
}
|
|
120
|
+
//# sourceMappingURL=agent-log.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"agent-log.js","sourceRoot":"","sources":["../../src/session/agent-log.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
export type ChatCommand = {
|
|
2
|
+
type: "build";
|
|
3
|
+
} | {
|
|
4
|
+
type: "stop";
|
|
5
|
+
} | {
|
|
6
|
+
type: "help";
|
|
7
|
+
} | {
|
|
8
|
+
type: "plan";
|
|
9
|
+
} | {
|
|
10
|
+
type: "status";
|
|
11
|
+
} | {
|
|
12
|
+
type: "diff";
|
|
13
|
+
} | {
|
|
14
|
+
type: "pr";
|
|
15
|
+
} | {
|
|
16
|
+
type: "tasks";
|
|
17
|
+
} | {
|
|
18
|
+
type: "feedback";
|
|
19
|
+
text: string;
|
|
20
|
+
} | {
|
|
21
|
+
type: "message";
|
|
22
|
+
text: string;
|
|
23
|
+
};
|
|
24
|
+
export declare function parseInput(input: string): ChatCommand;
|
|
25
|
+
export declare function getHelpText(): string;
|
|
26
|
+
export interface ChatLoopCallbacks {
|
|
27
|
+
onBuild: () => Promise<void>;
|
|
28
|
+
onStop: () => Promise<void>;
|
|
29
|
+
onMessage: (text: string) => Promise<string>;
|
|
30
|
+
onFeedback?: (text: string) => Promise<void>;
|
|
31
|
+
onPlan?: () => Promise<string | null>;
|
|
32
|
+
onStatus?: () => Promise<string>;
|
|
33
|
+
onDiff?: () => Promise<string>;
|
|
34
|
+
onPr?: () => Promise<string>;
|
|
35
|
+
onTasks?: () => Promise<string>;
|
|
36
|
+
}
|
|
37
|
+
export declare function runChatLoop(sessionId: string, callbacks: ChatLoopCallbacks): Promise<void>;
|
|
38
|
+
//# sourceMappingURL=chat.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"chat.d.ts","sourceRoot":"","sources":["../../src/session/chat.ts"],"names":[],"mappings":"AAGA,MAAM,MAAM,WAAW,GACnB;IAAE,IAAI,EAAE,OAAO,CAAA;CAAE,GACjB;IAAE,IAAI,EAAE,MAAM,CAAA;CAAE,GAChB;IAAE,IAAI,EAAE,MAAM,CAAA;CAAE,GAChB;IAAE,IAAI,EAAE,MAAM,CAAA;CAAE,GAChB;IAAE,IAAI,EAAE,QAAQ,CAAA;CAAE,GAClB;IAAE,IAAI,EAAE,MAAM,CAAA;CAAE,GAChB;IAAE,IAAI,EAAE,IAAI,CAAA;CAAE,GACd;IAAE,IAAI,EAAE,OAAO,CAAA;CAAE,GACjB;IAAE,IAAI,EAAE,UAAU,CAAC;IAAC,IAAI,EAAE,MAAM,CAAA;CAAE,GAClC;IAAE,IAAI,EAAE,SAAS,CAAC;IAAC,IAAI,EAAE,MAAM,CAAA;CAAE,CAAC;AAEtC,wBAAgB,UAAU,CAAC,KAAK,EAAE,MAAM,GAAG,WAAW,CAiBrD;AAED,wBAAgB,WAAW,IAAI,MAAM,CAapC;AAED,MAAM,WAAW,iBAAiB;IAChC,OAAO,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC;IAC7B,MAAM,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC;IAC5B,SAAS,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,OAAO,CAAC,MAAM,CAAC,CAAC;IAC7C,UAAU,CAAC,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;IAC7C,MAAM,CAAC,EAAE,MAAM,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,CAAC;IACtC,QAAQ,CAAC,EAAE,MAAM,OAAO,CAAC,MAAM,CAAC,CAAC;IACjC,MAAM,CAAC,EAAE,MAAM,OAAO,CAAC,MAAM,CAAC,CAAC;IAC/B,IAAI,CAAC,EAAE,MAAM,OAAO,CAAC,MAAM,CAAC,CAAC;IAC7B,OAAO,CAAC,EAAE,MAAM,OAAO,CAAC,MAAM,CAAC,CAAC;CACjC;AAED,wBAAsB,WAAW,CAC/B,SAAS,EAAE,MAAM,EACjB,SAAS,EAAE,iBAAiB,GAC3B,OAAO,CAAC,IAAI,CAAC,CA+Ef"}
|
|
@@ -0,0 +1,106 @@
|
|
|
1
|
+
import * as readline from "readline";
|
|
2
|
+
import { addMessage } from "./manager.js";
|
|
3
|
+
export function parseInput(input) {
|
|
4
|
+
const trimmed = input.trim();
|
|
5
|
+
if (trimmed === "@build")
|
|
6
|
+
return { type: "build" };
|
|
7
|
+
if (trimmed === "@stop")
|
|
8
|
+
return { type: "stop" };
|
|
9
|
+
if (trimmed === "@help")
|
|
10
|
+
return { type: "help" };
|
|
11
|
+
if (trimmed === "@plan")
|
|
12
|
+
return { type: "plan" };
|
|
13
|
+
if (trimmed === "@status")
|
|
14
|
+
return { type: "status" };
|
|
15
|
+
if (trimmed === "@diff")
|
|
16
|
+
return { type: "diff" };
|
|
17
|
+
if (trimmed === "@pr")
|
|
18
|
+
return { type: "pr" };
|
|
19
|
+
if (trimmed === "@tasks")
|
|
20
|
+
return { type: "tasks" };
|
|
21
|
+
if (trimmed.startsWith("@feedback ")) {
|
|
22
|
+
return { type: "feedback", text: trimmed.slice("@feedback ".length) };
|
|
23
|
+
}
|
|
24
|
+
return { type: "message", text: trimmed };
|
|
25
|
+
}
|
|
26
|
+
export function getHelpText() {
|
|
27
|
+
return [
|
|
28
|
+
"Available commands:",
|
|
29
|
+
" @build — Finalize plan and start autonomous coding",
|
|
30
|
+
" @status — Show current task progress",
|
|
31
|
+
" @plan — Re-display the current plan",
|
|
32
|
+
" @feedback — Give feedback on completed work",
|
|
33
|
+
" @diff — Show cumulative diff",
|
|
34
|
+
" @pr — Show PR link",
|
|
35
|
+
" @tasks — List all tasks and statuses",
|
|
36
|
+
" @stop — Stop this session",
|
|
37
|
+
" @help — Show this help message",
|
|
38
|
+
].join("\n");
|
|
39
|
+
}
|
|
40
|
+
export async function runChatLoop(sessionId, callbacks) {
|
|
41
|
+
const rl = readline.createInterface({
|
|
42
|
+
input: process.stdin,
|
|
43
|
+
output: process.stdout,
|
|
44
|
+
});
|
|
45
|
+
const prompt = () => {
|
|
46
|
+
rl.question("> ", async (input) => {
|
|
47
|
+
if (!input || input.trim().length === 0) {
|
|
48
|
+
prompt();
|
|
49
|
+
return;
|
|
50
|
+
}
|
|
51
|
+
const command = parseInput(input);
|
|
52
|
+
switch (command.type) {
|
|
53
|
+
case "build":
|
|
54
|
+
await callbacks.onBuild();
|
|
55
|
+
break;
|
|
56
|
+
case "stop":
|
|
57
|
+
await callbacks.onStop();
|
|
58
|
+
rl.close();
|
|
59
|
+
return;
|
|
60
|
+
case "help":
|
|
61
|
+
console.log(getHelpText());
|
|
62
|
+
break;
|
|
63
|
+
case "plan":
|
|
64
|
+
if (callbacks.onPlan) {
|
|
65
|
+
const plan = await callbacks.onPlan();
|
|
66
|
+
console.log(plan ?? "No plan finalized yet.");
|
|
67
|
+
}
|
|
68
|
+
break;
|
|
69
|
+
case "status":
|
|
70
|
+
if (callbacks.onStatus) {
|
|
71
|
+
console.log(await callbacks.onStatus());
|
|
72
|
+
}
|
|
73
|
+
break;
|
|
74
|
+
case "diff":
|
|
75
|
+
if (callbacks.onDiff) {
|
|
76
|
+
console.log(await callbacks.onDiff());
|
|
77
|
+
}
|
|
78
|
+
break;
|
|
79
|
+
case "pr":
|
|
80
|
+
if (callbacks.onPr) {
|
|
81
|
+
console.log(await callbacks.onPr());
|
|
82
|
+
}
|
|
83
|
+
break;
|
|
84
|
+
case "tasks":
|
|
85
|
+
if (callbacks.onTasks) {
|
|
86
|
+
console.log(await callbacks.onTasks());
|
|
87
|
+
}
|
|
88
|
+
break;
|
|
89
|
+
case "feedback":
|
|
90
|
+
addMessage(sessionId, "user", command.text, { type: "feedback" });
|
|
91
|
+
if (callbacks.onFeedback) {
|
|
92
|
+
await callbacks.onFeedback(command.text);
|
|
93
|
+
}
|
|
94
|
+
break;
|
|
95
|
+
case "message":
|
|
96
|
+
addMessage(sessionId, "user", command.text, { phase: "planning" });
|
|
97
|
+
const response = await callbacks.onMessage(command.text);
|
|
98
|
+
addMessage(sessionId, "agent", response, { phase: "planning" });
|
|
99
|
+
break;
|
|
100
|
+
}
|
|
101
|
+
prompt();
|
|
102
|
+
});
|
|
103
|
+
};
|
|
104
|
+
prompt();
|
|
105
|
+
}
|
|
106
|
+
//# sourceMappingURL=chat.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"chat.js","sourceRoot":"","sources":["../../src/session/chat.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,QAAQ,MAAM,UAAU,CAAC;AACrC,OAAO,EAAE,UAAU,EAAe,MAAM,cAAc,CAAC;AAcvD,MAAM,UAAU,UAAU,CAAC,KAAa;IACtC,MAAM,OAAO,GAAG,KAAK,CAAC,IAAI,EAAE,CAAC;IAE7B,IAAI,OAAO,KAAK,QAAQ;QAAE,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,CAAC;IACnD,IAAI,OAAO,KAAK,OAAO;QAAE,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC;IACjD,IAAI,OAAO,KAAK,OAAO;QAAE,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC;IACjD,IAAI,OAAO,KAAK,OAAO;QAAE,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC;IACjD,IAAI,OAAO,KAAK,SAAS;QAAE,OAAO,EAAE,IAAI,EAAE,QAAQ,EAAE,CAAC;IACrD,IAAI,OAAO,KAAK,OAAO;QAAE,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC;IACjD,IAAI,OAAO,KAAK,KAAK;QAAE,OAAO,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC;IAC7C,IAAI,OAAO,KAAK,QAAQ;QAAE,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,CAAC;IAEnD,IAAI,OAAO,CAAC,UAAU,CAAC,YAAY,CAAC,EAAE,CAAC;QACrC,OAAO,EAAE,IAAI,EAAE,UAAU,EAAE,IAAI,EAAE,OAAO,CAAC,KAAK,CAAC,YAAY,CAAC,MAAM,CAAC,EAAE,CAAC;IACxE,CAAC;IAED,OAAO,EAAE,IAAI,EAAE,SAAS,EAAE,IAAI,EAAE,OAAO,EAAE,CAAC;AAC5C,CAAC;AAED,MAAM,UAAU,WAAW;IACzB,OAAO;QACL,qBAAqB;QACrB,2DAA2D;QAC3D,4CAA4C;QAC5C,6CAA6C;QAC7C,iDAAiD;QACjD,sCAAsC;QACtC,8BAA8B;QAC9B,6CAA6C;QAC7C,mCAAmC;QACnC,wCAAwC;KACzC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AACf,CAAC;AAcD,MAAM,CAAC,KAAK,UAAU,WAAW,CAC/B,SAAiB,EACjB,SAA4B;IAE5B,MAAM,EAAE,GAAG,QAAQ,CAAC,eAAe,CAAC;QAClC,KAAK,EAAE,OAAO,CAAC,KAAK;QACpB,MAAM,EAAE,OAAO,CAAC,MAAM;KACvB,CAAC,CAAC;IAEH,MAAM,MAAM,GAAG,GAAG,EAAE;QAClB,EAAE,CAAC,QAAQ,CAAC,IAAI,EAAE,KAAK,EAAE,KAAK,EAAE,EAAE;YAChC,IAAI,CAAC,KAAK,IAAI,KAAK,CAAC,IAAI,EAAE,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;gBACxC,MAAM,EAAE,CAAC;gBACT,OAAO;YACT,CAAC;YAED,MAAM,OAAO,GAAG,UAAU,CAAC,KAAK,CAAC,CAAC;YAElC,QAAQ,OAAO,CAAC,IAAI,EAAE,CAAC;gBACrB,KAAK,OAAO;oBACV,MAAM,SAAS,CAAC,OAAO,EAAE,CAAC;oBAC1B,MAAM;gBAER,KAAK,MAAM;oBACT,MAAM,SAAS,CAAC,MAAM,EAAE,CAAC;oBACzB,EAAE,CAAC,KAAK,EAAE,CAAC;oBACX,OAAO;gBAET,KAAK,MAAM;oBACT,OAAO,CAAC,GAAG,CAAC,WAAW,EAAE,CAAC,CAAC;oBAC3B,MAAM;gBAER,KAAK,MAAM;oBACT,IAAI,SAAS,CAAC,MAAM,EAAE,CAAC;wBACrB,MAAM,IAAI,GAAG,MAAM,SAAS,CAAC,MAAM,EAAE,CAAC;wBACtC,OAAO,CAAC,GAAG,CAAC,IAAI,IAAI,wBAAwB,CAAC,CAAC;oBAChD,CAAC;oBACD,MAAM;gBAER,KAAK,QAAQ;oBACX,IAAI,SAAS,CAAC,QAAQ,EAAE,CAAC;wBACvB,OAAO,CAAC,GAAG,CAAC,MAAM,SAAS,CAAC,QAAQ,EAAE,CAAC,CAAC;oBAC1C,CAAC;oBACD,MAAM;gBAER,KAAK,MAAM;oBACT,IAAI,SAAS,CAAC,MAAM,EAAE,CAAC;wBACrB,OAAO,CAAC,GAAG,CAAC,MAAM,SAAS,CAAC,MAAM,EAAE,CAAC,CAAC;oBACxC,CAAC;oBACD,MAAM;gBAER,KAAK,IAAI;oBACP,IAAI,SAAS,CAAC,IAAI,EAAE,CAAC;wBACnB,OAAO,CAAC,GAAG,CAAC,MAAM,SAAS,CAAC,IAAI,EAAE,CAAC,CAAC;oBACtC,CAAC;oBACD,MAAM;gBAER,KAAK,OAAO;oBACV,IAAI,SAAS,CAAC,OAAO,EAAE,CAAC;wBACtB,OAAO,CAAC,GAAG,CAAC,MAAM,SAAS,CAAC,OAAO,EAAE,CAAC,CAAC;oBACzC,CAAC;oBACD,MAAM;gBAER,KAAK,UAAU;oBACb,UAAU,CAAC,SAAS,EAAE,MAAM,EAAE,OAAO,CAAC,IAAI,EAAE,EAAE,IAAI,EAAE,UAAU,EAAE,CAAC,CAAC;oBAClE,IAAI,SAAS,CAAC,UAAU,EAAE,CAAC;wBACzB,MAAM,SAAS,CAAC,UAAU,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;oBAC3C,CAAC;oBACD,MAAM;gBAER,KAAK,SAAS;oBACZ,UAAU,CAAC,SAAS,EAAE,MAAM,EAAE,OAAO,CAAC,IAAI,EAAE,EAAE,KAAK,EAAE,UAAU,EAAE,CAAC,CAAC;oBACnE,MAAM,QAAQ,GAAG,MAAM,SAAS,CAAC,SAAS,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;oBACzD,UAAU,CAAC,SAAS,EAAE,OAAO,EAAE,QAAQ,EAAE,EAAE,KAAK,EAAE,UAAU,EAAE,CAAC,CAAC;oBAChE,MAAM;YACV,CAAC;YAED,MAAM,EAAE,CAAC;QACX,CAAC,CAAC,CAAC;IACL,CAAC,CAAC;IAEF,MAAM,EAAE,CAAC;AACX,CAAC"}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
export interface CostSummary {
|
|
2
|
+
sessionId: string;
|
|
3
|
+
totalInvocations: number;
|
|
4
|
+
totalDurationMs: number;
|
|
5
|
+
taskBreakdown: Array<{
|
|
6
|
+
taskId: string;
|
|
7
|
+
title: string;
|
|
8
|
+
durationMs: number;
|
|
9
|
+
reviewCycles: number;
|
|
10
|
+
}>;
|
|
11
|
+
}
|
|
12
|
+
export declare function getSessionCost(sessionId: string): CostSummary;
|
|
13
|
+
export declare function formatCostSummary(cost: CostSummary): string;
|
|
14
|
+
//# sourceMappingURL=cost-tracker.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cost-tracker.d.ts","sourceRoot":"","sources":["../../src/session/cost-tracker.ts"],"names":[],"mappings":"AAIA,MAAM,WAAW,WAAW;IAC1B,SAAS,EAAE,MAAM,CAAC;IAClB,gBAAgB,EAAE,MAAM,CAAC;IACzB,eAAe,EAAE,MAAM,CAAC;IACxB,aAAa,EAAE,KAAK,CAAC;QACnB,MAAM,EAAE,MAAM,CAAC;QACf,KAAK,EAAE,MAAM,CAAC;QACd,UAAU,EAAE,MAAM,CAAC;QACnB,YAAY,EAAE,MAAM,CAAC;KACtB,CAAC,CAAC;CACJ;AAED,wBAAgB,cAAc,CAAC,SAAS,EAAE,MAAM,GAAG,WAAW,CAiD7D;AAED,wBAAgB,iBAAiB,CAAC,IAAI,EAAE,WAAW,GAAG,MAAM,CAmB3D"}
|
|
@@ -0,0 +1,61 @@
|
|
|
1
|
+
import { eq } from "drizzle-orm";
|
|
2
|
+
import { getDb } from "../db/client.js";
|
|
3
|
+
import { tasks as tasksTable } from "../db/schema.js";
|
|
4
|
+
export function getSessionCost(sessionId) {
|
|
5
|
+
const db = getDb();
|
|
6
|
+
const taskRows = db
|
|
7
|
+
.select({
|
|
8
|
+
id: tasksTable.id,
|
|
9
|
+
title: tasksTable.title,
|
|
10
|
+
status: tasksTable.status,
|
|
11
|
+
reviewCycles: tasksTable.reviewCycles,
|
|
12
|
+
agentOutput: tasksTable.agentOutput,
|
|
13
|
+
})
|
|
14
|
+
.from(tasksTable)
|
|
15
|
+
.where(eq(tasksTable.sessionId, sessionId))
|
|
16
|
+
.all();
|
|
17
|
+
let totalInvocations = 0;
|
|
18
|
+
let totalDurationMs = 0;
|
|
19
|
+
const breakdown = [];
|
|
20
|
+
for (const task of taskRows) {
|
|
21
|
+
// Each task = 1 coder invocation + reviewCycles reviewer invocations
|
|
22
|
+
const cycles = task.reviewCycles ?? 0;
|
|
23
|
+
const invocations = 1 + cycles; // coder + review cycles
|
|
24
|
+
totalInvocations += invocations;
|
|
25
|
+
// Try to extract duration from agent output
|
|
26
|
+
let durationMs = 0;
|
|
27
|
+
if (task.agentOutput) {
|
|
28
|
+
const match = task.agentOutput.match(/"durationMs"\s*:\s*(\d+)/);
|
|
29
|
+
if (match) {
|
|
30
|
+
durationMs = parseInt(match[1], 10);
|
|
31
|
+
}
|
|
32
|
+
}
|
|
33
|
+
totalDurationMs += durationMs;
|
|
34
|
+
breakdown.push({
|
|
35
|
+
taskId: task.id,
|
|
36
|
+
title: task.title,
|
|
37
|
+
durationMs,
|
|
38
|
+
reviewCycles: cycles,
|
|
39
|
+
});
|
|
40
|
+
}
|
|
41
|
+
return {
|
|
42
|
+
sessionId,
|
|
43
|
+
totalInvocations,
|
|
44
|
+
totalDurationMs,
|
|
45
|
+
taskBreakdown: breakdown,
|
|
46
|
+
};
|
|
47
|
+
}
|
|
48
|
+
export function formatCostSummary(cost) {
|
|
49
|
+
const lines = [];
|
|
50
|
+
lines.push(`Cost Summary — ${cost.sessionId}`);
|
|
51
|
+
lines.push(` Total agent invocations: ${cost.totalInvocations}`);
|
|
52
|
+
lines.push(` Total duration: ${(cost.totalDurationMs / 1000).toFixed(1)}s`);
|
|
53
|
+
lines.push("");
|
|
54
|
+
lines.push(" Task Breakdown:");
|
|
55
|
+
for (const task of cost.taskBreakdown) {
|
|
56
|
+
const dur = task.durationMs > 0 ? ` (${(task.durationMs / 1000).toFixed(1)}s)` : "";
|
|
57
|
+
lines.push(` ${task.taskId}: ${task.title}${dur} — ${task.reviewCycles} review cycles`);
|
|
58
|
+
}
|
|
59
|
+
return lines.join("\n");
|
|
60
|
+
}
|
|
61
|
+
//# sourceMappingURL=cost-tracker.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cost-tracker.js","sourceRoot":"","sources":["../../src/session/cost-tracker.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,EAAE,EAAE,MAAM,aAAa,CAAC;AACjC,OAAO,EAAE,KAAK,EAAE,MAAM,iBAAiB,CAAC;AACxC,OAAO,EAAY,KAAK,IAAI,UAAU,EAAE,MAAM,iBAAiB,CAAC;AAchE,MAAM,UAAU,cAAc,CAAC,SAAiB;IAC9C,MAAM,EAAE,GAAG,KAAK,EAAE,CAAC;IAEnB,MAAM,QAAQ,GAAG,EAAE;SAChB,MAAM,CAAC;QACN,EAAE,EAAE,UAAU,CAAC,EAAE;QACjB,KAAK,EAAE,UAAU,CAAC,KAAK;QACvB,MAAM,EAAE,UAAU,CAAC,MAAM;QACzB,YAAY,EAAE,UAAU,CAAC,YAAY;QACrC,WAAW,EAAE,UAAU,CAAC,WAAW;KACpC,CAAC;SACD,IAAI,CAAC,UAAU,CAAC;SAChB,KAAK,CAAC,EAAE,CAAC,UAAU,CAAC,SAAS,EAAE,SAAS,CAAC,CAAC;SAC1C,GAAG,EAAE,CAAC;IAET,IAAI,gBAAgB,GAAG,CAAC,CAAC;IACzB,IAAI,eAAe,GAAG,CAAC,CAAC;IACxB,MAAM,SAAS,GAAiC,EAAE,CAAC;IAEnD,KAAK,MAAM,IAAI,IAAI,QAAQ,EAAE,CAAC;QAC5B,qEAAqE;QACrE,MAAM,MAAM,GAAG,IAAI,CAAC,YAAY,IAAI,CAAC,CAAC;QACtC,MAAM,WAAW,GAAG,CAAC,GAAG,MAAM,CAAC,CAAC,wBAAwB;QACxD,gBAAgB,IAAI,WAAW,CAAC;QAEhC,4CAA4C;QAC5C,IAAI,UAAU,GAAG,CAAC,CAAC;QACnB,IAAI,IAAI,CAAC,WAAW,EAAE,CAAC;YACrB,MAAM,KAAK,GAAG,IAAI,CAAC,WAAW,CAAC,KAAK,CAAC,0BAA0B,CAAC,CAAC;YACjE,IAAI,KAAK,EAAE,CAAC;gBACV,UAAU,GAAG,QAAQ,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;YACtC,CAAC;QACH,CAAC;QACD,eAAe,IAAI,UAAU,CAAC;QAE9B,SAAS,CAAC,IAAI,CAAC;YACb,MAAM,EAAE,IAAI,CAAC,EAAE;YACf,KAAK,EAAE,IAAI,CAAC,KAAK;YACjB,UAAU;YACV,YAAY,EAAE,MAAM;SACrB,CAAC,CAAC;IACL,CAAC;IAED,OAAO;QACL,SAAS;QACT,gBAAgB;QAChB,eAAe;QACf,aAAa,EAAE,SAAS;KACzB,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,iBAAiB,CAAC,IAAiB;IACjD,MAAM,KAAK,GAAa,EAAE,CAAC;IAC3B,KAAK,CAAC,IAAI,CAAC,kBAAkB,IAAI,CAAC,SAAS,EAAE,CAAC,CAAC;IAC/C,KAAK,CAAC,IAAI,CAAC,8BAA8B,IAAI,CAAC,gBAAgB,EAAE,CAAC,CAAC;IAClE,KAAK,CAAC,IAAI,CACR,qBAAqB,CAAC,IAAI,CAAC,eAAe,GAAG,IAAI,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,GAAG,CACjE,CAAC;IACF,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IACf,KAAK,CAAC,IAAI,CAAC,mBAAmB,CAAC,CAAC;IAEhC,KAAK,MAAM,IAAI,IAAI,IAAI,CAAC,aAAa,EAAE,CAAC;QACtC,MAAM,GAAG,GACP,IAAI,CAAC,UAAU,GAAG,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,UAAU,GAAG,IAAI,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC;QAC1E,KAAK,CAAC,IAAI,CACR,OAAO,IAAI,CAAC,MAAM,KAAK,IAAI,CAAC,KAAK,GAAG,GAAG,MAAM,IAAI,CAAC,YAAY,gBAAgB,CAC/E,CAAC;IACJ,CAAC;IAED,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AAC1B,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"export.d.ts","sourceRoot":"","sources":["../../src/session/export.ts"],"names":[],"mappings":"AAIA,wBAAgB,qBAAqB,CAAC,SAAS,EAAE,MAAM,GAAG,MAAM,CAmH/D"}
|
|
@@ -0,0 +1,105 @@
|
|
|
1
|
+
import { eq } from "drizzle-orm";
|
|
2
|
+
import { getDb } from "../db/client.js";
|
|
3
|
+
import { sessions, tasks as tasksTable, iterations } from "../db/schema.js";
|
|
4
|
+
export function exportSessionMarkdown(sessionId) {
|
|
5
|
+
const db = getDb();
|
|
6
|
+
// Get session
|
|
7
|
+
const sessionRows = db
|
|
8
|
+
.select()
|
|
9
|
+
.from(sessions)
|
|
10
|
+
.where(eq(sessions.id, sessionId))
|
|
11
|
+
.all();
|
|
12
|
+
if (sessionRows.length === 0) {
|
|
13
|
+
return `Session not found: ${sessionId}`;
|
|
14
|
+
}
|
|
15
|
+
const session = sessionRows[0];
|
|
16
|
+
// Get tasks
|
|
17
|
+
const taskRows = db
|
|
18
|
+
.select()
|
|
19
|
+
.from(tasksTable)
|
|
20
|
+
.where(eq(tasksTable.sessionId, sessionId))
|
|
21
|
+
.orderBy(tasksTable.order)
|
|
22
|
+
.all();
|
|
23
|
+
// Get iterations
|
|
24
|
+
const iterRows = db
|
|
25
|
+
.select()
|
|
26
|
+
.from(iterations)
|
|
27
|
+
.where(eq(iterations.sessionId, sessionId))
|
|
28
|
+
.orderBy(iterations.iterationNumber)
|
|
29
|
+
.all();
|
|
30
|
+
// Build markdown
|
|
31
|
+
const lines = [];
|
|
32
|
+
lines.push(`# Session Report: ${session.id}`);
|
|
33
|
+
lines.push("");
|
|
34
|
+
lines.push(`**Repository:** ${session.repo}`);
|
|
35
|
+
lines.push(`**Goal:** ${session.goal}`);
|
|
36
|
+
lines.push(`**Status:** ${session.status}`);
|
|
37
|
+
lines.push(`**Created:** ${session.createdAt}`);
|
|
38
|
+
if (session.prUrl) {
|
|
39
|
+
lines.push(`**PR:** [#${session.prNumber}](${session.prUrl})`);
|
|
40
|
+
}
|
|
41
|
+
lines.push("");
|
|
42
|
+
lines.push("---");
|
|
43
|
+
lines.push("");
|
|
44
|
+
// Plan
|
|
45
|
+
if (session.planJson) {
|
|
46
|
+
lines.push("## Plan");
|
|
47
|
+
lines.push("");
|
|
48
|
+
try {
|
|
49
|
+
const plan = JSON.parse(session.planJson);
|
|
50
|
+
if (plan.tasks) {
|
|
51
|
+
for (const t of plan.tasks) {
|
|
52
|
+
lines.push(`- **${t.id}:** ${t.title}`);
|
|
53
|
+
if (t.description) {
|
|
54
|
+
lines.push(` ${t.description}`);
|
|
55
|
+
}
|
|
56
|
+
}
|
|
57
|
+
}
|
|
58
|
+
}
|
|
59
|
+
catch {
|
|
60
|
+
lines.push("```");
|
|
61
|
+
lines.push(session.planJson);
|
|
62
|
+
lines.push("```");
|
|
63
|
+
}
|
|
64
|
+
lines.push("");
|
|
65
|
+
}
|
|
66
|
+
// Tasks
|
|
67
|
+
if (taskRows.length > 0) {
|
|
68
|
+
lines.push("## Tasks");
|
|
69
|
+
lines.push("");
|
|
70
|
+
lines.push("| ID | Title | Status | Review | Cycles |");
|
|
71
|
+
lines.push("|---|---|---|---|---|");
|
|
72
|
+
for (const task of taskRows) {
|
|
73
|
+
lines.push(`| ${task.id} | ${task.title} | ${task.status} | ${task.reviewVerdict ?? "-"} | ${task.reviewCycles ?? 0} |`);
|
|
74
|
+
}
|
|
75
|
+
lines.push("");
|
|
76
|
+
// Diffs
|
|
77
|
+
const tasksWithDiffs = taskRows.filter((t) => t.diffPatch);
|
|
78
|
+
if (tasksWithDiffs.length > 0) {
|
|
79
|
+
lines.push("## Diffs");
|
|
80
|
+
lines.push("");
|
|
81
|
+
for (const task of tasksWithDiffs) {
|
|
82
|
+
lines.push(`### ${task.id}: ${task.title}`);
|
|
83
|
+
lines.push("");
|
|
84
|
+
lines.push("```diff");
|
|
85
|
+
lines.push(task.diffPatch.slice(0, 2000));
|
|
86
|
+
lines.push("```");
|
|
87
|
+
lines.push("");
|
|
88
|
+
}
|
|
89
|
+
}
|
|
90
|
+
}
|
|
91
|
+
// Iterations
|
|
92
|
+
if (iterRows.length > 0) {
|
|
93
|
+
lines.push("## Iterations");
|
|
94
|
+
lines.push("");
|
|
95
|
+
for (const iter of iterRows) {
|
|
96
|
+
lines.push(`### Iteration ${iter.iterationNumber}`);
|
|
97
|
+
lines.push("");
|
|
98
|
+
lines.push(`**Feedback:** ${iter.feedback}`);
|
|
99
|
+
lines.push(`**Status:** ${iter.status}`);
|
|
100
|
+
lines.push("");
|
|
101
|
+
}
|
|
102
|
+
}
|
|
103
|
+
return lines.join("\n");
|
|
104
|
+
}
|
|
105
|
+
//# sourceMappingURL=export.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"export.js","sourceRoot":"","sources":["../../src/session/export.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,EAAE,EAAE,MAAM,aAAa,CAAC;AACjC,OAAO,EAAE,KAAK,EAAE,MAAM,iBAAiB,CAAC;AACxC,OAAO,EAAE,QAAQ,EAAE,KAAK,IAAI,UAAU,EAAY,UAAU,EAAE,MAAM,iBAAiB,CAAC;AAEtF,MAAM,UAAU,qBAAqB,CAAC,SAAiB;IACrD,MAAM,EAAE,GAAG,KAAK,EAAE,CAAC;IAEnB,cAAc;IACd,MAAM,WAAW,GAAG,EAAE;SACnB,MAAM,EAAE;SACR,IAAI,CAAC,QAAQ,CAAC;SACd,KAAK,CAAC,EAAE,CAAC,QAAQ,CAAC,EAAE,EAAE,SAAS,CAAC,CAAC;SACjC,GAAG,EAAE,CAAC;IAET,IAAI,WAAW,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QAC7B,OAAO,sBAAsB,SAAS,EAAE,CAAC;IAC3C,CAAC;IAED,MAAM,OAAO,GAAG,WAAW,CAAC,CAAC,CAAC,CAAC;IAE/B,YAAY;IACZ,MAAM,QAAQ,GAAG,EAAE;SAChB,MAAM,EAAE;SACR,IAAI,CAAC,UAAU,CAAC;SAChB,KAAK,CAAC,EAAE,CAAC,UAAU,CAAC,SAAS,EAAE,SAAS,CAAC,CAAC;SAC1C,OAAO,CAAC,UAAU,CAAC,KAAK,CAAC;SACzB,GAAG,EAAE,CAAC;IAET,iBAAiB;IACjB,MAAM,QAAQ,GAAG,EAAE;SAChB,MAAM,EAAE;SACR,IAAI,CAAC,UAAU,CAAC;SAChB,KAAK,CAAC,EAAE,CAAC,UAAU,CAAC,SAAS,EAAE,SAAS,CAAC,CAAC;SAC1C,OAAO,CAAC,UAAU,CAAC,eAAe,CAAC;SACnC,GAAG,EAAE,CAAC;IAET,iBAAiB;IACjB,MAAM,KAAK,GAAa,EAAE,CAAC;IAC3B,KAAK,CAAC,IAAI,CAAC,qBAAqB,OAAO,CAAC,EAAE,EAAE,CAAC,CAAC;IAC9C,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IACf,KAAK,CAAC,IAAI,CAAC,mBAAmB,OAAO,CAAC,IAAI,EAAE,CAAC,CAAC;IAC9C,KAAK,CAAC,IAAI,CAAC,aAAa,OAAO,CAAC,IAAI,EAAE,CAAC,CAAC;IACxC,KAAK,CAAC,IAAI,CAAC,eAAe,OAAO,CAAC,MAAM,EAAE,CAAC,CAAC;IAC5C,KAAK,CAAC,IAAI,CAAC,gBAAgB,OAAO,CAAC,SAAS,EAAE,CAAC,CAAC;IAEhD,IAAI,OAAO,CAAC,KAAK,EAAE,CAAC;QAClB,KAAK,CAAC,IAAI,CAAC,aAAa,OAAO,CAAC,QAAQ,KAAK,OAAO,CAAC,KAAK,GAAG,CAAC,CAAC;IACjE,CAAC;IAED,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IACf,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;IAClB,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IAEf,OAAO;IACP,IAAI,OAAO,CAAC,QAAQ,EAAE,CAAC;QACrB,KAAK,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;QACtB,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QACf,IAAI,CAAC;YACH,MAAM,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC;YAC1C,IAAI,IAAI,CAAC,KAAK,EAAE,CAAC;gBACf,KAAK,MAAM,CAAC,IAAI,IAAI,CAAC,KAAK,EAAE,CAAC;oBAC3B,KAAK,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,EAAE,OAAO,CAAC,CAAC,KAAK,EAAE,CAAC,CAAC;oBACxC,IAAI,CAAC,CAAC,WAAW,EAAE,CAAC;wBAClB,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,WAAW,EAAE,CAAC,CAAC;oBACnC,CAAC;gBACH,CAAC;YACH,CAAC;QACH,CAAC;QAAC,MAAM,CAAC;YACP,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;YAClB,KAAK,CAAC,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC;YAC7B,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QACpB,CAAC;QACD,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IACjB,CAAC;IAED,QAAQ;IACR,IAAI,QAAQ,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QACxB,KAAK,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;QACvB,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QACf,KAAK,CAAC,IAAI,CAAC,2CAA2C,CAAC,CAAC;QACxD,KAAK,CAAC,IAAI,CAAC,uBAAuB,CAAC,CAAC;QAEpC,KAAK,MAAM,IAAI,IAAI,QAAQ,EAAE,CAAC;YAC5B,KAAK,CAAC,IAAI,CACR,KAAK,IAAI,CAAC,EAAE,MAAM,IAAI,CAAC,KAAK,MAAM,IAAI,CAAC,MAAM,MAAM,IAAI,CAAC,aAAa,IAAI,GAAG,MAAM,IAAI,CAAC,YAAY,IAAI,CAAC,IAAI,CAC7G,CAAC;QACJ,CAAC;QACD,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QAEf,QAAQ;QACR,MAAM,cAAc,GAAG,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC;QAC3D,IAAI,cAAc,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YAC9B,KAAK,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;YACvB,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;YACf,KAAK,MAAM,IAAI,IAAI,cAAc,EAAE,CAAC;gBAClC,KAAK,CAAC,IAAI,CAAC,OAAO,IAAI,CAAC,EAAE,KAAK,IAAI,CAAC,KAAK,EAAE,CAAC,CAAC;gBAC5C,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;gBACf,KAAK,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;gBACtB,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,SAAU,CAAC,KAAK,CAAC,CAAC,EAAE,IAAI,CAAC,CAAC,CAAC;gBAC3C,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;gBAClB,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;YACjB,CAAC;QACH,CAAC;IACH,CAAC;IAED,aAAa;IACb,IAAI,QAAQ,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QACxB,KAAK,CAAC,IAAI,CAAC,eAAe,CAAC,CAAC;QAC5B,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QACf,KAAK,MAAM,IAAI,IAAI,QAAQ,EAAE,CAAC;YAC5B,KAAK,CAAC,IAAI,CAAC,iBAAiB,IAAI,CAAC,eAAe,EAAE,CAAC,CAAC;YACpD,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;YACf,KAAK,CAAC,IAAI,CAAC,iBAAiB,IAAI,CAAC,QAAQ,EAAE,CAAC,CAAC;YAC7C,KAAK,CAAC,IAAI,CAAC,eAAe,IAAI,CAAC,MAAM,EAAE,CAAC,CAAC;YACzC,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QACjB,CAAC;IACH,CAAC;IAED,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AAC1B,CAAC"}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
export declare function getStatusDisplay(sessionId: string): string;
|
|
2
|
+
export declare function getPlanDisplay(sessionId: string): string;
|
|
3
|
+
export declare function getDiffDisplay(sessionId: string): string;
|
|
4
|
+
export declare function getPrDisplay(sessionId: string): string;
|
|
5
|
+
export declare function getTasksDisplay(sessionId: string): string;
|
|
6
|
+
export declare function getHelpDisplay(sessionId?: string): string;
|
|
7
|
+
//# sourceMappingURL=in-session-commands.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"in-session-commands.d.ts","sourceRoot":"","sources":["../../src/session/in-session-commands.ts"],"names":[],"mappings":"AAgBA,wBAAgB,gBAAgB,CAAC,SAAS,EAAE,MAAM,GAAG,MAAM,CA0F1D;AAGD,wBAAgB,cAAc,CAAC,SAAS,EAAE,MAAM,GAAG,MAAM,CA4BxD;AAGD,wBAAgB,cAAc,CAAC,SAAS,EAAE,MAAM,GAAG,MAAM,CAyBxD;AAGD,wBAAgB,YAAY,CAAC,SAAS,EAAE,MAAM,GAAG,MAAM,CAatD;AAGD,wBAAgB,eAAe,CAAC,SAAS,EAAE,MAAM,GAAG,MAAM,CA4BzD;AAGD,wBAAgB,cAAc,CAAC,SAAS,CAAC,EAAE,MAAM,GAAG,MAAM,CAiDzD"}
|