agent-tower 0.1.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 (341) hide show
  1. package/dist/app.d.ts +2 -0
  2. package/dist/app.d.ts.map +1 -0
  3. package/dist/app.js +62 -0
  4. package/dist/app.js.map +1 -0
  5. package/dist/cli.d.ts +3 -0
  6. package/dist/cli.d.ts.map +1 -0
  7. package/dist/cli.js +131 -0
  8. package/dist/cli.js.map +1 -0
  9. package/dist/core/container.d.ts +11 -0
  10. package/dist/core/container.d.ts.map +1 -0
  11. package/dist/core/container.js +66 -0
  12. package/dist/core/container.js.map +1 -0
  13. package/dist/core/event-bus.d.ts +58 -0
  14. package/dist/core/event-bus.d.ts.map +1 -0
  15. package/dist/core/event-bus.js +29 -0
  16. package/dist/core/event-bus.js.map +1 -0
  17. package/dist/errors.d.ts +22 -0
  18. package/dist/errors.d.ts.map +1 -0
  19. package/dist/errors.js +36 -0
  20. package/dist/errors.js.map +1 -0
  21. package/dist/executors/base.executor.d.ts +160 -0
  22. package/dist/executors/base.executor.d.ts.map +1 -0
  23. package/dist/executors/base.executor.js +122 -0
  24. package/dist/executors/base.executor.js.map +1 -0
  25. package/dist/executors/claude-code.executor.d.ts +78 -0
  26. package/dist/executors/claude-code.executor.d.ts.map +1 -0
  27. package/dist/executors/claude-code.executor.js +160 -0
  28. package/dist/executors/claude-code.executor.js.map +1 -0
  29. package/dist/executors/command-builder.d.ts +64 -0
  30. package/dist/executors/command-builder.d.ts.map +1 -0
  31. package/dist/executors/command-builder.js +144 -0
  32. package/dist/executors/command-builder.js.map +1 -0
  33. package/dist/executors/cursor-agent.executor.d.ts +57 -0
  34. package/dist/executors/cursor-agent.executor.d.ts.map +1 -0
  35. package/dist/executors/cursor-agent.executor.js +109 -0
  36. package/dist/executors/cursor-agent.executor.js.map +1 -0
  37. package/dist/executors/default-profiles.json +29 -0
  38. package/dist/executors/execution-env.d.ts +64 -0
  39. package/dist/executors/execution-env.d.ts.map +1 -0
  40. package/dist/executors/execution-env.js +97 -0
  41. package/dist/executors/execution-env.js.map +1 -0
  42. package/dist/executors/gemini-cli.executor.d.ts +55 -0
  43. package/dist/executors/gemini-cli.executor.d.ts.map +1 -0
  44. package/dist/executors/gemini-cli.executor.js +117 -0
  45. package/dist/executors/gemini-cli.executor.js.map +1 -0
  46. package/dist/executors/index.d.ts +49 -0
  47. package/dist/executors/index.d.ts.map +1 -0
  48. package/dist/executors/index.js +95 -0
  49. package/dist/executors/index.js.map +1 -0
  50. package/dist/executors/profiles.d.ts +61 -0
  51. package/dist/executors/profiles.d.ts.map +1 -0
  52. package/dist/executors/profiles.js +192 -0
  53. package/dist/executors/profiles.js.map +1 -0
  54. package/dist/git/git-cli.d.ts +59 -0
  55. package/dist/git/git-cli.d.ts.map +1 -0
  56. package/dist/git/git-cli.js +156 -0
  57. package/dist/git/git-cli.js.map +1 -0
  58. package/dist/git/worktree.manager.d.ts +166 -0
  59. package/dist/git/worktree.manager.d.ts.map +1 -0
  60. package/dist/git/worktree.manager.js +481 -0
  61. package/dist/git/worktree.manager.js.map +1 -0
  62. package/dist/index.d.ts +2 -0
  63. package/dist/index.d.ts.map +1 -0
  64. package/dist/index.js +37 -0
  65. package/dist/index.js.map +1 -0
  66. package/dist/mcp/context.d.ts +15 -0
  67. package/dist/mcp/context.d.ts.map +1 -0
  68. package/dist/mcp/context.js +19 -0
  69. package/dist/mcp/context.js.map +1 -0
  70. package/dist/mcp/http-client.d.ts +46 -0
  71. package/dist/mcp/http-client.d.ts.map +1 -0
  72. package/dist/mcp/http-client.js +100 -0
  73. package/dist/mcp/http-client.js.map +1 -0
  74. package/dist/mcp/index.d.ts +3 -0
  75. package/dist/mcp/index.d.ts.map +1 -0
  76. package/dist/mcp/index.js +36 -0
  77. package/dist/mcp/index.js.map +1 -0
  78. package/dist/mcp/server.d.ts +6 -0
  79. package/dist/mcp/server.d.ts.map +1 -0
  80. package/dist/mcp/server.js +32 -0
  81. package/dist/mcp/server.js.map +1 -0
  82. package/dist/mcp/tools/projects.d.ts +7 -0
  83. package/dist/mcp/tools/projects.d.ts.map +1 -0
  84. package/dist/mcp/tools/projects.js +12 -0
  85. package/dist/mcp/tools/projects.js.map +1 -0
  86. package/dist/mcp/tools/sessions.d.ts +7 -0
  87. package/dist/mcp/tools/sessions.d.ts.map +1 -0
  88. package/dist/mcp/tools/sessions.js +22 -0
  89. package/dist/mcp/tools/sessions.js.map +1 -0
  90. package/dist/mcp/tools/tasks.d.ts +7 -0
  91. package/dist/mcp/tools/tasks.d.ts.map +1 -0
  92. package/dist/mcp/tools/tasks.js +68 -0
  93. package/dist/mcp/tools/tasks.js.map +1 -0
  94. package/dist/mcp/tools/workspaces.d.ts +7 -0
  95. package/dist/mcp/tools/workspaces.d.ts.map +1 -0
  96. package/dist/mcp/tools/workspaces.js +45 -0
  97. package/dist/mcp/tools/workspaces.js.map +1 -0
  98. package/dist/mcp/types.d.ts +109 -0
  99. package/dist/mcp/types.d.ts.map +1 -0
  100. package/dist/mcp/types.js +55 -0
  101. package/dist/mcp/types.js.map +1 -0
  102. package/dist/middleware/tunnel-auth.d.ts +13 -0
  103. package/dist/middleware/tunnel-auth.d.ts.map +1 -0
  104. package/dist/middleware/tunnel-auth.js +39 -0
  105. package/dist/middleware/tunnel-auth.js.map +1 -0
  106. package/dist/output/__tests__/claude-code-parser-token.test.d.ts +2 -0
  107. package/dist/output/__tests__/claude-code-parser-token.test.d.ts.map +1 -0
  108. package/dist/output/__tests__/claude-code-parser-token.test.js +233 -0
  109. package/dist/output/__tests__/claude-code-parser-token.test.js.map +1 -0
  110. package/dist/output/__tests__/cursor-agent-parser-token.test.d.ts +2 -0
  111. package/dist/output/__tests__/cursor-agent-parser-token.test.d.ts.map +1 -0
  112. package/dist/output/__tests__/cursor-agent-parser-token.test.js +95 -0
  113. package/dist/output/__tests__/cursor-agent-parser-token.test.js.map +1 -0
  114. package/dist/output/__tests__/msg-store-token.test.d.ts +2 -0
  115. package/dist/output/__tests__/msg-store-token.test.d.ts.map +1 -0
  116. package/dist/output/__tests__/msg-store-token.test.js +38 -0
  117. package/dist/output/__tests__/msg-store-token.test.js.map +1 -0
  118. package/dist/output/claude-code-parser.d.ts +96 -0
  119. package/dist/output/claude-code-parser.d.ts.map +1 -0
  120. package/dist/output/claude-code-parser.js +498 -0
  121. package/dist/output/claude-code-parser.js.map +1 -0
  122. package/dist/output/cursor-agent-parser.d.ts +87 -0
  123. package/dist/output/cursor-agent-parser.d.ts.map +1 -0
  124. package/dist/output/cursor-agent-parser.js +476 -0
  125. package/dist/output/cursor-agent-parser.js.map +1 -0
  126. package/dist/output/index.d.ts +9 -0
  127. package/dist/output/index.d.ts.map +1 -0
  128. package/dist/output/index.js +13 -0
  129. package/dist/output/index.js.map +1 -0
  130. package/dist/output/msg-store.d.ts +110 -0
  131. package/dist/output/msg-store.d.ts.map +1 -0
  132. package/dist/output/msg-store.js +274 -0
  133. package/dist/output/msg-store.js.map +1 -0
  134. package/dist/output/types.d.ts +90 -0
  135. package/dist/output/types.d.ts.map +1 -0
  136. package/dist/output/types.js +93 -0
  137. package/dist/output/types.js.map +1 -0
  138. package/dist/output/utils/ansi.d.ts +8 -0
  139. package/dist/output/utils/ansi.d.ts.map +1 -0
  140. package/dist/output/utils/ansi.js +17 -0
  141. package/dist/output/utils/ansi.js.map +1 -0
  142. package/dist/output/utils/patch.d.ts +57 -0
  143. package/dist/output/utils/patch.d.ts.map +1 -0
  144. package/dist/output/utils/patch.js +113 -0
  145. package/dist/output/utils/patch.js.map +1 -0
  146. package/dist/pipeline/agent-pipeline.d.ts +28 -0
  147. package/dist/pipeline/agent-pipeline.d.ts.map +1 -0
  148. package/dist/pipeline/agent-pipeline.js +76 -0
  149. package/dist/pipeline/agent-pipeline.js.map +1 -0
  150. package/dist/routes/attachments.d.ts +3 -0
  151. package/dist/routes/attachments.d.ts.map +1 -0
  152. package/dist/routes/attachments.js +141 -0
  153. package/dist/routes/attachments.js.map +1 -0
  154. package/dist/routes/demo.d.ts +3 -0
  155. package/dist/routes/demo.d.ts.map +1 -0
  156. package/dist/routes/demo.js +152 -0
  157. package/dist/routes/demo.js.map +1 -0
  158. package/dist/routes/files.d.ts +3 -0
  159. package/dist/routes/files.d.ts.map +1 -0
  160. package/dist/routes/files.js +313 -0
  161. package/dist/routes/files.js.map +1 -0
  162. package/dist/routes/filesystem.d.ts +3 -0
  163. package/dist/routes/filesystem.d.ts.map +1 -0
  164. package/dist/routes/filesystem.js +126 -0
  165. package/dist/routes/filesystem.js.map +1 -0
  166. package/dist/routes/git.d.ts +3 -0
  167. package/dist/routes/git.d.ts.map +1 -0
  168. package/dist/routes/git.js +170 -0
  169. package/dist/routes/git.js.map +1 -0
  170. package/dist/routes/index.d.ts +3 -0
  171. package/dist/routes/index.d.ts.map +1 -0
  172. package/dist/routes/index.js +45 -0
  173. package/dist/routes/index.js.map +1 -0
  174. package/dist/routes/notifications.d.ts +10 -0
  175. package/dist/routes/notifications.d.ts.map +1 -0
  176. package/dist/routes/notifications.js +54 -0
  177. package/dist/routes/notifications.js.map +1 -0
  178. package/dist/routes/profiles.d.ts +12 -0
  179. package/dist/routes/profiles.d.ts.map +1 -0
  180. package/dist/routes/profiles.js +76 -0
  181. package/dist/routes/profiles.js.map +1 -0
  182. package/dist/routes/projects.d.ts +3 -0
  183. package/dist/routes/projects.d.ts.map +1 -0
  184. package/dist/routes/projects.js +94 -0
  185. package/dist/routes/projects.js.map +1 -0
  186. package/dist/routes/sessions.d.ts +12 -0
  187. package/dist/routes/sessions.d.ts.map +1 -0
  188. package/dist/routes/sessions.js +109 -0
  189. package/dist/routes/sessions.js.map +1 -0
  190. package/dist/routes/system.d.ts +3 -0
  191. package/dist/routes/system.d.ts.map +1 -0
  192. package/dist/routes/system.js +42 -0
  193. package/dist/routes/system.js.map +1 -0
  194. package/dist/routes/tasks.d.ts +3 -0
  195. package/dist/routes/tasks.d.ts.map +1 -0
  196. package/dist/routes/tasks.js +136 -0
  197. package/dist/routes/tasks.js.map +1 -0
  198. package/dist/routes/terminals.d.ts +3 -0
  199. package/dist/routes/terminals.d.ts.map +1 -0
  200. package/dist/routes/terminals.js +54 -0
  201. package/dist/routes/terminals.js.map +1 -0
  202. package/dist/routes/tunnel.d.ts +3 -0
  203. package/dist/routes/tunnel.d.ts.map +1 -0
  204. package/dist/routes/tunnel.js +36 -0
  205. package/dist/routes/tunnel.js.map +1 -0
  206. package/dist/routes/workspaces.d.ts +3 -0
  207. package/dist/routes/workspaces.d.ts.map +1 -0
  208. package/dist/routes/workspaces.js +171 -0
  209. package/dist/routes/workspaces.js.map +1 -0
  210. package/dist/services/commit-message.service.d.ts +32 -0
  211. package/dist/services/commit-message.service.d.ts.map +1 -0
  212. package/dist/services/commit-message.service.js +202 -0
  213. package/dist/services/commit-message.service.js.map +1 -0
  214. package/dist/services/notifications/feishu-channel.d.ts +9 -0
  215. package/dist/services/notifications/feishu-channel.d.ts.map +1 -0
  216. package/dist/services/notifications/feishu-channel.js +51 -0
  217. package/dist/services/notifications/feishu-channel.js.map +1 -0
  218. package/dist/services/notifications/index.d.ts +3 -0
  219. package/dist/services/notifications/index.d.ts.map +1 -0
  220. package/dist/services/notifications/index.js +2 -0
  221. package/dist/services/notifications/index.js.map +1 -0
  222. package/dist/services/notifications/notification.service.d.ts +10 -0
  223. package/dist/services/notifications/notification.service.d.ts.map +1 -0
  224. package/dist/services/notifications/notification.service.js +85 -0
  225. package/dist/services/notifications/notification.service.js.map +1 -0
  226. package/dist/services/notifications/os-channel.d.ts +8 -0
  227. package/dist/services/notifications/os-channel.d.ts.map +1 -0
  228. package/dist/services/notifications/os-channel.js +38 -0
  229. package/dist/services/notifications/os-channel.js.map +1 -0
  230. package/dist/services/notifications/types.d.ts +11 -0
  231. package/dist/services/notifications/types.d.ts.map +1 -0
  232. package/dist/services/notifications/types.js +2 -0
  233. package/dist/services/notifications/types.js.map +1 -0
  234. package/dist/services/project.service.d.ts +91 -0
  235. package/dist/services/project.service.d.ts.map +1 -0
  236. package/dist/services/project.service.js +138 -0
  237. package/dist/services/project.service.js.map +1 -0
  238. package/dist/services/session-manager.d.ts +164 -0
  239. package/dist/services/session-manager.d.ts.map +1 -0
  240. package/dist/services/session-manager.js +569 -0
  241. package/dist/services/session-manager.js.map +1 -0
  242. package/dist/services/task.service.d.ts +179 -0
  243. package/dist/services/task.service.d.ts.map +1 -0
  244. package/dist/services/task.service.js +281 -0
  245. package/dist/services/task.service.js.map +1 -0
  246. package/dist/services/terminal-manager.d.ts +64 -0
  247. package/dist/services/terminal-manager.d.ts.map +1 -0
  248. package/dist/services/terminal-manager.js +217 -0
  249. package/dist/services/terminal-manager.js.map +1 -0
  250. package/dist/services/tunnel.service.d.ts +16 -0
  251. package/dist/services/tunnel.service.d.ts.map +1 -0
  252. package/dist/services/tunnel.service.js +77 -0
  253. package/dist/services/tunnel.service.js.map +1 -0
  254. package/dist/services/workspace.service.d.ts +219 -0
  255. package/dist/services/workspace.service.d.ts.map +1 -0
  256. package/dist/services/workspace.service.js +351 -0
  257. package/dist/services/workspace.service.js.map +1 -0
  258. package/dist/socket/events.d.ts +2 -0
  259. package/dist/socket/events.d.ts.map +1 -0
  260. package/dist/socket/events.js +3 -0
  261. package/dist/socket/events.js.map +1 -0
  262. package/dist/socket/index.d.ts +20 -0
  263. package/dist/socket/index.d.ts.map +1 -0
  264. package/dist/socket/index.js +77 -0
  265. package/dist/socket/index.js.map +1 -0
  266. package/dist/socket/middleware/auth.d.ts +13 -0
  267. package/dist/socket/middleware/auth.d.ts.map +1 -0
  268. package/dist/socket/middleware/auth.js +29 -0
  269. package/dist/socket/middleware/auth.js.map +1 -0
  270. package/dist/socket/middleware/error-handler.d.ts +11 -0
  271. package/dist/socket/middleware/error-handler.d.ts.map +1 -0
  272. package/dist/socket/middleware/error-handler.js +39 -0
  273. package/dist/socket/middleware/error-handler.js.map +1 -0
  274. package/dist/socket/middleware/index.d.ts +3 -0
  275. package/dist/socket/middleware/index.d.ts.map +1 -0
  276. package/dist/socket/middleware/index.js +3 -0
  277. package/dist/socket/middleware/index.js.map +1 -0
  278. package/dist/socket/rooms.d.ts +30 -0
  279. package/dist/socket/rooms.d.ts.map +1 -0
  280. package/dist/socket/rooms.js +39 -0
  281. package/dist/socket/rooms.js.map +1 -0
  282. package/dist/socket/socket-gateway.d.ts +21 -0
  283. package/dist/socket/socket-gateway.d.ts.map +1 -0
  284. package/dist/socket/socket-gateway.js +173 -0
  285. package/dist/socket/socket-gateway.js.map +1 -0
  286. package/dist/types/index.d.ts +41 -0
  287. package/dist/types/index.d.ts.map +1 -0
  288. package/dist/types/index.js +41 -0
  289. package/dist/types/index.js.map +1 -0
  290. package/dist/utils/index.d.ts +12 -0
  291. package/dist/utils/index.d.ts.map +1 -0
  292. package/dist/utils/index.js +25 -0
  293. package/dist/utils/index.js.map +1 -0
  294. package/dist/web/assets/AgentDemoPage-WdWEQtyU.js +1 -0
  295. package/dist/web/assets/DemoPage-C4Z_ftHI.js +4 -0
  296. package/dist/web/assets/NotificationSettingsPage-FrLfgt9y.js +1 -0
  297. package/dist/web/assets/ProfileSettingsPage-Cs93rTRr.js +3 -0
  298. package/dist/web/assets/ProjectKanbanPage-BmlRVfzo.js +75 -0
  299. package/dist/web/assets/ProjectKanbanPage-G5OQeJvU.css +1 -0
  300. package/dist/web/assets/api-client-CEBkg5lt.js +1 -0
  301. package/dist/web/assets/circle-alert-BEozlsMd.js +1 -0
  302. package/dist/web/assets/code-block-OCS4YCEC-CGgYYS4A.js +2 -0
  303. package/dist/web/assets/folder-picker-BP3x3phB.js +1 -0
  304. package/dist/web/assets/index-BuAijQvi.js +13 -0
  305. package/dist/web/assets/index-CxV866Yg.css +1 -0
  306. package/dist/web/assets/loader-circle-yEIqsdJ1.js +1 -0
  307. package/dist/web/assets/mermaid-NOHMQCX5-CIqtI2jF.js +123 -0
  308. package/dist/web/assets/mermaid-NOHMQCX5-lI9o3AWT.css +1 -0
  309. package/dist/web/assets/modal-BoX2RXaV.js +1 -0
  310. package/dist/web/assets/query-keys-BD_s_Etj.js +1 -0
  311. package/dist/web/assets/use-profiles-Rh8rBsAt.js +1 -0
  312. package/dist/web/index.html +14 -0
  313. package/dist/web/vite.svg +1 -0
  314. package/node_modules/@agent-tower/shared/dist/dev-port.d.ts +12 -0
  315. package/node_modules/@agent-tower/shared/dist/dev-port.d.ts.map +1 -0
  316. package/node_modules/@agent-tower/shared/dist/dev-port.js +31 -0
  317. package/node_modules/@agent-tower/shared/dist/dev-port.js.map +1 -0
  318. package/node_modules/@agent-tower/shared/dist/index.d.ts +5 -0
  319. package/node_modules/@agent-tower/shared/dist/index.d.ts.map +1 -0
  320. package/node_modules/@agent-tower/shared/dist/index.js +5 -0
  321. package/node_modules/@agent-tower/shared/dist/index.js.map +1 -0
  322. package/node_modules/@agent-tower/shared/dist/log-adapter.d.ts +72 -0
  323. package/node_modules/@agent-tower/shared/dist/log-adapter.d.ts.map +1 -0
  324. package/node_modules/@agent-tower/shared/dist/log-adapter.js +144 -0
  325. package/node_modules/@agent-tower/shared/dist/log-adapter.js.map +1 -0
  326. package/node_modules/@agent-tower/shared/dist/socket/events.d.ts +133 -0
  327. package/node_modules/@agent-tower/shared/dist/socket/events.d.ts.map +1 -0
  328. package/node_modules/@agent-tower/shared/dist/socket/events.js +32 -0
  329. package/node_modules/@agent-tower/shared/dist/socket/events.js.map +1 -0
  330. package/node_modules/@agent-tower/shared/dist/socket/index.d.ts +2 -0
  331. package/node_modules/@agent-tower/shared/dist/socket/index.d.ts.map +1 -0
  332. package/node_modules/@agent-tower/shared/dist/socket/index.js +2 -0
  333. package/node_modules/@agent-tower/shared/dist/socket/index.js.map +1 -0
  334. package/node_modules/@agent-tower/shared/dist/types.d.ts +168 -0
  335. package/node_modules/@agent-tower/shared/dist/types.d.ts.map +1 -0
  336. package/node_modules/@agent-tower/shared/dist/types.js +53 -0
  337. package/node_modules/@agent-tower/shared/dist/types.js.map +1 -0
  338. package/node_modules/@agent-tower/shared/package.json +38 -0
  339. package/package.json +46 -0
  340. package/prisma/schema.prisma +130 -0
  341. package/scripts/postinstall.js +120 -0
@@ -0,0 +1,113 @@
1
+ /**
2
+ * JSON Patch 工具函数
3
+ * 用于创建对话状态的增量更新
4
+ */
5
+ /**
6
+ * 条目索引提供器
7
+ * 管理对话条目的递增索引
8
+ */
9
+ export class EntryIndexProvider {
10
+ index;
11
+ constructor(startFrom = 0) {
12
+ this.index = startFrom;
13
+ }
14
+ next() {
15
+ return this.index++;
16
+ }
17
+ current() {
18
+ return this.index;
19
+ }
20
+ startFrom(index) {
21
+ this.index = index;
22
+ }
23
+ }
24
+ /**
25
+ * 添加标准化条目
26
+ */
27
+ export function addNormalizedEntry(index, entry) {
28
+ return [
29
+ {
30
+ op: 'add',
31
+ path: `/entries/${index}`,
32
+ value: entry,
33
+ },
34
+ ];
35
+ }
36
+ /**
37
+ * 替换标准化条目
38
+ */
39
+ export function replaceNormalizedEntry(index, entry) {
40
+ return [
41
+ {
42
+ op: 'replace',
43
+ path: `/entries/${index}`,
44
+ value: entry,
45
+ },
46
+ ];
47
+ }
48
+ /**
49
+ * 更新条目内容
50
+ */
51
+ export function updateEntryContent(index, content) {
52
+ return [
53
+ {
54
+ op: 'replace',
55
+ path: `/entries/${index}/content`,
56
+ value: content,
57
+ },
58
+ ];
59
+ }
60
+ /**
61
+ * 更新工具状态
62
+ */
63
+ export function updateToolStatus(index, status) {
64
+ return [
65
+ {
66
+ op: 'replace',
67
+ path: `/entries/${index}/metadata/status`,
68
+ value: status,
69
+ },
70
+ ];
71
+ }
72
+ /**
73
+ * 设置会话 ID
74
+ */
75
+ export function setSessionId(sessionId) {
76
+ return [
77
+ {
78
+ op: 'add',
79
+ path: '/sessionId',
80
+ value: sessionId,
81
+ },
82
+ ];
83
+ }
84
+ /**
85
+ * 移除条目
86
+ */
87
+ export function removeEntry(index) {
88
+ return [
89
+ {
90
+ op: 'remove',
91
+ path: `/entries/${index}`,
92
+ },
93
+ ];
94
+ }
95
+ /**
96
+ * 合并多个 patch
97
+ */
98
+ export function mergePatches(...patches) {
99
+ return patches.flat();
100
+ }
101
+ /**
102
+ * ConversationPatch 工具对象
103
+ */
104
+ export const ConversationPatch = {
105
+ addNormalizedEntry,
106
+ replaceNormalizedEntry,
107
+ updateEntryContent,
108
+ updateToolStatus,
109
+ setSessionId,
110
+ removeEntry,
111
+ mergePatches,
112
+ };
113
+ //# sourceMappingURL=patch.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"patch.js","sourceRoot":"","sources":["../../../src/output/utils/patch.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAIH;;;GAGG;AACH,MAAM,OAAO,kBAAkB;IACrB,KAAK,CAAQ;IAErB,YAAY,SAAS,GAAG,CAAC;QACvB,IAAI,CAAC,KAAK,GAAG,SAAS,CAAA;IACxB,CAAC;IAED,IAAI;QACF,OAAO,IAAI,CAAC,KAAK,EAAE,CAAA;IACrB,CAAC;IAED,OAAO;QACL,OAAO,IAAI,CAAC,KAAK,CAAA;IACnB,CAAC;IAED,SAAS,CAAC,KAAa;QACrB,IAAI,CAAC,KAAK,GAAG,KAAK,CAAA;IACpB,CAAC;CACF;AAED;;GAEG;AACH,MAAM,UAAU,kBAAkB,CAAC,KAAa,EAAE,KAAsB;IACtE,OAAO;QACL;YACE,EAAE,EAAE,KAAK;YACT,IAAI,EAAE,YAAY,KAAK,EAAE;YACzB,KAAK,EAAE,KAAK;SACb;KACF,CAAA;AACH,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,sBAAsB,CAAC,KAAa,EAAE,KAAsB;IAC1E,OAAO;QACL;YACE,EAAE,EAAE,SAAS;YACb,IAAI,EAAE,YAAY,KAAK,EAAE;YACzB,KAAK,EAAE,KAAK;SACb;KACF,CAAA;AACH,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,kBAAkB,CAAC,KAAa,EAAE,OAAe;IAC/D,OAAO;QACL;YACE,EAAE,EAAE,SAAS;YACb,IAAI,EAAE,YAAY,KAAK,UAAU;YACjC,KAAK,EAAE,OAAO;SACf;KACF,CAAA;AACH,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,gBAAgB,CAAC,KAAa,EAAE,MAAkB;IAChE,OAAO;QACL;YACE,EAAE,EAAE,SAAS;YACb,IAAI,EAAE,YAAY,KAAK,kBAAkB;YACzC,KAAK,EAAE,MAAM;SACd;KACF,CAAA;AACH,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,YAAY,CAAC,SAAiB;IAC5C,OAAO;QACL;YACE,EAAE,EAAE,KAAK;YACT,IAAI,EAAE,YAAY;YAClB,KAAK,EAAE,SAAS;SACjB;KACF,CAAA;AACH,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,WAAW,CAAC,KAAa;IACvC,OAAO;QACL;YACE,EAAE,EAAE,QAAQ;YACZ,IAAI,EAAE,YAAY,KAAK,EAAE;SAC1B;KACF,CAAA;AACH,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,YAAY,CAAC,GAAG,OAAoB;IAClD,OAAO,OAAO,CAAC,IAAI,EAAE,CAAA;AACvB,CAAC;AAED;;GAEG;AACH,MAAM,CAAC,MAAM,iBAAiB,GAAG;IAC/B,kBAAkB;IAClB,sBAAsB;IACtB,kBAAkB;IAClB,gBAAgB;IAChB,YAAY;IACZ,WAAW;IACX,YAAY;CACb,CAAA"}
@@ -0,0 +1,28 @@
1
+ import type { IPty } from 'node-pty';
2
+ import type { MsgStore } from '../output/msg-store.js';
3
+ import type { EventBus } from '../core/event-bus.js';
4
+ export interface OutputParser {
5
+ processData(data: string): void;
6
+ finish(): void;
7
+ }
8
+ /**
9
+ * Owns one session's PTY + parser lifecycle.
10
+ */
11
+ export declare class AgentPipeline {
12
+ private readonly sessionId;
13
+ private readonly pty;
14
+ private readonly parser;
15
+ private readonly msgStore;
16
+ private readonly eventBus;
17
+ private destroyed;
18
+ private offData?;
19
+ private offExit?;
20
+ private offPatch?;
21
+ private offSessionId?;
22
+ constructor(sessionId: string, pty: IPty, parser: OutputParser | null, msgStore: MsgStore, eventBus: EventBus);
23
+ get isAlive(): boolean;
24
+ write(data: string): void;
25
+ resize(cols: number, rows: number): void;
26
+ destroy(): void;
27
+ }
28
+ //# sourceMappingURL=agent-pipeline.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"agent-pipeline.d.ts","sourceRoot":"","sources":["../../src/pipeline/agent-pipeline.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,UAAU,CAAC;AACrC,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,wBAAwB,CAAC;AACvD,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,sBAAsB,CAAC;AAErD,MAAM,WAAW,YAAY;IAC3B,WAAW,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI,CAAC;IAChC,MAAM,IAAI,IAAI,CAAC;CAChB;AAED;;GAEG;AACH,qBAAa,aAAa;IAOtB,OAAO,CAAC,QAAQ,CAAC,SAAS;IAC1B,OAAO,CAAC,QAAQ,CAAC,GAAG;IACpB,OAAO,CAAC,QAAQ,CAAC,MAAM;IACvB,OAAO,CAAC,QAAQ,CAAC,QAAQ;IACzB,OAAO,CAAC,QAAQ,CAAC,QAAQ;IAV3B,OAAO,CAAC,SAAS,CAAS;IAC1B,OAAO,CAAC,OAAO,CAAC,CAAsB;IACtC,OAAO,CAAC,OAAO,CAAC,CAAsB;IACtC,OAAO,CAAC,QAAQ,CAAC,CAAa;IAC9B,OAAO,CAAC,YAAY,CAAC,CAAa;gBAEf,SAAS,EAAE,MAAM,EACjB,GAAG,EAAE,IAAI,EACT,MAAM,EAAE,YAAY,GAAG,IAAI,EAC3B,QAAQ,EAAE,QAAQ,EAClB,QAAQ,EAAE,QAAQ;IA4BrC,IAAI,OAAO,IAAI,OAAO,CAErB;IAED,KAAK,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI;IAKzB,MAAM,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,IAAI;IAKxC,OAAO,IAAI,IAAI;CAchB"}
@@ -0,0 +1,76 @@
1
+ /**
2
+ * Owns one session's PTY + parser lifecycle.
3
+ */
4
+ export class AgentPipeline {
5
+ sessionId;
6
+ pty;
7
+ parser;
8
+ msgStore;
9
+ eventBus;
10
+ destroyed = false;
11
+ offData;
12
+ offExit;
13
+ offPatch;
14
+ offSessionId;
15
+ constructor(sessionId, pty, parser, msgStore, eventBus) {
16
+ this.sessionId = sessionId;
17
+ this.pty = pty;
18
+ this.parser = parser;
19
+ this.msgStore = msgStore;
20
+ this.eventBus = eventBus;
21
+ this.offPatch = this.msgStore.onPatch((patch) => {
22
+ this.eventBus.emit('session:patch', { sessionId: this.sessionId, patch });
23
+ });
24
+ this.offSessionId = this.msgStore.onSessionId((agentSessionId) => {
25
+ this.eventBus.emit('session:sessionId', { sessionId: this.sessionId, agentSessionId });
26
+ });
27
+ this.offData = this.pty.onData((data) => {
28
+ if (this.destroyed)
29
+ return;
30
+ this.msgStore.pushStdout(data);
31
+ this.eventBus.emit('session:stdout', { sessionId: this.sessionId, data });
32
+ this.parser?.processData(data);
33
+ });
34
+ this.offExit = this.pty.onExit(({ exitCode }) => {
35
+ if (this.destroyed)
36
+ return;
37
+ this.parser?.finish();
38
+ this.msgStore.pushFinished();
39
+ this.eventBus.emit('session:exit', { sessionId: this.sessionId, exitCode });
40
+ // Self-cleanup: remove MsgStore listeners so stale references don't accumulate.
41
+ // SessionManager.session:exit handler also calls destroy(), but this ensures
42
+ // cleanup even if external code doesn't explicitly destroy the pipeline.
43
+ this.destroy();
44
+ });
45
+ }
46
+ get isAlive() {
47
+ return !this.destroyed;
48
+ }
49
+ write(data) {
50
+ if (this.destroyed)
51
+ return;
52
+ this.pty.write(data);
53
+ }
54
+ resize(cols, rows) {
55
+ if (this.destroyed)
56
+ return;
57
+ this.pty.resize(cols, rows);
58
+ }
59
+ destroy() {
60
+ if (this.destroyed)
61
+ return;
62
+ this.destroyed = true;
63
+ this.offData?.dispose();
64
+ this.offExit?.dispose();
65
+ this.offPatch?.();
66
+ this.offSessionId?.();
67
+ this.parser?.finish();
68
+ try {
69
+ this.pty.kill();
70
+ }
71
+ catch {
72
+ // ignore kill errors for already-exited processes
73
+ }
74
+ }
75
+ }
76
+ //# sourceMappingURL=agent-pipeline.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"agent-pipeline.js","sourceRoot":"","sources":["../../src/pipeline/agent-pipeline.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ import type { FastifyInstance } from 'fastify';
2
+ export declare function attachmentRoutes(app: FastifyInstance): Promise<void>;
3
+ //# sourceMappingURL=attachments.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"attachments.d.ts","sourceRoot":"","sources":["../../src/routes/attachments.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,SAAS,CAAC;AAoB/C,wBAAsB,gBAAgB,CAAC,GAAG,EAAE,eAAe,iBA2I1D"}
@@ -0,0 +1,141 @@
1
+ import * as fs from 'node:fs/promises';
2
+ import * as fssync from 'node:fs';
3
+ import * as path from 'node:path';
4
+ import * as crypto from 'node:crypto';
5
+ import { prisma } from '../utils/index.js';
6
+ const MAX_FILE_SIZE = 50 * 1024 * 1024; // 50MB
7
+ /** 附件存储根目录 */
8
+ function getStorageDir() {
9
+ const dataDir = process.env.AGENT_TOWER_DATA_DIR || process.env.DATA_DIR || path.resolve(process.cwd(), 'data');
10
+ return path.join(dataDir, 'attachments');
11
+ }
12
+ /** 确保存储目录存在 */
13
+ async function ensureStorageDir(dir) {
14
+ await fs.mkdir(dir, { recursive: true });
15
+ }
16
+ export async function attachmentRoutes(app) {
17
+ /**
18
+ * POST /upload
19
+ * multipart/form-data 上传文件
20
+ */
21
+ app.post('/upload', async (request, reply) => {
22
+ const file = await request.file();
23
+ if (!file) {
24
+ reply.code(400);
25
+ return { error: 'No file provided' };
26
+ }
27
+ // 读取文件内容到 buffer
28
+ const chunks = [];
29
+ let totalSize = 0;
30
+ for await (const chunk of file.file) {
31
+ totalSize += chunk.length;
32
+ if (totalSize > MAX_FILE_SIZE) {
33
+ reply.code(413);
34
+ return { error: `File too large. Maximum size is ${MAX_FILE_SIZE / 1024 / 1024}MB` };
35
+ }
36
+ chunks.push(chunk);
37
+ }
38
+ // 检查 busboy 是否因为大小限制截断了文件
39
+ if (file.file.truncated) {
40
+ reply.code(413);
41
+ return { error: `File too large. Maximum size is ${MAX_FILE_SIZE / 1024 / 1024}MB` };
42
+ }
43
+ const buffer = Buffer.concat(chunks);
44
+ const hash = crypto.createHash('sha256').update(buffer).digest('hex');
45
+ // 检查是否已存在相同 hash 的文件
46
+ const existing = await prisma.attachment.findFirst({ where: { hash } });
47
+ if (existing) {
48
+ return {
49
+ id: existing.id,
50
+ originalName: existing.originalName,
51
+ mimeType: existing.mimeType,
52
+ sizeBytes: existing.sizeBytes,
53
+ url: `/attachments/${existing.id}/file`,
54
+ storagePath: existing.storagePath,
55
+ };
56
+ }
57
+ // 存储文件: data/attachments/{hash前2位}/{hash}_{原始文件名}
58
+ const storageDir = getStorageDir();
59
+ const subDir = path.join(storageDir, hash.slice(0, 2));
60
+ await ensureStorageDir(subDir);
61
+ const safeName = (file.filename || 'upload').replace(/[^a-zA-Z0-9._-]/g, '_');
62
+ const storagePath = path.join(subDir, `${hash}_${safeName}`);
63
+ await fs.writeFile(storagePath, buffer);
64
+ const attachment = await prisma.attachment.create({
65
+ data: {
66
+ originalName: file.filename || 'upload',
67
+ mimeType: file.mimetype || 'application/octet-stream',
68
+ sizeBytes: buffer.length,
69
+ storagePath,
70
+ hash,
71
+ },
72
+ });
73
+ return {
74
+ id: attachment.id,
75
+ originalName: attachment.originalName,
76
+ mimeType: attachment.mimeType,
77
+ sizeBytes: attachment.sizeBytes,
78
+ url: `/attachments/${attachment.id}/file`,
79
+ storagePath: attachment.storagePath,
80
+ };
81
+ });
82
+ /**
83
+ * GET /:id/file
84
+ * 获取附件文件内容
85
+ */
86
+ app.get('/:id/file', async (request, reply) => {
87
+ const attachment = await prisma.attachment.findUnique({
88
+ where: { id: request.params.id },
89
+ });
90
+ if (!attachment) {
91
+ reply.code(404);
92
+ return { error: 'Attachment not found' };
93
+ }
94
+ if (!fssync.existsSync(attachment.storagePath)) {
95
+ reply.code(404);
96
+ return { error: 'File not found on disk' };
97
+ }
98
+ const stream = fssync.createReadStream(attachment.storagePath);
99
+ return reply
100
+ .type(attachment.mimeType)
101
+ .header('Content-Disposition', `inline; filename="${encodeURIComponent(attachment.originalName)}"`)
102
+ .header('Cache-Control', 'public, max-age=31536000, immutable')
103
+ .send(stream);
104
+ });
105
+ /**
106
+ * GET /by-path?path=/abs/path/to/file
107
+ * 通过磁盘路径获取附件(仅允许 data/attachments/ 目录下的文件)
108
+ */
109
+ app.get('/by-path', async (request, reply) => {
110
+ const { path: filePath } = request.query;
111
+ if (!filePath) {
112
+ reply.code(400);
113
+ return { error: 'path query parameter is required' };
114
+ }
115
+ // 安全校验:必须在 attachments 存储目录下
116
+ const storageDir = path.resolve(getStorageDir());
117
+ const resolved = path.resolve(filePath);
118
+ if (!resolved.startsWith(storageDir)) {
119
+ reply.code(403);
120
+ return { error: 'Access denied: path is outside attachments directory' };
121
+ }
122
+ if (!fssync.existsSync(resolved)) {
123
+ reply.code(404);
124
+ return { error: 'File not found' };
125
+ }
126
+ // 从文件扩展名推断 MIME 类型
127
+ const ext = path.extname(resolved).toLowerCase();
128
+ const mimeMap = {
129
+ '.png': 'image/png', '.jpg': 'image/jpeg', '.jpeg': 'image/jpeg',
130
+ '.gif': 'image/gif', '.webp': 'image/webp', '.svg': 'image/svg+xml',
131
+ '.pdf': 'application/pdf', '.txt': 'text/plain',
132
+ };
133
+ const mimeType = mimeMap[ext] || 'application/octet-stream';
134
+ const stream = fssync.createReadStream(resolved);
135
+ return reply
136
+ .type(mimeType)
137
+ .header('Cache-Control', 'public, max-age=31536000, immutable')
138
+ .send(stream);
139
+ });
140
+ }
141
+ //# sourceMappingURL=attachments.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"attachments.js","sourceRoot":"","sources":["../../src/routes/attachments.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ import type { FastifyInstance } from 'fastify';
2
+ export declare function demoRoutes(app: FastifyInstance): Promise<void>;
3
+ //# sourceMappingURL=demo.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"demo.d.ts","sourceRoot":"","sources":["../../src/routes/demo.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,SAAS,CAAC;AAyB/C,wBAAsB,UAAU,CAAC,GAAG,EAAE,eAAe,iBA6JpD"}
@@ -0,0 +1,152 @@
1
+ import { z } from 'zod';
2
+ import { AgentType } from '../types/index.js';
3
+ import { getExecutor, getAllExecutorsAvailability, ExecutionEnv } from '../executors/index.js';
4
+ import { sessionMsgStoreManager, createClaudeCodeParser, createCursorAgentParser } from '../output/index.js';
5
+ // Debug 日志开关
6
+ const DEBUG_DEMO = process.env.DEBUG_DEMO === 'true';
7
+ const startDemoSchema = z.object({
8
+ agentType: z.nativeEnum(AgentType),
9
+ prompt: z.string().min(1),
10
+ workingDir: z.string().optional(),
11
+ variant: z.string().optional(),
12
+ });
13
+ const sendMessageSchema = z.object({
14
+ message: z.string().min(1),
15
+ });
16
+ // 简单的内存存储,用于 MVP 演示
17
+ const demoSessions = new Map();
18
+ const demoPtys = new Map();
19
+ export async function demoRoutes(app) {
20
+ // 快速启动 demo 会话(跳过 workspace/task 创建)
21
+ app.post('/demo/start', async (request, reply) => {
22
+ const body = startDemoSchema.parse(request.body);
23
+ const executor = getExecutor(body.agentType, body.variant);
24
+ if (!executor) {
25
+ reply.code(400);
26
+ return { error: `Unsupported agent type: ${body.agentType}` };
27
+ }
28
+ // 检查可用性
29
+ const availability = await executor.getAvailabilityInfo();
30
+ if (availability.type === 'NOT_FOUND') {
31
+ reply.code(400);
32
+ return { error: `Agent not available: ${availability.error || 'Not installed'}` };
33
+ }
34
+ // 生成简单的 session ID
35
+ const sessionId = `demo-${Date.now()}-${Math.random().toString(36).slice(2, 8)}`;
36
+ try {
37
+ const workingDir = body.workingDir || process.cwd();
38
+ const env = ExecutionEnv.default(workingDir);
39
+ const spawnResult = await executor.spawn({
40
+ workingDir,
41
+ prompt: body.prompt,
42
+ env,
43
+ });
44
+ // 创建 MsgStore 并连接 PTY 输出
45
+ const msgStore = sessionMsgStoreManager.create(sessionId, body.agentType, workingDir);
46
+ // 根据 agent 类型创建解析器
47
+ let parser = null;
48
+ if (body.agentType === AgentType.CLAUDE_CODE) {
49
+ parser = createClaudeCodeParser(msgStore);
50
+ }
51
+ else if (body.agentType === AgentType.CURSOR_AGENT) {
52
+ parser = createCursorAgentParser(msgStore, workingDir);
53
+ }
54
+ // 将 PTY 输出转发到 MsgStore 和解析器
55
+ let ptyDataCount = 0;
56
+ spawnResult.pty.onData((data) => {
57
+ ptyDataCount++;
58
+ const now = Date.now();
59
+ if (DEBUG_DEMO) {
60
+ console.log(`[Demo:PTY] #${ptyDataCount} t=${now} sessionId=${sessionId} len=${data.length} preview="${data.slice(0, 80).replace(/\n/g, '\\n')}..."`);
61
+ }
62
+ msgStore.pushStdout(data);
63
+ if (parser) {
64
+ parser.processData(data);
65
+ }
66
+ });
67
+ // PTY 退出时标记 MsgStore 完成并清理状态
68
+ spawnResult.pty.onExit(() => {
69
+ if (parser) {
70
+ parser.finish();
71
+ }
72
+ msgStore.pushFinished();
73
+ // Update session status and clean up PTY reference
74
+ const session = demoSessions.get(sessionId);
75
+ if (session) {
76
+ session.status = 'stopped';
77
+ }
78
+ demoPtys.delete(sessionId);
79
+ });
80
+ demoPtys.set(sessionId, spawnResult.pty);
81
+ demoSessions.set(sessionId, {
82
+ agentType: body.agentType,
83
+ status: 'running',
84
+ });
85
+ reply.code(201);
86
+ return {
87
+ sessionId,
88
+ agentType: body.agentType,
89
+ status: 'running',
90
+ pid: spawnResult.pid,
91
+ };
92
+ }
93
+ catch (error) {
94
+ reply.code(500);
95
+ return {
96
+ error: 'Failed to start agent',
97
+ message: error instanceof Error ? error.message : 'Unknown error',
98
+ };
99
+ }
100
+ });
101
+ // 发送消息到 demo 会话
102
+ app.post('/demo/:sessionId/message', async (request, reply) => {
103
+ const { sessionId } = request.params;
104
+ const body = sendMessageSchema.parse(request.body);
105
+ const session = demoSessions.get(sessionId);
106
+ if (!session) {
107
+ reply.code(404);
108
+ return { error: 'Session not found' };
109
+ }
110
+ const pty = demoPtys.get(sessionId);
111
+ if (!pty) {
112
+ reply.code(404);
113
+ return { error: 'PTY not found' };
114
+ }
115
+ pty.write(body.message + '\n');
116
+ return { success: true };
117
+ });
118
+ // 停止 demo 会话
119
+ app.post('/demo/:sessionId/stop', async (request, reply) => {
120
+ const { sessionId } = request.params;
121
+ const session = demoSessions.get(sessionId);
122
+ if (!session) {
123
+ reply.code(404);
124
+ return { error: 'Session not found' };
125
+ }
126
+ const pty = demoPtys.get(sessionId);
127
+ if (pty) {
128
+ pty.kill();
129
+ demoPtys.delete(sessionId);
130
+ }
131
+ demoSessions.set(sessionId, { ...session, status: 'stopped' });
132
+ return { success: true };
133
+ });
134
+ // 获取可用的 agent 列表(带实际可用性检查)
135
+ app.get('/demo/agents', async () => {
136
+ const executorsInfo = await getAllExecutorsAvailability();
137
+ const agents = executorsInfo.map(info => ({
138
+ type: info.agentType,
139
+ name: info.displayName,
140
+ available: info.availability.type !== 'NOT_FOUND',
141
+ availabilityType: info.availability.type,
142
+ lastAuthTimestamp: info.availability.type === 'LOGIN_DETECTED'
143
+ ? info.availability.lastAuthTimestamp
144
+ : undefined,
145
+ error: info.availability.type === 'NOT_FOUND'
146
+ ? info.availability.error
147
+ : undefined,
148
+ }));
149
+ return { agents };
150
+ });
151
+ }
152
+ //# sourceMappingURL=demo.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"demo.js","sourceRoot":"","sources":["../../src/routes/demo.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ import type { FastifyInstance } from 'fastify';
2
+ export declare function filesRoutes(app: FastifyInstance): Promise<void>;
3
+ //# sourceMappingURL=files.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"files.d.ts","sourceRoot":"","sources":["../../src/routes/files.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,SAAS,CAAC;AAuK/C,wBAAsB,WAAW,CAAC,GAAG,EAAE,eAAe,iBA0KrD"}