tower-studio 0.2.43 → 0.2.45
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 +5 -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 +30 -0
- package/.next/standalone/.next/server/app/_global-error/page.js +1 -1
- package/.next/standalone/.next/server/app/_global-error/page.js.nft.json +1 -1
- 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 +2 -2
- package/.next/standalone/.next/server/app/_not-found/page/server-reference-manifest.json +31 -31
- 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 +3 -3
- 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 +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 +4 -3
- 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 +1 -1
- 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 +1 -1
- 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 +3 -2
- 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/harness/ask/route/app-paths-manifest.json +3 -0
- package/.next/standalone/.next/server/app/api/internal/harness/ask/route/build-manifest.json +9 -0
- package/.next/standalone/.next/server/app/api/internal/harness/ask/route/server-reference-manifest.json +4 -0
- package/.next/standalone/.next/server/app/api/internal/harness/ask/route.js +7 -0
- package/.next/standalone/.next/server/app/api/internal/harness/ask/route.js.nft.json +1 -0
- package/.next/standalone/.next/server/app/api/internal/harness/ask/route_client-reference-manifest.js +3 -0
- package/.next/standalone/.next/server/app/api/internal/harness/notify/route/app-paths-manifest.json +3 -0
- package/.next/standalone/.next/server/app/api/internal/harness/notify/route/build-manifest.json +9 -0
- package/.next/standalone/.next/server/app/api/internal/harness/notify/route/server-reference-manifest.json +4 -0
- package/.next/standalone/.next/server/app/api/internal/harness/notify/route.js +7 -0
- package/.next/standalone/.next/server/app/api/internal/harness/notify/route.js.nft.json +1 -0
- package/.next/standalone/.next/server/app/api/internal/harness/notify/route_client-reference-manifest.js +3 -0
- package/.next/standalone/.next/server/app/api/internal/harness/pending/route/app-paths-manifest.json +3 -0
- package/.next/standalone/.next/server/app/api/internal/harness/pending/route/build-manifest.json +9 -0
- package/.next/standalone/.next/server/app/api/internal/harness/pending/route/server-reference-manifest.json +4 -0
- package/.next/standalone/.next/server/app/api/internal/harness/pending/route.js +7 -0
- package/.next/standalone/.next/server/app/api/internal/harness/pending/route.js.nft.json +1 -0
- package/.next/standalone/.next/server/app/api/internal/harness/pending/route_client-reference-manifest.js +3 -0
- package/.next/standalone/.next/server/app/api/internal/harness/reply/route/app-paths-manifest.json +3 -0
- package/.next/standalone/.next/server/app/api/internal/harness/reply/route/build-manifest.json +9 -0
- package/.next/standalone/.next/server/app/api/internal/harness/reply/route/server-reference-manifest.json +4 -0
- package/.next/standalone/.next/server/app/api/internal/harness/reply/route.js +12 -0
- package/.next/standalone/.next/server/app/api/internal/harness/reply/route.js.nft.json +1 -0
- package/.next/standalone/.next/server/app/api/internal/harness/reply/route_client-reference-manifest.js +3 -0
- package/.next/standalone/.next/server/app/api/internal/hooks/install/route.js +1 -1
- 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 +3 -3
- 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.js +1 -1
- package/.next/standalone/.next/server/app/api/internal/terminal/[taskId]/paste-image/route.js.nft.json +1 -1
- 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 +5 -5
- 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 +4 -4
- 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 +2 -2
- 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 +2 -2
- 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/harness/page/app-paths-manifest.json +3 -0
- package/.next/standalone/.next/server/app/harness/page/build-manifest.json +18 -0
- package/.next/standalone/.next/server/app/harness/page/next-font-manifest.json +11 -0
- package/.next/standalone/.next/server/app/harness/page/react-loadable-manifest.json +18 -0
- package/.next/standalone/.next/server/app/harness/page/server-reference-manifest.json +389 -0
- package/.next/standalone/.next/server/app/harness/page.js +25 -0
- package/.next/standalone/.next/server/app/harness/page.js.nft.json +1 -0
- package/.next/standalone/.next/server/app/harness/page_client-reference-manifest.js +3 -0
- package/.next/standalone/.next/server/app/missions/page/react-loadable-manifest.json +1 -1
- package/.next/standalone/.next/server/app/missions/page/server-reference-manifest.json +68 -68
- package/.next/standalone/.next/server/app/missions/page.js +8 -8
- 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 +2 -2
- package/.next/standalone/.next/server/app/onboarding/page/server-reference-manifest.json +31 -31
- 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 +2 -2
- package/.next/standalone/.next/server/app/page/server-reference-manifest.json +31 -31
- 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 +2 -2
- package/.next/standalone/.next/server/app/settings/page/server-reference-manifest.json +132 -96
- package/.next/standalone/.next/server/app/settings/page.js +9 -8
- 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 +2 -2
- package/.next/standalone/.next/server/app/workspaces/[workspaceId]/archive/page/server-reference-manifest.json +106 -106
- package/.next/standalone/.next/server/app/workspaces/[workspaceId]/archive/page.js +8 -8
- 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 +2 -2
- package/.next/standalone/.next/server/app/workspaces/[workspaceId]/assets/page/server-reference-manifest.json +89 -89
- package/.next/standalone/.next/server/app/workspaces/[workspaceId]/assets/page.js +7 -7
- 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 +2 -2
- package/.next/standalone/.next/server/app/workspaces/[workspaceId]/notes/page/server-reference-manifest.json +78 -78
- package/.next/standalone/.next/server/app/workspaces/[workspaceId]/notes/page.js +8 -8
- 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 +2 -2
- package/.next/standalone/.next/server/app/workspaces/[workspaceId]/page/server-reference-manifest.json +77 -77
- package/.next/standalone/.next/server/app/workspaces/[workspaceId]/page.js +8 -7
- 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 +2 -2
- package/.next/standalone/.next/server/app/workspaces/[workspaceId]/projects/[projectId]/page/server-reference-manifest.json +31 -31
- 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 +2 -2
- package/.next/standalone/.next/server/app/workspaces/[workspaceId]/projects/[projectId]/versions/page/server-reference-manifest.json +67 -67
- package/.next/standalone/.next/server/app/workspaces/[workspaceId]/projects/[projectId]/versions/page.js +7 -7
- 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 +3 -3
- package/.next/standalone/.next/server/app/workspaces/[workspaceId]/tasks/[taskId]/page/server-reference-manifest.json +83 -83
- package/.next/standalone/.next/server/app/workspaces/[workspaceId]/tasks/[taskId]/page.js +10 -9
- 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 +2 -2
- package/.next/standalone/.next/server/app/workspaces/page/server-reference-manifest.json +53 -53
- 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 +5 -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_03qwlhl.js +1 -1
- package/.next/standalone/.next/server/chunks/0se9_next_dist_esm_build_templates_app-route_09pca3o.js +1 -1
- package/.next/standalone/.next/server/chunks/0se9_next_dist_esm_build_templates_app-route_0eh8dj_.js +1 -1
- package/.next/standalone/.next/server/chunks/0se9_next_dist_esm_build_templates_app-route_0gr2wxq.js +3 -0
- package/.next/standalone/.next/server/chunks/0se9_next_dist_esm_build_templates_app-route_0h5yr8p.js +1 -1
- package/.next/standalone/.next/server/chunks/0se9_next_dist_esm_build_templates_app-route_0m8aavq.js +1 -1
- package/.next/standalone/.next/server/chunks/0se9_next_dist_esm_build_templates_app-route_0yp430z.js +1 -1
- package/.next/standalone/.next/server/chunks/0se9_next_dist_esm_build_templates_app-route_0yzw48x.js +1 -1
- package/.next/standalone/.next/server/chunks/{[root-of-the-server]__0lvlooo._.js → [root-of-the-server]__0-kboke._.js} +1 -1
- package/.next/standalone/.next/server/chunks/[root-of-the-server]__0-z_a1d._.js +1 -1
- package/.next/standalone/.next/server/chunks/[root-of-the-server]__02r7j6y._.js +3 -0
- package/.next/standalone/.next/server/chunks/[root-of-the-server]__034jopu._.js +4 -0
- package/.next/standalone/.next/server/chunks/[root-of-the-server]__06x1zwj._.js +28 -0
- package/.next/standalone/.next/server/chunks/{[root-of-the-server]__0j7565a._.js → [root-of-the-server]__07xsu6m._.js} +2 -2
- package/.next/standalone/.next/server/chunks/[root-of-the-server]__08-bq72._.js +3 -0
- package/.next/standalone/.next/server/chunks/[root-of-the-server]__08-s.nv._.js +4 -0
- package/.next/standalone/.next/server/chunks/[root-of-the-server]__08clp-r._.js +3 -0
- package/.next/standalone/.next/server/chunks/[root-of-the-server]__095t6ga._.js +3 -0
- package/.next/standalone/.next/server/chunks/[root-of-the-server]__098.3z2._.js +1 -1
- package/.next/standalone/.next/server/chunks/[root-of-the-server]__09arklv._.js +3 -0
- package/.next/standalone/.next/server/chunks/[root-of-the-server]__0_7_w.g._.js +3 -0
- package/.next/standalone/.next/server/chunks/[root-of-the-server]__0_~s0z4._.js +3 -0
- package/.next/standalone/.next/server/chunks/[root-of-the-server]__0ehx6q.._.js +3 -0
- package/.next/standalone/.next/server/chunks/[root-of-the-server]__0gbyryz._.js +3 -0
- package/.next/standalone/.next/server/chunks/[root-of-the-server]__0gn0ubd._.js +1 -1
- package/.next/standalone/.next/server/chunks/[root-of-the-server]__0gwztza._.js +1 -1
- package/.next/standalone/.next/server/chunks/[root-of-the-server]__0k9rz_z._.js +3 -0
- package/.next/standalone/.next/server/chunks/[root-of-the-server]__0khq-k0._.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]__0nt7c0f._.js +3 -0
- package/.next/standalone/.next/server/chunks/[root-of-the-server]__0o6i1wy._.js +3 -0
- package/.next/standalone/.next/server/chunks/[root-of-the-server]__0pmamzv._.js +3 -0
- package/.next/standalone/.next/server/chunks/[root-of-the-server]__0pr~t0y._.js +3 -0
- package/.next/standalone/.next/server/chunks/{[root-of-the-server]__0ajay8_._.js → [root-of-the-server]__0pzyjqf._.js} +1 -1
- package/.next/standalone/.next/server/chunks/[root-of-the-server]__0qcpe0l._.js +3 -0
- package/.next/standalone/.next/server/chunks/[root-of-the-server]__0qfcg6k._.js +3 -0
- package/.next/standalone/.next/server/chunks/[root-of-the-server]__0sq5irw._.js +3 -0
- package/.next/standalone/.next/server/chunks/[root-of-the-server]__0tplo5s._.js +3 -0
- package/.next/standalone/.next/server/chunks/[root-of-the-server]__0tpzojh._.js +3 -0
- package/.next/standalone/.next/server/chunks/[root-of-the-server]__0u8tl88._.js +28 -0
- package/.next/standalone/.next/server/chunks/[root-of-the-server]__0v98a~t._.js +3 -0
- package/.next/standalone/.next/server/chunks/[root-of-the-server]__0vh3112._.js +3 -0
- package/.next/standalone/.next/server/chunks/[root-of-the-server]__0wjr-72._.js +3 -0
- package/.next/standalone/.next/server/chunks/[root-of-the-server]__0xasom7._.js +4 -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]__0xy1t4x._.js +4 -0
- package/.next/standalone/.next/server/chunks/[root-of-the-server]__0y3adwk._.js +3 -0
- package/.next/standalone/.next/server/chunks/[root-of-the-server]__0y~y6sh._.js +3 -0
- package/.next/standalone/.next/server/chunks/[root-of-the-server]__10aw_67._.js +3 -0
- package/.next/standalone/.next/server/chunks/[root-of-the-server]__10ci~o9._.js +3 -0
- package/.next/standalone/.next/server/chunks/[root-of-the-server]__10jnn26._.js +3 -0
- package/.next/standalone/.next/server/chunks/[root-of-the-server]__116v_bx._.js +4 -0
- package/.next/standalone/.next/server/chunks/[root-of-the-server]__119rbly._.js +3 -0
- package/.next/standalone/.next/server/chunks/[root-of-the-server]__12fmxq0._.js +3 -0
- package/.next/standalone/.next/server/chunks/[root-of-the-server]__136ty69._.js +3 -0
- package/.next/standalone/.next/server/chunks/{_0q10iet._.js → _02hac5p._.js} +1 -1
- package/.next/standalone/.next/server/chunks/{_12537g8._.js → _0je3dz2._.js} +1 -1
- package/.next/standalone/.next/server/chunks/_0qk_esg._.js +2 -2
- package/.next/standalone/.next/server/chunks/_0t31z6q._.js +1 -1
- package/.next/standalone/.next/server/chunks/{_0jmdgq~._.js → _0tidm8l._.js} +1 -1
- package/.next/standalone/.next/server/chunks/_0zok2an._.js +7 -0
- package/.next/standalone/.next/server/chunks/_next-internal_server_app_api_internal_harness_ask_route_actions_0_c62hg.js +3 -0
- package/.next/standalone/.next/server/chunks/_next-internal_server_app_api_internal_harness_notify_route_actions_08hof6m.js +3 -0
- package/.next/standalone/.next/server/chunks/_next-internal_server_app_api_internal_harness_pending_route_actions_0w9t_9m.js +3 -0
- package/.next/standalone/.next/server/chunks/_next-internal_server_app_api_internal_harness_reply_route_actions_0qatz~a.js +3 -0
- package/.next/standalone/.next/server/chunks/{src_0fq3zjg._.js → src_05balzk._.js} +2 -2
- package/.next/standalone/.next/server/chunks/src_0aqjfcv._.js +3 -0
- package/.next/standalone/.next/server/chunks/src_0aygchu._.js +3 -0
- package/.next/standalone/.next/server/chunks/{src_0~ey84y._.js → src_0gif-f5._.js} +2 -2
- package/.next/standalone/.next/server/chunks/{src_0wlyw0g._.js → src_0vp6.co._.js} +2 -2
- package/.next/standalone/.next/server/chunks/src_11k6i~l._.js +3 -0
- package/.next/standalone/.next/server/chunks/src_actions_agent-actions_ts_10q9r5b._.js +8 -2
- package/.next/standalone/.next/server/chunks/src_lib_02llcit._.js +1 -1
- package/.next/standalone/.next/server/chunks/src_lib_0aowbzy._.js +1 -1
- package/.next/standalone/.next/server/chunks/src_lib_0d~1~wz._.js +3 -0
- package/.next/standalone/.next/server/chunks/src_lib_0nw5n~t._.js +1 -1
- package/.next/standalone/.next/server/chunks/src_lib_0ylel_1._.js +3 -0
- package/.next/standalone/.next/server/chunks/src_lib_ai_0xx6y51._.js +1 -1
- package/.next/standalone/.next/server/chunks/src_lib_ai_providers_index_ts_0.y.3vp._.js +1 -1
- package/.next/standalone/.next/server/chunks/src_lib_config-defaults_ts_10ayktg._.js +3 -0
- package/.next/standalone/.next/server/chunks/src_lib_config-reader_ts_0e5f7vk._.js +3 -0
- 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/0se9_next_11h0sx_._.js +1 -1
- package/.next/standalone/.next/server/chunks/ssr/0se9_next_dist_esm_build_templates_app-page_0fro4ex.js +4 -0
- package/.next/standalone/.next/server/chunks/ssr/0ws9_lucide-react_dist_esm_icons_0r~ty--._.js +3 -0
- package/.next/standalone/.next/server/chunks/ssr/12k._sonner_dist_index_mjs_0-vmpk5._.js +3 -0
- package/.next/standalone/.next/server/chunks/ssr/[root-of-the-server]__0.q~~2p._.js +3 -0
- package/.next/standalone/.next/server/chunks/ssr/[root-of-the-server]__01zrinc._.js +3 -0
- package/.next/standalone/.next/server/chunks/ssr/{[root-of-the-server]__0iln7n_._.js → [root-of-the-server]__03x8axh._.js} +4 -4
- 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]__051tpij._.js +30 -0
- 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]__06s-_gx._.js +30 -0
- package/.next/standalone/.next/server/chunks/ssr/{[root-of-the-server]__0yby8pl._.js → [root-of-the-server]__06t.cx~._.js} +4 -4
- package/.next/standalone/.next/server/chunks/ssr/[root-of-the-server]__08etd~v._.js +30 -0
- package/.next/standalone/.next/server/chunks/ssr/{[root-of-the-server]__0k6oo0n._.js → [root-of-the-server]__096w7g2._.js} +2 -2
- package/.next/standalone/.next/server/chunks/ssr/{[root-of-the-server]__0ecd_1d._.js → [root-of-the-server]__0__klx0._.js} +4 -4
- package/.next/standalone/.next/server/chunks/ssr/[root-of-the-server]__0ccy_gg._.js +3 -0
- package/.next/standalone/.next/server/chunks/ssr/[root-of-the-server]__0cjmeyl._.js +3 -0
- package/.next/standalone/.next/server/chunks/ssr/[root-of-the-server]__0dfqa5a._.js +30 -0
- package/.next/standalone/.next/server/chunks/ssr/[root-of-the-server]__0dmjt7o._.js +30 -0
- package/.next/standalone/.next/server/chunks/ssr/[root-of-the-server]__0dv.-zu._.js +30 -0
- package/.next/standalone/.next/server/chunks/ssr/{[root-of-the-server]__0lws68d._.js → [root-of-the-server]__0dx9sp-._.js} +4 -4
- package/.next/standalone/.next/server/chunks/ssr/[root-of-the-server]__0f57j8r._.js +47 -0
- package/.next/standalone/.next/server/chunks/ssr/[root-of-the-server]__0fl0l82._.js +30 -0
- package/.next/standalone/.next/server/chunks/ssr/[root-of-the-server]__0g2wrd2._.js +30 -0
- package/.next/standalone/.next/server/chunks/ssr/[root-of-the-server]__0i0k_zi._.js +30 -0
- package/.next/standalone/.next/server/chunks/ssr/[root-of-the-server]__0ixgha6._.js +30 -0
- package/.next/standalone/.next/server/chunks/ssr/[root-of-the-server]__0j1dx6p._.js +47 -0
- 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]__0kn~asi._.js +47 -0
- package/.next/standalone/.next/server/chunks/ssr/{[root-of-the-server]__127w3bm._.js → [root-of-the-server]__0lau3k_._.js} +2 -2
- package/.next/standalone/.next/server/chunks/ssr/[root-of-the-server]__0m.hayd._.js +47 -0
- package/.next/standalone/.next/server/chunks/ssr/[root-of-the-server]__0mpjat-._.js +1 -1
- package/.next/standalone/.next/server/chunks/ssr/{[root-of-the-server]__0_z5hke._.js → [root-of-the-server]__0o9jkew._.js} +1 -1
- package/.next/standalone/.next/server/chunks/ssr/[root-of-the-server]__0sg4fde._.js +4 -0
- package/.next/standalone/.next/server/chunks/ssr/[root-of-the-server]__0t_zq~v._.js +30 -0
- package/.next/standalone/.next/server/chunks/ssr/{[root-of-the-server]__0zzqn5z._.js → [root-of-the-server]__0tb.1li._.js} +2 -2
- package/.next/standalone/.next/server/chunks/ssr/{[root-of-the-server]__04ednzb._.js → [root-of-the-server]__0vi-5xg._.js} +2 -2
- package/.next/standalone/.next/server/chunks/ssr/[root-of-the-server]__0w24qox._.js +47 -0
- package/.next/standalone/.next/server/chunks/ssr/[root-of-the-server]__0wq~4aj._.js +30 -0
- package/.next/standalone/.next/server/chunks/ssr/[root-of-the-server]__0ydiu_y._.js +30 -0
- package/.next/standalone/.next/server/chunks/ssr/[root-of-the-server]__0yihqy6._.js +3 -0
- package/.next/standalone/.next/server/chunks/ssr/[root-of-the-server]__0ynq8ty._.js +3 -0
- 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]__0zouyfp._.js +3 -0
- package/.next/standalone/.next/server/chunks/ssr/[root-of-the-server]__0~s8otw._.js +30 -0
- package/.next/standalone/.next/server/chunks/ssr/[root-of-the-server]__1184s~q._.js +3 -0
- package/.next/standalone/.next/server/chunks/ssr/[root-of-the-server]__11fp64w._.js +3 -0
- package/.next/standalone/.next/server/chunks/ssr/_0-~9em3._.js +1 -1
- package/.next/standalone/.next/server/chunks/ssr/_0..h3hk._.js +3 -0
- package/.next/standalone/.next/server/chunks/ssr/_0.iq8t8._.js +4 -0
- package/.next/standalone/.next/server/chunks/ssr/_00.myc6._.js +3 -0
- package/.next/standalone/.next/server/chunks/ssr/_00eymu8._.js +3 -0
- package/.next/standalone/.next/server/chunks/ssr/{_07lq-bp._.js → _01fdzzv._.js} +1 -1
- package/.next/standalone/.next/server/chunks/ssr/{_0_q41~z._.js → _03-we0p._.js} +4 -4
- package/.next/standalone/.next/server/chunks/ssr/{_0uryq~z._.js → _04szgc6._.js} +2 -2
- package/.next/standalone/.next/server/chunks/ssr/{_113957g._.js → _078cdw~._.js} +1 -1
- package/.next/standalone/.next/server/chunks/ssr/_08bq4g8._.js +1 -1
- package/.next/standalone/.next/server/chunks/ssr/{_0j5.ig_._.js → _09rq08e._.js} +1 -1
- package/.next/standalone/.next/server/chunks/ssr/_09z-55_._.js +17 -0
- package/.next/standalone/.next/server/chunks/ssr/{src_components_ui_popover_tsx_0a78wqo._.js → _0bndp1~._.js} +2 -2
- package/.next/standalone/.next/server/chunks/ssr/{_08-x_rp._.js → _0h0b46r._.js} +1 -1
- package/.next/standalone/.next/server/chunks/ssr/{_0wqcz3w._.js → _0kd_tda._.js} +4 -4
- package/.next/standalone/.next/server/chunks/ssr/{_07q06~v._.js → _0ktexki._.js} +4 -4
- package/.next/standalone/.next/server/chunks/ssr/{_0b7smy6._.js → _0ljrvyt._.js} +2 -2
- package/.next/standalone/.next/server/chunks/ssr/_0lo1nei._.js +6 -0
- package/.next/standalone/.next/server/chunks/ssr/_0mdd702._.js +3 -0
- package/.next/standalone/.next/server/chunks/ssr/_0n0q6~9._.js +3 -0
- package/.next/standalone/.next/server/chunks/ssr/_0os43sb._.js +3 -0
- package/.next/standalone/.next/server/chunks/ssr/_0pab_al._.js +3 -0
- package/.next/standalone/.next/server/chunks/ssr/{_047dh-f._.js → _0pg6-.y._.js} +2 -2
- package/.next/standalone/.next/server/chunks/ssr/{_05a2u03._.js → _0pvp63a._.js} +4 -4
- package/.next/standalone/.next/server/chunks/ssr/_0qi4x-5._.js +3 -0
- package/.next/standalone/.next/server/chunks/ssr/{_0s.h4l2._.js → _0qnobd-._.js} +1 -1
- package/.next/standalone/.next/server/chunks/ssr/_0rdyrfd._.js +1 -1
- package/.next/standalone/.next/server/chunks/ssr/_0ts~td3._.js +3 -0
- package/.next/standalone/.next/server/chunks/ssr/_0wbcp88._.js +1 -1
- package/.next/standalone/.next/server/chunks/ssr/{_0s.ik0k._.js → _0xnn~jq._.js} +1 -1
- package/.next/standalone/.next/server/chunks/ssr/_0y0_4zs._.js +3 -0
- package/.next/standalone/.next/server/chunks/ssr/{_0nze-e6._.js → _0ytcm0j._.js} +1 -1
- package/.next/standalone/.next/server/chunks/ssr/_0yva1-.._.js +3 -0
- package/.next/standalone/.next/server/chunks/ssr/{_0dxbp89._.js → _0yz5dmq._.js} +4 -4
- package/.next/standalone/.next/server/chunks/ssr/{_060e1u.._.js → _0~6pqk.._.js} +1 -1
- package/.next/standalone/.next/server/chunks/ssr/_11w13--._.js +3 -0
- package/.next/standalone/.next/server/chunks/ssr/{_0oeih09._.js → _12la163._.js} +2 -2
- package/.next/standalone/.next/server/chunks/ssr/{_0rtydyv._.js → _13_b8hh._.js} +1 -1
- package/.next/standalone/.next/server/chunks/ssr/node_modules__pnpm_09eeb85._.js +3 -0
- 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_0vv366l._.js +3 -0
- package/.next/standalone/.next/server/chunks/ssr/src_actions_agent-actions_ts_0~wc.sy._.js +8 -2
- 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_0rowjw~._.js +7 -0
- package/.next/standalone/.next/server/chunks/ssr/{src_lib_0.~.oo-._.js → src_lib_0-x.wbd._.js} +1 -1
- package/.next/standalone/.next/server/chunks/ssr/{src_lib_00wjv6n._.js → src_lib_00p-ir2._.js} +1 -1
- package/.next/standalone/.next/server/chunks/ssr/src_lib_03x1i~1._.js +5 -0
- package/.next/standalone/.next/server/chunks/ssr/{src_lib_005uqbe._.js → src_lib_03xtona._.js} +1 -1
- package/.next/standalone/.next/server/chunks/ssr/{src_lib_01sr8_t._.js → src_lib_04y-65j._.js} +1 -1
- package/.next/standalone/.next/server/chunks/ssr/src_lib_08gthaz._.js +3 -0
- package/.next/standalone/.next/server/chunks/ssr/src_lib_090~6pq._.js +3 -0
- package/.next/standalone/.next/server/chunks/ssr/src_lib_0k8dkbn._.js +3 -0
- package/.next/standalone/.next/server/chunks/ssr/src_lib_0knbpxk._.js +3 -0
- package/.next/standalone/.next/server/chunks/ssr/src_lib_0p_iehl._.js +3 -0
- package/.next/standalone/.next/server/chunks/ssr/src_lib_0qve1ri._.js +3 -0
- package/.next/standalone/.next/server/chunks/ssr/src_lib_0s35u~4._.js +3 -0
- package/.next/standalone/.next/server/chunks/ssr/src_lib_0x2ui80._.js +3 -0
- package/.next/standalone/.next/server/chunks/ssr/src_lib_0ypc5_d._.js +3 -0
- package/.next/standalone/.next/server/chunks/ssr/src_lib_10jh2mz._.js +3 -0
- package/.next/standalone/.next/server/chunks/ssr/src_lib_harness_harness-message_ts_0_3ygf9._.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 +5 -0
- package/.next/standalone/.next/server/instrumentation.js +1 -1
- package/.next/standalone/.next/server/middleware-build-manifest.js +3 -3
- package/.next/standalone/.next/server/next-font-manifest.js +1 -1
- package/.next/standalone/.next/server/next-font-manifest.json +4 -0
- 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 +582 -330
- package/.next/standalone/.next/static/chunks/0-nppzqp-r.9c.js +1 -0
- package/.next/standalone/.next/static/chunks/{0-vgfstmpuwnx.js → 0-te2tg6~a23u.js} +1 -1
- package/.next/standalone/.next/static/chunks/0.64.6c1mh7d2.js +1 -0
- package/.next/standalone/.next/static/chunks/0.8n1ce9lggg4.js +1 -0
- package/.next/standalone/.next/static/chunks/0.zgqz~m3sjej.js +1 -0
- package/.next/standalone/.next/static/chunks/00.eotegra08r.js +1 -0
- package/.next/standalone/.next/static/chunks/{0sr-m2t6vck14.js → 02xqrfqu.s8-i.js} +1 -1
- package/.next/standalone/.next/static/chunks/03y272e6e9o8i.js +1 -0
- package/.next/standalone/.next/static/chunks/08eyd7sq064r0.js +1 -0
- package/.next/standalone/.next/static/chunks/09b33znj4m__c.js +1 -0
- package/.next/standalone/.next/static/chunks/{0ts___1ygewqp.js → 09bezwcb__18t.js} +1 -1
- package/.next/standalone/.next/static/chunks/{14mk_a0k99wbg.js → 0bvhkgitn__gl.js} +1 -1
- package/.next/standalone/.next/static/chunks/0c.t.evwah_m4.js +1 -0
- package/.next/standalone/.next/static/chunks/{08i9.47-_mxro.js → 0c4-6qdhi645s.js} +1 -1
- package/.next/standalone/.next/static/chunks/0d0zm8viq3ol4.js +12 -0
- package/.next/standalone/.next/static/chunks/0dktl5t_dtxu..js +1 -0
- package/.next/standalone/.next/static/chunks/0e5~nzt657k92.js +1 -0
- package/.next/standalone/.next/static/chunks/0erwxvpb9w29_.js +1 -0
- package/.next/standalone/.next/static/chunks/{04op7bjge~n4l.js → 0gy79dfi~lnig.js} +1 -1
- package/.next/standalone/.next/static/chunks/{0rjt_ddd~6t8r.js → 0gz3xwb5_8xwv.js} +1 -1
- package/.next/standalone/.next/static/chunks/0i75~pu.bp20..js +1 -0
- package/.next/standalone/.next/static/chunks/0jn_w5b9r~beu.js +1 -0
- package/.next/standalone/.next/static/chunks/0l59z2mf1ouxu.js +1 -0
- package/.next/standalone/.next/static/chunks/0m4xd-ie7j.hx.js +1 -0
- package/.next/standalone/.next/static/chunks/0mx9ebe6we4z0.js +1 -0
- package/.next/standalone/.next/static/chunks/0nsggimu5je3g.js +1 -0
- package/.next/standalone/.next/static/chunks/0nw8nx8kafy79.js +1 -0
- package/.next/standalone/.next/static/chunks/0pzjryav9pm7p.js +1 -0
- package/.next/standalone/.next/static/chunks/0q-rl50zskr35.js +1 -0
- package/.next/standalone/.next/static/chunks/0qqy2x-fsmmmx.js +1 -0
- package/.next/standalone/.next/static/chunks/0t59wpux0g1~l.js +1 -0
- package/.next/standalone/.next/static/chunks/0uezq8wiwkq8d.js +1 -0
- package/.next/standalone/.next/static/chunks/0vrc~7m1_cuvl.js +1 -0
- package/.next/standalone/.next/static/chunks/0xbh24-hxrt~m.css +1 -0
- package/.next/standalone/.next/static/chunks/0xkkmruo8p.l_.js +1 -0
- package/.next/standalone/.next/static/chunks/0xx0pe_j2kmr9.js +2 -0
- package/.next/standalone/.next/static/chunks/0zqjqiqmorenw.js +5 -0
- package/.next/standalone/.next/static/chunks/136l78utn~v08.js +1 -0
- package/.next/standalone/.next/static/chunks/171x9kw9wcyk4.js +1 -0
- package/.next/standalone/.next/static/chunks/{11p.r-9wyh7_2.js → 17m4o~gdsvuo3.js} +1 -1
- package/.next/standalone/package.json +5 -5
- package/dist/mcp-server.cjs +227 -25
- package/package.json +5 -5
- package/prisma/schema.prisma +37 -0
- package/scripts/migrations/0005-add-parent-task-id.ts +29 -0
- package/scripts/{stop-hook.js → tower-stop-hook.js} +42 -3
- package/skills/tower/SKILL.md +31 -0
- package/skills/tower/references/unattended-messaging.md +95 -0
- package/tsconfig.json +14 -4
- package/.next/standalone/.next/server/chunks/[externals]__0m6hc.0._.js +0 -3
- package/.next/standalone/.next/server/chunks/[root-of-the-server]__0.p6em~._.js +0 -3
- package/.next/standalone/.next/server/chunks/[root-of-the-server]__0.zmhk-._.js +0 -3
- package/.next/standalone/.next/server/chunks/[root-of-the-server]__0042hx5._.js +0 -3
- package/.next/standalone/.next/server/chunks/[root-of-the-server]__03ufxqq._.js +0 -28
- package/.next/standalone/.next/server/chunks/[root-of-the-server]__04--bs7._.js +0 -3
- package/.next/standalone/.next/server/chunks/[root-of-the-server]__04m2l8a._.js +0 -3
- package/.next/standalone/.next/server/chunks/[root-of-the-server]__04r193~._.js +0 -3
- package/.next/standalone/.next/server/chunks/[root-of-the-server]__05abzth._.js +0 -3
- package/.next/standalone/.next/server/chunks/[root-of-the-server]__0657y50._.js +0 -3
- package/.next/standalone/.next/server/chunks/[root-of-the-server]__075a0hk._.js +0 -3
- package/.next/standalone/.next/server/chunks/[root-of-the-server]__08yqoti._.js +0 -3
- package/.next/standalone/.next/server/chunks/[root-of-the-server]__0_d.s7s._.js +0 -28
- package/.next/standalone/.next/server/chunks/[root-of-the-server]__0b25v3p._.js +0 -4
- package/.next/standalone/.next/server/chunks/[root-of-the-server]__0clptds._.js +0 -3
- package/.next/standalone/.next/server/chunks/[root-of-the-server]__0g.k9o~._.js +0 -3
- package/.next/standalone/.next/server/chunks/[root-of-the-server]__0h6bl6t._.js +0 -3
- package/.next/standalone/.next/server/chunks/[root-of-the-server]__0i~3dwq._.js +0 -3
- package/.next/standalone/.next/server/chunks/[root-of-the-server]__0j05vlm._.js +0 -3
- package/.next/standalone/.next/server/chunks/[root-of-the-server]__0j1px8f._.js +0 -3
- package/.next/standalone/.next/server/chunks/[root-of-the-server]__0k-5ag7._.js +0 -3
- package/.next/standalone/.next/server/chunks/[root-of-the-server]__0otyifi._.js +0 -3
- package/.next/standalone/.next/server/chunks/[root-of-the-server]__0q~uf3u._.js +0 -3
- package/.next/standalone/.next/server/chunks/[root-of-the-server]__0t31ba_._.js +0 -3
- package/.next/standalone/.next/server/chunks/[root-of-the-server]__0t_weyi._.js +0 -3
- package/.next/standalone/.next/server/chunks/[root-of-the-server]__0uptkzd._.js +0 -4
- package/.next/standalone/.next/server/chunks/[root-of-the-server]__0wkjqrd._.js +0 -3
- package/.next/standalone/.next/server/chunks/[root-of-the-server]__0x3kws1._.js +0 -3
- package/.next/standalone/.next/server/chunks/[root-of-the-server]__0y8w5di._.js +0 -4
- package/.next/standalone/.next/server/chunks/[root-of-the-server]__0~g6-c~._.js +0 -3
- package/.next/standalone/.next/server/chunks/[root-of-the-server]__10fv6tt._.js +0 -3
- package/.next/standalone/.next/server/chunks/[root-of-the-server]__1189rd1._.js +0 -4
- package/.next/standalone/.next/server/chunks/src_0weytpz._.js +0 -3
- package/.next/standalone/.next/server/chunks/src_lib_0i2.v2d._.js +0 -3
- package/.next/standalone/.next/server/chunks/src_lib_12xey8u._.js +0 -3
- package/.next/standalone/.next/server/chunks/ssr/0ws9_lucide-react_dist_esm_icons_0pkla8j._.js +0 -3
- package/.next/standalone/.next/server/chunks/ssr/[root-of-the-server]__00dh103._.js +0 -3
- package/.next/standalone/.next/server/chunks/ssr/[root-of-the-server]__00ebsjb._.js +0 -30
- package/.next/standalone/.next/server/chunks/ssr/[root-of-the-server]__01vm_46._.js +0 -47
- package/.next/standalone/.next/server/chunks/ssr/[root-of-the-server]__025ol9g._.js +0 -3
- package/.next/standalone/.next/server/chunks/ssr/[root-of-the-server]__065f3ii._.js +0 -3
- package/.next/standalone/.next/server/chunks/ssr/[root-of-the-server]__06dfcgo._.js +0 -30
- package/.next/standalone/.next/server/chunks/ssr/[root-of-the-server]__07xkj1s._.js +0 -47
- package/.next/standalone/.next/server/chunks/ssr/[root-of-the-server]__08k-xb7._.js +0 -3
- package/.next/standalone/.next/server/chunks/ssr/[root-of-the-server]__08tzbfh._.js +0 -3
- package/.next/standalone/.next/server/chunks/ssr/[root-of-the-server]__0iaw1ms._.js +0 -3
- package/.next/standalone/.next/server/chunks/ssr/[root-of-the-server]__0j_-qk5._.js +0 -30
- package/.next/standalone/.next/server/chunks/ssr/[root-of-the-server]__0oamph.._.js +0 -47
- package/.next/standalone/.next/server/chunks/ssr/[root-of-the-server]__0pnv7nd._.js +0 -30
- package/.next/standalone/.next/server/chunks/ssr/[root-of-the-server]__0stlq2_._.js +0 -4
- package/.next/standalone/.next/server/chunks/ssr/[root-of-the-server]__0tja~wz._.js +0 -30
- package/.next/standalone/.next/server/chunks/ssr/[root-of-the-server]__0ug022w._.js +0 -30
- package/.next/standalone/.next/server/chunks/ssr/[root-of-the-server]__0x6k.ee._.js +0 -30
- package/.next/standalone/.next/server/chunks/ssr/[root-of-the-server]__0xr45lx._.js +0 -3
- package/.next/standalone/.next/server/chunks/ssr/[root-of-the-server]__0xwzk2.._.js +0 -47
- package/.next/standalone/.next/server/chunks/ssr/[root-of-the-server]__0zxc81t._.js +0 -30
- package/.next/standalone/.next/server/chunks/ssr/[root-of-the-server]__10c.a3u._.js +0 -30
- package/.next/standalone/.next/server/chunks/ssr/[root-of-the-server]__10n3vn6._.js +0 -30
- package/.next/standalone/.next/server/chunks/ssr/[root-of-the-server]__123rmyb._.js +0 -30
- package/.next/standalone/.next/server/chunks/ssr/[root-of-the-server]__124zb~p._.js +0 -30
- package/.next/standalone/.next/server/chunks/ssr/[root-of-the-server]__12ko8p6._.js +0 -3
- package/.next/standalone/.next/server/chunks/ssr/[root-of-the-server]__13ce7v2._.js +0 -30
- package/.next/standalone/.next/server/chunks/ssr/_00l85fp._.js +0 -4
- package/.next/standalone/.next/server/chunks/ssr/_00odlgv._.js +0 -3
- package/.next/standalone/.next/server/chunks/ssr/_0463zy~._.js +0 -3
- package/.next/standalone/.next/server/chunks/ssr/_05k76ur._.js +0 -3
- package/.next/standalone/.next/server/chunks/ssr/_070t_mh._.js +0 -6
- package/.next/standalone/.next/server/chunks/ssr/_0cj9a7y._.js +0 -7
- package/.next/standalone/.next/server/chunks/ssr/_0gkid_a._.js +0 -3
- package/.next/standalone/.next/server/chunks/ssr/_0rrs.-d._.js +0 -3
- package/.next/standalone/.next/server/chunks/ssr/_0rxeqmo._.js +0 -17
- package/.next/standalone/.next/server/chunks/ssr/_0syb503._.js +0 -3
- package/.next/standalone/.next/server/chunks/ssr/node_modules__pnpm_03r.9go._.js +0 -3
- package/.next/standalone/.next/server/chunks/ssr/node_modules__pnpm_06f0dao._.js +0 -3
- package/.next/standalone/.next/server/chunks/ssr/src_components_ui_select_tsx_0d2ra01._.js +0 -3
- package/.next/standalone/.next/server/chunks/ssr/src_lib_08jql1e._.js +0 -3
- package/.next/standalone/.next/server/chunks/ssr/src_lib_0b~j-9d._.js +0 -3
- package/.next/standalone/.next/server/chunks/ssr/src_lib_0eymyjf._.js +0 -3
- package/.next/standalone/.next/server/chunks/ssr/src_lib_0fkv9z3._.js +0 -3
- package/.next/standalone/.next/server/chunks/ssr/src_lib_0n-n0.a._.js +0 -3
- package/.next/standalone/.next/server/chunks/ssr/src_lib_0sgt~lv._.js +0 -3
- package/.next/standalone/.next/server/chunks/ssr/src_lib_0sms4xl._.js +0 -5
- package/.next/standalone/.next/server/chunks/ssr/src_lib_0x-iyl1._.js +0 -3
- package/.next/standalone/.next/server/chunks/ssr/src_lib_0yjmty1._.js +0 -3
- package/.next/standalone/.next/server/chunks/ssr/src_lib_13aevv6._.js +0 -3
- package/.next/standalone/.next/static/chunks/0.lqb7y9kz5z6.js +0 -1
- package/.next/standalone/.next/static/chunks/0.lyp-cx3zt9..js +0 -2
- package/.next/standalone/.next/static/chunks/00z.kuqsfrxq5.js +0 -12
- package/.next/standalone/.next/static/chunks/01rbl6a8z.tuw.js +0 -1
- package/.next/standalone/.next/static/chunks/01yoibobkdz3x.js +0 -1
- package/.next/standalone/.next/static/chunks/05v-c3ir3ik_1.js +0 -5
- package/.next/standalone/.next/static/chunks/070fs6rmafi.i.js +0 -1
- package/.next/standalone/.next/static/chunks/07i9j5yyg4vs3.js +0 -1
- package/.next/standalone/.next/static/chunks/0_yp-y9l0upp~.js +0 -1
- package/.next/standalone/.next/static/chunks/0ddt-snh45031.js +0 -1
- package/.next/standalone/.next/static/chunks/0evfu1ozaw5ak.js +0 -1
- package/.next/standalone/.next/static/chunks/0gq65t6au55oa.js +0 -1
- package/.next/standalone/.next/static/chunks/0gz71w_~yw2iu.js +0 -1
- package/.next/standalone/.next/static/chunks/0hk3lmsij2x1c.js +0 -1
- package/.next/standalone/.next/static/chunks/0j1hqwmeaqnn2.js +0 -1
- package/.next/standalone/.next/static/chunks/0jrje~1gt6w85.css +0 -1
- package/.next/standalone/.next/static/chunks/0p4w5b_p_yju8.js +0 -1
- package/.next/standalone/.next/static/chunks/0prrt_bws8ml6.js +0 -1
- package/.next/standalone/.next/static/chunks/0qgqjy.9.-qpi.js +0 -1
- package/.next/standalone/.next/static/chunks/0rfq8fy71hj7c.js +0 -1
- package/.next/standalone/.next/static/chunks/0rnitheqdpd1..js +0 -1
- package/.next/standalone/.next/static/chunks/0vmy6tsqy.xf4.js +0 -1
- package/.next/standalone/.next/static/chunks/0wbq-_8jyxjxm.js +0 -1
- package/.next/standalone/.next/static/chunks/0xejm4ge9~cn..js +0 -1
- package/.next/standalone/.next/static/chunks/0~prx0ure_1i6.js +0 -1
- package/.next/standalone/.next/static/chunks/1107zshxaajt9.js +0 -1
- package/.next/standalone/.next/static/chunks/11x3_612u8w~9.js +0 -1
- /package/.next/standalone/.next/static/{d-Uhp63kgWdPkhPt7Fzyb → f1860bJqnbYj-1WLMj7F-}/_buildManifest.js +0 -0
- /package/.next/standalone/.next/static/{d-Uhp63kgWdPkhPt7Fzyb → f1860bJqnbYj-1WLMj7F-}/_clientMiddlewareManifest.js +0 -0
- /package/.next/standalone/.next/static/{d-Uhp63kgWdPkhPt7Fzyb → f1860bJqnbYj-1WLMj7F-}/_ssgManifest.js +0 -0
- /package/scripts/{post-tool-hook.js → tower-post-tool-hook.js} +0 -0
- /package/scripts/{session-start-hook.js → tower-session-start-hook.js} +0 -0
package/dist/mcp-server.cjs
CHANGED
|
@@ -14365,6 +14365,11 @@ function getTowerDbFilePath() {
|
|
|
14365
14365
|
const root = process.env.TOWER_DATA_DIR || (0, import_node_path2.join)((0, import_node_os2.homedir)(), ".tower");
|
|
14366
14366
|
return (0, import_node_path2.join)(root, "database", "tower.db");
|
|
14367
14367
|
}
|
|
14368
|
+
function getSignalDir() {
|
|
14369
|
+
const root = process.env.TOWER_DATA_DIR || (0, import_node_path2.join)((0, import_node_os2.homedir)(), ".tower");
|
|
14370
|
+
const hash2 = (0, import_node_crypto.createHash)("sha256").update(root).digest("hex").slice(0, 16);
|
|
14371
|
+
return (0, import_node_path2.join)((0, import_node_os2.tmpdir)(), "tower-signals", hash2);
|
|
14372
|
+
}
|
|
14368
14373
|
function getDefaultStorageDir() {
|
|
14369
14374
|
return (0, import_node_path2.join)(getTowerDir(), "storage");
|
|
14370
14375
|
}
|
|
@@ -14385,12 +14390,13 @@ function getStorageDir() {
|
|
|
14385
14390
|
if (!(0, import_node_fs.existsSync)(dir)) (0, import_node_fs.mkdirSync)(dir, { recursive: true });
|
|
14386
14391
|
return dir;
|
|
14387
14392
|
}
|
|
14388
|
-
var import_node_path2, import_node_os2, import_node_fs, _dir;
|
|
14393
|
+
var import_node_path2, import_node_os2, import_node_crypto, import_node_fs, _dir;
|
|
14389
14394
|
var init_tower_dir = __esm({
|
|
14390
14395
|
"src/lib/tower-dir.ts"() {
|
|
14391
14396
|
"use strict";
|
|
14392
14397
|
import_node_path2 = require("node:path");
|
|
14393
14398
|
import_node_os2 = require("node:os");
|
|
14399
|
+
import_node_crypto = require("node:crypto");
|
|
14394
14400
|
import_node_fs = require("node:fs");
|
|
14395
14401
|
}
|
|
14396
14402
|
});
|
|
@@ -26373,7 +26379,24 @@ async function removeWorktree(localPathRaw, taskId) {
|
|
|
26373
26379
|
);
|
|
26374
26380
|
}
|
|
26375
26381
|
}
|
|
26376
|
-
|
|
26382
|
+
function isTowerLinkedDir(relPath, worktreeRoot) {
|
|
26383
|
+
const cleaned = relPath.replace(/[/\\]+$/, "");
|
|
26384
|
+
const base = import_path.default.basename(cleaned);
|
|
26385
|
+
if (!WORKTREE_LINKED_DIRS.includes(base)) return false;
|
|
26386
|
+
try {
|
|
26387
|
+
return (0, import_fs.lstatSync)(import_path.default.join(worktreeRoot, cleaned)).isSymbolicLink();
|
|
26388
|
+
} catch {
|
|
26389
|
+
return false;
|
|
26390
|
+
}
|
|
26391
|
+
}
|
|
26392
|
+
function stripTowerLinkedStatus(porcelainLines, worktreeRoot) {
|
|
26393
|
+
return porcelainLines.filter((line) => {
|
|
26394
|
+
if (!line.startsWith("??")) return true;
|
|
26395
|
+
const relPath = line.slice(2).trim();
|
|
26396
|
+
return !isTowerLinkedDir(relPath, worktreeRoot);
|
|
26397
|
+
});
|
|
26398
|
+
}
|
|
26399
|
+
var import_child_process, import_fs, import_path, import_os, WORKTREE_LINKED_DIRS;
|
|
26377
26400
|
var init_worktree = __esm({
|
|
26378
26401
|
"src/lib/worktree.ts"() {
|
|
26379
26402
|
"use strict";
|
|
@@ -26382,6 +26405,7 @@ var init_worktree = __esm({
|
|
|
26382
26405
|
import_path = __toESM(require("path"));
|
|
26383
26406
|
import_os = __toESM(require("os"));
|
|
26384
26407
|
init_logger();
|
|
26408
|
+
WORKTREE_LINKED_DIRS = ["node_modules", ".next"];
|
|
26385
26409
|
}
|
|
26386
26410
|
});
|
|
26387
26411
|
|
|
@@ -26572,7 +26596,12 @@ var init_config_defaults = __esm({
|
|
|
26572
26596
|
"",
|
|
26573
26597
|
"## Scope Boundary",
|
|
26574
26598
|
"If the user asks you to write code, explain code, debug, search the web, read/write files, or anything outside Tower task management, reply:",
|
|
26575
|
-
'"\u62B1\u6B49\uFF0C\u6211\u53EA\u80FD\u5E2E\u4F60\u7BA1\u7406\u5DE5\u4F5C\u533A\u3001\u9879\u76EE\u548C\u4EFB\u52A1\u3002\u7F16\u7801\u3001\u8C03\u8BD5\u7B49\u64CD\u4F5C\u8BF7\u5728\u4EFB\u52A1\u7EC8\u7AEF\u4E2D\u5B8C\u6210\u3002"'
|
|
26599
|
+
'"\u62B1\u6B49\uFF0C\u6211\u53EA\u80FD\u5E2E\u4F60\u7BA1\u7406\u5DE5\u4F5C\u533A\u3001\u9879\u76EE\u548C\u4EFB\u52A1\u3002\u7F16\u7801\u3001\u8C03\u8BD5\u7B49\u64CD\u4F5C\u8BF7\u5728\u4EFB\u52A1\u7EC8\u7AEF\u4E2D\u5B8C\u6210\u3002"',
|
|
26600
|
+
"",
|
|
26601
|
+
"## \u4EFB\u52A1\u6765\u6E90\u6807\u6CE8",
|
|
26602
|
+
"\u6BCF\u6B21\u901A\u8FC7 create_task \u521B\u5EFA\u4EFB\u52A1\u65F6\uFF0C\u5728 description \u672B\u5C3E\u8FFD\u52A0\u4E00\u6BB5\u6765\u6E90\u6807\u6CE8\uFF08\u4E0E\u4EFB\u52A1\u7EC8\u7AEF\u3001\u98DE\u4E66\u7684\u6765\u6E90\u89C4\u8303\u4E00\u81F4\uFF09\uFF1A",
|
|
26603
|
+
"## \u6765\u6E90",
|
|
26604
|
+
"Tower Assistant"
|
|
26576
26605
|
].join("\n"),
|
|
26577
26606
|
type: "string",
|
|
26578
26607
|
label: "Assistant System Prompt"
|
|
@@ -26604,6 +26633,74 @@ var init_config_defaults = __esm({
|
|
|
26604
26633
|
defaultValue: false,
|
|
26605
26634
|
type: "boolean",
|
|
26606
26635
|
label: "MCP Task Defaults Configured"
|
|
26636
|
+
},
|
|
26637
|
+
// 内置系统声明:所有任务启动时作为 --append-system-prompt 注入(与任务自选的
|
|
26638
|
+
// AgentPrompt merge,内置在前)。built-in:默认值在代码里删不掉(不可删),但可经
|
|
26639
|
+
// SystemConfig 覆盖(可修改)。
|
|
26640
|
+
"task.systemDirective": {
|
|
26641
|
+
defaultValue: [
|
|
26642
|
+
"## Tower \u7CFB\u7EDF\u8BF4\u660E",
|
|
26643
|
+
"\u4F60\u8FD0\u884C\u5728 Tower\uFF08\u4E00\u4E2A AI \u4EFB\u52A1\u8C03\u5EA6\u5E73\u53F0\uFF09\u7684\u4EFB\u52A1\u7EC8\u7AEF\u91CC\uFF0C\u4E3A\u67D0\u4E2A\u5177\u4F53\u4EFB\u52A1\u800C\u542F\u52A8\u3002\u4F60\u7684\u4EA7\u51FA\u4F1A\u88AB Tower \u8BB0\u5F55\u4E3A\u300C\u4EFB\u52A1\u6267\u884C\u300D\uFF0C\u4EFB\u52A1\u7ED3\u675F\u540E\u8FDB\u5165 review \u72B6\u6001\uFF0C\u53EF\u80FD\u88AB\u6D3E\u751F\u4F60\u7684\u7236\u4EFB\u52A1\u6216\u7528\u6237\u5BA1\u9605\u3002\u73AF\u5883\u53D8\u91CF\u91CC\u6709 TOWER_TASK_ID\uFF08\u5F53\u524D\u4EFB\u52A1 id\uFF09\u3001TOWER_TASK_TITLE\uFF08\u4EFB\u52A1\u6807\u9898\uFF09\u7B49\uFF0C\u53EF\u7528\u6765\u8BC6\u522B\u81EA\u5DF1\u3002",
|
|
26644
|
+
"",
|
|
26645
|
+
"## \u9996\u8981\u539F\u5219",
|
|
26646
|
+
"- **\u9879\u76EE\u81EA\u8EAB\u89C4\u5219\u4F18\u5148**\uFF1A\u5DE5\u4F5C\u76EE\u5F55\u91CC\u9879\u76EE\u7684 CLAUDE.md / AGENTS.md \u7B49\u7EA6\u5B9A\u4F18\u5148\u7EA7\u6700\u9AD8\uFF0C\u4E0E\u672C\u58F0\u660E\u51B2\u7A81\u65F6\u4EE5\u9879\u76EE\u89C4\u5219\u4E3A\u51C6\u3002\u672C\u58F0\u660E\u53EA\u89C4\u5B9A\u300C\u4F5C\u4E3A\u4E00\u4E2A Tower \u4EFB\u52A1\u300D\u7684\u901A\u7528\u884C\u4E3A\uFF0C\u4E0D\u8986\u76D6\u5177\u4F53\u9879\u76EE\u7684\u6280\u672F\u89C4\u8303\u3002",
|
|
26647
|
+
"- **\u53EA\u505A\u4EFB\u52A1\u8303\u56F4\u5185\u7684\u4E8B**\uFF1A\u7D27\u6263\u5F53\u524D\u4EFB\u52A1\u76EE\u6807\uFF0C\u4E0D\u987A\u624B\u6539\u65E0\u5173\u4EE3\u7801\u3001\u4E0D\u64C5\u81EA\u6269\u5927\u6539\u52A8\u9762\u3002",
|
|
26648
|
+
"- **\u5B8C\u6210\u5373\u9A8C\u8BC1**\uFF1A\u6709\u6D4B\u8BD5 / \u6784\u5EFA / lint / \u7C7B\u578B\u68C0\u67E5\u5C31\u5148\u8DD1\u4E00\u904D\u518D\u5BA3\u79F0\u300C\u505A\u5B8C\u300D\uFF1B\u5931\u8D25\u5982\u5B9E\u62A5\u544A\uFF0C\u4E0D\u786E\u5B9A\u5C31\u8BF4\u4E0D\u786E\u5B9A\uFF0C\u522B\u628A\u6CA1\u9A8C\u8BC1\u7684\u5F53\u6210\u529F\u3002",
|
|
26649
|
+
"- **\u957F\u8FDB\u7A0B\u522B\u5360\u4F4F\u7EC8\u7AEF**\uFF1Adev server\u3001watch \u7B49\u9700\u957F\u65F6\u95F4\u524D\u53F0\u8FD0\u884C\u7684\u547D\u4EE4\uFF0C\u7528\u5B8C\u5373\u505C\u6216\u653E\u540E\u53F0\uFF0C\u522B\u8BA9\u4EFB\u52A1\u7EC8\u7AEF\u88AB\u6C38\u4E45\u5361\u4F4F\uFF08Tower \u7684 Preview \u6709\u72EC\u7ACB\u7BA1\u7406\uFF0C\u901A\u5E38\u4E0D\u9700\u8981\u4F60\u624B\u52A8\u8D77 dev server\uFF09\u3002",
|
|
26650
|
+
"- **\u9ED8\u8BA4\u7528\u4E2D\u6587\u56DE\u590D**\uFF08\u9664\u975E\u9879\u76EE\u6216\u7528\u6237\u53E6\u6709\u8981\u6C42\uFF09\u3002",
|
|
26651
|
+
"",
|
|
26652
|
+
"## Git \u5DE5\u4F5C\u89C4\u5219",
|
|
26653
|
+
"- \u5B8C\u6210\u4E00\u6BB5\u6709\u610F\u4E49\u7684\u6539\u52A8\u540E\uFF0C\u4E3B\u52A8\u7528\u6E05\u6670\u7684 message \u521B\u5EFA commit\uFF08\u7EA6\u5B9A\u5F0F\uFF1Afeat / fix / refactor / docs / chore\u2026\uFF09\uFF0C\u4E0D\u8981\u7559\u4E00\u5806\u672A\u63D0\u4EA4\u7684\u6539\u52A8\u3002",
|
|
26654
|
+
"- \u82E5\u5F53\u524D\u4EFB\u52A1\u8FD0\u884C\u5728 Git worktree \u9694\u79BB\u5206\u652F\u91CC\uFF08worktree \u4EFB\u52A1\uFF09\uFF1A**\u53EA commit\uFF0C\u4E0D\u8981 push** \u2014\u2014 worktree \u5206\u652F\u7531 Tower \u7EDF\u4E00\u7BA1\u7406\u4E0E\u5408\u5E76\u3002",
|
|
26655
|
+
"- \u82E5\u5F53\u524D\u4EFB\u52A1\u76F4\u63A5\u5728\u9879\u76EE\u4E3B\u5DE5\u4F5C\u533A\u91CC\uFF08\u975E worktree \u4EFB\u52A1\uFF09\uFF1A\u53EF\u4EE5 push\u3002",
|
|
26656
|
+
"- \u4E0D\u786E\u5B9A\u81EA\u5DF1\u662F\u4E0D\u662F worktree \u4EFB\u52A1\u65F6\uFF0C\u9ED8\u8BA4\u53EA commit\u3001\u4E0D push\u3002",
|
|
26657
|
+
"",
|
|
26658
|
+
"## \u5E76\u53D1\u4E0E\u534F\u4F5C\uFF08\u591A\u4EFB\u52A1\u53EF\u80FD\u540C\u6539\u4E00\u4E2A\u4ED3\u5E93\uFF09",
|
|
26659
|
+
"- Tower \u5E38\u540C\u65F6\u8DD1\u591A\u4E2A\u4EFB\u52A1\u3001\u751A\u81F3\u540C\u4E00\u4ED3\u5E93\u591A\u4E2A worktree\u3002**\u53EA stage / commit \u4F60\u8FD9\u8F6E\u4EB2\u624B\u6539\u7684\u6587\u4EF6**\uFF0C\u4E00\u5F8B `git add <\u660E\u786E\u8DEF\u5F84>`\uFF1B\u7981\u6B62 `git add .` / `-A` / `-u` / `git commit -a`\uFF0C\u522B\u628A\u522B\u7684\u7A97\u53E3\u6216\u7528\u6237\u624B\u52A8\u7684\u6539\u52A8\u4E00\u5E76\u63D0\u4EA4\u3002",
|
|
26660
|
+
"- `git status` \u91CC\u4E0D\u8BA4\u8BC6\u3001\u4E0D\u662F\u4F60\u6539\u7684\u6587\u4EF6\u4E00\u5F8B\u4E0D\u78B0\u3001\u4E0D\u63D0\u4EA4\uFF0C\u9700\u8981\u65F6\u5728\u5C0F\u7ED3\u91CC\u63D0\u4E00\u53E5\u5373\u53EF\u3002",
|
|
26661
|
+
"- \u4E0D force-push\u3001\u4E0D\u6539\u5199\u5171\u4EAB\u5206\u652F\u5386\u53F2\uFF1B\u4E0D\u5BF9\u4E0D\u5C5E\u4E8E\u4F60\u7684\u6539\u52A8\u505A `git reset --hard` / `git clean -fd`\u3002",
|
|
26662
|
+
"",
|
|
26663
|
+
"## Worktree \u7EAA\u5F8B\uFF08\u52A1\u5FC5\u9632\u6B62\u6539\u5230\u4E3B\u4ED3\u5E93\uFF09",
|
|
26664
|
+
"- \u5F00\u5DE5\u7B2C\u4E00\u4EF6\u4E8B\u5148\u8DD1 `pwd`\uFF1A\u5B83\u5C31\u662F\u4F60\u7684\u5DE5\u4F5C\u6839\u3002\u4E4B\u540E\u6240\u6709 Read/Edit/Write/Bash \u8DEF\u5F84\u90FD\u4EE5\u5B83\u4E3A\u57FA\u51C6\uFF0C\u4F18\u5148\u7528\u76F8\u5BF9\u8DEF\u5F84\uFF1B\u7528\u7EDD\u5BF9\u8DEF\u5F84\u65F6\u5FC5\u987B\u4EE5\u8FD9\u4E2A\u6839\u5F00\u5934\uFF0C**\u7EDD\u4E0D**\u51ED\u4E0A\u4E0B\u6587/\u8BB0\u5FC6\u91CC\u7684\u4E3B\u4ED3\u5E93\u8DEF\u5F84\u53BB\u62FC\u7EDD\u5BF9\u8DEF\u5F84\u2014\u2014\u8FD9\u6B63\u662F\u5386\u6B21\u300Cworktree \u91CC\u770B\u4EC0\u4E48\u90FD\u6CA1\u53D8\u300D\u7684\u6839\u56E0\u3002",
|
|
26665
|
+
"- \u5224\u65AD\u81EA\u5DF1\u662F\u4E0D\u662F worktree \u4EFB\u52A1\uFF1A`pwd` \u843D\u5728 `.worktrees/task-$TOWER_TASK_ID` \u4E0B\u3001\u6216 `git branch --show-current` \u4E3A `task/$TOWER_TASK_ID`\uFF0C\u5373\u662F\u3002\u662F\u5219\u4E25\u683C\u8D70\u672C\u8282\u7EAA\u5F8B\u3002",
|
|
26666
|
+
"- \u52A8\u4EFB\u4F55\u6587\u4EF6 / \u63D0\u4EA4\u524D\uFF0C\u5148\u6838\u5BF9\u4E09\u4EF6\u4E8B\u90FD\u6210\u7ACB\uFF1A\u2460 `git rev-parse --show-toplevel` \u7B49\u4E8E\u5F53\u524D worktree \u6839\uFF08\u4E0D\u662F\u4E3B\u4ED3\u5E93\u8DEF\u5F84\uFF09\uFF1B\u2461 `git branch --show-current` \u4E3A `task/$TOWER_TASK_ID`\uFF08\u4E0D\u662F main / feature / \u5176\u5B83\u5206\u652F\uFF09\uFF1B\u2462 \u8981\u6539\u7684\u6587\u4EF6\u7EDD\u5BF9\u8DEF\u5F84\u542B `.worktrees/task-$TOWER_TASK_ID/` \u6BB5\u3002\u4EFB\u4E00\u4E0D\u6EE1\u8DB3\uFF0C\u8BF4\u660E\u4F60\u64CD\u4F5C\u5230\u4E3B\u4ED3\u5E93\u4E86\uFF0C**\u7ACB\u5373\u505C\u6B62\u3001\u4E0D\u8981\u63D0\u4EA4**\uFF0C\u5148\u7EA0\u6B63\u76EE\u5F55\u3002",
|
|
26667
|
+
"- \u7EDD\u4E0D `cd` \u5230\u4E3B\u4ED3\u5E93\u6216 worktree \u4E4B\u5916\u53BB\u6539\u6587\u4EF6 / \u8DD1 git\uFF1B\u6240\u6709 git \u547D\u4EE4\u90FD\u5728\u5F53\u524D worktree \u6839\u5185\u6267\u884C\uFF08\u8DE8\u76EE\u5F55\u65F6\u7528 `git -C <worktree \u6839>` \u663E\u5F0F\u6307\u5B9A\uFF0C\u522B\u9760\u9ED8\u8BA4 cwd \u731C\uFF09\u3002",
|
|
26668
|
+
"- \u4E07\u4E00\u5DF2\u7ECF\u6539\u9519\u5230\u4E3B\u4ED3\u5E93\uFF1A\u628A\u6539\u52A8\u642C\u56DE worktree\uFF08`git -C <worktree \u6839> cherry-pick <\u8BEF\u63D0\u4EA4>` \u6216\u91CD\u6253\u4E00\u904D\uFF09\uFF0C\u4E3B\u4ED3\u5E93\u5DE5\u4F5C\u533A\u7528 `git restore` \u590D\u539F\u3001\u8BEF\u63D0\u4EA4\u6309\u60C5\u51B5\u5904\u7406\u2014\u2014\u5DF2\u88AB\u522B\u7684\u63D0\u4EA4\u53E0\u5728\u4E0A\u9762\u5C31\u7528 `git revert`\uFF08\u4FDD\u5386\u53F2\u3001\u4E0D\u52A8\u522B\u4EBA\u7684\u63D0\u4EA4\uFF09\uFF0C\u786E\u8BA4\u72EC\u5360\u4E14\u672A push \u624D\u7528 `git reset`\uFF1B\u6700\u540E\u5982\u5B9E\u62A5\u544A\u4E24\u8FB9\u6700\u7EC8\u72B6\u6001\uFF0C\u4E0D\u8981\u9690\u7792\u3002",
|
|
26669
|
+
"",
|
|
26670
|
+
"## \u6C47\u62A5\u4E0E\u4EA4\u63A5",
|
|
26671
|
+
"- \u4EA7\u51FA\u4F1A\u88AB review\uFF0C\u7ED3\u5C3E\u7ED9\u4E00\u6BB5\u53EF\u901F\u8BFB\u7684\u5C0F\u7ED3\uFF1A\u505A\u4E86\u4EC0\u4E48\u3001\u6539\u4E86\u54EA\u4E9B\u5173\u952E\u6587\u4EF6\u3001\u9A8C\u8BC1\u7ED3\u679C\u3001\u8FD8\u5269\u4EC0\u4E48\u6CA1\u505A / \u88AB\u4EC0\u4E48\u963B\u585E\u3001\u6709\u6CA1\u6709\u9700\u8981\u7528\u6237\u6216\u7236\u4EFB\u52A1\u62CD\u677F\u7684\u51B3\u7B56\u3002",
|
|
26672
|
+
"- \u771F\u88AB\u5916\u90E8\u56E0\u7D20\u963B\u585E\uFF08\u5F85\u63A5\u53E3\u3001\u5F85\u7D20\u6750\u3001\u5F85\u4EBA\u51B3\u7B56\uFF09\u5C31**\u660E\u786E\u8BF4\u660E\u5E76\u505C\u4E0B**\uFF0C\u522B\u53CD\u590D\u7A7A\u8F6C\u6216\u81EA\u884C\u81C6\u6D4B\u786C\u505A\u3002",
|
|
26673
|
+
"- \u5371\u9669 / \u4E0D\u53EF\u9006\u64CD\u4F5C\uFF08\u5220\u6570\u636E\u5E93\u3001\u5220\u5927\u76EE\u5F55\u3001`rm -rf`\u3001`drop table`\u3001\u5BF9\u5916\u53D1\u5E03 / \u90E8\u7F72\uFF09\u5148\u8BF4\u660E\u5E76\u5F81\u5F97\u786E\u8BA4\u518D\u6267\u884C\u3002",
|
|
26674
|
+
"",
|
|
26675
|
+
"## \u65E0\u4EBA\u503C\u5B88\uFF08\u73AF\u5883\u53D8\u91CF TOWER_UNATTENDED=1 \u65F6\u5C24\u5176\u91CD\u8981\uFF09",
|
|
26676
|
+
"- \u4F60\u53EF\u80FD\u5728\u65E0\u4EBA\u76EF\u5B88\u4E0B\u8FD0\u884C\u3002\u4E24\u4E2A\u4E0E\u4EBA\u6C9F\u901A\u7684 MCP \u5DE5\u5177\uFF1A`ask_human`\uFF08\u963B\u585E\uFF1A**\u8BB0\u5F55**\u95EE\u9898\u5E76\u6302\u8D77\u4EFB\u52A1\u2014\u2014\u672C\u56DE\u5408\u5230\u6B64\u4E3A\u6B62\uFF0C\u4EBA\u56DE\u590D\u540E\u81EA\u52A8\u5524\u9192\u3001\u5E26\u7B54\u6848\u7EED\u8DD1\uFF09\u548C `notify_human`\uFF08\u975E\u963B\u585E\uFF1A**\u8BB0\u5F55**\u4E00\u6761\u8FDB\u5EA6/FYI \u540E\u7ACB\u5373\u7EE7\u7EED\uFF0C\u4E0D\u5FC5\u7B49\u56DE\u590D\u3001\u4E0D\u6302\u8D77\uFF09\u3002**\u6CE8\u610F\uFF1A\u8FD9\u4E24\u4E2A\u5DE5\u5177\u53EA\u5728 Tower \u5185\u8BB0\u5F55\uFF08/harness \u9762\u677F\u53EF\u89C1\uFF09\uFF0C\u672C\u8EAB\u4E0D\u628A\u6D88\u606F\u53D1\u7ED9\u4EBA**\uFF1B\u65E0\u4EBA\u503C\u5B88\u4E0B\u8981\u771F\u6B63\u901A\u77E5\u5230\u4EBA\uFF0C\u987B\u6309\u7CFB\u7EDF\u63D0\u793A\u91CC\u300C\u65E0\u4EBA\u503C\u5B88\u5916\u63A8\u300D\u6BB5\u5148\u7ECF\u5E73\u53F0\u6E20\u9053\u628A\u6D88\u606F\u53D1\u51FA\u53BB\uFF0C\u518D\u8C03\u8FD9\u4E24\u4E2A\u5DE5\u5177\u7559\u6863\u3002",
|
|
26677
|
+
"- \u9700\u8981\u4EBA\u62CD\u677F\u624D\u80FD\u63A8\u8FDB\uFF08\u9009\u578B\u3001\u4E8C\u4E49\u9700\u6C42\u3001\u7F3A\u5173\u952E\u4FE1\u606F\u3001\u5BF9\u5916\u53D1\u5E03/\u90E8\u7F72\u7B49\uFF09\u2192 \u7528 `ask_human` \u628A\u95EE\u9898\u548C\u53EF\u9009\u9879\u8BB2\u6E05\u695A\uFF0C\u7136\u540E\u505C\u4E0B\u7B49\u5F85\uFF0C\u522B\u81EA\u884C\u81C6\u6D4B\u786C\u505A\u3002",
|
|
26678
|
+
"- \u5371\u9669 / \u4E0D\u53EF\u9006\u64CD\u4F5C\uFF08\u5220\u5E93\u3001\u5220\u5927\u76EE\u5F55\u3001`rm -rf`\u3001`drop table`\u3001force-push\u3001\u5BF9\u5916\u53D1\u5E03\uFF09\u2192 \u4E00\u5F8B\u5148 `ask_human` \u5F81\u5F97\u540C\u610F\u518D\u6267\u884C\uFF0C\u5373\u4F7F\u7EC8\u7AEF\u5DF2\u653E\u5F00\u6743\u9650\u4E5F\u4E0D\u4F8B\u5916\u3002",
|
|
26679
|
+
"- \u53EA\u662F\u60F3\u540C\u6B65\u8FDB\u5C55\u6216\u629B\u4E2A FYI\u3001\u65E0\u9700\u56DE\u590D \u2192 \u7528 `notify_human`\uFF0C\u53D1\u5B8C\u7EE7\u7EED\u5E72\u3002",
|
|
26680
|
+
"- \u8C03\u7528 `ask_human` \u540E\u7ACB\u5373\u7ED3\u675F\u672C\u56DE\u5408\u3001\u4E0D\u8981\u518D\u7EE7\u7EED\u64CD\u4F5C\uFF1B\u5B83\u4F1A\u5173\u95ED\u7EC8\u7AEF\u7701\u8D44\u6E90\uFF0C\u4EBA\u56DE\u590D\u540E\u4EFB\u52A1\u81EA\u52A8\u6062\u590D\u3002",
|
|
26681
|
+
"",
|
|
26682
|
+
"## \u672C\u8F6E commit \u56DE\u663E",
|
|
26683
|
+
"- **\u6BCF\u8F6E\u56DE\u590D\u7684\u6700\u540E\uFF0C\u5FC5\u987B\u628A\u672C\u8F6E\u521B\u5EFA\u7684 commit \u5217\u51FA\u6765\u8BA9\u7528\u6237\u4E00\u773C\u770B\u5230**\u3002\u683C\u5F0F\u56FA\u5B9A\uFF1A\u5148\u4E00\u884C\u52A0\u7C97\u5C0F\u6807\u9898 `**\u672C\u8F6E commit**`\uFF08\u4E0D\u8981\u7528 `---` \u5206\u9694\u7EBF\u3001\u4E0D\u8981\u7528 emoji\uFF09\uFF0C\u6362\u884C\u540E\u6BCF\u6761 commit \u5355\u72EC\u4E00\u884C\u3001\u4EE5 `- ` \u5F00\u5934\uFF0C\u5F62\u5982 `` - `<\u77ED hash>` <message \u9996\u884C> ``\uFF08hash \u7528\u884C\u5185\u4EE3\u7801\u5305\u4F4F\uFF09\u3002\u672C\u8F6E\u6CA1\u6709\u521B\u5EFA\u4EFB\u4F55 commit \u65F6\uFF0C\u53EA\u56DE\u4E00\u884C `\u672C\u8F6E\u65E0 commit`\u3002"
|
|
26684
|
+
].join("\n"),
|
|
26685
|
+
type: "string",
|
|
26686
|
+
label: "Task System Directive (built-in)"
|
|
26687
|
+
},
|
|
26688
|
+
// ── 无人值守 harness ──────────────────────────────────────────────
|
|
26689
|
+
// Tower 只记录 ask/notify/done/failed(/harness 面板可见),**不发送消息**:外推给人由 agent
|
|
26690
|
+
// 按注入的「无人值守外推」协议用平台 MCP(飞书/微信/…)完成。故这里不再有平台凭据/渠道绑定配置。
|
|
26691
|
+
// 无人值守发送渠道注册表:agent 据「生效」的那条决定走哪条「网关→下游」把消息发出去。
|
|
26692
|
+
// 每项形如 { id, label, gateway: "feishu"|"openclaw"|"hermes", downstream: "wechat"|"feishu"|... }
|
|
26693
|
+
// (downstream 也可是自定义文本)。目的地(群/人)在发送时由消息说明,不在此预设。Tower 只存不发。
|
|
26694
|
+
"harness.targets": {
|
|
26695
|
+
defaultValue: [],
|
|
26696
|
+
type: "object",
|
|
26697
|
+
label: "Harness Notify Targets (multi-platform registry)"
|
|
26698
|
+
},
|
|
26699
|
+
// 待回复 ask 的 TTL 兜底:超过这么多天仍 OPEN 的 ask 被周期 sweep 转 EXPIRED。
|
|
26700
|
+
"harness.pendingTtlDays": {
|
|
26701
|
+
defaultValue: 14,
|
|
26702
|
+
type: "number",
|
|
26703
|
+
label: "Harness Pending Ask TTL (days)"
|
|
26607
26704
|
}
|
|
26608
26705
|
};
|
|
26609
26706
|
}
|
|
@@ -29252,7 +29349,7 @@ var require_websocket = __commonJS({
|
|
|
29252
29349
|
var http = require("http");
|
|
29253
29350
|
var net = require("net");
|
|
29254
29351
|
var tls = require("tls");
|
|
29255
|
-
var { randomBytes, createHash } = require("crypto");
|
|
29352
|
+
var { randomBytes, createHash: createHash2 } = require("crypto");
|
|
29256
29353
|
var { Duplex, Readable } = require("stream");
|
|
29257
29354
|
var { URL: URL2 } = require("url");
|
|
29258
29355
|
var PerMessageDeflate2 = require_permessage_deflate();
|
|
@@ -29912,7 +30009,7 @@ var require_websocket = __commonJS({
|
|
|
29912
30009
|
abortHandshake(websocket, socket, "Invalid Upgrade header");
|
|
29913
30010
|
return;
|
|
29914
30011
|
}
|
|
29915
|
-
const digest =
|
|
30012
|
+
const digest = createHash2("sha1").update(key + GUID).digest("base64");
|
|
29916
30013
|
if (res.headers["sec-websocket-accept"] !== digest) {
|
|
29917
30014
|
abortHandshake(websocket, socket, "Invalid Sec-WebSocket-Accept header");
|
|
29918
30015
|
return;
|
|
@@ -30279,7 +30376,7 @@ var require_websocket_server = __commonJS({
|
|
|
30279
30376
|
var EventEmitter = require("events");
|
|
30280
30377
|
var http = require("http");
|
|
30281
30378
|
var { Duplex } = require("stream");
|
|
30282
|
-
var { createHash } = require("crypto");
|
|
30379
|
+
var { createHash: createHash2 } = require("crypto");
|
|
30283
30380
|
var extension2 = require_extension();
|
|
30284
30381
|
var PerMessageDeflate2 = require_permessage_deflate();
|
|
30285
30382
|
var subprotocol2 = require_subprotocol();
|
|
@@ -30580,7 +30677,7 @@ var require_websocket_server = __commonJS({
|
|
|
30580
30677
|
);
|
|
30581
30678
|
}
|
|
30582
30679
|
if (this._state > RUNNING) return abortHandshake(socket, 503);
|
|
30583
|
-
const digest =
|
|
30680
|
+
const digest = createHash2("sha1").update(key + GUID).digest("base64");
|
|
30584
30681
|
const headers = [
|
|
30585
30682
|
"HTTP/1.1 101 Switching Protocols",
|
|
30586
30683
|
"Upgrade: websocket",
|
|
@@ -32198,14 +32295,14 @@ async function clearSessionPid(sessionKey) {
|
|
|
32198
32295
|
} catch {
|
|
32199
32296
|
}
|
|
32200
32297
|
}
|
|
32201
|
-
var import_promises,
|
|
32298
|
+
var import_promises, import_node_path4, SIGNAL_DIR, PID_PREFIX;
|
|
32202
32299
|
var init_orphan_reaper = __esm({
|
|
32203
32300
|
"src/lib/pty/orphan-reaper.ts"() {
|
|
32204
32301
|
"use strict";
|
|
32205
32302
|
import_promises = require("node:fs/promises");
|
|
32206
|
-
import_node_os3 = require("node:os");
|
|
32207
32303
|
import_node_path4 = require("node:path");
|
|
32208
|
-
|
|
32304
|
+
init_tower_dir();
|
|
32305
|
+
SIGNAL_DIR = getSignalDir();
|
|
32209
32306
|
PID_PREFIX = "pid-";
|
|
32210
32307
|
}
|
|
32211
32308
|
});
|
|
@@ -32277,6 +32374,13 @@ var init_session_store = __esm({
|
|
|
32277
32374
|
}
|
|
32278
32375
|
});
|
|
32279
32376
|
|
|
32377
|
+
// src/lib/pty/strip-device-queries.ts
|
|
32378
|
+
var init_strip_device_queries = __esm({
|
|
32379
|
+
"src/lib/pty/strip-device-queries.ts"() {
|
|
32380
|
+
"use strict";
|
|
32381
|
+
}
|
|
32382
|
+
});
|
|
32383
|
+
|
|
32280
32384
|
// src/lib/assistant-constants.ts
|
|
32281
32385
|
var init_assistant_constants = __esm({
|
|
32282
32386
|
"src/lib/assistant-constants.ts"() {
|
|
@@ -32352,6 +32456,7 @@ var init_ws_server = __esm({
|
|
|
32352
32456
|
"use strict";
|
|
32353
32457
|
init_wrapper();
|
|
32354
32458
|
init_session_store();
|
|
32459
|
+
init_strip_device_queries();
|
|
32355
32460
|
init_config_reader();
|
|
32356
32461
|
init_assistant_constants();
|
|
32357
32462
|
init_session_store2();
|
|
@@ -32465,9 +32570,9 @@ var init_claude_cli_adapter = __esm({
|
|
|
32465
32570
|
const settings = this.readSettings();
|
|
32466
32571
|
const hooks = settings["hooks"] ?? {};
|
|
32467
32572
|
const root = getPackageRoot().replace(/\\/g, "/");
|
|
32468
|
-
const sessionStart = path4.join(root, "scripts", "session-start-hook.js").replace(/\\/g, "/");
|
|
32469
|
-
const postTool = path4.join(root, "scripts", "post-tool-hook.js").replace(/\\/g, "/");
|
|
32470
|
-
const stop = path4.join(root, "scripts", "stop-hook.js").replace(/\\/g, "/");
|
|
32573
|
+
const sessionStart = path4.join(root, "scripts", "tower-session-start-hook.js").replace(/\\/g, "/");
|
|
32574
|
+
const postTool = path4.join(root, "scripts", "tower-post-tool-hook.js").replace(/\\/g, "/");
|
|
32575
|
+
const stop = path4.join(root, "scripts", "tower-stop-hook.js").replace(/\\/g, "/");
|
|
32471
32576
|
let changed = false;
|
|
32472
32577
|
changed = this.upsertHook(hooks, "SessionStart", "session-start-hook.js", {
|
|
32473
32578
|
hooks: [{ command: `node "${sessionStart}"`, timeout: 5, type: "command" }]
|
|
@@ -32506,18 +32611,18 @@ var init_claude_cli_adapter = __esm({
|
|
|
32506
32611
|
const hooks = settings["hooks"] ?? {};
|
|
32507
32612
|
const root = getPackageRoot().replace(/\\/g, "/");
|
|
32508
32613
|
const map2 = [
|
|
32509
|
-
["SessionStart", "session-start-hook.js"],
|
|
32510
|
-
["PostToolUse", "post-tool-hook.js"],
|
|
32511
|
-
["Stop", "stop-hook.js"]
|
|
32614
|
+
["SessionStart", "session-start-hook.js", "tower-session-start-hook.js"],
|
|
32615
|
+
["PostToolUse", "post-tool-hook.js", "tower-post-tool-hook.js"],
|
|
32616
|
+
["Stop", "stop-hook.js", "tower-stop-hook.js"]
|
|
32512
32617
|
];
|
|
32513
32618
|
let changed = false;
|
|
32514
|
-
for (const [event,
|
|
32619
|
+
for (const [event, matchName, wantedName] of map2) {
|
|
32515
32620
|
const entries = this.getHookArray(hooks, event);
|
|
32516
32621
|
const idx = entries.findIndex(
|
|
32517
|
-
(e2) => e2?.hooks?.some?.((h10) => h10.command?.includes(
|
|
32622
|
+
(e2) => e2?.hooks?.some?.((h10) => h10.command?.includes(matchName))
|
|
32518
32623
|
);
|
|
32519
32624
|
if (idx < 0) continue;
|
|
32520
|
-
const wantedPath = path4.join(root, "scripts",
|
|
32625
|
+
const wantedPath = path4.join(root, "scripts", wantedName).replace(/\\/g, "/");
|
|
32521
32626
|
const wantedCmd = `node "${wantedPath}"`;
|
|
32522
32627
|
const hookCmd = entries[idx]?.hooks?.[0];
|
|
32523
32628
|
if (!hookCmd || hookCmd.command === wantedCmd) continue;
|
|
@@ -53904,7 +54009,8 @@ async function checkWorktreeClean(taskId) {
|
|
|
53904
54009
|
["status", "--porcelain"],
|
|
53905
54010
|
{ cwd, encoding: "utf-8", timeout: 5e3 }
|
|
53906
54011
|
).trim();
|
|
53907
|
-
const
|
|
54012
|
+
const rawFiles = status ? status.split("\n").map((l) => l.trim()).filter(Boolean) : [];
|
|
54013
|
+
const files = stripTowerLinkedStatus(rawFiles, cwd);
|
|
53908
54014
|
const clean = files.length === 0;
|
|
53909
54015
|
let hasCommits = false;
|
|
53910
54016
|
let lastCommitMessage = null;
|
|
@@ -54290,7 +54396,8 @@ var taskTools = {
|
|
|
54290
54396
|
useWorktree: external_exports.boolean().optional().describe("Use a Git worktree for branch isolation. Omit to use the user's saved default; pass explicitly to override this task."),
|
|
54291
54397
|
baseBranch: external_exports.string().optional().describe("Base branch for worktree checkout. Only used when useWorktree resolves to true. If omitted, auto-detects the project's current branch."),
|
|
54292
54398
|
autoStart: external_exports.boolean().optional().describe("Start execution immediately after creating. Omit to use the user's saved default; pass explicitly to override this task."),
|
|
54293
|
-
references: external_exports.array(external_exports.string()).max(20).optional()
|
|
54399
|
+
references: external_exports.array(external_exports.string()).max(20).optional(),
|
|
54400
|
+
unattended: external_exports.boolean().optional().describe("Run in unattended mode \u2014 the task's agent uses tower-ask to push ask_human / notify_human / done-failed to a configured channel (Settings \u2192 Notifications). Defaults false.")
|
|
54294
54401
|
}),
|
|
54295
54402
|
handler: async (args) => {
|
|
54296
54403
|
const explicitWorktree = args.useWorktree !== void 0;
|
|
@@ -54331,6 +54438,15 @@ var taskTools = {
|
|
|
54331
54438
|
}
|
|
54332
54439
|
}
|
|
54333
54440
|
}
|
|
54441
|
+
const envParentTaskId = process.env.TOWER_TASK_ID || null;
|
|
54442
|
+
let resolvedParentId = null;
|
|
54443
|
+
if (envParentTaskId) {
|
|
54444
|
+
const parent = await db.task.findUnique({
|
|
54445
|
+
where: { id: envParentTaskId },
|
|
54446
|
+
select: { id: true }
|
|
54447
|
+
});
|
|
54448
|
+
if (parent) resolvedParentId = envParentTaskId;
|
|
54449
|
+
}
|
|
54334
54450
|
const task = await db.task.create({
|
|
54335
54451
|
data: {
|
|
54336
54452
|
title: args.title,
|
|
@@ -54340,7 +54456,9 @@ var taskTools = {
|
|
|
54340
54456
|
status: args.status ?? "TODO",
|
|
54341
54457
|
baseBranch,
|
|
54342
54458
|
versionId,
|
|
54343
|
-
subPath: args.subPath ?? null
|
|
54459
|
+
subPath: args.subPath ?? null,
|
|
54460
|
+
parentTaskId: resolvedParentId,
|
|
54461
|
+
unattended: args.unattended ?? false
|
|
54344
54462
|
}
|
|
54345
54463
|
});
|
|
54346
54464
|
if (args.labelIds && args.labelIds.length > 0) {
|
|
@@ -54422,10 +54540,10 @@ ${refText}`;
|
|
|
54422
54540
|
}
|
|
54423
54541
|
const attachmentInfo = attachmentFailures.length > 0 ? { attachmentFailures } : {};
|
|
54424
54542
|
if (autoStart) {
|
|
54425
|
-
const
|
|
54543
|
+
const PORT3 = process.env.PORT ?? "3000";
|
|
54426
54544
|
const prompt = args.title;
|
|
54427
54545
|
try {
|
|
54428
|
-
const res = await fetch(`http://localhost:${
|
|
54546
|
+
const res = await fetch(`http://localhost:${PORT3}/api/internal/terminal/${task.id}/start`, {
|
|
54429
54547
|
method: "POST",
|
|
54430
54548
|
headers: { "Content-Type": "application/json" },
|
|
54431
54549
|
body: JSON.stringify({ prompt })
|
|
@@ -55562,6 +55680,89 @@ var reportTools = {
|
|
|
55562
55680
|
}
|
|
55563
55681
|
};
|
|
55564
55682
|
|
|
55683
|
+
// src/mcp/tools/harness-tools.ts
|
|
55684
|
+
init_zod();
|
|
55685
|
+
var PORT2 = process.env.PORT ?? "3000";
|
|
55686
|
+
var BRIDGE = `http://localhost:${PORT2}/api/internal/harness`;
|
|
55687
|
+
var CUID_RE2 = /^c[a-z0-9]{20,30}$/;
|
|
55688
|
+
function validateMcpTaskId2(taskId) {
|
|
55689
|
+
if (!CUID_RE2.test(taskId)) return "Invalid taskId format \u2014 expected CUID";
|
|
55690
|
+
return null;
|
|
55691
|
+
}
|
|
55692
|
+
var harnessTools = {
|
|
55693
|
+
ask_human: {
|
|
55694
|
+
description: "Ask the human operator a question and PARK the task until they reply. Call this ONLY when you are blocked on a decision you cannot make yourself, or before a dangerous/irreversible action that needs sign-off. This ENDS your turn \u2014 do NOT keep working after calling it. The task is suspended (its terminal is closed to save resources) and later resumed with the human's answer as your next message. In unattended mode the question is pushed to the operator's channel (e.g. Feishu); otherwise it waits visibly in the Tower UI.",
|
|
55695
|
+
schema: external_exports.object({
|
|
55696
|
+
taskId: external_exports.string().describe("The current task id (TOWER_TASK_ID)"),
|
|
55697
|
+
question: external_exports.string().min(1).max(4e3).describe("The question / options for the human")
|
|
55698
|
+
}),
|
|
55699
|
+
handler: async (args) => {
|
|
55700
|
+
const err = validateMcpTaskId2(args.taskId);
|
|
55701
|
+
if (err) return { error: err, taskId: args.taskId };
|
|
55702
|
+
const res = await fetch(`${BRIDGE}/ask`, {
|
|
55703
|
+
method: "POST",
|
|
55704
|
+
headers: { "content-type": "application/json" },
|
|
55705
|
+
body: JSON.stringify({ taskId: args.taskId, question: args.question })
|
|
55706
|
+
});
|
|
55707
|
+
const data = await res.json().catch(() => ({}));
|
|
55708
|
+
if (!res.ok) return { error: data?.error ?? "ask failed", status: res.status };
|
|
55709
|
+
const base = {
|
|
55710
|
+
parked: true,
|
|
55711
|
+
requestId: data.requestId,
|
|
55712
|
+
message: "Question recorded and task parked. Your turn is over \u2014 stop now and wait. You will be resumed with the human's answer as your next message."
|
|
55713
|
+
};
|
|
55714
|
+
if (data.noChannelConfigured) {
|
|
55715
|
+
return {
|
|
55716
|
+
...base,
|
|
55717
|
+
noChannelConfigured: true,
|
|
55718
|
+
message: "Question recorded (visible in Tower's /harness panel) and task parked, but NO notify channel is configured, so it cannot be pushed to any external channel. Before stopping, tell the user: \u8BF7\u5230\u300C\u8BBE\u7F6E \u2192 \u901A\u77E5 \u2192 \u65E0\u4EBA\u503C\u5B88\u53D1\u9001\u6E20\u9053\u300D\u914D\u7F6E\u4E00\u4E2A\u6E20\u9053\uFF0C\u5426\u5219\u65E0\u6CD5\u5916\u53D1\u3002"
|
|
55719
|
+
};
|
|
55720
|
+
}
|
|
55721
|
+
return base;
|
|
55722
|
+
}
|
|
55723
|
+
},
|
|
55724
|
+
notify_human: {
|
|
55725
|
+
description: "Send a NON-BLOCKING progress update / heads-up to the human operator, then KEEP WORKING. Unlike ask_human this does not park the task or end your turn \u2014 use it for milestones, status reports, or FYI notes that need no reply. In unattended mode it is pushed to the operator's channel (no @mention); otherwise it is a no-op.",
|
|
55726
|
+
schema: external_exports.object({
|
|
55727
|
+
taskId: external_exports.string().describe("The current task id (TOWER_TASK_ID)"),
|
|
55728
|
+
message: external_exports.string().min(1).max(4e3).describe("The progress update for the human")
|
|
55729
|
+
}),
|
|
55730
|
+
handler: async (args) => {
|
|
55731
|
+
const err = validateMcpTaskId2(args.taskId);
|
|
55732
|
+
if (err) return { error: err, taskId: args.taskId };
|
|
55733
|
+
const res = await fetch(`${BRIDGE}/notify`, {
|
|
55734
|
+
method: "POST",
|
|
55735
|
+
headers: { "content-type": "application/json" },
|
|
55736
|
+
body: JSON.stringify({ taskId: args.taskId, message: args.message })
|
|
55737
|
+
});
|
|
55738
|
+
const data = await res.json().catch(() => ({}));
|
|
55739
|
+
if (!res.ok) return { error: data?.error ?? "notify failed", status: res.status };
|
|
55740
|
+
return { ok: true, messageId: data.messageId };
|
|
55741
|
+
}
|
|
55742
|
+
},
|
|
55743
|
+
reply_to_ask: {
|
|
55744
|
+
description: "Deliver a human's reply back to a task that is PARKED waiting on ask_human, then RESUME it. Use this (not send_task_terminal_input) when relaying an operator's answer from a channel (Feishu/WeChat/etc.) so Tower records what was replied and shows the full round-trip in its log. It marks the open question as answered, resumes the task's session, and injects the reply as the task's next message. If the task has NO pending question, it does nothing and returns { no_pending: true } \u2014 in that case treat the message as an ordinary request and handle it normally (create_task / search / etc.).",
|
|
55745
|
+
schema: external_exports.object({
|
|
55746
|
+
taskId: external_exports.string().describe("The task that is parked waiting for a reply (its TOWER_TASK_ID)"),
|
|
55747
|
+
text: external_exports.string().min(1).max(8e3).describe("The human's reply to inject into the task")
|
|
55748
|
+
}),
|
|
55749
|
+
handler: async (args) => {
|
|
55750
|
+
const err = validateMcpTaskId2(args.taskId);
|
|
55751
|
+
if (err) return { error: err, taskId: args.taskId };
|
|
55752
|
+
const res = await fetch(`${BRIDGE}/reply`, {
|
|
55753
|
+
method: "POST",
|
|
55754
|
+
headers: { "content-type": "application/json" },
|
|
55755
|
+
// allowRetry:false —— 只应答仍 OPEN 的问题;答后的新消息返回 no_pending 交 bridge 按普通消息处理。
|
|
55756
|
+
body: JSON.stringify({ taskId: args.taskId, text: args.text, allowRetry: false })
|
|
55757
|
+
});
|
|
55758
|
+
const data = await res.json().catch(() => ({}));
|
|
55759
|
+
if (res.status === 409) return { no_pending: true, taskId: args.taskId };
|
|
55760
|
+
if (!res.ok) return { error: data?.error ?? "reply failed", status: res.status };
|
|
55761
|
+
return { ok: true, taskId: args.taskId, mode: data.mode, injected: data.injected, deduped: data.deduped };
|
|
55762
|
+
}
|
|
55763
|
+
}
|
|
55764
|
+
};
|
|
55765
|
+
|
|
55565
55766
|
// src/mcp/server.ts
|
|
55566
55767
|
function createServer() {
|
|
55567
55768
|
const server = new import_mcp.McpServer({ name: "tower", version: "0.1.0" });
|
|
@@ -55574,7 +55775,8 @@ function createServer() {
|
|
|
55574
55775
|
...knowledgeTools,
|
|
55575
55776
|
...noteAssetTools,
|
|
55576
55777
|
...terminalTools,
|
|
55577
|
-
...reportTools
|
|
55778
|
+
...reportTools,
|
|
55779
|
+
...harnessTools
|
|
55578
55780
|
};
|
|
55579
55781
|
for (const [name, tool] of Object.entries(allTools)) {
|
|
55580
55782
|
server.tool(
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "tower-studio",
|
|
3
|
-
"version": "0.2.
|
|
3
|
+
"version": "0.2.45",
|
|
4
4
|
"description": "AI Task Orchestration Platform — Kanban + Terminal + Code Editor + MCP",
|
|
5
5
|
"bin": {
|
|
6
6
|
"tower": "bin/tower.mjs"
|
|
@@ -20,9 +20,9 @@
|
|
|
20
20
|
"scripts/migrate-data.ts",
|
|
21
21
|
"scripts/run-migrations.ts",
|
|
22
22
|
"scripts/migrations/",
|
|
23
|
-
"scripts/post-tool-hook.js",
|
|
24
|
-
"scripts/session-start-hook.js",
|
|
25
|
-
"scripts/stop-hook.js",
|
|
23
|
+
"scripts/tower-post-tool-hook.js",
|
|
24
|
+
"scripts/tower-session-start-hook.js",
|
|
25
|
+
"scripts/tower-stop-hook.js",
|
|
26
26
|
"dist/mcp-server.cjs",
|
|
27
27
|
"skills/",
|
|
28
28
|
"next.config.ts",
|
|
@@ -30,7 +30,7 @@
|
|
|
30
30
|
],
|
|
31
31
|
"scripts": {
|
|
32
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",
|
|
33
|
+
"dev": "NEXT_DISTDIR=.next-dev TOWER_DATA_DIR=\"$HOME/.tower-dev\" DATABASE_URL=\"file:$HOME/.tower-dev/database/tower.db\" env -u TURBOPACK 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",
|
package/prisma/schema.prisma
CHANGED
|
@@ -83,6 +83,7 @@ model Task {
|
|
|
83
83
|
promptId String?
|
|
84
84
|
baseBranch String?
|
|
85
85
|
subPath String?
|
|
86
|
+
parentTaskId String? // 派生来源:派生此任务的父任务 id(父任务终端注入的 TOWER_TASK_ID)。裸字符串无 relation,与 promptId 同惯例
|
|
86
87
|
previewCommandOverride String?
|
|
87
88
|
previewPortOverride Int?
|
|
88
89
|
projectId String
|
|
@@ -91,17 +92,23 @@ model Task {
|
|
|
91
92
|
updatedAt DateTime @updatedAt
|
|
92
93
|
doneAt DateTime? // 进入 DONE 的时间戳,用于「归档期限」判定(离开 DONE 时清空)
|
|
93
94
|
|
|
95
|
+
// 无人值守:开启后 agent 遇阻塞主动 ask_human/notify_human(经 tower-ask 技能用平台 MCP 外推);
|
|
96
|
+
// 关闭则只在 /harness 面板内显示等待。Tower 只记录+park/resume,不发消息、不存平台绑定。
|
|
97
|
+
unattended Boolean @default(false)
|
|
98
|
+
|
|
94
99
|
project Project @relation(fields: [projectId], references: [id], onDelete: Cascade)
|
|
95
100
|
executions TaskExecution[]
|
|
96
101
|
messages TaskMessage[]
|
|
97
102
|
labels TaskLabel[]
|
|
98
103
|
notes ProjectNote[]
|
|
99
104
|
assets ProjectAsset[]
|
|
105
|
+
harnessMessages HarnessMessage[]
|
|
100
106
|
version Version? @relation(fields: [versionId], references: [id], onDelete: SetNull)
|
|
101
107
|
|
|
102
108
|
@@index([projectId])
|
|
103
109
|
@@index([status])
|
|
104
110
|
@@index([versionId])
|
|
111
|
+
@@index([parentTaskId])
|
|
105
112
|
}
|
|
106
113
|
|
|
107
114
|
model TaskExecution {
|
|
@@ -137,6 +144,36 @@ model TaskExecution {
|
|
|
137
144
|
@@index([insightNoteId])
|
|
138
145
|
}
|
|
139
146
|
|
|
147
|
+
// 无人值守:一张表记所有 harness→人 的消息(ask/notify/done/failed)—— 纯记录/日志,Tower 不发送。
|
|
148
|
+
// - kind='ask' 是 park/resume 闭环载体,带生命周期 state:OPEN→ANSWERED|CANCELLED|IGNORED|EXPIRED。
|
|
149
|
+
// - notify/done/failed 是日志行,出生即 CLOSED,不参与「待回复」过滤。
|
|
150
|
+
// - 不变量:待回复 = kind='ask' AND state='OPEN'。回复内容记在 replyText(reply_to_ask 写入)。
|
|
151
|
+
model HarnessMessage {
|
|
152
|
+
id String @id @default(cuid())
|
|
153
|
+
taskId String
|
|
154
|
+
executionId String?
|
|
155
|
+
kind String // "ask" | "notify" | "done" | "failed"(映射 OutboundKind)
|
|
156
|
+
content String
|
|
157
|
+
replyText String?
|
|
158
|
+
repliedAt DateTime?
|
|
159
|
+
state HarnessState @default(OPEN)
|
|
160
|
+
createdAt DateTime @default(now())
|
|
161
|
+
|
|
162
|
+
task Task @relation(fields: [taskId], references: [id], onDelete: Cascade)
|
|
163
|
+
|
|
164
|
+
@@index([taskId, kind, state])
|
|
165
|
+
@@index([state])
|
|
166
|
+
}
|
|
167
|
+
|
|
168
|
+
enum HarnessState {
|
|
169
|
+
OPEN
|
|
170
|
+
ANSWERED
|
|
171
|
+
CANCELLED
|
|
172
|
+
IGNORED
|
|
173
|
+
EXPIRED
|
|
174
|
+
CLOSED
|
|
175
|
+
}
|
|
176
|
+
|
|
140
177
|
model TaskMessage {
|
|
141
178
|
id String @id @default(cuid())
|
|
142
179
|
role MessageRole
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Add Task.parentTaskId — 派生中枢的父任务链。
|
|
3
|
+
*
|
|
4
|
+
* 子任务由父任务终端的 claude 调 create_task 创建时,写入派生它的父任务 id
|
|
5
|
+
* (父任务 PTY 注入的 TOWER_TASK_ID)。用于完成回推(子任务 stop → 通知父任务
|
|
6
|
+
* review)及将来的派生子任务展示。裸字符串列、无 FK relation(与 promptId 同惯例)。
|
|
7
|
+
*
|
|
8
|
+
* 加性 raw SQL —— 绝不碰 notes_fts 虚表(prisma db push 会卡死)。
|
|
9
|
+
* 幂等:SQLite 无 ADD COLUMN IF NOT EXISTS,先 PRAGMA 检查列是否存在。
|
|
10
|
+
*
|
|
11
|
+
* Table/column names hardcoded on purpose — a migration is a point-in-time
|
|
12
|
+
* snapshot and must keep doing exactly what it did the day it shipped.
|
|
13
|
+
*/
|
|
14
|
+
|
|
15
|
+
import type { PrismaClient } from "@prisma/client";
|
|
16
|
+
|
|
17
|
+
export async function up(prisma: PrismaClient): Promise<void> {
|
|
18
|
+
const cols = await prisma.$queryRawUnsafe<Array<{ name: string }>>(
|
|
19
|
+
`PRAGMA table_info("Task")`
|
|
20
|
+
);
|
|
21
|
+
const hasCol = Array.isArray(cols) && cols.some((c) => c.name === "parentTaskId");
|
|
22
|
+
if (!hasCol) {
|
|
23
|
+
await prisma.$executeRawUnsafe(`ALTER TABLE "Task" ADD COLUMN "parentTaskId" TEXT`);
|
|
24
|
+
console.log(" added Task.parentTaskId");
|
|
25
|
+
}
|
|
26
|
+
await prisma.$executeRawUnsafe(
|
|
27
|
+
`CREATE INDEX IF NOT EXISTS "Task_parentTaskId_idx" ON "Task"("parentTaskId")`
|
|
28
|
+
);
|
|
29
|
+
}
|
|
@@ -3,13 +3,14 @@
|
|
|
3
3
|
* Tower Stop Hook
|
|
4
4
|
*
|
|
5
5
|
* Claude Code Stop hook that fires when Claude finishes responding.
|
|
6
|
-
* Notifies Tower so the UI can show a "response complete" indicator
|
|
6
|
+
* Notifies Tower so the UI can show a "response complete" indicator, and so a
|
|
7
|
+
* derived child task can hand its turn back to the parent task for review.
|
|
7
8
|
*
|
|
8
9
|
* Environment:
|
|
9
10
|
* TOWER_TASK_ID - Required. Skip if absent (not a Tower session).
|
|
10
11
|
* TOWER_API_URL - Required. Base URL of the Tower server.
|
|
11
12
|
*
|
|
12
|
-
* Stdin: JSON object from Claude Code with { session_id, cwd, ... }
|
|
13
|
+
* Stdin: JSON object from Claude Code with { session_id, transcript_path, cwd, ... }
|
|
13
14
|
*/
|
|
14
15
|
|
|
15
16
|
"use strict";
|
|
@@ -17,6 +18,43 @@
|
|
|
17
18
|
const http = require("http");
|
|
18
19
|
const https = require("https");
|
|
19
20
|
|
|
21
|
+
/**
|
|
22
|
+
* 从 Claude Code 的 transcript 提取最后一条 assistant 回复(截断 2000 字)。
|
|
23
|
+
* 用于完成回推:父任务据此 review,不必读整个终端缓冲。best-effort,失败返回空串。
|
|
24
|
+
* transcript 是 jsonl,行格式随 CC 版本略有差异,这里兼容 obj.message.content / obj.content。
|
|
25
|
+
*/
|
|
26
|
+
function extractLastAssistantText(transcriptPath) {
|
|
27
|
+
if (!transcriptPath) return "";
|
|
28
|
+
try {
|
|
29
|
+
const fs = require("fs");
|
|
30
|
+
const raw = fs.readFileSync(transcriptPath, "utf8");
|
|
31
|
+
const lines = raw.split("\n");
|
|
32
|
+
for (let i = lines.length - 1; i >= 0; i--) {
|
|
33
|
+
const line = lines[i].trim();
|
|
34
|
+
if (!line) continue;
|
|
35
|
+
let obj;
|
|
36
|
+
try { obj = JSON.parse(line); } catch { continue; }
|
|
37
|
+
const msg = obj.message || obj;
|
|
38
|
+
const role = msg.role || obj.type;
|
|
39
|
+
if (role !== "assistant" || !msg.content) continue;
|
|
40
|
+
let text = "";
|
|
41
|
+
if (Array.isArray(msg.content)) {
|
|
42
|
+
text = msg.content
|
|
43
|
+
.filter((c) => c && c.type === "text" && typeof c.text === "string")
|
|
44
|
+
.map((c) => c.text)
|
|
45
|
+
.join("\n")
|
|
46
|
+
.trim();
|
|
47
|
+
} else if (typeof msg.content === "string") {
|
|
48
|
+
text = msg.content.trim();
|
|
49
|
+
}
|
|
50
|
+
if (text) return text.slice(0, 2000);
|
|
51
|
+
}
|
|
52
|
+
} catch {
|
|
53
|
+
/* best effort — transcript unreadable */
|
|
54
|
+
}
|
|
55
|
+
return "";
|
|
56
|
+
}
|
|
57
|
+
|
|
20
58
|
function main() {
|
|
21
59
|
// Always drain stdin first — Claude Code writes the hook payload there
|
|
22
60
|
// and if we exit before reading it, Windows libuv can crash the parent
|
|
@@ -52,10 +90,11 @@ function main() {
|
|
|
52
90
|
try { data = JSON.parse(input); } catch { process.exit(0); }
|
|
53
91
|
|
|
54
92
|
const sessionId = data.session_id || "";
|
|
93
|
+
const lastReply = extractLastAssistantText(data.transcript_path);
|
|
55
94
|
|
|
56
95
|
// POST to Tower
|
|
57
96
|
const url = new URL("/api/internal/hooks/stop", apiUrl);
|
|
58
|
-
const payload = JSON.stringify({ taskId, sessionId });
|
|
97
|
+
const payload = JSON.stringify({ taskId, sessionId, lastReply });
|
|
59
98
|
const mod = url.protocol === "https:" ? https : http;
|
|
60
99
|
|
|
61
100
|
const req = mod.request({
|