autodev-cli 1.4.131 → 1.4.133

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 (265) hide show
  1. package/LICENSE.md +21 -0
  2. package/media/profile/00b-self-verifiable-work.md +62 -0
  3. package/media/profile/00c-verifiable-threads.md +78 -0
  4. package/media/profile/00d-turn-end-retrospective.md +61 -0
  5. package/media/profile/00e-long-horizon-planning.md +83 -0
  6. package/out/commands/office.js +4 -0
  7. package/out/commands/office.js.map +1 -1
  8. package/out/commands/start.js +1 -1
  9. package/out/commands/start.js.map +1 -1
  10. package/out/core/claudeUsage.d.ts +1 -26
  11. package/out/core/claudeUsage.js +15 -91
  12. package/out/core/claudeUsage.js.map +1 -1
  13. package/out/core/modelInfo.d.ts +1 -28
  14. package/out/core/modelInfo.js +15 -94
  15. package/out/core/modelInfo.js.map +1 -1
  16. package/out/core/provider/BaseProvider.d.ts +1 -14
  17. package/out/core/provider/BaseProvider.js +15 -22
  18. package/out/core/provider/BaseProvider.js.map +1 -1
  19. package/out/core/provider/ProviderRegistry.d.ts +1 -12
  20. package/out/core/provider/ProviderRegistry.js +15 -38
  21. package/out/core/provider/ProviderRegistry.js.map +1 -1
  22. package/out/core/provider/contract.d.ts +1 -62
  23. package/out/core/provider/contract.js +15 -6
  24. package/out/core/provider/contract.js.map +1 -1
  25. package/out/core/provider/implementations.d.ts +1 -65
  26. package/out/core/provider/implementations.js +4 -169
  27. package/out/core/provider/implementations.js.map +1 -1
  28. package/out/dispatcher.js +7 -0
  29. package/out/dispatcher.js.map +1 -1
  30. package/out/hookEventNormalizer.d.ts +1 -33
  31. package/out/hookEventNormalizer.js +15 -424
  32. package/out/hookEventNormalizer.js.map +1 -1
  33. package/out/profileBuilder.js +32 -0
  34. package/out/profileBuilder.js.map +1 -1
  35. package/out/providers/base/BaseProvider.d.ts +14 -0
  36. package/out/providers/base/BaseProvider.js +25 -0
  37. package/out/providers/base/BaseProvider.js.map +1 -0
  38. package/out/providers/base/ProviderEvents.d.ts +12 -0
  39. package/out/providers/base/ProviderEvents.js +81 -0
  40. package/out/providers/base/ProviderEvents.js.map +1 -0
  41. package/out/providers/base/ProviderManager.d.ts +25 -0
  42. package/out/providers/base/ProviderManager.js +22 -0
  43. package/out/providers/base/ProviderManager.js.map +1 -0
  44. package/out/providers/base/ProviderModels.d.ts +28 -0
  45. package/out/providers/base/ProviderModels.js +89 -0
  46. package/out/providers/base/ProviderModels.js.map +1 -0
  47. package/out/providers/base/ProviderNormalizer.d.ts +42 -0
  48. package/out/providers/base/ProviderNormalizer.js +439 -0
  49. package/out/providers/base/ProviderNormalizer.js.map +1 -0
  50. package/out/providers/base/ProviderRegistry.d.ts +12 -0
  51. package/out/providers/base/ProviderRegistry.js +42 -0
  52. package/out/providers/base/ProviderRegistry.js.map +1 -0
  53. package/out/providers/base/ProviderSessions.d.ts +15 -0
  54. package/out/providers/base/ProviderSessions.js +15 -0
  55. package/out/providers/base/ProviderSessions.js.map +1 -0
  56. package/out/providers/base/ProviderState.d.ts +9 -0
  57. package/out/providers/base/ProviderState.js +16 -0
  58. package/out/providers/base/ProviderState.js.map +1 -0
  59. package/out/providers/base/ProviderUsage.d.ts +12 -0
  60. package/out/providers/base/ProviderUsage.js +33 -0
  61. package/out/providers/base/ProviderUsage.js.map +1 -0
  62. package/out/providers/base/contract.d.ts +62 -0
  63. package/out/providers/base/contract.js +9 -0
  64. package/out/providers/base/contract.js.map +1 -0
  65. package/out/providers/base/factories.d.ts +64 -0
  66. package/out/providers/base/factories.js +265 -0
  67. package/out/providers/base/factories.js.map +1 -0
  68. package/out/providers/base/implementations.d.ts +5 -0
  69. package/out/providers/base/implementations.js +23 -0
  70. package/out/providers/base/implementations.js.map +1 -0
  71. package/out/providers/base/index.d.ts +13 -0
  72. package/out/providers/base/index.js +29 -0
  73. package/out/providers/base/index.js.map +1 -0
  74. package/out/providers/base/types.d.ts +30 -0
  75. package/out/providers/base/types.js +8 -0
  76. package/out/providers/base/types.js.map +1 -0
  77. package/out/providers/claude/ProviderEvents.d.ts +5 -0
  78. package/out/providers/claude/ProviderEvents.js +18 -0
  79. package/out/providers/claude/ProviderEvents.js.map +1 -0
  80. package/out/providers/claude/ProviderManager.d.ts +39 -0
  81. package/out/providers/claude/ProviderManager.js +50 -0
  82. package/out/providers/claude/ProviderManager.js.map +1 -0
  83. package/out/providers/claude/ProviderModels.d.ts +8 -0
  84. package/out/providers/claude/ProviderModels.js +23 -0
  85. package/out/providers/claude/ProviderModels.js.map +1 -0
  86. package/out/providers/claude/ProviderNormalizer.d.ts +5 -0
  87. package/out/providers/claude/ProviderNormalizer.js +10 -0
  88. package/out/providers/claude/ProviderNormalizer.js.map +1 -0
  89. package/out/providers/claude/ProviderSessions.d.ts +14 -0
  90. package/out/providers/claude/ProviderSessions.js +35 -0
  91. package/out/providers/claude/ProviderSessions.js.map +1 -0
  92. package/out/providers/claude/ProviderState.d.ts +13 -0
  93. package/out/providers/claude/ProviderState.js +19 -0
  94. package/out/providers/claude/ProviderState.js.map +1 -0
  95. package/out/providers/claude/ProviderUsage.d.ts +13 -0
  96. package/out/providers/claude/ProviderUsage.js +59 -0
  97. package/out/providers/claude/ProviderUsage.js.map +1 -0
  98. package/out/providers/claude/cli.d.ts +95 -0
  99. package/out/providers/claude/cli.js +674 -0
  100. package/out/providers/claude/cli.js.map +1 -0
  101. package/out/providers/claude/index.d.ts +9 -0
  102. package/out/providers/claude/index.js +26 -0
  103. package/out/providers/claude/index.js.map +1 -0
  104. package/out/providers/claude/tui.d.ts +38 -0
  105. package/out/providers/claude/tui.js +346 -0
  106. package/out/providers/claude/tui.js.map +1 -0
  107. package/out/providers/claudeCliProvider.d.ts +1 -95
  108. package/out/providers/claudeCliProvider.js +4 -660
  109. package/out/providers/claudeCliProvider.js.map +1 -1
  110. package/out/providers/claudeTuiProvider.d.ts +1 -38
  111. package/out/providers/claudeTuiProvider.js +4 -332
  112. package/out/providers/claudeTuiProvider.js.map +1 -1
  113. package/out/providers/copilot/ProviderEvents.d.ts +6 -0
  114. package/out/providers/copilot/ProviderEvents.js +18 -0
  115. package/out/providers/copilot/ProviderEvents.js.map +1 -0
  116. package/out/providers/copilot/ProviderManager.d.ts +39 -0
  117. package/out/providers/copilot/ProviderManager.js +98 -0
  118. package/out/providers/copilot/ProviderManager.js.map +1 -0
  119. package/out/providers/copilot/ProviderModels.d.ts +7 -0
  120. package/out/providers/copilot/ProviderModels.js +18 -0
  121. package/out/providers/copilot/ProviderModels.js.map +1 -0
  122. package/out/providers/copilot/ProviderNormalizer.d.ts +5 -0
  123. package/out/providers/copilot/ProviderNormalizer.js +10 -0
  124. package/out/providers/copilot/ProviderNormalizer.js.map +1 -0
  125. package/out/providers/copilot/ProviderSessions.d.ts +12 -0
  126. package/out/providers/copilot/ProviderSessions.js +39 -0
  127. package/out/providers/copilot/ProviderSessions.js.map +1 -0
  128. package/out/providers/copilot/ProviderState.d.ts +11 -0
  129. package/out/providers/copilot/ProviderState.js +17 -0
  130. package/out/providers/copilot/ProviderState.js.map +1 -0
  131. package/out/providers/copilot/ProviderUsage.d.ts +12 -0
  132. package/out/providers/copilot/ProviderUsage.js +41 -0
  133. package/out/providers/copilot/ProviderUsage.js.map +1 -0
  134. package/out/providers/copilot/cli.d.ts +16 -0
  135. package/out/providers/copilot/cli.js +52 -0
  136. package/out/providers/copilot/cli.js.map +1 -0
  137. package/out/providers/copilot/index.d.ts +10 -0
  138. package/out/providers/copilot/index.js +27 -0
  139. package/out/providers/copilot/index.js.map +1 -0
  140. package/out/providers/copilot/sdk.d.ts +22 -0
  141. package/out/providers/copilot/sdk.js +489 -0
  142. package/out/providers/copilot/sdk.js.map +1 -0
  143. package/out/providers/copilot/sessions.d.ts +25 -0
  144. package/out/providers/copilot/sessions.js +214 -0
  145. package/out/providers/copilot/sessions.js.map +1 -0
  146. package/out/providers/copilotCliProvider.d.ts +1 -16
  147. package/out/providers/copilotCliProvider.js +15 -49
  148. package/out/providers/copilotCliProvider.js.map +1 -1
  149. package/out/providers/copilotSdkProvider.d.ts +1 -22
  150. package/out/providers/copilotSdkProvider.js +4 -475
  151. package/out/providers/copilotSdkProvider.js.map +1 -1
  152. package/out/providers/copilotSessions.d.ts +1 -25
  153. package/out/providers/copilotSessions.js +4 -200
  154. package/out/providers/copilotSessions.js.map +1 -1
  155. package/out/providers/dummy/ProviderEvents.d.ts +5 -0
  156. package/out/providers/dummy/ProviderEvents.js +16 -0
  157. package/out/providers/dummy/ProviderEvents.js.map +1 -0
  158. package/out/providers/dummy/ProviderManager.d.ts +31 -0
  159. package/out/providers/dummy/ProviderManager.js +115 -0
  160. package/out/providers/dummy/ProviderManager.js.map +1 -0
  161. package/out/providers/dummy/ProviderModels.d.ts +7 -0
  162. package/out/providers/dummy/ProviderModels.js +15 -0
  163. package/out/providers/dummy/ProviderModels.js.map +1 -0
  164. package/out/providers/dummy/ProviderNormalizer.d.ts +4 -0
  165. package/out/providers/dummy/ProviderNormalizer.js +9 -0
  166. package/out/providers/dummy/ProviderNormalizer.js.map +1 -0
  167. package/out/providers/dummy/ProviderSessions.d.ts +12 -0
  168. package/out/providers/dummy/ProviderSessions.js +105 -0
  169. package/out/providers/dummy/ProviderSessions.js.map +1 -0
  170. package/out/providers/dummy/ProviderState.d.ts +12 -0
  171. package/out/providers/dummy/ProviderState.js +23 -0
  172. package/out/providers/dummy/ProviderState.js.map +1 -0
  173. package/out/providers/dummy/ProviderUsage.d.ts +9 -0
  174. package/out/providers/dummy/ProviderUsage.js +27 -0
  175. package/out/providers/dummy/ProviderUsage.js.map +1 -0
  176. package/out/providers/dummy/commands.d.ts +9 -0
  177. package/out/providers/dummy/commands.js +48 -0
  178. package/out/providers/dummy/commands.js.map +1 -0
  179. package/out/providers/dummy/index.d.ts +10 -0
  180. package/out/providers/dummy/index.js +27 -0
  181. package/out/providers/dummy/index.js.map +1 -0
  182. package/out/providers/dummy/office.d.ts +23 -0
  183. package/out/providers/dummy/office.js +66 -0
  184. package/out/providers/dummy/office.js.map +1 -0
  185. package/out/providers/dummy/traces.d.ts +8 -0
  186. package/out/providers/dummy/traces.js +174 -0
  187. package/out/providers/dummy/traces.js.map +1 -0
  188. package/out/providers/grok/ProviderEvents.d.ts +6 -0
  189. package/out/providers/grok/ProviderEvents.js +17 -0
  190. package/out/providers/grok/ProviderEvents.js.map +1 -0
  191. package/out/providers/grok/ProviderManager.d.ts +42 -0
  192. package/out/providers/grok/ProviderManager.js +48 -0
  193. package/out/providers/grok/ProviderManager.js.map +1 -0
  194. package/out/providers/grok/ProviderModels.d.ts +7 -0
  195. package/out/providers/grok/ProviderModels.js +16 -0
  196. package/out/providers/grok/ProviderModels.js.map +1 -0
  197. package/out/providers/grok/ProviderNormalizer.d.ts +5 -0
  198. package/out/providers/grok/ProviderNormalizer.js +10 -0
  199. package/out/providers/grok/ProviderNormalizer.js.map +1 -0
  200. package/out/providers/grok/ProviderSessions.d.ts +12 -0
  201. package/out/providers/grok/ProviderSessions.js +27 -0
  202. package/out/providers/grok/ProviderSessions.js.map +1 -0
  203. package/out/providers/grok/ProviderState.d.ts +10 -0
  204. package/out/providers/grok/ProviderState.js +15 -0
  205. package/out/providers/grok/ProviderState.js.map +1 -0
  206. package/out/providers/grok/ProviderUsage.d.ts +7 -0
  207. package/out/providers/grok/ProviderUsage.js +20 -0
  208. package/out/providers/grok/ProviderUsage.js.map +1 -0
  209. package/out/providers/grok/index.d.ts +9 -0
  210. package/out/providers/grok/index.js +26 -0
  211. package/out/providers/grok/index.js.map +1 -0
  212. package/out/providers/grok/sessions.d.ts +27 -0
  213. package/out/providers/grok/sessions.js +246 -0
  214. package/out/providers/grok/sessions.js.map +1 -0
  215. package/out/providers/grok/tui.d.ts +38 -0
  216. package/out/providers/grok/tui.js +1630 -0
  217. package/out/providers/grok/tui.js.map +1 -0
  218. package/out/providers/grokSessions.d.ts +1 -27
  219. package/out/providers/grokSessions.js +4 -232
  220. package/out/providers/grokSessions.js.map +1 -1
  221. package/out/providers/grokTuiProvider.d.ts +1 -38
  222. package/out/providers/grokTuiProvider.js +4 -1616
  223. package/out/providers/grokTuiProvider.js.map +1 -1
  224. package/out/providers/opencode/ProviderEvents.d.ts +6 -0
  225. package/out/providers/opencode/ProviderEvents.js +18 -0
  226. package/out/providers/opencode/ProviderEvents.js.map +1 -0
  227. package/out/providers/opencode/ProviderManager.d.ts +39 -0
  228. package/out/providers/opencode/ProviderManager.js +90 -0
  229. package/out/providers/opencode/ProviderManager.js.map +1 -0
  230. package/out/providers/opencode/ProviderModels.d.ts +7 -0
  231. package/out/providers/opencode/ProviderModels.js +17 -0
  232. package/out/providers/opencode/ProviderModels.js.map +1 -0
  233. package/out/providers/opencode/ProviderNormalizer.d.ts +5 -0
  234. package/out/providers/opencode/ProviderNormalizer.js +10 -0
  235. package/out/providers/opencode/ProviderNormalizer.js.map +1 -0
  236. package/out/providers/opencode/ProviderSessions.d.ts +11 -0
  237. package/out/providers/opencode/ProviderSessions.js +28 -0
  238. package/out/providers/opencode/ProviderSessions.js.map +1 -0
  239. package/out/providers/opencode/ProviderState.d.ts +14 -0
  240. package/out/providers/opencode/ProviderState.js +20 -0
  241. package/out/providers/opencode/ProviderState.js.map +1 -0
  242. package/out/providers/opencode/ProviderUsage.d.ts +7 -0
  243. package/out/providers/opencode/ProviderUsage.js +20 -0
  244. package/out/providers/opencode/ProviderUsage.js.map +1 -0
  245. package/out/providers/opencode/cli.d.ts +29 -0
  246. package/out/providers/opencode/cli.js +199 -0
  247. package/out/providers/opencode/cli.js.map +1 -0
  248. package/out/providers/opencode/index.d.ts +9 -0
  249. package/out/providers/opencode/index.js +26 -0
  250. package/out/providers/opencode/index.js.map +1 -0
  251. package/out/providers/opencode/sdk.d.ts +32 -0
  252. package/out/providers/opencode/sdk.js +610 -0
  253. package/out/providers/opencode/sdk.js.map +1 -0
  254. package/out/providers/opencodeCliProvider.d.ts +1 -29
  255. package/out/providers/opencodeCliProvider.js +15 -196
  256. package/out/providers/opencodeCliProvider.js.map +1 -1
  257. package/out/providers/opencodeSdkProvider.d.ts +1 -32
  258. package/out/providers/opencodeSdkProvider.js +4 -596
  259. package/out/providers/opencodeSdkProvider.js.map +1 -1
  260. package/out/providers.d.ts +1 -1
  261. package/out/providers.js +5 -0
  262. package/out/providers.js.map +1 -1
  263. package/out/sdk/index.js +5 -0
  264. package/out/sdk/index.js.map +1 -1
  265. package/package.json +2 -2
@@ -0,0 +1,674 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
15
+ }) : function(o, v) {
16
+ o["default"] = v;
17
+ });
18
+ var __importStar = (this && this.__importStar) || (function () {
19
+ var ownKeys = function(o) {
20
+ ownKeys = Object.getOwnPropertyNames || function (o) {
21
+ var ar = [];
22
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
23
+ return ar;
24
+ };
25
+ return ownKeys(o);
26
+ };
27
+ return function (mod) {
28
+ if (mod && mod.__esModule) return mod;
29
+ var result = {};
30
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
31
+ __setModuleDefault(result, mod);
32
+ return result;
33
+ };
34
+ })();
35
+ Object.defineProperty(exports, "__esModule", { value: true });
36
+ exports.claudeProjectFolder = claudeProjectFolder;
37
+ exports.getClaudeProjectDir = getClaudeProjectDir;
38
+ exports.listClaudeSessionFiles = listClaudeSessionFiles;
39
+ exports.listClaudeSessions = listClaudeSessions;
40
+ exports.findLatestClaudeSession = findLatestClaudeSession;
41
+ exports.getClaudeSessionDisplay = getClaudeSessionDisplay;
42
+ exports.setClaudeSessionName = setClaudeSessionName;
43
+ exports.listAllClaudeSessions = listAllClaudeSessions;
44
+ exports.readClaudeTranscript = readClaudeTranscript;
45
+ exports.getClaudeSessionCursor = getClaudeSessionCursor;
46
+ exports.parseClaudeStateSince = parseClaudeStateSince;
47
+ exports.hasClaudeEndTurnSince = hasClaudeEndTurnSince;
48
+ exports.readClaudeOutputSince = readClaudeOutputSince;
49
+ exports.buildClaudeCliCommand = buildClaudeCliCommand;
50
+ exports.probeClaudeSession = probeClaudeSession;
51
+ exports.runClaudeCompact = runClaudeCompact;
52
+ exports.runClaudeClear = runClaudeClear;
53
+ const fs = __importStar(require("fs"));
54
+ const path = __importStar(require("path"));
55
+ const os = __importStar(require("os"));
56
+ const child_process_1 = require("child_process");
57
+ // ---------------------------------------------------------------------------
58
+ // Claude project-folder / JSONL session helpers
59
+ // ---------------------------------------------------------------------------
60
+ /**
61
+ * Encode a workspace path the way Claude Code names its `~/.claude/projects/`
62
+ * folders: every `:`, `\`, `/` becomes `-`, and runs of dashes are collapsed.
63
+ * Note: Claude **keeps the leading dash** that comes from a leading slash on
64
+ * POSIX paths (e.g. `/home/x/foo` → `-home-x-foo`), so we don't strip `^-`.
65
+ * Trailing dashes are dropped.
66
+ */
67
+ function claudeProjectFolder(workspacePath) {
68
+ return workspacePath.replace(/[:\\/]/g, '-').replace(/-+/g, '-').replace(/-$/g, '');
69
+ }
70
+ /**
71
+ * Compute the `~/.claude/projects/<encoded>` directory for a workspace,
72
+ * regardless of whether it already exists. Used when restoring an agent
73
+ * backup into a new folder: the destination's session traces must land in
74
+ * the project dir that Claude will look up for that folder.
75
+ */
76
+ function getClaudeProjectDir(workspacePath) {
77
+ const claudeDir = process.env['CLAUDE_CONFIG_DIR'] ?? path.join(os.homedir(), '.claude');
78
+ return path.join(claudeDir, 'projects', claudeProjectFolder(workspacePath));
79
+ }
80
+ /**
81
+ * Resolve the Claude `~/.claude/projects/<encoded>` folder for this workspace.
82
+ * Match is **exact** (case-insensitive only on Windows). We try the primary
83
+ * encoding and a no-leading-dash fallback so historical folders created by
84
+ * older Claude versions still resolve. Prefix matching is intentionally NOT
85
+ * used — the previous fuzzy match (`startsWith(encoded.slice(0,8))`) caused
86
+ * two VS Code instances opened in sibling directories like
87
+ * `-home-code-foo` and `-home-code1-bar` (sharing prefix `-home-cod`) to
88
+ * pick up each other's session JSONLs and end up resuming the same Claude
89
+ * session.
90
+ */
91
+ function findClaudeProjectDir(workspacePath) {
92
+ try {
93
+ const claudeDir = process.env['CLAUDE_CONFIG_DIR'] ?? path.join(os.homedir(), '.claude');
94
+ const projectsDir = path.join(claudeDir, 'projects');
95
+ const encoded = claudeProjectFolder(workspacePath);
96
+ const candidates = [encoded, encoded.replace(/^-+/, '')];
97
+ const folders = fs.readdirSync(projectsDir);
98
+ const isWindows = process.platform === 'win32';
99
+ const norm = (s) => (isWindows ? s.toLowerCase() : s);
100
+ const targets = new Set(candidates.map(norm));
101
+ const match = folders.find(f => targets.has(norm(f)));
102
+ return match ? path.join(projectsDir, match) : undefined;
103
+ }
104
+ catch {
105
+ return undefined;
106
+ }
107
+ }
108
+ function listClaudeSessionFiles(workspacePath) {
109
+ const sessionsDir = findClaudeProjectDir(workspacePath);
110
+ if (!sessionsDir) {
111
+ return [];
112
+ }
113
+ try {
114
+ return fs.readdirSync(sessionsDir)
115
+ .filter(f => f.endsWith('.jsonl') && !f.startsWith('agent-'))
116
+ .map(f => ({ name: f, mtime: fs.statSync(path.join(sessionsDir, f)).mtimeMs, full: path.join(sessionsDir, f) }))
117
+ .sort((a, b) => b.mtime - a.mtime);
118
+ }
119
+ catch {
120
+ return [];
121
+ }
122
+ }
123
+ function listClaudeSessions(workspacePath) {
124
+ return listClaudeSessionFiles(workspacePath).map(f => ({
125
+ id: f.name.replace('.jsonl', ''),
126
+ mtime: f.mtime,
127
+ }));
128
+ }
129
+ function findLatestClaudeSession(workspacePath) {
130
+ return listClaudeSessionFiles(workspacePath)[0]?.name.replace('.jsonl', '');
131
+ }
132
+ /**
133
+ * Set the display NAME shown for a Claude session in the `claude --resume`
134
+ * picker. This Claude version has no dedicated title field — the picker label is
135
+ * the `display` value in ~/.claude/history.jsonl keyed by sessionId. We APPEND a
136
+ * fresh entry (never rewrite existing lines, so history can't be corrupted); the
137
+ * picker surfaces the latest display for the session.
138
+ */
139
+ /** Read the display NAME shown for a claude session in the --resume picker
140
+ * (latest `display` for this sessionId in ~/.claude/history.jsonl). */
141
+ function getClaudeSessionDisplay(sessionId) {
142
+ try {
143
+ const claudeDir = process.env['CLAUDE_CONFIG_DIR'] ?? path.join(os.homedir(), '.claude');
144
+ const histFile = path.join(claudeDir, 'history.jsonl');
145
+ if (!fs.existsSync(histFile)) {
146
+ return undefined;
147
+ }
148
+ let display;
149
+ for (const line of fs.readFileSync(histFile, 'utf8').split('\n')) {
150
+ if (!line.trim()) {
151
+ continue;
152
+ }
153
+ try {
154
+ const e = JSON.parse(line);
155
+ if (e.sessionId === sessionId && e.display) {
156
+ display = e.display;
157
+ }
158
+ }
159
+ catch { /* skip */ }
160
+ }
161
+ return display;
162
+ }
163
+ catch {
164
+ return undefined;
165
+ }
166
+ }
167
+ function setClaudeSessionName(sessionId, name, cwd) {
168
+ if (!sessionId || !name) {
169
+ return;
170
+ }
171
+ try {
172
+ const claudeDir = process.env['CLAUDE_CONFIG_DIR'] ?? path.join(os.homedir(), '.claude');
173
+ const histFile = path.join(claudeDir, 'history.jsonl');
174
+ const entry = { display: name, pastedContents: {}, timestamp: Date.now(), project: cwd, sessionId };
175
+ fs.appendFileSync(histFile, JSON.stringify(entry) + '\n', 'utf8');
176
+ }
177
+ catch { /* non-critical */ }
178
+ }
179
+ function resolveClaudeJsonl(workspacePath) {
180
+ return listClaudeSessionFiles(workspacePath)[0]?.full;
181
+ }
182
+ // ---------------------------------------------------------------------------
183
+ // Global (cross-workspace) discovery + transcript reading
184
+ // ---------------------------------------------------------------------------
185
+ /** Decode a `~/.claude/projects` folder name back to a plausible cwd. Lossy
186
+ * (dashes in real names collapse), so callers prefer the transcript's own cwd. */
187
+ function decodeClaudeProject(folder) {
188
+ return '/' + folder.replace(/^-+/, '').replace(/-/g, '/');
189
+ }
190
+ /** sessionId → newest display title, from ~/.claude/history.jsonl. */
191
+ function claudeTitleMap() {
192
+ const m = new Map();
193
+ try {
194
+ const claudeDir = process.env['CLAUDE_CONFIG_DIR'] ?? path.join(os.homedir(), '.claude');
195
+ const histFile = path.join(claudeDir, 'history.jsonl');
196
+ if (!fs.existsSync(histFile)) {
197
+ return m;
198
+ }
199
+ for (const line of fs.readFileSync(histFile, 'utf8').split('\n')) {
200
+ if (!line.trim()) {
201
+ continue;
202
+ }
203
+ try {
204
+ const e = JSON.parse(line);
205
+ if (e.sessionId && e.display) {
206
+ m.set(e.sessionId, e.display);
207
+ }
208
+ }
209
+ catch { /* skip */ }
210
+ }
211
+ }
212
+ catch { /* none */ }
213
+ return m;
214
+ }
215
+ /** Peek a transcript head for its real cwd, a first-user title hint, and a
216
+ * message-count floor (bounded read so discovery never loads 100s of MB). */
217
+ function peekClaudeTranscript(file, size) {
218
+ let cwd;
219
+ let firstUser;
220
+ let count = 0;
221
+ const MAX = 256_000;
222
+ try {
223
+ let text;
224
+ if (size > MAX) {
225
+ const fd = fs.openSync(file, 'r');
226
+ try {
227
+ const buf = Buffer.alloc(MAX);
228
+ fs.readSync(fd, buf, 0, MAX, 0);
229
+ text = buf.toString('utf8');
230
+ }
231
+ finally {
232
+ fs.closeSync(fd);
233
+ }
234
+ }
235
+ else {
236
+ text = fs.readFileSync(file, 'utf8');
237
+ }
238
+ for (const line of text.split('\n')) {
239
+ if (!line.trim()) {
240
+ continue;
241
+ }
242
+ count++;
243
+ try {
244
+ const o = JSON.parse(line);
245
+ if (!cwd && typeof o['cwd'] === 'string') {
246
+ cwd = o['cwd'];
247
+ }
248
+ if (!firstUser && o['type'] === 'user') {
249
+ const t = extractClaudeText(o['message']);
250
+ if (t) {
251
+ firstUser = t.slice(0, 80);
252
+ }
253
+ }
254
+ }
255
+ catch { /* skip */ }
256
+ }
257
+ }
258
+ catch { /* unreadable */ }
259
+ return { cwd, firstUser, count };
260
+ }
261
+ /** ALL claude sessions across every ~/.claude/projects folder (newest first).
262
+ * Mirrors the app's sessionManager.discover(): skip `agent-` transcripts,
263
+ * derive cwd from the transcript's own `cwd` (folder-name decode fallback). */
264
+ function listAllClaudeSessions() {
265
+ const claudeDir = process.env['CLAUDE_CONFIG_DIR'] ?? path.join(os.homedir(), '.claude');
266
+ const projects = path.join(claudeDir, 'projects');
267
+ if (!fs.existsSync(projects)) {
268
+ return [];
269
+ }
270
+ const titles = claudeTitleMap();
271
+ const out = [];
272
+ let folders = [];
273
+ try {
274
+ folders = fs.readdirSync(projects);
275
+ }
276
+ catch {
277
+ return [];
278
+ }
279
+ for (const folder of folders) {
280
+ const dir = path.join(projects, folder);
281
+ let files = [];
282
+ try {
283
+ if (!fs.statSync(dir).isDirectory()) {
284
+ continue;
285
+ }
286
+ files = fs.readdirSync(dir).filter(f => f.endsWith('.jsonl') && !f.startsWith('agent-'));
287
+ }
288
+ catch {
289
+ continue;
290
+ }
291
+ for (const f of files) {
292
+ const file = path.join(dir, f);
293
+ const id = f.replace(/\.jsonl$/, '');
294
+ let st;
295
+ try {
296
+ st = fs.statSync(file);
297
+ }
298
+ catch {
299
+ continue;
300
+ }
301
+ const peek = peekClaudeTranscript(file, st.size);
302
+ out.push({
303
+ id,
304
+ name: titles.get(id) || peek.firstUser || '(untitled)',
305
+ cwd: peek.cwd || decodeClaudeProject(folder),
306
+ updated: st.mtimeMs,
307
+ file,
308
+ msgs: peek.count,
309
+ });
310
+ }
311
+ }
312
+ return out.sort((a, b) => b.updated - a.updated);
313
+ }
314
+ /** Pull readable text out of a claude transcript entry's `message` (string or
315
+ * array content, rendering tool_use / tool_result blocks compactly). */
316
+ function extractClaudeText(message) {
317
+ if (!message) {
318
+ return '';
319
+ }
320
+ const c = message['content'];
321
+ if (typeof c === 'string') {
322
+ return c;
323
+ }
324
+ if (Array.isArray(c)) {
325
+ const short = (v) => {
326
+ try {
327
+ const s = typeof v === 'string' ? v : JSON.stringify(v);
328
+ return s.length > 200 ? s.slice(0, 200) + '…' : s;
329
+ }
330
+ catch {
331
+ return '';
332
+ }
333
+ };
334
+ return c.map(b => {
335
+ if (b['type'] === 'text') {
336
+ return String(b['text'] ?? '');
337
+ }
338
+ if (b['type'] === 'tool_use') {
339
+ return `🔧 ${String(b['name'] ?? '')}(${short(b['input'])})`;
340
+ }
341
+ if (b['type'] === 'tool_result') {
342
+ return `↳ ${short(b['content'])}`;
343
+ }
344
+ return '';
345
+ }).filter(Boolean).join('\n');
346
+ }
347
+ return '';
348
+ }
349
+ /** Locate a claude transcript by session id across all project folders. */
350
+ function findClaudeTranscriptById(id) {
351
+ const claudeDir = process.env['CLAUDE_CONFIG_DIR'] ?? path.join(os.homedir(), '.claude');
352
+ const projects = path.join(claudeDir, 'projects');
353
+ try {
354
+ for (const folder of fs.readdirSync(projects)) {
355
+ const file = path.join(projects, folder, `${id}.jsonl`);
356
+ if (fs.existsSync(file)) {
357
+ return file;
358
+ }
359
+ }
360
+ }
361
+ catch { /* none */ }
362
+ return undefined;
363
+ }
364
+ /**
365
+ * Read a claude session transcript (by id, or an explicit `file`) into a
366
+ * normalized message array. Reuses the same parse shape the app uses: type
367
+ * user/assistant/system with tool_use/tool_result rendering. Reads only the
368
+ * tail of huge transcripts. Returns at most `limit` messages. [] on any miss.
369
+ */
370
+ function readClaudeTranscript(id, file, limit = 400) {
371
+ const p = file && fs.existsSync(file) ? file : findClaudeTranscriptById(id);
372
+ if (!p) {
373
+ return [];
374
+ }
375
+ let text = '';
376
+ try {
377
+ const size = fs.statSync(p).size;
378
+ const MAX = 2_000_000; // last ~2 MB is plenty for `limit` messages
379
+ if (size > MAX) {
380
+ const fd = fs.openSync(p, 'r');
381
+ try {
382
+ const buf = Buffer.alloc(MAX);
383
+ fs.readSync(fd, buf, 0, MAX, size - MAX);
384
+ text = buf.toString('utf8');
385
+ }
386
+ finally {
387
+ fs.closeSync(fd);
388
+ }
389
+ const nl = text.indexOf('\n');
390
+ if (nl >= 0) {
391
+ text = text.slice(nl + 1);
392
+ } // drop the partial first line
393
+ }
394
+ else {
395
+ text = fs.readFileSync(p, 'utf8');
396
+ }
397
+ }
398
+ catch {
399
+ return [];
400
+ }
401
+ const msgs = [];
402
+ for (const line of text.split('\n')) {
403
+ if (!line.trim()) {
404
+ continue;
405
+ }
406
+ try {
407
+ const o = JSON.parse(line);
408
+ const ts = o['timestamp'] ? Date.parse(String(o['timestamp'])) : undefined;
409
+ if (o['type'] === 'user') {
410
+ const t = extractClaudeText(o['message']);
411
+ if (t) {
412
+ msgs.push({ role: 'user', text: t, ts });
413
+ }
414
+ }
415
+ else if (o['type'] === 'assistant') {
416
+ const t = extractClaudeText(o['message']);
417
+ if (t) {
418
+ msgs.push({ role: 'assistant', text: t, ts });
419
+ }
420
+ }
421
+ else if (o['type'] === 'system' && o['content']) {
422
+ msgs.push({ role: 'system', text: String(o['content']).slice(0, 200), ts });
423
+ }
424
+ }
425
+ catch { /* skip */ }
426
+ }
427
+ return msgs.slice(-limit);
428
+ }
429
+ function getClaudeSessionCursor(workspacePath) {
430
+ const p = resolveClaudeJsonl(workspacePath);
431
+ if (!p) {
432
+ return 0;
433
+ }
434
+ try {
435
+ return fs.statSync(p).size;
436
+ }
437
+ catch {
438
+ return 0;
439
+ }
440
+ }
441
+ function formatToolStatus(toolName, input) {
442
+ const base = (p) => (typeof p === 'string' ? path.basename(p) : '');
443
+ switch (toolName) {
444
+ case 'Read': return `Reading ${base(input['file_path'])}`;
445
+ case 'Edit': return `Editing ${base(input['file_path'])}`;
446
+ case 'Write': return `Writing ${base(input['file_path'])}`;
447
+ case 'Bash': {
448
+ const cmd = String(input['command'] ?? '');
449
+ return `Running: ${cmd.length > 60 ? cmd.slice(0, 60) + '\u2026' : cmd}`;
450
+ }
451
+ case 'Glob': return 'Searching files';
452
+ case 'Grep': return 'Searching code';
453
+ case 'WebFetch': return 'Fetching web content';
454
+ case 'WebSearch': return 'Searching the web';
455
+ case 'Task':
456
+ case 'Agent': {
457
+ const desc = typeof input['description'] === 'string' ? input['description'] : '';
458
+ return desc ? `Subtask: ${desc.length > 50 ? desc.slice(0, 50) + '\u2026' : desc}` : 'Running subtask';
459
+ }
460
+ case 'AskUserQuestion': return 'Waiting for answer';
461
+ case 'EnterPlanMode': return 'Planning';
462
+ default: return `Using ${toolName}`;
463
+ }
464
+ }
465
+ function parseClaudeStateSince(workspacePath, fromByte) {
466
+ const result = { hasEndTurn: false, hasProgress: false };
467
+ const p = resolveClaudeJsonl(workspacePath);
468
+ if (!p) {
469
+ return result;
470
+ }
471
+ try {
472
+ const size = fs.statSync(p).size;
473
+ if (size <= fromByte) {
474
+ return result;
475
+ }
476
+ const fd = fs.openSync(p, 'r');
477
+ const buf = Buffer.alloc(size - fromByte);
478
+ fs.readSync(fd, buf, 0, buf.length, fromByte);
479
+ fs.closeSync(fd);
480
+ for (const line of buf.toString('utf8').split('\n')) {
481
+ const t = line.trim();
482
+ if (!t) {
483
+ continue;
484
+ }
485
+ try {
486
+ const record = JSON.parse(t);
487
+ const rtype = record['type'];
488
+ if (rtype === 'assistant') {
489
+ const msgContent = record['message']?.['content']
490
+ ?? record['content'];
491
+ if (Array.isArray(msgContent)) {
492
+ for (const block of msgContent) {
493
+ if (block['type'] === 'tool_use') {
494
+ const name = String(block['name'] ?? '');
495
+ const input = (block['input'] ?? {});
496
+ result.activeToolStatus = formatToolStatus(name, input);
497
+ result.hasEndTurn = false;
498
+ }
499
+ }
500
+ }
501
+ }
502
+ else if (rtype === 'user') {
503
+ const msgContent = record['message']?.['content']
504
+ ?? record['content'];
505
+ if (Array.isArray(msgContent)) {
506
+ const hasToolResult = msgContent
507
+ .some(b => b['type'] === 'tool_result');
508
+ if (!hasToolResult) {
509
+ result.activeToolStatus = undefined;
510
+ result.hasEndTurn = false;
511
+ }
512
+ }
513
+ }
514
+ else if (rtype === 'system') {
515
+ if (record['subtype'] === 'turn_duration') {
516
+ result.hasEndTurn = true;
517
+ result.activeToolStatus = undefined;
518
+ }
519
+ }
520
+ else if (rtype === 'progress') {
521
+ const data = record['data'];
522
+ const dataType = data?.['type'];
523
+ if (dataType === 'bash_progress' || dataType === 'mcp_progress') {
524
+ result.hasProgress = true;
525
+ }
526
+ }
527
+ if (record['stop_reason'] === 'end_turn') {
528
+ result.hasEndTurn = true;
529
+ }
530
+ // Rate limit detection — error:"rate_limit" on assistant records
531
+ if (record['error'] === 'rate_limit') {
532
+ const msgContent = record['message']?.['content'];
533
+ const text = Array.isArray(msgContent)
534
+ ? msgContent
535
+ .filter(b => b['type'] === 'text')
536
+ .map(b => String(b['text'] ?? '')).join(' ')
537
+ : '';
538
+ if (text) {
539
+ result.rateLimitMessage = text;
540
+ }
541
+ }
542
+ }
543
+ catch { /* skip malformed lines */ }
544
+ }
545
+ }
546
+ catch { /* file unreadable */ }
547
+ return result;
548
+ }
549
+ /** @deprecated Use parseClaudeStateSince instead. */
550
+ function hasClaudeEndTurnSince(workspacePath, fromByte) {
551
+ return parseClaudeStateSince(workspacePath, fromByte).hasEndTurn;
552
+ }
553
+ function readClaudeOutputSince(workspacePath, fromByte) {
554
+ const p = resolveClaudeJsonl(workspacePath);
555
+ if (!p) {
556
+ return '';
557
+ }
558
+ try {
559
+ const size = fs.statSync(p).size;
560
+ if (size <= fromByte) {
561
+ return '';
562
+ }
563
+ const fd = fs.openSync(p, 'r');
564
+ const buf = Buffer.alloc(size - fromByte);
565
+ fs.readSync(fd, buf, 0, buf.length, fromByte);
566
+ fs.closeSync(fd);
567
+ const parts = [];
568
+ for (const line of buf.toString('utf8').split('\n')) {
569
+ const trimmed = line.trim();
570
+ if (!trimmed) {
571
+ continue;
572
+ }
573
+ try {
574
+ const entry = JSON.parse(trimmed);
575
+ const entryMsg = entry['message'];
576
+ if (entry['type'] === 'assistant' || entryMsg?.role === 'assistant') {
577
+ const content = entryMsg?.content;
578
+ if (typeof content === 'string') {
579
+ parts.push(content);
580
+ }
581
+ else if (Array.isArray(content)) {
582
+ for (const part of content) {
583
+ if (part.type === 'text' && part.text) {
584
+ parts.push(part.text);
585
+ }
586
+ }
587
+ }
588
+ }
589
+ }
590
+ catch { /* skip malformed lines */ }
591
+ }
592
+ return parts.join('\n\n');
593
+ }
594
+ catch {
595
+ return '';
596
+ }
597
+ }
598
+ // ---------------------------------------------------------------------------
599
+ // Claude CLI command builder
600
+ // ---------------------------------------------------------------------------
601
+ /** Build the shell command string for the claude-cli provider. */
602
+ function buildClaudeCliCommand(agentProfileFile, messageFile, sessionId, includeProfile = true, model) {
603
+ const resume = sessionId ? ` --resume ${sessionId}` : '';
604
+ const resolvedModel = model?.replace(/-1m$/i, '');
605
+ const modelFlag = resolvedModel ? ` --model ${resolvedModel}` : '';
606
+ // -p takes ONE prompt argument. Concatenate both @file refs into a single
607
+ // quoted string so Claude sees both — passing them as two args drops the
608
+ // second one silently (claude consumes the first as the prompt).
609
+ const promptArg = includeProfile
610
+ ? JSON.stringify(`@${agentProfileFile} @${messageFile}`)
611
+ : JSON.stringify(`@${messageFile}`);
612
+ return `claude --allow-dangerously-skip-permissions --dangerously-skip-permissions${resume}${modelFlag} -p ${promptArg}`;
613
+ }
614
+ /**
615
+ * Run a tiny probe prompt via Node exec to obtain a claude-cli session ID
616
+ * before the main prompt runs. Extracts "session_id" from --output-format json output.
617
+ */
618
+ function probeClaudeSession(cwd, log) {
619
+ return new Promise(resolve => {
620
+ const cmd = `claude --dangerously-skip-permissions --output-format json -p "."`;
621
+ log(`Claude CLI probe: ${cmd}`);
622
+ (0, child_process_1.exec)(cmd, { cwd, encoding: 'utf8', timeout: 30000 }, (_err, stdout) => {
623
+ const id = (stdout ?? '').match(/"session_id"\s*:\s*"([^"]+)"/)?.[1];
624
+ log(`Claude CLI probe result: ${id ?? 'no session ID found'}`);
625
+ resolve(id);
626
+ });
627
+ });
628
+ }
629
+ /**
630
+ * Run `/compact` on an existing Claude session to summarise conversation
631
+ * history and free up context window space. Used after Claude returns
632
+ * `prompt is too long: N tokens > MAX maximum` (HTTP 400). Resolves on exit
633
+ * (success or failure — caller decides what to do).
634
+ */
635
+ function runClaudeCompact(sessionId, cwd, log) {
636
+ return new Promise((resolve, reject) => {
637
+ // /compact is a slash-command Claude understands in non-interactive mode.
638
+ // --resume re-attaches to the same session before running it.
639
+ const cmd = `claude --dangerously-skip-permissions --resume ${sessionId} -p "/compact"`;
640
+ log(`Claude compact: ${cmd}`);
641
+ (0, child_process_1.exec)(cmd, { cwd, encoding: 'utf8', timeout: 180_000, maxBuffer: 32 * 1024 * 1024 }, (err, stdout) => {
642
+ if (err) {
643
+ log(`Claude compact stderr: ${(err.message ?? '').slice(0, 300)}`);
644
+ reject(err);
645
+ }
646
+ else {
647
+ log(`Claude compact done (${stdout.length} bytes of output)`);
648
+ resolve();
649
+ }
650
+ });
651
+ });
652
+ }
653
+ /**
654
+ * Run `/clear` on an existing Claude session to wipe the conversation history
655
+ * and start fresh. Used when autocompact is thrashing (context refills to
656
+ * limit immediately after compact). Resolves on exit.
657
+ */
658
+ function runClaudeClear(sessionId, cwd, log) {
659
+ return new Promise((resolve, reject) => {
660
+ const cmd = `claude --dangerously-skip-permissions --resume ${sessionId} -p "/clear"`;
661
+ log(`Claude clear: ${cmd}`);
662
+ (0, child_process_1.exec)(cmd, { cwd, encoding: 'utf8', timeout: 60_000, maxBuffer: 32 * 1024 * 1024 }, (err, stdout) => {
663
+ if (err) {
664
+ log(`Claude clear stderr: ${(err.message ?? '').slice(0, 300)}`);
665
+ reject(err);
666
+ }
667
+ else {
668
+ log(`Claude clear done (${stdout.length} bytes of output)`);
669
+ resolve();
670
+ }
671
+ });
672
+ });
673
+ }
674
+ //# sourceMappingURL=cli.js.map