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 @@
1
+ {"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,eAAe,EAAe,MAAM,UAAU,CAAA;AAiHvE,wBAAgB,mBAAmB,CACjC,MAAM,EAAE,MAAM,CAAC,SAAS,EAAE,eAAe,CAAC,EAC1C,cAAc,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE;IAAE,WAAW,CAAC,EAAE,MAAM,CAAA;CAAE,CAAC,IAE3C,QAAQ,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,mBA6D9C"}
package/dist/config.js ADDED
@@ -0,0 +1,186 @@
1
+ import { readFileSync } from 'fs';
2
+ import { join, dirname } from 'path';
3
+ import { fileURLToPath } from 'url';
4
+ const __dirname = dirname(fileURLToPath(import.meta.url));
5
+ const PROMPT_REVIEW = readFileSync(join(__dirname, 'command/template/review.txt'), 'utf-8');
6
+ const REPLACED_BUILTIN_AGENTS = ['build', 'plan'];
7
+ const ENHANCED_BUILTIN_AGENTS = {
8
+ explore: {
9
+ permission: {
10
+ 'graph-query': 'allow',
11
+ 'graph-symbols': 'allow',
12
+ 'graph-analyze': 'allow',
13
+ },
14
+ prompt: `# Graph-first discovery hierarchy
15
+ You have access to four graph tools: graph-status, graph-query, graph-symbols, and graph-analyze. Use whichever graph tool best fits the question — these prompts prioritize graph usage without constraining which graph tool you use.
16
+
17
+ 1. **File-level topology**: Use graph-query for structural questions: top_files (most important files), file_symbols (what symbols live in a file), file_deps (what a file depends on), file_dependents (what depends on a file), cochanges (files that change together), blast_radius (impact analysis), packages (external package usage).
18
+ 2. **Symbol lookup**: Use graph-symbols for symbol-level queries: find (locate a symbol), search (search by pattern), signature (get symbol signature), callers (who calls this), callees (what this calls).
19
+ 3. **Code quality analysis**: Use graph-analyze for structural quality insights: unused_exports (exported but never imported), duplication (duplicate code structures), near_duplicates (near-duplicate code patterns).
20
+ 4. **Direct inspection**: Use Read to inspect the narrowed files directly.
21
+ 5. **Fallback**: Use Glob/Grep only for literal filename/content searches or when the graph cannot answer the question.
22
+
23
+ ## General guidelines
24
+ - When exploring the codebase, prefer the Task tool to reduce context usage.
25
+ - Call multiple tools in a single response when they are independent. Batch tool calls for performance.
26
+ - Use specialized tools (Read, Glob, Grep) instead of bash equivalents (cat, find, grep).
27
+ `,
28
+ },
29
+ };
30
+ const PLUGIN_COMMANDS = {
31
+ review: {
32
+ description: 'Run a code review.',
33
+ agent: 'auditor',
34
+ subtask: true,
35
+ template: PROMPT_REVIEW,
36
+ },
37
+ loop: {
38
+ description: 'Start an iterative development loop in a worktree',
39
+ agent: 'code',
40
+ subtask: false,
41
+ template: `## Step 1: Prepare the Plan
42
+
43
+ Ensure you have a clear implementation plan ready.
44
+
45
+ ## Step 2: Choose Execution Mode
46
+
47
+ Decide whether to run in:
48
+ - Worktree mode (isolated git worktree) for safe experimentation
49
+ - In-place mode (current directory) for quick iterations
50
+
51
+ ## Step 3: Execute the Loop
52
+
53
+ Run \`loop\` with:
54
+ - plan: The full implementation plan
55
+ - title: A short descriptive title
56
+ - worktree: true for worktree mode, false for in-place
57
+
58
+ The loop will automatically continue through iterations until complete.
59
+ Use \`loop-status\` to check progress or \`loop-cancel\` to stop.
60
+
61
+ $ARGUMENTS`,
62
+ },
63
+ 'loop-status': {
64
+ description: 'Check status of all active loops',
65
+ agent: 'code',
66
+ subtask: false,
67
+ template: `Check the status of all memory loops.
68
+
69
+ ## Step 1: List Active Loops
70
+
71
+ Run \`loop-status\` with no arguments to list all active loops for the current project.
72
+
73
+ ## Step 2: Get Detailed Status
74
+
75
+ For each active loop found, run \`loop-status\` with the loop name to get detailed status. Token counts, iterations, last output.
76
+
77
+ ## Step 3: Report
78
+
79
+ Present a summary showing:
80
+ - Total number of active loops
81
+ - For each loop: name, status, and any additional details
82
+
83
+ If no loops are active, report that there are no active loops.
84
+
85
+ $ARGUMENTS`,
86
+ },
87
+ 'loop-cancel': {
88
+ description: 'Cancel the active loop',
89
+ agent: 'code',
90
+ subtask: false,
91
+ template: `## Step 1: Identify the Loop
92
+
93
+ Run \`loop-status\` to see all active loops if you don't know the name.
94
+
95
+ ## Step 2: Cancel the Loop
96
+
97
+ Run \`loop-cancel\` with:
98
+ - name: The worktree name of the loop to cancel (optional if only one active)
99
+
100
+ ## Step 3: Verify Cancellation
101
+
102
+ Confirm the loop was cancelled and check if worktree cleanup is needed.
103
+
104
+ $ARGUMENTS`,
105
+ },
106
+ };
107
+ export function createConfigHandler(agents, agentOverrides) {
108
+ return async (config) => {
109
+ const effectiveAgents = { ...agents };
110
+ if (agentOverrides) {
111
+ for (const [name, overrides] of Object.entries(agentOverrides)) {
112
+ const role = Object.keys(effectiveAgents).find((r) => effectiveAgents[r].displayName === name);
113
+ if (role) {
114
+ effectiveAgents[role] = { ...effectiveAgents[role], ...overrides };
115
+ }
116
+ }
117
+ }
118
+ const agentConfigs = createAgentConfigs(effectiveAgents);
119
+ const userAgentConfigs = config.agent;
120
+ const mergedAgents = { ...agentConfigs };
121
+ if (userAgentConfigs) {
122
+ for (const [name, userConfig] of Object.entries(userAgentConfigs)) {
123
+ if (mergedAgents[name]) {
124
+ mergedAgents[name] = { ...mergedAgents[name], ...userConfig };
125
+ }
126
+ else {
127
+ mergedAgents[name] = userConfig;
128
+ }
129
+ }
130
+ }
131
+ for (const name of REPLACED_BUILTIN_AGENTS) {
132
+ mergedAgents[name] = { ...mergedAgents[name], hidden: true };
133
+ }
134
+ for (const [name, enhancement] of Object.entries(ENHANCED_BUILTIN_AGENTS)) {
135
+ const existing = mergedAgents[name];
136
+ const existingPermission = (existing?.permission ?? {});
137
+ const existingPrompt = existing?.prompt ?? '';
138
+ const newPrompt = enhancement.prompt
139
+ ? existingPrompt
140
+ ? `${existingPrompt}\n\n${enhancement.prompt}`
141
+ : enhancement.prompt
142
+ : existingPrompt;
143
+ mergedAgents[name] = {
144
+ ...existing,
145
+ permission: { ...existingPermission, ...enhancement.permission },
146
+ prompt: newPrompt,
147
+ };
148
+ }
149
+ config.agent = mergedAgents;
150
+ config.default_agent = 'code';
151
+ const userCommands = config.command;
152
+ const mergedCommands = { ...PLUGIN_COMMANDS };
153
+ if (userCommands) {
154
+ for (const [name, userCommand] of Object.entries(userCommands)) {
155
+ mergedCommands[name] = userCommand;
156
+ }
157
+ }
158
+ config.command = mergedCommands;
159
+ };
160
+ }
161
+ function createAgentConfigs(agents) {
162
+ const result = {};
163
+ for (const agent of Object.values(agents)) {
164
+ const tools = {};
165
+ if (agent.tools?.exclude) {
166
+ for (const tool of agent.tools.exclude) {
167
+ tools[tool] = false;
168
+ }
169
+ }
170
+ result[agent.displayName] = {
171
+ description: agent.description,
172
+ model: agent.defaultModel ?? '',
173
+ prompt: agent.systemPrompt ?? '',
174
+ mode: agent.mode ?? 'subagent',
175
+ ...(Object.keys(tools).length > 0 ? { tools } : {}),
176
+ ...(agent.variant ? { variant: agent.variant } : {}),
177
+ ...(agent.temperature !== undefined ? { temperature: agent.temperature } : {}),
178
+ ...(agent.steps !== undefined ? { steps: agent.steps } : {}),
179
+ ...(agent.hidden ? { hidden: agent.hidden } : {}),
180
+ ...(agent.color ? { color: agent.color } : {}),
181
+ ...(agent.permission ? { permission: agent.permission } : {}),
182
+ };
183
+ }
184
+ return result;
185
+ }
186
+ //# sourceMappingURL=config.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"config.js","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,10 @@
1
+ export declare const LOOP_PERMISSION_RULESET: ({
2
+ permission: string;
3
+ pattern: string;
4
+ action: "allow";
5
+ } | {
6
+ permission: string;
7
+ pattern: string;
8
+ action: "deny";
9
+ })[];
10
+ //# sourceMappingURL=loop.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"loop.d.ts","sourceRoot":"","sources":["../../src/constants/loop.ts"],"names":[],"mappings":"AAAA,eAAO,MAAM,uBAAuB;;;;;;;;IAInC,CAAA"}
@@ -0,0 +1,6 @@
1
+ export const LOOP_PERMISSION_RULESET = [
2
+ { permission: '*', pattern: '*', action: 'allow' },
3
+ { permission: 'external_directory', pattern: '*', action: 'deny' },
4
+ { permission: 'bash', pattern: 'git push *', action: 'deny' },
5
+ ];
6
+ //# sourceMappingURL=loop.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"loop.js","sourceRoot":"","sources":["../../src/constants/loop.ts"],"names":[],"mappings":"AAAA,MAAM,CAAC,MAAM,uBAAuB,GAAG;IACrC,EAAE,UAAU,EAAE,GAAG,EAAE,OAAO,EAAE,GAAG,EAAE,MAAM,EAAE,OAAgB,EAAE;IAC3D,EAAE,UAAU,EAAE,oBAAoB,EAAE,OAAO,EAAE,GAAG,EAAE,MAAM,EAAE,MAAe,EAAE;IAC3E,EAAE,UAAU,EAAE,MAAM,EAAE,OAAO,EAAE,YAAY,EAAE,MAAM,EAAE,MAAe,EAAE;CACvE,CAAA"}
@@ -0,0 +1,17 @@
1
+ /**
2
+ * File content cache keyed by absolute path, invalidated by mtime.
3
+ * Avoids re-reading files that haven't changed.
4
+ */
5
+ export declare class FileCache {
6
+ private entries;
7
+ private maxSize;
8
+ constructor(maxSize?: number);
9
+ get(filePath: string): Promise<string | null>;
10
+ /** Manually set a cache entry */
11
+ set(filePath: string, content: string, mtime?: number): void;
12
+ /** Invalidate a specific file */
13
+ invalidate(filePath: string): void;
14
+ /** Clear entire cache */
15
+ clear(): void;
16
+ }
17
+ //# sourceMappingURL=cache.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cache.d.ts","sourceRoot":"","sources":["../../src/graph/cache.ts"],"names":[],"mappings":"AAOA;;;GAGG;AACH,qBAAa,SAAS;IACpB,OAAO,CAAC,OAAO,CAAiC;IAChD,OAAO,CAAC,OAAO,CAAS;gBAEZ,OAAO,SAAM;IAInB,GAAG,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC;IAoBnD,iCAAiC;IACjC,GAAG,CAAC,QAAQ,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,KAAK,CAAC,EAAE,MAAM,GAAG,IAAI;IAU5D,iCAAiC;IACjC,UAAU,CAAC,QAAQ,EAAE,MAAM,GAAG,IAAI;IAIlC,yBAAyB;IACzB,KAAK,IAAI,IAAI;CAGd"}
@@ -0,0 +1,50 @@
1
+ import { readFile, stat } from "node:fs/promises";
2
+ /**
3
+ * File content cache keyed by absolute path, invalidated by mtime.
4
+ * Avoids re-reading files that haven't changed.
5
+ */
6
+ export class FileCache {
7
+ entries = new Map();
8
+ maxSize;
9
+ constructor(maxSize = 200) {
10
+ this.maxSize = maxSize;
11
+ }
12
+ async get(filePath) {
13
+ try {
14
+ const s = await stat(filePath);
15
+ const mtime = s.mtimeMs;
16
+ const cached = this.entries.get(filePath);
17
+ if (cached && cached.mtime === mtime) {
18
+ this.entries.delete(filePath);
19
+ this.entries.set(filePath, cached);
20
+ return cached.content;
21
+ }
22
+ const content = await readFile(filePath, "utf-8");
23
+ this.set(filePath, content, mtime);
24
+ return content;
25
+ }
26
+ catch {
27
+ return null;
28
+ }
29
+ }
30
+ /** Manually set a cache entry */
31
+ set(filePath, content, mtime) {
32
+ if (this.entries.size >= this.maxSize) {
33
+ // Evict oldest entry
34
+ const firstKey = this.entries.keys().next().value;
35
+ if (firstKey)
36
+ this.entries.delete(firstKey);
37
+ }
38
+ const mt = mtime ?? Date.now();
39
+ this.entries.set(filePath, { content, mtime: mt });
40
+ }
41
+ /** Invalidate a specific file */
42
+ invalidate(filePath) {
43
+ this.entries.delete(filePath);
44
+ }
45
+ /** Clear entire cache */
46
+ clear() {
47
+ this.entries.clear();
48
+ }
49
+ }
50
+ //# sourceMappingURL=cache.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cache.js","sourceRoot":"","sources":["../../src/graph/cache.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,IAAI,EAAE,MAAM,kBAAkB,CAAC;AAOlD;;;GAGG;AACH,MAAM,OAAO,SAAS;IACZ,OAAO,GAAG,IAAI,GAAG,EAAsB,CAAC;IACxC,OAAO,CAAS;IAExB,YAAY,OAAO,GAAG,GAAG;QACvB,IAAI,CAAC,OAAO,GAAG,OAAO,CAAC;IACzB,CAAC;IAED,KAAK,CAAC,GAAG,CAAC,QAAgB;QACxB,IAAI,CAAC;YACH,MAAM,CAAC,GAAG,MAAM,IAAI,CAAC,QAAQ,CAAC,CAAC;YAC/B,MAAM,KAAK,GAAG,CAAC,CAAC,OAAO,CAAC;YACxB,MAAM,MAAM,GAAG,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;YAE1C,IAAI,MAAM,IAAI,MAAM,CAAC,KAAK,KAAK,KAAK,EAAE,CAAC;gBACrC,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC;gBAC9B,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,QAAQ,EAAE,MAAM,CAAC,CAAC;gBACnC,OAAO,MAAM,CAAC,OAAO,CAAC;YACxB,CAAC;YAED,MAAM,OAAO,GAAG,MAAM,QAAQ,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC;YAClD,IAAI,CAAC,GAAG,CAAC,QAAQ,EAAE,OAAO,EAAE,KAAK,CAAC,CAAC;YACnC,OAAO,OAAO,CAAC;QACjB,CAAC;QAAC,MAAM,CAAC;YACP,OAAO,IAAI,CAAC;QACd,CAAC;IACH,CAAC;IAED,iCAAiC;IACjC,GAAG,CAAC,QAAgB,EAAE,OAAe,EAAE,KAAc;QACnD,IAAI,IAAI,CAAC,OAAO,CAAC,IAAI,IAAI,IAAI,CAAC,OAAO,EAAE,CAAC;YACtC,qBAAqB;YACrB,MAAM,QAAQ,GAAG,IAAI,CAAC,OAAO,CAAC,IAAI,EAAE,CAAC,IAAI,EAAE,CAAC,KAAK,CAAC;YAClD,IAAI,QAAQ;gBAAE,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC;QAC9C,CAAC;QACD,MAAM,EAAE,GAAG,KAAK,IAAI,IAAI,CAAC,GAAG,EAAE,CAAC;QAC/B,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,QAAQ,EAAE,EAAE,OAAO,EAAE,KAAK,EAAE,EAAE,EAAE,CAAC,CAAC;IACrD,CAAC;IAED,iCAAiC;IACjC,UAAU,CAAC,QAAgB;QACzB,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC;IAChC,CAAC;IAED,yBAAyB;IACzB,KAAK;QACH,IAAI,CAAC,OAAO,CAAC,KAAK,EAAE,CAAC;IACvB,CAAC;CACF"}
@@ -0,0 +1,51 @@
1
+ import { EventEmitter } from 'events';
2
+ import type { GraphStats, TopFileResult, FileDepResult, FileCoChangeResult, FileSymbolResult, SymbolSearchResult, SymbolSignatureResult, CallerResult, CalleeResult, UnusedExportResult, DuplicateStructureResult, NearDuplicateResult, ExternalPackageResult } from './types';
3
+ import type { Logger } from '../types';
4
+ interface GraphWorkerConfig {
5
+ cwd: string;
6
+ dbPath: string;
7
+ logger?: Logger;
8
+ }
9
+ /**
10
+ * GraphClient communicates with the graph worker via RPC
11
+ * All tree-sitter parsing and SQLite queries run in worker thread
12
+ */
13
+ export declare class GraphClient extends EventEmitter {
14
+ private client;
15
+ private worker;
16
+ private ready;
17
+ private workerError;
18
+ initialize(_config: GraphWorkerConfig): Promise<void>;
19
+ setWorker(worker: Worker, logger?: Logger): void;
20
+ markWorkerDead(error?: Error): void;
21
+ getWorkerError(): Error | null;
22
+ scan(): Promise<void>;
23
+ getStats(): Promise<GraphStats>;
24
+ getTopFiles(limit?: number): Promise<TopFileResult[]>;
25
+ getFileDependents(relPath: string): Promise<FileDepResult[]>;
26
+ getFileDependencies(relPath: string): Promise<FileDepResult[]>;
27
+ getFileCoChanges(relPath: string): Promise<FileCoChangeResult[]>;
28
+ getFileBlastRadius(relPath: string): Promise<number>;
29
+ getFileSymbols(relPath: string): Promise<FileSymbolResult[]>;
30
+ findSymbols(name: string, limit?: number): Promise<SymbolSearchResult[]>;
31
+ searchSymbolsFts(query: string, limit?: number): Promise<SymbolSearchResult[]>;
32
+ getSymbolSignature(path: string, line: number): Promise<SymbolSignatureResult | null>;
33
+ getCallers(path: string, line: number): Promise<CallerResult[]>;
34
+ getCallees(path: string, line: number): Promise<CalleeResult[]>;
35
+ getUnusedExports(limit?: number): Promise<UnusedExportResult[]>;
36
+ getDuplicateStructures(limit?: number): Promise<DuplicateStructureResult[]>;
37
+ getNearDuplicates(threshold?: number, limit?: number): Promise<NearDuplicateResult[]>;
38
+ getExternalPackages(limit?: number): Promise<ExternalPackageResult[]>;
39
+ render(opts?: {
40
+ maxFiles?: number;
41
+ maxSymbols?: number;
42
+ }): Promise<{
43
+ content: string;
44
+ paths: string[];
45
+ }>;
46
+ onFileChanged(absPath: string): Promise<void>;
47
+ close(): Promise<void>;
48
+ isReady(): boolean;
49
+ }
50
+ export {};
51
+ //# sourceMappingURL=client.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"client.d.ts","sourceRoot":"","sources":["../../src/graph/client.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,152 @@
1
+ import { RpcClient } from './rpc';
2
+ import { EventEmitter } from 'events';
3
+ /**
4
+ * GraphClient communicates with the graph worker via RPC
5
+ * All tree-sitter parsing and SQLite queries run in worker thread
6
+ */
7
+ export class GraphClient extends EventEmitter {
8
+ client = null;
9
+ worker = null;
10
+ ready = false;
11
+ workerError = null;
12
+ async initialize(_config) {
13
+ // Worker will be created by service
14
+ this.ready = true;
15
+ }
16
+ setWorker(worker, logger) {
17
+ this.worker = worker;
18
+ this.client = new RpcClient(worker, logger);
19
+ this.client.on('error', (_error) => {
20
+ this.ready = false;
21
+ this.workerError = _error;
22
+ });
23
+ this.client.on('exit', () => {
24
+ this.ready = false;
25
+ });
26
+ }
27
+ markWorkerDead(error) {
28
+ this.ready = false;
29
+ if (error) {
30
+ this.workerError = error;
31
+ }
32
+ if (this.client) {
33
+ this.client.markTerminated();
34
+ }
35
+ }
36
+ getWorkerError() {
37
+ return this.workerError;
38
+ }
39
+ async scan() {
40
+ if (!this.client)
41
+ throw new Error('Graph client not initialized');
42
+ await this.client.call('scan', []);
43
+ }
44
+ async getStats() {
45
+ if (!this.client)
46
+ throw new Error('Graph client not initialized');
47
+ return this.client.call('getStats', []);
48
+ }
49
+ async getTopFiles(limit = 20) {
50
+ if (!this.client)
51
+ throw new Error('Graph client not initialized');
52
+ return this.client.call('getTopFiles', [limit]);
53
+ }
54
+ async getFileDependents(relPath) {
55
+ if (!this.client)
56
+ throw new Error('Graph client not initialized');
57
+ return this.client.call('getFileDependents', [relPath]);
58
+ }
59
+ async getFileDependencies(relPath) {
60
+ if (!this.client)
61
+ throw new Error('Graph client not initialized');
62
+ return this.client.call('getFileDependencies', [relPath]);
63
+ }
64
+ async getFileCoChanges(relPath) {
65
+ if (!this.client)
66
+ throw new Error('Graph client not initialized');
67
+ return this.client.call('getFileCoChanges', [relPath]);
68
+ }
69
+ async getFileBlastRadius(relPath) {
70
+ if (!this.client)
71
+ throw new Error('Graph client not initialized');
72
+ return this.client.call('getFileBlastRadius', [relPath]);
73
+ }
74
+ async getFileSymbols(relPath) {
75
+ if (!this.client)
76
+ throw new Error('Graph client not initialized');
77
+ return this.client.call('getFileSymbols', [relPath]);
78
+ }
79
+ async findSymbols(name, limit = 50) {
80
+ if (!this.client)
81
+ throw new Error('Graph client not initialized');
82
+ return this.client.call('findSymbols', [name, limit]);
83
+ }
84
+ async searchSymbolsFts(query, limit = 20) {
85
+ if (!this.client)
86
+ throw new Error('Graph client not initialized');
87
+ return this.client.call('searchSymbolsFts', [query, limit]);
88
+ }
89
+ async getSymbolSignature(path, line) {
90
+ if (!this.client)
91
+ throw new Error('Graph client not initialized');
92
+ return this.client.call('getSymbolSignature', [path, line]);
93
+ }
94
+ async getCallers(path, line) {
95
+ if (!this.client)
96
+ throw new Error('Graph client not initialized');
97
+ return this.client.call('getCallers', [path, line]);
98
+ }
99
+ async getCallees(path, line) {
100
+ if (!this.client)
101
+ throw new Error('Graph client not initialized');
102
+ return this.client.call('getCallees', [path, line]);
103
+ }
104
+ async getUnusedExports(limit = 20) {
105
+ if (!this.client)
106
+ throw new Error('Graph client not initialized');
107
+ return this.client.call('getUnusedExports', [limit]);
108
+ }
109
+ async getDuplicateStructures(limit = 20) {
110
+ if (!this.client)
111
+ throw new Error('Graph client not initialized');
112
+ return this.client.call('getDuplicateStructures', [limit]);
113
+ }
114
+ async getNearDuplicates(threshold = 0.8, limit = 50) {
115
+ if (!this.client)
116
+ throw new Error('Graph client not initialized');
117
+ return this.client.call('getNearDuplicates', [threshold, limit]);
118
+ }
119
+ async getExternalPackages(limit = 20) {
120
+ if (!this.client)
121
+ throw new Error('Graph client not initialized');
122
+ return this.client.call('getExternalPackages', [limit]);
123
+ }
124
+ async render(opts) {
125
+ if (!this.client)
126
+ throw new Error('Graph client not initialized');
127
+ return this.client.call('render', [opts]);
128
+ }
129
+ async onFileChanged(absPath) {
130
+ if (!this.client)
131
+ return;
132
+ if (!this.ready) {
133
+ throw new Error('Graph client not ready - worker may be unavailable');
134
+ }
135
+ await this.client.call('onFileChanged', [absPath]);
136
+ }
137
+ async close() {
138
+ if (this.client) {
139
+ this.client.terminate();
140
+ this.client = null;
141
+ }
142
+ if (this.worker) {
143
+ this.worker.terminate();
144
+ this.worker = null;
145
+ }
146
+ this.ready = false;
147
+ }
148
+ isReady() {
149
+ return this.ready;
150
+ }
151
+ }
152
+ //# sourceMappingURL=client.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"client.js","sourceRoot":"","sources":["../../src/graph/client.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,9 @@
1
+ export declare function tokenize(source: string): string[];
2
+ export declare function computeMinHash(tokens: string[]): Uint32Array | null;
3
+ export declare function jaccardSimilarity(a: Uint32Array, b: Uint32Array): number;
4
+ export interface FragmentHash {
5
+ hash: string;
6
+ tokenOffset: number;
7
+ }
8
+ export declare function computeFragmentHashes(tokens: string[]): FragmentHash[];
9
+ //# sourceMappingURL=clone-detection.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"clone-detection.d.ts","sourceRoot":"","sources":["../../src/graph/clone-detection.ts"],"names":[],"mappings":"AAqGA,wBAAgB,QAAQ,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,EAAE,CAMjD;AAKD,wBAAgB,cAAc,CAAC,MAAM,EAAE,MAAM,EAAE,GAAG,WAAW,GAAG,IAAI,CAiBnE;AAED,wBAAgB,iBAAiB,CAAC,CAAC,EAAE,WAAW,EAAE,CAAC,EAAE,WAAW,GAAG,MAAM,CAMxE;AAKD,MAAM,WAAW,YAAY;IAC3B,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,EAAE,MAAM,CAAC;CACrB;AAED,wBAAgB,qBAAqB,CAAC,MAAM,EAAE,MAAM,EAAE,GAAG,YAAY,EAAE,CAYtE"}