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.
Files changed (206) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +587 -0
  3. package/dist/adapters/adapter.d.ts +19 -0
  4. package/dist/adapters/adapter.d.ts.map +1 -0
  5. package/dist/adapters/adapter.js +20 -0
  6. package/dist/adapters/adapter.js.map +1 -0
  7. package/dist/adapters/claude-code.d.ts +13 -0
  8. package/dist/adapters/claude-code.d.ts.map +1 -0
  9. package/dist/adapters/claude-code.js +150 -0
  10. package/dist/adapters/claude-code.js.map +1 -0
  11. package/dist/adapters/codex.d.ts +13 -0
  12. package/dist/adapters/codex.d.ts.map +1 -0
  13. package/dist/adapters/codex.js +100 -0
  14. package/dist/adapters/codex.js.map +1 -0
  15. package/dist/adapters/custom.d.ts +16 -0
  16. package/dist/adapters/custom.d.ts.map +1 -0
  17. package/dist/adapters/custom.js +167 -0
  18. package/dist/adapters/custom.js.map +1 -0
  19. package/dist/adapters/opencode.d.ts +13 -0
  20. package/dist/adapters/opencode.d.ts.map +1 -0
  21. package/dist/adapters/opencode.js +100 -0
  22. package/dist/adapters/opencode.js.map +1 -0
  23. package/dist/adapters/prompt-detection.d.ts +14 -0
  24. package/dist/adapters/prompt-detection.d.ts.map +1 -0
  25. package/dist/adapters/prompt-detection.js +74 -0
  26. package/dist/adapters/prompt-detection.js.map +1 -0
  27. package/dist/commands/create.d.ts +8 -0
  28. package/dist/commands/create.d.ts.map +1 -0
  29. package/dist/commands/create.js +38 -0
  30. package/dist/commands/create.js.map +1 -0
  31. package/dist/commands/delete.d.ts +2 -0
  32. package/dist/commands/delete.d.ts.map +1 -0
  33. package/dist/commands/delete.js +22 -0
  34. package/dist/commands/delete.js.map +1 -0
  35. package/dist/commands/enter.d.ts +19 -0
  36. package/dist/commands/enter.d.ts.map +1 -0
  37. package/dist/commands/enter.js +73 -0
  38. package/dist/commands/enter.js.map +1 -0
  39. package/dist/commands/init.d.ts +14 -0
  40. package/dist/commands/init.d.ts.map +1 -0
  41. package/dist/commands/init.js +52 -0
  42. package/dist/commands/init.js.map +1 -0
  43. package/dist/commands/list.d.ts +8 -0
  44. package/dist/commands/list.d.ts.map +1 -0
  45. package/dist/commands/list.js +98 -0
  46. package/dist/commands/list.js.map +1 -0
  47. package/dist/commands/show.d.ts +33 -0
  48. package/dist/commands/show.d.ts.map +1 -0
  49. package/dist/commands/show.js +142 -0
  50. package/dist/commands/show.js.map +1 -0
  51. package/dist/commands/stop.d.ts +2 -0
  52. package/dist/commands/stop.d.ts.map +1 -0
  53. package/dist/commands/stop.js +10 -0
  54. package/dist/commands/stop.js.map +1 -0
  55. package/dist/config/discovery.d.ts +12 -0
  56. package/dist/config/discovery.d.ts.map +1 -0
  57. package/dist/config/discovery.js +62 -0
  58. package/dist/config/discovery.js.map +1 -0
  59. package/dist/config/gh-auth.d.ts +5 -0
  60. package/dist/config/gh-auth.d.ts.map +1 -0
  61. package/dist/config/gh-auth.js +18 -0
  62. package/dist/config/gh-auth.js.map +1 -0
  63. package/dist/config/loader.d.ts +38 -0
  64. package/dist/config/loader.d.ts.map +1 -0
  65. package/dist/config/loader.js +72 -0
  66. package/dist/config/loader.js.map +1 -0
  67. package/dist/db/client.d.ts +10 -0
  68. package/dist/db/client.d.ts.map +1 -0
  69. package/dist/db/client.js +84 -0
  70. package/dist/db/client.js.map +1 -0
  71. package/dist/db/schema.d.ts +805 -0
  72. package/dist/db/schema.d.ts.map +1 -0
  73. package/dist/db/schema.js +66 -0
  74. package/dist/db/schema.js.map +1 -0
  75. package/dist/git/git.d.ts +29 -0
  76. package/dist/git/git.d.ts.map +1 -0
  77. package/dist/git/git.js +200 -0
  78. package/dist/git/git.js.map +1 -0
  79. package/dist/index.d.ts +3 -0
  80. package/dist/index.d.ts.map +1 -0
  81. package/dist/index.js +154 -0
  82. package/dist/index.js.map +1 -0
  83. package/dist/lifecycle.d.ts +5 -0
  84. package/dist/lifecycle.d.ts.map +1 -0
  85. package/dist/lifecycle.js +63 -0
  86. package/dist/lifecycle.js.map +1 -0
  87. package/dist/orchestrator/build-handler.d.ts +20 -0
  88. package/dist/orchestrator/build-handler.d.ts.map +1 -0
  89. package/dist/orchestrator/build-handler.js +212 -0
  90. package/dist/orchestrator/build-handler.js.map +1 -0
  91. package/dist/orchestrator/dag.d.ts +10 -0
  92. package/dist/orchestrator/dag.d.ts.map +1 -0
  93. package/dist/orchestrator/dag.js +70 -0
  94. package/dist/orchestrator/dag.js.map +1 -0
  95. package/dist/orchestrator/error-handling.d.ts +21 -0
  96. package/dist/orchestrator/error-handling.d.ts.map +1 -0
  97. package/dist/orchestrator/error-handling.js +124 -0
  98. package/dist/orchestrator/error-handling.js.map +1 -0
  99. package/dist/orchestrator/feedback-handler.d.ts +36 -0
  100. package/dist/orchestrator/feedback-handler.d.ts.map +1 -0
  101. package/dist/orchestrator/feedback-handler.js +316 -0
  102. package/dist/orchestrator/feedback-handler.js.map +1 -0
  103. package/dist/orchestrator/orchestrator.d.ts +21 -0
  104. package/dist/orchestrator/orchestrator.d.ts.map +1 -0
  105. package/dist/orchestrator/orchestrator.js +188 -0
  106. package/dist/orchestrator/orchestrator.js.map +1 -0
  107. package/dist/orchestrator/parallel-runner.d.ts +3 -0
  108. package/dist/orchestrator/parallel-runner.d.ts.map +1 -0
  109. package/dist/orchestrator/parallel-runner.js +111 -0
  110. package/dist/orchestrator/parallel-runner.js.map +1 -0
  111. package/dist/orchestrator/reviewer.d.ts +20 -0
  112. package/dist/orchestrator/reviewer.d.ts.map +1 -0
  113. package/dist/orchestrator/reviewer.js +175 -0
  114. package/dist/orchestrator/reviewer.js.map +1 -0
  115. package/dist/orchestrator/task-runner.d.ts +20 -0
  116. package/dist/orchestrator/task-runner.d.ts.map +1 -0
  117. package/dist/orchestrator/task-runner.js +122 -0
  118. package/dist/orchestrator/task-runner.js.map +1 -0
  119. package/dist/orchestrator/test-runner.d.ts +8 -0
  120. package/dist/orchestrator/test-runner.d.ts.map +1 -0
  121. package/dist/orchestrator/test-runner.js +81 -0
  122. package/dist/orchestrator/test-runner.js.map +1 -0
  123. package/dist/planner/plan-parser.d.ts +14 -0
  124. package/dist/planner/plan-parser.d.ts.map +1 -0
  125. package/dist/planner/plan-parser.js +182 -0
  126. package/dist/planner/plan-parser.js.map +1 -0
  127. package/dist/planner/planner.d.ts +9 -0
  128. package/dist/planner/planner.d.ts.map +1 -0
  129. package/dist/planner/planner.js +151 -0
  130. package/dist/planner/planner.js.map +1 -0
  131. package/dist/repl/repl.d.ts +19 -0
  132. package/dist/repl/repl.d.ts.map +1 -0
  133. package/dist/repl/repl.js +505 -0
  134. package/dist/repl/repl.js.map +1 -0
  135. package/dist/session/agent-log.d.ts +35 -0
  136. package/dist/session/agent-log.d.ts.map +1 -0
  137. package/dist/session/agent-log.js +120 -0
  138. package/dist/session/agent-log.js.map +1 -0
  139. package/dist/session/chat.d.ts +38 -0
  140. package/dist/session/chat.d.ts.map +1 -0
  141. package/dist/session/chat.js +106 -0
  142. package/dist/session/chat.js.map +1 -0
  143. package/dist/session/cost-tracker.d.ts +14 -0
  144. package/dist/session/cost-tracker.d.ts.map +1 -0
  145. package/dist/session/cost-tracker.js +61 -0
  146. package/dist/session/cost-tracker.js.map +1 -0
  147. package/dist/session/export.d.ts +2 -0
  148. package/dist/session/export.d.ts.map +1 -0
  149. package/dist/session/export.js +105 -0
  150. package/dist/session/export.js.map +1 -0
  151. package/dist/session/in-session-commands.d.ts +7 -0
  152. package/dist/session/in-session-commands.d.ts.map +1 -0
  153. package/dist/session/in-session-commands.js +227 -0
  154. package/dist/session/in-session-commands.js.map +1 -0
  155. package/dist/session/interactive.d.ts +37 -0
  156. package/dist/session/interactive.d.ts.map +1 -0
  157. package/dist/session/interactive.js +226 -0
  158. package/dist/session/interactive.js.map +1 -0
  159. package/dist/session/manager.d.ts +63 -0
  160. package/dist/session/manager.d.ts.map +1 -0
  161. package/dist/session/manager.js +229 -0
  162. package/dist/session/manager.js.map +1 -0
  163. package/dist/session/resume.d.ts +7 -0
  164. package/dist/session/resume.d.ts.map +1 -0
  165. package/dist/session/resume.js +53 -0
  166. package/dist/session/resume.js.map +1 -0
  167. package/dist/session/state-machine.d.ts +4 -0
  168. package/dist/session/state-machine.d.ts.map +1 -0
  169. package/dist/session/state-machine.js +47 -0
  170. package/dist/session/state-machine.js.map +1 -0
  171. package/dist/tui/chat-ui.d.ts +16 -0
  172. package/dist/tui/chat-ui.d.ts.map +1 -0
  173. package/dist/tui/chat-ui.js +19 -0
  174. package/dist/tui/chat-ui.js.map +1 -0
  175. package/dist/tui/dashboard.d.ts +17 -0
  176. package/dist/tui/dashboard.d.ts.map +1 -0
  177. package/dist/tui/dashboard.js +57 -0
  178. package/dist/tui/dashboard.js.map +1 -0
  179. package/dist/tui/session-list.d.ts +18 -0
  180. package/dist/tui/session-list.d.ts.map +1 -0
  181. package/dist/tui/session-list.js +26 -0
  182. package/dist/tui/session-list.js.map +1 -0
  183. package/dist/ui/agent-panel.d.ts +9 -0
  184. package/dist/ui/agent-panel.d.ts.map +1 -0
  185. package/dist/ui/agent-panel.js +100 -0
  186. package/dist/ui/agent-panel.js.map +1 -0
  187. package/dist/ui/banner.d.ts +10 -0
  188. package/dist/ui/banner.d.ts.map +1 -0
  189. package/dist/ui/banner.js +100 -0
  190. package/dist/ui/banner.js.map +1 -0
  191. package/dist/ui/markdown.d.ts +19 -0
  192. package/dist/ui/markdown.d.ts.map +1 -0
  193. package/dist/ui/markdown.js +174 -0
  194. package/dist/ui/markdown.js.map +1 -0
  195. package/dist/ui/prompt.d.ts +24 -0
  196. package/dist/ui/prompt.d.ts.map +1 -0
  197. package/dist/ui/prompt.js +226 -0
  198. package/dist/ui/prompt.js.map +1 -0
  199. package/dist/utils/time.d.ts +3 -0
  200. package/dist/utils/time.d.ts.map +1 -0
  201. package/dist/utils/time.js +29 -0
  202. package/dist/utils/time.js.map +1 -0
  203. package/drizzle/migrations/0000_naive_human_fly.sql +56 -0
  204. package/drizzle/migrations/meta/0000_snapshot.json +395 -0
  205. package/drizzle/migrations/meta/_journal.json +13 -0
  206. 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":"AAAA,OAAO,EACL,SAAS,EACT,cAAc,EACd,YAAY,EACZ,aAAa,EACb,UAAU,EACV,QAAQ,GACT,MAAM,IAAI,CAAC;AACZ,OAAO,EAAE,IAAI,EAAE,MAAM,MAAM,CAAC;AAC5B,OAAO,EAAE,WAAW,EAAE,MAAM,iBAAiB,CAAC;AAE9C,MAAM,OAAO,GAAG,IAAI,CAAC,WAAW,EAAE,MAAM,CAAC,CAAC;AAgB1C,MAAM,UAAU,UAAU,CAAC,SAAiB;IAC1C,SAAS,CAAC,OAAO,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IACxC,OAAO,IAAI,CAAC,OAAO,EAAE,GAAG,SAAS,QAAQ,CAAC,CAAC;AAC7C,CAAC;AAED,MAAM,UAAU,QAAQ,CAAC,SAAiB;IACxC,aAAa,CAAC,UAAU,CAAC,SAAS,CAAC,EAAE,EAAE,CAAC,CAAC;AAC3C,CAAC;AAED,MAAM,UAAU,UAAU,CACxB,SAAiB,EACjB,KAA6B;IAE7B,MAAM,IAAI,GAAG,IAAI,CAAC,SAAS,CAAC,EAAE,GAAG,KAAK,EAAE,EAAE,EAAE,IAAI,CAAC,GAAG,EAAE,EAAE,CAAC,GAAG,IAAI,CAAC;IACjE,cAAc,CAAC,UAAU,CAAC,SAAS,CAAC,EAAE,IAAI,CAAC,CAAC;AAC9C,CAAC;AAMD;;;GAGG;AACH;;;GAGG;AACH,MAAM,UAAU,WAAW,CAAC,SAAiB,EAAE,mBAA2B,MAAM;IAC9E,MAAM,OAAO,GAAG,UAAU,CAAC,SAAS,CAAC,CAAC;IACtC,IAAI,CAAC,UAAU,CAAC,OAAO,CAAC;QAAE,OAAO,KAAK,CAAC;IAEvC,IAAI,CAAC;QACH,MAAM,OAAO,GAAG,YAAY,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC,IAAI,EAAE,CAAC;QACtD,IAAI,CAAC,OAAO;YAAE,OAAO,KAAK,CAAC;QAE3B,mCAAmC;QACnC,MAAM,KAAK,GAAG,OAAO,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;QAClD,MAAM,QAAQ,GAAG,KAAK,CAAC,KAAK,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;QACzC,MAAM,SAAS,GAAG,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAe,CAAC;QAErD,yDAAyD;QACzD,IAAI,SAAS,CAAC,IAAI,KAAK,gBAAgB;YAAE,OAAO,KAAK,CAAC;QAEtD,2EAA2E;QAC3E,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,EAAE,GAAG,SAAS,CAAC,EAAE,CAAC;QACtC,OAAO,GAAG,GAAG,gBAAgB,CAAC;IAChC,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,KAAK,CAAC;IACf,CAAC;AACH,CAAC;AAED,MAAM,UAAU,QAAQ,CACtB,SAAiB,EACjB,OAAoC;IAEpC,MAAM,OAAO,GAAG,UAAU,CAAC,SAAS,CAAC,CAAC;IACtC,IAAI,MAAM,GAAG,CAAC,CAAC;IACf,IAAI,OAAO,GAAG,KAAK,CAAC;IAEpB,SAAS,IAAI;QACX,IAAI,OAAO;YAAE,OAAO;QACpB,IAAI,CAAC;YACH,IAAI,CAAC,UAAU,CAAC,OAAO,CAAC;gBAAE,OAAO;YACjC,MAAM,IAAI,GAAG,QAAQ,CAAC,OAAO,CAAC,CAAC;YAC/B,IAAI,IAAI,CAAC,IAAI,IAAI,MAAM;gBAAE,OAAO;YAEhC,MAAM,OAAO,GAAG,YAAY,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;YAC/C,MAAM,UAAU,GAAG,OAAO,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC;YACzC,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;YAExB,MAAM,KAAK,GAAG,UAAU,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;YACrD,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;gBACzB,IAAI,CAAC;oBACH,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC;gBAC5B,CAAC;gBAAC,MAAM,CAAC;oBACP,uBAAuB;gBACzB,CAAC;YACH,CAAC;QACH,CAAC;QAAC,MAAM,CAAC;YACP,qCAAqC;QACvC,CAAC;IACH,CAAC;IAED,wCAAwC;IACxC,IAAI,EAAE,CAAC;IAEP,uBAAuB;IACvB,MAAM,KAAK,GAAG,WAAW,CAAC,IAAI,EAAE,GAAG,CAAC,CAAC;IAErC,OAAO;QACL,IAAI;YACF,OAAO,GAAG,IAAI,CAAC;YACf,aAAa,CAAC,KAAK,CAAC,CAAC;QACvB,CAAC;KACF,CAAC;AACJ,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,eAAe,CAC7B,SAAiB,EACjB,SAAiB,EACjB,YAAoB,CAAC,GAAG,EAAE,GAAG,IAAI;IAEjC,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,EAAE;QAC7B,MAAM,QAAQ,GAAG,IAAI,CAAC,GAAG,EAAE,GAAG,SAAS,CAAC;QACxC,IAAI,QAAQ,GAAG,KAAK,CAAC;QAErB,MAAM,OAAO,GAAG,QAAQ,CAAC,SAAS,EAAE,CAAC,KAAK,EAAE,EAAE;YAC5C,IAAI,QAAQ;gBAAE,OAAO;YACrB,IAAI,KAAK,CAAC,IAAI,KAAK,gBAAgB,IAAI,KAAK,CAAC,SAAS,KAAK,SAAS,EAAE,CAAC;gBACrE,QAAQ,GAAG,IAAI,CAAC;gBAChB,OAAO,CAAC,IAAI,EAAE,CAAC;gBACf,OAAO,CAAC,KAAK,CAAC,QAAQ,IAAI,IAAI,CAAC,CAAC;YAClC,CAAC;QACH,CAAC,CAAC,CAAC;QAEH,gBAAgB;QAChB,MAAM,KAAK,GAAG,WAAW,CAAC,GAAG,EAAE;YAC7B,IAAI,QAAQ,EAAE,CAAC;gBACb,aAAa,CAAC,KAAK,CAAC,CAAC;gBACrB,OAAO;YACT,CAAC;YACD,IAAI,IAAI,CAAC,GAAG,EAAE,GAAG,QAAQ,EAAE,CAAC;gBAC1B,aAAa,CAAC,KAAK,CAAC,CAAC;gBACrB,QAAQ,GAAG,IAAI,CAAC;gBAChB,OAAO,CAAC,IAAI,EAAE,CAAC;gBACf,OAAO,CAAC,IAAI,CAAC,CAAC;YAChB,CAAC;QACH,CAAC,EAAE,IAAI,CAAC,CAAC;IACX,CAAC,CAAC,CAAC;AACL,CAAC"}
@@ -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":"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"}
@@ -0,0 +1,2 @@
1
+ export declare function exportSessionMarkdown(sessionId: string): string;
2
+ //# sourceMappingURL=export.d.ts.map
@@ -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":"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"}
@@ -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"}