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,451 @@
1
+ // src/config/config-manager.ts
2
+ import fs from "fs/promises";
3
+ import os from "os";
4
+ import path from "path";
5
+ import yaml from "js-yaml";
6
+ function getAgorHome() {
7
+ return path.join(os.homedir(), ".agor");
8
+ }
9
+ function getConfigPath() {
10
+ return path.join(getAgorHome(), "config.yaml");
11
+ }
12
+ async function ensureAgorHome() {
13
+ const agorHome = getAgorHome();
14
+ try {
15
+ await fs.access(agorHome);
16
+ } catch {
17
+ await fs.mkdir(agorHome, { recursive: true });
18
+ }
19
+ }
20
+ async function loadConfig() {
21
+ const configPath = getConfigPath();
22
+ try {
23
+ const content = await fs.readFile(configPath, "utf-8");
24
+ const config = yaml.load(content);
25
+ return config || {};
26
+ } catch (error) {
27
+ if (error.code === "ENOENT") {
28
+ return getDefaultConfig();
29
+ }
30
+ throw new Error(
31
+ `Failed to load config: ${error instanceof Error ? error.message : String(error)}`
32
+ );
33
+ }
34
+ }
35
+ async function saveConfig(config) {
36
+ await ensureAgorHome();
37
+ const configPath = getConfigPath();
38
+ const content = yaml.dump(config, {
39
+ indent: 2,
40
+ lineWidth: 120,
41
+ noRefs: true
42
+ });
43
+ await fs.writeFile(configPath, content, "utf-8");
44
+ }
45
+ function getDefaultConfig() {
46
+ return {
47
+ context: {},
48
+ defaults: {
49
+ board: "main",
50
+ agent: "claude-code"
51
+ },
52
+ display: {
53
+ tableStyle: "unicode",
54
+ colorOutput: true,
55
+ shortIdLength: 8
56
+ },
57
+ daemon: {
58
+ port: 3030,
59
+ host: "localhost",
60
+ allowAnonymous: true,
61
+ // Default: Allow anonymous access (local mode)
62
+ requireAuth: false
63
+ // Default: Do not require authentication
64
+ },
65
+ ui: {
66
+ port: 5173,
67
+ host: "localhost"
68
+ }
69
+ };
70
+ }
71
+ async function getContext(key) {
72
+ const config = await loadConfig();
73
+ return config.context?.[key];
74
+ }
75
+ async function setContext(key, value) {
76
+ const config = await loadConfig();
77
+ if (!config.context) {
78
+ config.context = {};
79
+ }
80
+ config.context[key] = value;
81
+ await saveConfig(config);
82
+ }
83
+ async function unsetContext(key) {
84
+ const config = await loadConfig();
85
+ if (config.context && key in config.context) {
86
+ delete config.context[key];
87
+ await saveConfig(config);
88
+ }
89
+ }
90
+ async function clearContext() {
91
+ const config = await loadConfig();
92
+ config.context = {};
93
+ await saveConfig(config);
94
+ }
95
+ async function getAllContext() {
96
+ const config = await loadConfig();
97
+ return config.context || {};
98
+ }
99
+ async function initConfig() {
100
+ const configPath = getConfigPath();
101
+ try {
102
+ await fs.access(configPath);
103
+ } catch {
104
+ await saveConfig(getDefaultConfig());
105
+ }
106
+ }
107
+ async function getConfigValue(key) {
108
+ const config = await loadConfig();
109
+ const defaults = getDefaultConfig();
110
+ const merged = {
111
+ ...defaults,
112
+ ...config,
113
+ defaults: { ...defaults.defaults, ...config.defaults },
114
+ display: { ...defaults.display, ...config.display },
115
+ daemon: { ...defaults.daemon, ...config.daemon },
116
+ ui: { ...defaults.ui, ...config.ui }
117
+ };
118
+ const parts = key.split(".");
119
+ let value = merged;
120
+ for (const part of parts) {
121
+ if (value && typeof value === "object" && part in value) {
122
+ value = value[part];
123
+ } else {
124
+ return void 0;
125
+ }
126
+ }
127
+ return value;
128
+ }
129
+ async function setConfigValue(key, value) {
130
+ const config = await loadConfig();
131
+ const parts = key.split(".");
132
+ if (parts.length === 1) {
133
+ if (!config.context) {
134
+ config.context = {};
135
+ }
136
+ config.context[parts[0]] = value;
137
+ } else {
138
+ const section = parts[0];
139
+ const _subKey = parts.slice(1).join(".");
140
+ if (!config[section]) {
141
+ config[section] = {};
142
+ }
143
+ if (parts.length === 2) {
144
+ config[section][parts[1]] = value;
145
+ } else {
146
+ throw new Error(`Nested keys beyond one level not supported: ${key}`);
147
+ }
148
+ }
149
+ await saveConfig(config);
150
+ }
151
+ async function unsetConfigValue(key) {
152
+ const config = await loadConfig();
153
+ const parts = key.split(".");
154
+ if (parts.length === 1) {
155
+ if (config.context && parts[0] in config.context) {
156
+ delete config.context[parts[0]];
157
+ }
158
+ } else if (parts.length === 2) {
159
+ const section = parts[0];
160
+ const subKey = parts[1];
161
+ if (config[section] && subKey in config[section]) {
162
+ delete config[section][subKey];
163
+ }
164
+ }
165
+ await saveConfig(config);
166
+ }
167
+ async function getDaemonUrl() {
168
+ const config = await loadConfig();
169
+ const defaults = getDefaultConfig();
170
+ const envPort = process.env.PORT ? Number.parseInt(process.env.PORT, 10) : void 0;
171
+ const port = envPort || config.daemon?.port || defaults.daemon?.port || 3030;
172
+ const host = config.daemon?.host || defaults.daemon?.host || "localhost";
173
+ return `http://${host}:${port}`;
174
+ }
175
+
176
+ // src/config/constants.ts
177
+ var ENVIRONMENT = {
178
+ /**
179
+ * Health check interval in milliseconds
180
+ * How often to poll environment health when status is 'running'
181
+ */
182
+ HEALTH_CHECK_INTERVAL_MS: 5e3,
183
+ // 5 seconds
184
+ /**
185
+ * Health check timeout in milliseconds
186
+ * How long to wait for health check response before considering it failed
187
+ */
188
+ HEALTH_CHECK_TIMEOUT_MS: 1e3,
189
+ // 1 second
190
+ /**
191
+ * Maximum number of log lines to store per worktree
192
+ * (Not stored in DB - reference for future log file implementation)
193
+ */
194
+ MAX_LOG_LINES: 100,
195
+ /**
196
+ * Process startup grace period in milliseconds
197
+ * How long to wait after starting before running health checks
198
+ */
199
+ STARTUP_GRACE_PERIOD_MS: 3e3,
200
+ // 3 seconds
201
+ /**
202
+ * Maximum consecutive health check failures before marking as 'error'
203
+ */
204
+ MAX_HEALTH_CHECK_FAILURES: 3
205
+ };
206
+ var WEBSOCKET = {
207
+ /**
208
+ * Cursor position broadcast throttle in milliseconds
209
+ */
210
+ CURSOR_THROTTLE_MS: 100,
211
+ /**
212
+ * Presence timeout in milliseconds (when to mark user as stale)
213
+ */
214
+ PRESENCE_TIMEOUT_MS: 1e4
215
+ // 10 seconds
216
+ };
217
+ var DATABASE = {
218
+ /**
219
+ * Batch size for bulk message inserts
220
+ */
221
+ MESSAGE_BATCH_SIZE: 100,
222
+ /**
223
+ * Batch size for bulk task inserts
224
+ */
225
+ TASK_BATCH_SIZE: 100,
226
+ /**
227
+ * Default pagination limit
228
+ */
229
+ DEFAULT_PAGE_SIZE: 50,
230
+ /**
231
+ * Maximum pagination limit
232
+ */
233
+ MAX_PAGE_SIZE: 100
234
+ };
235
+ var GIT = {
236
+ /**
237
+ * Default worktree base path (relative to ~/.agor)
238
+ */
239
+ WORKTREE_BASE_PATH: "worktrees",
240
+ /**
241
+ * Default repo clone path (relative to ~/.agor)
242
+ */
243
+ REPO_BASE_PATH: "repos"
244
+ };
245
+ var SESSION = {
246
+ /**
247
+ * Maximum number of messages to load initially
248
+ */
249
+ INITIAL_MESSAGE_LOAD: 100,
250
+ /**
251
+ * Message streaming chunk size
252
+ */
253
+ STREAMING_CHUNK_SIZE: 1
254
+ };
255
+
256
+ // src/config/context-resolver.ts
257
+ async function resolveValue(key, flagValue, config) {
258
+ if (flagValue !== void 0 && flagValue !== null && flagValue !== "") {
259
+ return flagValue;
260
+ }
261
+ const cfg = config || await loadConfig();
262
+ const contextValue = cfg.context?.[key];
263
+ if (contextValue !== void 0 && contextValue !== null && contextValue !== "") {
264
+ return contextValue;
265
+ }
266
+ const defaultValue = cfg.defaults?.[key];
267
+ if (defaultValue !== void 0 && defaultValue !== null && defaultValue !== "") {
268
+ return defaultValue;
269
+ }
270
+ return void 0;
271
+ }
272
+ async function resolveValues(keys, flagValues, config) {
273
+ const cfg = config || await loadConfig();
274
+ const resolved = {};
275
+ for (const key of keys) {
276
+ const value = await resolveValue(key, flagValues?.[key], cfg);
277
+ if (value !== void 0) {
278
+ resolved[key] = value;
279
+ }
280
+ }
281
+ return resolved;
282
+ }
283
+ async function getEffectiveConfig(config) {
284
+ const cfg = config || await loadConfig();
285
+ return {
286
+ // Context values
287
+ board: await resolveValue("board", void 0, cfg),
288
+ session: await resolveValue("session", void 0, cfg),
289
+ repo: await resolveValue("repo", void 0, cfg),
290
+ agent: await resolveValue("agent", void 0, cfg),
291
+ // Display settings
292
+ tableStyle: cfg.display?.tableStyle,
293
+ colorOutput: cfg.display?.colorOutput !== void 0 ? String(cfg.display.colorOutput) : void 0,
294
+ shortIdLength: cfg.display?.shortIdLength !== void 0 ? String(cfg.display.shortIdLength) : void 0
295
+ };
296
+ }
297
+
298
+ // src/config/repo-list.ts
299
+ function getRepoReferenceOptions(repos, worktrees = []) {
300
+ const options = [];
301
+ const repoMap = new Map(repos.map((repo) => [repo.repo_id, repo]));
302
+ for (const repo of repos) {
303
+ options.push({
304
+ label: repo.slug,
305
+ value: repo.repo_id,
306
+ // Use repo_id as value
307
+ type: "managed",
308
+ slug: repo.slug,
309
+ description: `${repo.name} (bare repo)`
310
+ });
311
+ }
312
+ for (const worktree of worktrees) {
313
+ const repo = repoMap.get(worktree.repo_id);
314
+ if (!repo) continue;
315
+ const reference = `${repo.slug}:${worktree.name}`;
316
+ options.push({
317
+ label: reference,
318
+ value: worktree.worktree_id,
319
+ // Use worktree_id as value
320
+ type: "managed-worktree",
321
+ slug: repo.slug,
322
+ worktree: worktree.name,
323
+ description: `${repo.name} - ${worktree.name} (${worktree.ref})`
324
+ });
325
+ }
326
+ return options;
327
+ }
328
+ function getGroupedRepoReferenceOptions(repos, worktrees = []) {
329
+ const grouped = {};
330
+ const repoMap = new Map(repos.map((repo) => [repo.repo_id, repo]));
331
+ for (const repo of repos) {
332
+ const options = [];
333
+ options.push({
334
+ label: repo.slug,
335
+ value: repo.repo_id,
336
+ // Use repo_id as value
337
+ type: "managed",
338
+ slug: repo.slug,
339
+ description: `${repo.name} (bare repo)`
340
+ });
341
+ grouped[repo.slug] = options;
342
+ }
343
+ for (const worktree of worktrees) {
344
+ const repo = repoMap.get(worktree.repo_id);
345
+ if (!repo) continue;
346
+ const reference = `${repo.slug}:${worktree.name}`;
347
+ if (!grouped[repo.slug]) {
348
+ grouped[repo.slug] = [];
349
+ }
350
+ grouped[repo.slug].push({
351
+ label: reference,
352
+ value: worktree.worktree_id,
353
+ // Use worktree_id as value
354
+ type: "managed-worktree",
355
+ slug: repo.slug,
356
+ worktree: worktree.name,
357
+ description: `${repo.name} - ${worktree.name} (${worktree.ref})`
358
+ });
359
+ }
360
+ return grouped;
361
+ }
362
+ function getDefaultRepoReference(repos) {
363
+ if (repos.length === 0) return void 0;
364
+ const firstRepo = repos[0];
365
+ return firstRepo.slug;
366
+ }
367
+
368
+ // src/config/repo-reference.ts
369
+ function parseRepoReference(ref) {
370
+ if (ref.startsWith("/") || /^[A-Z]:\\/.test(ref)) {
371
+ return { type: "path", path: ref };
372
+ }
373
+ if (ref.includes(":")) {
374
+ const [slug, worktree] = ref.split(":", 2);
375
+ return { type: "managed-worktree", slug, worktree };
376
+ }
377
+ return { type: "managed", slug: ref };
378
+ }
379
+ function extractSlugFromUrl(url) {
380
+ const cleanUrl = url.endsWith(".git") ? url.slice(0, -4) : url;
381
+ if (cleanUrl.includes("@")) {
382
+ const match2 = cleanUrl.match(/:([^/]+\/[^/]+)$/);
383
+ if (match2) {
384
+ return match2[1];
385
+ }
386
+ }
387
+ const match = cleanUrl.match(/[:/]([^/]+\/[^/]+)$/);
388
+ if (match) {
389
+ return match[1];
390
+ }
391
+ const segments = cleanUrl.split("/").filter(Boolean);
392
+ if (segments.length >= 2) {
393
+ return `${segments[segments.length - 2]}/${segments[segments.length - 1]}`;
394
+ }
395
+ throw new Error(`Could not extract slug from URL: ${url}`);
396
+ }
397
+ function isValidSlug(slug) {
398
+ const slugPattern = /^[a-zA-Z0-9_-]+\/[a-zA-Z0-9_-]+$/;
399
+ return slugPattern.test(slug);
400
+ }
401
+ async function resolveRepoReference(ref) {
402
+ const parsed = parseRepoReference(ref);
403
+ if (parsed.type === "path") {
404
+ return {
405
+ cwd: parsed.path,
406
+ managed_worktree: false
407
+ };
408
+ }
409
+ throw new Error(
410
+ `Repository lookup not implemented in this context. Parsed reference: ${JSON.stringify(parsed)}`
411
+ );
412
+ }
413
+ function formatRepoReference(slug, worktreeName) {
414
+ if (worktreeName) {
415
+ return `${slug}:${worktreeName}`;
416
+ }
417
+ return slug;
418
+ }
419
+ export {
420
+ DATABASE,
421
+ ENVIRONMENT,
422
+ GIT,
423
+ SESSION,
424
+ WEBSOCKET,
425
+ clearContext,
426
+ extractSlugFromUrl,
427
+ formatRepoReference,
428
+ getAgorHome,
429
+ getAllContext,
430
+ getConfigPath,
431
+ getConfigValue,
432
+ getContext,
433
+ getDaemonUrl,
434
+ getDefaultConfig,
435
+ getDefaultRepoReference,
436
+ getEffectiveConfig,
437
+ getGroupedRepoReferenceOptions,
438
+ getRepoReferenceOptions,
439
+ initConfig,
440
+ isValidSlug,
441
+ loadConfig,
442
+ parseRepoReference,
443
+ resolveRepoReference,
444
+ resolveValue,
445
+ resolveValues,
446
+ saveConfig,
447
+ setConfigValue,
448
+ setContext,
449
+ unsetConfigValue,
450
+ unsetContext
451
+ };