tower-studio 0.2.42 → 0.2.44
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.
- package/.next/standalone/.next/BUILD_ID +1 -1
- package/.next/standalone/.next/app-path-routes-manifest.json +1 -0
- package/.next/standalone/.next/build-manifest.json +3 -3
- package/.next/standalone/.next/prerender-manifest.json +3 -3
- package/.next/standalone/.next/routes-manifest.json +8 -0
- package/.next/standalone/.next/server/app/_global-error.html +1 -1
- package/.next/standalone/.next/server/app/_global-error.rsc +1 -1
- package/.next/standalone/.next/server/app/_global-error.segments/__PAGE__.segment.rsc +1 -1
- package/.next/standalone/.next/server/app/_global-error.segments/_full.segment.rsc +1 -1
- package/.next/standalone/.next/server/app/_global-error.segments/_head.segment.rsc +1 -1
- package/.next/standalone/.next/server/app/_global-error.segments/_index.segment.rsc +1 -1
- package/.next/standalone/.next/server/app/_global-error.segments/_tree.segment.rsc +1 -1
- package/.next/standalone/.next/server/app/_not-found/page/react-loadable-manifest.json +3 -3
- package/.next/standalone/.next/server/app/_not-found/page/server-reference-manifest.json +35 -35
- package/.next/standalone/.next/server/app/_not-found/page.js +6 -6
- package/.next/standalone/.next/server/app/_not-found/page.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/_not-found/page_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/api/adapters/test/route.js +1 -1
- package/.next/standalone/.next/server/app/api/adapters/test/route.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/api/browse-fs/route.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/api/files/assets/[projectId]/[filename]/route.js +1 -1
- package/.next/standalone/.next/server/app/api/files/assets/[projectId]/[filename]/route.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/api/git/route.js +1 -1
- package/.next/standalone/.next/server/app/api/git/route.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/api/internal/assets/[projectId]/[filename]/route.js +1 -1
- package/.next/standalone/.next/server/app/api/internal/assets/[projectId]/[filename]/route.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/api/internal/assets/reveal/route.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/api/internal/assistant/attachments/route.js +1 -1
- package/.next/standalone/.next/server/app/api/internal/assistant/attachments/route.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/api/internal/assistant/chat/route.js +3 -3
- package/.next/standalone/.next/server/app/api/internal/assistant/chat/route.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/api/internal/assistant/route.js +2 -2
- package/.next/standalone/.next/server/app/api/internal/assistant/route.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/api/internal/assistant/sessions/route.js +1 -1
- package/.next/standalone/.next/server/app/api/internal/assistant/sessions/route.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/api/internal/backup/import/route.js +1 -1
- package/.next/standalone/.next/server/app/api/internal/backup/import/route.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/api/internal/cache/[...segments]/route.js +1 -1
- package/.next/standalone/.next/server/app/api/internal/cache/[...segments]/route.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/api/internal/hooks/install/route.js +3 -2
- package/.next/standalone/.next/server/app/api/internal/hooks/install/route.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/api/internal/hooks/session/route.js +1 -1
- package/.next/standalone/.next/server/app/api/internal/hooks/session/route.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/api/internal/hooks/stop/route.js +2 -2
- package/.next/standalone/.next/server/app/api/internal/hooks/stop/route.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/api/internal/hooks/upload/route.js +2 -2
- package/.next/standalone/.next/server/app/api/internal/hooks/upload/route.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/api/internal/monaco/[...path]/route.js +1 -1
- package/.next/standalone/.next/server/app/api/internal/monaco/[...path]/route.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/api/internal/terminal/[taskId]/buffer/route.js +1 -1
- package/.next/standalone/.next/server/app/api/internal/terminal/[taskId]/buffer/route.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/api/internal/terminal/[taskId]/input/route.js +1 -1
- package/.next/standalone/.next/server/app/api/internal/terminal/[taskId]/input/route.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/api/internal/terminal/[taskId]/paste-image/route/app-paths-manifest.json +3 -0
- package/.next/standalone/.next/server/app/api/internal/terminal/[taskId]/paste-image/route/build-manifest.json +9 -0
- package/.next/standalone/.next/server/app/api/internal/terminal/[taskId]/paste-image/route/server-reference-manifest.json +4 -0
- package/.next/standalone/.next/server/app/api/internal/terminal/[taskId]/paste-image/route.js +8 -0
- package/.next/standalone/.next/server/app/api/internal/terminal/[taskId]/paste-image/route.js.nft.json +1 -0
- package/.next/standalone/.next/server/app/api/internal/terminal/[taskId]/paste-image/route_client-reference-manifest.js +3 -0
- package/.next/standalone/.next/server/app/api/internal/terminal/[taskId]/resume/route.js +3 -3
- package/.next/standalone/.next/server/app/api/internal/terminal/[taskId]/resume/route.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/api/internal/terminal/[taskId]/start/route.js +4 -4
- package/.next/standalone/.next/server/app/api/internal/terminal/[taskId]/start/route.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/api/internal/terminal/[taskId]/stop/route.js +3 -3
- package/.next/standalone/.next/server/app/api/internal/terminal/[taskId]/stop/route.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/api/tasks/[taskId]/diff/route.js +1 -1
- package/.next/standalone/.next/server/app/api/tasks/[taskId]/diff/route.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/api/tasks/[taskId]/diff-patch/route.js +1 -1
- package/.next/standalone/.next/server/app/api/tasks/[taskId]/diff-patch/route.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/api/tasks/[taskId]/merge/route.js +4 -3
- package/.next/standalone/.next/server/app/api/tasks/[taskId]/merge/route.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/missions/page/react-loadable-manifest.json +2 -2
- package/.next/standalone/.next/server/app/missions/page/server-reference-manifest.json +76 -76
- package/.next/standalone/.next/server/app/missions/page.js +6 -6
- package/.next/standalone/.next/server/app/missions/page.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/missions/page_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/onboarding/page/react-loadable-manifest.json +3 -3
- package/.next/standalone/.next/server/app/onboarding/page/server-reference-manifest.json +35 -35
- package/.next/standalone/.next/server/app/onboarding/page.js +6 -6
- package/.next/standalone/.next/server/app/onboarding/page.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/onboarding/page_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/page/react-loadable-manifest.json +3 -3
- package/.next/standalone/.next/server/app/page/server-reference-manifest.json +35 -35
- package/.next/standalone/.next/server/app/page.js +6 -6
- package/.next/standalone/.next/server/app/page.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/page_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/settings/page/react-loadable-manifest.json +3 -3
- package/.next/standalone/.next/server/app/settings/page/server-reference-manifest.json +52 -52
- package/.next/standalone/.next/server/app/settings/page.js +6 -6
- package/.next/standalone/.next/server/app/settings/page.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/settings/page_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/workspaces/[workspaceId]/archive/page/react-loadable-manifest.json +3 -3
- package/.next/standalone/.next/server/app/workspaces/[workspaceId]/archive/page/server-reference-manifest.json +115 -115
- package/.next/standalone/.next/server/app/workspaces/[workspaceId]/archive/page.js +6 -6
- package/.next/standalone/.next/server/app/workspaces/[workspaceId]/archive/page.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/workspaces/[workspaceId]/archive/page_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/workspaces/[workspaceId]/assets/page/react-loadable-manifest.json +3 -3
- package/.next/standalone/.next/server/app/workspaces/[workspaceId]/assets/page/server-reference-manifest.json +98 -98
- package/.next/standalone/.next/server/app/workspaces/[workspaceId]/assets/page.js +6 -6
- package/.next/standalone/.next/server/app/workspaces/[workspaceId]/assets/page.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/workspaces/[workspaceId]/assets/page_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/workspaces/[workspaceId]/notes/page/react-loadable-manifest.json +3 -3
- package/.next/standalone/.next/server/app/workspaces/[workspaceId]/notes/page/server-reference-manifest.json +85 -85
- package/.next/standalone/.next/server/app/workspaces/[workspaceId]/notes/page.js +6 -6
- package/.next/standalone/.next/server/app/workspaces/[workspaceId]/notes/page.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/workspaces/[workspaceId]/notes/page_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/workspaces/[workspaceId]/page/react-loadable-manifest.json +3 -3
- package/.next/standalone/.next/server/app/workspaces/[workspaceId]/page/server-reference-manifest.json +81 -81
- package/.next/standalone/.next/server/app/workspaces/[workspaceId]/page.js +6 -6
- package/.next/standalone/.next/server/app/workspaces/[workspaceId]/page.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/workspaces/[workspaceId]/page_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/workspaces/[workspaceId]/projects/[projectId]/page/react-loadable-manifest.json +3 -3
- package/.next/standalone/.next/server/app/workspaces/[workspaceId]/projects/[projectId]/page/server-reference-manifest.json +35 -35
- package/.next/standalone/.next/server/app/workspaces/[workspaceId]/projects/[projectId]/page.js +7 -7
- package/.next/standalone/.next/server/app/workspaces/[workspaceId]/projects/[projectId]/page.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/workspaces/[workspaceId]/projects/[projectId]/page_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/workspaces/[workspaceId]/projects/[projectId]/versions/page/react-loadable-manifest.json +3 -3
- package/.next/standalone/.next/server/app/workspaces/[workspaceId]/projects/[projectId]/versions/page/server-reference-manifest.json +77 -77
- package/.next/standalone/.next/server/app/workspaces/[workspaceId]/projects/[projectId]/versions/page.js +6 -6
- package/.next/standalone/.next/server/app/workspaces/[workspaceId]/projects/[projectId]/versions/page.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/workspaces/[workspaceId]/projects/[projectId]/versions/page_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/workspaces/[workspaceId]/tasks/[taskId]/page/react-loadable-manifest.json +4 -4
- package/.next/standalone/.next/server/app/workspaces/[workspaceId]/tasks/[taskId]/page/server-reference-manifest.json +91 -91
- package/.next/standalone/.next/server/app/workspaces/[workspaceId]/tasks/[taskId]/page.js +6 -6
- package/.next/standalone/.next/server/app/workspaces/[workspaceId]/tasks/[taskId]/page.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/workspaces/[workspaceId]/tasks/[taskId]/page_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/workspaces/page/react-loadable-manifest.json +3 -3
- package/.next/standalone/.next/server/app/workspaces/page/server-reference-manifest.json +58 -58
- package/.next/standalone/.next/server/app/workspaces/page.js +6 -6
- package/.next/standalone/.next/server/app/workspaces/page.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/workspaces/page_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app-paths-manifest.json +1 -0
- package/.next/standalone/.next/server/chunks/{_0keginv._.js → 0se9_next_0cuhhky._.js} +3 -3
- package/.next/standalone/.next/server/chunks/0se9_next_dist_esm_build_templates_app-route_0gr2wxq.js +3 -0
- package/.next/standalone/.next/server/chunks/0zjb_server_app_api_internal_terminal_[taskId]_paste-image_route_actions_0iegbi4.js +3 -0
- package/.next/standalone/.next/server/chunks/[externals]__0x_wqa7._.js +3 -0
- package/.next/standalone/.next/server/chunks/[root-of-the-server]__0.p6em~._.js +3 -0
- package/.next/standalone/.next/server/chunks/[root-of-the-server]__0.zmhk-._.js +3 -0
- package/.next/standalone/.next/server/chunks/[root-of-the-server]__0042hx5._.js +3 -0
- package/.next/standalone/.next/server/chunks/{[root-of-the-server]__0b3m.jm._.js → [root-of-the-server]__03ufxqq._.js} +3 -3
- package/.next/standalone/.next/server/chunks/[root-of-the-server]__04--bs7._.js +3 -0
- package/.next/standalone/.next/server/chunks/[root-of-the-server]__04m2l8a._.js +3 -0
- package/.next/standalone/.next/server/chunks/[root-of-the-server]__04r193~._.js +3 -0
- package/.next/standalone/.next/server/chunks/[root-of-the-server]__0657y50._.js +3 -0
- package/.next/standalone/.next/server/chunks/[root-of-the-server]__06ndn7a._.js +4 -0
- package/.next/standalone/.next/server/chunks/[root-of-the-server]__08yqoti._.js +3 -0
- package/.next/standalone/.next/server/chunks/[root-of-the-server]__098.3z2._.js +3 -0
- package/.next/standalone/.next/server/chunks/[root-of-the-server]__09arklv._.js +3 -0
- package/.next/standalone/.next/server/chunks/{[root-of-the-server]__0obk~80._.js → [root-of-the-server]__0_d.s7s._.js} +3 -3
- package/.next/standalone/.next/server/chunks/{[root-of-the-server]__0askhfg._.js → [root-of-the-server]__0_zfnj0._.js} +2 -2
- package/.next/standalone/.next/server/chunks/{[root-of-the-server]__0xswbi9._.js → [root-of-the-server]__0clptds._.js} +2 -2
- package/.next/standalone/.next/server/chunks/{[root-of-the-server]__0ai09na._.js → [root-of-the-server]__0g.k9o~._.js} +2 -2
- package/.next/standalone/.next/server/chunks/[root-of-the-server]__0i34gbs._.js +4 -0
- package/.next/standalone/.next/server/chunks/[root-of-the-server]__0iggiij._.js +3 -0
- package/.next/standalone/.next/server/chunks/[root-of-the-server]__0i~3dwq._.js +3 -0
- package/.next/standalone/.next/server/chunks/[root-of-the-server]__0j1px8f._.js +3 -0
- package/.next/standalone/.next/server/chunks/[root-of-the-server]__0k-5ag7._.js +3 -0
- package/.next/standalone/.next/server/chunks/[root-of-the-server]__0l1-djp._.js +1 -1
- package/.next/standalone/.next/server/chunks/{[root-of-the-server]__0-~q463._.js → [root-of-the-server]__0lvlooo._.js} +2 -2
- package/.next/standalone/.next/server/chunks/[root-of-the-server]__0otyifi._.js +1 -1
- package/.next/standalone/.next/server/chunks/[root-of-the-server]__0pl.c5.._.js +3 -0
- package/.next/standalone/.next/server/chunks/[root-of-the-server]__0r~9.7c._.js +4 -0
- package/.next/standalone/.next/server/chunks/[root-of-the-server]__0t31ba_._.js +3 -0
- package/.next/standalone/.next/server/chunks/[root-of-the-server]__0t_weyi._.js +3 -0
- package/.next/standalone/.next/server/chunks/{[root-of-the-server]__06qz5fz._.js → [root-of-the-server]__0uptkzd._.js} +3 -3
- package/.next/standalone/.next/server/chunks/[root-of-the-server]__0x3kws1._.js +3 -0
- package/.next/standalone/.next/server/chunks/[root-of-the-server]__0xot7fu._.js +1 -1
- package/.next/standalone/.next/server/chunks/{[root-of-the-server]__0~6py0f._.js → [root-of-the-server]__0y8w5di._.js} +3 -3
- package/.next/standalone/.next/server/chunks/[root-of-the-server]__0zi3~a8._.js +3 -0
- package/.next/standalone/.next/server/chunks/[root-of-the-server]__0~g6-c~._.js +3 -0
- package/.next/standalone/.next/server/chunks/[root-of-the-server]__10fv6tt._.js +3 -0
- package/.next/standalone/.next/server/chunks/[root-of-the-server]__1189rd1._.js +4 -0
- package/.next/standalone/.next/server/chunks/{_06.mxka._.js → _0jmdgq~._.js} +1 -1
- package/.next/standalone/.next/server/chunks/{_0aflzks._.js → _0q10iet._.js} +1 -1
- package/.next/standalone/.next/server/chunks/_0qk_esg._.js +1 -1
- package/.next/standalone/.next/server/chunks/{_0b~hjvi._.js → _12537g8._.js} +1 -1
- package/.next/standalone/.next/server/chunks/{src_07gek7k._.js → src_0fq3zjg._.js} +2 -2
- package/.next/standalone/.next/server/chunks/src_0weytpz._.js +1 -1
- package/.next/standalone/.next/server/chunks/{src_0mqkaid._.js → src_0wlyw0g._.js} +2 -2
- package/.next/standalone/.next/server/chunks/{src_02ruq-1._.js → src_0~ey84y._.js} +2 -2
- package/.next/standalone/.next/server/chunks/src_actions_agent-actions_ts_10q9r5b._.js +2 -2
- package/.next/standalone/.next/server/chunks/ssr/0iu._[workspaceId]_projects_[projectId]_versions_version-timeline-client_tsx_07o_kyi._.js +1 -1
- package/.next/standalone/.next/server/chunks/ssr/{[root-of-the-server]__0mmypbn._.js → [root-of-the-server]__00ebsjb._.js} +1 -1
- package/.next/standalone/.next/server/chunks/ssr/{[root-of-the-server]__0dsaqeq._.js → [root-of-the-server]__01fmnse._.js} +2 -2
- package/.next/standalone/.next/server/chunks/ssr/[root-of-the-server]__01vm_46._.js +47 -0
- package/.next/standalone/.next/server/chunks/ssr/[root-of-the-server]__025ol9g._.js +3 -0
- package/.next/standalone/.next/server/chunks/ssr/[root-of-the-server]__049n47u._.js +3 -0
- package/.next/standalone/.next/server/chunks/ssr/{[root-of-the-server]__094t44p._.js → [root-of-the-server]__04ednzb._.js} +1 -1
- package/.next/standalone/.next/server/chunks/ssr/[root-of-the-server]__04wbr9x._.js +1 -1
- package/.next/standalone/.next/server/chunks/ssr/[root-of-the-server]__05xg05r._.js +1 -1
- package/.next/standalone/.next/server/chunks/ssr/{[root-of-the-server]__0pmjob9._.js → [root-of-the-server]__06dfcgo._.js} +1 -1
- package/.next/standalone/.next/server/chunks/ssr/{[root-of-the-server]__038u_kv._.js → [root-of-the-server]__07xkj1s._.js} +4 -4
- package/.next/standalone/.next/server/chunks/ssr/{[root-of-the-server]__0h-se8t._.js → [root-of-the-server]__081e5n~._.js} +2 -2
- package/.next/standalone/.next/server/chunks/ssr/[root-of-the-server]__08tzbfh._.js +3 -0
- package/.next/standalone/.next/server/chunks/ssr/{[root-of-the-server]__0.infp2._.js → [root-of-the-server]__0_z5hke._.js} +1 -1
- package/.next/standalone/.next/server/chunks/ssr/{[root-of-the-server]__0ce3fpq._.js → [root-of-the-server]__0ecd_1d._.js} +4 -4
- package/.next/standalone/.next/server/chunks/ssr/{[root-of-the-server]__10s67lq._.js → [root-of-the-server]__0iln7n_._.js} +4 -4
- package/.next/standalone/.next/server/chunks/ssr/{[root-of-the-server]__09z_ddd._.js → [root-of-the-server]__0j_-qk5._.js} +1 -1
- package/.next/standalone/.next/server/chunks/ssr/[root-of-the-server]__0jymb~t._.js +1 -1
- package/.next/standalone/.next/server/chunks/ssr/{[root-of-the-server]__0.u-t.1._.js → [root-of-the-server]__0k6oo0n._.js} +1 -1
- package/.next/standalone/.next/server/chunks/ssr/{[root-of-the-server]__0h589~0._.js → [root-of-the-server]__0lws68d._.js} +4 -4
- package/.next/standalone/.next/server/chunks/ssr/{[root-of-the-server]__0oq-j16._.js → [root-of-the-server]__0oamph.._.js} +4 -4
- package/.next/standalone/.next/server/chunks/ssr/{[root-of-the-server]__0pvaj~l._.js → [root-of-the-server]__0pnv7nd._.js} +1 -1
- package/.next/standalone/.next/server/chunks/ssr/{[root-of-the-server]__03fujv7._.js → [root-of-the-server]__0tja~wz._.js} +1 -1
- package/.next/standalone/.next/server/chunks/ssr/{[root-of-the-server]__0391jsv._.js → [root-of-the-server]__0ug022w._.js} +1 -1
- package/.next/standalone/.next/server/chunks/ssr/[root-of-the-server]__0ugledi._.js +3 -0
- package/.next/standalone/.next/server/chunks/ssr/{[root-of-the-server]__0whlq2_._.js → [root-of-the-server]__0vxlsec._.js} +2 -2
- package/.next/standalone/.next/server/chunks/ssr/[root-of-the-server]__0w0.sdz._.js +3 -0
- package/.next/standalone/.next/server/chunks/ssr/{[root-of-the-server]__0l6bt9t._.js → [root-of-the-server]__0x6k.ee._.js} +1 -1
- package/.next/standalone/.next/server/chunks/ssr/{[root-of-the-server]__058rbx5._.js → [root-of-the-server]__0xwzk2.._.js} +4 -4
- package/.next/standalone/.next/server/chunks/ssr/{[root-of-the-server]__12w35bx._.js → [root-of-the-server]__0yby8pl._.js} +4 -4
- package/.next/standalone/.next/server/chunks/ssr/[root-of-the-server]__0z7je5_._.js +1 -1
- package/.next/standalone/.next/server/chunks/ssr/{[root-of-the-server]__0rckee~._.js → [root-of-the-server]__0zxc81t._.js} +1 -1
- package/.next/standalone/.next/server/chunks/ssr/{[root-of-the-server]__02j1enz._.js → [root-of-the-server]__0zzqn5z._.js} +1 -1
- package/.next/standalone/.next/server/chunks/ssr/{[root-of-the-server]__0mq0f94._.js → [root-of-the-server]__10c.a3u._.js} +1 -1
- package/.next/standalone/.next/server/chunks/ssr/{[root-of-the-server]__0.2h0ux._.js → [root-of-the-server]__10n3vn6._.js} +1 -1
- package/.next/standalone/.next/server/chunks/ssr/{[root-of-the-server]__09t~p.u._.js → [root-of-the-server]__123rmyb._.js} +1 -1
- package/.next/standalone/.next/server/chunks/ssr/[root-of-the-server]__124zb~p._.js +30 -0
- package/.next/standalone/.next/server/chunks/ssr/{[root-of-the-server]__0dux7x.._.js → [root-of-the-server]__127w3bm._.js} +1 -1
- package/.next/standalone/.next/server/chunks/ssr/{[root-of-the-server]__0odeai5._.js → [root-of-the-server]__13ce7v2._.js} +1 -1
- package/.next/standalone/.next/server/chunks/ssr/_0-~9em3._.js +1 -1
- package/.next/standalone/.next/server/chunks/ssr/{_0axcfvf._.js → _02vz78l._.js} +2 -2
- package/.next/standalone/.next/server/chunks/ssr/{_0c2gong._.js → _04~mjmb._.js} +2 -2
- package/.next/standalone/.next/server/chunks/ssr/{_03lt1_x._.js → _05a2u03._.js} +4 -4
- package/.next/standalone/.next/server/chunks/ssr/{_09z2zmm._.js → _060e1u.._.js} +1 -1
- package/.next/standalone/.next/server/chunks/ssr/_070t_mh._.js +2 -2
- package/.next/standalone/.next/server/chunks/ssr/{_0n4bq0m._.js → _07lq-bp._.js} +1 -1
- package/.next/standalone/.next/server/chunks/ssr/{_0p6p_68._.js → _07q06~v._.js} +4 -4
- package/.next/standalone/.next/server/chunks/ssr/{_0mm~wxj._.js → _08-x_rp._.js} +1 -1
- package/.next/standalone/.next/server/chunks/ssr/_08bq4g8._.js +1 -1
- package/.next/standalone/.next/server/chunks/ssr/{_0~oc5bl._.js → _0_nhdgs._.js} +2 -2
- package/.next/standalone/.next/server/chunks/ssr/{_12ca88g._.js → _0_q41~z._.js} +4 -4
- package/.next/standalone/.next/server/chunks/ssr/_0cj9a7y._.js +1 -1
- package/.next/standalone/.next/server/chunks/ssr/{_0u7c6bz._.js → _0dxbp89._.js} +4 -4
- package/.next/standalone/.next/server/chunks/ssr/{_0rq68d8._.js → _0foto06._.js} +2 -2
- package/.next/standalone/.next/server/chunks/ssr/{_0_5abui._.js → _0i4xdso._.js} +2 -2
- package/.next/standalone/.next/server/chunks/ssr/{_0n5do.z._.js → _0j5.ig_._.js} +1 -1
- package/.next/standalone/.next/server/chunks/ssr/{_0m.wslt._.js → _0kojxno._.js} +2 -2
- package/.next/standalone/.next/server/chunks/ssr/{_0py1s-f._.js → _0nze-e6._.js} +1 -1
- package/.next/standalone/.next/server/chunks/ssr/{_0u.n7v8._.js → _0r4_qn~._.js} +2 -2
- package/.next/standalone/.next/server/chunks/ssr/_0rdyrfd._.js +1 -1
- package/.next/standalone/.next/server/chunks/ssr/{_0q2mf9q._.js → _0rtydyv._.js} +1 -1
- package/.next/standalone/.next/server/chunks/ssr/_0rxeqmo._.js +1 -1
- package/.next/standalone/.next/server/chunks/ssr/{_04bt0.3._.js → _0s.h4l2._.js} +1 -1
- package/.next/standalone/.next/server/chunks/ssr/{_0tvm5af._.js → _0s.ik0k._.js} +1 -1
- package/.next/standalone/.next/server/chunks/ssr/{_0f~l8kv._.js → _0u3yt.5._.js} +3 -3
- package/.next/standalone/.next/server/chunks/ssr/_0wbcp88._.js +1 -1
- package/.next/standalone/.next/server/chunks/ssr/{_04~zqvy._.js → _0wqcz3w._.js} +4 -4
- package/.next/standalone/.next/server/chunks/ssr/{_0whlnt7._.js → _0ye1-r-._.js} +2 -2
- package/.next/standalone/.next/server/chunks/ssr/{_116-_2z._.js → _0zr81mw._.js} +2 -2
- package/.next/standalone/.next/server/chunks/ssr/{_0rrzd20._.js → _113957g._.js} +1 -1
- package/.next/standalone/.next/server/chunks/ssr/{_0o2tntr._.js → _11osha9._.js} +2 -2
- package/.next/standalone/.next/server/chunks/ssr/src_0djxlqx._.js +1 -1
- package/.next/standalone/.next/server/chunks/ssr/src_0eufeyj._.js +1 -1
- package/.next/standalone/.next/server/chunks/ssr/src_actions_agent-actions_ts_0~wc.sy._.js +1 -1
- package/.next/standalone/.next/server/chunks/ssr/src_actions_file-actions_ts_0gcvqwm._.js +1 -1
- package/.next/standalone/.next/server/chunks/ssr/src_app_missions_missions-client_tsx_11429lj._.js +1 -1
- package/.next/standalone/.next/server/chunks/ssr/src_app_onboarding_page_tsx_0xf7hpz._.js +1 -1
- package/.next/standalone/.next/server/chunks/ssr/src_app_settings_page_tsx_0h9v7dr._.js +1 -1
- package/.next/standalone/.next/server/chunks/ssr/src_app_workspaces_[workspaceId]_assets_assets-page-client_tsx_0wyzpam._.js +1 -1
- package/.next/standalone/.next/server/chunks/ssr/src_app_workspaces_[workspaceId]_board-page-client_tsx_0gips66._.js +1 -1
- package/.next/standalone/.next/server/chunks/ssr/src_app_workspaces_[workspaceId]_notes_notes-page-client_tsx_10gyo3v._.js +1 -1
- package/.next/standalone/.next/server/chunks/ssr/src_app_workspaces_[workspaceId]_tasks_[taskId]_task-page-client_tsx_02t7blt._.js +1 -1
- package/.next/standalone/.next/server/chunks/ssr/src_components_ui_select_tsx_0d2ra01._.js +1 -1
- package/.next/standalone/.next/server/chunks/ssr/{src_lib_0_9avpk._.js → src_lib_0.~.oo-._.js} +1 -1
- package/.next/standalone/.next/server/chunks/ssr/{src_lib_08wv1le._.js → src_lib_005uqbe._.js} +1 -1
- package/.next/standalone/.next/server/chunks/ssr/{src_lib_02~3_5t._.js → src_lib_00wjv6n._.js} +1 -1
- package/.next/standalone/.next/server/chunks/ssr/{src_lib_04d~c.c._.js → src_lib_01sr8_t._.js} +1 -1
- package/.next/standalone/.next/server/chunks/ssr/src_lib_08jql1e._.js +3 -0
- package/.next/standalone/.next/server/chunks/ssr/src_lib_0b~j-9d._.js +3 -0
- package/.next/standalone/.next/server/chunks/ssr/src_lib_0eymyjf._.js +3 -0
- package/.next/standalone/.next/server/chunks/ssr/src_lib_0fkv9z3._.js +3 -0
- package/.next/standalone/.next/server/chunks/ssr/src_lib_0n-n0.a._.js +3 -0
- package/.next/standalone/.next/server/chunks/ssr/src_lib_0sgt~lv._.js +3 -0
- package/.next/standalone/.next/server/chunks/ssr/src_lib_0x-iyl1._.js +3 -0
- package/.next/standalone/.next/server/chunks/ssr/src_lib_0yjmty1._.js +3 -0
- package/.next/standalone/.next/server/chunks/ssr/src_lib_13aevv6._.js +3 -0
- package/.next/standalone/.next/server/chunks/ssr/src_lib_worktree_ts_06cucy3._.js +1 -1
- package/.next/standalone/.next/server/functions-config-manifest.json +1 -0
- package/.next/standalone/.next/server/middleware-build-manifest.js +3 -3
- package/.next/standalone/.next/server/pages/500.html +1 -1
- package/.next/standalone/.next/server/server-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/server-reference-manifest.json +327 -327
- package/.next/standalone/.next/static/chunks/0-tuek2jqf0el.js +1 -0
- package/.next/standalone/.next/static/chunks/0.-.jc~0b~hy0.js +1 -0
- package/.next/standalone/.next/static/chunks/{0.onaugl2w8ci.js → 0.~03w.uxge40.js} +1 -1
- package/.next/standalone/.next/static/chunks/01hdj_kw4z2zq.js +2 -0
- package/.next/standalone/.next/static/chunks/01j9m895w64zn.js +1 -0
- package/.next/standalone/.next/static/chunks/{040j8d.w8mkyn.js → 0346xrw6i2bwo.js} +1 -1
- package/.next/standalone/.next/static/chunks/{0x-ug4iz~~qr2.js → 041o.dh2lc-k3.js} +1 -1
- package/.next/standalone/.next/static/chunks/07i9j5yyg4vs3.js +1 -0
- package/.next/standalone/.next/static/chunks/{0bdwzhoelky9-.js → 08ooaq~-.8fzu.js} +1 -1
- package/.next/standalone/.next/static/chunks/{13.3woq55msp..js → 0bylodlncwfpb.js} +1 -1
- package/.next/standalone/.next/static/chunks/0cpwtqzrjdgvs.js +1 -0
- package/.next/standalone/.next/static/chunks/0c~e1-nst-ze-.js +1 -0
- package/.next/standalone/.next/static/chunks/0ddt-snh45031.js +1 -0
- package/.next/standalone/.next/static/chunks/{0ypd9eqm_pj-o.js → 0dv4anj-j523o.js} +1 -1
- package/.next/standalone/.next/static/chunks/{0.wxa05y455w7.js → 0gvfb.b8m_i8t.js} +1 -1
- package/.next/standalone/.next/static/chunks/{0dewfthzwmcwb.js → 0h77-u2vvr-a1.js} +1 -1
- package/.next/standalone/.next/static/chunks/{0_d04kox03m72.css → 0jrje~1gt6w85.css} +1 -1
- package/.next/standalone/.next/static/chunks/{0m~m1~si.ot17.js → 0lqp~-dlfenad.js} +1 -1
- package/.next/standalone/.next/static/chunks/0qkr26yz3bocs.js +1 -0
- package/.next/standalone/.next/static/chunks/{035a_v6g7ioyw.js → 0rcuiuax31_uh.js} +1 -1
- package/.next/standalone/.next/static/chunks/0uf~7eqel0zra.js +1 -0
- package/.next/standalone/.next/static/chunks/{0rozlwh3y46l0.js → 0uj-3ckujwaiy.js} +1 -1
- package/.next/standalone/.next/static/chunks/0w71r_sj_fibx.js +1 -0
- package/.next/standalone/.next/static/chunks/0xejm4ge9~cn..js +1 -0
- package/.next/standalone/.next/static/chunks/{02f8-ju2se8qw.js → 0xg6rcq6g4bbh.js} +1 -1
- package/.next/standalone/.next/static/chunks/0yff8rwmrl5m4.js +1 -0
- package/.next/standalone/.next/static/chunks/{0wcwdbtpm0~r6.js → 0ymipmkk2uqby.js} +1 -1
- package/.next/standalone/.next/static/chunks/0znfclapbniaa.js +1 -0
- package/.next/standalone/.next/static/chunks/{17fug-zaik-v~.js → 11pe3kpxuj33f.js} +1 -1
- package/.next/standalone/.next/static/chunks/172s9cg35qt7i.js +1 -0
- package/.next/standalone/.next/static/chunks/184-zu89wwa4u.js +1 -0
- package/.next/standalone/package.json +9 -9
- package/dist/mcp-server.cjs +152 -76
- package/next.config.ts +4 -0
- package/package.json +9 -9
- package/skills/tower/SKILL.md +6 -0
- package/.next/standalone/.next/server/chunks/[externals]__0izylsq._.js +0 -3
- package/.next/standalone/.next/server/chunks/[externals]__0m6hc.0._.js +0 -3
- package/.next/standalone/.next/server/chunks/[root-of-the-server]__0.tbb~k._.js +0 -3
- package/.next/standalone/.next/server/chunks/[root-of-the-server]__032d9pl._.js +0 -3
- package/.next/standalone/.next/server/chunks/[root-of-the-server]__04jduyo._.js +0 -3
- package/.next/standalone/.next/server/chunks/[root-of-the-server]__05zlbau._.js +0 -4
- package/.next/standalone/.next/server/chunks/[root-of-the-server]__05~g1fm._.js +0 -3
- package/.next/standalone/.next/server/chunks/[root-of-the-server]__075f7rs._.js +0 -4
- package/.next/standalone/.next/server/chunks/[root-of-the-server]__08b~~wj._.js +0 -3
- package/.next/standalone/.next/server/chunks/[root-of-the-server]__0bo_6v~._.js +0 -3
- package/.next/standalone/.next/server/chunks/[root-of-the-server]__0c7z.~a._.js +0 -3
- package/.next/standalone/.next/server/chunks/[root-of-the-server]__0e~6fr~._.js +0 -3
- package/.next/standalone/.next/server/chunks/[root-of-the-server]__0fey.8j._.js +0 -3
- package/.next/standalone/.next/server/chunks/[root-of-the-server]__0fxmnch._.js +0 -4
- package/.next/standalone/.next/server/chunks/[root-of-the-server]__0gr~8aq._.js +0 -3
- package/.next/standalone/.next/server/chunks/[root-of-the-server]__0hd.0to._.js +0 -3
- package/.next/standalone/.next/server/chunks/[root-of-the-server]__0j3l3l4._.js +0 -3
- package/.next/standalone/.next/server/chunks/[root-of-the-server]__0r-6wmj._.js +0 -3
- package/.next/standalone/.next/server/chunks/[root-of-the-server]__0rpck4h._.js +0 -3
- package/.next/standalone/.next/server/chunks/[root-of-the-server]__0skk0fd._.js +0 -3
- package/.next/standalone/.next/server/chunks/[root-of-the-server]__0t_yyy8._.js +0 -3
- package/.next/standalone/.next/server/chunks/[root-of-the-server]__0v2nkck._.js +0 -3
- package/.next/standalone/.next/server/chunks/[root-of-the-server]__0z20rmt._.js +0 -3
- package/.next/standalone/.next/server/chunks/[root-of-the-server]__11l3gud._.js +0 -3
- package/.next/standalone/.next/server/chunks/[root-of-the-server]__126b53k._.js +0 -4
- package/.next/standalone/.next/server/chunks/ssr/[root-of-the-server]__0.-z9ts._.js +0 -3
- package/.next/standalone/.next/server/chunks/ssr/[root-of-the-server]__045k323._.js +0 -3
- package/.next/standalone/.next/server/chunks/ssr/[root-of-the-server]__087pocz._.js +0 -3
- package/.next/standalone/.next/server/chunks/ssr/[root-of-the-server]__0c2mh1c._.js +0 -47
- package/.next/standalone/.next/server/chunks/ssr/[root-of-the-server]__0gt5dbj._.js +0 -3
- package/.next/standalone/.next/server/chunks/ssr/[root-of-the-server]__0ni-_7_._.js +0 -30
- package/.next/standalone/.next/server/chunks/ssr/[root-of-the-server]__0y~ooou._.js +0 -3
- package/.next/standalone/.next/server/chunks/ssr/src_lib_0a60u40._.js +0 -3
- package/.next/standalone/.next/server/chunks/ssr/src_lib_0fu5szn._.js +0 -3
- package/.next/standalone/.next/server/chunks/ssr/src_lib_0gve57o._.js +0 -3
- package/.next/standalone/.next/server/chunks/ssr/src_lib_0koe0p0._.js +0 -3
- package/.next/standalone/.next/server/chunks/ssr/src_lib_0qdh-v4._.js +0 -3
- package/.next/standalone/.next/server/chunks/ssr/src_lib_0ramp4w._.js +0 -3
- package/.next/standalone/.next/server/chunks/ssr/src_lib_0sn1z-s._.js +0 -3
- package/.next/standalone/.next/server/chunks/ssr/src_lib_0x6grav._.js +0 -3
- package/.next/standalone/.next/server/chunks/ssr/src_lib_110am8v._.js +0 -3
- package/.next/standalone/.next/static/chunks/0-efd~h5j2ufi.js +0 -1
- package/.next/standalone/.next/static/chunks/0.z171pzeg-.7.js +0 -1
- package/.next/standalone/.next/static/chunks/01zlxs4rl~h_o.js +0 -1
- package/.next/standalone/.next/static/chunks/0af7afat3acfx.js +0 -1
- package/.next/standalone/.next/static/chunks/0ais32-8.3wlj.js +0 -1
- package/.next/standalone/.next/static/chunks/0f43x~jzb70f4.js +0 -1
- package/.next/standalone/.next/static/chunks/0i-x__600fys6.js +0 -1
- package/.next/standalone/.next/static/chunks/0l25d0nc5ygyd.js +0 -1
- package/.next/standalone/.next/static/chunks/0lyq0-a32.15m.js +0 -1
- package/.next/standalone/.next/static/chunks/0t8lz62rmr801.js +0 -2
- package/.next/standalone/.next/static/chunks/0utrquxfg25b2.js +0 -1
- package/.next/standalone/.next/static/chunks/0wcdxs4sl-gjf.js +0 -1
- package/.next/standalone/.next/static/chunks/0xj6v_80hlyv0.js +0 -1
- package/.next/standalone/.next/static/chunks/0xl7h5fsfc7zk.js +0 -1
- package/.next/standalone/.next/static/chunks/115ae91fq~slq.js +0 -1
- package/.next/standalone/.next/static/chunks/13rq33eiffqaz.js +0 -1
- /package/.next/standalone/.next/static/{LCBoYZWhXzs8PjuBmxw7g → dinNvsaC6aoPK_B7ZTeBv}/_buildManifest.js +0 -0
- /package/.next/standalone/.next/static/{LCBoYZWhXzs8PjuBmxw7g → dinNvsaC6aoPK_B7ZTeBv}/_clientMiddlewareManifest.js +0 -0
- /package/.next/standalone/.next/static/{LCBoYZWhXzs8PjuBmxw7g → dinNvsaC6aoPK_B7ZTeBv}/_ssgManifest.js +0 -0
package/dist/mcp-server.cjs
CHANGED
|
@@ -14347,14 +14347,64 @@ var init_zod = __esm({
|
|
|
14347
14347
|
}
|
|
14348
14348
|
});
|
|
14349
14349
|
|
|
14350
|
+
// src/lib/tower-dir.ts
|
|
14351
|
+
function getTowerDir() {
|
|
14352
|
+
if (_dir) return _dir;
|
|
14353
|
+
_dir = process.env.TOWER_DATA_DIR || (0, import_node_path2.join)((0, import_node_os2.homedir)(), ".tower");
|
|
14354
|
+
if (!(0, import_node_fs.existsSync)(_dir)) {
|
|
14355
|
+
(0, import_node_fs.mkdirSync)(_dir, { recursive: true });
|
|
14356
|
+
}
|
|
14357
|
+
return _dir;
|
|
14358
|
+
}
|
|
14359
|
+
function getDatabaseDir() {
|
|
14360
|
+
const dir = (0, import_node_path2.join)(getTowerDir(), "database");
|
|
14361
|
+
if (!(0, import_node_fs.existsSync)(dir)) (0, import_node_fs.mkdirSync)(dir, { recursive: true });
|
|
14362
|
+
return dir;
|
|
14363
|
+
}
|
|
14364
|
+
function getTowerDbFilePath() {
|
|
14365
|
+
const root = process.env.TOWER_DATA_DIR || (0, import_node_path2.join)((0, import_node_os2.homedir)(), ".tower");
|
|
14366
|
+
return (0, import_node_path2.join)(root, "database", "tower.db");
|
|
14367
|
+
}
|
|
14368
|
+
function getDefaultStorageDir() {
|
|
14369
|
+
return (0, import_node_path2.join)(getTowerDir(), "storage");
|
|
14370
|
+
}
|
|
14371
|
+
function getStoragePointerFile() {
|
|
14372
|
+
return (0, import_node_path2.join)(getTowerDir(), "storage-location");
|
|
14373
|
+
}
|
|
14374
|
+
function readStoragePointer() {
|
|
14375
|
+
try {
|
|
14376
|
+
const p2 = (0, import_node_fs.readFileSync)(getStoragePointerFile(), "utf-8").trim();
|
|
14377
|
+
return p2.length > 0 ? p2 : null;
|
|
14378
|
+
} catch {
|
|
14379
|
+
return null;
|
|
14380
|
+
}
|
|
14381
|
+
}
|
|
14382
|
+
function getStorageDir() {
|
|
14383
|
+
const override = process.env.TOWER_STORAGE_DIR || readStoragePointer();
|
|
14384
|
+
const dir = override && override.length > 0 ? override : getDefaultStorageDir();
|
|
14385
|
+
if (!(0, import_node_fs.existsSync)(dir)) (0, import_node_fs.mkdirSync)(dir, { recursive: true });
|
|
14386
|
+
return dir;
|
|
14387
|
+
}
|
|
14388
|
+
var import_node_path2, import_node_os2, import_node_fs, _dir;
|
|
14389
|
+
var init_tower_dir = __esm({
|
|
14390
|
+
"src/lib/tower-dir.ts"() {
|
|
14391
|
+
"use strict";
|
|
14392
|
+
import_node_path2 = require("node:path");
|
|
14393
|
+
import_node_os2 = require("node:os");
|
|
14394
|
+
import_node_fs = require("node:fs");
|
|
14395
|
+
}
|
|
14396
|
+
});
|
|
14397
|
+
|
|
14350
14398
|
// src/lib/db.ts
|
|
14351
14399
|
var import_client2, globalForPrisma, db2;
|
|
14352
14400
|
var init_db = __esm({
|
|
14353
14401
|
"src/lib/db.ts"() {
|
|
14354
14402
|
"use strict";
|
|
14355
14403
|
import_client2 = require("@prisma/client");
|
|
14404
|
+
init_tower_dir();
|
|
14356
14405
|
globalForPrisma = globalThis;
|
|
14357
14406
|
db2 = globalForPrisma.prisma ?? new import_client2.PrismaClient({
|
|
14407
|
+
datasourceUrl: `file:${getTowerDbFilePath()}`,
|
|
14358
14408
|
log: []
|
|
14359
14409
|
});
|
|
14360
14410
|
if (process.env.NODE_ENV !== "production") globalForPrisma.prisma = db2;
|
|
@@ -26323,7 +26373,24 @@ async function removeWorktree(localPathRaw, taskId) {
|
|
|
26323
26373
|
);
|
|
26324
26374
|
}
|
|
26325
26375
|
}
|
|
26326
|
-
|
|
26376
|
+
function isTowerLinkedDir(relPath, worktreeRoot) {
|
|
26377
|
+
const cleaned = relPath.replace(/[/\\]+$/, "");
|
|
26378
|
+
const base = import_path.default.basename(cleaned);
|
|
26379
|
+
if (!WORKTREE_LINKED_DIRS.includes(base)) return false;
|
|
26380
|
+
try {
|
|
26381
|
+
return (0, import_fs.lstatSync)(import_path.default.join(worktreeRoot, cleaned)).isSymbolicLink();
|
|
26382
|
+
} catch {
|
|
26383
|
+
return false;
|
|
26384
|
+
}
|
|
26385
|
+
}
|
|
26386
|
+
function stripTowerLinkedStatus(porcelainLines, worktreeRoot) {
|
|
26387
|
+
return porcelainLines.filter((line) => {
|
|
26388
|
+
if (!line.startsWith("??")) return true;
|
|
26389
|
+
const relPath = line.slice(2).trim();
|
|
26390
|
+
return !isTowerLinkedDir(relPath, worktreeRoot);
|
|
26391
|
+
});
|
|
26392
|
+
}
|
|
26393
|
+
var import_child_process, import_fs, import_path, import_os, WORKTREE_LINKED_DIRS;
|
|
26327
26394
|
var init_worktree = __esm({
|
|
26328
26395
|
"src/lib/worktree.ts"() {
|
|
26329
26396
|
"use strict";
|
|
@@ -26332,6 +26399,7 @@ var init_worktree = __esm({
|
|
|
26332
26399
|
import_path = __toESM(require("path"));
|
|
26333
26400
|
import_os = __toESM(require("os"));
|
|
26334
26401
|
init_logger();
|
|
26402
|
+
WORKTREE_LINKED_DIRS = ["node_modules", ".next"];
|
|
26335
26403
|
}
|
|
26336
26404
|
});
|
|
26337
26405
|
|
|
@@ -26592,7 +26660,7 @@ function isWindows(platform = process.platform) {
|
|
|
26592
26660
|
return platform === "win32";
|
|
26593
26661
|
}
|
|
26594
26662
|
function normalizePath(p2, platform = process.platform) {
|
|
26595
|
-
const normalized =
|
|
26663
|
+
const normalized = import_node_path3.default.normalize(p2);
|
|
26596
26664
|
if (isWindows(platform)) {
|
|
26597
26665
|
return normalized.replace(/\//g, "\\");
|
|
26598
26666
|
}
|
|
@@ -26643,16 +26711,16 @@ async function resolveCommandPath(command, opts = {}) {
|
|
|
26643
26711
|
const platform = opts.platform ?? process.platform;
|
|
26644
26712
|
const hasPathSeparator = command.includes("/") || command.includes("\\");
|
|
26645
26713
|
if (hasPathSeparator) {
|
|
26646
|
-
const absolute =
|
|
26714
|
+
const absolute = import_node_path3.default.isAbsolute(command) ? command : import_node_path3.default.resolve(cwd, command);
|
|
26647
26715
|
return await pathExists(absolute, platform) ? absolute : null;
|
|
26648
26716
|
}
|
|
26649
26717
|
const pathValue = env.PATH ?? env.Path ?? "";
|
|
26650
26718
|
const delimiter = isWindows(platform) ? ";" : ":";
|
|
26651
26719
|
const dirs = pathValue.split(delimiter).filter(Boolean);
|
|
26652
26720
|
const exts = isWindows(platform) ? windowsPathExts(env) : [""];
|
|
26653
|
-
const hasExtension = isWindows(platform) &&
|
|
26721
|
+
const hasExtension = isWindows(platform) && import_node_path3.default.extname(command).length > 0;
|
|
26654
26722
|
for (const dir of dirs) {
|
|
26655
|
-
const candidates = isWindows(platform) ? hasExtension ? [
|
|
26723
|
+
const candidates = isWindows(platform) ? hasExtension ? [import_node_path3.default.join(dir, command)] : exts.map((ext) => import_node_path3.default.join(dir, `${command}${ext}`)) : [import_node_path3.default.join(dir, command)];
|
|
26656
26724
|
for (const candidate of candidates) {
|
|
26657
26725
|
if (await pathExists(candidate, platform)) return candidate;
|
|
26658
26726
|
}
|
|
@@ -26660,7 +26728,7 @@ async function resolveCommandPath(command, opts = {}) {
|
|
|
26660
26728
|
return null;
|
|
26661
26729
|
}
|
|
26662
26730
|
function resolveCommandPathSync(command, platform = process.platform, exec = defaultExecSync) {
|
|
26663
|
-
if (
|
|
26731
|
+
if (import_node_path3.default.extname(command) || command.includes("/") || command.includes("\\")) {
|
|
26664
26732
|
return command;
|
|
26665
26733
|
}
|
|
26666
26734
|
if (!isWindows(platform)) {
|
|
@@ -26687,13 +26755,13 @@ function resolveCommandPathSync(command, platform = process.platform, exec = def
|
|
|
26687
26755
|
}
|
|
26688
26756
|
function resolveSdkExecutable(command, platform = process.platform, readFile2 = (p2) => (0, import_node_fs2.readFileSync)(p2, "utf-8"), fileExists = (p2) => (0, import_node_fs2.existsSync)(p2)) {
|
|
26689
26757
|
if (!isWindows(platform)) return command;
|
|
26690
|
-
const ext =
|
|
26758
|
+
const ext = import_node_path3.default.extname(command).toLowerCase();
|
|
26691
26759
|
if (ext !== ".cmd" && ext !== ".bat") return command;
|
|
26692
|
-
const dir =
|
|
26760
|
+
const dir = import_node_path3.default.win32.dirname(command);
|
|
26693
26761
|
let shimSnippet = "";
|
|
26694
26762
|
const expand = (raw) => {
|
|
26695
26763
|
const p2 = raw.replace(/%~?dp0%/gi, dir).replace(/\//g, "\\");
|
|
26696
|
-
return
|
|
26764
|
+
return import_node_path3.default.win32.isAbsolute(p2) ? import_node_path3.default.win32.normalize(p2) : import_node_path3.default.win32.resolve(dir, p2);
|
|
26697
26765
|
};
|
|
26698
26766
|
try {
|
|
26699
26767
|
const shim = readFile2(command);
|
|
@@ -26706,17 +26774,17 @@ function resolveSdkExecutable(command, platform = process.platform, readFile2 =
|
|
|
26706
26774
|
}
|
|
26707
26775
|
for (const m2 of shim.matchAll(/"([^"]*\.exe)"/gi)) {
|
|
26708
26776
|
const resolved = expand(m2[1]);
|
|
26709
|
-
if (
|
|
26777
|
+
if (import_node_path3.default.win32.basename(resolved).toLowerCase() === "node.exe") continue;
|
|
26710
26778
|
if (fileExists(resolved)) return resolved;
|
|
26711
26779
|
}
|
|
26712
26780
|
} catch (e2) {
|
|
26713
26781
|
console.error(`[resolveSdkExecutable] shim read failed: ${e2 instanceof Error ? e2.message : e2}`);
|
|
26714
26782
|
}
|
|
26715
|
-
const pkgDir =
|
|
26716
|
-
const base =
|
|
26783
|
+
const pkgDir = import_node_path3.default.win32.join(dir, "node_modules", "@anthropic-ai", "claude-code");
|
|
26784
|
+
const base = import_node_path3.default.win32.basename(command, import_node_path3.default.win32.extname(command));
|
|
26717
26785
|
const guesses = [
|
|
26718
|
-
|
|
26719
|
-
|
|
26786
|
+
import_node_path3.default.win32.join(pkgDir, "cli.js"),
|
|
26787
|
+
import_node_path3.default.win32.join(pkgDir, "bin", `${base}.exe`)
|
|
26720
26788
|
];
|
|
26721
26789
|
for (const g10 of guesses) {
|
|
26722
26790
|
if (fileExists(g10)) return g10;
|
|
@@ -26748,7 +26816,7 @@ function wrapForPlatform(executable, args, env, platform) {
|
|
|
26748
26816
|
if (!isWindows(platform)) {
|
|
26749
26817
|
return { command: executable, args };
|
|
26750
26818
|
}
|
|
26751
|
-
const ext =
|
|
26819
|
+
const ext = import_node_path3.default.extname(executable).toLowerCase();
|
|
26752
26820
|
if (ext === ".cmd" || ext === ".bat" || ext === ".com") {
|
|
26753
26821
|
const shell = env.ComSpec || "cmd.exe";
|
|
26754
26822
|
const commandLine = [quoteForCmd(executable), ...args.map(quoteForCmd)].join(" ");
|
|
@@ -26782,7 +26850,7 @@ async function detectUnixShells() {
|
|
|
26782
26850
|
const line = raw.replace(/#.*/, "").trim();
|
|
26783
26851
|
if (!line || !line.startsWith("/")) continue;
|
|
26784
26852
|
if (!await pathExists(line)) continue;
|
|
26785
|
-
let name =
|
|
26853
|
+
let name = import_node_path3.default.basename(line);
|
|
26786
26854
|
const count = seen.get(name) ?? 0;
|
|
26787
26855
|
seen.set(name, count + 1);
|
|
26788
26856
|
if (count > 0) name = `${name} (${count + 1})`;
|
|
@@ -26793,7 +26861,7 @@ async function detectUnixShells() {
|
|
|
26793
26861
|
const defaults = ["/bin/zsh", "/bin/bash", "/bin/sh"];
|
|
26794
26862
|
const shells = [];
|
|
26795
26863
|
for (const p2 of defaults) {
|
|
26796
|
-
if (await pathExists(p2)) shells.push({ name:
|
|
26864
|
+
if (await pathExists(p2)) shells.push({ name: import_node_path3.default.basename(p2), path: p2 });
|
|
26797
26865
|
}
|
|
26798
26866
|
return shells;
|
|
26799
26867
|
}
|
|
@@ -26803,28 +26871,28 @@ async function detectWindowsShells() {
|
|
|
26803
26871
|
const gitBashCandidates = [];
|
|
26804
26872
|
const gitPath = await resolveCommandPath("git", { platform: "win32" });
|
|
26805
26873
|
if (gitPath) {
|
|
26806
|
-
const gitRoot =
|
|
26874
|
+
const gitRoot = import_node_path3.default.resolve(import_node_path3.default.dirname(gitPath), "..", "..");
|
|
26807
26875
|
gitBashCandidates.push(
|
|
26808
|
-
|
|
26809
|
-
|
|
26876
|
+
import_node_path3.default.join(gitRoot, "bin", "bash.exe"),
|
|
26877
|
+
import_node_path3.default.join(gitRoot, "usr", "bin", "bash.exe")
|
|
26810
26878
|
);
|
|
26811
26879
|
}
|
|
26812
26880
|
const programDirs = [
|
|
26813
26881
|
process.env.ProgramW6432,
|
|
26814
26882
|
process.env.ProgramFiles,
|
|
26815
26883
|
process.env["ProgramFiles(x86)"],
|
|
26816
|
-
process.env.LocalAppData ?
|
|
26884
|
+
process.env.LocalAppData ? import_node_path3.default.join(process.env.LocalAppData, "Programs") : null
|
|
26817
26885
|
].filter(Boolean);
|
|
26818
26886
|
for (const dir of programDirs) {
|
|
26819
26887
|
gitBashCandidates.push(
|
|
26820
|
-
|
|
26821
|
-
|
|
26888
|
+
import_node_path3.default.join(dir, "Git", "bin", "bash.exe"),
|
|
26889
|
+
import_node_path3.default.join(dir, "Git", "usr", "bin", "bash.exe")
|
|
26822
26890
|
);
|
|
26823
26891
|
}
|
|
26824
26892
|
const home = process.env.USERPROFILE ?? "";
|
|
26825
26893
|
if (home) {
|
|
26826
26894
|
gitBashCandidates.push(
|
|
26827
|
-
|
|
26895
|
+
import_node_path3.default.join(home, "scoop", "apps", "git", "current", "bin", "bash.exe")
|
|
26828
26896
|
);
|
|
26829
26897
|
}
|
|
26830
26898
|
if (process.env.CLAUDE_CODE_GIT_BASH_PATH) {
|
|
@@ -26841,11 +26909,11 @@ async function detectWindowsShells() {
|
|
|
26841
26909
|
shells.push({ name: "PowerShell", path: pwshPath });
|
|
26842
26910
|
}
|
|
26843
26911
|
const winDir = process.env.windir ?? "C:\\WINDOWS";
|
|
26844
|
-
const legacyPs =
|
|
26912
|
+
const legacyPs = import_node_path3.default.join(winDir, "System32", "WindowsPowerShell", "v1.0", "powershell.exe");
|
|
26845
26913
|
if (await pathExists(legacyPs, "win32")) {
|
|
26846
26914
|
shells.push({ name: "Windows PowerShell", path: legacyPs });
|
|
26847
26915
|
}
|
|
26848
|
-
const cmd = process.env.ComSpec ??
|
|
26916
|
+
const cmd = process.env.ComSpec ?? import_node_path3.default.join(winDir, "System32", "cmd.exe");
|
|
26849
26917
|
if (await pathExists(cmd, "win32")) {
|
|
26850
26918
|
shells.push({ name: "Command Prompt", path: cmd });
|
|
26851
26919
|
}
|
|
@@ -26898,13 +26966,13 @@ async function detectEditors(platform = process.platform) {
|
|
|
26898
26966
|
}
|
|
26899
26967
|
return results;
|
|
26900
26968
|
}
|
|
26901
|
-
var import_node_fs2, import_node_child_process,
|
|
26969
|
+
var import_node_fs2, import_node_child_process, import_node_path3, CLAUDE_NESTING_VARS, SENSITIVE_KEY_RE, defaultExecSync, MAC_TERMINAL_APPS, KNOWN_EDITORS, EDITOR_FALLBACK_PATHS;
|
|
26902
26970
|
var init_platform = __esm({
|
|
26903
26971
|
"src/lib/platform.ts"() {
|
|
26904
26972
|
"use strict";
|
|
26905
26973
|
import_node_fs2 = require("node:fs");
|
|
26906
26974
|
import_node_child_process = require("node:child_process");
|
|
26907
|
-
|
|
26975
|
+
import_node_path3 = __toESM(require("node:path"));
|
|
26908
26976
|
CLAUDE_NESTING_VARS = [
|
|
26909
26977
|
"CLAUDECODE",
|
|
26910
26978
|
"CLAUDE_CODE_ENTRYPOINT",
|
|
@@ -32133,7 +32201,7 @@ var init_pty_session = __esm({
|
|
|
32133
32201
|
|
|
32134
32202
|
// src/lib/pty/orphan-reaper.ts
|
|
32135
32203
|
function pidFilePath(sessionKey) {
|
|
32136
|
-
return (0,
|
|
32204
|
+
return (0, import_node_path4.join)(SIGNAL_DIR, `${PID_PREFIX}${sessionKey}`);
|
|
32137
32205
|
}
|
|
32138
32206
|
async function recordSessionPid(sessionKey, pid) {
|
|
32139
32207
|
try {
|
|
@@ -32148,14 +32216,14 @@ async function clearSessionPid(sessionKey) {
|
|
|
32148
32216
|
} catch {
|
|
32149
32217
|
}
|
|
32150
32218
|
}
|
|
32151
|
-
var import_promises,
|
|
32219
|
+
var import_promises, import_node_os3, import_node_path4, SIGNAL_DIR, PID_PREFIX;
|
|
32152
32220
|
var init_orphan_reaper = __esm({
|
|
32153
32221
|
"src/lib/pty/orphan-reaper.ts"() {
|
|
32154
32222
|
"use strict";
|
|
32155
32223
|
import_promises = require("node:fs/promises");
|
|
32156
|
-
|
|
32157
|
-
|
|
32158
|
-
SIGNAL_DIR = (0,
|
|
32224
|
+
import_node_os3 = require("node:os");
|
|
32225
|
+
import_node_path4 = require("node:path");
|
|
32226
|
+
SIGNAL_DIR = (0, import_node_path4.join)((0, import_node_os3.tmpdir)(), "tower-signals");
|
|
32159
32227
|
PID_PREFIX = "pid-";
|
|
32160
32228
|
}
|
|
32161
32229
|
});
|
|
@@ -53854,7 +53922,8 @@ async function checkWorktreeClean(taskId) {
|
|
|
53854
53922
|
["status", "--porcelain"],
|
|
53855
53923
|
{ cwd, encoding: "utf-8", timeout: 5e3 }
|
|
53856
53924
|
).trim();
|
|
53857
|
-
const
|
|
53925
|
+
const rawFiles = status ? status.split("\n").map((l) => l.trim()).filter(Boolean) : [];
|
|
53926
|
+
const files = stripTowerLinkedStatus(rawFiles, cwd);
|
|
53858
53927
|
const clean = files.length === 0;
|
|
53859
53928
|
let hasCommits = false;
|
|
53860
53929
|
let lastCommitMessage = null;
|
|
@@ -53957,6 +54026,23 @@ var init_task_actions = __esm({
|
|
|
53957
54026
|
}
|
|
53958
54027
|
});
|
|
53959
54028
|
|
|
54029
|
+
// src/mcp/env-guard.ts
|
|
54030
|
+
var import_node_path = require("node:path");
|
|
54031
|
+
var import_node_os = require("node:os");
|
|
54032
|
+
function resolveTowerDataDir(env) {
|
|
54033
|
+
if (env.TOWER_DATA_DIR) return env.TOWER_DATA_DIR;
|
|
54034
|
+
const dbUrl = env.DATABASE_URL;
|
|
54035
|
+
if (dbUrl && dbUrl.startsWith("file:")) {
|
|
54036
|
+
const dbPath = dbUrl.slice("file:".length);
|
|
54037
|
+
return (0, import_node_path.dirname)((0, import_node_path.dirname)(dbPath));
|
|
54038
|
+
}
|
|
54039
|
+
return (0, import_node_path.join)((0, import_node_os.homedir)(), ".tower");
|
|
54040
|
+
}
|
|
54041
|
+
process.env.TOWER_DATA_DIR = resolveTowerDataDir({
|
|
54042
|
+
TOWER_DATA_DIR: process.env.TOWER_DATA_DIR,
|
|
54043
|
+
DATABASE_URL: process.env.DATABASE_URL
|
|
54044
|
+
});
|
|
54045
|
+
|
|
53960
54046
|
// src/mcp/index.ts
|
|
53961
54047
|
var import_stdio = require("@modelcontextprotocol/sdk/server/stdio.js");
|
|
53962
54048
|
|
|
@@ -53968,8 +54054,10 @@ init_zod();
|
|
|
53968
54054
|
|
|
53969
54055
|
// src/mcp/db.ts
|
|
53970
54056
|
var import_client = require("@prisma/client");
|
|
53971
|
-
|
|
54057
|
+
init_tower_dir();
|
|
54058
|
+
var db = new import_client.PrismaClient({ datasourceUrl: `file:${getTowerDbFilePath()}` });
|
|
53972
54059
|
async function initDb() {
|
|
54060
|
+
getDatabaseDir();
|
|
53973
54061
|
await db.$connect();
|
|
53974
54062
|
await db.$queryRaw(import_client.Prisma.sql`PRAGMA journal_mode=WAL`);
|
|
53975
54063
|
await db.$queryRaw(import_client.Prisma.sql`PRAGMA busy_timeout=5000`);
|
|
@@ -54129,42 +54217,7 @@ init_config_reader();
|
|
|
54129
54217
|
// src/lib/file-utils.ts
|
|
54130
54218
|
var fs = __toESM(require("node:fs"));
|
|
54131
54219
|
var path = __toESM(require("node:path"));
|
|
54132
|
-
|
|
54133
|
-
// src/lib/tower-dir.ts
|
|
54134
|
-
var import_node_path = require("node:path");
|
|
54135
|
-
var import_node_os = require("node:os");
|
|
54136
|
-
var import_node_fs = require("node:fs");
|
|
54137
|
-
var _dir;
|
|
54138
|
-
function getTowerDir() {
|
|
54139
|
-
if (_dir) return _dir;
|
|
54140
|
-
_dir = process.env.TOWER_DATA_DIR || (0, import_node_path.join)((0, import_node_os.homedir)(), ".tower");
|
|
54141
|
-
if (!(0, import_node_fs.existsSync)(_dir)) {
|
|
54142
|
-
(0, import_node_fs.mkdirSync)(_dir, { recursive: true });
|
|
54143
|
-
}
|
|
54144
|
-
return _dir;
|
|
54145
|
-
}
|
|
54146
|
-
function getDefaultStorageDir() {
|
|
54147
|
-
return (0, import_node_path.join)(getTowerDir(), "storage");
|
|
54148
|
-
}
|
|
54149
|
-
function getStoragePointerFile() {
|
|
54150
|
-
return (0, import_node_path.join)(getTowerDir(), "storage-location");
|
|
54151
|
-
}
|
|
54152
|
-
function readStoragePointer() {
|
|
54153
|
-
try {
|
|
54154
|
-
const p2 = (0, import_node_fs.readFileSync)(getStoragePointerFile(), "utf-8").trim();
|
|
54155
|
-
return p2.length > 0 ? p2 : null;
|
|
54156
|
-
} catch {
|
|
54157
|
-
return null;
|
|
54158
|
-
}
|
|
54159
|
-
}
|
|
54160
|
-
function getStorageDir() {
|
|
54161
|
-
const override = process.env.TOWER_STORAGE_DIR || readStoragePointer();
|
|
54162
|
-
const dir = override && override.length > 0 ? override : getDefaultStorageDir();
|
|
54163
|
-
if (!(0, import_node_fs.existsSync)(dir)) (0, import_node_fs.mkdirSync)(dir, { recursive: true });
|
|
54164
|
-
return dir;
|
|
54165
|
-
}
|
|
54166
|
-
|
|
54167
|
-
// src/lib/file-utils.ts
|
|
54220
|
+
init_tower_dir();
|
|
54168
54221
|
function assertWithinDataRoot(resolved) {
|
|
54169
54222
|
if (!resolved.startsWith(getStorageDir() + path.sep)) {
|
|
54170
54223
|
throw new Error("Path traversal detected");
|
|
@@ -54420,21 +54473,44 @@ ${refText}`;
|
|
|
54420
54473
|
}
|
|
54421
54474
|
},
|
|
54422
54475
|
update_task: {
|
|
54423
|
-
description: "Update a task's title, description, priority, labels, and/or
|
|
54476
|
+
description: "Update a task's title, description, priority, labels, subPath, and/or version. If labelIds is provided, replaces all existing labels. Pass versionId to file the task under a project version (use list_versions to discover options); pass null or an empty string to move it back to the backlog (no version).",
|
|
54424
54477
|
schema: external_exports.object({
|
|
54425
54478
|
taskId: external_exports.string(),
|
|
54426
54479
|
title: external_exports.string().optional(),
|
|
54427
54480
|
description: external_exports.string().optional(),
|
|
54428
54481
|
priority: Priority.optional(),
|
|
54429
54482
|
labelIds: external_exports.array(external_exports.string()).optional(),
|
|
54430
|
-
subPath: external_exports.string().optional()
|
|
54483
|
+
subPath: external_exports.string().optional(),
|
|
54484
|
+
versionId: external_exports.string().nullable().optional().describe('Version to assign the task to. Use list_versions to find valid IDs for the project. Pass null or "" to move the task to the backlog (no version).')
|
|
54431
54485
|
}),
|
|
54432
54486
|
handler: async (args) => {
|
|
54433
|
-
const { labelIds, taskId, ...updateData } = args;
|
|
54487
|
+
const { labelIds, taskId, versionId, ...updateData } = args;
|
|
54488
|
+
const versionProvided = "versionId" in args;
|
|
54434
54489
|
return db.$transaction(async (tx) => {
|
|
54490
|
+
let versionData = {};
|
|
54491
|
+
if (versionProvided) {
|
|
54492
|
+
let resolved = null;
|
|
54493
|
+
if (versionId) {
|
|
54494
|
+
const current = await tx.task.findUnique({
|
|
54495
|
+
where: { id: taskId },
|
|
54496
|
+
select: { projectId: true }
|
|
54497
|
+
});
|
|
54498
|
+
if (current) {
|
|
54499
|
+
const v2 = await tx.version.findFirst({
|
|
54500
|
+
where: { id: versionId, projectId: current.projectId },
|
|
54501
|
+
select: { id: true }
|
|
54502
|
+
});
|
|
54503
|
+
resolved = v2?.id ?? null;
|
|
54504
|
+
}
|
|
54505
|
+
}
|
|
54506
|
+
versionData = { versionId: resolved };
|
|
54507
|
+
}
|
|
54435
54508
|
const task = await tx.task.update({
|
|
54436
54509
|
where: { id: taskId },
|
|
54437
|
-
data:
|
|
54510
|
+
data: {
|
|
54511
|
+
...updateData,
|
|
54512
|
+
...versionData
|
|
54513
|
+
}
|
|
54438
54514
|
});
|
|
54439
54515
|
if (labelIds !== void 0) {
|
|
54440
54516
|
await tx.taskLabel.deleteMany({ where: { taskId } });
|
|
@@ -54488,7 +54564,7 @@ ${refText}`;
|
|
|
54488
54564
|
}
|
|
54489
54565
|
},
|
|
54490
54566
|
list_versions: {
|
|
54491
|
-
description: "List a project's active versions (excludes RELEASED) for assigning a task via create_task's versionId. Returns id, number, name, status, isCurrent.",
|
|
54567
|
+
description: "List a project's active versions (excludes RELEASED) for assigning a task via create_task's or update_task's versionId. Returns id, number, name, status, isCurrent.",
|
|
54492
54568
|
schema: external_exports.object({ projectId: external_exports.string() }),
|
|
54493
54569
|
handler: async (args) => {
|
|
54494
54570
|
return db.version.findMany({
|
package/next.config.ts
CHANGED
|
@@ -4,6 +4,10 @@ const nextConfig: NextConfig = {
|
|
|
4
4
|
// Self-contained build: traced deps land in `.next/standalone/node_modules/`,
|
|
5
5
|
// so `npm i tower-studio -g` no longer re-downloads the dependency graph.
|
|
6
6
|
output: "standalone",
|
|
7
|
+
// Dev and prod must not share a build dir, or `pnpm dev` clobbers the prod
|
|
8
|
+
// `.next/standalone` that `pnpm start` (bin/tower.mjs) loads. The `dev` script
|
|
9
|
+
// sets NEXT_DISTDIR=.next-dev; prod build/start keep the default `.next`.
|
|
10
|
+
distDir: process.env.NEXT_DISTDIR || ".next",
|
|
7
11
|
// Pin the workspace root — without this Next.js infers it from the nearest
|
|
8
12
|
// lockfile and can wrongly pick a stray ~/package-lock.json in $HOME.
|
|
9
13
|
outputFileTracingRoot: __dirname,
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "tower-studio",
|
|
3
|
-
"version": "0.2.
|
|
3
|
+
"version": "0.2.44",
|
|
4
4
|
"description": "AI Task Orchestration Platform — Kanban + Terminal + Code Editor + MCP",
|
|
5
5
|
"bin": {
|
|
6
6
|
"tower": "bin/tower.mjs"
|
|
@@ -29,8 +29,8 @@
|
|
|
29
29
|
"tsconfig.json"
|
|
30
30
|
],
|
|
31
31
|
"scripts": {
|
|
32
|
-
"predev": "node scripts/ensure-dev-db.js && pnpm db:migrate && pnpm mcp:build",
|
|
33
|
-
"dev": "next dev --webpack -p 9022",
|
|
32
|
+
"predev": "TOWER_DATA_DIR=\"$HOME/.tower-dev\" DATABASE_URL=\"file:$HOME/.tower-dev/database/tower.db\" node scripts/ensure-dev-db.js && pnpm db:migrate && pnpm mcp:build",
|
|
33
|
+
"dev": "NEXT_DISTDIR=.next-dev TOWER_DATA_DIR=\"$HOME/.tower-dev\" DATABASE_URL=\"file:$HOME/.tower-dev/database/tower.db\" next dev --webpack -p 9022",
|
|
34
34
|
"build": "pnpm mcp:build && rm -rf .next && next build && find .next -name '*.map' -delete && cp -R .next/static .next/standalone/.next/ && cp -R public .next/standalone/ && node scripts/prune-standalone-natives.js",
|
|
35
35
|
"release": "pnpm build && npm pack",
|
|
36
36
|
"release:smoke": "node scripts/release-smoke.js",
|
|
@@ -39,12 +39,12 @@
|
|
|
39
39
|
"start": "node bin/tower.mjs",
|
|
40
40
|
"lint": "eslint",
|
|
41
41
|
"db:generate": "prisma generate",
|
|
42
|
-
"db:push": "prisma db push",
|
|
43
|
-
"db:seed": "tsx prisma/seed.ts",
|
|
44
|
-
"db:studio": "prisma studio",
|
|
45
|
-
"db:init": "tsx scripts/init-db.ts",
|
|
46
|
-
"db:init-fts": "tsx prisma/init-fts.ts",
|
|
47
|
-
"db:migrate": "tsx scripts/run-migrations.ts",
|
|
42
|
+
"db:push": "DATABASE_URL=\"file:$HOME/.tower-dev/database/tower.db\" prisma db push",
|
|
43
|
+
"db:seed": "DATABASE_URL=\"file:$HOME/.tower-dev/database/tower.db\" tsx prisma/seed.ts",
|
|
44
|
+
"db:studio": "DATABASE_URL=\"file:$HOME/.tower-dev/database/tower.db\" prisma studio",
|
|
45
|
+
"db:init": "TOWER_DATA_DIR=\"$HOME/.tower-dev\" DATABASE_URL=\"file:$HOME/.tower-dev/database/tower.db\" tsx scripts/init-db.ts",
|
|
46
|
+
"db:init-fts": "DATABASE_URL=\"file:$HOME/.tower-dev/database/tower.db\" tsx prisma/init-fts.ts",
|
|
47
|
+
"db:migrate": "TOWER_DATA_DIR=\"$HOME/.tower-dev\" DATABASE_URL=\"file:$HOME/.tower-dev/database/tower.db\" tsx scripts/run-migrations.ts",
|
|
48
48
|
"test": "vitest",
|
|
49
49
|
"test:run": "vitest run",
|
|
50
50
|
"test:e2e": "NO_PROXY=localhost,127.0.0.1 no_proxy=localhost,127.0.0.1 playwright test",
|
package/skills/tower/SKILL.md
CHANGED
|
@@ -103,6 +103,12 @@ it means your previous turn produced no tool call — issue the tool call now.
|
|
|
103
103
|
|
|
104
104
|
1. Call `move_task` with taskId and the target status (DONE, CANCELLED, etc.)
|
|
105
105
|
|
|
106
|
+
### "Edit a task" / "Change its title/description/priority/labels/version"
|
|
107
|
+
|
|
108
|
+
1. Call `update_task` with `taskId` plus any of: `title`, `description`, `priority`, `labelIds`, `subPath`, `versionId`. Only the fields you pass are changed.
|
|
109
|
+
2. **Labels** (`labelIds`): full replace, not a merge — pass the complete desired set (omit to leave labels untouched).
|
|
110
|
+
3. **Version** (`versionId`): to move a task into a version, call `list_versions` with the task's projectId, let the user pick, then pass `versionId`. To move the task back to the **backlog** (no version), pass `versionId: null` (or an empty string). A `versionId` that doesn't belong to the task's project is ignored and the task falls back to backlog. Omit `versionId` entirely to leave the version unchanged.
|
|
111
|
+
|
|
106
112
|
### "Search for ..." / "Find tasks about ..."
|
|
107
113
|
|
|
108
114
|
1. Call `search` with the query string
|
|
@@ -1,3 +0,0 @@
|
|
|
1
|
-
module.exports=[874533,(e,o,r)=>{o.exports=e.x("node:child_process",()=>require("node:child_process"))},750227,(e,o,r)=>{o.exports=e.x("node:path",()=>require("node:path"))},902157,(e,o,r)=>{o.exports=e.x("node:fs",()=>require("node:fs"))},660526,(e,o,r)=>{o.exports=e.x("node:os",()=>require("node:os"))},912714,(e,o,r)=>{o.exports=e.x("node:fs/promises",()=>require("node:fs/promises"))},980738,(e,o,r)=>{o.exports=e.x("node-pty-c710df912a232c01",()=>require("node-pty-c710df912a232c01"))}];
|
|
2
|
-
|
|
3
|
-
//# sourceMappingURL=%5Bexternals%5D__0izylsq._.js.map
|
|
@@ -1,3 +0,0 @@
|
|
|
1
|
-
module.exports=[324725,(e,r,t)=>{r.exports=e.x("next/dist/server/app-render/after-task-async-storage.external.js",()=>require("next/dist/server/app-render/after-task-async-storage.external.js"))},193695,(e,r,t)=>{r.exports=e.x("next/dist/shared/lib/no-fallback-error.external.js",()=>require("next/dist/shared/lib/no-fallback-error.external.js"))},224361,(e,r,t)=>{r.exports=e.x("util",()=>require("util"))},522734,(e,r,t)=>{r.exports=e.x("fs",()=>require("fs"))},233405,(e,r,t)=>{r.exports=e.x("child_process",()=>require("child_process"))},750227,(e,r,t)=>{r.exports=e.x("node:path",()=>require("node:path"))},918622,(e,r,t)=>{r.exports=e.x("next/dist/compiled/next-server/app-page-turbo.runtime.prod.js",()=>require("next/dist/compiled/next-server/app-page-turbo.runtime.prod.js"))},556704,(e,r,t)=>{r.exports=e.x("next/dist/server/app-render/work-async-storage.external.js",()=>require("next/dist/server/app-render/work-async-storage.external.js"))},832319,(e,r,t)=>{r.exports=e.x("next/dist/server/app-render/work-unit-async-storage.external.js",()=>require("next/dist/server/app-render/work-unit-async-storage.external.js"))},270406,(e,r,t)=>{r.exports=e.x("next/dist/compiled/@opentelemetry/api",()=>require("next/dist/compiled/@opentelemetry/api"))},814747,(e,r,t)=>{r.exports=e.x("path",()=>require("path"))},446786,(e,r,t)=>{r.exports=e.x("os",()=>require("os"))},687769,(e,r,t)=>{r.exports=e.x("node:events",()=>require("node:events"))}];
|
|
2
|
-
|
|
3
|
-
//# sourceMappingURL=%5Bexternals%5D__0m6hc.0._.js.map
|
|
@@ -1,3 +0,0 @@
|
|
|
1
|
-
module.exports=[193695,(e,t,r)=>{t.exports=e.x("next/dist/shared/lib/no-fallback-error.external.js",()=>require("next/dist/shared/lib/no-fallback-error.external.js"))},918622,(e,t,r)=>{t.exports=e.x("next/dist/compiled/next-server/app-page-turbo.runtime.prod.js",()=>require("next/dist/compiled/next-server/app-page-turbo.runtime.prod.js"))},556704,(e,t,r)=>{t.exports=e.x("next/dist/server/app-render/work-async-storage.external.js",()=>require("next/dist/server/app-render/work-async-storage.external.js"))},832319,(e,t,r)=>{t.exports=e.x("next/dist/server/app-render/work-unit-async-storage.external.js",()=>require("next/dist/server/app-render/work-unit-async-storage.external.js"))},270406,(e,t,r)=>{t.exports=e.x("next/dist/compiled/@opentelemetry/api",()=>require("next/dist/compiled/@opentelemetry/api"))},324725,(e,t,r)=>{t.exports=e.x("next/dist/server/app-render/after-task-async-storage.external.js",()=>require("next/dist/server/app-render/after-task-async-storage.external.js"))},198840,e=>{"use strict";var t=e.i(855104);let r=["localhost","127.0.0.1","[::1]"],n=new Set(["127.0.0.1","::1","::ffff:127.0.0.1"]),s=/^c[a-z0-9]{20,30}$/;e.s(["requireLocalhost",0,function(e){let s=e.headers.get("x-forwarded-for");if(s&&!s.split(",").map(e=>e.trim()).every(e=>n.has(e)))return t.NextResponse.json({error:"Forbidden"},{status:403});let o=e.headers.get("host")??"";return r.some(e=>o.startsWith(e))?null:t.NextResponse.json({error:"Forbidden"},{status:403})},"validateProjectId",0,function(e){return s.test(e)?null:t.NextResponse.json({error:"Invalid projectId format"},{status:400})},"validateTaskId",0,function(e){return s.test(e)?null:t.NextResponse.json({error:"Invalid taskId format"},{status:400})}])},874533,(e,t,r)=>{t.exports=e.x("node:child_process",()=>require("node:child_process"))},750227,(e,t,r)=>{t.exports=e.x("node:path",()=>require("node:path"))},902157,(e,t,r)=>{t.exports=e.x("node:fs",()=>require("node:fs"))},660526,(e,t,r)=>{t.exports=e.x("node:os",()=>require("node:os"))},769310,e=>{"use strict";var t=e.i(902157),r=e.i(874533),n=e.i(750227);function s(e=process.platform){return"win32"===e}function o(e){let t=e.replace(/\r\n|\r|\n/g," ");if(!t.length)return'""';let r=t.replace(/"/g,'""');return/[\s"&<>|^()]/.test(r)?`"${r}"`:r}let a=["CLAUDECODE","CLAUDE_CODE_ENTRYPOINT","CLAUDE_CODE_SESSION","CLAUDE_CODE_PARENT_SESSION"];async function i(e,t={}){let r=t.cwd??process.cwd(),o=t.env??process.env,a=t.platform??process.platform;if(e.includes("/")||e.includes("\\")){let t=n.default.isAbsolute(e)?e:n.default.resolve(r,e);return await p(t,a)?t:null}let l=o.PATH??o.Path??"",c=s(a)?";":":",d=l.split(c).filter(Boolean),u=s(a)?(o.PATHEXT??".EXE;.CMD;.BAT;.COM").split(";").filter(Boolean):[""],m=s(a)&&n.default.extname(e).length>0;for(let t of d)for(let r of s(a)?m?[n.default.join(t,e)]:u.map(r=>n.default.join(t,`${e}${r}`)):[n.default.join(t,e)])if(await p(r,a))return r;return null}let l=e=>(0,r.execSync)(e,{encoding:"utf-8",timeout:5e3,stdio:["ignore","pipe","ignore"]});function c(e,t=process.platform,o=l){if(n.default.extname(e)||e.includes("/")||e.includes("\\"))return e;if(!s(t)){try{let t=(0,r.execFileSync)("which",[e],{encoding:"utf-8",timeout:5e3,stdio:["ignore","pipe","ignore"]}).trim();if(t)return t}catch{}return e}try{let t=o(`where ${e}`).trim().split("\n").map(e=>e.trim()).filter(Boolean),r=t.find(e=>/\.(cmd|bat|exe)$/i.test(e));if(r)return r;if(t.length>0)return t[0]}catch{}return e}async function d(e,t,r={}){let n=r.env??process.env,s=r.platform??process.platform;return u(await i(e,r)??e,t,n,s)}function u(e,t,r,a){if(!s(a))return{command:e,args:t};let i=n.default.extname(e).toLowerCase();return".cmd"===i||".bat"===i||".com"===i?{command:r.ComSpec||"cmd.exe",args:["/d","/s","/c",[o(e),...t.map(o)].join(" ")]}:{command:e,args:t}}async function p(e,r=process.platform){try{return await t.promises.access(e,s(r)?t.constants.F_OK:t.constants.X_OK),!0}catch{return!1}}async function m(e=process.platform){return s(e)?f():h()}async function h(){try{let e=await t.promises.readFile("/etc/shells","utf-8"),r=[],s=new Map;for(let t of e.split("\n")){let e=t.replace(/#.*/,"").trim();if(!e||!e.startsWith("/")||!await p(e))continue;let o=n.default.basename(e),a=s.get(o)??0;s.set(o,a+1),a>0&&(o=`${o} (${a+1})`),r.push({name:o,path:e})}return r}catch{let e=[];for(let t of["/bin/zsh","/bin/bash","/bin/sh"])await p(t)&&e.push({name:n.default.basename(t),path:t});return e}}async function f(){let e=[],t=[],r=await i("git",{platform:"win32"});if(r){let e=n.default.resolve(n.default.dirname(r),"..","..");t.push(n.default.join(e,"bin","bash.exe"),n.default.join(e,"usr","bin","bash.exe"))}for(let e of[process.env.ProgramW6432,process.env.ProgramFiles,process.env["ProgramFiles(x86)"],process.env.LocalAppData?n.default.join(process.env.LocalAppData,"Programs"):null].filter(Boolean))t.push(n.default.join(e,"Git","bin","bash.exe"),n.default.join(e,"Git","usr","bin","bash.exe"));let s=process.env.USERPROFILE??"";for(let r of(s&&t.push(n.default.join(s,"scoop","apps","git","current","bin","bash.exe")),process.env.CLAUDE_CODE_GIT_BASH_PATH&&t.unshift(process.env.CLAUDE_CODE_GIT_BASH_PATH),t))if(await p(r,"win32")){e.push({name:"Git Bash",path:r});break}let o=await i("pwsh",{platform:"win32"});o&&e.push({name:"PowerShell",path:o});let a=process.env.windir??"C:\\WINDOWS",l=n.default.join(a,"System32","WindowsPowerShell","v1.0","powershell.exe");await p(l,"win32")&&e.push({name:"Windows PowerShell",path:l});let c=process.env.ComSpec??n.default.join(a,"System32","cmd.exe");return await p(c,"win32")&&e.push({name:"Command Prompt",path:c}),e}let g=[{name:"Terminal",bundleName:"Terminal"},{name:"iTerm2",bundleName:"iTerm"},{name:"Warp",bundleName:"Warp"},{name:"Alacritty",bundleName:"Alacritty"},{name:"WezTerm",bundleName:"WezTerm"},{name:"kitty",bundleName:"kitty"},{name:"Hyper",bundleName:"Hyper"}];async function w(e=process.platform){if("darwin"===e){let t=[];for(let r of g){let n=await p(`/Applications/${r.bundleName}.app`,e);t.push({name:r.name,value:r.bundleName,installed:n})}return t}if(s(e)){let t=[],r=await i("wt",{platform:e});return r&&t.push({name:"Windows Terminal",value:r,installed:!0}),t}return[]}let y=[{name:"VS Code",command:"code"},{name:"VS Code Insiders",command:"code-insiders"},{name:"Cursor",command:"cursor"},{name:"Windsurf",command:"windsurf"},{name:"Zed",command:"zed"},{name:"Sublime Text",command:"subl"},{name:"IntelliJ IDEA",command:"idea"},{name:"WebStorm",command:"webstorm"},{name:"PyCharm",command:"pycharm"},{name:"GoLand",command:"goland"},{name:"RubyMine",command:"rubymine"},{name:"PhpStorm",command:"phpstorm"},{name:"CLion",command:"clion"},{name:"Rider",command:"rider"}],v={code:{darwin:["/Applications/Visual Studio Code.app/Contents/Resources/app/bin/code"],win32:["%LOCALAPPDATA%\\Programs\\Microsoft VS Code\\bin\\code.cmd","%ProgramFiles%\\Microsoft VS Code\\bin\\code.cmd"]},"code-insiders":{darwin:["/Applications/Visual Studio Code - Insiders.app/Contents/Resources/app/bin/code-insiders"],win32:["%LOCALAPPDATA%\\Programs\\Microsoft VS Code Insiders\\bin\\code-insiders.cmd","%ProgramFiles%\\Microsoft VS Code Insiders\\bin\\code-insiders.cmd"]},cursor:{darwin:["/Applications/Cursor.app/Contents/Resources/app/bin/cursor"],win32:["%LOCALAPPDATA%\\Programs\\cursor\\resources\\app\\bin\\cursor.cmd"]},windsurf:{darwin:["/Applications/Windsurf.app/Contents/Resources/app/bin/windsurf"],win32:["%LOCALAPPDATA%\\Programs\\Windsurf\\bin\\windsurf.cmd"]},zed:{darwin:["/Applications/Zed.app/Contents/MacOS/cli"]},subl:{darwin:["/Applications/Sublime Text.app/Contents/SharedSupport/bin/subl"],win32:["%ProgramFiles%\\Sublime Text\\subl.exe","%ProgramFiles%\\Sublime Text 3\\subl.exe"]},idea:{darwin:["/Applications/IntelliJ IDEA.app/Contents/MacOS/idea","/Applications/IntelliJ IDEA CE.app/Contents/MacOS/idea"]},webstorm:{darwin:["/Applications/WebStorm.app/Contents/MacOS/webstorm"]},pycharm:{darwin:["/Applications/PyCharm.app/Contents/MacOS/pycharm","/Applications/PyCharm CE.app/Contents/MacOS/pycharm"]},goland:{darwin:["/Applications/GoLand.app/Contents/MacOS/goland"]},rubymine:{darwin:["/Applications/RubyMine.app/Contents/MacOS/rubymine"]},phpstorm:{darwin:["/Applications/PhpStorm.app/Contents/MacOS/phpstorm"]},clion:{darwin:["/Applications/CLion.app/Contents/MacOS/clion"]},rider:{darwin:["/Applications/Rider.app/Contents/MacOS/rider"]}};async function k(e,t={}){let r=t.platform??process.platform,n=t.env??process.env,o=await i(e,t);if(o)return o;for(let t of v[e]?.[r]??[]){let e=s(r)?function(e,t){return e.replace(/%([^%]+)%/g,(e,r)=>{let n=t[r];if(void 0!==n)return n;let s=Object.keys(t).find(e=>e.toLowerCase()===r.toLowerCase());return s?t[s]??e:e})}(t,n):t;if(await p(e,r))return e}return null}async function S(e=process.platform){let t=[];for(let r of y){let n=!!await k(r.command,{platform:e});t.push({name:r.name,command:r.command,installed:n})}return t}e.s(["detectEditors",0,S,"detectShells",0,m,"detectTerminalApps",0,w,"ensurePathInEnv",0,function(e,t=process.platform){let r=s(t)?"Path":"PATH";return(e.PATH??e.Path??"").length>0?e:{...e,[r]:function(e=process.platform){return s(e)?"C:\\Windows\\System32;C:\\Windows;C:\\Windows\\System32\\Wbem":"/usr/local/bin:/opt/homebrew/bin:/usr/local/sbin:/usr/bin:/bin:/usr/sbin:/sbin"}(t)}},"isWindows",0,s,"resolveCommandPath",0,i,"resolveCommandPathSync",0,c,"resolveSdkExecutable",0,function(e,r=process.platform,o=e=>(0,t.readFileSync)(e,"utf-8"),a=e=>(0,t.existsSync)(e)){if(!s(r))return e;let i=n.default.extname(e).toLowerCase();if(".cmd"!==i&&".bat"!==i)return e;let l=n.default.win32.dirname(e),c="",d=e=>{let t=e.replace(/%~?dp0%/gi,l).replace(/\//g,"\\");return n.default.win32.isAbsolute(t)?n.default.win32.normalize(t):n.default.win32.resolve(l,t)};try{let t=o(e);c=t.replace(/\s+/g," ").slice(0,400);let r=t.match(/"([^"]*\.(?:c?js|mjs))"/i);if(r){let e=d(r[1]);if(a(e))return e;console.error(`[resolveSdkExecutable] parsed cli="${e}" but it doesn't exist`)}for(let e of t.matchAll(/"([^"]*\.exe)"/gi)){let t=d(e[1]);if("node.exe"!==n.default.win32.basename(t).toLowerCase()&&a(t))return t}}catch(e){console.error(`[resolveSdkExecutable] shim read failed: ${e instanceof Error?e.message:e}`)}let u=n.default.win32.join(l,"node_modules","@anthropic-ai","claude-code"),p=n.default.win32.basename(e,n.default.win32.extname(e)),m=[n.default.win32.join(u,"cli.js"),n.default.win32.join(u,"bin",`${p}.exe`)];for(let e of m)if(a(e))return e;return console.error(`[resolveSdkExecutable] could not convert ${e} → guesses=${JSON.stringify(m)} shim="${c}"`),e},"resolveSpawnTarget",0,d,"resolveSpawnTargetSync",0,function(e,t,r=process.platform,n){return u(c(e,r,n),t,process.env,r)},"stripClaudeNestingEnv",0,function(e){let t={...e};for(let e of a)delete t[e];return t}])},53674,e=>{"use strict";e.s(["getPackageRoot",0,function(){return process.env.TOWER_PACKAGE_ROOT||process.cwd()}])},472129,e=>{"use strict";var t=e.i(902157),r=e.i(660526),n=e.i(750227),s=e.i(769310),o=e.i(53674);let a=["sonnet","opus","haiku","claude-sonnet-4-6","claude-opus-4-6","claude-haiku-4-5-20251001"];e.s(["ClaudeCliAdapter",0,class{buildSpawnArgs(e){let t=["--dangerously-skip-permissions"];e.extraArgs?.length&&t.push(...e.extraArgs),e.resumeSessionId?t.push("--resume",e.resumeSessionId):e.continueLatest?t.push("--continue"):e.prompt&&t.push(e.prompt);let r={...e.envOverrides??{}};return{command:this.resolveCommand(),args:t,env:r}}buildEnvOverrides(e){let t={TOWER_TASK_ID:e.taskId,TOWER_TASK_TITLE:e.taskTitle,TOWER_STARTED_AT:new Date().toISOString(),TOWER_API_URL:e.apiUrl};return e.callbackUrl&&(t.CALLBACK_URL=e.callbackUrl),t}async installHooks(e){try{let e=this.readSettings(),t=e.hooks??{},r=(0,o.getPackageRoot)().replace(/\\/g,"/"),s=n.join(r,"scripts","session-start-hook.js").replace(/\\/g,"/"),a=n.join(r,"scripts","post-tool-hook.js").replace(/\\/g,"/"),i=n.join(r,"scripts","stop-hook.js").replace(/\\/g,"/"),l=!1;return l=this.upsertHook(t,"SessionStart","session-start-hook.js",{hooks:[{command:`node "${s}"`,timeout:5,type:"command"}]})||l,l=this.upsertHook(t,"PostToolUse","post-tool-hook.js",{hooks:[{command:`node "${a}"`,timeout:10,type:"command"}],matcher:"Write|Edit|MultiEdit"})||l,(l=this.upsertHook(t,"Stop","stop-hook.js",{hooks:[{command:`node "${i}"`,timeout:5,type:"command"}]})||l)&&(e.hooks=t,this.writeSettings(e)),{ok:!0,method:"file",detail:this.getSettingsPath()}}catch(e){return{ok:!1,method:"file",detail:this.getSettingsPath(),error:e instanceof Error?e.message:String(e)}}}async repairHookPaths(){try{let e=this.readSettings(),t=e.hooks??{},r=(0,o.getPackageRoot)().replace(/\\/g,"/"),s=!1;for(let[e,o]of[["SessionStart","session-start-hook.js"],["PostToolUse","post-tool-hook.js"],["Stop","stop-hook.js"]]){let a=this.getHookArray(t,e),i=a.findIndex(e=>e?.hooks?.some?.(e=>e.command?.includes(o)));if(i<0)continue;let l=n.join(r,"scripts",o).replace(/\\/g,"/"),c=`node "${l}"`,d=a[i]?.hooks?.[0];d&&d.command!==c&&(d.command=c,t[e]=a,s=!0)}s&&(e.hooks=t,this.writeSettings(e))}catch{}}upsertHook(e,t,r,n){let s=this.getHookArray(e,t),o=n?.hooks?.[0]?.command,a=s.findIndex(e=>e?.hooks?.some?.(e=>e.command?.includes(r)));if(a>=0){if(s[a]?.hooks?.[0]?.command===o)return!1;s.splice(a,1)}return s.push(n),e[t]=s,!0}async uninstallHooks(){try{let e=this.readSettings(),t=e.hooks??{},r=["session-start-hook.js","post-tool-hook.js","stop-hook.js"];for(let e of["SessionStart","PostToolUse","Stop"]){let n=this.getHookArray(t,e);t[e]=n.filter(e=>!e.hooks?.some(e=>r.some(t=>e.command?.includes(t))))}return e.hooks=t,this.writeSettings(e),{ok:!0,method:"file",detail:this.getSettingsPath()}}catch(e){return{ok:!1,method:"file",detail:this.getSettingsPath(),error:e instanceof Error?e.message:String(e)}}}async isHooksInstalled(){let e=this.readSettings().hooks??{},t=this.getHookArray(e,"PostToolUse");return this.hasHook(t,"post-tool-hook.js")}async installMcp(e,t={}){let r=t.scope??"user",n={command:e.command,args:e.args};e.env&&Object.keys(e.env).length>0&&(n.env=e.env);let s=this.resolveCommand(),o=["mcp","add-json","-s",r,e.name,JSON.stringify(n)];try{return await this.runCli(s,["mcp","remove","-s",r,e.name],t.cwd).catch(()=>{}),await this.runCli(s,o,t.cwd),{ok:!0,method:"cli",detail:`${s} ${o.join(" ")}`}}catch(e){return{ok:!1,method:"cli",detail:`${s} ${o.join(" ")}`,error:e instanceof Error?e.message:String(e)}}}async uninstallMcp(e,t={}){let r=t.scope??"user",n=this.resolveCommand(),s=["mcp","remove","-s",r,e];try{return await this.runCli(n,s,t.cwd),{ok:!0,method:"cli",detail:`${n} ${s.join(" ")}`}}catch(e){return{ok:!1,method:"cli",detail:`${n} ${s.join(" ")}`,error:e instanceof Error?e.message:String(e)}}}async isMcpInstalled(e,t={}){let r=this.resolveCommand();try{return await this.runCli(r,["mcp","get",e],t.cwd,5e3),!0}catch{return!1}}async installSkill(e,r){let o=n.join(this.getConfigDir(),"skills",e);try{if(!t.existsSync(r))return{ok:!1,method:"symlink",detail:o,error:`Source skill dir does not exist: ${r}`};t.mkdirSync(n.dirname(o),{recursive:!0});let e=await t.promises.lstat(o).catch(()=>null);if(e)if(!(e.isSymbolicLink()||(0,s.isWindows)()&&e.isDirectory()))return{ok:!1,method:"symlink",detail:o,error:`Refusing to overwrite non-symlink at ${o}`};else try{let e=await t.promises.readlink(o);if(n.resolve(e)===n.resolve(r))return{ok:!0,method:"symlink",detail:`${o} → ${r} (already)`};await t.promises.unlink(o)}catch{if(!e.isSymbolicLink())return{ok:!1,method:"symlink",detail:o,error:`Refusing to overwrite non-symlink at ${o}`}}let a=(0,s.isWindows)()?"junction":"dir";return await t.promises.symlink(r,o,a),{ok:!0,method:"symlink",detail:`${o} → ${r}`}}catch(e){return{ok:!1,method:"symlink",detail:o,error:e instanceof Error?e.message:String(e)}}}async uninstallSkill(e){let r=n.join(this.getConfigDir(),"skills",e);try{let e=await t.promises.lstat(r).catch(()=>null);if(!e)return{ok:!0,method:"symlink",detail:`${r} (already absent)`};if(!e.isSymbolicLink())return{ok:!1,method:"symlink",detail:r,error:`Refusing to remove non-symlink at ${r}`};return await t.promises.unlink(r),{ok:!0,method:"symlink",detail:r}}catch(e){return{ok:!1,method:"symlink",detail:r,error:e instanceof Error?e.message:String(e)}}}async isSkillInstalled(e,r){let s=n.join(this.getConfigDir(),"skills",e);try{if(!(await t.promises.lstat(s)).isSymbolicLink())return!1;if(!r)return!0;let e=await t.promises.readlink(s),o=n.isAbsolute(e)?e:n.resolve(n.dirname(s),e);return n.resolve(o)===n.resolve(r)}catch{return!1}}async runCli(t,r,n,s=1e4){let{execFile:o}=await e.A(482848),{promisify:a}=await e.A(268548),i=a(o),{stdout:l}=await i(t,r,{cwd:n,timeout:s});return l}async isAvailable(){return null!==await this.getVersion()}async getVersion(){try{let{execFile:t}=await e.A(144264),{promisify:r}=await e.A(534777),{resolveSpawnTarget:n}=await e.A(200628),s=r(t),o=await n(this.resolveCommand(),["--version"]),{stdout:a}=await s(o.command,o.args,{timeout:5e3});return a.trim()||null}catch{return null}}async getModels(){return a}getConfigDir(){return n.join(r.homedir(),".claude")}getSettingsPath(){return n.join(this.getConfigDir(),"settings.json")}getSessionsDir(){return n.join(this.getConfigDir(),"projects")}getApiKeyInfo(){return{envVar:"ANTHROPIC_API_KEY",required:!1}}buildHelloProbeArgs(e){return{command:this.resolveCommand(),args:["--print",e,"--output-format","stream-json","--verbose"]}}resolveCommand(){if(process.env.CLAUDE_CODE_PATH)return process.env.CLAUDE_CODE_PATH;if((0,s.isWindows)()){let e=(0,s.resolveCommandPathSync)("claude-code");if("claude-code"!==e)return e}return(0,s.resolveCommandPathSync)("claude")}readSettings(){try{return JSON.parse(t.readFileSync(this.getSettingsPath(),"utf-8"))}catch{return{}}}writeSettings(e){let r=this.getConfigDir();t.existsSync(r)||t.mkdirSync(r,{recursive:!0}),t.writeFileSync(this.getSettingsPath(),JSON.stringify(e,null,2),"utf-8")}getHookArray(e,t){let r=e[t];return Array.isArray(r)?r:[]}hasHook(e,t){return e.some(e=>e.hooks?.some(e=>e.command?.includes(t)))}}])},212019,e=>{"use strict";var t=e.i(765876),r=e.i(675896),n=e.i(959160),s=e.i(97944),o=e.i(86757),a=e.i(204144),i=e.i(273436),l=e.i(743641),c=e.i(813766),d=e.i(840884),u=e.i(498814),p=e.i(780006),m=e.i(544432),h=e.i(772005),f=e.i(450223),g=e.i(193695);e.i(628400);var w=e.i(800071),y=e.i(855104),v=e.i(198840),k=e.i(750227),S=e.i(472129),C=e.i(53674);let A=new S.ClaudeCliAdapter;async function b(e){let t=(0,v.requireLocalhost)(e);if(t)return t;let r=await A.isHooksInstalled(),n=k.join((0,C.getPackageRoot)(),"scripts","post-tool-hook.js");return y.NextResponse.json({installed:r,hookPath:n})}async function x(e){let t=(0,v.requireLocalhost)(e);if(t)return t;let r=process.env.NEXTAUTH_URL??`http://localhost:${process.env.PORT??3e3}`;return await A.installHooks(r),y.NextResponse.json({success:!0})}async function E(e){let t=(0,v.requireLocalhost)(e);return t||(await A.uninstallHooks(),y.NextResponse.json({success:!0}))}e.s(["DELETE",0,E,"GET",0,b,"POST",0,x,"dynamic",0,"force-dynamic","runtime",0,"nodejs"],730599);var P=e.i(730599);let R=new t.AppRouteRouteModule({definition:{kind:r.RouteKind.APP_ROUTE,page:"/api/internal/hooks/install/route",pathname:"/api/internal/hooks/install",filename:"route",bundlePath:""},distDir:".next",relativeProjectDir:"",resolvedPagePath:"[project]/src/app/api/internal/hooks/install/route.ts",nextConfigOutput:"standalone",userland:P}),{workAsyncStorage:j,workUnitAsyncStorage:T,serverHooks:O}=R;async function _(e,t,n){n.requestMeta&&(0,s.setRequestMeta)(e,n.requestMeta),R.isDev&&(0,s.addRequestMeta)(e,"devRequestTimingInternalsEnd",process.hrtime.bigint());let y="/api/internal/hooks/install/route";y=y.replace(/\/index$/,"")||"/";let v=await R.prepare(e,t,{srcPage:y,multiZoneDraftMode:!1});if(!v)return t.statusCode=400,t.end("Bad Request"),null==n.waitUntil||n.waitUntil.call(n,Promise.resolve()),null;let{buildId:k,params:S,nextConfig:C,parsedUrl:A,isDraftMode:b,prerenderManifest:x,routerServerContext:E,isOnDemandRevalidate:P,revalidateOnlyGenerated:j,resolvedPathname:T,clientReferenceManifest:O,serverActionsManifest:_}=v,I=(0,i.normalizeAppPath)(y),N=!!(x.dynamicRoutes[I]||x.routes[T]),D=async()=>((null==E?void 0:E.render404)?await E.render404(e,t,A,!1):t.end("This page could not be found"),null);if(N&&!b){let e=!!x.routes[T],t=x.dynamicRoutes[I];if(t&&!1===t.fallback&&!e){if(C.adapterPath)return await D();throw new g.NoFallbackError}}let H=null;!N||R.isDev||b||(H="/index"===(H=T)?"/":H);let L=!0===R.isDev||!N,$=N&&!L;_&&O&&(0,a.setManifestsSingleton)({page:y,clientReferenceManifest:O,serverActionsManifest:_});let M=e.method||"GET",U=(0,o.getTracer)(),q=U.getActiveScopeSpan(),W=!!(null==E?void 0:E.isWrappedByNextServer),F=!!(0,s.getRequestMeta)(e,"minimalMode"),K=(0,s.getRequestMeta)(e,"incrementalCache")||await R.getIncrementalCache(e,C,x,F);null==K||K.resetRequestCache(),globalThis.__incrementalCache=K;let B={params:S,previewProps:x.preview,renderOpts:{experimental:{authInterrupts:!!C.experimental.authInterrupts},cacheComponents:!!C.cacheComponents,supportsDynamicResponse:L,incrementalCache:K,cacheLifeProfiles:C.cacheLife,waitUntil:n.waitUntil,onClose:e=>{t.on("close",e)},onAfterTaskError:void 0,onInstrumentationRequestError:(t,r,n,s)=>R.onRequestError(e,t,n,s,E)},sharedContext:{buildId:k}},V=new l.NodeNextRequest(e),G=new l.NodeNextResponse(t),z=c.NextRequestAdapter.fromNodeNextRequest(V,(0,c.signalFromNodeResponse)(t));try{let s,a=async e=>R.handle(z,B).finally(()=>{if(!e)return;e.setAttributes({"http.status_code":t.statusCode,"next.rsc":!1});let r=U.getRootSpanAttributes();if(!r)return;if(r.get("next.span_type")!==d.BaseServerSpan.handleRequest)return void console.warn(`Unexpected root span type '${r.get("next.span_type")}'. Please report this Next.js issue https://github.com/vercel/next.js`);let n=r.get("next.route");if(n){let t=`${M} ${n}`;e.setAttributes({"next.route":n,"http.route":n,"next.span_name":t}),e.updateName(t),s&&s!==e&&(s.setAttribute("http.route",n),s.updateName(t))}else e.updateName(`${M} ${y}`)}),i=async s=>{var o,i;let l=async({previousCacheEntry:r})=>{try{if(!F&&P&&j&&!r)return t.statusCode=404,t.setHeader("x-nextjs-cache","REVALIDATED"),t.end("This page could not be found"),null;let o=await a(s);e.fetchMetrics=B.renderOpts.fetchMetrics;let i=B.renderOpts.pendingWaitUntil;i&&n.waitUntil&&(n.waitUntil(i),i=void 0);let l=B.renderOpts.collectedTags;if(!N)return await (0,p.sendResponse)(V,G,o,B.renderOpts.pendingWaitUntil),null;{let e=await o.blob(),t=(0,m.toNodeOutgoingHttpHeaders)(o.headers);l&&(t[f.NEXT_CACHE_TAGS_HEADER]=l),!t["content-type"]&&e.type&&(t["content-type"]=e.type);let r=void 0!==B.renderOpts.collectedRevalidate&&!(B.renderOpts.collectedRevalidate>=f.INFINITE_CACHE)&&B.renderOpts.collectedRevalidate,n=void 0===B.renderOpts.collectedExpire||B.renderOpts.collectedExpire>=f.INFINITE_CACHE?void 0:B.renderOpts.collectedExpire;return{value:{kind:w.CachedRouteKind.APP_ROUTE,status:o.status,body:Buffer.from(await e.arrayBuffer()),headers:t},cacheControl:{revalidate:r,expire:n}}}}catch(t){throw(null==r?void 0:r.isStale)&&await R.onRequestError(e,t,{routerKind:"App Router",routePath:y,routeType:"route",revalidateReason:(0,u.getRevalidateReason)({isStaticGeneration:$,isOnDemandRevalidate:P})},!1,E),t}},c=await R.handleResponse({req:e,nextConfig:C,cacheKey:H,routeKind:r.RouteKind.APP_ROUTE,isFallback:!1,prerenderManifest:x,isRoutePPREnabled:!1,isOnDemandRevalidate:P,revalidateOnlyGenerated:j,responseGenerator:l,waitUntil:n.waitUntil,isMinimalMode:F});if(!N)return null;if((null==c||null==(o=c.value)?void 0:o.kind)!==w.CachedRouteKind.APP_ROUTE)throw Object.defineProperty(Error(`Invariant: app-route received invalid cache entry ${null==c||null==(i=c.value)?void 0:i.kind}`),"__NEXT_ERROR_CODE",{value:"E701",enumerable:!1,configurable:!0});F||t.setHeader("x-nextjs-cache",P?"REVALIDATED":c.isMiss?"MISS":c.isStale?"STALE":"HIT"),b&&t.setHeader("Cache-Control","private, no-cache, no-store, max-age=0, must-revalidate");let d=(0,m.fromNodeOutgoingHttpHeaders)(c.value.headers);return F&&N||d.delete(f.NEXT_CACHE_TAGS_HEADER),!c.cacheControl||t.getHeader("Cache-Control")||d.get("Cache-Control")||d.set("Cache-Control",(0,h.getCacheControlHeader)(c.cacheControl)),await (0,p.sendResponse)(V,G,new Response(c.value.body,{headers:d,status:c.value.status||200})),null};W&&q?await i(q):(s=U.getActiveScopeSpan(),await U.withPropagatedContext(e.headers,()=>U.trace(d.BaseServerSpan.handleRequest,{spanName:`${M} ${y}`,kind:o.SpanKind.SERVER,attributes:{"http.method":M,"http.target":e.url}},i),void 0,!W))}catch(t){if(t instanceof g.NoFallbackError||await R.onRequestError(e,t,{routerKind:"App Router",routePath:I,routeType:"route",revalidateReason:(0,u.getRevalidateReason)({isStaticGeneration:$,isOnDemandRevalidate:P})},!1,E),N)throw t;return await (0,p.sendResponse)(V,G,new Response(null,{status:500})),null}}e.s(["handler",0,_,"patchFetch",0,function(){return(0,n.patchFetch)({workAsyncStorage:j,workUnitAsyncStorage:T})},"routeModule",0,R,"serverHooks",0,O,"workAsyncStorage",0,j,"workUnitAsyncStorage",0,T],212019)},482848,e=>{e.v(e=>Promise.resolve().then(()=>e(874533)))},268548,e=>{e.v(t=>Promise.all(["server/chunks/[externals]_node_util_0xr.y7p._.js"].map(t=>e.l(t))).then(()=>t(812057)))},144264,e=>{e.v(t=>Promise.all(["server/chunks/[externals]_child_process_0pwkpv9._.js"].map(t=>e.l(t))).then(()=>t(233405)))},534777,e=>{e.v(t=>Promise.all(["server/chunks/[externals]_util_0wtvqkc._.js"].map(t=>e.l(t))).then(()=>t(224361)))},200628,e=>{e.v(e=>Promise.resolve().then(()=>e(769310)))}];
|
|
2
|
-
|
|
3
|
-
//# sourceMappingURL=%5Broot-of-the-server%5D__0.tbb~k._.js.map
|
|
@@ -1,3 +0,0 @@
|
|
|
1
|
-
module.exports=[660526,(e,t,s)=>{t.exports=e.x("node:os",()=>require("node:os"))},933919,(e,t,s)=>{t.exports=e.x("@prisma/client-9249dd53ac5b6a44",()=>require("@prisma/client-9249dd53ac5b6a44"))},843793,e=>{"use strict";var t=e.i(933919);let s=globalThis.prisma??new t.PrismaClient({log:[]});process.on("SIGTERM",()=>{s.$disconnect().catch(()=>{})}),process.on("SIGINT",()=>{s.$disconnect().catch(()=>{})}),e.s(["db",0,s])},192520,e=>{"use strict";let t;var s=e.i(750227),r=e.i(660526),i=e.i(902157);function n(){return t||(t=process.env.TOWER_DATA_DIR||(0,s.join)((0,r.homedir)(),".tower"),(0,i.existsSync)(t)||(0,i.mkdirSync)(t,{recursive:!0})),t}e.s(["getAssistantDir",0,function(){let e=(0,s.join)(n(),"assistant");return(0,i.existsSync)(e)||(0,i.mkdirSync)(e,{recursive:!0}),e},"getBackupsDir",0,function(){let e=(0,s.join)(n(),"backups");return(0,i.existsSync)(e)||(0,i.mkdirSync)(e,{recursive:!0}),e},"getExtensionsDir",0,function(){let e=(0,s.join)(n(),"extensions");return(0,i.existsSync)(e)||(0,i.mkdirSync)(e,{recursive:!0}),e},"getStorageDir",0,function(){let e=process.env.TOWER_STORAGE_DIR||function(){try{let e=(0,i.readFileSync)((0,s.join)(n(),"storage-location"),"utf-8").trim();return e.length>0?e:null}catch{return null}}(),t=e&&e.length>0?e:(0,s.join)(n(),"storage");return(0,i.existsSync)(t)||(0,i.mkdirSync)(t,{recursive:!0}),t},"getTowerDbPath",0,function(){let e;return(0,s.join)((e=(0,s.join)(n(),"database"),(0,i.existsSync)(e)||(0,i.mkdirSync)(e,{recursive:!0}),e),"tower.db")},"getTowerDir",0,n])},540193,e=>{"use strict";var t=e.i(750227),s=e.i(902157),r=e.i(192520),i=e.i(843793);function n(e,s){let i=(0,r.getStorageDir)(),n=t.resolve(i,"assets",e,s),c=t.resolve(i,"assets")+t.sep;return n.startsWith(c)?{resolved:n,error:null}:{resolved:null,error:"Invalid path"}}async function c(e,t){let{resolved:r}=n(e,t);if(r&&(0,s.existsSync)(r))return r;let c=await i.db.projectAsset.findFirst({where:{projectId:e,filename:t},select:{path:!0},orderBy:{createdAt:"desc"}});return c?.path&&(0,s.existsSync)(c.path)?c.path:null}async function a(e){return null!==await i.db.projectAsset.findFirst({where:{path:e},select:{id:!0}})}e.s(["MIME_MAP",0,{".png":"image/png",".jpg":"image/jpeg",".jpeg":"image/jpeg",".gif":"image/gif",".webp":"image/webp",".svg":"image/svg+xml",".pdf":"application/pdf",".txt":"text/plain",".md":"text/markdown",".json":"application/json"},"isRegisteredAssetPath",0,a,"resolveAssetFile",0,c,"resolveAssetPath",0,n])},487083,e=>{"use strict";var t=e.i(540193);e.s(["isRegisteredAssetPath",()=>t.isRegisteredAssetPath],487083)}];
|
|
2
|
-
|
|
3
|
-
//# sourceMappingURL=%5Broot-of-the-server%5D__032d9pl._.js.map
|