opencode-forge 0.1.5

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 (309) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +534 -0
  3. package/config.jsonc +47 -0
  4. package/dist/agents/architect.d.ts +3 -0
  5. package/dist/agents/architect.d.ts.map +1 -0
  6. package/dist/agents/architect.js +152 -0
  7. package/dist/agents/architect.js.map +1 -0
  8. package/dist/agents/auditor.d.ts +3 -0
  9. package/dist/agents/auditor.d.ts.map +1 -0
  10. package/dist/agents/auditor.js +168 -0
  11. package/dist/agents/auditor.js.map +1 -0
  12. package/dist/agents/code.d.ts +3 -0
  13. package/dist/agents/code.d.ts.map +1 -0
  14. package/dist/agents/code.js +67 -0
  15. package/dist/agents/code.js.map +1 -0
  16. package/dist/agents/index.d.ts +4 -0
  17. package/dist/agents/index.d.ts.map +1 -0
  18. package/dist/agents/index.js +9 -0
  19. package/dist/agents/index.js.map +1 -0
  20. package/dist/agents/prompts.d.ts +1 -0
  21. package/dist/agents/prompts.d.ts.map +1 -0
  22. package/dist/agents/prompts.js +4 -0
  23. package/dist/agents/prompts.js.map +1 -0
  24. package/dist/agents/types.d.ts +34 -0
  25. package/dist/agents/types.d.ts.map +1 -0
  26. package/dist/agents/types.js +2 -0
  27. package/dist/agents/types.js.map +1 -0
  28. package/dist/cache/index.d.ts +4 -0
  29. package/dist/cache/index.d.ts.map +1 -0
  30. package/dist/cache/index.js +5 -0
  31. package/dist/cache/index.js.map +1 -0
  32. package/dist/cache/memory-cache.d.ts +14 -0
  33. package/dist/cache/memory-cache.d.ts.map +1 -0
  34. package/dist/cache/memory-cache.js +51 -0
  35. package/dist/cache/memory-cache.js.map +1 -0
  36. package/dist/cache/types.d.ts +8 -0
  37. package/dist/cache/types.d.ts.map +1 -0
  38. package/dist/cache/types.js +2 -0
  39. package/dist/cache/types.js.map +1 -0
  40. package/dist/cli/commands/cancel.d.ts +15 -0
  41. package/dist/cli/commands/cancel.d.ts.map +1 -0
  42. package/dist/cli/commands/cancel.js +194 -0
  43. package/dist/cli/commands/cancel.js.map +1 -0
  44. package/dist/cli/commands/graph.d.ts +16 -0
  45. package/dist/cli/commands/graph.d.ts.map +1 -0
  46. package/dist/cli/commands/graph.js +208 -0
  47. package/dist/cli/commands/graph.js.map +1 -0
  48. package/dist/cli/commands/restart.d.ts +15 -0
  49. package/dist/cli/commands/restart.d.ts.map +1 -0
  50. package/dist/cli/commands/restart.js +268 -0
  51. package/dist/cli/commands/restart.js.map +1 -0
  52. package/dist/cli/commands/status.d.ts +17 -0
  53. package/dist/cli/commands/status.d.ts.map +1 -0
  54. package/dist/cli/commands/status.js +356 -0
  55. package/dist/cli/commands/status.js.map +1 -0
  56. package/dist/cli/commands/upgrade.d.ts +3 -0
  57. package/dist/cli/commands/upgrade.d.ts.map +1 -0
  58. package/dist/cli/commands/upgrade.js +40 -0
  59. package/dist/cli/commands/upgrade.js.map +1 -0
  60. package/dist/cli/index.d.ts +3 -0
  61. package/dist/cli/index.d.ts.map +1 -0
  62. package/dist/cli/index.js +224 -0
  63. package/dist/cli/index.js.map +1 -0
  64. package/dist/cli/utils.d.ts +36 -0
  65. package/dist/cli/utils.d.ts.map +1 -0
  66. package/dist/cli/utils.js +163 -0
  67. package/dist/cli/utils.js.map +1 -0
  68. package/dist/command/template/review.txt +101 -0
  69. package/dist/config.d.ts +5 -0
  70. package/dist/config.d.ts.map +1 -0
  71. package/dist/config.js +186 -0
  72. package/dist/config.js.map +1 -0
  73. package/dist/constants/loop.d.ts +10 -0
  74. package/dist/constants/loop.d.ts.map +1 -0
  75. package/dist/constants/loop.js +6 -0
  76. package/dist/constants/loop.js.map +1 -0
  77. package/dist/graph/cache.d.ts +17 -0
  78. package/dist/graph/cache.d.ts.map +1 -0
  79. package/dist/graph/cache.js +50 -0
  80. package/dist/graph/cache.js.map +1 -0
  81. package/dist/graph/client.d.ts +51 -0
  82. package/dist/graph/client.d.ts.map +1 -0
  83. package/dist/graph/client.js +152 -0
  84. package/dist/graph/client.js.map +1 -0
  85. package/dist/graph/clone-detection.d.ts +9 -0
  86. package/dist/graph/clone-detection.d.ts.map +1 -0
  87. package/dist/graph/clone-detection.js +148 -0
  88. package/dist/graph/clone-detection.js.map +1 -0
  89. package/dist/graph/constants.d.ts +18 -0
  90. package/dist/graph/constants.d.ts.map +1 -0
  91. package/dist/graph/constants.js +532 -0
  92. package/dist/graph/constants.js.map +1 -0
  93. package/dist/graph/database.d.ts +11 -0
  94. package/dist/graph/database.d.ts.map +1 -0
  95. package/dist/graph/database.js +250 -0
  96. package/dist/graph/database.js.map +1 -0
  97. package/dist/graph/index.d.ts +14 -0
  98. package/dist/graph/index.d.ts.map +1 -0
  99. package/dist/graph/index.js +13 -0
  100. package/dist/graph/index.js.map +1 -0
  101. package/dist/graph/repo-map.d.ts +59 -0
  102. package/dist/graph/repo-map.d.ts.map +1 -0
  103. package/dist/graph/repo-map.js +948 -0
  104. package/dist/graph/repo-map.js.map +1 -0
  105. package/dist/graph/rpc.d.ts +34 -0
  106. package/dist/graph/rpc.d.ts.map +1 -0
  107. package/dist/graph/rpc.js +139 -0
  108. package/dist/graph/rpc.js.map +1 -0
  109. package/dist/graph/service.d.ts +46 -0
  110. package/dist/graph/service.d.ts.map +1 -0
  111. package/dist/graph/service.js +329 -0
  112. package/dist/graph/service.js.map +1 -0
  113. package/dist/graph/tree-sitter.d.ts +40 -0
  114. package/dist/graph/tree-sitter.d.ts.map +1 -0
  115. package/dist/graph/tree-sitter.js +799 -0
  116. package/dist/graph/tree-sitter.js.map +1 -0
  117. package/dist/graph/types.d.ts +175 -0
  118. package/dist/graph/types.d.ts.map +1 -0
  119. package/dist/graph/types.js +105 -0
  120. package/dist/graph/types.js.map +1 -0
  121. package/dist/graph/utils.d.ts +64 -0
  122. package/dist/graph/utils.d.ts.map +1 -0
  123. package/dist/graph/utils.js +406 -0
  124. package/dist/graph/utils.js.map +1 -0
  125. package/dist/graph/worker.d.ts +2 -0
  126. package/dist/graph/worker.d.ts.map +1 -0
  127. package/dist/graph/worker.js +6043 -0
  128. package/dist/graph/worker.js.map +1 -0
  129. package/dist/hooks/compaction-utils.d.ts +21 -0
  130. package/dist/hooks/compaction-utils.d.ts.map +1 -0
  131. package/dist/hooks/compaction-utils.js +82 -0
  132. package/dist/hooks/compaction-utils.js.map +1 -0
  133. package/dist/hooks/graph-command.d.ts +27 -0
  134. package/dist/hooks/graph-command.d.ts.map +1 -0
  135. package/dist/hooks/graph-command.js +57 -0
  136. package/dist/hooks/graph-command.js.map +1 -0
  137. package/dist/hooks/graph-tools.d.ts +11 -0
  138. package/dist/hooks/graph-tools.d.ts.map +1 -0
  139. package/dist/hooks/graph-tools.js +125 -0
  140. package/dist/hooks/graph-tools.js.map +1 -0
  141. package/dist/hooks/index.d.ts +5 -0
  142. package/dist/hooks/index.d.ts.map +1 -0
  143. package/dist/hooks/index.js +5 -0
  144. package/dist/hooks/index.js.map +1 -0
  145. package/dist/hooks/loop.d.ts +23 -0
  146. package/dist/hooks/loop.d.ts.map +1 -0
  147. package/dist/hooks/loop.js +667 -0
  148. package/dist/hooks/loop.js.map +1 -0
  149. package/dist/hooks/sandbox-tools.d.ts +13 -0
  150. package/dist/hooks/sandbox-tools.d.ts.map +1 -0
  151. package/dist/hooks/sandbox-tools.js +105 -0
  152. package/dist/hooks/sandbox-tools.js.map +1 -0
  153. package/dist/hooks/session.d.ts +19 -0
  154. package/dist/hooks/session.d.ts.map +1 -0
  155. package/dist/hooks/session.js +56 -0
  156. package/dist/hooks/session.js.map +1 -0
  157. package/dist/index.d.ts +11 -0
  158. package/dist/index.d.ts.map +1 -0
  159. package/dist/index.js +298 -0
  160. package/dist/index.js.map +1 -0
  161. package/dist/sandbox/context.d.ts +27 -0
  162. package/dist/sandbox/context.d.ts.map +1 -0
  163. package/dist/sandbox/context.js +18 -0
  164. package/dist/sandbox/context.js.map +1 -0
  165. package/dist/sandbox/docker.d.ts +29 -0
  166. package/dist/sandbox/docker.d.ts.map +1 -0
  167. package/dist/sandbox/docker.js +213 -0
  168. package/dist/sandbox/docker.js.map +1 -0
  169. package/dist/sandbox/manager.d.ts +23 -0
  170. package/dist/sandbox/manager.d.ts.map +1 -0
  171. package/dist/sandbox/manager.js +131 -0
  172. package/dist/sandbox/manager.js.map +1 -0
  173. package/dist/sandbox/path.d.ts +4 -0
  174. package/dist/sandbox/path.d.ts.map +1 -0
  175. package/dist/sandbox/path.js +27 -0
  176. package/dist/sandbox/path.js.map +1 -0
  177. package/dist/services/kv.d.ts +17 -0
  178. package/dist/services/kv.d.ts.map +1 -0
  179. package/dist/services/kv.js +62 -0
  180. package/dist/services/kv.js.map +1 -0
  181. package/dist/services/loop.d.ts +96 -0
  182. package/dist/services/loop.d.ts.map +1 -0
  183. package/dist/services/loop.js +315 -0
  184. package/dist/services/loop.js.map +1 -0
  185. package/dist/setup.d.ts +4 -0
  186. package/dist/setup.d.ts.map +1 -0
  187. package/dist/setup.js +118 -0
  188. package/dist/setup.js.map +1 -0
  189. package/dist/storage/database.d.ts +6 -0
  190. package/dist/storage/database.d.ts.map +1 -0
  191. package/dist/storage/database.js +90 -0
  192. package/dist/storage/database.js.map +1 -0
  193. package/dist/storage/graph-projects.d.ts +80 -0
  194. package/dist/storage/graph-projects.d.ts.map +1 -0
  195. package/dist/storage/graph-projects.js +154 -0
  196. package/dist/storage/graph-projects.js.map +1 -0
  197. package/dist/storage/index.d.ts +5 -0
  198. package/dist/storage/index.d.ts.map +1 -0
  199. package/dist/storage/index.js +3 -0
  200. package/dist/storage/index.js.map +1 -0
  201. package/dist/storage/kv-queries.d.ts +18 -0
  202. package/dist/storage/kv-queries.d.ts.map +1 -0
  203. package/dist/storage/kv-queries.js +70 -0
  204. package/dist/storage/kv-queries.js.map +1 -0
  205. package/dist/tools/graph.d.ts +9 -0
  206. package/dist/tools/graph.d.ts.map +1 -0
  207. package/dist/tools/graph.js +272 -0
  208. package/dist/tools/graph.js.map +1 -0
  209. package/dist/tools/index.d.ts +6 -0
  210. package/dist/tools/index.d.ts.map +1 -0
  211. package/dist/tools/index.js +16 -0
  212. package/dist/tools/index.js.map +1 -0
  213. package/dist/tools/loop.d.ts +21 -0
  214. package/dist/tools/loop.d.ts.map +1 -0
  215. package/dist/tools/loop.js +570 -0
  216. package/dist/tools/loop.js.map +1 -0
  217. package/dist/tools/plan-approval.d.ts +15 -0
  218. package/dist/tools/plan-approval.d.ts.map +1 -0
  219. package/dist/tools/plan-approval.js +203 -0
  220. package/dist/tools/plan-approval.js.map +1 -0
  221. package/dist/tools/plan-execute.d.ts +4 -0
  222. package/dist/tools/plan-execute.d.ts.map +1 -0
  223. package/dist/tools/plan-execute.js +85 -0
  224. package/dist/tools/plan-execute.js.map +1 -0
  225. package/dist/tools/plan-kv.d.ts +4 -0
  226. package/dist/tools/plan-kv.d.ts.map +1 -0
  227. package/dist/tools/plan-kv.js +107 -0
  228. package/dist/tools/plan-kv.js.map +1 -0
  229. package/dist/tools/review.d.ts +4 -0
  230. package/dist/tools/review.d.ts.map +1 -0
  231. package/dist/tools/review.js +90 -0
  232. package/dist/tools/review.js.map +1 -0
  233. package/dist/tools/sandbox-fs.d.ts +22 -0
  234. package/dist/tools/sandbox-fs.d.ts.map +1 -0
  235. package/dist/tools/sandbox-fs.js +83 -0
  236. package/dist/tools/sandbox-fs.js.map +1 -0
  237. package/dist/tools/types.d.ts +26 -0
  238. package/dist/tools/types.d.ts.map +1 -0
  239. package/dist/tools/types.js +2 -0
  240. package/dist/tools/types.js.map +1 -0
  241. package/dist/tui.d.ts +3 -0
  242. package/dist/tui.js +2061 -0
  243. package/dist/types.d.ts +124 -0
  244. package/dist/types.d.ts.map +1 -0
  245. package/dist/types.js +2 -0
  246. package/dist/types.js.map +1 -0
  247. package/dist/utils/git-branch.d.ts +11 -0
  248. package/dist/utils/git-branch.d.ts.map +1 -0
  249. package/dist/utils/git-branch.js +35 -0
  250. package/dist/utils/git-branch.js.map +1 -0
  251. package/dist/utils/graph-status-store.d.ts +72 -0
  252. package/dist/utils/graph-status-store.d.ts.map +1 -0
  253. package/dist/utils/graph-status-store.js +62 -0
  254. package/dist/utils/graph-status-store.js.map +1 -0
  255. package/dist/utils/logger.d.ts +8 -0
  256. package/dist/utils/logger.d.ts.map +1 -0
  257. package/dist/utils/logger.js +89 -0
  258. package/dist/utils/logger.js.map +1 -0
  259. package/dist/utils/loop-format.d.ts +5 -0
  260. package/dist/utils/loop-format.d.ts.map +1 -0
  261. package/dist/utils/loop-format.js +29 -0
  262. package/dist/utils/loop-format.js.map +1 -0
  263. package/dist/utils/loop-helpers.d.ts +9 -0
  264. package/dist/utils/loop-helpers.d.ts.map +1 -0
  265. package/dist/utils/loop-helpers.js +20 -0
  266. package/dist/utils/loop-helpers.js.map +1 -0
  267. package/dist/utils/loop-launch.d.ts +32 -0
  268. package/dist/utils/loop-launch.d.ts.map +1 -0
  269. package/dist/utils/loop-launch.js +162 -0
  270. package/dist/utils/loop-launch.js.map +1 -0
  271. package/dist/utils/model-fallback.d.ts +27 -0
  272. package/dist/utils/model-fallback.d.ts.map +1 -0
  273. package/dist/utils/model-fallback.js +33 -0
  274. package/dist/utils/model-fallback.js.map +1 -0
  275. package/dist/utils/partial-match.d.ts +7 -0
  276. package/dist/utils/partial-match.d.ts.map +1 -0
  277. package/dist/utils/partial-match.js +56 -0
  278. package/dist/utils/partial-match.js.map +1 -0
  279. package/dist/utils/plan-execution.d.ts +65 -0
  280. package/dist/utils/plan-execution.d.ts.map +1 -0
  281. package/dist/utils/plan-execution.js +107 -0
  282. package/dist/utils/plan-execution.js.map +1 -0
  283. package/dist/utils/session-stats.d.ts +36 -0
  284. package/dist/utils/session-stats.d.ts.map +1 -0
  285. package/dist/utils/session-stats.js +145 -0
  286. package/dist/utils/session-stats.js.map +1 -0
  287. package/dist/utils/tui-graph-status.d.ts +38 -0
  288. package/dist/utils/tui-graph-status.d.ts.map +1 -0
  289. package/dist/utils/tui-graph-status.js +95 -0
  290. package/dist/utils/tui-graph-status.js.map +1 -0
  291. package/dist/utils/tui-plan-store.d.ts +54 -0
  292. package/dist/utils/tui-plan-store.d.ts.map +1 -0
  293. package/dist/utils/tui-plan-store.js +168 -0
  294. package/dist/utils/tui-plan-store.js.map +1 -0
  295. package/dist/utils/tui-refresh-helpers.d.ts +44 -0
  296. package/dist/utils/tui-refresh-helpers.d.ts.map +1 -0
  297. package/dist/utils/tui-refresh-helpers.js +120 -0
  298. package/dist/utils/tui-refresh-helpers.js.map +1 -0
  299. package/dist/utils/upgrade.d.ts +23 -0
  300. package/dist/utils/upgrade.d.ts.map +1 -0
  301. package/dist/utils/upgrade.js +111 -0
  302. package/dist/utils/upgrade.js.map +1 -0
  303. package/dist/version.d.ts +2 -0
  304. package/dist/version.d.ts.map +1 -0
  305. package/dist/version.js +2 -0
  306. package/dist/version.js.map +1 -0
  307. package/package.json +92 -0
  308. package/scripts/build.ts +67 -0
  309. package/src/command/template/review.txt +101 -0
@@ -0,0 +1,162 @@
1
+ /**
2
+ * Fresh loop launch helper for TUI and tool-side execution.
3
+ *
4
+ * This module provides functions to create fresh loop sessions
5
+ * separate from the restartLoop() function which requires preexisting loop state.
6
+ */
7
+ import { Database } from 'bun:sqlite';
8
+ import { existsSync } from 'fs';
9
+ import { join } from 'path';
10
+ import { DEFAULT_COMPLETION_SIGNAL, generateUniqueName, buildCompletionSignalInstructions } from '../services/loop';
11
+ import { extractLoopNames } from './plan-execution';
12
+ import { createKvQuery } from '../storage/kv-queries';
13
+ import { resolveDataDir } from '../storage';
14
+ /**
15
+ * Launches a fresh loop session (either in-place or in a worktree).
16
+ * This is separate from restartLoop() which requires preexisting loop state.
17
+ *
18
+ * @returns LaunchResult with session ID, loop name, and worktree details if successful, null otherwise
19
+ */
20
+ export async function launchFreshLoop(options) {
21
+ const { planText, title, directory, projectId, isWorktree, api } = options;
22
+ // Extract loop name from plan (uses explicit Loop Name field or falls back to title)
23
+ const { displayName, executionName } = extractLoopNames(planText);
24
+ // Read existing loop names from KV to generate a unique worktree name
25
+ const dbPath = options.dbPath ?? join(resolveDataDir(), 'graph.db');
26
+ const existingNames = [];
27
+ if (existsSync(dbPath)) {
28
+ let db = null;
29
+ try {
30
+ db = new Database(dbPath, { readonly: true });
31
+ const stmt = db.prepare('SELECT data FROM project_kv WHERE project_id = ? AND key LIKE ? AND expires_at > ?');
32
+ const rows = stmt.all(projectId, 'loop:%', Date.now());
33
+ for (const row of rows) {
34
+ try {
35
+ const state = JSON.parse(row.data);
36
+ if (state?.worktreeName) {
37
+ existingNames.push(state.worktreeName);
38
+ }
39
+ }
40
+ catch {
41
+ // Skip invalid JSON
42
+ }
43
+ }
44
+ }
45
+ catch {
46
+ // Continue even if we can't read existing names
47
+ }
48
+ finally {
49
+ try {
50
+ db?.close();
51
+ }
52
+ catch { }
53
+ }
54
+ }
55
+ // Generate unique worktree name before any side effects
56
+ const uniqueWorktreeName = generateUniqueName(executionName, existingNames);
57
+ // Create session based on worktree mode
58
+ let sessionId;
59
+ let sessionDirectory;
60
+ let worktreeBranch;
61
+ if (isWorktree) {
62
+ // Create worktree and session
63
+ const worktreeResult = await api.client.worktree.create({
64
+ worktreeCreateInput: { name: uniqueWorktreeName },
65
+ });
66
+ if (worktreeResult.error || !worktreeResult.data) {
67
+ return null;
68
+ }
69
+ sessionDirectory = worktreeResult.data.directory;
70
+ worktreeBranch = worktreeResult.data.branch;
71
+ const createResult = await api.client.session.create({
72
+ title: `Loop: ${title}`,
73
+ directory: sessionDirectory,
74
+ // Note: Cannot set permission ruleset from TUI - handled by loop service
75
+ });
76
+ if (createResult.error || !createResult.data) {
77
+ return null;
78
+ }
79
+ sessionId = createResult.data.id;
80
+ }
81
+ else {
82
+ // In-place loop
83
+ const createResult = await api.client.session.create({
84
+ title: `Loop: ${title}`,
85
+ directory,
86
+ });
87
+ if (createResult.error || !createResult.data) {
88
+ return null;
89
+ }
90
+ sessionId = createResult.data.id;
91
+ sessionDirectory = directory;
92
+ }
93
+ // Store plan and loop state in KV if database exists
94
+ const dbExists = existsSync(dbPath);
95
+ if (dbExists) {
96
+ let db = null;
97
+ try {
98
+ db = new Database(dbPath);
99
+ const queries = createKvQuery(db);
100
+ const now = Date.now();
101
+ const TTL_MS = 7 * 24 * 60 * 60 * 1000; // 7 days
102
+ // Store plan with unique worktree name key
103
+ queries.set(projectId, `plan:${uniqueWorktreeName}`, JSON.stringify(planText), now + TTL_MS);
104
+ // Store loop state in KV
105
+ const loopState = {
106
+ active: true,
107
+ sessionId,
108
+ worktreeName: uniqueWorktreeName,
109
+ worktreeDir: sessionDirectory,
110
+ worktreeBranch,
111
+ iteration: 1,
112
+ maxIterations: 0,
113
+ completionSignal: DEFAULT_COMPLETION_SIGNAL,
114
+ startedAt: new Date().toISOString(),
115
+ prompt: planText,
116
+ phase: 'coding',
117
+ audit: true,
118
+ errorCount: 0,
119
+ auditCount: 0,
120
+ worktree: isWorktree,
121
+ };
122
+ queries.set(projectId, `loop:${uniqueWorktreeName}`, JSON.stringify(loopState), now + TTL_MS);
123
+ // Store session mapping
124
+ queries.set(projectId, `loop-session:${sessionId}`, JSON.stringify(uniqueWorktreeName), now + TTL_MS);
125
+ }
126
+ catch {
127
+ // Continue even if DB operations fail
128
+ }
129
+ finally {
130
+ try {
131
+ db?.close();
132
+ }
133
+ catch { }
134
+ }
135
+ }
136
+ // Build prompt with completion signal
137
+ let promptText = planText;
138
+ if (DEFAULT_COMPLETION_SIGNAL) {
139
+ promptText += buildCompletionSignalInstructions(DEFAULT_COMPLETION_SIGNAL);
140
+ }
141
+ // Send prompt to code agent
142
+ try {
143
+ await api.client.session.promptAsync({
144
+ sessionID: sessionId,
145
+ directory: sessionDirectory,
146
+ parts: [{ type: 'text', text: promptText }],
147
+ agent: 'code',
148
+ });
149
+ }
150
+ catch {
151
+ return null;
152
+ }
153
+ return {
154
+ sessionId,
155
+ loopName: displayName,
156
+ worktreeName: uniqueWorktreeName,
157
+ isWorktree,
158
+ worktreeDir: sessionDirectory,
159
+ worktreeBranch,
160
+ };
161
+ }
162
+ //# sourceMappingURL=loop-launch.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"loop-launch.js","sourceRoot":"","sources":["../../src/utils/loop-launch.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,27 @@
1
+ export declare function parseModelString(modelStr?: string): {
2
+ providerID: string;
3
+ modelID: string;
4
+ } | undefined;
5
+ export declare function retryWithModelFallback<T>(callWithModel: () => Promise<{
6
+ data?: T;
7
+ error?: unknown;
8
+ }>, callWithoutModel: () => Promise<{
9
+ data?: T;
10
+ error?: unknown;
11
+ }>, model: {
12
+ providerID: string;
13
+ modelID: string;
14
+ } | undefined, logger: {
15
+ error: (msg: string, err?: unknown) => void;
16
+ log: (msg: string) => void;
17
+ }, maxRetries?: number): Promise<{
18
+ result: {
19
+ data?: T;
20
+ error?: unknown;
21
+ };
22
+ usedModel: {
23
+ providerID: string;
24
+ modelID: string;
25
+ } | undefined;
26
+ }>;
27
+ //# sourceMappingURL=model-fallback.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"model-fallback.d.ts","sourceRoot":"","sources":["../../src/utils/model-fallback.ts"],"names":[],"mappings":"AAAA,wBAAgB,gBAAgB,CAAC,QAAQ,CAAC,EAAE,MAAM,GAAG;IAAE,UAAU,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,MAAM,CAAA;CAAE,GAAG,SAAS,CAQvG;AAED,wBAAsB,sBAAsB,CAAC,CAAC,EAC5C,aAAa,EAAE,MAAM,OAAO,CAAC;IAAE,IAAI,CAAC,EAAE,CAAC,CAAC;IAAC,KAAK,CAAC,EAAE,OAAO,CAAA;CAAE,CAAC,EAC3D,gBAAgB,EAAE,MAAM,OAAO,CAAC;IAAE,IAAI,CAAC,EAAE,CAAC,CAAC;IAAC,KAAK,CAAC,EAAE,OAAO,CAAA;CAAE,CAAC,EAC9D,KAAK,EAAE;IAAE,UAAU,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,MAAM,CAAA;CAAE,GAAG,SAAS,EAC1D,MAAM,EAAE;IAAE,KAAK,EAAE,CAAC,GAAG,EAAE,MAAM,EAAE,GAAG,CAAC,EAAE,OAAO,KAAK,IAAI,CAAC;IAAC,GAAG,EAAE,CAAC,GAAG,EAAE,MAAM,KAAK,IAAI,CAAA;CAAE,EACnF,UAAU,GAAE,MAAU,GACrB,OAAO,CAAC;IAAE,MAAM,EAAE;QAAE,IAAI,CAAC,EAAE,CAAC,CAAC;QAAC,KAAK,CAAC,EAAE,OAAO,CAAA;KAAE,CAAC;IAAC,SAAS,EAAE;QAAE,UAAU,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,MAAM,CAAA;KAAE,GAAG,SAAS,CAAA;CAAE,CAAC,CAqBpH"}
@@ -0,0 +1,33 @@
1
+ export function parseModelString(modelStr) {
2
+ if (!modelStr)
3
+ return undefined;
4
+ const slashIndex = modelStr.indexOf('/');
5
+ if (slashIndex <= 0 || slashIndex === modelStr.length - 1)
6
+ return undefined;
7
+ return {
8
+ providerID: modelStr.substring(0, slashIndex),
9
+ modelID: modelStr.substring(slashIndex + 1),
10
+ };
11
+ }
12
+ export async function retryWithModelFallback(callWithModel, callWithoutModel, model, logger, maxRetries = 2) {
13
+ if (!model) {
14
+ return { result: await callWithoutModel(), usedModel: undefined };
15
+ }
16
+ let lastError;
17
+ for (let attempt = 1; attempt <= maxRetries; attempt++) {
18
+ const result = await callWithModel();
19
+ if (!result.error) {
20
+ return { result, usedModel: model };
21
+ }
22
+ lastError = result.error;
23
+ if (attempt < maxRetries) {
24
+ logger.log(`model attempt ${attempt}/${maxRetries} failed, retrying`);
25
+ }
26
+ else {
27
+ logger.log(`model attempt ${attempt}/${maxRetries} failed`);
28
+ }
29
+ }
30
+ logger.error(`configured model unavailable after ${maxRetries} attempts, falling back to default`, lastError);
31
+ return { result: await callWithoutModel(), usedModel: undefined };
32
+ }
33
+ //# sourceMappingURL=model-fallback.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"model-fallback.js","sourceRoot":"","sources":["../../src/utils/model-fallback.ts"],"names":[],"mappings":"AAAA,MAAM,UAAU,gBAAgB,CAAC,QAAiB;IAChD,IAAI,CAAC,QAAQ;QAAE,OAAO,SAAS,CAAA;IAC/B,MAAM,UAAU,GAAG,QAAQ,CAAC,OAAO,CAAC,GAAG,CAAC,CAAA;IACxC,IAAI,UAAU,IAAI,CAAC,IAAI,UAAU,KAAK,QAAQ,CAAC,MAAM,GAAG,CAAC;QAAE,OAAO,SAAS,CAAA;IAC3E,OAAO;QACL,UAAU,EAAE,QAAQ,CAAC,SAAS,CAAC,CAAC,EAAE,UAAU,CAAC;QAC7C,OAAO,EAAE,QAAQ,CAAC,SAAS,CAAC,UAAU,GAAG,CAAC,CAAC;KAC5C,CAAA;AACH,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,sBAAsB,CAC1C,aAA2D,EAC3D,gBAA8D,EAC9D,KAA0D,EAC1D,MAAmF,EACnF,aAAqB,CAAC;IAEtB,IAAI,CAAC,KAAK,EAAE,CAAC;QACX,OAAO,EAAE,MAAM,EAAE,MAAM,gBAAgB,EAAE,EAAE,SAAS,EAAE,SAAS,EAAE,CAAA;IACnE,CAAC;IAED,IAAI,SAAkB,CAAA;IACtB,KAAK,IAAI,OAAO,GAAG,CAAC,EAAE,OAAO,IAAI,UAAU,EAAE,OAAO,EAAE,EAAE,CAAC;QACvD,MAAM,MAAM,GAAG,MAAM,aAAa,EAAE,CAAA;QACpC,IAAI,CAAC,MAAM,CAAC,KAAK,EAAE,CAAC;YAClB,OAAO,EAAE,MAAM,EAAE,SAAS,EAAE,KAAK,EAAE,CAAA;QACrC,CAAC;QACD,SAAS,GAAG,MAAM,CAAC,KAAK,CAAA;QACxB,IAAI,OAAO,GAAG,UAAU,EAAE,CAAC;YACzB,MAAM,CAAC,GAAG,CAAC,iBAAiB,OAAO,IAAI,UAAU,mBAAmB,CAAC,CAAA;QACvE,CAAC;aAAM,CAAC;YACN,MAAM,CAAC,GAAG,CAAC,iBAAiB,OAAO,IAAI,UAAU,SAAS,CAAC,CAAA;QAC7D,CAAC;IACH,CAAC;IAED,MAAM,CAAC,KAAK,CAAC,sCAAsC,UAAU,oCAAoC,EAAE,SAAS,CAAC,CAAA;IAC7G,OAAO,EAAE,MAAM,EAAE,MAAM,gBAAgB,EAAE,EAAE,SAAS,EAAE,SAAS,EAAE,CAAA;AACnE,CAAC"}
@@ -0,0 +1,7 @@
1
+ export interface PartialMatchResult<T> {
2
+ match: T | null;
3
+ candidates: T[];
4
+ }
5
+ export declare function findPartialMatch<T>(input: string, items: T[], getFields: (item: T) => (string | undefined)[]): PartialMatchResult<T>;
6
+ export declare function filterByPartial<T>(input: string | undefined, items: T[], getFields: (item: T) => (string | undefined)[]): T[];
7
+ //# sourceMappingURL=partial-match.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"partial-match.d.ts","sourceRoot":"","sources":["../../src/utils/partial-match.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,kBAAkB,CAAC,CAAC;IACnC,KAAK,EAAE,CAAC,GAAG,IAAI,CAAA;IACf,UAAU,EAAE,CAAC,EAAE,CAAA;CAChB;AAED,wBAAgB,gBAAgB,CAAC,CAAC,EAChC,KAAK,EAAE,MAAM,EACb,KAAK,EAAE,CAAC,EAAE,EACV,SAAS,EAAE,CAAC,IAAI,EAAE,CAAC,KAAK,CAAC,MAAM,GAAG,SAAS,CAAC,EAAE,GAC7C,kBAAkB,CAAC,CAAC,CAAC,CA6CvB;AAED,wBAAgB,eAAe,CAAC,CAAC,EAC/B,KAAK,EAAE,MAAM,GAAG,SAAS,EACzB,KAAK,EAAE,CAAC,EAAE,EACV,SAAS,EAAE,CAAC,IAAI,EAAE,CAAC,KAAK,CAAC,MAAM,GAAG,SAAS,CAAC,EAAE,GAC7C,CAAC,EAAE,CAiBL"}
@@ -0,0 +1,56 @@
1
+ export function findPartialMatch(input, items, getFields) {
2
+ const inputLower = input.toLowerCase();
3
+ let exactMatch = null;
4
+ const substringMatches = [];
5
+ for (const item of items) {
6
+ const fields = getFields(item);
7
+ let hasExact = false;
8
+ let hasSubstring = false;
9
+ for (const field of fields) {
10
+ if (field === undefined)
11
+ continue;
12
+ const fieldLower = field.toLowerCase();
13
+ if (fieldLower === inputLower) {
14
+ hasExact = true;
15
+ }
16
+ if (fieldLower.includes(inputLower)) {
17
+ hasSubstring = true;
18
+ }
19
+ }
20
+ if (hasExact) {
21
+ exactMatch = item;
22
+ break;
23
+ }
24
+ if (hasSubstring) {
25
+ substringMatches.push(item);
26
+ }
27
+ }
28
+ if (exactMatch) {
29
+ return { match: exactMatch, candidates: [] };
30
+ }
31
+ if (substringMatches.length === 1) {
32
+ return { match: substringMatches[0], candidates: [] };
33
+ }
34
+ if (substringMatches.length > 1) {
35
+ return { match: null, candidates: substringMatches };
36
+ }
37
+ return { match: null, candidates: [] };
38
+ }
39
+ export function filterByPartial(input, items, getFields) {
40
+ if (!input || input.length === 0) {
41
+ return items;
42
+ }
43
+ const inputLower = input.toLowerCase();
44
+ return items.filter((item) => {
45
+ const fields = getFields(item);
46
+ for (const field of fields) {
47
+ if (field === undefined)
48
+ continue;
49
+ if (field.toLowerCase().includes(inputLower)) {
50
+ return true;
51
+ }
52
+ }
53
+ return false;
54
+ });
55
+ }
56
+ //# sourceMappingURL=partial-match.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"partial-match.js","sourceRoot":"","sources":["../../src/utils/partial-match.ts"],"names":[],"mappings":"AAKA,MAAM,UAAU,gBAAgB,CAC9B,KAAa,EACb,KAAU,EACV,SAA8C;IAE9C,MAAM,UAAU,GAAG,KAAK,CAAC,WAAW,EAAE,CAAA;IAEtC,IAAI,UAAU,GAAa,IAAI,CAAA;IAC/B,MAAM,gBAAgB,GAAQ,EAAE,CAAA;IAEhC,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;QACzB,MAAM,MAAM,GAAG,SAAS,CAAC,IAAI,CAAC,CAAA;QAC9B,IAAI,QAAQ,GAAG,KAAK,CAAA;QACpB,IAAI,YAAY,GAAG,KAAK,CAAA;QAExB,KAAK,MAAM,KAAK,IAAI,MAAM,EAAE,CAAC;YAC3B,IAAI,KAAK,KAAK,SAAS;gBAAE,SAAQ;YACjC,MAAM,UAAU,GAAG,KAAK,CAAC,WAAW,EAAE,CAAA;YAEtC,IAAI,UAAU,KAAK,UAAU,EAAE,CAAC;gBAC9B,QAAQ,GAAG,IAAI,CAAA;YACjB,CAAC;YACD,IAAI,UAAU,CAAC,QAAQ,CAAC,UAAU,CAAC,EAAE,CAAC;gBACpC,YAAY,GAAG,IAAI,CAAA;YACrB,CAAC;QACH,CAAC;QAED,IAAI,QAAQ,EAAE,CAAC;YACb,UAAU,GAAG,IAAI,CAAA;YACjB,MAAK;QACP,CAAC;QACD,IAAI,YAAY,EAAE,CAAC;YACjB,gBAAgB,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;QAC7B,CAAC;IACH,CAAC;IAED,IAAI,UAAU,EAAE,CAAC;QACf,OAAO,EAAE,KAAK,EAAE,UAAU,EAAE,UAAU,EAAE,EAAE,EAAE,CAAA;IAC9C,CAAC;IAED,IAAI,gBAAgB,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QAClC,OAAO,EAAE,KAAK,EAAE,gBAAgB,CAAC,CAAC,CAAC,EAAE,UAAU,EAAE,EAAE,EAAE,CAAA;IACvD,CAAC;IAED,IAAI,gBAAgB,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QAChC,OAAO,EAAE,KAAK,EAAE,IAAI,EAAE,UAAU,EAAE,gBAAgB,EAAE,CAAA;IACtD,CAAC;IAED,OAAO,EAAE,KAAK,EAAE,IAAI,EAAE,UAAU,EAAE,EAAE,EAAE,CAAA;AACxC,CAAC;AAED,MAAM,UAAU,eAAe,CAC7B,KAAyB,EACzB,KAAU,EACV,SAA8C;IAE9C,IAAI,CAAC,KAAK,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACjC,OAAO,KAAK,CAAA;IACd,CAAC;IAED,MAAM,UAAU,GAAG,KAAK,CAAC,WAAW,EAAE,CAAA;IAEtC,OAAO,KAAK,CAAC,MAAM,CAAC,CAAC,IAAI,EAAE,EAAE;QAC3B,MAAM,MAAM,GAAG,SAAS,CAAC,IAAI,CAAC,CAAA;QAC9B,KAAK,MAAM,KAAK,IAAI,MAAM,EAAE,CAAC;YAC3B,IAAI,KAAK,KAAK,SAAS;gBAAE,SAAQ;YACjC,IAAI,KAAK,CAAC,WAAW,EAAE,CAAC,QAAQ,CAAC,UAAU,CAAC,EAAE,CAAC;gBAC7C,OAAO,IAAI,CAAA;YACb,CAAC;QACH,CAAC;QACD,OAAO,KAAK,CAAA;IACd,CAAC,CAAC,CAAA;AACJ,CAAC"}
@@ -0,0 +1,65 @@
1
+ /**
2
+ * Shared plan execution utilities for TUI and tool-side approval.
3
+ *
4
+ * This module provides canonical execution labels and title extraction
5
+ * that both the TUI and plan-approval tool can import.
6
+ */
7
+ /**
8
+ * Canonical execution mode labels used by both TUI and architect approval.
9
+ * These labels must match exactly to ensure consistent UX across interfaces.
10
+ */
11
+ export declare const PLAN_EXECUTION_LABELS: readonly ["New session", "Execute here", "Loop (worktree)", "Loop"];
12
+ export type PlanExecutionLabel = typeof PLAN_EXECUTION_LABELS[number];
13
+ /**
14
+ * Extracts a title from plan content for display purposes.
15
+ * Uses the first heading if available, otherwise falls back to first line.
16
+ * Truncates to 60 characters with ellipsis if needed.
17
+ */
18
+ export declare function extractPlanTitle(planContent: string): string;
19
+ /**
20
+ * Result of loop name extraction with both display and sanitized names.
21
+ */
22
+ export interface LoopNameResult {
23
+ /** Display name: exactly what should be shown to users */
24
+ displayName: string;
25
+ /** Execution/worktree name: sanitized slug for worktree creation, KV keys, and uniqueness */
26
+ executionName: string;
27
+ }
28
+ /**
29
+ * Extracts a short loop name from plan content for worktree/session naming.
30
+ *
31
+ * Accepts the following markdown formats:
32
+ * - `Loop Name: foo`
33
+ * - `**Loop Name**: foo`
34
+ * - `- **Loop Name**: foo` (with list prefix)
35
+ * - Optional leading whitespace
36
+ *
37
+ * Priority order:
38
+ * 1. Explicit "Loop Name:" field if present (machine-friendly, intent-based)
39
+ * 2. First heading/title (fallback for older plans)
40
+ * 3. Default "loop" fallback
41
+ *
42
+ * The result is truncated to 60 characters.
43
+ */
44
+ export declare function extractLoopName(planContent: string): string;
45
+ /**
46
+ * Extracts both display and execution names from plan content.
47
+ *
48
+ * Returns a LoopNameResult with:
49
+ * - displayName: the exact loop name from the plan (for user-facing display)
50
+ * - executionName: sanitized version safe for worktree names and KV keys
51
+ *
52
+ * This is the preferred way to get loop naming information.
53
+ */
54
+ export declare function extractLoopNames(planContent: string): LoopNameResult;
55
+ /**
56
+ * Sanitizes a string for use as a worktree/loop name.
57
+ * Converts to lowercase, replaces non-alphanumeric chars with hyphens, removes leading/trailing hyphens.
58
+ */
59
+ export declare function sanitizeLoopName(name: string): string;
60
+ /**
61
+ * Checks if a given label matches one of the canonical execution labels.
62
+ * Returns the matched canonical label or null if no match.
63
+ */
64
+ export declare function matchExecutionLabel(input: string): PlanExecutionLabel | null;
65
+ //# sourceMappingURL=plan-execution.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"plan-execution.d.ts","sourceRoot":"","sources":["../../src/utils/plan-execution.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH;;;GAGG;AACH,eAAO,MAAM,qBAAqB,qEAKxB,CAAA;AAEV,MAAM,MAAM,kBAAkB,GAAG,OAAO,qBAAqB,CAAC,MAAM,CAAC,CAAA;AAErE;;;;GAIG;AACH,wBAAgB,gBAAgB,CAAC,WAAW,EAAE,MAAM,GAAG,MAAM,CAW5D;AAED;;GAEG;AACH,MAAM,WAAW,cAAc;IAC7B,0DAA0D;IAC1D,WAAW,EAAE,MAAM,CAAA;IACnB,6FAA6F;IAC7F,aAAa,EAAE,MAAM,CAAA;CACtB;AAED;;;;;;;;;;;;;;;GAeG;AACH,wBAAgB,eAAe,CAAC,WAAW,EAAE,MAAM,GAAG,MAAM,CAa3D;AAED;;;;;;;;GAQG;AACH,wBAAgB,gBAAgB,CAAC,WAAW,EAAE,MAAM,GAAG,cAAc,CAIpE;AAED;;;GAGG;AACH,wBAAgB,gBAAgB,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAMrD;AASD;;;GAGG;AACH,wBAAgB,mBAAmB,CAAC,KAAK,EAAE,MAAM,GAAG,kBAAkB,GAAG,IAAI,CAQ5E"}
@@ -0,0 +1,107 @@
1
+ /**
2
+ * Shared plan execution utilities for TUI and tool-side approval.
3
+ *
4
+ * This module provides canonical execution labels and title extraction
5
+ * that both the TUI and plan-approval tool can import.
6
+ */
7
+ /**
8
+ * Canonical execution mode labels used by both TUI and architect approval.
9
+ * These labels must match exactly to ensure consistent UX across interfaces.
10
+ */
11
+ export const PLAN_EXECUTION_LABELS = [
12
+ 'New session',
13
+ 'Execute here',
14
+ 'Loop (worktree)',
15
+ 'Loop',
16
+ ];
17
+ /**
18
+ * Extracts a title from plan content for display purposes.
19
+ * Uses the first heading if available, otherwise falls back to first line.
20
+ * Truncates to 60 characters with ellipsis if needed.
21
+ */
22
+ export function extractPlanTitle(planContent) {
23
+ const headingMatch = planContent.match(/^#+\s+(.+)$/m);
24
+ if (headingMatch?.[1]) {
25
+ const title = headingMatch[1].trim();
26
+ return title.length > 60 ? `${title.substring(0, 57)}...` : title;
27
+ }
28
+ const firstLine = planContent.split('\n')[0]?.trim();
29
+ if (firstLine) {
30
+ return firstLine.length > 60 ? `${firstLine.substring(0, 57)}...` : firstLine;
31
+ }
32
+ return 'Implementation Plan';
33
+ }
34
+ /**
35
+ * Extracts a short loop name from plan content for worktree/session naming.
36
+ *
37
+ * Accepts the following markdown formats:
38
+ * - `Loop Name: foo`
39
+ * - `**Loop Name**: foo`
40
+ * - `- **Loop Name**: foo` (with list prefix)
41
+ * - Optional leading whitespace
42
+ *
43
+ * Priority order:
44
+ * 1. Explicit "Loop Name:" field if present (machine-friendly, intent-based)
45
+ * 2. First heading/title (fallback for older plans)
46
+ * 3. Default "loop" fallback
47
+ *
48
+ * The result is truncated to 60 characters.
49
+ */
50
+ export function extractLoopName(planContent) {
51
+ // Try to find explicit loop name field first
52
+ // Accepts: "Loop Name: foo", "**Loop Name**: foo", "- **Loop Name**: foo"
53
+ // with optional leading whitespace and markdown list prefixes
54
+ const loopNameMatch = planContent.match(/^(?:\s*(?:-\s*)?)?(?:\*\*)?Loop Name(?:\*\*)?:\s*(.+)$/m);
55
+ if (loopNameMatch?.[1]) {
56
+ const name = loopNameMatch[1].trim();
57
+ return name.length > 60 ? name.substring(0, 60) : name;
58
+ }
59
+ // Fallback to title extraction for older plans
60
+ const title = extractPlanTitle(planContent);
61
+ return title;
62
+ }
63
+ /**
64
+ * Extracts both display and execution names from plan content.
65
+ *
66
+ * Returns a LoopNameResult with:
67
+ * - displayName: the exact loop name from the plan (for user-facing display)
68
+ * - executionName: sanitized version safe for worktree names and KV keys
69
+ *
70
+ * This is the preferred way to get loop naming information.
71
+ */
72
+ export function extractLoopNames(planContent) {
73
+ const displayName = extractLoopName(planContent);
74
+ const executionName = sanitizeLoopName(displayName);
75
+ return { displayName, executionName };
76
+ }
77
+ /**
78
+ * Sanitizes a string for use as a worktree/loop name.
79
+ * Converts to lowercase, replaces non-alphanumeric chars with hyphens, removes leading/trailing hyphens.
80
+ */
81
+ export function sanitizeLoopName(name) {
82
+ return name
83
+ .toLowerCase()
84
+ .replace(/[^a-z0-9]+/g, '-')
85
+ .replace(/^-+|-+$/g, '')
86
+ .substring(0, 60) || 'loop';
87
+ }
88
+ /**
89
+ * Normalizes a mode string to lowercase for comparison.
90
+ */
91
+ function normalizeModeLabel(label) {
92
+ return label.toLowerCase();
93
+ }
94
+ /**
95
+ * Checks if a given label matches one of the canonical execution labels.
96
+ * Returns the matched canonical label or null if no match.
97
+ */
98
+ export function matchExecutionLabel(input) {
99
+ const normalized = normalizeModeLabel(input);
100
+ for (const label of PLAN_EXECUTION_LABELS) {
101
+ if (normalized === label.toLowerCase() || normalized.startsWith(label.toLowerCase())) {
102
+ return label;
103
+ }
104
+ }
105
+ return null;
106
+ }
107
+ //# sourceMappingURL=plan-execution.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"plan-execution.js","sourceRoot":"","sources":["../../src/utils/plan-execution.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,36 @@
1
+ import type { TuiPluginApi } from '@opencode-ai/plugin/tui';
2
+ export interface SessionStats {
3
+ tokens: {
4
+ input: number;
5
+ output: number;
6
+ reasoning: number;
7
+ cacheRead: number;
8
+ cacheWrite: number;
9
+ total: number;
10
+ };
11
+ cost: number;
12
+ messages: {
13
+ total: number;
14
+ assistant: number;
15
+ };
16
+ fileChanges: {
17
+ additions: number;
18
+ deletions: number;
19
+ files: number;
20
+ } | null;
21
+ timing: {
22
+ created: string;
23
+ updated: string;
24
+ durationMs: number;
25
+ } | null;
26
+ lastActivity: {
27
+ summary: string;
28
+ toolCalls: Array<{
29
+ tool: string;
30
+ title: string;
31
+ status: string;
32
+ }>;
33
+ } | null;
34
+ }
35
+ export declare function fetchSessionStats(api: TuiPluginApi, sessionId: string, directory: string): Promise<SessionStats | null>;
36
+ //# sourceMappingURL=session-stats.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"session-stats.d.ts","sourceRoot":"","sources":["../../src/utils/session-stats.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,yBAAyB,CAAA;AAE3D,MAAM,WAAW,YAAY;IAC3B,MAAM,EAAE;QACN,KAAK,EAAE,MAAM,CAAA;QACb,MAAM,EAAE,MAAM,CAAA;QACd,SAAS,EAAE,MAAM,CAAA;QACjB,SAAS,EAAE,MAAM,CAAA;QACjB,UAAU,EAAE,MAAM,CAAA;QAClB,KAAK,EAAE,MAAM,CAAA;KACd,CAAA;IACD,IAAI,EAAE,MAAM,CAAA;IACZ,QAAQ,EAAE;QACR,KAAK,EAAE,MAAM,CAAA;QACb,SAAS,EAAE,MAAM,CAAA;KAClB,CAAA;IACD,WAAW,EAAE;QACX,SAAS,EAAE,MAAM,CAAA;QACjB,SAAS,EAAE,MAAM,CAAA;QACjB,KAAK,EAAE,MAAM,CAAA;KACd,GAAG,IAAI,CAAA;IACR,MAAM,EAAE;QACN,OAAO,EAAE,MAAM,CAAA;QACf,OAAO,EAAE,MAAM,CAAA;QACf,UAAU,EAAE,MAAM,CAAA;KACnB,GAAG,IAAI,CAAA;IACR,YAAY,EAAE;QACZ,OAAO,EAAE,MAAM,CAAA;QACf,SAAS,EAAE,KAAK,CAAC;YAAE,IAAI,EAAE,MAAM,CAAC;YAAC,KAAK,EAAE,MAAM,CAAC;YAAC,MAAM,EAAE,MAAM,CAAA;SAAE,CAAC,CAAA;KAClE,GAAG,IAAI,CAAA;CACT;AA0ED,wBAAsB,iBAAiB,CACrC,GAAG,EAAE,YAAY,EACjB,SAAS,EAAE,MAAM,EACjB,SAAS,EAAE,MAAM,GAChB,OAAO,CAAC,YAAY,GAAG,IAAI,CAAC,CA+G9B"}