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.

Potentially problematic release.


This version of opencode-forge might be problematic. Click here for more details.

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,96 @@
1
+ import type { KvService, KvEntry } from './kv';
2
+ import type { Logger, LoopConfig } from '../types';
3
+ import type { OpencodeClient } from '@opencode-ai/sdk/v2';
4
+ export declare function migrateRalphKeys(kvService: KvService, projectId: string, logger: Logger): void;
5
+ export declare const MAX_RETRIES = 3;
6
+ export declare const STALL_TIMEOUT_MS = 60000;
7
+ export declare const MAX_CONSECUTIVE_STALLS = 5;
8
+ export declare const DEFAULT_MIN_AUDITS = 1;
9
+ export declare const RECENT_MESSAGES_COUNT = 5;
10
+ export declare const DEFAULT_COMPLETION_SIGNAL = "ALL_PHASES_COMPLETE";
11
+ export declare function buildCompletionSignalInstructions(signal: string): string;
12
+ export { LOOP_PERMISSION_RULESET } from '../constants/loop';
13
+ export interface LoopState {
14
+ active: boolean;
15
+ sessionId: string;
16
+ worktreeName: string;
17
+ worktreeDir: string;
18
+ worktreeBranch?: string;
19
+ iteration: number;
20
+ maxIterations: number;
21
+ completionSignal: string | null;
22
+ startedAt: string;
23
+ prompt?: string;
24
+ phase: 'coding' | 'auditing';
25
+ audit?: boolean;
26
+ lastAuditResult?: string;
27
+ errorCount: number;
28
+ auditCount: number;
29
+ terminationReason?: string;
30
+ completedAt?: string;
31
+ worktree?: boolean;
32
+ modelFailed?: boolean;
33
+ sandbox?: boolean;
34
+ sandboxContainerName?: string;
35
+ }
36
+ export interface LoopService {
37
+ getActiveState(name: string): LoopState | null;
38
+ getAnyState(name: string): LoopState | null;
39
+ setState(name: string, state: LoopState): void;
40
+ deleteState(name: string): void;
41
+ registerSession(sessionId: string, worktreeName: string): void;
42
+ resolveWorktreeName(sessionId: string): string | null;
43
+ unregisterSession(sessionId: string): void;
44
+ checkCompletionSignal(text: string, promise: string): boolean;
45
+ buildContinuationPrompt(state: LoopState, auditFindings?: string): string;
46
+ buildAuditPrompt(state: LoopState): string;
47
+ listActive(): LoopState[];
48
+ listRecent(): LoopState[];
49
+ findByWorktreeName(name: string): LoopState | null;
50
+ findCandidatesByPartialName(name: string): LoopState[];
51
+ getStallTimeoutMs(): number;
52
+ getMinAudits(): number;
53
+ terminateAll(): void;
54
+ reconcileStale(): number;
55
+ hasOutstandingFindings(branch?: string): boolean;
56
+ getOutstandingFindings(branch?: string): KvEntry[];
57
+ generateUniqueWorktreeName(baseName: string): string;
58
+ }
59
+ export declare function createLoopService(kvService: KvService, projectId: string, logger: Logger, loopConfig?: LoopConfig): LoopService;
60
+ /**
61
+ * Generates a unique worktree name by checking against existing names and appending a numeric suffix if needed.
62
+ * This is exported for use by TUI and other modules that need to generate unique names without direct loop service access.
63
+ *
64
+ * @param baseName - The base name to uniquify
65
+ * @param existingNames - Array of existing worktree names to check against
66
+ * @returns A unique name (either the base name or with -1, -2, etc. suffix)
67
+ */
68
+ export declare function generateUniqueName(baseName: string, existingNames: readonly string[]): string;
69
+ export interface LoopSessionOutput {
70
+ messages: {
71
+ text: string;
72
+ cost: number;
73
+ tokens: {
74
+ input: number;
75
+ output: number;
76
+ reasoning: number;
77
+ cacheRead: number;
78
+ cacheWrite: number;
79
+ };
80
+ }[];
81
+ totalCost: number;
82
+ totalTokens: {
83
+ input: number;
84
+ output: number;
85
+ reasoning: number;
86
+ cacheRead: number;
87
+ cacheWrite: number;
88
+ };
89
+ fileChanges: {
90
+ additions: number;
91
+ deletions: number;
92
+ files: number;
93
+ } | null;
94
+ }
95
+ export declare function fetchSessionOutput(v2Client: OpencodeClient, sessionId: string, directory: string, logger?: Logger): Promise<LoopSessionOutput | null>;
96
+ //# sourceMappingURL=loop.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"loop.d.ts","sourceRoot":"","sources":["../../src/services/loop.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,315 @@
1
+ import { findPartialMatch } from '../utils/partial-match';
2
+ export function migrateRalphKeys(kvService, projectId, logger) {
3
+ const oldEntries = kvService.listByPrefix(projectId, 'ralph:');
4
+ if (oldEntries.length === 0)
5
+ return;
6
+ logger.log(`Migrating ${String(oldEntries.length)} ralph: KV entries to loop: prefix`);
7
+ for (const entry of oldEntries) {
8
+ const newKey = entry.key.replace(/^ralph:/, 'loop:');
9
+ const data = (typeof entry.data === 'string' ? JSON.parse(entry.data) : entry.data);
10
+ if ('inPlace' in data) {
11
+ data.worktree = !data.inPlace;
12
+ delete data.inPlace;
13
+ }
14
+ kvService.set(projectId, newKey, data);
15
+ kvService.delete(projectId, entry.key);
16
+ }
17
+ const oldSessions = kvService.listByPrefix(projectId, 'ralph-session:');
18
+ for (const entry of oldSessions) {
19
+ const newKey = entry.key.replace(/^ralph-session:/, 'loop-session:');
20
+ kvService.set(projectId, newKey, entry.data);
21
+ kvService.delete(projectId, entry.key);
22
+ }
23
+ if (oldSessions.length > 0) {
24
+ logger.log(`Migrated ${String(oldSessions.length)} ralph-session: KV entries to loop-session: prefix`);
25
+ }
26
+ }
27
+ export const MAX_RETRIES = 3;
28
+ export const STALL_TIMEOUT_MS = 60_000;
29
+ export const MAX_CONSECUTIVE_STALLS = 5;
30
+ export const DEFAULT_MIN_AUDITS = 1;
31
+ export const RECENT_MESSAGES_COUNT = 5;
32
+ export const DEFAULT_COMPLETION_SIGNAL = 'ALL_PHASES_COMPLETE';
33
+ export function buildCompletionSignalInstructions(signal) {
34
+ return `\n\n---\n\n**IMPORTANT - Completion Signal:** When you have completed ALL phases of this plan successfully, you MUST output the following phrase exactly: ${signal}\n\nBefore outputting the completion signal, you MUST:\n1. Verify each phase's acceptance criteria are met\n2. Run all verification commands listed in the plan and confirm they pass\n3. If tests were required, confirm they exist AND pass\n\nDo NOT output this phrase until every phase is truly complete and all verification steps pass. The loop will continue until this signal is detected.`;
35
+ }
36
+ export { LOOP_PERMISSION_RULESET } from '../constants/loop';
37
+ export function createLoopService(kvService, projectId, logger, loopConfig) {
38
+ const stateKey = (name) => `loop:${name}`;
39
+ function getAnyState(name) {
40
+ return kvService.get(projectId, stateKey(name));
41
+ }
42
+ function getActiveState(name) {
43
+ const state = kvService.get(projectId, stateKey(name));
44
+ if (!state?.active) {
45
+ return null;
46
+ }
47
+ return state;
48
+ }
49
+ function setState(name, state) {
50
+ kvService.set(projectId, stateKey(name), state);
51
+ }
52
+ function deleteState(name) {
53
+ kvService.delete(projectId, stateKey(name));
54
+ }
55
+ function registerSession(sessionId, worktreeName) {
56
+ kvService.set(projectId, `loop-session:${sessionId}`, worktreeName);
57
+ }
58
+ function resolveWorktreeName(sessionId) {
59
+ return kvService.get(projectId, `loop-session:${sessionId}`);
60
+ }
61
+ function unregisterSession(sessionId) {
62
+ kvService.delete(projectId, `loop-session:${sessionId}`);
63
+ }
64
+ function checkCompletionSignal(text, completionSignal) {
65
+ return text.toLowerCase().includes(completionSignal.toLowerCase());
66
+ }
67
+ function redactCompletionSignal(text, promise) {
68
+ const regex = new RegExp(promise.replace(/[.*+?^${}()|[\]\\]/g, '\\$&'), 'gi');
69
+ return text.replace(regex, '[SIGNAL_REDACTED]');
70
+ }
71
+ function buildContinuationPrompt(state, auditFindings) {
72
+ let systemLine = `Loop iteration ${String(state.iteration)}`;
73
+ if (state.completionSignal) {
74
+ systemLine += ` | To stop: output ${state.completionSignal} (ONLY after all verification commands pass AND all phase acceptance criteria are met)`;
75
+ }
76
+ else if (state.maxIterations > 0) {
77
+ systemLine += ` / ${String(state.maxIterations)}`;
78
+ }
79
+ else {
80
+ systemLine += ` | No completion promise set - loop runs until cancelled`;
81
+ }
82
+ let prompt = `[${systemLine}]\n\n${state.prompt ?? ''}`;
83
+ if (auditFindings) {
84
+ const cleanedFindings = state.completionSignal
85
+ ? redactCompletionSignal(auditFindings, state.completionSignal)
86
+ : auditFindings;
87
+ const completionInstruction = state.completionSignal
88
+ ? '\n\nAfter fixing all issues, output the completion signal.'
89
+ : '';
90
+ prompt += `\n\n---\nThe code auditor reviewed your changes. You MUST address all bugs and convention violations below — do not dismiss findings as unrelated to the task. Fix them directly without creating a plan or asking for approval.\n\n${cleanedFindings}${completionInstruction}`;
91
+ }
92
+ const outstandingFindings = getOutstandingFindings(state.worktreeBranch);
93
+ if (outstandingFindings.length > 0) {
94
+ const findingKeys = outstandingFindings.map((f) => `- \`${f.key}\``).join('\n');
95
+ prompt += `\n\n---\n⚠️ Outstanding Review Findings (${String(outstandingFindings.length)})\n\nThese review findings are blocking loop completion. Fix these issues so they pass the next audit review.\n\n${findingKeys}`;
96
+ }
97
+ return prompt;
98
+ }
99
+ function buildAuditPrompt(state) {
100
+ const branchInfo = state.worktreeBranch ? ` (branch: ${state.worktreeBranch})` : '';
101
+ return [
102
+ `Post-iteration ${String(state.iteration)} code review${branchInfo}.`,
103
+ '',
104
+ `The full implementation plan is stored in the plan store. Retrieve it by calling plan-read. Review the code changes against the plan phases and verify per-phase acceptance criteria are met.`,
105
+ '',
106
+ 'Review the code changes in this worktree. Focus on bugs, logic errors, missing error handling, and convention violations.',
107
+ 'If you find bugs in related code that affect the correctness of this task, report them — even if the buggy code was not directly modified.',
108
+ 'If everything looks good, state "No issues found." clearly.',
109
+ '',
110
+ 'Before reviewing, retrieve all existing review findings by calling the review-read tool. For each existing finding, verify whether the issue has been resolved in the current code. Delete resolved findings by calling the review-delete tool. Report any unresolved findings that still apply.',
111
+ '',
112
+ 'This is an automated loop — do not direct the agent to "create a plan" or "present for approval." Just report findings directly.',
113
+ ].join('\n');
114
+ }
115
+ function listActive() {
116
+ const entries = kvService.listByPrefix(projectId, 'loop:');
117
+ return entries
118
+ .map((entry) => entry.data)
119
+ .filter((data) => data !== null && typeof data === 'object' && 'active' in data && data.active);
120
+ }
121
+ function listRecent() {
122
+ const entries = kvService.listByPrefix(projectId, 'loop:');
123
+ return entries
124
+ .map((entry) => entry.data)
125
+ .filter((data) => data !== null && typeof data === 'object' && 'active' in data && !data.active);
126
+ }
127
+ function findByWorktreeName(name) {
128
+ const active = listActive();
129
+ const recent = listRecent();
130
+ const allStates = [...active, ...recent];
131
+ const { match } = findPartialMatch(name, allStates, (s) => [s.worktreeName, s.worktreeBranch]);
132
+ return match;
133
+ }
134
+ function findCandidatesByPartialName(name) {
135
+ const active = listActive();
136
+ const recent = listRecent();
137
+ const allStates = [...active, ...recent];
138
+ const { candidates } = findPartialMatch(name, allStates, (s) => [s.worktreeName, s.worktreeBranch]);
139
+ return candidates;
140
+ }
141
+ function getStallTimeoutMs() {
142
+ return loopConfig?.stallTimeoutMs ?? STALL_TIMEOUT_MS;
143
+ }
144
+ function getMinAudits() {
145
+ return loopConfig?.minAudits ?? DEFAULT_MIN_AUDITS;
146
+ }
147
+ function terminateAll() {
148
+ const active = listActive();
149
+ for (const state of active) {
150
+ const updated = {
151
+ ...state,
152
+ active: false,
153
+ completedAt: new Date().toISOString(),
154
+ terminationReason: 'shutdown',
155
+ };
156
+ setState(state.worktreeName, updated);
157
+ }
158
+ logger.log(`Loop: terminated ${String(active.length)} active loop(s)`);
159
+ }
160
+ function reconcileStale() {
161
+ const active = listActive();
162
+ for (const state of active) {
163
+ setState(state.worktreeName, {
164
+ ...state,
165
+ active: false,
166
+ completedAt: new Date().toISOString(),
167
+ terminationReason: 'shutdown',
168
+ });
169
+ logger.log(`Reconciled stale active loop: ${state.worktreeName} (was at iteration ${String(state.iteration)})`);
170
+ }
171
+ return active.length;
172
+ }
173
+ function getOutstandingFindings(branch) {
174
+ const findings = kvService.listByPrefix(projectId, 'review-finding:');
175
+ if (!branch)
176
+ return findings;
177
+ return findings.filter((f) => {
178
+ const data = f.data;
179
+ return data?.branch === branch;
180
+ });
181
+ }
182
+ function hasOutstandingFindings(branch) {
183
+ return getOutstandingFindings(branch).length > 0;
184
+ }
185
+ function generateUniqueWorktreeName(baseName) {
186
+ const existing = listRecent();
187
+ const active = listActive();
188
+ const allNames = [...existing, ...active].map((s) => s.worktreeName);
189
+ return generateUniqueName(baseName, allNames);
190
+ }
191
+ return {
192
+ getActiveState,
193
+ getAnyState,
194
+ setState,
195
+ deleteState,
196
+ registerSession,
197
+ resolveWorktreeName,
198
+ unregisterSession,
199
+ checkCompletionSignal,
200
+ buildContinuationPrompt,
201
+ buildAuditPrompt,
202
+ listActive,
203
+ listRecent,
204
+ findByWorktreeName,
205
+ findCandidatesByPartialName,
206
+ getStallTimeoutMs,
207
+ getMinAudits,
208
+ terminateAll,
209
+ reconcileStale,
210
+ hasOutstandingFindings,
211
+ getOutstandingFindings,
212
+ generateUniqueWorktreeName,
213
+ };
214
+ }
215
+ /**
216
+ * Generates a unique worktree name by checking against existing names and appending a numeric suffix if needed.
217
+ * This is exported for use by TUI and other modules that need to generate unique names without direct loop service access.
218
+ *
219
+ * @param baseName - The base name to uniquify
220
+ * @param existingNames - Array of existing worktree names to check against
221
+ * @returns A unique name (either the base name or with -1, -2, etc. suffix)
222
+ */
223
+ export function generateUniqueName(baseName, existingNames) {
224
+ const maxLength = 25;
225
+ const truncated = baseName.length > maxLength ? baseName.substring(0, maxLength) : baseName;
226
+ if (!existingNames.includes(truncated)) {
227
+ return truncated;
228
+ }
229
+ let counter = 1;
230
+ let candidate = `${truncated}-${counter}`;
231
+ while (existingNames.includes(candidate)) {
232
+ counter++;
233
+ candidate = `${truncated}-${counter}`;
234
+ }
235
+ return candidate;
236
+ }
237
+ export async function fetchSessionOutput(v2Client, sessionId, directory, logger) {
238
+ if (!directory || !sessionId) {
239
+ logger?.debug('fetchSessionOutput: invalid directory or sessionId');
240
+ return null;
241
+ }
242
+ try {
243
+ const messagesResult = await v2Client.session.messages({
244
+ sessionID: sessionId,
245
+ directory,
246
+ });
247
+ const messages = (messagesResult.data ?? []);
248
+ const assistantMessages = messages.filter((m) => m.info.role === 'assistant');
249
+ const lastThree = assistantMessages.slice(-RECENT_MESSAGES_COUNT);
250
+ const extractedMessages = lastThree.map((msg) => {
251
+ const text = msg.parts
252
+ .filter((p) => p.type === 'text' && p.text !== undefined)
253
+ .map((p) => p.text)
254
+ .join('\n');
255
+ const cost = msg.info.cost ?? 0;
256
+ const tokens = msg.info.tokens ?? { input: 0, output: 0, reasoning: 0, cache: { read: 0, write: 0 } };
257
+ return {
258
+ text,
259
+ cost,
260
+ tokens: {
261
+ input: tokens.input,
262
+ output: tokens.output,
263
+ reasoning: tokens.reasoning,
264
+ cacheRead: tokens.cache.read,
265
+ cacheWrite: tokens.cache.write,
266
+ },
267
+ };
268
+ });
269
+ let totalCost = 0;
270
+ let totalInputTokens = 0;
271
+ let totalOutputTokens = 0;
272
+ let totalReasoningTokens = 0;
273
+ let totalCacheRead = 0;
274
+ let totalCacheWrite = 0;
275
+ for (const msg of assistantMessages) {
276
+ totalCost += msg.info.cost ?? 0;
277
+ const tokens = msg.info.tokens;
278
+ if (tokens) {
279
+ totalInputTokens += tokens.input;
280
+ totalOutputTokens += tokens.output;
281
+ totalReasoningTokens += tokens.reasoning;
282
+ totalCacheRead += tokens.cache.read;
283
+ totalCacheWrite += tokens.cache.write;
284
+ }
285
+ }
286
+ const sessionResult = await v2Client.session.get({ sessionID: sessionId, directory });
287
+ const session = sessionResult.data;
288
+ const fileChanges = session?.summary
289
+ ? {
290
+ additions: session.summary.additions,
291
+ deletions: session.summary.deletions,
292
+ files: session.summary.files,
293
+ }
294
+ : null;
295
+ return {
296
+ messages: extractedMessages,
297
+ totalCost,
298
+ totalTokens: {
299
+ input: totalInputTokens,
300
+ output: totalOutputTokens,
301
+ reasoning: totalReasoningTokens,
302
+ cacheRead: totalCacheRead,
303
+ cacheWrite: totalCacheWrite,
304
+ },
305
+ fileChanges,
306
+ };
307
+ }
308
+ catch (err) {
309
+ if (logger) {
310
+ logger.error(`Loop: could not fetch session output for ${sessionId}`, err);
311
+ }
312
+ return null;
313
+ }
314
+ }
315
+ //# sourceMappingURL=loop.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"loop.js","sourceRoot":"","sources":["../../src/services/loop.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,4 @@
1
+ import type { PluginConfig } from './types';
2
+ export declare function resolveConfigPath(): string;
3
+ export declare function loadPluginConfig(): PluginConfig;
4
+ //# sourceMappingURL=setup.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"setup.d.ts","sourceRoot":"","sources":["../src/setup.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,SAAS,CAAA;AAa3C,wBAAgB,iBAAiB,IAAI,MAAM,CAE1C;AAoED,wBAAgB,gBAAgB,IAAI,YAAY,CAwB/C"}
package/dist/setup.js ADDED
@@ -0,0 +1,118 @@
1
+ import { readFileSync, existsSync, mkdirSync, copyFileSync } from 'fs';
2
+ import { dirname, join } from 'path';
3
+ import { fileURLToPath } from 'url';
4
+ import { homedir, platform } from 'os';
5
+ import { resolveLogPath } from './storage';
6
+ function resolveBundledConfigPath() {
7
+ const pluginDir = dirname(fileURLToPath(import.meta.url));
8
+ return join(pluginDir, '..', 'config.jsonc');
9
+ }
10
+ function resolveConfigDir() {
11
+ const defaultBase = join(homedir(), platform() === 'win32' ? 'AppData' : '.config');
12
+ const xdgConfigHome = process.env['XDG_CONFIG_HOME'] || defaultBase;
13
+ return join(xdgConfigHome, 'opencode');
14
+ }
15
+ export function resolveConfigPath() {
16
+ return join(resolveConfigDir(), 'forge-config.jsonc');
17
+ }
18
+ function resolveLegacyConfigPaths() {
19
+ return [
20
+ join(resolveConfigDir(), 'memory-config.jsonc'),
21
+ join(resolveConfigDir(), 'graph-config.jsonc'),
22
+ ];
23
+ }
24
+ function ensureGlobalConfig() {
25
+ const configDir = resolveConfigDir();
26
+ const newConfigPath = resolveConfigPath();
27
+ if (existsSync(newConfigPath)) {
28
+ return;
29
+ }
30
+ if (!existsSync(configDir)) {
31
+ mkdirSync(configDir, { recursive: true });
32
+ }
33
+ for (const legacyConfigPath of resolveLegacyConfigPaths()) {
34
+ if (existsSync(legacyConfigPath)) {
35
+ copyFileSync(legacyConfigPath, newConfigPath);
36
+ return;
37
+ }
38
+ }
39
+ const bundledConfigPath = resolveBundledConfigPath();
40
+ if (existsSync(bundledConfigPath)) {
41
+ copyFileSync(bundledConfigPath, newConfigPath);
42
+ }
43
+ }
44
+ function getDefaultConfig() {
45
+ return {
46
+ logging: {
47
+ enabled: false,
48
+ file: resolveLogPath(),
49
+ },
50
+ };
51
+ }
52
+ function isValidPluginConfig(config) {
53
+ if (!config || typeof config !== 'object')
54
+ return false;
55
+ return true;
56
+ }
57
+ function stripComments(content) {
58
+ let result = content;
59
+ result = result.replace(/\/\*[\s\S]*?\*\//g, '');
60
+ result = result.replace(/(^|[^:])(\/\/.*$)/gm, '$1');
61
+ return result;
62
+ }
63
+ function stripTrailingCommas(content) {
64
+ let result = content;
65
+ result = result.replace(/,(\s*}[ \t\n\r]*)/g, '$1');
66
+ result = result.replace(/,(\s*][ \t\n\r]*)/g, '$1');
67
+ return result;
68
+ }
69
+ function parseJsonc(content) {
70
+ const cleaned = stripComments(content);
71
+ const normalized = stripTrailingCommas(cleaned);
72
+ return JSON.parse(normalized);
73
+ }
74
+ export function loadPluginConfig() {
75
+ ensureGlobalConfig();
76
+ const configPath = resolveConfigPath();
77
+ if (!existsSync(configPath)) {
78
+ return getDefaultConfig();
79
+ }
80
+ try {
81
+ const content = readFileSync(configPath, 'utf-8');
82
+ const parsed = parseJsonc(content);
83
+ if (!isValidPluginConfig(parsed)) {
84
+ console.warn(`[forge] Invalid config at ${configPath}, using defaults`);
85
+ return getDefaultConfig();
86
+ }
87
+ return normalizeConfig(parsed);
88
+ }
89
+ catch (err) {
90
+ const message = err instanceof Error ? err.message : String(err);
91
+ console.warn(`[forge] Failed to load config at ${configPath}: ${message}, using defaults`);
92
+ return getDefaultConfig();
93
+ }
94
+ }
95
+ function normalizeConfig(config) {
96
+ const normalized = {
97
+ dataDir: config.dataDir,
98
+ defaultKvTtlMs: config.defaultKvTtlMs,
99
+ logging: config.logging,
100
+ compaction: config.compaction,
101
+ messagesTransform: config.messagesTransform,
102
+ executionModel: config.executionModel,
103
+ auditorModel: config.auditorModel,
104
+ loop: config.loop ?? config.ralph,
105
+ tui: config.tui,
106
+ agents: config.agents,
107
+ sandbox: config.sandbox,
108
+ graph: config.graph,
109
+ };
110
+ if (config.ralph && !config.loop) {
111
+ console.warn('[forge] Config key "ralph" is deprecated, use "loop" instead');
112
+ }
113
+ if (normalized.sandbox) {
114
+ normalized.sandbox.mode = normalized.sandbox.mode || 'off';
115
+ }
116
+ return normalized;
117
+ }
118
+ //# sourceMappingURL=setup.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"setup.js","sourceRoot":"","sources":["../src/setup.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,6 @@
1
+ import { Database } from 'bun:sqlite';
2
+ export declare function resolveDataDir(): string;
3
+ export declare function resolveLogPath(): string;
4
+ export declare function initializeDatabase(dataDir: string): Database;
5
+ export declare function closeDatabase(db: Database): void;
6
+ //# sourceMappingURL=database.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"database.d.ts","sourceRoot":"","sources":["../../src/storage/database.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAA;AA4DrC,wBAAgB,cAAc,IAAI,MAAM,CAMvC;AAED,wBAAgB,cAAc,IAAI,MAAM,CAEvC;AAED,wBAAgB,kBAAkB,CAAC,OAAO,EAAE,MAAM,GAAG,QAAQ,CAqC5D;AAED,wBAAgB,aAAa,CAAC,EAAE,EAAE,QAAQ,GAAG,IAAI,CAEhD"}