profclaw 0.0.1-beta.3 → 2.3.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (535) hide show
  1. package/.env.example +14 -2
  2. package/CHANGELOG.md +54 -34
  3. package/CONTRIBUTING.md +23 -5
  4. package/Dockerfile +39 -23
  5. package/README.md +271 -72
  6. package/dist/agents/agent-summary.d.ts +44 -0
  7. package/dist/agents/agent-summary.js +176 -0
  8. package/dist/agents/auto-memory.d.ts +59 -0
  9. package/dist/agents/auto-memory.js +310 -0
  10. package/dist/agents/checkpoint-manager.d.ts +76 -0
  11. package/dist/agents/checkpoint-manager.js +156 -0
  12. package/dist/agents/circuit-breaker.d.ts +54 -0
  13. package/dist/agents/circuit-breaker.js +153 -0
  14. package/dist/agents/context-compactor.d.ts +70 -0
  15. package/dist/agents/context-compactor.js +361 -0
  16. package/dist/agents/conversation-branch.d.ts +55 -0
  17. package/dist/agents/conversation-branch.js +115 -0
  18. package/dist/agents/error-recovery.d.ts +44 -0
  19. package/dist/agents/error-recovery.js +197 -0
  20. package/dist/agents/events.d.ts +76 -0
  21. package/dist/agents/events.js +8 -0
  22. package/dist/agents/executor.d.ts +35 -1
  23. package/dist/agents/executor.js +573 -124
  24. package/dist/agents/file-snapshots.d.ts +72 -0
  25. package/dist/agents/file-snapshots.js +182 -0
  26. package/dist/agents/index.d.ts +2 -0
  27. package/dist/agents/orchestrator.d.ts +183 -0
  28. package/dist/agents/orchestrator.js +495 -0
  29. package/dist/agents/permissions.d.ts +63 -0
  30. package/dist/agents/permissions.js +138 -0
  31. package/dist/agents/plan-mode.d.ts +71 -0
  32. package/dist/agents/plan-mode.js +186 -0
  33. package/dist/agents/prompt-suggestions.d.ts +33 -0
  34. package/dist/agents/prompt-suggestions.js +208 -0
  35. package/dist/agents/rate-limit-monitor.d.ts +56 -0
  36. package/dist/agents/rate-limit-monitor.js +224 -0
  37. package/dist/agents/result-store.d.ts +37 -0
  38. package/dist/agents/result-store.js +104 -0
  39. package/dist/agents/session-diff.d.ts +43 -0
  40. package/dist/agents/session-diff.js +258 -0
  41. package/dist/agents/tool-loader.d.ts +65 -0
  42. package/dist/agents/tool-loader.js +273 -0
  43. package/dist/agents/transcript.d.ts +96 -0
  44. package/dist/agents/transcript.js +267 -0
  45. package/dist/agents/worktree-manager.d.ts +80 -0
  46. package/dist/agents/worktree-manager.js +203 -0
  47. package/dist/auth/middleware.js +14 -0
  48. package/dist/chat/agentic-executor.d.ts +7 -0
  49. package/dist/chat/agentic-executor.js +253 -30
  50. package/dist/chat/conversations.d.ts +2 -0
  51. package/dist/chat/conversations.js +8 -0
  52. package/dist/chat/execution/executor.d.ts +8 -0
  53. package/dist/chat/execution/executor.js +157 -103
  54. package/dist/chat/execution/index.js +5 -1
  55. package/dist/chat/execution/tool-router.js +40 -14
  56. package/dist/chat/execution/tools/canvas.d.ts +2 -2
  57. package/dist/chat/execution/tools/code-tools.d.ts +66 -0
  58. package/dist/chat/execution/tools/code-tools.js +353 -0
  59. package/dist/chat/execution/tools/complete-task.d.ts +2 -2
  60. package/dist/chat/execution/tools/cron-tool.d.ts +26 -10
  61. package/dist/chat/execution/tools/cron-tool.js +48 -3
  62. package/dist/chat/execution/tools/decompose-task.d.ts +58 -0
  63. package/dist/chat/execution/tools/decompose-task.js +166 -0
  64. package/dist/chat/execution/tools/exec.d.ts +5 -2
  65. package/dist/chat/execution/tools/exec.js +294 -155
  66. package/dist/chat/execution/tools/feed-tools.d.ts +77 -0
  67. package/dist/chat/execution/tools/feed-tools.js +142 -0
  68. package/dist/chat/execution/tools/file-ops.d.ts +1 -1
  69. package/dist/chat/execution/tools/github.d.ts +2 -2
  70. package/dist/chat/execution/tools/index.d.ts +15 -3
  71. package/dist/chat/execution/tools/index.js +125 -12
  72. package/dist/chat/execution/tools/integrations.d.ts +8 -8
  73. package/dist/chat/execution/tools/multi-patch.d.ts +53 -0
  74. package/dist/chat/execution/tools/multi-patch.js +373 -0
  75. package/dist/chat/execution/tools/openai-image-gen.d.ts +2 -2
  76. package/dist/chat/execution/tools/plan-tools.d.ts +80 -0
  77. package/dist/chat/execution/tools/plan-tools.js +134 -0
  78. package/dist/chat/execution/tools/profclaw-ops.d.ts +6 -6
  79. package/dist/chat/execution/tools/repl-tool.d.ts +46 -0
  80. package/dist/chat/execution/tools/repl-tool.js +207 -0
  81. package/dist/chat/execution/tools/sessions-send.d.ts +2 -2
  82. package/dist/chat/execution/tools/slack-actions.d.ts +2 -2
  83. package/dist/chat/execution/tools/system.d.ts +4 -4
  84. package/dist/chat/execution/tools/todo-tool.d.ts +72 -0
  85. package/dist/chat/execution/tools/todo-tool.js +152 -0
  86. package/dist/chat/execution/tools/tool-search.d.ts +50 -0
  87. package/dist/chat/execution/tools/tool-search.js +155 -0
  88. package/dist/chat/execution/types.d.ts +21 -14
  89. package/dist/chat/execution/workflows/executor.d.ts +11 -0
  90. package/dist/chat/execution/workflows/executor.js +99 -1
  91. package/dist/chat/execution/workflows/types.d.ts +35 -2
  92. package/dist/chat/format/index.d.ts +1 -0
  93. package/dist/chat/format/index.js +1 -0
  94. package/dist/chat/format/markdown-convert.d.ts +23 -0
  95. package/dist/chat/format/markdown-convert.js +149 -0
  96. package/dist/chat/index.d.ts +1 -1
  97. package/dist/chat/index.js +1 -1
  98. package/dist/chat/message-handler.js +58 -6
  99. package/dist/chat/proactive/index.d.ts +62 -0
  100. package/dist/chat/proactive/index.js +147 -0
  101. package/dist/chat/prompt-adapter.js +2 -0
  102. package/dist/chat/providers/irc/index.d.ts +2 -2
  103. package/dist/chat/providers/slack/index.d.ts +2 -2
  104. package/dist/chat/providers/telegram/index.d.ts +2 -0
  105. package/dist/chat/providers/telegram/index.js +21 -2
  106. package/dist/chat/system-prompts.d.ts +3 -3
  107. package/dist/chat/system-prompts.js +116 -61
  108. package/dist/chat/tools.d.ts +6 -6
  109. package/dist/cli/commands/auth.js +64 -1
  110. package/dist/cli/commands/chat.js +1327 -138
  111. package/dist/cli/commands/doctor.js +222 -16
  112. package/dist/cli/commands/history.d.ts +3 -0
  113. package/dist/cli/commands/history.js +138 -0
  114. package/dist/cli/commands/import.d.ts +44 -0
  115. package/dist/cli/commands/import.js +526 -0
  116. package/dist/cli/commands/init.d.ts +13 -0
  117. package/dist/cli/commands/init.js +381 -0
  118. package/dist/cli/commands/models.js +39 -26
  119. package/dist/cli/commands/onboard.js +263 -98
  120. package/dist/cli/commands/plan.d.ts +13 -0
  121. package/dist/cli/commands/plan.js +184 -0
  122. package/dist/cli/commands/serve.d.ts +7 -0
  123. package/dist/cli/commands/serve.js +77 -18
  124. package/dist/cli/commands/setup.js +375 -91
  125. package/dist/cli/commands/status.js +54 -0
  126. package/dist/cli/commands/tools.js +13 -13
  127. package/dist/cli/commands/tui.js +26 -1
  128. package/dist/cli/index.js +19 -6
  129. package/dist/cli/ink/App.d.ts +13 -0
  130. package/dist/cli/ink/App.js +6 -0
  131. package/dist/cli/ink/ChatApp.d.ts +60 -0
  132. package/dist/cli/ink/ChatApp.js +325 -0
  133. package/dist/cli/ink/DashboardApp.d.ts +3 -0
  134. package/dist/cli/ink/DashboardApp.js +143 -0
  135. package/dist/cli/ink/components/AgentStatus.d.ts +17 -0
  136. package/dist/cli/ink/components/AgentStatus.js +33 -0
  137. package/dist/cli/ink/components/ChannelList.d.ts +17 -0
  138. package/dist/cli/ink/components/ChannelList.js +33 -0
  139. package/dist/cli/ink/components/ConnectionStatus.d.ts +19 -0
  140. package/dist/cli/ink/components/ConnectionStatus.js +50 -0
  141. package/dist/cli/ink/components/CostBar.d.ts +19 -0
  142. package/dist/cli/ink/components/CostBar.js +35 -0
  143. package/dist/cli/ink/components/HookStatus.d.ts +15 -0
  144. package/dist/cli/ink/components/HookStatus.js +7 -0
  145. package/dist/cli/ink/components/PermissionPrompt.d.ts +21 -0
  146. package/dist/cli/ink/components/PermissionPrompt.js +51 -0
  147. package/dist/cli/ink/components/PlanView.d.ts +23 -0
  148. package/dist/cli/ink/components/PlanView.js +26 -0
  149. package/dist/cli/ink/components/ProviderList.d.ts +16 -0
  150. package/dist/cli/ink/components/ProviderList.js +16 -0
  151. package/dist/cli/ink/components/SessionHeader.d.ts +15 -0
  152. package/dist/cli/ink/components/SessionHeader.js +15 -0
  153. package/dist/cli/ink/components/StreamingMessage.d.ts +20 -0
  154. package/dist/cli/ink/components/StreamingMessage.js +27 -0
  155. package/dist/cli/ink/components/SuggestionBar.d.ts +15 -0
  156. package/dist/cli/ink/components/SuggestionBar.js +28 -0
  157. package/dist/cli/ink/components/SystemHealth.d.ts +20 -0
  158. package/dist/cli/ink/components/SystemHealth.js +39 -0
  159. package/dist/cli/ink/components/TaskList.d.ts +17 -0
  160. package/dist/cli/ink/components/TaskList.js +59 -0
  161. package/dist/cli/ink/components/ToolCall.d.ts +17 -0
  162. package/dist/cli/ink/components/ToolCall.js +43 -0
  163. package/dist/cli/ink/index.d.ts +23 -0
  164. package/dist/cli/ink/index.js +15 -0
  165. package/dist/cli/ink/keybindings.d.ts +35 -0
  166. package/dist/cli/ink/keybindings.js +105 -0
  167. package/dist/cli/ink/markdown-renderer.d.ts +47 -0
  168. package/dist/cli/ink/markdown-renderer.js +380 -0
  169. package/dist/cli/ink/output-styles.d.ts +39 -0
  170. package/dist/cli/ink/output-styles.js +119 -0
  171. package/dist/cli/interactive/auto-serve.d.ts +38 -0
  172. package/dist/cli/interactive/auto-serve.js +209 -0
  173. package/dist/cli/interactive/index.d.ts +25 -0
  174. package/dist/cli/interactive/index.js +23 -0
  175. package/dist/cli/interactive/picker.d.ts +28 -0
  176. package/dist/cli/interactive/picker.js +153 -0
  177. package/dist/cli/interactive/renderer.d.ts +26 -0
  178. package/dist/cli/interactive/renderer.js +555 -0
  179. package/dist/cli/interactive/repl.d.ts +14 -0
  180. package/dist/cli/interactive/repl.js +1516 -0
  181. package/dist/cli/interactive/stream-client.d.ts +59 -0
  182. package/dist/cli/interactive/stream-client.js +506 -0
  183. package/dist/cli/interactive/types.d.ts +121 -0
  184. package/dist/cli/interactive/types.js +10 -0
  185. package/dist/cli/providers.d.ts +15 -0
  186. package/dist/cli/providers.js +41 -0
  187. package/dist/cli/utils/api.d.ts +9 -0
  188. package/dist/cli/utils/api.js +58 -2
  189. package/dist/core/deployment.js +2 -0
  190. package/dist/cron/natural-language.d.ts +54 -0
  191. package/dist/cron/natural-language.js +569 -0
  192. package/dist/cron/scheduler.d.ts +34 -4
  193. package/dist/cron/scheduler.js +141 -9
  194. package/dist/cron/templates.d.ts +1 -1
  195. package/dist/cron/templates.js +219 -0
  196. package/dist/feeds/feed-engine.d.ts +149 -0
  197. package/dist/feeds/feed-engine.js +600 -0
  198. package/dist/feeds/index.d.ts +9 -0
  199. package/dist/feeds/index.js +8 -0
  200. package/dist/gateway/router.js +6 -1
  201. package/dist/hooks/built-in/audit-log.d.ts +11 -0
  202. package/dist/hooks/built-in/audit-log.js +84 -0
  203. package/dist/hooks/built-in/cost-warning.d.ts +10 -0
  204. package/dist/hooks/built-in/cost-warning.js +59 -0
  205. package/dist/hooks/built-in/dangerous-tool.d.ts +32 -0
  206. package/dist/hooks/built-in/dangerous-tool.js +80 -0
  207. package/dist/hooks/built-in/index.d.ts +14 -0
  208. package/dist/hooks/built-in/index.js +20 -0
  209. package/dist/hooks/index.d.ts +3 -0
  210. package/dist/hooks/index.js +6 -0
  211. package/dist/hooks/loader.d.ts +17 -0
  212. package/dist/hooks/loader.js +142 -0
  213. package/dist/hooks/registry.d.ts +62 -0
  214. package/dist/hooks/registry.js +127 -0
  215. package/dist/integrations/web-search.js +6 -3
  216. package/dist/memory/index.d.ts +1 -0
  217. package/dist/memory/index.js +2 -0
  218. package/dist/memory/memory-service.js +14 -13
  219. package/dist/memory/observational.d.ts +62 -0
  220. package/dist/memory/observational.js +396 -0
  221. package/dist/middleware/content-filter.d.ts +22 -0
  222. package/dist/middleware/content-filter.js +69 -0
  223. package/dist/middleware/request-validator.d.ts +159 -0
  224. package/dist/middleware/request-validator.js +93 -0
  225. package/dist/plugins/sdk.d.ts +22 -0
  226. package/dist/plugins/sdk.js +17 -1
  227. package/dist/projects/types.d.ts +10 -10
  228. package/dist/providers/ai-sdk.d.ts +11 -0
  229. package/dist/providers/ai-sdk.js +97 -18
  230. package/dist/providers/core/models.js +67 -1
  231. package/dist/providers/core/types.d.ts +3 -0
  232. package/dist/providers/index.d.ts +1 -0
  233. package/dist/providers/index.js +1 -0
  234. package/dist/providers/smart-router.d.ts +118 -0
  235. package/dist/providers/smart-router.js +685 -0
  236. package/dist/providers/types.d.ts +16 -16
  237. package/dist/routes/agents.js +50 -0
  238. package/dist/routes/auth.js +8 -1
  239. package/dist/routes/channels.d.ts +12 -0
  240. package/dist/routes/channels.js +166 -0
  241. package/dist/routes/chat.js +259 -14
  242. package/dist/routes/costs.js +32 -0
  243. package/dist/routes/cron.js +80 -5
  244. package/dist/routes/feeds.d.ts +10 -0
  245. package/dist/routes/feeds.js +168 -0
  246. package/dist/routes/mcp.js +21 -0
  247. package/dist/routes/memory.js +130 -0
  248. package/dist/routes/skills.js +129 -0
  249. package/dist/routes/teams.d.ts +9 -0
  250. package/dist/routes/teams.js +210 -0
  251. package/dist/routes/tools.js +14 -0
  252. package/dist/routes/users.js +2 -0
  253. package/dist/server/route-loader.js +4 -1
  254. package/dist/server/stream-bridge.d.ts +19 -0
  255. package/dist/server/stream-bridge.js +38 -0
  256. package/dist/server.js +421 -141
  257. package/dist/skills/marketplace.d.ts +87 -0
  258. package/dist/skills/marketplace.js +268 -0
  259. package/dist/storage/index.d.ts +14 -0
  260. package/dist/storage/index.js +64 -3
  261. package/dist/storage/schema.d.ts +4 -4
  262. package/dist/storage/schema.js +1 -1
  263. package/dist/teams/index.d.ts +110 -0
  264. package/dist/teams/index.js +365 -0
  265. package/dist/tickets/types.d.ts +39 -39
  266. package/dist/types/summary.d.ts +5 -5
  267. package/dist/utils/auto-update.d.ts +23 -0
  268. package/dist/utils/auto-update.js +157 -0
  269. package/dist/utils/offline-detect.d.ts +55 -0
  270. package/dist/utils/offline-detect.js +121 -0
  271. package/dist/utils/pid-file.d.ts +36 -0
  272. package/dist/utils/pid-file.js +125 -0
  273. package/dist/utils/prevent-sleep.d.ts +27 -0
  274. package/dist/utils/prevent-sleep.js +95 -0
  275. package/dist/utils/sanitizer.d.ts +57 -0
  276. package/dist/utils/sanitizer.js +174 -0
  277. package/docker-compose.yml +13 -137
  278. package/package.json +31 -6
  279. package/skills/deploy-cloudflare/SKILL.md +62 -0
  280. package/skills/deploy-vercel/SKILL.md +67 -0
  281. package/skills/docker-deploy/SKILL.md +158 -0
  282. package/skills/full-stack-builder/SKILL.md +92 -0
  283. package/skills/git-workflow/SKILL.md +3 -3
  284. package/skills/humanizer/SKILL.md +488 -0
  285. package/skills/profclaw-assistant/SKILL.md +85 -56
  286. package/ui/dist/assets/ActivityView-Da6HQ8ws.js +1 -0
  287. package/ui/dist/assets/AgentList-H58R0kX3.js +1 -0
  288. package/ui/dist/assets/AnalyticsDashboard-B28AeRsc.js +1 -0
  289. package/ui/dist/assets/AreaChart-DwLzeAQ8.js +1 -0
  290. package/ui/dist/assets/CartesianChart-piKQsTAR.js +36 -0
  291. package/ui/dist/assets/ChatView-Dbj8rxU5.js +10 -0
  292. package/ui/dist/assets/CostsDashboard-C6F5df0F.js +1 -0
  293. package/ui/dist/assets/EstimateSelect-wga0rUKX.js +1 -0
  294. package/ui/dist/assets/FeedDashboard-Ef6FEzEf.js +1 -0
  295. package/ui/dist/assets/FloatingChatbot-0yhkUeCq.js +2 -0
  296. package/ui/dist/assets/InviteCodeManagement-tUXfx4Bc.js +2 -0
  297. package/ui/dist/assets/KaTeX_AMS-Regular-BQhdFMY1.woff2 +0 -0
  298. package/ui/dist/assets/KaTeX_AMS-Regular-DMm9YOAa.woff +0 -0
  299. package/ui/dist/assets/KaTeX_AMS-Regular-DRggAlZN.ttf +0 -0
  300. package/ui/dist/assets/KaTeX_Caligraphic-Bold-ATXxdsX0.ttf +0 -0
  301. package/ui/dist/assets/KaTeX_Caligraphic-Bold-BEiXGLvX.woff +0 -0
  302. package/ui/dist/assets/KaTeX_Caligraphic-Bold-Dq_IR9rO.woff2 +0 -0
  303. package/ui/dist/assets/KaTeX_Caligraphic-Regular-CTRA-rTL.woff +0 -0
  304. package/ui/dist/assets/KaTeX_Caligraphic-Regular-Di6jR-x-.woff2 +0 -0
  305. package/ui/dist/assets/KaTeX_Caligraphic-Regular-wX97UBjC.ttf +0 -0
  306. package/ui/dist/assets/KaTeX_Fraktur-Bold-BdnERNNW.ttf +0 -0
  307. package/ui/dist/assets/KaTeX_Fraktur-Bold-BsDP51OF.woff +0 -0
  308. package/ui/dist/assets/KaTeX_Fraktur-Bold-CL6g_b3V.woff2 +0 -0
  309. package/ui/dist/assets/KaTeX_Fraktur-Regular-CB_wures.ttf +0 -0
  310. package/ui/dist/assets/KaTeX_Fraktur-Regular-CTYiF6lA.woff2 +0 -0
  311. package/ui/dist/assets/KaTeX_Fraktur-Regular-Dxdc4cR9.woff +0 -0
  312. package/ui/dist/assets/KaTeX_Main-Bold-Cx986IdX.woff2 +0 -0
  313. package/ui/dist/assets/KaTeX_Main-Bold-Jm3AIy58.woff +0 -0
  314. package/ui/dist/assets/KaTeX_Main-Bold-waoOVXN0.ttf +0 -0
  315. package/ui/dist/assets/KaTeX_Main-BoldItalic-DxDJ3AOS.woff2 +0 -0
  316. package/ui/dist/assets/KaTeX_Main-BoldItalic-DzxPMmG6.ttf +0 -0
  317. package/ui/dist/assets/KaTeX_Main-BoldItalic-SpSLRI95.woff +0 -0
  318. package/ui/dist/assets/KaTeX_Main-Italic-3WenGoN9.ttf +0 -0
  319. package/ui/dist/assets/KaTeX_Main-Italic-BMLOBm91.woff +0 -0
  320. package/ui/dist/assets/KaTeX_Main-Italic-NWA7e6Wa.woff2 +0 -0
  321. package/ui/dist/assets/KaTeX_Main-Regular-B22Nviop.woff2 +0 -0
  322. package/ui/dist/assets/KaTeX_Main-Regular-Dr94JaBh.woff +0 -0
  323. package/ui/dist/assets/KaTeX_Main-Regular-ypZvNtVU.ttf +0 -0
  324. package/ui/dist/assets/KaTeX_Math-BoldItalic-B3XSjfu4.ttf +0 -0
  325. package/ui/dist/assets/KaTeX_Math-BoldItalic-CZnvNsCZ.woff2 +0 -0
  326. package/ui/dist/assets/KaTeX_Math-BoldItalic-iY-2wyZ7.woff +0 -0
  327. package/ui/dist/assets/KaTeX_Math-Italic-DA0__PXp.woff +0 -0
  328. package/ui/dist/assets/KaTeX_Math-Italic-flOr_0UB.ttf +0 -0
  329. package/ui/dist/assets/KaTeX_Math-Italic-t53AETM-.woff2 +0 -0
  330. package/ui/dist/assets/KaTeX_SansSerif-Bold-CFMepnvq.ttf +0 -0
  331. package/ui/dist/assets/KaTeX_SansSerif-Bold-D1sUS0GD.woff2 +0 -0
  332. package/ui/dist/assets/KaTeX_SansSerif-Bold-DbIhKOiC.woff +0 -0
  333. package/ui/dist/assets/KaTeX_SansSerif-Italic-C3H0VqGB.woff2 +0 -0
  334. package/ui/dist/assets/KaTeX_SansSerif-Italic-DN2j7dab.woff +0 -0
  335. package/ui/dist/assets/KaTeX_SansSerif-Italic-YYjJ1zSn.ttf +0 -0
  336. package/ui/dist/assets/KaTeX_SansSerif-Regular-BNo7hRIc.ttf +0 -0
  337. package/ui/dist/assets/KaTeX_SansSerif-Regular-CS6fqUqJ.woff +0 -0
  338. package/ui/dist/assets/KaTeX_SansSerif-Regular-DDBCnlJ7.woff2 +0 -0
  339. package/ui/dist/assets/KaTeX_Script-Regular-C5JkGWo-.ttf +0 -0
  340. package/ui/dist/assets/KaTeX_Script-Regular-D3wIWfF6.woff2 +0 -0
  341. package/ui/dist/assets/KaTeX_Script-Regular-D5yQViql.woff +0 -0
  342. package/ui/dist/assets/KaTeX_Size1-Regular-C195tn64.woff +0 -0
  343. package/ui/dist/assets/KaTeX_Size1-Regular-Dbsnue_I.ttf +0 -0
  344. package/ui/dist/assets/KaTeX_Size1-Regular-mCD8mA8B.woff2 +0 -0
  345. package/ui/dist/assets/KaTeX_Size2-Regular-B7gKUWhC.ttf +0 -0
  346. package/ui/dist/assets/KaTeX_Size2-Regular-Dy4dx90m.woff2 +0 -0
  347. package/ui/dist/assets/KaTeX_Size2-Regular-oD1tc_U0.woff +0 -0
  348. package/ui/dist/assets/KaTeX_Size3-Regular-CTq5MqoE.woff +0 -0
  349. package/ui/dist/assets/KaTeX_Size3-Regular-DgpXs0kz.ttf +0 -0
  350. package/ui/dist/assets/KaTeX_Size4-Regular-BF-4gkZK.woff +0 -0
  351. package/ui/dist/assets/KaTeX_Size4-Regular-DWFBv043.ttf +0 -0
  352. package/ui/dist/assets/KaTeX_Size4-Regular-Dl5lxZxV.woff2 +0 -0
  353. package/ui/dist/assets/KaTeX_Typewriter-Regular-C0xS9mPB.woff +0 -0
  354. package/ui/dist/assets/KaTeX_Typewriter-Regular-CO6r4hn1.woff2 +0 -0
  355. package/ui/dist/assets/KaTeX_Typewriter-Regular-D3Ib7_Hf.ttf +0 -0
  356. package/ui/dist/assets/MarketplacePage-DGrLtolR.js +1 -0
  357. package/ui/dist/assets/{ProjectDetail-DlYUcOss.js → ProjectDetail-BgWvA6UP.js} +2 -2
  358. package/ui/dist/assets/ProjectIcon-TDuliqwg.js +1 -0
  359. package/ui/dist/assets/ProjectList-DXgM4187.js +1 -0
  360. package/ui/dist/assets/{Settings-CgPqzUvj.js → Settings-xA8Zhi3p.js} +3 -3
  361. package/ui/dist/assets/StatusIndicator-B8vfFAxg.js +1 -0
  362. package/ui/dist/assets/{SummaryDetail-CwLAfHgJ.js → SummaryDetail-eedRfTtF.js} +2 -2
  363. package/ui/dist/assets/SummaryList-CLNX2P84.js +1 -0
  364. package/ui/dist/assets/TaskDetail-BtWclNiR.js +1 -0
  365. package/ui/dist/assets/TaskList-JjODAgSc.js +1 -0
  366. package/ui/dist/assets/TeamsPage-CBK5iAyx.js +1 -0
  367. package/ui/dist/assets/TicketBoard-C9aJNNYp.js +1 -0
  368. package/ui/dist/assets/TicketDetail-CV5JmL31.js +1 -0
  369. package/ui/dist/assets/TicketList-68V4lzUz.js +1 -0
  370. package/ui/dist/assets/UserManagement-DKTb6UpE.js +2 -0
  371. package/ui/dist/assets/ViewSwitcher-BvdQht2Y.js +1 -0
  372. package/ui/dist/assets/alert-dialog-O6qBOv_f.js +1 -0
  373. package/ui/dist/assets/{archive-CGck7gxR.js → archive-CX7UvZpf.js} +1 -1
  374. package/ui/dist/assets/badge-BbfnwDJP.js +1 -0
  375. package/ui/dist/assets/{bug-DqSGPUUE.js → bug-3WX0394-.js} +1 -1
  376. package/ui/dist/assets/{calendar-BuZ4zbPW.js → calendar-buq77TaS.js} +1 -1
  377. package/ui/dist/assets/{chevron-up-DcJ4LL_N.js → chevron-up-4ymsBJRo.js} +1 -1
  378. package/ui/dist/assets/{circle-x-C78PNZjF.js → circle-x-ByXtwR6Y.js} +1 -1
  379. package/ui/dist/assets/constants-CVdDh7p0.js +1 -0
  380. package/ui/dist/assets/{cpu-Ck6AoG8c.js → cpu-CiuoCeDY.js} +1 -1
  381. package/ui/dist/assets/{database-CA2w8Lvt.js → database-BWXSBg5a.js} +1 -1
  382. package/ui/dist/assets/dialog-lDg4NvMV.js +1 -0
  383. package/ui/dist/assets/dollar-sign-Dmijd6DP.js +1 -0
  384. package/ui/dist/assets/{ellipsis-FhHKRbfl.js → ellipsis-vT-5SVIp.js} +1 -1
  385. package/ui/dist/assets/{ellipsis-vertical-CO0UqE4-.js → ellipsis-vertical-B4tAX_bL.js} +1 -1
  386. package/ui/dist/assets/feature-markdown-DBo5Q7uq.js +289 -0
  387. package/ui/dist/assets/{file-code-ChnhYYj1.js → file-code-ChOWdKXf.js} +1 -1
  388. package/ui/dist/assets/{folder-open-CHwA1-ve.js → folder-open-CkOUbIiP.js} +1 -1
  389. package/ui/dist/assets/{funnel-ByEjRFNB.js → funnel-uZkoSPP-.js} +1 -1
  390. package/ui/dist/assets/{git-branch-GTOPQgU4.js → git-branch-CwvUxj7C.js} +1 -1
  391. package/ui/dist/assets/{git-commit-horizontal-F5M84Kut.js → git-commit-horizontal-lxPzCvhD.js} +1 -1
  392. package/ui/dist/assets/{globe-CQWfr7hT.js → globe-D_WpJdsj.js} +1 -1
  393. package/ui/dist/assets/{hash-nKC9gtLg.js → hash-CA0hJ7vh.js} +1 -1
  394. package/ui/dist/assets/{history-DfFSA9xJ.js → history-CEWMLELs.js} +1 -1
  395. package/ui/dist/assets/inbox-ehtOptTV.js +1 -0
  396. package/ui/dist/assets/{index-a4Fxq0Hb.js → index-C1rhbml4.js} +3 -3
  397. package/ui/dist/assets/index-CR8gfCHv.js +1 -0
  398. package/ui/dist/assets/index-DVXMpWai.js +1 -0
  399. package/ui/dist/assets/index-DaDJMM2v.js +1 -0
  400. package/ui/dist/assets/index-Djdq_0xu.js +1 -0
  401. package/ui/dist/assets/index-M46Gcb8K.css +1 -0
  402. package/ui/dist/assets/index-sEBN7w8J.js +109 -0
  403. package/ui/dist/assets/layers-C6Mhf8Nk.js +1 -0
  404. package/ui/dist/assets/{layout-dashboard-WmgjMhWF.js → layout-dashboard-BRUM0kpT.js} +1 -1
  405. package/ui/dist/assets/{lightbulb-Bo8hEr7B.js → lightbulb-CN2q1O5l.js} +1 -1
  406. package/ui/dist/assets/{link-2-YqrpQXBH.js → link-2-CC4E28yJ.js} +1 -1
  407. package/ui/dist/assets/markdown-renderer-C6ENbB0u.js +10 -0
  408. package/ui/dist/assets/markdown-renderer-CfVKi3_s.css +1 -0
  409. package/ui/dist/assets/{message-square-CD0H5hot.js → message-square-Bbb241am.js} +1 -1
  410. package/ui/dist/assets/package-CwT3IzFx.js +1 -0
  411. package/ui/dist/assets/{pencil-DpFnj5dn.js → pencil-CDmiHzoj.js} +1 -1
  412. package/ui/dist/assets/{play-DVgea_jT.js → play-tjy5jMQX.js} +1 -1
  413. package/ui/dist/assets/popover-CFHZf3pE.js +1 -0
  414. package/ui/dist/assets/progress-BboUHuLf.js +1 -0
  415. package/ui/dist/assets/{rocket-BFxPYGx9.js → rocket--8ZHgdXJ.js} +1 -1
  416. package/ui/dist/assets/select-n108rXny.js +1 -0
  417. package/ui/dist/assets/{send-eYnW_7n-.js → send-Cu7MR2Qh.js} +1 -1
  418. package/ui/dist/assets/server-DmodxZp-.js +1 -0
  419. package/ui/dist/assets/{settings-2-scXUOuE_.js → settings-2-CkRNqkxj.js} +1 -1
  420. package/ui/dist/assets/sheet-7aUJkyzU.js +1 -0
  421. package/ui/dist/assets/{shield-check-PEr7nmVw.js → shield-check-ViI3nMKE.js} +1 -1
  422. package/ui/dist/assets/{shield-off-CLtXio62.js → shield-off-DN3tagkn.js} +1 -1
  423. package/ui/dist/assets/skeleton-C0E1Nfro.js +1 -0
  424. package/ui/dist/assets/{smartphone-DusFfY0U.js → smartphone-5FghiXpA.js} +1 -1
  425. package/ui/dist/assets/{square-e1yxB2eR.js → square-DiNSx8K7.js} +1 -1
  426. package/ui/dist/assets/star-DhdFVidS.js +1 -0
  427. package/ui/dist/assets/switch-CIgVbZqQ.js +1 -0
  428. package/ui/dist/assets/table-BC56FVMV.js +1 -0
  429. package/ui/dist/assets/{tag-tAwMmQ9G.js → tag-CH_vQliw.js} +1 -1
  430. package/ui/dist/assets/textarea-CxDiKFXZ.js +1 -0
  431. package/ui/dist/assets/{timer-Vel1N3RP.js → timer-CdGVTb60.js} +1 -1
  432. package/ui/dist/assets/tooltip-BuW9A5UO.js +1 -0
  433. package/ui/dist/assets/{trash-2-eM-CNwsZ.js → trash-2-CucZJL0N.js} +1 -1
  434. package/ui/dist/assets/trending-down-BCezC1z2.js +1 -0
  435. package/ui/dist/assets/{trending-up-BGafmjRo.js → trending-up-C5OYX2k2.js} +1 -1
  436. package/ui/dist/assets/vendor-query-C0p7b53x.js +4 -0
  437. package/ui/dist/assets/vendor-react-Mc5_kfYG.js +12 -0
  438. package/ui/dist/assets/vendor-ui-CXPAUBFv.js +51 -0
  439. package/ui/dist/assets/{wand-sparkles-DPvcd9Pi.js → wand-sparkles-BaH6pJnc.js} +1 -1
  440. package/ui/dist/assets/{wrench-B8s3zYVV.js → wrench-CjxjP6ok.js} +1 -1
  441. package/ui/dist/index.html +5 -2
  442. package/dist/chat/auto-reply.d.ts +0 -90
  443. package/dist/chat/auto-reply.js +0 -272
  444. package/dist/chat/execution/pty.d.ts +0 -92
  445. package/dist/chat/execution/pty.js +0 -285
  446. package/dist/chat/execution/tools/glinr-ops.d.ts +0 -202
  447. package/dist/chat/execution/tools/glinr-ops.js +0 -694
  448. package/dist/cli/commands/browser.d.ts +0 -3
  449. package/dist/cli/commands/browser.js +0 -138
  450. package/dist/cli/commands/canvas.d.ts +0 -3
  451. package/dist/cli/commands/canvas.js +0 -155
  452. package/dist/cli/commands/nodes.d.ts +0 -3
  453. package/dist/cli/commands/nodes.js +0 -193
  454. package/dist/diagnostics/exporters.d.ts +0 -21
  455. package/dist/diagnostics/exporters.js +0 -138
  456. package/dist/diagnostics/index.d.ts +0 -10
  457. package/dist/diagnostics/index.js +0 -9
  458. package/dist/diagnostics/middleware.d.ts +0 -12
  459. package/dist/diagnostics/middleware.js +0 -58
  460. package/dist/diagnostics/tracer.d.ts +0 -133
  461. package/dist/diagnostics/tracer.js +0 -257
  462. package/dist/discovery/index.d.ts +0 -8
  463. package/dist/discovery/index.js +0 -7
  464. package/dist/discovery/mdns.d.ts +0 -40
  465. package/dist/discovery/mdns.js +0 -249
  466. package/dist/plugins/registry.d.ts +0 -122
  467. package/dist/plugins/registry.js +0 -352
  468. package/dist/plugins/sandbox.d.ts +0 -77
  469. package/dist/plugins/sandbox.js +0 -287
  470. package/dist/plugins/search/brave.d.ts +0 -9
  471. package/dist/plugins/search/brave.js +0 -157
  472. package/dist/plugins/search/duckduckgo.d.ts +0 -9
  473. package/dist/plugins/search/duckduckgo.js +0 -171
  474. package/dist/plugins/search/index.d.ts +0 -13
  475. package/dist/plugins/search/index.js +0 -23
  476. package/dist/plugins/search/searxng.d.ts +0 -9
  477. package/dist/plugins/search/searxng.js +0 -170
  478. package/dist/plugins/search/serper.d.ts +0 -9
  479. package/dist/plugins/search/serper.js +0 -135
  480. package/dist/plugins/search/tavily.d.ts +0 -9
  481. package/dist/plugins/search/tavily.js +0 -146
  482. package/dist/providers/adapters/anthropic.d.ts +0 -26
  483. package/dist/providers/adapters/anthropic.js +0 -306
  484. package/dist/providers/adapters/base.d.ts +0 -53
  485. package/dist/providers/adapters/base.js +0 -99
  486. package/dist/providers/adapters/ollama.d.ts +0 -30
  487. package/dist/providers/adapters/ollama.js +0 -292
  488. package/dist/utils/ai-cache.d.ts +0 -72
  489. package/dist/utils/ai-cache.js +0 -204
  490. package/dist/utils/file-lock.d.ts +0 -85
  491. package/dist/utils/file-lock.js +0 -204
  492. package/ui/dist/assets/ActivityView-DIPQSJ_d.js +0 -1
  493. package/ui/dist/assets/AgentList-CqyaYrcq.js +0 -1
  494. package/ui/dist/assets/AnalyticsDashboard-C-mjuGHT.js +0 -1
  495. package/ui/dist/assets/AreaChart-CfYWmbtr.js +0 -1
  496. package/ui/dist/assets/CartesianChart-BaQ3It0c.js +0 -36
  497. package/ui/dist/assets/ChatView-DxxQy6pl.js +0 -10
  498. package/ui/dist/assets/CostsDashboard-CDBBcGkg.js +0 -1
  499. package/ui/dist/assets/EstimateSelect-CDjf5qKl.js +0 -1
  500. package/ui/dist/assets/FloatingChatbot-CZHjvJIe.js +0 -2
  501. package/ui/dist/assets/InviteCodeManagement-DTm-IPTm.js +0 -2
  502. package/ui/dist/assets/ProjectIcon-BMRpnM04.js +0 -1
  503. package/ui/dist/assets/ProjectList-D85TN0i0.js +0 -4
  504. package/ui/dist/assets/StatusIndicator-yig0uZEA.js +0 -1
  505. package/ui/dist/assets/SummaryList-BvS5Idnu.js +0 -1
  506. package/ui/dist/assets/TaskDetail-zarC1fOt.js +0 -1
  507. package/ui/dist/assets/TaskList-CyJq3ANE.js +0 -1
  508. package/ui/dist/assets/TicketBoard-BlWr3-iH.js +0 -1
  509. package/ui/dist/assets/TicketDetail-DmqWKj2W.js +0 -1
  510. package/ui/dist/assets/TicketList-Scj4pMWa.js +0 -1
  511. package/ui/dist/assets/UserManagement-BH7uG7dw.js +0 -2
  512. package/ui/dist/assets/ViewSwitcher-3HzZUdWn.js +0 -1
  513. package/ui/dist/assets/alert-dialog-DWPb2IfQ.js +0 -7
  514. package/ui/dist/assets/badge-DEmc3Z_l.js +0 -1
  515. package/ui/dist/assets/brain-CfFdLVqb.js +0 -1
  516. package/ui/dist/assets/constants-DhDjZe4P.js +0 -1
  517. package/ui/dist/assets/dialog-BOdGWhgE.js +0 -1
  518. package/ui/dist/assets/index--JkIxVXb.js +0 -67
  519. package/ui/dist/assets/index-Ca3vk7Gq.js +0 -1
  520. package/ui/dist/assets/index-DHGvP9mp.js +0 -1
  521. package/ui/dist/assets/index-DeI8lKRR.js +0 -1
  522. package/ui/dist/assets/index-WclMPci1.css +0 -1
  523. package/ui/dist/assets/index-Z4-RtZcs.js +0 -1
  524. package/ui/dist/assets/layers-DFeLExSa.js +0 -1
  525. package/ui/dist/assets/markdown-renderer-Croje6Xe.js +0 -36
  526. package/ui/dist/assets/popover-JXecfWG5.js +0 -1
  527. package/ui/dist/assets/progress-C1ghf1Fu.js +0 -1
  528. package/ui/dist/assets/select-MADP8m6Q.js +0 -1
  529. package/ui/dist/assets/server-CPMaysH8.js +0 -1
  530. package/ui/dist/assets/sheet-r6NSOxi-.js +0 -1
  531. package/ui/dist/assets/skeleton-C9oEzNlU.js +0 -1
  532. package/ui/dist/assets/switch-tNs0n-kz.js +0 -1
  533. package/ui/dist/assets/table-CXxtLicg.js +0 -1
  534. package/ui/dist/assets/textarea-BjiEeIWh.js +0 -1
  535. package/ui/dist/assets/tooltip-ZMwtfr1J.js +0 -1
@@ -1,694 +0,0 @@
1
- /**
2
- * GLINR Operations Tools
3
- *
4
- * Ticket, project, and sprint management through AI chat.
5
- * These tools allow the AI to create and manage GLINR's own data.
6
- */
7
- import { z } from 'zod';
8
- import { randomUUID } from 'node:crypto';
9
- import { getDb } from '../../../storage/index.js';
10
- import { projects, tickets } from '../../../storage/schema.js';
11
- import { eq, sql, desc, and, like, or } from 'drizzle-orm';
12
- import { logger } from '../../../utils/logger.js';
13
- // =============================================================================
14
- // Availability Check
15
- // =============================================================================
16
- /** Cache database availability to avoid repeated checks */
17
- let dbAvailabilityCache = null;
18
- let lastDbCheck = 0;
19
- const DB_CHECK_INTERVAL_MS = 30000; // Recheck every 30 seconds
20
- /**
21
- * Check if database is available
22
- * Rechecks periodically in case database becomes available after startup
23
- */
24
- function checkDatabaseAvailability() {
25
- const now = Date.now();
26
- // Use cache if recent and was available
27
- if (dbAvailabilityCache && dbAvailabilityCache.available && now - lastDbCheck < DB_CHECK_INTERVAL_MS) {
28
- return dbAvailabilityCache;
29
- }
30
- try {
31
- // This will throw if storage is not initialized
32
- getDb();
33
- dbAvailabilityCache = { available: true };
34
- lastDbCheck = now;
35
- }
36
- catch (error) {
37
- dbAvailabilityCache = {
38
- available: false,
39
- reason: 'Database not initialized',
40
- };
41
- lastDbCheck = now;
42
- }
43
- return dbAvailabilityCache;
44
- }
45
- // =============================================================================
46
- // Schemas
47
- // =============================================================================
48
- const CreateTicketParamsSchema = z.object({
49
- projectKey: z.string().describe('Project key (e.g., "GLINR")'),
50
- title: z.string().min(1).describe('Ticket title'),
51
- description: z.string().optional().describe('Detailed description'),
52
- type: z.enum(['task', 'bug', 'story', 'epic', 'subtask', 'feature', 'improvement']).default('task'),
53
- priority: z.enum(['critical', 'high', 'medium', 'low', 'none']).default('medium'),
54
- labels: z.array(z.string()).optional().describe('Labels/tags'),
55
- storyPoints: z.number().optional().describe('Story points estimate'),
56
- });
57
- const CreateProjectParamsSchema = z.object({
58
- name: z.string().min(1).describe('Project name'),
59
- key: z.string().min(2).max(10).describe('Project key prefix (e.g., "GLINR")'),
60
- description: z.string().optional().describe('Project description'),
61
- icon: z.string().optional().describe('Emoji icon (e.g., "🚀")'),
62
- color: z.string().optional().describe('Hex color (e.g., "#6366f1")'),
63
- });
64
- const ListTicketsParamsSchema = z.object({
65
- projectKey: z.string().optional().describe('Filter by project'),
66
- status: z.string().optional().describe('Filter by status'),
67
- type: z.string().optional().describe('Filter by type'),
68
- priority: z.string().optional().describe('Filter by priority'),
69
- search: z.string().optional().describe('Search in title/description'),
70
- limit: z.number().default(20).describe('Max results'),
71
- });
72
- const ListProjectsParamsSchema = z.object({
73
- status: z.enum(['active', 'archived', 'all']).default('active'),
74
- });
75
- const UpdateTicketParamsSchema = z.object({
76
- ticketKey: z.string().describe('Ticket key (e.g., "GLINR-123")'),
77
- title: z.string().optional().describe('New title'),
78
- description: z.string().optional().describe('New description'),
79
- status: z.enum(['backlog', 'todo', 'in_progress', 'in_review', 'done', 'cancelled']).optional(),
80
- priority: z.enum(['critical', 'high', 'medium', 'low', 'none']).optional(),
81
- type: z.enum(['task', 'bug', 'story', 'epic', 'subtask', 'feature', 'improvement']).optional(),
82
- labels: z.array(z.string()).optional(),
83
- storyPoints: z.number().optional(),
84
- });
85
- const GetTicketParamsSchema = z.object({
86
- ticketKey: z.string().describe('Ticket key (e.g., "GLINR-123")'),
87
- });
88
- const AddCommentParamsSchema = z.object({
89
- ticketKey: z.string().describe('Ticket key (e.g., "GLINR-123")'),
90
- content: z.string().min(1).describe('Comment content (supports markdown)'),
91
- });
92
- const MoveTicketParamsSchema = z.object({
93
- ticketKey: z.string().describe('Ticket key (e.g., "GLINR-123")'),
94
- targetProjectKey: z.string().describe('Target project key (e.g., "MOBILE")'),
95
- });
96
- const AssignTicketParamsSchema = z.object({
97
- ticketKey: z.string().describe('Ticket key (e.g., "GLINR-123")'),
98
- assignee: z.string().optional().describe('Human assignee name or email'),
99
- assigneeAgent: z.enum(['claude', 'openclaw', 'ollama', 'gemini']).optional().describe('AI agent to assign'),
100
- unassign: z.boolean().optional().describe('Set to true to remove assignment'),
101
- });
102
- // =============================================================================
103
- // Helper Functions
104
- // =============================================================================
105
- async function getProjectByKey(key) {
106
- const client = getDb();
107
- const result = await client.select().from(projects).where(eq(projects.key, key.toUpperCase())).limit(1);
108
- return result[0] || null;
109
- }
110
- async function getNextTicketSequence(projectId) {
111
- const client = getDb();
112
- const result = await client
113
- .select({ maxNum: sql `COALESCE(MAX(${tickets.sequence}), 0)` })
114
- .from(tickets)
115
- .where(eq(tickets.projectId, projectId));
116
- return (result[0]?.maxNum || 0) + 1;
117
- }
118
- async function getTicketByKey(ticketKey) {
119
- const client = getDb();
120
- const [projectKey, numStr] = ticketKey.split('-');
121
- const sequence = parseInt(numStr, 10);
122
- if (!projectKey || isNaN(sequence)) {
123
- return null;
124
- }
125
- const project = await getProjectByKey(projectKey);
126
- if (!project)
127
- return null;
128
- const result = await client
129
- .select()
130
- .from(tickets)
131
- .where(and(eq(tickets.projectId, project.id), eq(tickets.sequence, sequence)))
132
- .limit(1);
133
- return result[0] ? { ...result[0], projectKey: project.key } : null;
134
- }
135
- /**
136
- * Safely format a date value to ISO string
137
- * Handles Date objects, timestamps, and invalid values
138
- */
139
- function formatDateSafe(value) {
140
- if (!value)
141
- return new Date().toISOString();
142
- // If it's already a valid Date
143
- if (value instanceof Date && !isNaN(value.getTime())) {
144
- return value.toISOString();
145
- }
146
- // If it's a number (Unix timestamp in seconds or ms)
147
- if (typeof value === 'number') {
148
- // Detect if it's seconds or milliseconds
149
- const ms = value > 1e12 ? value : value * 1000;
150
- const date = new Date(ms);
151
- if (!isNaN(date.getTime())) {
152
- return date.toISOString();
153
- }
154
- }
155
- // If it's a string, try to parse it
156
- if (typeof value === 'string') {
157
- const date = new Date(value);
158
- if (!isNaN(date.getTime())) {
159
- return date.toISOString();
160
- }
161
- }
162
- // Fallback to now
163
- return new Date().toISOString();
164
- }
165
- // =============================================================================
166
- // Create Ticket Tool
167
- // =============================================================================
168
- export const createTicketTool = {
169
- name: 'create_ticket',
170
- description: `Create a new ticket/task/bug in GLINR. Use AFTER list_projects to get a valid projectKey.
171
-
172
- IMPORTANT: You MUST call this tool after list_projects when the user asks to create a ticket/task/bug.
173
- Required params: projectKey (from list_projects), title (from user request)
174
- Optional: type (bug/feature/task), priority, description
175
-
176
- The response includes a 'url' field - use this to create a clickable markdown link in your summary:
177
- Example: "Created ticket [GLINR-42](/tickets/abc123)"
178
-
179
- DO NOT just list projects and stop - you must CREATE the ticket to complete the user's request.`,
180
- category: 'glinr',
181
- securityLevel: 'safe',
182
- allowedHosts: ['sandbox', 'gateway', 'local'],
183
- parameters: CreateTicketParamsSchema,
184
- isAvailable: checkDatabaseAvailability,
185
- examples: [
186
- {
187
- description: 'Create a bug ticket',
188
- params: { projectKey: 'GLINR', title: 'Fix login button', type: 'bug', priority: 'high' },
189
- },
190
- {
191
- description: 'Create a feature with description',
192
- params: {
193
- projectKey: 'GLINR',
194
- title: 'Add dark mode',
195
- description: 'Implement dark mode toggle in settings',
196
- type: 'feature',
197
- },
198
- },
199
- ],
200
- async execute(_context, params) {
201
- try {
202
- const client = getDb();
203
- // Get project
204
- const project = await getProjectByKey(params.projectKey);
205
- if (!project) {
206
- return {
207
- success: false,
208
- error: {
209
- code: 'PROJECT_NOT_FOUND',
210
- message: `Project "${params.projectKey}" not found. Use list_projects to see available projects.`,
211
- },
212
- };
213
- }
214
- // Get next ticket sequence
215
- const sequence = await getNextTicketSequence(project.id);
216
- const ticketKey = `${project.key}-${sequence}`;
217
- const id = randomUUID();
218
- const now = new Date();
219
- // Insert ticket - mark as AI-created
220
- await client.insert(tickets).values({
221
- id,
222
- projectId: project.id,
223
- sequence,
224
- title: params.title,
225
- description: params.description || '',
226
- status: 'backlog',
227
- type: params.type,
228
- priority: params.priority,
229
- labels: params.labels || [],
230
- estimate: params.storyPoints || null,
231
- createdBy: 'ai', // Flag as AI-created
232
- aiAgent: 'glinr-chat', // Track which AI created it
233
- createdAt: now,
234
- updatedAt: now,
235
- });
236
- logger.info(`[GLINR] Created ticket ${ticketKey}: ${params.title}`);
237
- const data = {
238
- id,
239
- key: ticketKey,
240
- title: params.title,
241
- description: params.description,
242
- status: 'backlog',
243
- type: params.type,
244
- priority: params.priority,
245
- labels: params.labels,
246
- storyPoints: params.storyPoints,
247
- projectKey: project.key,
248
- createdAt: now.toISOString(),
249
- url: `/tickets/${id}`,
250
- };
251
- const labelsLine = params.labels?.length ? `\n- Labels: ${params.labels.join(', ')}` : '';
252
- const output = `## Ticket Created\n**${ticketKey}** — ${params.title}\n- Type: ${params.type}\n- Priority: ${params.priority}\n- Status: backlog${labelsLine}`;
253
- return { success: true, data, output };
254
- }
255
- catch (error) {
256
- logger.error('[GLINR] Create ticket error:', error instanceof Error ? error : undefined);
257
- return {
258
- success: false,
259
- error: {
260
- code: 'CREATE_FAILED',
261
- message: error instanceof Error ? error.message : 'Failed to create ticket',
262
- },
263
- };
264
- }
265
- },
266
- };
267
- // =============================================================================
268
- // Create Project Tool
269
- // =============================================================================
270
- export const createProjectTool = {
271
- name: 'create_project',
272
- description: `Create a new project in GLINR. Projects organize tickets under a unique key.`,
273
- category: 'glinr',
274
- securityLevel: 'safe',
275
- allowedHosts: ['sandbox', 'gateway', 'local'],
276
- parameters: CreateProjectParamsSchema,
277
- isAvailable: checkDatabaseAvailability,
278
- examples: [
279
- {
280
- description: 'Create a project',
281
- params: { name: 'Mobile App', key: 'MOBILE', icon: '📱' },
282
- },
283
- ],
284
- async execute(_context, params) {
285
- try {
286
- const client = getDb();
287
- const key = params.key.toUpperCase();
288
- // Check if key exists
289
- const existing = await getProjectByKey(key);
290
- if (existing) {
291
- return {
292
- success: false,
293
- error: {
294
- code: 'KEY_EXISTS',
295
- message: `Project key "${key}" already exists`,
296
- },
297
- };
298
- }
299
- const id = randomUUID();
300
- const now = new Date();
301
- // Get next project sequence
302
- const maxSeq = await client.select({ max: sql `COALESCE(MAX(sequence), 0)` }).from(projects);
303
- const sequence = (maxSeq[0]?.max || 0) + 1;
304
- await client.insert(projects).values({
305
- id,
306
- sequence,
307
- name: params.name,
308
- key,
309
- description: params.description || null,
310
- icon: params.icon || '📁',
311
- color: params.color || '#6366f1',
312
- status: 'active',
313
- createdAt: now,
314
- updatedAt: now,
315
- });
316
- logger.info(`[GLINR] Created project ${key}: ${params.name}`);
317
- const data = {
318
- id,
319
- name: params.name,
320
- key,
321
- description: params.description,
322
- icon: params.icon || '📁',
323
- color: params.color || '#6366f1',
324
- status: 'active',
325
- };
326
- const output = `## Project Created\n**${params.name}** (${key})${params.description ? `\n${params.description}` : ''}`;
327
- return { success: true, data, output };
328
- }
329
- catch (error) {
330
- logger.error('[GLINR] Create project error:', error instanceof Error ? error : undefined);
331
- return {
332
- success: false,
333
- error: {
334
- code: 'CREATE_FAILED',
335
- message: error instanceof Error ? error.message : 'Failed to create project',
336
- },
337
- };
338
- }
339
- },
340
- };
341
- // =============================================================================
342
- // List Tickets Tool
343
- // =============================================================================
344
- export const listTicketsTool = {
345
- name: 'list_tickets',
346
- description: `List and search tickets in GLINR. Can filter by project, status, type, priority, or search text.`,
347
- category: 'glinr',
348
- securityLevel: 'safe',
349
- allowedHosts: ['sandbox', 'gateway', 'local'],
350
- parameters: ListTicketsParamsSchema,
351
- isAvailable: checkDatabaseAvailability,
352
- examples: [
353
- { description: 'List all tickets', params: {} },
354
- { description: 'List bugs in a project', params: { projectKey: 'GLINR', type: 'bug' } },
355
- { description: 'Search tickets', params: { search: 'login' } },
356
- ],
357
- async execute(_context, params) {
358
- try {
359
- const client = getDb();
360
- // Build conditions
361
- const conditions = [];
362
- if (params.projectKey) {
363
- const project = await getProjectByKey(params.projectKey);
364
- if (project) {
365
- conditions.push(eq(tickets.projectId, project.id));
366
- }
367
- }
368
- if (params.status) {
369
- conditions.push(eq(tickets.status, params.status));
370
- }
371
- if (params.type) {
372
- conditions.push(eq(tickets.type, params.type));
373
- }
374
- if (params.priority) {
375
- conditions.push(eq(tickets.priority, params.priority));
376
- }
377
- if (params.search) {
378
- conditions.push(or(like(tickets.title, `%${params.search}%`), like(tickets.description, `%${params.search}%`)));
379
- }
380
- // Execute query
381
- const whereClause = conditions.length > 0 ? and(...conditions) : undefined;
382
- const results = await client
383
- .select({
384
- id: tickets.id,
385
- projectId: tickets.projectId,
386
- sequence: tickets.sequence,
387
- title: tickets.title,
388
- description: tickets.description,
389
- status: tickets.status,
390
- type: tickets.type,
391
- priority: tickets.priority,
392
- labels: tickets.labels,
393
- estimate: tickets.estimate,
394
- createdAt: tickets.createdAt,
395
- })
396
- .from(tickets)
397
- .where(whereClause)
398
- .orderBy(desc(tickets.createdAt))
399
- .limit(params.limit);
400
- // Get project keys for each ticket
401
- const projectIdSet = new Set();
402
- for (const t of results) {
403
- if (t.projectId)
404
- projectIdSet.add(t.projectId);
405
- }
406
- const projectMap = new Map();
407
- for (const projectId of projectIdSet) {
408
- const project = await client.select().from(projects).where(eq(projects.id, projectId)).limit(1);
409
- if (project[0]) {
410
- projectMap.set(projectId, project[0].key);
411
- }
412
- }
413
- const ticketResults = results.map((t) => ({
414
- id: t.id,
415
- key: `${projectMap.get(t.projectId || '') || 'UNK'}-${t.sequence}`,
416
- title: t.title,
417
- description: t.description || undefined,
418
- status: t.status,
419
- type: t.type,
420
- priority: t.priority,
421
- labels: t.labels || undefined,
422
- storyPoints: t.estimate || undefined,
423
- projectKey: projectMap.get(t.projectId || '') || 'UNK',
424
- createdAt: formatDateSafe(t.createdAt),
425
- url: `/tickets/${t.id}`,
426
- }));
427
- // Build markdown output
428
- let output;
429
- if (ticketResults.length === 0) {
430
- output = '## Tickets\n\nNo tickets found matching your criteria.';
431
- }
432
- else {
433
- const rows = ticketResults.map(t => `| ${t.key} | ${t.title} | ${t.status} | ${t.priority} |`);
434
- output = `## Tickets (${ticketResults.length})\n\n| Key | Title | Status | Priority |\n|-----|-------|--------|----------|\n${rows.join('\n')}`;
435
- }
436
- return {
437
- success: true,
438
- data: { tickets: ticketResults, total: ticketResults.length },
439
- output,
440
- };
441
- }
442
- catch (error) {
443
- logger.error('[GLINR] List tickets error:', error instanceof Error ? error : undefined);
444
- return {
445
- success: false,
446
- error: {
447
- code: 'LIST_FAILED',
448
- message: error instanceof Error ? error.message : 'Failed to list tickets',
449
- },
450
- };
451
- }
452
- },
453
- };
454
- // =============================================================================
455
- // List Projects Tool
456
- // =============================================================================
457
- export const listProjectsTool = {
458
- name: 'list_projects',
459
- description: `List all projects in GLINR. **REQUIRED FIRST STEP** before creating tickets - returns project keys needed for create_ticket.
460
-
461
- WORKFLOW: To create a ticket, you MUST:
462
- 1. FIRST call list_projects → get the projectKey (e.g., "GLINR")
463
- 2. THEN call create_ticket with that projectKey
464
-
465
- Example: User says "create a bug ticket" →
466
- - Call list_projects → returns { projects: [{key: "GLINR", ...}] }
467
- - Call create_ticket with projectKey="GLINR", title="...", type="bug"
468
- - Return summary to user`,
469
- category: 'glinr',
470
- securityLevel: 'safe',
471
- allowedHosts: ['sandbox', 'gateway', 'local'],
472
- parameters: ListProjectsParamsSchema,
473
- isAvailable: checkDatabaseAvailability,
474
- examples: [{ description: 'List active projects', params: { status: 'active' } }],
475
- async execute(_context, params) {
476
- try {
477
- const client = getDb();
478
- const conditions = params.status !== 'all' ? [eq(projects.status, params.status === 'archived' ? 'archived' : 'active')] : [];
479
- const results = await client
480
- .select()
481
- .from(projects)
482
- .where(conditions.length > 0 ? and(...conditions) : undefined)
483
- .orderBy(projects.name);
484
- // Get ticket counts
485
- const projectResults = [];
486
- for (const p of results) {
487
- const countResult = await client
488
- .select({ count: sql `COUNT(*)` })
489
- .from(tickets)
490
- .where(eq(tickets.projectId, p.id));
491
- projectResults.push({
492
- id: p.id,
493
- name: p.name,
494
- key: p.key,
495
- description: p.description || undefined,
496
- icon: p.icon || undefined,
497
- color: p.color || undefined,
498
- status: p.status,
499
- ticketCount: countResult[0]?.count || 0,
500
- });
501
- }
502
- // Build hint for AI about next actions
503
- const projectKeys = projectResults.map(p => p.key).join(', ');
504
- const hint = projectResults.length > 0
505
- ? `NEXT STEP: To create a ticket, call create_ticket with one of these projectKeys: ${projectKeys}`
506
- : `No projects found. Create a project first with create_project, then create tickets in it.`;
507
- // Build markdown output
508
- let output;
509
- if (projectResults.length === 0) {
510
- output = '## Projects\n\nNo projects found. Use `create_project` to create one.';
511
- }
512
- else {
513
- const lines = projectResults.map(p => `- **${p.name}** (${p.key}) — ${p.ticketCount ?? 0} tickets`);
514
- output = `## Projects\n\n${lines.join('\n')}`;
515
- }
516
- return {
517
- success: true,
518
- data: { projects: projectResults, hint },
519
- output,
520
- };
521
- }
522
- catch (error) {
523
- logger.error('[GLINR] List projects error:', error instanceof Error ? error : undefined);
524
- return {
525
- success: false,
526
- error: {
527
- code: 'LIST_FAILED',
528
- message: error instanceof Error ? error.message : 'Failed to list projects',
529
- },
530
- };
531
- }
532
- },
533
- };
534
- // =============================================================================
535
- // Update Ticket Tool
536
- // =============================================================================
537
- export const updateTicketTool = {
538
- name: 'update_ticket',
539
- description: `Update an existing ticket's status, priority, description, or other fields.`,
540
- category: 'glinr',
541
- securityLevel: 'safe',
542
- allowedHosts: ['sandbox', 'gateway', 'local'],
543
- parameters: UpdateTicketParamsSchema,
544
- isAvailable: checkDatabaseAvailability,
545
- examples: [
546
- { description: 'Mark ticket done', params: { ticketKey: 'GLINR-123', status: 'done' } },
547
- { description: 'Update priority', params: { ticketKey: 'GLINR-123', priority: 'critical' } },
548
- ],
549
- async execute(_context, params) {
550
- try {
551
- const client = getDb();
552
- // Get existing ticket
553
- const ticket = await getTicketByKey(params.ticketKey);
554
- if (!ticket) {
555
- return {
556
- success: false,
557
- error: {
558
- code: 'TICKET_NOT_FOUND',
559
- message: `Ticket "${params.ticketKey}" not found`,
560
- },
561
- };
562
- }
563
- // Build update object — updatedAt must be Date (schema uses mode: "timestamp")
564
- const updates = {
565
- updatedAt: new Date(),
566
- };
567
- if (params.title !== undefined)
568
- updates.title = params.title;
569
- if (params.description !== undefined)
570
- updates.description = params.description;
571
- if (params.status !== undefined)
572
- updates.status = params.status;
573
- if (params.priority !== undefined)
574
- updates.priority = params.priority;
575
- if (params.type !== undefined)
576
- updates.type = params.type;
577
- if (params.labels !== undefined)
578
- updates.labels = params.labels;
579
- if (params.storyPoints !== undefined)
580
- updates.estimate = params.storyPoints;
581
- await client.update(tickets).set(updates).where(eq(tickets.id, ticket.id));
582
- // Get updated ticket
583
- const updated = await getTicketByKey(params.ticketKey);
584
- logger.info(`[GLINR] Updated ticket ${params.ticketKey}`);
585
- const data = {
586
- id: updated.id,
587
- key: params.ticketKey,
588
- title: updated.title,
589
- description: updated.description || undefined,
590
- status: updated.status,
591
- type: updated.type,
592
- priority: updated.priority,
593
- labels: updated.labels || undefined,
594
- storyPoints: updated.estimate || undefined,
595
- projectKey: updated.projectKey,
596
- createdAt: formatDateSafe(updated.createdAt),
597
- url: `/tickets/${updated.id}`,
598
- };
599
- // Build change summary
600
- const changes = [];
601
- if (params.status !== undefined)
602
- changes.push(`- Status: ${ticket.status} → ${params.status}`);
603
- if (params.priority !== undefined)
604
- changes.push(`- Priority: ${ticket.priority} → ${params.priority}`);
605
- if (params.type !== undefined)
606
- changes.push(`- Type: ${ticket.type} → ${params.type}`);
607
- if (params.title !== undefined)
608
- changes.push(`- Title: ${params.title}`);
609
- if (params.labels !== undefined)
610
- changes.push(`- Labels: ${params.labels.join(', ')}`);
611
- if (params.storyPoints !== undefined)
612
- changes.push(`- Story Points: ${params.storyPoints}`);
613
- const output = `## Ticket Updated\n**${params.ticketKey}** — ${updated.title}\n${changes.join('\n')}`;
614
- return { success: true, data, output };
615
- }
616
- catch (error) {
617
- logger.error('[GLINR] Update ticket error:', error instanceof Error ? error : undefined);
618
- return {
619
- success: false,
620
- error: {
621
- code: 'UPDATE_FAILED',
622
- message: error instanceof Error ? error.message : 'Failed to update ticket',
623
- },
624
- };
625
- }
626
- },
627
- };
628
- // =============================================================================
629
- // Get Ticket Tool
630
- // =============================================================================
631
- export const getTicketTool = {
632
- name: 'get_ticket',
633
- description: `Get details of a specific ticket by its key.`,
634
- category: 'glinr',
635
- securityLevel: 'safe',
636
- allowedHosts: ['sandbox', 'gateway', 'local'],
637
- parameters: GetTicketParamsSchema,
638
- isAvailable: checkDatabaseAvailability,
639
- examples: [{ description: 'Get ticket details', params: { ticketKey: 'GLINR-123' } }],
640
- async execute(_context, params) {
641
- try {
642
- const ticket = await getTicketByKey(params.ticketKey);
643
- if (!ticket) {
644
- return {
645
- success: false,
646
- error: {
647
- code: 'TICKET_NOT_FOUND',
648
- message: `Ticket "${params.ticketKey}" not found`,
649
- },
650
- };
651
- }
652
- const data = {
653
- id: ticket.id,
654
- key: params.ticketKey,
655
- title: ticket.title,
656
- description: ticket.description || undefined,
657
- status: ticket.status,
658
- type: ticket.type,
659
- priority: ticket.priority,
660
- labels: ticket.labels || undefined,
661
- storyPoints: ticket.estimate || undefined,
662
- projectKey: ticket.projectKey,
663
- createdAt: formatDateSafe(ticket.createdAt),
664
- url: `/tickets/${ticket.id}`,
665
- };
666
- const labelsLine = ticket.labels?.length ? `\n- Labels: ${ticket.labels.join(', ')}` : '';
667
- const descLine = ticket.description ? `\n\n${ticket.description}` : '';
668
- const output = `## ${params.ticketKey} — ${ticket.title}\n- Status: ${ticket.status}\n- Type: ${ticket.type}\n- Priority: ${ticket.priority}${labelsLine}${descLine}`;
669
- return { success: true, data, output };
670
- }
671
- catch (error) {
672
- logger.error('[GLINR] Get ticket error:', error instanceof Error ? error : undefined);
673
- return {
674
- success: false,
675
- error: {
676
- code: 'GET_FAILED',
677
- message: error instanceof Error ? error.message : 'Failed to get ticket',
678
- },
679
- };
680
- }
681
- },
682
- };
683
- // =============================================================================
684
- // Exports
685
- // =============================================================================
686
- export const glinrTools = [
687
- createTicketTool,
688
- createProjectTool,
689
- listTicketsTool,
690
- listProjectsTool,
691
- updateTicketTool,
692
- getTicketTool,
693
- ];
694
- //# sourceMappingURL=glinr-ops.js.map