agor-live 0.3.7

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 (297) hide show
  1. package/LICENSE +94 -0
  2. package/README.md +163 -0
  3. package/bin/agor-daemon.js +20 -0
  4. package/bin/agor.js +14 -0
  5. package/dist/cli/base-command.d.ts +29 -0
  6. package/dist/cli/base-command.js +41 -0
  7. package/dist/cli/commands/board/add-session.d.ts +15 -0
  8. package/dist/cli/commands/board/add-session.js +102 -0
  9. package/dist/cli/commands/board/list.d.ts +14 -0
  10. package/dist/cli/commands/board/list.js +74 -0
  11. package/dist/cli/commands/config/clear.d.ts +13 -0
  12. package/dist/cli/commands/config/clear.js +21 -0
  13. package/dist/cli/commands/config/get.d.ts +13 -0
  14. package/dist/cli/commands/config/get.js +41 -0
  15. package/dist/cli/commands/config/index.d.ts +13 -0
  16. package/dist/cli/commands/config/index.js +118 -0
  17. package/dist/cli/commands/config/set.d.ts +14 -0
  18. package/dist/cli/commands/config/set.js +50 -0
  19. package/dist/cli/commands/config/unset.d.ts +13 -0
  20. package/dist/cli/commands/config/unset.js +35 -0
  21. package/dist/cli/commands/daemon/index.d.ts +13 -0
  22. package/dist/cli/commands/daemon/index.js +65 -0
  23. package/dist/cli/commands/daemon/logs.d.ts +13 -0
  24. package/dist/cli/commands/daemon/logs.js +78 -0
  25. package/dist/cli/commands/daemon/restart.d.ts +13 -0
  26. package/dist/cli/commands/daemon/restart.js +177 -0
  27. package/dist/cli/commands/daemon/start.d.ts +13 -0
  28. package/dist/cli/commands/daemon/start.js +193 -0
  29. package/dist/cli/commands/daemon/status.d.ts +13 -0
  30. package/dist/cli/commands/daemon/status.js +93 -0
  31. package/dist/cli/commands/daemon/stop.d.ts +13 -0
  32. package/dist/cli/commands/daemon/stop.js +108 -0
  33. package/dist/cli/commands/init.d.ts +44 -0
  34. package/dist/cli/commands/init.js +459 -0
  35. package/dist/cli/commands/mcp/add.d.ts +26 -0
  36. package/dist/cli/commands/mcp/add.js +162 -0
  37. package/dist/cli/commands/mcp/list.d.ts +16 -0
  38. package/dist/cli/commands/mcp/list.js +89 -0
  39. package/dist/cli/commands/mcp/remove.d.ts +17 -0
  40. package/dist/cli/commands/mcp/remove.js +86 -0
  41. package/dist/cli/commands/mcp/show.d.ts +14 -0
  42. package/dist/cli/commands/mcp/show.js +131 -0
  43. package/dist/cli/commands/repo/add.d.ts +16 -0
  44. package/dist/cli/commands/repo/add.js +105 -0
  45. package/dist/cli/commands/repo/list.d.ts +17 -0
  46. package/dist/cli/commands/repo/list.js +99 -0
  47. package/dist/cli/commands/repo/rm.d.ts +17 -0
  48. package/dist/cli/commands/repo/rm.js +126 -0
  49. package/dist/cli/commands/repo/worktree/add.d.ts +21 -0
  50. package/dist/cli/commands/repo/worktree/add.js +145 -0
  51. package/dist/cli/commands/repo/worktree/list.d.ts +21 -0
  52. package/dist/cli/commands/repo/worktree/list.js +136 -0
  53. package/dist/cli/commands/session/list.d.ts +30 -0
  54. package/dist/cli/commands/session/list.js +204 -0
  55. package/dist/cli/commands/session/load-claude.d.ts +16 -0
  56. package/dist/cli/commands/session/load-claude.js +211 -0
  57. package/dist/cli/commands/user/create-admin.d.ts +13 -0
  58. package/dist/cli/commands/user/create-admin.js +65 -0
  59. package/dist/cli/commands/user/create.d.ts +16 -0
  60. package/dist/cli/commands/user/create.js +126 -0
  61. package/dist/cli/commands/user/delete.d.ts +16 -0
  62. package/dist/cli/commands/user/delete.js +77 -0
  63. package/dist/cli/commands/user/list.d.ts +13 -0
  64. package/dist/cli/commands/user/list.js +78 -0
  65. package/dist/cli/commands/user/update.d.ts +19 -0
  66. package/dist/cli/commands/user/update.js +149 -0
  67. package/dist/cli/hooks/command-not-found.d.ts +9 -0
  68. package/dist/cli/hooks/command-not-found.js +14 -0
  69. package/dist/cli/lib/banner.d.ts +25 -0
  70. package/dist/cli/lib/banner.js +25 -0
  71. package/dist/cli/lib/context.d.ts +27 -0
  72. package/dist/cli/lib/context.js +32 -0
  73. package/dist/cli/lib/daemon-manager.d.ts +48 -0
  74. package/dist/cli/lib/daemon-manager.js +109 -0
  75. package/dist/cli/lib/help.d.ts +13 -0
  76. package/dist/cli/lib/help.js +46 -0
  77. package/dist/core/agentic-tool-B_gFNpk5.d.ts +33 -0
  78. package/dist/core/agentic-tool-DsyX8diw.d.cts +33 -0
  79. package/dist/core/api/index.cjs +98 -0
  80. package/dist/core/api/index.d.cts +174 -0
  81. package/dist/core/api/index.d.ts +174 -0
  82. package/dist/core/api/index.js +62 -0
  83. package/dist/core/board-comment-BUm0fpmD.d.cts +134 -0
  84. package/dist/core/board-comment-gC_-twPx.d.ts +134 -0
  85. package/dist/core/claude/index.cjs +673 -0
  86. package/dist/core/claude/index.d.cts +124 -0
  87. package/dist/core/claude/index.d.ts +124 -0
  88. package/dist/core/claude/index.js +629 -0
  89. package/dist/core/config/browser.cjs +165 -0
  90. package/dist/core/config/browser.d.cts +289 -0
  91. package/dist/core/config/browser.d.ts +289 -0
  92. package/dist/core/config/browser.js +131 -0
  93. package/dist/core/config/index.cjs +518 -0
  94. package/dist/core/config/index.d.cts +246 -0
  95. package/dist/core/config/index.d.ts +246 -0
  96. package/dist/core/config/index.js +451 -0
  97. package/dist/core/db/index.cjs +3726 -0
  98. package/dist/core/db/index.d.cts +631 -0
  99. package/dist/core/db/index.d.ts +631 -0
  100. package/dist/core/db/index.js +3649 -0
  101. package/dist/core/dist/agentic-tool-B_gFNpk5.d.ts +33 -0
  102. package/dist/core/dist/agentic-tool-DsyX8diw.d.cts +33 -0
  103. package/dist/core/dist/api/index.cjs +98 -0
  104. package/dist/core/dist/api/index.d.cts +174 -0
  105. package/dist/core/dist/api/index.d.ts +174 -0
  106. package/dist/core/dist/api/index.js +62 -0
  107. package/dist/core/dist/board-comment-BUm0fpmD.d.cts +134 -0
  108. package/dist/core/dist/board-comment-gC_-twPx.d.ts +134 -0
  109. package/dist/core/dist/claude/index.cjs +673 -0
  110. package/dist/core/dist/claude/index.d.cts +124 -0
  111. package/dist/core/dist/claude/index.d.ts +124 -0
  112. package/dist/core/dist/claude/index.js +629 -0
  113. package/dist/core/dist/config/browser.cjs +165 -0
  114. package/dist/core/dist/config/browser.d.cts +289 -0
  115. package/dist/core/dist/config/browser.d.ts +289 -0
  116. package/dist/core/dist/config/browser.js +131 -0
  117. package/dist/core/dist/config/index.cjs +518 -0
  118. package/dist/core/dist/config/index.d.cts +246 -0
  119. package/dist/core/dist/config/index.d.ts +246 -0
  120. package/dist/core/dist/config/index.js +451 -0
  121. package/dist/core/dist/db/index.cjs +3726 -0
  122. package/dist/core/dist/db/index.d.cts +631 -0
  123. package/dist/core/dist/db/index.d.ts +631 -0
  124. package/dist/core/dist/db/index.js +3649 -0
  125. package/dist/core/dist/environment/variable-resolver.cjs +92 -0
  126. package/dist/core/dist/environment/variable-resolver.d.cts +52 -0
  127. package/dist/core/dist/environment/variable-resolver.d.ts +52 -0
  128. package/dist/core/dist/environment/variable-resolver.js +53 -0
  129. package/dist/core/dist/feathers/index.cjs +66 -0
  130. package/dist/core/dist/feathers/index.d.cts +7 -0
  131. package/dist/core/dist/feathers/index.d.ts +7 -0
  132. package/dist/core/dist/feathers/index.js +25 -0
  133. package/dist/core/dist/feathers-BzHEPnpl.d.cts +228 -0
  134. package/dist/core/dist/feathers-BzHEPnpl.d.ts +228 -0
  135. package/dist/core/dist/git/index.cjs +302 -0
  136. package/dist/core/dist/git/index.d.cts +137 -0
  137. package/dist/core/dist/git/index.d.ts +137 -0
  138. package/dist/core/dist/git/index.js +260 -0
  139. package/dist/core/dist/id-DMqyogFB.d.cts +131 -0
  140. package/dist/core/dist/id-DMqyogFB.d.ts +131 -0
  141. package/dist/core/dist/index.cjs +4653 -0
  142. package/dist/core/dist/index.d.cts +23 -0
  143. package/dist/core/dist/index.d.ts +23 -0
  144. package/dist/core/dist/index.js +4509 -0
  145. package/dist/core/dist/message-BoxZISHg.d.cts +120 -0
  146. package/dist/core/dist/message-DvBzHu7V.d.ts +120 -0
  147. package/dist/core/dist/permissions/index.cjs +112 -0
  148. package/dist/core/dist/permissions/index.d.cts +81 -0
  149. package/dist/core/dist/permissions/index.d.ts +81 -0
  150. package/dist/core/dist/permissions/index.js +85 -0
  151. package/dist/core/dist/repo-3CUrCRbq.d.cts +405 -0
  152. package/dist/core/dist/repo-CnvJ0B6-.d.ts +405 -0
  153. package/dist/core/dist/session-BPjJlVdZ.d.cts +429 -0
  154. package/dist/core/dist/session-wAzjHatv.d.ts +429 -0
  155. package/dist/core/dist/task-BIEgT1DK.d.cts +163 -0
  156. package/dist/core/dist/task-DuIfiUbW.d.ts +163 -0
  157. package/dist/core/dist/templates/handlebars-helpers.cjs +156 -0
  158. package/dist/core/dist/templates/handlebars-helpers.d.cts +45 -0
  159. package/dist/core/dist/templates/handlebars-helpers.d.ts +45 -0
  160. package/dist/core/dist/templates/handlebars-helpers.js +119 -0
  161. package/dist/core/dist/tools/claude/models.cjs +70 -0
  162. package/dist/core/dist/tools/claude/models.d.cts +27 -0
  163. package/dist/core/dist/tools/claude/models.d.ts +27 -0
  164. package/dist/core/dist/tools/claude/models.js +44 -0
  165. package/dist/core/dist/tools/index.cjs +3367 -0
  166. package/dist/core/dist/tools/index.d.cts +967 -0
  167. package/dist/core/dist/tools/index.d.ts +967 -0
  168. package/dist/core/dist/tools/index.js +3314 -0
  169. package/dist/core/dist/tools/models.cjs +119 -0
  170. package/dist/core/dist/tools/models.d.cts +47 -0
  171. package/dist/core/dist/tools/models.d.ts +47 -0
  172. package/dist/core/dist/tools/models.js +86 -0
  173. package/dist/core/dist/types/index.cjs +152 -0
  174. package/dist/core/dist/types/index.d.cts +214 -0
  175. package/dist/core/dist/types/index.d.ts +214 -0
  176. package/dist/core/dist/types/index.js +112 -0
  177. package/dist/core/dist/user-BmL3kFol.d.ts +50 -0
  178. package/dist/core/dist/user-eUuKj7yM.d.cts +50 -0
  179. package/dist/core/dist/utils/pricing.cjs +102 -0
  180. package/dist/core/dist/utils/pricing.d.cts +43 -0
  181. package/dist/core/dist/utils/pricing.d.ts +43 -0
  182. package/dist/core/dist/utils/pricing.js +75 -0
  183. package/dist/core/dist/worktrees-BzIxB1U6.d.cts +2745 -0
  184. package/dist/core/dist/worktrees-CYem1ya2.d.ts +2745 -0
  185. package/dist/core/environment/variable-resolver.cjs +92 -0
  186. package/dist/core/environment/variable-resolver.d.cts +52 -0
  187. package/dist/core/environment/variable-resolver.d.ts +52 -0
  188. package/dist/core/environment/variable-resolver.js +53 -0
  189. package/dist/core/feathers/index.cjs +66 -0
  190. package/dist/core/feathers/index.d.cts +7 -0
  191. package/dist/core/feathers/index.d.ts +7 -0
  192. package/dist/core/feathers/index.js +25 -0
  193. package/dist/core/feathers-BzHEPnpl.d.cts +228 -0
  194. package/dist/core/feathers-BzHEPnpl.d.ts +228 -0
  195. package/dist/core/git/index.cjs +302 -0
  196. package/dist/core/git/index.d.cts +137 -0
  197. package/dist/core/git/index.d.ts +137 -0
  198. package/dist/core/git/index.js +260 -0
  199. package/dist/core/id-DMqyogFB.d.cts +131 -0
  200. package/dist/core/id-DMqyogFB.d.ts +131 -0
  201. package/dist/core/index.cjs +4653 -0
  202. package/dist/core/index.d.cts +23 -0
  203. package/dist/core/index.d.ts +23 -0
  204. package/dist/core/index.js +4509 -0
  205. package/dist/core/message-BoxZISHg.d.cts +120 -0
  206. package/dist/core/message-DvBzHu7V.d.ts +120 -0
  207. package/dist/core/package.json +133 -0
  208. package/dist/core/permissions/index.cjs +112 -0
  209. package/dist/core/permissions/index.d.cts +81 -0
  210. package/dist/core/permissions/index.d.ts +81 -0
  211. package/dist/core/permissions/index.js +85 -0
  212. package/dist/core/repo-3CUrCRbq.d.cts +405 -0
  213. package/dist/core/repo-CnvJ0B6-.d.ts +405 -0
  214. package/dist/core/session-BPjJlVdZ.d.cts +429 -0
  215. package/dist/core/session-wAzjHatv.d.ts +429 -0
  216. package/dist/core/task-BIEgT1DK.d.cts +163 -0
  217. package/dist/core/task-DuIfiUbW.d.ts +163 -0
  218. package/dist/core/templates/handlebars-helpers.cjs +156 -0
  219. package/dist/core/templates/handlebars-helpers.d.cts +45 -0
  220. package/dist/core/templates/handlebars-helpers.d.ts +45 -0
  221. package/dist/core/templates/handlebars-helpers.js +119 -0
  222. package/dist/core/tools/claude/models.cjs +70 -0
  223. package/dist/core/tools/claude/models.d.cts +27 -0
  224. package/dist/core/tools/claude/models.d.ts +27 -0
  225. package/dist/core/tools/claude/models.js +44 -0
  226. package/dist/core/tools/index.cjs +3367 -0
  227. package/dist/core/tools/index.d.cts +967 -0
  228. package/dist/core/tools/index.d.ts +967 -0
  229. package/dist/core/tools/index.js +3314 -0
  230. package/dist/core/tools/models.cjs +119 -0
  231. package/dist/core/tools/models.d.cts +47 -0
  232. package/dist/core/tools/models.d.ts +47 -0
  233. package/dist/core/tools/models.js +86 -0
  234. package/dist/core/types/index.cjs +152 -0
  235. package/dist/core/types/index.d.cts +214 -0
  236. package/dist/core/types/index.d.ts +214 -0
  237. package/dist/core/types/index.js +112 -0
  238. package/dist/core/user-BmL3kFol.d.ts +50 -0
  239. package/dist/core/user-eUuKj7yM.d.cts +50 -0
  240. package/dist/core/utils/pricing.cjs +102 -0
  241. package/dist/core/utils/pricing.d.cts +43 -0
  242. package/dist/core/utils/pricing.d.ts +43 -0
  243. package/dist/core/utils/pricing.js +75 -0
  244. package/dist/core/worktrees-BzIxB1U6.d.cts +2745 -0
  245. package/dist/core/worktrees-CYem1ya2.d.ts +2745 -0
  246. package/dist/daemon/adapters/drizzle.d.ts +114 -0
  247. package/dist/daemon/adapters/drizzle.js +219 -0
  248. package/dist/daemon/declarations.d.ts +101 -0
  249. package/dist/daemon/declarations.js +0 -0
  250. package/dist/daemon/index.d.ts +2 -0
  251. package/dist/daemon/index.js +4093 -0
  252. package/dist/daemon/mcp/routes.d.ts +15 -0
  253. package/dist/daemon/mcp/routes.js +641 -0
  254. package/dist/daemon/mcp/tokens.d.ts +50 -0
  255. package/dist/daemon/mcp/tokens.js +85 -0
  256. package/dist/daemon/services/board-comments.d.ts +97 -0
  257. package/dist/daemon/services/board-comments.js +326 -0
  258. package/dist/daemon/services/board-objects.d.ts +71 -0
  259. package/dist/daemon/services/board-objects.js +117 -0
  260. package/dist/daemon/services/boards.d.ts +64 -0
  261. package/dist/daemon/services/boards.js +286 -0
  262. package/dist/daemon/services/config.d.ts +35 -0
  263. package/dist/daemon/services/config.js +68 -0
  264. package/dist/daemon/services/context.d.ts +55 -0
  265. package/dist/daemon/services/context.js +113 -0
  266. package/dist/daemon/services/health-monitor.d.ts +58 -0
  267. package/dist/daemon/services/health-monitor.js +158 -0
  268. package/dist/daemon/services/mcp-servers.d.ts +42 -0
  269. package/dist/daemon/services/mcp-servers.js +275 -0
  270. package/dist/daemon/services/messages.d.ts +49 -0
  271. package/dist/daemon/services/messages.js +269 -0
  272. package/dist/daemon/services/repos.d.ts +61 -0
  273. package/dist/daemon/services/repos.js +350 -0
  274. package/dist/daemon/services/session-mcp-servers.d.ts +56 -0
  275. package/dist/daemon/services/session-mcp-servers.js +51 -0
  276. package/dist/daemon/services/sessions.d.ts +64 -0
  277. package/dist/daemon/services/sessions.js +398 -0
  278. package/dist/daemon/services/tasks.d.ts +55 -0
  279. package/dist/daemon/services/tasks.js +318 -0
  280. package/dist/daemon/services/terminals.d.ts +75 -0
  281. package/dist/daemon/services/terminals.js +110 -0
  282. package/dist/daemon/services/users.d.ts +98 -0
  283. package/dist/daemon/services/users.js +177 -0
  284. package/dist/daemon/services/worktrees.d.ts +98 -0
  285. package/dist/daemon/services/worktrees.js +719 -0
  286. package/dist/daemon/strategies/anonymous.d.ts +20 -0
  287. package/dist/daemon/strategies/anonymous.js +32 -0
  288. package/dist/ui/assets/cc-CYmbalCD.png +0 -0
  289. package/dist/ui/assets/codex-4sLD1mVS.png +0 -0
  290. package/dist/ui/assets/cursor-BUy5pFVL.png +0 -0
  291. package/dist/ui/assets/gemini-ajOb7iAl.png +0 -0
  292. package/dist/ui/assets/index-Dc4ELxry.css +32 -0
  293. package/dist/ui/assets/index-KfIu8v4V.js +578 -0
  294. package/dist/ui/favicon.png +0 -0
  295. package/dist/ui/index.html +26 -0
  296. package/dist/ui/vite.svg +1 -0
  297. package/package.json +90 -0
@@ -0,0 +1,673 @@
1
+ "use strict";
2
+ var __create = Object.create;
3
+ var __defProp = Object.defineProperty;
4
+ var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
5
+ var __getOwnPropNames = Object.getOwnPropertyNames;
6
+ var __getProtoOf = Object.getPrototypeOf;
7
+ var __hasOwnProp = Object.prototype.hasOwnProperty;
8
+ var __esm = (fn, res) => function __init() {
9
+ return fn && (res = (0, fn[__getOwnPropNames(fn)[0]])(fn = 0)), res;
10
+ };
11
+ var __export = (target, all) => {
12
+ for (var name in all)
13
+ __defProp(target, name, { get: all[name], enumerable: true });
14
+ };
15
+ var __copyProps = (to, from, except, desc2) => {
16
+ if (from && typeof from === "object" || typeof from === "function") {
17
+ for (let key of __getOwnPropNames(from))
18
+ if (!__hasOwnProp.call(to, key) && key !== except)
19
+ __defProp(to, key, { get: () => from[key], enumerable: !(desc2 = __getOwnPropDesc(from, key)) || desc2.enumerable });
20
+ }
21
+ return to;
22
+ };
23
+ var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__getProtoOf(mod)) : {}, __copyProps(
24
+ // If the importer is in node compatibility mode or this is not an ESM
25
+ // file that has been converted to a CommonJS file using a Babel-
26
+ // compatible transform (i.e. "__esModule" has not been set), then set
27
+ // "default" to the CommonJS "module.exports" for node compatibility.
28
+ isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", { value: mod, enumerable: true }) : target,
29
+ mod
30
+ ));
31
+ var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
32
+
33
+ // src/lib/ids.ts
34
+ function generateId() {
35
+ return (0, import_uuidv7.uuidv7)();
36
+ }
37
+ var import_uuidv7;
38
+ var init_ids = __esm({
39
+ "src/lib/ids.ts"() {
40
+ "use strict";
41
+ import_uuidv7 = require("uuidv7");
42
+ }
43
+ });
44
+
45
+ // src/claude/index.ts
46
+ var claude_exports = {};
47
+ __export(claude_exports, {
48
+ buildConversationTree: () => buildConversationTree,
49
+ extractTasksFromMessages: () => extractTasksFromMessages,
50
+ filterConversationMessages: () => filterConversationMessages,
51
+ getTranscriptPath: () => getTranscriptPath,
52
+ loadClaudeSession: () => loadClaudeSession,
53
+ loadSessionTranscript: () => loadSessionTranscript,
54
+ parseTranscript: () => parseTranscript,
55
+ transcriptToMessage: () => transcriptToMessage,
56
+ transcriptsToMessages: () => transcriptsToMessages
57
+ });
58
+ module.exports = __toCommonJS(claude_exports);
59
+
60
+ // src/claude/transcript-parser.ts
61
+ var import_node_fs = __toESM(require("fs"), 1);
62
+ var import_node_path = __toESM(require("path"), 1);
63
+ var import_node_readline = __toESM(require("readline"), 1);
64
+ function getTranscriptPath(sessionId, projectDir) {
65
+ const homeDir = process.env.HOME || process.env.USERPROFILE;
66
+ if (!homeDir) {
67
+ throw new Error("Could not determine home directory");
68
+ }
69
+ const cwd = projectDir || process.cwd();
70
+ const projectSlug = cwd.replace(/\//g, "-").replace(/\\/g, "-");
71
+ const transcriptPath = import_node_path.default.join(
72
+ homeDir,
73
+ ".claude",
74
+ "projects",
75
+ projectSlug,
76
+ `${sessionId}.jsonl`
77
+ );
78
+ return transcriptPath;
79
+ }
80
+ async function parseTranscript(transcriptPath) {
81
+ if (!import_node_fs.default.existsSync(transcriptPath)) {
82
+ throw new Error(`Transcript file not found: ${transcriptPath}`);
83
+ }
84
+ const messages2 = [];
85
+ const fileStream = import_node_fs.default.createReadStream(transcriptPath);
86
+ const rl = import_node_readline.default.createInterface({
87
+ input: fileStream,
88
+ crlfDelay: Number.POSITIVE_INFINITY
89
+ });
90
+ for await (const line of rl) {
91
+ if (!line.trim()) continue;
92
+ try {
93
+ const message = JSON.parse(line);
94
+ messages2.push(message);
95
+ } catch (error) {
96
+ console.error(`Failed to parse line: ${line.substring(0, 100)}...`);
97
+ throw error;
98
+ }
99
+ }
100
+ return messages2;
101
+ }
102
+ async function loadSessionTranscript(sessionId, projectDir) {
103
+ const transcriptPath = getTranscriptPath(sessionId, projectDir);
104
+ return parseTranscript(transcriptPath);
105
+ }
106
+ function filterConversationMessages(messages2) {
107
+ return messages2.filter((msg) => {
108
+ if (msg.type === "file-history-snapshot") return false;
109
+ if (msg.isMeta) return false;
110
+ const content = msg.message?.content;
111
+ if (Array.isArray(content) && content.some((c) => c.type === "tool_result")) {
112
+ return false;
113
+ }
114
+ if (typeof content === "string") {
115
+ if (content.trim().match(/^<(command-name|local-command-stdout|system-reminder)/)) {
116
+ return false;
117
+ }
118
+ }
119
+ return msg.type === "user" || msg.type === "assistant";
120
+ });
121
+ }
122
+ function buildConversationTree(messages2) {
123
+ const messageMap = /* @__PURE__ */ new Map();
124
+ const roots = [];
125
+ for (const message of messages2) {
126
+ if (!message.uuid) continue;
127
+ const node = {
128
+ message,
129
+ children: []
130
+ };
131
+ messageMap.set(message.uuid, node);
132
+ }
133
+ for (const message of messages2) {
134
+ if (!message.uuid) continue;
135
+ const node = messageMap.get(message.uuid);
136
+ if (!node) continue;
137
+ if (!message.parentUuid) {
138
+ roots.push(node);
139
+ } else {
140
+ const parent = messageMap.get(message.parentUuid);
141
+ if (parent) {
142
+ parent.children.push(node);
143
+ } else {
144
+ roots.push(node);
145
+ }
146
+ }
147
+ }
148
+ return roots;
149
+ }
150
+
151
+ // src/claude/load-session.ts
152
+ async function loadClaudeSession(sessionId, projectDir) {
153
+ const transcriptPath = getTranscriptPath(sessionId, projectDir);
154
+ const messages2 = await parseTranscript(transcriptPath);
155
+ const cwdMessage = messages2.find((msg) => msg.cwd);
156
+ const cwd = cwdMessage?.cwd || null;
157
+ return {
158
+ sessionId,
159
+ transcriptPath,
160
+ cwd,
161
+ messages: messages2
162
+ };
163
+ }
164
+
165
+ // src/db/index.ts
166
+ var import_drizzle_orm14 = require("drizzle-orm");
167
+ var import_bcryptjs2 = __toESM(require("bcryptjs"), 1);
168
+ init_ids();
169
+
170
+ // src/db/client.ts
171
+ var import_client = require("@libsql/client");
172
+ var import_libsql = require("drizzle-orm/libsql");
173
+
174
+ // src/db/schema.ts
175
+ var import_drizzle_orm = require("drizzle-orm");
176
+ var import_sqlite_core = require("drizzle-orm/sqlite-core");
177
+ var sessions = (0, import_sqlite_core.sqliteTable)(
178
+ "sessions",
179
+ {
180
+ // Primary identity
181
+ session_id: (0, import_sqlite_core.text)("session_id", { length: 36 }).primaryKey(),
182
+ created_at: (0, import_sqlite_core.integer)("created_at", { mode: "timestamp_ms" }).notNull(),
183
+ updated_at: (0, import_sqlite_core.integer)("updated_at", { mode: "timestamp_ms" }),
184
+ // User attribution
185
+ created_by: (0, import_sqlite_core.text)("created_by", { length: 36 }).notNull().default("anonymous"),
186
+ // Materialized for filtering/joins (cross-DB compatible)
187
+ status: (0, import_sqlite_core.text)("status", {
188
+ enum: ["idle", "running", "completed", "failed"]
189
+ }).notNull(),
190
+ agentic_tool: (0, import_sqlite_core.text)("agentic_tool", {
191
+ enum: ["claude-code", "cursor", "codex", "gemini"]
192
+ }).notNull(),
193
+ board_id: (0, import_sqlite_core.text)("board_id", { length: 36 }),
194
+ // NULL = no board
195
+ // Genealogy (materialized for tree queries)
196
+ parent_session_id: (0, import_sqlite_core.text)("parent_session_id", { length: 36 }),
197
+ forked_from_session_id: (0, import_sqlite_core.text)("forked_from_session_id", { length: 36 }),
198
+ // Worktree reference (REQUIRED: all sessions must have a worktree)
199
+ worktree_id: (0, import_sqlite_core.text)("worktree_id", { length: 36 }).notNull().references(() => worktrees.worktree_id, {
200
+ onDelete: "cascade"
201
+ // Cascade delete sessions when worktree is deleted
202
+ }),
203
+ // JSON blob for everything else (cross-DB via json() type)
204
+ data: (0, import_sqlite_core.text)("data", { mode: "json" }).$type().notNull()
205
+ },
206
+ (table) => ({
207
+ statusIdx: (0, import_sqlite_core.index)("sessions_status_idx").on(table.status),
208
+ agenticToolIdx: (0, import_sqlite_core.index)("sessions_agentic_tool_idx").on(table.agentic_tool),
209
+ boardIdx: (0, import_sqlite_core.index)("sessions_board_idx").on(table.board_id),
210
+ worktreeIdx: (0, import_sqlite_core.index)("sessions_worktree_idx").on(table.worktree_id),
211
+ createdIdx: (0, import_sqlite_core.index)("sessions_created_idx").on(table.created_at),
212
+ parentIdx: (0, import_sqlite_core.index)("sessions_parent_idx").on(table.parent_session_id),
213
+ forkedIdx: (0, import_sqlite_core.index)("sessions_forked_idx").on(table.forked_from_session_id)
214
+ })
215
+ );
216
+ var tasks = (0, import_sqlite_core.sqliteTable)(
217
+ "tasks",
218
+ {
219
+ task_id: (0, import_sqlite_core.text)("task_id", { length: 36 }).primaryKey(),
220
+ session_id: (0, import_sqlite_core.text)("session_id", { length: 36 }).notNull().references(() => sessions.session_id, { onDelete: "cascade" }),
221
+ created_at: (0, import_sqlite_core.integer)("created_at", { mode: "timestamp_ms" }).notNull(),
222
+ completed_at: (0, import_sqlite_core.integer)("completed_at", { mode: "timestamp_ms" }),
223
+ status: (0, import_sqlite_core.text)("status", {
224
+ enum: [
225
+ "created",
226
+ "running",
227
+ "stopping",
228
+ "awaiting_permission",
229
+ "completed",
230
+ "failed",
231
+ "stopped"
232
+ ]
233
+ }).notNull(),
234
+ // User attribution
235
+ created_by: (0, import_sqlite_core.text)("created_by", { length: 36 }).notNull().default("anonymous"),
236
+ data: (0, import_sqlite_core.text)("data", { mode: "json" }).$type().notNull()
237
+ },
238
+ (table) => ({
239
+ sessionIdx: (0, import_sqlite_core.index)("tasks_session_idx").on(table.session_id),
240
+ statusIdx: (0, import_sqlite_core.index)("tasks_status_idx").on(table.status),
241
+ createdIdx: (0, import_sqlite_core.index)("tasks_created_idx").on(table.created_at)
242
+ })
243
+ );
244
+ var messages = (0, import_sqlite_core.sqliteTable)(
245
+ "messages",
246
+ {
247
+ // Primary identity
248
+ message_id: (0, import_sqlite_core.text)("message_id", { length: 36 }).primaryKey(),
249
+ created_at: (0, import_sqlite_core.integer)("created_at", { mode: "timestamp_ms" }).notNull(),
250
+ // Foreign keys (materialized for indexes)
251
+ session_id: (0, import_sqlite_core.text)("session_id", { length: 36 }).notNull().references(() => sessions.session_id, { onDelete: "cascade" }),
252
+ task_id: (0, import_sqlite_core.text)("task_id", { length: 36 }).references(() => tasks.task_id, {
253
+ onDelete: "set null"
254
+ }),
255
+ // Materialized for queries
256
+ type: (0, import_sqlite_core.text)("type", {
257
+ enum: ["user", "assistant", "system", "file-history-snapshot", "permission_request"]
258
+ }).notNull(),
259
+ role: (0, import_sqlite_core.text)("role", {
260
+ enum: ["user", "assistant", "system"]
261
+ }).notNull(),
262
+ index: (0, import_sqlite_core.integer)("index").notNull(),
263
+ // Position in conversation (0-based)
264
+ timestamp: (0, import_sqlite_core.integer)("timestamp", { mode: "timestamp_ms" }).notNull(),
265
+ content_preview: (0, import_sqlite_core.text)("content_preview"),
266
+ // First 200 chars for list views
267
+ // Full data (JSON blob)
268
+ data: (0, import_sqlite_core.text)("data", { mode: "json" }).$type().notNull()
269
+ },
270
+ (table) => ({
271
+ // Indexes for efficient lookups
272
+ sessionIdx: (0, import_sqlite_core.index)("messages_session_id_idx").on(table.session_id),
273
+ taskIdx: (0, import_sqlite_core.index)("messages_task_id_idx").on(table.task_id),
274
+ sessionIndexIdx: (0, import_sqlite_core.index)("messages_session_index_idx").on(table.session_id, table.index)
275
+ })
276
+ );
277
+ var boards = (0, import_sqlite_core.sqliteTable)(
278
+ "boards",
279
+ {
280
+ board_id: (0, import_sqlite_core.text)("board_id", { length: 36 }).primaryKey(),
281
+ created_at: (0, import_sqlite_core.integer)("created_at", { mode: "timestamp_ms" }).notNull(),
282
+ updated_at: (0, import_sqlite_core.integer)("updated_at", { mode: "timestamp_ms" }),
283
+ // User attribution
284
+ created_by: (0, import_sqlite_core.text)("created_by", { length: 36 }).notNull().default("anonymous"),
285
+ // Materialized for lookups
286
+ name: (0, import_sqlite_core.text)("name").notNull(),
287
+ slug: (0, import_sqlite_core.text)("slug").unique(),
288
+ // JSON blob for the rest
289
+ data: (0, import_sqlite_core.text)("data", { mode: "json" }).$type().notNull()
290
+ },
291
+ (table) => ({
292
+ nameIdx: (0, import_sqlite_core.index)("boards_name_idx").on(table.name),
293
+ slugIdx: (0, import_sqlite_core.index)("boards_slug_idx").on(table.slug)
294
+ })
295
+ );
296
+ var repos = (0, import_sqlite_core.sqliteTable)(
297
+ "repos",
298
+ {
299
+ repo_id: (0, import_sqlite_core.text)("repo_id", { length: 36 }).primaryKey(),
300
+ created_at: (0, import_sqlite_core.integer)("created_at", { mode: "timestamp_ms" }).notNull(),
301
+ updated_at: (0, import_sqlite_core.integer)("updated_at", { mode: "timestamp_ms" }),
302
+ // Materialized for querying
303
+ slug: (0, import_sqlite_core.text)("slug").notNull().unique(),
304
+ data: (0, import_sqlite_core.text)("data", { mode: "json" }).$type().notNull()
305
+ },
306
+ (table) => ({
307
+ slugIdx: (0, import_sqlite_core.index)("repos_slug_idx").on(table.slug)
308
+ })
309
+ );
310
+ var worktrees = (0, import_sqlite_core.sqliteTable)(
311
+ "worktrees",
312
+ {
313
+ // Primary identity
314
+ worktree_id: (0, import_sqlite_core.text)("worktree_id", { length: 36 }).primaryKey(),
315
+ repo_id: (0, import_sqlite_core.text)("repo_id", { length: 36 }).notNull().references(() => repos.repo_id, { onDelete: "cascade" }),
316
+ created_at: (0, import_sqlite_core.integer)("created_at", { mode: "timestamp_ms" }).notNull(),
317
+ updated_at: (0, import_sqlite_core.integer)("updated_at", { mode: "timestamp_ms" }),
318
+ // User attribution
319
+ created_by: (0, import_sqlite_core.text)("created_by", { length: 36 }).notNull().default("anonymous"),
320
+ // Materialized for queries
321
+ name: (0, import_sqlite_core.text)("name").notNull(),
322
+ // "feat-auth", "main"
323
+ ref: (0, import_sqlite_core.text)("ref").notNull(),
324
+ // Current branch/tag/commit
325
+ worktree_unique_id: (0, import_sqlite_core.integer)("worktree_unique_id").notNull(),
326
+ // Auto-assigned sequential ID for templates
327
+ // Board relationship (nullable - worktrees can exist without boards)
328
+ board_id: (0, import_sqlite_core.text)("board_id", { length: 36 }).references(() => boards.board_id, {
329
+ onDelete: "set null"
330
+ // If board is deleted, worktree remains but loses board association
331
+ }),
332
+ // JSON blob for everything else
333
+ data: (0, import_sqlite_core.text)("data", { mode: "json" }).$type().notNull()
334
+ },
335
+ (table) => ({
336
+ repoIdx: (0, import_sqlite_core.index)("worktrees_repo_idx").on(table.repo_id),
337
+ nameIdx: (0, import_sqlite_core.index)("worktrees_name_idx").on(table.name),
338
+ refIdx: (0, import_sqlite_core.index)("worktrees_ref_idx").on(table.ref),
339
+ boardIdx: (0, import_sqlite_core.index)("worktrees_board_idx").on(table.board_id),
340
+ createdIdx: (0, import_sqlite_core.index)("worktrees_created_idx").on(table.created_at),
341
+ updatedIdx: (0, import_sqlite_core.index)("worktrees_updated_idx").on(table.updated_at),
342
+ // Composite unique constraint (repo + name)
343
+ uniqueRepoName: (0, import_sqlite_core.index)("worktrees_repo_name_unique").on(table.repo_id, table.name)
344
+ })
345
+ );
346
+ var users = (0, import_sqlite_core.sqliteTable)(
347
+ "users",
348
+ {
349
+ // Primary identity
350
+ user_id: (0, import_sqlite_core.text)("user_id", { length: 36 }).primaryKey(),
351
+ created_at: (0, import_sqlite_core.integer)("created_at", { mode: "timestamp_ms" }).notNull(),
352
+ updated_at: (0, import_sqlite_core.integer)("updated_at", { mode: "timestamp_ms" }),
353
+ // Materialized for auth lookups
354
+ email: (0, import_sqlite_core.text)("email").unique().notNull(),
355
+ password: (0, import_sqlite_core.text)("password").notNull(),
356
+ // bcrypt hashed
357
+ // Basic profile (materialized for display)
358
+ name: (0, import_sqlite_core.text)("name"),
359
+ emoji: (0, import_sqlite_core.text)("emoji"),
360
+ role: (0, import_sqlite_core.text)("role", {
361
+ enum: ["owner", "admin", "member", "viewer"]
362
+ }).notNull().default("member"),
363
+ // Onboarding state
364
+ onboarding_completed: (0, import_sqlite_core.integer)("onboarding_completed", { mode: "boolean" }).notNull().default(false),
365
+ // JSON blob for profile/preferences
366
+ data: (0, import_sqlite_core.text)("data", { mode: "json" }).$type().notNull()
367
+ },
368
+ (table) => ({
369
+ emailIdx: (0, import_sqlite_core.index)("users_email_idx").on(table.email)
370
+ })
371
+ );
372
+ var mcpServers = (0, import_sqlite_core.sqliteTable)(
373
+ "mcp_servers",
374
+ {
375
+ // Primary identity
376
+ mcp_server_id: (0, import_sqlite_core.text)("mcp_server_id", { length: 36 }).primaryKey(),
377
+ created_at: (0, import_sqlite_core.integer)("created_at", { mode: "timestamp_ms" }).notNull(),
378
+ updated_at: (0, import_sqlite_core.integer)("updated_at", { mode: "timestamp_ms" }),
379
+ // Materialized for filtering
380
+ name: (0, import_sqlite_core.text)("name").notNull(),
381
+ // e.g., "filesystem", "sentry"
382
+ transport: (0, import_sqlite_core.text)("transport", {
383
+ enum: ["stdio", "http", "sse"]
384
+ }).notNull(),
385
+ scope: (0, import_sqlite_core.text)("scope", {
386
+ enum: ["global", "team", "repo", "session"]
387
+ }).notNull(),
388
+ enabled: (0, import_sqlite_core.integer)("enabled", { mode: "boolean" }).notNull().default(true),
389
+ // Scope foreign keys (materialized for indexes)
390
+ owner_user_id: (0, import_sqlite_core.text)("owner_user_id", { length: 36 }),
391
+ team_id: (0, import_sqlite_core.text)("team_id", { length: 36 }),
392
+ repo_id: (0, import_sqlite_core.text)("repo_id", { length: 36 }).references(() => repos.repo_id, {
393
+ onDelete: "cascade"
394
+ }),
395
+ session_id: (0, import_sqlite_core.text)("session_id", { length: 36 }).references(() => sessions.session_id, {
396
+ onDelete: "cascade"
397
+ }),
398
+ // Source tracking (materialized for queries)
399
+ source: (0, import_sqlite_core.text)("source", {
400
+ enum: ["user", "imported", "agor"]
401
+ }).notNull(),
402
+ // JSON blob for configuration and capabilities
403
+ data: (0, import_sqlite_core.text)("data", { mode: "json" }).$type().notNull()
404
+ },
405
+ (table) => ({
406
+ nameIdx: (0, import_sqlite_core.index)("mcp_servers_name_idx").on(table.name),
407
+ scopeIdx: (0, import_sqlite_core.index)("mcp_servers_scope_idx").on(table.scope),
408
+ ownerIdx: (0, import_sqlite_core.index)("mcp_servers_owner_idx").on(table.owner_user_id),
409
+ teamIdx: (0, import_sqlite_core.index)("mcp_servers_team_idx").on(table.team_id),
410
+ repoIdx: (0, import_sqlite_core.index)("mcp_servers_repo_idx").on(table.repo_id),
411
+ sessionIdx: (0, import_sqlite_core.index)("mcp_servers_session_idx").on(table.session_id),
412
+ enabledIdx: (0, import_sqlite_core.index)("mcp_servers_enabled_idx").on(table.enabled)
413
+ })
414
+ );
415
+ var boardObjects = (0, import_sqlite_core.sqliteTable)(
416
+ "board_objects",
417
+ {
418
+ // Primary identity
419
+ object_id: (0, import_sqlite_core.text)("object_id", { length: 36 }).primaryKey(),
420
+ board_id: (0, import_sqlite_core.text)("board_id", { length: 36 }).notNull().references(() => boards.board_id, { onDelete: "cascade" }),
421
+ created_at: (0, import_sqlite_core.integer)("created_at", { mode: "timestamp_ms" }).notNull(),
422
+ // Worktree reference
423
+ worktree_id: (0, import_sqlite_core.text)("worktree_id", { length: 36 }).notNull().references(() => worktrees.worktree_id, {
424
+ onDelete: "cascade"
425
+ }),
426
+ // Position data (JSON)
427
+ data: (0, import_sqlite_core.text)("data", { mode: "json" }).$type().notNull()
428
+ },
429
+ (table) => ({
430
+ boardIdx: (0, import_sqlite_core.index)("board_objects_board_idx").on(table.board_id),
431
+ worktreeIdx: (0, import_sqlite_core.index)("board_objects_worktree_idx").on(table.worktree_id)
432
+ })
433
+ );
434
+ var sessionMcpServers = (0, import_sqlite_core.sqliteTable)(
435
+ "session_mcp_servers",
436
+ {
437
+ session_id: (0, import_sqlite_core.text)("session_id", { length: 36 }).notNull().references(() => sessions.session_id, { onDelete: "cascade" }),
438
+ mcp_server_id: (0, import_sqlite_core.text)("mcp_server_id", { length: 36 }).notNull().references(() => mcpServers.mcp_server_id, { onDelete: "cascade" }),
439
+ enabled: (0, import_sqlite_core.integer)("enabled", { mode: "boolean" }).notNull().default(true),
440
+ added_at: (0, import_sqlite_core.integer)("added_at", { mode: "timestamp_ms" }).notNull()
441
+ },
442
+ (table) => ({
443
+ // Composite primary key
444
+ pk: (0, import_sqlite_core.index)("session_mcp_servers_pk").on(table.session_id, table.mcp_server_id),
445
+ // Indexes for queries
446
+ sessionIdx: (0, import_sqlite_core.index)("session_mcp_servers_session_idx").on(table.session_id),
447
+ serverIdx: (0, import_sqlite_core.index)("session_mcp_servers_server_idx").on(table.mcp_server_id),
448
+ enabledIdx: (0, import_sqlite_core.index)("session_mcp_servers_enabled_idx").on(table.session_id, table.enabled)
449
+ })
450
+ );
451
+ var boardComments = (0, import_sqlite_core.sqliteTable)(
452
+ "board_comments",
453
+ {
454
+ // Primary identity
455
+ comment_id: (0, import_sqlite_core.text)("comment_id", { length: 36 }).primaryKey(),
456
+ created_at: (0, import_sqlite_core.integer)("created_at", { mode: "timestamp_ms" }).notNull(),
457
+ updated_at: (0, import_sqlite_core.integer)("updated_at", { mode: "timestamp_ms" }),
458
+ // Scoping & authorship
459
+ board_id: (0, import_sqlite_core.text)("board_id", { length: 36 }).notNull().references(() => boards.board_id, { onDelete: "cascade" }),
460
+ created_by: (0, import_sqlite_core.text)("created_by", { length: 36 }).notNull().default("anonymous"),
461
+ // FLEXIBLE ATTACHMENTS (all optional)
462
+ // Phase 1: board-level only (all NULL)
463
+ // Phase 2: object attachments (session, task, message, worktree)
464
+ // Phase 3: spatial positioning
465
+ session_id: (0, import_sqlite_core.text)("session_id", { length: 36 }).references(() => sessions.session_id, {
466
+ onDelete: "set null"
467
+ }),
468
+ task_id: (0, import_sqlite_core.text)("task_id", { length: 36 }).references(() => tasks.task_id, {
469
+ onDelete: "set null"
470
+ }),
471
+ message_id: (0, import_sqlite_core.text)("message_id", { length: 36 }).references(() => messages.message_id, {
472
+ onDelete: "set null"
473
+ }),
474
+ worktree_id: (0, import_sqlite_core.text)("worktree_id", { length: 36 }).references(() => worktrees.worktree_id, {
475
+ onDelete: "set null"
476
+ }),
477
+ // Content (materialized for display)
478
+ content: (0, import_sqlite_core.text)("content").notNull(),
479
+ // Markdown-supported text
480
+ content_preview: (0, import_sqlite_core.text)("content_preview").notNull(),
481
+ // First 200 chars
482
+ // Thread support (optional)
483
+ parent_comment_id: (0, import_sqlite_core.text)("parent_comment_id", { length: 36 }),
484
+ // Metadata (materialized for filtering)
485
+ resolved: (0, import_sqlite_core.integer)("resolved", { mode: "boolean" }).notNull().default(false),
486
+ edited: (0, import_sqlite_core.integer)("edited", { mode: "boolean" }).notNull().default(false),
487
+ // Reactions (for BOTH thread roots and replies)
488
+ // Stored as JSON array: [{ user_id: "abc", emoji: "👍" }, ...]
489
+ // Display grouped by emoji: { "👍": ["alice", "bob"], "🎉": ["charlie"] }
490
+ reactions: (0, import_sqlite_core.text)("reactions", { mode: "json" }).$type().notNull().default(import_drizzle_orm.sql`'[]'`),
491
+ // JSON blob for advanced features
492
+ data: (0, import_sqlite_core.text)("data", { mode: "json" }).$type().notNull()
493
+ },
494
+ (table) => ({
495
+ boardIdx: (0, import_sqlite_core.index)("board_comments_board_idx").on(table.board_id),
496
+ sessionIdx: (0, import_sqlite_core.index)("board_comments_session_idx").on(table.session_id),
497
+ taskIdx: (0, import_sqlite_core.index)("board_comments_task_idx").on(table.task_id),
498
+ messageIdx: (0, import_sqlite_core.index)("board_comments_message_idx").on(table.message_id),
499
+ worktreeIdx: (0, import_sqlite_core.index)("board_comments_worktree_idx").on(table.worktree_id),
500
+ createdByIdx: (0, import_sqlite_core.index)("board_comments_created_by_idx").on(table.created_by),
501
+ parentIdx: (0, import_sqlite_core.index)("board_comments_parent_idx").on(table.parent_comment_id),
502
+ createdIdx: (0, import_sqlite_core.index)("board_comments_created_idx").on(table.created_at),
503
+ resolvedIdx: (0, import_sqlite_core.index)("board_comments_resolved_idx").on(table.resolved)
504
+ })
505
+ );
506
+
507
+ // src/db/migrate.ts
508
+ var import_drizzle_orm2 = require("drizzle-orm");
509
+ var import_migrator = require("drizzle-orm/libsql/migrator");
510
+
511
+ // src/db/repositories/board-comments.ts
512
+ var import_drizzle_orm3 = require("drizzle-orm");
513
+ init_ids();
514
+
515
+ // src/db/repositories/board-objects.ts
516
+ var import_drizzle_orm4 = require("drizzle-orm");
517
+ init_ids();
518
+
519
+ // src/db/repositories/boards.ts
520
+ var import_drizzle_orm5 = require("drizzle-orm");
521
+ init_ids();
522
+
523
+ // src/db/repositories/mcp-servers.ts
524
+ var import_drizzle_orm6 = require("drizzle-orm");
525
+ init_ids();
526
+
527
+ // src/db/repositories/messages.ts
528
+ var import_drizzle_orm7 = require("drizzle-orm");
529
+
530
+ // src/db/repositories/repos.ts
531
+ var import_drizzle_orm8 = require("drizzle-orm");
532
+ init_ids();
533
+
534
+ // src/db/repositories/session-mcp-servers.ts
535
+ var import_drizzle_orm10 = require("drizzle-orm");
536
+
537
+ // src/types/task.ts
538
+ var TaskStatus = {
539
+ CREATED: "created",
540
+ RUNNING: "running",
541
+ STOPPING: "stopping",
542
+ // Stop requested, waiting for SDK to halt
543
+ AWAITING_PERMISSION: "awaiting_permission",
544
+ COMPLETED: "completed",
545
+ FAILED: "failed",
546
+ STOPPED: "stopped"
547
+ // User-requested stop (distinct from failed)
548
+ };
549
+
550
+ // src/db/repositories/sessions.ts
551
+ var import_drizzle_orm9 = require("drizzle-orm");
552
+ init_ids();
553
+
554
+ // src/db/repositories/tasks.ts
555
+ var import_drizzle_orm11 = require("drizzle-orm");
556
+ init_ids();
557
+
558
+ // src/db/repositories/worktrees.ts
559
+ var import_drizzle_orm12 = require("drizzle-orm");
560
+ init_ids();
561
+
562
+ // src/db/user-utils.ts
563
+ var import_bcryptjs = __toESM(require("bcryptjs"), 1);
564
+ var import_drizzle_orm13 = require("drizzle-orm");
565
+ init_ids();
566
+
567
+ // src/db/index.ts
568
+ var compare = import_bcryptjs2.default.compare;
569
+ var hash = import_bcryptjs2.default.hash;
570
+
571
+ // src/claude/message-converter.ts
572
+ function transcriptToMessage(transcript, sessionId, index2) {
573
+ const content = transcript.message?.content || "";
574
+ const contentPreview = typeof content === "string" ? content.substring(0, 200) : JSON.stringify(content).substring(0, 200);
575
+ const role = transcript.message?.role || transcript.type;
576
+ let toolUses;
577
+ if (Array.isArray(content)) {
578
+ const tools = content.filter((c) => c.type === "tool_use");
579
+ if (tools.length > 0) {
580
+ toolUses = tools.map((tool) => ({
581
+ id: tool.id,
582
+ name: tool.name,
583
+ input: tool.input || {}
584
+ }));
585
+ }
586
+ }
587
+ return {
588
+ message_id: generateId(),
589
+ session_id: sessionId,
590
+ type: transcript.type,
591
+ role,
592
+ index: index2,
593
+ timestamp: transcript.timestamp || (/* @__PURE__ */ new Date()).toISOString(),
594
+ content_preview: contentPreview,
595
+ content,
596
+ tool_uses: toolUses,
597
+ metadata: {
598
+ original_id: transcript.uuid,
599
+ parent_id: transcript.parentUuid || void 0,
600
+ is_meta: transcript.isMeta
601
+ }
602
+ };
603
+ }
604
+ function transcriptsToMessages(transcripts, sessionId) {
605
+ return transcripts.map((transcript, index2) => transcriptToMessage(transcript, sessionId, index2));
606
+ }
607
+
608
+ // src/claude/task-extractor.ts
609
+ init_ids();
610
+ function extractTasksFromMessages(messages2, sessionId) {
611
+ const tasks2 = [];
612
+ const userMessageIndices = messages2.map((msg, idx) => msg.type === "user" ? idx : -1).filter((idx) => idx !== -1);
613
+ for (let i = 0; i < userMessageIndices.length; i++) {
614
+ const startIndex = userMessageIndices[i];
615
+ const userMessage = messages2[startIndex];
616
+ const endIndex = i < userMessageIndices.length - 1 ? userMessageIndices[i + 1] - 1 : messages2.length - 1;
617
+ const messagesInRange = messages2.slice(startIndex, endIndex + 1);
618
+ const toolUseCount = messagesInRange.reduce((count, msg) => {
619
+ return count + (msg.tool_uses?.length ?? 0);
620
+ }, 0);
621
+ let fullPrompt = "";
622
+ if (typeof userMessage.content === "string") {
623
+ fullPrompt = userMessage.content;
624
+ } else if (Array.isArray(userMessage.content)) {
625
+ const textContent = userMessage.content.filter((c) => c.type === "text").map((c) => c.text || "").join("\n");
626
+ fullPrompt = textContent || JSON.stringify(userMessage.content);
627
+ } else {
628
+ fullPrompt = JSON.stringify(userMessage.content);
629
+ }
630
+ const cleanPrompt = fullPrompt.replace(/\n/g, " ").replace(/\s+/g, " ").trim();
631
+ const description = cleanPrompt.substring(0, 120) + (cleanPrompt.length > 120 ? "..." : "");
632
+ const startTimestamp = userMessage.timestamp;
633
+ const endMessage = messages2[endIndex];
634
+ const endTimestamp = endMessage?.timestamp;
635
+ tasks2.push({
636
+ task_id: generateId(),
637
+ session_id: sessionId,
638
+ full_prompt: fullPrompt,
639
+ description,
640
+ status: TaskStatus.COMPLETED,
641
+ // Imported sessions are historical
642
+ message_range: {
643
+ start_index: startIndex,
644
+ end_index: endIndex,
645
+ start_timestamp: startTimestamp,
646
+ end_timestamp: endTimestamp
647
+ },
648
+ git_state: {
649
+ ref_at_start: "unknown",
650
+ // No git tracking in Claude Code transcripts
651
+ sha_at_start: "unknown"
652
+ // No git tracking in Claude Code transcripts
653
+ },
654
+ model: userMessage.metadata?.model || "claude-sonnet-4-5",
655
+ tool_use_count: toolUseCount,
656
+ created_at: startTimestamp,
657
+ completed_at: endTimestamp
658
+ });
659
+ }
660
+ return tasks2;
661
+ }
662
+ // Annotate the CommonJS export names for ESM import in node:
663
+ 0 && (module.exports = {
664
+ buildConversationTree,
665
+ extractTasksFromMessages,
666
+ filterConversationMessages,
667
+ getTranscriptPath,
668
+ loadClaudeSession,
669
+ loadSessionTranscript,
670
+ parseTranscript,
671
+ transcriptToMessage,
672
+ transcriptsToMessages
673
+ });