@vaporsoft/orc 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (223) hide show
  1. package/LICENSE +6 -0
  2. package/README.md +178 -0
  3. package/dist/bin/orc.d.ts +3 -0
  4. package/dist/bin/orc.d.ts.map +1 -0
  5. package/dist/bin/orc.js +4 -0
  6. package/dist/bin/orc.js.map +1 -0
  7. package/dist/src/cli.d.ts +6 -0
  8. package/dist/src/cli.d.ts.map +1 -0
  9. package/dist/src/cli.js +28 -0
  10. package/dist/src/cli.js.map +1 -0
  11. package/dist/src/commands/init.d.ts +6 -0
  12. package/dist/src/commands/init.d.ts.map +1 -0
  13. package/dist/src/commands/init.js +58 -0
  14. package/dist/src/commands/init.js.map +1 -0
  15. package/dist/src/commands/start.d.ts +17 -0
  16. package/dist/src/commands/start.d.ts.map +1 -0
  17. package/dist/src/commands/start.js +146 -0
  18. package/dist/src/commands/start.js.map +1 -0
  19. package/dist/src/constants.d.ts +18 -0
  20. package/dist/src/constants.d.ts.map +1 -0
  21. package/dist/src/constants.js +42 -0
  22. package/dist/src/constants.js.map +1 -0
  23. package/dist/src/core/comment-categorizer.d.ts +20 -0
  24. package/dist/src/core/comment-categorizer.d.ts.map +1 -0
  25. package/dist/src/core/comment-categorizer.js +208 -0
  26. package/dist/src/core/comment-categorizer.js.map +1 -0
  27. package/dist/src/core/comment-fetcher.d.ts +37 -0
  28. package/dist/src/core/comment-fetcher.d.ts.map +1 -0
  29. package/dist/src/core/comment-fetcher.js +138 -0
  30. package/dist/src/core/comment-fetcher.js.map +1 -0
  31. package/dist/src/core/daemon.d.ts +92 -0
  32. package/dist/src/core/daemon.d.ts.map +1 -0
  33. package/dist/src/core/daemon.js +896 -0
  34. package/dist/src/core/daemon.js.map +1 -0
  35. package/dist/src/core/fix-executor.d.ts +50 -0
  36. package/dist/src/core/fix-executor.d.ts.map +1 -0
  37. package/dist/src/core/fix-executor.js +374 -0
  38. package/dist/src/core/fix-executor.js.map +1 -0
  39. package/dist/src/core/git-manager.d.ts +44 -0
  40. package/dist/src/core/git-manager.d.ts.map +1 -0
  41. package/dist/src/core/git-manager.js +230 -0
  42. package/dist/src/core/git-manager.js.map +1 -0
  43. package/dist/src/core/pilot-config.d.ts +18 -0
  44. package/dist/src/core/pilot-config.d.ts.map +1 -0
  45. package/dist/src/core/pilot-config.js +76 -0
  46. package/dist/src/core/pilot-config.js.map +1 -0
  47. package/dist/src/core/progress-store.d.ts +32 -0
  48. package/dist/src/core/progress-store.d.ts.map +1 -0
  49. package/dist/src/core/progress-store.js +106 -0
  50. package/dist/src/core/progress-store.js.map +1 -0
  51. package/dist/src/core/repo-config.d.ts +11 -0
  52. package/dist/src/core/repo-config.d.ts.map +1 -0
  53. package/dist/src/core/repo-config.js +168 -0
  54. package/dist/src/core/repo-config.js.map +1 -0
  55. package/dist/src/core/session-controller.d.ts +61 -0
  56. package/dist/src/core/session-controller.d.ts.map +1 -0
  57. package/dist/src/core/session-controller.js +926 -0
  58. package/dist/src/core/session-controller.js.map +1 -0
  59. package/dist/src/core/thread-responder.d.ts +28 -0
  60. package/dist/src/core/thread-responder.d.ts.map +1 -0
  61. package/dist/src/core/thread-responder.js +193 -0
  62. package/dist/src/core/thread-responder.js.map +1 -0
  63. package/dist/src/core/worktree-manager.d.ts +26 -0
  64. package/dist/src/core/worktree-manager.d.ts.map +1 -0
  65. package/dist/src/core/worktree-manager.js +189 -0
  66. package/dist/src/core/worktree-manager.js.map +1 -0
  67. package/dist/src/github/gh-client.d.ts +57 -0
  68. package/dist/src/github/gh-client.d.ts.map +1 -0
  69. package/dist/src/github/gh-client.js +236 -0
  70. package/dist/src/github/gh-client.js.map +1 -0
  71. package/dist/src/github/queries.d.ts +9 -0
  72. package/dist/src/github/queries.d.ts.map +1 -0
  73. package/dist/src/github/queries.js +152 -0
  74. package/dist/src/github/queries.js.map +1 -0
  75. package/dist/src/github/types.d.ts +114 -0
  76. package/dist/src/github/types.d.ts.map +1 -0
  77. package/dist/src/github/types.js +3 -0
  78. package/dist/src/github/types.js.map +1 -0
  79. package/dist/src/tui/App.d.ts +8 -0
  80. package/dist/src/tui/App.d.ts.map +1 -0
  81. package/dist/src/tui/App.js +407 -0
  82. package/dist/src/tui/App.js.map +1 -0
  83. package/dist/src/tui/components/ActivityPane.d.ts +7 -0
  84. package/dist/src/tui/components/ActivityPane.d.ts.map +1 -0
  85. package/dist/src/tui/components/ActivityPane.js +10 -0
  86. package/dist/src/tui/components/ActivityPane.js.map +1 -0
  87. package/dist/src/tui/components/DetailPanel.d.ts +15 -0
  88. package/dist/src/tui/components/DetailPanel.d.ts.map +1 -0
  89. package/dist/src/tui/components/DetailPanel.js +137 -0
  90. package/dist/src/tui/components/DetailPanel.js.map +1 -0
  91. package/dist/src/tui/components/DrillInOverlay.d.ts +13 -0
  92. package/dist/src/tui/components/DrillInOverlay.d.ts.map +1 -0
  93. package/dist/src/tui/components/DrillInOverlay.js +85 -0
  94. package/dist/src/tui/components/DrillInOverlay.js.map +1 -0
  95. package/dist/src/tui/components/ExpandedContent.d.ts +10 -0
  96. package/dist/src/tui/components/ExpandedContent.d.ts.map +1 -0
  97. package/dist/src/tui/components/ExpandedContent.js +99 -0
  98. package/dist/src/tui/components/ExpandedContent.js.map +1 -0
  99. package/dist/src/tui/components/Header.d.ts +12 -0
  100. package/dist/src/tui/components/Header.d.ts.map +1 -0
  101. package/dist/src/tui/components/Header.js +35 -0
  102. package/dist/src/tui/components/Header.js.map +1 -0
  103. package/dist/src/tui/components/HelpBar.d.ts +2 -0
  104. package/dist/src/tui/components/HelpBar.d.ts.map +1 -0
  105. package/dist/src/tui/components/HelpBar.js +11 -0
  106. package/dist/src/tui/components/HelpBar.js.map +1 -0
  107. package/dist/src/tui/components/KeybindLegend.d.ts +7 -0
  108. package/dist/src/tui/components/KeybindLegend.d.ts.map +1 -0
  109. package/dist/src/tui/components/KeybindLegend.js +53 -0
  110. package/dist/src/tui/components/KeybindLegend.js.map +1 -0
  111. package/dist/src/tui/components/LogPane.d.ts +11 -0
  112. package/dist/src/tui/components/LogPane.d.ts.map +1 -0
  113. package/dist/src/tui/components/LogPane.js +31 -0
  114. package/dist/src/tui/components/LogPane.js.map +1 -0
  115. package/dist/src/tui/components/SessionList.d.ts +14 -0
  116. package/dist/src/tui/components/SessionList.d.ts.map +1 -0
  117. package/dist/src/tui/components/SessionList.js +31 -0
  118. package/dist/src/tui/components/SessionList.js.map +1 -0
  119. package/dist/src/tui/components/SessionRow.d.ts +10 -0
  120. package/dist/src/tui/components/SessionRow.d.ts.map +1 -0
  121. package/dist/src/tui/components/SessionRow.js +52 -0
  122. package/dist/src/tui/components/SessionRow.js.map +1 -0
  123. package/dist/src/tui/components/SettingsPanel.d.ts +8 -0
  124. package/dist/src/tui/components/SettingsPanel.d.ts.map +1 -0
  125. package/dist/src/tui/components/SettingsPanel.js +191 -0
  126. package/dist/src/tui/components/SettingsPanel.js.map +1 -0
  127. package/dist/src/tui/components/StatusBadge.d.ts +9 -0
  128. package/dist/src/tui/components/StatusBadge.d.ts.map +1 -0
  129. package/dist/src/tui/components/StatusBadge.js +52 -0
  130. package/dist/src/tui/components/StatusBadge.js.map +1 -0
  131. package/dist/src/tui/components/Toolbar.d.ts +5 -0
  132. package/dist/src/tui/components/Toolbar.d.ts.map +1 -0
  133. package/dist/src/tui/components/Toolbar.js +2 -0
  134. package/dist/src/tui/components/Toolbar.js.map +1 -0
  135. package/dist/src/tui/components/comment-constants.d.ts +4 -0
  136. package/dist/src/tui/components/comment-constants.d.ts.map +1 -0
  137. package/dist/src/tui/components/comment-constants.js +15 -0
  138. package/dist/src/tui/components/comment-constants.js.map +1 -0
  139. package/dist/src/tui/hooks/logFlushUtils.d.ts +15 -0
  140. package/dist/src/tui/hooks/logFlushUtils.d.ts.map +1 -0
  141. package/dist/src/tui/hooks/logFlushUtils.js +33 -0
  142. package/dist/src/tui/hooks/logFlushUtils.js.map +1 -0
  143. package/dist/src/tui/hooks/useBranchLogs.d.ts +7 -0
  144. package/dist/src/tui/hooks/useBranchLogs.d.ts.map +1 -0
  145. package/dist/src/tui/hooks/useBranchLogs.js +58 -0
  146. package/dist/src/tui/hooks/useBranchLogs.js.map +1 -0
  147. package/dist/src/tui/hooks/useDaemonState.d.ts +19 -0
  148. package/dist/src/tui/hooks/useDaemonState.d.ts.map +1 -0
  149. package/dist/src/tui/hooks/useDaemonState.js +152 -0
  150. package/dist/src/tui/hooks/useDaemonState.js.map +1 -0
  151. package/dist/src/tui/hooks/useInitialDiscovery.d.ts +8 -0
  152. package/dist/src/tui/hooks/useInitialDiscovery.d.ts.map +1 -0
  153. package/dist/src/tui/hooks/useInitialDiscovery.js +31 -0
  154. package/dist/src/tui/hooks/useInitialDiscovery.js.map +1 -0
  155. package/dist/src/tui/hooks/useLogBuffer.d.ts +7 -0
  156. package/dist/src/tui/hooks/useLogBuffer.d.ts.map +1 -0
  157. package/dist/src/tui/hooks/useLogBuffer.js +52 -0
  158. package/dist/src/tui/hooks/useLogBuffer.js.map +1 -0
  159. package/dist/src/tui/hooks/useNextCheckCountdown.d.ts +7 -0
  160. package/dist/src/tui/hooks/useNextCheckCountdown.d.ts.map +1 -0
  161. package/dist/src/tui/hooks/useNextCheckCountdown.js +42 -0
  162. package/dist/src/tui/hooks/useNextCheckCountdown.js.map +1 -0
  163. package/dist/src/tui/hooks/useTerminalFocus.d.ts +9 -0
  164. package/dist/src/tui/hooks/useTerminalFocus.d.ts.map +1 -0
  165. package/dist/src/tui/hooks/useTerminalFocus.js +43 -0
  166. package/dist/src/tui/hooks/useTerminalFocus.js.map +1 -0
  167. package/dist/src/tui/theme.d.ts +32 -0
  168. package/dist/src/tui/theme.d.ts.map +1 -0
  169. package/dist/src/tui/theme.js +61 -0
  170. package/dist/src/tui/theme.js.map +1 -0
  171. package/dist/src/types/config.d.ts +35 -0
  172. package/dist/src/types/config.d.ts.map +1 -0
  173. package/dist/src/types/config.js +14 -0
  174. package/dist/src/types/config.js.map +1 -0
  175. package/dist/src/types/index.d.ts +107 -0
  176. package/dist/src/types/index.d.ts.map +1 -0
  177. package/dist/src/types/index.js +3 -0
  178. package/dist/src/types/index.js.map +1 -0
  179. package/dist/src/utils/concurrency.d.ts +7 -0
  180. package/dist/src/utils/concurrency.d.ts.map +1 -0
  181. package/dist/src/utils/concurrency.js +26 -0
  182. package/dist/src/utils/concurrency.js.map +1 -0
  183. package/dist/src/utils/format.d.ts +2 -0
  184. package/dist/src/utils/format.d.ts.map +1 -0
  185. package/dist/src/utils/format.js +8 -0
  186. package/dist/src/utils/format.js.map +1 -0
  187. package/dist/src/utils/logger.d.ts +39 -0
  188. package/dist/src/utils/logger.d.ts.map +1 -0
  189. package/dist/src/utils/logger.js +120 -0
  190. package/dist/src/utils/logger.js.map +1 -0
  191. package/dist/src/utils/notify.d.ts +6 -0
  192. package/dist/src/utils/notify.d.ts.map +1 -0
  193. package/dist/src/utils/notify.js +15 -0
  194. package/dist/src/utils/notify.js.map +1 -0
  195. package/dist/src/utils/open-terminal.d.ts +12 -0
  196. package/dist/src/utils/open-terminal.d.ts.map +1 -0
  197. package/dist/src/utils/open-terminal.js +93 -0
  198. package/dist/src/utils/open-terminal.js.map +1 -0
  199. package/dist/src/utils/process.d.ts +14 -0
  200. package/dist/src/utils/process.d.ts.map +1 -0
  201. package/dist/src/utils/process.js +36 -0
  202. package/dist/src/utils/process.js.map +1 -0
  203. package/dist/src/utils/project-detector.d.ts +12 -0
  204. package/dist/src/utils/project-detector.d.ts.map +1 -0
  205. package/dist/src/utils/project-detector.js +123 -0
  206. package/dist/src/utils/project-detector.js.map +1 -0
  207. package/dist/src/utils/quoting.d.ts +15 -0
  208. package/dist/src/utils/quoting.d.ts.map +1 -0
  209. package/dist/src/utils/quoting.js +39 -0
  210. package/dist/src/utils/quoting.js.map +1 -0
  211. package/dist/src/utils/retry.d.ts +14 -0
  212. package/dist/src/utils/retry.d.ts.map +1 -0
  213. package/dist/src/utils/retry.js +41 -0
  214. package/dist/src/utils/retry.js.map +1 -0
  215. package/dist/src/utils/settings.d.ts +14 -0
  216. package/dist/src/utils/settings.d.ts.map +1 -0
  217. package/dist/src/utils/settings.js +21 -0
  218. package/dist/src/utils/settings.js.map +1 -0
  219. package/dist/src/utils/time.d.ts +2 -0
  220. package/dist/src/utils/time.d.ts.map +1 -0
  221. package/dist/src/utils/time.js +5 -0
  222. package/dist/src/utils/time.js.map +1 -0
  223. package/package.json +73 -0
@@ -0,0 +1,35 @@
1
+ import { z } from "zod";
2
+ export declare const ConfigSchema: z.ZodObject<{
3
+ pollInterval: z.ZodDefault<z.ZodNumber>;
4
+ confidence: z.ZodDefault<z.ZodNumber>;
5
+ model: z.ZodDefault<z.ZodString>;
6
+ sessionTimeout: z.ZodDefault<z.ZodNumber>;
7
+ claudeTimeout: z.ZodDefault<z.ZodNumber>;
8
+ dryRun: z.ZodDefault<z.ZodBoolean>;
9
+ verbose: z.ZodDefault<z.ZodBoolean>;
10
+ writeLogs: z.ZodDefault<z.ZodBoolean>;
11
+ theme: z.ZodDefault<z.ZodEnum<["dark", "light"]>>;
12
+ }, "strip", z.ZodTypeAny, {
13
+ confidence: number;
14
+ pollInterval: number;
15
+ model: string;
16
+ sessionTimeout: number;
17
+ claudeTimeout: number;
18
+ dryRun: boolean;
19
+ verbose: boolean;
20
+ writeLogs: boolean;
21
+ theme: "dark" | "light";
22
+ }, {
23
+ confidence?: number | undefined;
24
+ pollInterval?: number | undefined;
25
+ model?: string | undefined;
26
+ sessionTimeout?: number | undefined;
27
+ claudeTimeout?: number | undefined;
28
+ dryRun?: boolean | undefined;
29
+ verbose?: boolean | undefined;
30
+ writeLogs?: boolean | undefined;
31
+ theme?: "dark" | "light" | undefined;
32
+ }>;
33
+ export type Config = z.infer<typeof ConfigSchema>;
34
+ export declare const DEFAULT_CONFIG: Config;
35
+ //# sourceMappingURL=config.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../../../src/types/config.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB,eAAO,MAAM,YAAY;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAUvB,CAAC;AAEH,MAAM,MAAM,MAAM,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,YAAY,CAAC,CAAC;AAElD,eAAO,MAAM,cAAc,EAAE,MAA+B,CAAC"}
@@ -0,0 +1,14 @@
1
+ import { z } from "zod";
2
+ export const ConfigSchema = z.object({
3
+ pollInterval: z.number().int().positive().default(30),
4
+ confidence: z.number().min(0).max(1).default(0.75),
5
+ model: z.string().default("sonnet"),
6
+ sessionTimeout: z.number().nonnegative().default(0),
7
+ claudeTimeout: z.number().int().positive().default(900),
8
+ dryRun: z.boolean().default(false),
9
+ verbose: z.boolean().default(false),
10
+ writeLogs: z.boolean().default(false),
11
+ theme: z.enum(["dark", "light"]).default("dark"),
12
+ });
13
+ export const DEFAULT_CONFIG = ConfigSchema.parse({});
14
+ //# sourceMappingURL=config.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"config.js","sourceRoot":"","sources":["../../../src/types/config.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB,MAAM,CAAC,MAAM,YAAY,GAAG,CAAC,CAAC,MAAM,CAAC;IACnC,YAAY,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,EAAE,CAAC,QAAQ,EAAE,CAAC,OAAO,CAAC,EAAE,CAAC;IACrD,UAAU,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,IAAI,CAAC;IAClD,KAAK,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,OAAO,CAAC,QAAQ,CAAC;IACnC,cAAc,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,WAAW,EAAE,CAAC,OAAO,CAAC,CAAC,CAAC;IACnD,aAAa,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,EAAE,CAAC,QAAQ,EAAE,CAAC,OAAO,CAAC,GAAG,CAAC;IACvD,MAAM,EAAE,CAAC,CAAC,OAAO,EAAE,CAAC,OAAO,CAAC,KAAK,CAAC;IAClC,OAAO,EAAE,CAAC,CAAC,OAAO,EAAE,CAAC,OAAO,CAAC,KAAK,CAAC;IACnC,SAAS,EAAE,CAAC,CAAC,OAAO,EAAE,CAAC,OAAO,CAAC,KAAK,CAAC;IACrC,KAAK,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,CAAC,OAAO,CAAC,MAAM,CAAC;CACjD,CAAC,CAAC;AAIH,MAAM,CAAC,MAAM,cAAc,GAAW,YAAY,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC"}
@@ -0,0 +1,107 @@
1
+ /** Core domain types for Orc. */
2
+ export interface ReviewThread {
3
+ id: string;
4
+ /** GraphQL node ID for mutations. */
5
+ threadId: string;
6
+ path: string;
7
+ line: number | null;
8
+ body: string;
9
+ author: string;
10
+ isResolved: boolean;
11
+ /** Diff hunk surrounding this comment. */
12
+ diffHunk: string;
13
+ /** When the comment was created. */
14
+ createdAt: string;
15
+ }
16
+ export type CommentCategory = "must_fix" | "should_fix" | "nice_to_have" | "false_positive" | "verify_and_fix" | "needs_clarification";
17
+ export interface CategorizedComment {
18
+ threadId: string;
19
+ path: string;
20
+ line: number | null;
21
+ body: string;
22
+ author: string;
23
+ diffHunk: string;
24
+ category: CommentCategory;
25
+ confidence: number;
26
+ reasoning: string;
27
+ suggestedAction: string;
28
+ /** Question to ask the reviewer when category is needs_clarification. */
29
+ clarificationQuestion?: string;
30
+ }
31
+ export interface CommentSummary {
32
+ total: number;
33
+ mustFix: number;
34
+ shouldFix: number;
35
+ niceToHave: number;
36
+ falsePositive: number;
37
+ verifyAndFix: number;
38
+ needsClarification: number;
39
+ comments: CategorizedComment[];
40
+ }
41
+ export interface CycleRecord {
42
+ startedAt: string;
43
+ completedAt: string | null;
44
+ commentsSeen: number;
45
+ commentsFixed: number;
46
+ costUsd: number;
47
+ inputTokens: number;
48
+ outputTokens: number;
49
+ }
50
+ export interface RepoConfig {
51
+ instructions: string;
52
+ setupCommands: string[];
53
+ verifyCommands: string[];
54
+ allowedCommands: string[];
55
+ autoFix: {
56
+ must_fix: boolean;
57
+ should_fix: boolean;
58
+ nice_to_have: boolean;
59
+ verify_and_fix: boolean;
60
+ needs_clarification: boolean;
61
+ };
62
+ }
63
+ export type CIStatus = "pending" | "passing" | "failing" | "unknown";
64
+ export interface FailedCheck {
65
+ id: number;
66
+ name: string;
67
+ htmlUrl: string;
68
+ logSnippet: string | null;
69
+ }
70
+ export type SessionMode = "once" | "watch";
71
+ export type BranchStatus = "stopped" | "initializing" | "watching" | "triaging" | "fixing" | "verifying" | "pushing" | "replying" | "ready" | "conflict_prompt" | "error" | "merged";
72
+ export interface BranchState {
73
+ branch: string;
74
+ prNumber: number | null;
75
+ prUrl: string | null;
76
+ status: BranchStatus;
77
+ mode: SessionMode;
78
+ commentsAddressed: number;
79
+ totalCostUsd: number;
80
+ totalInputTokens: number;
81
+ totalOutputTokens: number;
82
+ error: string | null;
83
+ unresolvedCount: number;
84
+ commentSummary: CommentSummary | null;
85
+ lastPushAt: string | null;
86
+ claudeActivity: string[];
87
+ lastSessionId: string | null;
88
+ workDir: string | null;
89
+ /** Timestamp (ms since epoch) when the watch session will expire. null if not a watch session. */
90
+ sessionExpiresAt: number | null;
91
+ /** Persistent progress — accumulated across sessions and daemon restarts. */
92
+ lifetimeAddressed: number;
93
+ lifetimeSeen: number;
94
+ cycleCount: number;
95
+ cycleHistory: CycleRecord[];
96
+ ciStatus: CIStatus;
97
+ failedChecks: FailedCheck[];
98
+ ciFixAttempts: number;
99
+ conflicted: string[];
100
+ hasFixupCommits: boolean;
101
+ }
102
+ export interface SessionControllerEvents {
103
+ statusChange: (branch: string, status: BranchStatus) => void;
104
+ error: (branch: string, error: string) => void;
105
+ ready: (branch: string, state: BranchState) => void;
106
+ }
107
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/types/index.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ /** Core domain types for Orc. */
2
+ export {};
3
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/types/index.ts"],"names":[],"mappings":"AAAA,iCAAiC"}
@@ -0,0 +1,7 @@
1
+ /**
2
+ * Run an async function over an array with a concurrency limit.
3
+ * Like Promise.all(items.map(fn)) but at most `concurrency` items in flight.
4
+ * If any worker throws, remaining workers stop processing new items.
5
+ */
6
+ export declare function mapWithConcurrency<T, R>(items: T[], concurrency: number, fn: (item: T) => Promise<R>): Promise<R[]>;
7
+ //# sourceMappingURL=concurrency.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"concurrency.d.ts","sourceRoot":"","sources":["../../../src/utils/concurrency.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AACH,wBAAsB,kBAAkB,CAAC,CAAC,EAAE,CAAC,EAC3C,KAAK,EAAE,CAAC,EAAE,EACV,WAAW,EAAE,MAAM,EACnB,EAAE,EAAE,CAAC,IAAI,EAAE,CAAC,KAAK,OAAO,CAAC,CAAC,CAAC,GAC1B,OAAO,CAAC,CAAC,EAAE,CAAC,CAuBd"}
@@ -0,0 +1,26 @@
1
+ /**
2
+ * Run an async function over an array with a concurrency limit.
3
+ * Like Promise.all(items.map(fn)) but at most `concurrency` items in flight.
4
+ * If any worker throws, remaining workers stop processing new items.
5
+ */
6
+ export async function mapWithConcurrency(items, concurrency, fn) {
7
+ const results = new Array(items.length);
8
+ let nextIndex = 0;
9
+ let cancelled = false;
10
+ async function worker() {
11
+ while (!cancelled && nextIndex < items.length) {
12
+ const i = nextIndex++;
13
+ try {
14
+ results[i] = await fn(items[i]);
15
+ }
16
+ catch (err) {
17
+ cancelled = true;
18
+ throw err;
19
+ }
20
+ }
21
+ }
22
+ const workers = Array.from({ length: Math.min(concurrency, items.length) }, () => worker());
23
+ await Promise.all(workers);
24
+ return results;
25
+ }
26
+ //# sourceMappingURL=concurrency.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"concurrency.js","sourceRoot":"","sources":["../../../src/utils/concurrency.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AACH,MAAM,CAAC,KAAK,UAAU,kBAAkB,CACtC,KAAU,EACV,WAAmB,EACnB,EAA2B;IAE3B,MAAM,OAAO,GAAQ,IAAI,KAAK,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC;IAC7C,IAAI,SAAS,GAAG,CAAC,CAAC;IAClB,IAAI,SAAS,GAAG,KAAK,CAAC;IAEtB,KAAK,UAAU,MAAM;QACnB,OAAO,CAAC,SAAS,IAAI,SAAS,GAAG,KAAK,CAAC,MAAM,EAAE,CAAC;YAC9C,MAAM,CAAC,GAAG,SAAS,EAAE,CAAC;YACtB,IAAI,CAAC;gBACH,OAAO,CAAC,CAAC,CAAC,GAAG,MAAM,EAAE,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC;YAClC,CAAC;YAAC,OAAO,GAAG,EAAE,CAAC;gBACb,SAAS,GAAG,IAAI,CAAC;gBACjB,MAAM,GAAG,CAAC;YACZ,CAAC;QACH,CAAC;IACH,CAAC;IAED,MAAM,OAAO,GAAG,KAAK,CAAC,IAAI,CACxB,EAAE,MAAM,EAAE,IAAI,CAAC,GAAG,CAAC,WAAW,EAAE,KAAK,CAAC,MAAM,CAAC,EAAE,EAC/C,GAAG,EAAE,CAAC,MAAM,EAAE,CACf,CAAC;IACF,MAAM,OAAO,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;IAC3B,OAAO,OAAO,CAAC;AACjB,CAAC"}
@@ -0,0 +1,2 @@
1
+ export declare function formatTokens(n: number): string;
2
+ //# sourceMappingURL=format.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"format.d.ts","sourceRoot":"","sources":["../../../src/utils/format.ts"],"names":[],"mappings":"AAAA,wBAAgB,YAAY,CAAC,CAAC,EAAE,MAAM,GAAG,MAAM,CAI9C"}
@@ -0,0 +1,8 @@
1
+ export function formatTokens(n) {
2
+ if (n >= 1_000_000)
3
+ return `${(n / 1_000_000).toFixed(1)}M`;
4
+ if (n >= 1_000)
5
+ return `${(n / 1_000).toFixed(1)}k`;
6
+ return String(n);
7
+ }
8
+ //# sourceMappingURL=format.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"format.js","sourceRoot":"","sources":["../../../src/utils/format.ts"],"names":[],"mappings":"AAAA,MAAM,UAAU,YAAY,CAAC,CAAS;IACpC,IAAI,CAAC,IAAI,SAAS;QAAE,OAAO,GAAG,CAAC,CAAC,GAAG,SAAS,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,GAAG,CAAC;IAC5D,IAAI,CAAC,IAAI,KAAK;QAAE,OAAO,GAAG,CAAC,CAAC,GAAG,KAAK,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,GAAG,CAAC;IACpD,OAAO,MAAM,CAAC,CAAC,CAAC,CAAC;AACnB,CAAC"}
@@ -0,0 +1,39 @@
1
+ import { EventEmitter } from "node:events";
2
+ export type LogLevel = "debug" | "info" | "warn" | "error";
3
+ export interface LogEntry {
4
+ timestamp: string;
5
+ level: LogLevel;
6
+ branch: string | null;
7
+ message: string;
8
+ data?: unknown;
9
+ }
10
+ /**
11
+ * Structured logger that writes to a file and emits events for the UI.
12
+ *
13
+ * When a log path is provided (via --write-logs), each entry is appended to
14
+ * disk immediately. Every 60 seconds, entries older than 10 minutes are pruned
15
+ * and the file is rewritten with only the recent entries.
16
+ */
17
+ declare class Logger extends EventEmitter {
18
+ private logFile;
19
+ private logPath;
20
+ private entries;
21
+ private pruneTimer;
22
+ private verbose;
23
+ private suppressConsole;
24
+ private branchBuffers;
25
+ setSuppressConsole(v: boolean): void;
26
+ init(logPath?: string, verbose?: boolean): void;
27
+ private log;
28
+ debug(message: string, branch?: string, data?: unknown): void;
29
+ info(message: string, branch?: string, data?: unknown): void;
30
+ warn(message: string, branch?: string, data?: unknown): void;
31
+ error(message: string, branch?: string, data?: unknown): void;
32
+ dumpBranchLogs(branch: string, outputPath: string): void;
33
+ /** Prune entries older than 10 minutes and rewrite the log file. */
34
+ private prune;
35
+ close(): void;
36
+ }
37
+ export declare const logger: Logger;
38
+ export {};
39
+ //# sourceMappingURL=logger.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"logger.d.ts","sourceRoot":"","sources":["../../../src/utils/logger.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAQ3C,MAAM,MAAM,QAAQ,GAAG,OAAO,GAAG,MAAM,GAAG,MAAM,GAAG,OAAO,CAAC;AAE3D,MAAM,WAAW,QAAQ;IACvB,SAAS,EAAE,MAAM,CAAC;IAClB,KAAK,EAAE,QAAQ,CAAC;IAChB,MAAM,EAAE,MAAM,GAAG,IAAI,CAAC;IACtB,OAAO,EAAE,MAAM,CAAC;IAChB,IAAI,CAAC,EAAE,OAAO,CAAC;CAChB;AAED;;;;;;GAMG;AACH,cAAM,MAAO,SAAQ,YAAY;IAC/B,OAAO,CAAC,OAAO,CAA+B;IAC9C,OAAO,CAAC,OAAO,CAAuB;IACtC,OAAO,CAAC,OAAO,CAAkB;IACjC,OAAO,CAAC,UAAU,CAA+C;IACjE,OAAO,CAAC,OAAO,CAAS;IACxB,OAAO,CAAC,eAAe,CAAS;IAChC,OAAO,CAAC,aAAa,CAAiC;IAEtD,kBAAkB,CAAC,CAAC,EAAE,OAAO,GAAG,IAAI;IAIpC,IAAI,CAAC,OAAO,CAAC,EAAE,MAAM,EAAE,OAAO,UAAQ,GAAG,IAAI;IAc7C,OAAO,CAAC,GAAG;IAyCX,KAAK,CAAC,OAAO,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,OAAO,GAAG,IAAI;IAI7D,IAAI,CAAC,OAAO,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,OAAO,GAAG,IAAI;IAI5D,IAAI,CAAC,OAAO,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,OAAO,GAAG,IAAI;IAI5D,KAAK,CAAC,OAAO,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,OAAO,GAAG,IAAI;IAI7D,cAAc,CAAC,MAAM,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,GAAG,IAAI;IASxD,oEAAoE;IACpE,OAAO,CAAC,KAAK;IAoBb,KAAK,IAAI,IAAI;CAOd;AAED,eAAO,MAAM,MAAM,QAAe,CAAC"}
@@ -0,0 +1,120 @@
1
+ import { EventEmitter } from "node:events";
2
+ import * as fs from "node:fs";
3
+ import * as path from "node:path";
4
+ const MAX_BRANCH_BUFFER = 500;
5
+ const LOG_MAX_AGE_MS = 10 * 60 * 1000; // 10 minutes
6
+ const PRUNE_INTERVAL_MS = 60_000; // 1 minute
7
+ /**
8
+ * Structured logger that writes to a file and emits events for the UI.
9
+ *
10
+ * When a log path is provided (via --write-logs), each entry is appended to
11
+ * disk immediately. Every 60 seconds, entries older than 10 minutes are pruned
12
+ * and the file is rewritten with only the recent entries.
13
+ */
14
+ class Logger extends EventEmitter {
15
+ logFile = null;
16
+ logPath = null;
17
+ entries = [];
18
+ pruneTimer = null;
19
+ verbose = false;
20
+ suppressConsole = false;
21
+ branchBuffers = new Map();
22
+ setSuppressConsole(v) {
23
+ this.suppressConsole = v;
24
+ }
25
+ init(logPath, verbose = false) {
26
+ this.verbose = verbose;
27
+ if (logPath) {
28
+ const dir = path.dirname(logPath);
29
+ if (dir !== ".")
30
+ fs.mkdirSync(dir, { recursive: true });
31
+ this.logPath = logPath;
32
+ // Start fresh
33
+ fs.writeFileSync(logPath, "");
34
+ this.logFile = fs.createWriteStream(logPath, { flags: "a" });
35
+ this.pruneTimer = setInterval(() => this.prune(), PRUNE_INTERVAL_MS);
36
+ this.pruneTimer.unref();
37
+ }
38
+ }
39
+ log(level, message, branch = null, data) {
40
+ const entry = {
41
+ timestamp: new Date().toISOString(),
42
+ level,
43
+ branch,
44
+ message,
45
+ data,
46
+ };
47
+ // Write to log file immediately
48
+ if (this.logFile) {
49
+ this.logFile.write(JSON.stringify(entry) + "\n");
50
+ this.entries.push(entry);
51
+ }
52
+ // Buffer per-branch logs for dump
53
+ if (branch) {
54
+ let buf = this.branchBuffers.get(branch);
55
+ if (!buf) {
56
+ buf = [];
57
+ this.branchBuffers.set(branch, buf);
58
+ }
59
+ buf.push(entry);
60
+ if (buf.length > MAX_BRANCH_BUFFER) {
61
+ buf.splice(0, buf.length - MAX_BRANCH_BUFFER);
62
+ }
63
+ }
64
+ // Emit for UI consumption
65
+ this.emit("log", entry);
66
+ // Console output (suppressed when TUI is active)
67
+ if (!this.suppressConsole && (this.verbose || level !== "debug")) {
68
+ const prefix = branch ? `[${branch}]` : "";
69
+ const levelTag = level.toUpperCase().padEnd(5);
70
+ console.error(`${entry.timestamp} ${levelTag} ${prefix} ${message}`);
71
+ }
72
+ }
73
+ debug(message, branch, data) {
74
+ this.log("debug", message, branch ?? null, data);
75
+ }
76
+ info(message, branch, data) {
77
+ this.log("info", message, branch ?? null, data);
78
+ }
79
+ warn(message, branch, data) {
80
+ this.log("warn", message, branch ?? null, data);
81
+ }
82
+ error(message, branch, data) {
83
+ this.log("error", message, branch ?? null, data);
84
+ }
85
+ dumpBranchLogs(branch, outputPath) {
86
+ const entries = this.branchBuffers.get(branch) ?? [];
87
+ const lines = entries.map(e => {
88
+ const level = e.level.toUpperCase().padEnd(5);
89
+ return `${e.timestamp} ${level} ${e.message}`;
90
+ });
91
+ fs.writeFileSync(outputPath, lines.join("\n") + "\n");
92
+ }
93
+ /** Prune entries older than 10 minutes and rewrite the log file. */
94
+ prune(reopen = true) {
95
+ if (!this.logPath)
96
+ return;
97
+ const cutoff = Date.now() - LOG_MAX_AGE_MS;
98
+ this.entries = this.entries.filter((e) => new Date(e.timestamp).getTime() >= cutoff);
99
+ // Destroy current stream synchronously (discards buffered data which is fine
100
+ // since we're about to rewrite the file with the authoritative entries array)
101
+ this.logFile?.destroy();
102
+ this.logFile = null;
103
+ const content = this.entries.length > 0
104
+ ? this.entries.map((e) => JSON.stringify(e)).join("\n") + "\n"
105
+ : "";
106
+ fs.writeFileSync(this.logPath, content);
107
+ if (reopen) {
108
+ this.logFile = fs.createWriteStream(this.logPath, { flags: "a" });
109
+ }
110
+ }
111
+ close() {
112
+ if (this.pruneTimer) {
113
+ clearInterval(this.pruneTimer);
114
+ this.pruneTimer = null;
115
+ }
116
+ this.prune(false);
117
+ }
118
+ }
119
+ export const logger = new Logger();
120
+ //# sourceMappingURL=logger.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"logger.js","sourceRoot":"","sources":["../../../src/utils/logger.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,6 @@
1
+ /**
2
+ * Send a desktop notification. Falls back to terminal bell if
3
+ * node-notifier isn't available.
4
+ */
5
+ export declare function notify(title: string, message: string): void;
6
+ //# sourceMappingURL=notify.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"notify.d.ts","sourceRoot":"","sources":["../../../src/utils/notify.ts"],"names":[],"mappings":"AAEA;;;GAGG;AACH,wBAAgB,MAAM,CAAC,KAAK,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,IAAI,CAO3D"}
@@ -0,0 +1,15 @@
1
+ import notifier from "node-notifier";
2
+ /**
3
+ * Send a desktop notification. Falls back to terminal bell if
4
+ * node-notifier isn't available.
5
+ */
6
+ export function notify(title, message) {
7
+ try {
8
+ notifier.notify({ title, message, sound: true });
9
+ }
10
+ catch {
11
+ // Fallback: terminal bell
12
+ process.stderr.write("\x07");
13
+ }
14
+ }
15
+ //# sourceMappingURL=notify.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"notify.js","sourceRoot":"","sources":["../../../src/utils/notify.ts"],"names":[],"mappings":"AAAA,OAAO,QAAQ,MAAM,eAAe,CAAC;AAErC;;;GAGG;AACH,MAAM,UAAU,MAAM,CAAC,KAAa,EAAE,OAAe;IACnD,IAAI,CAAC;QACH,QAAQ,CAAC,MAAM,CAAC,EAAE,KAAK,EAAE,OAAO,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC;IACnD,CAAC;IAAC,MAAM,CAAC;QACP,0BAA0B;QAC1B,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC;IAC/B,CAAC;AACH,CAAC"}
@@ -0,0 +1,12 @@
1
+ import { type Terminal } from "./settings.js";
2
+ /**
3
+ * Resolve which terminal to use.
4
+ * Priority: explicit setting > TERM_PROGRAM detection > Terminal.app fallback.
5
+ */
6
+ export declare function resolveTerminal(): Terminal;
7
+ /**
8
+ * Open a new terminal window and run a shell command.
9
+ * Resolves the terminal from user settings, TERM_PROGRAM, or falls back to Terminal.app.
10
+ */
11
+ export declare function openTerminal(command: string): void;
12
+ //# sourceMappingURL=open-terminal.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"open-terminal.d.ts","sourceRoot":"","sources":["../../../src/utils/open-terminal.ts"],"names":[],"mappings":"AACA,OAAO,EAAgB,KAAK,QAAQ,EAAE,MAAM,eAAe,CAAC;AAG5D;;;GAGG;AACH,wBAAgB,eAAe,IAAI,QAAQ,CAY1C;AAyFD;;;GAGG;AACH,wBAAgB,YAAY,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI,CAGlD"}
@@ -0,0 +1,93 @@
1
+ import { execFile } from "node:child_process";
2
+ import { loadSettings } from "./settings.js";
3
+ import { logger } from "./logger.js";
4
+ /**
5
+ * Resolve which terminal to use.
6
+ * Priority: explicit setting > TERM_PROGRAM detection > Terminal.app fallback.
7
+ */
8
+ export function resolveTerminal() {
9
+ const settings = loadSettings();
10
+ if (settings?.terminal)
11
+ return settings.terminal;
12
+ const termProgram = process.env.TERM_PROGRAM?.toLowerCase() ?? "";
13
+ if (termProgram === "ghostty")
14
+ return "ghostty";
15
+ if (termProgram === "iterm.app" || termProgram === "iterm2")
16
+ return "iterm2";
17
+ if (termProgram === "kitty")
18
+ return "kitty";
19
+ if (termProgram === "wezterm")
20
+ return "wezterm";
21
+ if (termProgram === "alacritty")
22
+ return "alacritty";
23
+ return "terminal";
24
+ }
25
+ const userShell = process.env.SHELL ?? "/bin/sh";
26
+ function escapeAppleScript(cmd) {
27
+ return cmd.replace(/"/g, '\\"');
28
+ }
29
+ function openGhostty(command) {
30
+ execFile("open", ["-na", "Ghostty", "--args", "-e", userShell, "-c", `${command}; exec ${userShell}`], (err) => {
31
+ if (err)
32
+ logger.error(`Failed to open Ghostty: ${err.message}`);
33
+ });
34
+ }
35
+ function openITerm(command) {
36
+ execFile("osascript", [
37
+ "-e", `tell application "iTerm"`,
38
+ "-e", `activate`,
39
+ "-e", `tell current window`,
40
+ "-e", `create tab with default profile command "${escapeAppleScript(command)}"`,
41
+ "-e", `end tell`,
42
+ "-e", `end tell`,
43
+ ], (err) => {
44
+ if (err)
45
+ logger.error(`Failed to open iTerm: ${err.message}`);
46
+ });
47
+ }
48
+ function openTerminalApp(command) {
49
+ execFile("osascript", [
50
+ "-e", `tell application "Terminal"`,
51
+ "-e", `activate`,
52
+ "-e", `do script "${escapeAppleScript(command)}"`,
53
+ "-e", `end tell`,
54
+ ], (err) => {
55
+ if (err)
56
+ logger.error(`Failed to open Terminal: ${err.message}`);
57
+ });
58
+ }
59
+ function openKitty(command) {
60
+ execFile("open", ["-na", "kitty", "--args", userShell, "-c", `${command}; exec ${userShell}`], (err) => {
61
+ if (err)
62
+ logger.error(`Failed to open kitty: ${err.message}`);
63
+ });
64
+ }
65
+ function openWezTerm(command) {
66
+ execFile("open", ["-na", "WezTerm", "--args", "start", "--", userShell, "-c", `${command}; exec ${userShell}`], (err) => {
67
+ if (err)
68
+ logger.error(`Failed to open WezTerm: ${err.message}`);
69
+ });
70
+ }
71
+ function openAlacritty(command) {
72
+ execFile("alacritty", ["-e", userShell, "-c", `${command}; exec ${userShell}`], (err) => {
73
+ if (err)
74
+ logger.error(`Failed to open Alacritty: ${err.message}`);
75
+ });
76
+ }
77
+ const launchers = {
78
+ ghostty: openGhostty,
79
+ iterm2: openITerm,
80
+ terminal: openTerminalApp,
81
+ kitty: openKitty,
82
+ wezterm: openWezTerm,
83
+ alacritty: openAlacritty,
84
+ };
85
+ /**
86
+ * Open a new terminal window and run a shell command.
87
+ * Resolves the terminal from user settings, TERM_PROGRAM, or falls back to Terminal.app.
88
+ */
89
+ export function openTerminal(command) {
90
+ const terminal = resolveTerminal();
91
+ launchers[terminal](command);
92
+ }
93
+ //# sourceMappingURL=open-terminal.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"open-terminal.js","sourceRoot":"","sources":["../../../src/utils/open-terminal.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,14 @@
1
+ import { type ExecFileOptions } from "node:child_process";
2
+ export interface ExecResult {
3
+ stdout: string;
4
+ stderr: string;
5
+ exitCode: number;
6
+ }
7
+ /**
8
+ * Run a command and capture its output. Rejects on non-zero exit
9
+ * unless `allowFailure` is set.
10
+ */
11
+ export declare function exec(command: string, args: string[], options?: ExecFileOptions & {
12
+ allowFailure?: boolean;
13
+ }): Promise<ExecResult>;
14
+ //# sourceMappingURL=process.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"process.d.ts","sourceRoot":"","sources":["../../../src/utils/process.ts"],"names":[],"mappings":"AAAA,OAAO,EAAY,KAAK,eAAe,EAAE,MAAM,oBAAoB,CAAC;AAEpE,MAAM,WAAW,UAAU;IACzB,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,EAAE,MAAM,CAAC;IACf,QAAQ,EAAE,MAAM,CAAC;CAClB;AAED;;;GAGG;AACH,wBAAgB,IAAI,CAClB,OAAO,EAAE,MAAM,EACf,IAAI,EAAE,MAAM,EAAE,EACd,OAAO,GAAE,eAAe,GAAG;IAAE,YAAY,CAAC,EAAE,OAAO,CAAA;CAAO,GACzD,OAAO,CAAC,UAAU,CAAC,CAyCrB"}
@@ -0,0 +1,36 @@
1
+ import { execFile } from "node:child_process";
2
+ /**
3
+ * Run a command and capture its output. Rejects on non-zero exit
4
+ * unless `allowFailure` is set.
5
+ */
6
+ export function exec(command, args, options = {}) {
7
+ const { allowFailure, ...execOpts } = options;
8
+ return new Promise((resolve, reject) => {
9
+ const child = execFile(command, args, { maxBuffer: 10 * 1024 * 1024, ...execOpts }, (error, stdout, stderr) => {
10
+ const exitCode = error?.code
11
+ ? typeof error.code === "number"
12
+ ? error.code
13
+ : 1
14
+ : 0;
15
+ const result = {
16
+ stdout: stdout?.toString() ?? "",
17
+ stderr: stderr?.toString() ?? "",
18
+ exitCode,
19
+ };
20
+ if (error && !allowFailure) {
21
+ reject(Object.assign(new Error(`Command failed: ${command} ${args.join(" ")}\n${result.stderr}`), { result }));
22
+ }
23
+ else {
24
+ resolve(result);
25
+ }
26
+ });
27
+ // Kill the process if it takes too long
28
+ const timeout = execOpts.timeout;
29
+ if (timeout) {
30
+ setTimeout(() => {
31
+ child.kill("SIGTERM");
32
+ }, timeout);
33
+ }
34
+ });
35
+ }
36
+ //# sourceMappingURL=process.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"process.js","sourceRoot":"","sources":["../../../src/utils/process.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAwB,MAAM,oBAAoB,CAAC;AAQpE;;;GAGG;AACH,MAAM,UAAU,IAAI,CAClB,OAAe,EACf,IAAc,EACd,UAAwD,EAAE;IAE1D,MAAM,EAAE,YAAY,EAAE,GAAG,QAAQ,EAAE,GAAG,OAAO,CAAC;IAC9C,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE;QACrC,MAAM,KAAK,GAAG,QAAQ,CACpB,OAAO,EACP,IAAI,EACJ,EAAE,SAAS,EAAE,EAAE,GAAG,IAAI,GAAG,IAAI,EAAE,GAAG,QAAQ,EAAE,EAC5C,CAAC,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,EAAE;YACxB,MAAM,QAAQ,GAAG,KAAK,EAAE,IAAI;gBAC1B,CAAC,CAAC,OAAO,KAAK,CAAC,IAAI,KAAK,QAAQ;oBAC9B,CAAC,CAAC,KAAK,CAAC,IAAI;oBACZ,CAAC,CAAC,CAAC;gBACL,CAAC,CAAC,CAAC,CAAC;YACN,MAAM,MAAM,GAAe;gBACzB,MAAM,EAAE,MAAM,EAAE,QAAQ,EAAE,IAAI,EAAE;gBAChC,MAAM,EAAE,MAAM,EAAE,QAAQ,EAAE,IAAI,EAAE;gBAChC,QAAQ;aACT,CAAC;YACF,IAAI,KAAK,IAAI,CAAC,YAAY,EAAE,CAAC;gBAC3B,MAAM,CACJ,MAAM,CAAC,MAAM,CACX,IAAI,KAAK,CACP,mBAAmB,OAAO,IAAI,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,KAAK,MAAM,CAAC,MAAM,EAAE,CACjE,EACD,EAAE,MAAM,EAAE,CACX,CACF,CAAC;YACJ,CAAC;iBAAM,CAAC;gBACN,OAAO,CAAC,MAAM,CAAC,CAAC;YAClB,CAAC;QACH,CAAC,CACF,CAAC;QAEF,wCAAwC;QACxC,MAAM,OAAO,GAAG,QAAQ,CAAC,OAAO,CAAC;QACjC,IAAI,OAAO,EAAE,CAAC;YACZ,UAAU,CAAC,GAAG,EAAE;gBACd,KAAK,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;YACxB,CAAC,EAAE,OAAO,CAAC,CAAC;QACd,CAAC;IACH,CAAC,CAAC,CAAC;AACL,CAAC"}