@ipul-labs/forge 1.16.8 → 1.17.1

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 (280) hide show
  1. package/README.md +39 -21
  2. package/lib/bin/cli/analyze.d.ts +9 -0
  3. package/lib/bin/cli/analyze.d.ts.map +1 -0
  4. package/lib/bin/cli/analyze.js +491 -0
  5. package/lib/bin/cli/analyze.js.map +1 -0
  6. package/lib/bin/cli/apply.d.ts +2 -0
  7. package/lib/bin/cli/apply.d.ts.map +1 -0
  8. package/lib/bin/cli/apply.js +262 -0
  9. package/lib/bin/cli/apply.js.map +1 -0
  10. package/lib/bin/cli/cifix.d.ts +2 -0
  11. package/lib/bin/cli/cifix.d.ts.map +1 -0
  12. package/lib/bin/cli/cifix.js +310 -0
  13. package/lib/bin/cli/cifix.js.map +1 -0
  14. package/lib/bin/cli/close.d.ts +2 -0
  15. package/lib/bin/cli/close.d.ts.map +1 -0
  16. package/lib/bin/cli/close.js +113 -0
  17. package/lib/bin/cli/close.js.map +1 -0
  18. package/lib/bin/cli/createIssue.d.ts +2 -0
  19. package/lib/bin/cli/createIssue.d.ts.map +1 -0
  20. package/lib/bin/cli/createIssue.js +108 -0
  21. package/lib/bin/cli/createIssue.js.map +1 -0
  22. package/lib/bin/cli/doctor.d.ts +2 -0
  23. package/lib/bin/cli/doctor.d.ts.map +1 -0
  24. package/lib/bin/cli/doctor.js +145 -0
  25. package/lib/bin/cli/doctor.js.map +1 -0
  26. package/lib/bin/cli/init.d.ts +4 -0
  27. package/lib/bin/cli/init.d.ts.map +1 -0
  28. package/lib/bin/cli/init.js +288 -0
  29. package/lib/bin/cli/init.js.map +1 -0
  30. package/lib/bin/cli/ink.d.ts +23 -0
  31. package/lib/bin/cli/ink.d.ts.map +1 -0
  32. package/{bin → lib/bin}/cli/ink.js +18 -19
  33. package/lib/bin/cli/ink.js.map +1 -0
  34. package/lib/bin/cli/issue.d.ts +2 -0
  35. package/lib/bin/cli/issue.d.ts.map +1 -0
  36. package/lib/bin/cli/issue.js +114 -0
  37. package/lib/bin/cli/issue.js.map +1 -0
  38. package/lib/bin/cli/issues.d.ts +2 -0
  39. package/lib/bin/cli/issues.d.ts.map +1 -0
  40. package/lib/bin/cli/issues.js +149 -0
  41. package/lib/bin/cli/issues.js.map +1 -0
  42. package/lib/bin/cli/merge.d.ts +2 -0
  43. package/lib/bin/cli/merge.d.ts.map +1 -0
  44. package/lib/bin/cli/merge.js +162 -0
  45. package/lib/bin/cli/merge.js.map +1 -0
  46. package/lib/bin/cli/refine.d.ts +2 -0
  47. package/lib/bin/cli/refine.d.ts.map +1 -0
  48. package/lib/bin/cli/refine.js +249 -0
  49. package/lib/bin/cli/refine.js.map +1 -0
  50. package/lib/bin/cli/repl.d.ts +2 -0
  51. package/lib/bin/cli/repl.d.ts.map +1 -0
  52. package/lib/bin/cli/repl.js +309 -0
  53. package/lib/bin/cli/repl.js.map +1 -0
  54. package/lib/bin/cli/repos.d.ts +2 -0
  55. package/lib/bin/cli/repos.d.ts.map +1 -0
  56. package/lib/bin/cli/repos.js +86 -0
  57. package/lib/bin/cli/repos.js.map +1 -0
  58. package/lib/bin/cli/resolution.d.ts +2 -0
  59. package/lib/bin/cli/resolution.d.ts.map +1 -0
  60. package/lib/bin/cli/resolution.js +139 -0
  61. package/lib/bin/cli/resolution.js.map +1 -0
  62. package/lib/bin/cli/serverClient.d.ts +26 -0
  63. package/lib/bin/cli/serverClient.d.ts.map +1 -0
  64. package/lib/bin/cli/serverClient.js +111 -0
  65. package/lib/bin/cli/serverClient.js.map +1 -0
  66. package/lib/bin/cli/session.d.ts +8 -0
  67. package/lib/bin/cli/session.d.ts.map +1 -0
  68. package/lib/bin/cli/session.js +212 -0
  69. package/lib/bin/cli/session.js.map +1 -0
  70. package/lib/bin/cli/sessionStore.d.ts +69 -0
  71. package/lib/bin/cli/sessionStore.d.ts.map +1 -0
  72. package/lib/bin/cli/sessionStore.js +196 -0
  73. package/lib/bin/cli/sessionStore.js.map +1 -0
  74. package/lib/bin/cli/ship.d.ts +33 -0
  75. package/lib/bin/cli/ship.d.ts.map +1 -0
  76. package/lib/bin/cli/ship.js +737 -0
  77. package/lib/bin/cli/ship.js.map +1 -0
  78. package/lib/bin/cli/types.d.ts +59 -0
  79. package/lib/bin/cli/types.d.ts.map +1 -0
  80. package/lib/bin/cli/types.js +2 -0
  81. package/lib/bin/cli/types.js.map +1 -0
  82. package/lib/bin/cli/update.d.ts +2 -0
  83. package/lib/bin/cli/update.d.ts.map +1 -0
  84. package/lib/bin/cli/update.js +87 -0
  85. package/lib/bin/cli/update.js.map +1 -0
  86. package/lib/bin/cli/utils.d.ts +43 -0
  87. package/lib/bin/cli/utils.d.ts.map +1 -0
  88. package/lib/bin/cli/utils.js +181 -0
  89. package/lib/bin/cli/utils.js.map +1 -0
  90. package/lib/bin/cli/validate.d.ts +2 -0
  91. package/lib/bin/cli/validate.d.ts.map +1 -0
  92. package/lib/bin/cli/validate.js +283 -0
  93. package/lib/bin/cli/validate.js.map +1 -0
  94. package/lib/bin/cli/watch.d.ts +5 -0
  95. package/lib/bin/cli/watch.d.ts.map +1 -0
  96. package/lib/bin/cli/watch.js +263 -0
  97. package/lib/bin/cli/watch.js.map +1 -0
  98. package/lib/bin/forge-agent.d.ts +3 -0
  99. package/lib/bin/forge-agent.d.ts.map +1 -0
  100. package/{bin → lib/bin}/forge-agent.js +104 -105
  101. package/lib/bin/forge-agent.js.map +1 -0
  102. package/lib/server/forge/core/ForgeAgent.d.ts +260 -0
  103. package/lib/server/forge/core/ForgeAgent.d.ts.map +1 -0
  104. package/lib/server/forge/core/ForgeAgent.js +995 -0
  105. package/lib/server/forge/core/ForgeAgent.js.map +1 -0
  106. package/lib/server/forge/core/agentClient.d.ts +39 -0
  107. package/lib/server/forge/core/agentClient.d.ts.map +1 -0
  108. package/{server → lib/server}/forge/core/agentClient.js +7 -12
  109. package/lib/server/forge/core/agentClient.js.map +1 -0
  110. package/lib/server/forge/core/branchName.d.ts +20 -0
  111. package/lib/server/forge/core/branchName.d.ts.map +1 -0
  112. package/lib/server/forge/core/branchName.js +39 -0
  113. package/lib/server/forge/core/branchName.js.map +1 -0
  114. package/lib/server/forge/core/claudeClient.d.ts +60 -0
  115. package/lib/server/forge/core/claudeClient.d.ts.map +1 -0
  116. package/lib/server/forge/core/claudeClient.js +347 -0
  117. package/lib/server/forge/core/claudeClient.js.map +1 -0
  118. package/lib/server/forge/core/configStore.d.ts +76 -0
  119. package/lib/server/forge/core/configStore.d.ts.map +1 -0
  120. package/lib/server/forge/core/configStore.js +213 -0
  121. package/lib/server/forge/core/configStore.js.map +1 -0
  122. package/lib/server/forge/core/gitlabClient.d.ts +144 -0
  123. package/lib/server/forge/core/gitlabClient.d.ts.map +1 -0
  124. package/{server → lib/server}/forge/core/gitlabClient.js +98 -180
  125. package/lib/server/forge/core/gitlabClient.js.map +1 -0
  126. package/lib/server/forge/core/jobs.d.ts +67 -0
  127. package/lib/server/forge/core/jobs.d.ts.map +1 -0
  128. package/lib/server/forge/core/jobs.js +185 -0
  129. package/lib/server/forge/core/jobs.js.map +1 -0
  130. package/lib/server/forge/core/k8s.d.ts +18 -0
  131. package/lib/server/forge/core/k8s.d.ts.map +1 -0
  132. package/lib/server/forge/core/k8s.js +49 -0
  133. package/lib/server/forge/core/k8s.js.map +1 -0
  134. package/lib/server/forge/core/localRepo.d.ts +36 -0
  135. package/lib/server/forge/core/localRepo.d.ts.map +1 -0
  136. package/lib/server/forge/core/localRepo.js +165 -0
  137. package/lib/server/forge/core/localRepo.js.map +1 -0
  138. package/lib/server/forge/core/openclawClient.d.ts +61 -0
  139. package/lib/server/forge/core/openclawClient.d.ts.map +1 -0
  140. package/lib/server/forge/core/openclawClient.js +111 -0
  141. package/lib/server/forge/core/openclawClient.js.map +1 -0
  142. package/lib/server/forge/core/prompts.d.ts +96 -0
  143. package/lib/server/forge/core/prompts.d.ts.map +1 -0
  144. package/lib/server/forge/core/prompts.js +450 -0
  145. package/lib/server/forge/core/prompts.js.map +1 -0
  146. package/lib/server/forge/core/providers/azuredevops.d.ts +134 -0
  147. package/lib/server/forge/core/providers/azuredevops.d.ts.map +1 -0
  148. package/lib/server/forge/core/providers/azuredevops.js +360 -0
  149. package/lib/server/forge/core/providers/azuredevops.js.map +1 -0
  150. package/lib/server/forge/core/providers/base.d.ts +114 -0
  151. package/lib/server/forge/core/providers/base.d.ts.map +1 -0
  152. package/lib/server/forge/core/providers/base.js +98 -0
  153. package/lib/server/forge/core/providers/base.js.map +1 -0
  154. package/lib/server/forge/core/providers/github.d.ts +133 -0
  155. package/lib/server/forge/core/providers/github.d.ts.map +1 -0
  156. package/lib/server/forge/core/providers/github.js +307 -0
  157. package/lib/server/forge/core/providers/github.js.map +1 -0
  158. package/lib/server/forge/core/providers/gitlab.d.ts +144 -0
  159. package/lib/server/forge/core/providers/gitlab.d.ts.map +1 -0
  160. package/lib/server/forge/core/providers/gitlab.js +407 -0
  161. package/lib/server/forge/core/providers/gitlab.js.map +1 -0
  162. package/lib/server/forge/core/providers/index.d.ts +21 -0
  163. package/lib/server/forge/core/providers/index.d.ts.map +1 -0
  164. package/lib/server/forge/core/providers/index.js +43 -0
  165. package/lib/server/forge/core/providers/index.js.map +1 -0
  166. package/lib/server/forge/core/providers/types.d.ts +80 -0
  167. package/lib/server/forge/core/providers/types.d.ts.map +1 -0
  168. package/lib/server/forge/core/providers/types.js +2 -0
  169. package/lib/server/forge/core/providers/types.js.map +1 -0
  170. package/lib/server/forge/core/quotaClient.d.ts +48 -0
  171. package/lib/server/forge/core/quotaClient.d.ts.map +1 -0
  172. package/lib/server/forge/core/quotaClient.js +88 -0
  173. package/lib/server/forge/core/quotaClient.js.map +1 -0
  174. package/lib/server/forge/core/types.d.ts +160 -0
  175. package/lib/server/forge/core/types.d.ts.map +1 -0
  176. package/lib/server/forge/core/types.js +2 -0
  177. package/lib/server/forge/core/types.js.map +1 -0
  178. package/lib/server/forge/core/validator/attribute.d.ts +31 -0
  179. package/lib/server/forge/core/validator/attribute.d.ts.map +1 -0
  180. package/lib/server/forge/core/validator/attribute.js +82 -0
  181. package/lib/server/forge/core/validator/attribute.js.map +1 -0
  182. package/lib/server/forge/core/validator/clone.d.ts +14 -0
  183. package/lib/server/forge/core/validator/clone.d.ts.map +1 -0
  184. package/lib/server/forge/core/validator/clone.js +99 -0
  185. package/lib/server/forge/core/validator/clone.js.map +1 -0
  186. package/lib/server/forge/core/validator/cmd.d.ts +23 -0
  187. package/lib/server/forge/core/validator/cmd.d.ts.map +1 -0
  188. package/lib/server/forge/core/validator/cmd.js +87 -0
  189. package/lib/server/forge/core/validator/cmd.js.map +1 -0
  190. package/lib/server/forge/core/validator/fs.d.ts +5 -0
  191. package/lib/server/forge/core/validator/fs.d.ts.map +1 -0
  192. package/{server → lib/server}/forge/core/validator/fs.js +8 -3
  193. package/lib/server/forge/core/validator/fs.js.map +1 -0
  194. package/lib/server/forge/core/validator/overlay.d.ts +13 -0
  195. package/lib/server/forge/core/validator/overlay.d.ts.map +1 -0
  196. package/lib/server/forge/core/validator/overlay.js +53 -0
  197. package/lib/server/forge/core/validator/overlay.js.map +1 -0
  198. package/lib/server/forge/core/validator/projectType.d.ts +20 -0
  199. package/lib/server/forge/core/validator/projectType.d.ts.map +1 -0
  200. package/lib/server/forge/core/validator/projectType.js +94 -0
  201. package/lib/server/forge/core/validator/projectType.js.map +1 -0
  202. package/lib/server/forge/core/validator/runners/go.d.ts +21 -0
  203. package/lib/server/forge/core/validator/runners/go.d.ts.map +1 -0
  204. package/lib/server/forge/core/validator/runners/go.js +99 -0
  205. package/lib/server/forge/core/validator/runners/go.js.map +1 -0
  206. package/lib/server/forge/core/validator/runners/node.d.ts +12 -0
  207. package/lib/server/forge/core/validator/runners/node.d.ts.map +1 -0
  208. package/lib/server/forge/core/validator/runners/node.js +75 -0
  209. package/lib/server/forge/core/validator/runners/node.js.map +1 -0
  210. package/lib/server/forge/core/validator/tdd.d.ts +30 -0
  211. package/lib/server/forge/core/validator/tdd.d.ts.map +1 -0
  212. package/lib/server/forge/core/validator/tdd.js +96 -0
  213. package/lib/server/forge/core/validator/tdd.js.map +1 -0
  214. package/lib/server/forge/core/validator.d.ts +58 -0
  215. package/lib/server/forge/core/validator.d.ts.map +1 -0
  216. package/lib/server/forge/core/validator.js +150 -0
  217. package/lib/server/forge/core/validator.js.map +1 -0
  218. package/lib/server/forge/routes.d.ts +22 -0
  219. package/lib/server/forge/routes.d.ts.map +1 -0
  220. package/lib/server/forge/routes.js +984 -0
  221. package/lib/server/forge/routes.js.map +1 -0
  222. package/lib/server.d.ts +2 -0
  223. package/lib/server.d.ts.map +1 -0
  224. package/lib/server.js +52 -0
  225. package/lib/server.js.map +1 -0
  226. package/lib/shared/events.d.ts +12 -0
  227. package/lib/shared/events.d.ts.map +1 -0
  228. package/lib/shared/events.js +12 -0
  229. package/lib/shared/events.js.map +1 -0
  230. package/package.json +15 -13
  231. package/scripts/fix-shebang.cjs +11 -0
  232. package/bin/cli/analyze.js +0 -516
  233. package/bin/cli/apply.js +0 -264
  234. package/bin/cli/cifix.js +0 -300
  235. package/bin/cli/close.js +0 -125
  236. package/bin/cli/createIssue.js +0 -112
  237. package/bin/cli/doctor.js +0 -161
  238. package/bin/cli/init.js +0 -306
  239. package/bin/cli/issue.js +0 -116
  240. package/bin/cli/issues.js +0 -155
  241. package/bin/cli/merge.js +0 -175
  242. package/bin/cli/refine.js +0 -253
  243. package/bin/cli/repl.js +0 -301
  244. package/bin/cli/repos.js +0 -91
  245. package/bin/cli/resolution.js +0 -126
  246. package/bin/cli/session.js +0 -230
  247. package/bin/cli/sessionStore.js +0 -211
  248. package/bin/cli/ship.js +0 -762
  249. package/bin/cli/update.js +0 -95
  250. package/bin/cli/utils.js +0 -145
  251. package/bin/cli/validate.js +0 -280
  252. package/bin/cli/watch.js +0 -274
  253. package/server/forge/core/ForgeAgent.js +0 -1179
  254. package/server/forge/core/ForgeAgent.test.js +0 -179
  255. package/server/forge/core/branchName.js +0 -41
  256. package/server/forge/core/claudeClient.js +0 -378
  257. package/server/forge/core/configStore.js +0 -229
  258. package/server/forge/core/configStore.test.js +0 -89
  259. package/server/forge/core/jobs.js +0 -180
  260. package/server/forge/core/k8s.js +0 -54
  261. package/server/forge/core/localRepo.js +0 -163
  262. package/server/forge/core/openclawClient.js +0 -125
  263. package/server/forge/core/prompts.js +0 -483
  264. package/server/forge/core/prompts.test.js +0 -219
  265. package/server/forge/core/providers/azuredevops.js +0 -409
  266. package/server/forge/core/providers/base.js +0 -208
  267. package/server/forge/core/providers/github.js +0 -348
  268. package/server/forge/core/providers/gitlab.js +0 -529
  269. package/server/forge/core/providers/index.js +0 -47
  270. package/server/forge/core/quotaClient.js +0 -101
  271. package/server/forge/core/validator/attribute.js +0 -84
  272. package/server/forge/core/validator/clone.js +0 -116
  273. package/server/forge/core/validator/cmd.js +0 -98
  274. package/server/forge/core/validator/overlay.js +0 -52
  275. package/server/forge/core/validator/projectType.js +0 -87
  276. package/server/forge/core/validator/runners/go.js +0 -107
  277. package/server/forge/core/validator/runners/node.js +0 -84
  278. package/server/forge/core/validator/tdd.js +0 -105
  279. package/server/forge/core/validator.js +0 -167
  280. package/server/forge/routes.js +0 -1027
@@ -0,0 +1,407 @@
1
+ /**
2
+ * server/forge/core/providers/gitlab.ts
3
+ *
4
+ * GitLab REST API v4 implementation of ScmProvider.
5
+ *
6
+ * Token resolved via configStore.getConnection("gitlab") — set in Settings UI
7
+ * or via GITLAB_TOKEN env var. Project resolved via configStore.getPrimaryProject()
8
+ * or the constructor argument.
9
+ */
10
+ import { getConnection, getPrimaryProject } from "../configStore.js";
11
+ import { ScmProvider } from "./base.js";
12
+ const CLOSING_ISSUE_RE = /\b(?:Closes|Fixes|Resolves)\s+#(\d+)/gi;
13
+ function parseClosingIssueRefs(text) {
14
+ if (!text)
15
+ return [];
16
+ const seen = new Set();
17
+ for (const m of text.matchAll(CLOSING_ISSUE_RE))
18
+ seen.add(Number(m[1]));
19
+ return [...seen];
20
+ }
21
+ export class GitLabProvider extends ScmProvider {
22
+ _project;
23
+ constructor(project) {
24
+ super();
25
+ this._project = project ?? getPrimaryProject() ?? "";
26
+ }
27
+ get name() { return "gitlab"; }
28
+ get supportsRebase() { return true; }
29
+ get _base() {
30
+ return getConnection("gitlab").baseUrl;
31
+ }
32
+ // ─── Internal helpers ──────────────────────────────────────────────────────
33
+ _headers() {
34
+ return {
35
+ "PRIVATE-TOKEN": getConnection("gitlab").token,
36
+ "Content-Type": "application/json",
37
+ };
38
+ }
39
+ _enc() {
40
+ return encodeURIComponent(this._project);
41
+ }
42
+ async _req(path, options = {}) {
43
+ const res = await fetch(`${this._base}${path}`, {
44
+ ...options,
45
+ headers: { ...this._headers(), ...options.headers },
46
+ });
47
+ if (!res.ok) {
48
+ const text = await res.text().catch(() => "");
49
+ throw new Error(`GitLab ${res.status} on ${path}: ${text}`);
50
+ }
51
+ return res.json();
52
+ }
53
+ // ─── Normalizers ──────────────────────────────────────────────────────────
54
+ _issue(raw) {
55
+ return {
56
+ iid: raw.iid,
57
+ title: raw.title,
58
+ description: raw.description ?? null,
59
+ labels: raw.labels ?? [],
60
+ author: { name: raw.author?.name ?? "" },
61
+ created_at: raw.created_at,
62
+ web_url: raw.web_url,
63
+ };
64
+ }
65
+ _mr(raw) {
66
+ return {
67
+ iid: raw.iid,
68
+ title: raw.title,
69
+ web_url: raw.web_url,
70
+ source_branch: raw.source_branch,
71
+ target_branch: raw.target_branch,
72
+ state: raw.state,
73
+ has_conflicts: raw.has_conflicts ?? false,
74
+ rebase_in_progress: raw.rebase_in_progress ?? false,
75
+ merge_status: raw.merge_status ?? "",
76
+ detailed_merge_status: raw.detailed_merge_status ?? null,
77
+ merge_when_pipeline_succeeds: raw.merge_when_pipeline_succeeds ?? false,
78
+ draft: raw.draft ?? raw.work_in_progress ?? false,
79
+ head_pipeline: raw.head_pipeline
80
+ ? { status: raw.head_pipeline.status, web_url: raw.head_pipeline.web_url }
81
+ : null,
82
+ author: { name: raw.author?.name ?? "" },
83
+ created_at: raw.created_at,
84
+ merged_at: raw.merged_at ?? null,
85
+ merge_commit_sha: raw.merge_commit_sha ?? null,
86
+ };
87
+ }
88
+ _pipeline(raw) {
89
+ return {
90
+ id: raw.id,
91
+ status: raw.status,
92
+ web_url: raw.web_url,
93
+ created_at: raw.created_at,
94
+ };
95
+ }
96
+ _job(raw) {
97
+ return {
98
+ id: raw.id,
99
+ name: raw.name,
100
+ stage: raw.stage,
101
+ status: raw.status,
102
+ web_url: raw.web_url,
103
+ duration: raw.duration ?? null,
104
+ };
105
+ }
106
+ _diff(raw) {
107
+ return {
108
+ old_path: raw.old_path,
109
+ new_path: raw.new_path,
110
+ diff: raw.diff ?? "",
111
+ new_file: raw.new_file ?? false,
112
+ renamed_file: raw.renamed_file ?? false,
113
+ deleted_file: raw.deleted_file ?? false,
114
+ };
115
+ }
116
+ // ─── Issues ───────────────────────────────────────────────────────────────
117
+ async listOpenIssues() {
118
+ const raw = await this._req(`/projects/${this._enc()}/issues?state=opened&order_by=updated_at&per_page=25`);
119
+ return raw.map((r) => this._issue(r));
120
+ }
121
+ async getIssue(iid) {
122
+ const raw = await this._req(`/projects/${this._enc()}/issues/${iid}`);
123
+ return this._issue(raw);
124
+ }
125
+ async createIssue(title, description = "") {
126
+ const raw = await this._req(`/projects/${this._enc()}/issues`, {
127
+ method: "POST",
128
+ body: JSON.stringify({ title, description }),
129
+ });
130
+ return this._issue(raw);
131
+ }
132
+ async updateIssue(iid, { title, description }) {
133
+ const raw = await this._req(`/projects/${this._enc()}/issues/${iid}`, {
134
+ method: "PUT",
135
+ body: JSON.stringify({ title, description }),
136
+ });
137
+ return this._issue(raw);
138
+ }
139
+ async closeIssue(iid) {
140
+ const raw = await this._req(`/projects/${this._enc()}/issues/${iid}`, {
141
+ method: "PUT",
142
+ body: JSON.stringify({ state_event: "close" }),
143
+ });
144
+ return this._issue(raw);
145
+ }
146
+ // ─── Repository ───────────────────────────────────────────────────────────
147
+ async getFileTree(srcPath = "", ref = "main") {
148
+ const scan = async (pathParam) => {
149
+ const items = [];
150
+ let page = 1;
151
+ while (true) {
152
+ const batch = await this._req(`/projects/${this._enc()}/repository/tree` +
153
+ `?${pathParam ? `path=${pathParam}&` : ""}recursive=true&ref=${ref}&per_page=100&page=${page}`);
154
+ items.push(...batch);
155
+ if (batch.length < 100)
156
+ break;
157
+ page++;
158
+ }
159
+ return items;
160
+ };
161
+ let allItems;
162
+ try {
163
+ allItems = await scan(srcPath);
164
+ }
165
+ catch (err) {
166
+ // The srcPath defaults to "src" but not every repo uses that layout
167
+ // (Go repos use go/, Python uses app/, etc.). Fall back to full tree.
168
+ if (/404|invalid revision or path/i.test(err?.message ?? "")) {
169
+ allItems = await scan("");
170
+ }
171
+ else {
172
+ throw err;
173
+ }
174
+ }
175
+ return allItems
176
+ .filter((item) => item.type === "blob")
177
+ .filter((item) => /\.(ts|tsx|js|jsx|json|css|yaml|yml|md|go|py|rs|java|rb|sh|toml)$/.test(item.path))
178
+ .map((item) => item.path);
179
+ }
180
+ async getFileContent(filePath, ref = "main") {
181
+ const encoded = encodeURIComponent(filePath);
182
+ const data = await this._req(`/projects/${this._enc()}/repository/files/${encoded}?ref=${ref}`);
183
+ return Buffer.from(data.content, "base64").toString("utf-8");
184
+ }
185
+ // ─── Mutations ────────────────────────────────────────────────────────────
186
+ async createBranch(branchName, ref = "main") {
187
+ return this._req(`/projects/${this._enc()}/repository/branches`, {
188
+ method: "POST",
189
+ body: JSON.stringify({ branch: branchName, ref }),
190
+ });
191
+ }
192
+ async deleteBranch(branchName) {
193
+ const res = await fetch(`${this._base}/projects/${this._enc()}/repository/branches/${encodeURIComponent(branchName)}`, { method: "DELETE", headers: this._headers() });
194
+ // 404 is fine — branch was already gone.
195
+ if (!res.ok && res.status !== 404) {
196
+ const text = await res.text().catch(() => "");
197
+ throw new Error(`GitLab ${res.status} deleting ${branchName}: ${text}`);
198
+ }
199
+ }
200
+ async commitFiles(branch, message, actions) {
201
+ // GitLab uses "update" where the base interface uses "modify"
202
+ const mapped = actions.map((a) => ({
203
+ ...a,
204
+ action: a.action === "modify" ? "update" : a.action,
205
+ }));
206
+ const payload = { branch, commit_message: message, actions: mapped };
207
+ try {
208
+ return await this._req(`/projects/${this._enc()}/repository/commits`, {
209
+ method: "POST",
210
+ body: JSON.stringify(payload),
211
+ });
212
+ }
213
+ catch (err) {
214
+ // When committing to an existing branch, a file that was previously
215
+ // created now exists — retry with create→update for all such actions.
216
+ if (err.message.includes("already exists") && mapped.some((a) => a.action === "create")) {
217
+ const fixed = mapped.map((a) => ({
218
+ ...a,
219
+ action: a.action === "create" ? "update" : a.action,
220
+ }));
221
+ return this._req(`/projects/${this._enc()}/repository/commits`, {
222
+ method: "POST",
223
+ body: JSON.stringify({ ...payload, actions: fixed }),
224
+ });
225
+ }
226
+ throw err;
227
+ }
228
+ }
229
+ async createMR({ sourceBranch, targetBranch = "main", title, description = "", labels = [] }) {
230
+ const body = {
231
+ source_branch: sourceBranch,
232
+ target_branch: targetBranch,
233
+ title,
234
+ description,
235
+ remove_source_branch: true,
236
+ };
237
+ if (labels?.length)
238
+ body.labels = labels.join(",");
239
+ const raw = await this._req(`/projects/${this._enc()}/merge_requests`, {
240
+ method: "POST",
241
+ body: JSON.stringify(body),
242
+ });
243
+ return this._mr(raw);
244
+ }
245
+ // ─── MR / PR queries ──────────────────────────────────────────────────────
246
+ async listAllForgeMRs(state = "open") {
247
+ const gitlabState = state === "open" ? "opened" : state;
248
+ const all = await this._req(`/projects/${this._enc()}/merge_requests?state=${gitlabState}&per_page=50`);
249
+ const forge = all.filter((mr) => mr.source_branch?.startsWith("forge/"));
250
+ // Only open MRs need the head_pipeline detail fetch — merged/closed rows
251
+ // don't render a live pipeline badge in the UI.
252
+ if (state !== "open")
253
+ return forge.map((mr) => this._mr(mr));
254
+ const detailed = await Promise.all(forge.map((mr) => this._req(`/projects/${this._enc()}/merge_requests/${mr.iid}`)));
255
+ return detailed.map((mr) => this._mr(mr));
256
+ }
257
+ async listForgeMRsForIssue(issueIid) {
258
+ const all = await this._req(`/projects/${this._enc()}/merge_requests?state=opened&per_page=50`);
259
+ return all
260
+ .filter((mr) => mr.source_branch?.startsWith(`forge/issue-${issueIid}-`))
261
+ .map((mr) => this._mr(mr));
262
+ }
263
+ async listMergedForgeMRsForIssue(issueIid) {
264
+ const all = await this._req(`/projects/${this._enc()}/merge_requests?state=merged&per_page=50`);
265
+ return all
266
+ .filter((mr) => mr.source_branch?.startsWith(`forge/issue-${issueIid}-`))
267
+ .map((mr) => this._mr(mr));
268
+ }
269
+ async getMR(mrIid) {
270
+ const raw = await this._req(`/projects/${this._enc()}/merge_requests/${mrIid}`);
271
+ return this._mr(raw);
272
+ }
273
+ async getMRDiffs(mrIid) {
274
+ const allDiffs = [];
275
+ let page = 1;
276
+ while (true) {
277
+ const items = await this._req(`/projects/${this._enc()}/merge_requests/${mrIid}/diffs?per_page=20&page=${page}`);
278
+ allDiffs.push(...items);
279
+ if (items.length < 20)
280
+ break;
281
+ page++;
282
+ }
283
+ return allDiffs.map((d) => this._diff(d));
284
+ }
285
+ async rebaseMR(mrIid) {
286
+ await this._req(`/projects/${this._enc()}/merge_requests/${mrIid}/rebase`, { method: "PUT" });
287
+ }
288
+ async setAutoMergeMR(mrIid) {
289
+ await this._req(`/projects/${this._enc()}/merge_requests/${mrIid}/merge`, { method: "PUT", body: JSON.stringify({ merge_when_pipeline_succeeds: true }) });
290
+ }
291
+ async cancelAutoMergeMR(mrIid) {
292
+ await this._req(`/projects/${this._enc()}/merge_requests/${mrIid}/cancel_merge_when_pipeline_succeeds`, { method: "POST" });
293
+ }
294
+ async mergeMR(mrIid) {
295
+ await this._req(`/projects/${this._enc()}/merge_requests/${mrIid}/merge`, { method: "PUT", body: JSON.stringify({ should_remove_source_branch: true }) });
296
+ }
297
+ async closeMR(mrIid) {
298
+ await this._req(`/projects/${this._enc()}/merge_requests/${mrIid}`, { method: "PUT", body: JSON.stringify({ state_event: "close" }) });
299
+ }
300
+ async reopenMR(mrIid) {
301
+ await this._req(`/projects/${this._enc()}/merge_requests/${mrIid}`, { method: "PUT", body: JSON.stringify({ state_event: "reopen" }) });
302
+ }
303
+ async setMRDraft(mrIid, draft) {
304
+ // GitLab marks an MR as draft by prefixing the title with "Draft: ".
305
+ // Fetch, adjust, and write back — the update endpoint has no boolean flag.
306
+ const current = await this._req(`/projects/${this._enc()}/merge_requests/${mrIid}`);
307
+ const title = String(current.title ?? "");
308
+ const stripped = title.replace(/^(Draft:|WIP:)\s*/i, "");
309
+ const nextTitle = draft ? `Draft: ${stripped}` : stripped;
310
+ if (nextTitle === title)
311
+ return;
312
+ await this._req(`/projects/${this._enc()}/merge_requests/${mrIid}`, { method: "PUT", body: JSON.stringify({ title: nextTitle }) });
313
+ }
314
+ // ─── CI / Pipelines ───────────────────────────────────────────────────────
315
+ async getMRPipelines(mrIid) {
316
+ const raw = await this._req(`/projects/${this._enc()}/merge_requests/${mrIid}/pipelines`);
317
+ return raw.map((p) => this._pipeline(p));
318
+ }
319
+ async getPipeline(pipelineId) {
320
+ const raw = await this._req(`/projects/${this._enc()}/pipelines/${pipelineId}`);
321
+ return this._pipeline(raw);
322
+ }
323
+ async getPipelineJobs(pipelineId) {
324
+ const raw = await this._req(`/projects/${this._enc()}/pipelines/${pipelineId}/jobs`);
325
+ return raw.map((j) => this._job(j));
326
+ }
327
+ async getJobTrace(jobId) {
328
+ const url = `${this._base}/projects/${this._enc()}/jobs/${jobId}/trace`;
329
+ const res = await fetch(url, { headers: this._headers() });
330
+ if (!res.ok) {
331
+ const text = await res.text().catch(() => "");
332
+ throw new Error(`GitLab ${res.status} on jobs/${jobId}/trace: ${text}`);
333
+ }
334
+ return res.text();
335
+ }
336
+ // ─── GitLab-specific extras ───────────────────────────────────────────────
337
+ async getPipelinesBySha(sha) {
338
+ const raw = await this._req(`/projects/${this._enc()}/pipelines?sha=${encodeURIComponent(sha)}&per_page=5`);
339
+ return raw.map((p) => this._pipeline(p));
340
+ }
341
+ async getPipelinesByRef(ref) {
342
+ const raw = await this._req(`/projects/${this._enc()}/pipelines?ref=${encodeURIComponent(ref)}&per_page=5`);
343
+ return raw.map((p) => this._pipeline(p));
344
+ }
345
+ async listBranchesByPrefix(prefix) {
346
+ const raw = await this._req(`/projects/${this._enc()}/repository/branches?search=^${encodeURIComponent(prefix)}&per_page=100`);
347
+ return raw.map((b) => b.name).filter((n) => n.startsWith(prefix));
348
+ }
349
+ async compareRefs(fromRef, toRef) {
350
+ try {
351
+ const raw = await this._req(`/projects/${this._enc()}/repository/compare?from=${encodeURIComponent(fromRef)}&to=${encodeURIComponent(toRef)}&straight=true`);
352
+ return { aheadCount: Array.isArray(raw.commits) ? raw.commits.length : 0 };
353
+ }
354
+ catch {
355
+ return null;
356
+ }
357
+ }
358
+ async listRecentMergedMRIssueLinks(limit = 50) {
359
+ const raw = await this._req(`/projects/${this._enc()}/merge_requests?state=merged&order_by=updated_at&per_page=${limit}`);
360
+ // Don't pre-filter on `closedIssueIids` — the route uses `sourceBranch`
361
+ // as a fallback signal when the MR description lacks a closing keyword.
362
+ return raw.map((mr) => ({
363
+ mrIid: mr.iid,
364
+ webUrl: mr.web_url,
365
+ mergedAt: mr.merged_at ?? null,
366
+ sourceBranch: mr.source_branch ?? null,
367
+ closedIssueIids: parseClosingIssueRefs(mr.description ?? ""),
368
+ }));
369
+ }
370
+ // ─── Environments ─────────────────────────────────────────────────────────
371
+ _environment(raw) {
372
+ return {
373
+ id: raw.id,
374
+ name: raw.name,
375
+ state: raw.state ?? "unknown",
376
+ external_url: raw.external_url ?? null,
377
+ // GitLab puts the branch ref on the last deployment's deployable.
378
+ ref: raw.last_deployment?.deployable?.ref
379
+ ?? raw.last_deployment?.ref
380
+ ?? null,
381
+ updated_at: raw.updated_at ?? null,
382
+ web_url: raw.web_url ?? null,
383
+ };
384
+ }
385
+ /**
386
+ * Pull environments for a given branch. GitLab's `/environments` endpoint
387
+ * doesn't filter by ref, so we fetch available+stopping envs and match on
388
+ * the last-deployment ref. Limits per_page to 100 — ephemeral envs should
389
+ * never grow past that per project.
390
+ */
391
+ async listEnvironmentsForBranch(branchName) {
392
+ if (!branchName)
393
+ return [];
394
+ const raw = await this._req(`/projects/${this._enc()}/environments?states=available&per_page=100`);
395
+ // GitLab's list response omits last_deployment — fetch detail per-env to
396
+ // learn the branch. Concurrency is bounded by the per_page=100 cap.
397
+ const detailed = await Promise.all(raw.map((e) => this._req(`/projects/${this._enc()}/environments/${e.id}`).then((r) => r, () => null)));
398
+ return detailed
399
+ .filter((e) => e !== null)
400
+ .map((e) => this._environment(e))
401
+ .filter((e) => e.ref === branchName);
402
+ }
403
+ async stopEnvironment(envId) {
404
+ await this._req(`/projects/${this._enc()}/environments/${envId}/stop`, { method: "POST" });
405
+ }
406
+ }
407
+ //# sourceMappingURL=gitlab.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"gitlab.js","sourceRoot":"","sources":["../../../../../server/forge/core/providers/gitlab.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,21 @@
1
+ /**
2
+ * server/forge/core/providers/index.ts
3
+ *
4
+ * Factory that creates the correct ScmProvider for a given repo string.
5
+ * Provider type is resolved in this order:
6
+ * 1. Per-repo prefix — "github:owner/repo", "azuredevops:org/project/repo"
7
+ * 2. SCM_PROVIDER env var — "gitlab" | "github" | "azuredevops"
8
+ * 3. Default: gitlab
9
+ */
10
+ import { GitLabProvider } from "./gitlab.ts";
11
+ import { GitHubProvider } from "./github.ts";
12
+ import { AzureDevOpsProvider } from "./azuredevops.ts";
13
+ import { ScmProvider } from "./base.ts";
14
+ /**
15
+ * @param {string} [repo] Raw repo string from request (may carry a "type:" prefix)
16
+ * @returns {import('./base.js').ScmProvider}
17
+ */
18
+ export declare function createProvider(repo?: string): ScmProvider;
19
+ export { GitLabProvider, GitHubProvider, AzureDevOpsProvider };
20
+ export { ScmProvider } from "./base.ts";
21
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../../server/forge/core/providers/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,OAAO,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC;AAC7C,OAAO,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC;AAC7C,OAAO,EAAE,mBAAmB,EAAE,MAAM,kBAAkB,CAAC;AACvD,OAAO,EAAE,WAAW,EAAE,MAAM,WAAW,CAAC;AAExC;;;GAGG;AACH,wBAAgB,cAAc,CAAC,IAAI,CAAC,EAAE,MAAM,GAAG,WAAW,CAyBzD;AAED,OAAO,EAAE,cAAc,EAAE,cAAc,EAAE,mBAAmB,EAAE,CAAC;AAC/D,OAAO,EAAE,WAAW,EAAE,MAAM,WAAW,CAAC"}
@@ -0,0 +1,43 @@
1
+ /**
2
+ * server/forge/core/providers/index.ts
3
+ *
4
+ * Factory that creates the correct ScmProvider for a given repo string.
5
+ * Provider type is resolved in this order:
6
+ * 1. Per-repo prefix — "github:owner/repo", "azuredevops:org/project/repo"
7
+ * 2. SCM_PROVIDER env var — "gitlab" | "github" | "azuredevops"
8
+ * 3. Default: gitlab
9
+ */
10
+ import { GitLabProvider } from "./gitlab.js";
11
+ import { GitHubProvider } from "./github.js";
12
+ import { AzureDevOpsProvider } from "./azuredevops.js";
13
+ /**
14
+ * @param {string} [repo] Raw repo string from request (may carry a "type:" prefix)
15
+ * @returns {import('./base.js').ScmProvider}
16
+ */
17
+ export function createProvider(repo) {
18
+ // Strip optional "provider:" prefix, e.g. "github:owner/repo"
19
+ let type = process.env.SCM_PROVIDER ?? "gitlab";
20
+ let repoPath = repo;
21
+ if (repo) {
22
+ const colonIdx = repo.indexOf(":");
23
+ if (colonIdx > 0) {
24
+ const prefix = repo.slice(0, colonIdx).toLowerCase();
25
+ if (["gitlab", "github", "azuredevops"].includes(prefix)) {
26
+ type = prefix;
27
+ repoPath = repo.slice(colonIdx + 1);
28
+ }
29
+ }
30
+ }
31
+ switch (type.toLowerCase()) {
32
+ case "github":
33
+ return new GitHubProvider(repoPath);
34
+ case "azuredevops":
35
+ case "azure":
36
+ return new AzureDevOpsProvider(repoPath);
37
+ default:
38
+ return new GitLabProvider(repoPath);
39
+ }
40
+ }
41
+ export { GitLabProvider, GitHubProvider, AzureDevOpsProvider };
42
+ export { ScmProvider } from "./base.js";
43
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../../server/forge/core/providers/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,OAAO,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC;AAC7C,OAAO,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC;AAC7C,OAAO,EAAE,mBAAmB,EAAE,MAAM,kBAAkB,CAAC;AAGvD;;;GAGG;AACH,MAAM,UAAU,cAAc,CAAC,IAAa;IAC3C,8DAA8D;IAC9D,IAAI,IAAI,GAAG,OAAO,CAAC,GAAG,CAAC,YAAY,IAAI,QAAQ,CAAC;IAChD,IAAI,QAAQ,GAAG,IAAI,CAAC;IAEpB,IAAI,IAAI,EAAE,CAAC;QACV,MAAM,QAAQ,GAAG,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;QACnC,IAAI,QAAQ,GAAG,CAAC,EAAE,CAAC;YAClB,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,QAAQ,CAAC,CAAC,WAAW,EAAE,CAAC;YACrD,IAAI,CAAC,QAAQ,EAAE,QAAQ,EAAE,aAAa,CAAC,CAAC,QAAQ,CAAC,MAAM,CAAC,EAAE,CAAC;gBAC1D,IAAI,GAAG,MAAM,CAAC;gBACd,QAAQ,GAAG,IAAI,CAAC,KAAK,CAAC,QAAQ,GAAG,CAAC,CAAC,CAAC;YACrC,CAAC;QACF,CAAC;IACF,CAAC;IAED,QAAQ,IAAI,CAAC,WAAW,EAAE,EAAE,CAAC;QAC5B,KAAK,QAAQ;YACZ,OAAO,IAAI,cAAc,CAAC,QAAQ,CAAC,CAAC;QACrC,KAAK,aAAa,CAAC;QACnB,KAAK,OAAO;YACX,OAAO,IAAI,mBAAmB,CAAC,QAAQ,CAAC,CAAC;QAC1C;YACC,OAAO,IAAI,cAAc,CAAC,QAAQ,CAAC,CAAC;IACtC,CAAC;AACF,CAAC;AAED,OAAO,EAAE,cAAc,EAAE,cAAc,EAAE,mBAAmB,EAAE,CAAC;AAC/D,OAAO,EAAE,WAAW,EAAE,MAAM,WAAW,CAAC"}
@@ -0,0 +1,80 @@
1
+ export interface NormalIssue {
2
+ iid: number;
3
+ title: string;
4
+ description: string | null;
5
+ labels: string[];
6
+ author: {
7
+ name: string;
8
+ };
9
+ created_at: string;
10
+ web_url: string;
11
+ forgeBranch?: string;
12
+ forgeBranchCommitsAhead?: number | null;
13
+ likelyFixedByMr?: {
14
+ iid: number;
15
+ web_url: string;
16
+ title: string;
17
+ } | null;
18
+ }
19
+ export interface NormalMR {
20
+ iid: number;
21
+ title: string;
22
+ web_url: string;
23
+ source_branch: string;
24
+ target_branch: string;
25
+ state: string;
26
+ has_conflicts: boolean;
27
+ rebase_in_progress: boolean;
28
+ merge_status: string;
29
+ detailed_merge_status: string | null;
30
+ draft: boolean;
31
+ head_pipeline: {
32
+ status: string;
33
+ web_url: string;
34
+ } | null;
35
+ author: {
36
+ name: string;
37
+ };
38
+ created_at: string;
39
+ merged_at: string | null;
40
+ merge_commit_sha: string | null;
41
+ merge_when_pipeline_succeeds?: boolean;
42
+ }
43
+ export interface NormalPipeline {
44
+ id: number;
45
+ status: string;
46
+ web_url: string;
47
+ created_at: string;
48
+ }
49
+ export interface NormalJob {
50
+ id: number;
51
+ name: string;
52
+ stage: string;
53
+ status: string;
54
+ web_url: string;
55
+ duration: number | null;
56
+ }
57
+ export interface NormalDiff {
58
+ old_path: string;
59
+ new_path: string;
60
+ diff: string;
61
+ new_file: boolean;
62
+ renamed_file: boolean;
63
+ deleted_file: boolean;
64
+ }
65
+ export interface CommitAction {
66
+ action: "create" | "modify" | "delete";
67
+ file_path: string;
68
+ content: string;
69
+ }
70
+ export interface NormalEnvironment {
71
+ id: number;
72
+ name: string;
73
+ state: "available" | "stopping" | "stopped" | string;
74
+ external_url: string | null;
75
+ ref: string | null;
76
+ updated_at: string | null;
77
+ web_url: string | null;
78
+ branchName?: string;
79
+ }
80
+ //# sourceMappingURL=types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../../../server/forge/core/providers/types.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,WAAW;IAC3B,GAAG,EAAE,MAAM,CAAC;IACZ,KAAK,EAAE,MAAM,CAAC;IACd,WAAW,EAAE,MAAM,GAAG,IAAI,CAAC;IAC3B,MAAM,EAAE,MAAM,EAAE,CAAC;IACjB,MAAM,EAAE;QAAE,IAAI,EAAE,MAAM,CAAA;KAAE,CAAC;IACzB,UAAU,EAAE,MAAM,CAAC;IACnB,OAAO,EAAE,MAAM,CAAC;IAChB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,uBAAuB,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IACxC,eAAe,CAAC,EAAE;QAAE,GAAG,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAA;KAAE,GAAG,IAAI,CAAC;CACzE;AAED,MAAM,WAAW,QAAQ;IACxB,GAAG,EAAE,MAAM,CAAC;IACZ,KAAK,EAAE,MAAM,CAAC;IACd,OAAO,EAAE,MAAM,CAAC;IAChB,aAAa,EAAE,MAAM,CAAC;IACtB,aAAa,EAAE,MAAM,CAAC;IACtB,KAAK,EAAE,MAAM,CAAC;IACd,aAAa,EAAE,OAAO,CAAC;IACvB,kBAAkB,EAAE,OAAO,CAAC;IAC5B,YAAY,EAAE,MAAM,CAAC;IACrB,qBAAqB,EAAE,MAAM,GAAG,IAAI,CAAC;IACrC,KAAK,EAAE,OAAO,CAAC;IACf,aAAa,EAAE;QAAE,MAAM,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,MAAM,CAAA;KAAE,GAAG,IAAI,CAAC;IAC1D,MAAM,EAAE;QAAE,IAAI,EAAE,MAAM,CAAA;KAAE,CAAC;IACzB,UAAU,EAAE,MAAM,CAAC;IACnB,SAAS,EAAE,MAAM,GAAG,IAAI,CAAC;IACzB,gBAAgB,EAAE,MAAM,GAAG,IAAI,CAAC;IAChC,4BAA4B,CAAC,EAAE,OAAO,CAAC;CACvC;AAED,MAAM,WAAW,cAAc;IAC9B,EAAE,EAAE,MAAM,CAAC;IACX,MAAM,EAAE,MAAM,CAAC;IACf,OAAO,EAAE,MAAM,CAAC;IAChB,UAAU,EAAE,MAAM,CAAC;CACnB;AAED,MAAM,WAAW,SAAS;IACzB,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,MAAM,CAAC;IACf,OAAO,EAAE,MAAM,CAAC;IAChB,QAAQ,EAAE,MAAM,GAAG,IAAI,CAAC;CACxB;AAED,MAAM,WAAW,UAAU;IAC1B,QAAQ,EAAE,MAAM,CAAC;IACjB,QAAQ,EAAE,MAAM,CAAC;IACjB,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,EAAE,OAAO,CAAC;IAClB,YAAY,EAAE,OAAO,CAAC;IACtB,YAAY,EAAE,OAAO,CAAC;CACtB;AAED,MAAM,WAAW,YAAY;IAC5B,MAAM,EAAE,QAAQ,GAAG,QAAQ,GAAG,QAAQ,CAAC;IACvC,SAAS,EAAE,MAAM,CAAC;IAClB,OAAO,EAAE,MAAM,CAAC;CAChB;AAED,MAAM,WAAW,iBAAiB;IACjC,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,WAAW,GAAG,UAAU,GAAG,SAAS,GAAG,MAAM,CAAC;IACrD,YAAY,EAAE,MAAM,GAAG,IAAI,CAAC;IAC5B,GAAG,EAAE,MAAM,GAAG,IAAI,CAAC;IACnB,UAAU,EAAE,MAAM,GAAG,IAAI,CAAC;IAC1B,OAAO,EAAE,MAAM,GAAG,IAAI,CAAC;IACvB,UAAU,CAAC,EAAE,MAAM,CAAC;CACpB"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../../../../../server/forge/core/providers/types.ts"],"names":[],"mappings":""}
@@ -0,0 +1,48 @@
1
+ /**
2
+ * server/forge/core/quotaClient.js
3
+ *
4
+ * One-off probe of the Anthropic Messages API to read the plan-level
5
+ * rate-limit headers. Used by the "Refresh quota" button in the UsageWidget.
6
+ *
7
+ * The rest of Forge still runs through `claude` CLI (subscription billing);
8
+ * this probe is the only place that spends API credits, and only when the
9
+ * user explicitly asks for it. Cost is negligible — one request with
10
+ * `max_tokens=1` against Haiku.
11
+ */
12
+ /**
13
+ * @param {Headers} headers
14
+ * @returns {null | {
15
+ * tokensLimit: number|null,
16
+ * tokensRemaining: number|null,
17
+ * tokensReset: string|null,
18
+ * requestsLimit: number|null,
19
+ * requestsRemaining: number|null,
20
+ * requestsReset: string|null,
21
+ * }}
22
+ */
23
+ export declare function parseRateLimit(headers: Headers): {
24
+ tokensLimit: number;
25
+ tokensRemaining: number;
26
+ tokensReset: string;
27
+ requestsLimit: number;
28
+ requestsRemaining: number;
29
+ requestsReset: string;
30
+ };
31
+ /**
32
+ * Fires one minimal Messages API request and returns the rate-limit snapshot
33
+ * from the response headers.
34
+ *
35
+ * @throws if ANTHROPIC_API_KEY is not configured, or the API rejects us.
36
+ */
37
+ export declare function probeQuota(): Promise<{
38
+ rateLimit: {
39
+ tokensLimit: number;
40
+ tokensRemaining: number;
41
+ tokensReset: string;
42
+ requestsLimit: number;
43
+ requestsRemaining: number;
44
+ requestsReset: string;
45
+ };
46
+ checkedAt: string;
47
+ }>;
48
+ //# sourceMappingURL=quotaClient.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"quotaClient.d.ts","sourceRoot":"","sources":["../../../../server/forge/core/quotaClient.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AASH;;;;;;;;;;GAUG;AACH,wBAAgB,cAAc,CAAC,OAAO,EAAE,OAAO;;;;;;;EAiB9C;AAED;;;;;GAKG;AACH,wBAAsB,UAAU;;;;;;;;;;GA8C/B"}