argustack 0.1.34 → 0.3.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (672) hide show
  1. package/README.md +31 -98
  2. package/dist/adapters/board/board-sync.js +2 -2
  3. package/dist/adapters/board/board-sync.js.map +1 -1
  4. package/dist/adapters/board/md-parser.js +3 -3
  5. package/dist/adapters/board/md-parser.js.map +1 -1
  6. package/dist/adapters/board/skill-discovery.js +2 -2
  7. package/dist/adapters/board/skill-discovery.js.map +1 -1
  8. package/dist/adapters/board/skill-runner.js +2 -2
  9. package/dist/adapters/board/skill-runner.js.map +1 -1
  10. package/dist/adapters/board/store.d.ts.map +1 -1
  11. package/dist/adapters/board/store.js +11 -11
  12. package/dist/adapters/board/store.js.map +1 -1
  13. package/dist/adapters/csv/mapper.js +11 -11
  14. package/dist/adapters/csv/mapper.js.map +1 -1
  15. package/dist/adapters/csv/parser.d.ts.map +1 -1
  16. package/dist/adapters/csv/parser.js +8 -7
  17. package/dist/adapters/csv/parser.js.map +1 -1
  18. package/dist/adapters/csv/provider.js +4 -4
  19. package/dist/adapters/csv/provider.js.map +1 -1
  20. package/dist/adapters/db/client.js +2 -2
  21. package/dist/adapters/db/client.js.map +1 -1
  22. package/dist/adapters/db/index.js +1 -0
  23. package/dist/adapters/db/index.js.map +1 -1
  24. package/dist/adapters/db/mapper.js +1 -1
  25. package/dist/adapters/db/mapper.js.map +1 -1
  26. package/dist/adapters/db/provider.js +4 -4
  27. package/dist/adapters/db/provider.js.map +1 -1
  28. package/dist/adapters/db/sql-validator.js +2 -2
  29. package/dist/adapters/db/sql-validator.js.map +1 -1
  30. package/dist/adapters/docker/cli-docker-control.d.ts +13 -0
  31. package/dist/adapters/docker/cli-docker-control.d.ts.map +1 -0
  32. package/dist/adapters/docker/cli-docker-control.js +70 -0
  33. package/dist/adapters/docker/cli-docker-control.js.map +1 -0
  34. package/dist/adapters/docker/index.d.ts +2 -0
  35. package/dist/adapters/docker/index.d.ts.map +1 -0
  36. package/dist/adapters/docker/index.js +2 -0
  37. package/dist/adapters/docker/index.js.map +1 -0
  38. package/dist/adapters/git/mapper.js +1 -1
  39. package/dist/adapters/git/mapper.js.map +1 -1
  40. package/dist/adapters/git/provider.js +4 -4
  41. package/dist/adapters/git/provider.js.map +1 -1
  42. package/dist/adapters/github/mapper.js +3 -3
  43. package/dist/adapters/github/mapper.js.map +1 -1
  44. package/dist/adapters/github/provider.d.ts.map +1 -1
  45. package/dist/adapters/github/provider.js +2 -2
  46. package/dist/adapters/github/provider.js.map +1 -1
  47. package/dist/adapters/jira/mapper.js +4 -4
  48. package/dist/adapters/jira/mapper.js.map +1 -1
  49. package/dist/adapters/jira/provider.js +8 -8
  50. package/dist/adapters/jira/provider.js.map +1 -1
  51. package/dist/adapters/jira-proxy/client.js +4 -4
  52. package/dist/adapters/jira-proxy/client.js.map +1 -1
  53. package/dist/adapters/jira-proxy/config-loader.d.ts +9 -0
  54. package/dist/adapters/jira-proxy/config-loader.d.ts.map +1 -1
  55. package/dist/adapters/jira-proxy/config-loader.js +26 -3
  56. package/dist/adapters/jira-proxy/config-loader.js.map +1 -1
  57. package/dist/adapters/jira-proxy/index.d.ts +1 -1
  58. package/dist/adapters/jira-proxy/index.d.ts.map +1 -1
  59. package/dist/adapters/jira-proxy/index.js +1 -1
  60. package/dist/adapters/jira-proxy/index.js.map +1 -1
  61. package/dist/adapters/jira-proxy/mapper.js +2 -2
  62. package/dist/adapters/jira-proxy/mapper.js.map +1 -1
  63. package/dist/adapters/jira-proxy/provider.d.ts.map +1 -1
  64. package/dist/adapters/jira-proxy/provider.js +19 -8
  65. package/dist/adapters/jira-proxy/provider.js.map +1 -1
  66. package/dist/adapters/lmstudio/embedding-provider.d.ts +37 -0
  67. package/dist/adapters/lmstudio/embedding-provider.d.ts.map +1 -0
  68. package/dist/adapters/lmstudio/embedding-provider.js +174 -0
  69. package/dist/adapters/lmstudio/embedding-provider.js.map +1 -0
  70. package/dist/adapters/lmstudio/index.d.ts +3 -0
  71. package/dist/adapters/lmstudio/index.d.ts.map +1 -0
  72. package/dist/adapters/lmstudio/index.js +2 -0
  73. package/dist/adapters/lmstudio/index.js.map +1 -0
  74. package/dist/adapters/lsp/index.d.ts +4 -0
  75. package/dist/adapters/lsp/index.d.ts.map +1 -0
  76. package/dist/adapters/lsp/index.js +3 -0
  77. package/dist/adapters/lsp/index.js.map +1 -0
  78. package/dist/adapters/lsp/jsonrpc.d.ts +12 -0
  79. package/dist/adapters/lsp/jsonrpc.d.ts.map +1 -0
  80. package/dist/adapters/lsp/jsonrpc.js +30 -0
  81. package/dist/adapters/lsp/jsonrpc.js.map +1 -0
  82. package/dist/adapters/lsp/typescript-lsp.d.ts +25 -0
  83. package/dist/adapters/lsp/typescript-lsp.d.ts.map +1 -0
  84. package/dist/adapters/lsp/typescript-lsp.js +131 -0
  85. package/dist/adapters/lsp/typescript-lsp.js.map +1 -0
  86. package/dist/adapters/neo4j/client.d.ts +11 -0
  87. package/dist/adapters/neo4j/client.d.ts.map +1 -0
  88. package/dist/adapters/neo4j/client.js +14 -0
  89. package/dist/adapters/neo4j/client.js.map +1 -0
  90. package/dist/adapters/neo4j/cypher.d.ts +23 -0
  91. package/dist/adapters/neo4j/cypher.d.ts.map +1 -0
  92. package/dist/adapters/neo4j/cypher.js +138 -0
  93. package/dist/adapters/neo4j/cypher.js.map +1 -0
  94. package/dist/adapters/neo4j/graph-store.d.ts +33 -0
  95. package/dist/adapters/neo4j/graph-store.d.ts.map +1 -0
  96. package/dist/adapters/neo4j/graph-store.js +282 -0
  97. package/dist/adapters/neo4j/graph-store.js.map +1 -0
  98. package/dist/adapters/neo4j/index.d.ts +4 -0
  99. package/dist/adapters/neo4j/index.d.ts.map +1 -0
  100. package/dist/adapters/neo4j/index.js +3 -0
  101. package/dist/adapters/neo4j/index.js.map +1 -0
  102. package/dist/adapters/neo4j/mapper.d.ts +5 -0
  103. package/dist/adapters/neo4j/mapper.d.ts.map +1 -0
  104. package/dist/adapters/neo4j/mapper.js +49 -0
  105. package/dist/adapters/neo4j/mapper.js.map +1 -0
  106. package/dist/adapters/ollama/chat-llm.d.ts +24 -0
  107. package/dist/adapters/ollama/chat-llm.d.ts.map +1 -0
  108. package/dist/adapters/ollama/chat-llm.js +53 -0
  109. package/dist/adapters/ollama/chat-llm.js.map +1 -0
  110. package/dist/adapters/ollama/embedding-provider.d.ts +30 -0
  111. package/dist/adapters/ollama/embedding-provider.d.ts.map +1 -0
  112. package/dist/adapters/ollama/embedding-provider.js +124 -0
  113. package/dist/adapters/ollama/embedding-provider.js.map +1 -0
  114. package/dist/adapters/ollama/http-ollama-control.d.ts +24 -0
  115. package/dist/adapters/ollama/http-ollama-control.d.ts.map +1 -0
  116. package/dist/adapters/ollama/http-ollama-control.js +224 -0
  117. package/dist/adapters/ollama/http-ollama-control.js.map +1 -0
  118. package/dist/adapters/ollama/index.d.ts +6 -0
  119. package/dist/adapters/ollama/index.d.ts.map +1 -0
  120. package/dist/adapters/ollama/index.js +4 -0
  121. package/dist/adapters/ollama/index.js.map +1 -0
  122. package/dist/adapters/platform/index.d.ts +2 -0
  123. package/dist/adapters/platform/index.d.ts.map +1 -0
  124. package/dist/adapters/platform/index.js +2 -0
  125. package/dist/adapters/platform/index.js.map +1 -0
  126. package/dist/adapters/platform/node-platform-probe.d.ts +9 -0
  127. package/dist/adapters/platform/node-platform-probe.d.ts.map +1 -0
  128. package/dist/adapters/platform/node-platform-probe.js +88 -0
  129. package/dist/adapters/platform/node-platform-probe.js.map +1 -0
  130. package/dist/adapters/postgres/code-meta.d.ts +21 -0
  131. package/dist/adapters/postgres/code-meta.d.ts.map +1 -0
  132. package/dist/adapters/postgres/code-meta.js +150 -0
  133. package/dist/adapters/postgres/code-meta.js.map +1 -0
  134. package/dist/adapters/postgres/index.d.ts +3 -0
  135. package/dist/adapters/postgres/index.d.ts.map +1 -1
  136. package/dist/adapters/postgres/index.js +3 -0
  137. package/dist/adapters/postgres/index.js.map +1 -1
  138. package/dist/adapters/postgres/migrate-helpers.d.ts +43 -0
  139. package/dist/adapters/postgres/migrate-helpers.d.ts.map +1 -0
  140. package/dist/adapters/postgres/migrate-helpers.js +136 -0
  141. package/dist/adapters/postgres/migrate-helpers.js.map +1 -0
  142. package/dist/adapters/postgres/readiness-probe.d.ts +22 -0
  143. package/dist/adapters/postgres/readiness-probe.d.ts.map +1 -0
  144. package/dist/adapters/postgres/readiness-probe.js +47 -0
  145. package/dist/adapters/postgres/readiness-probe.js.map +1 -0
  146. package/dist/adapters/postgres/schema.d.ts +11 -1
  147. package/dist/adapters/postgres/schema.d.ts.map +1 -1
  148. package/dist/adapters/postgres/schema.js +192 -108
  149. package/dist/adapters/postgres/schema.js.map +1 -1
  150. package/dist/adapters/postgres/storage-commits.d.ts +13 -0
  151. package/dist/adapters/postgres/storage-commits.d.ts.map +1 -0
  152. package/dist/adapters/postgres/storage-commits.js +63 -0
  153. package/dist/adapters/postgres/storage-commits.js.map +1 -0
  154. package/dist/adapters/postgres/storage-dbschema.d.ts +14 -0
  155. package/dist/adapters/postgres/storage-dbschema.d.ts.map +1 -0
  156. package/dist/adapters/postgres/storage-dbschema.js +63 -0
  157. package/dist/adapters/postgres/storage-dbschema.js.map +1 -0
  158. package/dist/adapters/postgres/storage-graph.d.ts +18 -0
  159. package/dist/adapters/postgres/storage-graph.d.ts.map +1 -0
  160. package/dist/adapters/postgres/storage-graph.js +127 -0
  161. package/dist/adapters/postgres/storage-graph.js.map +1 -0
  162. package/dist/adapters/postgres/storage-issues.d.ts +26 -0
  163. package/dist/adapters/postgres/storage-issues.d.ts.map +1 -0
  164. package/dist/adapters/postgres/storage-issues.js +233 -0
  165. package/dist/adapters/postgres/storage-issues.js.map +1 -0
  166. package/dist/adapters/postgres/storage-prs.d.ts +15 -0
  167. package/dist/adapters/postgres/storage-prs.d.ts.map +1 -0
  168. package/dist/adapters/postgres/storage-prs.js +142 -0
  169. package/dist/adapters/postgres/storage-prs.js.map +1 -0
  170. package/dist/adapters/postgres/storage-query.d.ts +26 -0
  171. package/dist/adapters/postgres/storage-query.d.ts.map +1 -0
  172. package/dist/adapters/postgres/storage-query.js +74 -0
  173. package/dist/adapters/postgres/storage-query.js.map +1 -0
  174. package/dist/adapters/postgres/storage-search.d.ts +18 -0
  175. package/dist/adapters/postgres/storage-search.d.ts.map +1 -0
  176. package/dist/adapters/postgres/storage-search.js +90 -0
  177. package/dist/adapters/postgres/storage-search.js.map +1 -0
  178. package/dist/adapters/postgres/storage.d.ts +49 -33
  179. package/dist/adapters/postgres/storage.d.ts.map +1 -1
  180. package/dist/adapters/postgres/storage.js +89 -605
  181. package/dist/adapters/postgres/storage.js.map +1 -1
  182. package/dist/adapters/postgres/workspace-store.d.ts +26 -0
  183. package/dist/adapters/postgres/workspace-store.d.ts.map +1 -0
  184. package/dist/adapters/postgres/workspace-store.js +94 -0
  185. package/dist/adapters/postgres/workspace-store.js.map +1 -0
  186. package/dist/adapters/qdrant/client.d.ts +8 -0
  187. package/dist/adapters/qdrant/client.d.ts.map +1 -0
  188. package/dist/adapters/qdrant/client.js +12 -0
  189. package/dist/adapters/qdrant/client.js.map +1 -0
  190. package/dist/adapters/qdrant/index.d.ts +4 -0
  191. package/dist/adapters/qdrant/index.d.ts.map +1 -0
  192. package/dist/adapters/qdrant/index.js +3 -0
  193. package/dist/adapters/qdrant/index.js.map +1 -0
  194. package/dist/adapters/qdrant/mapper.d.ts +16 -0
  195. package/dist/adapters/qdrant/mapper.d.ts.map +1 -0
  196. package/dist/adapters/qdrant/mapper.js +59 -0
  197. package/dist/adapters/qdrant/mapper.js.map +1 -0
  198. package/dist/adapters/qdrant/vector-store.d.ts +20 -0
  199. package/dist/adapters/qdrant/vector-store.d.ts.map +1 -0
  200. package/dist/adapters/qdrant/vector-store.js +144 -0
  201. package/dist/adapters/qdrant/vector-store.js.map +1 -0
  202. package/dist/adapters/tree-sitter/index.d.ts +4 -0
  203. package/dist/adapters/tree-sitter/index.d.ts.map +1 -0
  204. package/dist/adapters/tree-sitter/index.js +3 -0
  205. package/dist/adapters/tree-sitter/index.js.map +1 -0
  206. package/dist/adapters/tree-sitter/parser.d.ts +15 -0
  207. package/dist/adapters/tree-sitter/parser.d.ts.map +1 -0
  208. package/dist/adapters/tree-sitter/parser.js +186 -0
  209. package/dist/adapters/tree-sitter/parser.js.map +1 -0
  210. package/dist/adapters/tree-sitter/queries.d.ts +14 -0
  211. package/dist/adapters/tree-sitter/queries.d.ts.map +1 -0
  212. package/dist/adapters/tree-sitter/queries.js +14 -0
  213. package/dist/adapters/tree-sitter/queries.js.map +1 -0
  214. package/dist/adapters/voyage/embedding-provider.d.ts +25 -0
  215. package/dist/adapters/voyage/embedding-provider.d.ts.map +1 -0
  216. package/dist/adapters/voyage/embedding-provider.js +105 -0
  217. package/dist/adapters/voyage/embedding-provider.js.map +1 -0
  218. package/dist/adapters/voyage/index.d.ts +3 -0
  219. package/dist/adapters/voyage/index.d.ts.map +1 -0
  220. package/dist/adapters/voyage/index.js +2 -0
  221. package/dist/adapters/voyage/index.js.map +1 -0
  222. package/dist/cli/add/code.d.ts +3 -0
  223. package/dist/cli/add/code.d.ts.map +1 -0
  224. package/dist/cli/add/code.js +97 -0
  225. package/dist/cli/add/code.js.map +1 -0
  226. package/dist/cli/add/csv.d.ts +3 -0
  227. package/dist/cli/add/csv.d.ts.map +1 -0
  228. package/dist/cli/add/csv.js +26 -0
  229. package/dist/cli/add/csv.js.map +1 -0
  230. package/dist/cli/add/db.d.ts +3 -0
  231. package/dist/cli/add/db.d.ts.map +1 -0
  232. package/dist/cli/add/db.js +46 -0
  233. package/dist/cli/add/db.js.map +1 -0
  234. package/dist/cli/add/git.d.ts +3 -0
  235. package/dist/cli/add/git.d.ts.map +1 -0
  236. package/dist/cli/add/git.js +26 -0
  237. package/dist/cli/add/git.js.map +1 -0
  238. package/dist/cli/add/github.d.ts +3 -0
  239. package/dist/cli/add/github.d.ts.map +1 -0
  240. package/dist/cli/add/github.js +32 -0
  241. package/dist/cli/add/github.js.map +1 -0
  242. package/dist/cli/add/index.d.ts +3 -0
  243. package/dist/cli/add/index.d.ts.map +1 -0
  244. package/dist/cli/add/index.js +18 -0
  245. package/dist/cli/add/index.js.map +1 -0
  246. package/dist/cli/add/jira.d.ts +3 -0
  247. package/dist/cli/add/jira.d.ts.map +1 -0
  248. package/dist/cli/add/jira.js +45 -0
  249. package/dist/cli/add/jira.js.map +1 -0
  250. package/dist/cli/add/shared.d.ts +31 -0
  251. package/dist/cli/add/shared.d.ts.map +1 -0
  252. package/dist/cli/add/shared.js +102 -0
  253. package/dist/cli/add/shared.js.map +1 -0
  254. package/dist/cli/board-server.js +1 -1
  255. package/dist/cli/board-server.js.map +1 -1
  256. package/dist/cli/board.d.ts.map +1 -1
  257. package/dist/cli/board.js +11 -12
  258. package/dist/cli/board.js.map +1 -1
  259. package/dist/cli/code.d.ts +3 -0
  260. package/dist/cli/code.d.ts.map +1 -0
  261. package/dist/cli/code.js +467 -0
  262. package/dist/cli/code.js.map +1 -0
  263. package/dist/cli/embed.d.ts.map +1 -1
  264. package/dist/cli/embed.js +21 -26
  265. package/dist/cli/embed.js.map +1 -1
  266. package/dist/cli/graph.d.ts.map +1 -1
  267. package/dist/cli/graph.js +37 -55
  268. package/dist/cli/graph.js.map +1 -1
  269. package/dist/cli/index.js +30 -25
  270. package/dist/cli/index.js.map +1 -1
  271. package/dist/cli/init/cleanup.d.ts +11 -0
  272. package/dist/cli/init/cleanup.d.ts.map +1 -0
  273. package/dist/cli/init/cleanup.js +39 -0
  274. package/dist/cli/init/cleanup.js.map +1 -0
  275. package/dist/cli/init/generators.js +27 -27
  276. package/dist/cli/init/generators.js.map +1 -1
  277. package/dist/cli/init/index.d.ts +0 -10
  278. package/dist/cli/init/index.d.ts.map +1 -1
  279. package/dist/cli/init/index.js +386 -351
  280. package/dist/cli/init/index.js.map +1 -1
  281. package/dist/cli/init/presenter.d.ts +30 -0
  282. package/dist/cli/init/presenter.d.ts.map +1 -0
  283. package/dist/cli/init/presenter.js +152 -0
  284. package/dist/cli/init/presenter.js.map +1 -0
  285. package/dist/cli/init/prompts.d.ts +28 -0
  286. package/dist/cli/init/prompts.d.ts.map +1 -0
  287. package/dist/cli/init/prompts.js +110 -0
  288. package/dist/cli/init/prompts.js.map +1 -0
  289. package/dist/cli/init/setup-csv.js +2 -2
  290. package/dist/cli/init/setup-csv.js.map +1 -1
  291. package/dist/cli/init/setup-db.d.ts.map +1 -1
  292. package/dist/cli/init/setup-db.js +17 -14
  293. package/dist/cli/init/setup-db.js.map +1 -1
  294. package/dist/cli/init/setup-git.js +16 -16
  295. package/dist/cli/init/setup-git.js.map +1 -1
  296. package/dist/cli/init/setup-github.d.ts.map +1 -1
  297. package/dist/cli/init/setup-github.js +7 -5
  298. package/dist/cli/init/setup-github.js.map +1 -1
  299. package/dist/cli/init/setup-jira.d.ts.map +1 -1
  300. package/dist/cli/init/setup-jira.js +11 -9
  301. package/dist/cli/init/setup-jira.js.map +1 -1
  302. package/dist/cli/init/types.d.ts +4 -0
  303. package/dist/cli/init/types.d.ts.map +1 -1
  304. package/dist/cli/init/types.js +4 -4
  305. package/dist/cli/init/types.js.map +1 -1
  306. package/dist/cli/mcp-install.d.ts +1 -1
  307. package/dist/cli/mcp-install.d.ts.map +1 -1
  308. package/dist/cli/mcp-install.js +10 -24
  309. package/dist/cli/mcp-install.js.map +1 -1
  310. package/dist/cli/migrate-to-hub-impl.d.ts +51 -0
  311. package/dist/cli/migrate-to-hub-impl.d.ts.map +1 -0
  312. package/dist/cli/migrate-to-hub-impl.js +171 -0
  313. package/dist/cli/migrate-to-hub-impl.js.map +1 -0
  314. package/dist/cli/migrate-to-hub.d.ts +3 -0
  315. package/dist/cli/migrate-to-hub.d.ts.map +1 -0
  316. package/dist/cli/migrate-to-hub.js +90 -0
  317. package/dist/cli/migrate-to-hub.js.map +1 -0
  318. package/dist/cli/push.d.ts.map +1 -1
  319. package/dist/cli/push.js +62 -65
  320. package/dist/cli/push.js.map +1 -1
  321. package/dist/cli/sources.d.ts +0 -7
  322. package/dist/cli/sources.d.ts.map +1 -1
  323. package/dist/cli/sources.js +47 -112
  324. package/dist/cli/sources.js.map +1 -1
  325. package/dist/cli/status.d.ts +0 -3
  326. package/dist/cli/status.d.ts.map +1 -1
  327. package/dist/cli/status.js +95 -70
  328. package/dist/cli/status.js.map +1 -1
  329. package/dist/cli/sync.d.ts +0 -10
  330. package/dist/cli/sync.d.ts.map +1 -1
  331. package/dist/cli/sync.js +186 -314
  332. package/dist/cli/sync.js.map +1 -1
  333. package/dist/cli/workspace/add.d.ts +3 -0
  334. package/dist/cli/workspace/add.d.ts.map +1 -0
  335. package/dist/cli/workspace/add.js +38 -0
  336. package/dist/cli/workspace/add.js.map +1 -0
  337. package/dist/cli/workspace/index.d.ts +3 -0
  338. package/dist/cli/workspace/index.d.ts.map +1 -0
  339. package/dist/cli/workspace/index.js +16 -0
  340. package/dist/cli/workspace/index.js.map +1 -0
  341. package/dist/cli/workspace/info.d.ts +3 -0
  342. package/dist/cli/workspace/info.d.ts.map +1 -0
  343. package/dist/cli/workspace/info.js +69 -0
  344. package/dist/cli/workspace/info.js.map +1 -0
  345. package/dist/cli/workspace/list.d.ts +3 -0
  346. package/dist/cli/workspace/list.d.ts.map +1 -0
  347. package/dist/cli/workspace/list.js +36 -0
  348. package/dist/cli/workspace/list.js.map +1 -0
  349. package/dist/cli/workspace/remove.d.ts +3 -0
  350. package/dist/cli/workspace/remove.d.ts.map +1 -0
  351. package/dist/cli/workspace/remove.js +43 -0
  352. package/dist/cli/workspace/remove.js.map +1 -0
  353. package/dist/cli/workspace/shared.d.ts +7 -0
  354. package/dist/cli/workspace/shared.d.ts.map +1 -0
  355. package/dist/cli/workspace/shared.js +17 -0
  356. package/dist/cli/workspace/shared.js.map +1 -0
  357. package/dist/cli/workspace/use.d.ts +3 -0
  358. package/dist/cli/workspace/use.d.ts.map +1 -0
  359. package/dist/cli/workspace/use.js +27 -0
  360. package/dist/cli/workspace/use.js.map +1 -0
  361. package/dist/code-intel/chunker.d.ts +15 -0
  362. package/dist/code-intel/chunker.d.ts.map +1 -0
  363. package/dist/code-intel/chunker.js +39 -0
  364. package/dist/code-intel/chunker.js.map +1 -0
  365. package/dist/code-intel/file-discovery.d.ts +19 -0
  366. package/dist/code-intel/file-discovery.d.ts.map +1 -0
  367. package/dist/code-intel/file-discovery.js +80 -0
  368. package/dist/code-intel/file-discovery.js.map +1 -0
  369. package/dist/code-intel/hash.d.ts +2 -0
  370. package/dist/code-intel/hash.d.ts.map +1 -0
  371. package/dist/code-intel/hash.js +5 -0
  372. package/dist/code-intel/hash.js.map +1 -0
  373. package/dist/code-intel/index.d.ts +17 -0
  374. package/dist/code-intel/index.d.ts.map +1 -0
  375. package/dist/code-intel/index.js +11 -0
  376. package/dist/code-intel/index.js.map +1 -0
  377. package/dist/code-intel/indexer.d.ts +43 -0
  378. package/dist/code-intel/indexer.d.ts.map +1 -0
  379. package/dist/code-intel/indexer.js +234 -0
  380. package/dist/code-intel/indexer.js.map +1 -0
  381. package/dist/code-intel/job-lock.d.ts +7 -0
  382. package/dist/code-intel/job-lock.d.ts.map +1 -0
  383. package/dist/code-intel/job-lock.js +18 -0
  384. package/dist/code-intel/job-lock.js.map +1 -0
  385. package/dist/code-intel/layer-detector.d.ts +9 -0
  386. package/dist/code-intel/layer-detector.d.ts.map +1 -0
  387. package/dist/code-intel/layer-detector.js +31 -0
  388. package/dist/code-intel/layer-detector.js.map +1 -0
  389. package/dist/code-intel/lsp-resolver.d.ts +24 -0
  390. package/dist/code-intel/lsp-resolver.d.ts.map +1 -0
  391. package/dist/code-intel/lsp-resolver.js +125 -0
  392. package/dist/code-intel/lsp-resolver.js.map +1 -0
  393. package/dist/code-intel/ranker.d.ts +42 -0
  394. package/dist/code-intel/ranker.d.ts.map +1 -0
  395. package/dist/code-intel/ranker.js +123 -0
  396. package/dist/code-intel/ranker.js.map +1 -0
  397. package/dist/code-intel/resolver.d.ts +14 -0
  398. package/dist/code-intel/resolver.d.ts.map +1 -0
  399. package/dist/code-intel/resolver.js +59 -0
  400. package/dist/code-intel/resolver.js.map +1 -0
  401. package/dist/code-intel/tsconfig-paths.d.ts +11 -0
  402. package/dist/code-intel/tsconfig-paths.d.ts.map +1 -0
  403. package/dist/code-intel/tsconfig-paths.js +67 -0
  404. package/dist/code-intel/tsconfig-paths.js.map +1 -0
  405. package/dist/code-intel/watcher.d.ts +27 -0
  406. package/dist/code-intel/watcher.d.ts.map +1 -0
  407. package/dist/code-intel/watcher.js +93 -0
  408. package/dist/code-intel/watcher.js.map +1 -0
  409. package/dist/core/board/board-column.value-object.js +1 -1
  410. package/dist/core/board/board-column.value-object.js.map +1 -1
  411. package/dist/core/board/pipeline.value-object.js +1 -1
  412. package/dist/core/board/pipeline.value-object.js.map +1 -1
  413. package/dist/core/board/skill-execution.entity.js +1 -1
  414. package/dist/core/board/skill-execution.entity.js.map +1 -1
  415. package/dist/core/board/task-title.value-object.js +1 -1
  416. package/dist/core/board/task-title.value-object.js.map +1 -1
  417. package/dist/core/ports/chat-llm.d.ts +36 -0
  418. package/dist/core/ports/chat-llm.d.ts.map +1 -0
  419. package/dist/core/ports/chat-llm.js +2 -0
  420. package/dist/core/ports/chat-llm.js.map +1 -0
  421. package/dist/core/ports/code-embedding.d.ts +42 -0
  422. package/dist/core/ports/code-embedding.d.ts.map +1 -0
  423. package/dist/core/ports/code-embedding.js +2 -0
  424. package/dist/core/ports/code-embedding.js.map +1 -0
  425. package/dist/core/ports/code-graph.d.ts +56 -0
  426. package/dist/core/ports/code-graph.d.ts.map +1 -0
  427. package/dist/core/ports/code-graph.js +2 -0
  428. package/dist/core/ports/code-graph.js.map +1 -0
  429. package/dist/core/ports/code-meta.d.ts +37 -0
  430. package/dist/core/ports/code-meta.d.ts.map +1 -0
  431. package/dist/core/ports/code-meta.js +2 -0
  432. package/dist/core/ports/code-meta.js.map +1 -0
  433. package/dist/core/ports/code-parser.d.ts +13 -0
  434. package/dist/core/ports/code-parser.d.ts.map +1 -0
  435. package/dist/core/ports/code-parser.js +2 -0
  436. package/dist/core/ports/code-parser.js.map +1 -0
  437. package/dist/core/ports/code-vector-store.d.ts +42 -0
  438. package/dist/core/ports/code-vector-store.d.ts.map +1 -0
  439. package/dist/core/ports/code-vector-store.js +2 -0
  440. package/dist/core/ports/code-vector-store.js.map +1 -0
  441. package/dist/core/ports/docker-control.d.ts +44 -0
  442. package/dist/core/ports/docker-control.d.ts.map +1 -0
  443. package/dist/core/ports/docker-control.js +8 -0
  444. package/dist/core/ports/docker-control.js.map +1 -0
  445. package/dist/core/ports/hub-readiness-probe.d.ts +22 -0
  446. package/dist/core/ports/hub-readiness-probe.d.ts.map +1 -0
  447. package/dist/core/ports/hub-readiness-probe.js +2 -0
  448. package/dist/core/ports/hub-readiness-probe.js.map +1 -0
  449. package/dist/core/ports/index.d.ts +10 -0
  450. package/dist/core/ports/index.d.ts.map +1 -1
  451. package/dist/core/ports/lsp-client.d.ts +22 -0
  452. package/dist/core/ports/lsp-client.d.ts.map +1 -0
  453. package/dist/core/ports/lsp-client.js +2 -0
  454. package/dist/core/ports/lsp-client.js.map +1 -0
  455. package/dist/core/ports/ollama-control.d.ts +61 -0
  456. package/dist/core/ports/ollama-control.d.ts.map +1 -0
  457. package/dist/core/ports/ollama-control.js +7 -0
  458. package/dist/core/ports/ollama-control.js.map +1 -0
  459. package/dist/core/ports/platform-probe.d.ts +47 -0
  460. package/dist/core/ports/platform-probe.d.ts.map +1 -0
  461. package/dist/core/ports/platform-probe.js +8 -0
  462. package/dist/core/ports/platform-probe.js.map +1 -0
  463. package/dist/core/ports/storage.d.ts +62 -29
  464. package/dist/core/ports/storage.d.ts.map +1 -1
  465. package/dist/core/ports/workspace-store.d.ts +52 -0
  466. package/dist/core/ports/workspace-store.d.ts.map +1 -0
  467. package/dist/core/ports/workspace-store.js +2 -0
  468. package/dist/core/ports/workspace-store.js.map +1 -0
  469. package/dist/core/types/code.d.ts +153 -0
  470. package/dist/core/types/code.d.ts.map +1 -0
  471. package/dist/core/types/code.js +2 -0
  472. package/dist/core/types/code.js.map +1 -0
  473. package/dist/core/types/config.d.ts +1 -1
  474. package/dist/core/types/config.d.ts.map +1 -1
  475. package/dist/core/types/config.js +8 -1
  476. package/dist/core/types/config.js.map +1 -1
  477. package/dist/core/types/index.d.ts +3 -0
  478. package/dist/core/types/index.d.ts.map +1 -1
  479. package/dist/core/types/init.d.ts +29 -0
  480. package/dist/core/types/init.d.ts.map +1 -0
  481. package/dist/core/types/init.js +2 -0
  482. package/dist/core/types/init.js.map +1 -0
  483. package/dist/core/types/workspace.d.ts +78 -0
  484. package/dist/core/types/workspace.d.ts.map +1 -0
  485. package/dist/core/types/workspace.js +2 -0
  486. package/dist/core/types/workspace.js.map +1 -0
  487. package/dist/mcp/helpers.d.ts +131 -19
  488. package/dist/mcp/helpers.d.ts.map +1 -1
  489. package/dist/mcp/helpers.js +271 -141
  490. package/dist/mcp/helpers.js.map +1 -1
  491. package/dist/mcp/server.d.ts.map +1 -1
  492. package/dist/mcp/server.js +49 -5
  493. package/dist/mcp/server.js.map +1 -1
  494. package/dist/mcp/tools/code-graph.d.ts +3 -0
  495. package/dist/mcp/tools/code-graph.d.ts.map +1 -0
  496. package/dist/mcp/tools/code-graph.js +330 -0
  497. package/dist/mcp/tools/code-graph.js.map +1 -0
  498. package/dist/mcp/tools/code-hybrid.d.ts +3 -0
  499. package/dist/mcp/tools/code-hybrid.d.ts.map +1 -0
  500. package/dist/mcp/tools/code-hybrid.js +142 -0
  501. package/dist/mcp/tools/code-hybrid.js.map +1 -0
  502. package/dist/mcp/tools/code-search.d.ts +3 -0
  503. package/dist/mcp/tools/code-search.d.ts.map +1 -0
  504. package/dist/mcp/tools/code-search.js +95 -0
  505. package/dist/mcp/tools/code-search.js.map +1 -0
  506. package/dist/mcp/tools/database.d.ts.map +1 -1
  507. package/dist/mcp/tools/database.js +86 -97
  508. package/dist/mcp/tools/database.js.map +1 -1
  509. package/dist/mcp/tools/estimate.d.ts.map +1 -1
  510. package/dist/mcp/tools/estimate.js +106 -82
  511. package/dist/mcp/tools/estimate.js.map +1 -1
  512. package/dist/mcp/tools/graph.d.ts.map +1 -1
  513. package/dist/mcp/tools/graph.js +142 -157
  514. package/dist/mcp/tools/graph.js.map +1 -1
  515. package/dist/mcp/tools/issue.d.ts.map +1 -1
  516. package/dist/mcp/tools/issue.js +172 -172
  517. package/dist/mcp/tools/issue.js.map +1 -1
  518. package/dist/mcp/tools/push.d.ts.map +1 -1
  519. package/dist/mcp/tools/push.js +70 -100
  520. package/dist/mcp/tools/push.js.map +1 -1
  521. package/dist/mcp/tools/query.d.ts.map +1 -1
  522. package/dist/mcp/tools/query.js +187 -246
  523. package/dist/mcp/tools/query.js.map +1 -1
  524. package/dist/mcp/tools/search.d.ts.map +1 -1
  525. package/dist/mcp/tools/search.js +25 -22
  526. package/dist/mcp/tools/search.js.map +1 -1
  527. package/dist/mcp/tools/workspace.d.ts.map +1 -1
  528. package/dist/mcp/tools/workspace.js +120 -73
  529. package/dist/mcp/tools/workspace.js.map +1 -1
  530. package/dist/use-cases/build-graph.d.ts +1 -1
  531. package/dist/use-cases/build-graph.d.ts.map +1 -1
  532. package/dist/use-cases/build-graph.js +63 -50
  533. package/dist/use-cases/build-graph.js.map +1 -1
  534. package/dist/use-cases/code-search.d.ts +60 -0
  535. package/dist/use-cases/code-search.d.ts.map +1 -0
  536. package/dist/use-cases/code-search.js +163 -0
  537. package/dist/use-cases/code-search.js.map +1 -0
  538. package/dist/use-cases/embed.d.ts +1 -1
  539. package/dist/use-cases/embed.d.ts.map +1 -1
  540. package/dist/use-cases/embed.js +5 -5
  541. package/dist/use-cases/embed.js.map +1 -1
  542. package/dist/use-cases/index-code.d.ts +24 -0
  543. package/dist/use-cases/index-code.d.ts.map +1 -0
  544. package/dist/use-cases/index-code.js +43 -0
  545. package/dist/use-cases/index-code.js.map +1 -0
  546. package/dist/use-cases/init/bootstrap-hub.d.ts +55 -0
  547. package/dist/use-cases/init/bootstrap-hub.d.ts.map +1 -0
  548. package/dist/use-cases/init/bootstrap-hub.js +116 -0
  549. package/dist/use-cases/init/bootstrap-hub.js.map +1 -0
  550. package/dist/use-cases/init/check-dims-conflict.d.ts +33 -0
  551. package/dist/use-cases/init/check-dims-conflict.d.ts.map +1 -0
  552. package/dist/use-cases/init/check-dims-conflict.js +39 -0
  553. package/dist/use-cases/init/check-dims-conflict.js.map +1 -0
  554. package/dist/use-cases/init/check-hub-exists.d.ts +23 -0
  555. package/dist/use-cases/init/check-hub-exists.d.ts.map +1 -0
  556. package/dist/use-cases/init/check-hub-exists.js +39 -0
  557. package/dist/use-cases/init/check-hub-exists.js.map +1 -0
  558. package/dist/use-cases/init/check-ports.d.ts +18 -0
  559. package/dist/use-cases/init/check-ports.d.ts.map +1 -0
  560. package/dist/use-cases/init/check-ports.js +25 -0
  561. package/dist/use-cases/init/check-ports.js.map +1 -0
  562. package/dist/use-cases/init/check-versions.d.ts +37 -0
  563. package/dist/use-cases/init/check-versions.d.ts.map +1 -0
  564. package/dist/use-cases/init/check-versions.js +50 -0
  565. package/dist/use-cases/init/check-versions.js.map +1 -0
  566. package/dist/use-cases/init/clear-stale-active.d.ts +20 -0
  567. package/dist/use-cases/init/clear-stale-active.d.ts.map +1 -0
  568. package/dist/use-cases/init/clear-stale-active.js +26 -0
  569. package/dist/use-cases/init/clear-stale-active.js.map +1 -0
  570. package/dist/use-cases/init/ensure-embedding-model.d.ts +20 -0
  571. package/dist/use-cases/init/ensure-embedding-model.d.ts.map +1 -0
  572. package/dist/use-cases/init/ensure-embedding-model.js +24 -0
  573. package/dist/use-cases/init/ensure-embedding-model.js.map +1 -0
  574. package/dist/use-cases/init/ensure-ollama-running.d.ts +19 -0
  575. package/dist/use-cases/init/ensure-ollama-running.d.ts.map +1 -0
  576. package/dist/use-cases/init/ensure-ollama-running.js +24 -0
  577. package/dist/use-cases/init/ensure-ollama-running.js.map +1 -0
  578. package/dist/use-cases/init/health-check-existing-llm.d.ts +25 -0
  579. package/dist/use-cases/init/health-check-existing-llm.d.ts.map +1 -0
  580. package/dist/use-cases/init/health-check-existing-llm.js +42 -0
  581. package/dist/use-cases/init/health-check-existing-llm.js.map +1 -0
  582. package/dist/use-cases/init/install-ollama.d.ts +27 -0
  583. package/dist/use-cases/init/install-ollama.d.ts.map +1 -0
  584. package/dist/use-cases/init/install-ollama.js +51 -0
  585. package/dist/use-cases/init/install-ollama.js.map +1 -0
  586. package/dist/use-cases/init/probe-llm.d.ts +32 -0
  587. package/dist/use-cases/init/probe-llm.d.ts.map +1 -0
  588. package/dist/use-cases/init/probe-llm.js +42 -0
  589. package/dist/use-cases/init/probe-llm.js.map +1 -0
  590. package/dist/use-cases/init/resolve-hub-ports.d.ts +46 -0
  591. package/dist/use-cases/init/resolve-hub-ports.d.ts.map +1 -0
  592. package/dist/use-cases/init/resolve-hub-ports.js +77 -0
  593. package/dist/use-cases/init/resolve-hub-ports.js.map +1 -0
  594. package/dist/use-cases/init/validate-workspace-name.d.ts +26 -0
  595. package/dist/use-cases/init/validate-workspace-name.d.ts.map +1 -0
  596. package/dist/use-cases/init/validate-workspace-name.js +39 -0
  597. package/dist/use-cases/init/validate-workspace-name.js.map +1 -0
  598. package/dist/use-cases/init/wait-for-docker.d.ts +16 -0
  599. package/dist/use-cases/init/wait-for-docker.d.ts.map +1 -0
  600. package/dist/use-cases/init/wait-for-docker.js +16 -0
  601. package/dist/use-cases/init/wait-for-docker.js.map +1 -0
  602. package/dist/use-cases/init/write-config-env.d.ts +32 -0
  603. package/dist/use-cases/init/write-config-env.d.ts.map +1 -0
  604. package/dist/use-cases/init/write-config-env.js +118 -0
  605. package/dist/use-cases/init/write-config-env.js.map +1 -0
  606. package/dist/use-cases/move-task.js +2 -2
  607. package/dist/use-cases/move-task.js.map +1 -1
  608. package/dist/use-cases/pull-db.d.ts +1 -1
  609. package/dist/use-cases/pull-db.d.ts.map +1 -1
  610. package/dist/use-cases/pull-db.js +3 -3
  611. package/dist/use-cases/pull-db.js.map +1 -1
  612. package/dist/use-cases/pull-git.d.ts +1 -1
  613. package/dist/use-cases/pull-git.d.ts.map +1 -1
  614. package/dist/use-cases/pull-git.js +5 -5
  615. package/dist/use-cases/pull-git.js.map +1 -1
  616. package/dist/use-cases/pull-github.d.ts +1 -1
  617. package/dist/use-cases/pull-github.d.ts.map +1 -1
  618. package/dist/use-cases/pull-github.js +6 -6
  619. package/dist/use-cases/pull-github.js.map +1 -1
  620. package/dist/use-cases/pull.d.ts +1 -1
  621. package/dist/use-cases/pull.d.ts.map +1 -1
  622. package/dist/use-cases/pull.js +6 -6
  623. package/dist/use-cases/pull.js.map +1 -1
  624. package/dist/use-cases/push.d.ts +2 -2
  625. package/dist/use-cases/push.d.ts.map +1 -1
  626. package/dist/use-cases/push.js +8 -8
  627. package/dist/use-cases/push.js.map +1 -1
  628. package/dist/use-cases/register-code-project.d.ts +29 -0
  629. package/dist/use-cases/register-code-project.d.ts.map +1 -0
  630. package/dist/use-cases/register-code-project.js +27 -0
  631. package/dist/use-cases/register-code-project.js.map +1 -0
  632. package/dist/use-cases/unregister-code-project.d.ts +11 -0
  633. package/dist/use-cases/unregister-code-project.d.ts.map +1 -0
  634. package/dist/use-cases/unregister-code-project.js +19 -0
  635. package/dist/use-cases/unregister-code-project.js.map +1 -0
  636. package/dist/use-cases/watch-code.d.ts +33 -0
  637. package/dist/use-cases/watch-code.d.ts.map +1 -0
  638. package/dist/use-cases/watch-code.js +52 -0
  639. package/dist/use-cases/watch-code.js.map +1 -0
  640. package/dist/workspace/active-workspace.d.ts +26 -0
  641. package/dist/workspace/active-workspace.d.ts.map +1 -0
  642. package/dist/workspace/active-workspace.js +69 -0
  643. package/dist/workspace/active-workspace.js.map +1 -0
  644. package/dist/workspace/adf.d.ts.map +1 -1
  645. package/dist/workspace/adf.js +20 -19
  646. package/dist/workspace/adf.js.map +1 -1
  647. package/dist/workspace/config.d.ts +11 -0
  648. package/dist/workspace/config.d.ts.map +1 -1
  649. package/dist/workspace/config.js +76 -22
  650. package/dist/workspace/config.js.map +1 -1
  651. package/dist/workspace/hub-config.d.ts +74 -0
  652. package/dist/workspace/hub-config.d.ts.map +1 -0
  653. package/dist/workspace/hub-config.js +164 -0
  654. package/dist/workspace/hub-config.js.map +1 -0
  655. package/dist/workspace/registry.d.ts +23 -3
  656. package/dist/workspace/registry.d.ts.map +1 -1
  657. package/dist/workspace/registry.js +32 -14
  658. package/dist/workspace/registry.js.map +1 -1
  659. package/dist/workspace/resolver.d.ts +20 -18
  660. package/dist/workspace/resolver.d.ts.map +1 -1
  661. package/dist/workspace/resolver.js +100 -59
  662. package/dist/workspace/resolver.js.map +1 -1
  663. package/package.json +13 -4
  664. package/templates/code-docker-compose.yml +51 -0
  665. package/templates/env.example +16 -0
  666. package/templates/hub-config.env +65 -0
  667. package/templates/hub-docker-compose.yml +88 -0
  668. package/templates/migrate-to-hub.sql +90 -0
  669. package/dist/cli/workspaces.d.ts +0 -3
  670. package/dist/cli/workspaces.d.ts.map +0 -1
  671. package/dist/cli/workspaces.js +0 -34
  672. package/dist/cli/workspaces.js.map +0 -1
@@ -1,41 +1,153 @@
1
- import { getEnabledSources } from '../workspace/config.js';
2
- import type { WorkspaceConfig, SourceType } from '../core/types/index.js';
3
1
  import type { ISourceProvider } from '../core/ports/source-provider.js';
4
2
  import type { IStorage } from '../core/ports/storage.js';
3
+ import type { ICodeGraph } from '../core/ports/code-graph.js';
4
+ import type { ICodeVectorStore } from '../core/ports/code-vector-store.js';
5
+ import type { ICodeParser } from '../core/ports/code-parser.js';
6
+ import type { ICodeEmbedding } from '../core/ports/code-embedding.js';
7
+ import type { ICodeMetaStore } from '../core/ports/code-meta.js';
8
+ import type { IChatLlm } from '../core/ports/chat-llm.js';
9
+ import type { IWorkspaceStore } from '../core/ports/workspace-store.js';
10
+ import type { Workspace, WorkspaceConfig } from '../core/types/index.js';
5
11
  import type { ToolResponse } from './types.js';
12
+ export interface WorkspaceContext {
13
+ readonly workspaceId: string;
14
+ readonly workspace: Workspace;
15
+ readonly config: WorkspaceConfig;
16
+ }
6
17
  export type WorkspaceResult = {
7
18
  ok: true;
8
- root: string;
19
+ workspaceId: string;
20
+ workspace: Workspace;
9
21
  config: WorkspaceConfig;
10
22
  } | {
11
23
  ok: false;
12
24
  reason: string;
13
25
  };
14
- export interface WorkspaceListItem {
15
- name: string;
16
- path: string;
17
- sources: SourceType[];
18
- active: boolean;
26
+ interface CachedCodeAdapters {
27
+ graph: ICodeGraph;
28
+ vec: ICodeVectorStore;
29
+ parser: ICodeParser;
30
+ embedding: ICodeEmbedding;
31
+ meta: ICodeMetaStore;
32
+ storage: IStorage & ICodeMetaStore;
33
+ chatLlm: IChatLlm | null;
34
+ projectRoot: string;
19
35
  }
20
- export declare function loadWorkspace(): WorkspaceResult;
36
+ export type CodeAdapters = Omit<CachedCodeAdapters, 'projectRoot'>;
37
+ export declare function setActiveStorage(storage: IStorage): void;
38
+ export declare function getActiveStorage(): IStorage | null;
39
+ export declare function setActiveWorkspaceStore(store: IWorkspaceStore): void;
40
+ export declare function getWorkspaceStore(): Promise<IWorkspaceStore>;
21
41
  /**
22
- * Switch to a different workspace by name.
23
- * Closes current storage connection, updates env, reloads .env.
42
+ * Resolve the workspace for a tool invocation.
43
+ *
44
+ * Resolution order (mirrors {@link import('../workspace/resolver').requireWorkspaceId}):
45
+ * 1. `explicit` (the tool's `workspace_id` schema field).
46
+ * 2. `ARGUSTACK_WORKSPACE_ID` env var.
47
+ * 3. `~/.argustack/active-workspace.json#activeWorkspaceId`.
48
+ * 4. Auto-pick when exactly one workspace exists in the hub.
49
+ *
50
+ * Returns a structured result so MCP tools can render a tool-friendly
51
+ * error response instead of throwing.
24
52
  */
25
- export declare function switchWorkspace(name: string): Promise<WorkspaceResult>;
53
+ export declare function loadWorkspace(explicit?: string): Promise<WorkspaceResult>;
26
54
  /**
27
- * Scan parent directory for sibling workspaces.
55
+ * Switch the active workspace. Writes the hub `active-workspace.json`,
56
+ * touches `last_active_at`, and resets cached connections so subsequent
57
+ * tool calls reconnect with whatever per-workspace settings apply.
28
58
  */
29
- export declare function listSiblingWorkspaces(): WorkspaceListItem[];
30
- export declare function setActiveStorage(storage: IStorage): void;
31
- export declare function getActiveStorage(): IStorage | null;
32
- export declare function createAdapters(workspaceRoot: string): Promise<{
59
+ export declare function switchWorkspace(name: string): Promise<WorkspaceResult>;
60
+ export interface ResolvedAdapters {
33
61
  source: ISourceProvider | null;
34
62
  storage: IStorage;
35
- }>;
63
+ workspaceId: string;
64
+ }
65
+ /**
66
+ * Build the per-tool adapter set. The hub Postgres pool is reused
67
+ * across invocations via {@link activeStorage}; the source provider
68
+ * (Jira/proxy) is recreated each call since per-workspace project
69
+ * filters can change.
70
+ */
71
+ export declare function createAdapters(workspaceId: string): Promise<ResolvedAdapters>;
72
+ export declare function setActiveCodeAdapters(adapters: CodeAdapters | null): void;
73
+ export declare function getActiveCodeAdapters(): CodeAdapters | null;
74
+ /**
75
+ * Build adapters used by code-intelligence MCP tools for a specific
76
+ * workspace. Returns `null` if the hub config is missing the bits
77
+ * required by the chosen embedding provider.
78
+ */
79
+ export declare function createCodeAdapters(workspaceId: string): Promise<CodeAdapters | null>;
80
+ /**
81
+ * Annotation presets reused across MCP tool registrations.
82
+ * Mirrors the `ToolAnnotations` shape from @modelcontextprotocol/sdk.
83
+ *
84
+ * - READ_ONLY — pure query, no side effects, safe to retry.
85
+ * - LOCAL_WRITE — mutates hub-local state (board.md / Postgres rows),
86
+ * no remote calls (e.g. create_issue with source='local').
87
+ * - REMOTE_WRITE — pushes to or pulls from external systems (Jira, GitHub).
88
+ * destructiveHint flips on so clients can warn the user
89
+ * before invocation.
90
+ */
91
+ export declare const ANNOTATIONS: {
92
+ readonly READ_ONLY: {
93
+ readonly readOnlyHint: true;
94
+ readonly idempotentHint: true;
95
+ readonly openWorldHint: false;
96
+ };
97
+ readonly REMOTE_READ: {
98
+ readonly readOnlyHint: true;
99
+ readonly idempotentHint: true;
100
+ readonly openWorldHint: true;
101
+ };
102
+ readonly LOCAL_WRITE: {
103
+ readonly readOnlyHint: false;
104
+ readonly destructiveHint: false;
105
+ readonly idempotentHint: false;
106
+ readonly openWorldHint: false;
107
+ };
108
+ readonly REMOTE_WRITE: {
109
+ readonly readOnlyHint: false;
110
+ readonly destructiveHint: true;
111
+ readonly idempotentHint: false;
112
+ readonly openWorldHint: true;
113
+ };
114
+ };
36
115
  export declare function textResponse(text: string): ToolResponse;
37
116
  export declare function errorResponse(text: string): ToolResponse;
117
+ /**
118
+ * Standard "workspace not found" error response for MCP tools.
119
+ *
120
+ * Wraps the technical {@link WorkspaceResult.reason} in a UX-friendly
121
+ * message that always contains the marker "Workspace not found" so
122
+ * clients and tests can detect it regardless of which underlying
123
+ * resolution step failed (no `.argustack/`, missing env var, unknown
124
+ * id, etc.).
125
+ */
126
+ export declare function workspaceNotFoundResponse(reason: string): ToolResponse;
38
127
  export declare function getErrorMessage(err: unknown): string;
128
+ /**
129
+ * High-level helper: resolve workspace, build adapters, run callback.
130
+ * Centralises the boilerplate for MCP tools that just need a scoped
131
+ * `storage` and `workspaceId`.
132
+ */
133
+ export declare function withWorkspace<T>(explicit: string | undefined, fn: (ctx: {
134
+ storage: IStorage;
135
+ workspaceId: string;
136
+ workspace: Workspace;
137
+ config: WorkspaceConfig;
138
+ }) => Promise<T>): Promise<T | ToolResponse>;
39
139
  export declare function str(value: unknown): string;
40
- export { getEnabledSources };
140
+ /**
141
+ * Render `value` via {@link str}, but substitute `fallback` when the
142
+ * result is the empty string. Replaces the deprecated `str(x) || 'N/A'`
143
+ * pattern in a way that satisfies @typescript-eslint/strict-boolean-expressions.
144
+ */
145
+ export declare function strOr(value: unknown, fallback: string): string;
146
+ /**
147
+ * Render a possibly-null/undefined string with a fallback.
148
+ */
149
+ export declare function nullableStr(value: string | null | undefined, fallback: string): string;
150
+ /** True when `value` is a non-empty string. */
151
+ export declare function hasText(value: string | null | undefined): value is string;
152
+ export {};
41
153
  //# sourceMappingURL=helpers.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"helpers.d.ts","sourceRoot":"","sources":["../../src/mcp/helpers.ts"],"names":[],"mappings":"AAIA,OAAO,EAAc,iBAAiB,EAAE,MAAM,wBAAwB,CAAC;AAEvE,OAAO,KAAK,EAAE,eAAe,EAAE,UAAU,EAAE,MAAM,wBAAwB,CAAC;AAC1E,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,kCAAkC,CAAC;AACxE,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,0BAA0B,CAAC;AACzD,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AAE/C,MAAM,MAAM,eAAe,GACvB;IAAE,EAAE,EAAE,IAAI,CAAC;IAAC,IAAI,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,eAAe,CAAA;CAAE,GACnD;IAAE,EAAE,EAAE,KAAK,CAAC;IAAC,MAAM,EAAE,MAAM,CAAA;CAAE,CAAC;AAElC,MAAM,WAAW,iBAAiB;IAChC,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,UAAU,EAAE,CAAC;IACtB,MAAM,EAAE,OAAO,CAAC;CACjB;AAID,wBAAgB,aAAa,IAAI,eAAe,CA+B/C;AAED;;;GAGG;AACH,wBAAsB,eAAe,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,eAAe,CAAC,CAmD5E;AAED;;GAEG;AACH,wBAAgB,qBAAqB,IAAI,iBAAiB,EAAE,CA0D3D;AAED,wBAAgB,gBAAgB,CAAC,OAAO,EAAE,QAAQ,GAAG,IAAI,CAExD;AAED,wBAAgB,gBAAgB,IAAI,QAAQ,GAAG,IAAI,CAElD;AAED,wBAAsB,cAAc,CAAC,aAAa,EAAE,MAAM,GAAG,OAAO,CAAC;IACnE,MAAM,EAAE,eAAe,GAAG,IAAI,CAAC;IAC/B,OAAO,EAAE,QAAQ,CAAC;CACnB,CAAC,CAkCD;AAED,wBAAgB,YAAY,CAAC,IAAI,EAAE,MAAM,GAAG,YAAY,CAEvD;AAED,wBAAgB,aAAa,CAAC,IAAI,EAAE,MAAM,GAAG,YAAY,CAExD;AAED,wBAAgB,eAAe,CAAC,GAAG,EAAE,OAAO,GAAG,MAAM,CAKpD;AAED,wBAAgB,GAAG,CAAC,KAAK,EAAE,OAAO,GAAG,MAAM,CAc1C;AAED,OAAO,EAAE,iBAAiB,EAAE,CAAC"}
1
+ {"version":3,"file":"helpers.d.ts","sourceRoot":"","sources":["../../src/mcp/helpers.ts"],"names":[],"mappings":"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"}
@@ -1,187 +1,299 @@
1
- import dotenv from 'dotenv';
2
- import { readdirSync, existsSync, statSync } from 'node:fs';
3
- import { join, dirname, basename } from 'node:path';
4
- import { findWorkspaceRoot } from '../workspace/resolver.js';
5
- import { readConfig, getEnabledSources } from '../workspace/config.js';
6
- import { listRegisteredWorkspaces } from '../workspace/registry.js';
1
+ import { loadHubConfig } from '../workspace/hub-config.js';
2
+ import { getActiveWorkspace, setActiveWorkspace, clearActiveWorkspace, } from '../workspace/active-workspace.js';
3
+ import { readWorkspaceConfigFromHub } from '../workspace/config.js';
7
4
  let activeStorage = null;
8
- export function loadWorkspace() {
9
- const envVar = process.env['ARGUSTACK_WORKSPACE'];
10
- const root = findWorkspaceRoot();
11
- if (!root) {
12
- if (envVar) {
13
- return {
14
- ok: false,
15
- reason: `ARGUSTACK_WORKSPACE is set to "${envVar}" but no .argustack/ marker found there or in parent directories.`,
16
- };
17
- }
18
- const registered = listRegisteredWorkspaces();
19
- if (registered.length > 0) {
20
- const names = registered.map((w) => w.name).join(', ');
21
- return {
22
- ok: false,
23
- reason: `Workspace not found from current directory. Available workspaces: ${names}. Use switch_workspace("name") to connect.`,
24
- };
25
- }
26
- return { ok: false, reason: 'No workspaces found. Run "argustack init" to create one.' };
27
- }
28
- const config = readConfig(root);
29
- if (!config) {
30
- return {
31
- ok: false,
32
- reason: `Workspace found at ${root} but .argustack/config.json is missing or invalid. Run "argustack init".`,
33
- };
5
+ let activeWorkspaceStore = null;
6
+ let activeCodeAdapters = null;
7
+ export function setActiveStorage(storage) {
8
+ activeStorage = storage;
9
+ }
10
+ export function getActiveStorage() {
11
+ return activeStorage;
12
+ }
13
+ export function setActiveWorkspaceStore(store) {
14
+ activeWorkspaceStore = store;
15
+ }
16
+ export async function getWorkspaceStore() {
17
+ if (activeWorkspaceStore !== null) {
18
+ return activeWorkspaceStore;
34
19
  }
35
- return { ok: true, root, config };
20
+ const { db } = loadHubConfig();
21
+ const { PostgresWorkspaceStore, createPool } = await import('../adapters/postgres/index.js');
22
+ const store = new PostgresWorkspaceStore(createPool(db));
23
+ activeWorkspaceStore = store;
24
+ return store;
36
25
  }
37
26
  /**
38
- * Switch to a different workspace by name.
39
- * Closes current storage connection, updates env, reloads .env.
27
+ * Resolve the workspace for a tool invocation.
28
+ *
29
+ * Resolution order (mirrors {@link import('../workspace/resolver').requireWorkspaceId}):
30
+ * 1. `explicit` (the tool's `workspace_id` schema field).
31
+ * 2. `ARGUSTACK_WORKSPACE_ID` env var.
32
+ * 3. `~/.argustack/active-workspace.json#activeWorkspaceId`.
33
+ * 4. Auto-pick when exactly one workspace exists in the hub.
34
+ *
35
+ * Returns a structured result so MCP tools can render a tool-friendly
36
+ * error response instead of throwing.
40
37
  */
41
- export async function switchWorkspace(name) {
42
- const currentRoot = process.env['ARGUSTACK_WORKSPACE'];
43
- let targetDir = null;
44
- if (currentRoot) {
45
- const parentDir = dirname(currentRoot);
46
- const siblingDir = join(parentDir, name);
47
- if (existsSync(join(siblingDir, '.argustack'))) {
48
- targetDir = siblingDir;
38
+ export async function loadWorkspace(explicit) {
39
+ let store;
40
+ try {
41
+ store = await getWorkspaceStore();
42
+ }
43
+ catch (err) {
44
+ return { ok: false, reason: getErrorMessage(err) };
45
+ }
46
+ const explicitId = explicit?.trim();
47
+ if (explicitId !== undefined && explicitId.length > 0) {
48
+ const workspace = (await store.getById(explicitId)) ?? (await store.getByName(explicitId));
49
+ if (workspace === null) {
50
+ return { ok: false, reason: `Workspace "${explicitId}" not found in hub.` };
49
51
  }
52
+ return buildResult(workspace, store);
50
53
  }
51
- if (!targetDir) {
52
- const registered = listRegisteredWorkspaces(currentRoot ?? undefined);
53
- const match = registered.find((w) => w.name === name || basename(w.path) === name);
54
- if (match) {
55
- targetDir = match.path;
54
+ const envId = process.env['ARGUSTACK_WORKSPACE_ID']?.trim();
55
+ if (envId !== undefined && envId.length > 0) {
56
+ const workspace = await store.getById(envId);
57
+ if (workspace === null) {
58
+ return { ok: false, reason: `ARGUSTACK_WORKSPACE_ID="${envId}" not found in hub.` };
56
59
  }
60
+ return buildResult(workspace, store);
57
61
  }
58
- if (!targetDir) {
59
- const available = listSiblingWorkspaces();
60
- const names = available.map((w) => w.name).join(', ');
62
+ const active = getActiveWorkspace();
63
+ if (active !== null) {
64
+ const workspace = await store.getById(active.activeWorkspaceId);
65
+ if (workspace !== null) {
66
+ return buildResult(workspace, store);
67
+ }
68
+ clearActiveWorkspace();
69
+ }
70
+ const all = await store.list();
71
+ if (all.length === 1) {
72
+ const only = all[0];
73
+ if (only !== undefined) {
74
+ return buildResult(only, store);
75
+ }
76
+ }
77
+ if (all.length === 0) {
61
78
  return {
62
79
  ok: false,
63
- reason: `Workspace '${name}' not found. Available: ${names || 'none'}`,
80
+ reason: 'No workspaces registered. Run "argustack workspace add <name>" to create one.',
64
81
  };
65
82
  }
66
- if (activeStorage) {
83
+ const names = all.map((w) => w.name).join(', ');
84
+ return {
85
+ ok: false,
86
+ reason: `No active workspace. Pass workspace_id, or call switch_workspace. Available: ${names}.`,
87
+ };
88
+ }
89
+ async function buildResult(workspace, store) {
90
+ const config = await readWorkspaceConfigFromHub(workspace.id, store);
91
+ if (config === null) {
92
+ return { ok: false, reason: `Workspace "${workspace.id}" was not found after lookup.` };
93
+ }
94
+ return { ok: true, workspaceId: workspace.id, workspace, config };
95
+ }
96
+ /**
97
+ * Switch the active workspace. Writes the hub `active-workspace.json`,
98
+ * touches `last_active_at`, and resets cached connections so subsequent
99
+ * tool calls reconnect with whatever per-workspace settings apply.
100
+ */
101
+ export async function switchWorkspace(name) {
102
+ const store = await getWorkspaceStore();
103
+ const workspace = (await store.getById(name)) ?? (await store.getByName(name));
104
+ if (workspace === null) {
105
+ const all = await store.list();
106
+ const joined = all.map((w) => w.name).join(', ');
107
+ const known = joined.length > 0 ? joined : 'none';
108
+ return { ok: false, reason: `Workspace "${name}" not found. Available: ${known}` };
109
+ }
110
+ setActiveWorkspace(workspace.id, workspace.name);
111
+ await store.touchActive(workspace.id);
112
+ if (activeStorage !== null) {
67
113
  try {
68
114
  await activeStorage.close();
69
115
  }
70
- catch { /* ignore close errors */ }
116
+ catch { /* ignore */ }
71
117
  activeStorage = null;
72
118
  }
73
- process.env['ARGUSTACK_WORKSPACE'] = targetDir;
74
- const keysToRemove = Object.keys(process.env).filter((key) => key.startsWith('JIRA_') || key.startsWith('GIT_') || key.startsWith('GITHUB_') ||
75
- key.startsWith('DB_') || key.startsWith('TARGET_DB_') || key.startsWith('CSV_') ||
76
- key === 'OPENAI_API_KEY');
77
- for (const key of keysToRemove) {
78
- Reflect.deleteProperty(process.env, key);
119
+ if (activeCodeAdapters !== null) {
120
+ try {
121
+ await activeCodeAdapters.storage.close();
122
+ }
123
+ catch { /* ignore */ }
124
+ activeCodeAdapters = null;
79
125
  }
80
- dotenv.config({ path: join(targetDir, '.env'), override: true });
81
- return loadWorkspace();
126
+ return buildResult(workspace, store);
82
127
  }
83
128
  /**
84
- * Scan parent directory for sibling workspaces.
129
+ * Build the per-tool adapter set. The hub Postgres pool is reused
130
+ * across invocations via {@link activeStorage}; the source provider
131
+ * (Jira/proxy) is recreated each call since per-workspace project
132
+ * filters can change.
85
133
  */
86
- export function listSiblingWorkspaces() {
87
- const currentRoot = process.env['ARGUSTACK_WORKSPACE'];
88
- if (!currentRoot) {
89
- return [];
90
- }
91
- const parentDir = dirname(currentRoot);
92
- const currentName = basename(currentRoot);
93
- let entries;
94
- try {
95
- entries = readdirSync(parentDir);
134
+ export async function createAdapters(workspaceId) {
135
+ const hub = loadHubConfig();
136
+ const store = await getWorkspaceStore();
137
+ const workspace = await store.getById(workspaceId);
138
+ if (workspace === null) {
139
+ throw new Error(`Workspace "${workspaceId}" not found in hub.`);
96
140
  }
97
- catch {
98
- return [];
141
+ if (activeStorage === null) {
142
+ const { PostgresStorage } = await import('../adapters/postgres/index.js');
143
+ activeStorage = new PostgresStorage(hub.db);
99
144
  }
100
- const workspaces = [];
101
- for (const name of entries) {
102
- if (name.startsWith('.')) {
103
- continue;
104
- }
105
- const subdir = join(parentDir, name);
106
- try {
107
- if (!statSync(subdir).isDirectory()) {
108
- continue;
109
- }
110
- }
111
- catch {
112
- continue;
113
- }
114
- if (!existsSync(join(subdir, '.argustack'))) {
115
- continue;
116
- }
117
- const config = readConfig(subdir);
118
- if (!config) {
119
- continue;
120
- }
121
- workspaces.push({
122
- name: config.name ?? name,
123
- path: subdir,
124
- sources: getEnabledSources(config),
125
- active: name === currentName,
126
- });
145
+ const issueTypeIds = undefined;
146
+ let source = null;
147
+ const { proxyConfigExistsForWorkspace, loadProxyConfigForWorkspace, ProxyJiraProvider } = await import('../adapters/jira-proxy/index.js');
148
+ if (proxyConfigExistsForWorkspace(workspace.id)) {
149
+ const proxyConfig = loadProxyConfigForWorkspace(workspace.id);
150
+ source = new ProxyJiraProvider(proxyConfig, issueTypeIds);
127
151
  }
128
- const registered = listRegisteredWorkspaces(currentRoot);
129
- for (const rw of registered) {
130
- const alreadyListed = workspaces.some((w) => w.path === rw.path);
131
- if (!alreadyListed) {
132
- workspaces.push(rw);
133
- }
152
+ else if (hasText(hub.credentials.jiraUrl)
153
+ && hasText(hub.credentials.jiraEmail)
154
+ && hasText(hub.credentials.jiraApiToken)) {
155
+ const { JiraProvider } = await import('../adapters/jira/index.js');
156
+ source = new JiraProvider({
157
+ host: hub.credentials.jiraUrl,
158
+ email: hub.credentials.jiraEmail,
159
+ apiToken: hub.credentials.jiraApiToken,
160
+ }, issueTypeIds);
134
161
  }
135
- return workspaces;
162
+ return { source, storage: activeStorage, workspaceId };
136
163
  }
137
- export function setActiveStorage(storage) {
138
- activeStorage = storage;
164
+ export function setActiveCodeAdapters(adapters) {
165
+ activeCodeAdapters = adapters !== null
166
+ ? { ...adapters, projectRoot: '' }
167
+ : null;
139
168
  }
140
- export function getActiveStorage() {
141
- return activeStorage;
169
+ export function getActiveCodeAdapters() {
170
+ return activeCodeAdapters;
142
171
  }
143
- export async function createAdapters(workspaceRoot) {
144
- dotenv.config({ path: `${workspaceRoot}/.env`, override: true });
145
- const { JIRA_URL, JIRA_EMAIL, JIRA_API_TOKEN } = process.env;
146
- const { DB_HOST, DB_PORT, DB_USER, DB_PASSWORD, DB_NAME } = process.env;
147
- let source = null;
148
- const wsConfig = readConfig(workspaceRoot);
149
- const issueTypes = wsConfig?.sources.jira?.issueTypeIds;
150
- const { proxyConfigExists, loadProxyConfig, ProxyJiraProvider } = await import('../adapters/jira-proxy/index.js');
151
- if (proxyConfigExists(workspaceRoot)) {
152
- const proxyConfig = loadProxyConfig(workspaceRoot);
153
- source = new ProxyJiraProvider(proxyConfig, issueTypes);
154
- }
155
- else if (JIRA_URL && JIRA_EMAIL && JIRA_API_TOKEN) {
156
- const { JiraProvider } = await import('../adapters/jira/index.js');
157
- source = new JiraProvider({
158
- host: JIRA_URL,
159
- email: JIRA_EMAIL,
160
- apiToken: JIRA_API_TOKEN,
161
- }, issueTypes);
172
+ /**
173
+ * Build adapters used by code-intelligence MCP tools for a specific
174
+ * workspace. Returns `null` if the hub config is missing the bits
175
+ * required by the chosen embedding provider.
176
+ */
177
+ export async function createCodeAdapters(workspaceId) {
178
+ if (activeCodeAdapters !== null) {
179
+ return activeCodeAdapters;
180
+ }
181
+ const hub = loadHubConfig();
182
+ const store = await getWorkspaceStore();
183
+ const workspace = await store.getById(workspaceId);
184
+ if (workspace === null) {
185
+ return null;
186
+ }
187
+ if (hub.embedding.provider === 'voyage' && !hasText(hub.embedding.voyageApiKey)) {
188
+ return null;
162
189
  }
163
190
  const { PostgresStorage } = await import('../adapters/postgres/index.js');
164
- const storage = new PostgresStorage({
165
- host: DB_HOST ?? 'localhost',
166
- port: parseInt(DB_PORT ?? '5434', 10),
167
- user: DB_USER ?? 'argustack',
168
- password: DB_PASSWORD ?? 'argustack_local',
169
- database: DB_NAME ?? 'argustack',
170
- });
171
- return { source, storage };
191
+ const { Neo4jCodeGraphStore } = await import('../adapters/neo4j/index.js');
192
+ const { QdrantCodeVectorStore } = await import('../adapters/qdrant/index.js');
193
+ const { TreeSitterParser } = await import('../adapters/tree-sitter/index.js');
194
+ const storage = new PostgresStorage(hub.db);
195
+ const graph = new Neo4jCodeGraphStore(hub.neo4j);
196
+ const vec = new QdrantCodeVectorStore({ url: hub.qdrant.url });
197
+ const projectRoot = workspace.settings?.gitRepoPaths?.[0] ?? hub.hubDir;
198
+ const parser = new TreeSitterParser({ projectRoot });
199
+ let embedding;
200
+ if (hub.embedding.provider === 'voyage' && hasText(hub.embedding.voyageApiKey)) {
201
+ const { VoyageCodeEmbeddingProvider } = await import('../adapters/voyage/index.js');
202
+ embedding = new VoyageCodeEmbeddingProvider({ apiKey: hub.embedding.voyageApiKey });
203
+ }
204
+ else if (hub.embedding.provider === 'ollama' || hub.embedding.provider === 'custom') {
205
+ const { OllamaCodeEmbeddingProvider } = await import('../adapters/ollama/index.js');
206
+ const url = hub.embedding.provider === 'custom'
207
+ ? hub.embedding.customUrl
208
+ : hub.embedding.ollamaUrl;
209
+ embedding = new OllamaCodeEmbeddingProvider({
210
+ model: hub.embedding.model,
211
+ dimensions: hub.embedding.dimensions,
212
+ ...(hasText(url) ? { url } : {}),
213
+ });
214
+ }
215
+ else {
216
+ const { LmStudioCodeEmbeddingProvider } = await import('../adapters/lmstudio/index.js');
217
+ const lmsOpts = {
218
+ model: hub.embedding.model,
219
+ dimensions: hub.embedding.dimensions,
220
+ };
221
+ if (hasText(hub.embedding.lmstudioUrl)) {
222
+ lmsOpts.url = hub.embedding.lmstudioUrl;
223
+ }
224
+ if (hasText(hub.embedding.rerankModel)) {
225
+ lmsOpts.rerankModel = hub.embedding.rerankModel;
226
+ }
227
+ embedding = new LmStudioCodeEmbeddingProvider(lmsOpts);
228
+ }
229
+ let chatLlm = null;
230
+ if (hub.chatLlm !== null) {
231
+ if (hub.chatLlm.provider === 'ollama') {
232
+ const { OllamaChatLlm } = await import('../adapters/ollama/index.js');
233
+ chatLlm = new OllamaChatLlm({
234
+ model: hub.chatLlm.model,
235
+ ...(hasText(hub.chatLlm.url) ? { url: hub.chatLlm.url } : {}),
236
+ });
237
+ }
238
+ }
239
+ activeCodeAdapters = { graph, vec, parser, embedding, meta: storage, storage, chatLlm, projectRoot };
240
+ return activeCodeAdapters;
172
241
  }
242
+ /**
243
+ * Annotation presets reused across MCP tool registrations.
244
+ * Mirrors the `ToolAnnotations` shape from @modelcontextprotocol/sdk.
245
+ *
246
+ * - READ_ONLY — pure query, no side effects, safe to retry.
247
+ * - LOCAL_WRITE — mutates hub-local state (board.md / Postgres rows),
248
+ * no remote calls (e.g. create_issue with source='local').
249
+ * - REMOTE_WRITE — pushes to or pulls from external systems (Jira, GitHub).
250
+ * destructiveHint flips on so clients can warn the user
251
+ * before invocation.
252
+ */
253
+ export const ANNOTATIONS = {
254
+ READ_ONLY: { readOnlyHint: true, idempotentHint: true, openWorldHint: false },
255
+ REMOTE_READ: { readOnlyHint: true, idempotentHint: true, openWorldHint: true },
256
+ LOCAL_WRITE: { readOnlyHint: false, destructiveHint: false, idempotentHint: false, openWorldHint: false },
257
+ REMOTE_WRITE: { readOnlyHint: false, destructiveHint: true, idempotentHint: false, openWorldHint: true },
258
+ };
173
259
  export function textResponse(text) {
174
260
  return { content: [{ type: 'text', text }] };
175
261
  }
176
262
  export function errorResponse(text) {
177
263
  return { content: [{ type: 'text', text }], isError: true };
178
264
  }
265
+ /**
266
+ * Standard "workspace not found" error response for MCP tools.
267
+ *
268
+ * Wraps the technical {@link WorkspaceResult.reason} in a UX-friendly
269
+ * message that always contains the marker "Workspace not found" so
270
+ * clients and tests can detect it regardless of which underlying
271
+ * resolution step failed (no `.argustack/`, missing env var, unknown
272
+ * id, etc.).
273
+ */
274
+ export function workspaceNotFoundResponse(reason) {
275
+ return errorResponse(`No Argustack workspace found (Workspace not found): ${reason}.\n` +
276
+ 'Run `argustack init` to create one, or pass workspace_id.');
277
+ }
179
278
  export function getErrorMessage(err) {
180
279
  if (err instanceof Error) {
181
280
  return err.message;
182
281
  }
183
282
  return String(err);
184
283
  }
284
+ /**
285
+ * High-level helper: resolve workspace, build adapters, run callback.
286
+ * Centralises the boilerplate for MCP tools that just need a scoped
287
+ * `storage` and `workspaceId`.
288
+ */
289
+ export async function withWorkspace(explicit, fn) {
290
+ const ws = await loadWorkspace(explicit);
291
+ if (!ws.ok) {
292
+ return workspaceNotFoundResponse(ws.reason);
293
+ }
294
+ const { storage } = await createAdapters(ws.workspaceId);
295
+ return fn({ storage, workspaceId: ws.workspaceId, workspace: ws.workspace, config: ws.config });
296
+ }
185
297
  export function str(value) {
186
298
  if (value === null || value === undefined) {
187
299
  return '';
@@ -197,5 +309,23 @@ export function str(value) {
197
309
  }
198
310
  return JSON.stringify(value);
199
311
  }
200
- export { getEnabledSources };
312
+ /**
313
+ * Render `value` via {@link str}, but substitute `fallback` when the
314
+ * result is the empty string. Replaces the deprecated `str(x) || 'N/A'`
315
+ * pattern in a way that satisfies @typescript-eslint/strict-boolean-expressions.
316
+ */
317
+ export function strOr(value, fallback) {
318
+ const result = str(value);
319
+ return result.length > 0 ? result : fallback;
320
+ }
321
+ /**
322
+ * Render a possibly-null/undefined string with a fallback.
323
+ */
324
+ export function nullableStr(value, fallback) {
325
+ return value !== null && value !== undefined && value.length > 0 ? value : fallback;
326
+ }
327
+ /** True when `value` is a non-empty string. */
328
+ export function hasText(value) {
329
+ return value !== null && value !== undefined && value.length > 0;
330
+ }
201
331
  //# sourceMappingURL=helpers.js.map